diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
index 439633c..877f841 100644
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -2,6 +2,7 @@ import copy
 import datetime
 import os
 import time
+import warnings
 try:
     import decimal
 except ImportError:
@@ -46,6 +47,19 @@ def manipulator_validator_unique(f, opts, self, field_data, all_data):
         return
     raise validators.ValidationError, _("%(optname)s with this %(fieldname)s already exists.") % {'optname': capfirst(opts.verbose_name), 'fieldname': f.verbose_name}
 
+def create_auto_field(base, value_func, always):
+    class Klass(base):
+        def __init__(self, *args, **kwargs):
+            kwargs['editable'] = False
+            kwargs['blank'] = True
+            super(base, self).__init__(self, *args, **kwargs)
+
+        def pre_save(self, model_instance, add):
+            if always or add:
+                setattr(model_instance, self.attname, value_func())
+
+            return getattr(model_instance, self.attname)
+
 # A guide to Field parameters:
 #
 #   * name:      The name of the field specifed in the model.
@@ -416,7 +430,7 @@ class Field(object):
                 flat.append((choice,value))
         return flat
     flatchoices = property(_get_flatchoices)
-    
+
     def save_form_data(self, instance, data):
         setattr(instance, self.name, data)
 
@@ -531,6 +545,7 @@ class DateField(Field):
         self.auto_now, self.auto_now_add = auto_now, auto_now_add
         #HACKs : auto_now_add/auto_now should be done as a default or a pre_save.
         if auto_now or auto_now_add:
+            self._issue_warning()
             kwargs['editable'] = False
             kwargs['blank'] = True
         Field.__init__(self, verbose_name, name, **kwargs)
@@ -610,6 +625,24 @@ class DateField(Field):
         defaults.update(kwargs)
         return super(DateField, self).formfield(**defaults)
 
+    def _issue_warning(self):
+        internal_type = self.get_internal_type()
+        warnings.warn(
+            message = "auto_now_add and auto_now are deprecated; use Created%s or Modified%s instead" % (internal_type, internal_type),
+            category = DeprecationWarning,
+            stacklevel = 4
+        )
+
+AutoAddDateField = create_auto_field(
+    base=DateField,
+    value_func=datetime.date.today,
+    always=False)
+
+AutoDateField = create_auto_field(
+    base=DateField,
+    value_func=datetime.date.today,
+    always=True)
+
 class DateTimeField(DateField):
     def get_internal_type(self):
         return "DateTimeField"
@@ -683,6 +716,24 @@ class DateTimeField(DateField):
         defaults.update(kwargs)
         return super(DateTimeField, self).formfield(**defaults)
 
+    def _issue_warning(self):
+        internal_type = self.get_internal_type()
+        warnings.warn(
+            message = "auto_now_add and auto_now are deprecated; use Created%s and Modified%s" % (internal_type, internal_type),
+            category = DeprecationWarning,
+            stacklevel = 5
+        )
+
+AutoAddDateTimeField = create_auto_field(
+    base=DateTimeField,
+    value_func=datetime.datetime.now,
+    always=False)
+
+AutoDateTimeField = create_auto_field(
+    base=DateTimeField,
+    value_func=datetime.datetime.now,
+    always=True)
+
 class DecimalField(Field):
     empty_strings_allowed = False
     def __init__(self, verbose_name=None, name=None, max_digits=None, decimal_places=None, **kwargs):
@@ -1152,6 +1203,16 @@ class TimeField(Field):
         defaults.update(kwargs)
         return super(TimeField, self).formfield(**defaults)
 
+AutoAddTimeField = create_auto_field(
+    base=TimeField,
+    value_func=lambda: datetime.datetime.now().time(),
+    always=False)
+
+AutoTimeField = create_auto_field(
+    base=TimeField,
+    value_func=lambda: datetime.datetime.now().time(),
+    always=True)
+
 class URLField(CharField):
     def __init__(self, verbose_name=None, name=None, verify_exists=True, **kwargs):
         kwargs['max_length'] = kwargs.get('max_length', 200)
diff --git a/docs/model-api.txt b/docs/model-api.txt
index 9a353c0..7c9d344 100644
--- a/docs/model-api.txt
+++ b/docs/model-api.txt
@@ -116,6 +116,31 @@ class. Django uses the field class types to determine a few things:
 
 Here are all available field types:
 
+``AutoAddDateField``
+~~~~~~~~~~~~~~~~~~~~
+
+See `DateField`_ below.
+
+``AutoAddDateTimeField``
+~~~~~~~~~~~~~~~~~~~~
+
+See `DateTimeField`_ below.
+
+``AutoAddTimeField``
+~~~~~~~~~~~~~~~~~~~~
+
+See `TimeField`_ below.
+
+``AutoDateField``
+~~~~~~~~~~~~~~~~~~~~
+
+See `DateField`_ below.
+
+``AutoDateTimeField``
+~~~~~~~~~~~~~~~~~~~~
+
+See `DateTimeField`_ below.
+
 ``AutoField``
 ~~~~~~~~~~~~~
 
@@ -124,6 +149,11 @@ You usually won't need to use this directly; a primary key field will
 automatically be added to your model if you don't specify otherwise. See
 `Automatic primary key fields`_.
 
+``AutoTimeField``
+~~~~~~~~~~~~~~~~~~~~
+
+See `TimeField`_ below.
+
 ``BooleanField``
 ~~~~~~~~~~~~~~~~
 
@@ -175,6 +205,11 @@ A date field. Has a few extra optional arguments:
                             override.
     ======================  ===================================================
 
+In the Django development version, ``auto_now`` and ``auto_now_add`` are
+deprecated in favor of ``AutoDateField`` and ``AutoAddDateField``. The former
+replaces ``auto_now``, the latter ``auto_now_add`` while providing the same
+functionality.
+
 The admin represents this as an ``<input type="text">`` with a JavaScript
 calendar, and a shortcut for "Today."  The JavaScript calendar will always start
 the week on a Sunday.
@@ -184,6 +219,11 @@ the week on a Sunday.
 
 A date and time field. Takes the same extra options as ``DateField``.
 
+In the Django development version, ``auto_now`` and ``auto_now_add`` are deprecated
+in favor of ``AutoDateTimeField`` and ``AutoAddDateTimeField``. The former
+replaces ``auto_now``, the latter ``auto_now_add`` while providing the same
+functionality.
+
 The admin represents this as two ``<input type="text">`` fields, with
 JavaScript shortcuts.
 
@@ -571,10 +611,10 @@ be used for organizational purposes::
         ('unknown', 'Unknown'),
     )
 
-The first element in each tuple is the name to apply to the group. The 
+The first element in each tuple is the name to apply to the group. The
 second element is an iterable of 2-tuples, with each 2-tuple containing
-a value and a human-readable name for an option. Grouped options may be 
-combined with ungrouped options within a single list (such as the 
+a value and a human-readable name for an option. Grouped options may be
+combined with ungrouped options within a single list (such as the
 `unknown` option in this example).
 
 For each model field that has ``choices`` set, Django will add a method to
