diff --git a/product/CMFActivity/ActiveObject.py b/product/CMFActivity/ActiveObject.py
index a212118909c7c8b4b08108416de155c4b01abf5c..52bcafb1ee6db66d7a80bef14fb39c19dd6b1d0c 100644
--- a/product/CMFActivity/ActiveObject.py
+++ b/product/CMFActivity/ActiveObject.py
@@ -128,8 +128,12 @@ class ActiveObject(ExtensionClass.Base):
       raise ValueError, "Cannot defined a group_id with value None"
     elif kw.get('group_method_id') is None and kw.get('group_id') is not None:
       raise ValueError, "Cannot defined a group_id without group_method_id"
-    
-    activity_tool = getToolByName(self, 'portal_activities', None)
+
+    portal = self.getPortalObject()
+    if isinstance(active_process, basestring):
+      active_process = portal.unrestrictedTraverse(active_process)
+
+    activity_tool = getattr(portal, 'portal_activities', None)
     if activity_tool is None: return self # Do nothing if no portal_activities
     # activate returns an ActiveWrapper
     # a queue can be provided as well as extra parameters
diff --git a/product/CMFActivity/Activity/SQLDict.py b/product/CMFActivity/Activity/SQLDict.py
index c1329e494fc15d803c42beb43c30b0229463be3e..b027c038e4c38ef2d570f846782320e5c8534bfe 100644
--- a/product/CMFActivity/Activity/SQLDict.py
+++ b/product/CMFActivity/Activity/SQLDict.py
@@ -514,7 +514,10 @@ class SQLDict(RAMDict, SQLBase):
   def hasActivity(self, activity_tool, object, method_id=None, only_valid=None, active_process_uid=None):
     hasMessage = getattr(activity_tool, 'SQLDict_hasMessage', None)
     if hasMessage is not None:
-      my_object_path = '/'.join(object.getPhysicalPath())
+      if object is None:
+        my_object_path = None
+      else:
+        my_object_path = '/'.join(object.getPhysicalPath())
       result = hasMessage(path=my_object_path, method_id=method_id, only_valid=only_valid, active_process_uid=active_process_uid)
       if len(result) > 0:
         return result[0].message_count > 0
diff --git a/product/CMFActivity/Activity/SQLQueue.py b/product/CMFActivity/Activity/SQLQueue.py
index 3648839aac3537b71871af3b23bb3cabac7b3ed7..790c488378659729bc664a8282e9227f59fe4ca1 100644
--- a/product/CMFActivity/Activity/SQLQueue.py
+++ b/product/CMFActivity/Activity/SQLQueue.py
@@ -360,7 +360,10 @@ class SQLQueue(RAMQueue, SQLBase):
   def hasActivity(self, activity_tool, object, method_id=None, only_valid=None, active_process_uid=None):
     hasMessage = getattr(activity_tool, 'SQLQueue_hasMessage', None)
     if hasMessage is not None:
-      my_object_path = '/'.join(object.getPhysicalPath())
+      if object is None:
+        my_object_path = None
+      else:
+        my_object_path = '/'.join(object.getPhysicalPath())
       result = hasMessage(path=my_object_path, method_id=method_id, only_valid=only_valid, active_process_uid=active_process_uid)
       if len(result) > 0:
         return result[0].message_count > 0
diff --git a/product/CMFActivity/ActivityTool.py b/product/CMFActivity/ActivityTool.py
index 413b9f5d15b4e4f35ee62067565237594a78cb51..fb82548cd449c038bcad43b557f2daad78695bc2 100644
--- a/product/CMFActivity/ActivityTool.py
+++ b/product/CMFActivity/ActivityTool.py
@@ -159,6 +159,7 @@ class Message:
   Message instances are stored in an activity queue, inside the Activity Tool.
   """
 
+  active_process = None
   active_process_uid = None
 
   def __init__(self, obj, active_process, activity_kw, method_id, args, kw):
@@ -168,11 +169,7 @@ class Message:
     else:
       self.object_path = obj.getPhysicalPath()
       activity_creation_trace = obj.getPortalObject().portal_activities.activity_creation_trace
-    if type(active_process) is StringType:
-      self.active_process = active_process.split('/')
-    elif active_process is None:
-      self.active_process = None
-    else:
+    if active_process is not None:
       self.active_process = active_process.getPhysicalPath()
       self.active_process_uid = active_process.getUid()
     if activity_kw.get('serialization_tag', False) is None:
diff --git a/product/CMFActivity/skins/activity/SQLDict_hasMessage.zsql b/product/CMFActivity/skins/activity/SQLDict_hasMessage.zsql
index 310774d3b84b5a2b9bdfd2cdf08fc76fb2d5f047..02d4f0688f4e1ac1f69c225514be1892fb2d5022 100644
--- a/product/CMFActivity/skins/activity/SQLDict_hasMessage.zsql
+++ b/product/CMFActivity/skins/activity/SQLDict_hasMessage.zsql
@@ -13,8 +13,8 @@ active_process_uid
 only_valid</params>
 SELECT count(path) as message_count FROM
   message
-WHERE
-path = <dtml-sqlvar path type="string">
+WHERE 1 = 1
+<dtml-if expr="path is not None">AND path = <dtml-sqlvar path type="string"> </dtml-if>
 <dtml-if expr="method_id is not None">AND method_id = <dtml-sqlvar method_id type="string"></dtml-if>
 <dtml-if expr="only_valid">AND processing_node > -2</dtml-if>
 <dtml-if expr="active_process_uid is not None"> AND active_process_uid = <dtml-sqlvar active_process_uid type="int"> </dtml-if>
diff --git a/product/CMFActivity/skins/activity/SQLQueue_hasMessage.zsql b/product/CMFActivity/skins/activity/SQLQueue_hasMessage.zsql
index b1b515cd0e0ff042bc6497e52edd834847a591ab..e6b4522a26fb9541b00516fd98e3fd99c0af6543 100644
--- a/product/CMFActivity/skins/activity/SQLQueue_hasMessage.zsql
+++ b/product/CMFActivity/skins/activity/SQLQueue_hasMessage.zsql
@@ -13,8 +13,8 @@ active_process_uid
 only_valid</params>
 SELECT count(path) as message_count FROM
   message_queue
-WHERE
-path = <dtml-sqlvar path type="string">
+WHERE 1 = 1
+<dtml-if expr="path is not None">AND path = <dtml-sqlvar path type="string"> </dtml-if>
 <dtml-if expr="method_id is not None"> AND method_id = <dtml-sqlvar method_id type="string"> </dtml-if>
 <dtml-if expr="only_valid"> AND processing_node > -2 </dtml-if>
 <dtml-if expr="active_process_uid is not None"> AND active_process_uid = <dtml-sqlvar active_process_uid type="int"> </dtml-if>
diff --git a/product/CMFActivity/tests/testCMFActivity.py b/product/CMFActivity/tests/testCMFActivity.py
index 2ab167d2043597703530c734313444482d886bd0..2c3932d9a00c5e98337c014d9f5f569fb84809d2 100644
--- a/product/CMFActivity/tests/testCMFActivity.py
+++ b/product/CMFActivity/tests/testCMFActivity.py
@@ -3251,19 +3251,28 @@ class TestCMFActivity(ERP5TypeTestCase):
     finally:
       delattr(Organisation, 'waitingActivity')
       Queue.tic = original_queue_tic
-  
-  def test_active_object_hasActivity(self):
+
+  def test_hasActivity(self):
     active_object = self.portal.organisation_module.newContent(
                                             portal_type='Organisation')
+    active_process = self.portal.portal_activities.newActiveProcess()
     get_transaction().commit()
     self.tic()
+
     self.assertFalse(active_object.hasActivity())
-    for activity in ('SQLDict', 'SQLQueue'):
-      active_object.activate(activity=activity).getTitle()
-      get_transaction().commit()
-      self.assertTrue(active_object.hasActivity(), activity)
-      self.tic()
-      self.assertFalse(active_object.hasActivity(), activity)
+    self.assertFalse(active_process.hasActivity())
+
+    def test(obj, **kw):
+      for activity in ('SQLDict', 'SQLQueue'):
+        active_object.activate(activity=activity, **kw).getTitle()
+        get_transaction().commit()
+        self.assertTrue(obj.hasActivity(), activity)
+        self.tic()
+        self.assertFalse(obj.hasActivity(), activity)
+
+    test(active_object)
+    test(active_process, active_process=active_process)
+    test(active_process, active_process=active_process.getPath())
 
   def test_active_object_hasActivity_does_not_catch_exceptions(self):
     """