diff --git a/menu_icons.module b/menu_icons.module
index ae305e7..fe25703 100755
--- a/menu_icons.module
+++ b/menu_icons.module
@@ -48,6 +48,12 @@ function menu_icons_form_alter(&$form, $form_state, $form_id) {
     if (!isset($options) || !isset($options['menu_icon'])) {
       $options = array('menu_icon' => array('enable' => NULL, 'image_style' => NULL));
     }
+    if (!isset($options['menu_icon']['image_style'])) {
+      $options['menu_icon']['image_style'] = NULL;
+    }
+    if (!isset($options['menu_icon']['image_style_hover'])) {
+      $options['menu_icon']['image_style_hover'] = NULL;
+    }
 
     $form['icon'] = array(
       '#type' => 'fieldset',
@@ -72,6 +78,11 @@ function menu_icons_form_alter(&$form, $form_state, $form_id) {
       '#default_value' => $options['menu_icon']['image_style'],
       '#description' => t('The preview image will be shown while editing the content.'),
       '#required' => FALSE,
+      '#states' => array(
+         'visible' => array (
+           ':input[name="use_icon_logo"]' => array('checked' => TRUE),
+         ),
+      ),
     );
 
     $form['icon']['icon_path'] = array(
@@ -79,10 +90,10 @@ function menu_icons_form_alter(&$form, $form_state, $form_id) {
       '#title' => t('Path to the icon'),
       '#default_value' => (isset($options['menu_icon']['path']) ? $options['menu_icon']['path'] : variable_get('menu_icons_default_icon', drupal_get_path('module', 'menu_icons') . '/images/default_icon.png')),
       '#description' => t('The path to the image you would like to use as a background image for this menu item.'),
-    );
-    $form['icon']['icon_path']['#states'] = array(
-        'visible' => array (
-        ':input[name="use_icon_logo"]' => array('checked' => TRUE),
+      '#states' => array(
+         'visible' => array (
+           ':input[name="use_icon_logo"]' => array('checked' => TRUE),
+         ),
       ),
     );
 
@@ -91,10 +102,49 @@ function menu_icons_form_alter(&$form, $form_state, $form_id) {
       '#title' => t('Upload a new icon image'),
       '#maxlength' => 40,
       '#description' => t("If you don't have direct file access to the server, use this field to upload your icon."),
+      '#states' => array(
+         'visible' => array (
+           ':input[name="use_icon_logo"]' => array('checked' => TRUE),
+         ),
+      ),
     );
-    $form['icon']['icon_upload']['#states'] = array(
-        'visible' => array (
-        ':input[name="use_icon_logo"]' => array('checked' => TRUE),
+
+    $form['icon']['image_style_hover'] = array(
+      '#title' => t('Image style for the hover icon'),
+      '#type' => 'select',
+      '#options' => image_style_options(FALSE),
+      '#empty_option' => '<' . t('Menu Icons default') . '>',
+      '#default_value' => $options['menu_icon']['image_style_hover'],
+      '#description' => t('The preview image will be shown while editing the content.'),
+      '#required' => FALSE,
+      '#states' => array(
+         'visible' => array (
+           ':input[name="use_icon_logo"]' => array('checked' => TRUE),
+         ),
+      ),
+    );
+
+    $form['icon']['icon_hover_path'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Path to the hover icon'),
+      '#default_value' => (isset($options['menu_icon']['path_hover']) ? $options['menu_icon']['path_hover'] : variable_get('menu_icons_default_icon_hover', drupal_get_path('module', 'menu_icons') . '/images/default_icon.png')),
+      '#description' => t('The path to the image you would like to use as a background image for this menu item when hovering.'),
+      '#states' => array(
+         'visible' => array (
+           ':input[name="use_icon_logo"]' => array('checked' => TRUE),
+         ),
+      ),
+    );
+
+    $form['icon']['icon_hover_upload'] = array(
+      '#type' => 'file',
+      '#title' => t('Upload a new icon image'),
+      '#maxlength' => 40,
+      '#description' => t("If you don't have direct file access to the server, use this field to upload your hover icon."),
+      '#states' => array(
+         'visible' => array (
+           ':input[name="use_icon_logo"]' => array('checked' => TRUE),
+         ),
       ),
     );
 
@@ -122,6 +172,7 @@ function menu_icons_form_submit($form, &$form_state) {
 
   // Store the current icon path
   $path = $form_state['values']['icon_path'];
+  $path_hover = $form_state['values']['icon_hover_path'];
 
   // Define the validation settings
   $validate = array(
@@ -140,11 +191,25 @@ function menu_icons_form_submit($form, &$form_state) {
     $path = $filename;
   }
 
+  // Check for a new uploaded hover icon, and use that instead.
+  if ($file_hover = file_save_upload('icon_hover_upload', $validate)) {
+    $parts_hover = pathinfo($file_hover->filename);
+    $filename_hover = $directory_path . '/menu_icon_hover_' . $form_state['values']['mlid'] . '.' . $parts_hover['extension'];
+    file_unmanaged_copy($file_hover->uri, $filename_hover, FILE_EXISTS_REPLACE);
+
+    // Flush image style generated images
+    image_path_flush($filename_hover);
+
+    $path_hover = $filename_hover;
+  }
+
   $options = unserialize(db_query('SELECT options FROM {menu_links} WHERE mlid = :mlid', array(':mlid' => $form_state['values']['mlid']))->fetchField());
   $options['menu_icon'] = array(
     'enable' => $form_state['values']['use_icon_logo'],
     'path' => $path,
+    'path_hover' => $path_hover,
     'image_style' => $form_state['values']['image_style'],
+    'image_style_hover' => $form_state['values']['image_style_hover'],
   );
 
   // Use default image style if not explicitly set.
@@ -152,6 +217,11 @@ function menu_icons_form_submit($form, &$form_state) {
     $options['menu_icon']['image_style'] = variable_get('menu_icons_image_style_default', 'menu_icon');
   }
 
+  // Use default image style if not explicitly set.
+  if (empty($options['menu_icon']['image_style_hover'])) {
+    $options['menu_icon']['image_style_hover'] = variable_get('menu_icons_image_style_default', 'menu_icon');
+  }
+
   if (!isset($options['attributes'])) {
     $options['attributes'] = array();
   }
@@ -209,10 +279,7 @@ function menu_icons_admin_settings($form, &$form_state) {
     '#required' => FALSE,
   );
 
-  $options = array();
-  foreach (image_styles() as $pid => $preset) {
-    $options[$preset['name']] = $preset['name'];
-  }
+  $options = image_style_options();
 
   if (!empty($options)) {
     $form['menu_icons_image_style_default'] = array(
@@ -223,6 +290,15 @@ function menu_icons_admin_settings($form, &$form_state) {
       '#required' => FALSE,
       '#options' => $options,
     );
+
+    $form['menu_icons_imagecache_default_hover'] = array(
+      '#type' => 'select',
+      '#title' => t('Image default hover style'),
+      '#default_value' => variable_get('menu_icons_imagecache_default_hover', 'menu_icon'),
+      '#description' => t('Choose a default !link to be used for hover menu icons. This setting can be overwritten per menu item.', array('!link' => l(t('Image style'), 'admin/config/media/image-styles'))),
+      '#required' => FALSE,
+      '#options' => $options,
+    );
   }
 
   $form['menu_icons_image_folder'] = array(
@@ -285,7 +361,7 @@ function menu_icons_image_default_styles() {
 function menu_icons_css_generate() {
 
   $css = "";
-  $result = db_query("SELECT mlid, options FROM {menu_links}");
+  $result = db_query("SELECT mlid, options FROM {menu_links}")->fetchAll();
   $pos = variable_get('menu_icons_position', 'left');
 
   foreach ($result as $item) {
@@ -311,6 +387,28 @@ function menu_icons_css_generate() {
 
       // Support private filesystem
       $css .= theme('menu_icons_css_item', array('mlid' => $item->mlid, 'path' => $image_url, 'size' => $info['width'], 'height' => $info['height'], 'pos' => $pos));
+      
+      // Add a hover image when specified
+      if (!empty($options['menu_icon']['path_hover']) && file_exists($options['menu_icon']['path_hover'])) {
+        $image_path_hover = $options['menu_icon']['path_hover'];
+        $image_style_hover = (isset($options['menu_icon']['image_style_hover']) && !empty($options['menu_icon']['image_style_hover'])) ? $options['menu_icon']['image_style_hover'] : NULL;
+ 
+        if ($image_style_hover) {
+          $source_uri_hover = $image_path_hover;
+          $image_path_hover = image_style_path($image_style_hover, $source_uri_hover);
+ 
+          if (!file_exists($image_path_hover)) {
+            image_style_create_derivative(image_style_load($image_style_hover), $source_uri_hover, $image_path_hover);
+          }
+        }
+ 
+        // Retrieve the image dimensions
+        $info_hover = image_get_info($image_path_hover);
+        $image_url_hover = file_create_url($image_path_hover);
+ 
+        // Support private filesystem
+        $css .= theme('menu_icons_css_item_hover', array('mlid' => $item->mlid, 'path' => $image_url_hover, 'size' => $info_hover['width'], 'pos' => $pos));
+      }
     }
   }
   $csspath = 'public://css';
@@ -333,6 +431,10 @@ function menu_icons_theme() {
       'variables' => array('mlid' => NULL, 'path' => NULL, 'size' => NULL, 'height' => NULL, 'pos' => NULL),
       'template' => 'menu_icons_css_item',
     ),
+    'menu_icons_css_item_hover' => array(
+      'variables' => array('mlid' => NULL, 'path' => NULL, 'size' => NULL, 'pos' => NULL),
+      'template' => 'menu_icons_css_item_hover',
+    ),
   );
 }
 
