Index: main/waeup.ikoba/trunk/src/waeup/ikoba/customers/batching.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/customers/batching.py	(revision 12330)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/customers/batching.py	(revision 12333)
@@ -43,5 +43,5 @@
 from waeup.ikoba.customers.interfaces import (
     ICustomer, ICustomerUpdateByRegNo,
-    ICustomerSampleDocument, ISampleContract)
+    ICustomerSampleDocument, ISampleContractProcess)
 from waeup.ikoba.customers.workflow import  (
     IMPORTABLE_REGISTRATION_STATES, IMPORTABLE_REGISTRATION_TRANSITIONS)
@@ -561,4 +561,4 @@
 
     name = _('Customer Sample Contract Processor')
-    iface = ISampleContract
+    iface = ISampleContractProcess
     factory_name = 'waeup.SampleContract'
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser.py	(revision 12330)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/customers/browser.py	(revision 12333)
@@ -1166,5 +1166,5 @@
 
     form_fields = grok.AutoFields(IContract).omit(
-        'product_object', 'contract_id')
+        'product_object', 'contract_id', 'product_options')
 
     @property
@@ -1218,5 +1218,5 @@
 
 class ContractManageFormPage(IkobaEditFormPage):
-    """ Page to edit a contract
+    """ Page to manage a contract
     """
     grok.context(IContract)
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/customers/contracts.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/customers/contracts.py	(revision 12330)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/customers/contracts.py	(revision 12333)
@@ -31,6 +31,6 @@
 from waeup.ikoba.customers.interfaces import (
     IContractsContainer, ICustomerNavigation,
-    IContract, IContractEdit, ICustomersUtils,
-    ISampleContract, ISampleContractEdit)
+    IContract, IContractProcess, IContractEdit, ICustomersUtils,
+    ISampleContract, ISampleContractProcess, ISampleContractEdit)
 from waeup.ikoba.customers.utils import generate_contract_id
 from waeup.ikoba.utils.helpers import attrs_to_fields
@@ -61,6 +61,5 @@
     """This is a customer contract baseclass.
     """
-    grok.implements(IContract, IContractEdit, ICustomerNavigation)
-    grok.provides(IContract)
+
     grok.baseclass()
 
@@ -164,5 +163,9 @@
     """
 
-    grok.implements(ISampleContract, ISampleContractEdit, ICustomerNavigation)
+    grok.implements(
+        ISampleContractProcess, # must come before ISampleContract
+        ISampleContract,
+        ISampleContractEdit,
+        ICustomerNavigation)
 
     contract_category = 'sample'
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/customers/interfaces.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/customers/interfaces.py	(revision 12330)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/customers/interfaces.py	(revision 12333)
@@ -27,4 +27,5 @@
 from waeup.ikoba.browser.interfaces import ICustomerNavigationBase
 from waeup.ikoba.documents.interfaces import IDocumentsContainer, IDocument
+from waeup.ikoba.products.productoptions import ProductOptionField
 
 from waeup.ikoba.customers.vocabularies import (
@@ -323,4 +324,17 @@
 
 
+class IContractProcess(IContract):
+    """Interface for processing contract data.
+    """
+
+    product_options = schema.List(
+        title = _(u'Options/Fees'),
+        value_type = ProductOptionField(),
+        required = False,
+        readonly = False,
+        default = [],
+        )
+
+
 class IContractEdit(IContract):
     """Interface for editing contract data by customers.
@@ -347,4 +361,17 @@
 
 
+class ISampleContractProcess(ISampleContract):
+    """Interface for processing contract data.
+    """
+
+    product_options = schema.List(
+        title = _(u'Options/Fees'),
+        value_type = ProductOptionField(),
+        required = False,
+        readonly = False,
+        default = [],
+        )
+
+
 class ISampleContractEdit(ISampleContract):
     """Interface for editing sample contract data by customers.
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/sample_contract_data.csv
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/sample_contract_data.csv	(revision 12330)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/sample_contract_data.csv	(revision 12333)
@@ -1,8 +1,8 @@
-class_name,contract_id,reg_number,title,product_object,document_object
-SampleContract,c3,1,My first contract,SAM,DOC1
-SampleContract,c4,2,My second contract,SAM,DOC1
-SampleContract,c5,3,My third contract,SAM,DOC1
-SampleContract,,1,My 4th contract,SAM,DOC1
-SampleContract,c5,2,My stolen contract,SAM,DOC1
-SampleContract,c6,3,My 5th contract,SAM,NONEXISTENT
-SampleContract,c7,3,My sixt contract,NONEXISTENT,DOC1
+class_name,contract_id,reg_number,title,product_object,document_object,product_options
+SampleContract,c3,1,My first contract,SAM,DOC1,"[('Base Fee', '800.6', 'usd')]"
+SampleContract,c4,2,My second contract,SAM,DOC1,[]
+SampleContract,c5,3,My third contract,SAM,DOC1,[]
+SampleContract,,1,My 4th contract,SAM,DOC1,[]
+SampleContract,c5,2,My stolen contract,SAM,DOC1,[]
+SampleContract,c6,3,My 5th contract,SAM,NONEXISTENT,[]
+SampleContract,c7,3,My sixt contract,NONEXISTENT,DOC1,[]
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/test_batching.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/test_batching.py	(revision 12330)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/test_batching.py	(revision 12333)
@@ -490,8 +490,8 @@
         fail_file = open(fail_file).read()
         self.assertEqual(fail_file,
-            'reg_number,contract_id,title,class_name,product_object,document_object,--ERRORS--\r\n'
-            '2,c5,My stolen contract,SampleContract,SAM,DOC1,This object already exists. Skipping.\r\n'
-            '3,c6,My 5th contract,SampleContract,SAM,NONEXISTENT,document_object: Invalid value\r\n'
-            '3,c7,My sixt contract,SampleContract,NONEXISTENT,DOC1,product_object: Invalid value\r\n'
+            'reg_number,contract_id,title,class_name,product_object,document_object,product_options,--ERRORS--\r\n'
+            '2,c5,My stolen contract,SampleContract,SAM,DOC1,[],This object already exists. Skipping.\r\n'
+            '3,c6,My 5th contract,SampleContract,SAM,NONEXISTENT,[],document_object: Invalid value\r\n'
+            '3,c7,My sixt contract,SampleContract,NONEXISTENT,DOC1,[],product_object: Invalid value\r\n'
             )
         contract = self.processor.getEntry(dict(reg_number='1',
@@ -500,4 +500,7 @@
             self.app['customers']['X666666']['contracts']['c3'],
             contract)
+        self.assertEqual(contract.product_options[0].title, 'Base Fee')
+        self.assertEqual(contract.product_options[0].fee, Decimal('800.6') )
+        self.assertEqual(contract.product_options[0].currency, 'usd')
         self.assertEqual(contract.contract_id, 'c3')
         contract = self.processor.getEntry(dict(reg_number='3',
