diff --git a/ChangeLog b/ChangeLog
index 65c20530a3..ea1a17963b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Oct 10 13:48:53 EST 2007 Daniel P. Berrange <berrange@redhat.com>
+
+	* src/xm_internal.c: Fixed procesing of vncunused, and vncdisplay
+	parameters in XM style config files for framebuffer config.
+
 Wed Oct 10 13:13:53 EST 2007 Daniel P. Berrange <berrange@redhat.com>
 
 	* src/xm_internal.c: Fix XML -> XM config file conversion to
diff --git a/src/xm_internal.c b/src/xm_internal.c
index b0dc0ad3c1..288359da09 100644
--- a/src/xm_internal.c
+++ b/src/xm_internal.c
@@ -924,7 +924,8 @@ char *xenXMDomainFormatXML(virConnectPtr conn, virConfPtr conf) {
         }
         if (xenXMConfigGetInt(conf, "sdl", &val) == 0 && val)
             sdl = 1;
-    } else { /* New PV guests use this format */
+    }
+    if (!hvm && !sdl && !vnc) { /* New PV guests use this format */
         list = virConfGetValue(conf, "vfb");
         if (list && list->type == VIR_CONF_LIST &&
             list->list && list->list->type == VIR_CONF_STRING &&
@@ -951,6 +952,8 @@ char *xenXMDomainFormatXML(virConnectPtr conn, virConfPtr conf) {
                     sdl = 1;
                 } else if (!strncmp(key, "type=vnc", 8)) {
                     vnc = 1;
+                } else if (!strncmp(key, "vncunused=", 10)) {
+                    vncunused = strtol(key+10, NULL, 10);
                 } else if (!strncmp(key, "vnclisten=", 10)) {
                     vnclisten = key + 10;
                 } else if (!strncmp(key, "vncpasswd=", 10)) {
@@ -958,11 +961,7 @@ char *xenXMDomainFormatXML(virConnectPtr conn, virConfPtr conf) {
                 } else if (!strncmp(key, "keymap=", 7)) {
                     keymap = key + 7;
                 } else if (!strncmp(key, "vncdisplay=", 11)) {
-                    int port = strtol(key+11, NULL, 10);
-                    if (port == -1)
-                        vncunused = 1;
-                    else
-                        port = port - 5900;
+                    vncdisplay = strtol(key+11, NULL, 10);
                 }
 
                 while (nextkey && (nextkey[0] == ',' ||
@@ -1943,11 +1942,18 @@ virConfPtr xenXMParseXMLToConfig(virConnectPtr conn, const char *xml) {
                                           "cannot set the keymap parameter") < 0)
             goto error;
 
-        /* XXX vncdisplay */
-        /*
-          if (xenXMConfigSetIntFromXPath(conn, conf, ctxt, "vncdisplay", "string(int(/domain/devices/graphics[@type='vnc']/@vncport) - 5900))", 0, 0) < 0)
-          goto error;
-        */
+        obj = xmlXPathEval(BAD_CAST "string(/domain/devices/graphics[@type='vnc']/@port)", ctxt);
+        if ((obj != NULL) && (obj->type == XPATH_STRING) &&
+            (obj->stringval != NULL)) {
+            int port = strtol((const char *)obj->stringval, NULL, 10);
+            if (port != -1) {
+                char portstr[50];
+                snprintf(portstr, sizeof(portstr), "%d", port-5900);
+                if (xenXMConfigSetString(conf, "vncdisplay", portstr) < 0)
+                    goto error;
+            }
+        }
+        xmlXPathFreeObject(obj);
     } else {
         virConfValuePtr vfb;
         obj = xmlXPathEval(BAD_CAST "/domain/devices/graphics", ctxt);
@@ -1990,8 +1996,11 @@ virConfPtr xenXMParseXMLToConfig(virConnectPtr conn, const char *xml) {
                         if (vncunused) {
                             strcat(val, ",vncunused=1");
                         } else {
+                            char portstr[50];
+                            int port = atoi((const char*)vncport);
+                            snprintf(portstr, sizeof(portstr), "%d", port-5900);
                             strcat(val, ",vncdisplay=");
-                            strcat(val, (const char*)vncport);
+                            strcat(val, portstr);
                         }
                         if (vncport)
                             xmlFree(vncport);