diff --git a/src/main/java/info/magnolia/module/shop/accessors/DefaultCustomDataAccesor.java b/src/main/java/info/magnolia/module/shop/accessors/DefaultCustomDataAccesor.java
index fc4804a..0cf8650 100644
--- a/src/main/java/info/magnolia/module/shop/accessors/DefaultCustomDataAccesor.java
+++ b/src/main/java/info/magnolia/module/shop/accessors/DefaultCustomDataAccesor.java
@@ -1,5 +1,5 @@
 /**
- * This file Copyright (c) 2010-2011 Magnolia International
+ * This file Copyright (c) 2010-2013 Magnolia International
  * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
  *
  *
@@ -35,7 +35,7 @@ package info.magnolia.module.shop.accessors;
 
 import info.magnolia.cms.core.Content;
 import info.magnolia.cms.util.QueryUtil;
-import info.magnolia.jcr.wrapper.I18nNodeWrapper;
+import info.magnolia.module.shop.util.ShopUtil;
 
 import java.util.Collection;
 
@@ -52,8 +52,8 @@ import org.slf4j.LoggerFactory;
  */
 public abstract class DefaultCustomDataAccesor implements CustomDataAccesor {
 
-    private Node node;
-    private String name;
+    private final Node node;
+    private final String name;
 
     protected static Logger log = LoggerFactory.getLogger(DefaultCustomDataAccesor.class);
 
@@ -67,15 +67,18 @@ public abstract class DefaultCustomDataAccesor implements CustomDataAccesor {
         Collection<Content> nodeCollection = QueryUtil.query("data", xpath, "xpath", nodeType);
 
         if(!nodeCollection.isEmpty()) {
-            return new I18nNodeWrapper(nodeCollection.iterator().next().getJCRNode());
+            Node node = nodeCollection.iterator().next().getJCRNode();
+            return ShopUtil.wrapWithI18n(node);
         }
         throw new Exception(name + "of type=" + nodeType + "not found in path=" + rootPath);
     }
 
+    @Override
     public Node getNode() {
         return node;
     }
 
+    @Override
     public String getName() {
         return name;
     }
diff --git a/src/main/java/info/magnolia/module/shop/beans/ShoppingCartItem.java b/src/main/java/info/magnolia/module/shop/beans/ShoppingCartItem.java
index a8d06b4..1e77267 100644
--- a/src/main/java/info/magnolia/module/shop/beans/ShoppingCartItem.java
+++ b/src/main/java/info/magnolia/module/shop/beans/ShoppingCartItem.java
@@ -1,5 +1,5 @@
 /**
- * This file Copyright (c) 2010-2011 Magnolia International
+ * This file Copyright (c) 2010-2013 Magnolia International
  * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
  *
  *
@@ -35,7 +35,7 @@ package info.magnolia.module.shop.beans;
 
 import info.magnolia.jcr.util.NodeUtil;
 import info.magnolia.jcr.util.PropertyUtil;
-import info.magnolia.jcr.wrapper.I18nNodeWrapper;
+import info.magnolia.module.shop.util.ShopUtil;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
@@ -113,7 +113,7 @@ public class ShoppingCartItem extends OCMBean implements Serializable {
         this.setCart(cart);
         Node product = null;
         try {
-            product = new I18nNodeWrapper(NodeUtil.getNodeByIdentifier("data", productUUID));
+            product = ShopUtil.wrapWithI18n(NodeUtil.getNodeByIdentifier("data", productUUID));
         } catch (RepositoryException e) {
             log.error("Can't find product with uuid" + productUUID);
         }
@@ -247,7 +247,7 @@ public class ShoppingCartItem extends OCMBean implements Serializable {
         if (total != null) {
             return total.doubleValue();
         } else {
-            return (double) 0;
+            return 0;
         }
     }
 
@@ -285,7 +285,7 @@ public class ShoppingCartItem extends OCMBean implements Serializable {
         if (tax != null) {
             return tax.doubleValue();
         } else {
-            return (double) 0;
+            return 0;
         }
     }
 
@@ -385,7 +385,7 @@ public class ShoppingCartItem extends OCMBean implements Serializable {
                 Iterator<String> keys = options.keySet().iterator();
                 String currKey;
                 while (keys.hasNext()) {
-                    currKey = (String) keys.next();
+                    currKey = keys.next();
                     if (!this.options.containsKey(currKey) || !options.get(currKey).equals(this.options.get(currKey))) {
                         return false;
                     }
diff --git a/src/main/java/info/magnolia/module/shop/paragraphs/ProductTeaserModel.java b/src/main/java/info/magnolia/module/shop/paragraphs/ProductTeaserModel.java
index cd11073..e23706d 100644
--- a/src/main/java/info/magnolia/module/shop/paragraphs/ProductTeaserModel.java
+++ b/src/main/java/info/magnolia/module/shop/paragraphs/ProductTeaserModel.java
@@ -1,5 +1,5 @@
 /**
- * This file Copyright (c) 2010-2011 Magnolia International
+ * This file Copyright (c) 2010-2013 Magnolia International
  * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
  *
  *
@@ -36,7 +36,6 @@ package info.magnolia.module.shop.paragraphs;
 import info.magnolia.jcr.util.ContentMap;
 import info.magnolia.jcr.util.NodeUtil;
 import info.magnolia.jcr.util.PropertyUtil;
-import info.magnolia.jcr.wrapper.I18nNodeWrapper;
 import info.magnolia.module.shop.util.ShopLinkUtil;
 import info.magnolia.module.shop.util.ShopUtil;
 import info.magnolia.module.templatingkit.functions.STKTemplatingFunctions;
@@ -77,7 +76,8 @@ public class ProductTeaserModel extends InternalTeaserModel<TemplateDefinition>
         Node shopRoot = ShopUtil.getContentByTemplateCategorySubCategory(siteRoot, "feature", "product-detail");
 
         if (shopRoot != null) {
-            return templatingFunctions.asContentMap(stkFunctions.wrap(shopRoot));
+            shopRoot = ShopUtil.wrapWithHTML(ShopUtil.wrapWithI18n(shopRoot), true);
+            return templatingFunctions.asContentMap(shopRoot);
         } else {
             return null;
 
@@ -91,7 +91,7 @@ public class ProductTeaserModel extends InternalTeaserModel<TemplateDefinition>
         if (StringUtils.isNotBlank(productUUID)) {
             try {
                 product = NodeUtil.getNodeByIdentifier("data", productUUID);
-                return new I18nNodeWrapper(product);
+                return ShopUtil.wrapWithI18n(product);
             } catch (RepositoryException e) {
                 log.error("Can't find Product with UUID "+productUUID);
             }
diff --git a/src/main/java/info/magnolia/module/shop/paragraphs/ShopParagraphModel.java b/src/main/java/info/magnolia/module/shop/paragraphs/ShopParagraphModel.java
index c143127..ef46773 100644
--- a/src/main/java/info/magnolia/module/shop/paragraphs/ShopParagraphModel.java
+++ b/src/main/java/info/magnolia/module/shop/paragraphs/ShopParagraphModel.java
@@ -1,5 +1,5 @@
 /**
- * This file Copyright (c) 2010-2011 Magnolia International
+ * This file Copyright (c) 2010-2013 Magnolia International
  * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
  *
  *
@@ -39,7 +39,6 @@ import info.magnolia.cms.util.SelectorUtil;
 import info.magnolia.context.MgnlContext;
 import info.magnolia.jcr.util.NodeUtil;
 import info.magnolia.jcr.util.PropertyUtil;
-import info.magnolia.jcr.wrapper.I18nNodeWrapper;
 import info.magnolia.module.dms.beans.Document;
 import info.magnolia.module.shop.ShopConfiguration;
 import info.magnolia.module.shop.accessors.ShopAccesor;
@@ -96,6 +95,7 @@ public class ShopParagraphModel extends AbstractItemListModel<TemplateDefinition
         return ShopUtil.getShoppingCart();
     }
 
+    @Override
     public Node getSiteRoot() {
         return siteRoot;
     }
@@ -182,7 +182,7 @@ public class ShopParagraphModel extends AbstractItemListModel<TemplateDefinition
 
     public Node getTaxByUUID(String uuid) {
         try {
-            return new I18nNodeWrapper(NodeUtil.getNodeByIdentifier("data", uuid));
+            return ShopUtil.wrapWithI18n(NodeUtil.getNodeByIdentifier("data", uuid));
         } catch (RepositoryException e) {
             log.error("Cant get tax category " + uuid, e);
         }
@@ -196,7 +196,7 @@ public class ShopParagraphModel extends AbstractItemListModel<TemplateDefinition
             for (NodeIterator iterator = pricesNode.getNodes(); iterator.hasNext();) {
                 Node priceNode = (Node) iterator.next();
                 if(!priceNode.isNodeType(MgnlNodeType.NT_METADATA)) {
-                    Node price = new I18nNodeWrapper(priceNode);
+                    Node price = ShopUtil.wrapWithI18n(priceNode);
                     if (price.hasProperty("priceCategoryUUID") && PropertyUtil.getString(price, "priceCategoryUUID").equals(
                             priceCategoryUUID)) {
                         Property productPrice = PropertyUtil.getPropertyOrNull(price, "price");
diff --git a/src/main/java/info/magnolia/module/shop/templates/ShopSingletonParagraphTemplateModel.java b/src/main/java/info/magnolia/module/shop/templates/ShopSingletonParagraphTemplateModel.java
index 1b22c67..44fe4f8 100644
--- a/src/main/java/info/magnolia/module/shop/templates/ShopSingletonParagraphTemplateModel.java
+++ b/src/main/java/info/magnolia/module/shop/templates/ShopSingletonParagraphTemplateModel.java
@@ -1,5 +1,5 @@
 /**
- * This file Copyright (c) 2010-2011 Magnolia International
+ * This file Copyright (c) 2010-2013 Magnolia International
  * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
  *
  *
@@ -38,7 +38,6 @@ import info.magnolia.context.Context;
 import info.magnolia.context.MgnlContext;
 import info.magnolia.jcr.util.NodeUtil;
 import info.magnolia.jcr.util.PropertyUtil;
-import info.magnolia.jcr.wrapper.I18nNodeWrapper;
 import info.magnolia.module.shop.beans.CartItemOption;
 import info.magnolia.module.shop.beans.DefaultShoppingCartImpl;
 import info.magnolia.module.shop.beans.ShoppingCart;
@@ -136,7 +135,7 @@ public class ShopSingletonParagraphTemplateModel extends STKPageModel<STKPage> {
         Node optionNode = null, optionSetNode;
         CartItemOption cio;
         while (keysIter.hasNext()) {
-            currKey = (String) keysIter.next();
+            currKey = keysIter.next();
             if (currKey.startsWith("option_")) {
                 optionUUID = MgnlContext.getParameter(currKey);
                 try {
@@ -146,7 +145,7 @@ public class ShopSingletonParagraphTemplateModel extends STKPageModel<STKPage> {
                 }
                 if (optionNode != null) {
                     try {
-                        optionNode = new I18nNodeWrapper(optionNode);
+                        optionNode = ShopUtil.wrapWithI18n(optionNode);
                         optionSetNode = optionNode.getParent();
                         cio = new CartItemOption();
                         cio.setOptionSetUUID(optionSetNode.getIdentifier());
@@ -195,7 +194,7 @@ public class ShopSingletonParagraphTemplateModel extends STKPageModel<STKPage> {
             indexOfProductInCart = ((DefaultShoppingCartImpl) shoppingCart).indexOfProduct(productUUID);
         }
         if (indexOfProductInCart >= 0 && indexOfProductInCart < shoppingCart.getCartItemsCount()) {
-            ShoppingCartItem shoppingCartItem = (ShoppingCartItem) shoppingCart.getCartItems().get(indexOfProductInCart);
+            ShoppingCartItem shoppingCartItem = shoppingCart.getCartItems().get(indexOfProductInCart);
             int quantity = shoppingCartItem.getQuantity();
 
             if (command.equals("add")) {
diff --git a/src/main/java/info/magnolia/module/shop/util/ShopUtil.java b/src/main/java/info/magnolia/module/shop/util/ShopUtil.java
index fe3c5a9..3502de2 100644
--- a/src/main/java/info/magnolia/module/shop/util/ShopUtil.java
+++ b/src/main/java/info/magnolia/module/shop/util/ShopUtil.java
@@ -1,5 +1,5 @@
 /**
- * This file Copyright (c) 2010-2011 Magnolia International
+ * This file Copyright (c) 2010-2013 Magnolia International
  * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
  *
  *
@@ -33,21 +33,17 @@
  */
 package info.magnolia.module.shop.util;
 
-import info.magnolia.cms.security.AccessDeniedException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Locale;
-
 import info.magnolia.cms.core.Content;
 import info.magnolia.cms.i18n.I18nContentSupportFactory;
 import info.magnolia.cms.i18n.Messages;
 import info.magnolia.cms.i18n.MessagesManager;
+import info.magnolia.cms.security.AccessDeniedException;
 import info.magnolia.cms.util.QueryUtil;
 import info.magnolia.context.Context;
 import info.magnolia.context.MgnlContext;
 import info.magnolia.jcr.util.NodeUtil;
 import info.magnolia.jcr.util.PropertyUtil;
+import info.magnolia.jcr.wrapper.HTMLEscapingNodeWrapper;
 import info.magnolia.jcr.wrapper.I18nNodeWrapper;
 import info.magnolia.module.shop.ShopConfiguration;
 import info.magnolia.module.shop.accessors.ShopAccesor;
@@ -56,9 +52,13 @@ import info.magnolia.module.shop.beans.ShoppingCart;
 import info.magnolia.module.templatingkit.templates.category.TemplateCategoryUtil;
 import info.magnolia.repository.RepositoryConstants;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Locale;
+
 import javax.jcr.Node;
 import javax.jcr.PathNotFoundException;
-
 import javax.jcr.RepositoryException;
 
 import org.apache.commons.lang.StringUtils;
@@ -71,7 +71,7 @@ import org.slf4j.LoggerFactory;
  * @author tmiyar
  *
  */
-public class ShopUtil {
+public final class ShopUtil {
 
     private static Logger log = LoggerFactory.getLogger(ShopUtil.class);
     public static String ATTRIBUTE_SHOPNAME = "shopName";
@@ -79,6 +79,9 @@ public class ShopUtil {
     public static String SHOP_TEMPLATE_NAME = "shopHome";
     public static String I18N_BASENAME = "info.magnolia.module.shop.messages";
 
+    private ShopUtil() {
+    }
+
     /**
      * Gets the shop current node.
      */
@@ -192,7 +195,7 @@ public class ShopUtil {
         Collection<Node> i18nProductList = new ArrayList<Node>();
         if (contentList != null) {
             for (Node content : contentList) {
-                i18nProductList.add(new I18nNodeWrapper(content));
+                i18nProductList.add(ShopUtil.wrapWithI18n(content));
             }
         }
         return i18nProductList;
@@ -284,4 +287,18 @@ public class ShopUtil {
 
         return null;
     }
+
+    public static Node wrapWithI18n(Node node) {
+        if (node == null) {
+            return null;
+        }
+        return NodeUtil.isWrappedWith(node, I18nNodeWrapper.class) ? node : new I18nNodeWrapper(node);
+    }
+
+    public static Node wrapWithHTML(Node node, boolean linebreaks) {
+        if (node == null) {
+            return null;
+        }
+        return NodeUtil.isWrappedWith(node, HTMLEscapingNodeWrapper.class) ? node : new HTMLEscapingNodeWrapper(node, linebreaks);
+    }
 }
diff --git a/src/test/java/info/magnolia/module/shop/beans/ShoppingCartItemTest.java b/src/test/java/info/magnolia/module/shop/beans/ShoppingCartItemTest.java
new file mode 100644
index 0000000..09bdf02
--- /dev/null
+++ b/src/test/java/info/magnolia/module/shop/beans/ShoppingCartItemTest.java
@@ -0,0 +1,92 @@
+/**
+ * This file Copyright (c) 2013 Magnolia International
+ * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
+ *
+ *
+ * This file is dual-licensed under both the Magnolia
+ * Network Agreement and the GNU General Public License.
+ * You may elect to use one or the other of these licenses.
+ *
+ * This file is distributed in the hope that it will be
+ * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
+ * Redistribution, except as permitted by whichever of the GPL
+ * or MNA you select, is prohibited.
+ *
+ * 1. For the GPL license (GPL), you can redistribute and/or
+ * modify this file under the terms of the GNU General
+ * Public License, Version 3, as published by the Free Software
+ * Foundation.  You should have received a copy of the GNU
+ * General Public License, Version 3 along with this program;
+ * if not, write to the Free Software Foundation, Inc., 51
+ * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * 2. For the Magnolia Network Agreement (MNA), this file
+ * and the accompanying materials are made available under the
+ * terms of the MNA which accompanies this distribution, and
+ * is available at http://www.magnolia-cms.com/mna.html
+ *
+ * Any modifications to this file must keep this entire header
+ * intact.
+ *
+ */
+package info.magnolia.module.shop.beans;
+
+import static org.mockito.Matchers.*;
+import static org.mockito.Mockito.*;
+
+import info.magnolia.cms.i18n.DefaultI18nContentSupport;
+import info.magnolia.cms.i18n.I18nContentSupport;
+import info.magnolia.context.MgnlContext;
+import info.magnolia.test.ComponentsTestUtil;
+import info.magnolia.test.RepositoryTestCase;
+import info.magnolia.test.mock.MockWebContext;
+import info.magnolia.test.mock.jcr.MockSession;
+
+import javax.jcr.Node;
+import javax.jcr.Session;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests for ShoppingCartItem.
+ */
+public class ShoppingCartItemTest extends RepositoryTestCase {
+
+    private Node product = mock(Node.class);
+    DefaultI18nContentSupport i18n = mock(DefaultI18nContentSupport.class);
+
+    @Override
+    @Before
+    public void setUp() throws Exception {
+        super.setUp();
+        ComponentsTestUtil.setInstance(I18nContentSupport.class, i18n);
+
+        MockWebContext ctx = new MockWebContext();
+        Session session = new MockSession("data");
+        ctx.addSession("data", session);
+        product = session.getRootNode().addNode("product");
+        product.setProperty("name", "name");
+
+        MgnlContext.setInstance(ctx);
+    }
+
+    @Test
+    public void getProductTest() throws Exception {
+        //GIVEN
+        product.setProperty("title", "someTitle");
+        product.setProperty("productDescription1", "someDescription");
+        product.setProperty("productDescription2", "someDescription2");
+        ShoppingCartItem item = new ShoppingCartItem(null, product.getIdentifier(), 0, 0);
+
+        //WHEN
+        item.getProductTitle();
+        item.getProductDescription();
+        item.getProductSubTitle();
+
+        //THEN
+        verify(i18n, times(6)).hasProperty((Node)anyObject(), anyString());
+    }
+}
diff --git a/src/test/java/info/magnolia/module/shop/paragraphs/ProductTeaserModelTest.java b/src/test/java/info/magnolia/module/shop/paragraphs/ProductTeaserModelTest.java
new file mode 100644
index 0000000..ede3b06
--- /dev/null
+++ b/src/test/java/info/magnolia/module/shop/paragraphs/ProductTeaserModelTest.java
@@ -0,0 +1,112 @@
+/**
+ * This file Copyright (c) 2013 Magnolia International
+ * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
+ *
+ *
+ * This file is dual-licensed under both the Magnolia
+ * Network Agreement and the GNU General Public License.
+ * You may elect to use one or the other of these licenses.
+ *
+ * This file is distributed in the hope that it will be
+ * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
+ * Redistribution, except as permitted by whichever of the GPL
+ * or MNA you select, is prohibited.
+ *
+ * 1. For the GPL license (GPL), you can redistribute and/or
+ * modify this file under the terms of the GNU General
+ * Public License, Version 3, as published by the Free Software
+ * Foundation.  You should have received a copy of the GNU
+ * General Public License, Version 3 along with this program;
+ * if not, write to the Free Software Foundation, Inc., 51
+ * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * 2. For the Magnolia Network Agreement (MNA), this file
+ * and the accompanying materials are made available under the
+ * terms of the MNA which accompanies this distribution, and
+ * is available at http://www.magnolia-cms.com/mna.html
+ *
+ * Any modifications to this file must keep this entire header
+ * intact.
+ *
+ */
+package info.magnolia.module.shop.paragraphs;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Mockito.*;
+
+import info.magnolia.cms.i18n.DefaultI18nContentSupport;
+import info.magnolia.cms.i18n.I18nContentSupport;
+import info.magnolia.content2bean.Content2BeanException;
+import info.magnolia.context.MgnlContext;
+import info.magnolia.jcr.util.NodeUtil;
+import info.magnolia.jcr.wrapper.I18nNodeWrapper;
+import info.magnolia.module.templatingkit.functions.STKTemplatingFunctions;
+import info.magnolia.module.templatingkit.templates.pages.STKPage;
+import info.magnolia.registry.RegistrationException;
+import info.magnolia.rendering.template.registry.TemplateDefinitionRegistry;
+import info.magnolia.test.ComponentsTestUtil;
+import info.magnolia.test.mock.MockWebContext;
+import info.magnolia.test.mock.jcr.MockNode;
+import info.magnolia.test.mock.jcr.MockSession;
+import info.magnolia.test.mock.jcr.NodeTestUtil;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests for ProductTeaserModel.
+ */
+public class ProductTeaserModelTest {
+
+    private MockNode product;
+    private final String propertiesStr = "product.properties";
+    private MockSession session;
+    private final STKTemplatingFunctions stkFunctions = mock(STKTemplatingFunctions.class);
+
+    @Before
+    public void setUp() throws RepositoryException, Content2BeanException, IOException, RegistrationException {
+
+        MockWebContext ctx = new MockWebContext();
+        TemplateDefinitionRegistry registry = mock(TemplateDefinitionRegistry.class);
+        Collection definitions = new ArrayList();
+        STKPage page = new STKPage();
+        page.setCategory("feature");
+        page.setSubcategory("product-detail");
+        definitions.add(page);
+
+        ComponentsTestUtil.setInstance(MockWebContext.class, ctx);
+        ComponentsTestUtil.setInstance(I18nContentSupport.class, new DefaultI18nContentSupport());
+        ComponentsTestUtil.setInstance(TemplateDefinitionRegistry.class, registry);
+        MgnlContext.setInstance(ctx);
+        session = new MockSession("data");
+        ctx.addSession("data", session);
+        product = (MockNode) session.getRootNode();
+
+        NodeTestUtil.createSubnodes(product, getClass().getResourceAsStream(propertiesStr));
+
+        when(stkFunctions.siteRoot((Node)anyObject())).thenReturn(product);
+        when(registry.getTemplateDefinitions()).thenReturn(definitions);
+
+    }
+    @Test
+    public void getProductTest() throws RepositoryException {
+        //GIVEN
+        Node productNode = NodeUtil.getNodeByIdentifier("data", "productid");
+        productNode.setProperty("productUUID", product.getIdentifier());
+        ProductTeaserModel model = new ProductTeaserModel(productNode, null, null, stkFunctions, null, null);
+        //WHEN
+        Node product = model.getProduct();
+        //THEN
+        assertTrue(NodeUtil.isWrappedWith(product, I18nNodeWrapper.class));
+    }
+}
diff --git a/src/test/java/info/magnolia/module/shop/templates/ShopSingletonParagraphTemplateModelTest.java b/src/test/java/info/magnolia/module/shop/templates/ShopSingletonParagraphTemplateModelTest.java
new file mode 100644
index 0000000..b491dec
--- /dev/null
+++ b/src/test/java/info/magnolia/module/shop/templates/ShopSingletonParagraphTemplateModelTest.java
@@ -0,0 +1,90 @@
+/**
+ * This file Copyright (c) 2013 Magnolia International
+ * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
+ *
+ *
+ * This file is dual-licensed under both the Magnolia
+ * Network Agreement and the GNU General Public License.
+ * You may elect to use one or the other of these licenses.
+ *
+ * This file is distributed in the hope that it will be
+ * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
+ * Redistribution, except as permitted by whichever of the GPL
+ * or MNA you select, is prohibited.
+ *
+ * 1. For the GPL license (GPL), you can redistribute and/or
+ * modify this file under the terms of the GNU General
+ * Public License, Version 3, as published by the Free Software
+ * Foundation.  You should have received a copy of the GNU
+ * General Public License, Version 3 along with this program;
+ * if not, write to the Free Software Foundation, Inc., 51
+ * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * 2. For the Magnolia Network Agreement (MNA), this file
+ * and the accompanying materials are made available under the
+ * terms of the MNA which accompanies this distribution, and
+ * is available at http://www.magnolia-cms.com/mna.html
+ *
+ * Any modifications to this file must keep this entire header
+ * intact.
+ *
+ */
+package info.magnolia.module.shop.templates;
+
+import static org.mockito.Matchers.*;
+import static org.mockito.Mockito.*;
+
+import info.magnolia.cms.i18n.DefaultI18nContentSupport;
+import info.magnolia.cms.i18n.I18nContentSupport;
+import info.magnolia.context.MgnlContext;
+import info.magnolia.test.ComponentsTestUtil;
+import info.magnolia.test.RepositoryTestCase;
+import info.magnolia.test.mock.MockWebContext;
+import info.magnolia.test.mock.jcr.MockSession;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests for ShopSingletonParagraphTemplateModel.
+ */
+public class ShopSingletonParagraphTemplateModelTest extends RepositoryTestCase {
+
+    private final DefaultI18nContentSupport i18n = mock(DefaultI18nContentSupport.class);
+
+    @Override
+    @Before
+    public void setUp() throws Exception {
+        super.setUp();
+        ComponentsTestUtil.setInstance(I18nContentSupport.class, i18n);
+
+        MockWebContext ctx = new MockWebContext();
+        Session session = new MockSession("data");
+        ctx.addSession("data", session);
+        Node product = session.getRootNode().addNode("product");
+
+        Map<String, String> parameters = new HashMap<String, String>();
+        parameters.put("option_", product.getIdentifier());
+        ctx.setParameters(parameters);
+        MgnlContext.setInstance(ctx);
+    }
+
+    @Test
+    public void addToCartTest() throws RepositoryException {
+        //GIVEN
+        ShopSingletonParagraphTemplateModel model = new ShopSingletonParagraphTemplateModel(null, null, null, null, null);
+        //WHEN
+        model.addToCart();
+        //THEN
+        verify(i18n, times(2)).hasProperty((Node)anyObject(), eq("title"));
+    }
+}
diff --git a/src/test/java/info/magnolia/module/shop/util/ShopUtilTest.java b/src/test/java/info/magnolia/module/shop/util/ShopUtilTest.java
new file mode 100644
index 0000000..c3ee898
--- /dev/null
+++ b/src/test/java/info/magnolia/module/shop/util/ShopUtilTest.java
@@ -0,0 +1,130 @@
+/**
+ * This file Copyright (c) 2013 Magnolia International
+ * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
+ *
+ *
+ * This file is dual-licensed under both the Magnolia
+ * Network Agreement and the GNU General Public License.
+ * You may elect to use one or the other of these licenses.
+ *
+ * This file is distributed in the hope that it will be
+ * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
+ * Redistribution, except as permitted by whichever of the GPL
+ * or MNA you select, is prohibited.
+ *
+ * 1. For the GPL license (GPL), you can redistribute and/or
+ * modify this file under the terms of the GNU General
+ * Public License, Version 3, as published by the Free Software
+ * Foundation.  You should have received a copy of the GNU
+ * General Public License, Version 3 along with this program;
+ * if not, write to the Free Software Foundation, Inc., 51
+ * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * 2. For the Magnolia Network Agreement (MNA), this file
+ * and the accompanying materials are made available under the
+ * terms of the MNA which accompanies this distribution, and
+ * is available at http://www.magnolia-cms.com/mna.html
+ *
+ * Any modifications to this file must keep this entire header
+ * intact.
+ *
+ */
+package info.magnolia.module.shop.util;
+
+import static org.junit.Assert.*;
+
+import info.magnolia.cms.i18n.DefaultI18nContentSupport;
+import info.magnolia.cms.i18n.I18nContentSupport;
+import info.magnolia.jcr.util.NodeUtil;
+import info.magnolia.jcr.wrapper.HTMLEscapingNodeWrapper;
+import info.magnolia.jcr.wrapper.I18nNodeWrapper;
+import info.magnolia.test.ComponentsTestUtil;
+import info.magnolia.test.RepositoryTestCase;
+import info.magnolia.test.mock.jcr.MockNode;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.jcr.Node;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests for ShopUtil.
+ */
+public class ShopUtilTest extends RepositoryTestCase {
+
+    @Override
+    @Before
+    public void setUp() throws Exception {
+        super.setUp();
+        ComponentsTestUtil.setInstance(I18nContentSupport.class, new DefaultI18nContentSupport());
+    }
+
+    @Test
+    public void wrapWithI18nTest() {
+        //GIVEN
+        Node node = null;
+        //WHEN
+        Node wrapped = ShopUtil.wrapWithI18n(node);
+        //THEN
+        assertNull(wrapped);
+
+        //GIVEN
+        node = new MockNode("notWrapped");
+        //WHEN
+        wrapped = ShopUtil.wrapWithI18n(node);
+        //THEN
+        assertTrue(wrapped instanceof I18nNodeWrapper);
+
+        //GIVEN
+        node = new HTMLEscapingNodeWrapper(new I18nNodeWrapper(new MockNode("alreadyWrapped")), false);
+        //WHEN
+        wrapped = ShopUtil.wrapWithI18n(node);
+        //THEN
+        assertTrue(wrapped instanceof HTMLEscapingNodeWrapper);
+        assertTrue(NodeUtil.isWrappedWith(wrapped, I18nNodeWrapper.class));
+    }
+
+    @Test
+    public void wrapWithHTMLTest() {
+        //GIVEN
+        Node node = null;
+        //WHEN
+        Node wrapped = ShopUtil.wrapWithHTML(node, false);
+        //THEN
+        assertNull(wrapped);
+
+        //GIVEN
+        node = new I18nNodeWrapper(new MockNode("notWrapped"));
+        //WHEN
+        wrapped = ShopUtil.wrapWithHTML(node, true);
+        //THEN
+        assertTrue(wrapped instanceof HTMLEscapingNodeWrapper);
+
+        //GIVEN
+        node = new HTMLEscapingNodeWrapper(new I18nNodeWrapper(new MockNode("alreadyWrapped")), false);
+        //WHEN
+        wrapped = ShopUtil.wrapWithHTML(node, false);
+        //THEN
+        assertTrue(wrapped instanceof HTMLEscapingNodeWrapper);
+        assertTrue(NodeUtil.isWrappedWith(wrapped, I18nNodeWrapper.class));
+    }
+
+    @Test
+    public void transformIntoI18nContentList() {
+        //GIVEN
+        Node inputNode = new MockNode("notWrapped");
+        Collection<Node> contentList = new ArrayList<Node>();
+        contentList.add(inputNode);
+        //WHEN
+        Collection<Node> collection = ShopUtil.transformIntoI18nContentList(contentList);
+        //THEN
+        for (Node node: collection) {
+            assertTrue(node instanceof I18nNodeWrapper);
+        }
+    }
+}
