diff --git a/.cvsignore b/.cvsignore
index 2fdf983..63d6e7e 100644
--- a/.cvsignore
+++ b/.cvsignore
@@ -7,3 +7,4 @@ libvirt-0.6.0.tar.gz
 libvirt-0.6.1.tar.gz
 libvirt-0.6.2.tar.gz
 libvirt-0.6.3.tar.gz
+libvirt-0.6.4.tar.gz
diff --git a/libvirt-0.6.3-bring-up-ipless-bridge.patch b/libvirt-0.6.3-bring-up-ipless-bridge.patch
deleted file mode 100644
index 3b8d3d2..0000000
--- a/libvirt-0.6.3-bring-up-ipless-bridge.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From 4db7474b0c1907e877d7206edeb4d73962971096 Mon Sep 17 00:00:00 2001
-From: Daniel Veillard <veillard@redhat.com>
-Date: Tue, 12 May 2009 15:31:22 +0000
-Subject: [PATCH 1/1] * src/network_driver.c: enable bridges which are not up
-   without an IP address, patch by Ludwig Nussel
- Daniel
-
----
- src/network_driver.c |    9 +++------
- 1 files changed, 3 insertions(+), 6 deletions(-)
-
-diff --git a/src/network_driver.c b/src/network_driver.c
-index a17a769..a163b15 100644
---- a/src/network_driver.c
-+++ b/src/network_driver.c
-@@ -836,8 +836,7 @@ static int networkStartNetworkDaemon(virConnectPtr conn,
-         goto err_delbr;
-     }
- 
--    if (network->def->ipAddress &&
--        (err = brSetInterfaceUp(driver->brctl, network->def->bridge, 1))) {
-+    if ((err = brSetInterfaceUp(driver->brctl, network->def->bridge, 1))) {
-         virReportSystemError(conn, err,
-                              _("failed to bring the bridge '%s' up"),
-                              network->def->bridge);
-@@ -878,8 +877,7 @@ static int networkStartNetworkDaemon(virConnectPtr conn,
-     networkRemoveIptablesRules(driver, network);
- 
-  err_delbr1:
--    if (network->def->ipAddress &&
--        (err = brSetInterfaceUp(driver->brctl, network->def->bridge, 0))) {
-+    if ((err = brSetInterfaceUp(driver->brctl, network->def->bridge, 0))) {
-         char ebuf[1024];
-         networkLog(NETWORK_WARN, _("Failed to bring down bridge '%s' : %s\n"),
-                  network->def->bridge, virStrerror(err, ebuf, sizeof ebuf));
-@@ -920,8 +918,7 @@ static int networkShutdownNetworkDaemon(virConnectPtr conn,
-     networkRemoveIptablesRules(driver, network);
- 
-     char ebuf[1024];
--    if (network->def->ipAddress &&
--        (err = brSetInterfaceUp(driver->brctl, network->def->bridge, 0))) {
-+    if ((err = brSetInterfaceUp(driver->brctl, network->def->bridge, 0))) {
-         networkLog(NETWORK_WARN, _("Failed to bring down bridge '%s' : %s\n"),
-                  network->def->bridge, virStrerror(err, ebuf, sizeof ebuf));
-     }
--- 
-1.6.0.6
-
diff --git a/libvirt-0.6.3-enable-qemu-0-10-migration.patch b/libvirt-0.6.3-enable-qemu-0-10-migration.patch
deleted file mode 100644
index 98db412..0000000
--- a/libvirt-0.6.3-enable-qemu-0-10-migration.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From: "Daniel P. Berrange" <berrange@redhat.com>
-To: libvir-list@redhat.com
-Date: Thu, 30 Apr 2009 15:09:05 +0100
-Subject: [libvirt] PATCH: Enable migration with QEMU >= 0.10.0
-
-The KVM migration code was added to QEMU for the 0.10.0 release, so we 
-should enable this in libvirt now.
-
-Daniel
-
-diff -r be7993675e07 src/qemu_conf.c
---- a/src/qemu_conf.c	Thu Apr 30 14:49:27 2009 +0100
-+++ b/src/qemu_conf.c	Thu Apr 30 15:08:45 2009 +0100
-@@ -473,16 +473,13 @@ int qemudExtractVersionInfo(const char *
- 
-     /*
-      * Handling of -incoming arg with varying features
--     *  -incoming tcp    (kvm >= 79)
--     *  -incoming exec   (kvm >= 80)
-+     *  -incoming tcp    (kvm >= 79, qemu >= 0.10.0)
-+     *  -incoming exec   (kvm >= 80, qemu >= 0.10.0)
-      *  -incoming stdio  (all earlier kvm)
-      *
-      * NB, there was a pre-kvm-79 'tcp' support, but it
-      * was broken, because it blocked the monitor console
-      * while waiting for data, so pretend it doesn't exist
--     *
--     * XXX when next QEMU release after 0.9.1 arrives,
--     * we'll need to add MIGRATE_QEMU_TCP/EXEC here too
-      */
-     if (kvm_version >= 79) {
-         flags |= QEMUD_CMD_FLAG_MIGRATE_QEMU_TCP;
-@@ -490,6 +487,9 @@ int qemudExtractVersionInfo(const char *
-             flags |= QEMUD_CMD_FLAG_MIGRATE_QEMU_EXEC;
-     } else if (kvm_version > 0) {
-         flags |= QEMUD_CMD_FLAG_MIGRATE_KVM_STDIO;
-+    } else if (version >= 10000) {
-+        flags |= QEMUD_CMD_FLAG_MIGRATE_QEMU_TCP;
-+        flags |= QEMUD_CMD_FLAG_MIGRATE_QEMU_EXEC;
-     }
- 
-     if (retversion)
-
-
--- 
diff --git a/libvirt-0.6.3-event-handling-1.patch b/libvirt-0.6.3-event-handling-1.patch
deleted file mode 100644
index 4104a6b..0000000
--- a/libvirt-0.6.3-event-handling-1.patch
+++ /dev/null
@@ -1,144 +0,0 @@
-From e7be6cc841a5652b73ddd2ccd3769c7f8bbad13d Mon Sep 17 00:00:00 2001
-From: Daniel P. Berrange <berrange@redhat.com>
-Date: Tue, 12 May 2009 16:41:49 +0000
-Subject: [PATCH 1/2] Fix interrupting of main event thread & protect against accidental uniniitalized variables
-
----
- qemud/event.c |   42 +++++++++++++++++++++++++++++++++++-------
- 1 files changed, 35 insertions(+), 7 deletions(-)
-
-diff --git a/qemud/event.c b/qemud/event.c
-index 65f548e..754f2b1 100644
---- a/qemud/event.c
-+++ b/qemud/event.c
-@@ -84,10 +84,10 @@ struct virEventLoop {
- static struct virEventLoop eventLoop;
- 
- /* Unique ID for the next FD watch to be registered */
--static int nextWatch = 0;
-+static int nextWatch = 1;
- 
- /* Unique ID for the next timer to be registered */
--static int nextTimer = 0;
-+static int nextTimer = 1;
- 
- static void virEventLock(void)
- {
-@@ -143,15 +143,22 @@ int virEventAddHandleImpl(int fd, int events,
- 
- void virEventUpdateHandleImpl(int watch, int events) {
-     int i;
-+    EVENT_DEBUG("Update handle w=%d e=%d", watch, events);
-+
-+    if (watch <= 0) {
-+        VIR_WARN("Ignoring invalid update watch %d", watch);
-+        return;
-+    }
-+
-     virEventLock();
-     for (i = 0 ; i < eventLoop.handlesCount ; i++) {
-         if (eventLoop.handles[i].watch == watch) {
-             eventLoop.handles[i].events =
-                     virEventHandleTypeToPollEvent(events);
-+            virEventInterruptLocked();
-             break;
-         }
-     }
--    virEventInterruptLocked();
-     virEventUnlock();
- }
- 
-@@ -164,6 +171,12 @@ void virEventUpdateHandleImpl(int watch, int events) {
- int virEventRemoveHandleImpl(int watch) {
-     int i;
-     EVENT_DEBUG("Remove handle %d", watch);
-+
-+    if (watch <= 0) {
-+        VIR_WARN("Ignoring invalid remove watch %d", watch);
-+        return -1;
-+    }
-+
-     virEventLock();
-     for (i = 0 ; i < eventLoop.handlesCount ; i++) {
-         if (eventLoop.handles[i].deleted)
-@@ -172,11 +185,11 @@ int virEventRemoveHandleImpl(int watch) {
-         if (eventLoop.handles[i].watch == watch) {
-             EVENT_DEBUG("mark delete %d %d", i, eventLoop.handles[i].fd);
-             eventLoop.handles[i].deleted = 1;
-+            virEventInterruptLocked();
-             virEventUnlock();
-             return 0;
-         }
-     }
--    virEventInterruptLocked();
-     virEventUnlock();
-     return -1;
- }
-@@ -232,6 +245,12 @@ void virEventUpdateTimeoutImpl(int timer, int frequency) {
-     struct timeval tv;
-     int i;
-     EVENT_DEBUG("Updating timer %d timeout with %d ms freq", timer, frequency);
-+
-+    if (timer <= 0) {
-+        VIR_WARN("Ignoring invalid update timer %d", timer);
-+        return;
-+    }
-+
-     if (gettimeofday(&tv, NULL) < 0) {
-         return;
-     }
-@@ -244,10 +263,10 @@ void virEventUpdateTimeoutImpl(int timer, int frequency) {
-                 frequency >= 0 ? frequency +
-                 (((unsigned long long)tv.tv_sec)*1000) +
-                 (((unsigned long long)tv.tv_usec)/1000) : 0;
-+            virEventInterruptLocked();
-             break;
-         }
-     }
--    virEventInterruptLocked();
-     virEventUnlock();
- }
- 
-@@ -260,6 +279,12 @@ void virEventUpdateTimeoutImpl(int timer, int frequency) {
- int virEventRemoveTimeoutImpl(int timer) {
-     int i;
-     EVENT_DEBUG("Remove timer %d", timer);
-+
-+    if (timer <= 0) {
-+        VIR_WARN("Ignoring invalid remove timer %d", timer);
-+        return -1;
-+    }
-+
-     virEventLock();
-     for (i = 0 ; i < eventLoop.timeoutsCount ; i++) {
-         if (eventLoop.timeouts[i].deleted)
-@@ -267,11 +292,11 @@ int virEventRemoveTimeoutImpl(int timer) {
- 
-         if (eventLoop.timeouts[i].timer == timer) {
-             eventLoop.timeouts[i].deleted = 1;
-+            virEventInterruptLocked();
-             virEventUnlock();
-             return 0;
-         }
-     }
--    virEventInterruptLocked();
-     virEventUnlock();
-     return -1;
- }
-@@ -617,9 +642,12 @@ static int virEventInterruptLocked(void)
-     char c = '\0';
- 
-     if (!eventLoop.running ||
--        pthread_self() == eventLoop.leader)
-+        pthread_self() == eventLoop.leader) {
-+        VIR_DEBUG("Skip interrupt, %d %d", eventLoop.running, (int)eventLoop.leader);
-         return 0;
-+    }
- 
-+    VIR_DEBUG0("Interrupting");
-     if (safewrite(eventLoop.wakeupfd[1], &c, sizeof(c)) != sizeof(c))
-         return -1;
-     return 0;
--- 
-1.6.0.6
-
diff --git a/libvirt-0.6.3-event-handling-2.patch b/libvirt-0.6.3-event-handling-2.patch
deleted file mode 100644
index ddcede6..0000000
--- a/libvirt-0.6.3-event-handling-2.patch
+++ /dev/null
@@ -1,197 +0,0 @@
-From 6483ee77ed12f037d68a6adc690624fa1b508dc0 Mon Sep 17 00:00:00 2001
-From: Daniel P. Berrange <berrange@redhat.com>
-Date: Tue, 12 May 2009 16:43:04 +0000
-Subject: [PATCH 2/2] Fix watch/timer event deletion
-
----
- qemud/event.c |  112 ++++++++++++++++++++++++++-------------------------------
- 1 files changed, 51 insertions(+), 61 deletions(-)
-
-diff --git a/qemud/event.c b/qemud/event.c
-index 754f2b1..a57d967 100644
---- a/qemud/event.c
-+++ b/qemud/event.c
-@@ -313,7 +313,7 @@ static int virEventCalculateTimeout(int *timeout) {
-     EVENT_DEBUG("Calculate expiry of %d timers", eventLoop.timeoutsCount);
-     /* Figure out if we need a timeout */
-     for (i = 0 ; i < eventLoop.timeoutsCount ; i++) {
--        if (eventLoop.timeouts[i].deleted || eventLoop.timeouts[i].frequency < 0)
-+        if (eventLoop.timeouts[i].frequency < 0)
-             continue;
- 
-         EVENT_DEBUG("Got a timeout scheduled for %llu", eventLoop.timeouts[i].expiresAt);
-@@ -350,32 +350,26 @@ static int virEventCalculateTimeout(int *timeout) {
-  * file handles. The caller must free the returned data struct
-  * returns: the pollfd array, or NULL on error
-  */
--static int virEventMakePollFDs(struct pollfd **retfds) {
-+static struct pollfd *virEventMakePollFDs(void) {
-     struct pollfd *fds;
--    int i, nfds = 0;
-+    int i;
- 
--    for (i = 0 ; i < eventLoop.handlesCount ; i++) {
--        if (eventLoop.handles[i].deleted)
--            continue;
--        nfds++;
--    }
--    *retfds = NULL;
-     /* Setup the poll file handle data structs */
--    if (VIR_ALLOC_N(fds, nfds) < 0)
--        return -1;
-+    if (VIR_ALLOC_N(fds, eventLoop.handlesCount) < 0)
-+        return NULL;
- 
--    for (i = 0, nfds = 0 ; i < eventLoop.handlesCount ; i++) {
--        if (eventLoop.handles[i].deleted)
--            continue;
--        fds[nfds].fd = eventLoop.handles[i].fd;
--        fds[nfds].events = eventLoop.handles[i].events;
--        fds[nfds].revents = 0;
-+    for (i = 0 ; i < eventLoop.handlesCount ; i++) {
-+        EVENT_DEBUG("Prepare n=%d w=%d, f=%d e=%d", i,
-+                    eventLoop.handles[i].watch,
-+                    eventLoop.handles[i].fd,
-+                    eventLoop.handles[i].events);
-+        fds[i].fd = eventLoop.handles[i].fd;
-+        fds[i].events = eventLoop.handles[i].events;
-+        fds[i].revents = 0;
-         //EVENT_DEBUG("Wait for %d %d", eventLoop.handles[i].fd, eventLoop.handles[i].events);
--        nfds++;
-     }
- 
--    *retfds = fds;
--    return nfds;
-+    return fds;
- }
- 
- 
-@@ -435,26 +429,30 @@ static int virEventDispatchTimeouts(void) {
-  * Returns 0 upon success, -1 if an error occurred
-  */
- static int virEventDispatchHandles(int nfds, struct pollfd *fds) {
--    int i, n;
-+    int i;
- 
--    for (i = 0, n = 0 ; i < eventLoop.handlesCount && n < nfds ; i++) {
-+    /* NB, use nfds not eventLoop.handlesCount, because new
-+     * fds might be added on end of list, and they're not
-+     * in the fds array we've got */
-+    for (i = 0 ; i < nfds ; i++) {
-         if (eventLoop.handles[i].deleted) {
--            EVENT_DEBUG("Skip deleted %d", eventLoop.handles[i].fd);
-+            EVENT_DEBUG("Skip deleted n=%d w=%d f=%d", i,
-+                        eventLoop.handles[i].watch, eventLoop.handles[i].fd);
-             continue;
-         }
- 
--        if (fds[n].revents) {
-+        if (fds[i].revents) {
-             virEventHandleCallback cb = eventLoop.handles[i].cb;
-             void *opaque = eventLoop.handles[i].opaque;
--            int hEvents = virPollEventToEventHandleType(fds[n].revents);
--            EVENT_DEBUG("Dispatch %d %d %p", fds[n].fd,
--                        fds[n].revents, eventLoop.handles[i].opaque);
-+            int hEvents = virPollEventToEventHandleType(fds[i].revents);
-+            EVENT_DEBUG("Dispatch n=%d f=%d w=%d e=%d %p", i,
-+                        fds[i].fd, eventLoop.handles[i].watch,
-+                        fds[i].revents, eventLoop.handles[i].opaque);
-             virEventUnlock();
-             (cb)(eventLoop.handles[i].watch,
--                 fds[n].fd, hEvents, opaque);
-+                 fds[i].fd, hEvents, opaque);
-             virEventLock();
-         }
--        n++;
-     }
- 
-     return 0;
-@@ -545,22 +543,21 @@ static int virEventCleanupHandles(void) {
-  * at least one file handle has an event, or a timer expires
-  */
- int virEventRunOnce(void) {
--    struct pollfd *fds;
-+    struct pollfd *fds = NULL;
-     int ret, timeout, nfds;
- 
-     virEventLock();
-     eventLoop.running = 1;
-     eventLoop.leader = pthread_self();
--    if ((nfds = virEventMakePollFDs(&fds)) < 0) {
--        virEventUnlock();
--        return -1;
--    }
- 
--    if (virEventCalculateTimeout(&timeout) < 0) {
--        VIR_FREE(fds);
--        virEventUnlock();
--        return -1;
--    }
-+    if (virEventCleanupTimeouts() < 0 ||
-+        virEventCleanupHandles() < 0)
-+        goto error;
-+
-+    if (!(fds = virEventMakePollFDs()) ||
-+        virEventCalculateTimeout(&timeout) < 0)
-+        goto error;
-+    nfds = eventLoop.handlesCount;
- 
-     virEventUnlock();
- 
-@@ -572,38 +569,31 @@ int virEventRunOnce(void) {
-         if (errno == EINTR) {
-             goto retry;
-         }
--        VIR_FREE(fds);
--        return -1;
-+        goto error_unlocked;
-     }
- 
-     virEventLock();
--    if (virEventDispatchTimeouts() < 0) {
--        VIR_FREE(fds);
--        virEventUnlock();
--        return -1;
--    }
-+    if (virEventDispatchTimeouts() < 0)
-+        goto error;
- 
-     if (ret > 0 &&
--        virEventDispatchHandles(nfds, fds) < 0) {
--        VIR_FREE(fds);
--        virEventUnlock();
--        return -1;
--    }
--    VIR_FREE(fds);
--
--    if (virEventCleanupTimeouts() < 0) {
--        virEventUnlock();
--        return -1;
--    }
-+        virEventDispatchHandles(nfds, fds) < 0)
-+        goto error;
- 
--    if (virEventCleanupHandles() < 0) {
--        virEventUnlock();
--        return -1;
--    }
-+    if (virEventCleanupTimeouts() < 0 ||
-+        virEventCleanupHandles() < 0)
-+        goto error;
- 
-     eventLoop.running = 0;
-     virEventUnlock();
-+    VIR_FREE(fds);
-     return 0;
-+
-+error:
-+    virEventUnlock();
-+error_unlocked:
-+    VIR_FREE(fds);
-+    return -1;
- }
- 
- static void virEventHandleWakeup(int watch ATTRIBUTE_UNUSED,
--- 
-1.6.0.6
-
diff --git a/libvirt-0.6.3-fix-qemu-argv-detection-with-kvm-85.patch b/libvirt-0.6.3-fix-qemu-argv-detection-with-kvm-85.patch
deleted file mode 100644
index 5c532a5..0000000
--- a/libvirt-0.6.3-fix-qemu-argv-detection-with-kvm-85.patch
+++ /dev/null
@@ -1,82 +0,0 @@
-From 2b3fcdc378e7bec5c1a78b81632756e92930fd24 Mon Sep 17 00:00:00 2001
-From: Daniel P. Berrange <berrange@redhat.com>
-Date: Mon, 11 May 2009 15:14:24 +0000
-Subject: [PATCH 1/1] Fix QEMU ARGV detection with kvm >= 85
-
----
- src/qemu_conf.c   |   18 ++++++++++++++----
- src/qemu_driver.c |   12 ++----------
- 2 files changed, 16 insertions(+), 14 deletions(-)
-
-diff --git a/src/qemu_conf.c b/src/qemu_conf.c
-index 9cb71eb..a57d3ab 100644
---- a/src/qemu_conf.c
-+++ b/src/qemu_conf.c
-@@ -431,18 +431,28 @@ int qemudExtractVersionInfo(const char *qemu,
-         return -1;
- 
-     char *help = NULL;
--    enum { MAX_HELP_OUTPUT_SIZE = 8192 };
-+    enum { MAX_HELP_OUTPUT_SIZE = 1024*64 };
-     int len = virFileReadLimFD(newstdout, MAX_HELP_OUTPUT_SIZE, &help);
--    if (len < 0)
-+    if (len < 0) {
-+        virReportSystemError(NULL, errno, "%s",
-+                             _("Unable to read QEMU help output"));
-         goto cleanup2;
-+    }
- 
-     if (sscanf(help, "QEMU PC emulator version %u.%u.%u (kvm-%u)",
-                &major, &minor, &micro, &kvm_version) != 4)
-         kvm_version = 0;
- 
--    if (!kvm_version && sscanf(help, "QEMU PC emulator version %u.%u.%u",
--               &major, &minor, &micro) != 3)
-+    if (!kvm_version &&
-+        sscanf(help, "QEMU PC emulator version %u.%u.%u",
-+               &major, &minor, &micro) != 3) {
-+        char *eol = strchr(help, '\n');
-+        if (eol) *eol = '\0';
-+        qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
-+                         _("cannot parse QEMU version number in '%s'"),
-+                         help);
-         goto cleanup2;
-+    }
- 
-     version = (major * 1000 * 1000) + (minor * 1000) + micro;
- 
-diff --git a/src/qemu_driver.c b/src/qemu_driver.c
-index 30642d5..bd60b29 100644
---- a/src/qemu_driver.c
-+++ b/src/qemu_driver.c
-@@ -1391,12 +1391,8 @@ static int qemudStartVMDaemon(virConnectPtr conn,
- 
-     if (qemudExtractVersionInfo(emulator,
-                                 NULL,
--                                &qemuCmdFlags) < 0) {
--        qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
--                         _("Cannot determine QEMU argv syntax %s"),
--                         emulator);
-+                                &qemuCmdFlags) < 0)
-         goto cleanup;
--    }
- 
-     if (qemuPrepareHostDevices(conn, vm->def) < 0)
-         goto cleanup;
-@@ -3715,12 +3711,8 @@ static int qemudDomainChangeEjectableMedia(virConnectPtr conn,
- 
-     if (qemudExtractVersionInfo(vm->def->emulator,
-                                 NULL,
--                                &qemuCmdFlags) < 0) {
--        qemudReportError(conn, dom, NULL, VIR_ERR_INTERNAL_ERROR,
--                         _("Cannot determine QEMU argv syntax %s"),
--                         vm->def->emulator);
-+                                &qemuCmdFlags) < 0)
-         return -1;
--    }
- 
-     if (qemuCmdFlags & QEMUD_CMD_FLAG_DRIVE) {
-         if (!(devname = qemudDiskDeviceName(conn, newdisk)))
--- 
-1.6.0.6
-
diff --git a/libvirt-0.6.3-hostdev-managed.patch b/libvirt-0.6.3-hostdev-managed.patch
deleted file mode 100644
index 4d62aaa..0000000
--- a/libvirt-0.6.3-hostdev-managed.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From 3d7771e0570e09096ad9391a857dad48b150bc0c Mon Sep 17 00:00:00 2001
-From: Mark McLoughlin <markmc@redhat.com>
-Date: Wed, 6 May 2009 16:33:28 +0100
-Subject: [PATCH] Fix qemu driver's interpretation of <hostdev managed='yes'/>
-
-This change:
-
-  Tue Mar  3 08:55:13 GMT 2009 Daniel P. Berrange <berrange@redhat.com>
-
-       Don't try to detach & reset PCI devices while running test
-       suite for XML-> ARGV conversion.
-       * src/qemu_driver.c: Add qemuPrepareHostDevices() helper to
-       detach and reset PCI devices.
-       * src/qemu_conf.c: Don't detach & reset PCI devices while
-       building the command line argv
-
-accidentally did this:
-
--            if (hostdev->managed) {
-+        if (!hostdev->managed) {
-
-Which results in managed='yes' not causing the device to be
-detached when the guest is starting.
-
-Signed-off-by: Mark McLoughlin <markmc@redhat.com>
----
- src/qemu_driver.c |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-diff --git a/src/qemu_driver.c b/src/qemu_driver.c
-index 5898026..59312c0 100644
---- a/src/qemu_driver.c
-+++ b/src/qemu_driver.c
-@@ -1215,7 +1215,7 @@ static int qemuPrepareHostDevices(virConnectPtr conn,
-         if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
-             continue;
- 
--        if (!hostdev->managed) {
-+        if (hostdev->managed) {
-             pciDevice *dev = pciGetDevice(conn,
-                                           hostdev->source.subsys.u.pci.domain,
-                                           hostdev->source.subsys.u.pci.bus,
--- 
-1.6.0.6
-
diff --git a/libvirt-0.6.3-refresh-qemu-caps.patch b/libvirt-0.6.3-refresh-qemu-caps.patch
deleted file mode 100644
index 804d54e..0000000
--- a/libvirt-0.6.3-refresh-qemu-caps.patch
+++ /dev/null
@@ -1,76 +0,0 @@
-commit 0e51348cb9aeafe5e2fd6469a4bde0baa1eb8720
-Author: Cole Robinson <crobinso@redhat.com>
-Date:   Mon May 4 15:06:03 2009 -0400
-
-    Refresh QEMU driver capabilities for each getCapabilities call.
-    
-    Also fix up a couple issues where caps are accessed without locking
-    the driver structure.
-
-diff --git a/src/qemu_driver.c b/src/qemu_driver.c
-index 23ea961..790dac6 100644
---- a/src/qemu_driver.c
-+++ b/src/qemu_driver.c
-@@ -1885,10 +1885,12 @@ static int qemudGetNodeInfo(virConnectPtr conn,
- 
- static char *qemudGetCapabilities(virConnectPtr conn) {
-     struct qemud_driver *driver = conn->privateData;
--    char *xml;
-+    char *xml = NULL;
- 
-     qemuDriverLock(driver);
--    if ((xml = virCapabilitiesFormatXML(driver->caps)) == NULL)
-+    virCapabilitiesFree(qemu_driver->caps);
-+    if ((qemu_driver->caps = qemudCapsInit()) == NULL ||
-+        (xml = virCapabilitiesFormatXML(driver->caps)) == NULL)
-         virReportOOMError(conn);
-     qemuDriverUnlock(driver);
- 
-@@ -3169,20 +3171,26 @@ cleanup:
-     return ret;
- }
- 
--static int qemudNodeGetSecurityModel(virConnectPtr conn, virSecurityModelPtr secmodel)
-+static int qemudNodeGetSecurityModel(virConnectPtr conn,
-+                                     virSecurityModelPtr secmodel)
- {
-     struct qemud_driver *driver = (struct qemud_driver *)conn->privateData;
-     char *p;
-+    int ret = 0;
- 
--    if (!driver->securityDriver)
--        return -2;
-+    qemuDriverLock(driver);
-+    if (!driver->securityDriver) {
-+        ret = -2;
-+        goto cleanup;
-+    }
- 
-     p = driver->caps->host.secModel.model;
-     if (strlen(p) >= VIR_SECURITY_MODEL_BUFLEN-1) {
-         qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
-                          _("security model string exceeds max %d bytes"),
-                          VIR_SECURITY_MODEL_BUFLEN-1);
--        return -1;
-+        ret = -1;
-+        goto cleanup;
-     }
-     strcpy(secmodel->model, p);
- 
-@@ -3191,10 +3199,14 @@ static int qemudNodeGetSecurityModel(virConnectPtr conn, virSecurityModelPtr sec
-         qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
-                          _("security DOI string exceeds max %d bytes"),
-                          VIR_SECURITY_DOI_BUFLEN-1);
--        return -1;
-+        ret = -1;
-+        goto cleanup;
-     }
-     strcpy(secmodel->doi, p);
--    return 0;
-+
-+cleanup:
-+    qemuDriverUnlock(driver);
-+    return ret;
- }
- 
- /* TODO: check seclabel restore */
diff --git a/libvirt-0.6.3-shared-readonly-label.patch b/libvirt-0.6.3-shared-readonly-label.patch
deleted file mode 100644
index e962d18..0000000
--- a/libvirt-0.6.3-shared-readonly-label.patch
+++ /dev/null
@@ -1,76 +0,0 @@
-diff -rup libvirt-0.6.2/src/security_selinux.c libvirt-0.6.2.new/src/security_selinux.c
---- libvirt-0.6.2/src/security_selinux.c	2009-04-03 15:36:56.000000000 +0100
-+++ libvirt-0.6.2.new/src/security_selinux.c	2009-05-05 13:39:42.000000000 +0100
-@@ -24,11 +24,12 @@
- #include "virterror_internal.h"
- #include "util.h"
- #include "memory.h"
--
-+#include "logging.h"
- 
- #define VIR_FROM_THIS VIR_FROM_SECURITY
- 
- static char default_domain_context[1024];
-+static char default_content_context[1024];
- static char default_image_context[1024];
- #define SECURITY_SELINUX_VOID_DOI       "0"
- #define SECURITY_SELINUX_NAME "selinux"
-@@ -148,8 +149,13 @@ SELinuxInitialize(virConnectPtr conn)
-     close(fd);
- 
-     ptr = strchrnul(default_image_context, '\n');
--    *ptr = '\0';
--
-+    if (*ptr == '\n') {
-+        *ptr = '\0';
-+        strcpy(default_content_context, ptr+1);
-+        ptr = strchrnul(default_content_context, '\n');
-+        if (*ptr == '\n')
-+            *ptr = '\0';
-+    }
-     return 0;
- }
- 
-@@ -275,6 +281,8 @@ SELinuxSetFilecon(virConnectPtr conn, co
- {
-     char ebuf[1024];
- 
-+    VIR_INFO("Setting SELinux context on '%s' to '%s'", path, tcon);
-+
-     if(setfilecon(path, tcon) < 0) {
-         virSecurityReportError(conn, VIR_ERR_ERROR,
-                                _("%s: unable to set security context "
-@@ -299,6 +307,8 @@ SELinuxRestoreSecurityImageLabel(virConn
-     char *newpath = NULL;
-     const char *path = disk->src;
- 
-+    /* Don't restore labels on readoly/shared disks, because
-+     * other VMs may still be accessing these */
-     if (disk->readonly || disk->shared)
-         return 0;
- 
-@@ -328,8 +338,13 @@ SELinuxSetSecurityImageLabel(virConnectP
- {
-     const virSecurityLabelDefPtr secdef = &vm->def->seclabel;
- 
--    if (secdef->imagelabel)
-+    if (disk->shared) {
-+        return SELinuxSetFilecon(conn, disk->src, default_image_context);
-+    } else if (disk->readonly) {
-+        return SELinuxSetFilecon(conn, disk->src, default_content_context);
-+    } else if (secdef->imagelabel) {
-         return SELinuxSetFilecon(conn, disk->src, secdef->imagelabel);
-+    }
- 
-     return 0;
- }
-@@ -403,9 +418,6 @@ SELinuxSetSecurityLabel(virConnectPtr co
- 
-     if (secdef->imagelabel) {
-         for (i = 0 ; i < vm->def->ndisks ; i++) {
--            if (vm->def->disks[i]->readonly ||
--                vm->def->disks[i]->shared) continue;
--
-             if (SELinuxSetSecurityImageLabel(conn, vm, vm->def->disks[i]) < 0)
-                 return -1;
-         }
diff --git a/libvirt-0.6.3-svirt-sound.patch b/libvirt-0.6.3-svirt-sound.patch
deleted file mode 100644
index 3668c7b..0000000
--- a/libvirt-0.6.3-svirt-sound.patch
+++ /dev/null
@@ -1,33 +0,0 @@
---- src/qemu_conf.c.orig	2009-04-02 11:50:10.000000000 +0200
-+++ src/qemu_conf.c	2009-04-03 17:46:59.000000000 +0200
-@@ -779,6 +779,20 @@ int qemudBuildCommandLine(virConnectPtr 
-     char domid[50];
-     char *pidfile;
-     const char *cpu = NULL;
-+    int skipSound = 0;
-+
-+    if (driver->securityDriver &&
-+        driver->securityDriver->name &&
-+        STREQ(driver->securityDriver->name, "selinux") &&
-+        getuid() == 0) {
-+        static int soundWarned = 0; 
-+        skipSound = 1;
-+        if (def->nsounds &&
-+            !soundWarned) {
-+            soundWarned = 1;
-+            VIR_WARN0("Sound cards for VMs are disabled while SELinux security model is active");
-+        }
-+    }
- 
-     uname_normalize(&ut);
- 
-@@ -1425,7 +1439,8 @@ int qemudBuildCommandLine(virConnectPtr 
-     }
- 
-     /* Add sound hardware */
--    if (def->nsounds) {
-+    if (def->nsounds &&
-+        !skipSound) {
-         int size = 100;
-         char *modstr;
-         if (VIR_ALLOC_N(modstr, size+1) < 0)
diff --git a/libvirt-0.6.3-xml-attribute-escaping.patch b/libvirt-0.6.3-xml-attribute-escaping.patch
deleted file mode 100644
index 5c9ecf5..0000000
--- a/libvirt-0.6.3-xml-attribute-escaping.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-From 7f7a4403860f56d5a1ad65bfd16f5bf97a971d45 Mon Sep 17 00:00:00 2001
-From: Daniel Veillard <veillard@redhat.com>
-Date: Wed, 13 May 2009 16:19:59 +0000
-Subject: [PATCH 1/1] * src/buf.c: avoid an XML attribute escaping bug #499791
- daniel
-
----
- src/buf.c |   16 +++++++++++++++-
- 1 files changed, 15 insertions(+), 1 deletions(-)
-
-diff --git a/src/buf.c b/src/buf.c
-index cdcdac9..259175d 100644
---- a/src/buf.c
-+++ b/src/buf.c
-@@ -266,7 +266,7 @@ virBufferEscapeString(const virBufferPtr buf, const char *format, const char *st
-         return;
- 
-     len = strlen(str);
--    if (VIR_ALLOC_N(escaped, 5 * len + 1) < 0) {
-+    if (VIR_ALLOC_N(escaped, 6 * len + 1) < 0) {
-         virBufferNoMemory(buf);
-         return;
-     }
-@@ -290,6 +290,20 @@ virBufferEscapeString(const virBufferPtr buf, const char *format, const char *st
-             *out++ = 'm';
-             *out++ = 'p';
-             *out++ = ';';
-+        } else if (*cur == '"') {
-+            *out++ = '&';
-+            *out++ = 'q';
-+            *out++ = 'u';
-+            *out++ = 'o';
-+            *out++ = 't';
-+            *out++ = ';';
-+        } else if (*cur == '\'') {
-+            *out++ = '&';
-+            *out++ = 'a';
-+            *out++ = 'p';
-+            *out++ = 'o';
-+            *out++ = 's';
-+            *out++ = ';';
-         } else if ((*cur >= 0x20) || (*cur == '\n') || (*cur == '\t') ||
-                    (*cur == '\r')) {
-             /*
--- 
-1.6.0.6
-
diff --git a/libvirt.spec b/libvirt.spec
index 9215ca4..6c12377 100644
--- a/libvirt.spec
+++ b/libvirt.spec
@@ -54,34 +54,14 @@
 
 Summary: Library providing a simple API virtualization
 Name: libvirt
-Version: 0.6.3
-Release: 11%{?dist}%{?extra_release}
+Version: 0.6.4
+Release: 1%{?dist}%{?extra_release}
 License: LGPLv2+
 Group: Development/Libraries
 Source: libvirt-%{version}.tar.gz
 
 # Patches cherry-picked from upstream
 
-# Handle shared/readonly image labelling (bz 493692)
-Patch1: libvirt-0.6.3-shared-readonly-label.patch
-# Handle <hostdev managed='yes'> correctly (bz 499386)
-Patch2: libvirt-0.6.3-hostdev-managed.patch
-# Refresh qemu caps when getCapabilities is called (bz 460649)
-Patch3: libvirt-0.6.3-refresh-qemu-caps.patch
-# Enable migration with qemu 0.10 Enable (bz 499704)
-Patch4: libvirt-0.6.3-enable-qemu-0-10-migration.patch
-# Don't try to label a disk with no path (e.g. empty cdrom) (bz 499569)
-Patch5: libvirt-0.6.2-fix-nosource-label.patch
-# Fix qemu argv detection with latest qemu (bz 501923)
-Patch6: libvirt-0.6.3-fix-qemu-argv-detection-with-kvm-85.patch
-# Fix XML attribute escaping (bz 499791)
-Patch7: libvirt-0.6.3-xml-attribute-escaping.patch
-# Fix serious event handling issues causing guests to be destroyed (bz 499698)
-Patch8: libvirt-0.6.3-event-handling-1.patch
-Patch9: libvirt-0.6.3-event-handling-2.patch
-# Bring up the bridge, even if it doesn't have an IP address (bz 501912)
-Patch10: libvirt-0.6.3-bring-up-ipless-bridge.patch
-
 # Patches not for upstream.
 
 # Temporary hack till PulseAudio autostart problems are sorted
@@ -236,16 +216,6 @@ of recent versions of Linux (and other OSes).
 
 %prep
 %setup -q
-%patch1 -p1
-%patch2 -p1
-%patch3 -p1
-%patch4 -p1
-%patch5 -p1
-%patch6 -p1
-%patch7 -p1
-%patch8 -p1
-%patch9 -p1
-%patch10 -p1
 
 %patch200 -p0
 
@@ -576,6 +546,12 @@ fi
 %endif
 
 %changelog
+* Fri May 29 2009 Daniel Veillard <veillard@redhat.com> - 0.6.4-1.fc12
+- Upstream release of 0.6.4
+- new APIs
+- fixes for latests QEmu/KVM versions
+- various assorted fixes
+
 * Mon May 25 2009 Mark McLoughlin <markmc@redhat.com> - 0.6.3-11.fc12
 - Bring up the bridge, even if it doesn't have an IP address (bug #501912)
 
diff --git a/sources b/sources
index b97a784..4bf0ae1 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-dd618bf0943a0be853ccc08308c7f427  libvirt-0.6.3.tar.gz
+344a6913a94582ea3ab0ad75a9bfef22  libvirt-0.6.4.tar.gz