diff --git a/django/contrib/formtools/tests/wizard/__init__.py b/django/contrib/formtools/tests/wizard/__init__.py
index a2a9692..c025a08 100644
--- a/django/contrib/formtools/tests/wizard/__init__.py
+++ b/django/contrib/formtools/tests/wizard/__init__.py
@@ -16,4 +16,5 @@ from django.contrib.formtools.tests.wizard.wizardtests.tests import (
     WizardTestKwargs,
     WizardTestGenericViewInterface,
     WizardFormKwargsOverrideTests,
+    WizardRevalidationTests,
 )
diff --git a/django/contrib/formtools/tests/wizard/wizardtests/forms.py b/django/contrib/formtools/tests/wizard/wizardtests/forms.py
index 6a81329..1127b29 100644
--- a/django/contrib/formtools/tests/wizard/wizardtests/forms.py
+++ b/django/contrib/formtools/tests/wizard/wizardtests/forms.py
@@ -65,3 +65,18 @@ class SessionContactWizard(ContactWizard):
 class CookieContactWizard(ContactWizard):
     storage_name = 'django.contrib.formtools.wizard.storage.cookie.CookieStorage'
 
+class EmptyPage1(forms.Form):
+    on_page1 = forms.NullBooleanField()
+
+class EmptyPage2(forms.Form):
+    on_page2 = forms.NullBooleanField()
+
+class EmptyPage3(forms.Form):
+    on_page3 = forms.NullBooleanField()
+
+class RevalidationWizard(SessionContactWizard):
+    def done(self, form_list, **kwargs):
+        step = self.form_list.keys()[1]
+        form = form_list[1]
+        raise self.RevalidationError(step, form, **kwargs)
+
diff --git a/django/contrib/formtools/tests/wizard/wizardtests/tests.py b/django/contrib/formtools/tests/wizard/wizardtests/tests.py
index 586bd59..761d1fd 100644
--- a/django/contrib/formtools/tests/wizard/wizardtests/tests.py
+++ b/django/contrib/formtools/tests/wizard/wizardtests/tests.py
@@ -385,3 +385,41 @@ class WizardFormKwargsOverrideTests(TestCase):
         self.assertEqual(formset.initial_form_count(), 1)
         self.assertEqual(['staff@example.com'],
             list(formset.queryset.values_list('email', flat=True)))
+
+class WizardRevalidationTests(TestCase):
+    urls = 'django.contrib.formtools.tests.wizard.wizardtests.urls'
+
+    wizard_url = '/wiz_revalidation/'
+    wizard_step_1_data = {
+        'revalidation_wizard-current_step': 'form1',
+    }
+    wizard_step_data = (
+        {
+            'revalidation_wizard-current_step': 'form1',
+        },
+        {
+            'revalidation_wizard-current_step': 'form2',
+        },
+        {
+            'revalidation_wizard-current_step': 'form3',
+        },
+    )
+
+    def test_form_revalidate(self):
+        response = self.client.get(self.wizard_url)
+        self.assertEqual(response.status_code, 200)
+        self.assertEqual(response.context['wizard']['steps'].current, 'form1')
+
+        response = self.client.post(self.wizard_url, self.wizard_step_data[0])
+        self.assertEqual(response.status_code, 200)
+        self.assertEqual(response.context['wizard']['steps'].current, 'form2')
+
+        post_data = self.wizard_step_data[1]
+        response = self.client.post(self.wizard_url, post_data)
+        self.assertEqual(response.status_code, 200)
+        self.assertEqual(response.context['wizard']['steps'].current, 'form3')
+
+        response = self.client.post(self.wizard_url, self.wizard_step_data[2])
+        self.assertEqual(response.status_code, 200)
+        self.assertEqual(response.context['wizard']['steps'].current, 'form2')
+
diff --git a/django/contrib/formtools/tests/wizard/wizardtests/urls.py b/django/contrib/formtools/tests/wizard/wizardtests/urls.py
index dabce53..f15e2dd 100644
--- a/django/contrib/formtools/tests/wizard/wizardtests/urls.py
+++ b/django/contrib/formtools/tests/wizard/wizardtests/urls.py
@@ -2,6 +2,9 @@ from django.conf.urls import patterns, url
 from django.contrib.formtools.tests.wizard.wizardtests.forms import (
     SessionContactWizard, CookieContactWizard, Page1, Page2, Page3, Page4)
 
+from django.contrib.formtools.tests.wizard.wizardtests.forms import (
+    RevalidationWizard, EmptyPage1, EmptyPage2, EmptyPage3)
+
 urlpatterns = patterns('',
     url(r'^wiz_session/$', SessionContactWizard.as_view(
         [('form1', Page1),
@@ -19,4 +22,8 @@ urlpatterns = patterns('',
           ('form3', Page3),
           ('form4', Page4)],
           template_name='other_wizard_form.html')),
+    url(r'^wiz_revalidation/$', RevalidationWizard.as_view(
+        [('form1', EmptyPage1),
+         ('form2', EmptyPage2),
+         ('form3', EmptyPage3)])),
 )
diff --git a/django/contrib/formtools/wizard/views.py b/django/contrib/formtools/wizard/views.py
index ea41e86..2119301 100644
--- a/django/contrib/formtools/wizard/views.py
+++ b/django/contrib/formtools/wizard/views.py
@@ -307,6 +307,16 @@ class WizardView(TemplateView):
         self.storage.current_step = next_step
         return self.render(new_form, **kwargs)
 
+    class RevalidationError(Exception):
+        def __init__(self, step, form, **kwargs):
+            self.step = step
+            self.form = form
+            self.kwargs = kwargs
+
+        def __repr__(self):
+            return '%s(%s)' % (self.__class__, self.step)
+        __str__ = __repr__
+
     def render_done(self, form, **kwargs):
         """
         This method gets called when all forms passed. The method should also
@@ -327,7 +337,11 @@ class WizardView(TemplateView):
         # render the done view and reset the wizard before returning the
         # response. This is needed to prevent from rendering done with the
         # same data twice.
-        done_response = self.done(final_form_list, **kwargs)
+        try:
+            done_response = self.done(final_form_list, **kwargs)
+        except self.RevalidationError as e:
+            return self.render_revalidation_failure(e.step, e.form, **e.kwargs)
+
         self.storage.reset()
         return done_response
 
