diff --git a/src/hyperv/hyperv_wmi.c b/src/hyperv/hyperv_wmi.c
index 57125ae..7a02b0d 100644
--- a/src/hyperv/hyperv_wmi.c
+++ b/src/hyperv/hyperv_wmi.c
@@ -489,17 +489,14 @@ hypervSerializeSimpleParam(hypervParamPtr p, const char *resourceUri,
 
 static int
 hypervSerializeEprParam(hypervParamPtr p, hypervPrivate *priv,
-        const char *resourceUri, WsXmlDocH doc, WsXmlNodeH *methodNode)
+        const char *resourceUri, WsXmlNodeH *methodNode)
 {
     int result = -1;
     WsXmlNodeH xmlNodeParam = NULL,
                xmlNodeTemp = NULL,
                xmlNodeAddr = NULL,
                xmlNodeRef = NULL;
-    xmlNodePtr xmlNodeAddrPtr = NULL,
-               xmlNodeRefPtr = NULL;
     WsXmlDocH xmlDocResponse = NULL;
-    xmlDocPtr docPtr = (xmlDocPtr) doc->parserDoc;
     WsXmlNsH ns = NULL;
     client_opt_t *options = NULL;
     filter_t *filter = NULL;
@@ -573,11 +570,6 @@ hypervSerializeEprParam(hypervParamPtr p, hypervPrivate *priv,
         goto cleanup;
     }
 
-    if (!(xmlNodeAddrPtr = xmlDocCopyNode((xmlNodePtr) xmlNodeAddr, docPtr, 1))) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not copy EPR address"));
-        goto cleanup;
-    }
-
     if (!(xmlNodeRef = ws_xml_get_child(xmlNodeTemp, 0, XML_NS_ADDRESSING,
             WSA_REFERENCE_PARAMETERS))) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@@ -585,12 +577,6 @@ hypervSerializeEprParam(hypervParamPtr p, hypervPrivate *priv,
         goto cleanup;
     }
 
-    if (!(xmlNodeRefPtr = xmlDocCopyNode((xmlNodePtr) xmlNodeRef, docPtr, 1))) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                _("Could not copy EPR item reference parameters"));
-        goto cleanup;
-    }
-
     /* now build a new xml doc with the EPR node children */
     if (!(xmlNodeParam = ws_xml_add_child(*methodNode, resourceUri,
                     p->epr.name, NULL))) {
@@ -613,23 +599,8 @@ hypervSerializeEprParam(hypervParamPtr p, hypervPrivate *priv,
         goto cleanup;
     }
 
-    if (xmlAddChild((xmlNodePtr) *methodNode, (xmlNodePtr) xmlNodeParam) == NULL) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                _("Could not add child to xml parent node"));
-        goto cleanup;
-    }
-
-    if (xmlAddChild((xmlNodePtr) xmlNodeParam, xmlNodeAddrPtr) == NULL) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                _("Could not add child to xml parent node"));
-        goto cleanup;
-    }
-
-    if (xmlAddChild((xmlNodePtr) xmlNodeParam, xmlNodeRefPtr) == NULL) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                _("Could not add child to xml parent node"));
-        goto cleanup;
-    }
+    ws_xml_copy_node(xmlNodeAddr, xmlNodeParam);
+    ws_xml_copy_node(xmlNodeRef, xmlNodeParam);
 
     /* we did it! */
     result = 0;
@@ -656,8 +627,7 @@ hypervSerializeEmbeddedParam(hypervParamPtr p, const char *resourceUri,
                xmlNodeArray = NULL;
     WsXmlDocH xmlDocTemp = NULL,
               xmlDocCdata = NULL;
-    xmlBufferPtr xmlBufferNode = NULL;
-    const xmlChar *xmlCharCdataContent = NULL;
+    char *xmlCharCdataContent = NULL;
     xmlNodePtr xmlNodeCdata = NULL;
     hypervWmiClassInfoPtr classInfo = p->embedded.info;
     virHashKeyValuePairPtr items = NULL;
@@ -761,25 +731,19 @@ hypervSerializeEmbeddedParam(hypervParamPtr p, const char *resourceUri,
     }
 
     /* create CDATA node */
-    xmlBufferNode = xmlBufferCreate();
-    if (xmlNodeDump(xmlBufferNode, (xmlDocPtr) xmlDocTemp->parserDoc,
-                (xmlNodePtr) xmlNodeInstance, 0, 0) < 0) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                _("Could not get root of temp XML doc"));
-        goto cleanup;
-    }
+    ws_xml_dump_memory_enc(xmlDocTemp, &xmlCharCdataContent, &len, "UTF-8");
 
-    len = xmlBufferLength(xmlBufferNode);
-    xmlCharCdataContent = xmlBufferContent(xmlBufferNode);
     if (!(xmlNodeCdata = xmlNewCDataBlock((xmlDocPtr) xmlDocCdata,
-                    xmlCharCdataContent, len))) {
+                    (xmlChar *)xmlCharCdataContent, len))) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                 _("Could not create CDATA element"));
         goto cleanup;
     }
 
     /* Add CDATA node to the doc root */
-    if (!(xmlAddChild((xmlNodePtr) xmlNodeParam, xmlNodeCdata))) {
+    /* FIXME: there is no openwsman wrapper for xmlNewCDataBlock, instead
+     *        silence clang by casting to a void pointer first */
+    if (!(xmlAddChild((xmlNodePtr)(void *)xmlNodeParam, xmlNodeCdata))) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                 _("Could not add CDATA to doc root"));
         goto cleanup;
@@ -792,7 +756,7 @@ hypervSerializeEmbeddedParam(hypervParamPtr p, const char *resourceUri,
     VIR_FREE(items);
     ws_xml_destroy_doc(xmlDocCdata);
     ws_xml_destroy_doc(xmlDocTemp);
-    xmlBufferFree(xmlBufferNode);
+    ws_xml_free_memory(xmlCharCdataContent);
     return result;
 }
 
@@ -854,7 +818,7 @@ hypervInvokeMethod(hypervPrivate *priv, hypervInvokeParamsListPtr params,
                 break;
             case HYPERV_EPR_PARAM:
                 if (hypervSerializeEprParam(p, priv, params->resourceUri,
-                            paramsDocRoot, &methodNode) < 0)
+                                            &methodNode) < 0)
                     goto cleanup;
                 break;
             case HYPERV_EMBEDDED_PARAM:
