diff -urN --exclude=CVS --exclude=.git --exclude='*.pem' --exclude=demoCA --exclude=.gitignore --exclude='*.orig' --exclude='*.bak' libvirt-cvs/proxy/libvirt_proxy.c libvirt-open-noisy/proxy/libvirt_proxy.c
--- libvirt-cvs/proxy/libvirt_proxy.c	2007-04-04 15:39:43.000000000 +0100
+++ libvirt-open-noisy/proxy/libvirt_proxy.c	2007-04-30 12:19:18.000000000 +0100
@@ -587,6 +587,29 @@
 		req->len = sizeof(virProxyPacket) + sizeof(virNodeInfo);
 	    }
 	    break;
+
+	case VIR_PROXY_GET_CAPABILITIES:
+	    if (req->len != sizeof(virProxyPacket))
+	        goto comm_error;
+
+        xml = xenHypervisorGetCapabilities (conn);
+        if (!xml) {
+            req->data.arg = -1;
+            req->len = sizeof (virProxyPacket);
+        } else {
+            int xmllen = strlen (xml);
+            if (xmllen > (int) sizeof (request.extra.str)) {
+                req->data.arg = -2;
+                req->len = sizeof (virProxyPacket);
+            } else {
+                req->data.arg = 0;
+                memmove (request.extra.str, xml, xmllen);
+                req->len = sizeof (virProxyPacket) + xmllen;
+            }
+            free (xml);
+        }
+        break;
+
 	case VIR_PROXY_DOMAIN_XML:
 	    if (req->len != sizeof(virProxyPacket))
 	        goto comm_error;
diff -urN --exclude=CVS --exclude=.git --exclude='*.pem' --exclude=demoCA --exclude=.gitignore --exclude='*.orig' --exclude='*.bak' libvirt-cvs/src/proxy_internal.c libvirt-open-noisy/src/proxy_internal.c
--- libvirt-cvs/src/proxy_internal.c	2007-04-04 15:39:43.000000000 +0100
+++ libvirt-open-noisy/src/proxy_internal.c	2007-04-30 12:21:28.000000000 +0100
@@ -31,6 +31,7 @@
 static int xenProxyOpen(virConnectPtr conn, const char *name, int flags);
 static int xenProxyGetVersion(virConnectPtr conn, unsigned long *hvVer);
 static int xenProxyNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info);
+static char *xenProxyGetCapabilities(virConnectPtr conn);
 static int xenProxyListDomains(virConnectPtr conn, int *ids, int maxids);
 static int xenProxyNumOfDomains(virConnectPtr conn);
 static virDomainPtr xenProxyLookupByID(virConnectPtr conn, int id);
@@ -53,7 +54,7 @@
     xenProxyGetVersion, /* version */
     NULL, /* getMaxVcpus */
     xenProxyNodeGetInfo, /* nodeGetInfo */
-    NULL, /* getCapabilities */
+    xenProxyGetCapabilities, /* getCapabilities */
     xenProxyListDomains, /* listDomains */
     xenProxyNumOfDomains, /* numOfDomains */
     NULL, /* domainCreateLinux */
@@ -977,6 +976,55 @@
 }
 
 /**
+ * xenProxyGetCapabilities:
+ * @conn: pointer to the Xen Daemon block
+ * 
+ * Extract capabilities of the hypervisor.
+ *
+ * Returns capabilities in case of success (freed by caller)
+ * and NULL in case of failure.
+ */
+static char *
+xenProxyGetCapabilities (virConnectPtr conn)
+{
+    virProxyPacket req;
+    virProxyFullPacket ans;
+    int ret, xmllen;
+    char *xml;
+
+    if (!VIR_IS_CONNECT(conn)) {
+        virProxyError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
+        return NULL;
+    }
+    memset(&req, 0, sizeof(req));
+    req.command = VIR_PROXY_GET_CAPABILITIES;
+    req.data.arg = 0;
+    req.len = sizeof(req);
+    ret = xenProxyCommand(conn, &req, &ans, 0);
+    if (ret < 0) {
+        xenProxyClose(conn);
+        return NULL;
+    }
+    if (ans.data.arg == -1)
+        return NULL;
+    if (ans.len <= sizeof(virProxyPacket)) {
+        virProxyError(conn, VIR_ERR_OPERATION_FAILED, __FUNCTION__);
+        return NULL;
+    }
+
+    xmllen = ans.len - sizeof (virProxyPacket);
+    xml = malloc (xmllen+1);
+    if (!xml) {
+        virProxyError (conn, VIR_ERR_NO_MEMORY, __FUNCTION__);
+        return NULL;
+    }
+    memmove (xml, ans.extra.str, xmllen);
+    xml[xmllen] = '\0';
+
+    return xml;
+}
+
+/**
  * xenProxyDomainDumpXML:
  * @domain: a domain object
  * @flags: xml generation flags
diff -urN --exclude=CVS --exclude=.git --exclude='*.pem' --exclude=demoCA --exclude=.gitignore --exclude='*.orig' --exclude='*.bak' libvirt-cvs/src/proxy_internal.h libvirt-open-noisy/src/proxy_internal.h
--- libvirt-cvs/src/proxy_internal.h	2007-04-04 15:39:43.000000000 +0100
+++ libvirt-open-noisy/src/proxy_internal.h	2007-04-30 12:10:13.000000000 +0100
@@ -36,7 +36,8 @@
 	VIR_PROXY_MAX_MEMORY = 8,
 	VIR_PROXY_DOMAIN_INFO = 9,
 	VIR_PROXY_DOMAIN_XML = 10,
-	VIR_PROXY_DOMAIN_OSTYPE = 11
+	VIR_PROXY_DOMAIN_OSTYPE = 11,
+    VIR_PROXY_GET_CAPABILITIES = 12
 } virProxyCommand;
 
 /*
