diff --git a/hw/ac97.c b/hw/ac97.c
index d71072d..bf818b8 100644
--- a/hw/ac97.c
+++ b/hw/ac97.c
@@ -1343,6 +1343,14 @@ static PCIDeviceInfo ac97_info = {
     .init         = ac97_initfn,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_ac97);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void ac97_register (void)
 {
     pci_qdev_register (&ac97_info);
diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c
index 0b2bc97..aaa009b 100644
--- a/hw/acpi_piix4.c
+++ b/hw/acpi_piix4.c
@@ -460,6 +460,14 @@ static PCIDeviceInfo piix4_pm_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_acpi);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void piix4_pm_register(void)
 {
     pci_qdev_register(&piix4_pm_info);
diff --git a/hw/apb_pci.c b/hw/apb_pci.c
index 84e9af7..e5d7954 100644
--- a/hw/apb_pci.c
+++ b/hw/apb_pci.c
@@ -472,6 +472,14 @@ static PCIDeviceInfo pbm_pci_bridge_info = {
     .is_bridge = 1,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pci_device);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void pbm_register_devices(void)
 {
     sysbus_register_withprop(&pbm_host_info);
diff --git a/hw/apic.c b/hw/apic.c
index 9febf40..cdf64dc 100644
--- a/hw/apic.c
+++ b/hw/apic.c
@@ -1025,6 +1025,14 @@ static SysBusDeviceInfo apic_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_apic);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void apic_register_devices(void)
 {
     sysbus_register_withprop(&apic_info);
diff --git a/hw/arm_sysctl.c b/hw/arm_sysctl.c
index 9225b58..e11b1ee 100644
--- a/hw/arm_sysctl.c
+++ b/hw/arm_sysctl.c
@@ -363,6 +363,14 @@ static SysBusDeviceInfo arm_sysctl_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_arm_sysctl);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void arm_sysctl_register_devices(void)
 {
     sysbus_register_withprop(&arm_sysctl_info);
diff --git a/hw/bonito.c b/hw/bonito.c
index 65a4a63..6ec0777 100644
--- a/hw/bonito.c
+++ b/hw/bonito.c
@@ -798,6 +798,14 @@ static PCIDeviceInfo bonito_info = {
     .init         = bonito_initfn,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_bonito);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static SysBusDeviceInfo bonito_pcihost_info = {
     .init         = bonito_pcihost_initfn,
     .qdev.name    = "Bonito-pcihost",
diff --git a/hw/cirrus_vga.c b/hw/cirrus_vga.c
index 2724f7b..97a1c4c 100644
--- a/hw/cirrus_vga.c
+++ b/hw/cirrus_vga.c
@@ -3145,6 +3145,14 @@ static PCIDeviceInfo cirrus_vga_info = {
     .config_write = pci_cirrus_write_config,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pci_cirrus_vga);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void cirrus_vga_register(void)
 {
     pci_qdev_register(&cirrus_vga_info);
diff --git a/hw/cs4231.c b/hw/cs4231.c
index a65b697..d9601d0 100644
--- a/hw/cs4231.c
+++ b/hw/cs4231.c
@@ -167,6 +167,14 @@ static SysBusDeviceInfo cs4231_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_cs4231);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void cs4231_register_devices(void)
 {
     sysbus_register_withprop(&cs4231_info);
diff --git a/hw/cs4231a.c b/hw/cs4231a.c
index 598f032..e036faf 100644
--- a/hw/cs4231a.c
+++ b/hw/cs4231a.c
@@ -679,6 +679,14 @@ static ISADeviceInfo cs4231a_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_cs4231a);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void cs4231a_register (void)
 {
     isa_qdev_register (&cs4231a_info);
diff --git a/hw/dec_pci.c b/hw/dec_pci.c
index bf88f2a..4924a43 100644
--- a/hw/dec_pci.c
+++ b/hw/dec_pci.c
@@ -76,6 +76,14 @@ static PCIDeviceInfo dec_21154_pci_bridge_info = {
     .is_bridge = 1,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pci_device);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 PCIBus *pci_dec_21154_init(PCIBus *parent_bus, int devfn)
 {
     PCIDevice *dev;
diff --git a/hw/e1000.c b/hw/e1000.c
index 2a4d5c7..e906c65 100644
--- a/hw/e1000.c
+++ b/hw/e1000.c
@@ -1212,6 +1212,14 @@ static PCIDeviceInfo e1000_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_e1000);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void e1000_register_devices(void)
 {
     pci_qdev_register(&e1000_info);
diff --git a/hw/eccmemctl.c b/hw/eccmemctl.c
index 2bda87b..770b6aa 100644
--- a/hw/eccmemctl.c
+++ b/hw/eccmemctl.c
@@ -323,6 +323,14 @@ static SysBusDeviceInfo ecc_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_ecc);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 
 static void ecc_register_devices(void)
 {
diff --git a/hw/eeprom93xx.c b/hw/eeprom93xx.c
index 660b28f..cfa695d 100644
--- a/hw/eeprom93xx.c
+++ b/hw/eeprom93xx.c
@@ -320,6 +320,14 @@ eeprom_t *eeprom93xx_new(DeviceState *dev, uint16_t nwords)
     return eeprom;
 }
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description(void)
+{
+    register_vmstate_description(&vmstate_eeprom);
+}
+
+vmstate_init(init_vmstate_description);
+
 void eeprom93xx_free(DeviceState *dev, eeprom_t *eeprom)
 {
     /* Destroy EEPROM. */
diff --git a/hw/es1370.c b/hw/es1370.c
index 40cb48c..d2f3671 100644
--- a/hw/es1370.c
+++ b/hw/es1370.c
@@ -1045,6 +1045,14 @@ static PCIDeviceInfo es1370_info = {
     .init         = es1370_initfn,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_es1370);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void es1370_register (void)
 {
     pci_qdev_register (&es1370_info);
diff --git a/hw/escc.c b/hw/escc.c
index f6fd919..08062e7 100644
--- a/hw/escc.c
+++ b/hw/escc.c
@@ -953,6 +953,14 @@ static SysBusDeviceInfo escc_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_escc);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void escc_register_devices(void)
 {
     sysbus_register_withprop(&escc_info);
diff --git a/hw/esp.c b/hw/esp.c
index fa9d2a2..977890e 100644
--- a/hw/esp.c
+++ b/hw/esp.c
@@ -743,6 +743,14 @@ static SysBusDeviceInfo esp_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_esp);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void esp_register_devices(void)
 {
     sysbus_register_withprop(&esp_info);
diff --git a/hw/fdc.c b/hw/fdc.c
index 9fdbc75..4b02dce 100644
--- a/hw/fdc.c
+++ b/hw/fdc.c
@@ -1938,6 +1938,14 @@ static ISADeviceInfo isa_fdc_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_isa_fdc);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static const VMStateDescription vmstate_sysbus_fdc ={
     .name = "fdc",
     .version_id = 2,
@@ -1961,6 +1969,14 @@ static SysBusDeviceInfo sysbus_fdc_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&vmstate_sysbus_fdc);
+}
+
+vmstate_init(init_vmstate_description_1);
+
 static SysBusDeviceInfo sun4m_fdc_info = {
     .init = sun4m_fdc_init1,
     .qdev.name  = "SUNW,fdtwo",
diff --git a/hw/fw_cfg.c b/hw/fw_cfg.c
index 85c8c3c..67603a9 100644
--- a/hw/fw_cfg.c
+++ b/hw/fw_cfg.c
@@ -399,6 +399,14 @@ static SysBusDeviceInfo fw_cfg_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_fw_cfg);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void fw_cfg_register_devices(void)
 {
     sysbus_register_withprop(&fw_cfg_info);
diff --git a/hw/gus.c b/hw/gus.c
index ff9e7c7..8e35ffb 100644
--- a/hw/gus.c
+++ b/hw/gus.c
@@ -315,6 +315,14 @@ static ISADeviceInfo gus_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_gus);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void gus_register (void)
 {
     isa_qdev_register (&gus_info);
diff --git a/hw/hda-audio.c b/hw/hda-audio.c
index c699d6f..f384de6 100644
--- a/hw/hda-audio.c
+++ b/hw/hda-audio.c
@@ -906,6 +906,14 @@ static HDACodecDeviceInfo hda_audio_info_output = {
     .stream       = hda_audio_stream,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_hda_audio);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static HDACodecDeviceInfo hda_audio_info_duplex = {
     .qdev.name    = "hda-duplex",
     .qdev.desc    = "HDA Audio Codec, duplex",
diff --git a/hw/hpet.c b/hw/hpet.c
index ef9a2a0..9010f45 100644
--- a/hw/hpet.c
+++ b/hw/hpet.c
@@ -737,6 +737,14 @@ static SysBusDeviceInfo hpet_device_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_hpet);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void hpet_register_device(void)
 {
     sysbus_register_withprop(&hpet_device_info);
diff --git a/hw/hw.h b/hw/hw.h
index 1b09039..81bbd7a 100644
--- a/hw/hw.h
+++ b/hw/hw.h
@@ -914,4 +914,7 @@ int vmstate_register_with_alias_id(DeviceState *dev, int instance_id,
                                    int required_for_version);
 void vmstate_unregister(DeviceState *dev, const VMStateDescription *vmsd,
                         void *opaque);
+
+void register_vmstate_description(const VMStateDescription *desc);
+
 #endif
diff --git a/hw/i2c.c b/hw/i2c.c
index f80d12d..85ae1f9 100644
--- a/hw/i2c.c
+++ b/hw/i2c.c
@@ -66,6 +66,14 @@ i2c_bus *i2c_init_bus(DeviceState *parent, const char *name)
     return bus;
 }
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description(void)
+{
+    register_vmstate_description(&vmstate_i2c_bus);
+}
+
+vmstate_init(init_vmstate_description);
+
 void i2c_set_slave_address(i2c_slave *dev, uint8_t address)
 {
     dev->address = address;
diff --git a/hw/i8254.c b/hw/i8254.c
index a9ca9f6..261f860 100644
--- a/hw/i8254.c
+++ b/hw/i8254.c
@@ -539,6 +539,14 @@ static ISADeviceInfo pit_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pit);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void pit_register(void)
 {
     isa_qdev_register(&pit_info);
diff --git a/hw/i8259.c b/hw/i8259.c
index 84d330d..388e145 100644
--- a/hw/i8259.c
+++ b/hw/i8259.c
@@ -487,6 +487,14 @@ static void pic_init1(int io_addr, int elcr_addr, PicState *s)
     qemu_register_reset(pic_reset, s);
 }
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description(void)
+{
+    register_vmstate_description(&vmstate_pic);
+}
+
+vmstate_init(init_vmstate_description);
+
 void pic_info(Monitor *mon)
 {
     int i;
diff --git a/hw/intel-hda.c b/hw/intel-hda.c
index b0b1d12..a32d28d 100644
--- a/hw/intel-hda.c
+++ b/hw/intel-hda.c
@@ -1283,6 +1283,14 @@ static PCIDeviceInfo intel_hda_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_intel_hda);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void intel_hda_register(void)
 {
     pci_qdev_register(&intel_hda_info);
diff --git a/hw/ioapic.c b/hw/ioapic.c
index 569327d..8ac6d34 100644
--- a/hw/ioapic.c
+++ b/hw/ioapic.c
@@ -350,6 +350,14 @@ static SysBusDeviceInfo ioapic_info = {
     .qdev.no_user = 1,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_ioapic);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void ioapic_register_devices(void)
 {
     sysbus_register_withprop(&ioapic_info);
diff --git a/hw/ioh3420.c b/hw/ioh3420.c
index 95adf09..7b0b801 100644
--- a/hw/ioh3420.c
+++ b/hw/ioh3420.c
@@ -229,6 +229,14 @@ static PCIDeviceInfo ioh3420_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_ioh3420);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void ioh3420_register(void)
 {
     pci_qdev_register(&ioh3420_info);
diff --git a/hw/kvmclock.c b/hw/kvmclock.c
index b6ceddf..f9c05cd 100644
--- a/hw/kvmclock.c
+++ b/hw/kvmclock.c
@@ -99,6 +99,14 @@ static SysBusDeviceInfo kvmclock_info = {
     .init = kvmclock_init,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&kvmclock_vmsd);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 /* Note: Must be called after VCPU initialization. */
 void kvmclock_create(void)
 {
diff --git a/hw/lance.c b/hw/lance.c
index ddb1cbb..32d81ca 100644
--- a/hw/lance.c
+++ b/hw/lance.c
@@ -153,6 +153,14 @@ static SysBusDeviceInfo lance_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_lance);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void lance_register_devices(void)
 {
     sysbus_register_withprop(&lance_info);
diff --git a/hw/lm32_juart.c b/hw/lm32_juart.c
index fddcf7e..a49308c 100644
--- a/hw/lm32_juart.c
+++ b/hw/lm32_juart.c
@@ -142,6 +142,14 @@ static SysBusDeviceInfo lm32_juart_info = {
     .qdev.reset = juart_reset,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_lm32_juart);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void lm32_juart_register(void)
 {
     sysbus_register_withprop(&lm32_juart_info);
diff --git a/hw/lm32_pic.c b/hw/lm32_pic.c
index 02941a7..de4f310 100644
--- a/hw/lm32_pic.c
+++ b/hw/lm32_pic.c
@@ -182,6 +182,14 @@ static SysBusDeviceInfo lm32_pic_info = {
     .qdev.reset = pic_reset,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_lm32_pic);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void lm32_pic_register(void)
 {
     sysbus_register_withprop(&lm32_pic_info);
diff --git a/hw/lm32_sys.c b/hw/lm32_sys.c
index 427b05f..4c718b7 100644
--- a/hw/lm32_sys.c
+++ b/hw/lm32_sys.c
@@ -153,6 +153,14 @@ static SysBusDeviceInfo lm32_sys_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_lm32_sys);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void lm32_sys_register(void)
 {
     sysbus_register_withprop(&lm32_sys_info);
diff --git a/hw/lm32_timer.c b/hw/lm32_timer.c
index ed28984..445cfde 100644
--- a/hw/lm32_timer.c
+++ b/hw/lm32_timer.c
@@ -214,6 +214,14 @@ static SysBusDeviceInfo lm32_timer_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_lm32_timer);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void lm32_timer_register(void)
 {
     sysbus_register_withprop(&lm32_timer_info);
diff --git a/hw/lm32_uart.c b/hw/lm32_uart.c
index e225087..32c6ffd 100644
--- a/hw/lm32_uart.c
+++ b/hw/lm32_uart.c
@@ -280,6 +280,14 @@ static SysBusDeviceInfo lm32_uart_info = {
     .qdev.reset = uart_reset,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_lm32_uart);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void lm32_uart_register(void)
 {
     sysbus_register_withprop(&lm32_uart_info);
diff --git a/hw/lm832x.c b/hw/lm832x.c
index 590a4cc..ac097bd 100644
--- a/hw/lm832x.c
+++ b/hw/lm832x.c
@@ -504,6 +504,14 @@ static I2CSlaveInfo lm8323_info = {
     .send = lm_i2c_tx
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_lm_kbd);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void lm832x_register_devices(void)
 {
     i2c_register_slave(&lm8323_info);
diff --git a/hw/lsi53c895a.c b/hw/lsi53c895a.c
index 84a4992..699261b 100644
--- a/hw/lsi53c895a.c
+++ b/hw/lsi53c895a.c
@@ -2211,6 +2211,14 @@ static PCIDeviceInfo lsi_info = {
     .exit       = lsi_scsi_uninit,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_lsi_scsi);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void lsi53c895a_register_devices(void)
 {
     pci_qdev_register(&lsi_info);
diff --git a/hw/marvell_88w8618_audio.c b/hw/marvell_88w8618_audio.c
index 3eff925..25437ea 100644
--- a/hw/marvell_88w8618_audio.c
+++ b/hw/marvell_88w8618_audio.c
@@ -291,6 +291,14 @@ static SysBusDeviceInfo mv88w8618_audio_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&mv88w8618_audio_vmsd);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void mv88w8618_register_devices(void)
 {
     sysbus_register_withprop(&mv88w8618_audio_info);
diff --git a/hw/max7310.c b/hw/max7310.c
index c1bdb2e..12b8769 100644
--- a/hw/max7310.c
+++ b/hw/max7310.c
@@ -196,6 +196,14 @@ static I2CSlaveInfo max7310_info = {
     .send = max7310_tx
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_max7310);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void max7310_register_devices(void)
 {
     i2c_register_slave(&max7310_info);
diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c
index 1c9a706..7b80c18 100644
--- a/hw/mc146818rtc.c
+++ b/hw/mc146818rtc.c
@@ -650,6 +650,14 @@ static ISADeviceInfo mc146818rtc_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_rtc);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void mc146818rtc_register(void)
 {
     isa_qdev_register(&mc146818rtc_info);
diff --git a/hw/mst_fpga.c b/hw/mst_fpga.c
index a04355c..c5111b9 100644
--- a/hw/mst_fpga.c
+++ b/hw/mst_fpga.c
@@ -248,6 +248,14 @@ static SysBusDeviceInfo mst_fpga_info = {
 	.qdev.vmsd = &vmstate_mst_fpga_regs,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_mst_fpga_regs);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void mst_fpga_register(void)
 {
 	sysbus_register_withprop(&mst_fpga_info);
diff --git a/hw/musicpal.c b/hw/musicpal.c
index d98aa8d..773b93c 100644
--- a/hw/musicpal.c
+++ b/hw/musicpal.c
@@ -423,6 +423,14 @@ static SysBusDeviceInfo mv88w8618_eth_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&mv88w8618_eth_vmsd);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 /* LCD register offsets */
 #define MP_LCD_IRQCTRL          0x180
 #define MP_LCD_IRQSTAT          0x184
@@ -637,6 +645,14 @@ static SysBusDeviceInfo musicpal_lcd_info = {
     .qdev.vmsd = &musicpal_lcd_vmsd,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&musicpal_lcd_vmsd);
+}
+
+vmstate_init(init_vmstate_description_1);
+
 /* PIC register offsets */
 #define MP_PIC_STATUS           0x00
 #define MP_PIC_ENABLE_SET       0x08
@@ -753,6 +769,14 @@ static SysBusDeviceInfo mv88w8618_pic_info = {
     .qdev.vmsd = &mv88w8618_pic_vmsd,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_2(void)
+{
+    register_vmstate_description(&mv88w8618_pic_vmsd);
+}
+
+vmstate_init(init_vmstate_description_2);
+
 /* PIT register offsets */
 #define MP_PIT_TIMER1_LENGTH    0x00
 /* ... */
@@ -927,6 +951,14 @@ static SysBusDeviceInfo mv88w8618_pit_info = {
     .qdev.vmsd  = &mv88w8618_pit_vmsd,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_3(void)
+{
+    register_vmstate_description(&mv88w8618_pit_vmsd);
+}
+
+vmstate_init(init_vmstate_description_3);
+
 /* Flash config register offsets */
 #define MP_FLASHCFG_CFGR0    0x04
 
@@ -1004,6 +1036,14 @@ static SysBusDeviceInfo mv88w8618_flashcfg_info = {
     .qdev.vmsd  = &mv88w8618_flashcfg_vmsd,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_4(void)
+{
+    register_vmstate_description(&mv88w8618_flashcfg_vmsd);
+}
+
+vmstate_init(init_vmstate_description_4);
+
 /* Misc register offsets */
 #define MP_MISC_BOARD_REVISION  0x18
 
@@ -1335,6 +1375,14 @@ static SysBusDeviceInfo musicpal_gpio_info = {
     .qdev.vmsd  = &musicpal_gpio_vmsd,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_5(void)
+{
+    register_vmstate_description(&musicpal_gpio_vmsd);
+}
+
+vmstate_init(init_vmstate_description_5);
+
 /* Keyboard codes & masks */
 #define KEY_RELEASED            0x80
 #define KEY_CODE                0x7f
@@ -1478,6 +1526,14 @@ static SysBusDeviceInfo musicpal_key_info = {
     .qdev.vmsd  = &musicpal_key_vmsd,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_6(void)
+{
+    register_vmstate_description(&musicpal_key_vmsd);
+}
+
+vmstate_init(init_vmstate_description_6);
+
 static struct arm_boot_info musicpal_binfo = {
     .loader_start = 0x0,
     .board_id = 0x20e,
diff --git a/hw/ne2000.c b/hw/ne2000.c
index 5966359..270578b 100644
--- a/hw/ne2000.c
+++ b/hw/ne2000.c
@@ -773,6 +773,14 @@ static PCIDeviceInfo ne2000_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pci_ne2000);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void ne2000_register_devices(void)
 {
     pci_qdev_register(&ne2000_info);
diff --git a/hw/pc.c b/hw/pc.c
index 6939c04..5211b29 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -497,6 +497,14 @@ static ISADeviceInfo port92_info = {
     .init          = port92_initfn,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_port92_isa);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void port92_register(void)
 {
     isa_qdev_register(&port92_info);
diff --git a/hw/pci.c b/hw/pci.c
index 8b76cea..50b9a14 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -269,6 +269,14 @@ void pci_bus_new_inplace(PCIBus *bus, DeviceState *parent,
     vmstate_register(NULL, -1, &vmstate_pcibus, bus);
 }
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description(void)
+{
+    register_vmstate_description(&vmstate_pcibus);
+}
+
+vmstate_init(init_vmstate_description);
+
 PCIBus *pci_bus_new(DeviceState *parent, const char *name, int devfn_min)
 {
     PCIBus *bus;
diff --git a/hw/pckbd.c b/hw/pckbd.c
index ae65c04..027f69e 100644
--- a/hw/pckbd.c
+++ b/hw/pckbd.c
@@ -433,6 +433,14 @@ void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq,
     qemu_register_reset(kbd_reset, s);
 }
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description(void)
+{
+    register_vmstate_description(&vmstate_kbd);
+}
+
+vmstate_init(init_vmstate_description);
+
 typedef struct ISAKBDState {
     ISADevice dev;
     KBDState  kbd;
@@ -492,6 +500,14 @@ static ISADeviceInfo i8042_info = {
     .init          = i8042_initfn,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_kbd_isa);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void i8042_register(void)
 {
     isa_qdev_register(&i8042_info);
diff --git a/hw/pcnet-pci.c b/hw/pcnet-pci.c
index 339a401..d3c2738 100644
--- a/hw/pcnet-pci.c
+++ b/hw/pcnet-pci.c
@@ -338,6 +338,14 @@ static PCIDeviceInfo pcnet_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pci_pcnet);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void pci_pcnet_register_devices(void)
 {
     pci_qdev_register(&pcnet_info);
diff --git a/hw/piix_pci.c b/hw/piix_pci.c
index 358da58..1e5f379 100644
--- a/hw/piix_pci.c
+++ b/hw/piix_pci.c
@@ -364,6 +364,14 @@ static PCIDeviceInfo i440fx_info[] = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_piix3);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static SysBusDeviceInfo i440fx_pcihost_info = {
     .init         = i440fx_pcihost_initfn,
     .qdev.name    = "i440FX-pcihost",
diff --git a/hw/pl031.c b/hw/pl031.c
index 8c2f9d0..5372e21 100644
--- a/hw/pl031.c
+++ b/hw/pl031.c
@@ -229,6 +229,14 @@ static SysBusDeviceInfo pl031_info = {
     .qdev.no_user = 1,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pl031);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void pl031_register_devices(void)
 {
     sysbus_register_withprop(&pl031_info);
diff --git a/hw/pl050.c b/hw/pl050.c
index b155cc0..4c2b279 100644
--- a/hw/pl050.c
+++ b/hw/pl050.c
@@ -171,6 +171,14 @@ static SysBusDeviceInfo pl050_kbd_info = {
     .qdev.vmsd = &vmstate_pl050,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pl050);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static SysBusDeviceInfo pl050_mouse_info = {
     .init = pl050_init_mouse,
     .qdev.name  = "pl050_mouse",
@@ -178,6 +186,14 @@ static SysBusDeviceInfo pl050_mouse_info = {
     .qdev.vmsd = &vmstate_pl050,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&vmstate_pl050);
+}
+
+vmstate_init(init_vmstate_description_1);
+
 static void pl050_register_devices(void)
 {
     sysbus_register_withprop(&pl050_kbd_info);
diff --git a/hw/pl080.c b/hw/pl080.c
index 901f04a..1c6198b 100644
--- a/hw/pl080.c
+++ b/hw/pl080.c
@@ -388,6 +388,14 @@ static SysBusDeviceInfo pl080_info = {
     .qdev.no_user = 1,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pl080);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static SysBusDeviceInfo pl081_info = {
     .init = pl081_init,
     .qdev.name = "pl081",
@@ -396,6 +404,14 @@ static SysBusDeviceInfo pl081_info = {
     .qdev.no_user = 1,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&vmstate_pl080);
+}
+
+vmstate_init(init_vmstate_description_1);
+
 /* The PL080 and PL081 are the same except for the number of channels
    they implement (8 and 2 respectively).  */
 static void pl080_register_devices(void)
diff --git a/hw/pl110.c b/hw/pl110.c
index 06d2dfa..9073a40 100644
--- a/hw/pl110.c
+++ b/hw/pl110.c
@@ -405,6 +405,14 @@ static SysBusDeviceInfo pl110_info = {
     .qdev.no_user = 1,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pl110);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static SysBusDeviceInfo pl110_versatile_info = {
     .init = pl110_versatile_init,
     .qdev.name = "pl110_versatile",
@@ -413,6 +421,14 @@ static SysBusDeviceInfo pl110_versatile_info = {
     .qdev.no_user = 1,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&vmstate_pl110);
+}
+
+vmstate_init(init_vmstate_description_1);
+
 static void pl110_register_devices(void)
 {
     sysbus_register_withprop(&pl110_info);
diff --git a/hw/pl190.c b/hw/pl190.c
index 75f2ba1..a03db5c 100644
--- a/hw/pl190.c
+++ b/hw/pl190.c
@@ -270,6 +270,14 @@ static SysBusDeviceInfo pl190_info = {
     .qdev.no_user = 1,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pl190);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void pl190_register_devices(void)
 {
     sysbus_register_withprop(&pl190_info);
diff --git a/hw/ps2.c b/hw/ps2.c
index 91b73e0..c77d5fc 100644
--- a/hw/ps2.c
+++ b/hw/ps2.c
@@ -615,6 +615,14 @@ void *ps2_kbd_init(void (*update_irq)(void *, int), void *update_arg)
     return s;
 }
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_ps2_keyboard);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 void *ps2_mouse_init(void (*update_irq)(void *, int), void *update_arg)
 {
     PS2MouseState *s = (PS2MouseState *)qemu_mallocz(sizeof(PS2MouseState));
@@ -626,3 +634,11 @@ void *ps2_mouse_init(void (*update_irq)(void *, int), void *update_arg)
     qemu_register_reset(ps2_mouse_reset, s);
     return s;
 }
+
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&vmstate_ps2_mouse);
+}
+
+vmstate_init(init_vmstate_description_1);
diff --git a/hw/pxa2xx.c b/hw/pxa2xx.c
index 9b95e2c..d8f2943 100644
--- a/hw/pxa2xx.c
+++ b/hw/pxa2xx.c
@@ -1293,6 +1293,14 @@ static SysBusDeviceInfo pxa2xx_rtc_sysbus_info = {
     .qdev.vmsd  = &vmstate_pxa2xx_rtc_regs,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pxa2xx_rtc_regs);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 /* I2C Interface */
 typedef struct {
     i2c_slave i2c;
@@ -1595,6 +1603,14 @@ static SysBusDeviceInfo pxa2xx_i2c_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&vmstate_pxa2xx_i2c);
+}
+
+vmstate_init(init_vmstate_description_1);
+
 /* PXA Inter-IC Sound Controller */
 static void pxa2xx_i2s_reset(PXA2xxI2SState *i2s)
 {
diff --git a/hw/pxa2xx_dma.c b/hw/pxa2xx_dma.c
index a67498b..6d5fb56 100644
--- a/hw/pxa2xx_dma.c
+++ b/hw/pxa2xx_dma.c
@@ -561,6 +561,14 @@ static SysBusDeviceInfo pxa2xx_dma_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pxa2xx_dma);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void pxa2xx_dma_register(void)
 {
     sysbus_register_withprop(&pxa2xx_dma_info);
diff --git a/hw/pxa2xx_pic.c b/hw/pxa2xx_pic.c
index e9a5361..fa6abba 100644
--- a/hw/pxa2xx_pic.c
+++ b/hw/pxa2xx_pic.c
@@ -309,6 +309,14 @@ static SysBusDeviceInfo pxa2xx_pic_info = {
     .qdev.vmsd  = &vmstate_pxa2xx_pic_regs,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pxa2xx_pic_regs);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void pxa2xx_pic_register(void)
 {
     sysbus_register_withprop(&pxa2xx_pic_info);
diff --git a/hw/pxa2xx_timer.c b/hw/pxa2xx_timer.c
index f777a21..db0603e 100644
--- a/hw/pxa2xx_timer.c
+++ b/hw/pxa2xx_timer.c
@@ -496,6 +496,14 @@ static SysBusDeviceInfo pxa25x_timer_dev_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pxa2xx_timer_regs);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static SysBusDeviceInfo pxa27x_timer_dev_info = {
     .init       = pxa2xx_timer_init,
     .qdev.name  = "pxa27x-timer",
@@ -510,6 +518,14 @@ static SysBusDeviceInfo pxa27x_timer_dev_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&vmstate_pxa2xx_timer_regs);
+}
+
+vmstate_init(init_vmstate_description_1);
+
 static void pxa2xx_timer_register(void)
 {
     sysbus_register_withprop(&pxa25x_timer_dev_info);
diff --git a/hw/qxl.c b/hw/qxl.c
index fe4212b..2a0d090 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -1504,6 +1504,14 @@ static PCIDeviceInfo qxl_info_primary = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&qxl_vmstate);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static PCIDeviceInfo qxl_info_secondary = {
     .qdev.name    = "qxl",
     .qdev.desc    = "Spice QXL GPU (secondary)",
@@ -1522,6 +1530,14 @@ static PCIDeviceInfo qxl_info_secondary = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&qxl_vmstate);
+}
+
+vmstate_init(init_vmstate_description_1);
+
 static void qxl_register(void)
 {
     pci_qdev_register(&qxl_info_primary);
diff --git a/hw/rtl8139.c b/hw/rtl8139.c
index 0ba51fc..3b2f61e 100644
--- a/hw/rtl8139.c
+++ b/hw/rtl8139.c
@@ -3269,6 +3269,14 @@ static const VMStateDescription vmstate_rtl8139 = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_rtl8139_hotplug_ready);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 /***********************************************************/
 /* PCI RTL8139 definitions */
 
@@ -3422,6 +3430,14 @@ static PCIDeviceInfo rtl8139_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&vmstate_rtl8139);
+}
+
+vmstate_init(init_vmstate_description_1);
+
 static void rtl8139_register_devices(void)
 {
     pci_qdev_register(&rtl8139_info);
diff --git a/hw/sb16.c b/hw/sb16.c
index a76df1b..c98546a 100644
--- a/hw/sb16.c
+++ b/hw/sb16.c
@@ -1413,6 +1413,14 @@ static ISADeviceInfo sb16_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_sb16);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void sb16_register (void)
 {
     isa_qdev_register (&sb16_info);
diff --git a/hw/sbi.c b/hw/sbi.c
index 53f66f2..53a236c 100644
--- a/hw/sbi.c
+++ b/hw/sbi.c
@@ -140,6 +140,14 @@ static SysBusDeviceInfo sbi_info = {
     .qdev.reset = sbi_reset,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_sbi);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void sbi_register_devices(void)
 {
     sysbus_register_withprop(&sbi_info);
diff --git a/hw/serial.c b/hw/serial.c
index 0ee61dd..c7ba97c 100644
--- a/hw/serial.c
+++ b/hw/serial.c
@@ -804,8 +804,6 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
     s->chr = chr;
     serial_init_core(s);
 
-    vmstate_register(NULL, base, &vmstate_serial, s);
-
     register_ioport_write(base, 8, 1, serial_ioport_write, s);
     register_ioport_read(base, 8, 1, serial_ioport_read, s);
     return s;
@@ -971,6 +969,14 @@ static ISADeviceInfo serial_isa_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_isa_serial);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void serial_register_devices(void)
 {
     isa_qdev_register(&serial_isa_info);
diff --git a/hw/slavio_intctl.c b/hw/slavio_intctl.c
index a83e5b8..8b3bdb5 100644
--- a/hw/slavio_intctl.c
+++ b/hw/slavio_intctl.c
@@ -455,6 +455,14 @@ static SysBusDeviceInfo slavio_intctl_info = {
     .qdev.reset = slavio_intctl_reset,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_intctl);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void slavio_intctl_register_devices(void)
 {
     sysbus_register_withprop(&slavio_intctl_info);
diff --git a/hw/slavio_misc.c b/hw/slavio_misc.c
index 198360d..0b415b9 100644
--- a/hw/slavio_misc.c
+++ b/hw/slavio_misc.c
@@ -484,6 +484,14 @@ static SysBusDeviceInfo slavio_misc_info = {
     .qdev.reset  = slavio_misc_reset,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_misc);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static SysBusDeviceInfo apc_info = {
     .init = apc_init1,
     .qdev.name  = "apc",
diff --git a/hw/slavio_timer.c b/hw/slavio_timer.c
index 5511313..0f95113 100644
--- a/hw/slavio_timer.c
+++ b/hw/slavio_timer.c
@@ -416,6 +416,14 @@ static SysBusDeviceInfo slavio_timer_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_slavio_timer);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void slavio_timer_register_devices(void)
 {
     sysbus_register_withprop(&slavio_timer_info);
diff --git a/hw/smc91c111.c b/hw/smc91c111.c
index dafea5c..63b4507 100644
--- a/hw/smc91c111.c
+++ b/hw/smc91c111.c
@@ -774,6 +774,14 @@ static SysBusDeviceInfo smc91c111_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_smc91c111);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void smc91c111_register_devices(void)
 {
     sysbus_register_withprop(&smc91c111_info);
diff --git a/hw/sparc32_dma.c b/hw/sparc32_dma.c
index e75694b..d8be398 100644
--- a/hw/sparc32_dma.c
+++ b/hw/sparc32_dma.c
@@ -297,6 +297,14 @@ static SysBusDeviceInfo sparc32_dma_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_dma);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void sparc32_dma_register_devices(void)
 {
     sysbus_register_withprop(&sparc32_dma_info);
diff --git a/hw/spitz.c b/hw/spitz.c
index 006f7a9..1078486 100644
--- a/hw/spitz.c
+++ b/hw/spitz.c
@@ -1043,6 +1043,14 @@ static SysBusDeviceInfo sl_nand_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_sl_nand_info);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static VMStateDescription vmstate_spitz_kbd = {
     .name = "spitz-keyboard",
     .version_id = 1,
@@ -1067,6 +1075,14 @@ static SysBusDeviceInfo spitz_keyboard_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&vmstate_spitz_kbd);
+}
+
+vmstate_init(init_vmstate_description_1);
+
 static const VMStateDescription vmstate_corgi_ssp_regs = {
     .name = "corgi-ssp",
     .version_id = 1,
@@ -1086,6 +1102,14 @@ static SSISlaveInfo corgi_ssp_info = {
     .transfer = corgi_ssp_transfer
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_2(void)
+{
+    register_vmstate_description(&vmstate_corgi_ssp_regs);
+}
+
+vmstate_init(init_vmstate_description_2);
+
 static const VMStateDescription vmstate_spitz_lcdtg_regs = {
     .name = "spitz-lcdtg",
     .version_id = 1,
@@ -1106,6 +1130,14 @@ static SSISlaveInfo spitz_lcdtg_info = {
     .transfer = spitz_lcdtg_transfer
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_3(void)
+{
+    register_vmstate_description(&vmstate_spitz_lcdtg_regs);
+}
+
+vmstate_init(init_vmstate_description_3);
+
 static void spitz_register_devices(void)
 {
     ssi_register_slave(&corgi_ssp_info);
diff --git a/hw/ssd0303.c b/hw/ssd0303.c
index 108c068..dc3012d 100644
--- a/hw/ssd0303.c
+++ b/hw/ssd0303.c
@@ -304,6 +304,14 @@ static I2CSlaveInfo ssd0303_info = {
     .send = ssd0303_send
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_ssd0303);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void ssd0303_register_devices(void)
 {
     i2c_register_slave(&ssd0303_info);
diff --git a/hw/sun4c_intctl.c b/hw/sun4c_intctl.c
index 5c7fdef..025ea92 100644
--- a/hw/sun4c_intctl.c
+++ b/hw/sun4c_intctl.c
@@ -216,6 +216,14 @@ static SysBusDeviceInfo sun4c_intctl_info = {
     .qdev.reset = sun4c_intctl_reset,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_sun4c_intctl);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void sun4c_intctl_register_devices(void)
 {
     sysbus_register_withprop(&sun4c_intctl_info);
diff --git a/hw/sun4m_iommu.c b/hw/sun4m_iommu.c
index bba69ee..bb24412 100644
--- a/hw/sun4m_iommu.c
+++ b/hw/sun4m_iommu.c
@@ -370,6 +370,14 @@ static SysBusDeviceInfo iommu_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_iommu);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void iommu_register_devices(void)
 {
     sysbus_register_withprop(&iommu_info);
diff --git a/hw/tcx.c b/hw/tcx.c
index 0e32830..40a771b 100644
--- a/hw/tcx.c
+++ b/hw/tcx.c
@@ -643,6 +643,14 @@ static SysBusDeviceInfo tcx_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_tcx);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void tcx_register_devices(void)
 {
     sysbus_register_withprop(&tcx_info);
diff --git a/hw/tmp105.c b/hw/tmp105.c
index f7e6f2b..9d3325c 100644
--- a/hw/tmp105.c
+++ b/hw/tmp105.c
@@ -236,6 +236,14 @@ static I2CSlaveInfo tmp105_info = {
     .send = tmp105_tx
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_tmp105);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void tmp105_register_devices(void)
 {
     i2c_register_slave(&tmp105_info);
diff --git a/hw/twl92230.c b/hw/twl92230.c
index 8e74acc..2b570a6 100644
--- a/hw/twl92230.c
+++ b/hw/twl92230.c
@@ -868,6 +868,14 @@ static I2CSlaveInfo twl92230_info = {
     .send = menelaus_tx
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_menelaus);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void twl92230_register_devices(void)
 {
     i2c_register_slave(&twl92230_info);
diff --git a/hw/usb-hid.c b/hw/usb-hid.c
index c25362c..e8fff11 100644
--- a/hw/usb-hid.c
+++ b/hw/usb-hid.c
@@ -999,6 +999,14 @@ static struct USBDeviceInfo hid_info[] = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_usb_kbd);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void usb_hid_register_devices(void)
 {
     usb_qdev_register_many(hid_info);
diff --git a/hw/usb-hub.c b/hw/usb-hub.c
index 3dd31ba..dfac0ed 100644
--- a/hw/usb-hub.c
+++ b/hw/usb-hub.c
@@ -583,6 +583,14 @@ static struct USBDeviceInfo hub_info = {
     .handle_destroy = usb_hub_handle_destroy,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_usb_hub);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void usb_hub_register_devices(void)
 {
     usb_qdev_register(&hub_info);
diff --git a/hw/usb-uhci.c b/hw/usb-uhci.c
index 346db3e..bc8fc5b 100644
--- a/hw/usb-uhci.c
+++ b/hw/usb-uhci.c
@@ -1207,6 +1207,14 @@ static PCIDeviceInfo uhci_info[] = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_uhci);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void uhci_register(void)
 {
     pci_qdev_register_many(uhci_info);
diff --git a/hw/versatilepb.c b/hw/versatilepb.c
index 9f1bfcf..659359c 100644
--- a/hw/versatilepb.c
+++ b/hw/versatilepb.c
@@ -354,6 +354,14 @@ static SysBusDeviceInfo vpb_sic_info = {
     .qdev.no_user = 1,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_vpb_sic);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void versatilepb_register_devices(void)
 {
     sysbus_register_withprop(&vpb_sic_info);
diff --git a/hw/vga-isa.c b/hw/vga-isa.c
index fde0d56..5f1ef76 100644
--- a/hw/vga-isa.c
+++ b/hw/vga-isa.c
@@ -81,6 +81,14 @@ static ISADeviceInfo vga_info = {
     .init          = vga_initfn,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_vga_common);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void vga_register(void)
 {
     isa_qdev_register(&vga_info);
diff --git a/hw/vga-pci.c b/hw/vga-pci.c
index ce9ec45..c91739f 100644
--- a/hw/vga-pci.c
+++ b/hw/vga-pci.c
@@ -116,6 +116,14 @@ static PCIDeviceInfo vga_info = {
     .romfile      = "vgabios-stdvga.bin",
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_vga_pci);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void vga_register(void)
 {
     pci_qdev_register(&vga_info);
diff --git a/hw/vmmouse.c b/hw/vmmouse.c
index 1113f33..f2de7d8 100644
--- a/hw/vmmouse.c
+++ b/hw/vmmouse.c
@@ -282,6 +282,14 @@ static ISADeviceInfo vmmouse_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_vmmouse);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void vmmouse_dev_register(void)
 {
     isa_qdev_register(&vmmouse_info);
diff --git a/hw/vmware_vga.c b/hw/vmware_vga.c
index 4656767..106c9b4 100644
--- a/hw/vmware_vga.c
+++ b/hw/vmware_vga.c
@@ -1318,6 +1318,14 @@ static PCIDeviceInfo vmsvga_info = {
     .romfile      = "vgabios-vmware.bin",
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_vmware_vga);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void vmsvga_register(void)
 {
     pci_qdev_register(&vmsvga_info);
diff --git a/hw/vt82c686.c b/hw/vt82c686.c
index 818460d..62b8c63 100644
--- a/hw/vt82c686.c
+++ b/hw/vt82c686.c
@@ -522,6 +522,14 @@ static PCIDeviceInfo via_pm_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_acpi);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void vt82c686b_pm_register(void)
 {
     pci_qdev_register(&via_pm_info);
@@ -587,6 +595,14 @@ static PCIDeviceInfo via_info = {
     .config_write = vt82c686b_write_config,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&vmstate_via);
+}
+
+vmstate_init(init_vmstate_description_1);
+
 static void vt82c686b_register(void)
 {
     pci_qdev_register(&via_info);
diff --git a/hw/wdt_i6300esb.c b/hw/wdt_i6300esb.c
index 4a7fba7..99f3c9b 100644
--- a/hw/wdt_i6300esb.c
+++ b/hw/wdt_i6300esb.c
@@ -439,6 +439,14 @@ static PCIDeviceInfo i6300esb_info = {
     .init         = i6300esb_init,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_i6300esb);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void i6300esb_register_devices(void)
 {
     watchdog_add_model(&model);
diff --git a/hw/wdt_ib700.c b/hw/wdt_ib700.c
index 81f22d0..4cd24b9 100644
--- a/hw/wdt_ib700.c
+++ b/hw/wdt_ib700.c
@@ -128,6 +128,14 @@ static ISADeviceInfo wdt_ib700_info = {
     .init       = wdt_ib700_init,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_ib700);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void wdt_ib700_register_devices(void)
 {
     watchdog_add_model(&model);
diff --git a/hw/wm8750.c b/hw/wm8750.c
index c9c6744..dc46577 100644
--- a/hw/wm8750.c
+++ b/hw/wm8750.c
@@ -699,6 +699,14 @@ static I2CSlaveInfo wm8750_info = {
     .send = wm8750_tx
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_wm8750);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void wm8750_register_devices(void)
 {
     i2c_register_slave(&wm8750_info);
diff --git a/hw/xio3130_downstream.c b/hw/xio3130_downstream.c
index 5aa6a6b..f6fd902 100644
--- a/hw/xio3130_downstream.c
+++ b/hw/xio3130_downstream.c
@@ -194,6 +194,14 @@ static PCIDeviceInfo xio3130_downstream_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_xio3130_downstream);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void xio3130_downstream_register(void)
 {
     pci_qdev_register(&xio3130_downstream_info);
diff --git a/hw/xio3130_upstream.c b/hw/xio3130_upstream.c
index a7640f5..0b503ee 100644
--- a/hw/xio3130_upstream.c
+++ b/hw/xio3130_upstream.c
@@ -168,6 +168,14 @@ static PCIDeviceInfo xio3130_upstream_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_xio3130_upstream);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void xio3130_upstream_register(void)
 {
     pci_qdev_register(&xio3130_upstream_info);
diff --git a/hw/zaurus.c b/hw/zaurus.c
index c24aeb5..6ce61af 100644
--- a/hw/zaurus.c
+++ b/hw/zaurus.c
@@ -236,6 +236,14 @@ static SysBusDeviceInfo scoop_sysbus_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_scoop_regs);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void scoop_register(void)
 {
     sysbus_register_withprop(&scoop_sysbus_info);
diff --git a/module.h b/module.h
index 9263f1c..70c33a5 100644
--- a/module.h
+++ b/module.h
@@ -24,12 +24,14 @@ typedef enum {
     MODULE_INIT_BLOCK,
     MODULE_INIT_DEVICE,
     MODULE_INIT_MACHINE,
+    MODULE_INIT_VMSTATE,
     MODULE_INIT_MAX
 } module_init_type;
 
 #define block_init(function) module_init(function, MODULE_INIT_BLOCK)
 #define device_init(function) module_init(function, MODULE_INIT_DEVICE)
 #define machine_init(function) module_init(function, MODULE_INIT_MACHINE)
+#define vmstate_init(function) module_init(function, MODULE_INIT_MACHINE)
 
 void register_module_init(void (*fn)(void), module_init_type type);
 
diff --git a/savevm.c b/savevm.c
index 03fce62..4a37917 100644
--- a/savevm.c
+++ b/savevm.c
@@ -1285,6 +1285,10 @@ void vmstate_unregister(DeviceState *dev, const VMStateDescription *vmsd,
     }
 }
 
+void register_vmstate_description(const VMStateDescription *desc)
+{
+}
+
 static void vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd,
                                     void *opaque);
 static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
diff --git a/target-i386/machine.c b/target-i386/machine.c
index d78eceb..3a40520 100644
--- a/target-i386/machine.c
+++ b/target-i386/machine.c
@@ -504,6 +504,14 @@ static const VMStateDescription vmstate_cpu = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description(void)
+{
+    register_vmstate_description(&vmstate_cpu);
+}
+
+vmstate_init(init_vmstate_description);
+
 void cpu_save(QEMUFile *f, void *opaque)
 {
     vmstate_save_state(f, &vmstate_cpu, opaque);
