diff --git a/master/bt5/slapos_crm/PortalTypeWorkflowChainTemplateItem/workflow_chain_type.xml b/master/bt5/slapos_crm/PortalTypeWorkflowChainTemplateItem/workflow_chain_type.xml
index e6770c795d96560355d33d831cea53ed51fa8bd1..78636ca96967d3f50074fc4b0ad197e255b6ac10 100644
--- a/master/bt5/slapos_crm/PortalTypeWorkflowChainTemplateItem/workflow_chain_type.xml
+++ b/master/bt5/slapos_crm/PortalTypeWorkflowChainTemplateItem/workflow_chain_type.xml
@@ -7,4 +7,8 @@
   <type>Regularisation Request</type>
   <workflow>edit_workflow, pricing_interaction_workflow, ticket_interaction_workflow, ticket_workflow</workflow>
  </chain>
+ <chain>
+  <type>Support Request</type>
+  <workflow>ticket_slap_interface_workflow</workflow>
+ </chain>
 </workflow_chain>
\ No newline at end of file
diff --git a/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/Base_generateSupportRequestForSlapOS.py b/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/Base_generateSupportRequestForSlapOS.py
deleted file mode 100644
index d9eca0ba5747ccc98651433176618291404b27d7..0000000000000000000000000000000000000000
--- a/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/Base_generateSupportRequestForSlapOS.py
+++ /dev/null
@@ -1,59 +0,0 @@
-from DateTime import DateTime
-
-portal = context.getPortalObject()
-aggregate_value = portal.restrictedTraverse(source_relative_url)
-
-if aggregate_value.getPortalType() == "Compute Node":
-  destination_decision = aggregate_value.getSourceAdministration()
-elif aggregate_value.getPortalType() == "Software Instance":
-  destination_decision = aggregate_value.getSpecialiseValue().getDestinationSection()
-elif aggregate_value.getPortalType() == "Instance Tree":
-  destination_decision = aggregate_value.getDestinationSection()
-elif aggregate_value.getPortalType() == "Software Installation":
-  destination_decision = aggregate_value.getDestinationSection()
-else:
-  destination_decision = None
-
-if portal.ERP5Site_isSupportRequestCreationClosed(destination_decision):
-  # Stop ticket creation
-  return
-
-support_request_in_progress = portal.portal_catalog.getResultValue(
-  portal_type = 'Support Request',
-  title = title,
-  simulation_state = ["validated", "submitted", "suspended"],
-  default_aggregate_uid = aggregate_value.getUid(),
-)
-
-if support_request_in_progress is not None:
-  return support_request_in_progress
-
-support_request_in_progress = context.REQUEST.get("support_request_in_progress", None)
-
-if support_request_in_progress is not None:
-  support_request = portal.restrictedTraverse(support_request_in_progress, None)
-  if support_request and support_request.getTitle() == title and \
-      support_request.getAggregateUid() == aggregate_value.getUid():
-    return portal.restrictedTraverse(support_request_in_progress)
-
-# Ensure resoure is Monitoring
-resource = portal.service_module.\
-                  slapos_crm_monitoring.getRelativeUrl()
-
-support_request = portal.restrictedTraverse(
-        portal.portal_preferences.getPreferredSupportRequestTemplate())\
-         .Base_createCloneDocument(batch_mode=1)
-
-support_request.edit(
-    title = title,
-    description = description,
-    start_date = DateTime(),
-    destination_decision=destination_decision,
-    aggregate_value = aggregate_value,
-    resource=resource
-  )
-support_request.validate()
-
-context.REQUEST.set("support_request_in_progress", support_request.getRelativeUrl())
-
-return support_request
diff --git a/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/ComputeNode_checkAndUpdateAllocationScope.py b/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/ComputeNode_checkAndUpdateAllocationScope.py
index aeeadfb914c667e5252a6599e6c5bf2a40494757..59a78845f142acf77f6e98ed87dd13613870044c 100644
--- a/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/ComputeNode_checkAndUpdateAllocationScope.py
+++ b/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/ComputeNode_checkAndUpdateAllocationScope.py
@@ -29,11 +29,12 @@ request_title = 'Allocation scope of %s changed to %s' % (compute_node_reference
 request_description = 'Allocation scope has been changed to ' \
                      '%s for %s' % (target_allocation_scope, compute_node_reference)
 
-support_request = context.Base_generateSupportRequestForSlapOS(
-               request_title,
-               request_description,
-               compute_node.getRelativeUrl()
-             )
+person.notify(support_request_title=request_title,
+              support_request_description=request_description,
+              aggregate=context.getRelativeUrl())
+
+support_request_relative_url = context.REQUEST.get("support_request_relative_url")
+support_request = portal.restrictedTraverse(support_request_relative_url)
 
 if support_request is not None:
   if support_request.getSimulationState() != "validated":
@@ -53,8 +54,8 @@ if support_request is not None:
     message = notification_message.asText(
               substitution_method_parameter_dict={'mapping_dict': mapping_dict})
 
-  event = support_request.SupportRequest_trySendNotificationMessage(
-           request_title, message, person.getRelativeUrl())
+  support_request.notify(message_title=request_title, message=message)
+  event = support_request.REQUEST.get("ticket_notified_item")
 
   if event is not None:
     # event added, suspend ticket
diff --git a/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/ComputeNode_checkSoftwareInstallationState.py b/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/ComputeNode_checkSoftwareInstallationState.py
index 2940a6a28afea1428b4c6a5e47da08f666bb6fd7..9e92a74ac6e6dc2eb35d93ad917feba5e5425378 100644
--- a/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/ComputeNode_checkSoftwareInstallationState.py
+++ b/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/ComputeNode_checkSoftwareInstallationState.py
@@ -1,12 +1,11 @@
 from DateTime import DateTime
 portal = context.getPortalObject()
 
-if portal.ERP5Site_isSupportRequestCreationClosed():
-  # Stop ticket creation
-  return
-
-if context.getMonitorScope() == "disabled":
-  return
+person = context.getSourceAdministrationValue(portal_type="Person")
+if not person or \
+   context.getMonitorScope() == "disabled" or \
+   portal.ERP5Site_isSupportRequestCreationClosed():
+  return 
 
 software_installation_list = portal.portal_catalog(
       portal_type='Software Installation',
@@ -50,15 +49,13 @@ for software_installation in software_installation_list:
         (software_installation.getUrlString(), compute_node_title, software_installation.getCreationDate())
 
   if should_notify:
-    support_request = context.Base_generateSupportRequestForSlapOS(
-      ticket_title,
-      description,
-      software_installation.getRelativeUrl()
-    )
+    person.notify(support_request_title=ticket_title,
+              support_request_description=description,
+              aggregate=software_installation.getRelativeUrl())
 
-    person = context.getSourceAdministrationValue(portal_type="Person")
-    if not person:
-      return support_request
+    support_request = context.REQUEST.get("support_request_relative_url")
+    if support_request is None:
+      return
 
     # Send Notification message
     notification_reference = 'slapos-crm-compute_node_software_installation_state.notification'
@@ -75,10 +72,7 @@ for software_installation in software_installation_list:
       message = notification_message.asText(
               substitution_method_parameter_dict={'mapping_dict':mapping_dict})
 
-    support_request.SupportRequest_trySendNotificationMessage(
-                ticket_title,
-                message, person.getRelativeUrl())
-
+    support_request.notify(message_title=ticket_title, message=message)
     support_request_list.append(support_request)
 
 return support_request_list
diff --git a/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/ComputeNode_checkState.py b/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/ComputeNode_checkState.py
index 0b6887dcdcdf1576a07852717f632544f7091391..519caaf5f84cbf531091f45602a8e4e5c9fa6a08 100644
--- a/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/ComputeNode_checkState.py
+++ b/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/ComputeNode_checkState.py
@@ -1,12 +1,11 @@
 from DateTime import DateTime
 portal = context.getPortalObject()
 
-if portal.ERP5Site_isSupportRequestCreationClosed():
-  # Stop ticket creation
-  return
-
-if context.getMonitorScope() == "disabled":
-  return
+person = context.getSourceAdministrationValue(portal_type="Person")
+if not person or \
+   context.getMonitorScope() == "disabled" or \
+   portal.ERP5Site_isSupportRequestCreationClosed():
+  return 
 
 if context.getAllocationScope("open").startswith("close"):
   context.setMonitorScope("disabled")
@@ -18,7 +17,6 @@ ticket_title = "[MONITORING] Lost contact with compute_node %s" % reference
 description = ""
 last_contact = "No Contact Information"
 
-
 d = context.getAccessStatus()
 # Ignore if data isn't present.
 if d.get("no_data") == 1:
@@ -33,20 +31,19 @@ else:
     # Nothing to notify.
     return  
 
-support_request = context.Base_generateSupportRequestForSlapOS(
-  ticket_title,
-  description,
-  context.getRelativeUrl()
-)
+person.notify(support_request_title=ticket_title,
+              support_request_description=description,
+              aggregate=context.getRelativeUrl())
 
-person = context.getSourceAdministrationValue(portal_type="Person")
-if not person:
-  return support_request
+support_request_relative_url = context.REQUEST.get("support_request_relative_url")
+if support_request_relative_url is None:
+  return
+
+support_request = portal.restrictedTraverse(support_request_relative_url)
 
 # Send Notification message
-notification_reference = 'slapos-crm-compute_node_check_state.notification'
 notification_message = portal.portal_notifications.getDocumentValue(
-                reference=notification_reference)
+  reference='slapos-crm-compute_node_check_state.notification')
 
 if notification_message is None:
   message = """%s""" % description
@@ -55,10 +52,8 @@ else:
                   'compute_node_id':reference,
                   'last_contact':last_contact}
   message = notification_message.asText(
-            substitution_method_parameter_dict={'mapping_dict':mapping_dict})
+            substitution_method_parameter_dict={'mapping_dict': mapping_dict})
+
+support_request.notify(message_title=ticket_title, message=message)
 
-support_request.SupportRequest_trySendNotificationMessage(
-            ticket_title,
-            message, person.getRelativeUrl())
-              
 return support_request
diff --git a/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/InstanceTree_createSupportRequestEvent.py b/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/InstanceTree_createSupportRequestEvent.py
index b5f36c59657ac86ab21bf04d55f0b53b6f476b3c..10037b2ca9ca552a006250f37eface165b499272 100644
--- a/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/InstanceTree_createSupportRequestEvent.py
+++ b/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/InstanceTree_createSupportRequestEvent.py
@@ -1,5 +1,11 @@
 portal = context.getPortalObject()
 
+
+person = context.getDestinationSectionValue()
+if person is None or portal.ERP5Site_isSupportRequestCreationClosed(person.getRelativeUrl()):
+  # Stop ticket creation
+  return
+
 ticket_title = "Instance Tree %s is failing." % context.getTitle()
 error_message = instance.SoftwareInstance_hasReportedError(include_message=True)
 
@@ -10,27 +16,23 @@ if error_message:
 else:
   error_message = "No message!"
 
-support_request = context.Base_generateSupportRequestForSlapOS(
-  ticket_title,
-  description,
-  context.getRelativeUrl())
+person.notify(support_request_title=ticket_title,
+              support_request_description=description,
+              aggregate=context.getRelativeUrl())
 
-if support_request is None:
+support_request_relative_url = context.REQUEST.get("support_request_relative_url")
+if support_request_relative_url is None:
   return
 
-person = context.getDestinationSectionValue(portal_type="Person")
-if not person:
-  return
+support_request = portal.restrictedTraverse(support_request_relative_url)
 
 if support_request.getSimulationState() not in ["validated", "suspended"]:
   support_request.validate()
 
 # Send Notification message
 message = description
-
-notification_reference = notification_message_reference
 notification_message = portal.portal_notifications.getDocumentValue(
-                 reference=notification_reference)
+                 reference=notification_message_reference)
 if notification_message is not None:
   mapping_dict = {'instance_tree_title':context.getTitle(),
                   'instance': instance.getTitle(),
@@ -39,5 +41,5 @@ if notification_message is not None:
   message = notification_message.asText(
               substitution_method_parameter_dict={'mapping_dict':mapping_dict})
 
-return support_request.SupportRequest_trySendNotificationMessage(
-              ticket_title, message, person.getRelativeUrl())
+support_request.notify(message_title=ticket_title, message=message)
+return context.REQUEST.get("ticket_notified_item")
diff --git a/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/SupportRequest_trySendNotificationMessage.py b/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/SupportRequest_trySendNotificationMessage.py
deleted file mode 100644
index 1359ecde5aac327bd8672e19b3503a4a15f01eaf..0000000000000000000000000000000000000000
--- a/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/SupportRequest_trySendNotificationMessage.py
+++ /dev/null
@@ -1,41 +0,0 @@
-support_request = context
-portal = context.getPortalObject()
-
-resource = portal.service_module.slapos_crm_information.getRelativeUrl()
-# create Web message if needed for this ticket
-last_event = context.portal_catalog.getResultValue(
-             title=message_title,
-             follow_up_uid=support_request.getUid(),
-             sort_on=[('delivery.start_date', 'DESC')],
-)
-if last_event:
-  # User has already been notified for this problem.
-  return last_event
-
-transactional_event = context.REQUEST.get("support_request_notified_item", None)
-
-if transactional_event is not None:
-  if (transactional_event.getFollowUpUid() == support_request.getUid()) and \
-    (transactional_event.getTitle() == message_title):
-    return transactional_event
-
-template = portal.restrictedTraverse(
-        portal.portal_preferences.getPreferredWebMessageTemplate())
-
-event = template.Base_createCloneDocument(batch_mode=1)
-event.edit(
-  title=message_title,
-  text_content=message,
-  start_date = DateTime(),
-  resource = resource,
-  source=support_request.getSource(),
-  destination=destination_relative_url,
-  follow_up=support_request.getRelativeUrl(),
-)
-event.stop()
-event.deliver()
-
-support_request.serialize()
-context.REQUEST.set("support_request_notified_item", event)
-
-return event
diff --git a/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/SupportRequest_updateMonitoringDestroyRequestedState.py b/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/SupportRequest_updateMonitoringDestroyRequestedState.py
index 1396f2619520760fa48bc70c1b6b21c5bf2b999e..639f01feca73300a9f0cf4afe971d9e3d3201f83 100644
--- a/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/SupportRequest_updateMonitoringDestroyRequestedState.py
+++ b/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/SupportRequest_updateMonitoringDestroyRequestedState.py
@@ -1,35 +1,31 @@
 """ Close Support Request which are related to a Destroy Requested Instance. """
-
+portal = context.getPortalObject()
 
 if context.getSimulationState() == "invalidated":
   return
 
 document = context.getAggregateValue()
-
 if document is not None and document.getSlapState() == "destroy_requested":
   
   person = context.getDestinationDecision(portal_type="Person")
   if not person:
     return 
 
-  if context.getSimulationState() != "invalidated":
-    context.invalidate()
-
   # Send Notification message
   message = """ Closing this ticket as the Instance Tree was destroyed by the user. 
   """
 
-  notification_reference = "slapos-crm-support-request-close-destroyed-notification"
-  portal = context.getPortalObject()
-
   notification_message = portal.portal_notifications.getDocumentValue(
-                 reference=notification_reference)
+    reference="slapos-crm-support-request-close-destroyed-notification")
 
   if notification_message is not None:
-    mapping_dict = {'instance_tree_title':document.getTitle()}
+    mapping_dict = {'instance_tree_title': document.getTitle()}
 
     message = notification_message.asText(
               substitution_method_parameter_dict={'mapping_dict':mapping_dict})
-  
-  return context.SupportRequest_trySendNotificationMessage(
-              "Instance Tree was destroyed was destroyed by the user", message, person)
+
+  context.notify(message_title="Instance Tree was destroyed was destroyed by the user",
+              message=message)
+
+  context.invalidate()
+  return context.REQUEST.get("ticket_notified_item")
diff --git a/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/SupportRequest_updateMonitoringState.py b/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/SupportRequest_updateMonitoringState.py
index ead0556970d690a9c40269e50334080866819fff..dfa470efd547e9ba7b5c7a91ab18c5905b6864af 100644
--- a/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/SupportRequest_updateMonitoringState.py
+++ b/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/SupportRequest_updateMonitoringState.py
@@ -2,7 +2,6 @@ if context.getSimulationState() == "invalidated":
   return
 
 document = context.getAggregateValue(portal_type="Instance Tree")
-
 if document is None:
   return 
 
diff --git a/master/bt5/slapos_crm/TestTemplateItem/portal_components/test.erp5.testSlapOSCRMSkins.py b/master/bt5/slapos_crm/TestTemplateItem/portal_components/test.erp5.testSlapOSCRMSkins.py
index a2417d393f57035e546aef90e2b540d3245d3dd6..7a6f685e719ce442822be9d3145e1f5d5b572211 100644
--- a/master/bt5/slapos_crm/TestTemplateItem/portal_components/test.erp5.testSlapOSCRMSkins.py
+++ b/master/bt5/slapos_crm/TestTemplateItem/portal_components/test.erp5.testSlapOSCRMSkins.py
@@ -27,8 +27,6 @@ from erp5.component.test.SlapOSTestCaseMixin import \
 from DateTime import DateTime
 from App.Common import rfc1123_date
 from Products.ERP5Type.Cache import DEFAULT_CACHE_SCOPE
-
-from Products.ERP5Type.tests.utils import createZODBPythonScript
 import json
 
 import feedparser
@@ -655,13 +653,6 @@ class TestSlapOSComputeNode_notifyWrongAllocationScope(TestCRMSkinsMixin):
   'assert reference == "slapos-crm-compute_node_allocation_scope.notification"\n' \
   'return context.restrictedTraverse(' \
   'context.REQUEST["test_ComputeNodeNotAllowedAllocationScope_OpenPublic"])')
-  @simulate('SupportRequest_trySendNotificationMessage',
-            'message_title, message, destination_relative_url',
-  'context.portal_workflow.doActionFor(' \
-  'context, action="edit_action", ' \
-  'comment="Visited by SupportRequest_trySendNotificationMessage ' \
-  '%s %s %s" % (message_title, message, destination_relative_url))\n' \
-  'return 1')
   def test_ComputeNodeNotAllowedAllocationScope_OpenPublic(self):
     compute_node = self._makeComputeNode(owner=self.makePerson(user=0))[0]
     person = compute_node.getSourceAdministrationValue()
@@ -677,13 +668,14 @@ class TestSlapOSComputeNode_notifyWrongAllocationScope(TestCRMSkinsMixin):
     self.assertNotEqual(None, ticket)
     self.assertEqual(ticket.getSimulationState(), 'suspended')
 
-    self.assertEqual('Visited by SupportRequest_trySendNotificationMessage ' \
-      '%s %s %s' % \
-      ('Allocation scope of %s changed to %s' % (compute_node.getReference(),
-                                                  'open/personal'),
-       'Test NM content\n%s\n' % compute_node.getReference(), person.getRelativeUrl()),
-      ticket.workflow_history['edit_workflow'][-1]['comment'])
+    event_list = ticket.getFollowUpRelatedValueList()
+    self.assertEqual(len(event_list), 1)
+    event = event_list[0]
 
+    self.assertEqual(event.getTitle(),
+      'Allocation scope of %s changed to %s' % (compute_node.getReference(), 'open/personal'))
+    self.assertIn(compute_node.getReference(), event.getTextContent())
+    self.assertEqual(event.getDestination(), person.getRelativeUrl())
 
   @simulate('ERP5Site_isSupportRequestCreationClosed', '*args, **kwargs','return 0')
   @simulate('NotificationTool_getDocumentValue',
@@ -691,13 +683,6 @@ class TestSlapOSComputeNode_notifyWrongAllocationScope(TestCRMSkinsMixin):
   'assert reference == "slapos-crm-compute_node_allocation_scope.notification"\n' \
   'return context.restrictedTraverse(' \
   'context.REQUEST["test_ComputeNodeNotAllowedAllocationScope_OpenFriend"])')
-  @simulate('SupportRequest_trySendNotificationMessage',
-            'message_title, message, destination_relative_url',
-  'context.portal_workflow.doActionFor(' \
-  'context, action="edit_action", ' \
-  'comment="Visited by SupportRequest_trySendNotificationMessage ' \
-  '%s %s %s" % (message_title, message, destination_relative_url))\n' \
-  'return 1')
   def test_ComputeNodeNotAllowedAllocationScope_OpenFriend(self):
     compute_node = self._makeComputeNode(owner=self.makePerson(user=0))[0]
     person = compute_node.getSourceAdministrationValue()
@@ -712,12 +697,15 @@ class TestSlapOSComputeNode_notifyWrongAllocationScope(TestCRMSkinsMixin):
     self.tic()
     self.assertEqual(compute_node.getAllocationScope(), 'open/personal')
     self.assertEqual(ticket.getSimulationState(), 'suspended')
-    self.assertEqual('Visited by SupportRequest_trySendNotificationMessage ' \
-      '%s %s %s' % \
-      ('Allocation scope of %s changed to %s' % (compute_node.getReference(),
-                                                  'open/personal'),
-       'Test NM content\n%s\n' % compute_node.getReference(), person.getRelativeUrl()),
-      ticket.workflow_history['edit_workflow'][-1]['comment'])
+
+    event_list = ticket.getFollowUpRelatedValueList()
+    self.assertEqual(len(event_list), 1)
+    event = event_list[0]
+
+    self.assertEqual(event.getTitle(),
+      'Allocation scope of %s changed to %s' % (compute_node.getReference(), 'open/personal'))
+    self.assertIn(compute_node.getReference(), event.getTextContent())
+    self.assertEqual(event.getDestination(), person.getRelativeUrl())
 
   @simulate('ERP5Site_isSupportRequestCreationClosed', '*args, **kwargs','return 0')
   @simulate('ComputeNode_hasContactedRecently', '*args, **kwargs','return False')
@@ -726,13 +714,6 @@ class TestSlapOSComputeNode_notifyWrongAllocationScope(TestCRMSkinsMixin):
   'assert reference == "slapos-crm-compute-node-allocation-scope-closed.notification"\n' \
   'return context.restrictedTraverse(' \
   'context.REQUEST["test_ComputeNodeToCloseAllocationScope_OpenPersonal"])')
-  @simulate('SupportRequest_trySendNotificationMessage',
-            'message_title, message, destination_relative_url',
-  'context.portal_workflow.doActionFor(' \
-  'context, action="edit_action", ' \
-  'comment="Visited by SupportRequest_trySendNotificationMessage ' \
-  '%s %s %s" % (message_title, message, destination_relative_url))\n' \
-  'return 1')
   def test_ComputeNodeToCloseAllocationScope_OpenPersonal(self):
     compute_node = self._makeComputeNode(owner=self.makePerson(user=0))[0]
     person = compute_node.getSourceAdministrationValue()
@@ -747,12 +728,16 @@ class TestSlapOSComputeNode_notifyWrongAllocationScope(TestCRMSkinsMixin):
 
     self.assertEqual('suspended', support_request.getSimulationState())
     self.assertEqual(compute_node.getAllocationScope(), target_allocation_scope)
-    self.assertEqual('Visited by SupportRequest_trySendNotificationMessage ' \
-      '%s %s %s' % \
-      ('Allocation scope of %s changed to %s' % (compute_node.getReference(),
-                                                  target_allocation_scope),
-       'Test NM content\n%s\n' % compute_node.getReference(), person.getRelativeUrl()),
-      support_request.workflow_history['edit_workflow'][-1]['comment'])
+    
+    event_list = support_request.getFollowUpRelatedValueList()
+    self.assertEqual(len(event_list), 1)
+    event = event_list[0]
+
+    self.assertEqual(event.getTitle(),
+      'Allocation scope of %s changed to %s' % \
+        (compute_node.getReference(), target_allocation_scope))
+    self.assertIn(compute_node.getReference(), event.getTextContent())
+    self.assertEqual(event.getDestination(), person.getRelativeUrl())
 
   def test_ComputeNodeNormalAllocationScope_OpenPersonal(self):
     compute_node = self._makeComputeNode(owner=self.makePerson(user=0))[0]
@@ -988,189 +973,6 @@ class TestSlapOSisSupportRequestCreationClosed(TestCRMSkinsMixin):
     self.assertFalse(self.portal.ERP5Site_isSupportRequestCreationClosed())
 
 
-class TestSlapOSGenerateSupportRequestForSlapOS(TestCRMSkinsMixin):
-
-  def afterSetUp(self):
-    TestCRMSkinsMixin.afterSetUp(self)
-    self.tic()
-    self._cancelTestSupportRequestList()
-
-  def test_compute_node_Base_generateSupportRequestForSlapOS(self):
-    self._makeComputeNode()
-    title = "Test Support Request %s" % self.compute_node.getReference()
-    support_request = self.compute_node.Base_generateSupportRequestForSlapOS(
-      title, title, self.compute_node.getRelativeUrl()
-    )
-    self.tic()
-
-    self.assertNotEqual(support_request, None)
-
-    self.assertEqual(support_request.getSimulationState(), "validated")
-    self.assertEqual(support_request.getRelativeUrl(),
-      self.portal.REQUEST.get("support_request_in_progress", None))
-
-    # The support request is added to compute_node owner.
-    self.assertEqual(support_request.getDestinationDecision(),
-                      self.compute_node.getSourceAdministration())
-    self.assertEqual(support_request.getTitle(), title)
-    self.assertEqual(support_request.getDescription(), title)
-    self.assertEqual(support_request.getAggregateValue(),
-                      self.compute_node)
-
-  def test_software_instance_Base_generateSupportRequestForSlapOS(self):
-    instance_tree = self._makeInstanceTree()
-    self._makeSoftwareInstance(instance_tree,
-                               self.generateNewSoftwareReleaseUrl())
-
-    instance = instance_tree.getSuccessorValue()
-    title = "Test Support Request %s" % instance.getReference()
-    support_request = instance.Base_generateSupportRequestForSlapOS(
-      title, title, instance.getRelativeUrl()
-    )
-    self.tic()
-
-    self.assertNotEqual(support_request, None)
-
-    self.assertEqual(support_request.getSimulationState(), "validated")
-    self.assertEqual(support_request.getRelativeUrl(),
-      self.portal.REQUEST.get("support_request_in_progress", None))
-
-    # The support request is added to compute_node owner.
-    self.assertEqual(support_request.getDestinationDecision(),
-                      instance_tree.getDestinationSection())
-    self.assertEqual(support_request.getTitle(), title)
-    self.assertEqual(support_request.getDescription(), title)
-    self.assertEqual(support_request.getAggregateValue(),
-                      instance)
-
-  def test_instance_tree_Base_generateSupportRequestForSlapOS(self):
-    instance_tree = self._makeInstanceTree()
-
-    title = "Test Support Request %s" % instance_tree.getReference()
-    support_request = instance_tree.Base_generateSupportRequestForSlapOS(
-      title, title, instance_tree.getRelativeUrl()
-    )
-    self.tic()
-
-    self.assertNotEqual(support_request, None)
-
-    self.assertEqual(support_request.getSimulationState(), "validated")
-    self.assertEqual(support_request.getRelativeUrl(),
-      self.portal.REQUEST.get("support_request_in_progress", None))
-
-    # The support request is added to compute_node owner.
-    self.assertEqual(support_request.getDestinationDecision(),
-                      instance_tree.getDestinationSection())
-
-    self.assertEqual(support_request.getTitle(), title)
-    self.assertEqual(support_request.getDescription(), title)
-    self.assertEqual(support_request.getAggregateValue(),
-                      instance_tree)
-
-  def test_software_installation_Base_generateSupportRequestForSlapOS(self):
-    software_installation = self._makeSoftwareInstallation()
-
-    title = "Test Support Request %s" % software_installation.generateNewId()
-    support_request = software_installation.Base_generateSupportRequestForSlapOS(
-      title, title, software_installation.getRelativeUrl()
-    )
-    self.tic()
-
-    self.assertNotEqual(support_request, None)
-
-    self.assertEqual(support_request.getSimulationState(), "validated")
-    self.assertEqual(support_request.getRelativeUrl(),
-      self.portal.REQUEST.get("support_request_in_progress", None))
-
-    # The support request is added to compute_node owner.
-    self.assertEqual(support_request.getDestinationDecision(),
-                      software_installation.getDestinationSection())
-
-    self.assertEqual(support_request.getTitle(), title)
-    self.assertEqual(support_request.getDescription(), title)
-    self.assertEqual(support_request.getAggregateValue(),
-                      software_installation)
-
-
-  def test_Base_generateSupportRequestForSlapOS_do_not_recreate_if_open(self):
-    self._makeComputeNode(owner=self.makePerson(user=0))
-    title = "Test Support Request %s" % self.compute_node.getReference()
-    support_request = self.compute_node.Base_generateSupportRequestForSlapOS(
-      title, title, self.compute_node.getRelativeUrl()
-    )
-    self.tic()
-    self.portal.REQUEST.set("support_request_in_progress", None)
-
-    same_support_request = self.compute_node.Base_generateSupportRequestForSlapOS(
-      title, title, self.compute_node.getRelativeUrl()
-    )
-
-    self.assertEqual(support_request, same_support_request)
-
-
-  def test_Base_generateSupportRequestForSlapOS_do_not_recreate_if_suspended(self):
-    self._makeComputeNode(owner=self.makePerson(user=0))
-    title = "Test Support Request %s" % self.compute_node.getReference()
-    support_request = self.compute_node.Base_generateSupportRequestForSlapOS(
-      title, title, self.compute_node.getRelativeUrl()
-    )
-
-    support_request.suspend()
-    self.tic()
-    self.portal.REQUEST.set("support_request_in_progress", None)
-
-    same_support_request = self.compute_node.Base_generateSupportRequestForSlapOS(
-      title, title, self.compute_node.getRelativeUrl()
-    )
-
-    self.assertEqual(support_request, same_support_request)
-
-  def test_Base_generateSupportRequestForSlapOS_recreate_if_closed(self):
-    self._makeComputeNode(owner=self.makePerson(user=0))
-    title = "Test Support Request %s" % self.compute_node.getReference()
-    support_request = self.compute_node.Base_generateSupportRequestForSlapOS(
-      title, title, self.compute_node.getRelativeUrl())
-    self.tic()
-
-    support_request.invalidate()
-    self.tic()
-
-    self.portal.REQUEST.set("support_request_in_progress", None)
-
-    support_request = self.compute_node.Base_generateSupportRequestForSlapOS(
-      title, title, self.compute_node.getRelativeUrl()
-    )
-    self.tic()
-
-    self.assertNotEqual(support_request, None)
-
-  def test_Base_generateSupportRequestForSlapOS_recreate(self):
-    self._makeComputeNode(owner=self.makePerson(user=0))
-    title = "Test Support Request %s" % self.compute_node.getRelativeUrl()
-    support_request = self.compute_node.Base_generateSupportRequestForSlapOS(
-      title, title, self.compute_node.getRelativeUrl())
-
-    same_support_request = self.compute_node.Base_generateSupportRequestForSlapOS(
-      title, title, self.compute_node.getRelativeUrl()
-    )
-
-    self.assertEqual(support_request, same_support_request)
-
-  def test_Base_generateSupportRequestForSlapOS_inprogress(self):
-    self._makeComputeNode(owner=self.makePerson(user=0))
-    title = "Test Support Request %s" % self.compute_node.getRelativeUrl()
-    support_request = self.compute_node.Base_generateSupportRequestForSlapOS(
-      title, title, self.compute_node.getRelativeUrl())
-
-    in_progress = support_request.getRelativeUrl()
-    self.portal.REQUEST.set("support_request_in_progress", in_progress)
-
-    title = "Test Support Request %s" % self.compute_node.getRelativeUrl()
-    support_request = self.compute_node.Base_generateSupportRequestForSlapOS(
-      title, title, self.compute_node.getRelativeUrl())
-
-    self.assertEqual(support_request.getRelativeUrl(), in_progress)
-
 class TestSlapOSComputeNode_CheckState(TestCRMSkinsMixin):
 
   def beforeTearDown(self):
@@ -1181,11 +983,6 @@ class TestSlapOSComputeNode_CheckState(TestCRMSkinsMixin):
     TestCRMSkinsMixin.afterSetUp(self)
     self._cancelTestSupportRequestList("% TESTCOMPT-%")
 
-  def _makeSupportRequest(self):
-    return self.portal.restrictedTraverse(
-        self.portal.portal_preferences.getPreferredSupportRequestTemplate()).\
-       Base_createCloneDocument(batch_mode=1)
-
   def _makeNotificationMessage(self, reference):
     notification_message = self.portal.notification_message_module.newContent(
       portal_type="Notification Message",
@@ -1205,56 +1002,36 @@ class TestSlapOSComputeNode_CheckState(TestCRMSkinsMixin):
     )
     return support_request
 
-  def _simulateBase_generateSupportRequestForSlapOS(self):
-    script_name = 'Base_generateSupportRequestForSlapOS'
-    if script_name in self.portal.portal_skins.custom.objectIds():
-      raise ValueError('Precondition failed: %s exists in custom' % script_name)
-    createZODBPythonScript(self.portal.portal_skins.custom,
-      script_name,
-      '*args, **kw',
-      '# Script body\n'
-"""return context.getPortalObject().REQUEST['_simulateBase_generateSupportRequestForSlapOS']""")
-    transaction.commit()
-
   @simulate('ERP5Site_isSupportRequestCreationClosed', '*args, **kwargs','return 0')
   def test_ComputeNode_checkState_call_support_request(self):
     compute_node = self._makeComputeNode(owner=self.makePerson(user=0))[0]
     try:
-      self.pinDateTime(DateTime()-1.1)
+      d = DateTime() - 1.1
+      self.pinDateTime(d)
       compute_node.setAccessStatus("#access ")
     finally:
       self.unpinDateTime()
 
-    self._simulateBase_generateSupportRequestForSlapOS()
-    support_request = self._makeSupportRequest()
-    self.portal.REQUEST.set('_simulateBase_generateSupportRequestForSlapOS',
-                               support_request)
-
-    try:
-      compute_node_support_request = compute_node.ComputeNode_checkState()
-    finally:
-      self._dropScript("Base_generateSupportRequestForSlapOS")
-
-    self.assertEqual(support_request,
-      compute_node_support_request)
-
+    compute_node_support_request = compute_node.ComputeNode_checkState()
+    self.assertNotEqual(compute_node_support_request, None)
+    self.assertIn("[MONITORING] Lost contact with compute_node",
+      compute_node_support_request.getTitle())
+    self.assertIn("has not contacted the server for more than 30 minutes",
+      compute_node_support_request.getDescription())
+    self.assertIn(d.strftime("%Y/%m/%d %H:%M:%S"),
+      compute_node_support_request.getDescription())
 
   @simulate('ERP5Site_isSupportRequestCreationClosed', '*args, **kwargs','return 0')
   def test_ComputeNode_checkState_empty_cache(self):
     compute_node = self._makeComputeNode(owner=self.makePerson(user=0))[0]
-
-    self._simulateBase_generateSupportRequestForSlapOS()
-    support_request = self._makeSupportRequest()
-    self.portal.REQUEST.set('_simulateBase_generateSupportRequestForSlapOS',
-                               support_request)
-
-    try:
-      compute_node_support_request = compute_node.ComputeNode_checkState()
-    finally:
-      self._dropScript("Base_generateSupportRequestForSlapOS")
-
-    self.assertEqual(support_request,
-      compute_node_support_request)
+    compute_node_support_request = compute_node.ComputeNode_checkState()
+    
+    compute_node_support_request = compute_node.ComputeNode_checkState()
+    self.assertNotEqual(compute_node_support_request, None)
+    self.assertIn("[MONITORING] Lost contact with compute_node",
+      compute_node_support_request.getTitle())
+    self.assertIn("has not contacted the server (No Contact Information)",
+      compute_node_support_request.getDescription())
 
   @simulate('ERP5Site_isSupportRequestCreationClosed', '*args, **kwargs','return 0')
   @simulate('NotificationTool_getDocumentValue',
@@ -1262,12 +1039,6 @@ class TestSlapOSComputeNode_CheckState(TestCRMSkinsMixin):
   'assert reference == "slapos-crm-compute_node_check_state.notification"\n' \
   'return context.restrictedTraverse(' \
   'context.REQUEST["test_ComputeNode_checkState_notify"])')
-  @simulate('SupportRequest_trySendNotificationMessage',
-            'message_title, message, destination_relative_url',
-  'context.portal_workflow.doActionFor(' \
-  'context, action="edit_action", ' \
-  'comment="Visited by SupportRequest_trySendNotificationMessage ' \
-  '%s %s %s" % (message_title, message, destination_relative_url))')
   def test_ComputeNode_checkState_notify(self):
     compute_node = self._makeComputeNode(owner=self.makePerson(user=0))[0]
     person = compute_node.getSourceAdministrationValue()
@@ -1286,14 +1057,15 @@ class TestSlapOSComputeNode_CheckState(TestCRMSkinsMixin):
 
     ticket_title = "[MONITORING] Lost contact with compute_node %s" % compute_node.getReference()
     ticket = self._getGeneratedSupportRequest(compute_node.getUid(), ticket_title)
+
     self.assertNotEqual(ticket, None)
-    self.assertEqual('Visited by SupportRequest_trySendNotificationMessage ' \
-      '%s %s %s' % ( \
-      ticket_title,
-      'Test NM content\n%s\n' % compute_node.getReference(),
-      person.getRelativeUrl()),
-      ticket.workflow_history['edit_workflow'][-1]['comment'])
+    event_list = ticket.getFollowUpRelatedValueList()
+    self.assertEqual(len(event_list), 1)
+    event = event_list[0]
 
+    self.assertEqual(event.getTitle(), ticket.getTitle())
+    self.assertIn(compute_node.getReference(), event.getTextContent())
+    self.assertEqual(event.getDestination(), person.getRelativeUrl())
 
   @simulate('ERP5Site_isSupportRequestCreationClosed', '*args, **kwargs','return 0')
   @simulate('NotificationTool_getDocumentValue',
@@ -1301,12 +1073,6 @@ class TestSlapOSComputeNode_CheckState(TestCRMSkinsMixin):
   'assert reference == "slapos-crm-compute_node_check_state.notification"\n' \
   'return context.restrictedTraverse(' \
   'context.REQUEST["test_ComputeNode_checkState_empty_cache_notify"])')
-  @simulate('SupportRequest_trySendNotificationMessage',
-            'message_title, message, destination_relative_url',
-  'context.portal_workflow.doActionFor(' \
-  'context, action="edit_action", ' \
-  'comment="Visited by SupportRequest_trySendNotificationMessage ' \
-  '%s %s %s" % (message_title, message, destination_relative_url))')
   def test_ComputeNode_checkState_empty_cache_notify(self):
     compute_node = self._makeComputeNode(owner=self.makePerson(user=0))[0]
     person = compute_node.getSourceAdministrationValue()
@@ -1320,13 +1086,13 @@ class TestSlapOSComputeNode_CheckState(TestCRMSkinsMixin):
     ticket_title = "[MONITORING] Lost contact with compute_node %s" % compute_node.getReference()
     ticket = self._getGeneratedSupportRequest(compute_node.getUid(), ticket_title)
     self.assertNotEqual(ticket, None)
-    self.assertEqual('Visited by SupportRequest_trySendNotificationMessage ' \
-      '%s %s %s' % ( \
-      ticket_title,
-      'Test NM content\n%s\n' % compute_node.getReference(),
-      person.getRelativeUrl()),
-      ticket.workflow_history['edit_workflow'][-1]['comment'])
+    event_list = ticket.getFollowUpRelatedValueList()
+    self.assertEqual(len(event_list), 1)
+    event = event_list[0]
 
+    self.assertEqual(event.getTitle(), ticket.getTitle())
+    self.assertIn(compute_node.getReference(), event.getTextContent())
+    self.assertEqual(event.getDestination(), person.getRelativeUrl())
 
 class TestSlapOSInstanceTree_createSupportRequestEvent(SlapOSTestCaseMixin):
 
@@ -1341,8 +1107,7 @@ class TestSlapOSInstanceTree_createSupportRequestEvent(SlapOSTestCaseMixin):
     return notification_message.getRelativeUrl()
 
   def _makeInstanceTree(self):
-    person = self.portal.person_module.template_member\
-         .Base_createCloneDocument(batch_mode=1)
+    person = self.makePerson(user=1)
     instance_tree = self.portal\
       .instance_tree_module.template_instance_tree\
       .Base_createCloneDocument(batch_mode=1)
@@ -1371,12 +1136,6 @@ class TestSlapOSInstanceTree_createSupportRequestEvent(SlapOSTestCaseMixin):
   'assert reference == "test-slapos-crm-check.notification"\n' \
   'return context.restrictedTraverse(' \
   'context.REQUEST["testInstanceTree_createSupportRequestEvent"])')
-  @simulate('SupportRequest_trySendNotificationMessage',
-            'message_title, message, destination_relative_url',
-  'context.portal_workflow.doActionFor(' \
-  'context, action="edit_action", ' \
-  'comment="Visited by SupportRequest_trySendNotificationMessage ' \
-  '%s %s %s" % (message_title, message, destination_relative_url))')
   def testInstanceTree_createSupportRequestEvent(self):
     instance_tree = self._makeInstanceTree()
     person =  instance_tree.getDestinationSectionValue()
@@ -1392,12 +1151,14 @@ class TestSlapOSInstanceTree_createSupportRequestEvent(SlapOSTestCaseMixin):
       instance_tree.getUid())
     self.assertNotEqual(ticket, None)
     self.assertEqual(ticket.getSimulationState(), "validated")
-    self.assertEqual('Visited by SupportRequest_trySendNotificationMessage ' \
-      '%s %s %s' % ( \
-      ticket_title,
-      'Test NM content\n%s\n' % instance_tree.getReference(),
-      person.getRelativeUrl()),
-      ticket.workflow_history['edit_workflow'][-1]['comment'])
+    self.assertNotEqual(ticket, None)
+    event_list = ticket.getFollowUpRelatedValueList()
+    self.assertEqual(len(event_list), 1)
+    event = event_list[0]
+
+    self.assertEqual(event.getTitle(), ticket_title)
+    self.assertIn(instance_tree.getReference(), event.getTextContent())
+    self.assertEqual(event.getDestination(), person.getRelativeUrl())
 
     ticket.suspend()
     self.tic()
@@ -1734,95 +1495,6 @@ class TestSlapOSHasError(SlapOSTestCaseMixin):
         None,
         instance_tree.InstanceTree_checkSoftwareInstanceState())
 
-class TestSupportRequestTrySendNotificationMessage(SlapOSTestCaseMixin):
-
-  def test_SupportRequest_trySendNotificationMessage(self):
-    self._makeComputeNode(owner=self.makePerson(user=0))
-    person = self.compute_node.getSourceAdministrationValue()
-    title = "Test Support Request %s" % self.compute_node.getReference()
-    text_content='Test NM content<br/>%s<br/>' % self.compute_node.getReference()
-
-    support_request = self.portal.support_request_module.newContent(\
-            title=title, description=title,
-            destination_decision=self.compute_node.getSourceAdministration(),
-            aggregate_value=self.compute_node.getRelativeUrl())
-    support_request.validate()
-    self.tic()
-
-    first_event = support_request.SupportRequest_trySendNotificationMessage(
-      message_title=title, message=text_content,
-      destination_relative_url=person.getRelativeUrl()
-    )
-    self.assertNotEqual(first_event, None)
-
-    self.tic()
-    self.assertEqual(
-      support_request.getFollowUpRelatedList(),
-      [first_event.getRelativeUrl()])
-
-    self.assertEqual(title, first_event.getTitle())
-    self.assertEqual(text_content, first_event.getTextContent())
-    self.assertNotEqual(None, first_event.getStartDate())
-    self.assertEqual("service_module/slapos_crm_information",
-                      first_event.getResource())
-    self.assertEqual(first_event.getDestination(), person.getRelativeUrl())
-    self.assertEqual(first_event.getFollowUp(), support_request.getRelativeUrl())
-
-    event = support_request.SupportRequest_trySendNotificationMessage(
-      message_title=title, message=text_content,
-      destination_relative_url=person.getRelativeUrl()
-    )
-    self.assertEqual(event, first_event)
-
-    self.assertEqual(title, event.getTitle())
-    self.assertEqual(text_content, event.getTextContent())
-    self.assertNotEqual(None, event.getStartDate())
-    self.assertEqual("service_module/slapos_crm_information",
-                      event.getResource())
-    self.assertEqual(event.getDestination(), person.getRelativeUrl())
-
-    title += "__zz"
-    event = support_request.SupportRequest_trySendNotificationMessage(
-      message_title=title, message=text_content,
-      destination_relative_url=person.getRelativeUrl(),
-    )
-
-    self.assertEqual(event.getTitle(), title)
-    self.assertEqual(text_content, event.getTextContent())
-    self.assertNotEqual(None, event.getStartDate())
-    self.assertEqual("service_module/slapos_crm_information",
-                      event.getResource())
-    self.assertEqual(event.getDestination(), person.getRelativeUrl())
-
-    another_support_request = self.portal.support_request_module.newContent(\
-            title=title, description=title,
-            destination_decision=self.compute_node.getSourceAdministration(),
-            aggregate_value=self.compute_node.getRelativeUrl())
-    another_support_request.validate()
-    self.tic()
-
-    another_first_event = \
-      another_support_request.SupportRequest_trySendNotificationMessage(
-        message_title=title, message=text_content,
-        destination_relative_url=person.getRelativeUrl())
-
-    self.assertNotEqual(another_first_event, None)
-
-    self.tic()
-    self.assertEqual(
-      another_support_request.getFollowUpRelatedList(),
-      [another_first_event.getRelativeUrl()])
-
-    self.assertEqual(title, another_first_event.getTitle())
-    self.assertEqual(text_content, another_first_event.getTextContent())
-    self.assertNotEqual(None, another_first_event.getStartDate())
-    self.assertEqual("service_module/slapos_crm_information",
-                      another_first_event.getResource())
-    self.assertEqual(another_first_event.getDestination(), person.getRelativeUrl())
-    self.assertEqual(another_first_event.getFollowUp(),
-     another_support_request.getRelativeUrl())
-
-
 class TestSupportRequestUpdateMonitoringState(SlapOSTestCaseMixin):
 
   def _makeInstanceTree(self):
@@ -1873,10 +1545,6 @@ class TestSupportRequestUpdateMonitoringState(SlapOSTestCaseMixin):
       support_request.SupportRequest_updateMonitoringState())
 
   @simulate('ERP5Site_isSupportRequestCreationClosed', '','return 0')
-  @simulate('SupportRequest_trySendNotificationMessage',
-            "message_title, message, source_relative_url",
-     """assert "destroyed" in message
-return "Visited by SupportRequest_trySendNotificationMessage %s %s" % (message_title, source_relative_url)""")
   def testSupportRequest_updateMonitoringDestroyRequestedState(self):
     support_request = self._makeSupportRequest()
     self.assertEqual(None,
@@ -1887,20 +1555,29 @@ return "Visited by SupportRequest_trySendNotificationMessage %s %s" % (message_t
 
     support_request.setAggregateValue(
       self._makeComputeNode(owner=self.makePerson(user=0))[0])
+    support_request.setDestinationDecisionValue(self.makePerson(user=0))
     self.assertEqual(None,
       support_request.SupportRequest_updateMonitoringDestroyRequestedState())
 
     hs = self._makeInstanceTree()
     support_request.setAggregateValue(hs)
 
+    self.tic()
+
     hs.getSlapState = getFakeSlapState
     self.commit()
 
-    support_request.setDestinationDecisionValue(self.makePerson(user=0))
-    expected_text = """Visited by SupportRequest_trySendNotificationMessage Instance Tree was destroyed was destroyed by the user %s""" % support_request.getDestinationDecision()
-    self.assertEqual(expected_text,
+    self.assertNotEqual(None,
       support_request.SupportRequest_updateMonitoringDestroyRequestedState())
 
+    self.tic()
+    event_list = support_request.getFollowUpRelatedValueList()
+    self.assertEqual(len(event_list), 1)
+    event = event_list[0]
+
+    self.assertEqual(event.getTitle(), 'Instance Tree was destroyed was destroyed by the user')
+    self.assertEqual(event.getDestination(), support_request.getDestinationDecision())
+
     self.assertEqual("invalidated",
       support_request.getSimulationState())
 
diff --git a/master/bt5/slapos_crm/TestTemplateItem/portal_components/test.erp5.testSlapOSCloudTicketSlapInterfaceWorkflow.py b/master/bt5/slapos_crm/TestTemplateItem/portal_components/test.erp5.testSlapOSCloudTicketSlapInterfaceWorkflow.py
new file mode 100644
index 0000000000000000000000000000000000000000..77dbb3953e5726ebafd1f521bddc53be2c177d60
--- /dev/null
+++ b/master/bt5/slapos_crm/TestTemplateItem/portal_components/test.erp5.testSlapOSCloudTicketSlapInterfaceWorkflow.py
@@ -0,0 +1,212 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Copyright (c) 2002-2012 Nexedi SA and Contributors. All Rights Reserved.
+#
+# 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 erp5.component.test.SlapOSTestCaseMixin import SlapOSTestCaseMixin #, simulate
+import transaction
+
+class TestSlapOSCoreTicketSlapInterfaceWorkflow(SlapOSTestCaseMixin):
+
+  def afterSetUp(self):
+    SlapOSTestCaseMixin.afterSetUp(self)
+    portal = self.getPortalObject()
+
+    self.ticket_trade_condition = portal.sale_trade_condition_module.slapos_ticket_trade_condition
+
+    person_user = self.makePerson()
+    self.tic()
+
+    # Login as new user
+    self.login(person_user.getUserId())
+
+    new_person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
+    self.assertEqual(person_user.getRelativeUrl(), new_person.getRelativeUrl())
+
+    self.support_request = portal.support_request_module.newContent(
+      portal_type="Support Request",
+      destination_decision=person_user.getRelativeUrl(),
+      specialise=self.ticket_trade_condition.getRelativeUrl()
+    )
+
+    # Value set by the init
+    self.assertTrue(self.support_request.getReference().startswith("SR-"),
+      "Reference don't start with SR- : %s" % self.support_request.getReference())
+
+  def beforeTearDown(self):
+    transaction.abort()
+
+  def test_SupportRequest_approveRegistration_no_reference(self):
+    self.support_request.setReference(None)
+    self.assertRaises(ValueError, self.support_request.approveRegistration)
+
+  def test_SupportRequest_approveRegistration_already_validated(self):
+
+    # Login as admin since user cannot re-approve a validated project
+    self.login()
+    self.support_request.validate()
+    # Don't raise if support request is validated
+    self.assertEqual(self.support_request.approveRegistration(), None)
+
+  def test_SupportRequest_approveRegistration(self):
+    person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
+
+    self.support_request.approveRegistration()
+    self.tic()
+
+    self.logout()
+    self.login(person.getUserId())
+
+    self.assertEqual(self.support_request.getSimulationState(),
+      'validated')
+
+    self.assertEqual(self.support_request.getSourceSection(),
+      self.ticket_trade_condition.getSourceSection())
+    self.assertEqual(self.support_request.getSourceTrade(),
+      self.ticket_trade_condition.getSourceSection())
+    self.assertEqual(self.support_request.getSource(),
+      self.ticket_trade_condition.getSource())
+
+    self.assertNotEqual(self.support_request.getStartDate(),
+      None)
+
+    event = self.support_request.getCausalityValue()
+    self.assertNotEqual(event, None)
+
+    event_relative_url = self.support_request.REQUEST.get("event_relative_url")
+    self.assertEqual(event.getRelativeUrl(), event_relative_url)
+
+    self.assertEqual(event.getTitle(), self.support_request.getTitle())
+   
+  def test_SupportRequest_requestEvent_noParameter(self):
+    self.assertRaises(TypeError, self.support_request.requestEvent)
+    self.assertRaises(TypeError, self.support_request.requestEvent, event_title="A")
+    self.assertRaises(TypeError, self.support_request.requestEvent, event_content="A")
+
+  def test_SupportRequest_requestEvent(self):
+    person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
+
+    self.support_request.approveRegistration()
+    self.tic()
+
+    self.logout()
+    self.login(person.getUserId())
+
+    self.support_request.requestEvent(
+      event_title="A",
+      event_content="B"
+    )
+    self.tic()
+
+    event_relative_url = self.support_request.REQUEST.get("event_relative_url")
+    event = self.portal.restrictedTraverse(event_relative_url)
+
+    self.assertEqual(event.getSimulationState(), "stopped")
+    self.assertEqual(self.support_request.getSimulationState(),
+      'validated')
+    self.assertEqual(self.support_request.getDestinationDecision(),
+      event.getSource())
+    self.assertEqual(person, event.getSourceValue())
+
+    self.assertEqual(self.support_request.getResource(),
+      event.getResource())
+    self.assertEqual(self.support_request,
+      event.getFollowUpValue())
+    
+    self.assertEqual(event.getTitle(), "A")
+    self.assertEqual(event.getTextContent(), "B")
+    self.assertEqual(event.getContentType(), "text/plain")
+    self.assertEqual(event.getPortalType(), "Web Message")
+    self.assertEqual(event.getDestination(),
+      self.support_request.getSource())
+
+  def test_SupportRequest_notify_noParameter(self):
+    self.assertRaises(TypeError, self.support_request.notify)
+    self.assertRaises(TypeError, self.support_request.notify, message_title="A")
+    self.assertRaises(TypeError, self.support_request.notify, message="A")
+    self.assertRaises(TypeError, self.support_request.notify, destination_relative_url="A")
+
+  def test_SupportRequest_notify(self):
+    person = self.portal.portal_membership.getAuthenticatedMember().getUserValue()
+
+    self.support_request.approveRegistration()
+    self.tic()
+
+    self.logout()
+    self.login()
+
+    self.support_request.notify(
+      message_title="A",
+      message="B")
+
+    event = self.support_request.REQUEST.get("ticket_notified_item")
+
+    self.assertEqual(event.getSimulationState(), "delivered")
+    self.assertEqual(self.support_request.getSimulationState(),
+      'validated')
+    
+    self.assertEqual(self.support_request.getDestinationDecision(),
+      event.getDestination())
+    self.assertEqual(person, event.getDestinationValue())
+
+    self.assertEqual("service_module/slapos_crm_information",
+      event.getResource())
+    self.assertEqual(self.support_request,
+      event.getFollowUpValue())
+    
+    self.assertEqual(event.getTitle(), "A")
+    self.assertEqual(event.getTextContent(), "B")
+    self.assertEqual(event.getContentType(), "text/html")
+    self.assertEqual(event.getPortalType(), "Web Message")
+    self.assertEqual(event.getSource(),
+      self.support_request.getSource())
+
+    # Retry now to see if doesn't create a new message
+    self.support_request.notify(
+      message_title="A",
+      message="B")
+    self.tic()
+
+    self.assertEqual(event,
+      self.support_request.REQUEST.get("ticket_notified_item"))
+
+    # Retry, now it must create a new one
+    self.support_request.notify(
+      message_title="C",
+      message="B")
+    self.tic()
+
+    self.assertNotEqual(event,
+      self.support_request.REQUEST.get("ticket_notified_item"))
+
+    # Remove completly the ticket_notified_item and try to create a new one
+    # It should find it anyway from catalog.
+    self.support_request.REQUEST.set("ticket_notified_item", None)
+    self.commit()
+    
+    # Retry, now it must create a new one
+    self.support_request.notify(
+      message_title="A",
+      message="B")
+    self.tic()
+
+    self.assertEqual(event,
+      self.support_request.REQUEST.get("ticket_notified_item"))
+
+
+
diff --git a/master/bt5/slapos_crm/TestTemplateItem/portal_components/test.erp5.testSlapOSCloudTicketSlapInterfaceWorkflow.xml b/master/bt5/slapos_crm/TestTemplateItem/portal_components/test.erp5.testSlapOSCloudTicketSlapInterfaceWorkflow.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7ad833f122330c8f75158349c35cfb2313a8cc57
--- /dev/null
+++ b/master/bt5/slapos_crm/TestTemplateItem/portal_components/test.erp5.testSlapOSCloudTicketSlapInterfaceWorkflow.xml
@@ -0,0 +1,133 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Test Component" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_recorded_property_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
+        <item>
+            <key> <string>default_reference</string> </key>
+            <value> <string>testSlapOSCloudTicketSlapInterfaceWorkflow</string> </value>
+        </item>
+        <item>
+            <key> <string>default_source_reference</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>test.erp5.testSlapOSCloudTicketSlapInterfaceWorkflow</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Test Component</string> </value>
+        </item>
+        <item>
+            <key> <string>sid</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>text_content_error_message</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+        <item>
+            <key> <string>text_content_warning_message</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+        <item>
+            <key> <string>version</string> </key>
+            <value> <string>erp5</string> </value>
+        </item>
+        <item>
+            <key> <string>workflow_history</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>component_validation_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
+                    </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="4" aka="AAAAAAAAAAQ=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_log</string> </key>
+            <value>
+              <list>
+                <dictionary>
+                  <item>
+                      <key> <string>action</string> </key>
+                      <value> <string>validate</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>validation_state</string> </key>
+                      <value> <string>validated</string> </value>
+                  </item>
+                </dictionary>
+              </list>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow.xml b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow.xml
new file mode 100644
index 0000000000000000000000000000000000000000..37bc46cbde3b8b4f363b7f194397d52c085e2014
--- /dev/null
+++ b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Workflow" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_count</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
+        <item>
+            <key> <string>_mt_index</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+            </value>
+        </item>
+        <item>
+            <key> <string>_tree</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
+            </value>
+        </item>
+        <item>
+            <key> <string>categories</string> </key>
+            <value>
+              <tuple>
+                <string>source/portal_workflow/ticket_slap_interface_workflow/state_draft</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>comment</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>default_reference</string> </key>
+            <value> <string>person_slap_interface_workflow</string> </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>ticket_slap_interface_workflow</string> </value>
+        </item>
+        <item>
+            <key> <string>language</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>manager_bypass</string> </key>
+            <value> <int>0</int> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Workflow</string> </value>
+        </item>
+        <item>
+            <key> <string>state_variable</string> </key>
+            <value> <string>slap_state</string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string>Ticket Slap Interface Workflow</string> </value>
+        </item>
+        <item>
+            <key> <string>workflow_managed_permission</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="Length" module="BTrees.Length"/>
+    </pickle>
+    <pickle> <int>0</int> </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <pickle>
+      <global name="OOBTree" module="BTrees.OOBTree"/>
+    </pickle>
+    <pickle>
+      <none/>
+    </pickle>
+  </record>
+  <record id="4" aka="AAAAAAAAAAQ=">
+    <pickle>
+      <global name="OOBTree" module="BTrees.OOBTree"/>
+    </pickle>
+    <pickle>
+      <none/>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_approveRegistration.py b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_approveRegistration.py
new file mode 100644
index 0000000000000000000000000000000000000000..f0133c3d0bcd3b885ac3ba00fcb9d353f3ece577
--- /dev/null
+++ b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_approveRegistration.py
@@ -0,0 +1,43 @@
+ticket = state_change["object"]
+from DateTime import DateTime
+
+portal = context.getPortalObject()
+
+if ticket.getSimulationState() != "draft":
+  return
+
+if ticket.getReference() in [None, ""]:
+  raise ValueError("Reference is missing on the Ticket")
+
+# Get the user id of the context owner.
+local_role_list = ticket.get_local_roles()
+for group, role_list in local_role_list:
+  if 'Owner' in role_list:
+    user_id = group
+    break
+
+person = portal.portal_catalog.getResultValue(user_id=user_id)
+if person is None:
+  # Value was created by super user, so there isn't a point on continue
+  return
+
+# XXX unhardcode the trade condition, by adding a preference
+if ticket.getSpecialise() != "sale_trade_condition_module/slapos_ticket_trade_condition":
+  return
+
+trade_condition = portal.sale_trade_condition_module.slapos_ticket_trade_condition
+
+ticket.edit(
+  source_section=trade_condition.getSourceSection(),
+  source_trade=trade_condition.getSourceSection(),
+  source=trade_condition.getSource())
+
+ticket.setStartDate(DateTime())
+
+ticket.requestEvent(
+  event_title=ticket.getTitle(),
+  event_content=ticket.getDescription()
+)
+
+event_relative_url = context.REQUEST.get("event_relative_url")
+ticket.setCausality(event_relative_url)
diff --git a/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_approveRegistration.xml b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_approveRegistration.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c0e92fe7548a3a216be14d930b736f8e8977ec3c
--- /dev/null
+++ b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_approveRegistration.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Workflow Script" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>Script_magic</string> </key>
+            <value> <int>3</int> </value>
+        </item>
+        <item>
+            <key> <string>_bind_names</string> </key>
+            <value>
+              <object>
+                <klass>
+                  <global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
+                </klass>
+                <tuple/>
+                <state>
+                  <dictionary>
+                    <item>
+                        <key> <string>_asgns</string> </key>
+                        <value>
+                          <dictionary>
+                            <item>
+                                <key> <string>name_container</string> </key>
+                                <value> <string>container</string> </value>
+                            </item>
+                            <item>
+                                <key> <string>name_context</string> </key>
+                                <value> <string>context</string> </value>
+                            </item>
+                            <item>
+                                <key> <string>name_m_self</string> </key>
+                                <value> <string>script</string> </value>
+                            </item>
+                            <item>
+                                <key> <string>name_subpath</string> </key>
+                                <value> <string>traverse_subpath</string> </value>
+                            </item>
+                          </dictionary>
+                        </value>
+                    </item>
+                  </dictionary>
+                </state>
+              </object>
+            </value>
+        </item>
+        <item>
+            <key> <string>_params</string> </key>
+            <value> <string>state_change</string> </value>
+        </item>
+        <item>
+            <key> <string>_proxy_roles</string> </key>
+            <value>
+              <tuple>
+                <string>Assignor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>script_Ticket_approveRegistration</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Workflow Script</string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string>Ticket_approveRegistration</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_checkConsistency.py b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_checkConsistency.py
new file mode 100644
index 0000000000000000000000000000000000000000..9687ff0729284eccfa4c877aa13b09add3666d58
--- /dev/null
+++ b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_checkConsistency.py
@@ -0,0 +1,2 @@
+ticket = state_change['object']
+ticket.Base_checkConsistency()
diff --git a/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/Base_generateSupportRequestForSlapOS.xml b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_checkConsistency.xml
similarity index 76%
rename from master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/Base_generateSupportRequestForSlapOS.xml
rename to master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_checkConsistency.xml
index 3629c9852601b025ff7e818452e8b586cb86a867..cbb5b3a7322486242560ea4ce01390f267a07bc3 100644
--- a/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/Base_generateSupportRequestForSlapOS.xml
+++ b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_checkConsistency.xml
@@ -2,7 +2,7 @@
 <ZopeData>
   <record id="1" aka="AAAAAAAAAAE=">
     <pickle>
-      <global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
+      <global name="Workflow Script" module="erp5.portal_type"/>
     </pickle>
     <pickle>
       <dictionary>
@@ -50,11 +50,27 @@
         </item>
         <item>
             <key> <string>_params</string> </key>
-            <value> <string>title, description, source_relative_url</string> </value>
+            <value> <string>state_change</string> </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
         </item>
         <item>
             <key> <string>id</string> </key>
-            <value> <string>Base_generateSupportRequestForSlapOS</string> </value>
+            <value> <string>script_Ticket_checkConsistency</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Workflow Script</string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value>
+              <none/>
+            </value>
         </item>
       </dictionary>
     </pickle>
diff --git a/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_notify.py b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_notify.py
new file mode 100644
index 0000000000000000000000000000000000000000..36fc4f5c75542f6b774aa556caf1fe9e76ac7137
--- /dev/null
+++ b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_notify.py
@@ -0,0 +1,54 @@
+ticket = state_change["object"]
+from DateTime import DateTime
+portal = ticket.getPortalObject()
+
+# Get required arguments
+kwargs = state_change.kwargs
+
+# Required args
+# Raise TypeError if all parameters are not provided
+try:
+  message_title = kwargs['message_title']
+  message = kwargs['message']
+except KeyError:
+  raise TypeError("Ticket_notify takes exactly 2 arguments")
+
+resource = portal.service_module.slapos_crm_information.getRelativeUrl()
+
+# create Web message if needed for this ticket
+last_event = ticket.portal_catalog.getResultValue(
+             title=message_title,
+             follow_up_uid=ticket.getUid(),
+             sort_on=[('delivery.start_date', 'DESC')],
+)
+if last_event:
+  # User has already been notified for this problem.
+  ticket.REQUEST.set("ticket_notified_item", last_event)
+  return
+
+transactional_event = ticket.REQUEST.get("ticket_notified_item", None)
+
+if transactional_event is not None:
+  if (transactional_event.getFollowUpUid() == ticket.getUid()) and \
+    (transactional_event.getTitle() == message_title):
+    ticket.REQUEST.set("ticket_notified_item", transactional_event)
+    return
+
+template = portal.restrictedTraverse(
+        portal.portal_preferences.getPreferredWebMessageTemplate())
+
+event = template.Base_createCloneDocument(batch_mode=1)
+event.edit(
+  title=message_title,
+  text_content=message,
+  start_date = DateTime(),
+  resource = resource,
+  source=ticket.getSource(),
+  destination=ticket.getDestinationDecision(),
+  follow_up=ticket.getRelativeUrl(),
+)
+event.stop()
+event.deliver()
+
+ticket.serialize()
+ticket.REQUEST.set("ticket_notified_item", event)
diff --git a/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/SupportRequest_trySendNotificationMessage.xml b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_notify.xml
similarity index 71%
rename from master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/SupportRequest_trySendNotificationMessage.xml
rename to master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_notify.xml
index d619e79b71b9331b2a5888de43ab78d5fd48b318..accc3738ae218c21bd56687d1dcd5e1644619f56 100644
--- a/master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm_monitoring/SupportRequest_trySendNotificationMessage.xml
+++ b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_notify.xml
@@ -2,7 +2,7 @@
 <ZopeData>
   <record id="1" aka="AAAAAAAAAAE=">
     <pickle>
-      <global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
+      <global name="Workflow Script" module="erp5.portal_type"/>
     </pickle>
     <pickle>
       <dictionary>
@@ -50,11 +50,33 @@
         </item>
         <item>
             <key> <string>_params</string> </key>
-            <value> <string>message_title, message, destination_relative_url</string> </value>
+            <value> <string>state_change</string> </value>
+        </item>
+        <item>
+            <key> <string>_proxy_roles</string> </key>
+            <value>
+              <tuple>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
         </item>
         <item>
             <key> <string>id</string> </key>
-            <value> <string>SupportRequest_trySendNotificationMessage</string> </value>
+            <value> <string>script_Ticket_notify</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Workflow Script</string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string>Ticket_notify</string> </value>
         </item>
       </dictionary>
     </pickle>
diff --git a/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_requestEvent.py b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_requestEvent.py
new file mode 100644
index 0000000000000000000000000000000000000000..03a851c69170002e520c9493829ae879571f8aed
--- /dev/null
+++ b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_requestEvent.py
@@ -0,0 +1,30 @@
+ticket = state_change["object"]
+from DateTime import DateTime
+portal = context.getPortalObject()
+# Get required arguments
+kwargs = state_change.kwargs
+
+# Required args
+# Raise TypeError if all parameters are not provided
+try:
+  title = kwargs['event_title']
+  text_content = kwargs['event_content']
+except KeyError:
+  raise TypeError, "Ticket_requestEvent takes exactly 2 argument"
+
+web_message = portal.event_module.newContent(
+  portal_type="Web Message",
+  title=title,
+  text_content=text_content,
+  source=ticket.getDestinationDecision(),
+  content_type="text/plain",
+  destination=ticket.getSource(),
+  resource=ticket.getResource(),
+  follow_up=ticket.getRelativeUrl()
+)
+
+web_message.stop(comment="Submitted from the renderjs app")
+if portal.portal_workflow.isTransitionPossible(ticket, "validate"):
+  ticket.validate(comment="See %s" % web_message.getRelativeUrl())
+
+ticket.REQUEST.set("event_relative_url", web_message.getRelativeUrl())
diff --git a/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_requestEvent.xml b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_requestEvent.xml
new file mode 100644
index 0000000000000000000000000000000000000000..97c83b569fe935ef8772784ce147fdaddd9abad8
--- /dev/null
+++ b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/script_Ticket_requestEvent.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Workflow Script" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>Script_magic</string> </key>
+            <value> <int>3</int> </value>
+        </item>
+        <item>
+            <key> <string>_bind_names</string> </key>
+            <value>
+              <object>
+                <klass>
+                  <global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
+                </klass>
+                <tuple/>
+                <state>
+                  <dictionary>
+                    <item>
+                        <key> <string>_asgns</string> </key>
+                        <value>
+                          <dictionary>
+                            <item>
+                                <key> <string>name_container</string> </key>
+                                <value> <string>container</string> </value>
+                            </item>
+                            <item>
+                                <key> <string>name_context</string> </key>
+                                <value> <string>context</string> </value>
+                            </item>
+                            <item>
+                                <key> <string>name_m_self</string> </key>
+                                <value> <string>script</string> </value>
+                            </item>
+                            <item>
+                                <key> <string>name_subpath</string> </key>
+                                <value> <string>traverse_subpath</string> </value>
+                            </item>
+                          </dictionary>
+                        </value>
+                    </item>
+                  </dictionary>
+                </state>
+              </object>
+            </value>
+        </item>
+        <item>
+            <key> <string>_params</string> </key>
+            <value> <string>state_change</string> </value>
+        </item>
+        <item>
+            <key> <string>_proxy_roles</string> </key>
+            <value>
+              <tuple>
+                <string>Assignor</string>
+                <string>Owner</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>script_Ticket_requestEvent</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Workflow Script</string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string>Ticket_requestEvent</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/state_draft.xml b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/state_draft.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3dae19866338152c4358819be906e10dbeba8b0c
--- /dev/null
+++ b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/state_draft.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Workflow State" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>acquire_permission</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+        <item>
+            <key> <string>categories</string> </key>
+            <value>
+              <tuple>
+                <string>destination/portal_workflow/ticket_slap_interface_workflow/transition_approve_registration</string>
+                <string>destination/portal_workflow/ticket_slap_interface_workflow/transition_notify</string>
+                <string>destination/portal_workflow/ticket_slap_interface_workflow/transition_request_event</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>comment</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>state_draft</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Workflow State</string> </value>
+        </item>
+        <item>
+            <key> <string>state_permission_role_list_dict</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
+        <item>
+            <key> <string>state_type</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string>Draft</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/transition_approve_registration.xml b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/transition_approve_registration.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3aef7a3be5eb48756e6c0183e93344c0e00ade81
--- /dev/null
+++ b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/transition_approve_registration.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Workflow Transition" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>action</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>action_name</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>categories</string> </key>
+            <value>
+              <tuple>
+                <string>action_type/workflow</string>
+                <string>before_script/portal_workflow/ticket_slap_interface_workflow/script_Ticket_checkConsistency</string>
+                <string>after_script/portal_workflow/ticket_slap_interface_workflow/script_Ticket_approveRegistration</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>guard_permission</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+        <item>
+            <key> <string>icon</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>transition_approve_registration</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Workflow Transition</string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string>Approve Registration</string> </value>
+        </item>
+        <item>
+            <key> <string>trigger_type</string> </key>
+            <value> <int>2</int> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/transition_notify.xml b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/transition_notify.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fe69b3928252a6801b3e3ac7f2501c3fdc8b4277
--- /dev/null
+++ b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/transition_notify.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Workflow Transition" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>action</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>action_name</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>categories</string> </key>
+            <value>
+              <tuple>
+                <string>action_type/workflow</string>
+                <string>before_script/portal_workflow/ticket_slap_interface_workflow/script_Ticket_checkConsistency</string>
+                <string>after_script/portal_workflow/ticket_slap_interface_workflow/script_Ticket_notify</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>guard_permission</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+        <item>
+            <key> <string>icon</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>transition_notify</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Workflow Transition</string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string>Notify</string> </value>
+        </item>
+        <item>
+            <key> <string>trigger_type</string> </key>
+            <value> <int>2</int> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/transition_request_event.xml b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/transition_request_event.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c2461cd29db2461907ae70f9df52c47b6815066e
--- /dev/null
+++ b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/transition_request_event.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Workflow Transition" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>action</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>action_name</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>categories</string> </key>
+            <value>
+              <tuple>
+                <string>action_type/workflow</string>
+                <string>before_script/portal_workflow/ticket_slap_interface_workflow/script_Ticket_checkConsistency</string>
+                <string>after_script/portal_workflow/ticket_slap_interface_workflow/script_Ticket_requestEvent</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>guard_permission</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+        <item>
+            <key> <string>icon</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>transition_request_event</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Workflow Transition</string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string>Request Event</string> </value>
+        </item>
+        <item>
+            <key> <string>trigger_type</string> </key>
+            <value> <int>2</int> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/variable_action.xml b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/variable_action.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ba0016f3d69b0273369ad6802eb18c8313ea614e
--- /dev/null
+++ b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/variable_action.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Workflow Variable" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>automatic_update</string> </key>
+            <value> <int>1</int> </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value> <string>The last transition</string> </value>
+        </item>
+        <item>
+            <key> <string>for_catalog</string> </key>
+            <value> <int>0</int> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>variable_action</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Workflow Variable</string> </value>
+        </item>
+        <item>
+            <key> <string>status_included</string> </key>
+            <value> <int>1</int> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>variable_default_expression</string> </key>
+            <value> <string>transition/getReference|nothing</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/variable_actor.xml b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/variable_actor.xml
new file mode 100644
index 0000000000000000000000000000000000000000..028d9db6a333f0cda3309140372c927214decf31
--- /dev/null
+++ b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/variable_actor.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Workflow Variable" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>automatic_update</string> </key>
+            <value> <int>1</int> </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value> <string>The name of the user who performed the last transition</string> </value>
+        </item>
+        <item>
+            <key> <string>for_catalog</string> </key>
+            <value> <int>0</int> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>variable_actor</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Workflow Variable</string> </value>
+        </item>
+        <item>
+            <key> <string>status_included</string> </key>
+            <value> <int>1</int> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>variable_default_expression</string> </key>
+            <value> <string>user/getUserName</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/variable_comment.xml b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/variable_comment.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b41853beaf1d6aea72c0e4eb3cbdcaa4969ebfc8
--- /dev/null
+++ b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/variable_comment.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Workflow Variable" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>automatic_update</string> </key>
+            <value> <int>1</int> </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value> <string>Comments about the last transition</string> </value>
+        </item>
+        <item>
+            <key> <string>for_catalog</string> </key>
+            <value> <int>0</int> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>variable_comment</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Workflow Variable</string> </value>
+        </item>
+        <item>
+            <key> <string>status_included</string> </key>
+            <value> <int>1</int> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>variable_default_expression</string> </key>
+            <value> <string>python:state_change.kwargs.get(\'comment\', \'\')</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/variable_error_message.xml b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/variable_error_message.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2b761c20e6aaa4fc8708edf2ce7109154b8427d5
--- /dev/null
+++ b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/variable_error_message.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Workflow Variable" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>automatic_update</string> </key>
+            <value> <int>1</int> </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value> <string>Error message if validation failed</string> </value>
+        </item>
+        <item>
+            <key> <string>for_catalog</string> </key>
+            <value> <int>0</int> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>variable_error_message</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Workflow Variable</string> </value>
+        </item>
+        <item>
+            <key> <string>status_included</string> </key>
+            <value> <int>1</int> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/variable_history.xml b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/variable_history.xml
new file mode 100644
index 0000000000000000000000000000000000000000..95a08300b717c82a90e3a2906285f051479b38a2
--- /dev/null
+++ b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/variable_history.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Workflow Variable" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>automatic_update</string> </key>
+            <value> <int>0</int> </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value> <string>Provides access to workflow history</string> </value>
+        </item>
+        <item>
+            <key> <string>for_catalog</string> </key>
+            <value> <int>0</int> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>variable_history</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Workflow Variable</string> </value>
+        </item>
+        <item>
+            <key> <string>status_included</string> </key>
+            <value> <int>0</int> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>variable_default_expression</string> </key>
+            <value> <string>state_change/getHistory</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/variable_portal_type.xml b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/variable_portal_type.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3609f65ad5051b7649d2b055bca6dd2d0fd70551
--- /dev/null
+++ b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/variable_portal_type.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Workflow Variable" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>automatic_update</string> </key>
+            <value> <int>0</int> </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value> <string>portal type (use as filter for worklists)</string> </value>
+        </item>
+        <item>
+            <key> <string>for_catalog</string> </key>
+            <value> <int>1</int> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>variable_portal_type</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Workflow Variable</string> </value>
+        </item>
+        <item>
+            <key> <string>status_included</string> </key>
+            <value> <int>0</int> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/variable_time.xml b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/variable_time.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4e488bde05a81a4b25e955b22ea25ba4e6c56d9c
--- /dev/null
+++ b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_slap_interface_workflow/variable_time.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Workflow Variable" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>automatic_update</string> </key>
+            <value> <int>1</int> </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value> <string>Time of the last transition</string> </value>
+        </item>
+        <item>
+            <key> <string>for_catalog</string> </key>
+            <value> <int>0</int> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>variable_time</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Workflow Variable</string> </value>
+        </item>
+        <item>
+            <key> <string>status_included</string> </key>
+            <value> <int>1</int> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>variable_default_expression</string> </key>
+            <value> <string>state_change/getDateTime</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_workflow.xml b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_workflow.xml
index 8f704f6eb66a68d46e5797ae5b96a447121936d8..f52d62131d7eae943bbca240fd3adbc278ec8046 100644
--- a/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_workflow.xml
+++ b/master/bt5/slapos_crm/WorkflowTemplateItem/portal_workflow/ticket_workflow.xml
@@ -32,6 +32,12 @@
               </tuple>
             </value>
         </item>
+        <item>
+            <key> <string>comment</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
         <item>
             <key> <string>default_reference</string> </key>
             <value> <string>ticket_workflow</string> </value>
diff --git a/master/bt5/slapos_crm/bt/template_portal_type_workflow_chain_list b/master/bt5/slapos_crm/bt/template_portal_type_workflow_chain_list
index 1a98d85d893d342cc80c09a4d323eb1de43050a1..8a7e562332dd8351cea701baf11c178de37e3017 100644
--- a/master/bt5/slapos_crm/bt/template_portal_type_workflow_chain_list
+++ b/master/bt5/slapos_crm/bt/template_portal_type_workflow_chain_list
@@ -3,4 +3,5 @@ Incident Response | ticket_workflow
 Regularisation Request | edit_workflow
 Regularisation Request | pricing_interaction_workflow
 Regularisation Request | ticket_interaction_workflow
-Regularisation Request | ticket_workflow
\ No newline at end of file
+Regularisation Request | ticket_workflow
+Support Request | ticket_slap_interface_workflow
\ No newline at end of file
diff --git a/master/bt5/slapos_crm/bt/template_test_id_list b/master/bt5/slapos_crm/bt/template_test_id_list
index df561755f6326ac62b2e81b8f55c1b2af3242fde..d6db53b15808e50d870e829d053b6b728e345064 100644
--- a/master/bt5/slapos_crm/bt/template_test_id_list
+++ b/master/bt5/slapos_crm/bt/template_test_id_list
@@ -1,3 +1,4 @@
 test.erp5.testSlapOSCRMSkins
 test.erp5.testSlapOSCRMRegularisationRequestSkins
-test.erp5.testSlapOSCRMAlarm
\ No newline at end of file
+test.erp5.testSlapOSCRMAlarm
+test.erp5.testSlapOSCloudTicketSlapInterfaceWorkflow
\ No newline at end of file
diff --git a/master/bt5/slapos_crm/bt/template_workflow_id_list b/master/bt5/slapos_crm/bt/template_workflow_id_list
index 4b3b1db595479f0bad108c71e14e8fa16fc4eec8..c356d787f5d4df3af90a687ddd00d3e016d56b92 100644
--- a/master/bt5/slapos_crm/bt/template_workflow_id_list
+++ b/master/bt5/slapos_crm/bt/template_workflow_id_list
@@ -1 +1,2 @@
+ticket_slap_interface_workflow
 ticket_workflow
\ No newline at end of file