diff --git a/opentech/apply/determinations/tests/test_views.py b/opentech/apply/determinations/tests/test_views.py
index 5f3f0c00523e6d466094e84bd86924ac5d4e2af2..b5d8f49823dc05300e77ebbc06123f79a183ff9d 100644
--- a/opentech/apply/determinations/tests/test_views.py
+++ b/opentech/apply/determinations/tests/test_views.py
@@ -1,42 +1,18 @@
-from django.test import TestCase, RequestFactory
 from django.urls import reverse
 
 from opentech.apply.activity.models import Activity
 from opentech.apply.determinations.models import ACCEPTED
 from opentech.apply.users.tests.factories import StaffFactory, UserFactory
 from opentech.apply.funds.tests.factories import ApplicationSubmissionFactory
+from opentech.apply.utils.testing import BaseViewTestCase
 
 from .factories import DeterminationFactory
 
 
-class BaseTestCase(TestCase):
-    url_name = ''
-    user_factory = None
-
-    def setUp(self):
-        self.factory = RequestFactory()
-        self.user = self.user_factory()
-        self.client.force_login(self.user)
-
-    def url(self, instance, view_name='detail'):
-        full_url_name = self.url_name.format(view_name)
-        url = reverse(full_url_name, kwargs=self.get_kwargs(instance))
-        request = self.factory.get(url, secure=True)
-        return request.build_absolute_uri()
-
-    def get_page(self, instance, view_name='detail'):
-        return self.client.get(self.url(instance, view_name), secure=True, follow=True)
-
-    def post_page(self, instance, data, view_name='detail'):
-        return self.client.post(self.url(instance, view_name), data, secure=True, follow=True)
-
-    def refresh(self, instance):
-        return instance.__class__.objects.get(id=instance.id)
-
-
-class StaffDeterminationsTestCase(BaseTestCase):
+class StaffDeterminationsTestCase(BaseViewTestCase):
     user_factory = StaffFactory
     url_name = 'funds:submissions:determinations:{}'
+    base_view_name = 'detail'
 
     def get_kwargs(self, instance):
         return {'submission_pk': instance.submission.id}
@@ -60,9 +36,10 @@ class StaffDeterminationsTestCase(BaseTestCase):
         self.assertTrue(response.context['can_view_extended_data'])
 
 
-class DeterminationFormTestCase(BaseTestCase):
+class DeterminationFormTestCase(BaseViewTestCase):
     user_factory = StaffFactory
     url_name = 'funds:submissions:determinations:{}'
+    base_view_name = 'detail'
 
     def get_kwargs(self, instance):
         return {'submission_pk': instance.id}
@@ -141,9 +118,10 @@ class DeterminationFormTestCase(BaseTestCase):
         self.assertEqual(submission_next.status, 'draft_proposal')
 
 
-class UserDeterminationFormTestCase(BaseTestCase):
+class UserDeterminationFormTestCase(BaseViewTestCase):
     user_factory = UserFactory
     url_name = 'funds:submissions:determinations:{}'
+    base_view_name = 'detail'
 
     def get_kwargs(self, instance):
         return {'submission_pk': instance.id}
diff --git a/opentech/apply/funds/tests/factories/models.py b/opentech/apply/funds/tests/factories/models.py
index 05e972613c8e43636b4cfad614a334589f68c2e9..f4f661f340210cd0f09e24aca5f65729045adcae 100644
--- a/opentech/apply/funds/tests/factories/models.py
+++ b/opentech/apply/funds/tests/factories/models.py
@@ -21,6 +21,7 @@ from opentech.apply.funds.models.forms import (
 )
 from opentech.apply.users.tests.factories import StaffFactory, UserFactory
 from opentech.apply.stream_forms.testing.factories import FormDataFactory
+from opentech.apply.home.factories import ApplyHomePageFactory
 
 from . import blocks
 
@@ -69,6 +70,21 @@ class FundTypeFactory(wagtail_factories.PageFactory):
     # Will need to update how the stages are identified as Fund Page changes
     workflow_name = factory.LazyAttribute(lambda o: list(FundType.WORKFLOW_CHOICES.keys())[o.workflow_stages - 1])
 
+    @factory.post_generation
+    def parent(self, create, extracted_parent, **parent_kwargs):
+        # THIS MUST BE THE FIRST POST GENERATION METHOD OR THE OBJECT WILL BE UNSAVED
+        if create:
+            if extracted_parent and parent_kwargs:
+                raise ValueError('Cant pass a parent instance and attributes')
+
+            if not extracted_parent:
+                parent = ApplyHomePageFactory(**parent_kwargs)
+            else:
+                # Assume root node if no parent passed
+                parent = extracted_parent
+
+            parent.add_child(instance=self)
+
     @factory.post_generation
     def forms(self, create, extracted, **kwargs):
         if create:
@@ -84,6 +100,7 @@ class FundTypeFactory(wagtail_factories.PageFactory):
                 ReviewFormFactory(**review_fields)
 
 
+
 class RequestForPartnersFactory(FundTypeFactory):
     class Meta:
         model = RequestForPartners
@@ -98,7 +115,7 @@ class AbstractRelatedFormFactory(factory.DjangoModelFactory):
 class ApplicationBaseFormFactory(AbstractRelatedFormFactory):
     class Meta:
         model = ApplicationBaseForm
-    application = factory.SubFactory(FundTypeFactory, parent=None)
+    application = factory.SubFactory(FundTypeFactory)
 
 
 class ApplicationFormFactory(factory.DjangoModelFactory):
@@ -120,7 +137,7 @@ class RoundFactory(wagtail_factories.PageFactory):
         )
 
     title = factory.Sequence('Round {}'.format)
-    start_date = factory.Sequence(lambda n: datetime.date.today() + datetime.timedelta(days=7 * n))
+    start_date = factory.Sequence(lambda n: datetime.date.today() + datetime.timedelta(days=7 * n + 1))
     end_date = factory.Sequence(lambda n: datetime.date.today() + datetime.timedelta(days=7 * (n + 1)))
     lead = factory.SubFactory(StaffFactory)
 
@@ -149,7 +166,7 @@ class TodayRoundFactory(RoundFactory):
 class RoundBaseFormFactory(AbstractRelatedFormFactory):
     class Meta:
         model = RoundBaseForm
-    round = factory.SubFactory(RoundFactory, parent=None)
+    round = factory.SubFactory(RoundFactory)
 
 
 class LabFactory(wagtail_factories.PageFactory):
@@ -179,7 +196,7 @@ class LabFactory(wagtail_factories.PageFactory):
 class LabBaseFormFactory(AbstractRelatedFormFactory):
     class Meta:
         model = LabBaseForm
-    lab = factory.SubFactory(LabFactory, parent=None)
+    lab = factory.SubFactory(LabFactory)
 
 
 class ApplicationFormDataFactory(FormDataFactory):
diff --git a/opentech/apply/funds/tests/test_models.py b/opentech/apply/funds/tests/test_models.py
index 4570f9a12ded04f3def74fa8c46884fe8ad440d4..44b07e3891733bd7d965a3a58d94d785edb59433 100644
--- a/opentech/apply/funds/tests/test_models.py
+++ b/opentech/apply/funds/tests/test_models.py
@@ -179,6 +179,7 @@ class TestRoundModelWorkflowAndForms(TestCase):
             self.assertNotEqual(round_form, fund_form)
 
 
+@override_settings(ROOT_URLCONF='opentech.apply.urls')
 class TestFormSubmission(TestCase):
     def setUp(self):
         self.site = Site.objects.first()
diff --git a/opentech/apply/home/factories.py b/opentech/apply/home/factories.py
new file mode 100644
index 0000000000000000000000000000000000000000..aa53b814af17d25b41e4a9a896fa12f3892c0df5
--- /dev/null
+++ b/opentech/apply/home/factories.py
@@ -0,0 +1,14 @@
+import factory
+import wagtail_factories
+
+from .models import ApplyHomePage
+
+
+class ApplyHomePageFactory(wagtail_factories.PageFactory):
+    class Meta:
+        model = ApplyHomePage
+
+    @factory.post_generation
+    def site(self, create, extracted_site, **site_kwargs):
+        if create:
+            wagtail_factories.SiteFactory(root_page=self, is_default_site=True)
diff --git a/opentech/apply/users/tests/test_oauth_access.py b/opentech/apply/users/tests/test_oauth_access.py
index 92d3f2ae25fa42123fb5d1530574e3604a1c2d72..1cc2f13ab373fe94f72bb9e3b4d09a753bba97e8 100644
--- a/opentech/apply/users/tests/test_oauth_access.py
+++ b/opentech/apply/users/tests/test_oauth_access.py
@@ -4,6 +4,7 @@ from django.test import TestCase, override_settings
 from django.urls import reverse
 
 
+@override_settings(ROOT_URLCONF='opentech.apply.urls')
 class TestOAuthAccess(TestCase):
     def login(self):
         email = 'test@email.com'
@@ -19,8 +20,12 @@ class TestOAuthAccess(TestCase):
         """
         oauth_page = reverse('users:oauth')
         response = self.client.get(oauth_page, follow=True)
-        self.assertRedirects(response, reverse(
-            'users:login') + '?next=' + reverse('users:oauth'), status_code=301, target_status_code=200)
+        self.assertRedirects(
+            response,
+            reverse('users_public:login') + '?next=' + reverse('users:oauth'),
+            status_code=301,
+            target_status_code=200,
+        )
 
     @override_settings()
     def test_oauth_not_set_up(self):
diff --git a/opentech/apply/users/tests/test_views.py b/opentech/apply/users/tests/test_views.py
index 1943e508315cfd891b11d2095dd1b5e2639c4af0..caf7fa8a03aef0e7c3f669886493fbcd80d3430f 100644
--- a/opentech/apply/users/tests/test_views.py
+++ b/opentech/apply/users/tests/test_views.py
@@ -1,9 +1,10 @@
-from django.test import TestCase
+from django.test import override_settings, TestCase
 from django.urls import reverse
 
 from .factories import OAuthUserFactory, StaffFactory, UserFactory
 
 
+@override_settings(ROOT_URLCONF='opentech.apply.urls')
 class BaseTestProfielView(TestCase):
     @classmethod
     def setUpTestData(cls):
@@ -19,7 +20,7 @@ class TestProfileView(BaseTestProfielView):
         self.client.logout()
         response = self.client.get(self.url, follow=True)
         # Initial redirect will be via to https through a 301
-        self.assertRedirects(response, reverse('users:login') + '?next=' + self.url, status_code=301)
+        self.assertRedirects(response, reverse('users_public:login') + '?next=' + self.url, status_code=301)
 
     def test_includes_change_password(self):
         response = self.client.get(self.url, follow=True)
diff --git a/opentech/apply/users/views.py b/opentech/apply/users/views.py
index 8f8e3dab59ca43446f461283062957c5c640f132..7dadd850d5bac0ad6c823836d608641d699e36a5 100644
--- a/opentech/apply/users/views.py
+++ b/opentech/apply/users/views.py
@@ -49,7 +49,7 @@ class AccountView(UpdateView):
         )
 
 
-@login_required(login_url=reverse_lazy('users:login'))
+@login_required()
 def become(request):
     if request.POST:
         id = request.POST['user']
@@ -57,7 +57,7 @@ def become(request):
     return redirect('users:account')
 
 
-@login_required(login_url=reverse_lazy('users:login'))
+@login_required()
 @require_oauth_whitelist
 def oauth(request):
     """Generic, empty view for the OAuth associations."""
diff --git a/opentech/apply/utils/testing/tests.py b/opentech/apply/utils/testing/tests.py
index 624a0e774709a6132effa56141744a85f062d82c..c0b0edd1cfd75239c459eedb1d0ae8c0911950d6 100644
--- a/opentech/apply/utils/testing/tests.py
+++ b/opentech/apply/utils/testing/tests.py
@@ -1,6 +1,6 @@
 from django.contrib.messages.storage.fallback import FallbackStorage
 from django.contrib.auth.models import AnonymousUser
-from django.test import TestCase, RequestFactory
+from django.test import override_settings, TestCase, RequestFactory
 from django.urls import reverse
 
 
@@ -17,6 +17,7 @@ def make_request(user=AnonymousUser(), data={}, method='get', site=None):
     return request
 
 
+@override_settings(ROOT_URLCONF='opentech.apply.urls')
 class BaseViewTestCase(TestCase):
     url_name = ''  # resolvable url, you should use "path:to:view:{}" and {} with be replaced with base_view_name
     base_view_name = ''
diff --git a/opentech/settings/base.py b/opentech/settings/base.py
index 96dbe0fa65ac84e3afcefe49d24d58ae369f59ae..ee5936c07b073ef82777fcf99cf1cdeaa6f0cc33 100644
--- a/opentech/settings/base.py
+++ b/opentech/settings/base.py
@@ -320,7 +320,7 @@ SOCIAL_AUTH_GOOGLE_OAUTH2_WHITELISTED_DOMAINS = STAFF_EMAIL_DOMAINS
 SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = ''
 SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = ''
 
-SOCIAL_AUTH_LOGIN_ERROR_URL = 'users:login'
+SOCIAL_AUTH_LOGIN_ERROR_URL = 'users_public:login'
 SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = 'users:account'
 
 # For pipelines, see http://python-social-auth.readthedocs.io/en/latest/pipeline.html?highlight=pipelines#authentication-pipeline