diff --git a/tests/modeltests/excludes/__init__.py b/tests/modeltests/excludes/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/tests/modeltests/excludes/models.py b/tests/modeltests/excludes/models.py
new file mode 100644
index 0000000..56d2d09
--- /dev/null
+++ b/tests/modeltests/excludes/models.py
@@ -0,0 +1,26 @@
+"""
+7. The lookup API
+
+This demonstrates features of the database API.
+"""
+
+from __future__ import unicode_literals
+
+from django.db import models
+
+class Order(models.Model):
+    class Meta:
+        ordering = ('pk', )
+
+    def __unicode__(self):
+        return '%s' % self.pk
+
+class OrderItem(models.Model):
+    order = models.ForeignKey(Order, related_name='items')
+    status = models.IntegerField()
+    
+    class Meta:
+        ordering = ('pk', )
+
+    def __unicode__(self):
+        return '%s' % self.pk
diff --git a/tests/modeltests/excludes/tests.py b/tests/modeltests/excludes/tests.py
new file mode 100644
index 0000000..b30f932
--- /dev/null
+++ b/tests/modeltests/excludes/tests.py
@@ -0,0 +1,99 @@
+from __future__ import absolute_import, unicode_literals
+
+from django.test import TestCase
+from django.db.models import Q
+
+from .models import Order, OrderItem
+
+
+class LookupTests(TestCase):
+
+    def setUp(self):
+        # Create a few Orders.
+        self.o1 = Order.objects.create()
+        self.o2 = Order.objects.create()
+        self.o3 = Order.objects.create()
+        
+        # Create some OrderItems for the first order with homogeneous 
+        # status_id values
+        self.oi1 = OrderItem.objects.create(order=self.o1, status=1)
+        self.oi2 = OrderItem.objects.create(order=self.o1, status=1)
+        self.oi3 = OrderItem.objects.create(order=self.o1, status=1)
+        
+        # Create some OrderItems for the second order with heterogeneous
+        # status_id values
+        self.oi4 = OrderItem.objects.create(order=self.o2, status=1)
+        self.oi5 = OrderItem.objects.create(order=self.o2, status=2)
+        self.oi6 = OrderItem.objects.create(order=self.o2, status=3)
+        
+        # Create some OrderItems for the second order with heterogeneous
+        # status_id values
+        self.oi7 = OrderItem.objects.create(order=self.o3, status=2)
+        self.oi8 = OrderItem.objects.create(order=self.o3, status=3)
+        self.oi9 = OrderItem.objects.create(order=self.o3, status=4)
+
+    def test_exclude_plain(self):
+        """
+        This should exclude Orders which have some items with status 1
+
+        """
+        self.assertQuerysetEqual(
+            Order.objects.exclude(items__status=1),
+            [u'<Order: 3>'])
+
+    def test_exclude_plain_distinct(self):
+        """
+        This should exclude Orders which have some items with status 1
+
+        """
+        self.assertQuerysetEqual(
+            Order.objects.exclude(items__status=1).distinct(),
+            [u'<Order: 3>'])
+
+    def test_exclude_with_q_object_distinct(self):
+        """
+        This should exclude Orders which have some items with status 1
+
+        """
+        self.assertQuerysetEqual(
+            Order.objects.exclude(Q(items__status=1)).distinct(),
+            [u'<Order: 3>'])
+
+    def test_exclude_with_q_object_no_distinct(self):
+        """
+        This should exclude Orders which have some items with status 1
+
+        """
+        self.assertQuerysetEqual(
+            Order.objects.exclude(Q(items__status=1)),
+            [u'<Order: 3>'])
+    
+    def test_exclude_with_q_is_equal_to_plain_exclude(self):
+        """
+        Using exclude(condition) and exclude(Q(condition)) should
+        yield the same QuerySet
+
+        """
+        self.assertEquals(
+            Order.objects.exclude(items__status=1).distinct(),
+            Order.objects.exclude(Q(items__status=1)).distinct())
+    
+    def test_exclude_with_q_is_equal_to_plain_exclude_variation(self):
+        """
+        Using exclude(condition) and exclude(Q(condition)) should
+        yield the same QuerySet
+
+        """
+        self.assertEquals(
+            Order.objects.exclude(items__status=1),
+            Order.objects.exclude(Q(items__status=1)).distinct())
+
+    def test_only_orders_with_all_items_having_status_1(self):
+        """
+        According to the output of test_exclude_with_q_object_*,
+        this should only return orders having ALL items set to status 1
+
+        """
+        self.assertQuerysetEqual(
+            Order.objects.exclude(~Q(items__status=1)).distinct(),
+            [u'<Order: 1>'])        
