Index: django/db/models/fields/__init__.py
===================================================================
--- django/db/models/fields/__init__.py	(revision 7011)
+++ django/db/models/fields/__init__.py	(working copy)
@@ -13,6 +13,7 @@
 from django.core import validators
 from django import oldforms
 from django import newforms as forms
+from django.newforms.utils import InitialData
 from django.core.exceptions import ObjectDoesNotExist
 from django.utils.functional import curry
 from django.utils.itercompat import tee
@@ -795,7 +796,7 @@
         return os.path.normpath(f)
 
     def save_form_data(self, instance, data):
-        if data:
+        if data and not isinstance(data, InitialData):
             getattr(instance, "save_%s_file" % self.name)(data.filename, data.content, save=False)
 
     def formfield(self, **kwargs):
Index: django/newforms/util.py
===================================================================
--- django/newforms/util.py	(revision 7011)
+++ django/newforms/util.py	(working copy)
@@ -67,3 +67,10 @@
         # AttributeError: ValidationError instance has no attribute 'args'
         # See http://www.python.org/doc/current/tut/node10.html#handling
         return repr(self.messages)
+
+class InitialData(object):
+
+    value = None
+
+    def __init__(self, value):
+        self.value = value
Index: django/newforms/fields.py
===================================================================
--- django/newforms/fields.py	(revision 7011)
+++ django/newforms/fields.py	(working copy)
@@ -19,7 +19,7 @@
 from django.utils.translation import ugettext_lazy as _
 from django.utils.encoding import StrAndUnicode, smart_unicode, smart_str
 
-from util import ErrorList, ValidationError
+from util import ErrorList, ValidationError, InitialData
 from widgets import TextInput, PasswordInput, HiddenInput, MultipleHiddenInput, FileInput, CheckboxInput, Select, NullBooleanSelect, SelectMultiple, DateTimeInput
 
 
@@ -441,6 +441,8 @@
         super(FileField, self).clean(data)
         if not self.required and data in EMPTY_VALUES:
             return None
+        elif self.required and isinstance(data, InitialData):
+            return data 
         try:
             f = UploadedFile(data['filename'], data['content'])
         except TypeError:
Index: django/newforms/forms.py
===================================================================
--- django/newforms/forms.py	(revision 7011)
+++ django/newforms/forms.py	(working copy)
@@ -9,7 +9,7 @@
 from django.utils.encoding import StrAndUnicode, smart_unicode, force_unicode
 from django.utils.safestring import mark_safe
 
-from fields import Field
+from fields import Field, EMPTY_VALUES
 from widgets import Media, media_property, TextInput, Textarea
 from util import flatatt, ErrorDict, ErrorList, ValidationError
 
@@ -204,6 +204,8 @@
             # 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))
+            if value in EMPTY_VALUES:
+                value = field.widget.value_from_initial(self.initial, name, value)
             try:
                 value = field.clean(value)
                 self.cleaned_data[name] = value
Index: django/newforms/widgets.py
===================================================================
--- django/newforms/widgets.py	(revision 7011)
+++ django/newforms/widgets.py	(working copy)
@@ -15,7 +15,7 @@
 from django.utils.translation import ugettext
 from django.utils.encoding import StrAndUnicode, force_unicode
 from django.utils.safestring import mark_safe
-from util import flatatt
+from util import flatatt, InitialData
 from urlparse import urljoin
 
 __all__ = (
@@ -202,6 +202,9 @@
             final_attrs['value'] = force_unicode(value)
         return mark_safe(u'<input%s />' % flatatt(final_attrs))
 
+    def value_from_initial(self, initial, name, data):
+        return data
+
 class TextInput(Input):
     input_type = 'text'
 
@@ -253,6 +256,12 @@
         "File widgets take data from FILES, not POST"
         return files.get(name, None)
 
+    def value_from_initial(self, initial, name, data):
+        if initial.has_key(name):
+            return InitialData(initial.get(name))
+        else:
+            return data
+
 class Textarea(Widget):
     def __init__(self, attrs=None):
         # The 'rows' and 'cols' attributes are required for HTML correctness.
