diff --git a/submissions/urls.py b/submissions/urls.py
index 6191c3b6638edf6933853c961bcfc033ef83a840..6e776fcf71b60a8500c7f7fc8657ac7eb0f9e8e2 100644
--- a/submissions/urls.py
+++ b/submissions/urls.py
@@ -1,4 +1,4 @@
-from django.conf.urls import include, url
+from django.conf.urls import url
 from django.views.generic import TemplateView
 
 from . import views
@@ -6,7 +6,8 @@ from . import views
 urlpatterns = [
     # Submissions
     url(r'^$', views.SubmissionListView.as_view(), name='submissions'),
-    url(r'^browse/(?P<discipline>[a-z]+)/(?P<nrweeksback>[0-9]{1,3})/$', views.SubmissionListView.as_view(), name='browse'),
+    url(r'^browse/(?P<discipline>[a-z]+)/(?P<nrweeksback>[0-9]{1,3})/$',
+        views.SubmissionListView.as_view(), name='browse'),
     url(r'^sub_and_ref_procedure$',
         TemplateView.as_view(template_name='submissions/sub_and_ref_procedure.html'),
         name='sub_and_ref_procedure'),
@@ -69,17 +70,12 @@ urlpatterns = [
         views.communication, name='communication'),
     url(r'^eic_recommendation/(?P<arxiv_identifier_w_vn_nr>[0-9]{4,}.[0-9]{5,}v[0-9]{1,2})$',
         views.eic_recommendation, name='eic_recommendation'),
-    url(r'^cycle/(?P<arxiv_identifier_w_vn_nr>[0-9]{4,}.[0-9]{5,}v[0-9]{1,2})/submit$', views.cycle_form_submit,
-        name='cycle_confirmation'),
+    url(r'^cycle/(?P<arxiv_identifier_w_vn_nr>[0-9]{4,}.[0-9]{5,}v[0-9]{1,2})/submit$',
+        views.cycle_form_submit, name='cycle_confirmation'),
     # Reports
     url(r'^submit_report/(?P<arxiv_identifier_w_vn_nr>[0-9]{4,}.[0-9]{5,}v[0-9]{1,2})$',
         views.submit_report, name='submit_report'),
-    url(r'^submit_report_ack$',
-        TemplateView.as_view(template_name='submissions/submit_report_ack.html'), name='submit_report_ack'),
-    url(r'^vet_submitted_reports$',
-        views.vet_submitted_reports, name='vet_submitted_reports'),
-    url(r'^vet_submitted_report_ack/(?P<report_id>[0-9]+)$',
-        views.vet_submitted_report_ack, name='vet_submitted_report_ack'),
+    url(r'^vet_submitted_reports$', views.vet_submitted_reports, name='vet_submitted_reports'),
     # Voting
     url(r'^prepare_for_voting/(?P<rec_id>[0-9]+)$', views.prepare_for_voting, name='prepare_for_voting'),
     url(r'^vote_on_rec/(?P<rec_id>[0-9]+)$', views.vote_on_rec, name='vote_on_rec'),
diff --git a/submissions/views.py b/submissions/views.py
index 4484ba0062fe2a3526f70b674a741fe23e7b0c1f..74471e8fed238e8a427083eeaa1e7e48a7f24084 100644
--- a/submissions/views.py
+++ b/submissions/views.py
@@ -989,25 +989,42 @@ def eic_recommendation(request, arxiv_identifier_w_vn_nr):
 ###########
 # Reports
 ###########
-
 @login_required
 @permission_required('scipost.can_referee', raise_exception=True)
 @transaction.atomic
 def submit_report(request, arxiv_identifier_w_vn_nr):
+    """
+    A form to submit a report on a submission will be shown and processed here.
+
+    Important checks to be aware of include an author check for the submission,
+    has the reporting deadline not been reached yet and does there exist any invitation
+    for the current user on this submission.
+    """
     submission = get_object_or_404(Submission.objects.all(),
                                    arxiv_identifier_w_vn_nr=arxiv_identifier_w_vn_nr)
     # Check whether the user can submit a report:
-    is_author = request.user.contributor in submission.authors.all()
+    current_contributor = request.user.contributor
+    is_author = current_contributor in submission.authors.all()
     is_author_unchecked = (not is_author and not
-                           (request.user.contributor in submission.authors_false_claims.all()) and
+                           (current_contributor in submission.authors_false_claims.all()) and
                            (request.user.last_name in submission.author_list))
-    invitation = submission.referee_invitations.filter(referee=request.user.contributor).first()
+    invitation = submission.referee_invitations.filter(referee=current_contributor).first()
 
     errormessage = None
-    if not invitation and timezone.now() > submission.reporting_deadline + datetime.timedelta(days=1):
-        errormessage = ('The reporting deadline has passed. You cannot submit'
-                        ' a Report anymore.')
-        # Also, delete possible report in draft here?
+    if not invitation:
+        if timezone.now() > submission.reporting_deadline + datetime.timedelta(days=1):
+            errormessage = ('The reporting deadline has passed. You cannot submit'
+                            ' a Report anymore.')
+        elif not submission.open_for_reporting:
+            errormessage = ('Reporting for this submission has closed. You cannot submit'
+                            ' a Report anymore.')
+
+        if errormessage:
+            # Remove old drafts from the database
+            reports_in_draft_to_remove = (submission.reports.in_draft()
+                                          .filter(author=current_contributor))
+            if reports_in_draft_to_remove:
+                reports_in_draft_to_remove.delete()
     if is_author:
         errormessage = 'You are an author of this Submission and cannot submit a Report.'
     if is_author_unchecked:
@@ -1018,37 +1035,23 @@ def submit_report(request, arxiv_identifier_w_vn_nr):
         messages.warning(request, errormessage)
         return redirect(reverse('scipost:personal_page'))
 
+    # Find and fill earlier version of report
     try:
-        report_in_draft = submission.reports.in_draft().get(author=request.user.contributor)
+        report_in_draft = submission.reports.in_draft().get(author=current_contributor)
     except Report.DoesNotExist:
         report_in_draft = None
     form = ReportForm(request.POST or None, instance=report_in_draft)
-    if form.is_valid():
-        author = request.user.contributor
-        newreport = form.save(commit=False)
-        newreport.submission = submission
-        newreport.author = author
-        newreport.date_submitted = timezone.now()
-        newreport.save()
 
+    # Check if data sent is valid
+    if form.is_valid():
+        newreport = form.save(submission, current_contributor)
         if newreport.status == STATUS_DRAFT:
             messages.success(request, ('Your Report has been saved. '
                                        'You may leave the page and finish it later.'))
             context = {'submission': submission, 'form': form}
             return render(request, 'submissions/submit_report.html', context)
 
-        if invitation:
-            invitation.fulfilled = True
-            invitation.save()
-            newreport.invited = True
-
-        # Check if author if the report is being flagged on the submission
-        if submission.referees_flagged:
-            if author.user.last_name in submission.referees_flagged:
-                newreport.flagged = True
-        newreport.save()
-
-        # Update user stats
+        # Send mails if report is submitted
         SubmissionUtils.load({'report': newreport}, request)
         SubmissionUtils.email_EIC_report_delivered()
         SubmissionUtils.email_referee_report_delivered()
@@ -1066,42 +1069,39 @@ def submit_report(request, arxiv_identifier_w_vn_nr):
 @login_required
 @permission_required('scipost.can_take_charge_of_submissions', raise_exception=True)
 def vet_submitted_reports(request):
+    """
+    Reports with status `unvetted` will be shown one-by-one. An user may only
+    vet reports of submissions he/she is EIC of.
+
+    After vetting an email is sent to the report author, bcc EIC. If report
+    has not been refused, the submission author is also mailed.
+    """
     contributor = Contributor.objects.get(user=request.user)
     report_to_vet = (Report.objects.awaiting_vetting()
+                     .select_related('submission')
                      .filter(submission__editor_in_charge=contributor).first())
-    form = VetReportForm()
-    context = {'contributor': contributor, 'report_to_vet': report_to_vet, 'form': form}
-    return(render(request, 'submissions/vet_submitted_reports.html', context))
 
-
-@permission_required('scipost.can_take_charge_of_submissions', raise_exception=True)
-@transaction.atomic
-def vet_submitted_report_ack(request, report_id):
-    report = get_object_or_404(Report.objects.awaiting_vetting(), pk=report_id,
-                               submission__editor_in_charge=request.user.contributor)
-    form = VetReportForm(request.POST or None)
+    form = VetReportForm(request.POST or None, initial={'report': report_to_vet})
     if form.is_valid():
-        report.vetted_by = request.user.contributor
-        if form.cleaned_data['action_option'] == '1':
-            # accept the report as is
-            report.status = STATUS_VETTED
-            report.save()
-            report.submission.latest_activity = timezone.now()
-            report.submission.save()
-        elif form.cleaned_data['action_option'] == '2':
-            # the report is simply rejected
-            report.status = form.cleaned_data['refusal_reason']
-            report.save()
+        report = form.process_vetting(request.user.contributor)
+
         # email report author
         SubmissionUtils.load({'report': report,
                               'email_response': form.cleaned_data['email_response_field']})
         SubmissionUtils.acknowledge_report_email()  # email report author, bcc EIC
         if report.status == STATUS_VETTED:
             SubmissionUtils.send_author_report_received_email()
-        messages.success(request, 'Submitted Report vetted.')
-        return redirect(reverse('submissions:editorial_page',
-                                args=[report.submission.arxiv_identifier_w_vn_nr]))
-    return redirect(reverse('submissions:vet_submitted_reports'))
+
+        message = 'Submitted Report vetted for <a href="%s">%s</a>.' % (
+            reverse('submissions:editorial_page',
+                    args=(report.submission.arxiv_identifier_w_vn_nr,)),
+            report.submission.arxiv_identifier_w_vn_nr
+        )
+        messages.success(request, message)
+        # Redirect instead of render to loose the POST call and make it a GET
+        return redirect(reverse('submissions:vet_submitted_reports'))
+    context = {'contributor': contributor, 'report_to_vet': report_to_vet, 'form': form}
+    return render(request, 'submissions/vet_submitted_reports.html', context)
 
 
 @permission_required('scipost.can_prepare_recommendations_for_voting', raise_exception=True)