diff --git a/django/db/models/base.py b/django/db/models/base.py
index 2e6bea8..db25494 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -24,6 +24,7 @@ from django.utils.functional import curry
 from django.utils.encoding import smart_str, force_unicode
 from django.utils.text import get_text_list, capfirst
 
+UPDATED, INSERTED = 'UPDATED', 'INSERTED'
 
 class ModelBase(type):
     """
@@ -473,6 +474,11 @@ class Model(object):
         override this method. It's separate from save() in order to hide the
         need for overrides of save() to pass around internal-only parameters
         ('raw', 'cls', and 'origin').
+
+        Returns the action taken, which can be UPDATED or INSERTED. This is the
+        action taken for the current model. It is possible that parent model
+        was updated while current model is inserted. If the return value is
+        UPDATED, then every model in the base chain was updated.
         """
         using = using or router.db_for_write(self.__class__, instance=self)
         connection = connections[using]
@@ -494,6 +500,7 @@ class Model(object):
         # attributes we have been given to the class we have been given.
         # We also go through this process to defer the save of proxy objects
         # to their actual underlying model.
+        parent_action = None
         if not raw or meta.proxy:
             if meta.proxy:
                 org = cls
@@ -506,12 +513,15 @@ class Model(object):
                 if field and getattr(self, parent._meta.pk.attname) is None and getattr(self, field.attname) is not None:
                     setattr(self, parent._meta.pk.attname, getattr(self, field.attname))
 
-                self.save_base(cls=parent, origin=org, using=using)
+                parent_action = self.save_base(cls=parent, origin=org, using=using)
 
                 if field:
                     setattr(self, field.attname, self._get_pk_val(parent._meta))
             if meta.proxy:
-                return
+                return parent_action
+        # A small optimization: if parent was inserted, we know this model must be inserted, too.
+        if parent_action == INSERTED:
+            force_insert = True
 
         if not meta.proxy:
             non_pks = [f for f in meta.local_fields if not f.primary_key]
@@ -546,7 +556,7 @@ class Model(object):
                         
                 elif not non_pks:
                     # There are no other fields than the pk in the model. In this case we do
-                    # not check the existense by update
+                    # not check the existense by update.
                     if manager.using(using).filter(pk=pk_val).exists():
                         record_exists = True
             if not pk_set or not record_exists:
@@ -590,6 +600,12 @@ class Model(object):
             signals.post_save.send(sender=origin, instance=self,
                 created=(not record_exists), raw=raw, using=using)
 
+        if meta.proxy:
+            return parent_action
+        if record_exists:
+            return UPDATED
+        else:
+            return INSERTED
 
     save_base.alters_data = True
 
