Index: /main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/interfaces.py
===================================================================
--- /main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/interfaces.py	(revision 12175)
+++ /main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/interfaces.py	(revision 12176)
@@ -20,7 +20,4 @@
 from zope import schema
 from zc.sourcefactory.basic import BasicSourceFactory
-from waeup.ikoba.interfaces import (
-    SimpleIkobaVocabulary,
-    ISessionConfiguration)
 from ikobacustom.skeleton.utils.lgas import LGAS
 
Index: /main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/permissions.py
===================================================================
--- /main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/permissions.py	(revision 12176)
+++ /main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/permissions.py	(revision 12176)
@@ -0,0 +1,30 @@
+## $Id$
+##
+## Copyright (C) 2012 Uli Fouquet & Henrik Bettermann
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##
+import grok
+from waeup.ikoba.permissions import CCOfficer
+
+
+class CCOfficer(CCOfficer):
+    """ Permissions of Computer Center members.
+
+    This is basically a copy of the the PortalManager. We exclude some
+    permissions by commenting them out.
+    """
+
+    grok.name('waeup.CCOfficer')
+    grok.title(u'CC Officer')
Index: /main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/products/__init__.py
===================================================================
--- /main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/products/__init__.py	(revision 12176)
+++ /main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/products/__init__.py	(revision 12176)
@@ -0,0 +1,8 @@
+"""This package contains everything regarding products.
+"""
+# Make this a package.
+from ikobacustom.skeleton.products.product import SkeletonProduct
+
+__all__ = [
+    'SkeletonProduct',
+    ]
Index: /main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/products/interfaces.py
===================================================================
--- /main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/products/interfaces.py	(revision 12176)
+++ /main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/products/interfaces.py	(revision 12176)
@@ -0,0 +1,30 @@
+## $Id: interfaces.py 12098 2014-11-30 21:00:30Z henrik $
+##
+## Copyright (C) 2014 Uli Fouquet & Henrik Bettermann
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##
+from zope.interface import Attribute, Interface
+from zope import schema
+from waeup.ikoba.interfaces import (
+    IIkobaObject,
+    ContextualDictSourceFactoryBase)
+from waeup.ikoba.interfaces import MessageFactory as _
+from waeup.ikoba.products.interfaces import IProduct
+
+
+class ISkeletonProduct(IProduct):
+    """A representation of a skeleton product.
+
+    """
Index: /main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/products/product.py
===================================================================
--- /main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/products/product.py	(revision 12176)
+++ /main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/products/product.py	(revision 12176)
@@ -0,0 +1,51 @@
+## $Id: product.py 12097 2014-11-30 20:49:22Z henrik $
+##
+## Copyright (C) 2014 Uli Fouquet & Henrik Bettermann
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##
+"""
+These are the products (e.g. licenses).
+"""
+import grok
+from zope.component import getUtility
+from zope.component.interfaces import IFactory, ComponentLookupError
+from zope.interface import implementedBy
+from waeup.ikoba.interfaces import MessageFactory as _
+from waeup.ikoba.utils.helpers import attrs_to_fields, get_current_principal
+from waeup.ikoba.products.product import Product
+from ikobacustom.skeleton.products.interfaces import ISkeletonProduct
+
+class SkeletonProduct(Product):
+    """This is a product.
+    """
+    grok.implements(ISkeletonProduct)
+    grok.provides(ISkeletonProduct)
+
+SkeletonProduct = attrs_to_fields(SkeletonProduct)
+
+
+class SkeletonProductFactory(grok.GlobalUtility):
+    """A factory for products.
+    """
+    grok.implements(IFactory)
+    grok.name(u'waeup.Product')
+    title = u"Create a new product.",
+    description = u"This factory instantiates new skeleton products."
+
+    def __call__(self, *args, **kw):
+        return SkeletonProduct(*args, **kw)
+
+    def getInterfaces(self):
+        return implementedBy(SkeletonProduct)
Index: /main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/products/tests/__init__.py
===================================================================
--- /main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/products/tests/__init__.py	(revision 12176)
+++ /main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/products/tests/__init__.py	(revision 12176)
@@ -0,0 +1,1 @@
+# Make this a package.
Index: /main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/products/tests/test_product.py
===================================================================
--- /main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/products/tests/test_product.py	(revision 12176)
+++ /main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/products/tests/test_product.py	(revision 12176)
@@ -0,0 +1,53 @@
+## $Id: test_product.py 12070 2014-11-27 08:19:24Z henrik $
+##
+## Copyright (C) 2014 Uli Fouquet & Henrik Bettermann
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##
+"""
+Tests for skeleton products.
+"""
+from zope.interface.verify import verifyClass, verifyObject
+from zope.component import createObject
+from waeup.ikoba.products.interfaces import IProductsContainer
+from waeup.ikoba.products.container import ProductsContainer
+
+from ikobacustom.skeleton.testing import (FunctionalLayer, FunctionalTestCase)
+from ikobacustom.skeleton.products.product import SkeletonProduct
+from ikobacustom.skeleton.products.interfaces import ISkeletonProduct
+
+class SkeletonProductTestCase(FunctionalTestCase):
+
+    layer = FunctionalLayer
+
+    def test_interfaces(self):
+        # Make sure the correct interfaces are implemented.
+        self.assertTrue(
+            verifyClass(
+                ISkeletonProduct, SkeletonProduct)
+            )
+        self.assertTrue(
+            verifyObject(
+                ISkeletonProduct, SkeletonProduct())
+            )
+        return
+
+    def test_addSkeletonProduct(self):
+        container = ProductsContainer()
+        product = createObject(u'waeup.Product')
+        container.addProduct(product)
+        self.assertRaises(TypeError, container.addProduct, object())
+        self.assertEqual(product.product_id, 'NA')
+        self.assertEqual(container['NA'], product)
+        return
