diff --git a/django/website/hid/forms.py b/django/website/hid/forms.py
index 53e616220fe1ebb2a3a7b73869a631e99079094b..a78f684fa4dc729c9f75a6fbc06f627d2920f96d 100644
--- a/django/website/hid/forms.py
+++ b/django/website/hid/forms.py
@@ -6,4 +6,6 @@ class UploadForm(forms.Form):
     source = forms.ChoiceField(choices=get_spreadsheet_choices,
                                widget=forms.HiddenInput,
                                required=True)
+    next = forms.CharField(widget=forms.HiddenInput,
+                           required=True)
     file = forms.FileField()
diff --git a/django/website/hid/tabs/view_and_edit_table.py b/django/website/hid/tabs/view_and_edit_table.py
index bd807944101070619fad781cd1d5bba530eab7d5..37ec8d69e4d2c1c7440b47e3b74f4fd08b1d9a7f 100644
--- a/django/website/hid/tabs/view_and_edit_table.py
+++ b/django/website/hid/tabs/view_and_edit_table.py
@@ -138,7 +138,18 @@ class ViewAndEditTableTab(object):
         )
 
         # Build the upload form
-        upload_form = UploadForm(initial={'source': 'geopoll'})
+        source = kwargs.get('source')
+        next_url = reverse(
+            'tabbed-page',
+            kwargs={
+                'name': tab_instance.page.name,
+                'tab_name': tab_instance.name,
+            })
+
+        upload_form = UploadForm(initial={
+            'source': source,
+            'next': next_url,
+        })
 
         # Build the actions drop down
         actions = [
diff --git a/django/website/hid/tests/upload_view_tests.py b/django/website/hid/tests/upload_view_tests.py
new file mode 100644
index 0000000000000000000000000000000000000000..5075afda1a9de8cc24e0daa1a54069d381172510
--- /dev/null
+++ b/django/website/hid/tests/upload_view_tests.py
@@ -0,0 +1,17 @@
+from mock import Mock
+
+from django.core.urlresolvers import reverse
+
+from ..views import UploadSpreadsheetView
+
+
+def test_redirects_to_next_url_after_upload():
+    next_url = reverse('tabbed-page',
+                       kwargs={'name': 'main', 'tab_name': 'rumors'})
+
+    view = UploadSpreadsheetView()
+    view.request = Mock(POST={'next': next_url})
+
+    url = view.get_success_url()
+
+    assert url == next_url
diff --git a/django/website/hid/tests/views_tests.py b/django/website/hid/tests/views_tests.py
index 0252bd8bca7788ee6fdd3767c653c5dffbdcd3f0..981526ff0e2353d3110ec5a4cb366e3fd4ed8b34 100644
--- a/django/website/hid/tests/views_tests.py
+++ b/django/website/hid/tests/views_tests.py
@@ -1,3 +1,4 @@
+from mock import Mock
 import pytest
 
 from django.contrib.messages.storage.fallback import FallbackStorage
@@ -13,6 +14,11 @@ from hid.tabs.view_and_edit_table import (
     DELETE_COMMAND
 )
 
+from tabbed_page.tests.factories import (
+    TabbedPageFactory,
+    TabInstanceFactory
+)
+
 from taxonomies.tests.factories import (
     TaxonomyFactory,
     TermFactory,
@@ -167,6 +173,40 @@ def test_get_category_options_orders_by_lowercase_name():
     assert options == expected
 
 
+@pytest.mark.django_db
+def test_upload_form_source_read_from_settings():
+    page = TabbedPageFactory()
+    tab_instance = TabInstanceFactory(page=page)
+    request = Mock(GET={})
+    tab = ViewAndEditTableTab()
+
+    context_data = tab.get_context_data(tab_instance,
+                                        request,
+                                        source='rapidpro')
+
+    form = context_data['upload_form']
+    assert form.initial.get('source') == 'rapidpro'
+
+
+@pytest.mark.django_db
+def test_upload_form_next_url_read_from_tab_instance():
+    page = TabbedPageFactory(name='main')
+    tab_instance = TabInstanceFactory(page=page, name='rumors')
+    request = Mock(GET={})
+    tab = ViewAndEditTableTab()
+
+    context_data = tab.get_context_data(tab_instance,
+                                        request,
+                                        source='rapidpro')
+
+    form = context_data['upload_form']
+
+    expected_url = reverse('tabbed-page',
+                           kwargs={'name': 'main', 'tab_name': 'rumors'})
+
+    assert form.initial.get('next') == expected_url
+
+
 def test_views_item_get_request_parameters_renames_items_of_active_location():
     query = QueryDict(
         'action=something-bottom&item-top=top-value&item-bottom=bottom-value'
diff --git a/django/website/hid/views.py b/django/website/hid/views.py
index e3135377d67dfbf88814881cc5a80566a8cf1d0a..965dad7f5dbc8f6258bce0eb99799cf6b1487358 100644
--- a/django/website/hid/views.py
+++ b/django/website/hid/views.py
@@ -33,7 +33,7 @@ class UploadSpreadsheetView(FormView):
     template_name = "hid/upload.html"
 
     def get_success_url(self):
-        return reverse("tabbed-page", name="main", tab_name="all")
+        return self.request.POST.get('next')
 
     def form_valid(self, form):
         data = form.cleaned_data
diff --git a/django/website/tabbed_page/templatetags/render_tab.py b/django/website/tabbed_page/templatetags/render_tab.py
index 7cdfe45506cebe26a7488c7408d461b8a36b12c6..c0fc3026d6c8ebd0ddf5bf71b558ab0eee55fa48 100644
--- a/django/website/tabbed_page/templatetags/render_tab.py
+++ b/django/website/tabbed_page/templatetags/render_tab.py
@@ -36,7 +36,7 @@ def _get_rendering_details(context, tab_instance):
     if tab_instance.settings:
         settings = tab_instance.settings
     else:
-        settings = {}  # TODO: json field doesn't default to this?
+        settings = {}
 
     request = context.get('request')
 
diff --git a/django/website/tabbed_page/tests/factories.py b/django/website/tabbed_page/tests/factories.py
index 3e5f1d94dbf8b99e316b53f5e445cc9d82158a3c..ed0a3ab6910100e77ba90bb3513c234ed9017894 100644
--- a/django/website/tabbed_page/tests/factories.py
+++ b/django/website/tabbed_page/tests/factories.py
@@ -15,6 +15,7 @@ class TabbedPageFactory(DjangoModelFactory):
 class TabInstanceFactory(DjangoModelFactory):
     class Meta:
         model = TabInstance
+        django_get_or_create = ('name',)
 
     name = fuzzy.FuzzyText()
     label = fuzzy.FuzzyText()
diff --git a/django/website/tabbed_page/tests/render_tests.py b/django/website/tabbed_page/tests/render_tests.py
index 24614e4df1a11ce2496e14655d1b0496fdc5c913..5c7219a827f7fb22c14b038a900eb9a587c5390a 100644
--- a/django/website/tabbed_page/tests/render_tests.py
+++ b/django/website/tabbed_page/tests/render_tests.py
@@ -26,7 +26,6 @@ def setup_function(function):
     clear_tabs()
 
 
-
 @pytest.mark.django_db
 @patch(render_to_string_method)
 def test_uses_template_name(mock_render):
diff --git a/django/website/tabbed_page/views.py b/django/website/tabbed_page/views.py
index b6ba7901d929042f9b57dcf9763e9f8334463c40..eebbd535a7d2dc531263b3d987a5705a3a0aca66 100644
--- a/django/website/tabbed_page/views.py
+++ b/django/website/tabbed_page/views.py
@@ -32,9 +32,9 @@ class TabbedPageView(TemplateView):
             candidates = []
             tab_name = self.kwargs.get('tab_name')
             if tab_name:
-                candidates = self.page.tabs.all().filter(name=tab_name)
+                candidates = self.page.tabs.filter(name=tab_name)
             if len(candidates) == 0:
-                candidates = self.page.tabs.all().filter(default=True)
+                candidates = self.page.tabs.filter(default=True)
             if len(candidates) == 0:
                 candidates = self.page.tabs.all()
             if len(candidates) > 0: