diff --git a/cod_session/cod_session.features.field.inc b/cod_session/cod_session.features.field.inc
index 2b6bead..f23d715 100644
--- a/cod_session/cod_session.features.field.inc
+++ b/cod_session/cod_session.features.field.inc
@@ -5,11 +5,94 @@
  */
 
 /**
- * Implementation of hook_field_default_fields().
+ * Implements hook_field_default_fields().
  */
 function cod_session_field_default_fields() {
   $fields = array();
 
+  // Exported field: 'node-page-body'
+  $fields['node-page-body'] = array(
+    'field_config' => array(
+      'active' => '1',
+      'cardinality' => '1',
+      'deleted' => '0',
+      'entity_types' => array(
+        0 => 'node',
+      ),
+      'field_name' => 'body',
+      'field_permissions' => array(
+        'type' => '0',
+      ),
+      'foreign keys' => array(
+        'format' => array(
+          'columns' => array(
+            'format' => 'format',
+          ),
+          'table' => 'filter_format',
+        ),
+      ),
+      'indexes' => array(
+        'format' => array(
+          0 => 'format',
+        ),
+      ),
+      'module' => 'text',
+      'settings' => array(
+        'field_permissions' => array(
+          'create' => 'create',
+          'edit' => 0,
+          'edit own' => 'edit own',
+          'view' => 'view',
+          'view own' => 0,
+        ),
+      ),
+      'translatable' => '1',
+      'type' => 'text_with_summary',
+    ),
+    'field_instance' => array(
+      'bundle' => 'page',
+      'default_value' => NULL,
+      'deleted' => '0',
+      'description' => '',
+      'display' => array(
+        'default' => array(
+          'label' => 'hidden',
+          'module' => 'text',
+          'settings' => array(),
+          'type' => 'text_default',
+          'weight' => 0,
+        ),
+        'teaser' => array(
+          'label' => 'hidden',
+          'module' => 'text',
+          'settings' => array(
+            'trim_length' => 600,
+          ),
+          'type' => 'text_summary_or_trimmed',
+          'weight' => 0,
+        ),
+      ),
+      'entity_type' => 'node',
+      'field_name' => 'body',
+      'label' => 'Body',
+      'required' => FALSE,
+      'settings' => array(
+        'display_summary' => TRUE,
+        'text_processing' => 1,
+        'user_register_form' => FALSE,
+      ),
+      'widget' => array(
+        'module' => 'text',
+        'settings' => array(
+          'rows' => 20,
+          'summary_rows' => 5,
+        ),
+        'type' => 'text_textarea_with_summary',
+        'weight' => -4,
+      ),
+    ),
+  );
+
   // Exported field: 'node-room-body'
   $fields['node-room-body'] = array(
     'field_config' => array(
@@ -20,6 +103,9 @@ function cod_session_field_default_fields() {
         0 => 'node',
       ),
       'field_name' => 'body',
+      'field_permissions' => array(
+        'type' => '0',
+      ),
       'foreign keys' => array(
         'format' => array(
           'columns' => array(
@@ -34,7 +120,15 @@ function cod_session_field_default_fields() {
         ),
       ),
       'module' => 'text',
-      'settings' => array(),
+      'settings' => array(
+        'field_permissions' => array(
+          'create' => 'create',
+          'edit' => 0,
+          'edit own' => 'edit own',
+          'view' => 'view',
+          'view own' => 0,
+        ),
+      ),
       'translatable' => '1',
       'type' => 'text_with_summary',
     ),
@@ -49,7 +143,7 @@ function cod_session_field_default_fields() {
           'module' => 'text',
           'settings' => array(),
           'type' => 'text_default',
-          'weight' => '0',
+          'weight' => '3',
         ),
         'teaser' => array(
           'label' => 'hidden',
@@ -78,7 +172,7 @@ function cod_session_field_default_fields() {
           'summary_rows' => 5,
         ),
         'type' => 'text_textarea_with_summary',
-        'weight' => '2',
+        'weight' => '3',
       ),
       'widget_type' => 'text_textarea_with_summary',
     ),
@@ -123,7 +217,7 @@ function cod_session_field_default_fields() {
           'module' => 'text',
           'settings' => array(),
           'type' => 'text_default',
-          'weight' => '1',
+          'weight' => '0',
         ),
         'teaser' => array(
           'label' => 'above',
@@ -225,7 +319,71 @@ function cod_session_field_default_fields() {
           'progress_indicator' => 'throbber',
         ),
         'type' => 'image_image',
-        'weight' => '3',
+        'weight' => '4',
+      ),
+    ),
+  );
+
+  // Exported field: 'node-room-field_room_session_capacity'
+  $fields['node-room-field_room_session_capacity'] = array(
+    'field_config' => array(
+      'active' => '1',
+      'cardinality' => '1',
+      'deleted' => '0',
+      'entity_types' => array(),
+      'field_name' => 'field_room_session_capacity',
+      'field_permissions' => array(
+        'type' => '0',
+      ),
+      'foreign keys' => array(),
+      'indexes' => array(),
+      'module' => 'number',
+      'settings' => array(),
+      'translatable' => '0',
+      'type' => 'number_integer',
+    ),
+    'field_instance' => array(
+      'bundle' => 'room',
+      'default_value' => NULL,
+      'deleted' => '0',
+      'description' => 'Number of sessions or BoFs that this room can hold in a time slot. Used to allow multiple BoFs in the same room at the same time slot.',
+      'display' => array(
+        'default' => array(
+          'label' => 'above',
+          'module' => 'number',
+          'settings' => array(
+            'decimal_separator' => '.',
+            'prefix_suffix' => TRUE,
+            'scale' => 0,
+            'thousand_separator' => ' ',
+          ),
+          'type' => 'number_integer',
+          'weight' => '1',
+        ),
+        'teaser' => array(
+          'label' => 'above',
+          'settings' => array(),
+          'type' => 'hidden',
+          'weight' => 0,
+        ),
+      ),
+      'entity_type' => 'node',
+      'field_name' => 'field_room_session_capacity',
+      'label' => 'Session capacity',
+      'required' => 0,
+      'settings' => array(
+        'max' => '',
+        'min' => '',
+        'prefix' => '',
+        'suffix' => '',
+        'user_register_form' => FALSE,
+      ),
+      'widget' => array(
+        'active' => 0,
+        'module' => 'number',
+        'settings' => array(),
+        'type' => 'number',
+        'weight' => '2',
       ),
     ),
   );
@@ -240,6 +398,9 @@ function cod_session_field_default_fields() {
         0 => 'node',
       ),
       'field_name' => 'body',
+      'field_permissions' => array(
+        'type' => '0',
+      ),
       'foreign keys' => array(
         'format' => array(
           'columns' => array(
@@ -254,7 +415,15 @@ function cod_session_field_default_fields() {
         ),
       ),
       'module' => 'text',
-      'settings' => array(),
+      'settings' => array(
+        'field_permissions' => array(
+          'create' => 'create',
+          'edit' => 0,
+          'edit own' => 'edit own',
+          'view' => 'view',
+          'view own' => 0,
+        ),
+      ),
       'translatable' => '1',
       'type' => 'text_with_summary',
     ),
@@ -269,7 +438,7 @@ function cod_session_field_default_fields() {
           'module' => 'text',
           'settings' => array(),
           'type' => 'text_default',
-          'weight' => 0,
+          'weight' => '0',
         ),
         'teaser' => array(
           'label' => 'hidden',
@@ -311,6 +480,9 @@ function cod_session_field_default_fields() {
       'deleted' => '0',
       'entity_types' => array(),
       'field_name' => 'field_accepted',
+      'field_permissions' => array(
+        'type' => '2',
+      ),
       'foreign keys' => array(),
       'indexes' => array(
         'value' => array(
@@ -320,6 +492,7 @@ function cod_session_field_default_fields() {
       'module' => 'list',
       'settings' => array(
         'allowed_values' => array(
+          0 => 'Unprocessed',
           1 => 'Accepted',
           2 => 'Declined',
         ),
@@ -342,11 +515,11 @@ function cod_session_field_default_fields() {
       'description' => '',
       'display' => array(
         'default' => array(
-          'label' => 'above',
+          'label' => 'inline',
           'module' => 'list',
           'settings' => array(),
           'type' => 'list_default',
-          'weight' => 1,
+          'weight' => '2',
         ),
         'teaser' => array(
           'label' => 'above',
@@ -372,6 +545,182 @@ function cod_session_field_default_fields() {
     ),
   );
 
+  // Exported field: 'node-schedule_item-field_session_room'
+  $fields['node-schedule_item-field_session_room'] = array(
+    'field_config' => array(
+      'active' => '1',
+      'cardinality' => '-1',
+      'deleted' => '0',
+      'entity_types' => array(),
+      'field_name' => 'field_session_room',
+      'field_permissions' => array(
+        'type' => '0',
+      ),
+      'foreign keys' => array(
+        'nid' => array(
+          'columns' => array(
+            'nid' => 'nid',
+          ),
+          'table' => 'node',
+        ),
+      ),
+      'indexes' => array(
+        'nid' => array(
+          0 => 'nid',
+        ),
+      ),
+      'module' => 'node_reference',
+      'settings' => array(
+        'field_permissions' => array(
+          'create' => 0,
+          'edit' => 'edit',
+          'edit own' => 0,
+          'view' => 'view',
+          'view own' => 0,
+        ),
+        'referenceable_types' => array(
+          'article' => 0,
+          'bof_session' => 0,
+          'page' => 0,
+          'room' => 'room',
+          'schedule_item' => 0,
+          'session' => 0,
+          'time_slot' => 0,
+        ),
+        'view' => array(
+          'args' => array(),
+          'display_name' => '',
+          'view_name' => '',
+        ),
+      ),
+      'translatable' => '1',
+      'type' => 'node_reference',
+    ),
+    'field_instance' => array(
+      'bundle' => 'schedule_item',
+      'default_value' => NULL,
+      'deleted' => '0',
+      'description' => 'Select room(s) in which the session occurs.',
+      'display' => array(
+        'default' => array(
+          'label' => 'above',
+          'module' => 'node_reference',
+          'settings' => array(),
+          'type' => 'node_reference_default',
+          'weight' => '4',
+        ),
+        'teaser' => array(
+          'label' => 'above',
+          'settings' => array(),
+          'type' => 'hidden',
+          'weight' => 0,
+        ),
+      ),
+      'entity_type' => 'node',
+      'field_name' => 'field_session_room',
+      'label' => 'Room',
+      'required' => 0,
+      'settings' => array(
+        'user_register_form' => FALSE,
+      ),
+      'widget' => array(
+        'active' => 1,
+        'module' => 'options',
+        'settings' => array(),
+        'type' => 'options_buttons',
+        'weight' => '5',
+      ),
+    ),
+  );
+
+  // Exported field: 'node-schedule_item-field_session_slot'
+  $fields['node-schedule_item-field_session_slot'] = array(
+    'field_config' => array(
+      'active' => '1',
+      'cardinality' => '1',
+      'deleted' => '0',
+      'entity_types' => array(),
+      'field_name' => 'field_session_slot',
+      'field_permissions' => array(
+        'type' => '0',
+      ),
+      'foreign keys' => array(
+        'nid' => array(
+          'columns' => array(
+            'nid' => 'nid',
+          ),
+          'table' => 'node',
+        ),
+      ),
+      'indexes' => array(
+        'nid' => array(
+          0 => 'nid',
+        ),
+      ),
+      'module' => 'node_reference',
+      'settings' => array(
+        'field_permissions' => array(
+          'create' => 0,
+          'edit' => 'edit',
+          'edit own' => 0,
+          'view' => 'view',
+          'view own' => 0,
+        ),
+        'referenceable_types' => array(
+          'article' => 0,
+          'bof_session' => 0,
+          'page' => 0,
+          'room' => 0,
+          'schedule_item' => 0,
+          'session' => 0,
+          'time_slot' => 'time_slot',
+        ),
+        'view' => array(
+          'args' => array(),
+          'display_name' => '',
+          'view_name' => '',
+        ),
+      ),
+      'translatable' => '1',
+      'type' => 'node_reference',
+    ),
+    'field_instance' => array(
+      'bundle' => 'schedule_item',
+      'default_value' => NULL,
+      'deleted' => '0',
+      'description' => '',
+      'display' => array(
+        'default' => array(
+          'label' => 'inline',
+          'module' => 'node_reference',
+          'settings' => array(),
+          'type' => 'node_reference_default',
+          'weight' => '3',
+        ),
+        'teaser' => array(
+          'label' => 'above',
+          'settings' => array(),
+          'type' => 'hidden',
+          'weight' => 0,
+        ),
+      ),
+      'entity_type' => 'node',
+      'field_name' => 'field_session_slot',
+      'label' => 'Time slot',
+      'required' => 0,
+      'settings' => array(
+        'user_register_form' => FALSE,
+      ),
+      'widget' => array(
+        'active' => 1,
+        'module' => 'options',
+        'settings' => array(),
+        'type' => 'options_select',
+        'weight' => '4',
+      ),
+    ),
+  );
+
   // Exported field: 'node-session-body'
   $fields['node-session-body'] = array(
     'field_config' => array(
@@ -382,6 +731,9 @@ function cod_session_field_default_fields() {
         0 => 'node',
       ),
       'field_name' => 'body',
+      'field_permissions' => array(
+        'type' => '0',
+      ),
       'foreign keys' => array(
         'format' => array(
           'columns' => array(
@@ -396,7 +748,15 @@ function cod_session_field_default_fields() {
         ),
       ),
       'module' => 'text',
-      'settings' => array(),
+      'settings' => array(
+        'field_permissions' => array(
+          'create' => 'create',
+          'edit' => 0,
+          'edit own' => 'edit own',
+          'view' => 'view',
+          'view own' => 0,
+        ),
+      ),
       'translatable' => '1',
       'type' => 'text_with_summary',
     ),
@@ -411,7 +771,7 @@ function cod_session_field_default_fields() {
           'module' => 'text',
           'settings' => array(),
           'type' => 'text_default',
-          'weight' => 0,
+          'weight' => '0',
         ),
         'teaser' => array(
           'label' => 'hidden',
@@ -454,6 +814,9 @@ function cod_session_field_default_fields() {
       'deleted' => '0',
       'entity_types' => array(),
       'field_name' => 'field_accepted',
+      'field_permissions' => array(
+        'type' => '2',
+      ),
       'foreign keys' => array(),
       'indexes' => array(
         'value' => array(
@@ -463,6 +826,7 @@ function cod_session_field_default_fields() {
       'module' => 'list',
       'settings' => array(
         'allowed_values' => array(
+          0 => 'Unprocessed',
           1 => 'Accepted',
           2 => 'Declined',
         ),
@@ -480,16 +844,20 @@ function cod_session_field_default_fields() {
     ),
     'field_instance' => array(
       'bundle' => 'session',
-      'default_value' => NULL,
+      'default_value' => array(
+        0 => array(
+          'value' => '0',
+        ),
+      ),
       'deleted' => '0',
       'description' => '',
       'display' => array(
         'default' => array(
-          'label' => 'above',
+          'label' => 'inline',
           'module' => 'list',
           'settings' => array(),
           'type' => 'list_default',
-          'weight' => 7,
+          'weight' => '8',
         ),
         'teaser' => array(
           'label' => 'above',
@@ -501,7 +869,7 @@ function cod_session_field_default_fields() {
       'entity_type' => 'node',
       'field_name' => 'field_accepted',
       'label' => 'Status',
-      'required' => 0,
+      'required' => 1,
       'settings' => array(
         'user_register_form' => FALSE,
       ),
@@ -523,6 +891,9 @@ function cod_session_field_default_fields() {
       'deleted' => '0',
       'entity_types' => array(),
       'field_name' => 'field_experience',
+      'field_permissions' => array(
+        'type' => '0',
+      ),
       'foreign keys' => array(),
       'indexes' => array(
         'value' => array(
@@ -538,7 +909,7 @@ function cod_session_field_default_fields() {
         ),
         'allowed_values_function' => '',
         'field_permissions' => array(
-          'create' => 0,
+          'create' => 'create',
           'edit' => 'edit',
           'edit own' => 0,
           'view' => 'view',
@@ -559,7 +930,7 @@ function cod_session_field_default_fields() {
           'module' => 'list',
           'settings' => array(),
           'type' => 'list_default',
-          'weight' => 4,
+          'weight' => '6',
         ),
         'teaser' => array(
           'label' => 'above',
@@ -571,7 +942,7 @@ function cod_session_field_default_fields() {
       'entity_type' => 'node',
       'field_name' => 'field_experience',
       'label' => 'Experience level',
-      'required' => 1,
+      'required' => 0,
       'settings' => array(
         'user_register_form' => FALSE,
       ),
@@ -589,10 +960,13 @@ function cod_session_field_default_fields() {
   $fields['node-session-field_session_room'] = array(
     'field_config' => array(
       'active' => '1',
-      'cardinality' => '1',
+      'cardinality' => '-1',
       'deleted' => '0',
       'entity_types' => array(),
       'field_name' => 'field_session_room',
+      'field_permissions' => array(
+        'type' => '0',
+      ),
       'foreign keys' => array(
         'nid' => array(
           'columns' => array(
@@ -616,6 +990,9 @@ function cod_session_field_default_fields() {
           'view own' => 0,
         ),
         'referenceable_types' => array(
+          'article' => 0,
+          'bof_session' => 0,
+          'page' => 0,
           'room' => 'room',
           'schedule_item' => 0,
           'session' => 0,
@@ -637,11 +1014,11 @@ function cod_session_field_default_fields() {
       'description' => 'Select room(s) in which the session occurs.',
       'display' => array(
         'default' => array(
-          'label' => 'above',
+          'label' => 'inline',
           'module' => 'node_reference',
           'settings' => array(),
           'type' => 'node_reference_default',
-          'weight' => 6,
+          'weight' => '7',
         ),
         'teaser' => array(
           'label' => 'above',
@@ -675,6 +1052,9 @@ function cod_session_field_default_fields() {
       'deleted' => '0',
       'entity_types' => array(),
       'field_name' => 'field_session_slot',
+      'field_permissions' => array(
+        'type' => '0',
+      ),
       'foreign keys' => array(
         'nid' => array(
           'columns' => array(
@@ -698,6 +1078,9 @@ function cod_session_field_default_fields() {
           'view own' => 0,
         ),
         'referenceable_types' => array(
+          'article' => 0,
+          'bof_session' => 0,
+          'page' => 0,
           'room' => 0,
           'schedule_item' => 0,
           'session' => 0,
@@ -719,11 +1102,11 @@ function cod_session_field_default_fields() {
       'description' => '',
       'display' => array(
         'default' => array(
-          'label' => 'above',
+          'label' => 'inline',
           'module' => 'node_reference',
           'settings' => array(),
           'type' => 'node_reference_default',
-          'weight' => 5,
+          'weight' => '6',
         ),
         'teaser' => array(
           'label' => 'above',
@@ -775,9 +1158,9 @@ function cod_session_field_default_fields() {
         'display_default' => 1,
         'display_field' => 1,
         'field_permissions' => array(
-          'create' => 0,
-          'edit' => 'edit',
-          'edit own' => 0,
+          'create' => 'create',
+          'edit' => 0,
+          'edit own' => 'edit own',
           'view' => 'view',
           'view own' => 0,
         ),
@@ -796,7 +1179,7 @@ function cod_session_field_default_fields() {
           'module' => 'file',
           'settings' => array(),
           'type' => 'file_default',
-          'weight' => 2,
+          'weight' => '2',
         ),
         'teaser' => array(
           'label' => 'above',
@@ -852,9 +1235,9 @@ function cod_session_field_default_fields() {
       'module' => 'user_reference',
       'settings' => array(
         'field_permissions' => array(
-          'create' => 0,
-          'edit' => 'edit',
-          'edit own' => 0,
+          'create' => 'create',
+          'edit' => 0,
+          'edit own' => 'edit own',
           'view' => 'view',
           'view own' => 0,
         ),
@@ -862,6 +1245,7 @@ function cod_session_field_default_fields() {
           2 => 0,
           3 => 0,
           4 => 0,
+          5 => 0,
         ),
         'referenceable_status' => array(
           0 => 0,
@@ -887,7 +1271,7 @@ function cod_session_field_default_fields() {
           'module' => 'user_reference',
           'settings' => array(),
           'type' => 'user_reference_default',
-          'weight' => 1,
+          'weight' => '1',
         ),
         'teaser' => array(
           'label' => 'above',
@@ -940,9 +1324,9 @@ function cod_session_field_default_fields() {
         ),
         'allowed_values_function' => '',
         'field_permissions' => array(
-          'create' => 0,
+          'create' => 'create',
           'edit' => 'edit',
-          'edit own' => 0,
+          'edit own' => 'edit own',
           'view' => 'view',
           'view own' => 0,
         ),
@@ -957,11 +1341,11 @@ function cod_session_field_default_fields() {
       'description' => '',
       'display' => array(
         'default' => array(
-          'label' => 'above',
+          'label' => 'inline',
           'module' => 'list',
           'settings' => array(),
           'type' => 'list_default',
-          'weight' => 3,
+          'weight' => '5',
         ),
         'teaser' => array(
           'label' => 'above',
@@ -1108,9 +1492,11 @@ function cod_session_field_default_fields() {
   t('Description');
   t('Experience level');
   t('How many people does this space hold?');
+  t('Number of sessions or BoFs that this room can hold in a time slot. Used to allow multiple BoFs in the same room at the same time slot.');
   t('Photo');
   t('Room');
   t('Select room(s) in which the session occurs.');
+  t('Session capacity');
   t('Slides');
   t('Speaker(s)');
   t('Status');
diff --git a/cod_session/cod_session.features.inc b/cod_session/cod_session.features.inc
index 7d19db7..175694f 100644
--- a/cod_session/cod_session.features.inc
+++ b/cod_session/cod_session.features.inc
@@ -5,7 +5,7 @@
  */
 
 /**
- * Implementation of hook_ctools_plugin_api().
+ * Implements hook_ctools_plugin_api().
  */
 function cod_session_ctools_plugin_api() {
   list($module, $api) = func_get_args();
@@ -19,10 +19,126 @@ function cod_session_ctools_plugin_api() {
 }
 
 /**
- * Implementation of hook_node_info().
+ * Implements hook_flag_default_flags().
+ */
+function cod_session_flag_default_flags() {
+  $flags = array();
+  // Exported flag: "Speaker confirmation flag".
+  $flags['session_confirm'] = array(
+    'content_type' => 'node',
+    'title' => 'Speaker confirmation flag',
+    'global' => '0',
+    'types' => array(
+      0 => 'session',
+    ),
+    'flag_short' => 'I confirm that I can present this sesssion at the listed date and time.',
+    'flag_long' => 'Once confirmed, you cannot unconfirm without contacting the session organizers.',
+    'flag_message' => 'Thanks for confirming that you can present [title] at this date and time!',
+    'unflag_short' => 'Cancel confirmation',
+    'unflag_long' => '',
+    'unflag_message' => '',
+    'unflag_denied_text' => 'You have confirmed that you will be presenting for this session.',
+    'link_type' => 'toggle',
+    'roles' => array(
+      'flag' => array(
+        0 => '2',
+      ),
+      'unflag' => array(),
+    ),
+    'show_on_page' => 1,
+    'show_on_teaser' => 1,
+    'show_on_form' => 0,
+    'access_author' => '',
+    'i18n' => 0,
+    'module' => 'cod_session',
+    'locked' => array(
+      0 => 'name',
+    ),
+    'api_version' => 2,
+  );
+  // Exported flag: "Session Attending".
+  $flags['session_schedule'] = array(
+    'content_type' => 'node',
+    'title' => 'Session Attending',
+    'global' => '0',
+    'types' => array(
+      0 => 'schedule_item',
+      1 => 'session',
+    ),
+    'flag_short' => 'Add to your schedule',
+    'flag_long' => 'Add this session to your personal session attendance.',
+    'flag_message' => 'Session added',
+    'unflag_short' => 'Remove from your schedule',
+    'unflag_long' => 'Remove this session from your schedule',
+    'unflag_message' => 'Session removed',
+    'unflag_denied_text' => '',
+    'link_type' => 'toggle',
+    'roles' => array(
+      'flag' => array(),
+      'unflag' => array(),
+    ),
+    'show_on_page' => 0,
+    'show_on_teaser' => 1,
+    'show_on_form' => 0,
+    'access_author' => '',
+    'i18n' => 0,
+    'api_version' => 2,
+    'module' => 'cod_session',
+    'locked' => array(
+      0 => 'name',
+    ),
+  );
+  // Exported flag: "Session Vote".
+  $flags['session_vote'] = array(
+    'content_type' => 'node',
+    'title' => 'Session Vote',
+    'global' => '0',
+    'types' => array(
+      0 => 'session',
+    ),
+    'flag_short' => 'Vote for this session',
+    'flag_long' => 'Vote for this session',
+    'flag_message' => 'Your vote has been recorded!',
+    'unflag_short' => 'Retract vote',
+    'unflag_long' => 'Retract your vote for this session.',
+    'unflag_message' => 'Your vote has been retracted.',
+    'unflag_denied_text' => '',
+    'link_type' => 'toggle',
+    'roles' => array(
+      'flag' => array(
+        0 => 3,
+      ),
+      'unflag' => array(
+        0 => 3,
+      ),
+    ),
+    'show_on_page' => 1,
+    'show_on_teaser' => 0,
+    'show_on_form' => 0,
+    'access_author' => '',
+    'i18n' => 0,
+    'api_version' => 2,
+    'module' => 'cod_session',
+    'locked' => array(
+      0 => 'name',
+    ),
+  );
+  return $flags;
+}
+
+/**
+ * Implements hook_node_info().
  */
 function cod_session_node_info() {
   $items = array(
+    'page' => array(
+      'name' => t('Basic page'),
+      'base' => 'node_content',
+      'description' => t('Use <em>basic pages</em> for your static content, such as an \'About us\' page.'),
+      'has_title' => '1',
+      'title_label' => t('Title'),
+      'help' => '',
+    ),
     'room' => array(
       'name' => t('Room'),
       'base' => 'node_content',
diff --git a/cod_session/cod_session.features.user_permission.inc b/cod_session/cod_session.features.user_permission.inc
index dfc0257..d5d7869 100644
--- a/cod_session/cod_session.features.user_permission.inc
+++ b/cod_session/cod_session.features.user_permission.inc
@@ -5,139 +5,170 @@
  */
 
 /**
- * Implementation of hook_user_default_permissions().
+ * Implements hook_user_default_permissions().
  */
 function cod_session_user_default_permissions() {
   $permissions = array();
 
-  // Exported permission: edit field_accepted
-  $permissions['edit field_accepted'] = array(
-    'name' => 'edit field_accepted',
+  // Exported permission: create field_accepted
+  $permissions['create field_accepted'] = array(
+    'name' => 'create field_accepted',
     'roles' => array(
       0 => 'session organizer',
-      1 => 'site administrator',
     ),
     'module' => 'field_permissions',
   );
 
-  // Exported permission: edit field_experience
-  $permissions['edit field_experience'] = array(
-    'name' => 'edit field_experience',
-    'roles' => array(),
+  // Exported permission: create room content
+  $permissions['create room content'] = array(
+    'name' => 'create room content',
+    'roles' => array(
+      0 => 'session organizer',
+    ),
+    'module' => 'node',
   );
 
-  // Exported permission: edit field_session_room
-  $permissions['edit field_session_room'] = array(
-    'name' => 'edit field_session_room',
-    'roles' => array(),
+  // Exported permission: create schedule_item content
+  $permissions['create schedule_item content'] = array(
+    'name' => 'create schedule_item content',
+    'roles' => array(
+      0 => 'session organizer',
+    ),
+    'module' => 'node',
   );
 
-  // Exported permission: edit field_session_slot
-  $permissions['edit field_session_slot'] = array(
-    'name' => 'edit field_session_slot',
-    'roles' => array(),
+  // Exported permission: create session content
+  $permissions['create session content'] = array(
+    'name' => 'create session content',
+    'roles' => array(
+      0 => 'authenticated user',
+    ),
+    'module' => 'node',
   );
 
-  // Exported permission: edit field_slides
-  $permissions['edit field_slides'] = array(
-    'name' => 'edit field_slides',
-    'roles' => array(),
+  // Exported permission: create time_slot content
+  $permissions['create time_slot content'] = array(
+    'name' => 'create time_slot content',
+    'roles' => array(
+      0 => 'session organizer',
+    ),
+    'module' => 'node',
   );
 
-  // Exported permission: edit field_slot_datetime
-  $permissions['edit field_slot_datetime'] = array(
-    'name' => 'edit field_slot_datetime',
+  // Exported permission: delete any room content
+  $permissions['delete any room content'] = array(
+    'name' => 'delete any room content',
     'roles' => array(
       0 => 'session organizer',
-      1 => 'site administrator',
     ),
-    'module' => 'field_permissions',
+    'module' => 'node',
   );
 
-  // Exported permission: edit field_speakers
-  $permissions['edit field_speakers'] = array(
-    'name' => 'edit field_speakers',
+  // Exported permission: delete any schedule_item content
+  $permissions['delete any schedule_item content'] = array(
+    'name' => 'delete any schedule_item content',
     'roles' => array(
       0 => 'session organizer',
-      1 => 'site administrator',
     ),
-    'module' => 'field_permissions',
+    'module' => 'node',
   );
 
-  // Exported permission: edit field_track
-  $permissions['edit field_track'] = array(
-    'name' => 'edit field_track',
+  // Exported permission: delete any session content
+  $permissions['delete any session content'] = array(
+    'name' => 'delete any session content',
     'roles' => array(
       0 => 'session organizer',
-      1 => 'site administrator',
     ),
-    'module' => 'field_permissions',
+    'module' => 'node',
   );
 
-  // Exported permission: view field_accepted
-  $permissions['view field_accepted'] = array(
-    'name' => 'view field_accepted',
+  // Exported permission: delete any time_slot content
+  $permissions['delete any time_slot content'] = array(
+    'name' => 'delete any time_slot content',
     'roles' => array(
       0 => 'session organizer',
-      1 => 'site administrator',
     ),
-    'module' => 'field_permissions',
+    'module' => 'node',
   );
 
-  // Exported permission: view field_experience
-  $permissions['view field_experience'] = array(
-    'name' => 'view field_experience',
-    'roles' => array(),
+  // Exported permission: delete own session content
+  $permissions['delete own session content'] = array(
+    'name' => 'delete own session content',
+    'roles' => array(
+      0 => 'authenticated user',
+    ),
+    'module' => 'node',
   );
 
-  // Exported permission: view field_session_room
-  $permissions['view field_session_room'] = array(
-    'name' => 'view field_session_room',
+  // Exported permission: edit any room content
+  $permissions['edit any room content'] = array(
+    'name' => 'edit any room content',
     'roles' => array(
       0 => 'session organizer',
-      1 => 'site administrator',
     ),
-    'module' => 'field_permissions',
+    'module' => 'node',
   );
 
-  // Exported permission: view field_session_slot
-  $permissions['view field_session_slot'] = array(
-    'name' => 'view field_session_slot',
+  // Exported permission: edit any schedule_item content
+  $permissions['edit any schedule_item content'] = array(
+    'name' => 'edit any schedule_item content',
     'roles' => array(
       0 => 'session organizer',
-      1 => 'site administrator',
     ),
-    'module' => 'field_permissions',
+    'module' => 'node',
   );
 
-  // Exported permission: view field_slides
-  $permissions['view field_slides'] = array(
-    'name' => 'view field_slides',
-    'roles' => array(),
+  // Exported permission: edit any session content
+  $permissions['edit any session content'] = array(
+    'name' => 'edit any session content',
+    'roles' => array(
+      0 => 'session organizer',
+    ),
+    'module' => 'node',
   );
 
-  // Exported permission: view field_slot_datetime
-  $permissions['view field_slot_datetime'] = array(
-    'name' => 'view field_slot_datetime',
+  // Exported permission: edit any time_slot content
+  $permissions['edit any time_slot content'] = array(
+    'name' => 'edit any time_slot content',
     'roles' => array(
       0 => 'session organizer',
-      1 => 'site administrator',
     ),
-    'module' => 'field_permissions',
+    'module' => 'node',
   );
 
-  // Exported permission: view field_speakers
-  $permissions['view field_speakers'] = array(
-    'name' => 'view field_speakers',
-    'roles' => array(),
+  // Exported permission: edit field_accepted
+  $permissions['edit field_accepted'] = array(
+    'name' => 'edit field_accepted',
+    'roles' => array(
+      0 => 'session organizer',
+    ),
+    'module' => 'field_permissions',
   );
 
-  // Exported permission: view field_track
-  $permissions['view field_track'] = array(
-    'name' => 'view field_track',
+  // Exported permission: edit own field_accepted
+  $permissions['edit own field_accepted'] = array(
+    'name' => 'edit own field_accepted',
     'roles' => array(
       0 => 'session organizer',
-      1 => 'site administrator',
+    ),
+    'module' => 'field_permissions',
+  );
+
+  // Exported permission: edit own session content
+  $permissions['edit own session content'] = array(
+    'name' => 'edit own session content',
+    'roles' => array(
+      0 => 'authenticated user',
+    ),
+    'module' => 'node',
+  );
+
+  // Exported permission: view field_accepted
+  $permissions['view field_accepted'] = array(
+    'name' => 'view field_accepted',
+    'roles' => array(
+      0 => 'anonymous user',
+      1 => 'authenticated user',
     ),
     'module' => 'field_permissions',
   );
diff --git a/cod_session/cod_session.features.user_role.inc b/cod_session/cod_session.features.user_role.inc
index f90adc5..187327d 100644
--- a/cod_session/cod_session.features.user_role.inc
+++ b/cod_session/cod_session.features.user_role.inc
@@ -5,7 +5,7 @@
  */
 
 /**
- * Implementation of hook_user_default_roles().
+ * Implements hook_user_default_roles().
  */
 function cod_session_user_default_roles() {
   $roles = array();
diff --git a/cod_session/cod_session.field_group.inc b/cod_session/cod_session.field_group.inc
index 16bccaf..2ed24c8 100644
--- a/cod_session/cod_session.field_group.inc
+++ b/cod_session/cod_session.field_group.inc
@@ -5,12 +5,40 @@
  */
 
 /**
- * Implementation of hook_field_group_info().
+ * Implements hook_field_group_info().
  */
 function cod_session_field_group_info() {
   $export = array();
 
-  $field_group = new stdClass;
+  $field_group = new stdClass();
+  $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */
+  $field_group->api_version = 1;
+  $field_group->identifier = 'group_audience|node|session|default';
+  $field_group->group_name = 'group_audience';
+  $field_group->entity_type = 'node';
+  $field_group->bundle = 'session';
+  $field_group->mode = 'default';
+  $field_group->parent_name = '';
+  $field_group->data = array(
+    'label' => 'Audience',
+    'weight' => '4',
+    'children' => array(
+      0 => 'field_experience',
+      1 => 'field_track',
+    ),
+    'format_type' => 'fieldset',
+    'format_settings' => array(
+      'formatter' => 'collapsible',
+      'instance_settings' => array(
+        'description' => '',
+        'classes' => '',
+      ),
+    ),
+  );
+  $export['group_audience|node|session|default'] = $field_group;
+
+  $field_group = new stdClass();
+  $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */
   $field_group->api_version = 1;
   $field_group->identifier = 'group_audience|node|session|form';
   $field_group->group_name = 'group_audience';
@@ -36,7 +64,64 @@ function cod_session_field_group_info() {
   );
   $export['group_audience|node|session|form'] = $field_group;
 
-  $field_group = new stdClass;
+  $field_group = new stdClass();
+  $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */
+  $field_group->api_version = 1;
+  $field_group->identifier = 'group_schedule_info|node|schedule_item|default';
+  $field_group->group_name = 'group_schedule_info';
+  $field_group->entity_type = 'node';
+  $field_group->bundle = 'schedule_item';
+  $field_group->mode = 'default';
+  $field_group->parent_name = '';
+  $field_group->data = array(
+    'label' => 'Schedule info',
+    'weight' => '1',
+    'children' => array(
+      0 => 'field_accepted',
+      1 => 'field_session_slot',
+      2 => 'field_session_room',
+    ),
+    'format_type' => 'fieldset',
+    'format_settings' => array(
+      'formatter' => 'collapsible',
+      'instance_settings' => array(
+        'description' => '',
+        'classes' => '',
+      ),
+    ),
+  );
+  $export['group_schedule_info|node|schedule_item|default'] = $field_group;
+
+  $field_group = new stdClass();
+  $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */
+  $field_group->api_version = 1;
+  $field_group->identifier = 'group_schedule_info|node|session|default';
+  $field_group->group_name = 'group_schedule_info';
+  $field_group->entity_type = 'node';
+  $field_group->bundle = 'session';
+  $field_group->mode = 'default';
+  $field_group->parent_name = '';
+  $field_group->data = array(
+    'label' => 'Schedule info',
+    'weight' => '3',
+    'children' => array(
+      0 => 'field_accepted',
+      1 => 'field_session_room',
+      2 => 'field_session_slot',
+    ),
+    'format_type' => 'fieldset',
+    'format_settings' => array(
+      'formatter' => 'collapsible',
+      'instance_settings' => array(
+        'description' => '',
+        'classes' => '',
+      ),
+    ),
+  );
+  $export['group_schedule_info|node|session|default'] = $field_group;
+
+  $field_group = new stdClass();
+  $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */
   $field_group->api_version = 1;
   $field_group->identifier = 'group_schedule|node|schedule_item|form';
   $field_group->group_name = 'group_schedule';
@@ -49,19 +134,24 @@ function cod_session_field_group_info() {
     'weight' => '1',
     'children' => array(
       0 => 'field_accepted',
+      1 => 'field_session_slot',
+      2 => 'field_session_room',
     ),
     'format_type' => 'fieldset',
     'format_settings' => array(
-      'formatter' => 'collapsible',
+      'label' => 'Schedule Info',
       'instance_settings' => array(
+        'required_fields' => 0,
         'classes' => '',
-        'required_fields' => 1,
+        'description' => '',
       ),
+      'formatter' => 'collapsible',
     ),
   );
   $export['group_schedule|node|schedule_item|form'] = $field_group;
 
-  $field_group = new stdClass;
+  $field_group = new stdClass();
+  $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */
   $field_group->api_version = 1;
   $field_group->identifier = 'group_schedule|node|session|form';
   $field_group->group_name = 'group_schedule';
diff --git a/cod_session/cod_session.info b/cod_session/cod_session.info
index 8744ccd..cee05a8 100644
--- a/cod_session/cod_session.info
+++ b/cod_session/cod_session.info
@@ -1,22 +1,43 @@
+name = "COD Session"
+description = "COD Session Scheduling & Voting"
 core = "7.x"
+package = "COD"
+php = "5.2.4"
+project = "cod_session"
+dependencies[] = "auto_nodetitle"
 dependencies[] = "date"
 dependencies[] = "date_popup"
 dependencies[] = "features"
 dependencies[] = "field_group"
 dependencies[] = "field_permissions"
+dependencies[] = "flag"
 dependencies[] = "image"
 dependencies[] = "list"
+dependencies[] = "menu"
 dependencies[] = "node_reference"
+dependencies[] = "number"
+dependencies[] = "page_manager"
+dependencies[] = "panels"
+dependencies[] = "search"
 dependencies[] = "strongarm"
 dependencies[] = "user_reference"
-description = "COD Session Scheduling & Voting"
+dependencies[] = "views"
+dependencies[] = "views_bulk_operations"
+dependencies[] = "views_content"
+dependencies[] = "views_ui"
+datestamp = "1312320179"
 features[ctools][] = "field_group:field_group:1"
 features[ctools][] = "strongarm:strongarm:1"
+features[ctools][] = "views:views_default:3.0"
+features[field][] = "node-page-body"
 features[field][] = "node-room-body"
 features[field][] = "node-room-field_room_capacity"
 features[field][] = "node-room-field_room_photo"
+features[field][] = "node-room-field_room_session_capacity"
 features[field][] = "node-schedule_item-body"
 features[field][] = "node-schedule_item-field_accepted"
+features[field][] = "node-schedule_item-field_session_room"
+features[field][] = "node-schedule_item-field_session_slot"
 features[field][] = "node-session-body"
 features[field][] = "node-session-field_accepted"
 features[field][] = "node-session-field_experience"
@@ -26,29 +47,44 @@ features[field][] = "node-session-field_slides"
 features[field][] = "node-session-field_speakers"
 features[field][] = "node-session-field_track"
 features[field][] = "node-time_slot-field_slot_datetime"
+features[field_group][] = "group_audience|node|session|default"
 features[field_group][] = "group_audience|node|session|form"
+features[field_group][] = "group_schedule_info|node|schedule_item|default"
+features[field_group][] = "group_schedule_info|node|session|default"
 features[field_group][] = "group_schedule|node|schedule_item|form"
 features[field_group][] = "group_schedule|node|session|form"
+features[flag][] = "session_confirm"
+features[flag][] = "session_schedule"
+features[flag][] = "session_vote"
+features[menu_custom][] = "main-menu"
+features[menu_custom][] = "menu-menu-quick-links"
+features[menu_links][] = "main-menu:node/76"
+features[menu_links][] = "main-menu:program"
+features[menu_links][] = "main-menu:program/sessions"
+features[menu_links][] = "menu-menu-quick-links:program/session-schedule/your-schedule"
+features[node][] = "page"
 features[node][] = "room"
 features[node][] = "schedule_item"
 features[node][] = "session"
 features[node][] = "time_slot"
+features[user_permission][] = "create field_accepted"
+features[user_permission][] = "create room content"
+features[user_permission][] = "create schedule_item content"
+features[user_permission][] = "create session content"
+features[user_permission][] = "create time_slot content"
+features[user_permission][] = "delete any room content"
+features[user_permission][] = "delete any schedule_item content"
+features[user_permission][] = "delete any session content"
+features[user_permission][] = "delete any time_slot content"
+features[user_permission][] = "delete own session content"
+features[user_permission][] = "edit any room content"
+features[user_permission][] = "edit any schedule_item content"
+features[user_permission][] = "edit any session content"
+features[user_permission][] = "edit any time_slot content"
 features[user_permission][] = "edit field_accepted"
-features[user_permission][] = "edit field_experience"
-features[user_permission][] = "edit field_session_room"
-features[user_permission][] = "edit field_session_slot"
-features[user_permission][] = "edit field_slides"
-features[user_permission][] = "edit field_slot_datetime"
-features[user_permission][] = "edit field_speakers"
-features[user_permission][] = "edit field_track"
+features[user_permission][] = "edit own field_accepted"
+features[user_permission][] = "edit own session content"
 features[user_permission][] = "view field_accepted"
-features[user_permission][] = "view field_experience"
-features[user_permission][] = "view field_session_room"
-features[user_permission][] = "view field_session_slot"
-features[user_permission][] = "view field_slides"
-features[user_permission][] = "view field_slot_datetime"
-features[user_permission][] = "view field_speakers"
-features[user_permission][] = "view field_track"
 features[user_role][] = "session organizer"
 features[variable][] = "comment_anonymous_room"
 features[variable][] = "comment_anonymous_schedule_item"
@@ -66,6 +102,7 @@ features[variable][] = "comment_form_location_room"
 features[variable][] = "comment_form_location_schedule_item"
 features[variable][] = "comment_form_location_session"
 features[variable][] = "comment_form_location_time_slot"
+features[variable][] = "comment_page"
 features[variable][] = "comment_preview_room"
 features[variable][] = "comment_preview_schedule_item"
 features[variable][] = "comment_preview_session"
@@ -78,11 +115,21 @@ features[variable][] = "comment_subject_field_schedule_item"
 features[variable][] = "comment_subject_field_session"
 features[variable][] = "comment_subject_field_time_slot"
 features[variable][] = "comment_time_slot"
+features[variable][] = "menu_options_time_slot"
+features[variable][] = "menu_parent_time_slot"
+features[variable][] = "node_options_page"
 features[variable][] = "node_options_room"
 features[variable][] = "node_options_schedule_item"
 features[variable][] = "node_options_session"
 features[variable][] = "node_options_time_slot"
-name = "COD Session"
-package = "COD"
-php = "5.2.4"
-project = "cod_session"
+features[variable][] = "node_preview_time_slot"
+features[variable][] = "node_submitted_page"
+features[variable][] = "node_submitted_time_slot"
+features[views_view][] = "cod_schedule"
+features[views_view][] = "cod_time_slots"
+features[views_view][] = "schedule_room_list"
+features[views_view][] = "sessions"
+features[views_view][] = "sessions_admin"
+features[views_view][] = "sessions_admin_contact"
+features[views_view][] = "sessions_speaker_confirmation"
+files[] = "cod_session_views_style_plugin_schedule.inc"
diff --git a/cod_session/cod_session.module b/cod_session/cod_session.module
index 272de88..a8c8177 100644
--- a/cod_session/cod_session.module
+++ b/cod_session/cod_session.module
@@ -5,3 +5,1012 @@
  */
 
 include_once('cod_session.features.inc');
+
+// Define variables values for scheduling content types.
+define('COD_SCHEDULE_SINGLE', 'single');
+define('COD_SCHEDULE_MULTIPLE', 'multiple');
+
+/**
+ * Implements hook_permission().
+ */
+function cod_session_permission() {
+  $perms = array();
+  /**
+   * Define a custom set of permissions to control content type scheduling. This
+   * gets around CCK Field Permissions because it disallows edit and view should
+   * access check return false. Certain roles should be able to schedule certain
+   * content types and so edit and view of room and time slot nodereference
+   * fields should be allowed for authenticated users and these custom
+   * permissions can disallow.
+   */
+  $types = cod_session_schedulable_types();
+  if (!empty($types)) {
+    foreach ($types as $type => $content_type) {
+      $perms['schedule ' . $type] = array('title' => 'Schedule a ' . $content_type);
+    }
+  }
+  return $perms;
+}
+
+/**
+ * Helper function to determine content types with room and time slot fields.
+ */
+function cod_session_schedulable_types() {
+  $schedulable_types = array();
+  $types = node_type_get_types();
+  foreach ($types as $type => $content_type) {
+    $bundle = field_info_instances('node', $type);
+    if (isset($bundle['field_session_room']) && isset($bundle['field_session_slot'])) {
+      $schedulable_types[$type] = $content_type->name;
+    }
+  }
+  return $schedulable_types;
+}
+
+/**
+ * Implements hook_field_access().
+ */
+function cod_session_field_access($op, $field, $entity_type, $entity, $account) {
+  switch ($op) {
+    case 'edit':
+      // Respect custom schedule permission.
+      if (!user_access('schedule ' . $entity_type, $account) && ($field['field_name'] == 'field_session_room' || $field['field_name'] == 'field_session_slot')) {
+        return FALSE;
+      }
+  }
+  return TRUE;
+}
+
+/**
+ * Helper function determines if user can create and schedule content.
+ */
+function cod_session_schedule_access($node_type = 'session', $account = NULL) {
+  if (!$account) {
+    global $user;
+    $account = $user;
+  }
+  // @todo remove when ready to turn bof-scheduler into scheduler-form
+  // or when ready to make Prepopulate arguments work for sessions as well as
+  // bofs.
+  if ($node_type == 'session') {
+    return FALSE;
+  }
+  // Also check cod_session's field access override.
+  $node_obj = new stdClass();
+  $node_obj->type = $node_type;
+  $field_room = array(
+    'field_name' => 'field_session_room',
+  );
+
+  $field_slot = array(
+    'field_name' => 'field_session_slot',
+  );
+  return user_access('create ' . $node_type . ' content', $account)
+    && user_access('edit field_session_room', $account)
+    && user_access('edit field_session_slot', $account)
+    && cod_session_field_access('edit', $field_room, $node_type, $node_obj, $account)
+    && cod_session_field_access('edit', $field_slot, $node_type, $node_obj, $account);
+}
+
+/**
+ * Implements hook_menu().
+ */
+function cod_session_menu() {
+  $items['scheduler-form/%'] = array(
+    'title callback' => '_cod_session_scheduler_title',
+    'title arguments' => array(1),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('cod_session_schedule_form', 1),
+    'access callback' => 'cod_session_schedule_access',
+    'access arguments' => array(1),
+    'type' => MENU_CALLBACK,
+  );
+
+  return $items;
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function cod_session_form_node_type_form_alter(&$form, &$form_state, $form_id) {
+  if (isset($form['#node_type'])) {
+    // Provide scheduling controls for this content type.
+    $form['cod_session'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Scheduling settings'),
+      '#description' => t('Scheduling is only available to content types that have room and time slot nodereference fields'),
+      '#collapsible' => TRUE,
+      '#collapsed' => TRUE,
+      '#group' => 'additional_settings',
+    );
+    $form['cod_session']['cod_unique'] = array(
+      '#title' => t('Can content of this type share time slots with other scheduled content?'),
+      '#type' => 'radios',
+      '#options' => array(
+        'single' => t('No, content of this type overrides room availability and occupies entire time slot'),
+        'multiple' => t('Yes, content of this type can share a time slot if there is room availability'),
+      ),
+      '#default_value' => variable_get('cod_unique_' . $form['#node_type']->type, COD_SCHEDULE_SINGLE),
+      '#description' => t('Scheduled items (such as sessions, schedule items and BoFs) can share a room and time slot with other scheduled items or be configured here to occupy the entire room for that time slot.'),
+      // @todo, also make reference to room spanning?
+    );
+  }
+}
+
+/**
+ * Implements hook_form_alter().
+ */
+function cod_session_form_alter(&$form, &$form_state, $form_id) {
+  // Prepopulate the current user into the Speakers field
+  // on new session creation.
+  if ($form_id == 'session_node_form') {
+    if (isset($form['field_speakers'])) {
+      // Form tweaks for the Speakers field:
+      $form['field_speakers'][LANGUAGE_NONE]['add_more']['#value'] = t('Add another speaker');
+      // Prepopulate the current user into the Speakers field
+      // on new session creation.
+      if (empty($form['#node']->nid)) {
+        global $user;
+        $form['field_speakers'][LANGUAGE_NONE][0]['uid']['#default_value'] = $user->uid;
+      }
+    }
+  }
+}
+
+/**
+ * Form submit handler for bof node form.
+ */
+function _cod_session_unschedule(&$form, &$form_state, $form_id) {
+  if ($form_state['values']['op'] == $form_state['values']['cod_unschedule']) {
+    // Unset scheduled room and time slot.
+    $form_state['values']['field_session_room'][0]['nid'] = NULL;
+    $form_state['values']['field_session_slot'][0]['nid'] = NULL;
+    drupal_set_message(t('%name has been unscheduled. To reshedule, click "Schedule a session" on any available time slot.', array('%name' => $form_state['values']['title'])));
+    // @todo set redirect?
+  }
+}
+
+/**
+ * Get schedulable content created by a user.
+ *
+ * @param object $account
+ *  Account to retrieve content for.
+ * @param string $type
+ *  Content type to search for.
+ * @param boolean $unscheduled
+ *  Whether to return all BoFs or just those unscheduled.
+ * @return array
+ *  Array of BoF nodes or empty.
+ */
+function cod_session_users_content($account, $type, $unscheduled = FALSE) {
+  $nids = $bofs = array();
+
+  if (!$unscheduled) {
+    $sql = "SELECT n.nid FROM {node} n WHERE n.type = ':type' AND n.uid = :uid AND n.status = 1";
+  }
+  else {
+    $sql = "SELECT n.nid
+      FROM {node} n
+      INNER JOIN {field_data_field_session_room} r ON r.entity_id = n.nid AND r.revision_id = n.vid
+      INNER JOIN {field_data_field_session_slot} s ON s.entity_id = n.nid AND s.revision_id = n.vid
+      WHERE n.type = ':type' AND n.uid = ':uid' AND n.status = 1 AND r.field_session_room_nid IS NULL AND s.field_session_slot_nid IS NULL";
+  }
+  $result = db_query($sql, array(':type' => $type, ':uid' => $account->uid));
+  foreach ($result as $record) {
+    $nids[] = $record['nid'];
+  }
+  if (empty($nids)) {
+    return array();
+  }
+  foreach ($nids as $nid) {
+    $bofs[$nid] = node_load($nid);
+  }
+  return $bofs;
+}
+
+/**
+ * Custom schedule form.
+ */
+function cod_session_schedule_form($form, &$form_state, $type) {
+  global $user;
+  $url_query = array();
+  // COD BoF uses Prepopulate so retrieve room and time slot from the request.
+  if (isset($_REQUEST['edit'])) {
+    $room_nid = $_REQUEST['edit']['field_session_room']['nid']['nid'];
+    $slot_nid = $_REQUEST['edit']['field_session_slot']['nid']['nid'];
+    // Pass along Prepopulate and destination parameters in case the user
+    // chooses to add a new BoF.
+    $url_query = array(
+      'edit[field_session_room][nid][nid]' => $room_nid,
+      'edit[field_session_slot][nid][nid]' => $slot_nid,
+    );
+    $room = node_load($room_nid);
+    $slot = node_load($slot_nid);
+    // Sanity check that bad data wasn't passed.
+    if ($slot->type != 'time_slot' || $slot->status != 1 || $room->type != 'room' || $room->status != 1) {
+      drupal_access_denied();
+      return;
+    }
+  }
+  else {
+    // No arguments so 404.
+    drupal_not_found();
+    return;
+  }
+  $type_info = node_type_get_types($type);
+
+  // Show unscheduled content for this user.
+  $sessions = cod_session_users_content($user, $type, TRUE);
+  if (empty($sessions)) {
+    // Unset destination to prevent drupal_goto() from following it.
+    unset($_GET['destination']);
+    // Redirect to node add if the user has no unscheduled content.
+    drupal_goto('node/add/' . $type, $url_query);
+  }
+
+  foreach ($sessions as $session) {
+    $options[$session->nid] = check_plain($session->title);
+  }
+  $form['session'] = array(
+    '#type' => 'radios',
+    '#title' => t('Pick a @name to schedule', array('@name' => $type_info->name)),
+    '#options' => $options,
+    '#default_value' => array_shift(array_keys($options)),
+  );
+  $url_query['destination'] = $_GET['destination'];
+  $form['add_session'] = array(
+    '#type' => 'markup',
+    '#value' => '<div>' . l(t('Add a new @name', array('@name' => $type_info->name)), 'node/add/' . str_replace('_', '-', $type), array('query' => $url_query)) . '</div>',
+  );
+
+  $time_range = cod_session_time_slot_format($slot);
+  $form['chosen'] = array(
+    '#type' => 'item',
+    '#title' => t('You have chosen'),
+    '#value' => t('Room: @room <br/> Time: @day @start - @end', array('@day' => $time_range['day'], '@room' => $room->title, '@start' => $time_range['formatted_start'], '@end' => $time_range['formatted_end'])),
+  );
+  $form['schedule'] = array(
+    '#type' => 'value',
+    '#value' => array(
+      'room' => $room,
+      'slot' => $slot,
+    ),
+  );
+
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Confirm this time slot'),
+  );
+  $form_state['#redirect'] = $_GET['destination'];
+  $form['cancel'] = array(
+    '#type' => 'markup',
+    '#value' => l(t('Cancel'), $_GET['destination']),
+  );
+
+  return $form;
+}
+
+/**
+ * Submit handler for scheduling form.
+ */
+function cod_session_schedule_form_submit($form, $form_state) {
+  module_load_include('inc', 'node', 'node.pages');
+  // @todo consider whether there should be a
+  // cod_session_schedule_form_validate() with node_validate().
+  $item = node_load($form_state['values']['session'], NULL, TRUE);
+  $item->field_session_slot[]['nid'] = $form_state['values']['schedule']['slot']->nid;
+  $item->field_session_room[]['nid'] = $form_state['values']['schedule']['room']->nid;
+  $item = node_submit($item);
+  node_save($item);
+}
+
+/**
+ * hook_link_alter is not available in D7. Links may now be altered in
+ * hook_node_view_alter() and hook_comment_view_alter(). See
+ * http://drupal.org/update/modules/6/7#node_links for more info.
+ *
+ * Implements hook_link_alter().
+ * /
+function cod_session_link_alter($links, $node, $comment = NULL) {
+  global $user;
+  if (!empty($links['flag-session_confirm'])) {
+    $presenter = FALSE;
+    // Only display the session confirmation flag for sessions that are
+    // accepted and scheduled, and the current user is one of
+    // the session's speakers.
+    if ($node->field_accepted[LANGUAGE_NONE][0]['value'] == 1 && !empty($node->field_session_room[LANGUAGE_NONE][0]['nid']) && !empty($node->field_session_slot[LANGUAGE_NONE][0]['nid'])) {
+      foreach ($node->field_speakers[LANGUAGE_NONE] as $key => $value) {
+        if ($value['uid'] == $user->uid) {
+          $presenter = TRUE;
+        }
+      }
+    }
+    if (!$presenter) {
+      unset($links['flag-session_confirm']);
+    }
+  }
+}
+
+/**
+ * Implements hook_node_presave().
+ */
+function cod_session_node_presave($node) {
+  if (!empty($node->field_session_slot[LANGUAGE_NONE][0]['nid']) && !empty($node->field_session_room[LANGUAGE_NONE][0]['nid'])) {
+    $room = node_load($node->field_session_room[LANGUAGE_NONE][0]['nid']);
+    $slot = node_load($node->field_session_slot[LANGUAGE_NONE][0]['nid']);
+    drupal_set_message(t('%name is scheduled for @slot in @room', array('%name' => $node->title, '@slot' => $slot->title, '@room' => $room->title)));
+  }
+}
+
+/**
+ * Implements hook_node_validate().
+ */
+function cod_session_node_validate($node, $form) {
+  // If the node has a room and slot field, make sure there are no existing nodes that have the same room/slot combination.
+  // Unless the node is not unique check room capacity.
+  if (!empty($node->field_session_slot[LANGUAGE_NONE][0]['nid']) && !empty($node->field_session_room[LANGUAGE_NONE][0]['nid'])) {
+    $slots = $rooms = array();
+    foreach ($node->field_session_slot[LANGUAGE_NONE] as $slot) {
+      if (!empty($slot[0]['nid'])) {
+        $slots[] = $slot[0]['nid'];
+      }
+    }
+
+    // Get rooms.
+    foreach ($node->field_session_room as $room) {
+      if (!empty($room[0]['nid'])) {
+        $rooms[$room[0]['nid']] = node_load($room[0]['nid']);
+      }
+    }
+
+    // Get room capacity if this node is scheduled in only one room.
+    // If multiple rooms are selected it should mean this node is unique.
+    $capacity = 0;
+    if (count($rooms) == 1) {
+      $room = current($rooms);
+      if (isset($room->field_room_session_capacity) && $room->field_room_session_capacity[LANGUAGE_NONE][0]['value']) {
+        $capacity = $room->field_room_session_capacity[LANGUAGE_NONE][0]['value'];
+      }
+    }
+
+    // Get all sessions that have the same room and time slot.
+    if (!empty($slots) && !empty($rooms)) {
+      $room_nids = array_keys($rooms);
+      $sql = "SELECT DISTINCT node.nid AS nid, node.title AS title, node.type AS type, r.field_session_room_nid AS room_nid, node2.title AS room_title
+        FROM {node} node
+        INNER JOIN {field_data_field_session_room} r ON r.entity_id = node.nid AND r.revision_id = node.vid AND r.field_session_room_nid IN (:room_nids)
+        INNER JOIN {node} node2 ON r.field_session_room_nid = node2.nid
+        INNER JOIN {field_data_field_session_slot} s ON s.entity_id = node.nid AND s.revision_id = node.vid AND s.field_session_slot_nid IN (:slots)
+        WHERE node.nid != :nids";
+// Do we really need to search the node table for session ids that are equivilant to room and time slot ids?
+//      $result = db_query($sql, array(':room_nids' => $room_nids, ':slots' => $slots, ':nids' => array_merge($room_nids, $slots, array($node->nid))));
+      $result = db_query($sql, array(':room_nids' => $room_nids, ':slots' => $slots, ':nids' => $node->nid));
+      $errors = array();
+      // Check to see if the room's time slot has exceeded its capacity.
+      foreach ($result as $record) {
+        $capacity--;
+        if ($capacity <= 0 || (variable_get('cod_unique_' . $record->type, COD_SCHEDULE_SINGLE) == COD_SCHEDULE_SINGLE)) {
+          $errors[] = t('!session in !room', array('!session' => l($record->title, 'node/' . $record->nid), '!room' => l($record->room_title, 'node/' . $record->room_nid)));
+        }
+      }
+
+      if (!empty($errors)) {
+        form_set_error('', format_plural(count($errors), 'The proposed slot and room conflicts with the following item:', 'The proposed slot and rooms conflict with the following items:') . theme('item_list', array('items' => $errors)) . format_plural(count($errors), 'Please select a different slot and/or room.', 'Please select a different slot and/or rooms.'));
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function cod_session_theme($existing, $type, $theme, $path) {
+  return array(
+    'cod_session_schedule' => array(
+      'variables' => array('view' => NULL, 'options' => NULL, 'rows' => NULL, 'title' => NULL),
+      'template' => 'cod-session-schedule',
+    ),
+  );
+}
+
+/**
+ * Theme function to render the schedule grid.
+ *
+ * Build arrays of schedulable content, visible rooms, and time slots with
+ * context-appropriate meta information like available schedulable slots.
+ */
+function template_preprocess_cod_session_schedule(&$vars) {
+  global $user;
+  // Warning, this preprocess function is massive, like Godzilla eating the
+  // worlds largest pizza massive. It needs to be refactored and broken apart,
+  // but that has not yet happened, or you wouldn't be reading this. Attempts
+  // are made to document this code, but proceed and alter at risk.
+
+  // $view->result contains the raw data
+  // $vars['rows'] contains the row-formatted fields
+
+  $view = $vars['view'];
+
+  // Save raw row View results keyed on nid.
+  $view_results = $scheduled_items = $displayed_node_types = array();
+  $node_types = node_type_get_types();
+  foreach ($node_types as $type => $content_type) {
+    $fields = field_info_instances('node', $type);
+    $node_types[$type]->fields = (object) $fields;
+  }
+
+  if (!empty($view->result)) {
+    foreach ($view->result as $key => $view_result) {
+      $node = node_load($view_result->nid);
+      $scheduled_items[$node->nid] = $node;
+      // $view_results will be what is actually output in the tpl file.
+      $view_results[$node->nid] = $vars['rows'][$key];
+      // Hold onto node types seen in this View.
+      if (!in_array($node->type, $displayed_node_types)) {
+        $displayed_node_types[$node->type] = $node_types[$node->type];
+      }
+    }
+  }
+
+  // Get days of the schedule from the View style setting. This will be used
+  // when depicting day links and for determining time slots to appear on this
+  // day's grid.
+  $all_schedule_days = $view->cod_schedule_days;
+  // If an argument is present limit the schedule days.
+  $schedule_days = $all_schedule_days;
+  if (!empty($view->args[0])) {
+    if (array_key_exists($view->args[0], $all_schedule_days)) {
+      $schedule_days = array($view->args[0] => $all_schedule_days[$view->args[0]]);
+    }
+  }
+
+  // Get a list of time slots. The list can be powered by a View, see cod_session_day_slots().
+  // The list of sessions is not filtered by this list. A View filter argument should be used for that.
+  // @todo this won't allow different Views on the same day to show different time slots (maybe if one was sessions and the other bofs)?
+  $time_slots = array();
+  foreach ($schedule_days as $day_key => $day) {
+    // @todo Because Date does not yet provide granularity for date fields in
+    // contextual filters, I've set the second argument to be the date, rather
+    // than the key. (I'm thinking that's way the it should work anyway.)
+    // -- oadaeh 2012-01-21
+    $time_slots = array_merge($time_slots, cod_session_day_slots($view, $day));
+    //$time_slots = array_merge($time_slots, cod_session_day_slots($view, $day_key));
+  }
+  if (empty($time_slots)) {
+    // No time slots exist so do not continue.
+    return;
+  }
+
+  // Get a list of rooms. The list can be powered by the View schedule_room_list
+  $rooms = _cod_session_schedule_rooms($view);
+  if (empty($rooms)) {
+    // No rooms exist so do not continue.
+    return;
+  }
+
+  // Build an array of links to days to display at the top of the grid.
+  $day_links = array();
+  $current_path = $view->display_handler->display->display_options['path'];
+  if (!empty($view->args[0]) && count($all_schedule_days) > 1) {
+    foreach ($all_schedule_days as $day_key => $day) {
+      // @todo pass along links with attribute information?
+      $day_links[] = l($day, $current_path . '/' . $day_key);
+    }
+  }
+
+  // Build attributes for scheduled items.
+  // Consider revising architecture to be taxonomy or node reference to simplify the following.
+  $session_attrs = array();
+  foreach ($node_types as $type => $type_array) {
+    foreach ($type_array->fields as $field) {
+      if (in_array($field['widget']['type'], array('options_buttons', 'options_select', 'options_onoff'))) {
+        if (!isset($session_attrs[$field['field_name']])) {
+          // Allowed values of a field may or may not have machine-readable keys.
+          if (!empty($field['settings']['allowed_values_function']) || !empty($field['settings']['allowed_values'])) {
+            $allowed_values = list_allowed_values($field);
+            $session_attrs[$field['field_name']] = array(
+              'name' => $field['field_name'],
+              'values' => array_values($allowed_values),
+              'keys' => array_keys($allowed_values),
+              'machine_keys' => _cod_session_machine_keys($field['field_name'], array_keys($allowed_values)),
+            );
+          }
+        }
+      }
+    }
+  }
+
+  // Create text CCK optionwidgets as attributes of items for CSS usage.
+  // @todo review for sanitization
+  if (!empty($session_attrs)) {
+    foreach ($scheduled_items as $session_nid => $session) {
+      foreach ($session_attrs as $field) {
+        // See if field exists for particular session node.
+        if (is_array($session->$field['name'])) {
+          // Field could have multiple instances.
+          foreach ($session->$field['name'] as $instance) {
+            // Emtpy values are NULL.
+            if (isset($instance['value'])) {
+              // Create container if doesn't exist.
+              if (!isset($scheduled_items[$session_nid]->cod_session_classes)) {
+                $scheduled_items[$session_nid]->cod_session_classes = array();
+              }
+              $key = array_search($instance['value'], $field['values']);
+              if ($key === FALSE) {
+                // It's possible we've rewritten the keys.
+                $key = array_search($instance['value'], $field['keys']);
+                if ($key !== FALSE) {
+                  $value = $field['values'][$key];
+                }
+              }
+              else {
+                $value = $instance['value'];
+              }
+              if ($key !== FALSE) {
+                // Create class based on field key.
+                $scheduled_items[$session_nid]->cod_session_classes[$field['machine_keys'][$key]] = $value;
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  // Collect capacity information about rooms to inform availability processing.
+  $room_nids = array_keys($rooms);
+  foreach ($room_nids as $room_nid) {
+    // Explicitly get room capacity.
+    $node = node_load($room_nid);
+    if (isset($node->field_room_session_capacity)) {
+      $capacity = check_plain($node->field_room_session_capacity[LANGUAGE_NONE][0]['value']);
+    }
+    else {
+      $capacity = 1;
+    }
+    $rooms[$room_nid]['capacity'] = $capacity;
+  }
+
+  // Load each slot.
+  // @todo This could be malperformant. Consider revising such that all slots
+  // are loaded with single query.
+  foreach ($time_slots as $slot) {
+    $node = node_load($slot->nid);
+    $slots[$node->nid] = $node;
+  }
+
+  // Create structured grid of scheduled items in format [slot][room][item_nid]
+  $used_slots = $item_grid = $used_rooms = $authored = array();
+
+  if (!empty($scheduled_items)) {
+    foreach ($scheduled_items as $item) {
+      if (!empty($item->field_session_slot[LANGUAGE_NONE][0]['nid']) && !empty($item->field_session_room[LANGUAGE_NONE][0]['nid'])) {
+        if (!empty($item->cod_session_classes)) {
+          $class = ' ' . implode(' ', array_keys($item->cod_session_classes));
+        }
+        else {
+          $class = '';
+        }
+
+        // Handle sessions in multiple rooms.
+        foreach ($item->field_session_room[LANGUAGE_NONE] as $room_instance) {
+          $item_grid[$item->field_session_slot[LANGUAGE_NONE][0]['nid']][$room_instance['nid']][$item->nid]['session'] = $item;
+          $item_grid[$item->field_session_slot[LANGUAGE_NONE][0]['nid']][$room_instance['nid']][$item->nid]['class'] = $class;
+          // Record rooms and used slots.
+          $used_rooms[$room_instance['nid']][] = $item->field_session_slot[LANGUAGE_NONE][0]['nid'];
+        }
+
+      // Create array of populated slots.
+        if (!in_array($item->field_session_slot[LANGUAGE_NONE][0]['nid'], $used_slots)) {
+          $used_slots[] = $item->field_session_slot[LANGUAGE_NONE][0]['nid'];
+        }
+      }
+      // Record sessions for this user, their call-to-action can use it.
+      if ($item->uid == $user->uid) {
+        $authored[] = $item->nid;
+      }
+    }
+
+    // Explicitly discover if there are unscheduled sessions by this user if
+    // the interactive workflow is enabled.
+    if ($view->cod_schedule_interactive) {
+      $authored = cod_session_users_content($user, $view->cod_interactive_type, TRUE);
+      if (!empty($authored)) {
+        $unscheduled_bofs = TRUE;
+      }
+    }
+  }
+
+  // Arrange slots by days.
+  // @todo Give plugin options for date formats and text?
+  $arranged_slots = array();
+  foreach ($slots as $slot) {
+    // Do not fill slots on non-interactive schedules that are not in use.
+    if (!$view->cod_schedule_interactive && !in_array($slot->nid, $used_slots)) {
+      continue;
+    }
+    // Make formatted times.
+    $time_format = cod_session_time_slot_format($slot);
+    $day_key = date_format_date($time_format['date_start'], 'custom', 'Y-m-d');
+    $timestamp = date_format_date($time_format['date_start'], 'custom', DATE_FORMAT_UNIX);
+    $arranged_slots[$day_key][$timestamp] = array(
+      'nid' => $slot->nid,
+      'start' => $time_format['formatted_start'],
+      'end' => $time_format['formatted_end'],
+      'class' => '',
+    );
+    // If interactive and row is empty include a class.
+    if ($view->cod_schedule_interactive && !in_array($slot->nid, $used_slots)) {
+      $arranged_slots[$day_key][$timestamp]['class'] = 'empty';
+    }
+    // Hold onto what slots go with a day_key so the empty rooms for a day can
+    // be easily calculated.
+    $days_slots[$day_key][] = $slot->nid;
+    if (!isset($days[$day_key])) {
+      $days[$day_key] = date_format_date($time_format['date_start'], 'custom', 'l F jS, Y');
+    }
+  }
+
+  // Sort the arranged slots.
+  cod_session_ksort_recurse($arranged_slots);
+
+  // Calculate unused rooms in each day. Unused rooms will be left off the grid
+  // if the room is not interactive and will be showing (to allow scheduling) if
+  // it is.
+  $empty_rooms = $show_rooms = array();
+  if (!empty($days_slots)) {
+    foreach ($room_nids as $room_nid) {
+      foreach ($days_slots as $day_key => $day_slots) {
+        $intersect = array();
+        if (!empty($used_rooms[$room_nid])) {
+          $intersect = array_intersect($used_rooms[$room_nid], $day_slots);
+        }
+        if (empty($intersect)) {
+          // Room not used on this day.
+          $empty_rooms[$day_key][$room_nid] = TRUE;
+          if ($view->cod_schedule_interactive) {
+            $show_rooms[$day_key][$room_nid] = TRUE;
+          }
+          else {
+            $show_rooms[$day_key][$room_nid] = FALSE;
+          }
+        }
+        else {
+          // Room is in use, so show it.
+          $show_rooms[$day_key][$room_nid] = TRUE;
+        }
+      }
+    }
+  }
+
+  // @todo get rooms for each day?
+  // Build schedule grid array. This is the final processing before handing over
+  // to the tpl file.
+  $schedule_grid = array();
+  if (!empty($days)) {
+    // For each day...
+    foreach ($days as $day_key => $day_title) {
+      $schedule_grid[$day_key] = array();
+      // For each slot...
+      foreach ($arranged_slots[$day_key] as $slot_key => $slot) {
+        $schedule_grid[$day_key][$slot['nid']] = array();
+        // For each room. $room_key is used for determing colspans.
+        foreach ($room_nids as $room_key => $room_nid) {
+          // Leave out empty rooms on non-interactive schedules.
+          if (!$view->cod_schedule_interactive && !empty($empty_rooms[$day_key][$room_nid])) {
+            continue;
+          }
+          // Collect sessions and availability and call-to-schedule information.
+          // The tpl file determines what to print. @todo make that determination here?
+
+          // Now at the level of depth of session_grid, that is [slot][room].
+          // If we have not already marked this room/slot combo as spanned, continue forward.
+          if (empty($schedule_grid[$day_key][$slot['nid']][$room_nid])) {
+            $schedule_grid[$day_key][$slot['nid']][$room_nid]['sessions'] = array();
+            $schedule_grid[$day_key][$slot['nid']][$room_nid]['class'] = '';
+            $schedule_grid[$day_key][$slot['nid']][$room_nid]['spanned'] = FALSE;
+
+            $available = $rooms[$room_nid]['capacity'];
+
+            // Check $item_grid for if items exists in this slot.
+            if (!empty($item_grid[$slot['nid']][$room_nid])) {
+              $colspan = 1;
+              // Record the session(s) in this room and slot.
+              // $item_grid[slot][room] is an array of sessions. Store sessions
+              // in $schedule_grid at [day][slot][room]['sessions'].
+              $schedule_grid[$day_key][$slot['nid']][$room_nid]['sessions'] = $item_grid[$slot['nid']][$room_nid];
+              // Count scheduled items.
+              $available = $available - count($item_grid[$slot['nid']][$room_nid]);
+              // Check for single item, to set uniqueness and colspan.
+              if (count($item_grid[$slot['nid']][$room_nid]) == 1) {
+                $this_session = current($item_grid[$slot['nid']][$room_nid]);
+                // Exclusive content types override non-exclusive.
+                $this_exclusive = variable_get('cod_unique_' . $this_session['session']->type, COD_SCHEDULE_SINGLE);
+                if ($this_exclusive == COD_SCHEDULE_SINGLE) {
+                  $available = 0;
+                }
+
+                // This slot has only one session, calculate colspans in time slot (row).
+                // @todo consider if session is in this and not next sequential room?
+                // Check for sessions in remaining rooms.
+                for ($i = $room_key + 1; $i < count($room_nids); $i++) {
+                  if (!empty($item_grid[$slot['nid']][$room_nids[$i]]) && count($item_grid[$slot['nid']][$room_nids[$i]]) == 1) {
+                    $adjacent = current($item_grid[$slot['nid']][$room_nids[$i]]);
+                    // Check to see if adjacent column matches.
+                    if ($this_session['session']->nid == $adjacent['session']->nid) {
+                      // We'll accommodate for this in the markup.
+                      $colspan++;
+                      // Mark the room/slot combo as spanned from the previous slot.
+                      $schedule_grid[$day_key][$slot['nid']][$room_nids[$i]]['spanned'] = TRUE;
+                      // Don't process adjacent room when setting schedule grid.
+                      unset($item_grid[$slot['nid']][$room_nids[$i]]);
+                    }
+                    else {
+                      // Adjacent session does not match.
+                      break;
+                    }
+                  }
+                  else {
+                    // Only consider those which are adjacent.
+                    break;
+                  }
+                }
+              }
+
+              // Set colspan.
+              $schedule_grid[$day_key][$slot['nid']][$room_nid]['colspan'] = $colspan;
+            }
+          }
+
+          // Include room availability and call-to-action if this is an interactive
+          // schedule and user is allowed to create and schedule.
+          if ($view->cod_schedule_interactive && cod_session_schedule_access($view->cod_interactive_type, $user)) {
+            $type_url_str = str_replace('_', '-', $view->cod_interactive_type); // Oh, Drupal.
+            if ($available <= 0) {
+              $availability = ''; // Do not display anything if the room is full.
+              $schedule_grid[$day_key][$slot['nid']][$room_nid]['class'] .= ' full';
+            }
+            else {
+              $availability = t('@avail of @cap slots available', array('@avail' => $available, '@cap' => $rooms[$room_nid]['capacity']));
+              // There is availability so provide a call-to-action for scheduling.
+              $options = array(
+                'query' => array(
+                  // The session room field is unlimited so it would be rendered as
+                  // checkboxes but because it's being altered by cod_bof set the
+                  // Prepopulate arguments to what it will be, a select list.
+                  'edit[field_session_room][nid][nid]' => $room_nid,
+                  'edit[field_session_slot][nid][nid]' => $slot['nid'],
+                  'destination' => $_GET['q'], // @todo may be menu tab depth?
+                ),
+              );
+              // If the user has unscheduled items or has not submitted any
+              // they are given a link to add and otherwise a link to schedule.
+              if (!$authored || !$unscheduled_bofs) {
+                $cta = l(t('Add a @name', array('@name' => $node_types[$view->cod_interactive_type]->name)), 'node/add/' . $type_url_str, $options);
+              }
+              else {
+                $cta = l(t('Schedule a @name', array('@name' => $node_types[$view->cod_interactive_type]->name)), 'scheduler-form/' . $view->cod_interactive_type, $options);
+              }
+              $schedule_grid[$day_key][$slot['nid']][$room_nid]['cta'] = $cta;
+              $schedule_grid[$day_key][$slot['nid']][$room_nid]['class'] .= ' available';
+            }
+            // Include availability message.
+            $schedule_grid[$day_key][$slot['nid']][$room_nid]['availability'] = $availability;
+          }
+        }
+      }
+    }
+
+    $vars['days'] = $days;
+  }
+
+  $vars['view_results'] = $view_results;
+  $vars['session_grid'] = $item_grid;
+  $vars['arranged_slots'] = $arranged_slots;
+  $vars['schedule_grid'] = $schedule_grid;
+  $vars['day_links'] = $day_links;
+  $vars['rooms'] = $rooms;
+  $vars['room_nids'] = $room_nids;
+  $vars['show_rooms'] = $show_rooms;
+}
+
+/**
+ * Helper function determines days there are time slots for.
+ */
+function cod_session_days() {
+  static $days;
+  if (empty($days)) {
+    $days = array();
+    $sql = "SELECT DATE_FORMAT(s.field_slot_datetime_value, :day) AS day
+      FROM {field_data_field_slot_datetime} s
+      INNER JOIN {node} n ON s.entity_id = n.nid AND s.revision_id = n.vid
+      WHERE n.type = 'time_slot'
+      GROUP BY DATE_FORMAT(s.field_slot_datetime_value, :day)
+      ORDER BY s.field_slot_datetime_value ASC";
+    $result = db_query($sql, array(':day' => '%W %M, %d %Y'));
+    foreach ($result as $record) {
+      $date = new DateObject($record->day, NULL, 'l F, d Y');
+      $days[$record->day] = date_format_date($date, 'custom', 'l F, d Y');
+    }
+  }
+  return $days;
+}
+
+/**
+ * Helper function returns a list of rooms to display on the schedule.
+ */
+function _cod_session_schedule_rooms($schedule_view) {
+  // @todo I think Interactive is no longer needed here
+  //$interactive = $schedule_view->cod_schedule_interactive;
+  $rooms = array();
+
+  // Try and load the schedule room list view.
+  $room_view = views_get_view('schedule_room_list');
+  if (!$room_view) {
+    // It didn't load so default to the list of published rooms.
+    $sql = "SELECT node.nid, node.title
+      FROM {node} node WHERE node.type = 'room' AND node.status = 1
+      ORDER BY node.title ASC";
+    $result = db_query($sql);
+    foreach ($result as $record) {
+      $rooms[$record->nid] = array(
+        'title' => check_plain($record->title),
+      );
+    }
+  }
+  else {
+    // Pass along the argument.
+    /* if ($interactive) {
+      $view->set_arguments(array(1));
+    } */
+    $room_queue = $schedule_view->cod_room_queue;
+    if ($room_queue) {
+      $room_view->set_arguments(array($room_queue));
+    }
+    // Return the results from the view.
+    $room_view->execute();
+    foreach ($room_view->result as $record) {
+      // Include the sponsor field. @todo generalize this to View fields.
+      if (isset($record->node_data_field_room_sponsor_field_room_sponsor_nid)) {
+        $sponsor = node_load($record->node_data_field_room_sponsor_field_room_sponsor_nid);
+        $sponsor = l($sponsor->title, 'node/' . $sponsor->nid);
+      }
+      else {
+        $sponsor = '';
+      }
+      $rooms[$record->nid] = array(
+        'title' => $record->node_title,
+        'sponsor' => $sponsor,
+      );
+    }
+  }
+  return $rooms;
+}
+
+/**
+ * Get time slots for a day.
+ */
+function cod_session_day_slots($schedule_view, $day) {
+  $time_slots = array();
+
+  // Try and load the cod_time_slots view.
+  // @todo Because Date does not yet provide granularity for date fields in
+  // contextual filters, I've forced it to run the database query.
+  // -- oadaeh 2012-01-21
+  //$view = views_get_view('cod_time_slots');
+  $view = '';
+  if (!$view) {
+    $day = (new DateObject($day, NULL, 'l F, d Y'));
+    $day = date_format_date($day, 'custom', 'Y-m-d');
+    // No view so default to all time slots within this day.
+    $sql = "SELECT n.nid
+      FROM {node} n
+      INNER JOIN {field_data_field_slot_datetime} s ON n.nid = s.entity_id AND n.vid = s.revision_id
+      WHERE n.type = 'time_slot' AND n.status = 1";
+    if ($day) {
+      $sql .= " AND DATE_FORMAT(s.field_slot_datetime_value, '%Y-%m-%d') = :day";
+    }
+    $sql .= " ORDER BY s.field_slot_datetime_value ASC";
+    $result = db_query($sql, array(':day' => $day));
+    foreach ($result as $record) {
+      $time_slots[] = $record;
+    }
+  }
+  else {
+    // If Nodequeue is enabled and a queue has been set for use use that as the
+    // argument for this View, otherwise pass along the day.
+    $time_queue = !empty($schedule_view->cod_time_queue) ? $schedule_view->cod_time_queue : NULL;
+    if ($time_queue) {
+      $view->set_arguments(array($time_queue));
+    }
+    else {
+      $view->set_arguments(array($day));
+    }
+    // There must be a way for this view to respect all the settings of it.
+    $view->items_per_page = 0;
+    $view->execute();
+    $time_slots = $view->result;
+  }
+  return $time_slots;
+}
+
+/**
+ * Recursive ksort.
+ */
+function cod_session_ksort_recurse(&$array) {
+  ksort($array);
+  foreach (array_keys($array) as $key) {
+    if (is_array($array[$key])) {
+      cod_session_ksort_recurse($array[$key]);
+      ksort($array[$key]);
+    }
+    else {
+      return;
+    }
+  }
+}
+
+/**
+ * @TODO: This function needs to be upgraded to D7.
+ *
+ * Create array of machine-readable keys.
+ */
+function _cod_session_machine_keys($prefix, $keys) {
+  $machine_keys = array();
+  foreach ($keys as $index => $key) {
+    $machine_key_raw = trim(preg_replace('/_+/', '_', preg_replace('/[^a-z0-9]+/', '_', drupal_strtolower($key))), '_');
+    if ($machine_key_raw == '') {
+      $machine_key_raw = $index;
+    }
+    $machine_key = $prefix . '-' . $machine_key_raw;
+    if (in_array($machine_key, $machine_keys)) {
+      $machine_key .= '-' . $index;
+    }
+    $machine_keys[$index] = $machine_key;
+  }
+  return $machine_keys;
+}
+
+/**
+ * Helper function computes time slot range.
+ *
+ * @param object Time slot node.
+ * @return array Array of start and end times.
+ */
+function cod_session_time_slot_format($slot) {
+  static $ranges = array();
+  if (!isset($ranges[$slot->nid])) {
+    $date_start = new DateObject($slot->field_slot_datetime[LANGUAGE_NONE][0]['value'], $slot->field_slot_datetime[LANGUAGE_NONE][0]['timezone_db']);
+    $date_end = new DateObject($slot->field_slot_datetime[LANGUAGE_NONE][0]['value2'], $slot->field_slot_datetime[LANGUAGE_NONE][0]['timezone_db']);
+    date_timezone_set($date_start, timezone_open($slot->field_slot_datetime[LANGUAGE_NONE][0]['timezone']));
+    date_timezone_set($date_end, timezone_open($slot->field_slot_datetime[LANGUAGE_NONE][0]['timezone']));
+    $day = date_format_date($date_start, 'custom', 'F j');
+    $start = date_format_date($date_start, 'custom', 'g:iA');
+    $end = date_format_date($date_end, 'custom', 'g:iA');
+    $ranges[$slot->nid] = array(
+      'day' => $day,
+      'formatted_start' => $start,
+      'formatted_end' => $end,
+      'date_start' => $date_start,
+      'date_end' => $date_end,
+    );
+  }
+  return $ranges[$slot->nid];
+}
+
+/**
+ * Title callback.
+ */
+function _cod_session_scheduler_title($type) {
+  $type_info = node_type_get_type($type);
+  return t('Schedule a @name', array('@name' => $type_info->name));
+}
+
+/**
+ * Implements hook_views_api().
+ */
+function cod_session_views_api() {
+  return array(
+    'api' => 3.0,
+  );
+}
diff --git a/cod_session/cod_session.strongarm.inc b/cod_session/cod_session.strongarm.inc
index 3f66763..aa22513 100644
--- a/cod_session/cod_session.strongarm.inc
+++ b/cod_session/cod_session.strongarm.inc
@@ -5,208 +5,240 @@
  */
 
 /**
- * Implementation of hook_strongarm().
+ * Implements hook_strongarm().
  */
 function cod_session_strongarm() {
   $export = array();
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_anonymous_room';
   $strongarm->value = 0;
   $export['comment_anonymous_room'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_anonymous_schedule_item';
   $strongarm->value = 0;
   $export['comment_anonymous_schedule_item'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_anonymous_session';
   $strongarm->value = 0;
   $export['comment_anonymous_session'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_anonymous_time_slot';
   $strongarm->value = 0;
   $export['comment_anonymous_time_slot'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_default_mode_room';
   $strongarm->value = 1;
   $export['comment_default_mode_room'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_default_mode_schedule_item';
   $strongarm->value = 1;
   $export['comment_default_mode_schedule_item'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_default_mode_session';
   $strongarm->value = 1;
   $export['comment_default_mode_session'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_default_mode_time_slot';
   $strongarm->value = 1;
   $export['comment_default_mode_time_slot'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_default_per_page_room';
   $strongarm->value = '50';
   $export['comment_default_per_page_room'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_default_per_page_schedule_item';
   $strongarm->value = '50';
   $export['comment_default_per_page_schedule_item'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_default_per_page_session';
   $strongarm->value = '50';
   $export['comment_default_per_page_session'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_default_per_page_time_slot';
   $strongarm->value = '50';
   $export['comment_default_per_page_time_slot'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_form_location_room';
   $strongarm->value = 1;
   $export['comment_form_location_room'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_form_location_schedule_item';
   $strongarm->value = 1;
   $export['comment_form_location_schedule_item'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_form_location_session';
   $strongarm->value = 1;
   $export['comment_form_location_session'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_form_location_time_slot';
   $strongarm->value = 1;
   $export['comment_form_location_time_slot'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'comment_page';
+  $strongarm->value = 0;
+  $export['comment_page'] = $strongarm;
+
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_preview_room';
   $strongarm->value = '1';
   $export['comment_preview_room'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_preview_schedule_item';
   $strongarm->value = '1';
   $export['comment_preview_schedule_item'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_preview_session';
   $strongarm->value = '1';
   $export['comment_preview_session'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_preview_time_slot';
   $strongarm->value = '1';
   $export['comment_preview_time_slot'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_room';
   $strongarm->value = '1';
   $export['comment_room'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_schedule_item';
   $strongarm->value = '1';
   $export['comment_schedule_item'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_session';
   $strongarm->value = '2';
   $export['comment_session'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_subject_field_room';
   $strongarm->value = 1;
   $export['comment_subject_field_room'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_subject_field_schedule_item';
   $strongarm->value = 1;
   $export['comment_subject_field_schedule_item'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_subject_field_session';
   $strongarm->value = 1;
   $export['comment_subject_field_session'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_subject_field_time_slot';
   $strongarm->value = 1;
   $export['comment_subject_field_time_slot'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'comment_time_slot';
   $strongarm->value = '1';
   $export['comment_time_slot'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'menu_options_time_slot';
+  $strongarm->value = array(
+    0 => 'main-menu',
+  );
+  $export['menu_options_time_slot'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'menu_parent_time_slot';
+  $strongarm->value = 'main-menu:0';
+  $export['menu_parent_time_slot'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'node_options_page';
+  $strongarm->value = array(
+    0 => 'status',
+  );
+  $export['node_options_page'] = $strongarm;
+
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'node_options_room';
@@ -216,7 +248,7 @@ function cod_session_strongarm() {
   );
   $export['node_options_room'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'node_options_schedule_item';
@@ -226,7 +258,7 @@ function cod_session_strongarm() {
   );
   $export['node_options_schedule_item'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'node_options_session';
@@ -236,7 +268,7 @@ function cod_session_strongarm() {
   );
   $export['node_options_session'] = $strongarm;
 
-  $strongarm = new stdClass;
+  $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
   $strongarm->name = 'node_options_time_slot';
@@ -246,5 +278,26 @@ function cod_session_strongarm() {
   );
   $export['node_options_time_slot'] = $strongarm;
 
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'node_preview_time_slot';
+  $strongarm->value = '1';
+  $export['node_preview_time_slot'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'node_submitted_page';
+  $strongarm->value = FALSE;
+  $export['node_submitted_page'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'node_submitted_time_slot';
+  $strongarm->value = 1;
+  $export['node_submitted_time_slot'] = $strongarm;
+
   return $export;
 }
