Index: main/waeup.ikoba/trunk/src/waeup/ikoba/customers/interfaces.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/customers/interfaces.py	(revision 12580)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/customers/interfaces.py	(revision 12585)
@@ -32,5 +32,6 @@
     contextual_reg_num_source, contextual_email_source,
     GenderSource, nats_vocab,
-    ConCatProductSource, CustomerDocumentSource,
+    ConCatProductSource, ConCatActiveProductSource,
+    CustomerDocumentSource,
     ProductOptionSourceFactory)
 
@@ -332,5 +333,5 @@
     product_object = schema.Choice(
         title = _(u'Product'),
-        source = ConCatProductSource(),
+        source = ConCatActiveProductSource(),
         required = True,
         )
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/test_browser.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/test_browser.py	(revision 12580)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/test_browser.py	(revision 12585)
@@ -113,5 +113,5 @@
         self.product.title = u'Our Sample Product'
         self.product.contract_category = self._contract_category
-        self.product.valid_from = date(2015, 12, 4)
+        self.product.valid_from = date(2014, 12, 4)
         self.product.tc_dict = {'en': u'Hello world'}
         prodoption = ProductOption()
@@ -1265,8 +1265,6 @@
         self.assertEqual(
             self.browser.url, self.contracts_path + '/%s/selectproduct' % conid)
-        # SAM is in the correct contract_category ...
+        # SAM is in the correct contract_category
         self.assertTrue('<option value="SAM">' in self.browser.contents)
-        # ... but NOTSAM not.
-        self.assertFalse('<option value="LIC">' in self.browser.contents)
         # So far last_product_id is None.
         self.assertTrue(self.customer['contracts'][conid].last_product_id is None)
@@ -1331,4 +1329,5 @@
         product.title = u'Our License Product'
         product.contract_category = u'license'
+        product.valid_from = date(2014, 12, 4)
         self.app['products'].addProduct(product)
         # Customers can manage contracts under certain conditions
@@ -1357,5 +1356,5 @@
         # SAM is in the correct contract_category ...
         self.assertTrue('<option value="SAM">' in self.browser.contents)
-        # ... but NOTSAM not.
+        # ... but LIC not.
         self.assertFalse('<option value="LIC">' in self.browser.contents)
         # So far last_product_id is None.
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/test_interfaces.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/test_interfaces.py	(revision 12580)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/test_interfaces.py	(revision 12585)
@@ -23,4 +23,5 @@
 import tempfile
 import shutil
+from datetime import date
 from zope.component.hooks import setSite
 from zope.component import queryUtility, createObject
@@ -29,5 +30,5 @@
 from waeup.ikoba.interfaces import SUBMITTED
 from waeup.ikoba.customers.vocabularies import (
-    ConCatProductSource, CustomerDocumentSource)
+    ConCatProductSource, ConCatActiveProductSource, CustomerDocumentSource)
 from waeup.ikoba.testing import FunctionalLayer, FunctionalTestCase
 
@@ -96,4 +97,27 @@
         self.assertEqual(result, u'SAM - Our Sample Product')
 
+    def test_getValues_ConCatActiveProductSource(self):
+        source = ConCatActiveProductSource()
+        self.product.valid_from = date(2030, 12, 4)
+        self.product.valid_to = None
+        self.product.contract_category = u'sample'
+        result = source.factory.getValues(self.contract)
+        self.assertFalse(self.product in result)
+        self.product.valid_from = None
+        self.product.valid_to = date(2030, 12, 4)
+        self.product.contract_category = u'sample'
+        result = source.factory.getValues(self.contract)
+        self.assertTrue(self.product in result)
+        self.product.valid_from = None
+        self.product.valid_to = date(2010, 12, 4)
+        self.product.contract_category = u'sample'
+        result = source.factory.getValues(self.contract)
+        self.assertFalse(self.product in result)
+        self.product.valid_from = date(2010, 12, 4)
+        self.product.valid_to = None
+        self.product.contract_category = u'sample'
+        result = source.factory.getValues(self.contract)
+        self.assertTrue(self.product in result)
+
     def test_getValues_CustomerDocumentSource(self):
         source = CustomerDocumentSource()
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/customers/vocabularies.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/customers/vocabularies.py	(revision 12580)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/customers/vocabularies.py	(revision 12585)
@@ -19,4 +19,5 @@
 """
 import grok
+from datetime import date
 from zope.component import getUtility, queryUtility
 from zope.catalog.interfaces import ICatalog
@@ -157,4 +158,24 @@
 
 
+class ConCatActiveProductSource(ConCatProductSource):
+    """A contract category product source delivers all products
+    which belong to a certain contract_category.
+    """
+
+    def getValues(self, context):
+        concat = getattr(context, 'contract_category', None)
+        products = grok.getSite()['products'].values()
+        if not concat:
+            return products
+        now = date.today()
+        resultlist = [
+            value for value in products
+            if value.contract_category == concat
+                and (not value.valid_from or value.valid_from <= now)
+                and (not value.valid_to or value.valid_to >= now)
+            ]
+        return resultlist
+
+
 class CustomerDocumentSource(BasicContextualSourceFactory):
     """A customer document source delivers all submitted and verified documents
