Index: /trunk/src/VBox/Devices/PC/DevACPI.cpp
===================================================================
--- /trunk/src/VBox/Devices/PC/DevACPI.cpp	(revision 59917)
+++ /trunk/src/VBox/Devices/PC/DevACPI.cpp	(revision 59918)
@@ -162,8 +162,8 @@
     SYSTEM_INFO_INDEX_SMC_STATUS        = 3,
     SYSTEM_INFO_INDEX_FDC_STATUS        = 4,
-    SYSTEM_INFO_INDEX_CPU0_STATUS       = 5,  /**< For compatibility with older saved states. */
-    SYSTEM_INFO_INDEX_CPU1_STATUS       = 6,  /**< For compatibility with older saved states. */
-    SYSTEM_INFO_INDEX_CPU2_STATUS       = 7,  /**< For compatibility with older saved states. */
-    SYSTEM_INFO_INDEX_CPU3_STATUS       = 8,  /**< For compatibility with older saved states. */
+    SYSTEM_INFO_INDEX_SERIAL2_IOBASE    = 5,
+    SYSTEM_INFO_INDEX_SERIAL2_IRQ       = 6,
+    SYSTEM_INFO_INDEX_SERIAL3_IOBASE    = 7,
+    SYSTEM_INFO_INDEX_SERIAL3_IRQ       = 8,
     SYSTEM_INFO_INDEX_HIGH_MEMORY_LENGTH= 9,
     SYSTEM_INFO_INDEX_RTC_STATUS        = 10,
@@ -187,5 +187,5 @@
     SYSTEM_INFO_INDEX_PARALLEL1_IOBASE  = 28,
     SYSTEM_INFO_INDEX_PARALLEL1_IRQ     = 29,
-    SYSTEM_INFO_INDEX_END               = 30,
+    SYSTEM_INFO_INDEX_END               = 34,
     SYSTEM_INFO_INDEX_INVALID           = 0x80,
     SYSTEM_INFO_INDEX_VALID             = 0x200
@@ -313,8 +313,16 @@
     /** Serial 1 IRQ number */
     uint8_t             uSerial1Irq;
+    /** Serial 2 IRQ number */
+    uint8_t             uSerial2Irq;
+    /** Serial 3 IRQ number */
+    uint8_t             uSerial3Irq;
     /** Serial 0 IO port base */
     RTIOPORT            uSerial0IoPortBase;
     /** Serial 1 IO port base */
     RTIOPORT            uSerial1IoPortBase;
+    /** Serial 2 IO port base */
+    RTIOPORT            uSerial2IoPortBase;
+    /** Serial 3 IO port base */
+    RTIOPORT            uSerial3IoPortBase;
 
     /** @name Parallel port config bits
@@ -1272,22 +1280,4 @@
             break;
 
-        /* This is only for compatibility with older saved states that
-           may include ACPI code that read these values.  Legacy is
-           a wonderful thing, isn't it? :-) */
-        case SYSTEM_INFO_INDEX_CPU0_STATUS:
-        case SYSTEM_INFO_INDEX_CPU1_STATUS:
-        case SYSTEM_INFO_INDEX_CPU2_STATUS:
-        case SYSTEM_INFO_INDEX_CPU3_STATUS:
-            *pu32 = (   pThis->fShowCpu
-                     && pThis->uSystemInfoIndex - SYSTEM_INFO_INDEX_CPU0_STATUS < pThis->cCpus
-                     && VMCPUSET_IS_PRESENT(&pThis->CpuSetAttached,
-                                            pThis->uSystemInfoIndex - SYSTEM_INFO_INDEX_CPU0_STATUS) )
-                  ? (  STA_DEVICE_PRESENT_MASK
-                     | STA_DEVICE_ENABLED_MASK
-                     | STA_DEVICE_SHOW_IN_UI_MASK
-                     | STA_DEVICE_FUNCTIONING_PROPERLY_MASK)
-                  : 0;
-            break;
-
         case SYSTEM_INFO_INDEX_RTC_STATUS:
             *pu32 = pThis->fShowRtc
@@ -1336,4 +1326,20 @@
         case SYSTEM_INFO_INDEX_SERIAL1_IRQ:
             *pu32 = pThis->uSerial1Irq;
+            break;
+
+        case SYSTEM_INFO_INDEX_SERIAL2_IOBASE:
+            *pu32 = pThis->uSerial2IoPortBase;
+            break;
+
+        case SYSTEM_INFO_INDEX_SERIAL2_IRQ:
+            *pu32 = pThis->uSerial2Irq;
+            break;
+
+        case SYSTEM_INFO_INDEX_SERIAL3_IOBASE:
+            *pu32 = pThis->uSerial3IoPortBase;
+            break;
+
+        case SYSTEM_INFO_INDEX_SERIAL3_IRQ:
+            *pu32 = pThis->uSerial3Irq;
             break;
 
@@ -3085,6 +3091,10 @@
                               "Serial0IoPortBase\0"
                               "Serial1IoPortBase\0"
+                              "Serial2IoPortBase\0"
+                              "Serial3IoPortBase\0"
                               "Serial0Irq\0"
                               "Serial1Irq\0"
+                              "Serial2Irq\0"
+                              "Serial3Irq\0"
                               "AcpiOemId\0"
                               "AcpiCreatorId\0"
@@ -3234,4 +3244,25 @@
                                 N_("Configuration error: Failed to read \"Serial1IoPortBase\""));
 
+    /* Read serial port 2 settings; disabled if CFGM keys do not exist. */
+    rc = CFGMR3QueryU8Def(pCfg, "Serial2Irq", &pThis->uSerial2Irq, 0);
+    if (RT_FAILURE(rc))
+        return PDMDEV_SET_ERROR(pDevIns, rc,
+                                N_("Configuration error: Failed to read \"Serial2Irq\""));
+
+    rc = CFGMR3QueryU16Def(pCfg, "Serial2IoPortBase", &pThis->uSerial2IoPortBase, 0);
+    if (RT_FAILURE(rc))
+        return PDMDEV_SET_ERROR(pDevIns, rc,
+                                N_("Configuration error: Failed to read \"Serial2IoPortBase\""));
+
+    /* Read serial port 3 settings; disabled if CFGM keys do not exist. */
+    rc = CFGMR3QueryU8Def(pCfg, "Serial3Irq", &pThis->uSerial3Irq, 0);
+    if (RT_FAILURE(rc))
+        return PDMDEV_SET_ERROR(pDevIns, rc,
+                                N_("Configuration error: Failed to read \"Serial3Irq\""));
+
+    rc = CFGMR3QueryU16Def(pCfg, "Serial3IoPortBase", &pThis->uSerial3IoPortBase, 0);
+    if (RT_FAILURE(rc))
+        return PDMDEV_SET_ERROR(pDevIns, rc,
+                                N_("Configuration error: Failed to read \"Serial3IoPortBase\""));
     /*
      * Query settings for both parallel ports, if the CFGM keys don't exist pretend that
Index: /trunk/src/VBox/Devices/PC/vbox.dsl
===================================================================
--- /trunk/src/VBox/Devices/PC/vbox.dsl	(revision 59917)
+++ /trunk/src/VBox/Devices/PC/vbox.dsl	(revision 59918)
@@ -132,9 +132,8 @@
         USMC,  32, // if SMC enabled
         UFDC,  32, // if floppy controller enabled
-        // UCP0-UCP3 no longer used and only kept here for saved state compatibility
-        UCP0,  32,
-        UCP1,  32,
-        UCP2,  32,
-        UCP3,  32,
+        SL2B,  32, // Serial2 base IO address  
+        SL2I,  32, // Serial2 IRQ
+        SL3B,  32, // Serial3 base IO address  
+        SL3I,  32, // Serial3 IRQ
         MEMH,  32,
         URTC,  32, // if RTC shown in tables
@@ -804,4 +803,70 @@
                 }
 
+                // Serial port 2
+                Device (^SRL2)
+                {
+                    Name (_HID, EisaId ("PNP0501"))
+                    Name (_UID, 0x03)
+                    Method (_STA, 0, NotSerialized)
+                    {
+                        If (LEqual (SL2B, Zero))
+                        {
+                            Return (0x00)
+                        }
+                        Else
+                        {
+                            Return (0x0F)
+                        }
+                    }
+                    Name (CRS, ResourceTemplate ()
+                    {
+                        IO (Decode16, 0x03E8, 0x03E8, 0x01, 0x08, _Y22) 
+                        IRQNoFlags (_Y23) {3}
+                    })
+                    Method (_CRS, 0, NotSerialized)
+                    {
+                        CreateWordField (CRS, \_SB.PCI0.SRL2._Y22._MIN, MIN1)
+                        CreateWordField (CRS, \_SB.PCI0.SRL2._Y22._MAX, MAX1)
+                        CreateWordField (CRS, \_SB.PCI0.SRL2._Y23._INT, IRQ1)
+                        Store (SL2B, MIN1)
+                        Store (SL2B, MAX1)
+                        ShiftLeft (0x01, SL2I, IRQ1)
+                        Return (CRS)
+                    }
+                }
+
+                // Serial port 3
+                Device (^SRL3)
+                {
+                    Name (_HID, EisaId ("PNP0501"))
+                    Name (_UID, 0x04)
+                    Method (_STA, 0, NotSerialized)
+                    {
+                        If (LEqual (SL3B, Zero))
+                        {
+                            Return (0x00)
+                        }
+                        Else
+                        {
+                            Return (0x0F)
+                        }
+                    }
+                    Name (CRS, ResourceTemplate ()
+                    {
+                        IO (Decode16, 0x02E8, 0x02E8, 0x01, 0x08, _Y24)
+                        IRQNoFlags (_Y25) {3}
+                    })
+                    Method (_CRS, 0, NotSerialized)
+                    {
+                        CreateWordField (CRS, \_SB.PCI0.SRL3._Y24._MIN, MIN1)
+                        CreateWordField (CRS, \_SB.PCI0.SRL3._Y24._MAX, MAX1)
+                        CreateWordField (CRS, \_SB.PCI0.SRL3._Y25._INT, IRQ1)
+                        Store (SL3B, MIN1)
+                        Store (SL3B, MAX1)
+                        ShiftLeft (0x01, SL3I, IRQ1)
+                        Return (CRS)
+                    }
+                }
+
                 // Programmable Interval Timer (i8254)
                 Device (TIMR)
Index: /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp	(revision 59917)
+++ /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp	(revision 59918)
@@ -3042,4 +3042,16 @@
             InsertConfigInteger(pCfg,  "Serial1IoPortBase", auSerialIoPortBase[1]);
             InsertConfigInteger(pCfg,  "Serial1Irq", auSerialIrq[1]);
+
+            if (auSerialIoPortBase[2])
+            {
+                InsertConfigInteger(pCfg,  "Serial2IoPortBase", auSerialIoPortBase[2]);
+                InsertConfigInteger(pCfg,  "Serial2Irq", auSerialIrq[2]);
+            }
+
+            if (auSerialIoPortBase[3])
+            {
+                InsertConfigInteger(pCfg,  "Serial3IoPortBase", auSerialIoPortBase[3]);
+                InsertConfigInteger(pCfg,  "Serial3Irq", auSerialIrq[3]);
+            }
 
             InsertConfigInteger(pCfg,  "Parallel0IoPortBase", auParallelIoPortBase[0]);
