diff --git logintoboggan.info logintoboggan.info
index 9f99d7d..ddbd57e 100644
--- logintoboggan.info
+++ logintoboggan.info
@@ -3,6 +3,7 @@
 name = "LoginToboggan"
 description = "Improves Drupal's login system."
 core = "7.x"
+package = "LoginToboggan"
 
 files[] = logintoboggan.install
 files[] = logintoboggan.module
diff --git logintoboggan.install logintoboggan.install
index b1f3551..9a333dd 100644
--- logintoboggan.install
+++ logintoboggan.install
@@ -14,6 +14,16 @@ function logintoboggan_update_last_removed() {
 }
 
 /**
+ * Move email login feature to its own module.
+ */
+function logintoboggan_update_7001() {
+  if (variable_get('logintoboggan_login_with_email', 0)) {
+    module_enable('email_login');
+    variable_del('logintoboggan_login_with_email');
+  }
+}
+
+/**
  * Implement hook_disable().
  *
  */
@@ -31,7 +41,6 @@ function logintoboggan_uninstall() {
   $variables = array(
     'logintoboggan_login_block_type',
     'logintoboggan_login_block_message',
-    'logintoboggan_login_with_email',
     'logintoboggan_confirm_email_at_registration',
     'logintoboggan_pre_auth_role',
     'logintoboggan_purge_unvalidated_user_interval',
diff --git logintoboggan.module logintoboggan.module
index bb802a7..7500513 100755
--- logintoboggan.module
+++ logintoboggan.module
@@ -353,18 +353,6 @@ function logintoboggan_form_alter(&$form, &$form_state, $form_id) {
           '#weight' => -50,
         );
       }
-      if (variable_get('logintoboggan_login_with_email', 0)) {
-        // Ensure a valid validate array.
-        $form['#validate'] = is_array($form['#validate']) ? $form['#validate'] : array();
-        // LT's validation function must run first.
-        array_unshift($form['#validate'],'logintoboggan_user_login_validate');
-        // Use theme functions to print the username field's textual labels.
-        $form['name']['#title']       = theme('lt_username_title', array('form_id' => $form_id));
-        $form['name']['#description'] = theme('lt_username_description', array('form_id' => $form_id));
-        // Use theme functions to print the password field's textual labels.
-        $form['pass']['#title']       = theme('lt_password_title', array('form_id' => $form_id));
-        $form['pass']['#description'] = theme('lt_password_description', array('form_id' => $form_id));
-      }
 
       if (($form_id == 'user_login_block')) {
         $block_type = variable_get('logintoboggan_login_block_type', 0);
@@ -760,18 +748,6 @@ function logintoboggan_revalidate_access($account) {
  */
 function logintoboggan_theme($existing, $type, $theme, $path) {
   return array(
-    'lt_username_title' => array(
-      'variables' => array('form_id' => NULL),
-    ),
-    'lt_username_description' => array(
-      'variables' => array('form_id' => NULL),
-    ),
-    'lt_password_title' => array(
-      'variables' => array('form_id' => NULL),
-    ),
-    'lt_password_description' => array(
-      'variables' => array('form_id' => NULL),
-    ),
     'lt_access_denied' => array(
       'variables' => array(),
     ),
@@ -875,14 +851,6 @@ function logintoboggan_main_settings(&$form_state) {
     '#title' => t('Login'),
   );
 
-  $form['login']['logintoboggan_login_with_email'] = array(
-    '#type' => 'radios',
-    '#title' => t('Allow users to login using their e-mail address'),
-    '#default_value' => variable_get('logintoboggan_login_with_email', 0),
-    '#options' => array($_disabled, $_enabled),
-    '#description' => t('Users will be able to enter EITHER their username OR their e-mail address to log in.'),
-  );
-
   $form['registration'] = array(
     '#type' => 'fieldset',
     '#title' => t('Registration'),
@@ -1373,67 +1341,6 @@ function logintoboggan_mail_alter(&$message) {
  */
 
 /**
- * Theme the username title of the user login form
- * and the user login block.
- */
-function theme_lt_username_title($variables) {
-  switch ($variables['form_id']) {
-    case 'user_login':
-      // Label text for the username field on the /user/login page.
-      return t('Username or e-mail address');
-      break;
-
-    case 'user_login_block':
-      // Label text for the username field when shown in a block.
-      return t('Username or e-mail');
-      break;
-  }
-}
-
-/**
- * Theme the username description of the user login form
- * and the user login block.
- */
-function theme_lt_username_description($variables) {
-  switch ($variables['form_id']) {
-    case 'user_login':
-      // The username field's description when shown on the /user/login page.
-      return t('You may login with either your assigned username or your e-mail address.');
-      break;
-    case 'user_login_block':
-      return '';
-      break;
-  }
-}
-
-/**
- * Theme the password title of the user login form
- * and the user login block.
- */
-function theme_lt_password_title($variables) {
-  // Label text for the password field.
-  return t('Password');
-}
-
-/**
- * Theme the password description of the user login form
- * and the user login block.
- */
-function theme_lt_password_description($variables) {
-  switch ($variables['form_id']) {
-    case 'user_login':
-      // The password field's description on the /user/login page.
-      return t('The password field is case sensitive.');
-      break;
-
-    case 'user_login_block':
-      // If showing the login form in a block, don't print any descriptive text.
-      return '';
-      break;
-  }
-}
-
-/**
  * Theme the Access Denied message.
  */
 function theme_lt_access_denied($variables) {
diff --git modules/email_login/email_login.info modules/email_login/email_login.info
new file mode 100644
index 0000000..7971516
--- /dev/null
+++ modules/email_login/email_login.info
@@ -0,0 +1,5 @@
+name = Email Login
+description = Allows users to log in using their email address.
+core = 7.x
+package = "LoginToboggan"
+files[] = email_login.module
\ No newline at end of file
diff --git modules/email_login/email_login.module modules/email_login/email_login.module
new file mode 100644
index 0000000..4544e08
--- /dev/null
+++ modules/email_login/email_login.module
@@ -0,0 +1,123 @@
+<?php
+/**
+ * @file
+ * Allow users to log in using their email address.
+ */
+
+/**
+ * Implements hook_form_alter().
+ *
+ * Add our custom validation handler to user login forms, and use theme
+ * functions for the title and description of the username and password fields.
+ */
+function email_login_form_alter(&$form, &$form_state, $form_id) {
+  switch ($form_id) {
+    case 'user_login':
+    case 'user_login_block':
+      // Ensure a valid validate array.
+      $form['#validate'] = is_array($form['#validate']) ? $form['#validate'] : array();
+      // LT's validation function must run first.
+      array_unshift($form['#validate'],'email_login_user_login_validate');
+      // Use theme functions to print the username field's textual labels.
+      $form['name']['#title']       = theme('lt_username_title', array('form_id' => $form_id));
+      $form['name']['#description'] = theme('lt_username_description', array('form_id' => $form_id));
+      // Use theme functions to print the password field's textual labels.
+      $form['pass']['#title']       = theme('lt_password_title', array('form_id' => $form_id));
+      $form['pass']['#description'] = theme('lt_password_description', array('form_id' => $form_id));
+      break;
+  }
+}
+
+/**
+ * Custom validation handler for user login forms.
+ */
+function email_login_user_login_validate($form, &$form_state) {
+  if (isset($form_state['values']['name']) && $form_state['values']['name']) {
+    if ($name = db_query("SELECT name FROM {users} WHERE LOWER(mail) = LOWER(:name)", array(
+      ':name' => $form_state['values']['name'],
+    ))->fetchField()) {
+      form_set_value($form['name'], $name, $form_state);
+    }
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function email_login_theme() {
+  return array(
+    'lt_username_title' => array(
+      'variables' => array('form_id' => NULL),
+    ),
+    'lt_username_description' => array(
+      'variables' => array('form_id' => NULL),
+    ),
+    'lt_password_title' => array(
+      'variables' => array('form_id' => NULL),
+    ),
+    'lt_password_description' => array(
+      'variables' => array('form_id' => NULL),
+    ),
+  );
+}
+
+/**
+ * Theme the username title of the user login form
+ * and the user login block.
+ */
+function theme_lt_username_title($variables) {
+  switch ($variables['form_id']) {
+    case 'user_login':
+      // Label text for the username field on the /user/login page.
+      return t('Username or e-mail address');
+      break;
+
+    case 'user_login_block':
+      // Label text for the username field when shown in a block.
+      return t('Username or e-mail');
+      break;
+  }
+}
+
+/**
+ * Theme the username description of the user login form
+ * and the user login block.
+ */
+function theme_lt_username_description($variables) {
+  switch ($variables['form_id']) {
+    case 'user_login':
+      // The username field's description when shown on the /user/login page.
+      return t('You may login with either your assigned username or your e-mail address.');
+      break;
+    case 'user_login_block':
+      return '';
+      break;
+  }
+}
+
+/**
+ * Theme the password title of the user login form
+ * and the user login block.
+ */
+function theme_lt_password_title($variables) {
+  // Label text for the password field.
+  return t('Password');
+}
+
+/**
+ * Theme the password description of the user login form
+ * and the user login block.
+ */
+function theme_lt_password_description($variables) {
+  switch ($variables['form_id']) {
+    case 'user_login':
+      // The password field's description on the /user/login page.
+      return t('The password field is case sensitive.');
+      break;
+
+    case 'user_login_block':
+      // If showing the login form in a block, don't print any descriptive text.
+      return '';
+      break;
+  }
+}
