Index: /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UIDetailsWidgetNATNetwork.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UIDetailsWidgetNATNetwork.cpp	(revision 87294)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UIDetailsWidgetNATNetwork.cpp	(revision 87295)
@@ -56,13 +56,15 @@
     , m_pForwardingTableIPv6(0)
     , m_pButtonBoxForwarding(0)
+    , m_fHoldPosition(false)
 {
     prepare();
 }
 
-void UIDetailsWidgetNATNetwork::setData(const UIDataNATNetwork &data)
+void UIDetailsWidgetNATNetwork::setData(const UIDataNATNetwork &data, bool fHoldPosition /* = false */)
 {
     /* Cache old/new data: */
     m_oldData = data;
     m_newData = m_oldData;
+    m_fHoldPosition = fHoldPosition;
 
     /* Load 'Options' data: */
@@ -495,6 +497,7 @@
 
     /* Load 'Forwarding' fields: */
-    m_pForwardingTableIPv4->setRules(m_newData.m_rules4);
-    m_pForwardingTableIPv6->setRules(m_newData.m_rules6);
+    m_pForwardingTableIPv4->setRules(m_newData.m_rules4, m_fHoldPosition);
+    m_pForwardingTableIPv6->setRules(m_newData.m_rules6, m_fHoldPosition);
+    m_fHoldPosition = false;
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UIDetailsWidgetNATNetwork.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UIDetailsWidgetNATNetwork.h	(revision 87294)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UIDetailsWidgetNATNetwork.h	(revision 87295)
@@ -120,6 +120,8 @@
     /** Returns the host network data. */
     const UIDataNATNetwork &data() const { return m_newData; }
-    /** Defines the host network @a data. */
-    void setData(const UIDataNATNetwork &data);
+    /** Defines the host network @a data.
+      * @param  fHoldPosition  Holds whether we should try to keep
+      *                        port forwarding rule position intact. */
+    void setData(const UIDataNATNetwork &data, bool fHoldPosition = false);
 
 protected:
@@ -236,4 +238,7 @@
         /** Holds the 'Forwarding' button-box instance. */
         QIDialogButtonBox     *m_pButtonBoxForwarding;
+        /** Holds whether we should try to keep
+          * port forwarding rule position intact. */
+        bool                   m_fHoldPosition;
     /** @} */
 };
Index: /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UINetworkManager.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UINetworkManager.cpp	(revision 87294)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UINetworkManager.cpp	(revision 87295)
@@ -1037,6 +1037,6 @@
             updateItemForNATNetwork(data, true, pChangedItem);
 
-            /* Make sure current item fetched: */
-            sltHandleCurrentItemChangeNATNetwork();
+            /* Make sure current item fetched, trying to hold chosen position: */
+            sltHandleCurrentItemChangeNATNetworkHoldingPosition(true /* hold position? */);
 
             /* Adjust tree-widgets: */
@@ -1046,5 +1046,5 @@
 }
 
-void UINetworkManagerWidget::sltHandleCurrentItemChangeNATNetwork()
+void UINetworkManagerWidget::sltHandleCurrentItemChangeNATNetworkHoldingPosition(bool fHoldPosition)
 {
     /* Check NAT network tree-widget: */
@@ -1063,8 +1063,13 @@
     /* If there is an item => update details data: */
     if (pItem)
-        m_pDetailsWidgetNATNetwork->setData(*pItem);
+        m_pDetailsWidgetNATNetwork->setData(*pItem, fHoldPosition);
     /* Otherwise => clear details: */
     else
         m_pDetailsWidgetNATNetwork->setData(UIDataNATNetwork());
+}
+
+void UINetworkManagerWidget::sltHandleCurrentItemChangeNATNetwork()
+{
+    sltHandleCurrentItemChangeNATNetworkHoldingPosition(false /* hold position? */);
 }
 
@@ -1191,6 +1196,6 @@
             updateItemForNATNetwork(data, true, pItem);
 
-            /* Make sure current item fetched: */
-            sltHandleCurrentItemChangeNATNetwork();
+            /* Make sure current item fetched, trying to hold chosen position: */
+            sltHandleCurrentItemChangeNATNetworkHoldingPosition(true /* hold position? */);
 
             /* Adjust tree-widgets: */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UINetworkManager.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UINetworkManager.h	(revision 87294)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UINetworkManager.h	(revision 87295)
@@ -142,4 +142,8 @@
         /** Handles NAT network tree-widget @a pItem change. */
         void sltHandleItemChangeNATNetwork(QTreeWidgetItem *pItem);
+        /** Handles NAT network tree-widget current item change.
+          * @param  fHoldPosition  Holds whether we should try to keep
+          *                        port forwarding rule position intact. */
+        void sltHandleCurrentItemChangeNATNetworkHoldingPosition(bool fHoldPosition);
         /** Handles NAT network tree-widget current item change. */
         void sltHandleCurrentItemChangeNATNetwork();
Index: /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIPortForwardingTable.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIPortForwardingTable.cpp	(revision 87294)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIPortForwardingTable.cpp	(revision 87295)
@@ -795,9 +795,28 @@
 }
 
-void UIPortForwardingTable::setRules(const UIPortForwardingDataList &newRules)
-{
+void UIPortForwardingTable::setRules(const UIPortForwardingDataList &newRules,
+                                     bool fHoldPosition /* = false */)
+{
+    /* Remember last chosen item: */
+    const QModelIndex currentIndex = m_pTableView->currentIndex();
+    QITableViewRow *pCurrentItem = currentIndex.isValid() ? m_pTableModel->childItem(currentIndex.row()) : 0;
+    const QString strCurrentName = pCurrentItem ? pCurrentItem->childItem(0)->text() : QString();
+
+    /* Update the list of rules: */
     m_rules = newRules;
     m_pTableModel->setRules(m_rules);
     sltAdjustTable();
+
+    /* Restore last chosen item: */
+    if (fHoldPosition && !strCurrentName.isEmpty())
+    {
+        for (int i = 0; i < m_pTableModel->childCount(); ++i)
+        {
+            QITableViewRow *pItem = m_pTableModel->childItem(i);
+            const QString strName = pItem ? pItem->childItem(0)->text() : QString();
+            if (strName == strCurrentName)
+                m_pTableView->setCurrentIndex(m_pTableModel->index(i, 0));
+        }
+    }
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIPortForwardingTable.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIPortForwardingTable.h	(revision 87294)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIPortForwardingTable.h	(revision 87295)
@@ -216,6 +216,9 @@
     /** Returns the list of port forwarding rules. */
     UIPortForwardingDataList rules() const;
-    /** Defines the list of port forwarding @a newRules. */
-    void setRules(const UIPortForwardingDataList &newRules);
+    /** Defines the list of port forwarding @a newRules.
+      * @param  fHoldPosition  Holds whether we should try to keep
+      *                        port forwarding rule position intact. */
+    void setRules(const UIPortForwardingDataList &newRules,
+                  bool fHoldPosition = false);
 
     /** Validates the table. */
