diff --git a/office_hours.module b/office_hours.module
index efaee1b..6a432fe 100644
--- a/office_hours.module
+++ b/office_hours.module
@@ -18,17 +18,13 @@ 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_week' => $base + array('render element' => 'element'),
     'office_hours_slot' => $base + array('render element' => 'element'),
-    'field_multiple_value_form' => $base + array('render element' => 'element'),
     'office_hours_select' => $base + array('render element' => 'element'),
   );
   return $themes;
 }
 
-function office_hours_theme_registry_alter(&$theme_registry) {
-  $theme_registry['field_multiple_value_form']['function'] = 'office_hours_field_multiple_value_form';
-}
-
 /**
  * Implements hook_form_FORM_ID_alter().
  */
@@ -568,7 +564,7 @@ function office_hours_field_widget_info() {
       'label' => t('Office Hours'),
       'field types' => array('office_hours'),
       'behaviors' => array(
-        'multiple values' => FIELD_BEHAVIOR_DEFAULT,
+        'multiple values' => FIELD_BEHAVIOR_CUSTOM,
         'default value' => FIELD_BEHAVIOR_DEFAULT,
       ),
     ),
@@ -579,13 +575,15 @@ function office_hours_field_widget_info() {
  * Implements hook_field_widget_form().
  */
 function office_hours_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
-  if ($delta == 0) {
-    // This function is called 14 times for each block. We only need to include files once, not 14 times.
-    // @TODO: perhaps it is even better to include it in office_hours_field_multiple_value_form(), which is only called once per page.
-    drupal_add_js(drupal_get_path('module', 'office_hours') . "/office_hours.js", 'file');
-  }
+  drupal_add_js(drupal_get_path('module', 'office_hours') . "/office_hours.js", 'file');
 
-  $items = _office_hours_arrange_items($items);
+  // Arrange items indexed by day.
+  $values = array();
+  foreach ($items as $item) {
+    $values[$item['day']] = $item;
+  }
+  // Additionally arrange based on first day of the week.
+  $items = _office_hours_arrange_day($values);
 
   // Use Date API to obtain valid minutes.
   $minutes = date_minutes('i', FALSE, $field['settings']['granularity']);
@@ -598,26 +596,45 @@ function office_hours_field_widget_form(&$form, &$form_state, $field, $instance,
     $end = $field['settings']['limitend'];
   }
   else {
-    $end =($field['settings']['hoursformat'] == 1) ? 12 : 24; 
+    $end =($field['settings']['hoursformat'] == 1) ? 12 : 24;
   }
   $hours = array('' => '');
   for ($i=$start;$i<=$end;$i++) {
     $hours[$i] = $i < 10 && ($field['settings']['hoursformat'] == 0) ? "0$i" : $i;
   }
 
+  // Prepare generic element.
   $element += array(
     '#type' => 'office_hours_slot',
-    '#default_value' => isset($items[$delta]['starthours']) ? $items[$delta] : NULL,
     '#hours' => drupal_map_assoc($hours),
     '#minutes' => drupal_map_assoc($minutes),
   );
-
   $field_settings = array('hoursformat', 'addhrs', 'valhrs');
   foreach ($field_settings as $key) {
     $element['#' . $key] = $field['settings'][$key];
   }
 
-  return $element;
+  // Build multi element widget.
+  $parents = $form['#parents'];
+  $field_elements = array(
+    '#theme' => 'office_hours_week',
+    '#field_name' => $field['field_name'],
+    '#title' => check_plain($instance['label']),
+    '#required' => $instance['required'],
+    '#description' => field_filter_xss($instance['description']),
+  );
+
+  // @todo review this line when we change 14 values to unlimited.
+  // See @field_multiple_value_form for reference.
+  $max = $field['cardinality'] - 1;
+  for ($delta = 0; $delta <= $max; $delta++) {
+    $element['#default_value'] = isset($items[$delta]['starthours']) ? $items[$delta] : NULL;
+    $element['#delta'] = $delta;
+    $element['#weight'] = $delta;
+    $field_elements[$delta] = $element;
+  }
+
+  return $field_elements;
 }
 
 /**
@@ -672,14 +689,6 @@ function _office_hours_show_ampm($hours) {
   return $hours;
 }
 
-function _office_hours_arrange_items($items) {
-  $days = array();
-  foreach ($items as $item) {
-    $days[$item['day']] = $item;
-  }
-  return $days;
-}
-
 function _office_hours_arrange_day($items) {
   $first = variable_get('date_first_day', 0);
   while ($first > 0) :
diff --git a/office_hours.theme.inc b/office_hours.theme.inc
index f773ff9..6baf92c 100644
--- a/office_hours.theme.inc
+++ b/office_hours.theme.inc
@@ -123,83 +123,34 @@ function theme_office_hours_select($vars) {
 }
 
 /**
- * copied from content module's theme_content_multiple_values- we're taking out the draggable feature.
- *
- * Theme the hour table form
- *
+ * Theme function for office_hours widget.
  */
-function office_hours_field_multiple_value_form($variables) {
-  // Use Field's theme function for non-office hours fields.
-  if (empty($variables['element'][0]['#type']) || $variables['element'][0]['#type'] != 'office_hours') {
-    return theme_field_multiple_value_form($variables);
-  }
-
-  // The following is a copy from standard theme_field_multiple_value_form()
-  // http://api.drupal.org/api/drupal/modules%21field%21field.form.inc/function/theme_field_multiple_value_form/7
-  // Modifications for the Office Hours form are commented out.
-  // We've removed the columns 'order' and 'drag&drop', and do not add the drap&drop JS.
-
+function theme_office_hours_week($variables) {
   $element = $variables['element'];
   $output = '';
-  if ($element['#cardinality'] > 1 || $element['#cardinality'] == FIELD_CARDINALITY_UNLIMITED) {
-    $table_id = drupal_html_id($element['#field_name'] . '_values');
-    $order_class = $element['#field_name'] . '-delta-order';
-    $required = !empty($element['#required']) ? theme('form_required_marker', $variables) : '';
-
-    $header = array(
-      array(
-        'data' => '<label>' . t('!title: !required', array('!title' => $element['#title'], '!required' => $required)) . "</label>",
-        'colspan' => 2,
-        'class' => array('field-label'),
-      ),
-//      t('Order'),
+  $table_id = drupal_html_id($element['#field_name'] . '_values');
+  $required = !empty($element['#required']) ? theme('form_required_marker', $variables) : '';
+
+  $header = array(
+    array(
+      'data' => '<label>' . t('!title: !required', array('!title' => $element['#title'], '!required' => $required)) . "</label>",
+      'colspan' => 2,
+      'class' => array('field-label'),
+    ),
+  );
+  $rows = array();
+  // Add the elements as table rows.
+  foreach (element_children($element) as $key) {
+    $rows[] = array(
+      drupal_render($element[$key])
     );
-    $rows = array();
-
-    // Sort items according to '_weight' (needed when the form comes back after
-    // preview or failed validation)
-    $items = array();
-    foreach (element_children($element) as $key) {
-      if ($key === 'add_more') {
-        $add_more_button = &$element[$key];
-      }
-      else {
-        $items[] = &$element[$key];
-      }
-    }
-    usort($items, '_field_sort_items_value_helper');
-
-    $items = _office_hours_arrange_day($items); //this calls the function that arranges the first day of the week.
-
-    // Add the items as table rows.
-    foreach ($items as $key => $item) {
-      $item['_weight']['#attributes']['class'] = array($order_class);
-      $delta_element = drupal_render($item['_weight']);
-      $cells = array(
-//        array('data' => '', 'class' => array('field-multiple-drag')),
-        drupal_render($item),
-//        array('data' => $delta_element, 'class' => array('delta-order')),
-      );
-      $rows[] = array(
-        'data' => $cells,
-//        'class' => array('draggable'),
-      );
-    }
-
-    $output = '<div class="form-item">';
-    $output .= theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => $table_id, 'class' => array('field-multiple-table'))));
-    $output .= $element['#description'] ? '<div class="description">' . $element['#description'] . '</div>' : '';
-    $output .= '<div class="clearfix">' . drupal_render($add_more_button) . '</div>';
-    $output .= '</div>';
-
-//    drupal_add_tabledrag($table_id, 'order', 'sibling', $order_class);
-  }
-  else {
-    foreach (element_children($element) as $key) {
-      $output .= drupal_render($element[$key]);
-    }
   }
 
+  $output = '<div class="form-item">';
+  $output .= theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => $table_id, 'class' => array('field-multiple-table'))));
+  $output .= $element['#description'] ? '<div class="description">' . $element['#description'] . '</div>' : '';
+  $output .= '</div>';
+
   return $output;
 }
 
