diff --git a/src/main/java/eu/mulk/mulkcms2/benki/bookmarks/Bookmark.java b/src/main/java/eu/mulk/mulkcms2/benki/bookmarks/Bookmark.java
index 01e8a99..ecfe69c 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/bookmarks/Bookmark.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/bookmarks/Bookmark.java
@@ -13,7 +13,7 @@
 
 @Entity
 @Table(name = "bookmarks", schema = "benki")
-public class Bookmark extends Post<BookmarkText> {
+public class Bookmark extends Post {
 
   @Column(name = "uri", nullable = false, length = -1)
   public String uri;
@@ -79,4 +79,9 @@
     text.description = x;
     text.cachedDescriptionHtml = null;
   }
+
+  @Override
+  public BookmarkText getText() {
+    return (BookmarkText) super.getText();
+  }
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/bookmarks/BookmarkText.java b/src/main/java/eu/mulk/mulkcms2/benki/bookmarks/BookmarkText.java
index 019dce5..300484d 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/bookmarks/BookmarkText.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/bookmarks/BookmarkText.java
@@ -9,7 +9,7 @@
 
 @Entity
 @Table(name = "bookmark_texts", schema = "benki")
-public class BookmarkText extends PostText<Bookmark> {
+public class BookmarkText extends PostText {
 
   @Column(name = "title", nullable = true, length = -1)
   @CheckForNull
@@ -24,4 +24,9 @@
   protected String getDescriptionMarkup() {
     return description;
   }
+
+  @Override
+  public Bookmark getPost() {
+    return (Bookmark) super.getPost();
+  }
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/lazychat/LazychatMessage.java b/src/main/java/eu/mulk/mulkcms2/benki/lazychat/LazychatMessage.java
index 9181adf..a1d81d5 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/lazychat/LazychatMessage.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/lazychat/LazychatMessage.java
@@ -12,7 +12,7 @@
 
 @Entity
 @Table(name = "lazychat_messages", schema = "benki")
-public class LazychatMessage extends Post<LazychatMessageText> {
+public class LazychatMessage extends Post {
 
   @ManyToMany
   @JoinTable(
@@ -21,7 +21,7 @@
       joinColumns = {@JoinColumn(name = "referrer")},
       inverseJoinColumns = {@JoinColumn(name = "referee")})
   @JsonbTransient
-  public Collection<Post<?>> referees;
+  public Collection<Post> referees;
 
   @CheckForNull
   @Override
@@ -57,4 +57,9 @@
     text.cachedDescriptionHtml = null;
     text.content = x;
   }
+
+  @Override
+  public LazychatMessageText getText() {
+    return (LazychatMessageText) super.getText();
+  }
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/lazychat/LazychatMessageText.java b/src/main/java/eu/mulk/mulkcms2/benki/lazychat/LazychatMessageText.java
index 1a84909..ace7529 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/lazychat/LazychatMessageText.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/lazychat/LazychatMessageText.java
@@ -9,7 +9,7 @@
 
 @Entity
 @Table(name = "lazychat_message_texts", schema = "benki")
-public class LazychatMessageText extends PostText<LazychatMessage> {
+public class LazychatMessageText extends PostText {
 
   @Column(name = "content", nullable = true, length = -1)
   @CheckForNull
@@ -21,4 +21,9 @@
   protected String getDescriptionMarkup() {
     return content;
   }
+
+  @Override
+  public LazychatMessage getPost() {
+    return (LazychatMessage) super.getPost();
+  }
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/newsletter/Newsletter.java b/src/main/java/eu/mulk/mulkcms2/benki/newsletter/Newsletter.java
index 64fd6f7..7c9e50f 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/newsletter/Newsletter.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/newsletter/Newsletter.java
@@ -25,5 +25,5 @@
 
   @OneToMany(mappedBy = "owner", fetch = FetchType.LAZY)
   @OrderBy("date")
-  public Collection<Post<?>> posts;
+  public Collection<Post> posts;
 }
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/newsletter/NewsletterSender.java b/src/main/java/eu/mulk/mulkcms2/benki/newsletter/NewsletterSender.java
index ae1ef9e..5f7937f 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/newsletter/NewsletterSender.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/newsletter/NewsletterSender.java
@@ -53,7 +53,7 @@
   void run() throws InterruptedException, TimeoutException, ExecutionException {
     var session = em.unwrap(Session.class);
 
-    List<Post<?>> posts =
+    List<Post> posts =
         Post.find(
                 """
                 SELECT DISTINCT p FROM Post p
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;
   }
 
