diff --git a/menuadminsplitter.module b/menuadminsplitter.module
index df6ac3c..999cb63 100644
--- a/menuadminsplitter.module
+++ b/menuadminsplitter.module
@@ -1,75 +1,76 @@
 <?php
 
 /**
- * Implementation of hook_init().
+ * @file
+ * Allow smaller portions of a menu to be load on administrative screens.
  */
-function menuadminsplitter_init() {
-  global $user;
-
-  // If there's no values for the menu admin page's filter form, set some
-  // some default variables.
-  if ($user->uid && user_access('administer menu')) {
-    // Load the user's data first.
-    $data = $user->data;
-    // Possible new values will be stored here.
-    $values = array();
-
-    // No item selected, show all by default.  
-    if (empty($data['menuadminsplitter_filter']['menu_item'])) {
-      $values['menuadminsplitter_filter']['menu_item'] = 'all';
-    }
-    // No 'depth' value selected, show only second level by default.
-    if (empty($data['menuadminsplitter_filter']['menu_item_depth'])) {
-      $values['menuadminsplitter_filter']['menu_item_depth'] = 2;
-    }
 
-    // Save the new values into the user object.
-    user_save($user, $values);
+/**
+ * Implements hook_menu_alter().
+ */
+function menuadminsplitter_menu_alter(&$items) {
+
+  // Take over the the menu administration path.
+  if (!empty($items['admin/structure/menu/manage/%menu']['page arguments'][0])) {
+    $items['admin/structure/menu/manage/%menu']['page arguments'][0] = 'menuadminsplitter_overview_form';
   }
 }
 
 /**
- * Implementation of hook_form_alter().
+ * Implements hook_theme().
  */
-function menuadminsplitter_form_menu_overview_form_alter(&$form, &$form_state) {
-  
-  global $menu_admin;
-  global $user;
-  $menu['menu_name'] = $form['#menu']['menu_name'];
+function menuadminsplitter_theme() {
+  return array(
+    'menuadminsplitter_overview_form' => array(
+      'render element' => 'form',
+      'function' => 'theme_menu_overview_form',
+    )
+  );
+}
 
-  // Load the user's data possibly containing form defaults.
-  $data = $user->data;
-  $user_data = is_array($data['menuadminsplitter_filter']) ? $data['menuadminsplitter_filter'] : array();
-  $where = '';
+/**
+ * Form for editing an entire menu tree at once.
+ *
+ * Shows for one menu the menu links accessible to the current user and
+ * relevant operations.
+ */
+function menuadminsplitter_overview_form($form, &$form_state, $menu, $depth = 1, $top_level_link = 'all') {
 
   // Render the filter form.
-  $form['#prefix'] = drupal_render(drupal_get_form('menuadminsplitter_filter_form')); // drupal_get_form returns an array in d7, use of drupal_render() is not encouraged
-
-  // There is some values found from the session and user didn't want all items.
-  $item = 0; 
-  $depth = 0;
-  $args = array();
-  $args[':menu_name'] = $menu['menu_name'];
-  if (!empty($user_data['menu_item']) && $user_data['menu_item'] != 'all') {
-    $where .= " AND ml.p1 = :item";
-    $item = $user_data['menu_item'];
-    $args[':item'] = $item; 
-  }
-  if (!empty($user_data['menu_item_depth'])) {
-    $where .= " AND ml.depth <= :depth";
-    $depth = $user_data['menu_item_depth'];
-    $args[':depth'] = $depth;
-  }
-  // SQL for getting the menu items.
+  // @todo Should drupal_render() not be called here? Is there a better way?
+  $form['#prefix'] = drupal_render(drupal_get_form('menuadminsplitter_filter_form', $menu, $depth, $top_level_link));
+
+  global $menu_admin;
+  $form['#attached']['css'] = array(drupal_get_path('module', 'menu') . '/menu.css');
   $sql = "
     SELECT m.load_functions, m.to_arg_functions, m.access_callback, m.access_arguments, m.page_callback, m.page_arguments, m.delivery_callback, m.title, m.title_callback, m.title_arguments, m.type, m.description, ml.*
     FROM {menu_links} ml LEFT JOIN {menu_router} m ON m.path = ml.router_path
-    WHERE ml.menu_name = :menu_name $where
-    ORDER BY p1 ASC, p2 ASC, p3 ASC, p4 ASC, p5 ASC, p6 ASC, p7 ASC, p8 ASC, p9 ASC";
+    WHERE ml.menu_name = :menu ";
+
+  $sql_replacements = array(':menu' => $menu['menu_name']);
+
+  // Check if there is a depth limit.
+  if (is_numeric($depth)) {
+    $depth_integer = intval($depth);
+    if ($depth_integer >= 0 && $depth_integer <= MENU_MAX_DEPTH) {
+      $sql .= 'and ml.depth <= :depth';
+      $sql_replacements[':depth'] = $depth_integer;
+    }
+  }
+
+  // Only add more to the query if this is a menu link id. The query should be be
+  // changed if this value is the default 'all' (or anything else).
+  if (is_numeric($top_level_link)) {
+    // Ensure the that an integer is getting sent to sql and not a float.
+    $top_level_link_integer = intval($top_level_link);
+    $sql .= ' and ml.p1 = :top_level_link';
+    $sql_replacements[':top_level_link'] = $top_level_link_integer;
+  }
 
-  
-  // Add our own parameters to the function from the session.
-  $result = db_query($sql, $args, array('fetch' => PDO::FETCH_ASSOC));
+  // Add the ordering.
+  $sql .= " ORDER BY p1 ASC, p2 ASC, p3 ASC, p4 ASC, p5 ASC, p6 ASC, p7 ASC, p8 ASC, p9 ASC";
+
+  $result = db_query($sql, $sql_replacements, array('fetch' => PDO::FETCH_ASSOC));
   $links = array();
   foreach ($result as $item) {
     $links[] = $item;
@@ -77,49 +78,50 @@ function menuadminsplitter_form_menu_overview_form_alter(&$form, &$form_state) {
   $tree = menu_tree_data($links);
   $node_links = array();
   menu_tree_collect_node_links($tree, $node_links);
-  
   // We indicate that a menu administrator is running the menu access check.
   $menu_admin = TRUE;
   menu_tree_check_access($tree, $node_links);
   $menu_admin = FALSE;
 
-  // Unset all menu items on the form.
-  foreach ($form as $element_name => $element) {
-    if (strstr($element_name, 'mlid:')) {      
-      unset($form[$element_name]);
-    }
+  $form = array_merge($form, _menu_overview_tree_form($tree));
+  $form['#menu'] =  $menu;
+
+  if (element_children($form)) {
+    $form['actions'] = array('#type' => 'actions');
+    $form['actions']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Save configuration'),
+    );
   }
-  
-  
-  // Call our version of _menu_overview_tree_form.
-  $new_form = _menuadminsplitter_overview_tree_form($tree);
-  // Merge the form.
-  $form = array_merge($form, $new_form);
+  else {
+    $form['#empty_text'] = t('There are no menu links yet. <a href="@link">Add link</a>.', array('@link' => url('admin/structure/menu/manage/' . $form['#menu']['menu_name'] .'/add')));
+  }
+
+  // Set the submit handler to the core submit function.
+  $form['#submit'] = array('menu_overview_form_submit');
 
+  return $form;
 }
 
 /**
  * Create our filter form for the menu admin page.
  */
-function menuadminsplitter_filter_form() {
-  global $user;
-  $menu_name = arg(4);
-  $form = array();
+function menuadminsplitter_filter_form($form, &$form_state, $menu, $default_depth, $top_level_link = 'all') {
 
-  // Load the user's data possibly containing form defaults.
-  $data = $user->data;
-  $user_data = is_array($data['menuadminsplitter_filter']) ? $data['menuadminsplitter_filter'] : array();
+  $menu_name = $menu['menu_name'];
+  $form = array();
 
   // Get first level menu items for the select list.
   $sql = "SELECT mlid, link_title FROM {menu_links} WHERE p2 = :p2 AND menu_name = :menu_name ORDER BY weight";
   $result = db_query($sql, array(
-    ':p2' => 0, 
+    ':p2' => 0,
     ':menu_name' => $menu_name
   ));
   $menu_items = array('all' => t('All'));
   while ($menu_item = $result->fetchAssoc()) {
     $menu_items[$menu_item['mlid']] = $menu_item['link_title'];
   }
+
   // Get maximum possible depth for the menu.
   $max_menu_depth = db_query("SELECT MAX(depth) FROM {menu_links} WHERE menu_name = :menu_name", array(':menu_name' => $menu_name))->fetchField();
   $menu_depth = array();
@@ -133,24 +135,26 @@ function menuadminsplitter_filter_form() {
     '#type' => 'fieldset',
     '#title' => t('Filter menu items'),
   );
-  
+
   $form['menusplitter_filter']['menu_name'] = array(
-    '#type' => 'hidden',
+    '#type' => 'value',
     '#value' => $menu_name,
   );
+
   $form['menusplitter_filter']['menu_item'] = array(
     '#type' => 'select',
     '#title' => t('Menu item'),
-    '#description' => t('Menu item which child items you would like to edit. <strong>Warning!</strong> Loading all items with very huge menu might take a very long time.'),
+    '#description' => t('Menu item which child items you would like to edit. Loading all items with in a large menu may take a long time.'),
     '#options' => $menu_items,
-    '#default_value' => isset($user_data['menu_item']) ? $user_data['menu_item'] : '',
+    '#default_value' => $top_level_link,
   );
+
   $form['menusplitter_filter']['menu_item_depth'] = array(
     '#type' => 'select',
     '#title' => t('Depth of items to return'),
     '#description' => t('Higher number means slower page loading time.'),
     '#options' => $menu_depth,
-    '#default_value' => isset($user_data['menu_item_depth']) ? $user_data['menu_item_depth'] : '',
+    '#default_value' => $default_depth,
   );
   $form['menusplitter_filter']['submit'] = array(
     '#type' => 'submit',
@@ -160,83 +164,25 @@ function menuadminsplitter_filter_form() {
 }
 
 /**
- * Set the values into the user object.
+ * Redirect based on the values submitted in menuadminsplitter_filter_form().
  */
 function menuadminsplitter_filter_form_submit($form, &$form_state) {
-  $values['menuadminsplitter_filter']['menu_item'] = $form_state['values']['menu_item'];
-  $values['menuadminsplitter_filter']['menu_item_depth'] = $form_state['values']['menu_item_depth'];
-  global $user;
-  $data = array('menuadminsplitter' => $values);
-  user_save($user, $data);
-}
 
-function menuadminsplitter_user_presave(&$edit, $account, $category) {
-  // Make sure that our form value 'mymodule_foo' is stored as 'mymodule_bar'.
-  if (isset($edit['menuadminsplitter']['menuadminsplitter_filter'])) {                   
-    $edit['data']['menuadminsplitter_filter'] = $edit['menuadminsplitter']['menuadminsplitter_filter'];
-  }  
-}
+  $redirect = FALSE;
+  $values = $form_state['values'];
 
-/**
- * Recursive helper function for menu_overview_form().
- *
- * This is the very same _menu_overview_tree_form() function that is found from
- * menu.admin.inc. For some weird reason, calling the _menu_overview_tree_form()
- * renders all items in current menu instead of the items that we gave for it.
- * This way it works. 
- * 
- * (the drupal_static might be the clue)
- */
-function _menuadminsplitter_overview_tree_form($tree) {
-  $form = &drupal_static(__FUNCTION__, array('#tree' => TRUE));
-  foreach ($tree as $data) {
-    $title = '';
-    $item = $data['link'];
-    // Don't show callbacks; these have $item['hidden'] < 0.
-    if ($item && $item['hidden'] >= 0) {
-      $mlid = 'mlid:' . $item['mlid'];
-      $form[$mlid]['#item'] = $item;
-      $form[$mlid]['#attributes'] = $item['hidden'] ? array('class' => array('menu-disabled')) : array('class' => array('menu-enabled'));
-      $form[$mlid]['title']['#markup'] = l($item['title'], $item['href'], $item['localized_options']) . ($item['hidden'] ? ' (' . t('disabled') . ')' : '');
-      
-      $form[$mlid]['hidden'] = array(
-        '#type' => 'checkbox',
-        '#title' => t('Enable @title menu link', array('@title' => $item['title'])),
-        '#title_display' => 'invisible',
-        '#default_value' => !$item['hidden'],
-      );
-      $form[$mlid]['weight'] = array(
-        '#type' => 'weight',
-        '#delta' => 50,
-        '#default_value' => $item['weight'],
-        '#title_display' => 'invisible',
-        '#title' => t('Weight for @title', array('@title' => $item['title'])),
-      );
-      $form[$mlid]['mlid'] = array(
-        '#type' => 'hidden',
-        '#value' => $item['mlid'],
-      );
-      $form[$mlid]['plid'] = array(
-        '#type' => 'hidden',
-        '#default_value' => $item['plid'],
-      );
-      // Build a list of operations.
-      $operations = array();
-      $operations['edit'] = array('#type' => 'link', '#title' => t('edit'), '#href' => 'admin/structure/menu/item/' . $item['mlid'] . '/edit');
-      // Only items created by the menu module can be deleted.
-      if ($item['module'] == 'menu' || $item['updated'] == 1) {
-        $operations['delete'] = array('#type' => 'link', '#title' => t('delete'), '#href' => 'admin/structure/menu/item/' . $item['mlid'] . '/delete');
-      }
-      // Set the reset column.
-      elseif ($item['module'] == 'system' && $item['customized']) {
-        $operations['reset'] = array('#type' => 'link', '#title' => t('reset'), '#href' => 'admin/structure/menu/item/' . $item['mlid'] . '/reset');
-      }
-      $form[$mlid]['operations'] = $operations;
-    }
+  if (!empty($values['menu_name']) && !empty($values['menu_item_depth'])) {
+    $redirect = 'admin/structure/menu/manage/' . $values['menu_name'] . '/' . $values['menu_item_depth'];
 
-    if ($data['below']) {
-      _menuadminsplitter_overview_tree_form($data['below']);
+    // Concatenate on the menu_item.
+    if ($values['menu_item'] === 'all' || is_numeric($values['menu_item'])) {
+      $redirect .= '/' . $values['menu_item'];
     }
+    // @todo, the values of menu_item and depth could be stored to variable_set()
+    // for default values.
+  }
+
+  if ($redirect) {
+    $form_state['redirect'] = array($redirect);
   }
-  return $form;
 }
