Index: django/db/models/options.py
===================================================================
--- django/db/models/options.py	(revision 3657)
+++ django/db/models/options.py	(working copy)
@@ -134,7 +134,11 @@
     def get_data_holders(self, follow=None):
         if follow == None:
             follow = self.get_follow()
-        return [f for f in self.fields + self.many_to_many + self.get_all_related_objects() if follow.get(f.name, None)]
+        res = []
+        res += [f for f in self.fields + self.many_to_many if follow.get(f.name,None)]
+        res += [f for f in self.get_all_related_objects() if f.edit_inline]
+        return res
+        #return [f for f in self.fields + self.many_to_many + self.get_all_related_objects() if follow.get(f.name, None)]
 
     def get_follow(self, override=None):
         follow = {}
Index: django/db/models/manipulators.py
===================================================================
--- django/db/models/manipulators.py	(revision 3657)
+++ django/db/models/manipulators.py	(working copy)
@@ -2,6 +2,7 @@
 from django import forms
 from django.core import validators
 from django.db.models.fields import FileField, AutoField
+from django.db.models.fields.related import ForeignKey
 from django.dispatch import dispatcher
 from django.db.models import signals
 from django.utils.functional import curry
@@ -130,6 +131,7 @@
 
         expanded_data = DotExpandedDict(dict(new_data))
         # Save many-to-one objects. Example: Add the Choice objects for a Poll.
+        alreadyFollowed = []
         for related in self.opts.get_all_related_objects():
             # Create obj_list, which is a DotExpandedDict such as this:
             # [('0', {'id': ['940'], 'choice': ['This is the first choice']}),
@@ -137,6 +139,10 @@
             #  ('2', {'id': [''], 'choice': ['']})]
             child_follow = self.follow.get(related.name, None)
 
+            if(child_follow in alreadyFollowed):
+                continue
+            alreadyFollowed.append(child_follow)
+
             if child_follow:
                 obj_list = expanded_data.get(related.var_name, {}).items()
                 if not obj_list:
@@ -167,7 +173,7 @@
                                 pass
 
                     for f in related.opts.fields:
-                        if f.core and not isinstance(f, FileField) and f.get_manipulator_new_data(rel_new_data, rel=True) in (None, ''):
+                        if f.core and not isinstance(f, FileField) and not isinstance(f,ForeignKey) and f.get_manipulator_new_data(rel_new_data, rel=True) in (None, ''):
                             all_cores_given = False
                         elif f.core and not isinstance(f, FileField) and f.get_manipulator_new_data(rel_new_data, rel=True) not in (None, ''):
                             all_cores_blank = False
@@ -177,7 +183,10 @@
                         # case, because they'll be dealt with later.
 
                         if f == related.field:
-                            param = getattr(new_object, related.field.rel.field_name)
+                            if(related.field.rel.to == self.model and not f.rel.edit_inline):
+                                param = f.get_manipulator_new_data(rel_new_data,rel=True)
+                            else:
+                                param = getattr(new_object, related.field.rel.field_name)
                         elif (not self.change) and isinstance(f, AutoField):
                             param = None
                         elif self.change and (isinstance(f, FileField) or not child_follow.get(f.name, None)):
Index: django/contrib/admin/views/main.py
===================================================================
--- django/contrib/admin/views/main.py	(revision 3657)
+++ django/contrib/admin/views/main.py	(working copy)
@@ -195,7 +195,12 @@
     bound_field_sets = [field_set.bind(context['form'], original, AdminBoundFieldSet) for field_set in field_sets]
     first_form_field_id = bound_field_sets[0].bound_field_lines[0].bound_fields[0].form_fields[0].get_id();
     ordered_objects = opts.get_ordered_objects()
-    inline_related_objects = opts.get_followed_related_objects(manipulator.follow)
+    followed_objects = opts.get_followed_related_objects(manipulator.follow)
+    inline_related_objects = []
+    for obj in followed_objects:
+        if(obj.edit_inline):
+            inline_related_objects.append(obj)
+        
     extra_context = {
         'add': add,
         'change': change,
