diff --git a/modules/cart/commerce_cart.api.php b/modules/cart/commerce_cart.api.php
index 934810f..4943583 100644
--- a/modules/cart/commerce_cart.api.php
+++ b/modules/cart/commerce_cart.api.php
@@ -199,6 +199,9 @@ function hook_commerce_cart_attributes_refresh_alter(&$commands, $form, $form_st
  * @param &$comparison_properties
  *   The array of property names (including field names) that map to properties
  *   on the line item wrappers being compared to check for combination.
+ * @param $line_item
+ *   A clone of the line item being added to the cart. Since this is a clone,
+ *   changes made to it will not propagate up to the Add to Cart process.
  */
 function hook_commerce_cart_product_comparison_properties_alter(&$comparison_properties) {
   // Force separate line items when the same product is added to the cart from
diff --git a/modules/cart/commerce_cart.module b/modules/cart/commerce_cart.module
index e1ac30d..ee803ff 100644
--- a/modules/cart/commerce_cart.module
+++ b/modules/cart/commerce_cart.module
@@ -1142,15 +1142,22 @@ function commerce_cart_product_add($uid, $line_item, $combine = TRUE) {
 
     // Allow other modules to specify what properties should be compared when
     // determining whether or not to combine line items.
-    drupal_alter('commerce_cart_product_comparison_properties', $comparison_properties);
+    drupal_alter('commerce_cart_product_comparison_properties', $comparison_properties, clone($line_item));
 
     // Loop over each line item on the order.
     foreach ($order_wrapper->commerce_line_items as $delta => $matching_line_item_wrapper) {
       // Examine each of the comparison properties on the line item.
       foreach ($comparison_properties as $property) {
+        // If the property is not present on either line item, bypass it.
+        if (!isset($matching_line_item_wrapper->value()->{$property}) && !isset($line_item_wrapper->value()->{$property})) {
+          continue;
+        }
+
         // If any property does not match the same property on the incoming line
-        // item...
-        if ($matching_line_item_wrapper->{$property}->raw() != $line_item_wrapper->{$property}->raw()) {
+        // item or exists on one line item but not the other...
+        if ((!isset($matching_line_item_wrapper->value()->{$property}) && isset($line_item_wrapper->value()->{$property})) ||
+          (isset($matching_line_item_wrapper->value()->{$property}) && !isset($line_item_wrapper->value()->{$property})) ||
+          $matching_line_item_wrapper->{$property}->raw() != $line_item_wrapper->{$property}->raw()) {
           // Continue the loop with the next line item.
           continue 2;
         }
