diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c
index 7ad6d2c..63ae9e1 100644
--- a/src/conf/domain_event.c
+++ b/src/conf/domain_event.c
@@ -581,6 +581,7 @@ virDomainEventNew(virClassPtr klass,
                   const unsigned char *uuid)
 {
     virDomainEventPtr event;
+    char uuidstr[VIR_UUID_STRING_BUFLEN];
 
     if (virDomainEventsInitialize() < 0)
         return NULL;
@@ -592,10 +593,14 @@ virDomainEventNew(virClassPtr klass,
         return NULL;
     }
 
+    /* We use uuid for matching key. We ignore 'name' because
+     * Xen sometimes renames guests during migration, thus
+     * 'uuid' is the only truly reliable key we can use. */
+    virUUIDFormat(uuid, uuidstr);
     if (!(event = virObjectEventNew(klass,
                                     virDomainEventDispatchDefaultFunc,
                                     eventID,
-                                    id, name, uuid)))
+                                    id, name, uuid, uuidstr)))
         return NULL;
 
     return (virObjectEventPtr)event;
@@ -1873,13 +1878,15 @@ virDomainQemuMonitorEventNew(int id,
                              const char *details)
 {
     virDomainQemuMonitorEventPtr ev;
+    char uuidstr[VIR_UUID_STRING_BUFLEN];
 
     if (virDomainEventsInitialize() < 0)
         return NULL;
 
+    virUUIDFormat(uuid, uuidstr);
     if (!(ev = virObjectEventNew(virDomainQemuMonitorEventClass,
                                  virDomainQemuMonitorEventDispatchFunc,
-                                 0, id, name, uuid)))
+                                 0, id, name, uuid, uuidstr)))
         return NULL;
 
     /* event is mandatory, details are optional */
diff --git a/src/conf/network_event.c b/src/conf/network_event.c
index 21f6db1..e0d1a3d 100644
--- a/src/conf/network_event.c
+++ b/src/conf/network_event.c
@@ -226,14 +226,16 @@ virNetworkEventLifecycleNew(const char *name,
                             int detail)
 {
     virNetworkEventLifecyclePtr event;
+    char uuidstr[VIR_UUID_STRING_BUFLEN];
 
     if (virNetworkEventsInitialize() < 0)
         return NULL;
 
+    virUUIDFormat(uuid, uuidstr);
     if (!(event = virObjectEventNew(virNetworkEventLifecycleClass,
                                     virNetworkEventDispatchDefaultFunc,
                                     VIR_NETWORK_EVENT_ID_LIFECYCLE,
-                                    0, name, uuid)))
+                                    0, name, uuid, uuidstr)))
         return NULL;
 
     event->type = type;
diff --git a/src/conf/object_event.c b/src/conf/object_event.c
index 8fd182d..5734230 100644
--- a/src/conf/object_event.c
+++ b/src/conf/object_event.c
@@ -123,6 +123,7 @@ virObjectEventDispose(void *obj)
     VIR_DEBUG("obj=%p", event);
 
     VIR_FREE(event->meta.name);
+    VIR_FREE(event->meta.key);
 }
 
 /**
@@ -619,6 +620,7 @@ virObjectEventStateNew(void)
  * @id: id of the object the event describes, or 0
  * @name: name of the object the event describes
  * @uuid: uuid of the object the event describes
+ * @key: key for per-object filtering
  *
  * Create a new event, with the information common to all events.
  */
@@ -628,7 +630,8 @@ virObjectEventNew(virClassPtr klass,
                   int eventID,
                   int id,
                   const char *name,
-                  const unsigned char *uuid)
+                  const unsigned char *uuid,
+                  const char *key)
 {
     virObjectEventPtr event;
 
@@ -653,6 +656,11 @@ virObjectEventNew(virClassPtr klass,
         VIR_FREE(event);
         return NULL;
     }
+    if (VIR_STRDUP(event->meta.key, key) < 0) {
+        VIR_FREE(event->meta.name);
+        VIR_FREE(event);
+        return NULL;
+    }
     event->meta.id = id;
     memcpy(event->meta.uuid, uuid, VIR_UUID_BUFLEN);
 
@@ -701,17 +709,8 @@ virObjectEventDispatchMatchCallback(virObjectEventPtr event,
     if (cb->filter && !(cb->filter)(cb->conn, event, cb->filter_opaque))
         return false;
 
-    if (cb->uuid_filter) {
-        /* Deliberately ignoring 'id' for matching, since that
-         * will cause problems when a domain switches between
-         * running & shutoff states & ignoring 'name' since
-         * Xen sometimes renames guests during migration, thus
-         * leaving 'uuid' as the only truly reliable ID we can use. */
-        char uuidstr[VIR_UUID_STRING_BUFLEN];
-        virUUIDFormat(event->meta.uuid, uuidstr);
-
-        return STREQ(uuidstr, cb->uuid);
-    }
+    if (cb->uuid_filter)
+        return STREQ(event->meta.key, cb->uuid);
     return true;
 }
 
diff --git a/src/conf/object_event_private.h b/src/conf/object_event_private.h
index cae74ef..95b2120 100644
--- a/src/conf/object_event_private.h
+++ b/src/conf/object_event_private.h
@@ -31,6 +31,7 @@ struct _virObjectMeta {
     int id;
     char *name;
     unsigned char uuid[VIR_UUID_BUFLEN];
+    char *key;
 };
 typedef struct _virObjectMeta virObjectMeta;
 typedef virObjectMeta *virObjectMetaPtr;
@@ -102,8 +103,9 @@ virObjectEventNew(virClassPtr klass,
                   int eventID,
                   int id,
                   const char *name,
-                  const unsigned char *uuid)
+                  const unsigned char *uuid,
+                  const char *key)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(5)
-    ATTRIBUTE_NONNULL(6);
+    ATTRIBUTE_NONNULL(6) ATTRIBUTE_NONNULL(7);
 
 #endif
diff --git a/src/conf/storage_event.c b/src/conf/storage_event.c
index de4f1ea..cb97c90 100644
--- a/src/conf/storage_event.c
+++ b/src/conf/storage_event.c
@@ -228,14 +228,16 @@ virStoragePoolEventLifecycleNew(const char *name,
                                 int detail)
 {
     virStoragePoolEventLifecyclePtr event;
+    char uuidstr[VIR_UUID_STRING_BUFLEN];
 
     if (virStoragePoolEventsInitialize() < 0)
         return NULL;
 
+    virUUIDFormat(uuid, uuidstr);
     if (!(event = virObjectEventNew(virStoragePoolEventLifecycleClass,
                                     virStoragePoolEventDispatchDefaultFunc,
                                     VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE,
-                                    0, name, uuid)))
+                                    0, name, uuid, uuidstr)))
         return NULL;
 
     event->type = type;
