diff --git a/office_hours.css b/office_hours.css
index 6d438cb..4d49916 100644
--- a/office_hours.css
+++ b/office_hours.css
@@ -7,7 +7,10 @@
 
 .oh-display-label {
   display: inline-block; /* give each label the same width, to align the hours. */
-  min-width: 9em;
+  min-width: 6em;
+}
+.oh-display-grouped  .oh-display-label{
+  min-width: 11em;
 }
 
 .oh-display-hours {
diff --git a/office_hours.module b/office_hours.module
index 3559105..7031043 100644
--- a/office_hours.module
+++ b/office_hours.module
@@ -18,6 +18,7 @@ function office_hours_theme ($existing, $type, $theme, $path) {
   );
   $themes = array(
     'office_hours_formatter_default' => $base + array('render element' => 'element'),
+    'office_hours_time_range' => $base + array('render element' => 'element'),
     'office_hours' => $base + array('render element' => 'element'),
     'field_multiple_value_form' => $base + array('render element' => 'element'),
     'office_hours_select' => $base + array('render element' => 'element'),
@@ -282,6 +283,32 @@ function office_hours_field_formatter_settings_form($field, $instance, $view_mod
     '#default_value' => $settings['separator_more_hours'],
     '#description' => t('This separator will be placed between the hours and more_hours of a day.'),
   );
+  
+  $form['current_status'] = array(
+    '#title' => t('Current status'),
+    '#type' => 'fieldset',
+  );
+  $form['current_status']['position'] = array(
+    '#type' => 'select',
+    '#title' => t('Current status position'),
+    '#options' => array(0 => t('Hidden'), 1 => t('Before hours'), 2 => t('After hours')),
+    '#default_value' => $settings['current_status']['position'],
+    '#description' => t('Where should the current status be located?'),
+  );
+  $form['current_status']['open_text'] = array(
+    '#title' => t('Formatting'),
+    '#type' => 'textfield',
+    '#size' => 40,
+    '#default_value' => $settings['current_status']['open_text'],
+    '#description' => t('Format of the message displayed when currently open. You can use translatable text (do not use quotes) and HTML in this field.'),
+  );
+  $form['current_status']['closed_text'] = array(
+    '#type' => 'textfield',
+    '#size' => 40,
+    '#default_value' => $settings['current_status']['closed_text'],
+    '#description' => t('Format of message displayed when currently closed. You can use translatable text (do not use quotes) and HTML in this field.'),
+  );
+
 
   return $form;
 }
@@ -378,6 +405,25 @@ function office_hours_views_api() {
   );
 }
 
+/**
+ * Theme function for formatting time ranges
+ */
+function theme_office_hours_time_range($vars = array()) {
+  $vars += array(
+    'times' => array(
+      'start' => '',
+      'end' => '',
+    ),
+    'format' => 'G:i',
+    'separator' => ' - ',
+  );
+    
+  $startDT = new DateObject(_office_hours_mil_to_tf($vars['times']['start']));
+  $endDT   = new DateObject(_office_hours_mil_to_tf($vars['times']['end']));
+  
+  return $startDT->format($vars['format']) . $vars['separator'] . $endDT->format($vars['format']);
+}
+
 function _office_hours_show_ampm($hours) {
   foreach($hours as $key=> $hour) {
    if (!empty($hour)) {
@@ -510,7 +556,7 @@ function _office_hours_set_weight($items) {
 }
 
 function _office_hours_field_formatter_defaults($settings = array()) {
-  return array_merge(array(
+  return array_replace_recursive(array(
     'daysformat' => 'long',
     'hoursformat' => 0, // '12'/'24'/'HH:mm',
     'compress' => FALSE,
@@ -521,7 +567,12 @@ function _office_hours_field_formatter_defaults($settings = array()) {
     'separator_grouped_days' => ' - ',
     'separator_day_hours' => ': ',
     'separator_hours_hours' => '-',
-    'separator_more_hours' => ', ',  
+    'separator_more_hours' => ', ',
+    'current_status' => array(
+      'position' => 0,
+      'open_text' => 'Currently Open!',
+      'closed_text' => 'Currently Closed',
+    ),
   ), $settings);
 }
 
diff --git a/office_hours.theme.inc b/office_hours.theme.inc
index 865fd5d..c584fe0 100644
--- a/office_hours.theme.inc
+++ b/office_hours.theme.inc
@@ -9,196 +9,204 @@
  * Theme function for 'default' text field formatter.
  */
 function office_hours_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
-  $element = array();
-  if ($items) {
-    $element[0] = array('#markup' => theme($field['type'] . '_formatter_default',
-                                           array('element' => $items,
-                                                 //'field' => $instance,
-                                                 'display' => $display,
-                                                 )),);
+  if (!$items) {
+    return array();
   }
-  return $element;
-}
-
-/**
- * Theme function for field formatter.
- * Adapted for 2 types:
- * - default, 'normal', tabular format
- * - inline format, adapted for use in interfaces such as Google Places.
- * This is put in 1 function, since there is a lot of pre-processing before the actual formatting,
- * So you'll find 2 parts: part1 = Preprocessing, part2 = Formatting, depending on the choosen formatter.
- * @TODO: use e.g. strtotime() / Date_module http://php.net/manual/en/function.date.php functions for proper time formatting.
- */
-function theme_office_hours_formatter_default($vars) {
-  $element = $vars['element'];
-  $settings = $vars['display']['settings'];
-  $max_label_length = 3; // This is the minimum width for day labels. It is adjusted when adding new labels.
-
-  $settings['separator_grouped_days'] = isset($settings['separator_grouped_days']) ? $settings['separator_grouped_days'] : ' - ';
-
-  $show_closed = !empty($settings['showclosed']); // D7-version
-  //  $show_closed = $field['showclosed']; // D6-version
 
-  // Get the label per weekday.
-  $settings['daysformat']= (isset($settings['daysformat'])) ? $settings['daysformat'] : 'none';
+  $element = array();
+  $settings = _office_hours_field_formatter_defaults($display['settings']);
+  
   switch ($settings['daysformat']) {
+    case 'number':
+      $weekdays = range(1,7);
+      break;
+    case 'none':
+      $weekdays = array_fill(0, 7, '');
+      break;
     case 'long':
       $weekdays = date_week_days(TRUE);
       break;
     case 'short':
-      $weekdays = date_week_days_abbr(TRUE, TRUE, 3); // Abbreviate up to 3 characters
-      break;
-    case 'number':
-      $weekdays = array(0 => 1, 1 => 2, 2 => 3, 3 => 4, 4 => 5, 5 => 6, 6 => 7 );
-      break;
-    case 'none':
-      $weekdays = array(0 => '', 1 => '', 2 => '', 3 => '', 4 => '', 5 => '', 6 => '' );
-      $settings['separator_day_hours'] = '';  // override user's setting if daysformat = 'none'. (Should we?)
+    default:
+      $weekdays = date_week_days_abbr(TRUE, TRUE, 3);
       break;
   }
+  
+  $firstDay = variable_get('date_first_day', 0);
+  $open = false;
+  $currentDT = new DateObject('now');
+  $currentDay = (int)$currentDT->format('N') % 7;
+  
+  // Populate days and times
+  $lines = array();
+  for ($i = 0; $i < 7; $i++) {
+    $lines[$i] = array(
+      'startday'    => $i,
+      'endday'      => null,
+      'times'       => array(),
+      'current'     => false,
+    );
+  }
 
-  $items = array();
-  // Format the 'hours', e.g. 0900 -> 09:00.
-  foreach (element_children($element) as $key => $arraykey) {
-    $item = $element[$arraykey];
-    $day = (int)($item['day'] / 2); // Keys are 0+1 for sunday, 2+3 for monday, etc. Each day may have normal hours + extra hours.
-    if (isset($day)) {
-      // @TODO: use e.g. strtotime() or Date_module for standard time formatting. See http://php.net/manual/en/function.date.php.
-      $strhrs = _office_hours_mil_to_tf(check_plain($item['starthours']));
-      $endhrs = _office_hours_mil_to_tf(check_plain($item['endhours']));
-      if (!empty($settings['hoursformat'])) {
-        $strhrs = _office_hours_convert_to_ampm($strhrs);
-        $endhrs = _office_hours_convert_to_ampm($endhrs);
-      }
+  foreach (element_children($items) as $key => $arraykey) {
+    $el  = $items[$arraykey];
+    $day = (int)($el['day'] / 2);
+    $alt = (int)($el['day'] % 2);
+    
+    $start  = check_plain($el['starthours']);
+    $end    = check_plain($el['endhours']);
+    
+    $lines[$day]['times'][$alt]['start']  = $start;
+    $lines[$day]['times'][$alt]['end']    = $end;
+    
+    // Calculate start and end times
+    $startDT = new DateObject(_office_hours_mil_to_tf($start), NULL, 'G:i');
+    $endDT = new DateObject(_office_hours_mil_to_tf($end), NULL, 'G:i');
+    
+    $startDT->granularity = $endDT->granularity = array('hour','minute','second');
 
-      $items[$day][] = array('strhrs' => $strhrs, 'endhrs' => $endhrs) ; // We're aggregating hours for days together.
-      $items[$day]['label'] = $weekdays[$day];
-      $max_label_length = max( $max_label_length, strlen($items[$day]['label']));
+    if ($currentDay == ($day+1)%7) {
+      $currentDT->modify('-1 day');
+      $startDT = @$startDT->merge($currentDT);
+      $endDT = @$endDT->merge($currentDT);
+      $currentDT->modify('+1 day');
+    }
+    else {
+      $startDT = @$startDT->merge($currentDT);
+      $endDT = @$endDT->merge($currentDT);
+    }
 
-      // Add group_id to group days with equal hours.
-      
-      if (!empty($settings['grouped'])) {
-        $group_id = "$strhrs::$endhrs";
-        if (!isset ($items[$day]['group_id'])) {
-          $items[$day]['group_id'] = $group_id;
-        }
-        else { // more hours info.
-          $items[$day]['group_id'] .= '-'. $group_id;
-        }
-      }
+    if ($startDT->difference($endDT, 'seconds', FALSE) < 0) {
+      $endDT->modify('+1 day');
+    }
+    
+    if ($startDT->difference($currentDT, 'seconds', FALSE) > 0 &&
+        $endDT->difference($currentDT, 'seconds', FALSE) < 0) {
+        $open = true;
+        $lines[$day]['current'] = true;
     }
   }
-
-  // add the closed days again, to 1) sort by first_day_of_week and 2) toggle show on/off
-  foreach ($weekdays as $day => $label) {
-    if (!array_key_exists($day, $items)) {
-      $items[$day][]= array('closed' => 'closed'); //silly, but we need this as an array because we can't use a string offset later
-      $items[$day]['label'] = $weekdays[$day];
-      $max_label_length = max($max_label_length, strlen($items[$day]['label']));
-
-      // Add group_id for closed days
-      if (!empty($settings['grouped'])) {
-        $group_id = 'closed';
-        $items[$day]['group_id'] = $group_id;
+  
+  // Check if we're compressing times
+  if ($settings['compress']) {
+    foreach ($lines as $day => &$info) {
+      if (isset($info['times'][0]) && isset($info['times'][1])) {
+        $info['times'][0]['start'] = min($info['times'][0]['start'], $info['times'][1]['start']);
+        $info['times'][0]['end']   = max($info['times'][0]['end'], $info['times'][1]['end']);
+        unset($info['times'][1]);
       }
     }
   }
-
-  // Sort the days of the week again, because sorting is lost by adding the closed days.
-  ksort($items);
-  // Sort by first_day_of_week, except for certain types: 'number'/'none' are more frequently used by machines/interfaces.
-  switch ($settings['daysformat']) {
-    case 'long':
-    case 'short':
-      $items = date_week_days_ordered($items);
-      $weekdays = date_week_days_ordered($weekdays);
-      break;
-    case 'number':
-    case 'none':
-      break;
-  }
-
-  // Change label for grouped days.
-  if (!empty($settings['grouped'])) {
-    $group_id = '';
-
-    foreach ($items as $day => $hours) {
-      if ($group_id != $hours['group_id']) {
-        // new group, save label of first day.
-        $group_id = $hours['group_id'];
-        $group_from_label = $hours['label'];
+  
+  // Resort array to for the correct starting day
+  $i = 0;
+  while ($i++ < $firstDay) array_push($lines, array_shift($lines));
+  
+  // Check if we're grouping days
+  if ($settings['grouped']) {
+    $times = $lines[0]['times'];
+    
+    for ($i = 1; $i < 7; $i++) {
+      if ($times != $lines[$i]['times']) {
+        $times = $lines[$i]['times'];
       }
       else {
-        // second, third day of group: adjust the label of this group to e.g. 'mon-wed'
-        $items[$day]['label'] = $group_from_label . $settings['separator_grouped_days'] . $hours['label'];
-        $max_label_length = max($max_label_length, strlen($items[$day]['label']));
-        // delete previous item of this group, so it will not be shown.
-        unset ($items[$day-1]);
+        $lines[$i]['endday']      = $lines[$i]['startday'];
+        $lines[$i]['startday']    = $lines[$i-1]['startday'];
+        $lines[$i]['current']     = $lines[$i]['current'] || $lines[$i-1]['current'];
+        unset($lines[$i-1]);
       }
     }
   }
 
-  // Finally, generate the formatter output.
-  $output = '';
-  $values = array();
-  $separator_hours = !empty($settings['separator_hours_hours']) ? $settings['separator_hours_hours'] : '';  
-  $separator_days = !empty($settings['separator_days']) ? $settings['separator_days'] : '';
-  foreach ($items as $day => $hours) {
-    $closed = '';
-    $regular = '';
-    $additional = '';
-    if ( isset($hours[0]['closed']) ) {
-      if ( $show_closed ) {
-        // Format the empty day with a text like 'Closed' or '00:00-00:00'
-          $closed = check_plain( t($settings['closedformat'] ) ); // D7-version
-//          $closed = $hours[0]['closed'] ; // D6-version
-      }
-      else {
-        // Don't output unnecessary fields.
-      }
+  $element[] = array(
+    '#markup' => theme(
+      $field['type'] . '_formatter_default',
+      array(
+        'element' => $items,
+        'display' => $display,
+        'lines' => $lines,
+        'settings' => $settings,
+        'weekdays' => $weekdays,
+        'open' => $open,
+      )
+    ),
+  );
+
+  return $element;
+}
+
+/**
+ * Theme function for field formatter.
+ * Adapted for 2 types:
+ * - default, 'normal', tabular format
+ * - inline format, adapted for use in interfaces such as Google Places.
+ * This is put in 1 function, since there is a lot of pre-processing before the actual formatting,
+ * So you'll find 2 parts: part1 = Preprocessing, part2 = Formatting, depending on the choosen formatter.
+ */
+function theme_office_hours_formatter_default($vars) {
+  $lines = $vars['lines'];
+  $settings = $vars['settings'];
+  $weekdays = $vars['weekdays'];
+  $open = $vars['open'];
+  
+  // Display results
+  $HTML = '';
+  foreach ($lines as $id => $info) {
+    if (!$info['times'] && !$settings['showclosed']) {
+      continue;
+    }
+    
+    // Format the label
+    $label = $info['endday'] ? $weekdays[$info['startday']] . $settings['separator_grouped_days'] . $weekdays[$info['endday']] : $weekdays[$info['startday']];
+    $label .= $settings['separator_day_hours'];
+    
+    // Format the time
+    if (!$info['times']) {
+      $times = check_plain( t($settings['closedformat'] ) );
     }
     else {
-      $strhrs1 = $hours[0]['strhrs'];
-      $endhrs1 = $hours[0]['endhrs'];
-      if ( isset($hours[1] ) ) {
-        if (!$settings['compress']) {
-          $strhrs2 = $hours[1]['strhrs'];
-          $endhrs2 = $hours[1]['endhrs'];
-          $additional = $settings['separator_more_hours'] . $strhrs2 . $separator_hours . $endhrs2;
-        }
-        else {
-          // Override endhours of morning with endhours of evening.
-          $endhrs1 = $hours[1]['endhrs'];
+      $times = array();
+      for ($i = 0; $i < 2; $i++) {
+        if (isset($info['times'][$i])) {
+          $times[] = theme(
+                      'office_hours_time_range',
+                      array(
+                        'times'       => $info['times'][$i],
+                        'format'      => empty($settings['hourformat']) ? 'G:i' : 'g:i',
+                        'separator'   => $settings['separator_hours_hours'],
+                      )
+                    );
         }
       }
-      $regular = $strhrs1 . $separator_hours . $endhrs1;
+      
+      $times = implode($settings['separator_more_hours'], $times);
     }
 
-    $output_hours = $closed . $regular . $additional;
-    if (!empty($output_hours)) {
-      $output .= '<span class="oh-display">'
-               .   '<span class="oh-display-label" style="width: ' . ($max_label_length * 0.70) . 'em; ">'
-               .     $hours['label']
-               .     $settings['separator_day_hours']
-               .   '</span>';
-      if ($closed) {
-        $output .= '<span class="oh-display-closed">'
-                 .   $closed . $regular . $additional
-                 .   $settings['separator_days']
-                 . '</span>';
-      }
-      else {
-        $output .= '<span class="oh-display-hours">'
-                 .   $closed . $regular . $additional
-                 .   $separator_days
-                 . '</span>';
-
-      }
-      $output .= '</span>';
+    // Generate HTML
+    $HTML .=
+      '<span class="oh-display"><span class="oh-display-label">' . $label . '</span>' .
+      '<span class="oh-display-times oh-display-' . (!$info['times'] ? 'closed' : 'hours') .
+      ($info['current'] ? ' oh-display-current' : '') . '">' .
+      $times . $settings['separator_days'] . '</span></span>';
+  }
+  
+  // Display status
+  if ($settings['current_status']['position']) {
+    $message = $open ? $settings['current_status']['open_text'] : $settings['current_status']['closed_text'];
+    $message = '<span class="oh-display-status">' . check_plain(t($message)) . $settings['separator_days'] . '</span>';
+    
+    if ($settings['current_status']['position'] == 1) {
+      $HTML = $message . $HTML;
+    }
+    else {
+      $HTML .= $message;
     }
   }
-
-  return $output;
+  
+  $HTML = '<span class="oh-wrapper' . ($settings['grouped'] ? ' oh-display-grouped' : '' ) . '">' . $HTML . '</span>';
+  
+  return $HTML;
 }
 
 function theme_office_hours($vars) {
