diff --git a/data.info b/data.info
index 1427723..0c823ac 100644
--- a/data.info
+++ b/data.info
@@ -10,3 +10,4 @@ files[] = includes/DataTable.inc
 files[] = tests/data.test
 files[] = tests/data.test.inc
 files[] = views/views_handler_field_data_markup.inc
+files[] = views/views_handler_field_data_date.inc
diff --git a/data.module b/data.module
index c490d93..28f27d0 100644
--- a/data.module
+++ b/data.module
@@ -152,6 +152,13 @@ function data_get_field_definitions() {
       'size' => 'big',
       'not null' => FALSE,
     ),
+    'date' => array(
+      'type' => 'date',
+      'mysql_type' => 'date',
+      'pgsql_type' => 'date',
+      'sqlite_type' => 'varchar',
+      'length' => 13,
+    ),
     'geometry' => array(
       'type' => 'geometry',
       'mysql_type' => 'geometry',
@@ -315,10 +322,7 @@ function data_build_field_definition($stub) {
     $spec['length'] = 255;
     unset($spec['size']);
   }
-  if ($spec['type'] == 'geometry') {
-    $spec['mysql_type'] = 'geometry';
-    $spec['pgsql_type'] = 'GEOMETRY';
-  }
+  $spec += data_get_field_definition($spec['type']);
   return $spec;
 }
 
diff --git a/data.views.inc b/data.views.inc
index b426790..0743633 100644
--- a/data.views.inc
+++ b/data.views.inc
@@ -250,6 +250,7 @@ function data_get_views_handler_options($type = NULL, $reset = FALSE) {
  * declares it makes use of it.
  */
 function data_data_views_handlers_alter(&$handlers) {
+  $handlers['field']['views_handler_field_data_date'] = 'views_handler_field_data_date';
   $handlers['field']['views_handler_field_data_markup'] = 'views_handler_field_data_markup';
 }
 
@@ -288,6 +289,8 @@ function data_get_views_handler($type, $table, $field_name, $default = FALSE) {
         case 'serial':
         case 'numeric':
           return 'views_handler_field_numeric';
+        case 'date':
+          return 'views_handler_field_data_date';
         case 'datetime':
           return 'views_handler_field_date';
       }
@@ -302,6 +305,9 @@ function data_get_views_handler($type, $table, $field_name, $default = FALSE) {
         case 'serial':
           return 'views_handler_filter_numeric';
         case 'datetime':
+          if (module_exists('date_views')) {
+            return 'date_views_filter_handler';
+          }
           return 'views_handler_filter_date';
       }
       return 'views_handler_filter_string';
@@ -313,7 +319,11 @@ function data_get_views_handler($type, $table, $field_name, $default = FALSE) {
         case 'serial':
         case 'numeric':
           return 'views_handler_argument_numeric';
+        case 'date':
         case 'datetime':
+        if (module_exists('date_views')) {
+          return 'date_views_argument_handler';
+        }
           return 'views_handler_argument_date';
         case 'varchar':
           return 'views_handler_argument_string';
diff --git a/data_ui/data_ui.admin.inc b/data_ui/data_ui.admin.inc
index aaa15ed..62c020b 100644
--- a/data_ui/data_ui.admin.inc
+++ b/data_ui/data_ui.admin.inc
@@ -1198,7 +1198,7 @@ function _data_ui_changed($new, $field) {
     if ($field['type'] == 'text') {
       unset($field['default']);
     }
-    return $field;
+    return data_build_field_definition($field);
   }
   return FALSE;
 }
diff --git a/views/views_handler_field_data_date.inc b/views/views_handler_field_data_date.inc
new file mode 100755
index 0000000..842a761
--- /dev/null
+++ b/views/views_handler_field_data_date.inc
@@ -0,0 +1,19 @@
+<?php
+
+/**
+ * A handler for proper "date" fields.
+ */
+class views_handler_field_data_date extends views_handler_field_date {
+
+  /**
+   * {@inheritdoc}
+   */
+  function get_value($values, $field = NULL) {
+    $value = parent::get_value($values, $field);
+    if ($field === NULL) {
+      $value = strtotime($value);
+    }
+    return $value;
+  }
+
+}
