Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.cpp	(revision 66558)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.cpp	(revision 66559)
@@ -138,23 +138,10 @@
 {
     /** Constructs data. */
-    UIDataSettingsMachineNetwork()
-        : m_adapters(QList<UIDataSettingsMachineNetworkAdapter>())
-    {}
+    UIDataSettingsMachineNetwork() {}
 
     /** Returns whether the @a other passed data is equal to this one. */
-    bool equal(const UIDataSettingsMachineNetwork &other) const
-    {
-        return true
-               && (m_adapters == other.m_adapters)
-               ;
-    }
-
-    /** Returns whether the @a other passed data is equal to this one. */
-    bool operator==(const UIDataSettingsMachineNetwork &other) const { return equal(other); }
+    bool operator==(const UIDataSettingsMachineNetwork & /* other */) const { return true; }
     /** Returns whether the @a other passed data is different from this one. */
-    bool operator!=(const UIDataSettingsMachineNetwork &other) const { return !equal(other); }
-
-    /** Holds the adapter list. */
-    QList<UIDataSettingsMachineNetworkAdapter> m_adapters;
+    bool operator!=(const UIDataSettingsMachineNetwork & /* other */) const { return false; }
 };
 
@@ -1081,5 +1068,5 @@
 
         /* Cache old adapter data: */
-        oldNetworkData.m_adapters << oldAdapterData;
+        m_pCache->child(iSlot).cacheInitialData(oldAdapterData);
     }
 
@@ -1105,5 +1092,5 @@
 
         /* Load old adapter data from the cache: */
-        pTab->loadAdapterData(m_pCache->base().m_adapters.at(iSlot));
+        pTab->loadAdapterData(m_pCache->child(iSlot).base());
 
         /* Setup tab order: */
@@ -1139,5 +1126,5 @@
 
         /* Cache new adapter data: */
-        newNetworkData.m_adapters << newAdapterData;
+        m_pCache->child(iSlot).cacheCurrentData(newAdapterData);
     }
 
@@ -1194,6 +1181,6 @@
                                     isMachineOffline() ||
                                     (isMachineInValidMode() &&
-                                     m_pCache->base().m_adapters.size() > iSlot &&
-                                     m_pCache->base().m_adapters.at(iSlot).m_fAdapterEnabled));
+                                     m_pCache->childCount() > iSlot &&
+                                     m_pCache->child(iSlot).base().m_fAdapterEnabled));
         UIMachineSettingsNetwork *pTab = qobject_cast<UIMachineSettingsNetwork*>(m_pTabWidget->widget(iSlot));
         pTab->polishTab();
@@ -1492,128 +1479,124 @@
     bool fSuccess = true;
     /* Save adapter settings from the cache: */
-    if (fSuccess)
+    if (fSuccess && m_pCache->child(iSlot).wasChanged())
     {
         /* Get old network data from the cache: */
-        const UIDataSettingsMachineNetworkAdapter &oldAdapterData = m_pCache->base().m_adapters.at(iSlot);
+        const UIDataSettingsMachineNetworkAdapter &oldAdapterData = m_pCache->child(iSlot).base();
         /* Get new network data from the cache: */
-        const UIDataSettingsMachineNetworkAdapter &newAdapterData = m_pCache->data().m_adapters.at(iSlot);
-
-        /* Make sure adapter data was changed: */
-        if (newAdapterData != oldAdapterData)
-        {
-            /* Get network adapter for further activities: */
-            CNetworkAdapter comAdapter = m_machine.GetNetworkAdapter(iSlot);
-            fSuccess = m_machine.isOk() && comAdapter.isNotNull();
+        const UIDataSettingsMachineNetworkAdapter &newAdapterData = m_pCache->child(iSlot).data();
+
+        /* Get network adapter for further activities: */
+        CNetworkAdapter comAdapter = m_machine.GetNetworkAdapter(iSlot);
+        fSuccess = m_machine.isOk() && comAdapter.isNotNull();
+
+        /* Show error message if necessary: */
+        if (!fSuccess)
+            msgCenter().cannotSaveNetworkSettings(m_machine, this);
+        else
+        {
+            /* Save whether the adapter is enabled: */
+            if (fSuccess && isMachineOffline() && newAdapterData.m_fAdapterEnabled != oldAdapterData.m_fAdapterEnabled)
+            {
+                comAdapter.SetEnabled(newAdapterData.m_fAdapterEnabled);
+                fSuccess = comAdapter.isOk();
+            }
+            /* Save adapter type: */
+            if (fSuccess && isMachineOffline() && newAdapterData.m_adapterType != oldAdapterData.m_adapterType)
+            {
+                comAdapter.SetAdapterType(newAdapterData.m_adapterType);
+                fSuccess = comAdapter.isOk();
+            }
+            /* Save adapter MAC address: */
+            if (fSuccess && isMachineOffline() && newAdapterData.m_strMACAddress != oldAdapterData.m_strMACAddress)
+            {
+                comAdapter.SetMACAddress(newAdapterData.m_strMACAddress);
+                fSuccess = comAdapter.isOk();
+            }
+            /* Save adapter attachment type: */
+            switch (newAdapterData.m_attachmentType)
+            {
+                case KNetworkAttachmentType_Bridged:
+                {
+                    if (fSuccess && newAdapterData.m_strBridgedAdapterName != oldAdapterData.m_strBridgedAdapterName)
+                    {
+                        comAdapter.SetBridgedInterface(newAdapterData.m_strBridgedAdapterName);
+                        fSuccess = comAdapter.isOk();
+                    }
+                    break;
+                }
+                case KNetworkAttachmentType_Internal:
+                {
+                    if (fSuccess && newAdapterData.m_strInternalNetworkName != oldAdapterData.m_strInternalNetworkName)
+                    {
+                        comAdapter.SetInternalNetwork(newAdapterData.m_strInternalNetworkName);
+                        fSuccess = comAdapter.isOk();
+                    }
+                    break;
+                }
+                case KNetworkAttachmentType_HostOnly:
+                {
+                    if (fSuccess && newAdapterData.m_strHostInterfaceName != oldAdapterData.m_strHostInterfaceName)
+                    {
+                        comAdapter.SetHostOnlyInterface(newAdapterData.m_strHostInterfaceName);
+                        fSuccess = comAdapter.isOk();
+                    }
+                    break;
+                }
+                case KNetworkAttachmentType_Generic:
+                {
+                    if (fSuccess && newAdapterData.m_strGenericDriverName != oldAdapterData.m_strGenericDriverName)
+                    {
+                        comAdapter.SetGenericDriver(newAdapterData.m_strGenericDriverName);
+                        fSuccess = comAdapter.isOk();
+                    }
+                    if (fSuccess && newAdapterData.m_strGenericProperties != oldAdapterData.m_strGenericProperties)
+                        fSuccess = saveGenericProperties(comAdapter, newAdapterData.m_strGenericProperties);
+                    break;
+                }
+                case KNetworkAttachmentType_NATNetwork:
+                {
+                    if (fSuccess && newAdapterData.m_strNATNetworkName != oldAdapterData.m_strNATNetworkName)
+                    {
+                        comAdapter.SetNATNetwork(newAdapterData.m_strNATNetworkName);
+                        fSuccess = comAdapter.isOk();
+                    }
+                    break;
+                }
+                default:
+                    break;
+            }
+            if (fSuccess && newAdapterData.m_attachmentType != oldAdapterData.m_attachmentType)
+            {
+                comAdapter.SetAttachmentType(newAdapterData.m_attachmentType);
+                fSuccess = comAdapter.isOk();
+            }
+            /* Save adapter promiscuous mode: */
+            if (fSuccess && newAdapterData.m_promiscuousMode != oldAdapterData.m_promiscuousMode)
+            {
+                comAdapter.SetPromiscModePolicy(newAdapterData.m_promiscuousMode);
+                fSuccess = comAdapter.isOk();
+            }
+            /* Save whether the adapter cable connected: */
+            if (fSuccess && newAdapterData.m_fCableConnected != oldAdapterData.m_fCableConnected)
+            {
+                comAdapter.SetCableConnected(newAdapterData.m_fCableConnected);
+                fSuccess = comAdapter.isOk();
+            }
+            /* Save adapter redirect options: */
+            if (   fSuccess && newAdapterData.m_redirects != oldAdapterData.m_redirects
+                && (   oldAdapterData.m_attachmentType == KNetworkAttachmentType_NAT
+                    || newAdapterData.m_attachmentType == KNetworkAttachmentType_NAT))
+            {
+                foreach (const QString &strOldRedirect, comAdapter.GetNATEngine().GetRedirects())
+                    comAdapter.GetNATEngine().RemoveRedirect(strOldRedirect.section(',', 0, 0));
+                foreach (const UIPortForwardingData &newRedirect, newAdapterData.m_redirects)
+                    comAdapter.GetNATEngine().AddRedirect(newRedirect.name, newRedirect.protocol,
+                                                       newRedirect.hostIp, newRedirect.hostPort.value(),
+                                                       newRedirect.guestIp, newRedirect.guestPort.value());
+            }
 
             /* Show error message if necessary: */
             if (!fSuccess)
-                msgCenter().cannotSaveNetworkSettings(m_machine, this);
-            else
-            {
-                /* Save whether the adapter is enabled: */
-                if (fSuccess && isMachineOffline() && newAdapterData.m_fAdapterEnabled != oldAdapterData.m_fAdapterEnabled)
-                {
-                    comAdapter.SetEnabled(newAdapterData.m_fAdapterEnabled);
-                    fSuccess = comAdapter.isOk();
-                }
-                /* Save adapter type: */
-                if (fSuccess && isMachineOffline() && newAdapterData.m_adapterType != oldAdapterData.m_adapterType)
-                {
-                    comAdapter.SetAdapterType(newAdapterData.m_adapterType);
-                    fSuccess = comAdapter.isOk();
-                }
-                /* Save adapter MAC address: */
-                if (fSuccess && isMachineOffline() && newAdapterData.m_strMACAddress != oldAdapterData.m_strMACAddress)
-                {
-                    comAdapter.SetMACAddress(newAdapterData.m_strMACAddress);
-                    fSuccess = comAdapter.isOk();
-                }
-                /* Save adapter attachment type: */
-                switch (newAdapterData.m_attachmentType)
-                {
-                    case KNetworkAttachmentType_Bridged:
-                    {
-                        if (fSuccess && newAdapterData.m_strBridgedAdapterName != oldAdapterData.m_strBridgedAdapterName)
-                        {
-                            comAdapter.SetBridgedInterface(newAdapterData.m_strBridgedAdapterName);
-                            fSuccess = comAdapter.isOk();
-                        }
-                        break;
-                    }
-                    case KNetworkAttachmentType_Internal:
-                    {
-                        if (fSuccess && newAdapterData.m_strInternalNetworkName != oldAdapterData.m_strInternalNetworkName)
-                        {
-                            comAdapter.SetInternalNetwork(newAdapterData.m_strInternalNetworkName);
-                            fSuccess = comAdapter.isOk();
-                        }
-                        break;
-                    }
-                    case KNetworkAttachmentType_HostOnly:
-                    {
-                        if (fSuccess && newAdapterData.m_strHostInterfaceName != oldAdapterData.m_strHostInterfaceName)
-                        {
-                            comAdapter.SetHostOnlyInterface(newAdapterData.m_strHostInterfaceName);
-                            fSuccess = comAdapter.isOk();
-                        }
-                        break;
-                    }
-                    case KNetworkAttachmentType_Generic:
-                    {
-                        if (fSuccess && newAdapterData.m_strGenericDriverName != oldAdapterData.m_strGenericDriverName)
-                        {
-                            comAdapter.SetGenericDriver(newAdapterData.m_strGenericDriverName);
-                            fSuccess = comAdapter.isOk();
-                        }
-                        if (fSuccess && newAdapterData.m_strGenericProperties != oldAdapterData.m_strGenericProperties)
-                            fSuccess = saveGenericProperties(comAdapter, newAdapterData.m_strGenericProperties);
-                        break;
-                    }
-                    case KNetworkAttachmentType_NATNetwork:
-                    {
-                        if (fSuccess && newAdapterData.m_strNATNetworkName != oldAdapterData.m_strNATNetworkName)
-                        {
-                            comAdapter.SetNATNetwork(newAdapterData.m_strNATNetworkName);
-                            fSuccess = comAdapter.isOk();
-                        }
-                        break;
-                    }
-                    default:
-                        break;
-                }
-                if (fSuccess && newAdapterData.m_attachmentType != oldAdapterData.m_attachmentType)
-                {
-                    comAdapter.SetAttachmentType(newAdapterData.m_attachmentType);
-                    fSuccess = comAdapter.isOk();
-                }
-                /* Save adapter promiscuous mode: */
-                if (fSuccess && newAdapterData.m_promiscuousMode != oldAdapterData.m_promiscuousMode)
-                {
-                    comAdapter.SetPromiscModePolicy(newAdapterData.m_promiscuousMode);
-                    fSuccess = comAdapter.isOk();
-                }
-                /* Save whether the adapter cable connected: */
-                if (fSuccess && newAdapterData.m_fCableConnected != oldAdapterData.m_fCableConnected)
-                {
-                    comAdapter.SetCableConnected(newAdapterData.m_fCableConnected);
-                    fSuccess = comAdapter.isOk();
-                }
-                /* Save adapter redirect options: */
-                if (   fSuccess && newAdapterData.m_redirects != oldAdapterData.m_redirects
-                    && (   oldAdapterData.m_attachmentType == KNetworkAttachmentType_NAT
-                        || newAdapterData.m_attachmentType == KNetworkAttachmentType_NAT))
-                {
-                    foreach (const QString &strOldRedirect, comAdapter.GetNATEngine().GetRedirects())
-                        comAdapter.GetNATEngine().RemoveRedirect(strOldRedirect.section(',', 0, 0));
-                    foreach (const UIPortForwardingData &newRedirect, newAdapterData.m_redirects)
-                        comAdapter.GetNATEngine().AddRedirect(newRedirect.name, newRedirect.protocol,
-                                                           newRedirect.hostIp, newRedirect.hostPort.value(),
-                                                           newRedirect.guestIp, newRedirect.guestPort.value());
-                }
-
-                /* Show error message if necessary: */
-                if (!fSuccess)
-                    msgCenter().cannotSaveNetworkAdapterSettings(comAdapter, this);
-            }
+                msgCenter().cannotSaveNetworkAdapterSettings(comAdapter, this);
         }
     }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.h	(revision 66558)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.h	(revision 66559)
@@ -27,5 +27,7 @@
 class QITabWidget;
 struct UIDataSettingsMachineNetwork;
-typedef UISettingsCache<UIDataSettingsMachineNetwork> UISettingsCacheMachineNetwork;
+struct UIDataSettingsMachineNetworkAdapter;
+typedef UISettingsCache<UIDataSettingsMachineNetworkAdapter> UISettingsCacheMachineNetworkAdapter;
+typedef UISettingsCachePool<UIDataSettingsMachineNetwork, UISettingsCacheMachineNetworkAdapter> UISettingsCacheMachineNetwork;
 
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsParallel.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsParallel.cpp	(revision 66558)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsParallel.cpp	(revision 66559)
@@ -82,23 +82,10 @@
 {
     /** Constructs data. */
-    UIDataSettingsMachineParallel()
-        : m_ports(QList<UIDataSettingsMachineParallelPort>())
-    {}
+    UIDataSettingsMachineParallel() {}
 
     /** Returns whether the @a other passed data is equal to this one. */
-    bool equal(const UIDataSettingsMachineParallel &other) const
-    {
-        return true
-               && (m_ports == other.m_ports)
-               ;
-    }
-
-    /** Returns whether the @a other passed data is equal to this one. */
-    bool operator==(const UIDataSettingsMachineParallel &other) const { return equal(other); }
+    bool operator==(const UIDataSettingsMachineParallel & /* other */) const { return true; }
     /** Returns whether the @a other passed data is different from this one. */
-    bool operator!=(const UIDataSettingsMachineParallel &other) const { return !equal(other); }
-
-    /** Holds the port list. */
-    QList<UIDataSettingsMachineParallelPort> m_ports;
+    bool operator!=(const UIDataSettingsMachineParallel & /* other */) const { return false; }
 };
 
@@ -340,5 +327,5 @@
 
         /* Cache old port data: */
-        oldParallelData.m_ports << oldPortData;
+        m_pCache->child(iSlot).cacheInitialData(oldPortData);
     }
 
@@ -358,11 +345,11 @@
 
     /* For each port: */
-    for (int iPort = 0; iPort < m_pTabWidget->count(); ++iPort)
+    for (int iSlot = 0; iSlot < m_pTabWidget->count(); ++iSlot)
     {
         /* Get port page: */
-        UIMachineSettingsParallel *pPage = qobject_cast<UIMachineSettingsParallel*>(m_pTabWidget->widget(iPort));
+        UIMachineSettingsParallel *pPage = qobject_cast<UIMachineSettingsParallel*>(m_pTabWidget->widget(iSlot));
 
         /* Load old port data from the cache: */
-        pPage->loadPortData(m_pCache->base().m_ports.at(iPort));
+        pPage->loadPortData(m_pCache->child(iSlot).base());
 
         /* Setup tab order: */
@@ -386,8 +373,8 @@
 
     /* For each port: */
-    for (int iPort = 0; iPort < m_pTabWidget->count(); ++iPort)
+    for (int iSlot = 0; iSlot < m_pTabWidget->count(); ++iSlot)
     {
         /* Getting port page: */
-        UIMachineSettingsParallel *pTab = qobject_cast<UIMachineSettingsParallel*>(m_pTabWidget->widget(iPort));
+        UIMachineSettingsParallel *pTab = qobject_cast<UIMachineSettingsParallel*>(m_pTabWidget->widget(iSlot));
 
         /* Prepare new port data: */
@@ -398,5 +385,5 @@
 
         /* Cache new port data: */
-        newParallelData.m_ports << newPortData;
+        m_pCache->child(iSlot).cacheCurrentData(newPortData);
     }
 
@@ -496,12 +483,12 @@
 {
     /* Get the count of parallel port tabs: */
-    for (int iPort = 0; iPort < m_pTabWidget->count(); ++iPort)
-    {
-        m_pTabWidget->setTabEnabled(iPort,
+    for (int iSlot = 0; iSlot < m_pTabWidget->count(); ++iSlot)
+    {
+        m_pTabWidget->setTabEnabled(iSlot,
                                     isMachineOffline() ||
                                     (isMachineInValidMode() &&
-                                     m_pCache->base().m_ports.size() > iPort &&
-                                     m_pCache->base().m_ports.at(iPort).m_fPortEnabled));
-        UIMachineSettingsParallel *pTab = qobject_cast<UIMachineSettingsParallel*>(m_pTabWidget->widget(iPort));
+                                     m_pCache->childCount() > iSlot &&
+                                     m_pCache->child(iSlot).base().m_fPortEnabled));
+        UIMachineSettingsParallel *pTab = qobject_cast<UIMachineSettingsParallel*>(m_pTabWidget->widget(iSlot));
         pTab->polishTab();
     }
@@ -568,57 +555,53 @@
 }
 
-bool UIMachineSettingsParallelPage::savePortData(int iPort)
+bool UIMachineSettingsParallelPage::savePortData(int iSlot)
 {
     /* Prepare result: */
     bool fSuccess = true;
     /* Save adapter settings from the cache: */
-    if (fSuccess)
+    if (fSuccess && m_pCache->child(iSlot).wasChanged())
     {
         /* Get old parallel data from the cache: */
-        const UIDataSettingsMachineParallelPort &oldPortData = m_pCache->base().m_ports.at(iPort);
+        const UIDataSettingsMachineParallelPort &oldPortData = m_pCache->child(iSlot).base();
         /* Get new parallel data from the cache: */
-        const UIDataSettingsMachineParallelPort &newPortData = m_pCache->data().m_ports.at(iPort);
-
-        /* Make sure port data was changed: */
-        if (newPortData != oldPortData)
-        {
-            /* Get parallel port for further activities: */
-            CParallelPort comPort = m_machine.GetParallelPort(iPort);
-            fSuccess = m_machine.isOk() && comPort.isNotNull();
+        const UIDataSettingsMachineParallelPort &newPortData = m_pCache->child(iSlot).data();
+
+        /* Get parallel port for further activities: */
+        CParallelPort comPort = m_machine.GetParallelPort(iSlot);
+        fSuccess = m_machine.isOk() && comPort.isNotNull();
+
+        /* Show error message if necessary: */
+        if (!fSuccess)
+            msgCenter().cannotSaveParallelSettings(m_machine, this);
+        else
+        {
+            /* Save whether the port is enabled: */
+            if (fSuccess && isMachineOffline() && newPortData.m_fPortEnabled != oldPortData.m_fPortEnabled)
+            {
+                comPort.SetEnabled(newPortData.m_fPortEnabled);
+                fSuccess = comPort.isOk();
+            }
+            /* Save port IRQ: */
+            if (fSuccess && isMachineOffline() && newPortData.m_uIRQ != oldPortData.m_uIRQ)
+            {
+                comPort.SetIRQ(newPortData.m_uIRQ);
+                fSuccess = comPort.isOk();
+            }
+            /* Save port IO base: */
+            if (fSuccess && isMachineOffline() && newPortData.m_uIOBase != oldPortData.m_uIOBase)
+            {
+                comPort.SetIOBase(newPortData.m_uIOBase);
+                fSuccess = comPort.isOk();
+            }
+            /* Save port path: */
+            if (fSuccess && isMachineOffline() && newPortData.m_strPath != oldPortData.m_strPath)
+            {
+                comPort.SetPath(newPortData.m_strPath);
+                fSuccess = comPort.isOk();
+            }
 
             /* Show error message if necessary: */
             if (!fSuccess)
-                msgCenter().cannotSaveParallelSettings(m_machine, this);
-            else
-            {
-                /* Save whether the port is enabled: */
-                if (fSuccess && isMachineOffline() && newPortData.m_fPortEnabled != oldPortData.m_fPortEnabled)
-                {
-                    comPort.SetEnabled(newPortData.m_fPortEnabled);
-                    fSuccess = comPort.isOk();
-                }
-                /* Save port IRQ: */
-                if (fSuccess && isMachineOffline() && newPortData.m_uIRQ != oldPortData.m_uIRQ)
-                {
-                    comPort.SetIRQ(newPortData.m_uIRQ);
-                    fSuccess = comPort.isOk();
-                }
-                /* Save port IO base: */
-                if (fSuccess && isMachineOffline() && newPortData.m_uIOBase != oldPortData.m_uIOBase)
-                {
-                    comPort.SetIOBase(newPortData.m_uIOBase);
-                    fSuccess = comPort.isOk();
-                }
-                /* Save port path: */
-                if (fSuccess && isMachineOffline() && newPortData.m_strPath != oldPortData.m_strPath)
-                {
-                    comPort.SetPath(newPortData.m_strPath);
-                    fSuccess = comPort.isOk();
-                }
-
-                /* Show error message if necessary: */
-                if (!fSuccess)
-                    msgCenter().cannotSaveParallelPortSettings(comPort, this);
-            }
+                msgCenter().cannotSaveParallelPortSettings(comPort, this);
         }
     }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsParallel.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsParallel.h	(revision 66558)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsParallel.h	(revision 66559)
@@ -27,5 +27,7 @@
 class UIMachineSettingsParallelPage;
 struct UIDataSettingsMachineParallel;
-typedef UISettingsCache<UIDataSettingsMachineParallel> UISettingsCacheMachineParallel;
+struct UIDataSettingsMachineParallelPort;
+typedef UISettingsCache<UIDataSettingsMachineParallelPort> UISettingsCacheMachineParallelPort;
+typedef UISettingsCachePool<UIDataSettingsMachineParallel, UISettingsCacheMachineParallelPort> UISettingsCacheMachineParallel;
 
 
@@ -80,5 +82,5 @@
     bool saveParallelData();
     /** Saves existing port data from the cache. */
-    bool savePortData(int iPort);
+    bool savePortData(int iSlot);
 
     /** Holds the tab-widget instance. */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.cpp	(revision 66558)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.cpp	(revision 66559)
@@ -91,23 +91,10 @@
 {
     /** Constructs data. */
-    UIDataSettingsMachineSerial()
-        : m_ports(QList<UIDataSettingsMachineSerialPort>())
-    {}
+    UIDataSettingsMachineSerial() {}
 
     /** Returns whether the @a other passed data is equal to this one. */
-    bool equal(const UIDataSettingsMachineSerial &other) const
-    {
-        return true
-               && (m_ports == other.m_ports)
-               ;
-    }
-
-    /** Returns whether the @a other passed data is equal to this one. */
-    bool operator==(const UIDataSettingsMachineSerial &other) const { return equal(other); }
+    bool operator==(const UIDataSettingsMachineSerial & /* other */) const { return true; }
     /** Returns whether the @a other passed data is different from this one. */
-    bool operator!=(const UIDataSettingsMachineSerial &other) const { return !equal(other); }
-
-    /** Holds the port list. */
-    QList<UIDataSettingsMachineSerialPort> m_ports;
+    bool operator!=(const UIDataSettingsMachineSerial & /* other */) const { return false; }
 };
 
@@ -390,5 +377,5 @@
 
         /* Cache old port data: */
-        oldSerialData.m_ports << oldPortData;
+        m_pCache->child(iSlot).cacheInitialData(oldPortData);
     }
 
@@ -408,11 +395,11 @@
 
     /* For each port: */
-    for (int iPort = 0; iPort < m_pTabWidget->count(); ++iPort)
+    for (int iSlot = 0; iSlot < m_pTabWidget->count(); ++iSlot)
     {
         /* Get port page: */
-        UIMachineSettingsSerial *pPage = qobject_cast<UIMachineSettingsSerial*>(m_pTabWidget->widget(iPort));
+        UIMachineSettingsSerial *pPage = qobject_cast<UIMachineSettingsSerial*>(m_pTabWidget->widget(iSlot));
 
         /* Load old port data from the cache: */
-        pPage->loadPortData(m_pCache->base().m_ports.at(iPort));
+        pPage->loadPortData(m_pCache->child(iSlot).base());
 
         /* Setup tab order: */
@@ -436,8 +423,8 @@
 
     /* For each port: */
-    for (int iPort = 0; iPort < m_pTabWidget->count(); ++iPort)
+    for (int iSlot = 0; iSlot < m_pTabWidget->count(); ++iSlot)
     {
         /* Getting port page: */
-        UIMachineSettingsSerial *pTab = qobject_cast<UIMachineSettingsSerial*>(m_pTabWidget->widget(iPort));
+        UIMachineSettingsSerial *pTab = qobject_cast<UIMachineSettingsSerial*>(m_pTabWidget->widget(iSlot));
 
         /* Prepare new port data: */
@@ -448,5 +435,5 @@
 
         /* Cache new port data: */
-        newSerialData.m_ports << newPortData;
+        m_pCache->child(iSlot).cacheCurrentData(newPortData);
     }
 
@@ -553,12 +540,12 @@
 {
     /* Get the count of serial port tabs: */
-    for (int iPort = 0; iPort < m_pTabWidget->count(); ++iPort)
-    {
-        m_pTabWidget->setTabEnabled(iPort,
+    for (int iSlot = 0; iSlot < m_pTabWidget->count(); ++iSlot)
+    {
+        m_pTabWidget->setTabEnabled(iSlot,
                                     isMachineOffline() ||
                                     (isMachineInValidMode() &&
-                                     m_pCache->base().m_ports.size() > iPort &&
-                                     m_pCache->base().m_ports.at(iPort).m_fPortEnabled));
-        UIMachineSettingsSerial *pTab = qobject_cast<UIMachineSettingsSerial*>(m_pTabWidget->widget(iPort));
+                                     m_pCache->childCount() > iSlot &&
+                                     m_pCache->child(iSlot).base().m_fPortEnabled));
+        UIMachineSettingsSerial *pTab = qobject_cast<UIMachineSettingsSerial*>(m_pTabWidget->widget(iSlot));
         pTab->polishTab();
     }
@@ -625,85 +612,81 @@
 }
 
-bool UIMachineSettingsSerialPage::savePortData(int iPort)
+bool UIMachineSettingsSerialPage::savePortData(int iSlot)
 {
     /* Prepare result: */
     bool fSuccess = true;
     /* Save adapter settings from the cache: */
-    if (fSuccess)
+    if (fSuccess && m_pCache->child(iSlot).wasChanged())
     {
         /* Get old serial data from the cache: */
-        const UIDataSettingsMachineSerialPort &oldPortData = m_pCache->base().m_ports.at(iPort);
+        const UIDataSettingsMachineSerialPort &oldPortData = m_pCache->child(iSlot).base();
         /* Get new serial data from the cache: */
-        const UIDataSettingsMachineSerialPort &newPortData = m_pCache->data().m_ports.at(iPort);
-
-        /* Make sure port data was changed: */
-        if (newPortData != oldPortData)
+        const UIDataSettingsMachineSerialPort &newPortData = m_pCache->child(iSlot).data();
+
+        /* Get serial port for further activities: */
+        CSerialPort comPort = m_machine.GetSerialPort(iSlot);
+        fSuccess = m_machine.isOk() && comPort.isNotNull();
+
+        /* Show error message if necessary: */
+        if (!fSuccess)
+            msgCenter().cannotSaveSerialSettings(m_machine, this);
+        else
         {
-            /* Get serial port for further activities: */
-            CSerialPort comPort = m_machine.GetSerialPort(iPort);
-            fSuccess = m_machine.isOk() && comPort.isNotNull();
+            // This *must* be first.
+            // If the requested host mode is changed to disconnected we should do it first.
+            // That allows to automatically fulfill the requirements for some of the settings below.
+            /* Save port host mode: */
+            if (   fSuccess && isMachineOffline()
+                && newPortData.m_hostMode != oldPortData.m_hostMode
+                && newPortData.m_hostMode == KPortMode_Disconnected)
+            {
+                comPort.SetHostMode(newPortData.m_hostMode);
+                fSuccess = comPort.isOk();
+            }
+            /* Save whether the port is enabled: */
+            if (fSuccess && isMachineOffline() && newPortData.m_fPortEnabled != oldPortData.m_fPortEnabled)
+            {
+                comPort.SetEnabled(newPortData.m_fPortEnabled);
+                fSuccess = comPort.isOk();
+            }
+            /* Save port IRQ: */
+            if (fSuccess && isMachineOffline() && newPortData.m_uIRQ != oldPortData.m_uIRQ)
+            {
+                comPort.SetIRQ(newPortData.m_uIRQ);
+                fSuccess = comPort.isOk();
+            }
+            /* Save port IO base: */
+            if (fSuccess && isMachineOffline() && newPortData.m_uIOBase != oldPortData.m_uIOBase)
+            {
+                comPort.SetIOBase(newPortData.m_uIOBase);
+                fSuccess = comPort.isOk();
+            }
+            /* Save whether the port is server: */
+            if (fSuccess && isMachineOffline() && newPortData.m_fServer != oldPortData.m_fServer)
+            {
+                comPort.SetServer(newPortData.m_fServer);
+                fSuccess = comPort.isOk();
+            }
+            /* Save port path: */
+            if (fSuccess && isMachineOffline() && newPortData.m_strPath != oldPortData.m_strPath)
+            {
+                comPort.SetPath(newPortData.m_strPath);
+                fSuccess = comPort.isOk();
+            }
+            // This *must* be last.
+            // The host mode will be changed to disconnected if some of the necessary
+            // settings above will not meet the requirements for the selected mode.
+            /* Save port host mode: */
+            if (   fSuccess && isMachineOffline()
+                && newPortData.m_hostMode != oldPortData.m_hostMode
+                && newPortData.m_hostMode != KPortMode_Disconnected)
+            {
+                comPort.SetHostMode(newPortData.m_hostMode);
+                fSuccess = comPort.isOk();
+            }
 
             /* Show error message if necessary: */
             if (!fSuccess)
-                msgCenter().cannotSaveSerialSettings(m_machine, this);
-            else
-            {
-                // This *must* be first.
-                // If the requested host mode is changed to disconnected we should do it first.
-                // That allows to automatically fulfill the requirements for some of the settings below.
-                /* Save port host mode: */
-                if (   fSuccess && isMachineOffline()
-                    && newPortData.m_hostMode != oldPortData.m_hostMode
-                    && newPortData.m_hostMode == KPortMode_Disconnected)
-                {
-                    comPort.SetHostMode(newPortData.m_hostMode);
-                    fSuccess = comPort.isOk();
-                }
-                /* Save whether the port is enabled: */
-                if (fSuccess && isMachineOffline() && newPortData.m_fPortEnabled != oldPortData.m_fPortEnabled)
-                {
-                    comPort.SetEnabled(newPortData.m_fPortEnabled);
-                    fSuccess = comPort.isOk();
-                }
-                /* Save port IRQ: */
-                if (fSuccess && isMachineOffline() && newPortData.m_uIRQ != oldPortData.m_uIRQ)
-                {
-                    comPort.SetIRQ(newPortData.m_uIRQ);
-                    fSuccess = comPort.isOk();
-                }
-                /* Save port IO base: */
-                if (fSuccess && isMachineOffline() && newPortData.m_uIOBase != oldPortData.m_uIOBase)
-                {
-                    comPort.SetIOBase(newPortData.m_uIOBase);
-                    fSuccess = comPort.isOk();
-                }
-                /* Save whether the port is server: */
-                if (fSuccess && isMachineOffline() && newPortData.m_fServer != oldPortData.m_fServer)
-                {
-                    comPort.SetServer(newPortData.m_fServer);
-                    fSuccess = comPort.isOk();
-                }
-                /* Save port path: */
-                if (fSuccess && isMachineOffline() && newPortData.m_strPath != oldPortData.m_strPath)
-                {
-                    comPort.SetPath(newPortData.m_strPath);
-                    fSuccess = comPort.isOk();
-                }
-                // This *must* be last.
-                // The host mode will be changed to disconnected if some of the necessary
-                // settings above will not meet the requirements for the selected mode.
-                /* Save port host mode: */
-                if (   fSuccess && isMachineOffline()
-                    && newPortData.m_hostMode != oldPortData.m_hostMode
-                    && newPortData.m_hostMode != KPortMode_Disconnected)
-                {
-                    comPort.SetHostMode(newPortData.m_hostMode);
-                    fSuccess = comPort.isOk();
-                }
-
-                /* Show error message if necessary: */
-                if (!fSuccess)
-                    msgCenter().cannotSaveSerialPortSettings(comPort, this);
-            }
+                msgCenter().cannotSaveSerialPortSettings(comPort, this);
         }
     }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.h	(revision 66558)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.h	(revision 66559)
@@ -27,5 +27,7 @@
 class UIMachineSettingsSerialPage;
 struct UIDataSettingsMachineSerial;
-typedef UISettingsCache<UIDataSettingsMachineSerial> UISettingsCacheMachineSerial;
+struct UIDataSettingsMachineSerialPort;
+typedef UISettingsCache<UIDataSettingsMachineSerialPort> UISettingsCacheMachineSerialPort;
+typedef UISettingsCachePool<UIDataSettingsMachineSerial, UISettingsCacheMachineSerialPort> UISettingsCacheMachineSerial;
 
 
@@ -80,5 +82,5 @@
     bool saveSerialData();
     /** Saves existing port data from the cache. */
-    bool savePortData(int iPort);
+    bool savePortData(int iSlot);
 
     /** Holds the tab-widget instance. */
