diff --git a/core/src/main/java/se/su/dsv/scipro/project/Author.java b/core/src/main/java/se/su/dsv/scipro/project/Author.java
index c3094e697c..a43e55cc8e 100644
--- a/core/src/main/java/se/su/dsv/scipro/project/Author.java
+++ b/core/src/main/java/se/su/dsv/scipro/project/Author.java
@@ -39,6 +39,11 @@ public class Author {
     @Basic(optional = true)
     private String reflection;
 
+    @Basic
+    @Enumerated(EnumType.STRING)
+    @Column(name = "reflection_status")
+    private ReflectionStatus reflectionStatus = ReflectionStatus.NOT_SUBMITTED;
+
     public Project getProject() {
         return project;
     }
@@ -63,6 +68,14 @@ public class Author {
         this.reflection = reflection;
     }
 
+    public ReflectionStatus getReflectionStatus() {
+        return reflectionStatus;
+    }
+
+    public void setReflectionStatus(ReflectionStatus reflectionStatus) {
+        this.reflectionStatus = reflectionStatus;
+    }
+
     @Embeddable
     public static class AuthorPK implements Serializable {
         private Long projectId;
diff --git a/core/src/main/java/se/su/dsv/scipro/project/ReflectionStatus.java b/core/src/main/java/se/su/dsv/scipro/project/ReflectionStatus.java
new file mode 100644
index 0000000000..d2f9d46b52
--- /dev/null
+++ b/core/src/main/java/se/su/dsv/scipro/project/ReflectionStatus.java
@@ -0,0 +1,7 @@
+package se.su.dsv.scipro.project;
+
+public enum ReflectionStatus {
+    NOT_SUBMITTED,
+    SUBMITTED,
+    COMPLETION_REQUESTED
+}
diff --git a/core/src/main/java/se/su/dsv/scipro/reflection/Reflection.java b/core/src/main/java/se/su/dsv/scipro/reflection/Reflection.java
new file mode 100644
index 0000000000..898d961a2c
--- /dev/null
+++ b/core/src/main/java/se/su/dsv/scipro/reflection/Reflection.java
@@ -0,0 +1,22 @@
+package se.su.dsv.scipro.reflection;
+
+public sealed interface Reflection {
+    boolean isSubmittable();
+
+    record NotSubmitted() implements Reflection {
+        @Override
+        public boolean isSubmittable() { return true; }
+    }
+
+    record Submitted(String reflection) implements Reflection {
+        @Override
+        public boolean isSubmittable() {
+            return false;
+        }
+    }
+
+    record ImprovementsNeeded(String oldReflection, String commentBySupervisor) implements Reflection {
+        @Override
+        public boolean isSubmittable() { return true; }
+    }
+}
diff --git a/core/src/main/java/se/su/dsv/scipro/reflection/ReflectionServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/reflection/ReflectionServiceImpl.java
index b6f01c95ae..c3a4094ff9 100644
--- a/core/src/main/java/se/su/dsv/scipro/reflection/ReflectionServiceImpl.java
+++ b/core/src/main/java/se/su/dsv/scipro/reflection/ReflectionServiceImpl.java
@@ -5,10 +5,13 @@ import se.su.dsv.scipro.finalseminar.AuthorRepository;
 import se.su.dsv.scipro.finalseminar.FinalSeminarService;
 import se.su.dsv.scipro.project.Author;
 import se.su.dsv.scipro.project.Project;
+import se.su.dsv.scipro.project.ReflectionStatus;
 import se.su.dsv.scipro.system.User;
 
 import jakarta.inject.Inject;
 
+import java.util.Optional;
+
 class ReflectionServiceImpl implements ReflectionService {
     private final AuthorRepository authorRepository;
     private final FinalSeminarService finalSeminarService;
@@ -25,10 +28,13 @@ class ReflectionServiceImpl implements ReflectionService {
     }
 
     @Override
-    public boolean hasToFillInReflection(Project project, User author) {
-        boolean noReflectionSubmitted = authorRepository.findByProjectAndUser(project, author)
-                .map(Author::getReflection)
-                .isEmpty();
+    public boolean hasToFillInReflection(Project project, User user) {
+        Optional<Author> optionalAuthor = authorRepository.findByProjectAndUser(project, user);
+        if (optionalAuthor.isEmpty()) {
+            return false;
+        }
+        Author author = optionalAuthor.get();
+        boolean noReflectionSubmitted = author.getReflectionStatus() != ReflectionStatus.SUBMITTED;
         return hasReachedReflectionProcess(project) && noReflectionSubmitted;
     }
 
@@ -36,7 +42,10 @@ class ReflectionServiceImpl implements ReflectionService {
     @Transactional
     public void submitReflection(Project project, User user, String reflection) {
         authorRepository.findByProjectAndUser(project, user)
-                .ifPresent(author -> author.setReflection(reflection));
+                .ifPresent(author -> {
+                    author.setReflection(reflection);
+                    author.setReflectionStatus(ReflectionStatus.SUBMITTED);
+                });
     }
 
     @Override
@@ -47,7 +56,11 @@ class ReflectionServiceImpl implements ReflectionService {
     }
 
     @Override
-    public void requestNewReflection(Project project, User author) {
-
+    @Transactional
+    public void requestNewReflection(Project project, User user) {
+        authorRepository.findByProjectAndUser(project, user)
+                .ifPresent(author -> {
+                    author.setReflectionStatus(ReflectionStatus.COMPLETION_REQUESTED);
+                });
     }
 }
diff --git a/view/src/main/java/se/su/dsv/scipro/project/panels/FinalStepsPanel.html b/view/src/main/java/se/su/dsv/scipro/project/panels/FinalStepsPanel.html
index a50d6d7828..f59d304ff3 100644
--- a/view/src/main/java/se/su/dsv/scipro/project/panels/FinalStepsPanel.html
+++ b/view/src/main/java/se/su/dsv/scipro/project/panels/FinalStepsPanel.html
@@ -38,6 +38,7 @@
                 <div wicket:id="current_thesis_file"></div>
             </div>
         </wicket:enclosure>
+        <p wicket:id="old_reflection"></p>
         <div class="mb-3">
             <label class="form-label" wicket:for="reflection">
                 <wicket:message key="reflection">[Reflection]</wicket:message>
diff --git a/view/src/main/java/se/su/dsv/scipro/project/panels/FinalStepsPanel.java b/view/src/main/java/se/su/dsv/scipro/project/panels/FinalStepsPanel.java
index 0283f15c13..ab4dd265a2 100644
--- a/view/src/main/java/se/su/dsv/scipro/project/panels/FinalStepsPanel.java
+++ b/view/src/main/java/se/su/dsv/scipro/project/panels/FinalStepsPanel.java
@@ -2,6 +2,7 @@ package se.su.dsv.scipro.project.panels;
 
 import org.apache.wicket.feedback.FencedFeedbackPanel;
 import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.basic.MultiLineLabel;
 import org.apache.wicket.markup.html.form.EnumChoiceRenderer;
 import org.apache.wicket.markup.html.form.Form;
@@ -24,6 +25,7 @@ import se.su.dsv.scipro.grading.PublicationMetadata;
 import se.su.dsv.scipro.grading.PublicationMetadataFormComponentPanel;
 import se.su.dsv.scipro.grading.PublicationMetadataService;
 import se.su.dsv.scipro.project.Project;
+import se.su.dsv.scipro.reflection.Reflection;
 import se.su.dsv.scipro.reflection.ReflectionService;
 import se.su.dsv.scipro.session.SciProSession;
 
@@ -73,9 +75,23 @@ public class FinalStepsPanel extends GenericPanel<Project> {
         public FinalStepsForm(String id, IModel<Project> projectModel) {
             super(id, projectModel);
 
+            IModel<Reflection> reflectionLoadableDetachableModel = LoadableDetachableModel.of(() -> null);
+
+            IModel<Reflection.ImprovementsNeeded> i = reflectionLoadableDetachableModel.as(Reflection.ImprovementsNeeded.class);
+
+            IModel<String> labelModel = i.map(Reflection.ImprovementsNeeded::oldReflection);
+            add(new Label("old_reflection", labelModel));
+
+            add(new Label("supervisor_comment", i.map(Reflection.ImprovementsNeeded::commentBySupervisor)));
 
             reflectionModel = new Model<>();
-            TextArea<String> reflectionTextArea = new TextArea<>("reflection", reflectionModel);
+            TextArea<String> reflectionTextArea = new TextArea<>("reflection", reflectionModel) {
+                @Override
+                protected void onConfigure() {
+                    super.onConfigure();
+                    setVisible(reflectionLoadableDetachableModel.getObject().isSubmittable());
+                }
+            };
             reflectionTextArea.setRequired(true);
             add(reflectionTextArea);
 
@@ -111,7 +127,13 @@ public class FinalStepsPanel extends GenericPanel<Project> {
             currentThesisFile.add(new OppositeVisibility(thesisFileUpload));
             add(currentThesisFile);
             publicationMetadataModel = LoadableDetachableModel.of(() -> publicationMetadataService.getByProject(getModelObject()));
-            WebMarkupContainer publicationMetadata = new WebMarkupContainer("publication_metadata");
+            WebMarkupContainer publicationMetadata = new WebMarkupContainer("publication_metadata") {
+                @Override
+                protected void onConfigure() {
+                    super.onConfigure();
+                    setEnabled(finalThesisService.isUploadAllowed(FinalStepsPanel.FinalStepsForm.this.getModelObject()));
+                }
+            };
             add(publicationMetadata);
             publicationMetadata.add(new PublicationMetadataFormComponentPanel("publication_metadata_components", publicationMetadataModel));
         }