--- uc_product_kit.module
+++ (clipboard)
@@ -692,9 +692,22 @@
   $form['nid'] = array('#type' => 'value', '#value' => $node->nid, );
   $form['products'] = array('#tree' => TRUE);
   foreach ($node->products as $i => $product) {
-    $form['products'][$i] = array(/* '#type' => 'fieldset',  */'#title' => $product->title);
-    $form['products'][$i]['nid'] = array('#type' => 'hidden', '#value' => $product->nid);
-    $form['products'][$i]['qty'] = array('#type' => 'hidden', '#value' => $product->qty);
+    if ($product->qty > 1 and module_exists('uc_attribute') and !empty($product->attributes)) {
+      for ($i=0; $i < $product->qty; $i++) { 
+        $form['products'][] = array(
+          '#type' => 'fieldset',
+          '#title' => check_plain($product->title).' #'.($i+1),
+          'nid' => array('#type' => 'hidden', '#value' => $product->nid),
+          'qty' => array('#type' => 'hidden', '#value' => 1),
+        );
+      }
+    } else {
+      $form['products'][] = array(
+        '#title' => $product->title,
+        'nid' => array('#type' => 'hidden', '#value' => $product->nid),
+        'qty' => array('#type' => 'hidden', '#value' => $product->qty),
+      );
+    }
   }
   if ($node->default_qty > 0 && variable_get('uc_product_add_to_cart_qty', FALSE)) {
     $form['qty'] = array('#type' => 'textfield',
@@ -822,12 +835,26 @@
 function uc_product_kit_add_to_cart($nid, $qty, $kit_data) {
   $node = node_load($nid);
   if ($node->type == 'product_kit') {
-    $unique = uniqid('', TRUE);
-    foreach ($node->products as $product) {
-      $data = array('kit_id' => $node->nid, 'unique_id' => $unique, 'module' => 'uc_product_kit');
-      uc_cart_add_item($product->nid, $product->qty * $qty, $data +  module_invoke_all('add_to_cart_data', $kit_data['products'][$product->nid]), NULL, FALSE, FALSE);
+    // Merge duplicate product/attribute combination
+    foreach ($kit_data['products'] as $key => $product) {
+      foreach ($kit_data['products'] as $key2 => $product2) {
+        if ($key != $key2 and serialize($product) == serialize($product2)) {
+          $kit_data['products'][$key]['qty']++;
+          unset($kit_data['products'][$key2]);
+        }
+      }
+    }
+    $unique_id = uniqid('', TRUE);
+    foreach ($kit_data['products'] as $product) {
+      $data = array(
+        'kit_id' => $node->nid,
+        'unique_id' => $unique_id,
+        'module' => 'uc_product_kit',
+        // percentage of product kit quantity, per product
+        'kit_qty_percent' => $product['qty'] / $node->products[$product['nid']]->qty,
+      );
+      uc_cart_add_item($product['nid'], $product['qty'] * $qty, $data +  module_invoke_all('add_to_cart_data', $product), NULL, FALSE, FALSE);
     }
-
     return array(array('success' => FALSE, 'silent' => TRUE, 'message' => ''));
   }
 }
@@ -865,9 +892,10 @@
 function uc_product_kit_cart_display($item) {
   static $elements = array();
   static $products;
+  static $quantities;
   $unique_id = $item->data['unique_id'];
+  $quantities[$unique_id][$item->nid] = isset($quantities[$unique_id][$item->nid]) ? $quantities[$unique_id][$item->nid] + $item->qty : $item->qty;
   $kit = node_load($item->data['kit_id']);
-  //print '<pre>'. print_r($kit, TRUE) .'</pre>';
   if ($kit->mutable == UC_PRODUCT_KIT_MUTABLE) {
     return uc_product_cart_display($item);
   }
@@ -881,7 +909,7 @@
       $element['title'] = array('#value' => l($kit->title, 'node/'. $kit->nid));
       $element['qty'] = array(
         '#type' => 'textfield',
-        '#default_value' => $item->qty / $kit->products[$item->nid]->qty,
+        '#default_value' => $item->qty / ($kit->products[$item->nid]->qty * $item->data['kit_qty_percent']),
         '#size' => 5,
         '#maxlength' => 6,
       );
@@ -923,13 +951,13 @@
     );
 
     $elements[$unique_id]['#total'] += uc_price($price_info, $context);
-    $elements[$unique_id]['data'][$item->nid] = $item;
+    $elements[$unique_id]['data'][] = $item;
     $products[$unique_id][] = $item->nid;
 
     // Check if all products in this kit have been accounted for.
     $done = TRUE;
     foreach ($kit->products as $product) {
-      if (!in_array($product->nid, $products[$unique_id])) {
+      if (!in_array($product->nid, $products[$unique_id]) or $quantities[$unique_id][$product->nid] != ($product->qty * $elements[$unique_id]['qty']['#default_value'])) {
         $done = FALSE;
         break;
       }
@@ -960,8 +988,8 @@
   if (!$nid) return NULL;
   $cid = !(is_null($cid) || empty($cid)) ? $cid : uc_cart_get_id();
   if ($qty < 1) {
-    foreach ($data as $p_nid => $product) {
-      uc_cart_remove_item($p_nid, $cid, $product->data);
+    foreach ($data as $product) {
+      uc_cart_remove_item($product->nid, $cid, $product->data);
     }
   }
   else {
@@ -970,8 +998,8 @@
     }
     else {
       $kit = node_load($nid);
-      foreach ($data as $p_nid => $product) {
-        uc_product_update_cart_item($p_nid, $product->data, $qty * $kit->products[$p_nid]->qty, $cid);
+      foreach ($data as $product) {
+        uc_product_update_cart_item($product->nid, $product->data, $qty * ($kit->products[$product->nid]->qty * $product->data['kit_qty_percent']), $cid);
       }
     }
   }
