diff --git a/product/ERP5SyncML/XMLSyncUtils.py b/product/ERP5SyncML/XMLSyncUtils.py
index 731ae68cd84a747dd337f038949adeea09329031..269365c0d75e234c4f5884d3f1d7a13dcce8e07d 100644
--- a/product/ERP5SyncML/XMLSyncUtils.py
+++ b/product/ERP5SyncML/XMLSyncUtils.py
@@ -318,37 +318,11 @@ class XMLSyncUtilsMixin(SyncCode):
     else:
       raise ValueError, "Sorry, the given namespace is not supported"
 
-  def addXMLObject(self, cmd_id=0, object=None, xml_string=None,
-                  more_data=0, gid=None, media_type=None):
+  def addXMLObject(self, **kw):
     """
       Add an object with the SyncML protocol
     """
-    data_node = E.Data()
-    if media_type == self.MEDIA_TYPE['TEXT_XML'] and isinstance(xml_string, str):
-      data_node.append(etree.XML(xml_string, parser=parser))
-    elif media_type == self.MEDIA_TYPE['TEXT_XML'] and \
-         not isinstance(xml_string, str):
-      #xml_string could be Partial element if partial XML
-      data_node.append(xml_string)
-    else:
-      cdata = etree.CDATA(xml_string.decode('utf-8'))
-      data_node.text = cdata
-    xml = (E.Add(
-            E.CmdID('%s' % cmd_id),
-            E.Meta(
-              E.Type(media_type)
-              ),
-            E.Item(
-              E.Source(
-                E.LocURI(gid)
-                ),
-              data_node
-              )
-            ))
-    if more_data:
-      item_node = xml.find('{%s}Item' % SYNCML_NAMESPACE)
-      item_node.append(E.MoreData())
-    return etree.tostring(xml, encoding='utf-8', pretty_print=True)
+    return self._createAddOrReplaceNode('Add', **kw)
 
   def deleteXMLObject(self, cmd_id=0, object_gid=None, rid=None):
     """
@@ -366,34 +340,40 @@ class XMLSyncUtilsMixin(SyncCode):
              ))
     return etree.tostring(xml, encoding='utf-8', pretty_print=True)
 
-  def replaceXMLObject(self, cmd_id=0, object=None, xml_string=None,
-                       more_data=0, gid=None, rid=None, media_type=None):
+  def replaceXMLObject(self, **kw):
     """
       Replace an object with the SyncML protocol
     """
-    if rid:
-      elem_to_append = E.Target(E.LocURI('%s' % rid))
-    else:
-      elem_to_append = E.Source(E.LocURI('%s' % gid))
+    return self._createAddOrReplaceNode('Replace', **kw)
+
+  def _createAddOrReplaceNode(self, id_tag, cmd_id=0, object=None,
+                              xml_string=None, more_data=False, gid=None,
+                              rid=None, media_type=None):
+    """Mixin for addXMLObject() and replaceXMLObject()
+    """
     data_node = E.Data()
-    if not isinstance(xml_string, (str, unicode)):
-      data_node.append(xml_string)
+    if media_type == self.MEDIA_TYPE['TEXT_XML']:
+      if isinstance(xml_string, str):
+        data_node.append(etree.XML(xml_string, parser=parser))
+      elif isinstance(xml_string, etree.CDATA):
+        #xml_string could be Data element if partial XML
+        data_node.text = xml_string
+      else:
+        data_node.append(xml_string)
     else:
-      data_node.append(etree.XML(xml_string, parser=parser))
-    xml = (E.Replace(
-             E.CmdID('%s' % cmd_id),
-             E.Meta(
-               E.Type(media_type)
-               ),
-             E.Item(
-               elem_to_append,
-               data_node
-               )
-             ))
+      if isinstance(xml_string, etree.CDATA):
+        data_node.text = xml_string
+      else:
+        cdata = etree.CDATA(xml_string.decode('utf-8'))
+        data_node.text = cdata
+    main_tag = Element('{%s}%s' % (SYNCML_NAMESPACE, id_tag))
+    main_tag.append(E.CmdID('%s' % cmd_id))
+    main_tag.append(E.Meta(E.Type(media_type)))
+    main_tag.append(E.Item(E.Source(E.LocURI(gid)), data_node))
     if more_data:
-      item_node = xml.find('{%s}Item' % SYNCML_NAMESPACE)
+      item_node = main_tag.find('{%s}Item' % SYNCML_NAMESPACE)
       item_node.append(E.MoreData())
-    return etree.tostring(xml, encoding='utf-8', pretty_print=True)
+    return etree.tostring(main_tag, encoding='utf-8', pretty_print=True)
 
   def getXupdateObject(self, object_xml=None, old_xml=None):
     """