diff --git a/core/src/main/java/se/su/dsv/scipro/CoreConfig.java b/core/src/main/java/se/su/dsv/scipro/CoreConfig.java
index c500f44d84..b24208d38f 100644
--- a/core/src/main/java/se/su/dsv/scipro/CoreConfig.java
+++ b/core/src/main/java/se/su/dsv/scipro/CoreConfig.java
@@ -434,9 +434,15 @@ public class CoreConfig {
     public FinalSeminarOppositionServiceImpl finalSeminarOppositionService(
         Provider<EntityManager> em,
         FinalSeminarOppositionGrading finalSeminarOppositionGrading,
-        EventBus eventBus
+        EventBus eventBus,
+        FinalSeminarOppositionRepo finalSeminarOppositionRepository
     ) {
-        return new FinalSeminarOppositionServiceImpl(em, finalSeminarOppositionGrading, eventBus);
+        return new FinalSeminarOppositionServiceImpl(
+            em,
+            finalSeminarOppositionGrading,
+            eventBus,
+            finalSeminarOppositionRepository
+        );
     }
 
     @Bean
diff --git a/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarOppositionService.java b/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarOppositionService.java
index 23c37aa4e6..e320c1da2e 100755
--- a/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarOppositionService.java
+++ b/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarOppositionService.java
@@ -1,6 +1,5 @@
 package se.su.dsv.scipro.finalseminar;
 
-import java.util.List;
 import se.su.dsv.scipro.system.GenericService;
 
 public interface FinalSeminarOppositionService extends GenericService<FinalSeminarOpposition, Long> {
@@ -9,5 +8,6 @@ public interface FinalSeminarOppositionService extends GenericService<FinalSemin
 
     OppositionCriteria getCriteriaForOpposition(FinalSeminarOpposition opposition);
 
-    void gradeOpponent(FinalSeminarOpposition opposition, int points, String feedback) throws PointNotValidException;
+    FinalSeminarOpposition gradeOpponent(FinalSeminarOpposition opposition, int points, String feedback)
+        throws PointNotValidException;
 }
diff --git a/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarOppositionServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarOppositionServiceImpl.java
index 066a082fb4..abf7e61246 100755
--- a/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarOppositionServiceImpl.java
+++ b/core/src/main/java/se/su/dsv/scipro/finalseminar/FinalSeminarOppositionServiceImpl.java
@@ -4,6 +4,7 @@ import com.google.common.eventbus.EventBus;
 import jakarta.inject.Inject;
 import jakarta.inject.Provider;
 import jakarta.persistence.EntityManager;
+import jakarta.transaction.Transactional;
 import java.util.List;
 import se.su.dsv.scipro.system.AbstractServiceImpl;
 
@@ -13,16 +14,19 @@ public class FinalSeminarOppositionServiceImpl
 
     private final FinalSeminarOppositionGrading finalSeminarOppositionGrading;
     private final EventBus eventBus;
+    private final FinalSeminarOppositionRepo finalSeminarOppositionRepository;
 
     @Inject
     public FinalSeminarOppositionServiceImpl(
         Provider<EntityManager> em,
         FinalSeminarOppositionGrading finalSeminarOppositionGrading,
-        EventBus eventBus
+        EventBus eventBus,
+        FinalSeminarOppositionRepo finalSeminarOppositionRepository
     ) {
         super(em, FinalSeminarOpposition.class, QFinalSeminarOpposition.finalSeminarOpposition);
         this.finalSeminarOppositionGrading = finalSeminarOppositionGrading;
         this.eventBus = eventBus;
+        this.finalSeminarOppositionRepository = finalSeminarOppositionRepository;
     }
 
     @Override
@@ -31,7 +35,8 @@ public class FinalSeminarOppositionServiceImpl
     }
 
     @Override
-    public void gradeOpponent(FinalSeminarOpposition opposition, int points, String feedback)
+    @Transactional
+    public FinalSeminarOpposition gradeOpponent(FinalSeminarOpposition opposition, int points, String feedback)
         throws PointNotValidException {
         OppositionCriteria criteriaForOpposition = getCriteriaForOpposition(opposition);
         boolean validPoints = criteriaForOpposition
@@ -42,13 +47,16 @@ public class FinalSeminarOppositionServiceImpl
             throw new PointNotValidException(points, List.of(0, 1));
         }
 
+        opposition.setPoints(points);
+        opposition.setFeedback(feedback);
+        FinalSeminarOpposition assessedOpposition = finalSeminarOppositionRepository.save(opposition);
+
         if (criteriaForOpposition.pointsToPass() > points) {
-            eventBus.post(new OppositionFailedEvent(opposition));
+            eventBus.post(new OppositionFailedEvent(assessedOpposition));
         } else {
-            eventBus.post(new OppositionApprovedEvent(opposition));
+            eventBus.post(new OppositionApprovedEvent(assessedOpposition));
         }
-        // TODO:
-        //  * save assessment
-        //  * post events
+
+        return assessedOpposition;
     }
 }
diff --git a/core/src/test/java/se/su/dsv/scipro/finalseminar/FinalSeminarOppositionServiceImplIntegrationTest.java b/core/src/test/java/se/su/dsv/scipro/finalseminar/FinalSeminarOppositionServiceImplIntegrationTest.java
index 303139b29c..fb39050f2d 100644
--- a/core/src/test/java/se/su/dsv/scipro/finalseminar/FinalSeminarOppositionServiceImplIntegrationTest.java
+++ b/core/src/test/java/se/su/dsv/scipro/finalseminar/FinalSeminarOppositionServiceImplIntegrationTest.java
@@ -57,21 +57,7 @@ public class FinalSeminarOppositionServiceImplIntegrationTest extends Integratio
     @Test
     public void opposition_criteria_are_taken_from_the_grading_report_template() {
         FinalSeminarOpposition opposition = createOpposition(finalSeminar, createUser());
-        GradingReportTemplate gradingReportTemplate = createGradingReportTemplate();
-
-        GradingCriterionPointTemplate failingCriterion = new GradingCriterionPointTemplate();
-        failingCriterion.setPoint(0);
-        GradingCriterionPointTemplate passingCriterion = new GradingCriterionPointTemplate();
-        passingCriterion.setPoint(1);
-
-        gradingReportTemplate.addIndividualCriterion(
-            "Criterion 1",
-            "Criterion 1",
-            1,
-            List.of(failingCriterion, passingCriterion),
-            AbstractGradingCriterion.Flag.OPPOSITION
-        );
-        save(gradingReportTemplate);
+        createSimpleGradingReportTemplateWithPassFail();
 
         assertEquals(2, finalSeminarOppositionService.getCriteriaForOpposition(opposition).pointsAvailable().size());
     }
@@ -79,21 +65,7 @@ public class FinalSeminarOppositionServiceImplIntegrationTest extends Integratio
     @Test
     public void can_not_grade_outside_criterion() {
         FinalSeminarOpposition opposition = createOpposition(finalSeminar, createUser());
-        GradingReportTemplate gradingReportTemplate = createGradingReportTemplate();
-
-        GradingCriterionPointTemplate failingCriterion = new GradingCriterionPointTemplate();
-        failingCriterion.setPoint(0);
-        GradingCriterionPointTemplate passingCriterion = new GradingCriterionPointTemplate();
-        passingCriterion.setPoint(1);
-
-        gradingReportTemplate.addIndividualCriterion(
-            "Criterion 1",
-            "Criterion 1",
-            1,
-            List.of(failingCriterion, passingCriterion),
-            AbstractGradingCriterion.Flag.OPPOSITION
-        );
-        save(gradingReportTemplate);
+        createSimpleGradingReportTemplateWithPassFail();
 
         PointNotValidException exception = assertThrows(PointNotValidException.class, () ->
             finalSeminarOppositionService.gradeOpponent(opposition, 2, "Feedback")
@@ -106,21 +78,7 @@ public class FinalSeminarOppositionServiceImplIntegrationTest extends Integratio
     @Test
     public void publishes_failed_event_when_grading_with_failing_criterion() throws Exception {
         FinalSeminarOpposition opposition = createOpposition(finalSeminar, createUser());
-        GradingReportTemplate gradingReportTemplate = createGradingReportTemplate();
-
-        GradingCriterionPointTemplate failingCriterion = new GradingCriterionPointTemplate();
-        failingCriterion.setPoint(0);
-        GradingCriterionPointTemplate passingCriterion = new GradingCriterionPointTemplate();
-        passingCriterion.setPoint(1);
-
-        gradingReportTemplate.addIndividualCriterion(
-            "Criterion 1",
-            "Criterion 1",
-            1,
-            List.of(failingCriterion, passingCriterion),
-            AbstractGradingCriterion.Flag.OPPOSITION
-        );
-        save(gradingReportTemplate);
+        createSimpleGradingReportTemplateWithPassFail();
 
         finalSeminarOppositionService.gradeOpponent(opposition, 0, "Feedback");
 
@@ -130,6 +88,25 @@ public class FinalSeminarOppositionServiceImplIntegrationTest extends Integratio
     @Test
     public void publishes_approved_event_when_grading_with_passing_criterion() throws Exception {
         FinalSeminarOpposition opposition = createOpposition(finalSeminar, createUser());
+        createSimpleGradingReportTemplateWithPassFail();
+
+        finalSeminarOppositionService.gradeOpponent(opposition, 1, "Feedback");
+
+        assertThat(getPublishedEvents(), hasItem(new OppositionApprovedEvent(opposition)));
+    }
+
+    @Test
+    public void stores_assessment() throws Exception {
+        FinalSeminarOpposition opposition = createOpposition(finalSeminar, createUser());
+        createSimpleGradingReportTemplateWithPassFail();
+
+        FinalSeminarOpposition graded = finalSeminarOppositionService.gradeOpponent(opposition, 1, "Feedback");
+
+        assertEquals(1, graded.getPoints());
+        assertEquals("Feedback", graded.getFeedback());
+    }
+
+    private void createSimpleGradingReportTemplateWithPassFail() {
         GradingReportTemplate gradingReportTemplate = createGradingReportTemplate();
 
         GradingCriterionPointTemplate failingCriterion = new GradingCriterionPointTemplate();
@@ -145,10 +122,6 @@ public class FinalSeminarOppositionServiceImplIntegrationTest extends Integratio
             AbstractGradingCriterion.Flag.OPPOSITION
         );
         save(gradingReportTemplate);
-
-        finalSeminarOppositionService.gradeOpponent(opposition, 1, "Feedback");
-
-        assertThat(getPublishedEvents(), hasItem(new OppositionApprovedEvent(opposition)));
     }
 
     private void createOppositionReport(FinalSeminarOpposition opposition) {