diff --git a/lib/VipsAssignment.php b/lib/VipsAssignment.php
index 57b6caf9b61f084eec5016fd000bfc6c84f0f606..6c62f92519fd4304045169a76e2d8f18ddf01625 100644
--- a/lib/VipsAssignment.php
+++ b/lib/VipsAssignment.php
@@ -699,17 +699,17 @@ class VipsAssignment extends SimpleORMap
             $solution->options['session_id'] = session_id();
         }
 
+        // in selftests, autocorrect solution
+        if ($this->isSelfAssessment()) {
+            $this->correctSolution($solution);
+        }
+
         // move old solutions into vips_solution_archive
         VipsSolution::archiveBySQL(
             'exercise_id = ? AND assignment_id = ? AND user_id = ?',
             [$exercise->id, $this->id, $user_id]
         );
 
-        // in selftests, autocorrect solution
-        if ($this->isSelfAssessment()) {
-            $this->correctSolution($solution);
-        }
-
         // insert new solution into vips_solution
         return $solution->store();
     }
diff --git a/lib/VipsSolution.php b/lib/VipsSolution.php
index 6ca2db5ef7ae365c9f9dd24d01772caafddc91d6..55c30c2d07e7bb545995fa1029d96dfd132e59c8 100644
--- a/lib/VipsSolution.php
+++ b/lib/VipsSolution.php
@@ -126,7 +126,7 @@ class VipsSolution extends SimpleORMap
     {
         $db = DBManager::get();
 
-        $stmt = $db->prepare('INSERT INTO vips_solution_archive
+        $stmt = $db->prepare('INSERT IGNORE INTO vips_solution_archive
                               SELECT * FROM vips_solution WHERE ' . $sql);
         $stmt->execute($params);