diff --git a/django/db/backends/__init__.py b/django/db/backends/__init__.py
index ebe8875..8db0baf 100644
--- a/django/db/backends/__init__.py
+++ b/django/db/backends/__init__.py
@@ -11,7 +11,7 @@ from django.db import DEFAULT_DB_ALIAS
 from django.db.backends import util
 from django.db.transaction import TransactionManagementError
 from django.utils.importlib import import_module
-from django.utils.timezone import is_aware
+from django.utils import timezone
 
 
 class BaseDatabaseWrapper(object):
@@ -34,6 +34,7 @@ class BaseDatabaseWrapper(object):
 
         # Transaction related attributes
         self.transaction_state = []
+        self.transaction_start = None
         self.savepoint_state = 0
         self._dirty = None
         self._thread_ident = thread.get_ident()
@@ -96,6 +97,7 @@ class BaseDatabaseWrapper(object):
         if self.transaction_state:
             self.transaction_state.append(self.transaction_state[-1])
         else:
+            self.transaction_start = timezone.now()
             self.transaction_state.append(settings.TRANSACTIONS_MANAGED)
 
         if self._dirty is None:
@@ -110,6 +112,7 @@ class BaseDatabaseWrapper(object):
         """
         self._leave_transaction_management(self.is_managed())
         if self.transaction_state:
+            self.transaction_start = None
             del self.transaction_state[-1]
         else:
             raise TransactionManagementError("This code isn't under transaction "
@@ -787,7 +790,7 @@ class BaseDatabaseOperations(object):
         """
         if value is None:
             return None
-        if is_aware(value):
+        if timezone.is_aware(value):
             raise ValueError("Django does not support timezone-aware times.")
         return unicode(value)
 
diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
index 04b13aa..19d01ff 100644
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -683,7 +683,8 @@ class DateField(Field):
 
     def pre_save(self, model_instance, add):
         if self.auto_now or (self.auto_now_add and add):
-            value = datetime.date.today()
+            value = connection.transaction_start or timezone.now()
+            value = value.date()
             setattr(model_instance, self.attname, value)
             return value
         else:
@@ -773,7 +774,7 @@ class DateTimeField(DateField):
 
     def pre_save(self, model_instance, add):
         if self.auto_now or (self.auto_now_add and add):
-            value = timezone.now()
+            value = connection.transaction_start or timezone.now()
             setattr(model_instance, self.attname, value)
             return value
         else:
@@ -1206,7 +1207,7 @@ class TimeField(Field):
 
     def pre_save(self, model_instance, add):
         if self.auto_now or (self.auto_now_add and add):
-            value = datetime.datetime.now().time()
+            value = (connection.transaction_start or timezone.now()).time()
             setattr(model_instance, self.attname, value)
             return value
         else:
diff --git a/tests/regressiontests/datatypes/models.py b/tests/regressiontests/datatypes/models.py
index 332ce84..aacd22f 100644
--- a/tests/regressiontests/datatypes/models.py
+++ b/tests/regressiontests/datatypes/models.py
@@ -24,3 +24,5 @@ class Donut(models.Model):
 class RumBaba(models.Model):
     baked_date = models.DateField(auto_now_add=True)
     baked_timestamp = models.DateTimeField(auto_now_add=True)
+    fresh_date = models.DateField(auto_now=True)
+    fresh_timestamp = models.DateTimeField(auto_now=True)
diff --git a/tests/regressiontests/datatypes/tests.py b/tests/regressiontests/datatypes/tests.py
index fb94e83..f23a8a2 100644
--- a/tests/regressiontests/datatypes/tests.py
+++ b/tests/regressiontests/datatypes/tests.py
@@ -93,3 +93,11 @@ class DataTypesTestCase(TestCase):
         # We need to test this this way because datetime.datetime inherits
         # from datetime.date:
         self.assertTrue(isinstance(b.baked_date, datetime.date) and not isinstance(b.baked_date, datetime.datetime))
+
+    def test_datefield_auto_now(self):
+        """Test for #16745, auto_now and auto_now_add should produce identical
+        values when the model is first created."""
+        b = RumBaba.objects.create()
+
+        self.assertEqual(b.baked_timestamp, b.fresh_timestamp)
+        self.assertEqual(b.baked_date, b.fresh_date)
