diff --git a/commerce_wishlist.admin.inc b/commerce_wishlist.admin.inc
index 7b19651..3c221ea 100644
--- a/commerce_wishlist.admin.inc
+++ b/commerce_wishlist.admin.inc
@@ -19,10 +19,33 @@ function commerce_wishlist_admin_form($form, &$form_state) {
   $form['commerce_wishlist_element'] = array(
     '#type' => 'select',
     '#title' => t('"Add to wishlist" element'),
-    '#options' => array('link' => t('Ajax link'), 'button' => t('Button')),
+    '#options' => array('link' => t('Link'), 'button' => t('Button')),
     '#description' => t('The way "Add to wishlist" element will be displayed. Either as a button or link.'),
     '#default_value' => variable_get('commerce_wishlist_element', 'button'),
   );
+  $form['commerce_wishlist_use_ajax'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Use Ajax'),
+    '#description' => t('Use ajax for add/remove from wishlist.'),
+    '#default_value' => variable_get('commerce_wishlist_use_ajax', 0),
+    '#states' => array(
+      'visible' => array(
+        ':input[name="commerce_wishlist_element"]' => array('value' => 'link'),
+      ),
+    ),
+  );
+  $form['commerce_wishlist_show_login'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Display "Add to Wishlist" for anonymous users'),
+    '#description' => t('This will display the "Add to Wishlist" for anonymous, but will show a "Login Required" message if not proper permissions are set.'),
+    '#default_value' => variable_get('commerce_wishlist_show_login', 0),
+  );
+  $form['commerce_wishlist_show_remove'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Show "Remove from Wishlist"'),
+    '#description' => t('Show the Remove from Wishlist, instead of already in wishlist'),
+    '#default_value' => variable_get('commerce_wishlist_show_remove', 0),
+  );
   $form['commerce_wishlist_product_types'] = array(
     '#type' => 'checkboxes',
     '#title' => t('Product types'),
diff --git a/commerce_wishlist.module b/commerce_wishlist.module
index aa380dd..493239f 100644
--- a/commerce_wishlist.module
+++ b/commerce_wishlist.module
@@ -11,32 +11,28 @@
 function commerce_wishlist_menu() {
   $items = array();
 
-  $items['user/%user/wishlist/nojs/remove/%commerce_line_item'] = array(
+  $items['wishlist/nojs/remove/%commerce_product'] = array(
     'page callback' => 'commerce_wishlist_product_remove_page',
-    'page arguments' => array(5, 1),
-    'access callback' => 'commerce_wishlist_manage_access',
-    'access arguments' => array(1),
+    'page arguments' => array(3),
+    'access arguments' => array('manage own wish list'),
     'type' => MENU_CALLBACK,
   );
-  $items['user/%user/wishlist/ajax/remove/%commerce_line_item'] = array(
+  $items['wishlist/ajax/remove/%commerce_product'] = array(
     'page callback' => 'commerce_wishlist_product_remove_ajax',
-    'page arguments' => array(5, 1),
-    'access callback' => 'commerce_wishlist_manage_access',
-    'access arguments' => array(1),
+    'page arguments' => array(3),
+    'access arguments' => array('manage own wish list'),
     'type' => MENU_CALLBACK,
   );
-  $items['user/%user/wishlist/nojs/add/%commerce_product'] = array(
+  $items['wishlist/nojs/add/%commerce_product'] = array(
     'page callback' => 'commerce_wishlist_product_add_page',
-    'page arguments' => array(5, 1),
-    'access callback' => 'commerce_wishlist_manage_access',
-    'access arguments' => array(1),
+    'page arguments' => array(3),
+    'access arguments' => array('manage own wish list'),
     'type' => MENU_CALLBACK,
   );
-  $items['user/%user/wishlist/ajax/add/%commerce_product'] = array(
+  $items['wishlist/ajax/add/%commerce_product'] = array(
     'page callback' => 'commerce_wishlist_product_add_ajax',
-    'page arguments' => array(5, 1),
-    'access callback' => 'commerce_wishlist_manage_access',
-    'access arguments' => array(1),
+    'page arguments' => array(3),
+    'access arguments' => array('manage own wish list'),
     'type' => MENU_CALLBACK,
   );
   $items['admin/commerce/config/wishlist'] = array(
@@ -48,9 +44,32 @@ function commerce_wishlist_menu() {
     'file' => 'commerce_wishlist.admin.inc',
   );
 
+  $items['wishlist'] = array(
+    'title' => 'Wishlist',
+    'page callback' => 'commerce_wishlist_view',
+    'access arguments' => array('manage own wish list'),
+  );
   return $items;
 }
 
+function commerce_wishlist_view() {
+  global $user;
+  // Default to displaying an empty message.
+  $content = theme('commerce_wishlist_empty_page');
+
+  // First check to make sure we have a valid order.
+  if ($order = commerce_wishlist_order_load($user->uid)) {
+    $wrapper = entity_metadata_wrapper('commerce_order', $order);
+    // Only show the wishlist form if we found product line items.
+    if (commerce_line_items_quantity($wrapper->commerce_line_items, commerce_product_line_item_types()) > 0) {
+
+      // Add the form for editing the cart contents.
+      $content = commerce_embed_view('wishlist', 'default', array($order->order_id), 'wishlist');
+    }
+  }
+  return $content;
+}
+
 /**
  * Implements hook_permission().
  */
@@ -101,6 +120,9 @@ function commerce_wishlist_theme($existing, $type, $theme, $path) {
     'commerce_wishlist_product_add_link' => array(
       'variables' => array('product_id' => NULL, 'user' => NULL),
     ),
+    'commerce_wishlist_remove_from_wishlist_link' => array(
+      'variables' => array('line_item_id' => NULL, 'text' => t('Remove'), 'destination' => ''),
+    ),
     'commerce_wishlist_already_in_wishlist_link' => array(
       'variables' => array('user_id' => NULL),
     ),
@@ -114,6 +136,9 @@ function commerce_wishlist_theme($existing, $type, $theme, $path) {
         'account' => NULL,
       ),
     ),
+    'commerce_wishlist_empty_page' => array(
+      'variables' => array(),
+    ),
   );
 }
 
@@ -130,7 +155,8 @@ function commerce_wishlist_form_alter(&$form, &$form_state, $form_id) {
     }
 
     // Make sure that this product is allowed.
-    if (!in_array($form_state['default_product']->type, array_filter(variable_get('commerce_wishlist_product_types', array())))) {
+    $allowed_types = array_filter(variable_get('commerce_wishlist_product_types', array()));
+    if (!empty($allowed_types) && (!in_array($form_state['default_product']->type, $allowed_types))) {
       return;
     }
 
@@ -149,24 +175,40 @@ function commerce_wishlist_form_alter(&$form, &$form_state, $form_id) {
       }
       return;
     }
-
-    // If it's already in the wishlist, show the already in wishlist link.
-    //Otherwise, show the button or link as configured.
-    if (commerce_wishlist_user_has_product_in_wishlist($product_id)) {
-      $form['add_to_wishlist'] = array(
-        '#markup' => theme('commerce_wishlist_already_in_wishlist_link', array('user_id' => $user->uid)),
-        '#weight' => variable_get('commerce_wishlist_weight', 0),
-      );
-    }
-    elseif (variable_get('commerce_wishlist_element', 'button') == 'button') {
-      $form += commerce_wishlist_add_form();
-    }
-    else {
-      // Add the "Add to wishlist" link to the form.
-      $form['add_to_wishlist'] = array(
-        '#markup' => theme('commerce_wishlist_product_add_link', array('product_id' => $product_id, 'user' => $user)),
-        '#weight' => variable_get('commerce_wishlist_weight', 0),
-      );
+    //show the wishlist widget if you have permission or show for anonymous with login functionality
+    
+    if (user_access('manage own wish list') || (($user->uid == 0) && variable_get('commerce_wishlist_show_login', 0))) {
+      // If it's already in the wishlist, show the already in wishlist link.
+      //Otherwise, show the button or link as configured.
+      if (commerce_wishlist_user_has_product_in_wishlist($product_id)) {
+        if (variable_get('commerce_wishlist_show_remove', 0)) {
+          if (variable_get('commerce_wishlist_element', 'button') == 'button') {
+            $form += commerce_wishlist_remove_form();
+          }
+          else {
+            $form['add_to_wishlist'] = array(
+              '#markup' => theme('commerce_wishlist_remove_from_wishlist_link', array('product_id' => $product_id)),
+              '#weight' => variable_get('commerce_wishlist_weight', 0),
+            );
+          }
+        }
+        else {
+          $form['add_to_wishlist'] = array(
+            '#markup' => theme('commerce_wishlist_already_in_wishlist_link', array('user_id' => $user->uid)),
+            '#weight' => variable_get('commerce_wishlist_weight', 0),
+          );
+        }
+      }
+      elseif (variable_get('commerce_wishlist_element', 'button') == 'button') {
+        $form += commerce_wishlist_add_form();
+      }
+      else {
+        // Add the "Add to wishlist" link to the form.
+        $form['add_to_wishlist'] = array(
+          '#markup' => theme('commerce_wishlist_product_add_link', array('product_id' => $product_id, 'user' => $user)),
+          '#weight' => variable_get('commerce_wishlist_weight', 0),
+        );
+      }
     }
   }
 
@@ -278,7 +320,7 @@ function commerce_wishlist_block_view($delta = '') {
  */
 function theme_commerce_wishlist_already_in_wishlist_link(&$variables) {
   return t('Already in <a class="in-wishlist" href="@url">your wishlist</a>.', array(
-    '@url' => url('user/' . $variables['user_id'] . '/wishlist'),
+    '@url' => url('wishlist'),
   ));
 }
 
@@ -288,23 +330,33 @@ function theme_commerce_wishlist_already_in_wishlist_link(&$variables) {
 function theme_commerce_wishlist_product_add_link($variables) {
   $user = $variables['user'];
   $product_id = $variables['product_id'];
+  if (variable_get('commerce_wishlist_use_ajax', 0)) {
+    drupal_add_library('system', 'drupal.ajax');
+    $url = 'wishlist/ajax/add/' . $product_id;
+    $params = array(
+      'attributes' => array(
+        'class' => array('ajax' => 'use-ajax', 'add-to-wishlist'),
+        'id' => 'add-wishlist-' . $product_id,
+      ),
+    );
+  }
+  else {
+    $url = 'wishlist/nojs/add/' . $product_id;
+    $params = array(
+      'attributes' => array(
+        'id' => 'add-wishlist-' . $product_id,
+      ),
+      'query' => array(
+        'destination' => $_GET['q'],
+      ),
+    );
+  }
 
-  $url = 'user/' . $user->uid . '/wishlist/nojs/add/' . $product_id;
-  $params = array(
-    'attributes' => array(
-      'class' => array('ajax' => 'use-ajax', 'add-to-wishlist'),
-      'id' => 'add-wishlist-' . $product_id,
-    ),
-    'query' => array(
-      'destination' => $_GET['q'],
-      'token' => drupal_get_token(),
-    ),
-  );
 
   // If the current user is not logged in, build a different link that
   // points to the login page and lists all other relevant details
   // (product ID, node ID and original URL) in query string.
-  if ($user->uid == 0) {
+  if (($user->uid == 0) && variable_get('commerce_wishlist_show_login', 0)) {
     unset($params['attributes']['class']['ajax'], $params['query']);
     $params['query']['product_id'] = $product_id;
     $params['query']['original_url'] = $_GET['q'];
@@ -314,6 +366,35 @@ function theme_commerce_wishlist_product_add_link($variables) {
 }
 
 /**
+ * Remove From Wishlist theme callback
+ */
+function theme_commerce_wishlist_remove_from_wishlist_link($variables) {
+  //no-ajax is used to remove ajax from views list
+  if (empty($variables['no-ajax']) && (variable_get('commerce_wishlist_use_ajax', 0))) {
+    drupal_add_library('system', 'drupal.ajax');
+    $url = 'wishlist/ajax/remove/' . $variables['product_id'];
+    $params = array(
+      'attributes' => array(
+        'class' => array('use-ajax', 'remove-from-wishlist'),
+        'id' => 'remove-wishlist-' . $variables['product_id'],
+      )
+    );
+  }
+  else {
+    $url = 'wishlist/nojs/remove/' . $variables['product_id'];
+    $params = array(
+      'attributes' => array(
+        'id' => 'remove-wishlist-' . $variables['product_id'],
+      ),
+      'query' => array(
+        'destination' => $_GET['q'],
+      ),
+    );
+  }
+  
+  return l($variables['text'], $url, $params);
+}
+/**
  * Theme callback for page title on user's wishlist page.
  *
  * The reason this is created as a separate themeable function is that depending
@@ -330,27 +411,6 @@ function theme_commerce_wishlist_user_wishlist_page_title(&$variables) {
 }
 
 /**
- * Determine whether the user has a privilege to manage a wishlist.
- */
-function commerce_wishlist_manage_access($account, $wishlist = NULL) {
-  // Allow administrators to edit any wishlist on the site.
-  if (user_access('administer wish lists')) {
-    return TRUE;
-  }
-
-  if ($wishlist === NULL) {
-    $wishlist = commerce_wishlist_order_load($account->uid);
-  }
-
-  // Check if the wishlist owner and the user who is trying to edit the wishlist
-  // are the same, and if they have permission to manage own wishlist.
-  global $user;
-  return ($account->uid == $user->uid
-    && user_access('manage own wish list')
-    && $wishlist->uid == $account->uid);
-}
-
-/**
  * Determine whether the user has a privilege to view a wishlist.
  */
 function commerce_wishlist_user_wishlist_access($acting_user, $view) {
@@ -411,7 +471,7 @@ function commerce_wishlist_product_added_to_cart($form, &$form_state) {
  */
 function _commerce_wishlist_user_login_submit($form, &$form_state) {
   if (!empty($form_state['uid'])) {
-    $url = 'user/' . $form_state['uid'] . '/wishlist/nojs/add/' . $_GET['product_id'];
+    $url = 'wishlist/nojs/add/' . $_GET['product_id'];
     $form_state['redirect'] = array(
       $url,
       array(
@@ -428,7 +488,7 @@ function _commerce_wishlist_user_login_submit($form, &$form_state) {
  * Form callback for adding a new button to an add to cart form.
  */
 function commerce_wishlist_add_form() {
-
+  global $user;
   $form['add_to_wishlist'] = array(
     '#type' => 'submit',
     '#value' => t('Add to Wishlist'),
@@ -438,18 +498,30 @@ function commerce_wishlist_add_form() {
     '#validate' => array('commerce_wishlist_add_form_validate'),
     '#submit' => array('commerce_wishlist_add_form_submit'),
   );
+  return $form;
+}
 
+function commerce_wishlist_remove_form() {
+  $form['remove_from_wishlist'] = array(
+    '#type' => 'submit',
+    '#value' => t('Remove'),
+    '#weight' => variable_get('commerce_wishlist_weight', 0),
+    '#name' => 'commerce-wishlist-remove-product',
+    '#attributes' => array('class' => array('commerce-wishlist')),
+    '#validate' => array('commerce_wishlist_remove_form_validate'),
+    '#submit' => array('commerce_wishlist_remove_form_submit'),
+  );
   return $form;
 }
 
 /**
- * Validate callback for commerce_cart_add_to_cart_form().
+ * Validate callback for commerce_wishlist_add_form().
  */
 function commerce_wishlist_add_form_validate($form, &$form_state) {
   global $user;
   if ($form_state['triggering_element']['#name'] == 'commerce-wishlist-add-product') {
     // Verify if the user is logged in.
-    if (!$user->uid) {
+    if (!user_access('manage own wish list') && (!$user->uid) && variable_get('commerce_wishlist_show_login', 0)) {
       form_set_error('add_to_wishlist',
         t('Please <a href="@login">log in</a> or <a href="@register">register</a> to add this product to your wishlist.',
           array(
@@ -467,6 +539,33 @@ function commerce_wishlist_add_form_validate($form, &$form_state) {
 }
 
 /**
+ * Validate callback for commerce_wishlist_remove_form().
+ */
+function commerce_wishlist_remove_form_validate($form, &$form_state) {
+  if ($form_state['triggering_element']['#name'] == 'commerce-wishlist-remove-product') {
+    if (!commerce_wishlist_user_has_product_in_wishlist($form_state['values']['product_id'])) {
+      form_set_error('remove_from_wishlist', t('This product is not in your wishlist.'));
+    }
+  }
+}
+
+/**
+ * Submit callback for commerce_cart_add_to_cart_form().
+ *
+ * Override of commerce_cart_add_to_cart_form_submit to add wishlist additional
+ * functionality.
+ */
+function commerce_wishlist_remove_form_submit($form, &$form_state) {
+  $product = commerce_product_load($form_state['values']['product_id']);
+  if ($line_item = commerce_wishlist_user_has_product_in_wishlist($product->product_id)) {
+    commerce_wishlist_product_remove_line_item($line_item);
+  }
+  drupal_set_message(t('Product <em>@product</em> has been removed from <a href="@url">your wishlist</a>.', array(
+    '@product' => $product->title,
+    '@url' => url('wishlist', array('absolute' => TRUE)),
+  )));
+}
+/**
  * Implements hook_contextual_links_view_alter().
  */
 function commerce_wishlist_menu_contextual_links_alter(&$links, $router_item, $root_path) {
@@ -491,42 +590,47 @@ function commerce_wishlist_add_form_submit($form, &$form_state) {
 
   drupal_set_message(t('Product <em>@product</em> has been added to <a href="@url">your wishlist</a>.', array(
     '@product' => $product->title,
-    '@url' => url('user/' . $user->uid . '/wishlist', array('absolute' => TRUE)),
+    '@url' => url('wishlist', array('absolute' => TRUE)),
   )));
 }
 
 /**
  * Page callback: handle deletion of a wish list item.
  *
- * @param int $line_item_id
- *
- * @param $account
+ * @param int $product
  */
-function commerce_wishlist_product_remove_page($line_item, $account) {
-  commerce_wishlist_product_remove_line_item($line_item, $account);
+function commerce_wishlist_product_remove_page($product) {
+  if ($line_item = commerce_wishlist_user_has_product_in_wishlist($product->product_id)) {
+    commerce_wishlist_product_remove_line_item($line_item);
+  }
   drupal_goto();
 }
 
-function commerce_wishlist_product_remove_ajax($line_item, $account) {
-  $product_id = commerce_product_load($line_item->commerce_product[LANGUAGE_NONE][0]['product_id']);
-  commerce_wishlist_product_remove_line_item($line_item, $account);
-  $link = theme('commerce_wishlist_product_add_link', array('product_id' => $product_id, 'user' => $account));
-  $commands = array(ajax_command_replace('a#add-wishlist-' . $product_id, $link));
+/**
+ * Page callback: Ajax product remove
+ *
+ * @param $product
+ */
+function commerce_wishlist_product_remove_ajax($product) {
+  if ($line_item = commerce_wishlist_user_has_product_in_wishlist($product->product_id)) {
+    commerce_wishlist_product_remove_line_item($line_item);
+  }
+  $link = theme('commerce_wishlist_product_add_link', array('product_id' => $product->product_id, 'user' => $account));
+  $commands = array(ajax_command_replace('a#remove-wishlist-' . $product->product_id, $link));
   ajax_deliver(array('#type' => 'ajax', '#commands' => $commands));
 }
 
 /**
  * Menu callback: Perform various actions (add to wishlist etc).
  */
-function commerce_wishlist_product_add_page($product, $user) {
-  if (isset($_GET['token']) && drupal_valid_token($_GET['token'])) {
-    if (!commerce_wishlist_user_has_product_in_wishlist($product->product_id, $user->uid)) {
-      $display_path = '';
-      if ($_GET['destination'] != '') {
-        $display_path = $_GET['destination'];
-      }
-      commerce_wishlist_product_add($product, NULL, $user->uid, $display_path);
+function commerce_wishlist_product_add_page($product) {
+  global $user;
+  if (!commerce_wishlist_user_has_product_in_wishlist($product->product_id)) {
+    $display_path = '';
+    if ($_GET['destination'] != '') {
+      $display_path = $_GET['destination'];
     }
+    commerce_wishlist_product_add($product, NULL, $user->uid, $display_path);
   }
   drupal_goto();
 }
@@ -534,16 +638,16 @@ function commerce_wishlist_product_add_page($product, $user) {
 /**
  * Page callback: Ajax product add.
  */
-function commerce_wishlist_product_add_ajax($product, $user) {
-  if (!commerce_wishlist_user_has_product_in_wishlist($product->product_id, $user->uid)) {
-    $display_path = '';
-    if ($_GET['destination'] != '') {
-      $display_path = $_GET['destination'];
-    }
+function commerce_wishlist_product_add_ajax($product) {
+  global $user;
+  $display_path = '';
+  if ($_GET['destination'] != '') {
+    $display_path = $_GET['destination'];
+  }
+  if (!commerce_wishlist_user_has_product_in_wishlist($product->product_id)) {
     commerce_wishlist_product_add($product, NULL, $user->uid, $display_path);
   }
-
-  $link = theme('commerce_wishlist_already_in_wishlist_link', array('user_id' => $user->uid));
+  $link = variable_get('commerce_wishlist_show_remove', 0)?theme('commerce_wishlist_remove_from_wishlist_link', array('product_id' => $product->product_id)):theme('commerce_wishlist_already_in_wishlist_link', array('user_id' => $user->uid));
   $commands = array(ajax_command_replace('a#add-wishlist-' . $product->product_id, $link));
   ajax_deliver(array('#type' => 'ajax', '#commands' => $commands));
 }
@@ -558,18 +662,10 @@ function commerce_wishlist_product_add_ajax($product, $user) {
  *   The fully loaded shopping cart order or FALSE if nonexistent.
  */
 function commerce_wishlist_order_load($uid = 0) {
-  if ($uid == 0) {
-    global $user;
-    $uid = $user->uid;
-  }
-
-  if ($uid == 0) {
-    return FALSE;
-  }
 
   // Retrieve the order ID for the specified user's current shopping cart.
   $order_id = commerce_wishlist_order_id($uid);
-
+  
   // If a valid cart order ID exists for the user, return it now.
   if (!empty($order_id)) {
     return commerce_order_load($order_id);
@@ -627,7 +723,19 @@ function commerce_wishlist_order_id($uid = 0) {
     // should never really have more than one.
     $cart_order_ids[$uid] = db_query('SELECT order_id FROM {commerce_order} WHERE uid = :uid AND status IN (:status_ids) ORDER BY order_id DESC', array(':uid' => $uid, ':status_ids' => $status_ids))->fetchField();
   }
-
+  else {
+    // Otherwise look for a shopping cart order ID in the session.
+    if (commerce_wishlist_order_session_exists()) {
+      // We can't trust a user's IP address to remain the same, especially since
+      // it may be derived from a proxy server and not the actual client. As of
+      // Commerce 1.4, this query no longer restricts order IDs based on IP
+      // address, instead trusting Drupal to prevent session hijacking.
+      $cart_order_ids[$uid] = db_query('SELECT order_id FROM {commerce_order} WHERE order_id IN (:order_ids) AND uid = 0 AND status IN (:status_ids) ORDER BY order_id DESC', array(':order_ids' => commerce_wishlist_order_session_order_ids(), ':status_ids' => $status_ids))->fetchField();
+    }
+    else {
+      $cart_order_ids[$uid] = FALSE;
+    }
+  }
   return $cart_order_ids[$uid];
 }
 
@@ -657,10 +765,7 @@ function commerce_wishlist_product_add($product, $wishlist = NULL, $uid = NULL,
     $uid = $user->uid;
   }
 
-  // First attempt to load the customer's shopping cart order.
-  if ($wishlist !== NULL) {
-    $wishlist = commerce_wishlist_order_load($uid);
-  }
+  $wishlist = commerce_wishlist_order_load($uid);
 
   // If no wish list exists, create one now.
   if (empty($wishlist)) {
@@ -668,7 +773,7 @@ function commerce_wishlist_product_add($product, $wishlist = NULL, $uid = NULL,
   }
 
   // Return if it's already in there.
-  if (commerce_wishlist_user_has_product_in_wishlist($product->product_id, $uid)) {
+  if (commerce_wishlist_user_has_product_in_wishlist($product->product_id)) {
     return FALSE;
   }
 
@@ -712,6 +817,11 @@ function commerce_wishlist_order_new($uid, $type = 'commerce_order') {
   // Save it so it gets an order ID and return the full object.
   commerce_order_save($order);
 
+  // If the user is not logged in, ensure the order ID is stored in the session.
+  if (!$uid && empty($user->uid)) {
+    commerce_wishlist_order_session_save($order->order_id);
+  }
+  
   return $order;
 }
 
@@ -739,34 +849,26 @@ function commerce_wishlist_commerce_cart_order_is_cart($order, &$is_cart) {
  * @return bool
  *   TRUE if the product exists, FALSE otherwise.
  */
-function commerce_wishlist_user_has_product_in_wishlist($product_id, $uid = NULL) {
-  if ($uid === NULL) {
-    global $user;
-    $uid = $user->uid;
-  }
-
-  if ($uid === 0) {
-    return FALSE;
-  }
-
-  // Load all wishlists.
-  $a = new EntityFieldQuery();
-  $a->entityCondition('entity_type', 'commerce_order', '=')
-    ->propertyCondition('status', array('wishlist'), 'IN')
-    ->entityCondition('uid', $uid, '=');
+function commerce_wishlist_user_has_product_in_wishlist($product_id) {
+  global $user;
+  $uid = $user->uid;
 
-  $results = $a->execute();
+  $wishlist = commerce_wishlist_order_id($uid);
 
-  if (!isset($results['commerce_order'])) {
+  if (empty($wishlist)) {
     return FALSE;
   }
+  elseif (!is_array($wishlist)) {
+    $wishlist = array($wishlist);
+  }
+  
 
-  foreach (commerce_order_load_multiple(array_keys($results['commerce_order'])) as $order) {
+  foreach (commerce_order_load_multiple($wishlist) as $order) {
     $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
     foreach ($order_wrapper->commerce_line_items as $wrapper_line_item) {
       if (in_array('commerce_product', array_keys($wrapper_line_item->getPropertyInfo()))) {
         if ($wrapper_line_item->commerce_product->product_id->value() == $product_id) {
-          return TRUE;
+          return $wrapper_line_item->value();
         }
       }
     }
@@ -794,10 +896,6 @@ function commerce_wishlist_product_remove_line_item($line_item, $account = NULL,
     $account = $user;
   }
 
-  if ($account->uid === 0) {
-    return;
-  }
-
   if ($wishlist === NULL) {
     // Get the default wishlist.
     $wishlist = commerce_wishlist_order_load($account->uid);
@@ -837,10 +935,6 @@ function commerce_wishlist_product_remove($product, $account = NULL, $wishlist =
     $account = $user;
   }
 
-  if ($account->uid === 0) {
-    return;
-  }
-
   if ($wishlist === NULL) {
     // Get the default wishlist.
     $wishlist = commerce_wishlist_order_load($account->uid);
@@ -864,3 +958,177 @@ function commerce_wishlist_product_remove($product, $account = NULL, $wishlist =
   commerce_line_item_delete($line_item->line_item_id);
   commerce_order_save($wishlist);
 }
+
+/**
+ * Implements hook_commerce_entity_access_condition_commerce_order_alter().
+ *
+ * This alter hook allows the Commerce Wishlist module to add conditions to the query used to
+ * determine if a user has view access to a given order. The Commerce Wishlist module will
+ * always grant users access to view their own carts (independent of any
+ * permission settings) and also grants anonymous users access to view their
+ * completed orders if they've been given the permission.
+ */
+function commerce_wishlist_commerce_entity_access_condition_commerce_order_alter(&$conditions, $context) {
+  // Find the user's cart order ID and anonymous user's completed orders.
+  $current_order_id = commerce_wishlist_order_id($context['account']->uid);
+  $completed_order_ids = commerce_cart_order_session_order_ids(TRUE);
+
+  // Always give the current user access to their own wishlist regardless of order
+  // view permissions.
+  if (!empty($current_order_id)) {
+    $conditions->condition($context['base_table'] . '.order_id', $current_order_id);
+  }
+  
+  return;
+}
+
+/**
+ * Saves an order ID to the appropriate wishlist orders session variable.
+ *
+ * @param $order_id
+ *   The order ID to save to the array.
+ */
+function commerce_wishlist_order_session_save($order_id) {
+
+  if (empty($_SESSION['commerce_wishlist_orders'])) {
+    $_SESSION['commerce_wishlist_orders'] = array($order_id);
+  }
+  elseif (!in_array($order_id, $_SESSION['commerce_wishlist_orders'])) {
+    $_SESSION['commerce_wishlist_orders'][] = $order_id;
+  }
+}
+
+/**
+ * Checks to see if any order ID or a specific order ID exists in the session.
+ *
+ * @param $order_id
+ *   Optionally specify an order ID to look for in the commerce_cart_orders
+ *     session variable; defaults to NULL.
+ * @return
+ *   Boolean indicating whether or not any cart order ID exists in the session
+ *     or if the specified order ID exists in the session.
+ */
+function commerce_wishlist_order_session_exists($order_id = NULL) {
+
+  // If an order was specified, look for it in the array.
+  if (!empty($order_id)) {
+    return !empty($_SESSION['commerce_wishlist_orders']) && in_array($order_id, $_SESSION['commerce_wishlist_orders']);
+  }
+  else {
+    // Otherwise look for any value.
+    return !empty($_SESSION['commerce_wishlist_orders']);
+  }
+}
+
+/**
+ * Deletes all order IDs or a specific order ID from the cart orders session
+ *   variable.
+ *
+ * @param $order_id
+ *   The order ID to remove from the array or NULL to delete the variable.
+ */
+function commerce_wishlist_order_session_delete($order_id = NULL) {
+
+  if (!empty($_SESSION['commerce_wishlist_orders'])) {
+    if (!empty($order_id)) {
+      $_SESSION['commerce_wishlist_orders'] = array_diff($_SESSION['commerce_wishlist_orders'], array($order_id));
+    }
+    else {
+      unset($_SESSION['commerce_wishlist_orders']);
+    }
+  }
+}
+
+/**
+ * Returns an array of cart order IDs stored in the session.
+ *
+ * @return
+ *   An array of applicable cart order IDs or an empty array if none exist.
+ */
+function commerce_wishlist_order_session_order_ids() {
+  return empty($_SESSION['commerce_wishlist_orders']) ? array() : $_SESSION['commerce_wishlist_orders'];
+}
+
+/**
+ * Themes an empty wishlist page.
+ */
+function theme_commerce_wishlist_empty_page() {
+  return '<div class="wishlist-empty-page">' . t('Your wishlist is empty.') . '</div>';
+}
+
+/**
+ * Implements hook_user_login().
+ *
+ * When a user logs into the site, if they have a wishlist order it should
+ * be merged ito the user account wishlist.
+ */
+function commerce_wishlist_user_login(&$edit, $account) {
+  // Get the user's anonymous wishlist order if it exists.
+    global $user;
+
+  if ($wishlist = commerce_wishlist_order_load()) {
+    // Convert it to an authenticated cart.
+    commerce_wishlist_order_convert($wishlist, $account);
+  }
+}
+
+/**
+ * Converts an anonymous commerce wishlist order to an authenticated wishlist.
+ *
+ * @param $order
+ *   The anonymous wishlist to convert to an authenticated wishlist.
+ * @param $account
+ *   The user account the wishlist will belong to.
+ *
+ * @return
+ *   The updated order's wrapper or FALSE if the order was not converted,
+ *     meaning it was not an anonymous wishlist order to begin with.
+ */
+function commerce_wishlist_order_convert($anonymous_wishlist_order, $account) {
+  // Only convert wishlists that are currently anonmyous wishlists.
+  if ($anonymous_wishlist_order->uid == 0) {
+    //get account wishlist if exists
+    if ($account_wishlist = commerce_wishlist_order_load($account->uid)) {
+      //wrap orders
+      $anonymous_wishlist_wrapper = entity_metadata_wrapper('commerce_order', $anonymous_wishlist_order);
+      $acount_wishlist_wrapper = entity_metadata_wrapper('commerce_order', $account_wishlist);
+      
+      $existing_prods = array();
+      // Get existing products from the account wishlist
+      foreach($acount_wishlist_wrapper->commerce_line_items as $line_item){
+        $existing_prods[] = $line_item->commerce_product->product_id->value();
+      }
+      
+      //Move all products in account wishlist which are not there already
+      foreach($anonymous_wishlist_wrapper->commerce_line_items as $line_item){
+        // If not in array, the account wishlist didn have the product
+        if(!in_array($line_item->commerce_product->product_id->value(), $existing_prods)){
+          
+           // change the order id for the line item
+          $line_item->order_id = $acount_wishlist_wrapper->order_id->value();
+          // Not sure if this was needed but it didnt hurt
+          $line_item->save();
+          // add the line item to the new order
+          $acount_wishlist_wrapper->commerce_line_items[] = $line_item;
+        }   
+      }
+      //delete anonymous order
+      $anonymous_wishlist_wrapper->commerce_line_items = array();
+      $anonymous_wishlist_wrapper->delete();
+    }
+    else {
+      // Update the uid and e-mail address to match the current account since
+      // there currently is no way to specify a custom e-mail address per order.
+      $anonymous_wishlist_order->uid = $account->uid;
+      $anonymous_wishlist_order->mail = $account->mail;
+      $acount_wishlist_wrapper = entity_metadata_wrapper('commerce_order', $anonymous_wishlist_order);
+
+    }
+    // Allow other modules to operate on the converted order and then save.
+    module_invoke_all('commerce_wishlist_order_convert', $acount_wishlist_wrapper, $account);
+    $acount_wishlist_wrapper->save();
+    return $acount_wishlist_wrapper;
+  }
+
+  return FALSE;
+}
\ No newline at end of file
diff --git a/includes/views/commerce_wishlist.views_default.inc b/includes/views/commerce_wishlist.views_default.inc
index 65ab8d6..895478d 100644
--- a/includes/views/commerce_wishlist.views_default.inc
+++ b/includes/views/commerce_wishlist.views_default.inc
@@ -45,139 +45,115 @@ function commerce_wishlist_views_default_views() {
   $view->name = 'wishlist';
   $view->description = '';
   $view->tag = 'default';
-  $view->base_table = 'commerce_line_item';
-  $view->human_name = 'User wish list';
+  $view->base_table = 'commerce_order';
+  $view->human_name = 'User Wishlist';
   $view->core = 7;
   $view->api_version = '3.0';
   $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+
   /* Display: Master */
   $handler = $view->new_display('default', 'Master', 'default');
-  $handler->display->display_options['title'] = 'User wish list';
   $handler->display->display_options['use_more_always'] = FALSE;
-  $handler->display->display_options['access']['type'] = 'commerce_wishlist_item';
+  $handler->display->display_options['access']['type'] = 'none';
   $handler->display->display_options['cache']['type'] = 'none';
   $handler->display->display_options['query']['type'] = 'views_query';
   $handler->display->display_options['exposed_form']['type'] = 'basic';
   $handler->display->display_options['pager']['type'] = 'full';
-  $handler->display->display_options['pager']['options']['items_per_page'] = '25';
   $handler->display->display_options['style_plugin'] = 'table';
   $handler->display->display_options['style_options']['columns'] = array(
-    'line_item_id' => 'line_item_id',
+    'order_id' => 'order_id',
+    'commerce_display_path' => 'commerce_display_path',
+    'line_item_title' => 'line_item_title',
+    'wishlist_remove' => 'wishlist_remove',
+    'wishlist_add_to_cart' => 'wishlist_add_to_cart',
   );
   $handler->display->display_options['style_options']['default'] = '-1';
   $handler->display->display_options['style_options']['info'] = array(
-    'line_item_id' => array(
+    'order_id' => array(
+      'sortable' => 0,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'commerce_display_path' => array(
       'sortable' => 0,
       'default_sort_order' => 'asc',
       'align' => '',
       'separator' => '',
       'empty_column' => 0,
     ),
+    'line_item_title' => array(
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'wishlist_remove' => array(
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'wishlist_add_to_cart' => array(
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
   );
-  /* No results behavior: Global: Text area */
-  $handler->display->display_options['empty']['area']['id'] = 'area';
-  $handler->display->display_options['empty']['area']['table'] = 'views';
-  $handler->display->display_options['empty']['area']['field'] = 'area';
-  $handler->display->display_options['empty']['area']['label'] = 'No items in wish list';
-  $handler->display->display_options['empty']['area']['empty'] = TRUE;
-  $handler->display->display_options['empty']['area']['content'] = 'There are no items in this wish list.';
-  $handler->display->display_options['empty']['area']['format'] = 'plain_text';
-  /* Relationship: Commerce Line Item: Order ID */
-  $handler->display->display_options['relationships']['order_id']['id'] = 'order_id';
-  $handler->display->display_options['relationships']['order_id']['table'] = 'commerce_line_item';
-  $handler->display->display_options['relationships']['order_id']['field'] = 'order_id';
-  $handler->display->display_options['relationships']['order_id']['required'] = TRUE;
+  /* Relationship: Commerce Order: Referenced line items */
+  $handler->display->display_options['relationships']['commerce_line_items_line_item_id']['id'] = 'commerce_line_items_line_item_id';
+  $handler->display->display_options['relationships']['commerce_line_items_line_item_id']['table'] = 'field_data_commerce_line_items';
+  $handler->display->display_options['relationships']['commerce_line_items_line_item_id']['field'] = 'commerce_line_items_line_item_id';
+  $handler->display->display_options['relationships']['commerce_line_items_line_item_id']['required'] = TRUE;
   /* Field: Commerce Line item: Display path */
   $handler->display->display_options['fields']['commerce_display_path']['id'] = 'commerce_display_path';
   $handler->display->display_options['fields']['commerce_display_path']['table'] = 'field_data_commerce_display_path';
   $handler->display->display_options['fields']['commerce_display_path']['field'] = 'commerce_display_path';
+  $handler->display->display_options['fields']['commerce_display_path']['relationship'] = 'commerce_line_items_line_item_id';
   $handler->display->display_options['fields']['commerce_display_path']['exclude'] = TRUE;
   /* Field: Commerce Line Item: Title */
   $handler->display->display_options['fields']['line_item_title']['id'] = 'line_item_title';
   $handler->display->display_options['fields']['line_item_title']['table'] = 'commerce_line_item';
   $handler->display->display_options['fields']['line_item_title']['field'] = 'line_item_title';
-  $handler->display->display_options['fields']['line_item_title']['alter']['make_link'] = TRUE;
-  $handler->display->display_options['fields']['line_item_title']['alter']['path'] = '[commerce_display_path]';
-  /* Field: Commerce Line Item: Created date */
-  $handler->display->display_options['fields']['created']['id'] = 'created';
-  $handler->display->display_options['fields']['created']['table'] = 'commerce_line_item';
-  $handler->display->display_options['fields']['created']['field'] = 'created';
-  $handler->display->display_options['fields']['created']['label'] = 'Added';
-  $handler->display->display_options['fields']['created']['date_format'] = 'medium';
-  $handler->display->display_options['fields']['created']['second_date_format'] = 'long';
+  $handler->display->display_options['fields']['line_item_title']['relationship'] = 'commerce_line_items_line_item_id';
   /* Field: Commerce Line Item: Remove */
   $handler->display->display_options['fields']['wishlist_remove']['id'] = 'wishlist_remove';
   $handler->display->display_options['fields']['wishlist_remove']['table'] = 'commerce_line_item';
   $handler->display->display_options['fields']['wishlist_remove']['field'] = 'wishlist_remove';
-  $handler->display->display_options['fields']['wishlist_remove']['label'] = '';
-  $handler->display->display_options['fields']['wishlist_remove']['element_label_colon'] = FALSE;
+  $handler->display->display_options['fields']['wishlist_remove']['relationship'] = 'commerce_line_items_line_item_id';
   /* Field: Commerce Line Item: Add to Cart */
   $handler->display->display_options['fields']['wishlist_add_to_cart']['id'] = 'wishlist_add_to_cart';
   $handler->display->display_options['fields']['wishlist_add_to_cart']['table'] = 'commerce_line_item';
   $handler->display->display_options['fields']['wishlist_add_to_cart']['field'] = 'wishlist_add_to_cart';
-  $handler->display->display_options['fields']['wishlist_add_to_cart']['label'] = '';
-  $handler->display->display_options['fields']['wishlist_add_to_cart']['element_label_colon'] = FALSE;
-  /* Contextual filter: Commerce Order: Uid */
-  $handler->display->display_options['arguments']['uid']['id'] = 'uid';
-  $handler->display->display_options['arguments']['uid']['table'] = 'commerce_order';
-  $handler->display->display_options['arguments']['uid']['field'] = 'uid';
-  $handler->display->display_options['arguments']['uid']['relationship'] = 'order_id';
-  $handler->display->display_options['arguments']['uid']['default_action'] = 'not found';
-  $handler->display->display_options['arguments']['uid']['default_argument_type'] = 'fixed';
-  $handler->display->display_options['arguments']['uid']['summary']['number_of_records'] = '0';
-  $handler->display->display_options['arguments']['uid']['summary']['format'] = 'default_summary';
-  $handler->display->display_options['arguments']['uid']['summary_options']['items_per_page'] = '25';
-  $handler->display->display_options['arguments']['uid']['specify_validation'] = TRUE;
-  $handler->display->display_options['arguments']['uid']['validate']['type'] = 'current_user_or_role';
-  $handler->display->display_options['arguments']['uid']['validate_options']['restrict_roles'] = TRUE;
-  $handler->display->display_options['arguments']['uid']['validate_options']['roles'] = array(
-    3 => '3',
+  $handler->display->display_options['fields']['wishlist_add_to_cart']['relationship'] = 'commerce_line_items_line_item_id';
+  $handler->display->display_options['fields']['wishlist_add_to_cart']['show_quantity'] = 1;
+  $handler->display->display_options['fields']['wishlist_add_to_cart']['default_quantity'] = '1';
+  $handler->display->display_options['fields']['wishlist_add_to_cart']['combine'] = 1;
+  $handler->display->display_options['fields']['wishlist_add_to_cart']['display_path'] = 0;
+  $handler->display->display_options['fields']['wishlist_add_to_cart']['line_item_type'] = 0;
+  $handler->display->display_options['fields']['wishlist_add_to_cart']['remove_from_wishlist'] = 0;
+  /* Contextual filter: Commerce Order: Order ID */
+  $handler->display->display_options['arguments']['order_id']['id'] = 'order_id';
+  $handler->display->display_options['arguments']['order_id']['table'] = 'commerce_order';
+  $handler->display->display_options['arguments']['order_id']['field'] = 'order_id';
+  $handler->display->display_options['arguments']['order_id']['default_action'] = 'empty';
+  $handler->display->display_options['arguments']['order_id']['default_argument_type'] = 'fixed';
+  $handler->display->display_options['arguments']['order_id']['summary']['number_of_records'] = '0';
+  $handler->display->display_options['arguments']['order_id']['summary']['format'] = 'default_summary';
+  $handler->display->display_options['arguments']['order_id']['summary_options']['items_per_page'] = '25';
+  /* Filter criterion: Commerce Order: Order type */
+  $handler->display->display_options['filters']['type']['id'] = 'type';
+  $handler->display->display_options['filters']['type']['table'] = 'commerce_order';
+  $handler->display->display_options['filters']['type']['field'] = 'type';
+  $handler->display->display_options['filters']['type']['value'] = array(
+    'commerce_order' => 'commerce_order',
   );
-  /* Filter criterion: Commerce Order: Order state */
-  $handler->display->display_options['filters']['state']['id'] = 'state';
-  $handler->display->display_options['filters']['state']['table'] = 'commerce_order';
-  $handler->display->display_options['filters']['state']['field'] = 'state';
-  $handler->display->display_options['filters']['state']['relationship'] = 'order_id';
-  $handler->display->display_options['filters']['state']['value'] = array(
+  /* Filter criterion: Commerce Order: Order status */
+  $handler->display->display_options['filters']['status']['id'] = 'status';
+  $handler->display->display_options['filters']['status']['table'] = 'commerce_order';
+  $handler->display->display_options['filters']['status']['field'] = 'status';
+  $handler->display->display_options['filters']['status']['value'] = array(
     'wishlist' => 'wishlist',
   );
-  $handler->display->display_options['filters']['state']['expose']['operator_id'] = 'state_op';
-  $handler->display->display_options['filters']['state']['expose']['label'] = 'Order state';
-  $handler->display->display_options['filters']['state']['expose']['operator'] = 'state_op';
-  $handler->display->display_options['filters']['state']['expose']['identifier'] = 'state';
-
-  /* Display: Page */
-  $handler = $view->new_display('page', 'Page', 'page');
-  $handler->display->display_options['path'] = 'user/%/wishlist';
-  $handler->display->display_options['menu']['type'] = 'tab';
-  $handler->display->display_options['menu']['title'] = 'Wish list';
-  $handler->display->display_options['menu']['weight'] = '0';
-  $handler->display->display_options['menu']['context'] = 0;
-  $handler->display->display_options['menu']['context_only_inline'] = 0;
-  $translatables['wishlist'] = array(
-    t('Master'),
-    t('User wishlist'),
-    t('more'),
-    t('Apply'),
-    t('Reset'),
-    t('Sort by'),
-    t('Asc'),
-    t('Desc'),
-    t('Items per page'),
-    t('- All -'),
-    t('Offset'),
-    t('« first'),
-    t('‹ previous'),
-    t('next ›'),
-    t('last »'),
-    t('Order'),
-    t('Display path'),
-    t('Title'),
-    t('Added'),
-    t('All'),
-    t('Order state'),
-    t('Page'),
-  );
   $views[$view->name] = $view;
 
   // Administrative views.
diff --git a/includes/views/handlers/commerce_wishlist_handler_field_remove.inc b/includes/views/handlers/commerce_wishlist_handler_field_remove.inc
index bcdd013..91272e4 100644
--- a/includes/views/handlers/commerce_wishlist_handler_field_remove.inc
+++ b/includes/views/handlers/commerce_wishlist_handler_field_remove.inc
@@ -27,22 +27,14 @@ class commerce_wishlist_handler_field_remove extends views_handler_field {
 
   function render($values) {
     // Ensure the user has access to remove this product from wishlist.
-    global $user;
     $line_item_id = $this->get_value($values);
     $line_item = commerce_line_item_load($line_item_id);
+    $product_id = $line_item->commerce_product['und'][0]['product_id'];
 
-    $account = user_load($user->uid);
-    $wishlist_id = $line_item->order_id;
-    $wishlist = commerce_order_load($wishlist_id);
-
-    if (commerce_wishlist_manage_access($account, $wishlist)) {
+    if (user_access('manage own wish list')) {
       $text = !empty($this->options['text']) ? $this->options['text'] : t('Remove');
 
-      $destination = drupal_get_destination();
-
-      return l($text, 'user/' . $wishlist->uid . '/wishlist/nojs/remove/' . $line_item_id, (array(
-        'query' => $destination,
-      )));
+      return theme('commerce_wishlist_remove_from_wishlist_link', array('product_id' => $product_id, 'text' => $text, 'no-ajax' => TRUE));
     }
 
     return '';
