diff --git a/commerce_coupon.info b/commerce_coupon.info
index e628884..5f9a785 100644
--- a/commerce_coupon.info
+++ b/commerce_coupon.info
@@ -19,6 +19,7 @@ files[] = classes/commerce_coupon_type.inc
 ; Views Handler
 files[] = includes/views/handlers/commerce_coupon_handler_field_amount.inc
 files[] = includes/views/handlers/commerce_coupon_handler_field_coupon_operations.inc
+files[] = includes/views/handlers/commerce_coupon_handler_field_coupon_log_remove.inc
 
 ; CRUD Handlers
 files[] = includes/commerce_coupon_type.crud.inc
diff --git a/commerce_coupon.module b/commerce_coupon.module
index 47371df..0324851 100644
--- a/commerce_coupon.module
+++ b/commerce_coupon.module
@@ -299,7 +299,7 @@ function commerce_coupon_redeem_coupon($coupon, $order) {
   global $user;
   
   if (!isset($order->order_id) or !isset($coupon->coupon_id) ) {
-    drupal_set_message(t('Your coupon code cannot be redeem.'), 'error');
+    drupal_set_message(t('Your coupon code cannot be redeemed.'), 'error');
     return;
   }
     
@@ -749,7 +749,14 @@ function commerce_coupon_code_is_active($code) {
 }
 
 
-
+
+/**
+ * Loads an coupon log by ID.
+ */
+function commerce_coupon_log_load($log_id) {
+  $logs = commerce_coupon_log_load_multiple(array($log_id), array());
+  return $logs ? reset($logs) : FALSE;
+}
 
 /**
  * Load multiple coupon logs based on certain conditions.
@@ -792,6 +799,30 @@ function commerce_coupon_log_load_by_order_and_coupon($order_id, $coupon_id) {
   }
   $log = reset($coupon_raw);
   return reset(commerce_coupon_log_load_multiple(array($log['log_id'])));  
+}
+
+/**
+ * Load a coupon log entry by user and coupon. It is not possible that one 
+ * coupon is assigned multiple to one order. So this two entities builds the
+ * primary key for the coupon log.
+ *
+ * @param $uid
+ *   User Id to which the coupons belongs.
+ * @param $order_id
+ *   Order Id to which the coupons belongs.
+ * @return commerce_coupon_log
+ *   A list of coupons
+ */
+function commerce_coupon_log_load_by_user_and_coupon($uid, $coupon_id) {  
+  
+  // TODO: Use the Drupal 7 query API
+  $coupon_raw = db_query('SELECT log_id FROM {commerce_coupon_log} WHERE uid = :uid AND coupon_id = :coupon_id', array(':uid' => $uid, ':coupon_id' => $coupon_id))->fetchAllAssoc('log_id', PDO::FETCH_ASSOC);
+  
+  if(!is_array($coupon_raw) or count($coupon_raw) <= 0) {
+    return NULL;
+  }
+  $log = reset($coupon_raw);
+  return reset(commerce_coupon_log_load_multiple(array($log['log_id'])));  
 }
 
 /**
@@ -1083,20 +1114,24 @@ function commerce_coupon_line_item_new($coupon, $order_id) {
     'order_id' => $order_id,
     'quantity' => 1,
   ));
-
-  $line_item->sku = $coupon->type . '_' . $coupon->coupon_id;
     
   if (!($line_item instanceof EntityMetadataWrapper)) {
     $line_item_wrapper = entity_metadata_wrapper('commerce_line_item', $line_item);
-  }
+  }
+  $line_item_wrapper->line_item_label = $coupon->type . '_' . $coupon->coupon_id;
   
   $line_item_wrapper->commerce_coupon_reference = $coupon->coupon_id;
   
   // Return the line item.
   return $line_item_wrapper->value();
+}
+
+function commerce_coupon_line_item_load_by_coupon($coupon)
+{
+  $line_items = commerce_line_item_load_multiple(array(), array('line_item_label' => $coupon->type . '_' . $coupon->coupon_id));
+  return $line_items ? reset($line_items) : FALSE;
 }
 
-
 /**
  * Ensures the coupon line item type contains a coupon reference field.
  *
@@ -1142,3 +1177,35 @@ function commerce_coupon_configure_line_item() {
   
 }
 
+
+function coupon_log_remove($coupon_log_id) {
+  $couponLog = commerce_coupon_log_load($coupon_log_id);
+  $coupon = commerce_coupon_load($couponLog->coupon_id);
+  $line_item = commerce_coupon_line_item_load_by_coupon($coupon);
+  
+  commerce_line_item_delete($line_item->line_item_id);
+  $couponLog->delete();
+  
+  drupal_goto('checkout/' . $couponLog->order_id);
+}
+
+function coupon_log_access($op, $couponLog = NULL, $account = NULL)
+{
+  if(!is_object($couponLog)) // allow for passing an id
+  {
+    $couponLog = commerce_coupon_log_load($couponLog);
+    if(!$couponLog)
+    {
+      return FALSE;
+    }
+  }
+  
+  $order = commerce_order_load($couponLog->order_id);
+  
+  if(!$order)
+  {
+    return FALSE;
+  }
+  
+  return commerce_order_access($op, $order);
+}
\ No newline at end of file
diff --git a/commerce_coupon.rules.inc b/commerce_coupon.rules.inc
index d338abc..d9037ae 100644
--- a/commerce_coupon.rules.inc
+++ b/commerce_coupon.rules.inc
@@ -155,6 +155,35 @@ function commerce_coupon_rules_action_info() {
   return $actions;
 }
 
+/**
+* Implementation of hook_rules_condition_info().
+*/
+function commerce_coupon_rules_condition_info() {
+  return array(
+    'commerce_coupon_already_used_by_user' => array(
+      'group' => 'Commerce Coupon',
+      'label' => t('Coupon already used by user'),
+      'arguments' => array(
+        'coupon' => array(
+            'type' => 'commerce_coupon', 
+            'label' => t('Coupon')
+        ),
+        'user' => array(
+            'type' => 'user', 
+            'label' => t('User')
+        ),
+      ),
+      'module' => 'commerce_coupon',
+    ),
+  );
+}
+
+function commerce_coupon_already_used_by_user($coupon, $user)
+{
+  $log = commerce_coupon_log_load_by_user_and_coupon($user->uid, $coupon->coupon_id);
+  
+  return is_object($log);
+}
 
 function commerce_coupon_action_is_valid_coupon($override = false) {
   $validation_results = &drupal_static('commerce_coupon_action_validation_results');
diff --git a/commerce_coupon_ui.module b/commerce_coupon_ui.module
index 7667888..679a29d 100644
--- a/commerce_coupon_ui.module
+++ b/commerce_coupon_ui.module
@@ -120,7 +120,14 @@ function commerce_coupon_menu_alter(&$items) {
   
   $items['admin/commerce/coupons/types']['title'] = t('Types');
   
-  
+  $items['commerce/coupons/log/remove/%'] = array( 
+     'title' => t('Remove Coupon Log'), 
+     'page callback' => 'coupon_log_remove',
+     'page arguments' => array(4),
+     'access callback' => 'coupon_log_access',
+     'access arguments' => array('update', 4),
+     'type' => MENU_CALLBACK
+  );
 }
 
 
diff --git a/includes/views/commerce_coupon.views.inc b/includes/views/commerce_coupon.views.inc
index a967ee8..66f81ae 100644
--- a/includes/views/commerce_coupon.views.inc
+++ b/includes/views/commerce_coupon.views.inc
@@ -24,6 +24,13 @@ function commerce_coupon_views_data_alter(&$data) {
         'field' => 'order_id',
       );
     }
+    $data['commerce_coupon_log']['delete_button'] = array(
+      'field' => array(
+        'title' => t('Remove Button'),
+        'help' => t('Remove the coupon from the current cart.'),
+        'handler' => 'commerce_coupon_handler_field_coupon_log_remove',
+      ),
+    ); 
   }
   if (isset($data['commerce_coupon'])){
     $data['commerce_coupon']['operations'] = array(
