diff --git a/date_admin.inc b/date_admin.inc
index b18c271..ff8ee84 100644
--- a/date_admin.inc
+++ b/date_admin.inc
@@ -74,6 +74,20 @@ function date_default_formatter_settings_form($field, $instance, $view_mode, $fo
     '#description' => t('Identify specific start and/or end dates in the format YYYY-MM-DDTHH:MM:SS, or leave blank for all available dates.'),
   );
 
+  $form['sort'] = array(
+    '#type' => 'select',
+    '#title' => 'Sort by:',
+    '#options' => array(
+      'default' => 'Default',
+      'desc' => 'Descending',
+      'asc' => 'Ascending',
+    ),
+    '#default_value' => $settings['sort'],
+    '#weight' => 5,
+    '#access' => ($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED) || ($field['cardinality'] > 1),
+    '#description' => t('Identify a specific sorting, or retain default blank.'),
+  );
+
   return $form;
 }
 
diff --git a/date_views/includes/date_views_handler_field_field_date.inc b/date_views/includes/date_views_handler_field_field_date.inc
new file mode 100644
index 0000000..266e5be
--- /dev/null
+++ b/date_views/includes/date_views_handler_field_field_date.inc
@@ -0,0 +1,124 @@
+<?php
+
+/**
+ * @file
+ * Definition of views_handler_field_field.
+ */
+
+class date_views_handler_field_field_date extends views_handler_field_field {
+
+  /**
+   * Returns processed value for field.
+   */
+  function get_value($values, $field = NULL) {
+    // Go ahead and render and store in $this->items.
+    $entity = clone $values->_field_data[$this->field_alias]['entity'];
+
+    $entity_type = $values->_field_data[$this->field_alias]['entity_type'];
+    $langcode = $this->field_language($entity_type, $entity);
+    // If we are grouping, copy our group fields into the cloned entity.
+    // It's possible this will cause some weirdness, but there's only
+    // so much we can hope to do.
+    if (!empty($this->group_fields)) {
+      // first, test to see if we have a base value.
+      $base_value = array();
+      // Note: We would copy original values here, but it can cause problems.
+      // For example, text fields store cached filtered values as
+      // 'safe_value' which doesn't appear anywhere in the field definition
+      // so we can't affect it. Other side effects could happen similarly.
+      $data = FALSE;
+      foreach ($this->group_fields as $field_name => $column) {
+        if (property_exists($values, $this->aliases[$column])) {
+          $base_value[$field_name] = $values->{$this->aliases[$column]};
+          if (isset($base_value[$field_name])) {
+            $data = TRUE;
+          }
+        }
+      }
+
+      // If any of our aggregated fields have data, fake it:
+      if ($data) {
+        // Now, overwrite the original value with our aggregated value.
+        // This overwrites it so there is always just one entry.
+        $entity->{$this->definition['field_name']}[$langcode] = array($base_value);
+      }
+      else {
+        $entity->{$this->definition['field_name']}[$langcode] = array();
+      }
+    }
+
+    // The field we are trying to display doesn't exist on this entity.
+    if (!isset($entity->{$this->definition['field_name']})) {
+      return array();
+    }
+
+    // Sort array based on start dates.
+    if (!empty($entity->{$this->definition['field_name']}[$langcode])
+      && count($entity->{$this->definition['field_name']}[$langcode]) > 1
+      && $this->options['settings']['sort'] != 'default') {
+      $asc = $this->options['settings']['sort'] == 'asc' ? 1 : -1;
+      usort($entity->{$this->definition['field_name']}[$langcode], function($a, $b) use($asc) {
+        return ($a['value'] > $b['value']) ? -1 * $asc : $asc;
+      });
+    }
+
+    // We are supposed to show only certain deltas.
+    if ($this->limit_values && !empty($entity->{$this->definition['field_name']})) {
+      $all_values = !empty($entity->{$this->definition['field_name']}[$langcode]) ? $entity->{$this->definition['field_name']}[$langcode] : array();
+
+      if ($this->options['delta_reversed']) {
+        $all_values = array_reverse($all_values);
+      }
+
+      // Offset is calculated differently when row grouping for a field is
+      // not enabled. Since there are multiple rows, the delta needs to be
+      // taken into account, so that different values are shown per row.
+      if (!$this->options['group_rows'] && isset($this->aliases['delta']) && isset($values->{$this->aliases['delta']})) {
+        $delta_limit = 1;
+        $offset = $values->{$this->aliases['delta']};
+      }
+      // Single fields don't have a delta available so choose 0.
+      elseif (!$this->options['group_rows'] && !$this->multiple) {
+        $delta_limit = 1;
+        $offset = 0;
+      }
+      else {
+        $delta_limit = $this->options['delta_limit'];
+        $offset = intval($this->options['delta_offset']);
+
+        // We should only get here in this case if there's an offset, and
+        // in that case we're limiting to all values after the offset.
+        if ($delta_limit == 'all') {
+          $delta_limit = count($all_values) - $offset;
+        }
+      }
+
+      // Determine if only the first and last values should be shown.
+      $delta_first_last = $this->options['delta_first_last'];
+
+      $new_values = array();
+      for ($i = 0; $i < $delta_limit; $i++) {
+        $new_delta = $offset + $i;
+
+        if (isset($all_values[$new_delta])) {
+          // If first-last option was selected, only use the first and last values.
+          if (!$delta_first_last
+            // Use the first value.
+            || $new_delta == $offset
+            // Use the last value.
+            || $new_delta == ($delta_limit + $offset - 1)) {
+            $new_values[] = $all_values[$new_delta];
+          }
+        }
+      }
+      $entity->{$this->definition['field_name']}[$langcode] = $new_values;
+    }
+
+    if ($field == 'entity') {
+      return $entity;
+    }
+    else {
+      return !empty($entity->{$this->definition['field_name']}[$langcode]) ? $entity->{$this->definition['field_name']}[$langcode] : array();
+    }
+  }
+}
