diff --git a/tests/regressiontests/i18n/test_warnings.py b/tests/regressiontests/i18n/test_warnings.py
index 72255e2..d6f2174 100644
--- a/tests/regressiontests/i18n/test_warnings.py
+++ b/tests/regressiontests/i18n/test_warnings.py
@@ -3,7 +3,7 @@ import warnings
 
 import django
 from django.conf import settings
-from django.test.utils import get_warnings_state, restore_warnings_state
+from django.test.utils import get_warnings_state, restore_warnings_state, alter_django_settings, restore_django_settings
 from django.utils.translation import _trans
 from django.utils.unittest import TestCase
 
@@ -12,14 +12,11 @@ class DeprecationWarningTests(TestCase):
 
     def setUp(self):
         self.warning_state = get_warnings_state()
-        self.old_settings_module = settings.SETTINGS_MODULE
-        settings.SETTINGS_MODULE = 'regressiontests'
-        self.old_locale_paths = settings.LOCALE_PATHS
+        self.settings_state = alter_django_settings(SETTINGS_MODULE='regressiontests', LOCALE_PATHS=settings.LOCALE_PATHS)
 
     def tearDown(self):
         restore_warnings_state(self.warning_state)
-        settings.SETTINGS_MODULE = self.old_settings_module
-        settings.LOCALE_PATHS = self.old_locale_paths
+        restore_django_settings(self.settings_state)
 
     def test_warn_if_project_has_locale_subdir(self):
         """Test that PendingDeprecationWarning is generated when a deprecated project level locale/ subdir is present."""
diff --git a/tests/regressiontests/i18n/tests.py b/tests/regressiontests/i18n/tests.py
index 88c1c13..7ba861c 100644
--- a/tests/regressiontests/i18n/tests.py
+++ b/tests/regressiontests/i18n/tests.py
@@ -8,6 +8,8 @@ from threading import local
 
 from django.conf import settings
 from django.template import Template, Context
+from django.test.decorators import with_django_settings
+from django.test.utils import alter_django_settings, restore_django_settings
 from django.utils.formats import (get_format, date_format, time_format,
     localize, localize_input, iter_format_modules, get_format_modules)
 from django.utils.importlib import import_module
@@ -59,10 +61,9 @@ class TranslationTests(TestCase):
         s2 = pickle.loads(pickle.dumps(s1))
         self.assertEqual(unicode(s2), "test")
 
+    @with_django_settings(LOCALE_PATHS=settings.LOCALE_PATHS + (os.path.join(os.path.dirname(os.path.abspath(__file__)), 'other', 'locale'),))
     def test_pgettext(self):
         # Reset translation catalog to include other/locale/de
-        self.old_locale_paths = settings.LOCALE_PATHS
-        settings.LOCALE_PATHS += (os.path.join(os.path.dirname(os.path.abspath(__file__)), 'other', 'locale'),)
         from django.utils.translation import trans_real
         trans_real._active = local()
         trans_real._translations = {}
@@ -73,8 +74,6 @@ class TranslationTests(TestCase):
         self.assertEqual(pgettext("verb", "May"), u"Kann")
         self.assertEqual(npgettext("search", "%d result", "%d results", 4) % 4, u"4 Resultate")
 
-        settings.LOCALE_PATHS = self.old_locale_paths
-
     def test_string_concat(self):
         """
         unicode(string_concat(...)) should not raise a TypeError - #4796
@@ -135,11 +134,6 @@ class TranslationTests(TestCase):
 class FormattingTests(TestCase):
 
     def setUp(self):
-        self.use_i18n = settings.USE_I18N
-        self.use_l10n = settings.USE_L10N
-        self.use_thousand_separator = settings.USE_THOUSAND_SEPARATOR
-        self.thousand_separator = settings.THOUSAND_SEPARATOR
-        self.number_grouping = settings.NUMBER_GROUPING
         self.n = decimal.Decimal('66666.666')
         self.f = 99999.999
         self.d = datetime.date(2009, 12, 31)
@@ -155,19 +149,11 @@ class FormattingTests(TestCase):
             'l': self.l,
         })
 
-    def tearDown(self):
-        # Restore defaults
-        settings.USE_I18N = self.use_i18n
-        settings.USE_L10N = self.use_l10n
-        settings.USE_THOUSAND_SEPARATOR = self.use_thousand_separator
-        settings.THOUSAND_SEPARATOR = self.thousand_separator
-        settings.NUMBER_GROUPING = self.number_grouping
-
+    @with_django_settings(USE_L10N=True, USE_THOUSAND_SEPARATOR=settings.USE_THOUSAND_SEPARATOR)
     def test_locale_independent(self):
         """
         Localization of numbers
         """
-        settings.USE_L10N = True
         settings.USE_THOUSAND_SEPARATOR = False
         self.assertEqual(u'66666.66', nformat(self.n, decimal_sep='.', decimal_pos=2, grouping=3, thousand_sep=','))
         self.assertEqual(u'66666A6', nformat(self.n, decimal_sep='A', decimal_pos=1, grouping=1, thousand_sep='B'))
@@ -183,12 +169,12 @@ class FormattingTests(TestCase):
         self.assertEqual(u'31.12.2009 в 20:50', Template('{{ dt|date:"d.m.Y в H:i" }}').render(self.ctxt))
         self.assertEqual(u'⌚ 10:15', Template('{{ t|time:"⌚ H:i" }}').render(self.ctxt))
 
+    @with_django_settings(USE_L10N=False)
     def test_l10n_disabled(self):
         """
         Catalan locale with format i18n disabled translations will be used,
         but not formats
         """
-        settings.USE_L10N = False
         activate('ca')
         try:
             self.assertEqual(u'N j, Y', get_format('DATE_FORMAT'))
@@ -253,8 +239,8 @@ class FormattingTests(TestCase):
         finally:
             deactivate()
 
+    @with_django_settings(USE_L10N=True, USE_THOUSAND_SEPARATOR=settings.USE_THOUSAND_SEPARATOR)
     def test_l10n_enabled(self):
-        settings.USE_L10N = True
         # Catalan locale
         activate('ca')
         try:
@@ -420,13 +406,12 @@ class FormattingTests(TestCase):
         finally:
             deactivate()
 
+    @with_django_settings(USE_L10N=True, USE_THOUSAND_SEPARATOR=True)
     def test_sub_locales(self):
         """
         Check if sublocales fall back to the main locale
         """
-        settings.USE_L10N = True
         activate('de-at')
-        settings.USE_THOUSAND_SEPARATOR = True
         try:
             self.assertEqual(u'66.666,666', Template('{{ n }}').render(self.ctxt))
         finally:
@@ -438,11 +423,11 @@ class FormattingTests(TestCase):
         finally:
             deactivate()
 
+    @with_django_settings(USE_L10N=True, USE_THOUSAND_SEPARATOR=settings.USE_THOUSAND_SEPARATOR)
     def test_localized_input(self):
         """
         Tests if form input is correctly localized
         """
-        settings.USE_L10N = True
         activate('de-at')
         try:
             form6 = CompanyForm({
@@ -464,44 +449,39 @@ class FormattingTests(TestCase):
         finally:
             deactivate()
 
+    @with_django_settings(USE_L10N=True, FORMAT_MODULE_PATH=settings.FORMAT_MODULE_PATH)
     def test_iter_format_modules(self):
         """
         Tests the iter_format_modules function.
         """
         activate('de-at')
-        old_format_module_path = settings.FORMAT_MODULE_PATH
         try:
-            settings.USE_L10N = True
             de_format_mod = import_module('django.conf.locale.de.formats')
             self.assertEqual(list(iter_format_modules('de')), [de_format_mod])
             settings.FORMAT_MODULE_PATH = 'regressiontests.i18n.other.locale'
             test_de_format_mod = import_module('regressiontests.i18n.other.locale.de.formats')
             self.assertEqual(list(iter_format_modules('de')), [test_de_format_mod, de_format_mod])
         finally:
-            settings.FORMAT_MODULE_PATH = old_format_module_path
             deactivate()
 
+    @with_django_settings(USE_L10N=True)
     def test_iter_format_modules_stability(self):
         """
         Tests the iter_format_modules function always yields format modules in
         a stable and correct order in presence of both base ll and ll_CC formats.
         """
-        settings.USE_L10N = True
         en_format_mod = import_module('django.conf.locale.en.formats')
         en_gb_format_mod = import_module('django.conf.locale.en_GB.formats')
         self.assertEqual(list(iter_format_modules('en-gb')), [en_gb_format_mod, en_format_mod])
 
+    @with_django_settings(USE_L10N=True, FORMAT_MODULE_PATH='regressiontests.i18n.other.locale')
     def test_get_format_modules_stability(self):
         activate('de')
-        old_format_module_path = settings.FORMAT_MODULE_PATH
-        settings.FORMAT_MODULE_PATH = 'regressiontests.i18n.other.locale'
         try:
-            settings.USE_L10N = True
             old = "%r" % get_format_modules(reverse=True)
             new = "%r" % get_format_modules(reverse=True) # second try
             self.assertEqual(new, old, 'Value returned by get_formats_modules() must be preserved between calls.')
         finally:
-            settings.FORMAT_MODULE_PATH = old_format_module_path
             deactivate()
 
     def test_localize_templatetag_and_filter(self):
@@ -675,12 +655,12 @@ class ResolutionOrderI18NTests(TestCase):
 class AppResolutionOrderI18NTests(ResolutionOrderI18NTests):
 
     def setUp(self):
-        self.old_installed_apps = settings.INSTALLED_APPS
-        settings.INSTALLED_APPS = ['regressiontests.i18n.resolution'] + list(settings.INSTALLED_APPS)
+        self.settings_state = alter_django_settings(
+            INSTALLED_APPS=['regressiontests.i18n.resolution'] + list(settings.INSTALLED_APPS))
         super(AppResolutionOrderI18NTests, self).setUp()
 
     def tearDown(self):
-        settings.INSTALLED_APPS = self.old_installed_apps
+        restore_django_settings(self.settings_state)
         super(AppResolutionOrderI18NTests, self).tearDown()
 
     def test_app_translation(self):
@@ -689,32 +669,24 @@ class AppResolutionOrderI18NTests(ResolutionOrderI18NTests):
 class LocalePathsResolutionOrderI18NTests(ResolutionOrderI18NTests):
 
     def setUp(self):
-        self.old_locale_paths = settings.LOCALE_PATHS
-        settings.LOCALE_PATHS += (os.path.join(os.path.dirname(os.path.abspath(__file__)), 'other', 'locale'),)
+        self.settings_state = alter_django_settings(
+            LOCALE_PATHS=settings.LOCALE_PATHS + (os.path.join(os.path.dirname(os.path.abspath(__file__)), 'other', 'locale'),),
+            INSTALLED_APPS=list(settings.INSTALLED_APPS) + ['regressiontests.i18n.resolution'])
         super(LocalePathsResolutionOrderI18NTests, self).setUp()
 
     def tearDown(self):
-        settings.LOCALE_PATHS = self.old_locale_paths
+        restore_django_settings(self.settings_state)
         super(LocalePathsResolutionOrderI18NTests, self).tearDown()
 
     def test_locale_paths_translation(self):
         self.assertUgettext('Time', 'LOCALE_PATHS')
 
     def test_locale_paths_override_app_translation(self):
-        old_installed_apps = settings.INSTALLED_APPS
-        settings.INSTALLED_APPS = list(settings.INSTALLED_APPS) + ['regressiontests.i18n.resolution']
-        try:
-            self.assertUgettext('Time', 'LOCALE_PATHS')
-        finally:
-            settings.INSTALLED_APPS = old_installed_apps
+        self.assertUgettext('Time', 'LOCALE_PATHS')
 
+    @with_django_settings(SETTINGS_MODULE='regressiontests')
     def test_locale_paths_override_project_translation(self):
-        old_settings_module = settings.SETTINGS_MODULE
-        settings.SETTINGS_MODULE = 'regressiontests'
-        try:
-            self.assertUgettext('Date/time', 'LOCALE_PATHS')
-        finally:
-            settings.SETTINGS_MODULE = old_settings_module
+        self.assertUgettext('Date/time', 'LOCALE_PATHS')
 
 class ProjectResolutionOrderI18NTests(ResolutionOrderI18NTests):
 
