diff --git a/product/ERP5/Document/OrderLine.py b/product/ERP5/Document/OrderLine.py
index df3dda91850c4a88b76e50c39d3543bc9aada91f..719e37d0a613cfa5c64a302b0298f436ae898440 100755
--- a/product/ERP5/Document/OrderLine.py
+++ b/product/ERP5/Document/OrderLine.py
@@ -33,20 +33,15 @@ from Products.CMFCore.WorkflowCore import WorkflowAction
 from Products.ERP5Type import Permissions, PropertySheet, Constraint, Interface
 from Products.ERP5.Document.DeliveryLine import DeliveryLine
 from Products.ERP5.Document.Movement import Movement
-
-from zLOG import LOG
+from Products.CMFCategory.Renderer import Renderer
 
 class OrderLine(DeliveryLine):
     """
-      Une ligne de commande d?init ?alement un prix
-      Un element de tarif est un prix pour un ensemble de conditions d'application...
+      A order line defines quantity and price
     """
 
     meta_type = 'ERP5 Order Line'
     portal_type = 'Order Line'
-    add_permission = Permissions.AddPortalContent
-    isPortalContent = 1
-    isRADContent = 1
 
     # Declarative security
     security = ClassSecurityInfo()
@@ -68,105 +63,12 @@ class OrderLine(DeliveryLine):
     # Declarative interfaces
     __implements__ = ( Interface.Variated, )
 
-    # Factory Type Information
-    factory_type_information = \
-      {    'id'             : portal_type
-         , 'meta_type'      : meta_type
-         , 'description'    : """\
-Une ligne tarifaire."""
-         , 'icon'           : 'order_line_icon.gif'
-         , 'product'        : 'ERP5'
-         , 'factory'        : 'addOrderLine'
-         , 'immediate_view' : 'order_line_view'
-         , 'allow_discussion'     : 1
-         , 'allowed_content_types': ('',
-                                      )
-         , 'filter_content_types' : 1
-         , 'global_allow'   : 1
-         , 'actions'        :
-        ( { 'id'            : 'view'
-          , 'name'          : 'View'
-          , 'category'      : 'object_view'
-          , 'action'        : 'order_line_view'
-          , 'permissions'   : (
-              Permissions.View, )
-          }
-        , { 'id'            : 'list'
-          , 'name'          : 'Object Contents'
-          , 'category'      : 'object_action'
-          , 'action'        : 'folder_contents'
-          , 'permissions'   : (
-              Permissions.View, )
-          }
-        , { 'id'            : 'print'
-          , 'name'          : 'Print'
-          , 'category'      : 'object_print'
-          , 'action'        : 'order_line_print'
-          , 'permissions'   : (
-              Permissions.View, )
-          }
-        , { 'id'            : 'metadata'
-          , 'name'          : 'Metadata'
-          , 'category'      : 'object_view'
-          , 'action'        : 'metadata_edit'
-          , 'permissions'   : (
-              Permissions.View, )
-          }
-        , { 'id'            : 'translate'
-          , 'name'          : 'Translate'
-          , 'category'      : 'object_action'
-          , 'action'        : 'translation_template_view'
-          , 'permissions'   : (
-              Permissions.TranslateContent, )
-          }
-        )
-      }
-
     security.declarePrivate( '_edit' )
     def _edit(self, REQUEST=None, force_update = 0, **kw):
       DeliveryLine._edit(self, REQUEST=REQUEST, force_update = force_update, **kw)
       # We must expand our applied rule if needed
       self.updateAppliedRule() # Actually called on parent
 
-    # For generation of matrix lines
-    security.declareProtected( Permissions.ModifyPortalContent, '_setVariationCategoryList' )
-    def _setVariationCategoryList(self, value):
-      """
-          Define the indices provided
-          one list per index (kw)
-
-          Any number of list can be provided
-      """
-      Movement._setVariationCategoryList(self, value)
-      # Update the cell range automatically
-      # This is far from easy and requires some specific wizzardry
-      base_id = 'movement'
-      kwd = {'base_id': base_id}
-      new_range = self.DeliveryLine_asCellRange() # This is a site dependent script
-      self._setCellRange(*new_range, **kwd )
-      #LOG('After _setCellRange in OrderLine',0,'')
-      cell_range_key_list = self.getCellRangeKeyList(base_id = base_id)
-      if cell_range_key_list <> [[None, None]] :
-        for k in cell_range_key_list:
-          c = self.newCell(*k, **kwd)
-          #LOG('OrderLine _setVariationCategoryList', 0, 'k = %s, c = %s, self.getVariationBaseCategoryList() = %s' % (repr(k), repr(c), repr(self.getVariationBaseCategoryList())))
-          c.edit( domain_base_category_list = self.getVariationBaseCategoryList(),
-                  mapped_value_property_list = ('quantity', 'price',),
-                  predicate_operator = 'SUPERSET_OF',
-                  predicate_value = filter(lambda k_item: k_item is not None, k),
-                  variation_category_list = filter(lambda k_item: k_item is not None, k),
-                  force_update = 1
-                )
-        #LOG('After edit cells in OrderLine',0,'')
-      else:
-        # If only one cell, delete it
-        cell_range_id_list = self.getCellRangeIdList(base_id = base_id)
-        for k in cell_range_id_list:
-          if self.get(k) is not None:
-            self[k].flushActivity(invoke=0)
-            self[k].immediateReindexObject() # We are forced to do this is url is changed (not uid)
-            self._delObject(k)
-
     security.declarePrivate('_checkConsistency')
     def _checkConsistency(self, fixit=0, mapped_value_property_list = ('quantity', 'price')):
       """
@@ -219,3 +121,73 @@ Une ligne tarifaire."""
       if len(result) > 0:
         return result[0].quantity
       return None
+
+    # XXX Copied 
+    security.declareProtected(Permissions.AccessContentsInformation, \
+                              'getVariationRangeCategoryItemList')
+    def getVariationRangeCategoryItemList(self):
+      """
+        Returns possible variation category values for the
+        order line according to the default resource.
+        Possible category values is provided as a list of
+        tuples (id, title). This is mostly
+        useful in ERP5Form instances to generate selection
+        menus.
+      """
+      resource = self.getResourceValue()
+      if resource != None:
+        result = resource.getVariationCategoryItemList(
+                                 omit_individual_variation=0)
+      else:
+        result = []
+      return result
+
+    security.declareProtected(Permissions.AccessContentsInformation, \
+                              'getVariationRangeCategoryList')
+    def getVariationRangeCategoryList(self):
+      """
+        Returns possible variation category values for the
+        order line according to the default resource.
+      """
+      return [x[1] for x in self.getVariationRangeCategoryItemList()]
+
+    # XXX Copied from Transformation
+    security.declareProtected(Permissions.AccessContentsInformation, 'getVariationCategoryItemList')
+    def getVariationCategoryItemList(self, base_category_list=(), base=1, 
+                                     display_id='title', 
+                                     current_category=None):
+      """
+        Returns the list of possible variations
+        XXX Copied and modified from Variated
+        Result is left display.
+      """
+      variation_category_item_list = []
+      if base_category_list == ():
+        base_category_list = self.getVariationRangeBaseCategoryList()
+
+      for base_category in base_category_list:
+        variation_category_list = self.getVariationCategoryList(
+                                            base_category_list=[base_category])
+
+        resource_list = [self.portal_categories.resolveCategory(x) for x in\
+                         variation_category_list]
+        category_list = [x for x in resource_list \
+                         if x.getPortalType() == 'Category']
+        variation_category_item_list.extend(Renderer(
+                               is_right_display=0,
+                               display_base_category=1,
+                               display_none_category=0, base=base,
+                               current_category=current_category,
+                               display_id='logical_path').\
+                                                 render(category_list))
+        object_list = [x for x in resource_list \
+                         if x.getPortalType() != 'Category']
+        variation_category_item_list.extend(Renderer(
+                               is_right_display=0,
+                               display_base_category=1,
+                               base_category=base_category, 
+                               display_none_category=0, base=base,
+                               current_category=current_category,
+                               display_id=display_id).\
+                                                 render(object_list))
+      return variation_category_item_list