diff --git a/0514-hw-qxl-exit-on-failure-to-register-qxl-interface.patch b/0514-hw-qxl-exit-on-failure-to-register-qxl-interface.patch
new file mode 100644
index 0000000..a89db68
--- /dev/null
+++ b/0514-hw-qxl-exit-on-failure-to-register-qxl-interface.patch
@@ -0,0 +1,35 @@
+From a0f199b76debf55933c2b3b917c13c86784e3be0 Mon Sep 17 00:00:00 2001
+From: Alon Levy <alevy@redhat.com>
+Date: Wed, 3 Oct 2012 20:13:58 +0200
+Subject: [PATCH 514/647] hw/qxl: exit on failure to register qxl interface
+
+This prevents a segfault later on when the device reset handler
+tries to access a NULL ssd.worker since interface_attach_worker has
+not been called.
+
+Signed-off-by: Alon Levy <alevy@redhat.com>
+Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
+---
+ hw/qxl.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/hw/qxl.c b/hw/qxl.c
+index 9389752..a2dd020 100644
+--- a/hw/qxl.c
++++ b/hw/qxl.c
+@@ -2035,7 +2035,11 @@ static int qxl_init_common(PCIQXLDevice *qxl)
+ 
+     qxl->ssd.qxl.base.sif = &qxl_interface.base;
+     qxl->ssd.qxl.id = qxl->id;
+-    qemu_spice_add_interface(&qxl->ssd.qxl.base);
++    if (qemu_spice_add_interface(&qxl->ssd.qxl.base) != 0) {
++        error_report("qxl interface %d.%d not supported by spice-server\n",
++                     SPICE_INTERFACE_QXL_MAJOR, SPICE_INTERFACE_QXL_MINOR);
++        return -1;
++    }
+     qemu_add_vm_change_state_handler(qxl_vm_change_state_handler, qxl);
+ 
+     init_pipe_signaling(qxl);
+-- 
+1.7.12.1
+
diff --git a/0515-hw-qxl-fix-condition-for-exiting-guest_bug.patch b/0515-hw-qxl-fix-condition-for-exiting-guest_bug.patch
new file mode 100644
index 0000000..945b5df
--- /dev/null
+++ b/0515-hw-qxl-fix-condition-for-exiting-guest_bug.patch
@@ -0,0 +1,29 @@
+From 73a691f6799e05afda0be01c1cd5e2f6914e8773 Mon Sep 17 00:00:00 2001
+From: Alon Levy <alevy@redhat.com>
+Date: Tue, 2 Oct 2012 11:39:14 +0200
+Subject: [PATCH 515/647] hw/qxl: fix condition for exiting guest_bug
+
+Reported and suggested by Paolo Bonzini, thanks.
+
+Signed-off-by: Alon Levy <alevy@redhat.com>
+Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
+---
+ hw/qxl.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/hw/qxl.c b/hw/qxl.c
+index a2dd020..e3a164a 100644
+--- a/hw/qxl.c
++++ b/hw/qxl.c
+@@ -1461,7 +1461,7 @@ static void ioport_write(void *opaque, target_phys_addr_t addr,
+     qxl_async_io async = QXL_SYNC;
+     uint32_t orig_io_port = io_port;
+ 
+-    if (d->guest_bug && !io_port == QXL_IO_RESET) {
++    if (d->guest_bug && io_port != QXL_IO_RESET) {
+         return;
+     }
+ 
+-- 
+1.7.12.1
+
diff --git a/0516-hw-qxl-qxl_dirty_surfaces-use-uintptr_t.patch b/0516-hw-qxl-qxl_dirty_surfaces-use-uintptr_t.patch
new file mode 100644
index 0000000..e285559
--- /dev/null
+++ b/0516-hw-qxl-qxl_dirty_surfaces-use-uintptr_t.patch
@@ -0,0 +1,38 @@
+From d59685f5667e25d0805bde93c068052afb30efda Mon Sep 17 00:00:00 2001
+From: Alon Levy <alevy@redhat.com>
+Date: Sun, 7 Oct 2012 17:03:35 +0200
+Subject: [PATCH 516/647] hw/qxl: qxl_dirty_surfaces: use uintptr_t
+
+As suggested by Paolo Bonzini, to avoid possible integer overflow issues.
+
+Signed-off-by: Alon Levy <alevy@redhat.com>
+Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
+---
+ hw/qxl.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/hw/qxl.c b/hw/qxl.c
+index e3a164a..5a9bf1c 100644
+--- a/hw/qxl.c
++++ b/hw/qxl.c
+@@ -1803,7 +1803,7 @@ static void qxl_hw_text_update(void *opaque, console_ch_t *chardata)
+ 
+ static void qxl_dirty_surfaces(PCIQXLDevice *qxl)
+ {
+-    intptr_t vram_start;
++    uintptr_t vram_start;
+     int i;
+ 
+     if (qxl->mode != QXL_MODE_NATIVE && qxl->mode != QXL_MODE_COMPAT) {
+@@ -1814,7 +1814,7 @@ static void qxl_dirty_surfaces(PCIQXLDevice *qxl)
+     qxl_set_dirty(&qxl->vga.vram, qxl->shadow_rom.draw_area_offset,
+                   qxl->shadow_rom.surface0_area_size);
+ 
+-    vram_start =  (intptr_t)memory_region_get_ram_ptr(&qxl->vram_bar);
++    vram_start = (uintptr_t)memory_region_get_ram_ptr(&qxl->vram_bar);
+ 
+     /* dirty the off-screen surfaces */
+     for (i = 0; i < qxl->ssd.num_surfaces; i++) {
+-- 
+1.7.12.1
+
diff --git a/0517-spice-raise-requirement-to-0.12.patch b/0517-spice-raise-requirement-to-0.12.patch
new file mode 100644
index 0000000..4ffb529
--- /dev/null
+++ b/0517-spice-raise-requirement-to-0.12.patch
@@ -0,0 +1,465 @@
+From be955ad2a04cb7be9b5f34cd0e43d29f34113c6e Mon Sep 17 00:00:00 2001
+From: Gerd Hoffmann <kraxel@redhat.com>
+Date: Mon, 24 Sep 2012 10:23:40 +0200
+Subject: [PATCH 517/647] spice: raise requirement to 0.12
+
+With the next qemu version (1.3) we are going to bump the qxl device
+revision to 4.  The new features available require a recent spice-server
+version, so raise up the bar.  Otherwise we would end up with different
+qxl revisions depending on the spice-server version installed, which
+would be a major PITA when it comes to compat properties.
+
+Clear out a big bunch of #ifdefs which are not needed any more.
+
+Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
+---
+ configure          | 18 ++----------------
+ hw/qxl.c           | 30 ------------------------------
+ ui/spice-core.c    | 51 ++-------------------------------------------------
+ ui/spice-display.c | 38 --------------------------------------
+ ui/spice-display.h |  5 -----
+ 5 files changed, 4 insertions(+), 138 deletions(-)
+
+diff --git a/configure b/configure
+index ebe8b1c..b843d20 100755
+--- a/configure
++++ b/configure
+@@ -2705,20 +2705,14 @@ int main(void) { spice_server_new(); return 0; }
+ EOF
+   spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
+   spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
+-  if $pkg_config --atleast-version=0.8.2 spice-server >/dev/null 2>&1 && \
+-     $pkg_config --atleast-version=0.8.1 spice-protocol > /dev/null 2>&1 && \
++  if $pkg_config --atleast-version=0.12.0 spice-server >/dev/null 2>&1 && \
++     $pkg_config --atleast-version=0.12.2 spice-protocol > /dev/null 2>&1 && \
+      compile_prog "$spice_cflags" "$spice_libs" ; then
+     spice="yes"
+     libs_softmmu="$libs_softmmu $spice_libs"
+     QEMU_CFLAGS="$QEMU_CFLAGS $spice_cflags"
+     spice_protocol_version=$($pkg_config --modversion spice-protocol)
+     spice_server_version=$($pkg_config --modversion spice-server)
+-    if $pkg_config --atleast-version=0.12.0 spice-protocol >/dev/null 2>&1; then
+-        spice_qxl_io_monitors_config_async="yes"
+-    fi
+-    if $pkg_config --atleast-version=0.12.2 spice-protocol > /dev/null 2>&1; then
+-        spice_qxl_client_monitors_config="yes"
+-    fi
+   else
+     if test "$spice" = "yes" ; then
+       feature_not_found "spice"
+@@ -3456,14 +3450,6 @@ if test "$spice" = "yes" ; then
+   echo "CONFIG_SPICE=y" >> $config_host_mak
+ fi
+ 
+-if test "$spice_qxl_io_monitors_config_async" = "yes" ; then
+-  echo "CONFIG_QXL_IO_MONITORS_CONFIG_ASYNC=y" >> $config_host_mak
+-fi
+-
+-if test "$spice_qxl_client_monitors_config" = "yes" ; then
+-  echo "CONFIG_QXL_CLIENT_MONITORS_CONFIG=y" >> $config_host_mak
+-fi
+-
+ if test "$smartcard" = "yes" ; then
+   echo "CONFIG_SMARTCARD=y" >> $config_host_mak
+ fi
+diff --git a/hw/qxl.c b/hw/qxl.c
+index 5a9bf1c..255fdf4 100644
+--- a/hw/qxl.c
++++ b/hw/qxl.c
+@@ -29,11 +29,6 @@
+ 
+ #include "qxl.h"
+ 
+-#ifndef CONFIG_QXL_IO_MONITORS_CONFIG_ASYNC
+-/* spice-protocol is too old, add missing definitions */
+-#define QXL_IO_MONITORS_CONFIG_ASYNC (QXL_IO_FLUSH_RELEASE + 1)
+-#endif
+-
+ /*
+  * NOTE: SPICE_RING_PROD_ITEM accesses memory on the pci bar and as
+  * such can be changed by the guest, so to avoid a guest trigerrable
+@@ -262,9 +257,6 @@ static void qxl_spice_destroy_surfaces(PCIQXLDevice *qxl, qxl_async_io async)
+ static void qxl_spice_monitors_config_async(PCIQXLDevice *qxl, int replay)
+ {
+     trace_qxl_spice_monitors_config(qxl->id);
+-/* 0x000b01 == 0.11.1 */
+-#if SPICE_SERVER_VERSION >= 0x000b01 && \
+-    defined(CONFIG_QXL_IO_MONITORS_CONFIG_ASYNC)
+     if (replay) {
+         /*
+          * don't use QXL_COOKIE_TYPE_IO:
+@@ -286,10 +278,6 @@ static void qxl_spice_monitors_config_async(PCIQXLDevice *qxl, int replay)
+                 (uintptr_t)qxl_cookie_new(QXL_COOKIE_TYPE_IO,
+                                           QXL_IO_MONITORS_CONFIG_ASYNC));
+     }
+-#else
+-    fprintf(stderr, "qxl: too old spice-protocol/spice-server for "
+-            "QXL_IO_MONITORS_CONFIG_ASYNC\n");
+-#endif
+ }
+ 
+ void qxl_spice_reset_image_cache(PCIQXLDevice *qxl)
+@@ -948,8 +936,6 @@ static void interface_async_complete(QXLInstance *sin, uint64_t cookie_token)
+     }
+ }
+ 
+-#if SPICE_SERVER_VERSION >= 0x000b04
+-
+ /* called from spice server thread context only */
+ static void interface_set_client_capabilities(QXLInstance *sin,
+                                               uint8_t client_present,
+@@ -971,11 +957,6 @@ static void interface_set_client_capabilities(QXLInstance *sin,
+     qxl_send_events(qxl, QXL_INTERRUPT_CLIENT);
+ }
+ 
+-#endif
+-
+-#if defined(CONFIG_QXL_CLIENT_MONITORS_CONFIG) \
+-    && SPICE_SERVER_VERSION >= 0x000b05
+-
+ static uint32_t qxl_crc32(const uint8_t *p, unsigned len)
+ {
+     /*
+@@ -1044,7 +1025,6 @@ static int interface_client_monitors_config(QXLInstance *sin,
+     qxl_send_events(qxl, QXL_INTERRUPT_CLIENT_MONITORS_CONFIG);
+     return 1;
+ }
+-#endif
+ 
+ static const QXLInterface qxl_interface = {
+     .base.type               = SPICE_INTERFACE_QXL,
+@@ -1067,13 +1047,8 @@ static const QXLInterface qxl_interface = {
+     .flush_resources         = interface_flush_resources,
+     .async_complete          = interface_async_complete,
+     .update_area_complete    = interface_update_area_complete,
+-#if SPICE_SERVER_VERSION >= 0x000b04
+     .set_client_capabilities = interface_set_client_capabilities,
+-#endif
+-#if SPICE_SERVER_VERSION >= 0x000b05 && \
+-    defined(CONFIG_QXL_CLIENT_MONITORS_CONFIG)
+     .client_monitors_config = interface_client_monitors_config,
+-#endif
+ };
+ 
+ static void qxl_enter_vga_mode(PCIQXLDevice *d)
+@@ -1846,7 +1821,6 @@ static void qxl_vm_change_state_handler(void *opaque, int running,
+                                         RunState state)
+ {
+     PCIQXLDevice *qxl = opaque;
+-    qemu_spice_vm_change_state_handler(&qxl->ssd, running, state);
+ 
+     if (running) {
+         /*
+@@ -1963,14 +1937,10 @@ static int qxl_init_common(PCIQXLDevice *qxl)
+         pci_device_rev = QXL_REVISION_STABLE_V10;
+         io_size = 32; /* PCI region size must be pow2 */
+         break;
+-/* 0x000b01 == 0.11.1 */
+-#if SPICE_SERVER_VERSION >= 0x000b01 && \
+-        defined(CONFIG_QXL_IO_MONITORS_CONFIG_ASYNC)
+     case 4: /* qxl-4 */
+         pci_device_rev = QXL_REVISION_STABLE_V12;
+         io_size = msb_mask(QXL_IO_RANGE_SIZE * 2 - 1);
+         break;
+-#endif
+     default:
+         error_report("Invalid revision %d for qxl device (max %d)",
+                      qxl->revision, QXL_DEFAULT_REVISION);
+diff --git a/ui/spice-core.c b/ui/spice-core.c
+index ba0d0bd..5147365 100644
+--- a/ui/spice-core.c
++++ b/ui/spice-core.c
+@@ -223,7 +223,6 @@ static void channel_event(int event, SpiceChannelEventInfo *info)
+     client = qdict_new();
+     server = qdict_new();
+ 
+-#ifdef SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT
+     if (info->flags & SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT) {
+         add_addr_info(client, (struct sockaddr *)&info->paddr_ext,
+                       info->plen_ext);
+@@ -232,12 +231,7 @@ static void channel_event(int event, SpiceChannelEventInfo *info)
+     } else {
+         error_report("spice: %s, extended address is expected",
+                      __func__);
+-#endif
+-        add_addr_info(client, &info->paddr, info->plen);
+-        add_addr_info(server, &info->laddr, info->llen);
+-#ifdef SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT
+     }
+-#endif
+ 
+     if (event == SPICE_CHANNEL_EVENT_INITIALIZED) {
+         qdict_put(server, "auth", qstring_from_str(auth));
+@@ -276,7 +270,6 @@ static SpiceCoreInterface core_interface = {
+     .channel_event      = channel_event,
+ };
+ 
+-#ifdef SPICE_INTERFACE_MIGRATION
+ typedef struct SpiceMigration {
+     SpiceMigrateInstance sin;
+     struct {
+@@ -313,7 +306,6 @@ static void migrate_end_complete_cb(SpiceMigrateInstance *sin)
+     monitor_protocol_event(QEVENT_SPICE_MIGRATE_COMPLETED, NULL);
+     spice_migration_completed = true;
+ }
+-#endif
+ 
+ /* config string parsing */
+ 
+@@ -393,17 +385,13 @@ static SpiceChannelList *qmp_query_spice_channels(void)
+         chan = g_malloc0(sizeof(*chan));
+         chan->value = g_malloc0(sizeof(*chan->value));
+ 
+-#ifdef SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT
+         if (item->info->flags & SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT) {
+             paddr = (struct sockaddr *)&item->info->paddr_ext;
+             plen = item->info->plen_ext;
+         } else {
+-#endif
+             paddr = &item->info->paddr;
+             plen = item->info->plen;
+-#ifdef SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT
+         }
+-#endif
+ 
+         getnameinfo(paddr, plen,
+                     host, sizeof(host), port, sizeof(port),
+@@ -473,13 +461,10 @@ SpiceInfo *qmp_query_spice(Error **errp)
+         info->tls_port = tls_port;
+     }
+ 
+-#if SPICE_SERVER_VERSION >= 0x000a03 /* 0.10.3 */
+     info->mouse_mode = spice_server_is_server_mouse(spice_server) ?
+                        SPICE_QUERY_MOUSE_MODE_SERVER :
+                        SPICE_QUERY_MOUSE_MODE_CLIENT;
+-#else
+-    info->mouse_mode = SPICE_QUERY_MOUSE_MODE_UNKNOWN;
+-#endif
++
+     /* for compatibility with the original command */
+     info->has_channels = true;
+     info->channels = qmp_query_spice_channels();
+@@ -492,19 +477,11 @@ static void migration_state_notifier(Notifier *notifier, void *data)
+     MigrationState *s = data;
+ 
+     if (migration_is_active(s)) {
+-#ifdef SPICE_INTERFACE_MIGRATION
+         spice_server_migrate_start(spice_server);
+-#endif
+     } else if (migration_has_finished(s)) {
+-#ifndef SPICE_INTERFACE_MIGRATION
+-        spice_server_migrate_switch(spice_server);
+-        monitor_protocol_event(QEVENT_SPICE_MIGRATE_COMPLETED, NULL);
+-        spice_migration_completed = true;
+-#else
+         spice_server_migrate_end(spice_server, true);
+     } else if (migration_has_failed(s)) {
+         spice_server_migrate_end(spice_server, false);
+-#endif
+     }
+ }
+ 
+@@ -513,16 +490,11 @@ int qemu_spice_migrate_info(const char *hostname, int port, int tls_port,
+                             MonitorCompletion *cb, void *opaque)
+ {
+     int ret;
+-#ifdef SPICE_INTERFACE_MIGRATION
++
+     spice_migrate.connect_complete.cb = cb;
+     spice_migrate.connect_complete.opaque = opaque;
+     ret = spice_server_migrate_connect(spice_server, hostname,
+                                        port, tls_port, subject);
+-#else
+-    ret = spice_server_migrate_info(spice_server, hostname,
+-                                    port, tls_port, subject);
+-    cb(opaque, NULL);
+-#endif
+     return ret;
+ }
+ 
+@@ -561,7 +533,6 @@ static int add_channel(const char *name, const char *value, void *opaque)
+ static void vm_change_state_handler(void *opaque, int running,
+                                     RunState state)
+ {
+-#if SPICE_SERVER_VERSION >= 0x000b02 /* 0.11.2 */
+     if (running) {
+         qemu_spice_display_start();
+         spice_server_vm_start(spice_server);
+@@ -569,7 +540,6 @@ static void vm_change_state_handler(void *opaque, int running,
+         spice_server_vm_stop(spice_server);
+         qemu_spice_display_stop();
+     }
+-#endif
+ }
+ 
+ void qemu_spice_init(void)
+@@ -585,9 +555,7 @@ void qemu_spice_init(void)
+     int port, tls_port, len, addr_flags;
+     spice_image_compression_t compression;
+     spice_wan_compression_t wan_compr;
+-#if SPICE_SERVER_VERSION >= 0x000b02 /* 0.11.2 */
+     bool seamless_migration;
+-#endif
+ 
+     qemu_thread_get_self(&me);
+ 
+@@ -672,16 +640,11 @@ void qemu_spice_init(void)
+         spice_server_set_ticket(spice_server, password, 0, 0, 0);
+     }
+     if (qemu_opt_get_bool(opts, "sasl", 0)) {
+-#if SPICE_SERVER_VERSION >= 0x000900 /* 0.9.0 */
+         if (spice_server_set_sasl_appname(spice_server, "qemu") == -1 ||
+             spice_server_set_sasl(spice_server, 1) == -1) {
+             error_report("spice: failed to enable sasl");
+             exit(1);
+         }
+-#else
+-        error_report("spice: sasl is not available (spice >= 0.9 required)");
+-        exit(1);
+-#endif
+     }
+     if (qemu_opt_get_bool(opts, "disable-ticketing", 0)) {
+         auth = "none";
+@@ -726,15 +689,11 @@ void qemu_spice_init(void)
+ 
+     qemu_opt_foreach(opts, add_channel, &tls_port, 0);
+ 
+-#if SPICE_SERVER_VERSION >= 0x000a02 /* 0.10.2 */
+     spice_server_set_name(spice_server, qemu_name);
+     spice_server_set_uuid(spice_server, qemu_uuid);
+-#endif
+ 
+-#if SPICE_SERVER_VERSION >= 0x000b02 /* 0.11.2 */
+     seamless_migration = qemu_opt_get_bool(opts, "seamless-migration", 0);
+     spice_server_set_seamless_migration(spice_server, seamless_migration);
+-#endif
+     if (0 != spice_server_init(spice_server, &core_interface)) {
+         error_report("failed to initialize spice server");
+         exit(1);
+@@ -743,11 +702,9 @@ void qemu_spice_init(void)
+ 
+     migration_state.notify = migration_state_notifier;
+     add_migration_state_change_notifier(&migration_state);
+-#ifdef SPICE_INTERFACE_MIGRATION
+     spice_migrate.sin.base.sif = &migrate_interface.base;
+     spice_migrate.connect_complete.cb = NULL;
+     qemu_spice_add_interface(&spice_migrate.sin.base);
+-#endif
+ 
+     qemu_spice_input_init();
+     qemu_spice_audio_init();
+@@ -815,15 +772,11 @@ int qemu_spice_set_pw_expire(time_t expires)
+ 
+ int qemu_spice_display_add_client(int csock, int skipauth, int tls)
+ {
+-#if SPICE_SERVER_VERSION >= 0x000a01
+     if (tls) {
+         return spice_server_add_ssl_client(spice_server, csock, skipauth);
+     } else {
+         return spice_server_add_client(spice_server, csock, skipauth);
+     }
+-#else
+-    return -1;
+-#endif
+ }
+ 
+ static void spice_register_config(void)
+diff --git a/ui/spice-display.c b/ui/spice-display.c
+index d062765..422e7c4 100644
+--- a/ui/spice-display.c
++++ b/ui/spice-display.c
+@@ -126,21 +126,6 @@ void qemu_spice_wakeup(SimpleSpiceDisplay *ssd)
+     ssd->worker->wakeup(ssd->worker);
+ }
+ 
+-#if SPICE_SERVER_VERSION < 0x000b02 /* before 0.11.2 */
+-static void qemu_spice_start(SimpleSpiceDisplay *ssd)
+-{
+-    trace_qemu_spice_start(ssd->qxl.id);
+-    ssd->worker->start(ssd->worker);
+-}
+-
+-static void qemu_spice_stop(SimpleSpiceDisplay *ssd)
+-{
+-    trace_qemu_spice_stop(ssd->qxl.id);
+-    ssd->worker->stop(ssd->worker);
+-}
+-
+-#else
+-
+ static int spice_display_is_running;
+ 
+ void qemu_spice_display_start(void)
+@@ -153,15 +138,9 @@ void qemu_spice_display_stop(void)
+     spice_display_is_running = false;
+ }
+ 
+-#endif
+-
+ int qemu_spice_display_is_running(SimpleSpiceDisplay *ssd)
+ {
+-#if SPICE_SERVER_VERSION < 0x000b02 /* before 0.11.2 */
+-    return ssd->running;
+-#else
+     return spice_display_is_running;
+-#endif
+ }
+ 
+ static void qemu_spice_create_one_update(SimpleSpiceDisplay *ssd,
+@@ -364,22 +343,6 @@ void qemu_spice_destroy_host_primary(SimpleSpiceDisplay *ssd)
+     qemu_spice_destroy_primary_surface(ssd, 0, QXL_SYNC);
+ }
+ 
+-void qemu_spice_vm_change_state_handler(void *opaque, int running,
+-                                        RunState state)
+-{
+-#if SPICE_SERVER_VERSION < 0x000b02 /* before 0.11.2 */
+-    SimpleSpiceDisplay *ssd = opaque;
+-
+-    if (running) {
+-        ssd->running = true;
+-        qemu_spice_start(ssd);
+-    } else {
+-        qemu_spice_stop(ssd);
+-        ssd->running = false;
+-    }
+-#endif
+-}
+-
+ void qemu_spice_display_init_common(SimpleSpiceDisplay *ssd, DisplayState *ds)
+ {
+     ssd->ds = ds;
+@@ -623,7 +586,6 @@ void qemu_spice_display_init(DisplayState *ds)
+     qemu_spice_add_interface(&sdpy.qxl.base);
+     assert(sdpy.worker);
+ 
+-    qemu_add_vm_change_state_handler(qemu_spice_vm_change_state_handler, &sdpy);
+     qemu_spice_create_host_memslot(&sdpy);
+     qemu_spice_create_host_primary(&sdpy);
+ }
+diff --git a/ui/spice-display.h b/ui/spice-display.h
+index dea41c1..d766927 100644
+--- a/ui/spice-display.h
++++ b/ui/spice-display.h
+@@ -83,9 +83,6 @@ struct SimpleSpiceDisplay {
+ 
+     QXLRect dirty;
+     int notify;
+-#if SPICE_SERVER_VERSION < 0x000b02 /* before 0.11.2 */
+-    int running;
+-#endif
+ 
+     /*
+      * All struct members below this comment can be accessed from
+@@ -133,8 +130,6 @@ void qemu_spice_create_primary_surface(SimpleSpiceDisplay *ssd, uint32_t id,
+ void qemu_spice_destroy_primary_surface(SimpleSpiceDisplay *ssd,
+                                         uint32_t id, qxl_async_io async);
+ void qemu_spice_wakeup(SimpleSpiceDisplay *ssd);
+-#if SPICE_SERVER_VERSION >= 0x000b02 /* before 0.11.2 */
+ void qemu_spice_display_start(void);
+ void qemu_spice_display_stop(void);
+-#endif
+ int qemu_spice_display_is_running(SimpleSpiceDisplay *ssd);
+-- 
+1.7.12.1
+
diff --git a/0518-qxl-set-default-revision-to-4.patch b/0518-qxl-set-default-revision-to-4.patch
new file mode 100644
index 0000000..c2eab7b
--- /dev/null
+++ b/0518-qxl-set-default-revision-to-4.patch
@@ -0,0 +1,33 @@
+From 7b1c2ac1342371bf43035b2ee1b02d9f554da49d Mon Sep 17 00:00:00 2001
+From: Gerd Hoffmann <kraxel@redhat.com>
+Date: Thu, 1 Nov 2012 11:06:54 +0100
+Subject: [PATCH 518/647] qxl: set default revision to 4
+
+Set qxl pci revision to 4 so guests know spice-server 0.12 features
+are available.
+
+Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
+---
+ hw/qxl.h | 5 -----
+ 1 file changed, 5 deletions(-)
+
+diff --git a/hw/qxl.h b/hw/qxl.h
+index 5553824..e583cfb 100644
+--- a/hw/qxl.h
++++ b/hw/qxl.h
+@@ -129,12 +129,7 @@ typedef struct PCIQXLDevice {
+         }                                                               \
+     } while (0)
+ 
+-#if 0
+-/* spice-server 0.12 is still in development */
+ #define QXL_DEFAULT_REVISION QXL_REVISION_STABLE_V12
+-#else
+-#define QXL_DEFAULT_REVISION QXL_REVISION_STABLE_V10
+-#endif
+ 
+ /* qxl.c */
+ void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL phys, int group_id);
+-- 
+1.7.12.1
+
diff --git a/qemu.spec b/qemu.spec
index ae8ae6b..8773079 100644
--- a/qemu.spec
+++ b/qemu.spec
@@ -109,7 +109,7 @@
 Summary: QEMU is a FAST! processor emulator
 Name: qemu
 Version: 1.2.0
-Release: 18%{?dist}
+Release: 19%{?dist}
 # Epoch because we pushed a qemu-1.0 package. AIUI this can't ever be dropped
 Epoch: 2
 License: GPLv2+ and LGPLv2+ and BSD
@@ -423,6 +423,11 @@ Patch0510: 0510-hw-qxl-support-client-monitor-configuration-via-devi.patch
 Patch0511: 0511-qxl-always-update-displaysurface-on-resize.patch
 Patch0512: 0512-qxl-update_area_io-cleanup-invalid-parameters-handli.patch
 Patch0513: 0513-qxl-fix-range-check-for-rev3-io-commands.patch
+Patch0514: 0514-hw-qxl-exit-on-failure-to-register-qxl-interface.patch
+Patch0515: 0515-hw-qxl-fix-condition-for-exiting-guest_bug.patch
+Patch0516: 0516-hw-qxl-qxl_dirty_surfaces-use-uintptr_t.patch
+Patch0517: 0517-spice-raise-requirement-to-0.12.patch
+Patch0518: 0518-qxl-set-default-revision-to-4.patch
 
 # usb-redir live-migration and misc bits, will be in before 1.3.0
 Patch0600: 0600-usb-redir-Convert-to-new-libusbredirparser-0.5-API.patch
@@ -1166,6 +1171,11 @@ such as kvm_stat.
 %patch0511 -p1
 %patch0512 -p1
 %patch0513 -p1
+%patch0514 -p1
+%patch0515 -p1
+%patch0516 -p1
+%patch0517 -p1
+%patch0518 -p1
 
 %patch0600 -p1
 %patch0601 -p1
@@ -1800,6 +1810,11 @@ fi
 %{_mandir}/man1/qemu-img.1*
 
 %changelog
+* Thu Nov  1 2012 Hans de Goede <hdegoede@redhat.com> - 2:1.2.0-19
+- Sync spice patches with upstream, minor bugfixes and set the qxl pci
+  device revision to 4 by default, so that guests know they can use
+  the new features
+
 * Tue Oct 30 2012 Cole Robinson <crobinso@redhat.com> - 2:1.2.0-18
 - Fix loading arm initrd if kernel is very large (bz #862766)
 - Don't use reserved word 'function' in systemtap files (bz #870972)