diff --git a/submissions/models.py b/submissions/models.py
index 7188213097645f8f1d32d308cf567a1dfa17e2de..b9b77f8a63cf7e0c1d445cc6c79c927a95bedf81 100644
--- a/submissions/models.py
+++ b/submissions/models.py
@@ -1,6 +1,8 @@
+import datetime
+
 from django.utils import timezone
 from django.utils.safestring import mark_safe
-from django.db import models
+from django.db import models, transaction
 from django.contrib.auth.models import User
 from django.contrib.postgres.fields import ArrayField, JSONField
 from django.template import Template, Context
@@ -138,8 +140,64 @@ class Submission(models.Model):
             return True
         return False
 
-
-    def header_as_table (self):
+    @transaction.atomic
+    def finish_submission(self):
+        if self.is_resubmission:
+            self.mark_other_versions_as_deprecated()
+            self.copy_authors_from_previous_version()
+            self.copy_EIC_from_previous_version()
+            self.set_resubmission_defaults()
+        else:
+            self.authors.add(self.submitted_by)
+
+        self.save()
+
+    def make_assignment(self):
+        assignment = EditorialAssignment(
+            submission=self,
+            to=self.editor_in_charge,
+            accepted=True,
+            date_created=timezone.now(),
+            date_answered=timezone.now(),
+        )
+        assignment.save()
+
+    def set_resubmission_defaults(self):
+        self.open_for_reporting = True
+        self.open_for_commenting = True
+        if self.other_versions()[0].submitted_to_journal == 'SciPost Physics Lecture Notes':
+            self.reporting_deadline = timezone.now() + datetime.timedelta(days=56)
+        else:
+            self.reporting_deadline = timezone.now() + datetime.timedelta(days=28)
+
+    def copy_EIC_from_previous_version(self):
+        last_version = self.other_versions()[0]
+        self.editor_in_charge = last_version.editor_in_charge
+        self.status = 'EICassigned'
+
+    def copy_authors_from_previous_version(self):
+        last_version = self.other_versions()[0]
+
+        for author in last_version.authors.all():
+            self.authors.add(author)
+        for author in last_version.authors_claims.all():
+            self.authors_claims.add(author)
+        for author in last_version.authors_false_claims.all():
+            self.authors_false_claims.add(author)
+
+    def mark_other_versions_as_deprecated(self):
+        for sub in self.other_versions():
+            sub.is_current = False
+            sub.open_for_reporting = False
+            sub.status = 'resubmitted'
+            sub.save()
+
+    def other_versions(self):
+        return Submission.objects.filter(
+            arxiv_identifier_wo_vn_nr=self.arxiv_identifier_wo_vn_nr
+        ).exclude(pk=self.id).order_by('-arxiv_vn_nr')
+
+    def header_as_table(self):
         # for Submission page
         header = '<table>'
         header += '<tr><td>Title: </td><td>&nbsp;</td><td>{{ title }}</td></tr>'
diff --git a/submissions/views.py b/submissions/views.py
index 81a73f5dae80421aa1277ad4137ee38ca328c2d0..8495322d5b99dbfff0c1334c57320b2b74574308 100644
--- a/submissions/views.py
+++ b/submissions/views.py
@@ -162,7 +162,8 @@ class PrefillUsingIdentifierView(FormView):
                                'arxiv_identifier_w_vn_nr': caller.identifier_with_vn_nr,
                                'arxiv_identifier_wo_vn_nr': caller.identifier_without_vn_nr,
                                'arxiv_vn_nr': caller.version_nr,
-                               'arxiv_link': arxiv_link, 'abstract': abstract}
+                               'arxiv_link': arxiv_link, 'abstract': abstract,
+                               'is_current': True}
                 if is_resubmission:
                     previous_submissions = caller.previous_submissions
                     resubmessage = ('There already exists a preprint with this arXiv identifier '
@@ -256,48 +257,14 @@ class SubmissionCreateView(CreateView):
     def form_valid(self, form):
         submitted_by = Contributor.objects.get(user=self.request.user)
         form.instance.submitted_by = submitted_by
-        form.instance.is_current = True
-
-        if form.cleaned_data['is_resubmission']:
-            form.instance.open_for_reporting = True
-            form.instance.open_for_commenting = True
-
-            deadline = timezone.now() + datetime.timedelta(days=28)  # for papers
-            if form.cleaned_data['submitted_to_journal'] == 'SciPost Physics Lecture Notes':
-                deadline += datetime.timedelta(days=28)
-            form.instance.reporting_deadline = deadline
-
-            # Take information from previous submission(s)
-            previous_submissions = self.previous_submissions(form)
-            form.instance.editor_in_charge = previous_submissions[0].editor_in_charge
-            form.instance.status = 'EICassigned'
-
-            self.mark_previous_submissions_as_deprecated(previous_submissions)
 
+        # Save all the information contained in the form
         submission = form.save()
 
-        if form.cleaned_data['is_resubmission']:
-            # Add many-to-many data
-            for author in previous_submissions[0].authors.all():
-                print('Previous submissions!!')
-                submission.authors.add(author)
-            for author in previous_submissions[0].authors_claims.all():
-                submission.authors_claims.add(author)
-            for author in previous_submissions[0].authors_false_claims.all():
-                submission.authors_false_claims.add(author)
-
-            submission.save()
-
-            # Make assignment
-            assignment = EditorialAssignment(
-                submission=submission,
-                to=submission.editor_in_charge,
-                accepted=True,
-                date_created=timezone.now(),
-                date_answered=timezone.now(),
-            )
-            assignment.save()
+        # Perform all extra actions and set information not contained in the form
+        submission.finish_submission()
 
+        if submission.is_resubmission:
             # Assign permissions
             assign_perm('can_take_editorial_actions', submission.editor_in_charge.user, submission)
             ed_admins = Group.objects.get(name='Editorial Administrators')
@@ -308,10 +275,6 @@ class SubmissionCreateView(CreateView):
             SubmissionUtils.send_authors_resubmission_ack_email()
             SubmissionUtils.send_EIC_reappointment_email()
         else:
-            # Add many-to-many data
-            submission.authors.add(submitted_by)
-            submission.save()
-
             # Send emails
             SubmissionUtils.load({'submission': submission})
             SubmissionUtils.send_authors_submission_ack_email()