diff --git a/core/src/main/java/se/su/dsv/scipro/forum/GroupForumService.java b/core/src/main/java/se/su/dsv/scipro/forum/GroupForumService.java
index 5d43341f3c..158c241ee2 100644
--- a/core/src/main/java/se/su/dsv/scipro/forum/GroupForumService.java
+++ b/core/src/main/java/se/su/dsv/scipro/forum/GroupForumService.java
@@ -18,4 +18,6 @@ public interface GroupForumService {
     ForumPost createReply(GroupThread groupThread, User poster, String content, Set<Attachment> attachments);
 
     List<ForumPost> getPosts(GroupThread groupThread);
+
+    IndexedForumService getForumService(Group group);
 }
diff --git a/core/src/main/java/se/su/dsv/scipro/forum/GroupForumServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/forum/GroupForumServiceImpl.java
index 00c48751cd..092fa0820b 100644
--- a/core/src/main/java/se/su/dsv/scipro/forum/GroupForumServiceImpl.java
+++ b/core/src/main/java/se/su/dsv/scipro/forum/GroupForumServiceImpl.java
@@ -81,4 +81,9 @@ public class GroupForumServiceImpl implements GroupForumService {
     public List<ForumPost> getPosts(final GroupThread groupThread) {
         return basicForumService.getPosts(groupThread.getForumThread());
     }
+
+    @Override
+    public IndexedForumService getForumService(Group group) {
+        return null;
+    }
 }
diff --git a/core/src/main/java/se/su/dsv/scipro/forum/IndexedForumService.java b/core/src/main/java/se/su/dsv/scipro/forum/IndexedForumService.java
new file mode 100644
index 0000000000..53c6b2c2fd
--- /dev/null
+++ b/core/src/main/java/se/su/dsv/scipro/forum/IndexedForumService.java
@@ -0,0 +1,12 @@
+package se.su.dsv.scipro.forum;
+
+import java.util.List;
+import se.su.dsv.scipro.system.User;
+
+public interface IndexedForumService {
+    List<ThreadOverview> getThreads();
+
+    boolean isThreadRead(User user, Long threadId);
+
+    void setThreadRead(User user, Long threadId, boolean read);
+}
diff --git a/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumService.java b/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumService.java
index 9269f37f49..0adc4a2402 100644
--- a/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumService.java
+++ b/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumService.java
@@ -28,4 +28,6 @@ public interface ProjectForumService {
     boolean canDelete(ProjectThread projectThread, ForumPost forumPost);
 
     void deletePost(ProjectThread projectThread, ForumPost forumPost);
+
+    IndexedForumService getForumService(Project project);
 }
diff --git a/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumServiceImpl.java
index 5850bffdc0..3c8bdbca4f 100644
--- a/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumServiceImpl.java
+++ b/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumServiceImpl.java
@@ -139,4 +139,9 @@ public class ProjectForumServiceImpl implements ProjectForumService {
     public ProjectThread findOne(long threadId) {
         return projectThreadRepository.findOne(threadId);
     }
+
+    @Override
+    public IndexedForumService getForumService(Project project) {
+        return null;
+    }
 }
diff --git a/core/src/main/java/se/su/dsv/scipro/forum/ThreadOverview.java b/core/src/main/java/se/su/dsv/scipro/forum/ThreadOverview.java
new file mode 100644
index 0000000000..ba73dddde2
--- /dev/null
+++ b/core/src/main/java/se/su/dsv/scipro/forum/ThreadOverview.java
@@ -0,0 +1,15 @@
+package se.su.dsv.scipro.forum;
+
+import java.time.Instant;
+import se.su.dsv.scipro.forum.dataobjects.ForumPost;
+import se.su.dsv.scipro.system.User;
+
+public record ThreadOverview(
+    Long id,
+    boolean hasAttachments,
+    String subject,
+    User author,
+    Instant createdAt,
+    int numberOfReplies,
+    ForumPost latestPost
+) {}
diff --git a/view/src/main/java/se/su/dsv/scipro/forum/Discussable.java b/view/src/main/java/se/su/dsv/scipro/forum/Discussable.java
deleted file mode 100644
index d6f69b8780..0000000000
--- a/view/src/main/java/se/su/dsv/scipro/forum/Discussable.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package se.su.dsv.scipro.forum;
-
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.util.io.IClusterable;
-import se.su.dsv.scipro.forum.dataobjects.ForumThread;
-
-public interface Discussable<A> extends IClusterable {
-    IModel<ForumThread> discussion(IModel<A> a);
-}
diff --git a/view/src/main/java/se/su/dsv/scipro/forum/pages/threaded/ForumThreadDiscussable.java b/view/src/main/java/se/su/dsv/scipro/forum/pages/threaded/ForumThreadDiscussable.java
deleted file mode 100644
index 170bdddb5f..0000000000
--- a/view/src/main/java/se/su/dsv/scipro/forum/pages/threaded/ForumThreadDiscussable.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package se.su.dsv.scipro.forum.pages.threaded;
-
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.LambdaModel;
-import se.su.dsv.scipro.forum.Discussable;
-import se.su.dsv.scipro.forum.dataobjects.ForumThread;
-import se.su.dsv.scipro.forum.dataobjects.ProjectThread;
-
-public class ForumThreadDiscussable implements Discussable<ProjectThread> {
-
-    @Override
-    public IModel<ForumThread> discussion(final IModel<ProjectThread> a) {
-        return LambdaModel.of(a, ProjectThread::getForumThread, ProjectThread::setForumThread);
-    }
-}
diff --git a/view/src/main/java/se/su/dsv/scipro/forum/pages/threaded/ProjectThreadedForumPage.java b/view/src/main/java/se/su/dsv/scipro/forum/pages/threaded/ProjectThreadedForumPage.java
index e42a52aaed..49083cdda8 100644
--- a/view/src/main/java/se/su/dsv/scipro/forum/pages/threaded/ProjectThreadedForumPage.java
+++ b/view/src/main/java/se/su/dsv/scipro/forum/pages/threaded/ProjectThreadedForumPage.java
@@ -11,6 +11,7 @@ import org.apache.wicket.model.LoadableDetachableModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import se.su.dsv.scipro.components.menuhighlighting.MenuHighlightAuthorMyProjects;
 import se.su.dsv.scipro.components.menuhighlighting.MenuHighlightForum;
+import se.su.dsv.scipro.forum.IndexedForumService;
 import se.su.dsv.scipro.forum.ProjectForumService;
 import se.su.dsv.scipro.forum.dataobjects.ForumThread;
 import se.su.dsv.scipro.forum.dataobjects.ProjectThread;
@@ -34,29 +35,19 @@ public class ProjectThreadedForumPage
     public ProjectThreadedForumPage(final PageParameters pp) {
         super(pp);
         add(new BookmarkablePageLink<Void>(CREATE_THREAD_LINK, ProjectCreateForumThreadPage.class, pp));
+        IModel<IndexedForumService> forumService = projectModel.map(projectForumService::getForumService);
         add(new FeedbackPanel(FEEDBACK));
         add(
-            new ThreadsOverviewPanel<>(FORUM, getThreads(), new ForumThreadDiscussable(), (id, thread) -> {
+            new ThreadsOverviewPanel(FORUM, forumService, (id, thread) -> {
                 PageParameters parameters = new PageParameters(pp).set(
                     PageParameterKeys.MAP.get(ForumThread.class),
-                    thread.getObject().getId()
+                    thread.getObject().id()
                 );
                 return new BookmarkablePageLink<>(id, ProjectViewForumThreadPage.class, parameters);
             })
         );
     }
 
-    private IModel<List<ProjectThread>> getThreads() {
-        return new LoadableDetachableModel<>() {
-            @Override
-            protected List<ProjectThread> load() {
-                List<ProjectThread> threads = projectForumService.getThreads(projectModel.getObject());
-                threads.sort(Collections.reverseOrder(Comparator.comparing(o -> o.getForumThread().getLastModified())));
-                return threads;
-            }
-        };
-    }
-
     static final String CREATE_THREAD_LINK = "createThread";
     static final String FEEDBACK = "feedback";
     static final String FORUM = "forum";
diff --git a/view/src/main/java/se/su/dsv/scipro/forum/pages/threaded/SupervisorThreadedForumPage.java b/view/src/main/java/se/su/dsv/scipro/forum/pages/threaded/SupervisorThreadedForumPage.java
index ffbf9664d9..41f82c8270 100644
--- a/view/src/main/java/se/su/dsv/scipro/forum/pages/threaded/SupervisorThreadedForumPage.java
+++ b/view/src/main/java/se/su/dsv/scipro/forum/pages/threaded/SupervisorThreadedForumPage.java
@@ -3,19 +3,15 @@ package se.su.dsv.scipro.forum.pages.threaded;
 import static se.su.dsv.scipro.security.auth.roles.Roles.SUPERVISOR;
 
 import jakarta.inject.Inject;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 import org.apache.wicket.markup.html.panel.FeedbackPanel;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.LoadableDetachableModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import se.su.dsv.scipro.components.menuhighlighting.MenuHighlightForum;
 import se.su.dsv.scipro.components.menuhighlighting.MenuHighlightSupervisorMyProjects;
+import se.su.dsv.scipro.forum.IndexedForumService;
 import se.su.dsv.scipro.forum.ProjectForumService;
 import se.su.dsv.scipro.forum.dataobjects.ForumThread;
-import se.su.dsv.scipro.forum.dataobjects.ProjectThread;
 import se.su.dsv.scipro.forum.panels.threaded.ThreadsOverviewPanel;
 import se.su.dsv.scipro.security.auth.Authorization;
 import se.su.dsv.scipro.security.auth.ProjectModuleComponent;
@@ -36,28 +32,18 @@ public class SupervisorThreadedForumPage
         super(pp);
         add(new BookmarkablePageLink<Void>(CREATE_THREAD_LINK, SupervisorCreateForumThreadPage.class, pp));
         add(new FeedbackPanel(FEEDBACK));
+        IModel<IndexedForumService> forumService = projectModel.map(projectForumService::getForumService);
         add(
-            new ThreadsOverviewPanel<>(FORUM, getThreads(), new ForumThreadDiscussable(), (id, thread) -> {
+            new ThreadsOverviewPanel(FORUM, forumService, (id, thread) -> {
                 PageParameters parameters = new PageParameters(pp).set(
                     PageParameterKeys.MAP.get(ForumThread.class),
-                    thread.getObject().getId()
+                    thread.getObject().id()
                 );
                 return new BookmarkablePageLink<>(id, SupervisorViewForumThreadPage.class, parameters);
             })
         );
     }
 
-    private IModel<List<ProjectThread>> getThreads() {
-        return new LoadableDetachableModel<>() {
-            @Override
-            protected List<ProjectThread> load() {
-                List<ProjectThread> threads = projectForumService.getThreads(projectModel.getObject());
-                threads.sort(Collections.reverseOrder(Comparator.comparing(o -> o.getForumThread().getLastModified())));
-                return threads;
-            }
-        };
-    }
-
     static final String CREATE_THREAD_LINK = "createThread";
     static final String FEEDBACK = "feedback";
     static final String FORUM = "forum";
diff --git a/view/src/main/java/se/su/dsv/scipro/forum/panels/threaded/ThreadReadStatePanel.java b/view/src/main/java/se/su/dsv/scipro/forum/panels/threaded/ThreadReadStatePanel.java
index 482b3e601c..422b39851b 100644
--- a/view/src/main/java/se/su/dsv/scipro/forum/panels/threaded/ThreadReadStatePanel.java
+++ b/view/src/main/java/se/su/dsv/scipro/forum/panels/threaded/ThreadReadStatePanel.java
@@ -1,10 +1,9 @@
 package se.su.dsv.scipro.forum.panels.threaded;
 
-import jakarta.inject.Inject;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.model.IModel;
-import se.su.dsv.scipro.forum.BasicForumService;
-import se.su.dsv.scipro.forum.dataobjects.ForumThread;
+import se.su.dsv.scipro.forum.IndexedForumService;
+import se.su.dsv.scipro.forum.ThreadOverview;
 import se.su.dsv.scipro.forum.panels.AbstractReadStatePanel;
 import se.su.dsv.scipro.session.SciProSession;
 
@@ -14,24 +13,23 @@ import se.su.dsv.scipro.session.SciProSession;
  */
 public class ThreadReadStatePanel extends AbstractReadStatePanel {
 
-    @Inject
-    private BasicForumService basicForumService;
+    private final IModel<IndexedForumService> forumService;
+    private final IModel<ThreadOverview> model;
 
-    private final IModel<ForumThread> model;
-
-    public ThreadReadStatePanel(String id, IModel<ForumThread> model) {
+    public ThreadReadStatePanel(String id, IModel<IndexedForumService> forumService, IModel<ThreadOverview> model) {
         super(id);
+        this.forumService = forumService;
         this.model = model;
     }
 
     @Override
     protected boolean isRead() {
-        return basicForumService.isThreadRead(SciProSession.get().getUser(), model.getObject());
+        return forumService.getObject().isThreadRead(SciProSession.get().getUser(), model.getObject().id());
     }
 
     @Override
     protected void onFlagClick(final AjaxRequestTarget target) {
         boolean read = isRead();
-        basicForumService.setThreadRead(SciProSession.get().getUser(), model.getObject(), !read);
+        forumService.getObject().setThreadRead(SciProSession.get().getUser(), model.getObject().id(), !read);
     }
 }
diff --git a/view/src/main/java/se/su/dsv/scipro/forum/panels/threaded/ThreadsOverviewPanel.java b/view/src/main/java/se/su/dsv/scipro/forum/panels/threaded/ThreadsOverviewPanel.java
index d0e7e1c55d..46dc4ae154 100644
--- a/view/src/main/java/se/su/dsv/scipro/forum/panels/threaded/ThreadsOverviewPanel.java
+++ b/view/src/main/java/se/su/dsv/scipro/forum/panels/threaded/ThreadsOverviewPanel.java
@@ -1,8 +1,6 @@
 package se.su.dsv.scipro.forum.panels.threaded;
 
-import jakarta.inject.Inject;
 import java.io.Serializable;
-import java.util.List;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
@@ -11,46 +9,39 @@ import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.LambdaModel;
-import org.apache.wicket.model.LoadableDetachableModel;
 import se.su.dsv.scipro.components.DateLabel;
 import se.su.dsv.scipro.data.enums.DateStyle;
-import se.su.dsv.scipro.forum.BasicForumService;
-import se.su.dsv.scipro.forum.Discussable;
+import se.su.dsv.scipro.forum.IndexedForumService;
+import se.su.dsv.scipro.forum.ThreadOverview;
 import se.su.dsv.scipro.forum.dataobjects.ForumPost;
-import se.su.dsv.scipro.forum.dataobjects.ForumThread;
 import se.su.dsv.scipro.profile.UserLinkPanel;
 import se.su.dsv.scipro.system.User;
 
-public class ThreadsOverviewPanel<A> extends Panel {
-
-    @Inject
-    private BasicForumService basicForumService;
+public class ThreadsOverviewPanel extends Panel {
 
     public ThreadsOverviewPanel(
         final String id,
-        final IModel<List<A>> model,
-        final Discussable<A> discussable,
-        final ThreadLinkSupplier<A> threadLinkSupplier
+        final IModel<IndexedForumService> forumService,
+        final ThreadLinkSupplier threadLinkSupplier
     ) {
-        super(id, model);
+        super(id, forumService);
         add(
-            new ListView<>("threads", model) {
+            new ListView<>("threads", forumService.map(IndexedForumService::getThreads)) {
                 @Override
-                protected void populateItem(final ListItem<A> item) {
-                    final IModel<ForumThread> discussion = discussable.discussion(item.getModel());
-                    item.add(new ThreadReadStatePanel("readState", discussion));
+                protected void populateItem(final ListItem<ThreadOverview> item) {
+                    item.add(new ThreadReadStatePanel("readState", forumService, item.getModel()));
                     item.add(
                         new WebMarkupContainer("attachmentIcon") {
                             @Override
                             protected void onConfigure() {
                                 super.onConfigure();
-                                setVisibilityAllowed(basicForumService.hasAttachments(discussion.getObject()));
+                                setVisibilityAllowed(item.getModelObject().hasAttachments());
                             }
                         }
                     );
-                    item.add(new ThreadTitleColumn<>("threadTitle", discussion, item.getModel(), threadLinkSupplier));
-                    item.add(new Label("replies", discussion.map(ForumThread::getPostCount)));
-                    item.add(new LastPostColumn("lastPost", discussion));
+                    item.add(new ThreadTitleColumn<>("threadTitle", item.getModel(), threadLinkSupplier));
+                    item.add(new Label("replies", item.getModel().map(ThreadOverview::numberOfReplies)));
+                    item.add(new LastPostColumn("lastPost", item.getModel().map(ThreadOverview::latestPost)));
                 }
             }
         );
@@ -60,34 +51,26 @@ public class ThreadsOverviewPanel<A> extends Panel {
 
         public ThreadTitleColumn(
             final String id,
-            final IModel<ForumThread> thread,
-            final IModel<A> model,
-            final ThreadLinkSupplier<A> threadLinkSupplier
+            final IModel<ThreadOverview> model,
+            final ThreadLinkSupplier threadLinkSupplier
         ) {
             super(id);
             final BookmarkablePageLink<Void> threadLink = threadLinkSupplier.newThreadLink("threadLink", model);
-            threadLink.setBody(LambdaModel.of(thread, ForumThread::getSubject, ForumThread::setSubject));
+            threadLink.setBody(model.map(ThreadOverview::subject));
             add(threadLink);
-            add(new Label("createdBy", thread.map(ForumThread::getCreatedBy).map(User::getFullName).orElse("SciPro")));
-            add(
-                new DateLabel(
-                    "dateCreated",
-                    LambdaModel.of(thread, ForumThread::getDateCreated, ForumThread::setDateCreated),
-                    DateStyle.DATETIME
-                )
-            );
+            add(new Label("createdBy", model.map(ThreadOverview::author).map(User::getFullName).orElse("SciPro")));
+            add(new Label("dateCreated", model.map(ThreadOverview::createdAt)));
         }
     }
 
-    public interface ThreadLinkSupplier<A> extends Serializable {
-        BookmarkablePageLink<Void> newThreadLink(String id, IModel<A> thread);
+    public interface ThreadLinkSupplier extends Serializable {
+        BookmarkablePageLink<Void> newThreadLink(String id, IModel<ThreadOverview> thread);
     }
 
     private class LastPostColumn extends WebMarkupContainer {
 
-        public LastPostColumn(String id, final IModel<ForumThread> model) {
+        public LastPostColumn(String id, final IModel<ForumPost> postModel) {
             super(id);
-            IModel<ForumPost> postModel = getLastPost(model);
             add(
                 new UserLinkPanel("postedBy", LambdaModel.of(postModel, ForumPost::getPostedBy, ForumPost::setPostedBy))
             );
@@ -108,14 +91,5 @@ public class ThreadsOverviewPanel<A> extends Panel {
                 )
             );
         }
-
-        private IModel<ForumPost> getLastPost(final IModel<ForumThread> model) {
-            return new LoadableDetachableModel<>() {
-                @Override
-                protected ForumPost load() {
-                    return basicForumService.getLastPost(model.getObject());
-                }
-            };
-        }
     }
 }
diff --git a/view/src/main/java/se/su/dsv/scipro/group/AuthorGroupPage.java b/view/src/main/java/se/su/dsv/scipro/group/AuthorGroupPage.java
index cfcac3c98d..31ac2335c8 100644
--- a/view/src/main/java/se/su/dsv/scipro/group/AuthorGroupPage.java
+++ b/view/src/main/java/se/su/dsv/scipro/group/AuthorGroupPage.java
@@ -1,18 +1,14 @@
 package se.su.dsv.scipro.group;
 
 import jakarta.inject.Inject;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 import org.apache.wicket.markup.html.panel.FeedbackPanel;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.LoadableDetachableModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import se.su.dsv.scipro.components.menuhighlighting.MenuHighlightAuthorMyGroups;
 import se.su.dsv.scipro.forum.GroupForumService;
+import se.su.dsv.scipro.forum.IndexedForumService;
 import se.su.dsv.scipro.forum.dataobjects.ForumThread;
-import se.su.dsv.scipro.forum.dataobjects.GroupThread;
 import se.su.dsv.scipro.forum.panels.threaded.ThreadsOverviewPanel;
 import se.su.dsv.scipro.util.PageParameterKeys;
 
@@ -25,25 +21,15 @@ public class AuthorGroupPage extends AbstractAuthorGroupPage implements MenuHigh
         super(pp);
         add(new FeedbackPanel("feedback"));
         add(new BookmarkablePageLink<Void>("createThread", CreateThreadPage.class, pp));
+        IModel<IndexedForumService> forumService = getGroup().map(groupForumService::getForumService);
         add(
-            new ThreadsOverviewPanel<>("threads", getThreads(), new GroupThreadDiscussable(), (id, thread) -> {
+            new ThreadsOverviewPanel("threads", forumService, (id, thread) -> {
                 PageParameters parameters = new PageParameters(pp).set(
                     PageParameterKeys.MAP.get(ForumThread.class),
-                    thread.getObject().getId()
+                    thread.getObject().id()
                 );
                 return new BookmarkablePageLink<>(id, ViewThreadPage.class, parameters);
             })
         );
     }
-
-    private IModel<List<GroupThread>> getThreads() {
-        return new LoadableDetachableModel<>() {
-            @Override
-            protected List<GroupThread> load() {
-                List<GroupThread> threads = groupForumService.getThreads(getGroup().getObject());
-                threads.sort(Collections.reverseOrder(Comparator.comparing(o -> o.getForumThread().getLastModified())));
-                return threads;
-            }
-        };
-    }
 }
diff --git a/view/src/main/java/se/su/dsv/scipro/group/GroupThreadDiscussable.java b/view/src/main/java/se/su/dsv/scipro/group/GroupThreadDiscussable.java
deleted file mode 100644
index bbc44715b7..0000000000
--- a/view/src/main/java/se/su/dsv/scipro/group/GroupThreadDiscussable.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package se.su.dsv.scipro.group;
-
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.LambdaModel;
-import se.su.dsv.scipro.forum.Discussable;
-import se.su.dsv.scipro.forum.dataobjects.*;
-
-public class GroupThreadDiscussable implements Discussable<GroupThread> {
-
-    @Override
-    public IModel<ForumThread> discussion(final IModel<GroupThread> a) {
-        return LambdaModel.of(a, GroupThread::getForumThread, GroupThread::setForumThread);
-    }
-}
diff --git a/view/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorGroupPage.java b/view/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorGroupPage.java
index 4307836a19..616c6e0b92 100644
--- a/view/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorGroupPage.java
+++ b/view/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorGroupPage.java
@@ -1,20 +1,15 @@
 package se.su.dsv.scipro.supervisor.pages;
 
 import jakarta.inject.Inject;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 import org.apache.wicket.markup.html.panel.FeedbackPanel;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.LoadableDetachableModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import se.su.dsv.scipro.components.menuhighlighting.MenuHighlightSupervisorMyGroups;
 import se.su.dsv.scipro.forum.GroupForumService;
+import se.su.dsv.scipro.forum.IndexedForumService;
 import se.su.dsv.scipro.forum.dataobjects.ForumThread;
-import se.su.dsv.scipro.forum.dataobjects.GroupThread;
 import se.su.dsv.scipro.forum.panels.threaded.ThreadsOverviewPanel;
-import se.su.dsv.scipro.group.GroupThreadDiscussable;
 import se.su.dsv.scipro.util.PageParameterKeys;
 
 public class SupervisorGroupPage extends AbstractSupervisorGroupPage implements MenuHighlightSupervisorMyGroups {
@@ -26,25 +21,15 @@ public class SupervisorGroupPage extends AbstractSupervisorGroupPage implements
         super(pp);
         add(new FeedbackPanel("feedback"));
         add(new BookmarkablePageLink<Void>("createThread", SupervisorGroupCreateThreadPage.class, pp));
+        IModel<IndexedForumService> forumService = groupModel.map(groupForumService::getForumService);
         add(
-            new ThreadsOverviewPanel<>("threads", getThreads(), new GroupThreadDiscussable(), (id, thread) -> {
+            new ThreadsOverviewPanel("threads", forumService, (id, thread) -> {
                 PageParameters parameters = new PageParameters(pp).set(
                     PageParameterKeys.MAP.get(ForumThread.class),
-                    thread.getObject().getId()
+                    thread.getObject().id()
                 );
                 return new BookmarkablePageLink<>(id, SupervisorViewGroupThreadPage.class, parameters);
             })
         );
     }
-
-    private IModel<List<GroupThread>> getThreads() {
-        return new LoadableDetachableModel<>() {
-            @Override
-            protected List<GroupThread> load() {
-                List<GroupThread> threads = groupForumService.getThreads(groupModel.getObject());
-                threads.sort(Collections.reverseOrder(Comparator.comparing(o -> o.getForumThread().getLastModified())));
-                return threads;
-            }
-        };
-    }
 }
diff --git a/view/src/test/java/se/su/dsv/scipro/SciProTest.java b/view/src/test/java/se/su/dsv/scipro/SciProTest.java
index d83e739cb0..51be665c86 100755
--- a/view/src/test/java/se/su/dsv/scipro/SciProTest.java
+++ b/view/src/test/java/se/su/dsv/scipro/SciProTest.java
@@ -50,6 +50,7 @@ import se.su.dsv.scipro.finalthesis.FinalThesisService;
 import se.su.dsv.scipro.finalthesis.PublishingConsentService;
 import se.su.dsv.scipro.forum.BasicForumService;
 import se.su.dsv.scipro.forum.GroupForumService;
+import se.su.dsv.scipro.forum.IndexedForumService;
 import se.su.dsv.scipro.forum.ProjectForumService;
 import se.su.dsv.scipro.gdpr.Reporter;
 import se.su.dsv.scipro.generalsystemsettings.GeneralSystemSettings;
@@ -219,6 +220,9 @@ public abstract class SciProTest {
     @Mock
     protected GroupForumService groupForumService;
 
+    @Mock
+    protected IndexedForumService indexedForumService;
+
     @Mock
     protected GeneralSystemSettingsService generalSystemSettingsService;
 
diff --git a/view/src/test/java/se/su/dsv/scipro/forum/panels/threaded/ThreadReadStatePanelTest.java b/view/src/test/java/se/su/dsv/scipro/forum/panels/threaded/ThreadReadStatePanelTest.java
index 89f646f576..ffbeb764f3 100644
--- a/view/src/test/java/se/su/dsv/scipro/forum/panels/threaded/ThreadReadStatePanelTest.java
+++ b/view/src/test/java/se/su/dsv/scipro/forum/panels/threaded/ThreadReadStatePanelTest.java
@@ -4,22 +4,22 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.mockito.Mockito.*;
 
-import org.apache.wicket.model.Model;
+import java.time.Instant;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.mockito.ArgumentCaptor;
 import se.su.dsv.scipro.SciProTest;
-import se.su.dsv.scipro.forum.dataobjects.ForumThread;
+import se.su.dsv.scipro.forum.ThreadOverview;
+import se.su.dsv.scipro.forum.dataobjects.ForumPost;
 import se.su.dsv.scipro.forum.panels.AbstractReadStatePanel;
 import se.su.dsv.scipro.system.User;
-import se.su.dsv.scipro.test.ForumBuilder;
 import se.su.dsv.scipro.test.UserBuilder;
 
 public class ThreadReadStatePanelTest extends SciProTest {
 
     ThreadReadStatePanel panel;
     User user;
-    ForumThread forumThread;
+    ThreadOverview forumThread;
 
     @BeforeEach
     public void setUp() throws Exception {
@@ -27,8 +27,7 @@ public class ThreadReadStatePanelTest extends SciProTest {
         setLoggedIn(true);
         setLoggedInAs(user);
 
-        forumThread = new ForumBuilder().createThread().getForumThread();
-        forumThread.addPost(new ForumBuilder().createPost(forumThread));
+        forumThread = new ThreadOverview(1L, false, "Subject", user, Instant.now(), 0, new ForumPost());
     }
 
     @Test
@@ -40,22 +39,24 @@ public class ThreadReadStatePanelTest extends SciProTest {
     @Test
     public void testTogglingCallsCorrectService() {
         // given
-        when(basicForumService.isThreadRead(eq(user), eq(forumThread))).thenReturn(true);
+        when(indexedForumService.isThreadRead(eq(user), eq(forumThread.id()))).thenReturn(true);
 
         // when
         startPanel();
         tester.executeAjaxEvent(path(panel.getId(), AbstractReadStatePanel.TOGGLE), "click");
 
-        verify(basicForumService, times(1)).setThreadRead(eq(user), eq(forumThread), eq(false));
+        verify(indexedForumService, times(1)).setThreadRead(eq(user), eq(forumThread.id()), eq(false));
 
         // then
         ArgumentCaptor<Boolean> captor = ArgumentCaptor.forClass(Boolean.class);
-        verify(basicForumService).setThreadRead(eq(user), eq(forumThread), captor.capture());
+        verify(indexedForumService).setThreadRead(eq(user), eq(forumThread.id()), captor.capture());
 
         assertEquals(false, captor.getValue(), "Does not toggle to the correct state");
     }
 
     private void startPanel() {
-        panel = tester.startComponentInPage(new ThreadReadStatePanel("panel", Model.of(forumThread)));
+        panel = tester.startComponentInPage(
+            new ThreadReadStatePanel("panel", () -> indexedForumService, () -> forumThread)
+        );
     }
 }
diff --git a/view/src/test/java/se/su/dsv/scipro/forum/panels/threaded/ThreadsOverviewPanelTest.java b/view/src/test/java/se/su/dsv/scipro/forum/panels/threaded/ThreadsOverviewPanelTest.java
index 614f92e7cd..aad5c17b7d 100644
--- a/view/src/test/java/se/su/dsv/scipro/forum/panels/threaded/ThreadsOverviewPanelTest.java
+++ b/view/src/test/java/se/su/dsv/scipro/forum/panels/threaded/ThreadsOverviewPanelTest.java
@@ -1,33 +1,28 @@
 package se.su.dsv.scipro.forum.panels.threaded;
 
-import java.util.Arrays;
+import java.time.Instant;
 import java.util.List;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 import org.apache.wicket.markup.html.pages.InternalErrorPage;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mockito;
 import org.mockito.junit.jupiter.MockitoExtension;
 import se.su.dsv.scipro.SciProTest;
-import se.su.dsv.scipro.forum.Discussable;
+import se.su.dsv.scipro.forum.ThreadOverview;
 import se.su.dsv.scipro.forum.dataobjects.ForumPost;
-import se.su.dsv.scipro.forum.dataobjects.ForumThread;
 import se.su.dsv.scipro.system.User;
 
 @ExtendWith(MockitoExtension.class)
 public class ThreadsOverviewPanelTest extends SciProTest {
 
-    private List<ForumThread> threads;
     private ForumPost post;
 
     @BeforeEach
     public void setUp() throws Exception {
-        ForumThread forumThread = createThread();
-        threads = Arrays.asList(forumThread);
-        Mockito.when(basicForumService.getLastPost(forumThread)).thenReturn(post);
+        ThreadOverview forumThread = createThread();
+        Mockito.when(indexedForumService.getThreads()).thenReturn(List.of(forumThread));
     }
 
     @Test
@@ -36,17 +31,10 @@ public class ThreadsOverviewPanelTest extends SciProTest {
     }
 
     private void startPanel() {
-        IModel<List<ForumThread>> listIModel = Model.ofList(threads);
         tester.startComponentInPage(
-            new ThreadsOverviewPanel<>(
+            new ThreadsOverviewPanel(
                 "id",
-                listIModel,
-                new Discussable<ForumThread>() {
-                    @Override
-                    public IModel<ForumThread> discussion(final IModel<ForumThread> a) {
-                        return a;
-                    }
-                },
+                () -> indexedForumService,
                 (id, thread) -> {
                     final BookmarkablePageLink<Void> link = new BookmarkablePageLink<>(id, InternalErrorPage.class);
                     return link;
@@ -55,12 +43,10 @@ public class ThreadsOverviewPanelTest extends SciProTest {
         );
     }
 
-    private ForumThread createThread() {
+    private ThreadOverview createThread() {
         User bob = User.builder().firstName("Bob").lastName("the Builder").emailAddress("bob@building.com").build();
         post = new ForumPost();
         post.setPostedBy(bob);
-        ForumThread groupForumThread = new ForumThread();
-        groupForumThread.addPost(post);
-        return groupForumThread;
+        return new ThreadOverview(1L, true, "Subject", bob, Instant.now(), 1, post);
     }
 }