diff --git a/ChangeLog b/ChangeLog
index ae8fe2b4af..9b99299742 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Mon Dec  6 17:46:03 EST 2006 Daniel Berrange <berrange@redhat.com>
+
+	* src/xend_internal.c: Support parsing of new paravirt framebuffer
+	graphics configuration from xen 3.0.4 tree.
+	* test/sexpr2xmltest.c: Added test cases for new & old framebuffer
+	config parsing in paravirt & fullyvirt.
+	* test/sexpr2xmldata/sexpr2xml-pv-vfb-*: New test data files
+
 Mon Dec  6 17:40:03 EST 2006 Daniel Berrange <berrange@redhat.com>
 
 	* test/xml2sexprdata/xml2sexpr-curmem.xml, test/xml2sexprdata/xml2sexpr-curmem.sexpr:
diff --git a/src/xend_internal.c b/src/xend_internal.c
index 2f1fb5bf49..3e73ef3493 100644
--- a/src/xend_internal.c
+++ b/src/xend_internal.c
@@ -1736,6 +1736,19 @@ xend_parse_sexp_desc(virConnectPtr conn, struct sexpr *root, int xendConfigVersi
                                   tmp2);
 
             virBufferAdd(&buf, "    </interface>\n", 17);
+        } else if (!hvm &&
+                   sexpr_lookup(node, "device/vfb")) {
+            /* New style graphics config for PV guests only in 3.0.4 */
+            tmp = sexpr_node(node, "device/vfb/type");
+
+            if (tmp && !strcmp(tmp, "sdl")) {
+                virBufferAdd(&buf, "    <graphics type='sdl'/>\n", 27);
+            } else if (tmp && !strcmp(tmp, "vnc")) {
+                int port = xenStoreDomainGetVNCPort(conn, domid);
+                if (port == -1)
+                    port = 5900 + domid;
+                virBufferVSprintf(&buf, "    <graphics type='vnc' port='%d'/>\n", port);
+            }
         }
     }
 
@@ -1769,7 +1782,7 @@ xend_parse_sexp_desc(virConnectPtr conn, struct sexpr *root, int xendConfigVersi
         }
     }
 
-    /* Graphics device */
+    /* Graphics device (HVM, or old (pre-3.0.4) style PV vnc config) */
     tmp = sexpr_fmt_node(root, "domain/image/%s/vnc", hvm ? "hvm" : "linux");
     if (tmp != NULL) {
         if (tmp[0] == '1') {
@@ -1780,6 +1793,7 @@ xend_parse_sexp_desc(virConnectPtr conn, struct sexpr *root, int xendConfigVersi
         }
     }
 
+    /* Graphics device (HVM, or old (pre-3.0.4) style PV sdl config) */
     tmp = sexpr_fmt_node(root, "domain/image/%s/sdl", hvm ? "hvm" : "linux");
     if (tmp != NULL) {
         if (tmp[0] == '1')
diff --git a/tests/sexpr2xmldata/sexpr2xml-pv-vfb-new.sexpr b/tests/sexpr2xmldata/sexpr2xml-pv-vfb-new.sexpr
new file mode 100644
index 0000000000..d45d6a41dd
--- /dev/null
+++ b/tests/sexpr2xmldata/sexpr2xml-pv-vfb-new.sexpr
@@ -0,0 +1,2 @@
+(domain (domid 6)(name 'pvtest')(memory 420)(maxmem 420)(vcpus 2)(uuid '596a5d2171f48fb2e068e2386a5c413e')(on_poweroff 'destroy')(on_reboot 'destroy')(on_crash 'destroy')(image (linux (kernel '/var/lib/xen/vmlinuz.2Dn2YT')(ramdisk '/var/lib/xen/initrd.img.0u-Vhq')(args ' method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test/5.91/x86_64/os  ')))(device (vbd (dev 'xvda')(uname 'file:/root/some.img')(mode 'w')))(device (vfb (type vnc)(vncunused 1)(vnclisten 0.0.0.0)(vncpasswd 123456)))))
+
diff --git a/tests/sexpr2xmldata/sexpr2xml-pv-vfb-new.xml b/tests/sexpr2xmldata/sexpr2xml-pv-vfb-new.xml
new file mode 100644
index 0000000000..ee3926f18e
--- /dev/null
+++ b/tests/sexpr2xmldata/sexpr2xml-pv-vfb-new.xml
@@ -0,0 +1,23 @@
+<domain type='xen' id='6'>
+  <name>pvtest</name>
+  <uuid>596a5d2171f48fb2e068e2386a5c413e</uuid>
+  <os>
+    <type>linux</type>
+    <kernel>/var/lib/xen/vmlinuz.2Dn2YT</kernel>
+    <initrd>/var/lib/xen/initrd.img.0u-Vhq</initrd>
+    <cmdline> method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test/5.91/x86_64/os  </cmdline>
+  </os>
+  <memory>430080</memory>
+  <vcpu>2</vcpu>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>destroy</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <disk type='file' device='disk'>
+      <driver name='file'/>
+      <source file='/root/some.img'/>
+      <target dev='xvda'/>
+    </disk>
+    <graphics type='vnc' port='5906'/>
+  </devices>
+</domain>
diff --git a/tests/sexpr2xmldata/sexpr2xml-pv-vfb-orig.sexpr b/tests/sexpr2xmldata/sexpr2xml-pv-vfb-orig.sexpr
new file mode 100644
index 0000000000..edceadb284
--- /dev/null
+++ b/tests/sexpr2xmldata/sexpr2xml-pv-vfb-orig.sexpr
@@ -0,0 +1,2 @@
+(domain (domid 6)(name 'pvtest')(memory 420)(maxmem 420)(vcpus 2)(uuid '596a5d2171f48fb2e068e2386a5c413e')(on_poweroff 'destroy')(on_reboot 'destroy')(on_crash 'destroy')(image (linux (kernel '/var/lib/xen/vmlinuz.2Dn2YT')(ramdisk '/var/lib/xen/initrd.img.0u-Vhq')(args ' method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test/5.91/x86_64/os  ')(vnc 1)(vncunused 1)(vnclisten 0.0.0.0)(vncpasswd 123456)))(device (vbd (dev 'xvda')(uname 'file:/root/some.img')(mode 'w'))))
+
diff --git a/tests/sexpr2xmldata/sexpr2xml-pv-vfb-orig.xml b/tests/sexpr2xmldata/sexpr2xml-pv-vfb-orig.xml
new file mode 100644
index 0000000000..ee3926f18e
--- /dev/null
+++ b/tests/sexpr2xmldata/sexpr2xml-pv-vfb-orig.xml
@@ -0,0 +1,23 @@
+<domain type='xen' id='6'>
+  <name>pvtest</name>
+  <uuid>596a5d2171f48fb2e068e2386a5c413e</uuid>
+  <os>
+    <type>linux</type>
+    <kernel>/var/lib/xen/vmlinuz.2Dn2YT</kernel>
+    <initrd>/var/lib/xen/initrd.img.0u-Vhq</initrd>
+    <cmdline> method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test/5.91/x86_64/os  </cmdline>
+  </os>
+  <memory>430080</memory>
+  <vcpu>2</vcpu>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>destroy</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <disk type='file' device='disk'>
+      <driver name='file'/>
+      <source file='/root/some.img'/>
+      <target dev='xvda'/>
+    </disk>
+    <graphics type='vnc' port='5906'/>
+  </devices>
+</domain>
diff --git a/tests/sexpr2xmltest.c b/tests/sexpr2xmltest.c
index 3c968112c4..d8ab63233d 100644
--- a/tests/sexpr2xmltest.c
+++ b/tests/sexpr2xmltest.c
@@ -60,6 +60,20 @@ static int testComparePVversion2(void *data ATTRIBUTE_UNUSED) {
 			  2);
 }
 
+static int testComparePVOrigVFB(void *data ATTRIBUTE_UNUSED) {
+  return testCompareFiles("sexpr2xmldata/sexpr2xml-pv-vfb-orig.xml",
+                          "sexpr2xmldata/sexpr2xml-pv-vfb-orig.sexpr",
+                          2);
+}   
+
+
+static int testComparePVNewVFB(void *data ATTRIBUTE_UNUSED) {
+  return testCompareFiles("sexpr2xmldata/sexpr2xml-pv-vfb-new.xml",
+                          "sexpr2xmldata/sexpr2xml-pv-vfb-new.sexpr",
+                          3);
+}   
+
+
 static int testCompareFVversion2(void *data ATTRIBUTE_UNUSED) {
   return testCompareFiles("sexpr2xmldata/sexpr2xml-fv-v2.xml",
 			  "sexpr2xmldata/sexpr2xml-fv-v2.sexpr",
@@ -133,8 +147,15 @@ main(int argc, char **argv)
     if (virtTestRun("SEXPR-2-XML PV config (version 2)",
 		    1, testComparePVversion2, NULL) != 0)
 	ret = -1;
+    if (virtTestRun("SEXPR-2-XML PV config (Orig VFB)",
+                    1, testComparePVOrigVFB, NULL) != 0)
+        ret = -1;
 
-    if (virtTestRun("SEXPR-2-XML FV config  (version 2)",
+    if (virtTestRun("SEXPR-2-XML PV config (New VFB)",
+                    1, testComparePVNewVFB, NULL) != 0)
+        ret = -1;
+
+    if (virtTestRun("SEXPR-2-XML FV config (version 2)",
 		    1, testCompareFVversion2, NULL) != 0)
 	ret = -1;