diff --git a/bin/frontend/controls/CouponCodeInput.js b/bin/frontend/controls/CouponCodeInput.js
index a055182a804dc89c13be701b91afa632e2b6ea35..7bd7b9b5bc358b327e17d32807a5e658cbdf1e11 100644
--- a/bin/frontend/controls/CouponCodeInput.js
+++ b/bin/frontend/controls/CouponCodeInput.js
@@ -6,8 +6,10 @@
  */
 define('package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput', [
 
+    'qui/QUI',
     'qui/controls/Control',
     'qui/controls/loader/Loader',
+    'utils/Session',
 
     'package/quiqqer/coupons/bin/frontend/CouponCodes',
 
@@ -18,7 +20,7 @@ define('package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput', [
     'text!package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput.html',
     'css!package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput.css'
 
-], function (QUIControl, QUILoader, CouponCodes, QUIAjax, QUILocale, Mustache, template) {
+], function (QUI, QUIControl, QUILoader, Sessions, CouponCodes, QUIAjax, QUILocale, Mustache, template) {
     "use strict";
 
     var lg = 'quiqqer/coupons';
@@ -135,10 +137,12 @@ define('package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput', [
                             return;
                         }
 
-                        QUIAjax.get('package_quiqqer_order_ajax_frontend_basket_getOrderProcessUrl', function (url) {
-                            window.location = url + '?coupon=' + code;
-                        }, {
-                            'package': 'quiqqer/order'
+                        self.$addCouponCodeToSession(code).then(function () {
+                            QUIAjax.get('package_quiqqer_order_ajax_frontend_basket_getOrderProcessUrl', function (url) {
+                                window.location = url + '?coupon=' + code;
+                            }, {
+                                'package': 'quiqqer/order'
+                            });
                         });
                     });
                 }, {
@@ -163,7 +167,30 @@ define('package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput', [
                     return;
                 }
 
-                OrderProcess.reload();
+                self.$addCouponCodeToSession(code).then(function () {
+                    OrderProcess.reload();
+                });
+            });
+        },
+
+        /**
+         *
+         * @param code
+         * @return {Promise}
+         */
+        $addCouponCodeToSession: function (code) {
+            return Sessions.get('quiqqer-coupons').then(function (coupons) {
+                if (!coupons || typeOf(coupons) !== 'array') {
+                    coupons = [];
+                }
+
+                coupons.push(code);
+
+                coupons = coupons.filter(function (value, index, self) {
+                    return self.indexOf(value) === index;
+                });
+
+                return Sessions.set('quiqqer-coupons', JSON.encode(coupons));
             });
         },
 
diff --git a/events.xml b/events.xml
index fea43d838fe3207a13667fe25936b2c8e973ba2a..40d75eddeba09ee773e4478d4e3597b257af8c21 100644
--- a/events.xml
+++ b/events.xml
@@ -20,4 +20,8 @@
            fire="\QUI\ERP\Coupons\Events::onOrderProcess"
     />
 
-</events>
\ No newline at end of file
+    <event on="onQuiqqerOrderBasketRemovePos"
+           fire="\QUI\ERP\Coupons\Events::onQuiqqerOrderBasketRemovePos"
+    />
+
+</events>
diff --git a/src/QUI/ERP/Coupons/Events.php b/src/QUI/ERP/Coupons/Events.php
index 2287283e99e58e618607cc53a848d3f012caf6c0..2907bb4b44c54e6aac2234e082a72e97d6c2587f 100644
--- a/src/QUI/ERP/Coupons/Events.php
+++ b/src/QUI/ERP/Coupons/Events.php
@@ -61,29 +61,119 @@ public static function onOrderProcess(QUI\ERP\Order\OrderProcess $OrderProcess)
             return;
         }
 
-        if (!isset($_GET['coupon'])) {
+        $coupons = QUI::getSession()->get('quiqqer-coupons');
+
+        if (\is_string($coupons)) {
+            $coupons = \json_decode($coupons, true);
+        }
+
+        if (!\is_array($coupons)) {
+            $coupons = [];
+        }
+
+        if (isset($_GET['coupon'])) {
+            $coupons[] = $_GET['coupon'];
+        }
+
+        $coupons = \array_unique($coupons);
+
+        if (empty($coupons)) {
             return;
         }
 
+        $Order = $OrderProcess->getOrder();
+
+        foreach ($coupons as $coupon) {
+            self::addCouponToOrder($Order, $coupon);
+        }
+    }
+
+    /**
+     * @param QUI\ERP\Order\Basket\Basket $Basket
+     * @param $pos
+     */
+    public static function onQuiqqerOrderBasketRemovePos(
+        QUI\ERP\Order\Basket\Basket $Basket,
+        $pos
+    ) {
+        $Order = null;
 
         try {
-            $Order = $OrderProcess->getOrder();
-            $code  = Handler::sanitizeCode($_GET['coupon']);
+            $Order = $Basket->getOrder();
+        } catch (QUI\Exception $Exception) {
+            $Orders = QUI\ERP\Order\Handler::getInstance();
 
-            $CouponCode = Handler::getCouponCodeByCode($code);
-            $CouponCode->checkRedemption(QUI::getUserBySession());
+            try {
+                $Order = $Orders->getLastOrderInProcessFromUser(QUI::getUserBySession());
+            } catch (QUI\Exception $Exception) {
+            }
+        }
 
-            $coupons   = $Order->getDataEntry('quiqqer-coupons');
-            $coupons[] = $code;
+        if (!$Order) {
+            QUI::getSession()->remove('quiqqer-coupons');
 
-            $coupons = \array_unique($coupons);
+            return;
+        }
 
-            $Order->setData('quiqqer-coupons', $coupons);
-            $Order->update();
 
+        $Article      = $Order->getArticles()->getArticle($pos);
+        $customData   = $Article->getCustomData();
+        $orderCoupons = $Order->getDataEntry('quiqqer-coupons');
 
-            $CouponCode->addToOrder($Order);
-        } catch (\Exception $Exception) {
+        $articleCouponCode = false;
+
+        if (isset($customData['package']) && isset($customData['code'])) {
+            $articleCouponCode = $customData['code'];
+        }
+
+        if (!$articleCouponCode) {
+            return;
+        }
+
+        // custom data has code params, so article is an coupon code
+        // we need to delete it
+        if (\in_array($articleCouponCode, $orderCoupons)) {
+            $pos = \array_search($articleCouponCode, $orderCoupons);
+            unset($orderCoupons[$pos]);
+
+            $Order->setData('quiqqer-coupons', $orderCoupons);
+
+            try {
+                $Order->save();
+            } catch (QUI\Exception $Exception) {
+            }
+        }
+
+        // look at session coupons
+        // we need to delete it
+        $coupons = QUI::getSession()->get('quiqqer-coupons');
+
+        if (\is_string($coupons)) {
+            $coupons = \json_decode($coupons, true);
+        }
+
+        if (!\is_array($coupons) || empty($coupons)) {
+            return;
+        }
+
+        if (!\in_array($customData['code'], $coupons)) {
+            return;
+        }
+
+        // remove code from session
+        // because code is deleted
+        $newCouponList = [];
+
+        foreach ($coupons as $coupon) {
+            if ($customData['code'] !== $coupon) {
+                $newCouponList[] = $coupon;
+            }
+        }
+
+        if (empty($newCouponList)) {
+            QUI::getSession()->remove('quiqqer-coupons');
+        } else {
+            QUI::getSession()->set('quiqqer-coupons', \json_encode($newCouponList));
         }
     }
 
@@ -99,14 +189,23 @@ public static function onQuiqqerOrderBasketToOrder(
         QUI\ERP\Order\AbstractOrder $Order,
         QUI\ERP\Products\Product\ProductList $Products
     ) {
-        $coupons = $Order->getDataEntry('quiqqer-coupons');
+        $coupons        = $Order->getDataEntry('quiqqer-coupons');
+        $sessionCoupons = QUI::getSession()->get('quiqqer-coupons');
 
-        if (!$coupons) {
-            return;
+        if (!\is_array($coupons)) {
+            $coupons = [];
         }
 
-        if (!\is_array($coupons)) {
-            return;
+        if (\is_string($sessionCoupons)) {
+            $sessionCoupons = \json_decode($sessionCoupons, true);
+
+            if (\is_array($sessionCoupons)) {
+                $coupons = \array_merge($coupons, $sessionCoupons);
+            }
+
+            $coupons = \array_unique($coupons);
+
+            self::addSessionCouponsToOrder($Order, $sessionCoupons);
         }
 
         if (empty($coupons)) {
@@ -222,4 +321,60 @@ public static function onQuiqqerOrderSuccessful($Order)
             }
         }
     }
+
+    /**
+     * @param $Order
+     * @param $coupons
+     */
+    protected static function addSessionCouponsToOrder($Order, $coupons)
+    {
+        if (!\is_array($coupons)) {
+            return;
+        }
+
+        // coupons as article if not added
+        $Articles     = $Order->getArticles();
+        $isInArticles = function ($code) use ($Articles) {
+            foreach ($Articles as $Article) {
+                $customData = $Article->getCustomData();
+
+                if (isset($customData['code']) && $customData['code'] === $code) {
+                    return true;
+                }
+            }
+
+            return false;
+        };
+
+        foreach ($coupons as $coupon) {
+            if ($isInArticles($coupon) === false) {
+                self::addCouponToOrder($Order, $coupon);
+            }
+        }
+    }
+
+    /**
+     * @param $Order
+     * @param $coupon
+     */
+    protected static function addCouponToOrder($Order, $coupon)
+    {
+        try {
+            $code = Handler::sanitizeCode($coupon);
+
+            $CouponCode = Handler::getCouponCodeByCode($code);
+            $CouponCode->checkRedemption(QUI::getUserBySession());
+
+            $coupons   = $Order->getDataEntry('quiqqer-coupons');
+            $coupons[] = $code;
+
+            $coupons = \array_unique($coupons);
+
+            $Order->setData('quiqqer-coupons', $coupons);
+            $Order->update();
+
+            $CouponCode->addToOrder($Order);
+        } catch (\Exception $Exception) {
+        }
+    }
 }