diff --git a/hw/vfio_pci.c b/hw/vfio_pci.c
index 7c27834..49b9550 100644
--- a/hw/vfio_pci.c
+++ b/hw/vfio_pci.c
@@ -75,6 +75,7 @@ struct VFIODevice;
 typedef struct VFIOMSIVector {
     EventNotifier interrupt; /* eventfd triggered on interrupt */
     struct VFIODevice *vdev; /* back pointer to device */
+    MSIMessage msg; /* cache the MSI message so we know when it changes */
     int virq; /* KVM irqchip route for QEMU bypass */
     bool use;
 } VFIOMSIVector;
@@ -574,6 +575,7 @@ static int vfio_msix_vector_use(PCIDevice *pdev,
 
     vector = &vdev->msi_vectors[nr];
     vector->vdev = vdev;
+    vector->msg = msg;
     vector->use = true;
 
     msix_vector_use(pdev, nr);
@@ -716,7 +718,6 @@ retry:
     vdev->msi_vectors = g_malloc0(vdev->nr_vectors * sizeof(VFIOMSIVector));
 
     for (i = 0; i < vdev->nr_vectors; i++) {
-        MSIMessage msg;
         VFIOMSIVector *vector = &vdev->msi_vectors[i];
 
         vector->vdev = vdev;
@@ -726,13 +727,13 @@ retry:
             error_report("vfio: Error: event_notifier_init failed\n");
         }
 
-        msg = msi_get_message(&vdev->pdev, i);
+        vector->msg = msi_get_message(&vdev->pdev, i);
 
         /*
          * Attempt to enable route through KVM irqchip,
          * default to userspace handling if unavailable.
          */
-        vector->virq = kvm_irqchip_add_msi_route(kvm_state, msg);
+        vector->virq = kvm_irqchip_add_msi_route(kvm_state, vector->msg);
         if (vector->virq < 0 ||
             kvm_irqchip_add_irqfd_notifier(kvm_state, &vector->interrupt,
                                            vector->virq) < 0) {
@@ -1022,6 +1023,30 @@ static void vfio_pci_write_config(PCIDevice *pdev, uint32_t addr,
             vfio_enable_msi(vdev);
         } else if (was_enabled && !is_enabled) {
             vfio_disable_msi(vdev);
+        } else if (was_enabled && is_enabled) {
+            int i;
+
+            for (i = 0; i < vdev->nr_vectors; i++) {
+                VFIOMSIVector *vector = &vdev->msi_vectors[i];
+                MSIMessage msg;
+
+                if (!vector->use || vector->virq < 0) {
+                    continue;
+                }
+
+                msg = msi_get_message(pdev, i);
+
+                if (msg.address != vector->msg.address ||
+                    msg.data != vector->msg.data) {
+
+                    DPRINTF("%s(%04x:%02x:%02x.%x) MSI vector %d changed\n",
+                            __func__, vdev->host.domain, vdev->host.bus,
+                            vdev->host.slot, vdev->host.function, i);
+
+                    kvm_irqchip_update_msi_route(kvm_state, vector->virq, msg);
+                    vector->msg = msg;
+                }
+            }
         }
     }
 
