diff --git a/css/responsive_menu_combined.css b/css/responsive_menu_combined.css
index e69de29..e26e690 100644
--- a/css/responsive_menu_combined.css
+++ b/css/responsive_menu_combined.css
@@ -0,0 +1,10 @@
+.responsive-menu-combined__menu-first {
+    border: 0;
+    clip: rect(0 0 0 0);
+    height: 1px;
+    margin: -1px;
+    overflow: hidden;
+    padding: 0;
+    position: absolute;
+    width: 1px;
+}
\ No newline at end of file
diff --git a/responsive_menu_combined.admin.inc b/responsive_menu_combined.admin.inc
index 56626a1..c7bfc05 100644
--- a/responsive_menu_combined.admin.inc
+++ b/responsive_menu_combined.admin.inc
@@ -48,15 +48,53 @@ function responsive_menu_combined_admin_form($form, $form_state) {
       '#size' => 3,
       '#attributes' => array('class' => array('item-row-weight')),
     );
+    // Nesting code based on http://cgit.drupalcode.org/examples/tree/tabledrag_example/tabledrag_example_parent_form.inc?id=7.x-1.x
+    $form['draggable_responsive_menu_combined'][$key]['id'] = array(
+      '#type' => 'textfield',
+      '#size' => 10,
+      '#default_value' => $key,
+      '#disabled' => TRUE,
+      '#attributes' => array('class' => array('item-row-id', 'tabledrag-hide')), // TODO: get this in the right spot (it's on the form element instead of the cell) at least, but preferably figure out why this is needed at all - it should be applied automatically by tabledrag.
+    );
+    $form['draggable_responsive_menu_combined'][$key]['pid'] = array(
+      '#type' => 'textfield',
+      '#size' => 10,
+      '#default_value' => isset($row_values['pid']) ? $row_values['pid'] : '',
+      '#attributes' => array('class' => array('item-row-pid')),
+    );
+    $form['draggable_responsive_menu_combined'][$key]['depth'] = array(
+      '#type' => 'hidden',
+      '#value' => isset($row_values['depth']) ? $row_values['depth'] : '',
+      '#attributes' => array('class' => array('item-row-depth')),
+    );
     $i++;
   }
-
-  $form['display_parent_title'] = array(
+  $form['advanced_options'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Advanced Options'),
+    '#collapsible' => TRUE,
+    '#collapsed' => FALSE,
+  );
+  $form['advanced_options']['display_parent_title'] = array(
     '#type' => 'checkbox',
     '#title' => t('Display parent title'),
-    '#description' => t('When you are inside a sub-navigration pane, display the parents title below the back button.'),
+    '#description' => t('When you are inside a sub-navigation pane, display the parents title below the back button.'),
     '#default_value' => variable_get('responsive_menu_combined_display_parent_title', ''),
   );
+  $form['advanced_options']['html_tags'] = array(
+    '#type' => 'select',
+    '#title' => 'Menu HTML tag',
+    '#options' => array(
+      'h1' => '<h1>',
+      'h2' => '<h2>',
+      'h3' => '<h3>',
+      'h4' => '<h4>',
+      'h5' => '<h5>',
+      'h6' => '<h6>',
+    ),
+    '#default_value' => variable_get('responsive_menu_combined_html_tags', 'H2'),
+    '#description' => t('Select the HTML tag you would like to use for the menu titles.'),
+  );
   $form['help_text'] = array(
     '#markup' => '<div>' . t('Note: Empty menus will be hidden.') . '</div>',
   );
@@ -76,5 +114,6 @@ function responsive_menu_combined_admin_form($form, $form_state) {
 function responsive_menu_combined_form_submit($form, &$form_state) {
   variable_set('responsive_menu_combined_settings', $form_state['values']['draggable_responsive_menu_combined']);
   variable_set('responsive_menu_combined_display_parent_title', $form_state['values']['display_parent_title']);
+  variable_set('responsive_menu_combined_html_tags', $form_state['values']['html_tags']);
 }
 
diff --git a/responsive_menu_combined.info b/responsive_menu_combined.info
index f288968..ce3472e 100644
--- a/responsive_menu_combined.info
+++ b/responsive_menu_combined.info
@@ -1,5 +1,5 @@
 name = Repsonsive Menu Combined
 description = Combine multiple menus into your repsonsive hamburger
 core = 7.x
-configure = admin/structure/menu/combined
 stylesheets[all][] = css/responsive_menu_combined.css
+configure = admin/structure/menu/combined
diff --git a/responsive_menu_combined.module b/responsive_menu_combined.module
index e952cf8..4676491 100644
--- a/responsive_menu_combined.module
+++ b/responsive_menu_combined.module
@@ -98,6 +98,17 @@ function _responsive_menu_combined_block_responsive_menu_combined() {
       }
     }
   }
+
+  // Separate top-level menus from nested menus.
+  $menu_nested = array();
+  foreach ($menus_enabled as $key => $values) {
+    if (!empty($values['pid'])) {
+      // Assign the nested menus to their own array and remove them from the main array.
+      $menu_nested[$values['pid']][$key] = $values;
+      unset($menus_enabled[$key]);
+    }
+  }
+
   // Sort menus by weights.
   uasort($menus_enabled, '_responsive_menu_combined_cmp');
 
@@ -109,6 +120,7 @@ function _responsive_menu_combined_block_responsive_menu_combined() {
     // Change the theme for all links.
     $search_pattern = 'menu_tree__' . str_replace("-", "_", $key);
     $replacement_pattern = 'menu_tree_responsive__' . str_replace("-", "_", $key);
+    $html_tags = variable_get('responsive_menu_combined_html_tags', 'H2');
     // A faster way to replace the string in multidimensional array is to
     // json_encode it, do the str_replace() and then json_decode() it.
     $menu_tree_output_replaced = json_decode(str_replace($search_pattern, $replacement_pattern, json_encode($values['menu_tree_output'])), TRUE);
@@ -123,7 +135,25 @@ function _responsive_menu_combined_block_responsive_menu_combined() {
     }
     $output .= "<label for='tab-$key'>" . $values['friendly_name'] . "</label>\n";
     $output .= "<div class='content'>\n";
+    $output .= "<" . $html_tags . " class='responsive-menu-combined__menu-first'>" . $values['friendly_name'] . "</" . $html_tags . ">";
     $output .= drupal_render($menu_tree_output_replaced);
+    if (!empty($menu_nested[$key])) {
+      // Sort nested menus by weight.
+      uasort($menu_nested[$key], '_responsive_menu_combined_cmp');
+      // Render all the nested menus.
+      foreach ($menu_nested[$key] as $nested_key => $nested_values) {
+        // Change the theme for all links.
+        $search_pattern = 'menu_tree__' . str_replace("-", "_", $nested_key);
+        $replacement_pattern = 'menu_tree_responsive__' . str_replace("-", "_", $nested_key);
+        // A faster way to replace the string in multidimensional array is to
+        // json_encode it, do the str_replace() and then json_decode() it.
+        $menu_tree_output_replaced = json_decode(str_replace($search_pattern, $replacement_pattern, json_encode($nested_values['menu_tree_output'])), TRUE);
+
+        // Output the nested header and menu.
+        $output .= "<" . $html_tags . ">" . $nested_values['friendly_name'] . "</" . $html_tags . ">";
+        $output .= drupal_render($menu_tree_output_replaced);
+      }
+    }
     $output .= "</div>\n";
     $output .= "</div>\n";
     $i++;
@@ -225,28 +255,64 @@ function theme_menu_tree_responsive($variables) {
  */
 function theme_responsive_menu_combined_table_drag_components($variables) {
   $element = $variables['element'];
-  drupal_add_tabledrag('responsive_menu_combined_table', 'order', 'siblings', 'item-row-weight');
+  $table_id = 'responsive_menu_combined_table';
+  // Nesting code based on http://cgit.drupalcode.org/examples/tree/tabledrag_example/tabledrag_example_parent_form.inc?id=7.x-1.x
+  drupal_add_tabledrag($table_id, 'match', 'parent', 'item-row-pid', 'item-row-pid', 'item-row-id', TRUE, 1);
+  drupal_add_tabledrag($table_id, 'order', 'sibling', 'item-row-weight', NULL, NULL, TRUE, 1);
   $header = array(
-      'label' => t('Menu'),
-      'enabled' => t('Enabled/disabled'),
-      'friendly_name' => t('Visible Menu Name'),
-      'weight' => t('Weight'),
+    'label' => t('Menu'),
+    'enabled' => t('Enabled/disabled'),
+    'friendly_name' => t('Visible Menu Name'),
+    'weight' => t('Weight'),
+    'id' => array(
+      'data' => t('ID'),
+      // TODO: Figure out why this is needed at all - it should be applied automatically by tabledrag.
+      'class' => 'tabledrag-hide',
+    ),
+    'pid' => t('PID'),
   );
-
   $rows = array();
-  foreach (element_children($element) as $key) {
+  foreach (element_children($element) as $id => $key) {
     $row = array();
     $row['data'] = array();
     foreach ($header as $fieldname => $title) {
       $row['data'][] = drupal_render($element[$key][$fieldname]);
       $row['class'] = array('draggable');
     }
-    $rows[] = $row;
+    $weight = $element[$key]['weight']['#value'];
+    $parent = $element[$key]['pid']['#value'];
+    $depth = !empty($element[$key]['pid']['#value']) ? 1 : 0;
+    $indent = theme('indentation', array('size' => $depth));
+    $row['data'][0] = $indent . $row['data'][0];
+    // Separate out the parent rows from the indented rows.
+    if ($depth) {
+      $indent_rows[$parent][$weight] = $row;
+    }
+    else {
+      $rows[$weight] = $row;
+      $rowkey[$weight] = $key;
+    }
   }
-
+  // Sort the parent rows by weight, then insert the indented rows under their parents.
+  ksort($rows);
+  $newrows = array();
+  foreach ($rows as $weight => $row) {
+    $newrows[] = $row;
+    if (!empty($indent_rows[$rowkey[$weight]])) {
+      $key = $rowkey[$weight];
+      // Sort the indented rows by weight.
+      ksort($indent_rows[$key]);
+      foreach ($indent_rows[$key] as $row) {
+        $newrows[] = $row;
+      }
+    }
+  }
+  // Replace the original definition of rows.
+  $rows = $newrows;
+  // Return the themed rows.
   return theme('table', array(
-      'header' => $header,
-      'rows' => $rows,
-      'attributes' => array('id' => 'responsive_menu_combined_table'),
+    'header' => $header,
+    'rows' => $rows,
+    'attributes' => array('id' => 'responsive_menu_combined_table'),
   ));
 }
