diff --git a/volunteer_total_calculated_work/volunteer_total_calculated_work.features.content.inc b/volunteer_total_calculated_work/volunteer_total_calculated_work.features.content.inc
new file mode 100644
index 0000000..e008d26
--- /dev/null
+++ b/volunteer_total_calculated_work/volunteer_total_calculated_work.features.content.inc
@@ -0,0 +1,79 @@
+<?php
+
+/**
+ * Implementation of hook_content_default_fields().
+ */
+function volunteer_total_calculated_work_content_default_fields() {
+  $fields = array();
+
+  // Exported field: field_shift_duration
+  $fields['signup-field_shift_duration'] = array(
+    'field_name' => 'field_shift_duration',
+    'type_name' => 'signup',
+    'display_settings' => array(
+      'weight' => '9',
+      'parent' => '',
+      'label' => array(
+        'format' => 'hidden',
+      ),
+      'teaser' => array(
+        'format' => 'hidden',
+        'exclude' => 0,
+      ),
+      'full' => array(
+        'format' => 'hidden',
+        'exclude' => 0,
+      ),
+      '4' => array(
+        'format' => 'default',
+        'exclude' => 0,
+      ),
+      '2' => array(
+        'format' => 'default',
+        'exclude' => 0,
+      ),
+      '3' => array(
+        'format' => 'default',
+        'exclude' => 0,
+      ),
+      'token' => array(
+        'format' => 'default',
+        'exclude' => 0,
+      ),
+    ),
+    'widget_active' => '1',
+    'type' => 'computed',
+    'required' => '0',
+    'multiple' => '0',
+    'module' => 'computed_field',
+    'active' => '1',
+    'code' => '$from = strtotime($node->field_signup_start_time[\'0\'][\'value\']);
+$to = strtotime($node->field_signup_end_time[\'0\'][\'value\']);
+// format so it looks like 1.5 for something an hour and a half long
+$duration = round((($to-$from)/60)/60 , 3);
+//this is specific to computed_field module
+  $node_field[0][\'value\'] = $duration;',
+    'display_format' => '$display = $node_field_item[\'value\'] . \' hours\';',
+    'store' => 1,
+    'data_type' => 'float',
+    'data_length' => '6',
+    'data_not_NULL' => 0,
+    'data_default' => '',
+    'data_sortable' => 1,
+    'widget' => array(
+      'default_value' => NULL,
+      'default_value_php' => NULL,
+      'label' => 'Shift Duration',
+      'weight' => '9',
+      'description' => '',
+      'type' => 'computed',
+      'module' => 'computed_field',
+    ),
+  );
+
+  // Translatables
+  // Included for use with string extractors like potx.
+  t('Shift Duration');
+
+  return $fields;
+}
diff --git a/volunteer_total_calculated_work/volunteer_total_calculated_work.features.inc b/volunteer_total_calculated_work/volunteer_total_calculated_work.features.inc
new file mode 100644
index 0000000..4bacf69
--- /dev/null
+++ b/volunteer_total_calculated_work/volunteer_total_calculated_work.features.inc
@@ -0,0 +1,10 @@
+<?php
+
+/**
+ * Implementation of hook_views_api().
+ */
+function volunteer_total_calculated_work_views_api() {
+  return array(
+    'api' => '2',
+  );
+}
diff --git a/volunteer_total_calculated_work/volunteer_total_calculated_work.features.user_permission.inc b/volunteer_total_calculated_work/volunteer_total_calculated_work.features.user_permission.inc
new file mode 100644
index 0000000..f301038
--- /dev/null
+++ b/volunteer_total_calculated_work/volunteer_total_calculated_work.features.user_permission.inc
@@ -0,0 +1,18 @@
+<?php
+
+/**
+ * Implementation of hook_user_default_permissions().
+ */
+function volunteer_total_calculated_work_user_default_permissions() {
+  $permissions = array();
+
+  // Exported permission: view field_shift_duration
+  $permissions['view field_shift_duration'] = array(
+    'name' => 'view field_shift_duration',
+    'roles' => array(
+      '0' => 'authenticated user',
+    ),
+  );
+
+  return $permissions;
+}
diff --git a/volunteer_total_calculated_work/volunteer_total_calculated_work.info b/volunteer_total_calculated_work/volunteer_total_calculated_work.info
new file mode 100644
index 0000000..60399ae
--- /dev/null
+++ b/volunteer_total_calculated_work/volunteer_total_calculated_work.info
@@ -0,0 +1,14 @@
+core = "6.x"
+dependencies[] = "computed_field"
+dependencies[] = "content_permissions"
+dependencies[] = "features"
+dependencies[] = "views_calc"
+description = "View tab of all the work a volunteer has done."
+features[content][] = "signup-field_shift_duration"
+features[user_permission][] = "view field_shift_duration"
+features[views][] = "volunteer_calculated_total_work"
+features[views_api][] = "api:2"
+name = "Volunteer total calculated work"
+package = "Features"
+project = "volunteer_total_calculated_work"
+version = "6.x-1.0"
diff --git a/volunteer_total_calculated_work/volunteer_total_calculated_work.module b/volunteer_total_calculated_work/volunteer_total_calculated_work.module
new file mode 100644
index 0000000..6120b99
--- /dev/null
+++ b/volunteer_total_calculated_work/volunteer_total_calculated_work.module
@@ -0,0 +1,23 @@
+<?php
+
+include_once('volunteer_total_calculated_work.features.inc');
+
+/**
+ * Implements hook_update_N.
+ */
+function volunteer_total_calculated_work_update_6000(&$sandbox) {
+  //Grab all the signup nodes.
+  $type = 'signup';
+  $query = "SELECT nid FROM {node} WHERE type = '%s'";
+  $rows = db_query($query, $type);
+  $count = 0;
+  while ($row = db_fetch_object($rows)) {
+    // Load the node object.
+    $node = node_load($row->nid);
+    //Resave them with the calculated field (duration).
+    node_save($node);
+    $count++;
+  }
+  drupal_set_message(t('Updated %count %type nodes.', array('%count' => $count, '%type' => $type)));
+  return array('success' => TRUE, 'sql' => 'Updated %count %type nodes.', array('%count' => $count, '%type' => $type));
+}
diff --git a/volunteer_total_calculated_work/volunteer_total_calculated_work.views_default.inc b/volunteer_total_calculated_work/volunteer_total_calculated_work.views_default.inc
new file mode 100644
index 0000000..2009bb9
--- /dev/null
+++ b/volunteer_total_calculated_work/volunteer_total_calculated_work.views_default.inc
@@ -0,0 +1,254 @@
+<?php
+
+/**
+ * Implementation of hook_views_default_views().
+ */
+function volunteer_total_calculated_work_views_default_views() {
+  $views = array();
+
+  // Exported view: volunteer_calculated_total_work
+  $view = new view;
+  $view->name = 'volunteer_calculated_total_work';
+  $view->description = '';
+  $view->tag = '';
+  $view->view_php = '';
+  $view->base_table = 'node';
+  $view->is_cacheable = FALSE;
+  $view->api_version = 2;
+  $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+  $handler = $view->new_display('default', 'Defaults', 'default');
+  $handler->override_option('fields', array(
+    'field_signup_shift_nid' => array(
+      'label' => 'Shift',
+      'alter' => array(
+        'alter_text' => 0,
+        'text' => '',
+        'make_link' => 0,
+        'path' => '',
+        'link_class' => '',
+        'alt' => '',
+        'prefix' => '',
+        'suffix' => '',
+        'target' => '',
+        'help' => '',
+        'trim' => 0,
+        'max_length' => '',
+        'word_boundary' => 1,
+        'ellipsis' => 1,
+        'html' => 0,
+        'strip_tags' => 0,
+      ),
+      'empty' => '',
+      'hide_empty' => 0,
+      'empty_zero' => 0,
+      'link_to_node' => 0,
+      'label_type' => 'widget',
+      'format' => 'default',
+      'multiple' => array(
+        'group' => TRUE,
+        'multiple_number' => '',
+        'multiple_from' => '',
+        'multiple_reversed' => FALSE,
+      ),
+      'exclude' => 0,
+      'id' => 'field_signup_shift_nid',
+      'table' => 'node_data_field_signup_shift',
+      'field' => 'field_signup_shift_nid',
+      'relationship' => 'none',
+    ),
+    'field_shift_duration_value' => array(
+      'label' => 'Shift Duration',
+      'alter' => array(
+        'alter_text' => 1,
+        'text' => '[field_shift_duration_value] hours',
+        'make_link' => 0,
+        'path' => '',
+        'link_class' => '',
+        'alt' => '',
+        'prefix' => '',
+        'suffix' => '',
+        'target' => '',
+        'help' => '',
+        'trim' => 0,
+        'max_length' => '5',
+        'word_boundary' => 0,
+        'ellipsis' => 0,
+        'html' => 0,
+        'strip_tags' => 0,
+      ),
+      'empty' => '',
+      'hide_empty' => 0,
+      'empty_zero' => 0,
+      'link_to_node' => 0,
+      'label_type' => 'widget',
+      'format' => 'computed_value',
+      'multiple' => array(
+        'group' => TRUE,
+        'multiple_number' => '',
+        'multiple_from' => '',
+        'multiple_reversed' => FALSE,
+      ),
+      'exclude' => 0,
+      'id' => 'field_shift_duration_value',
+      'table' => 'node_data_field_shift_duration',
+      'field' => 'field_shift_duration_value',
+      'relationship' => 'none',
+    ),
+  ));
+  $handler->override_option('arguments', array(
+    'uid' => array(
+      'default_action' => 'ignore',
+      'style_plugin' => 'default_summary',
+      'style_options' => array(),
+      'wildcard' => 'all',
+      'wildcard_substitution' => 'All',
+      'title' => 'Total hours worked for %1',
+      'breadcrumb' => '',
+      'default_argument_type' => 'fixed',
+      'default_argument' => '',
+      'validate_type' => 'none',
+      'validate_fail' => 'not found',
+      'break_phrase' => 0,
+      'not' => 0,
+      'id' => 'uid',
+      'table' => 'users',
+      'field' => 'uid',
+      'validate_user_argument_type' => 'uid',
+      'validate_user_roles' => array(
+        '2' => 0,
+        '4' => 0,
+        '3' => 0,
+      ),
+      'relationship' => 'none',
+      'default_options_div_prefix' => '',
+      'default_argument_fixed' => '',
+      'default_argument_user' => 0,
+      'default_argument_php' => '',
+      'validate_argument_node_type' => array(
+        'group_confirmation' => 0,
+        'profile' => 0,
+        'priority_code' => 0,
+        'signup' => 0,
+        'group' => 0,
+        'shift' => 0,
+        'page' => 0,
+      ),
+      'validate_argument_node_access' => 0,
+      'validate_argument_node_access_op' => 'view',
+      'validate_argument_nid_type' => 'nid',
+      'validate_argument_vocabulary' => array(),
+      'validate_argument_type' => 'tid',
+      'validate_argument_transform' => 0,
+      'validate_user_restrict_roles' => 0,
+      'validate_argument_php' => '',
+      'override' => array(
+        'button' => 'Override',
+      ),
+    ),
+  ));
+  $handler->override_option('filters', array(
+    'type' => array(
+      'operator' => 'in',
+      'value' => array(
+        'signup' => 'signup',
+      ),
+      'group' => '0',
+      'exposed' => FALSE,
+      'expose' => array(
+        'operator' => FALSE,
+        'label' => '',
+      ),
+      'id' => 'type',
+      'table' => 'node',
+      'field' => 'type',
+      'relationship' => 'none',
+    ),
+    'field_signup_status_value_many_to_one' => array(
+      'operator' => 'or',
+      'value' => array(
+        '1' => '1',
+      ),
+      'group' => '0',
+      'exposed' => FALSE,
+      'expose' => array(
+        'operator' => FALSE,
+        'label' => '',
+      ),
+      'id' => 'field_signup_status_value_many_to_one',
+      'table' => 'node_data_field_signup_status',
+      'field' => 'field_signup_status_value_many_to_one',
+      'relationship' => 'none',
+      'reduce_duplicates' => 0,
+    ),
+  ));
+  $handler->override_option('access', array(
+    'type' => 'none',
+  ));
+  $handler->override_option('cache', array(
+    'type' => 'none',
+  ));
+  $handler->override_option('empty', 'You haven\'t completed any shifts, please come back after you have completed at least one shift.');
+  $handler->override_option('empty_format', '1');
+  $handler->override_option('items_per_page', 0);
+  $handler->override_option('distinct', 0);
+  $handler->override_option('style_plugin', 'views_calc');
+  $handler->override_option('style_options', array(
+    'grouping' => '',
+    'override' => 1,
+    'sticky' => 0,
+    'order' => 'desc',
+    'columns' => array(
+      'field_signup_shift_nid' => 'field_signup_shift_nid',
+      'field_shift_duration_value' => 'field_shift_duration_value',
+      'nid' => 'nid',
+    ),
+    'info' => array(
+      'field_signup_shift_nid' => array(
+        'separator' => '',
+        'justification' => 'views_calc_justify_left',
+        'has_calc' => 0,
+        'calc' => array(
+          'MAX' => 'MAX',
+        ),
+      ),
+      'field_shift_duration_value' => array(
+        'sortable' => 0,
+        'separator' => '',
+        'justification' => 'views_calc_justify_left',
+        'has_calc' => 1,
+        'calc' => array(
+          'SUM' => 'SUM',
+        ),
+      ),
+      'nid' => array(
+        'sortable' => 0,
+        'separator' => '',
+        'justification' => 'views_calc_justify_left',
+        'has_calc' => 0,
+        'calc' => array(),
+      ),
+    ),
+    'default' => '-1',
+    'detailed_values' => '0',
+  ));
+  $handler = $view->new_display('page', 'Page', 'page_1');
+  $handler->override_option('path', 'user/%/total_hours_worked');
+  $handler->override_option('menu', array(
+    'type' => 'tab',
+    'title' => 'Total hours worked',
+    'description' => 'Number of total hours worked, ever.',
+    'weight' => '0',
+    'name' => 'navigation',
+  ));
+  $handler->override_option('tab_options', array(
+    'type' => 'none',
+    'title' => '',
+    'description' => '',
+    'weight' => 0,
+    'name' => 'navigation',
+  ));
+
+  $views[$view->name] = $view;
+
+  return $views;
+}
