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..628f5b1 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;
   }
     
@@ -748,6 +748,13 @@ 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;
+}
 
 
 
@@ -795,6 +802,30 @@ function commerce_coupon_log_load_by_order_and_coupon($order_id, $coupon_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'])));  
+}
+
+/**
  * Saves a coupon log object to database.
  *
  * @param $log
@@ -1089,6 +1120,7 @@ function commerce_coupon_line_item_new($coupon, $order_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;
   
@@ -1096,6 +1128,11 @@ function commerce_coupon_line_item_new($coupon, $order_id) {
   return $line_item_wrapper->value();
 }
 
+function commerce_coupon_line_item_load_by_coupon_log($coupon_log) {
+  $coupon = commerce_coupon_load($coupon_log->coupon_id);
+  $line_items = commerce_line_item_load_multiple(array(), array('type' => 'coupon', 'line_item_label' => $coupon->type . '_' . $coupon->coupon_id, 'order_id' => $coupon_log->order_id));
+  return $line_items ? reset($line_items) : FALSE;
+}
 
 /**
  * Ensures the coupon line item type contains a coupon reference field.
@@ -1142,3 +1179,59 @@ function commerce_coupon_configure_line_item() {
   
 }
 
+/**
+ * Delete a coupon log item and its related line_item.
+ */
+function coupon_log_remove($coupon_log_id) {
+  $coupon_log = commerce_coupon_log_load($coupon_log_id);
+  $line_item = commerce_coupon_line_item_load_by_coupon_log($coupon_log);
+  
+  commerce_line_item_delete($line_item->line_item_id);
+  $coupon_log->delete();
+}
+
+/**
+ * Determine access to a coupon log.
+ *
+ * TODO: Can coupon_log ever be NULL?
+ */
+function coupon_log_access($op, $coupon_log = NULL) {
+  if(!is_object($coupon_log)) {
+    if (!$coupon_log = commerce_coupon_log_load($coupon_log)) {
+      return FALSE;
+    }
+  }
+  if (!$order = commerce_order_load($coupon_log->order_id)) {
+    return FALSE;
+  }
+  
+  return commerce_order_access($op, $order);
+}
+
+/**
+ * Form for removing a coupon line item.
+ */
+function commerce_coupon_remove_coupon_line_item_form($form, &$form_state, $coupon_log_id) {
+  $form = array();
+  $form['coupon_log_id'] = array(
+    '#type' => 'value',
+    '#value' => $coupon_log_id,
+  );
+  $form['description'] = array(
+    '#markup' => '<p>' . t('Are you sure you want to remove the coupon from your cart?') .'</p>',
+  );
+  $form['actions']['remove'] = array(
+    '#type' => 'submit',
+    '#value' => t('Remove'),
+    '#submit' => array('commerce_coupon_remove_coupon_line_item_form_submit'),
+  );
+  return $form;
+}
+
+/**
+ * Submission callback for coupon line item remove form.
+ */
+function commerce_coupon_remove_coupon_line_item_form_submit(&$form, &$form_state) {
+  coupon_log_remove($form_state['values']['coupon_log_id']);
+}
+
diff --git a/commerce_coupon.rules.inc b/commerce_coupon.rules.inc
index d338abc..71a201e 100644
--- a/commerce_coupon.rules.inc
+++ b/commerce_coupon.rules.inc
@@ -155,6 +155,29 @@ 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_action_is_valid_coupon($override = false) {
   $validation_results = &drupal_static('commerce_coupon_action_validation_results');
@@ -241,5 +264,7 @@ function commerce_coupon_action_get_coupon_uses($commerce_coupon) {
   return array('number_of_uses' => commerce_coupon_get_number_of_uses($commerce_coupon->coupon_id));
 }
 
-
-
+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);
+}
diff --git a/commerce_coupon_ui.module b/commerce_coupon_ui.module
index 7667888..072313b 100644
--- a/commerce_coupon_ui.module
+++ b/commerce_coupon_ui.module
@@ -58,7 +58,14 @@ function commerce_coupon_ui_menu() {
     'weight' => 50,
   );
   
-
+  $items['commerce/coupons/log/remove/%'] = array( 
+    'title' => 'Remove Coupon From Cart', 
+    'page callback' => 'coupon_log_remove_page',
+    'page arguments' => array(4),
+    'access callback' => 'coupon_log_access',
+    'access arguments' => array('update', 4),
+    'type' => MENU_CALLBACK,
+  );
   
   return $items;
 }
@@ -202,6 +209,12 @@ function theme_commerce_coupon_ui_add_list($variables) {
   return $output;
 }
 
-
+/**
+ * Page callback for removing a coupon log.
+ */
+function coupon_log_remove_page($coupon_log_id) {
+  $form = drupal_get_form('commerce_coupon_remove_coupon_line_item_form', $coupon_log_id);
+  return $form;
+}
 
 
diff --git a/includes/views/commerce_coupon.views.inc b/includes/views/commerce_coupon.views.inc
index a967ee8..ff97f14 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(
