Index: /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/applications.py
===================================================================
--- /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/applications.py	(revision 12091)
+++ /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/applications.py	(revision 12092)
@@ -62,4 +62,6 @@
     grok.provides(IApplication)
     grok.baseclass()
+
+    application_category = None
 
     def __init__(self):
@@ -139,4 +141,6 @@
     """
 
+    application_category = 'sample'
+
 SampleApplication = attrs_to_fields(SampleApplication)
 
Index: /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/interfaces.py
===================================================================
--- /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/interfaces.py	(revision 12091)
+++ /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/interfaces.py	(revision 12092)
@@ -29,5 +29,5 @@
 
 from waeup.ikoba.customers.vocabularies import (
-    contextual_reg_num_source, GenderSource, nats_vocab)
+    contextual_reg_num_source, GenderSource, nats_vocab, AppCatProductSource)
 
 
@@ -270,5 +270,7 @@
         'Returns a translated, more verbose appliction state')
     class_name = Attribute('Name of the application class')
-    formatted_transition_date = Attribute('Last transition formatted date string')
+    formatted_transition_date = Attribute(
+        'Last transition formatted date string')
+    application_category = Attribute('Category for the grouping of products')
 
     title = schema.TextLine(
@@ -282,2 +284,8 @@
         readonly = False,
         )
+
+    product = schema.Choice(
+        title = _(u'Product'),
+        source = AppCatProductSource(),
+        required = False,
+        )
Index: /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/vocabularies.py
===================================================================
--- /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/vocabularies.py	(revision 12091)
+++ /main/waeup.ikoba/trunk/src/waeup/ikoba/customers/vocabularies.py	(revision 12092)
@@ -1,3 +1,3 @@
-## $Id: vocabularies.py 9778 2012-12-06 15:45:03Z henrik $
+## $Id$
 ##
 ## Copyright (C) 2014 Uli Fouquet & Henrik Bettermann
@@ -18,4 +18,5 @@
 """Vocabularies and sources for the customer section.
 """
+import grok
 from zope.component import getUtility, queryUtility
 from zope.catalog.interfaces import ICatalog
@@ -29,4 +30,5 @@
 from waeup.ikoba.utils.helpers import get_sorted_preferred
 from waeup.ikoba.utils.countries import COUNTRIES
+from waeup.ikoba.sourcefactory import SmartBasicContextualSourceFactory
 
 
@@ -116,2 +118,28 @@
 
 directlyProvides(contextual_reg_num_source, IContextSourceBinder)
+
+
+class AppCatProductSource(SmartBasicContextualSourceFactory):
+    """An application category product delivers all products
+    which belong to a certain application_category.
+    """
+    def contains(self, context, value):
+        appcat = getattr(context, 'application_category', None)
+        if value.application_category == appcat:
+            return True
+        return False
+
+    def getValues(self, context):
+        appcat = getattr(context, 'application_category', None)
+        products = grok.getSite()['products'].values()
+        if not appcat:
+            return products   # ?????????????????
+        resultlist = [
+            value for value in products if value.application_category == appcat]
+        return resultlist
+
+    def getToken(self, context, value):
+        return value.product_id
+
+    def getTitle(self, context, value):
+        return "%s - %s" % (value.product_id, value.title)
Index: /main/waeup.ikoba/trunk/src/waeup/ikoba/utils/utils.py
===================================================================
--- /main/waeup.ikoba/trunk/src/waeup/ikoba/utils/utils.py	(revision 12091)
+++ /main/waeup.ikoba/trunk/src/waeup/ikoba/utils/utils.py	(revision 12092)
@@ -103,4 +103,5 @@
 
     APP_CATS_DICT = {
+        'sample': 'Sample Category',
         'license': 'License',
         'no': 'no application',
