diff --git a/features.module b/features.module
index d9ce8d6..167814d 100644
--- a/features.module
+++ b/features.module
@@ -64,230 +64,6 @@ define('FEATURES_DUPLICATES_CONFLICT', 0);
 define('FEATURES_DUPLICATES_ALLOWED', 1);
 
 /**
- * Implements hook_menu().
- */
-function features_menu() {
-  $items = array();
-  $items['admin/structure/features'] = array(
-    'title' => 'Features',
-    'description' => 'Manage features.',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('features_admin_form'),
-    'type' => MENU_NORMAL_ITEM,
-    'file' => 'features.admin.inc',
-  );
-  $items['admin/structure/features/cleanup'] = array(
-    'title' => 'Cleanup',
-    'description' => 'Detect and disable any orphaned feature dependencies.',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('features_cleanup_form', 4),
-    'type' => MENU_CALLBACK,
-    'file' => 'features.admin.inc',
-    'weight' => 1,
-  );
-  $items['admin/structure/features/manage'] = array(
-    'title' => 'Manage',
-    'description' => 'Enable and disable features.',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('features_admin_form'),
-    'type' => MENU_DEFAULT_LOCAL_TASK,
-    'file' => 'features.admin.inc',
-  );
-  $items['admin/structure/features/create'] = array(
-    'title' => 'Create feature',
-    'description' => 'Create a new feature.',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('features_export_form'),
-    'access callback' => 'user_access',
-    'access arguments' => array('administer features'),
-    'type' => MENU_LOCAL_TASK,
-    'file' => "features.admin.inc",
-    'weight' => 10,
-  );
-
-  $items['admin/structure/features/%feature'] = array(
-    'title callback' => 'features_get_feature_title',
-    'title arguments' => array(3),
-    'description' => 'Display components of a feature.',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('features_admin_components', 3),
-    'load arguments' => array(3, TRUE),
-    'access callback' => 'user_access',
-    'access arguments' => array('administer features'),
-    'type' => MENU_CALLBACK,
-    'file' => 'features.admin.inc',
-  );
-  $items['admin/structure/features/%feature/view'] = array(
-    'title' => 'View',
-    'description' => 'Display components of a feature.',
-    'access callback' => 'user_access',
-    'access arguments' => array('administer features'),
-    'type' => MENU_DEFAULT_LOCAL_TASK,
-    'weight' => -10,
-  );
-  $items['admin/structure/features/%feature/recreate'] = array(
-    'title' => 'Recreate',
-    'description' => 'Recreate an existing feature.',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('features_export_form', 3),
-    'load arguments' => array(3, TRUE),
-    'access callback' => 'user_access',
-    'access arguments' => array('administer features'),
-    'type' => MENU_LOCAL_TASK,
-    'file' => "features.admin.inc",
-    'weight' => 11,
-  );
-  if (module_exists('diff')) {
-    $items['admin/structure/features/%feature/diff'] = array(
-      'title' => 'Review overrides',
-      'description' => 'Compare default and current feature.',
-      'page callback' => 'features_feature_diff',
-      'page arguments' => array(3, 5),
-      'load arguments' => array(3, TRUE),
-      'access callback' => 'features_access_override_actions',
-      'access arguments' => array(3),
-      'type' => MENU_LOCAL_TASK,
-      'file' => 'features.admin.inc',
-    );
-  }
-  $items['admin/structure/features/%feature/status'] = array(
-    'title' => 'Status',
-    'description' => 'Javascript status call back.',
-    'page callback' => 'features_feature_status',
-    'page arguments' => array(3),
-    'load arguments' => array(3, TRUE),
-    'access callback' => 'user_access',
-    'access arguments' => array('administer features'),
-    'type' => MENU_CALLBACK,
-    'file' => 'features.admin.inc',
-  );
-  $items['features/autocomplete/packages'] = array(
-    'page callback' => 'features_autocomplete_packages',
-    'access arguments' => array('administer features'),
-    'type' => MENU_CALLBACK,
-    'file' => 'features.admin.inc',
-  );
-  $items['features/ajaxcallback/%'] = array(
-    'title callback' => 'features_get_feature_components',
-    'description' => 'Return components of a feature.',
-    'page callback' => 'features_export_components_json',
-    'page arguments' => array(2),
-    'access callback' => 'user_access',
-    'access arguments' => array('administer features'),
-    'type' => MENU_CALLBACK,
-    'file' => 'features.admin.inc',
-  );
-  foreach ($items as $path => $item) {
-    if (!isset($item['access callback'])) {
-      $items[$path]['access callback'] = 'user_access';
-      $items[$path]['access arguments'] = array('manage features');
-    }
-  }
-  return $items;
-}
-
-/**
- * Implements hook_theme().
- */
-function features_theme() {
-  $base = array(
-    'path' => drupal_get_path('module', 'features') . '/theme',
-    'file' => 'theme.inc',
-  );
-
-  $items = array();
-  $items['features_module_status'] = array(
-    'variables' => array('module' => null, 'status' => null)
-  ) + $base;
-
-  $items['features_components'] = array(
-    'variables' => array('info' => null, 'sources' => null),
-  ) + $base;
-
-  $items['features_component_key'] = $base;
-  $items['features_component_list'] = array(
-    'variables' => array('components' => array(), 'source' => array(), 'conflicts' => array()),
-  ) + $base;
-
-  $items['features_storage_link'] = array(
-    'variables' => array('storage' => null, 'text' => null, 'path' => null, 'options' => array()),
-  ) + $base;
-
-  $items['features_form_components'] =
-  $items['features_form_export'] =
-  $items['features_form_package'] = array(
-    'render element' => 'form',
-  ) + $base;
-
-  $items['features_form_buttons'] = array(
-    'render element' => 'element',
-  ) + $base;
-
-
-  $items['features_admin_components'] = array(
-    'render element' => 'form',
-    'template' => 'features-admin-components',
-  ) + $base;
-
-  return $items;
-}
-
-/**
- * Implements hook_flush_caches().
- */
-function features_flush_caches() {
-  features_rebuild();
-  // Don't flush the modules cache during installation, for performance reasons.
-  if (variable_get('install_task') == 'done') {
-    features_get_modules(NULL, TRUE);
-  }
-  return array();
-}
-
-/**
- * Implements hook_form().
- */
-function features_form($node, $form_state) {
-  return node_content_form($node, $form_state);
-}
-
-/**
- * Implemenation of hook_node_access()
- */
-function features_node_access($node, $op, $account) {
-  return node_node_access($node, $op, $account);
-}
-
-/**
- * Implements hook_permission().
- */
-function features_permission() {
-  return array(
-    'administer features' => array(
-      'title' => t('Administer features'),
-      'description' => t('Perform administration tasks on features.'),
-    ),
-    'manage features' => array(
-      'title' => t('Manage features'),
-      'description' => t('View, enable and disable features.'),
-    ),
-  );
-}
-
-/**
- * Implements hook_help().
- */
-function features_help($path, $arg) {
-  switch ($path) {
-    case 'admin/help#features':
-      $output = file_get_contents(drupal_get_path('module', 'features') .'/README.txt');
-      return module_exists('markdown') ? filter_xss_admin(module_invoke('markdown', 'filter', 'process', 0, -1, $output)) : '<pre>'. check_plain($output) .'</pre>';
-    case 'admin/build/features':
-      return '<p>'. t('A "Feature" is a certain type of Drupal module which contains a package of configuration that, when enabled, provides a new set of functionality for your Drupal site. Enable features by selecting the checkboxes below and clicking the Save configuration button. If the configuration of the feature has been changed its "State" will be either "overridden" or "needs review", otherwise it will be "default", indicating that the configuration has not been changed. Click on the state to see more details about the feature and its components.') .'</p>';
-  }
-}
-
-/**
  * Implements hook_modules_disabled().
  */
 function features_modules_disabled($modules) {
diff --git a/features_ui.info b/features_ui.info
new file mode 100644
index 0000000..2b7f917
--- /dev/null
+++ b/features_ui.info
@@ -0,0 +1,6 @@
+name = "Features UI"
+description = "Provides feature management web interface for Drupal."
+core = 7.x
+package = "Features"
+dependencies[] = features
+files[] = tests/features.test
diff --git a/features_ui.module b/features_ui.module
new file mode 100644
index 0000000..b07bdce
--- /dev/null
+++ b/features_ui.module
@@ -0,0 +1,232 @@
+<?php
+
+/**
+ * @file
+ * Module file for the features_ui module, which enables the web interface to
+ * manage features for a Drupal installation.
+ */
+
+
+/**
+ * Implements hook_menu().
+ */
+function features_menu() {
+  $items = array();
+  $items['admin/structure/features'] = array(
+    'title' => 'Features',
+    'description' => 'Manage features.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('features_admin_form'),
+    'type' => MENU_NORMAL_ITEM,
+    'file' => 'features.admin.inc',
+  );
+  $items['admin/structure/features/cleanup'] = array(
+    'title' => 'Cleanup',
+    'description' => 'Detect and disable any orphaned feature dependencies.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('features_cleanup_form', 4),
+    'type' => MENU_CALLBACK,
+    'file' => 'features.admin.inc',
+    'weight' => 1,
+  );
+  $items['admin/structure/features/manage'] = array(
+    'title' => 'Manage',
+    'description' => 'Enable and disable features.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('features_admin_form'),
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'file' => 'features.admin.inc',
+  );
+  $items['admin/structure/features/create'] = array(
+    'title' => 'Create feature',
+    'description' => 'Create a new feature.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('features_export_form'),
+    'access callback' => 'user_access',
+    'access arguments' => array('administer features'),
+    'type' => MENU_LOCAL_TASK,
+    'file' => "features.admin.inc",
+    'weight' => 10,
+  );
+
+  $items['admin/structure/features/%feature'] = array(
+    'title callback' => 'features_get_feature_title',
+    'title arguments' => array(3),
+    'description' => 'Display components of a feature.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('features_admin_components', 3),
+    'load arguments' => array(3, TRUE),
+    'access callback' => 'user_access',
+    'access arguments' => array('administer features'),
+    'type' => MENU_CALLBACK,
+    'file' => 'features.admin.inc',
+  );
+  $items['admin/structure/features/%feature/view'] = array(
+    'title' => 'View',
+    'description' => 'Display components of a feature.',
+    'access callback' => 'user_access',
+    'access arguments' => array('administer features'),
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+  $items['admin/structure/features/%feature/recreate'] = array(
+    'title' => 'Recreate',
+    'description' => 'Recreate an existing feature.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('features_export_form', 3),
+    'load arguments' => array(3, TRUE),
+    'access callback' => 'user_access',
+    'access arguments' => array('administer features'),
+    'type' => MENU_LOCAL_TASK,
+    'file' => "features.admin.inc",
+    'weight' => 11,
+  );
+  if (module_exists('diff')) {
+    $items['admin/structure/features/%feature/diff'] = array(
+      'title' => 'Review overrides',
+      'description' => 'Compare default and current feature.',
+      'page callback' => 'features_feature_diff',
+      'page arguments' => array(3, 5),
+      'load arguments' => array(3, TRUE),
+      'access callback' => 'features_access_override_actions',
+      'access arguments' => array(3),
+      'type' => MENU_LOCAL_TASK,
+      'file' => 'features.admin.inc',
+    );
+  }
+  $items['admin/structure/features/%feature/status'] = array(
+    'title' => 'Status',
+    'description' => 'Javascript status call back.',
+    'page callback' => 'features_feature_status',
+    'page arguments' => array(3),
+    'load arguments' => array(3, TRUE),
+    'access callback' => 'user_access',
+    'access arguments' => array('administer features'),
+    'type' => MENU_CALLBACK,
+    'file' => 'features.admin.inc',
+  );
+  $items['features/autocomplete/packages'] = array(
+    'page callback' => 'features_autocomplete_packages',
+    'access arguments' => array('administer features'),
+    'type' => MENU_CALLBACK,
+    'file' => 'features.admin.inc',
+  );
+  $items['features/ajaxcallback/%'] = array(
+    'title callback' => 'features_get_feature_components',
+    'description' => 'Return components of a feature.',
+    'page callback' => 'features_export_components_json',
+    'page arguments' => array(2),
+    'access callback' => 'user_access',
+    'access arguments' => array('administer features'),
+    'type' => MENU_CALLBACK,
+    'file' => 'features.admin.inc',
+  );
+  foreach ($items as $path => $item) {
+    if (!isset($item['access callback'])) {
+      $items[$path]['access callback'] = 'user_access';
+      $items[$path]['access arguments'] = array('manage features');
+    }
+  }
+  return $items;
+}
+
+/**
+ * Implements hook_theme().
+ */
+function features_theme() {
+  $base = array(
+    'path' => drupal_get_path('module', 'features') . '/theme',
+    'file' => 'theme.inc',
+  );
+
+  $items = array();
+  $items['features_module_status'] = array(
+    'variables' => array('module' => null, 'status' => null)
+  ) + $base;
+
+  $items['features_components'] = array(
+    'variables' => array('info' => null, 'sources' => null),
+  ) + $base;
+
+  $items['features_component_key'] = $base;
+  $items['features_component_list'] = array(
+    'variables' => array('components' => array(), 'source' => array(), 'conflicts' => array()),
+  ) + $base;
+
+  $items['features_storage_link'] = array(
+    'variables' => array('storage' => null, 'text' => null, 'path' => null, 'options' => array()),
+  ) + $base;
+
+  $items['features_form_components'] =
+  $items['features_form_export'] =
+  $items['features_form_package'] = array(
+    'render element' => 'form',
+  ) + $base;
+
+  $items['features_form_buttons'] = array(
+    'render element' => 'element',
+  ) + $base;
+
+
+  $items['features_admin_components'] = array(
+    'render element' => 'form',
+    'template' => 'features-admin-components',
+  ) + $base;
+
+  return $items;
+}
+
+/**
+ * Implements hook_flush_caches().
+ */
+function features_flush_caches() {
+  features_rebuild();
+  // Don't flush the modules cache during installation, for performance reasons.
+  if (variable_get('install_task') == 'done') {
+    features_get_modules(NULL, TRUE);
+  }
+  return array();
+}
+
+/**
+ * Implements hook_form().
+ */
+function features_form($node, $form_state) {
+  return node_content_form($node, $form_state);
+}
+
+/**
+ * Implemenation of hook_node_access()
+ */
+function features_node_access($node, $op, $account) {
+  return node_node_access($node, $op, $account);
+}
+
+/**
+ * Implements hook_permission().
+ */
+function features_permission() {
+  return array(
+    'administer features' => array(
+      'title' => t('Administer features'),
+      'description' => t('Perform administration tasks on features.'),
+    ),
+    'manage features' => array(
+      'title' => t('Manage features'),
+      'description' => t('View, enable and disable features.'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_help().
+ */
+function features_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#features':
+      $output = file_get_contents(drupal_get_path('module', 'features') .'/README.txt');
+      return module_exists('markdown') ? filter_xss_admin(module_invoke('markdown', 'filter', 'process', 0, -1, $output)) : '<pre>'. check_plain($output) .'</pre>';
+    case 'admin/build/features':
+      return '<p>'. t('A "Feature" is a certain type of Drupal module which contains a package of configuration that, when enabled, provides a new set of functionality for your Drupal site. Enable features by selecting the checkboxes below and clicking the Save configuration button. If the configuration of the feature has been changed its "State" will be either "overridden" or "needs review", otherwise it will be "default", indicating that the configuration has not been changed. Click on the state to see more details about the feature and its components.') .'</p>';
+  }
+}
