diff --git a/src/main/java/eu/mulk/mulkcms2/benki/posts/Post.java b/src/main/java/eu/mulk/mulkcms2/benki/posts/Post.java
index a0245c8..0350a20 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/posts/Post.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/posts/Post.java
@@ -44,7 +44,6 @@
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
-import java.util.TimeZone;
 import java.util.stream.Collectors;
 import javax.annotation.CheckForNull;
 import org.hibernate.annotations.Type;
@@ -53,7 +52,7 @@
 @Entity
 @Table(name = "posts", schema = "benki")
 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
-public abstract class Post<Text extends PostText<?>> extends PanacheEntityBase {
+public abstract class Post extends PanacheEntityBase {
 
   public enum Scope {
     top_level,
@@ -119,15 +118,11 @@
   @JsonbTransient
   public Collection<LazychatMessage> comments;
 
-  @OneToMany(
-      mappedBy = "post",
-      fetch = FetchType.LAZY,
-      cascade = CascadeType.ALL,
-      targetEntity = PostText.class)
+  @OneToMany(mappedBy = "post", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
   @MapKey(name = "language")
-  public Map<String, Text> texts = new HashMap<>();
+  public Map<String, PostText> texts = new HashMap<>();
 
-  public Map<String, Text> getTexts() {
+  public Map<String, PostText> getTexts() {
     return texts;
   }
 
@@ -153,7 +148,7 @@
     }
   }
 
-  protected static <T extends Post<?>> CriteriaBuilder<T> queryViewable(
+  protected static <T extends Post> CriteriaBuilder<T> queryViewable(
       Class<T> entityClass,
       @CheckForNull User reader,
       @CheckForNull User owner,
@@ -246,7 +241,7 @@
     return scope == Scope.top_level;
   }
 
-  public static class Day<T extends Post<? extends PostText<?>>> {
+  public static class Day<T extends Post> {
     public final @CheckForNull LocalDate date;
     public final List<T> posts;
 
@@ -262,14 +257,12 @@
     }
   }
 
-  public static class PostPage<T extends Post<? extends PostText<?>>> {
+  public static class PostPage<T extends Post> {
     public @CheckForNull final Integer prevCursor;
     public @CheckForNull final Integer cursor;
     public @CheckForNull final Integer nextCursor;
     public final List<T> posts;
 
-    private static final TimeZone timeZone = TimeZone.getDefault();
-
     public PostPage(
         @CheckForNull Integer c0,
         @CheckForNull Integer c1,
@@ -296,7 +289,7 @@
     }
   }
 
-  public static PostPage<Post<? extends PostText<?>>> findViewable(
+  public static PostPage<Post> findViewable(
       PostFilter postFilter,
       EntityManager em,
       CriteriaBuilderFactory cbf,
@@ -305,7 +298,7 @@
     return findViewable(postFilter, em, cbf, viewer, owner, null, null, null);
   }
 
-  public static PostPage<Post<? extends PostText<?>>> findViewable(
+  public static PostPage<Post> findViewable(
       PostFilter postFilter,
       EntityManager em,
       CriteriaBuilderFactory cbf,
@@ -328,7 +321,7 @@
     return findViewable(entityClass, em, cbf, viewer, owner, cursor, count, searchQuery);
   }
 
-  protected static <T extends Post<? extends PostText<?>>> PostPage<T> findViewable(
+  protected static <T extends Post> PostPage<T> findViewable(
       Class<? extends T> entityClass,
       EntityManager em,
       CriteriaBuilderFactory cbf,
@@ -379,7 +372,7 @@
     return new PostPage<>(prevCursor, cursor, nextCursor, forwardResults);
   }
 
-  public static <T extends Post<?>> void fetchTexts(Collection<T> posts) {
+  public static <T extends Post> void fetchTexts(Collection<T> posts) {
     var postIds = posts.stream().map(x -> x.id).collect(toList());
 
     if (!postIds.isEmpty()) {
@@ -389,7 +382,7 @@
   }
 
   @CheckForNull
-  public Text getText() {
+  public PostText getText() {
     var texts = getTexts();
     if (texts.isEmpty()) {
       return null;
@@ -417,7 +410,7 @@
     if (!(o instanceof Post)) {
       return false;
     }
-    Post<?> post = (Post<?>) o;
+    Post post = (Post) o;
     return Objects.equals(id, post.id);
   }
 
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/posts/PostResource.java b/src/main/java/eu/mulk/mulkcms2/benki/posts/PostResource.java
index db613ae..4f7a43e 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/posts/PostResource.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/posts/PostResource.java
@@ -91,7 +91,7 @@
   @CheckedTemplate
   static class Templates {
 
-    public static native <P extends Post<?>> TemplateInstance postList(
+    public static native <P extends Post> TemplateInstance postList(
         List<Post.Day<P>> postDays,
         @CheckForNull String feedUri,
         String pageTitle,
@@ -242,7 +242,7 @@
   @GET
   @Produces(APPLICATION_JSON)
   @Path("{id}")
-  public Post<?> getPostJson(@PathParam("id") int id) {
+  public Post getPostJson(@PathParam("id") int id) {
     return getPostIfVisible(id);
   }
 
@@ -253,7 +253,7 @@
     var post = getPostIfVisible(id);
 
     return Templates.postList(
-        new PostPage<Post<? extends PostText<?>>>(null, null, null, List.of(post)).days(),
+        new PostPage<>(null, null, null, List.of(post)).days(),
         null,
         String.format("Post #%d", id),
         false,
@@ -319,7 +319,7 @@
           Response.status(Status.BAD_REQUEST).entity("invalid hashcash").build());
     }
 
-    Post<?> post = Post.findById(postId);
+    Post post = Post.findById(postId);
 
     var comment = new LazychatMessage();
     comment.date = OffsetDateTime.now();
@@ -509,7 +509,7 @@
     return entityManager.unwrap(Session.class);
   }
 
-  protected static void assignPostTargets(Post.Visibility visibility, User user, Post<?> post) {
+  protected static void assignPostTargets(Post.Visibility visibility, User user, Post post) {
     switch (visibility) {
       case PUBLIC:
         post.targets = Set.of(Role.getWorld());
@@ -525,7 +525,7 @@
     }
   }
 
-  protected final Post<?> getPostIfVisible(int id) {
+  protected final Post getPostIfVisible(int id) {
     @CheckForNull var user = getCurrentUser();
     var message = getSession().byId(Post.class).load(id);
 
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/posts/PostText.java b/src/main/java/eu/mulk/mulkcms2/benki/posts/PostText.java
index dc7a228..d25615e 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/posts/PostText.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/posts/PostText.java
@@ -27,7 +27,7 @@
 @Table(name = "post_texts", schema = "benki")
 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
 @IdClass(PostTextPK.class)
-public abstract class PostText<OwningPost extends Post<?>> extends PanacheEntityBase {
+public abstract class PostText extends PanacheEntityBase {
 
   private static final int DESCRIPTION_CACHE_VERSION = 1;
 
@@ -52,10 +52,14 @@
   @Type(value = PostgreSQLTSVectorType.class)
   public String searchTerms;
 
-  @ManyToOne(fetch = FetchType.LAZY, targetEntity = Post.class)
+  @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "post", referencedColumnName = "id", nullable = false)
   @JsonbTransient
-  public OwningPost post;
+  public Post post;
+
+  public Post getPost() {
+    return post;
+  }
 
   @CheckForNull
   public final String getDescriptionHtml() {
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/posts/PostTextPK.java b/src/main/java/eu/mulk/mulkcms2/benki/posts/PostTextPK.java
index d737bf4..42f0d88 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/posts/PostTextPK.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/posts/PostTextPK.java
@@ -14,13 +14,13 @@
 
   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "post", referencedColumnName = "id", nullable = false)
-  public Post<?> post;
+  public Post post;
 
   @Id
   @Column(name = "language", nullable = false, length = -1)
   private String language;
 
-  public Post<?> getPost() {
+  public Post getPost() {
     return post;
   }
 
