Index: main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/customers/__init__.py
===================================================================
--- main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/customers/__init__.py	(revision 12272)
+++ main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/customers/__init__.py	(revision 12272)
@@ -0,0 +1,3 @@
+"""This package contains everything regarding customers.
+"""
+# Make this a package.
Index: main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/customers/customer.py
===================================================================
--- main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/customers/customer.py	(revision 12272)
+++ main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/customers/customer.py	(revision 12272)
@@ -0,0 +1,53 @@
+## $Id$
+##
+## 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
+##
+"""
+Container for the various objects owned by customers.
+"""
+import grok
+from zope.component.interfaces import IFactory
+from zope.interface import implementedBy
+from waeup.ikoba.utils.helpers import attrs_to_fields
+from waeup.ikoba.customers.customer import Customer
+from waeup.ikoba.customers.interfaces import ICustomerNavigation
+from ikobacustom.skeleton.customers.interfaces import ISkeletonCustomer
+from ikobacustom.skeleton.interfaces import MessageFactory as _
+
+
+class SkeletonCustomer(Customer):
+    """This is a customer container for the various objects
+    owned by customers.
+    """
+    grok.implements(ISkeletonCustomer, ICustomerNavigation)
+    grok.provides(ISkeletonCustomer)
+
+SkeletonCustomer = attrs_to_fields(SkeletonCustomer)
+
+
+class SkeletonCustomerFactory(grok.GlobalUtility):
+    """A factory for customers.
+    """
+    grok.implements(IFactory)
+    grok.name(u'waeup.Customer')
+    title = u"Create a new skeleton customer.",
+    description = u"This factory instantiates new skeleton customer instances."
+
+    def __call__(self, *args, **kw):
+        return SkeletonCustomer()
+
+    def getInterfaces(self):
+        return implementedBy(SkeletonCustomer)
Index: main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/customers/interfaces.py
===================================================================
--- main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/customers/interfaces.py	(revision 12272)
+++ main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/customers/interfaces.py	(revision 12272)
@@ -0,0 +1,50 @@
+## $Id$
+##
+## 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 import schema
+from waeup.ikoba.customers.interfaces import (
+    ICustomer, ICustomerDocument, IContract)
+from waeup.ikoba.customers.vocabularies import CustomerDocumentSource
+from ikobacustom.skeleton.interfaces import MessageFactory as _
+
+
+class ISkeletonCustomer(ICustomer):
+    """Representation of a customer.
+
+    """
+
+# Customer document interfaces
+
+
+class ISkeletonCustomerDocument(ICustomerDocument):
+    """A customer document.
+
+    """
+
+# Customer contract interfaces
+
+class ISkeletonContract(IContract):
+    """A customer contract sample with document attached.
+
+    """
+
+    document_object = schema.Choice(
+        title = _(u'Document'),
+        source = CustomerDocumentSource(),
+        required = False,
+        )
Index: main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/customers/tests/__init__.py
===================================================================
--- main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/customers/tests/__init__.py	(revision 12272)
+++ main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/customers/tests/__init__.py	(revision 12272)
@@ -0,0 +1,1 @@
+# Make this a package.
Index: main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/customers/tests/test_customer.py
===================================================================
--- main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/customers/tests/test_customer.py	(revision 12272)
+++ main/ikobacustom.skeleton/trunk/src/ikobacustom/skeleton/customers/tests/test_customer.py	(revision 12272)
@@ -0,0 +1,70 @@
+## $Id$
+##
+## 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 customers.
+"""
+import tempfile
+import shutil
+from zope.interface.verify import verifyClass, verifyObject
+from zope.component import createObject
+from zope.component.hooks import setSite
+from zope.interface import verify
+from waeup.ikoba.app import Company
+from waeup.ikoba.customers.interfaces import (
+    ICustomersContainer, ICustomerNavigation)
+from waeup.ikoba.customers.container import CustomersContainer
+
+from ikobacustom.skeleton.testing import (FunctionalLayer, FunctionalTestCase)
+from ikobacustom.skeleton.customers.customer import SkeletonCustomer
+from ikobacustom.skeleton.customers.interfaces import ISkeletonCustomer
+
+class SkeletonCustomerTestCase(FunctionalTestCase):
+
+    layer = FunctionalLayer
+
+    def setUp(self):
+        super(SkeletonCustomerTestCase, self).setUp()
+
+        # Prepopulate ZODB
+        app = Company()
+        self.dc_root = tempfile.mkdtemp()
+        app['datacenter'].setStoragePath(self.dc_root)
+
+        # Prepopulate the ZODB...
+        self.getRootFolder()['app'] = app
+        self.app = self.getRootFolder()['app']
+        setSite(self.app)
+
+    def test_interfaces(self):
+        verify.verifyClass(ISkeletonCustomer, SkeletonCustomer)
+        verify.verifyClass(ICustomerNavigation, SkeletonCustomer)
+        verify.verifyObject(ISkeletonCustomer, SkeletonCustomer())
+        verify.verifyObject(ICustomerNavigation, SkeletonCustomer())
+        return
+
+    def test_addSkeletonCustomer(self):
+        customer = createObject(u'waeup.Customer')
+        self.app['customers'].addCustomer(customer)
+        self.assertEqual(customer.customer_id, 'K1000000')
+        self.assertEqual(self.app['customers']['K1000000'], customer)
+        return
+
+    def tearDown(self):
+        shutil.rmtree(self.dc_root)
+        super(SkeletonCustomerTestCase, self).tearDown()
+        return
