Index: django/contrib/humanize/templatetags/humanize.py
===================================================================
--- django/contrib/humanize/templatetags/humanize.py	(revision 5722)
+++ django/contrib/humanize/templatetags/humanize.py	(working copy)
@@ -1,6 +1,9 @@
 from django.utils.translation import ungettext, ugettext as _
 from django.utils.encoding import force_unicode
 from django import template
+from django.template import defaultfilters
+from django.conf import settings
+from datetime import date, timedelta
 import re
 
 register = template.Library()
@@ -67,3 +70,27 @@
         return value
     return (_('one'), _('two'), _('three'), _('four'), _('five'), _('six'), _('seven'), _('eight'), _('nine'))[value-1]
 register.filter(apnumber)
+
+def naturalday(value, arg=None):
+    """
+    For date values that are tomorrow, today or yesterday compared to
+    present day returns representing string. Otherwise, returns a string
+    formatted according to settings.DATE_FORMAT.
+    """
+    try: 
+        value = date(value.year, value.month, value.day)
+    except AttributeError:
+        # Passed value wasn't a date object
+        return value
+    except ValueError:
+        # Date arguments out of range
+        return value
+    delta = value - date.today()
+    if delta.days == 0:
+        return _(u'today')
+    elif delta.days == 1:
+        return _(u'tomorrow')
+    elif delta.days == -1:
+        return _(u'yesterday')
+    return defaultfilters.date(value, arg)
+register.filter(naturalday)
Index: tests/regressiontests/humanize/tests.py
===================================================================
--- tests/regressiontests/humanize/tests.py	(revision 5722)
+++ tests/regressiontests/humanize/tests.py	(working copy)
@@ -1,5 +1,8 @@
 import unittest
+from datetime import timedelta, date
 from django.template import Template, Context, add_to_builtins
+from django.utils.dateformat import DateFormat
+from django.utils.translation import ugettext as _
 
 add_to_builtins('django.contrib.humanize.templatetags.humanize')
 
@@ -49,6 +52,20 @@
 
         self.humanize_tester(test_list, result_list, 'apnumber')
 
+    def test_naturalday(self):
+        from django.template import defaultfilters
+        today = date.today()
+        yesterday = today - timedelta(days=1)
+        tomorrow = today + timedelta(days=1)
+        someday = today - timedelta(days=10)
+        notdate = u"I'm not a date value"
+
+        test_list = (today, yesterday, tomorrow, someday, notdate)
+        someday_result = defaultfilters.date(someday)
+        result_list = (_(u'today'), _(u'yesterday'), _(u'tomorrow'),
+                       someday_result, u"I'm not a date value")
+        self.humanize_tester(test_list, result_list, 'naturalday')
+        
 if __name__ == '__main__':
     unittest.main()
 
Index: docs/add_ons.txt
===================================================================
--- docs/add_ons.txt	(revision 5722)
+++ docs/add_ons.txt	(working copy)
@@ -138,6 +138,25 @@
 
 You can pass in either an integer or a string representation of an integer.
 
+naturalday
+----------
+
+Converts a date to natural string, if it's today, tomorrow or yesterday
+
+**Argument:** Date formatting string as described in default tag now_.
+
+.. _now: ../templates/#now
+
+Examples (when 'today' is 17 Feb 2007):
+
+    * ``16 Feb 2007`` becomes ``yesterday``.
+    * ``17 Feb 2007`` becomes ``today``.
+    * ``18 Feb 2007`` becomes ``tomorrow``.
+    * Any other day is formatted according to given argument or `DATE_FORMAT`_ if
+      argument is not given.
+
+.. _DATE_FORMAT: ../settings/#date_format
+
 flatpages
 =========
 
