Index: django/db/models/expressions.py
===================================================================
--- django/db/models/expressions.py	(revision 8073)
+++ django/db/models/expressions.py	(working copy)
@@ -1,5 +1,6 @@
 from copy import deepcopy
-from datetime import datetime
+import datetime
+from django.db import connection
 
 from django.utils import tree
 
@@ -26,6 +27,9 @@
         super(ExpressionNode, self).__init__(children, connector, negated)
 
     def _combine(self, other, connector, reversed, node=None):
+        if isinstance(other, datetime.timedelta):
+            return DateModifierNode([self, other], connector)
+
         if reversed:
             obj = ExpressionNode([other], connector)
             obj.add(node or self, connector)
@@ -108,3 +112,38 @@
 
     def evaluate(self, evaluator, qn):
         return evaluator.evaluate_leaf(self, qn)
+
+class DateModifierNode(ExpressionNode):
+    """
+    Node that implements the following syntax:
+    filter(end_date__gt=F('start_date') + datetime.timedelta(days=3, seconds=200))
+
+    which translates into:
+        SQLITE:
+            where end_date > date(start_date, "3 days", "200 seconds")
+
+        POSTGRES:
+            where end_date > (start_date + interval '3 days 200 seconds')
+
+    """
+    def __init__(self, children, connector, negated=False):
+        if len(children) != 2:
+            raise TypeError('You have to specify a node and a timedelta.')
+        if not isinstance(children[1], datetime.timedelta):
+            raise TypeError('Second child must be a timedelta.')
+        if connector is None:
+            raise TypeError('You have to specify a connector.')
+        super(DateModifierNode, self).__init__(children, connector, negated)
+
+    def prepare(self, evaluator, query, allow_joins):
+        return evaluator.prepare_node(self, query, allow_joins)
+
+    def evaluate(self, evaluator, qn):
+        if not qn:
+            qn = connection.ops.quote_name
+
+        timedelta = self.children.pop()
+        sql, params = evaluator.evaluate_node(self, qn)
+
+        return connection.ops.date_interval_sql(sql, self.connector, timedelta), params
+
Index: django/db/backends/postgresql/operations.py
===================================================================
--- django/db/backends/postgresql/operations.py	(revision 8073)
+++ django/db/backends/postgresql/operations.py	(working copy)
@@ -28,6 +28,20 @@
         # http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT
         return "EXTRACT('%s' FROM %s)" % (lookup_type, field_name)
 
+    def date_interval_sql(self, sql, connector, timedelta):
+        """
+        implements the interval functionality for expressions
+        format for Postgres: (datefield + interval '3 days 200 seconds')
+        """
+        modifiers = []
+        if timedelta.days:
+            modifiers.append(u'%s days' % timedelta.days)
+        if timedelta.seconds:
+            modifiers.append(u'%s seconds' % timedelta.seconds)
+        mods = u' '.join(modifiers)
+        conn = u' %s ' % connector
+        return u'(%s)' % conn.join([sql, u'interval \'%s\'' % mods])
+
     def date_trunc_sql(self, lookup_type, field_name):
         # http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC
         return "DATE_TRUNC('%s', %s)" % (lookup_type, field_name)
Index: django/db/backends/__init__.py
===================================================================
--- django/db/backends/__init__.py	(revision 8073)
+++ django/db/backends/__init__.py	(working copy)
@@ -104,6 +104,19 @@
         """
         raise NotImplementedError()
 
+    def date_interval_sql(self, sql, connector, timedelta):
+        """
+        Implements the interval functionality for expressions
+        format for sqlite: DATE(datefield, "3 days", "200 seconds")
+        """
+        modifiers = []
+        if timedelta.days:
+            modifiers.append(u'%s days' % timedelta.days)
+        if timedelta.seconds:
+            modifiers.append(u'%s seconds' % timedelta.seconds)
+        mods = u','.join([u'"%s%s"' % (connector, modifier) for modifier in modifiers])
+        return u'DATE(%s, %s)' % (sql, mods)
+
     def date_trunc_sql(self, lookup_type, field_name):
         """
         Given a lookup_type of 'year', 'month' or 'day', returns the SQL that
Index: tests/modeltests/expressions/models.py
===================================================================
--- tests/modeltests/expressions/models.py	(revision 8073)
+++ tests/modeltests/expressions/models.py	(working copy)
@@ -7,6 +7,8 @@
 class Employee(models.Model):
     firstname = models.CharField(max_length=50)
     lastname = models.CharField(max_length=50)
+    contract_date = models.DateField(null=True)
+    start_date = models.DateField(null=True)
 
     def __unicode__(self):
         return u'%s %s' % (self.firstname, self.lastname)
@@ -30,12 +32,17 @@
 __test__ = {'API_TESTS': """
 >>> from django.db.models import F
 
+>>> import datetime
+
 >>> Company(name='Example Inc.', num_employees=2300, num_chairs=5,
-...     ceo=Employee.objects.create(firstname='Joe', lastname='Smith')).save()
+...     ceo=Employee.objects.create(firstname='Joe', lastname='Smith',
+...     contract_date=datetime.date(2008,1,1), start_date=datetime.date(2008,3,1))).save()
 >>> Company(name='Foobar Ltd.', num_employees=3, num_chairs=3,
-...     ceo=Employee.objects.create(firstname='Frank', lastname='Meyer')).save()
+...     ceo=Employee.objects.create(firstname='Frank', lastname='Meyer',
+...     contract_date=datetime.date(2008,1,1), start_date=datetime.date(2008,5,1))).save()
 >>> Company(name='Test GmbH', num_employees=32, num_chairs=1,
-...     ceo=Employee.objects.create(firstname='Max', lastname='Mustermann')).save()
+...     ceo=Employee.objects.create(firstname='Max', lastname='Mustermann',
+...     contract_date=datetime.date(2008,1,1), start_date=datetime.date(2008,7,1))).save()
 
 # We can filter for companies where the number of employees is greater than the
 # number of chairs.
@@ -68,4 +75,23 @@
 ...
 FieldError: Joined field references are not permitted in this query
 
+# F expressions for dates may be combined with timedelta
+# in filter:
+>>> Employee.objects.filter(start_date__gt=F('contract_date')+datetime.timedelta(days=80, seconds=500))
+[<Employee: Frank Meyer>, <Employee: Max Mustermann>]
+
+>>> Employee.objects.filter(contract_date__gt=F('start_date')-datetime.timedelta(days=80, seconds=500))
+[<Employee: Joe Smith>]
+
+# chaining multiple timedeltas:
+>>> Employee.objects.filter(start_date__gt=F('contract_date')+datetime.timedelta(days=80)+datetime.timedelta(seconds=500))
+[<Employee: Frank Meyer>, <Employee: Max Mustermann>]
+
+# in update:
+# move contractdates to 14 days before startdate
+>>> Employee.objects.update(contract_date=F('start_date')-datetime.timedelta(days=14))
+4
+>>> [e.contract_date for e in Employee.objects.all()]
+[datetime.date(2008, 2, 16), datetime.date(2008, 4, 17), datetime.date(2008, 6, 17), None]
+
 """}
