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 f783ba0..6c87096 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/posts/Post.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/posts/Post.java
@@ -245,7 +245,23 @@
     return scope == Scope.top_level;
   }
 
-  public static class PostPage<T extends Post<? extends PostText>> {
+  public static class Day<T extends Post<? extends PostText<?>>> {
+    public final @CheckForNull LocalDate date;
+    public final List<T> posts;
+
+    private Day(LocalDate date, List<T> posts) {
+      this.date = date;
+      this.posts = posts;
+    }
+
+    public void cacheDescriptions() {
+      for (var post : posts) {
+        post.getTexts().values().forEach(PostText::getDescriptionHtml);
+      }
+    }
+  }
+
+  public static class PostPage<T extends Post<? extends PostText<?>>> {
     public @CheckForNull final Integer prevCursor;
     public @CheckForNull final Integer cursor;
     public @CheckForNull final Integer nextCursor;
@@ -268,39 +284,23 @@
       days().forEach(Day::cacheDescriptions);
     }
 
-    public class Day {
-      public final @CheckForNull LocalDate date;
-      public final List<T> posts;
-
-      private Day(LocalDate date, List<T> posts) {
-        this.date = date;
-        this.posts = posts;
-      }
-
-      public void cacheDescriptions() {
-        for (var post : posts) {
-          post.getTexts().values().forEach(PostText::getDescriptionHtml);
-        }
-      }
-    }
-
-    public List<Day> days() {
+    public List<Day<T>> days() {
       return posts.stream()
           .collect(Collectors.groupingBy(post -> post.date.toLocalDate()))
           .entrySet()
           .stream()
-          .map(x -> new Day(x.getKey(), x.getValue()))
-          .sorted(Comparator.comparing((Day day) -> day.date).reversed())
+          .map(x -> new Day<T>(x.getKey(), x.getValue()))
+          .sorted(Comparator.comparing((Day<T> day) -> day.date).reversed())
           .collect(Collectors.toUnmodifiableList());
     }
   }
 
-  public static PostPage<Post<? extends PostText>> findViewable(
+  public static PostPage<Post<? extends PostText<?>>> findViewable(
       PostFilter postFilter, Session session, @CheckForNull User viewer, @CheckForNull User owner) {
     return findViewable(postFilter, session, viewer, owner, null, null, null);
   }
 
-  public static PostPage<Post<? extends PostText>> findViewable(
+  public static PostPage<Post<? extends PostText<?>>> findViewable(
       PostFilter postFilter,
       Session session,
       @CheckForNull User viewer,
@@ -322,7 +322,7 @@
     return findViewable(entityClass, session, viewer, owner, cursor, count, searchQuery);
   }
 
-  protected static <T extends Post<? extends PostText>> PostPage<T> findViewable(
+  protected static <T extends Post<? extends PostText<?>>> PostPage<T> findViewable(
       Class<? extends T> entityClass,
       Session session,
       @CheckForNull User viewer,
