diff --git a/django/contrib/localflavor/ar/forms.py b/django/contrib/localflavor/ar/forms.py
index 6374a48..a348a35 100644
--- a/django/contrib/localflavor/ar/forms.py
+++ b/django/contrib/localflavor/ar/forms.py
@@ -32,8 +32,8 @@ class ARPostalCodeField(RegexField):
         super(ARPostalCodeField, self).__init__(r'^\d{4}$|^[A-HJ-NP-Za-hj-np-z]\d{4}\D{3}$',
             min_length=4, max_length=8, *args, **kwargs)
 
-    def clean(self, value):
-        value = super(ARPostalCodeField, self).clean(value)
+    def clean(self, value, initial=None):
+        value = super(ARPostalCodeField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
         if len(value) not in (4, 8):
@@ -55,11 +55,11 @@ class ARDNIField(CharField):
         super(ARDNIField, self).__init__(max_length=10, min_length=7, *args,
                 **kwargs)
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """
         Value can be a string either in the [X]X.XXX.XXX or [X]XXXXXXX formats.
         """
-        value = super(ARDNIField, self).clean(value)
+        value = super(ARDNIField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
         if not value.isdigit():
@@ -85,12 +85,12 @@ class ARCUITField(RegexField):
         super(ARCUITField, self).__init__(r'^\d{2}-?\d{8}-?\d$',
             *args, **kwargs)
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """
         Value can be either a string in the format XX-XXXXXXXX-X or an
         11-digit number.
         """
-        value = super(ARCUITField, self).clean(value)
+        value = super(ARCUITField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
         value, cd = self._canon(value)
diff --git a/django/contrib/localflavor/au/forms.py b/django/contrib/localflavor/au/forms.py
index ada27b6..ed3665c 100644
--- a/django/contrib/localflavor/au/forms.py
+++ b/django/contrib/localflavor/au/forms.py
@@ -26,11 +26,11 @@ class AUPhoneNumberField(Field):
         'invalid': u'Phone numbers must contain 10 digits.',
     }
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """
         Validate a phone number. Strips parentheses, whitespace and hyphens.
         """
-        super(AUPhoneNumberField, self).clean(value)
+        super(AUPhoneNumberField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
         value = re.sub('(\(|\)|\s+|-)', '', smart_unicode(value))
diff --git a/django/contrib/localflavor/br/forms.py b/django/contrib/localflavor/br/forms.py
index aa7e3b2..32a6dd2 100644
--- a/django/contrib/localflavor/br/forms.py
+++ b/django/contrib/localflavor/br/forms.py
@@ -30,8 +30,8 @@ class BRPhoneNumberField(Field):
         'invalid': _('Phone numbers must be in XX-XXXX-XXXX format.'),
     }
 
-    def clean(self, value):
-        super(BRPhoneNumberField, self).clean(value)
+    def clean(self, value, initial=None):
+        super(BRPhoneNumberField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
         value = re.sub('(\(|\)|\s+)', '', smart_unicode(value))
@@ -65,8 +65,8 @@ class BRStateChoiceField(Field):
         from br_states import STATE_CHOICES
         self.widget.choices = STATE_CHOICES
 
-    def clean(self, value):
-        value = super(BRStateChoiceField, self).clean(value)
+    def clean(self, value, initial=None):
+        value = super(BRStateChoiceField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             value = u''
         value = smart_unicode(value)
@@ -99,12 +99,12 @@ class BRCPFField(CharField):
     def __init__(self, *args, **kwargs):
         super(BRCPFField, self).__init__(max_length=14, min_length=11, *args, **kwargs)
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """
         Value can be either a string in the format XXX.XXX.XXX-XX or an
         11-digit number.
         """
-        value = super(BRCPFField, self).clean(value)
+        value = super(BRCPFField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
         orig_value = value[:]
@@ -136,12 +136,12 @@ class BRCNPJField(Field):
         'max_digits': _("This field requires at least 14 digits"),
     }
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """
         Value can be either a string in the format XX.XXX.XXX/XXXX-XX or a
         group of 14 characters.
         """
-        value = super(BRCNPJField, self).clean(value)
+        value = super(BRCNPJField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
         orig_value = value[:]
diff --git a/django/contrib/localflavor/ca/forms.py b/django/contrib/localflavor/ca/forms.py
index b40dba8..fb9e986 100644
--- a/django/contrib/localflavor/ca/forms.py
+++ b/django/contrib/localflavor/ca/forms.py
@@ -27,10 +27,10 @@ class CAPhoneNumberField(Field):
         'invalid': u'Phone numbers must be in XXX-XXX-XXXX format.',
     }
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """Validate a phone number.
         """
-        super(CAPhoneNumberField, self).clean(value)
+        super(CAPhoneNumberField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
         value = re.sub('(\(|\)|\s+)', '', smart_unicode(value))
@@ -49,9 +49,9 @@ class CAProvinceField(Field):
         'invalid': u'Enter a Canadian province or territory.',
     }
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         from ca_provinces import PROVINCES_NORMALIZED
-        super(CAProvinceField, self).clean(value)
+        super(CAProvinceField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
         try:
@@ -88,8 +88,8 @@ class CASocialInsuranceNumberField(Field):
         'invalid': ugettext('Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format.'),
     }
 
-    def clean(self, value):
-        super(CASocialInsuranceNumberField, self).clean(value)
+    def clean(self, value, initial=None):
+        super(CASocialInsuranceNumberField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
 
diff --git a/django/contrib/localflavor/ch/forms.py b/django/contrib/localflavor/ch/forms.py
index 2158fba..884392b 100644
--- a/django/contrib/localflavor/ch/forms.py
+++ b/django/contrib/localflavor/ch/forms.py
@@ -31,8 +31,8 @@ class CHPhoneNumberField(Field):
         'invalid': 'Phone numbers must be in 0XX XXX XX XX format.',
     }
 
-    def clean(self, value):
-        super(CHPhoneNumberField, self).clean(value)
+    def clean(self, value, initial=None):
+        super(CHPhoneNumberField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
         value = re.sub('(\.|\s|/|-)', '', smart_unicode(value))
@@ -95,8 +95,8 @@ class CHIdentityCardNumberField(Field):
 
         return str(calculated_checksum)[-1] == given_checksum
 
-    def clean(self, value):
-        super(CHIdentityCardNumberField, self).clean(value)
+    def clean(self, value, initial=None):
+        super(CHIdentityCardNumberField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
 
diff --git a/django/contrib/localflavor/cl/forms.py b/django/contrib/localflavor/cl/forms.py
index 2f5ac29..89f4daa 100644
--- a/django/contrib/localflavor/cl/forms.py
+++ b/django/contrib/localflavor/cl/forms.py
@@ -41,11 +41,11 @@ class CLRutField(RegexField):
             # the real world.
             super(CLRutField, self).__init__(r'^[\d\.]{1,11}-?[\dkK]$', *args, **kwargs)
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """
         Check and clean the Chilean RUT.
         """
-        super(CLRutField, self).clean(value)
+        super(CLRutField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
         rut, verificador = self._canonify(value)
diff --git a/django/contrib/localflavor/de/forms.py b/django/contrib/localflavor/de/forms.py
index 76ce215..0658d25 100644
--- a/django/contrib/localflavor/de/forms.py
+++ b/django/contrib/localflavor/de/forms.py
@@ -60,8 +60,8 @@ class DEIdentityCardNumberField(Field):
 
         return str(calculated_checksum)[-1] == given_checksum
 
-    def clean(self, value):
-        super(DEIdentityCardNumberField, self).clean(value)
+    def clean(self, value, initial=None):
+        super(DEIdentityCardNumberField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
         match = re.match(id_re, value)
diff --git a/django/contrib/localflavor/es/forms.py b/django/contrib/localflavor/es/forms.py
index 81186f8..aeb96de 100644
--- a/django/contrib/localflavor/es/forms.py
+++ b/django/contrib/localflavor/es/forms.py
@@ -81,8 +81,8 @@ class ESIdentityCardNumberField(RegexField):
                 error_message=self.default_error_messages['invalid%s' % (self.only_nif and '_only_nif' or '')],
                 *args, **kwargs)
 
-    def clean(self, value):
-        super(ESIdentityCardNumberField, self).clean(value)
+    def clean(self, value, initial=None):
+        super(ESIdentityCardNumberField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
         nif_get_checksum = lambda d: self.nif_control[int(d)%23]
@@ -147,8 +147,8 @@ class ESCCCField(RegexField):
         super(ESCCCField, self).__init__(r'^\d{4}[ -]?\d{4}[ -]?\d{2}[ -]?\d{10}$',
             max_length=None, min_length=None, *args, **kwargs)
 
-    def clean(self, value):
-        super(ESCCCField, self).clean(value)
+    def clean(self, value, initial=None):
+        super(ESCCCField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
         control_str = [1, 2, 4, 8, 5, 10, 9, 7, 3, 6]
diff --git a/django/contrib/localflavor/fi/forms.py b/django/contrib/localflavor/fi/forms.py
index a0274da..4c0c57a 100644
--- a/django/contrib/localflavor/fi/forms.py
+++ b/django/contrib/localflavor/fi/forms.py
@@ -28,8 +28,8 @@ class FISocialSecurityNumber(Field):
         'invalid': ugettext('Enter a valid Finnish social security number.'),
     }
 
-    def clean(self, value):
-        super(FISocialSecurityNumber, self).clean(value)
+    def clean(self, value, initial=None):
+        super(FISocialSecurityNumber, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
 
diff --git a/django/contrib/localflavor/fr/forms.py b/django/contrib/localflavor/fr/forms.py
index 635b62e..7408deb 100644
--- a/django/contrib/localflavor/fr/forms.py
+++ b/django/contrib/localflavor/fr/forms.py
@@ -30,8 +30,8 @@ class FRPhoneNumberField(Field):
         'invalid': u'Phone numbers must be in 0X XX XX XX XX format.',
     }
 
-    def clean(self, value):
-        super(FRPhoneNumberField, self).clean(value)
+    def clean(self, value, initial=None):
+        super(FRPhoneNumberField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
         value = re.sub('(\.|\s)', '', smart_unicode(value))
diff --git a/django/contrib/localflavor/in_/forms.py b/django/contrib/localflavor/in_/forms.py
index 1cb303d..c323366 100644
--- a/django/contrib/localflavor/in_/forms.py
+++ b/django/contrib/localflavor/in_/forms.py
@@ -28,9 +28,9 @@ class INStateField(Field):
         'invalid': u'Enter a Indian state or territory.',
     }
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         from in_states import STATES_NORMALIZED
-        super(INStateField, self).clean(value)
+        super(INStateField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
         try:
diff --git a/django/contrib/localflavor/is_/forms.py b/django/contrib/localflavor/is_/forms.py
index ea7a1e0..e7bba15 100644
--- a/django/contrib/localflavor/is_/forms.py
+++ b/django/contrib/localflavor/is_/forms.py
@@ -22,8 +22,8 @@ class ISIdNumberField(RegexField):
         kwargs['min_length'],kwargs['max_length'] = 10,11
         super(ISIdNumberField, self).__init__(r'^\d{6}(-| )?\d{4}$', *args, **kwargs)
 
-    def clean(self, value):
-        value = super(ISIdNumberField, self).clean(value)
+    def clean(self, value, initial=None):
+        value = super(ISIdNumberField, self).clean(value, initial)
 
         if value in EMPTY_VALUES:
             return u''
@@ -64,8 +64,8 @@ class ISPhoneNumberField(RegexField):
         kwargs['min_length'], kwargs['max_length'] = 7,8
         super(ISPhoneNumberField, self).__init__(r'^\d{3}(-| )?\d{4}$', *args, **kwargs)
 
-    def clean(self, value):
-        value = super(ISPhoneNumberField, self).clean(value)
+    def clean(self, value, initial=None):
+        value = super(ISPhoneNumberField, self).clean(value, initial)
 
         if value in EMPTY_VALUES:
             return u''
diff --git a/django/contrib/localflavor/it/forms.py b/django/contrib/localflavor/it/forms.py
index 88e6573..6d53780 100644
--- a/django/contrib/localflavor/it/forms.py
+++ b/django/contrib/localflavor/it/forms.py
@@ -47,8 +47,8 @@ class ITSocialSecurityNumberField(RegexField):
         super(ITSocialSecurityNumberField, self).__init__(r'^\w{3}\s*\w{3}\s*\w{5}\s*\w{5}$',
         max_length=None, min_length=None, *args, **kwargs)
 
-    def clean(self, value):
-        value = super(ITSocialSecurityNumberField, self).clean(value)
+    def clean(self, value, initial=None):
+        value = super(ITSocialSecurityNumberField, self).clean(value, initial)
         if value == u'':
             return value
         value = re.sub('\s', u'', value).upper()
@@ -68,8 +68,8 @@ class ITVatNumberField(Field):
         'invalid': ugettext(u'Enter a valid VAT number.'),
     }
 
-    def clean(self, value):
-        value = super(ITVatNumberField, self).clean(value)
+    def clean(self, value, initial=None):
+        value = super(ITVatNumberField, self).clean(value, initial)
         if value == u'':
             return value
         try:
diff --git a/django/contrib/localflavor/jp/forms.py b/django/contrib/localflavor/jp/forms.py
index 13083aa..e856260 100644
--- a/django/contrib/localflavor/jp/forms.py
+++ b/django/contrib/localflavor/jp/forms.py
@@ -23,12 +23,12 @@ class JPPostalCodeField(RegexField):
         super(JPPostalCodeField, self).__init__(r'^\d{3}-\d{4}$|^\d{7}$',
             max_length=None, min_length=None, *args, **kwargs)
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """
         Validates the input and returns a string that contains only numbers.
         Returns an empty string for empty values.
         """
-        v = super(JPPostalCodeField, self).clean(value)
+        v = super(JPPostalCodeField, self).clean(value, initial)
         return v.replace('-', '')
 
 class JPPrefectureSelect(Select):
diff --git a/django/contrib/localflavor/nl/forms.py b/django/contrib/localflavor/nl/forms.py
index 7484849..7bb1a30 100644
--- a/django/contrib/localflavor/nl/forms.py
+++ b/django/contrib/localflavor/nl/forms.py
@@ -21,8 +21,8 @@ class NLZipCodeField(Field):
         'invalid': _('Enter a valid postal code'),
     }
 
-    def clean(self, value):
-        super(NLZipCodeField, self).clean(value)
+    def clean(self, value, initial=None):
+        super(NLZipCodeField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
 
@@ -52,8 +52,8 @@ class NLPhoneNumberField(Field):
         'invalid': _('Enter a valid phone number'),
     }
 
-    def clean(self, value):
-        super(NLPhoneNumberField, self).clean(value)
+    def clean(self, value, initial=None):
+        super(NLPhoneNumberField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
 
@@ -78,8 +78,8 @@ class NLSoFiNumberField(Field):
         'invalid': _('Enter a valid SoFi number'),
     }
 
-    def clean(self, value):
-        super(NLSoFiNumberField, self).clean(value)
+    def clean(self, value, initial=None):
+        super(NLSoFiNumberField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
 
diff --git a/django/contrib/localflavor/no/forms.py b/django/contrib/localflavor/no/forms.py
index 8dc0019..94e039f 100644
--- a/django/contrib/localflavor/no/forms.py
+++ b/django/contrib/localflavor/no/forms.py
@@ -33,8 +33,8 @@ class NOSocialSecurityNumber(Field):
         'invalid': ugettext(u'Enter a valid Norwegian social security number.'),
     }
 
-    def clean(self, value):
-        super(NOSocialSecurityNumber, self).clean(value)
+    def clean(self, value, initial=None):
+        super(NOSocialSecurityNumber, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
 
diff --git a/django/contrib/localflavor/pe/forms.py b/django/contrib/localflavor/pe/forms.py
index 57c9d44..4b86eee 100644
--- a/django/contrib/localflavor/pe/forms.py
+++ b/django/contrib/localflavor/pe/forms.py
@@ -28,11 +28,11 @@ class PEDNIField(CharField):
         super(PEDNIField, self).__init__(max_length=8, min_length=8, *args,
                 **kwargs)
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """
         Value must be a string in the XXXXXXXX formats.
         """
-        value = super(PEDNIField, self).clean(value)
+        value = super(PEDNIField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
         if not value.isdigit():
@@ -56,11 +56,11 @@ class PERUCField(RegexField):
         super(PERUCField, self).__init__(max_length=11, min_length=11, *args,
             **kwargs)
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """
         Value must be an 11-digit number.
         """
-        value = super(PERUCField, self).clean(value)
+        value = super(PERUCField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
         if not value.isdigit():
diff --git a/django/contrib/localflavor/pl/forms.py b/django/contrib/localflavor/pl/forms.py
index b02dad7..3b0d9c3 100644
--- a/django/contrib/localflavor/pl/forms.py
+++ b/django/contrib/localflavor/pl/forms.py
@@ -44,8 +44,8 @@ class PLNationalIdentificationNumberField(RegexField):
         super(PLNationalIdentificationNumberField, self).__init__(r'^\d{11}$',
             max_length=None, min_length=None, *args, **kwargs)
 
-    def clean(self,value):
-        super(PLNationalIdentificationNumberField, self).clean(value)
+    def clean(self, value, initial=None):
+        super(PLNationalIdentificationNumberField, self).clean(value, initial)
         if not self.has_valid_checksum(value):
             raise ValidationError(self.error_messages['checksum'])
         return u'%s' % value
@@ -77,8 +77,8 @@ class PLTaxNumberField(RegexField):
         super(PLTaxNumberField, self).__init__(r'^\d{3}-\d{3}-\d{2}-\d{2}$|^\d{2}-\d{2}-\d{3}-\d{3}$',
             max_length=None, min_length=None, *args, **kwargs)
 
-    def clean(self,value):
-        super(PLTaxNumberField, self).clean(value)
+    def clean(self, value, initial=None):
+        super(PLTaxNumberField, self).clean(value, initial)
         value = re.sub("[-]", "", value)
         if not self.has_valid_checksum(value):
             raise ValidationError(self.error_messages['checksum'])
@@ -117,8 +117,8 @@ class PLNationalBusinessRegisterField(RegexField):
         super(PLNationalBusinessRegisterField, self).__init__(r'^\d{7,9}$',
             max_length=None, min_length=None, *args, **kwargs)
 
-    def clean(self,value):
-        super(PLNationalBusinessRegisterField, self).clean(value)
+    def clean(self, value, initial=None):
+        super(PLNationalBusinessRegisterField, self).clean(value, initial)
         if not self.has_valid_checksum(value):
             raise ValidationError(self.error_messages['checksum'])
         return u'%s' % value
diff --git a/django/contrib/localflavor/sk/forms.py b/django/contrib/localflavor/sk/forms.py
index 711d70f..127238d 100644
--- a/django/contrib/localflavor/sk/forms.py
+++ b/django/contrib/localflavor/sk/forms.py
@@ -34,10 +34,10 @@ class SKPostalCodeField(RegexField):
         super(SKPostalCodeField, self).__init__(r'^\d{5}$|^\d{3} \d{2}$',
             max_length=None, min_length=None, *args, **kwargs)
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """
         Validates the input and returns a string that contains only numbers.
         Returns an empty string for empty values.
         """
-        v = super(SKPostalCodeField, self).clean(value)
+        v = super(SKPostalCodeField, self).clean(value, initial)
         return v.replace(' ', '')
diff --git a/django/contrib/localflavor/uk/forms.py b/django/contrib/localflavor/uk/forms.py
index 52cd7ad..603e5bd 100644
--- a/django/contrib/localflavor/uk/forms.py
+++ b/django/contrib/localflavor/uk/forms.py
@@ -25,8 +25,8 @@ class UKPostcodeField(CharField):
     postcode_regex = re.compile(r'^(GIR 0AA|%s %s)$' % (outcode_pattern, incode_pattern))
     space_regex = re.compile(r' *(%s)$' % incode_pattern)
 
-    def clean(self, value):
-        value = super(UKPostcodeField, self).clean(value)
+    def clean(self, value, initial=None):
+        value = super(UKPostcodeField, self).clean(value, initial)
         if value == u'':
             return value
         postcode = value.upper().strip()
diff --git a/django/contrib/localflavor/us/forms.py b/django/contrib/localflavor/us/forms.py
index d6aa684..721f819 100644
--- a/django/contrib/localflavor/us/forms.py
+++ b/django/contrib/localflavor/us/forms.py
@@ -25,8 +25,8 @@ class USPhoneNumberField(Field):
         'invalid': u'Phone numbers must be in XXX-XXX-XXXX format.',
     }
 
-    def clean(self, value):
-        super(USPhoneNumberField, self).clean(value)
+    def clean(self, value, initial=None):
+        super(USPhoneNumberField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
         value = re.sub('(\(|\)|\s+)', '', smart_unicode(value))
@@ -54,8 +54,8 @@ class USSocialSecurityNumberField(Field):
         'invalid': ugettext('Enter a valid U.S. Social Security number in XXX-XX-XXXX format.'),
     }
 
-    def clean(self, value):
-        super(USSocialSecurityNumberField, self).clean(value)
+    def clean(self, value, initial=None):
+        super(USSocialSecurityNumberField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
         match = re.match(ssn_re, value)
@@ -87,9 +87,9 @@ class USStateField(Field):
         'invalid': u'Enter a U.S. state or territory.',
     }
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         from us_states import STATES_NORMALIZED
-        super(USStateField, self).clean(value)
+        super(USStateField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
         try:
diff --git a/django/contrib/localflavor/za/forms.py b/django/contrib/localflavor/za/forms.py
index b3613b5..f01c9c3 100644
--- a/django/contrib/localflavor/za/forms.py
+++ b/django/contrib/localflavor/za/forms.py
@@ -20,11 +20,11 @@ class ZAIDField(Field):
         'invalid': _(u'Enter a valid South African ID number'),
     }
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         # strip spaces and dashes
         value = value.strip().replace(' ', '').replace('-', '')
 
-        super(ZAIDField, self).clean(value)
+        super(ZAIDField, self).clean(value, initial)
 
         if value in EMPTY_VALUES:
             return u''
diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
index 139a096..7bc6c58 100644
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -797,15 +797,12 @@ class FileField(Field):
         return os.path.normpath(f)
 
     def save_form_data(self, instance, data):
-        if data:
+        from django.newforms.fields import UploadedFile
+        if data and isinstance(data, UploadedFile):
             getattr(instance, "save_%s_file" % self.name)(data.filename, data.content, save=False)
 
     def formfield(self, **kwargs):
         defaults = {'form_class': forms.FileField}
-        # If a file has been provided previously, then the form doesn't require
-        # that a new file is provided this time.
-        if 'initial' in kwargs:
-            defaults['required'] = False
         defaults.update(kwargs)
         return super(FileField, self).formfield(**defaults)
 
diff --git a/django/newforms/fields.py b/django/newforms/fields.py
index 3b8f419..29f565c 100644
--- a/django/newforms/fields.py
+++ b/django/newforms/fields.py
@@ -93,7 +93,7 @@ class Field(object):
         messages.update(error_messages or {})
         self.error_messages = messages
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """
         Validates the given value and returns its "cleaned" value as an
         appropriate Python object.
@@ -128,9 +128,9 @@ class CharField(Field):
         self.max_length, self.min_length = max_length, min_length
         super(CharField, self).__init__(*args, **kwargs)
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         "Validates max_length and min_length. Returns a Unicode object."
-        super(CharField, self).clean(value)
+        super(CharField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return u''
         value = smart_unicode(value)
@@ -157,12 +157,12 @@ class IntegerField(Field):
         self.max_value, self.min_value = max_value, min_value
         super(IntegerField, self).__init__(*args, **kwargs)
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """
         Validates that int() can be called on the input. Returns the result
         of int(). Returns None for empty values.
         """
-        super(IntegerField, self).clean(value)
+        super(IntegerField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return None
         try:
@@ -186,12 +186,12 @@ class FloatField(Field):
         self.max_value, self.min_value = max_value, min_value
         Field.__init__(self, *args, **kwargs)
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """
         Validates that float() can be called on the input. Returns a float.
         Returns None for empty values.
         """
-        super(FloatField, self).clean(value)
+        super(FloatField, self).clean(value, initial)
         if not self.required and value in EMPTY_VALUES:
             return None
         try:
@@ -219,14 +219,14 @@ class DecimalField(Field):
         self.max_digits, self.decimal_places = max_digits, decimal_places
         Field.__init__(self, *args, **kwargs)
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """
         Validates that the input is a decimal number. Returns a Decimal
         instance. Returns None for empty values. Ensures that there are no more
         than max_digits in the number, and no more than decimal_places digits
         after the decimal point.
         """
-        super(DecimalField, self).clean(value)
+        super(DecimalField, self).clean(value, initial)
         if not self.required and value in EMPTY_VALUES:
             return None
         value = smart_str(value).strip()
@@ -266,12 +266,12 @@ class DateField(Field):
         super(DateField, self).__init__(*args, **kwargs)
         self.input_formats = input_formats or DEFAULT_DATE_INPUT_FORMATS
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """
         Validates that the input can be converted to a date. Returns a Python
         datetime.date object.
         """
-        super(DateField, self).clean(value)
+        super(DateField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return None
         if isinstance(value, datetime.datetime):
@@ -299,12 +299,12 @@ class TimeField(Field):
         super(TimeField, self).__init__(*args, **kwargs)
         self.input_formats = input_formats or DEFAULT_TIME_INPUT_FORMATS
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """
         Validates that the input can be converted to a time. Returns a Python
         datetime.time object.
         """
-        super(TimeField, self).clean(value)
+        super(TimeField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return None
         if isinstance(value, datetime.time):
@@ -338,12 +338,12 @@ class DateTimeField(Field):
         super(DateTimeField, self).__init__(*args, **kwargs)
         self.input_formats = input_formats or DEFAULT_DATETIME_INPUT_FORMATS
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """
         Validates that the input can be converted to a datetime. Returns a
         Python datetime.datetime object.
         """
-        super(DateTimeField, self).clean(value)
+        super(DateTimeField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             return None
         if isinstance(value, datetime.datetime):
@@ -380,12 +380,12 @@ class RegexField(CharField):
             regex = re.compile(regex)
         self.regex = regex
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """
         Validates that the input matches the regular expression. Returns a
         Unicode object.
         """
-        value = super(RegexField, self).clean(value)
+        value = super(RegexField, self).clean(value, initial)
         if value == u'':
             return value
         if not self.regex.search(value):
@@ -437,10 +437,12 @@ class FileField(Field):
     def __init__(self, *args, **kwargs):
         super(FileField, self).__init__(*args, **kwargs)
 
-    def clean(self, data):
-        super(FileField, self).clean(data)
+    def clean(self, data, initial=None):
+        super(FileField, self).clean(initial or data)
         if not self.required and data in EMPTY_VALUES:
             return None
+        elif not data and initial:
+            return initial
         try:
             f = UploadedFile(data['filename'], data['content'])
         except TypeError:
@@ -456,12 +458,12 @@ class ImageField(FileField):
         'invalid_image': _(u"Upload a valid image. The file you uploaded was either not an image or a corrupted image."),
     }
 
-    def clean(self, data):
+    def clean(self, data, initial):
         """
         Checks that the file-upload field data contains a valid image (GIF, JPG,
         PNG, possibly others -- whatever the Python Imaging Library supports).
         """
-        f = super(ImageField, self).clean(data)
+        f = super(ImageField, self).clean(data, initial)
         if f is None:
             return None
         from PIL import Image
@@ -500,11 +502,11 @@ class URLField(RegexField):
         self.verify_exists = verify_exists
         self.user_agent = validator_user_agent
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         # If no URL scheme given, assume http://
         if value and '://' not in value:
             value = u'http://%s' % value
-        value = super(URLField, self).clean(value)
+        value = super(URLField, self).clean(value, initial)
         if value == u'':
             return value
         if self.verify_exists:
@@ -529,9 +531,9 @@ class URLField(RegexField):
 class BooleanField(Field):
     widget = CheckboxInput
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """Returns a Python boolean object."""
-        super(BooleanField, self).clean(value)
+        super(BooleanField, self).clean(value, initial)
         # Explicitly check for the string 'False', which is what a hidden field
         # will submit for False. Because bool("True") == True, we don't need to
         # handle that explicitly.
@@ -546,7 +548,7 @@ class NullBooleanField(BooleanField):
     """
     widget = NullBooleanSelect
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         return {True: True, False: False}.get(value, None)
 
 class ChoiceField(Field):
@@ -572,11 +574,11 @@ class ChoiceField(Field):
 
     choices = property(_get_choices, _set_choices)
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """
         Validates that the input is in self.choices.
         """
-        value = super(ChoiceField, self).clean(value)
+        value = super(ChoiceField, self).clean(value, initial)
         if value in EMPTY_VALUES:
             value = u''
         value = smart_unicode(value)
@@ -595,7 +597,7 @@ class MultipleChoiceField(ChoiceField):
         'invalid_list': _(u'Enter a list of values.'),
     }
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """
         Validates that the input is a list or tuple.
         """
@@ -626,14 +628,14 @@ class ComboField(Field):
             f.required = False
         self.fields = fields
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """
         Validates the given value against all of self.fields, which is a
         list of Field instances.
         """
-        super(ComboField, self).clean(value)
+        super(ComboField, self).clean(value, initial)
         for field in self.fields:
-            value = field.clean(value)
+            value = field.clean(value, initial)
         return value
 
 class MultiValueField(Field):
@@ -666,7 +668,7 @@ class MultiValueField(Field):
             f.required = False
         self.fields = fields
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         """
         Validates every value in the given list. A value is validated against
         the corresponding Field in self.fields.
diff --git a/django/newforms/forms.py b/django/newforms/forms.py
index 556c00a..94232e3 100644
--- a/django/newforms/forms.py
+++ b/django/newforms/forms.py
@@ -181,8 +181,9 @@ class BaseForm(StrAndUnicode):
             # Each widget type knows how to retrieve its own data, because some
             # widgets split data over several HTML fields.
             value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
+            initial = field.widget.value_from_initialdict(self.initial, name)
             try:
-                value = field.clean(value)
+                value = field.clean(value, initial)
                 self.cleaned_data[name] = value
                 if hasattr(self, 'clean_%s' % name):
                     value = getattr(self, 'clean_%s' % name)()
diff --git a/django/newforms/models.py b/django/newforms/models.py
index fd0087a..4c130a3 100644
--- a/django/newforms/models.py
+++ b/django/newforms/models.py
@@ -360,7 +360,7 @@ class ModelChoiceField(ChoiceField):
 
     choices = property(_get_choices, _set_choices)
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         Field.clean(self, value)
         if value in EMPTY_VALUES:
             return None
@@ -386,7 +386,7 @@ class ModelMultipleChoiceField(ModelChoiceField):
             cache_choices, required, widget, label, initial, help_text,
             *args, **kwargs)
 
-    def clean(self, value):
+    def clean(self, value, initial=None):
         if self.required and not value:
             raise ValidationError(self.error_messages['required'])
         elif not self.required and not value:
diff --git a/django/newforms/widgets.py b/django/newforms/widgets.py
index 5808348..fd585ed 100644
--- a/django/newforms/widgets.py
+++ b/django/newforms/widgets.py
@@ -77,6 +77,15 @@ class Widget(object):
         return id_
     id_for_label = classmethod(id_for_label)
 
+    def value_from_initialdict(self, initial, name):
+        """
+        Given a dictionary of initial data return the value for this widget.
+        Returns None if it's not provided.
+        """
+        if name in initial:
+            return initial[name]
+        return None
+
 class Input(Widget):
     """
     Base class for all <input> widgets (except type='checkbox' and
diff --git a/docs/newforms.txt b/docs/newforms.txt
index 19f42cb..257945e 100644
--- a/docs/newforms.txt
+++ b/docs/newforms.txt
@@ -1594,7 +1594,7 @@ keep it simple and assume e-mail validation is contained in a function called
     from django import newforms as forms
 
     class MultiEmailField(forms.Field):
-        def clean(self, value):
+        def clean(self, value, initial=None):
             if not value:
                 raise forms.ValidationError('Enter at least one e-mail address.')
             emails = value.split(',')
diff --git a/tests/modeltests/model_forms/models.py b/tests/modeltests/model_forms/models.py
index 17c3b35..ff3f20e 100644
--- a/tests/modeltests/model_forms/models.py
+++ b/tests/modeltests/model_forms/models.py
@@ -7,6 +7,9 @@ examples are probably a poor fit for the ModelForm syntax. In other words,
 most of these tests should be rewritten.
 """
 
+import os
+import tempfile
+
 from django.db import models
 
 ARTICLE_STATUS = (
@@ -55,6 +58,13 @@ class PhoneNumber(models.Model):
     def __unicode__(self):
         return self.phone
 
+class TextFile(models.Model):
+    description = models.CharField(max_length=20)
+    file = models.FileField(upload_to=tempfile.gettempdir())
+
+    def __unicode__(self):
+        return self.description
+
 __test__ = {'API_TESTS': """
 >>> from django import newforms as forms
 >>> from django.newforms.models import ModelForm
@@ -701,4 +711,75 @@ ValidationError: [u'Select a valid choice. 4 is not one of the available choices
 True
 >>> f.cleaned_data
 {'phone': u'312-555-1212', 'description': u'Assistance'}
+
+# FileField ###################################################################
+
+>>> class TextFileForm(ModelForm):
+...     class Meta:
+...         model = TextFile
+
+Test conditions when files is either not given or empty.
+
+>>> f = TextFileForm(data={'description': u'Assistance'})
+>>> f.is_valid()
+False
+>>> f = TextFileForm(data={'description': u'Assistance'}, files={})
+>>> f.is_valid()
+False
+
+Upload a file and ensure it all works as expected.
+
+>>> f = TextFileForm(data={'description': u'Assistance'}, files={'file': {'filename': 'test1.txt', 'content': 'hello world'}})
+>>> f.is_valid()
+True
+>>> type(f.cleaned_data['file'])
+<class 'django.newforms.fields.UploadedFile'>
+>>> instance = f.save()
+>>> instance.file
+u'.../test1.txt'
+
+Edit an instance that already has the file defined in the model. This will not
+save the file again, but leave it exactly as it is.
+
+>>> f = TextFileForm(data={'description': u'Assistance'}, instance=instance)
+>>> f.is_valid()
+True
+>>> f.cleaned_data['file']
+u'.../test1.txt'
+>>> instance = f.save()
+>>> instance.file
+u'.../test1.txt'
+
+Delete the current file since this is not done by Django.
+
+>>> os.unlink(instance.get_file_filename())
+
+Override the file by uploading a new one.
+
+>>> f = TextFileForm(data={'description': u'Assistance'}, files={'file': {'filename': 'test2.txt', 'content': 'hello world'}}, instance=instance)
+>>> f.is_valid()
+True
+>>> instance = f.save()
+>>> instance.file
+u'.../test2.txt'
+
+>>> instance.delete()
+
+Test the non-required FileField
+
+>>> f = TextFileForm(data={'description': u'Assistance'})
+>>> f.fields['file'].required = False
+>>> f.is_valid()
+True
+>>> instance = f.save()
+>>> instance.file
+''
+
+>>> f = TextFileForm(data={'description': u'Assistance'}, files={'file': {'filename': 'test3.txt', 'content': 'hello world'}}, instance=instance)
+>>> f.is_valid()
+True
+>>> instance = f.save()
+>>> instance.file
+u'.../test3.txt'
+>>> instance.delete()
 """}
diff --git a/tests/regressiontests/forms/fields.py b/tests/regressiontests/forms/fields.py
index cff5db6..9216210 100644
--- a/tests/regressiontests/forms/fields.py
+++ b/tests/regressiontests/forms/fields.py
@@ -749,32 +749,59 @@ Traceback (most recent call last):
 ...
 ValidationError: [u'This field is required.']
 
+>>> f.clean('', '')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+
+>>> f.clean('', 'files/test1.pdf')
+'files/test1.pdf'
+
 >>> f.clean(None)
 Traceback (most recent call last):
 ...
 ValidationError: [u'This field is required.']
 
+>>> f.clean(None, '')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+
+>>> f.clean(None, 'files/test2.pdf')
+'files/test2.pdf'
+
 >>> f.clean({})
 Traceback (most recent call last):
 ...
 ValidationError: [u'No file was submitted.']
 
+>>> f.clean({}, '')
+Traceback (most recent call last):
+...
+ValidationError: [u'No file was submitted.']
+
+>>> f.clean({}, 'files/test3.pdf')
+'files/test3.pdf'
+
 >>> f.clean('some content that is not a file')
 Traceback (most recent call last):
 ...
 ValidationError: [u'No file was submitted. Check the encoding type on the form.']
 
->>> f.clean({'filename': 'name', 'content':None})
+>>> f.clean({'filename': 'name', 'content': None})
 Traceback (most recent call last):
 ...
 ValidationError: [u'The submitted file is empty.']
 
->>> f.clean({'filename': 'name', 'content':''})
+>>> f.clean({'filename': 'name', 'content': ''})
 Traceback (most recent call last):
 ...
 ValidationError: [u'The submitted file is empty.']
 
->>> type(f.clean({'filename': 'name', 'content':'Some File Content'}))
+>>> type(f.clean({'filename': 'name', 'content': 'Some File Content'}))
+<class 'django.newforms.fields.UploadedFile'>
+
+>>> type(f.clean({'filename': 'name', 'content': 'Some File Content'}, 'files/test4.pdf'))
 <class 'django.newforms.fields.UploadedFile'>
 
 # URLField ##################################################################
