Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetwork.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetwork.cpp	(revision 66622)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetwork.cpp	(revision 66623)
@@ -79,8 +79,24 @@
     QString newName() const { return m_strNewName; }
 
+    /** Returns IPv4 port forwarding rules. */
+    const UIPortForwardingDataList &ipv4rules() const { return m_ipv4rules; }
+    /** Defines IPv4 port forwarding rules. */
+    void setIpv4rules(const UIPortForwardingDataList &ipv4rules) { m_ipv4rules = ipv4rules; }
+    /** Returns IPv6 port forwarding rules. */
+    const UIPortForwardingDataList &ipv6rules() const { return m_ipv6rules; }
+    /** Defines IPv6 port forwarding rules. */
+    void setIpv6rules(const UIPortForwardingDataList &ipv6rules) { m_ipv6rules = ipv6rules; }
+
 protected:
 
     /** Returns default text. */
     virtual QString defaultText() const /* override */;
+
+private:
+
+    /** Holds IPv4 port forwarding rules. */
+    UIPortForwardingDataList m_ipv4rules;
+    /** Holds IPv6 port forwarding rules. */
+    UIPortForwardingDataList m_ipv6rules;
 };
 
@@ -415,10 +431,10 @@
     /* Load old network data from the cache: */
     for (int i = 0; i < m_pCache->childCount1(); ++i)
-        createTreeWidgetItemForNetworkNAT(m_pCache->child1(i).base());
+        createTreeWidgetItemForNetworkNAT(m_pCache->child1(i));
     m_pTreeNetworkNAT->sortByColumn(1, Qt::AscendingOrder);
     m_pTreeNetworkNAT->setCurrentItem(m_pTreeNetworkNAT->topLevelItem(0));
     sltHandleCurrentItemChangeNetworkNAT();
     for (int i = 0; i < m_pCache->childCount2(); ++i)
-        createTreeWidgetItemForNetworkHost(m_pCache->child2(i).base());
+        createTreeWidgetItemForNetworkHost(m_pCache->child2(i));
     m_pTreeNetworkHost->sortByColumn(0, Qt::AscendingOrder);
     m_pTreeNetworkHost->setCurrentItem(m_pTreeNetworkHost->topLevelItem(0));
@@ -439,4 +455,8 @@
         const UIItemNetworkNAT *pItem = static_cast<UIItemNetworkNAT*>(m_pTreeNetworkNAT->topLevelItem(i));
         m_pCache->child1(pItem->m_strName).cacheCurrentData(*pItem);
+        foreach (const UIDataPortForwardingRule &rule, pItem->ipv4rules())
+            m_pCache->child1(pItem->m_strName).child1(rule.name).cacheCurrentData(rule);
+        foreach (const UIDataPortForwardingRule &rule, pItem->ipv6rules())
+            m_pCache->child1(pItem->m_strName).child2(rule.name).cacheCurrentData(rule);
     }
     for (int i = 0; i < m_pTreeNetworkHost->topLevelItemCount(); ++i)
@@ -610,5 +630,5 @@
     const QString strCacheKey = network.GetNetworkName();
     loadToCacheFromNetworkNAT(network, m_pCache->child1(strCacheKey));
-    createTreeWidgetItemForNetworkNAT(m_pCache->child1(strCacheKey).base(), true);
+    createTreeWidgetItemForNetworkNAT(m_pCache->child1(strCacheKey), true);
     m_pTreeNetworkNAT->sortByColumn(1, Qt::AscendingOrder);
 }
@@ -622,9 +642,13 @@
     /* Edit current item data: */
     UIDataSettingsGlobalNetworkNAT data = *pItem;
-    UIGlobalSettingsNetworkDetailsNAT details(this, data);
+    UIPortForwardingDataList ipv4rules = pItem->ipv4rules();
+    UIPortForwardingDataList ipv6rules = pItem->ipv6rules();
+    UIGlobalSettingsNetworkDetailsNAT details(this, data, ipv4rules, ipv6rules);
     if (details.exec() == QDialog::Accepted)
     {
         /* Put data back: */
         pItem->UIDataSettingsGlobalNetworkNAT::operator=(data);
+        pItem->setIpv4rules(ipv4rules);
+        pItem->setIpv6rules(ipv6rules);
         pItem->updateFields();
         sltHandleCurrentItemChangeNetworkNAT();
@@ -727,5 +751,5 @@
     const QString strCacheKey = iface.GetName();
     loadToCacheFromNetworkHost(iface, m_pCache->child2(strCacheKey));
-    createTreeWidgetItemForNetworkHost(m_pCache->child2(strCacheKey).base(), true);
+    createTreeWidgetItemForNetworkHost(m_pCache->child2(strCacheKey), true);
     m_pTreeNetworkHost->sortByColumn(0, Qt::AscendingOrder);
 }
@@ -1037,10 +1061,10 @@
         if (rules.size() != 6)
             continue;
-        oldNATData.m_ipv4rules << UIDataPortForwardingRule(rules[0],
-                                                           gpConverter->fromInternalString<KNATProtocol>(rules[1]),
-                                                           QString(rules[2]).remove('[').remove(']'),
-                                                           rules[3].toUInt(),
-                                                           QString(rules[4]).remove('[').remove(']'),
-                                                           rules[5].toUInt());
+        cache.child1(rules.at(0)).cacheInitialData(UIDataPortForwardingRule(rules.at(0),
+                                                                            gpConverter->fromInternalString<KNATProtocol>(rules.at(1)),
+                                                                            QString(rules.at(2)).remove('[').remove(']'),
+                                                                            rules.at(3).toUInt(),
+                                                                            QString(rules.at(4)).remove('[').remove(']'),
+                                                                            rules.at(5).toUInt()));
     }
 
@@ -1065,10 +1089,10 @@
         if (rules.size() != 6)
             continue;
-        oldNATData.m_ipv6rules << UIDataPortForwardingRule(rules[0],
-                                                           gpConverter->fromInternalString<KNATProtocol>(rules[1]),
-                                                           QString(rules[2]).remove('[').remove(']'),
-                                                           rules[3].toUInt(),
-                                                           QString(rules[4]).remove('[').remove(']'),
-                                                           rules[5].toUInt());
+        cache.child2(rules.at(0)).cacheInitialData(UIDataPortForwardingRule(rules.at(0),
+                                                                            gpConverter->fromInternalString<KNATProtocol>(rules.at(1)),
+                                                                            QString(rules.at(2)).remove('[').remove(']'),
+                                                                            rules.at(3).toUInt(),
+                                                                            QString(rules.at(4)).remove('[').remove(']'),
+                                                                            rules.at(5).toUInt()));
     }
 
@@ -1153,20 +1177,29 @@
 
             /* Save IPv4 forwarding rules: */
-            if (fSuccess && newNatData.m_ipv4rules != oldNatData.m_ipv4rules)
-            {
-                for (int i = 0; fSuccess && i < ipv4rules.size(); ++i)
+            for (int i = 0; fSuccess && i < cache.childCount1(); ++i)
+            {
+                /* Get rule cache: */
+                const UISettingsCachePortForwardingRule &ruleCache = cache.child1(i);
+
+                /* Remove rule marked for 'remove' or 'update': */
+                if (ruleCache.wasRemoved() || ruleCache.wasUpdated())
                 {
-                    const QString &strOldRule = ipv4rules.at(i);
                     comNetwork.RemovePortForwardRule(false,
-                                                     strOldRule.section(':', 0, 0));
+                                                     ruleCache.base().name);
                     fSuccess = comNetwork.isOk();
                 }
-                for (int i = 0; fSuccess && i < newNatData.m_ipv4rules.size(); ++i)
+            }
+            for (int i = 0; fSuccess && i < cache.childCount1(); ++i)
+            {
+                /* Get rule cache: */
+                const UISettingsCachePortForwardingRule &ruleCache = cache.child1(i);
+
+                /* Create rule marked for 'create' or 'update': */
+                if (ruleCache.wasCreated() || ruleCache.wasUpdated())
                 {
-                    const UIDataPortForwardingRule &newRule = newNatData.m_ipv4rules.at(i);
                     comNetwork.AddPortForwardRule(false,
-                                                  newRule.name, newRule.protocol,
-                                                  newRule.hostIp, newRule.hostPort.value(),
-                                                  newRule.guestIp, newRule.guestPort.value());
+                                                  ruleCache.data().name, ruleCache.data().protocol,
+                                                  ruleCache.data().hostIp, ruleCache.data().hostPort.value(),
+                                                  ruleCache.data().guestIp, ruleCache.data().guestPort.value());
                     fSuccess = comNetwork.isOk();
                 }
@@ -1174,20 +1207,29 @@
 
             /* Save IPv6 forwarding rules: */
-            if (fSuccess && newNatData.m_ipv6rules != oldNatData.m_ipv6rules)
-            {
-                for (int i = 0; fSuccess && i < ipv6rules.size(); ++i)
+            for (int i = 0; fSuccess && i < cache.childCount2(); ++i)
+            {
+                /* Get rule cache: */
+                const UISettingsCachePortForwardingRule &ruleCache = cache.child2(i);
+
+                /* Remove rule marked for 'remove' or 'update': */
+                if (ruleCache.wasRemoved() || ruleCache.wasUpdated())
                 {
-                    const QString &strOldRule = ipv6rules.at(i);
                     comNetwork.RemovePortForwardRule(true,
-                                                     strOldRule.section(':', 0, 0));
+                                                     ruleCache.base().name);
                     fSuccess = comNetwork.isOk();
                 }
-                for (int i = 0; fSuccess && i < newNatData.m_ipv6rules.size(); ++i)
+            }
+            for (int i = 0; fSuccess && i < cache.childCount2(); ++i)
+            {
+                /* Get rule cache: */
+                const UISettingsCachePortForwardingRule &ruleCache = cache.child2(i);
+
+                /* Create rule marked for 'create' or 'update': */
+                if (ruleCache.wasCreated() || ruleCache.wasUpdated())
                 {
-                    const UIDataPortForwardingRule &newRule = newNatData.m_ipv6rules.at(i);
                     comNetwork.AddPortForwardRule(true,
-                                                  newRule.name, newRule.protocol,
-                                                  newRule.hostIp, newRule.hostPort.value(),
-                                                  newRule.guestIp, newRule.guestPort.value());
+                                                  ruleCache.data().name, ruleCache.data().protocol,
+                                                  ruleCache.data().hostIp, ruleCache.data().hostPort.value(),
+                                                  ruleCache.data().guestIp, ruleCache.data().guestPort.value());
                     fSuccess = comNetwork.isOk();
                 }
@@ -1203,9 +1245,17 @@
 }
 
-void UIGlobalSettingsNetwork::createTreeWidgetItemForNetworkNAT(const UIDataSettingsGlobalNetworkNAT &data, bool fChooseItem)
+void UIGlobalSettingsNetwork::createTreeWidgetItemForNetworkNAT(const UISettingsCacheGlobalNetworkNAT &cache, bool fChooseItem)
 {
     /* Add new item to the tree: */
     UIItemNetworkNAT *pItem = new UIItemNetworkNAT;
-    pItem->UIDataSettingsGlobalNetworkNAT::operator=(data);
+    pItem->UIDataSettingsGlobalNetworkNAT::operator=(cache.base());
+    UIPortForwardingDataList ipv4rules;
+    UIPortForwardingDataList ipv6rules;
+    for (int i = 0; i < cache.childCount1(); ++i)
+        ipv4rules << cache.child1(i).base();
+    for (int i = 0; i < cache.childCount2(); ++i)
+        ipv6rules << cache.child2(i).base();
+    pItem->setIpv4rules(ipv4rules);
+    pItem->setIpv6rules(ipv6rules);
     pItem->updateFields();
     m_pTreeNetworkNAT->addTopLevelItem(pItem);
@@ -1376,9 +1426,9 @@
 }
 
-void UIGlobalSettingsNetwork::createTreeWidgetItemForNetworkHost(const UIDataSettingsGlobalNetworkHost &data, bool fChooseItem)
+void UIGlobalSettingsNetwork::createTreeWidgetItemForNetworkHost(const UISettingsCacheGlobalNetworkHost &cache, bool fChooseItem)
 {
     /* Add new item to the tree: */
     UIItemNetworkHost *pItem = new UIItemNetworkHost;
-    pItem->UIDataSettingsGlobalNetworkHost::operator=(data);
+    pItem->UIDataSettingsGlobalNetworkHost::operator=(cache.base());
     pItem->updateFields();
     m_pTreeNetworkHost->addTopLevelItem(pItem);
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetwork.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetwork.h	(revision 66622)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetwork.h	(revision 66623)
@@ -22,4 +22,5 @@
 #include "UISettingsPage.h"
 #include "UIGlobalSettingsNetwork.gen.h"
+#include "UIPortForwardingTable.h"
 
 /* Forward declarations: */
@@ -29,5 +30,6 @@
 struct UIDataSettingsGlobalNetworkNAT;
 struct UIDataSettingsGlobalNetworkHost;
-typedef UISettingsCache<UIDataSettingsGlobalNetworkNAT> UISettingsCacheGlobalNetworkNAT;
+typedef UISettingsCache<UIDataPortForwardingRule> UISettingsCachePortForwardingRule;
+typedef UISettingsCachePoolOfTwo<UIDataSettingsGlobalNetworkNAT, UISettingsCachePortForwardingRule, UISettingsCachePortForwardingRule> UISettingsCacheGlobalNetworkNAT;
 typedef UISettingsCache<UIDataSettingsGlobalNetworkHost> UISettingsCacheGlobalNetworkHost;
 typedef UISettingsCachePoolOfTwo<UIDataSettingsGlobalNetwork, UISettingsCacheGlobalNetworkNAT, UISettingsCacheGlobalNetworkHost> UISettingsCacheGlobalNetwork;
@@ -119,5 +121,5 @@
     bool saveDataNetworkNAT(const UISettingsCacheGlobalNetworkNAT &cache);
     /** Creates a new item in the NAT network tree on the basis of passed @a data, @a fChooseItem if requested. */
-    void createTreeWidgetItemForNetworkNAT(const UIDataSettingsGlobalNetworkNAT &data, bool fChooseItem = false);
+    void createTreeWidgetItemForNetworkNAT(const UISettingsCacheGlobalNetworkNAT &cache, bool fChooseItem = false);
     /** Removes existing @a pItem from the NAT network tree. */
     void removeTreeWidgetItemOfNetworkNAT(UIItemNetworkNAT *pItem);
@@ -128,5 +130,5 @@
     bool saveDataNetworkHost(const UISettingsCacheGlobalNetworkHost &cache);
     /** Creates a new item in the host network tree on the basis of passed @a data, @a fChooseItem if requested. */
-    void createTreeWidgetItemForNetworkHost(const UIDataSettingsGlobalNetworkHost &data, bool fChooseItem = false);
+    void createTreeWidgetItemForNetworkHost(const UISettingsCacheGlobalNetworkHost &cache, bool fChooseItem = false);
     /** Removes existing @a pItem from the host network tree. */
     void removeTreeWidgetItemOfNetworkHost(UIItemNetworkHost *pItem);
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetworkDetailsNAT.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetworkDetailsNAT.cpp	(revision 66622)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetworkDetailsNAT.cpp	(revision 66623)
@@ -31,7 +31,12 @@
 
 
-UIGlobalSettingsNetworkDetailsNAT::UIGlobalSettingsNetworkDetailsNAT(QWidget *pParent, UIDataSettingsGlobalNetworkNAT &data)
+UIGlobalSettingsNetworkDetailsNAT::UIGlobalSettingsNetworkDetailsNAT(QWidget *pParent,
+                                                                     UIDataSettingsGlobalNetworkNAT &data,
+                                                                     UIPortForwardingDataList &ipv4rules,
+                                                                     UIPortForwardingDataList &ipv6rules)
     : QIWithRetranslateUI2<QIDialog>(pParent)
     , m_data(data)
+    , m_ipv4rules(ipv4rules)
+    , m_ipv6rules(ipv6rules)
 {
     /* Apply UI decorations: */
@@ -71,9 +76,9 @@
 {
     /* Open dialog to edit port-forwarding rules: */
-    UIGlobalSettingsPortForwardingDlg dlg(this, m_data.m_ipv4rules, m_data.m_ipv6rules);
+    UIGlobalSettingsPortForwardingDlg dlg(this, m_ipv4rules, m_ipv6rules);
     if (dlg.exec() == QDialog::Accepted)
     {
-        m_data.m_ipv4rules = dlg.ipv4rules();
-        m_data.m_ipv6rules = dlg.ipv6rules();
+        m_ipv4rules = dlg.ipv4rules();
+        m_ipv6rules = dlg.ipv6rules();
     }
 }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetworkDetailsNAT.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetworkDetailsNAT.h	(revision 66622)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetworkDetailsNAT.h	(revision 66623)
@@ -38,6 +38,4 @@
         , m_fSupportsIPv6(false)
         , m_fAdvertiseDefaultIPv6Route(false)
-        , m_ipv4rules(QList<UIDataPortForwardingRule>())
-        , m_ipv6rules(QList<UIDataPortForwardingRule>())
     {}
 
@@ -53,6 +51,4 @@
                && (m_fSupportsIPv6 == other.m_fSupportsIPv6)
                && (m_fAdvertiseDefaultIPv6Route == other.m_fAdvertiseDefaultIPv6Route)
-               && (m_ipv4rules == other.m_ipv4rules)
-               && (m_ipv6rules == other.m_ipv6rules)
                ;
     }
@@ -77,8 +73,4 @@
     /** Holds whether this network advertised as default IPv6 route. */
     bool m_fAdvertiseDefaultIPv6Route;
-    /** Holds IPv4 port forwarding rules. */
-    UIPortForwardingDataList m_ipv4rules;
-    /** Holds IPv6 port forwarding rules. */
-    UIPortForwardingDataList m_ipv6rules;
 };
 
@@ -92,5 +84,5 @@
 
     /* Constructor: */
-    UIGlobalSettingsNetworkDetailsNAT(QWidget *pParent, UIDataSettingsGlobalNetworkNAT &data);
+    UIGlobalSettingsNetworkDetailsNAT(QWidget *pParent, UIDataSettingsGlobalNetworkNAT &data, UIPortForwardingDataList &ipv4rules, UIPortForwardingDataList &ipv6rules);
 
 protected:
@@ -118,4 +110,9 @@
     /* Variable: External data reference: */
     UIDataSettingsGlobalNetworkNAT &m_data;
+
+    /** Holds IPv4 port forwarding rules. */
+    UIPortForwardingDataList &m_ipv4rules;
+    /** Holds IPv6 port forwarding rules. */
+    UIPortForwardingDataList &m_ipv6rules;
 };
 
