Index: branches/version-2_12-dev/data/Smarty/templates/default/shopping/payment.tpl
===================================================================
--- branches/version-2_12-dev/data/Smarty/templates/default/shopping/payment.tpl	(revision 21549)
+++ branches/version-2_12-dev/data/Smarty/templates/default/shopping/payment.tpl	(revision 21571)
@@ -278,5 +278,5 @@
             <ul>
                 <li>
-                <a href="<!--{$tpl_back_url|h}-->?deliv_check=<!--{$deliv_check|h}-->" onmouseover="chgImg('<!--{$TPL_URLPATH}-->img/button/btn_back_on.jpg','back03')" onmouseout="chgImg('<!--{$TPL_URLPATH}-->img/button/btn_back.jpg','back03')">
+                <a href="<!--{$tpl_back_url|h}-->" onmouseover="chgImg('<!--{$TPL_URLPATH}-->img/button/btn_back_on.jpg','back03')" onmouseout="chgImg('<!--{$TPL_URLPATH}-->img/button/btn_back.jpg','back03')">
                     <img src="<!--{$TPL_URLPATH}-->img/button/btn_back.jpg" alt="戻る" border="0" name="back03" id="back03" /></a>
                 </li>
Index: branches/version-2_12-dev/data/class/pages/shopping/LC_Page_Shopping.php
===================================================================
--- branches/version-2_12-dev/data/class/pages/shopping/LC_Page_Shopping.php	(revision 21527)
+++ branches/version-2_12-dev/data/class/pages/shopping/LC_Page_Shopping.php	(revision 21571)
@@ -179,7 +179,6 @@
 
                 if (SC_Utils_Ex::isBlank($this->arrErr)) {
-                    $objPurchase->unsetShippingTemp();
-                    $this->lfRegistData($this->tpl_uniqid, $objPurchase,
-                                        $objCustomer, $objFormParam);
+                    $this->lfRegistData($this->tpl_uniqid, $objPurchase, $objCustomer, $objFormParam);
+                    $objPurchase->setShipmentItemTempForSole($objCartSess);
 
                     $objSiteSess->setRegistFlag();
@@ -208,7 +207,5 @@
 
                 if (SC_Utils_Ex::isBlank($this->arrErr)) {
-                    $objPurchase->unsetShippingTemp();
-                    $this->lfRegistData($this->tpl_uniqid, $objPurchase,
-                                        $objCustomer, $objFormParam, true);
+                    $this->lfRegistData($this->tpl_uniqid, $objPurchase, $objCustomer, $objFormParam, true);
 
                     $objSiteSess->setRegistFlag();
@@ -355,4 +352,5 @@
      * データの一時登録を行う.
      *
+     * 非会員向けの処理
      * @param integer $uniqid 受注一時テーブルのユニークID
      * @param SC_Helper_Purchase $objPurchase SC_Helper_Purchase インスタンス
@@ -363,40 +361,34 @@
     function lfRegistData($uniqid, &$objPurchase, &$objCustomer, &$objFormParam, $isMultiple = false) {
         $arrParams = $objFormParam->getHashArray();
+
+        // 注文者をお届け先とする配列を取得
+        $arrShippingOwn = array();
+        $objPurchase->copyFromOrder($arrShippingOwn, $arrParams);
+
+        // 都度入力されたお届け先
+        $arrShipping = $objPurchase->extractShipping($arrParams);
+
+        if ($isMultiple) {
+            $objPurchase->unsetShippingTemp(0);
+            $objPurchase->unsetShippingTemp(1);
+            $objPurchase->saveShippingTemp($arrShippingOwn, 0);
+            if ($arrParams['deliv_check'] == '1') {
+                $objPurchase->saveShippingTemp($arrShipping, 1);
+            }
+        } else {
+            $objPurchase->unsetShippingTemp();
+            if ($arrParams['deliv_check'] == '1') {
+                $objPurchase->saveShippingTemp($arrShipping, 0);
+            } else {
+                $objPurchase->saveShippingTemp($arrShippingOwn, 0);
+            }
+        }
+
         $arrValues = $objFormParam->getDbArray();
+
         // 登録データの作成
         $arrValues['order_birth'] = SC_Utils_Ex::sfGetTimestamp($arrParams['year'], $arrParams['month'], $arrParams['day']);
         $arrValues['update_date'] = 'CURRENT_TIMESTAMP';
         $arrValues['customer_id'] = '0';
-
-        // お届け先を指定しない場合、
-        if ($arrParams['deliv_check'] != '1') {
-            // order_* を shipping_* へコピー
-            $objPurchase->copyFromOrder($arrValues, $arrParams);
-        }
-
-        /*
-         * order_* と shipping_* をそれぞれ $_SESSION['shipping'][$shipping_id]
-         * に, shipping_* というキーで保存
-         */
-        foreach ($arrValues as $key => $val) {
-            if (preg_match('/^order_/', $key)) {
-                $arrOrder['shipping_' . str_replace('order_', '', $key)] = $val;
-            } elseif (preg_match('/^shipping_/', $key)) {
-                $arrShipping[$key] = $val;
-            }
-        }
-
-        if ($isMultiple) {
-            $objPurchase->saveShippingTemp($arrOrder, 0);
-            if ($arrParams['deliv_check'] == '1') {
-                $objPurchase->saveShippingTemp($arrShipping, 1);
-            }
-        } else {
-            if ($arrParams['deliv_check'] == '1') {
-                $objPurchase->saveShippingTemp($arrShipping, 0);
-            } else {
-                $objPurchase->saveShippingTemp($arrOrder, 0);
-            }
-        }
         $objPurchase->saveOrderTemp($uniqid, $arrValues, $objCustomer);
     }
Index: branches/version-2_12-dev/data/class/pages/shopping/LC_Page_Shopping_Deliv.php
===================================================================
--- branches/version-2_12-dev/data/class/pages/shopping/LC_Page_Shopping_Deliv.php	(revision 21570)
+++ branches/version-2_12-dev/data/class/pages/shopping/LC_Page_Shopping_Deliv.php	(revision 21571)
@@ -115,13 +115,13 @@
                 $objPurchase->unsetShippingTemp();
 
-                if ($this->registerDeliv($arrForm['deliv_check'], $this->tpl_uniqid,
-                                         $objPurchase, $objCustomer)) {
-                    $objSiteSess->setRegistFlag();
-                    SC_Response_Ex::sendRedirect(SHOPPING_PAYMENT_URLPATH);
-                    exit;
-
-                } else {
+                $success = $this->registerDeliv($arrForm['deliv_check'], $this->tpl_uniqid, $objPurchase, $objCustomer);
+                if (!$success) {
                     SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, '', true);
                 }
+
+                $objPurchase->setShipmentItemTempForSole($objCartSess);
+                $objSiteSess->setRegistFlag();
+                SC_Response_Ex::sendRedirect(SHOPPING_PAYMENT_URLPATH);
+                exit;
                 break;
 
Index: branches/version-2_12-dev/data/class/SC_Customer.php
===================================================================
--- branches/version-2_12-dev/data/class/SC_Customer.php	(revision 21527)
+++ branches/version-2_12-dev/data/class/SC_Customer.php	(revision 21571)
@@ -213,4 +213,6 @@
         // $_SESSION['customer']の解放
         unset($_SESSION['customer']);
+        // セッションの配送情報を全て破棄する
+        SC_Helper_Purchase_Ex::unsetAllShippingTemp(true);
         // トランザクショントークンの破棄
         SC_Helper_Session_Ex::destroyToken();
Index: branches/version-2_12-dev/data/class/helper/SC_Helper_Purchase.php
===================================================================
--- branches/version-2_12-dev/data/class/helper/SC_Helper_Purchase.php	(revision 21570)
+++ branches/version-2_12-dev/data/class/helper/SC_Helper_Purchase.php	(revision 21571)
@@ -34,4 +34,10 @@
 class SC_Helper_Purchase {
 
+    var $arrShippingKey = array(
+        'name01', 'name02', 'kana01', 'kana02',
+        'sex', 'zip01', 'zip02', 'pref', 'addr01', 'addr02',
+        'tel01', 'tel02', 'tel03',
+    );
+
     /**
      * 受注を完了する.
@@ -73,11 +79,9 @@
         $orderTemp['status'] = $orderStatus;
         $cartkey = $objCartSession->getKey();
-        $orderId = $this->registerOrderComplete($orderTemp, $objCartSession,
-                                                $cartkey);
+        $orderId = $this->registerOrderComplete($orderTemp, $objCartSession, $cartkey);
         $isMultiple = SC_Helper_Purchase::isMultiple();
         $shippingTemp =& $this->getShippingTemp($isMultiple);
         foreach ($shippingTemp as $shippingId => $val) {
-            $this->registerShipmentItem($orderId, $shippingId,
-                                        $val['shipment_item']);
+            $this->registerShipmentItem($orderId, $shippingId, $val['shipment_item']);
         }
 
@@ -312,7 +316,11 @@
     function clearShipmentItemTemp($shipping_id = null) {
         if (is_null($shipping_id)) {
-            unset($_SESSION['shipping']);
+            if (!isset($_SESSION['shipping'][$shipping_id])) return;
+            if (!is_array($_SESSION['shipping'][$shipping_id])) return;
+            foreach (array_keys($_SESSION['shipping'][$shipping_id]) as $key) {
+                $this->clearShipmentItemTemp($key);
+            }
         } else {
-            unset($_SESSION['shipping'][$shipping_id]);
+            unset($_SESSION['shipping'][$shipping_id]['shipment_item']);
         }
     }
@@ -370,5 +378,5 @@
      */
     function isMultiple() {
-        return count(SC_Helper_Purchase_Ex::getShippingTemp(true)) >= 1;
+        return count(SC_Helper_Purchase_Ex::getShippingTemp(true)) >= 2;
     }
 
@@ -376,4 +384,5 @@
      * 配送情報をセッションに保存する.
      *
+     * XXX マージする理由が不明(なんとなく便利な気はするけど)。分かる方コメントに残してください。
      * @param array $arrSrc 配送情報の連想配列
      * @param integer $shipping_id 配送先ID
@@ -384,19 +393,43 @@
         unset($arrSrc['shipment_item']);
 
-        if (empty($_SESSION['shipping'][$shipping_id])) {
-            $_SESSION['shipping'][$shipping_id] = $arrSrc;
-            $_SESSION['shipping'][$shipping_id]['shipping_id'] = $shipping_id;
-        } else {
-            $_SESSION['shipping'][$shipping_id] = array_merge($_SESSION['shipping'][$shipping_id], $arrSrc);
-            $_SESSION['shipping'][$shipping_id]['shipping_id'] = $shipping_id;
-        }
+        if (!isset($_SESSION['shipping'][$shipping_id])) {
+            $_SESSION['shipping'][$shipping_id] = array();
+        }
+        $_SESSION['shipping'][$shipping_id] = array_merge($_SESSION['shipping'][$shipping_id], $arrSrc);
+        $_SESSION['shipping'][$shipping_id]['shipping_id'] = $shipping_id;
     }
 
     /**
      * セッションの配送情報を破棄する.
+     *
+     * @deprecated 2.12.0 から EC-CUBE 本体では使用していない。
+     * @param integer $shipping_id 配送先ID
+     * @return void
      */
     function unsetShippingTemp() {
+        $this->unsetAllShippingTemp(true);
+    }
+
+    /**
+     * セッションの配送情報を全て破棄する
+     *
+     * @param bool $multiple_temp 複数お届け先の画面戻り処理用の情報も破棄するか
+     * @return void
+     */
+    function unsetAllShippingTemp($multiple_temp = false) {
         unset($_SESSION['shipping']);
-        unset($_SESSION['multiple_temp']);
+        if ($multiple_temp) {
+            unset($_SESSION['multiple_temp']);
+        }
+    }
+
+    /**
+     * セッションの配送情報を個別に破棄する
+     *
+     * @param integer $shipping_id 配送先ID
+     * @return void
+     */
+    function unsetOneShippingTemp($shipping_id) {
+        unset($_SESSION['shipping'][$shipping_id]);
     }
 
@@ -453,17 +486,13 @@
      * @param array $dest コピー先の配列
      * @param array $src コピー元の配列
-     * @param array $keys コピー対象のキー
+     * @param array $arrKey コピー対象のキー
      * @param string $prefix コピー先の接頭辞. デフォルト shipping
      * @param string $src_prefix コピー元の接頭辞. デフォルト order
      * @return void
      */
-    function copyFromOrder(&$dest, $src,
-        $prefix = 'shipping', $src_prefix = 'order',
-        $keys = array(
-            'name01', 'name02', 'kana01', 'kana02',
-            'sex', 'zip01', 'zip02', 'pref', 'addr01', 'addr02',
-            'tel01', 'tel02', 'tel03',
-        )
-    ) {
+    function copyFromOrder(&$dest, $src, $prefix = 'shipping', $src_prefix = 'order', $arrKey = null) {
+        if (is_null($arrKey)) {
+            $arrKey = $this->arrShippingKey;
+        }
         if (!SC_Utils_Ex::isBlank($prefix)) {
             $prefix = $prefix . '_';
@@ -472,9 +501,23 @@
             $src_prefix = $src_prefix . '_';
         }
-        foreach ($keys as $key) {
-            if (in_array($key, $keys)) {
+        foreach ($arrKey as $key) {
+            if (isset($src[$src_prefix . $key])) {
                 $dest[$prefix . $key] = $src[$src_prefix . $key];
             }
         }
+    }
+
+    /**
+     * 配送情報のみ抜き出す。
+     *
+     * @param string $arrSrc 元となる配列
+     * @return void
+     */
+    function extractShipping($arrSrc) {
+        $arrKey = array();
+        foreach($this->arrShippingKey as $key) {
+            $arrKey[] = 'shipping_' . $key;
+        }
+        return SC_Utils_Ex::sfArrayIntersectKeys($arrSrc, $arrKey);
     }
 
@@ -1286,6 +1329,25 @@
 
         // セッションの配送情報を破棄する.
-        $this->unsetShippingTemp();
+        $this->unsetAllShippingTemp(true);
         $objCustomer->updateSession();
     }
+
+    /**
+     * 単一配送指定用に配送商品を設定する
+     *
+     * @param SC_CartSession $objCartSession カート情報のインスタンス
+     * @param integer $shipping_id 配送先ID
+     * @return void
+     */
+    function setShipmentItemTempForSole(&$objCartSession, $shipping_id = 0) {
+        $objCartSess = new SC_CartSession_Ex();
+
+        $this->clearShipmentItemTemp();
+
+        $arrCartList =& $objCartSession->getCartList($objCartSess->getKey());
+        foreach ($arrCartList as $arrCartRow) {
+            if ($arrCartRow['quantity'] == 0) continue;
+            $this->setShipmentItemTemp($shipping_id, $arrCartRow['id'], $arrCartRow['quantity']);
+        }
+    }
 }
