diff --git a/django/db/models/base.py b/django/db/models/base.py
index 4000379..3c4b65d 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -101,10 +101,15 @@ class ModelBase(type):
                      new_class._meta.virtual_fields
         field_names = set([f.name for f in new_fields])
 
+        # Things without _meta aren't functional models, so they're
+        # uninteresting parents.
+        parents = [p for p in parents if hasattr(p, '_meta')]
+        new_class._meta.model_bases = parents
+
         # Basic setup for proxy models.
         if is_proxy:
             base = None
-            for parent in [cls for cls in parents if hasattr(cls, '_meta')]:
+            for parent in parents:
                 if parent._meta.abstract:
                     if parent._meta.fields:
                         raise TypeError("Abstract base class containing model fields not permitted for proxy model '%s'." % name)
@@ -129,11 +134,6 @@ class ModelBase(type):
 
         for base in parents:
             original_base = base
-            if not hasattr(base, '_meta'):
-                # Things without _meta aren't functional models, so they're
-                # uninteresting parents.
-                continue
-
             parent_fields = base._meta.local_fields + base._meta.local_many_to_many
             # Check for clashes between locally declared fields and those
             # on the base classes (we cannot handle shadowed fields at the
diff --git a/django/db/models/options.py b/django/db/models/options.py
index 2f64c56..052d158 100644
--- a/django/db/models/options.py
+++ b/django/db/models/options.py
@@ -47,6 +47,7 @@ class Options(object):
         self.proxy = False
         self.proxy_for_model = None
         self.parents = SortedDict()
+        self.model_bases = []
         self.duplicate_targets = {}
         self.auto_created = False
 
@@ -232,13 +233,28 @@ class Options(object):
 
     def _fill_fields_cache(self):
         cache = []
-        for parent in self.parents:
-            for field, model in parent._meta.get_fields_with_model():
-                if model:
-                    cache.append((field, model))
+        local_fields = list(self.local_fields)
+        for field in self.local_fields:
+            if isinstance(field, AutoField):
+                cache.append((field, None))
+                local_fields.remove(field)
+                break
+        for base in self.model_bases:
+            for field, model in base._meta.get_fields_with_model():
+                if not model:
+                    model = base
+                if model._meta.abstract:
+                    field_index = local_fields.index(field)
+                    cache.append((local_fields[field_index], None))
+                    del local_fields[field_index]
                 else:
-                    cache.append((field, parent))
-        cache.extend([(f, None) for f in self.local_fields])
+                    cache.append((field, model))
+            if base in self.parents:
+                field = self.parents[base]
+                if field:
+                    cache.append((field, None))
+                    local_fields.remove(field)
+        cache.extend([(f, None) for f in local_fields])
         self._field_cache = tuple(cache)
         self._field_name_cache = [x for x, _ in cache]
 
diff --git a/tests/modeltests/model_inheritance/models.py b/tests/modeltests/model_inheritance/models.py
index a0fed8a..1537b1e 100644
--- a/tests/modeltests/model_inheritance/models.py
+++ b/tests/modeltests/model_inheritance/models.py
@@ -119,6 +119,26 @@ class ParkingLot(Place):
     def __unicode__(self):
         return u"%s the parking lot" % self.name
 
+class AbstractModelOne(models.Model):
+    field_one = models.BooleanField()
+    field_two = models.TextField()
+
+    class Meta:
+        abstract = True
+
+class AbstractModelTwo(models.Model):
+    field_three = models.BooleanField()
+    field_four = models.TextField()
+
+    class Meta:
+        abstract = True
+
+class OneTwo(AbstractModelOne, AbstractModelTwo):
+    pass
+
+class TwoOne(AbstractModelTwo, AbstractModelOne):
+    pass
+
 #
 # Abstract base classes with related models where the sub-class has the
 # same name in a different app and inherits from the same abstract base
diff --git a/tests/modeltests/model_inheritance/tests.py b/tests/modeltests/model_inheritance/tests.py
index 334297a..1078b1e 100644
--- a/tests/modeltests/model_inheritance/tests.py
+++ b/tests/modeltests/model_inheritance/tests.py
@@ -4,7 +4,8 @@ from django.core.exceptions import FieldError
 from django.test import TestCase
 
 from models import (Chef, CommonInfo, ItalianRestaurant, ParkingLot, Place,
-    Post, Restaurant, Student, StudentWorker, Supplier, Worker, MixinModel)
+    Post, Restaurant, Student, StudentWorker, Supplier, Worker, MixinModel,
+    OneTwo, TwoOne)
 
 
 class ModelInheritanceTests(TestCase):
@@ -269,6 +270,13 @@ class ModelInheritanceTests(TestCase):
         self.assertNumQueries(1,
             lambda: ItalianRestaurant.objects.select_related("chef")[0].chef
         )
+        
+        names = [field.name for field in OneTwo._meta.fields] 
+        self.assertEqual(["id", "field_one", "field_two", "field_three", 
+            "field_four"], names) 
+        names = [field.name for field in TwoOne._meta.fields] 
+        self.assertEqual(["id", "field_three", "field_four", "field_one", 
+ 	        "field_two"], names)
 
     def test_mixin_init(self):
         m = MixinModel()
