diff --git a/smash/web/tests/view/test_contact_attempt.py b/smash/web/tests/view/test_contact_attempt.py
index 94e0f6605494f4eb9558ce873df10cea92fb0a78..3c00d0d7b50dc790829f591d0f5c20018317320b 100644
--- a/smash/web/tests/view/test_contact_attempt.py
+++ b/smash/web/tests/view/test_contact_attempt.py
@@ -29,7 +29,7 @@ class ContactAttemptViewTests(LoggedInWithWorkerTestCase):
         response = self.client.post(
             reverse('web.views.contact_add', kwargs={'subject_id': subject.id}), data=form_data)
         # check correct redirection to subject edit page
-        self.assertRedirects(response, reverse('web.views.subject_edit', kwargs={'id': subject.id}))
+        self.assertRedirects(response, reverse('web.views.subject_edit', kwargs={'subject_id': subject.id}))
         contact_attempts = ContactAttempt.objects.filter(subject=subject).all()
         self.assertEqual(1, len(contact_attempts))
         contact_attempt = contact_attempts[0]
@@ -82,9 +82,10 @@ class ContactAttemptViewTests(LoggedInWithWorkerTestCase):
         response = self.client.post(
             reverse('web.views.contact_edit',
                     kwargs={'subject_id': contact_attempt.subject.id, 'contact_attempt_id': contact_attempt.id}),
-            data=form_data)
+            data=form_data,
+            follow=True)
 
-        self.assertEqual(response.status_code, 302)
+        self.assertEqual(response.status_code, 200)
 
     def test_contact_attempt_edit_from_appointment(self):
         contact_attempt = create_contact_attempt()
diff --git a/smash/web/tests/view/test_subjects.py b/smash/web/tests/view/test_subjects.py
index 3575faaf1571a7dbc39e23d735c1b93ff25e16db..71712186c40af81354e3b3c05b675804ac07c21e 100644
--- a/smash/web/tests/view/test_subjects.py
+++ b/smash/web/tests/view/test_subjects.py
@@ -34,7 +34,7 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase):
         self.assertEqual(response.status_code, 200)
 
     def test_render_subject_edit(self):
-        response = self.client.get(reverse('web.views.subject_edit', kwargs={'id': self.study_subject.id}))
+        response = self.client.get(reverse('web.views.subject_edit', kwargs={'subject_id': self.study_subject.id}))
         self.assertEqual(response.status_code, 200)
 
     def test_render_subject_edit_with_mail_templates(self):
@@ -47,7 +47,7 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase):
         MailTemplate(name=template_name, language=language, context=MAIL_TEMPLATE_CONTEXT_SUBJECT,
                      template_file=template_file).save()
 
-        response = self.client.get(reverse('web.views.subject_edit', kwargs={'id': self.study_subject.id}))
+        response = self.client.get(reverse('web.views.subject_edit', kwargs={'subject_id': self.study_subject.id}))
         self.assertEqual(response.status_code, 200)
         self.assertTrue(template_name.encode('utf8') in response.content)
 
@@ -70,7 +70,7 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase):
         form_data['subject-dead'] = "True"
         form_data['study_subject-resigned'] = "True"
         response = self.client.post(
-            reverse('web.views.subject_edit', kwargs={'id': self.study_subject.id}), data=form_data)
+            reverse('web.views.subject_edit', kwargs={'subject_id': self.study_subject.id}), data=form_data)
 
         self.assertEqual(response.status_code, 200)
         self.assertTrue("Resign reason cannot be empty".encode('utf8') in response.content)
@@ -87,7 +87,7 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase):
 
         form_data['study_subject-endpoint_reached'] = "True"
         response = self.client.post(
-            reverse('web.views.subject_edit', kwargs={'id': study_subject.id}), data=form_data)
+            reverse('web.views.subject_edit', kwargs={'subject_id': study_subject.id}), data=form_data)
 
         self.assertEqual(response.status_code, 302)
         updated_study_subject = StudySubject.objects.filter(id=study_subject.id)[0]
@@ -108,7 +108,7 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase):
         form_data['study_subject-resigned'] = "True"
         form_data['study_subject-resign_reason'] = "Doesn't want to participate"
         response = self.client.post(
-            reverse('web.views.subject_edit', kwargs={'id': study_subject.id}), data=form_data)
+            reverse('web.views.subject_edit', kwargs={'subject_id': study_subject.id}), data=form_data)
 
         self.assertEqual(response.status_code, 302)
         updated_study_subject = StudySubject.objects.filter(id=study_subject.id)[0]
@@ -123,7 +123,7 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase):
         form_data['study_subject-resigned'] = "True"
         form_data['study_subject-resign_reason'] = "doesn't want to participate"
 
-        url = reverse('web.views.subject_edit', kwargs={'id': self.study_subject.id})
+        url = reverse('web.views.subject_edit', kwargs={'subject_id': self.study_subject.id})
         response = self.client.post(url, data=form_data)
 
         self.assertEqual(response.status_code, 302)
@@ -135,11 +135,11 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase):
         form_data = self.create_edit_form_data_for_study_subject()
         form_data['_continue'] = True
 
-        response = self.client.post(reverse('web.views.subject_edit', kwargs={'id': self.study_subject.id}),
-                                    data=form_data)
+        response = self.client.post(reverse('web.views.subject_edit', kwargs={'subject_id': self.study_subject.id}),
+                                    data=form_data,
+                                    follow=True)
 
-        self.assertEqual(response.status_code, 302)
-        self.assertTrue("edit" in response.url)
+        self.assertEqual(response.status_code, 200)
 
     def test_delete_subject(self):
         self.login_as_super()
@@ -240,7 +240,7 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase):
         subject = StudySubject.objects.all().order_by("-id")[0]
 
         # check if edit page renders properly
-        response = self.client.get(reverse('web.views.subject_edit', kwargs={'id': subject.id}))
+        response = self.client.get(reverse('web.views.subject_edit', kwargs={'subject_id': subject.id}))
         self.assertEqual(response.status_code, 200)
 
         # check if file can be downloaded
@@ -350,7 +350,7 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase):
         count = Provenance.objects.all().count()
         form_data["study_subject-type"] = get_patient_subject_type().id
         response = self.client.post(
-            reverse('web.views.subject_edit', kwargs={'id': self.study_subject.id}), data=form_data)
+            reverse('web.views.subject_edit', kwargs={'subject_id': self.study_subject.id}), data=form_data)
 
         self.assertEqual(response.status_code, 302)
 
diff --git a/smash/web/urls.py b/smash/web/urls.py
index c36c61d94c4695db6937a228911bcf1fe55e76d1..13c9886bc66d57f9bfde97fe3c218d12f4e17f17 100644
--- a/smash/web/urls.py
+++ b/smash/web/urls.py
@@ -89,7 +89,7 @@ urlpatterns = [
     url(r'^study/(?P<study_id>\d+)/subjects/add$', views.subject.subject_add, name='web.views.subject_add'),
     url(r'^subjects/subject_visit_details/(?P<id>\d+)$', views.subject.subject_visit_details,
         name='web.views.subject_visit_details'),
-    url(r'^subjects/edit/(?P<id>\d+)$', views.subject.subject_edit, name='web.views.subject_edit'),
+    url(r'^subjects/edit/(?P<subject_id>\d+)$', views.subject.subject_edit, name='web.views.subject_edit'),
     url(r'^subjects/(?P<pk>\d+)/delete$', views.subject.SubjectDeleteView.as_view(),
         name='web.views.subject_delete'),
 
diff --git a/smash/web/views/contact_attempt.py b/smash/web/views/contact_attempt.py
index 7f60e513ff7958778b2f06c4945f74e57e664135..1e7d98fe6a649144525dabd7ac1fa10fd6aa82a8 100644
--- a/smash/web/views/contact_attempt.py
+++ b/smash/web/views/contact_attempt.py
@@ -15,7 +15,7 @@ def contact_add(request, subject_id):
             if 'from_appointment' in request.GET:
                 return redirect('web.views.appointment_edit', appointment_id=request.GET.get('from_appointment', ''))
             else:
-                return redirect('web.views.subject_edit', id=subject_id)
+                return redirect('web.views.subject_edit', subject_id=subject_id)
     else:
         form = ContactAttemptAddForm(user=request.user, subject=subject)
 
@@ -32,7 +32,7 @@ def contact_edit(request, subject_id, contact_attempt_id):
             if 'from_appointment' in request.GET:
                 return redirect('web.views.appointment_edit', appointment_id=request.GET.get('from_appointment', ''))
             else:
-                return redirect('web.views.subject_edit', id=contact_attempt.subject.id)
+                return redirect('web.views.subject_edit', subject_id=contact_attempt.subject.id)
     else:
         form = ContactAttemptEditForm(instance=contact_attempt, user=request.user)
 
diff --git a/smash/web/views/subject.py b/smash/web/views/subject.py
index 14671333698e46b0aeeb2b7b1d43adb22c9d9bca..dd83c21200047614843d6852310a576cf140e11f 100644
--- a/smash/web/views/subject.py
+++ b/smash/web/views/subject.py
@@ -48,7 +48,7 @@ def subject_add(request, study_id):
             study_subject = study_subject_form.save()
             persist_custom_file_fields(request, study_subject)
             messages.add_message(request, messages.SUCCESS, 'Subject created')
-            return redirect('web.views.subject_edit', id=study_subject_form.instance.id)
+            return redirect('web.views.subject_edit', subject_id=study_subject_form.instance.id)
         else:
             messages.add_message(request, messages.ERROR, 'Invalid data. Please fix data and try again.')
 
@@ -122,8 +122,8 @@ def subject_require_contact(request):
     return subject_list(request, SUBJECT_LIST_REQUIRE_CONTACT)
 
 
-def subject_edit(request, id):  # pylint: disable=redefined-builtin
-    study_subject = get_object_or_404(StudySubject, id=id)
+def subject_edit(request, subject_id):
+    study_subject = get_object_or_404(StudySubject, id=subject_id)
     contact_attempts = study_subject.contactattempt_set.order_by('-datetime_when').all()
     was_dead = study_subject.subject.dead
     was_resigned = study_subject.resigned
@@ -197,7 +197,7 @@ def subject_edit(request, id):  # pylint: disable=redefined-builtin
                 p.save()
             messages.success(request, "Modifications saved")
             if '_continue' in request.POST:
-                return redirect('web.views.subject_edit', id=study_subject.id)
+                return redirect('web.views.subject_edit', subject_id=study_subject.id)
             return redirect('web.views.subjects')
         else:
             messages.add_message(request, messages.ERROR, 'Invalid data. Please fix data and try again.')
diff --git a/smash/web/views/voucher.py b/smash/web/views/voucher.py
index dc003a08b0f9ddef846e0a8632761cbb70b4e0f2..21c30b6773965093cad38b0095545f53f01ec673 100644
--- a/smash/web/views/voucher.py
+++ b/smash/web/views/voucher.py
@@ -57,7 +57,7 @@ class VoucherCreateView(CreateView, WrappedView):
 
     def get_success_url(self, **kwargs):
         # noinspection PyUnresolvedReferences
-        return reverse_lazy('web.views.subject_edit', kwargs={'id': self.request.GET.get("study_subject_id", -1)})
+        return reverse_lazy('web.views.subject_edit', kwargs={'subject_id': self.request.GET.get("study_subject_id", -1)})
 
     def get_form_kwargs(self):
         kwargs = super().get_form_kwargs()
@@ -79,7 +79,7 @@ class VoucherEditView(SuccessMessageMixin, UpdateView, WrappedView):
 
     def get_success_url(self, **kwargs):
         # noinspection PyUnresolvedReferences
-        return reverse_lazy('web.views.subject_edit', kwargs={'id': self.get_study_subject_id()})
+        return reverse_lazy('web.views.subject_edit', kwargs={'subject_id': self.get_study_subject_id()})
 
     def get_study_subject_id(self):
         return Voucher.objects.get(id=self.kwargs['pk']).study_subject.id