diff --git a/core/src/main/java/se/su/dsv/scipro/forum/dataobjects/ForumPostReadState.java b/core/src/main/java/se/su/dsv/scipro/forum/dataobjects/ForumPostReadState.java
index 655a3baf41..eff11f8578 100644
--- a/core/src/main/java/se/su/dsv/scipro/forum/dataobjects/ForumPostReadState.java
+++ b/core/src/main/java/se/su/dsv/scipro/forum/dataobjects/ForumPostReadState.java
@@ -1,14 +1,21 @@
 package se.su.dsv.scipro.forum.dataobjects;
 
+import jakarta.persistence.Basic;
+import jakarta.persistence.Column;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
 import se.su.dsv.scipro.system.User;
 
-import jakarta.persistence.*;
 import java.io.Serializable;
 
 @Entity
-@Table(name = "forum_post_read")
+@Table(name = "forum_post_read_state")
 public class ForumPostReadState implements Serializable {
 
+    // ----------------------------------------------------------------------------------
+    // Basic and embedded JPA-mappings
+    // ----------------------------------------------------------------------------------
     @EmbeddedId
     private ForumPostReadStateId id;
 
@@ -16,6 +23,9 @@ public class ForumPostReadState implements Serializable {
     @Column(name = "`read`", nullable = false)
     private boolean read = false;
 
+    // ----------------------------------------------------------------------------------
+    // Constructors
+    // ----------------------------------------------------------------------------------
     public ForumPostReadState() {
     }
 
@@ -23,6 +33,9 @@ public class ForumPostReadState implements Serializable {
         id = new ForumPostReadStateId(user, post);
     }
 
+    // ----------------------------------------------------------------------------------
+    // Properties (Getters and Setters)
+    // ----------------------------------------------------------------------------------
     public ForumPostReadStateId getId() {
         return id;
     }
@@ -39,4 +52,3 @@ public class ForumPostReadState implements Serializable {
         this.read = read;
     }
 }
-
diff --git a/core/src/main/java/se/su/dsv/scipro/forum/dataobjects/ForumPostReadStateId.java b/core/src/main/java/se/su/dsv/scipro/forum/dataobjects/ForumPostReadStateId.java
index c596d98513..818fd9ca86 100644
--- a/core/src/main/java/se/su/dsv/scipro/forum/dataobjects/ForumPostReadStateId.java
+++ b/core/src/main/java/se/su/dsv/scipro/forum/dataobjects/ForumPostReadStateId.java
@@ -11,11 +11,11 @@ import java.util.Objects;
 @Embeddable
 public class ForumPostReadStateId implements Serializable {
     @ManyToOne
-    @JoinColumn(name = "user", nullable = false)
+    @JoinColumn(name = "user_id", nullable = false)
     private User user;
 
     @ManyToOne
-    @JoinColumn(name = "post", nullable = false)
+    @JoinColumn(name = "forum_post_id", nullable = false)
     private ForumPost post;
 
     public ForumPostReadStateId() {
diff --git a/core/src/main/java/se/su/dsv/scipro/forum/dataobjects/GroupThread.java b/core/src/main/java/se/su/dsv/scipro/forum/dataobjects/GroupThread.java
index 5956a4d6de..ed7d45f410 100644
--- a/core/src/main/java/se/su/dsv/scipro/forum/dataobjects/GroupThread.java
+++ b/core/src/main/java/se/su/dsv/scipro/forum/dataobjects/GroupThread.java
@@ -1,49 +1,70 @@
 package se.su.dsv.scipro.forum.dataobjects;
 
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.OneToOne;
+import jakarta.persistence.Table;
 import se.su.dsv.scipro.group.Group;
 
-import jakarta.persistence.*;
 import java.io.Serializable;
 import java.util.Objects;
 
 @Entity
-@Table(name = "group_thread")
+@Table(name = "project_group_thread")
 public class GroupThread implements Serializable {
 
+    // ----------------------------------------------------------------------------------
+    // Basic JPA-mappings
+    // ----------------------------------------------------------------------------------
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
 
+    // ----------------------------------------------------------------------------------
+    // JPA-mappings of foreign keys in this table (project_group_thread) referencing other
+    // tables.
+    // ----------------------------------------------------------------------------------
     @ManyToOne
-    @JoinColumn(name = "group_id", nullable = false)
+    @JoinColumn(name = "project_group_id", referencedColumnName = "id", nullable = false)
     private Group group;
 
     @OneToOne(cascade = CascadeType.ALL, optional = false)
-    @JoinColumn(name = "thread_id")
+    @JoinColumn(name = "thread_id", referencedColumnName = "id")
     private ForumThread forumThread;
 
+    // ----------------------------------------------------------------------------------
+    // Properties (Getters and Setters)
+    // ----------------------------------------------------------------------------------
     public Long getId() { return id; }
 
-    public Group getGroup() {
-        return group;
-    }
-
-    public ForumThread getForumThread() {
-        return forumThread;
-    }
-
     public void setId(Long id) {
         this.id = id;
     }
 
+    public Group getGroup() {
+        return group;
+    }
+
     public void setGroup(Group group) {
         this.group = group;
     }
 
+    public ForumThread getForumThread() {
+        return forumThread;
+    }
+
     public void setForumThread(ForumThread forumThread) {
         this.forumThread = forumThread;
     }
 
+    // ----------------------------------------------------------------------------------
+    // Methods Common To All Objects
+    // ----------------------------------------------------------------------------------
     @Override
     public boolean equals(final Object o) {
         if (o == this) return true;
@@ -55,10 +76,6 @@ public class GroupThread implements Serializable {
                 && Objects.equals(this.getForumThread(), other.getForumThread());
     }
 
-    protected boolean canEqual(final Object other) {
-        return other instanceof GroupThread;
-    }
-
     @Override
     public int hashCode() {
         return Objects.hash(this.getId(), this.getGroup(), this.getForumThread());
@@ -66,6 +83,14 @@ public class GroupThread implements Serializable {
 
     @Override
     public String toString() {
-        return "GroupThread(id=" + this.getId() + ", group=" + this.getGroup() + ", forumThread=" + this.getForumThread() + ")";
+        return "GroupThread(id=" + this.getId() + ", group=" + this.getGroup() + ", forumThread=" +
+                this.getForumThread() + ")";
+    }
+
+    // ----------------------------------------------------------------------------------
+    // Other methods
+    // ----------------------------------------------------------------------------------
+    protected boolean canEqual(final Object other) {
+        return other instanceof GroupThread;
     }
 }
diff --git a/core/src/main/java/se/su/dsv/scipro/forum/dataobjects/ProjectThread.java b/core/src/main/java/se/su/dsv/scipro/forum/dataobjects/ProjectThread.java
index 32b99a8a84..ba32a9f14f 100644
--- a/core/src/main/java/se/su/dsv/scipro/forum/dataobjects/ProjectThread.java
+++ b/core/src/main/java/se/su/dsv/scipro/forum/dataobjects/ProjectThread.java
@@ -1,50 +1,70 @@
 package se.su.dsv.scipro.forum.dataobjects;
 
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.OneToOne;
+import jakarta.persistence.Table;
 import se.su.dsv.scipro.project.Project;
 
-import jakarta.persistence.*;
 import java.io.Serializable;
 import java.util.Objects;
 
 @Entity
 @Table(name = "project_thread")
 public class ProjectThread implements Serializable {
+    // ----------------------------------------------------------------------------------
+    // Basic JPA-mappings
+    // ----------------------------------------------------------------------------------
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
 
-    @OneToOne(optional = false)
-    @JoinColumn(name = "thread_id")
-    private ForumThread forumThread;
-
+    // ----------------------------------------------------------------------------------
+    // JPA-mappings of foreign keys in this table (project_thread) referencing other
+    // tables.
+    // ----------------------------------------------------------------------------------
     @ManyToOne(optional = false)
-    @JoinColumn(name = "project_id")
+    @JoinColumn(name = "project_id", referencedColumnName = "id")
     private Project project;
 
+    @OneToOne(optional = false)
+    @JoinColumn(name = "thread_id", referencedColumnName = "id")
+    private ForumThread forumThread;
+
+    // ----------------------------------------------------------------------------------
+    // Properties (Getters and Setters)
+    // ----------------------------------------------------------------------------------
     public Long getId() {
         return id;
     }
 
-    public Project getProject() {
-        return project;
-    }
-
-    public ForumThread getForumThread() {
-        return forumThread;
-    }
-
     public void setId(Long id) {
         this.id = id;
     }
 
-    public void setForumThread(ForumThread forumThread) {
-        this.forumThread = forumThread;
+    public Project getProject() {
+        return project;
     }
 
     public void setProject(Project project) {
         this.project = project;
     }
 
+    public ForumThread getForumThread() {
+        return forumThread;
+    }
+
+    public void setForumThread(ForumThread forumThread) {
+        this.forumThread = forumThread;
+    }
+
+    // ----------------------------------------------------------------------------------
+    // Methods Common To All Objects
+    // ----------------------------------------------------------------------------------
     @Override
     public boolean equals(final Object o) {
         if (o == this) return true;
@@ -56,10 +76,6 @@ public class ProjectThread implements Serializable {
                 && Objects.equals(this.getProject(), other.getProject());
     }
 
-    protected boolean canEqual(final Object other) {
-        return other instanceof ProjectThread;
-    }
-
     @Override
     public int hashCode() {
         return Objects.hash(this.getId(), this.getForumThread(), this.getProject());
@@ -67,6 +83,14 @@ public class ProjectThread implements Serializable {
 
     @Override
     public String toString() {
-        return "ProjectThread(id=" + this.getId() + ", forumThread=" + this.getForumThread() + ", project=" + this.getProject() + ")";
+        return "ProjectThread(id=" + this.getId() + ", forumThread=" + this.getForumThread() +
+                ", project=" + this.getProject() + ")";
+    }
+
+    // ----------------------------------------------------------------------------------
+    // Other methods
+    // ----------------------------------------------------------------------------------
+    protected boolean canEqual(final Object other) {
+        return other instanceof ProjectThread;
     }
 }
diff --git a/core/src/main/java/se/su/dsv/scipro/forum/dataobjects/ReviewerThread.java b/core/src/main/java/se/su/dsv/scipro/forum/dataobjects/ReviewerThread.java
index 010a5686d6..5cce25c1ca 100644
--- a/core/src/main/java/se/su/dsv/scipro/forum/dataobjects/ReviewerThread.java
+++ b/core/src/main/java/se/su/dsv/scipro/forum/dataobjects/ReviewerThread.java
@@ -1,50 +1,69 @@
 package se.su.dsv.scipro.forum.dataobjects;
 
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.OneToOne;
+import jakarta.persistence.Table;
 import se.su.dsv.scipro.project.Project;
 
-import jakarta.persistence.*;
 import java.util.Objects;
 
 @Entity
 @Table(name = "reviewer_thread")
 public class ReviewerThread {
 
+    // ----------------------------------------------------------------------------------
+    // Basic JPA-mapping
+    // ----------------------------------------------------------------------------------
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
 
-    @OneToOne(optional = false)
-    @JoinColumn(name = "thread_id")
-    private ForumThread forumThread;
-
+    // ----------------------------------------------------------------------------------
+    // JPA-mappings of foreign keys in this table (mail_event) referencing other
+    // tables.
+    // ----------------------------------------------------------------------------------
     @OneToOne
-    @JoinColumn(name = "project_id", unique = true)
+    @JoinColumn(name = "project_id", referencedColumnName = "id", unique = true)
     private Project project;
 
+    @OneToOne(optional = false)
+    @JoinColumn(name = "thread_id", referencedColumnName = "id")
+    private ForumThread forumThread;
+
+    // ----------------------------------------------------------------------------------
+    // Properties (Getters and Setters)
+    // ----------------------------------------------------------------------------------
     public Long getId() {
         return this.id;
     }
 
-    public ForumThread getForumThread() {
-        return this.forumThread;
-    }
-
-    public Project getProject() {
-        return this.project;
-    }
-
     public void setId(Long id) {
         this.id = id;
     }
 
-    public void setForumThread(ForumThread forumThread) {
-        this.forumThread = forumThread;
+    public Project getProject() {
+        return this.project;
     }
 
     public void setProject(Project project) {
         this.project = project;
     }
 
+    public ForumThread getForumThread() {
+        return this.forumThread;
+    }
+
+    public void setForumThread(ForumThread forumThread) {
+        this.forumThread = forumThread;
+    }
+
+    // ----------------------------------------------------------------------------------
+    // Methods Common To All Objects
+    // ----------------------------------------------------------------------------------
     @Override
     public boolean equals(final Object o) {
         if (o == this) return true;
@@ -56,10 +75,6 @@ public class ReviewerThread {
                 && Objects.equals(this.getProject(), other.getProject());
     }
 
-    protected boolean canEqual(final Object other) {
-        return other instanceof ReviewerThread;
-    }
-
     @Override
     public int hashCode() {
         return Objects.hash(this.getId(), this.getForumThread(), this.getProject());
@@ -67,6 +82,14 @@ public class ReviewerThread {
 
     @Override
     public String toString() {
-        return "ReviewerThread(id=" + this.getId() + ", forumThread=" + this.getForumThread() + ", project=" + this.getProject() + ")";
+        return "ReviewerThread(id=" + this.getId() + ", forumThread=" + this.getForumThread() +
+                ", project=" + this.getProject() + ")";
+    }
+
+    // ----------------------------------------------------------------------------------
+    // Other methods
+    // ----------------------------------------------------------------------------------
+    protected boolean canEqual(final Object other) {
+        return other instanceof ReviewerThread;
     }
 }
diff --git a/core/src/main/resources/db/migration/V389__harmonize_table_attribute_name.sql b/core/src/main/resources/db/migration/V389__harmonize_table_attribute_name.sql
index 190eb48a98..35b68e9ba5 100644
--- a/core/src/main/resources/db/migration/V389__harmonize_table_attribute_name.sql
+++ b/core/src/main/resources/db/migration/V389__harmonize_table_attribute_name.sql
@@ -2973,6 +2973,102 @@ alter table `forum_post_file_reference`
         foreign key (file_reference_id) references file_reference (id)
             on delete cascade on update cascade;
 
+/*
+ * Step 23: forum_post_read, project_thread, reviewer_thread and group_thread
+ */
+
+-- table: forum_post_read
+
+alter table `forum_post_read` drop foreign key `FK8A5DFC60DD74550D`;
+alter table `forum_post_read` drop foreign key `FK8A5DFC60924F477B`;
+
+alter table `forum_post_read` drop key `FK8A5DFC60DD74550D`;
+alter table `forum_post_read` drop key `FK8A5DFC60924F477B`;
+
+alter table `forum_post_read` drop primary key;
+
+rename table `forum_post_read` to `forum_post_read_state`;
+
+alter table `forum_post_read_state` change `read` `read` tinyint(1) not null after `post`;
+alter table `forum_post_read_state` change `user` `user_id` bigint(20) not null after `post`;
+alter table `forum_post_read_state` change `post` `forum_post_id` bigint(20) not null;
+
+alter table `forum_post_read_state` add primary key (forum_post_id, user_id);
+
+alter table `forum_post_read_state`
+    add constraint fk_forum_post_read_state_forum_post_id
+        foreign key (forum_post_id) references forum_post (id)
+            on delete cascade on update cascade;
+
+alter table `forum_post_read_state`
+    add constraint fk_forum_post_read_state_user_id
+        foreign key (user_id) references user (id)
+            on delete cascade on update cascade;
+
+-- table: project_thread
+
+alter table `project_thread` drop foreign key `FK_project_thread_thread`;
+alter table `project_thread` drop foreign key `FK_project_thread_project`;
+
+alter table `project_thread` drop key `FK_project_thread_thread`;
+alter table `project_thread` drop key `FK_project_thread_project`;
+
+alter table `project_thread` change `project_id` `project_id` bigint(20) not null after `id`;
+
+alter table `project_thread`
+    add constraint fk_project_thread_project_id
+        foreign key (project_id) references project (id)
+            on delete cascade on update cascade;
+
+alter table `project_thread`
+    add constraint fk_project_thread_thread_id
+        foreign key (thread_id) references thread (id)
+            on delete cascade on update cascade;
+
+-- table: reviewer_thread
+
+alter table `reviewer_thread` drop foreign key `FK_reviewer_thread_thread`;
+alter table `reviewer_thread` drop foreign key `FK_reviewer_thread_group`;
+
+alter table `reviewer_thread` drop key `FK_reviewer_thread_thread`;
+alter table `reviewer_thread` drop key `project_id`;
+
+alter table `reviewer_thread` change `thread_id` `thread_id` bigint(20) not null after `project_id`;
+
+alter table `reviewer_thread` add constraint uk_reviewer_thread_project_id unique(project_id, thread_id);
+
+alter table `reviewer_thread`
+    add constraint fk_reviewer_thread_project_id
+        foreign key (project_id) references project (id)
+            on delete cascade on update cascade;
+
+alter table `reviewer_thread`
+    add constraint fk_reviewer_thread_thread_id
+        foreign key (thread_id) references thread (id)
+            on delete cascade on update cascade;
+
+-- table: group_thread
+
+alter table `group_thread` drop foreign key `FK_project_group_thread_thread`;
+alter table `group_thread` drop foreign key `FK_project_group_thread_group`;
+
+alter table `group_thread` drop key `FK_project_group_thread_thread`;
+alter table `group_thread` drop key `project_group`;
+
+rename table `group_thread` to `project_group_thread`;
+
+alter table `project_group_thread` change `group_id` `project_group_id` bigint(20) not null after `id`;
+
+alter table `project_group_thread`
+    add constraint fk_project_group_thread_project_group_id
+        foreign key (project_group_id) references project_group (id)
+            on delete cascade on update cascade;
+
+alter table `project_group_thread`
+    add constraint fk_project_group_thread_thread_id
+        foreign key (thread_id) references thread (id)
+            on delete cascade on update cascade;
+
 
 /* Useful SQL