Index: /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk	(revision 87218)
+++ /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk	(revision 87219)
@@ -622,5 +622,5 @@
 	src/medium/UIMediumManager.h \
 	src/monitor/resource/UIResourceMonitor.h \
-	src/networkmanager/UINetworkDetailsWidget.h \
+	src/networkmanager/UIDetailsWidgetHostNetwork.h \
 	src/networkmanager/UINetworkManager.h \
 	src/snapshots/UISnapshotDetailsWidget.h \
@@ -1103,5 +1103,5 @@
 	src/medium/UIMediumManager.cpp \
 	src/monitor/resource/UIResourceMonitor.cpp \
-	src/networkmanager/UINetworkDetailsWidget.cpp \
+	src/networkmanager/UIDetailsWidgetHostNetwork.cpp \
 	src/networkmanager/UINetworkManager.cpp \
 	src/networkmanager/UINetworkManagerUtils.cpp \
Index: /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UIDetailsWidgetHostNetwork.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UIDetailsWidgetHostNetwork.cpp	(revision 87219)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UIDetailsWidgetHostNetwork.cpp	(revision 87219)
@@ -0,0 +1,1023 @@
+/* $Id$ */
+/** @file
+ * VBox Qt GUI - UIDetailsWidgetHostNetwork class implementation.
+ */
+
+/*
+ * Copyright (C) 2009-2021 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+/* Qt includes: */
+#include <QCheckBox>
+#include <QLabel>
+#include <QPushButton>
+#include <QRadioButton>
+#include <QRegExpValidator>
+#include <QStyleOption>
+#include <QVBoxLayout>
+
+/* GUI includes: */
+#include "QIDialogButtonBox.h"
+#include "QILineEdit.h"
+#include "QITabWidget.h"
+#include "UIIconPool.h"
+#include "UIDetailsWidgetHostNetwork.h"
+#include "UINetworkManagerUtils.h"
+
+/* Other VBox includes: */
+#include "iprt/assert.h"
+#include "iprt/cidr.h"
+
+
+UIDetailsWidgetHostNetwork::UIDetailsWidgetHostNetwork(EmbedTo enmEmbedding, QWidget *pParent /* = 0 */)
+    : QIWithRetranslateUI<QWidget>(pParent)
+    , m_enmEmbedding(enmEmbedding)
+    , m_pTabWidget(0)
+    , m_pButtonAutomatic(0), m_pErrorPaneAutomatic(0)
+    , m_pButtonManual(0), m_pErrorPaneManual(0)
+    , m_pLabelIPv4(0), m_pEditorIPv4(0), m_pErrorPaneIPv4(0)
+    , m_pLabelNMv4(0), m_pEditorNMv4(0), m_pErrorPaneNMv4(0)
+    , m_pLabelIPv6(0), m_pEditorIPv6(0), m_pErrorPaneIPv6(0)
+    , m_pLabelNMv6(0), m_pEditorNMv6(0), m_pErrorPaneNMv6(0)
+    , m_pButtonBoxInterface(0)
+    , m_pCheckBoxDHCP(0)
+    , m_pLabelDHCPAddress(0), m_pEditorDHCPAddress(0), m_pErrorPaneDHCPAddress(0)
+    , m_pLabelDHCPMask(0), m_pEditorDHCPMask(0), m_pErrorPaneDHCPMask(0)
+    , m_pLabelDHCPLowerAddress(0), m_pEditorDHCPLowerAddress(0), m_pErrorPaneDHCPLowerAddress(0)
+    , m_pLabelDHCPUpperAddress(0), m_pEditorDHCPUpperAddress(0), m_pErrorPaneDHCPUpperAddress(0)
+    , m_pButtonBoxServer(0)
+{
+    /* Prepare: */
+    prepare();
+}
+
+void UIDetailsWidgetHostNetwork::setData(const UIDataHostNetwork &data)
+{
+    /* Cache old/new data: */
+    m_oldData = data;
+    m_newData = m_oldData;
+
+    /* Load 'Interface' data: */
+    loadDataForInterface();
+    /* Load 'DHCP server' data: */
+    loadDataForDHCPServer();
+}
+
+void UIDetailsWidgetHostNetwork::retranslateUi()
+{
+    /* Translate tab-widget: */
+    m_pTabWidget->setTabText(0, tr("&Adapter"));
+    m_pTabWidget->setTabText(1, tr("&DHCP Server"));
+
+    /* Translate 'Interface' tab content: */
+    m_pButtonAutomatic->setText(tr("Configure Adapter &Automatically"));
+    m_pButtonManual->setText(tr("Configure Adapter &Manually"));
+    m_pLabelIPv4->setText(tr("&IPv4 Address:"));
+    m_pEditorIPv4->setToolTip(tr("Holds the host IPv4 address for this adapter."));
+    m_pLabelNMv4->setText(tr("IPv4 Network &Mask:"));
+    m_pEditorNMv4->setToolTip(tr("Holds the host IPv4 network mask for this adapter."));
+    m_pLabelIPv6->setText(tr("I&Pv6 Address:"));
+    m_pEditorIPv6->setToolTip(tr("Holds the host IPv6 address for this adapter if IPv6 is supported."));
+    m_pLabelNMv6->setText(tr("IPv6 Prefix &Length:"));
+    m_pEditorNMv6->setToolTip(tr("Holds the host IPv6 prefix length for this adapter if IPv6 is supported."));
+    if (m_pButtonBoxInterface)
+    {
+        m_pButtonBoxInterface->button(QDialogButtonBox::Cancel)->setText(tr("Reset"));
+        m_pButtonBoxInterface->button(QDialogButtonBox::Ok)->setText(tr("Apply"));
+        m_pButtonBoxInterface->button(QDialogButtonBox::Cancel)->setShortcut(Qt::Key_Escape);
+        m_pButtonBoxInterface->button(QDialogButtonBox::Ok)->setShortcut(QString("Ctrl+Return"));
+        m_pButtonBoxInterface->button(QDialogButtonBox::Cancel)->setStatusTip(tr("Reset changes in current interface details"));
+        m_pButtonBoxInterface->button(QDialogButtonBox::Ok)->setStatusTip(tr("Apply changes in current interface details"));
+        m_pButtonBoxInterface->button(QDialogButtonBox::Cancel)->
+            setToolTip(tr("Reset Changes (%1)").arg(m_pButtonBoxInterface->button(QDialogButtonBox::Cancel)->shortcut().toString()));
+        m_pButtonBoxInterface->button(QDialogButtonBox::Ok)->
+            setToolTip(tr("Apply Changes (%1)").arg(m_pButtonBoxInterface->button(QDialogButtonBox::Ok)->shortcut().toString()));
+    }
+
+    /* Translate 'DHCP server' tab content: */
+    m_pCheckBoxDHCP->setText(tr("&Enable Server"));
+    m_pCheckBoxDHCP->setToolTip(tr("When checked, the DHCP Server will be enabled for this network on machine start-up."));
+    m_pLabelDHCPAddress->setText(tr("Server Add&ress:"));
+    m_pEditorDHCPAddress->setToolTip(tr("Holds the address of the DHCP server servicing the network associated with this host-only adapter."));
+    m_pLabelDHCPMask->setText(tr("Server &Mask:"));
+    m_pEditorDHCPMask->setToolTip(tr("Holds the network mask of the DHCP server servicing the network associated with this host-only adapter."));
+    m_pLabelDHCPLowerAddress->setText(tr("&Lower Address Bound:"));
+    m_pEditorDHCPLowerAddress->setToolTip(tr("Holds the lower address bound offered by the DHCP server servicing the network associated with this host-only adapter."));
+    m_pLabelDHCPUpperAddress->setText(tr("&Upper Address Bound:"));
+    m_pEditorDHCPUpperAddress->setToolTip(tr("Holds the upper address bound offered by the DHCP server servicing the network associated with this host-only adapter."));
+    if (m_pButtonBoxServer)
+    {
+        m_pButtonBoxServer->button(QDialogButtonBox::Cancel)->setText(tr("Reset"));
+        m_pButtonBoxServer->button(QDialogButtonBox::Ok)->setText(tr("Apply"));
+        m_pButtonBoxServer->button(QDialogButtonBox::Cancel)->setShortcut(Qt::Key_Escape);
+        m_pButtonBoxServer->button(QDialogButtonBox::Ok)->setShortcut(QString("Ctrl+Return"));
+        m_pButtonBoxServer->button(QDialogButtonBox::Cancel)->setStatusTip(tr("Reset changes in current DHCP server details"));
+        m_pButtonBoxServer->button(QDialogButtonBox::Ok)->setStatusTip(tr("Apply changes in current DHCP server details"));
+        m_pButtonBoxServer->button(QDialogButtonBox::Cancel)->
+            setToolTip(tr("Reset Changes (%1)").arg(m_pButtonBoxServer->button(QDialogButtonBox::Cancel)->shortcut().toString()));
+        m_pButtonBoxServer->button(QDialogButtonBox::Ok)->
+            setToolTip(tr("Apply Changes (%1)").arg(m_pButtonBoxServer->button(QDialogButtonBox::Ok)->shortcut().toString()));
+    }
+
+    /* Retranslate validation: */
+    retranslateValidation();
+}
+
+void UIDetailsWidgetHostNetwork::sltToggledButtonAutomatic(bool fChecked)
+{
+    m_newData.m_interface.m_fDHCPEnabled = fChecked;
+    loadDataForInterface();
+    revalidate();
+    updateButtonStates();
+}
+
+void UIDetailsWidgetHostNetwork::sltToggledButtonManual(bool fChecked)
+{
+    m_newData.m_interface.m_fDHCPEnabled = !fChecked;
+    loadDataForInterface();
+    revalidate();
+    updateButtonStates();
+}
+
+void UIDetailsWidgetHostNetwork::sltTextChangedIPv4(const QString &strText)
+{
+    m_newData.m_interface.m_strAddress = strText;
+    revalidate(m_pErrorPaneIPv4);
+    updateButtonStates();
+}
+
+void UIDetailsWidgetHostNetwork::sltTextChangedNMv4(const QString &strText)
+{
+    m_newData.m_interface.m_strMask = strText;
+    revalidate(m_pErrorPaneNMv4);
+    updateButtonStates();
+}
+
+void UIDetailsWidgetHostNetwork::sltTextChangedIPv6(const QString &strText)
+{
+    m_newData.m_interface.m_strAddress6 = strText;
+    revalidate(m_pErrorPaneIPv6);
+    updateButtonStates();
+}
+
+void UIDetailsWidgetHostNetwork::sltTextChangedNMv6(const QString &strText)
+{
+    m_newData.m_interface.m_strPrefixLength6 = strText;
+    revalidate(m_pErrorPaneNMv6);
+    updateButtonStates();
+}
+
+void UIDetailsWidgetHostNetwork::sltStatusChangedServer(int iChecked)
+{
+    m_newData.m_dhcpserver.m_fEnabled = (bool)iChecked;
+    loadDataForDHCPServer();
+    revalidate();
+    updateButtonStates();
+}
+
+void UIDetailsWidgetHostNetwork::sltTextChangedAddress(const QString &strText)
+{
+    m_newData.m_dhcpserver.m_strAddress = strText;
+    revalidate(m_pErrorPaneDHCPAddress);
+    updateButtonStates();
+}
+
+void UIDetailsWidgetHostNetwork::sltTextChangedMask(const QString &strText)
+{
+    m_newData.m_dhcpserver.m_strMask = strText;
+    revalidate(m_pErrorPaneDHCPMask);
+    updateButtonStates();
+}
+
+void UIDetailsWidgetHostNetwork::sltTextChangedLowerAddress(const QString &strText)
+{
+    m_newData.m_dhcpserver.m_strLowerAddress = strText;
+    revalidate(m_pErrorPaneDHCPLowerAddress);
+    updateButtonStates();
+}
+
+void UIDetailsWidgetHostNetwork::sltTextChangedUpperAddress(const QString &strText)
+{
+    m_newData.m_dhcpserver.m_strUpperAddress = strText;
+    revalidate(m_pErrorPaneDHCPUpperAddress);
+    updateButtonStates();
+}
+
+void UIDetailsWidgetHostNetwork::sltHandleButtonBoxClick(QAbstractButton *pButton)
+{
+    /* Make sure button-box exists: */
+    AssertPtrReturnVoid(m_pButtonBoxInterface);
+    AssertPtrReturnVoid(m_pButtonBoxServer);
+
+    /* Disable buttons first of all: */
+    m_pButtonBoxInterface->button(QDialogButtonBox::Cancel)->setEnabled(false);
+    m_pButtonBoxInterface->button(QDialogButtonBox::Ok)->setEnabled(false);
+    m_pButtonBoxServer->button(QDialogButtonBox::Cancel)->setEnabled(false);
+    m_pButtonBoxServer->button(QDialogButtonBox::Ok)->setEnabled(false);
+
+    /* Compare with known buttons: */
+    if (   pButton == m_pButtonBoxInterface->button(QDialogButtonBox::Cancel)
+        || pButton == m_pButtonBoxServer->button(QDialogButtonBox::Cancel))
+        emit sigDataChangeRejected();
+    else
+    if (   pButton == m_pButtonBoxInterface->button(QDialogButtonBox::Ok)
+        || pButton == m_pButtonBoxServer->button(QDialogButtonBox::Ok))
+        emit sigDataChangeAccepted();
+}
+
+void UIDetailsWidgetHostNetwork::prepare()
+{
+    /* Prepare this: */
+    prepareThis();
+
+    /* Apply language settings: */
+    retranslateUi();
+
+    /* Update button states finally: */
+    updateButtonStates();
+}
+
+void UIDetailsWidgetHostNetwork::prepareThis()
+{
+    /* Create layout: */
+    QVBoxLayout *pLayout = new QVBoxLayout(this);
+    AssertPtrReturnVoid(pLayout);
+    {
+        /* Configure layout: */
+        pLayout->setContentsMargins(0, 0, 0, 0);
+
+        /* Prepare tab-widget: */
+        prepareTabWidget();
+    }
+}
+
+void UIDetailsWidgetHostNetwork::prepareTabWidget()
+{
+    /* Create tab-widget: */
+    m_pTabWidget = new QITabWidget;
+    AssertPtrReturnVoid(m_pTabWidget);
+    {
+        /* Prepare 'Interface' tab: */
+        prepareTabInterface();
+        /* Prepare 'DHCP server' tab: */
+        prepareTabDHCPServer();
+
+        /* Add into layout: */
+        layout()->addWidget(m_pTabWidget);
+    }
+}
+
+void UIDetailsWidgetHostNetwork::prepareTabInterface()
+{
+    /* Create 'Interface' tab: */
+    QWidget *pTabInterface = new QWidget;
+    AssertPtrReturnVoid(pTabInterface);
+    {
+        /* Create 'Interface' layout: */
+        QGridLayout *pLayoutInterface = new QGridLayout(pTabInterface);
+        AssertPtrReturnVoid(pLayoutInterface);
+        {
+#ifdef VBOX_WS_MAC
+            /* Configure layout: */
+            pLayoutInterface->setSpacing(10);
+            pLayoutInterface->setContentsMargins(10, 10, 10, 10);
+#endif
+
+            /* Get the required icon metric: */
+            const int iIconMetric = QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize);
+
+            /* Create automatic interface configuration layout: */
+            QHBoxLayout *pLayoutAutomatic = new QHBoxLayout;
+            AssertPtrReturnVoid(pLayoutAutomatic);
+            {
+                /* Configure layout: */
+                pLayoutAutomatic->setContentsMargins(0, 0, 0, 0);
+
+                /* Create automatic interface configuration radio-button: */
+                m_pButtonAutomatic = new QRadioButton;
+                AssertPtrReturnVoid(m_pButtonAutomatic);
+                {
+                    /* Configure radio-button: */
+                    connect(m_pButtonAutomatic, &QRadioButton::toggled,
+                            this, &UIDetailsWidgetHostNetwork::sltToggledButtonAutomatic);
+                    /* Add into layout: */
+                    pLayoutAutomatic->addWidget(m_pButtonAutomatic);
+                }
+                /* Create automatic interface configuration error pane: */
+                m_pErrorPaneAutomatic = new QLabel;
+                AssertPtrReturnVoid(m_pErrorPaneAutomatic);
+                {
+                    /* Configure label: */
+                    m_pErrorPaneAutomatic->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
+                    m_pErrorPaneAutomatic->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum);
+                    m_pErrorPaneAutomatic->setPixmap(UIIconPool::iconSet(":/status_error_16px.png")
+                                                     .pixmap(QSize(iIconMetric, iIconMetric)));
+                    /* Add into layout: */
+                    pLayoutAutomatic->addWidget(m_pErrorPaneAutomatic);
+                }
+                /* Add into layout: */
+                pLayoutInterface->addLayout(pLayoutAutomatic, 0, 0, 1, 3);
+#ifdef VBOX_WS_MAC
+                pLayoutInterface->setRowMinimumHeight(0, 22);
+#endif
+            }
+
+            /* Create manual interface configuration layout: */
+            QHBoxLayout *pLayoutManual = new QHBoxLayout;
+            AssertPtrReturnVoid(pLayoutManual);
+            {
+                /* Configure layout: */
+                pLayoutManual->setContentsMargins(0, 0, 0, 0);
+                /* Create manual interface configuration radio-button: */
+                m_pButtonManual = new QRadioButton;
+                AssertPtrReturnVoid(m_pButtonManual);
+                {
+                    /* Configure radio-button: */
+                    connect(m_pButtonManual, &QRadioButton::toggled,
+                            this, &UIDetailsWidgetHostNetwork::sltToggledButtonManual);
+                    /* Add into layout: */
+                    pLayoutManual->addWidget(m_pButtonManual);
+                }
+                /* Create manual interface configuration error pane: */
+                m_pErrorPaneManual = new QLabel;
+                AssertPtrReturnVoid(m_pErrorPaneManual);
+                {
+                    /* Configure label: */
+                    m_pErrorPaneManual->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
+                    m_pErrorPaneManual->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum);
+                    m_pErrorPaneManual->setPixmap(UIIconPool::iconSet(":/status_error_16px.png")
+                                                  .pixmap(QSize(iIconMetric, iIconMetric)));
+                    /* Add into layout: */
+                    pLayoutManual->addWidget(m_pErrorPaneManual);
+                }
+                /* Add into layout: */
+                pLayoutInterface->addLayout(pLayoutManual, 1, 0, 1, 3);
+#ifdef VBOX_WS_MAC
+                pLayoutInterface->setRowMinimumHeight(1, 22);
+#endif
+            }
+
+            /* Create IPv4 address label: */
+            m_pLabelIPv4 = new QLabel;
+            AssertPtrReturnVoid(m_pLabelIPv4);
+            {
+                /* Configure label: */
+                m_pLabelIPv4->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
+                /* Add into layout: */
+                pLayoutInterface->addWidget(m_pLabelIPv4, 2, 1);
+            }
+            /* Create IPv4 layout: */
+            QHBoxLayout *pLayoutIPv4 = new QHBoxLayout;
+            AssertPtrReturnVoid(pLayoutIPv4);
+            {
+                /* Configure layout: */
+                pLayoutIPv4->setContentsMargins(0, 0, 0, 0);
+                /* Create IPv4 address editor: */
+                m_pEditorIPv4 = new QILineEdit;
+                AssertPtrReturnVoid(m_pEditorIPv4);
+                {
+                    /* Configure editor: */
+                    m_pLabelIPv4->setBuddy(m_pEditorIPv4);
+                    connect(m_pEditorIPv4, &QLineEdit::textChanged,
+                            this, &UIDetailsWidgetHostNetwork::sltTextChangedIPv4);
+                    /* Add into layout: */
+                    pLayoutIPv4->addWidget(m_pEditorIPv4);
+                }
+                /* Create IPv4 error pane: */
+                m_pErrorPaneIPv4 = new QLabel;
+                AssertPtrReturnVoid(m_pErrorPaneIPv4);
+                {
+                    /* Configure label: */
+                    m_pErrorPaneIPv4->setAlignment(Qt::AlignCenter);
+                    m_pErrorPaneIPv4->setPixmap(UIIconPool::iconSet(":/status_error_16px.png")
+                                                .pixmap(QSize(iIconMetric, iIconMetric)));
+                    /* Add into layout: */
+                    pLayoutIPv4->addWidget(m_pErrorPaneIPv4);
+                }
+                /* Add into layout: */
+                pLayoutInterface->addLayout(pLayoutIPv4, 2, 2);
+            }
+
+            /* Create NMv4 network mask label: */
+            m_pLabelNMv4 = new QLabel;
+            AssertPtrReturnVoid(m_pLabelNMv4);
+            {
+                /* Configure label: */
+                m_pLabelNMv4->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
+                /* Add into layout: */
+                pLayoutInterface->addWidget(m_pLabelNMv4, 3, 1);
+            }
+            /* Create NMv4 layout: */
+            QHBoxLayout *pLayoutNMv4 = new QHBoxLayout;
+            AssertPtrReturnVoid(pLayoutNMv4);
+            {
+                /* Configure layout: */
+                pLayoutNMv4->setContentsMargins(0, 0, 0, 0);
+                /* Create NMv4 network mask editor: */
+                m_pEditorNMv4 = new QILineEdit;
+                AssertPtrReturnVoid(m_pEditorNMv4);
+                {
+                    /* Configure editor: */
+                    m_pLabelNMv4->setBuddy(m_pEditorNMv4);
+                    connect(m_pEditorNMv4, &QLineEdit::textChanged,
+                            this, &UIDetailsWidgetHostNetwork::sltTextChangedNMv4);
+                    /* Add into layout: */
+                    pLayoutNMv4->addWidget(m_pEditorNMv4);
+                }
+                /* Create NMv4 error pane: */
+                m_pErrorPaneNMv4 = new QLabel;
+                AssertPtrReturnVoid(m_pErrorPaneNMv4);
+                {
+                    /* Configure label: */
+                    m_pErrorPaneNMv4->setAlignment(Qt::AlignCenter);
+                    m_pErrorPaneNMv4->setPixmap(UIIconPool::iconSet(":/status_error_16px.png")
+                                                .pixmap(QSize(iIconMetric, iIconMetric)));
+                    /* Add into layout: */
+                    pLayoutNMv4->addWidget(m_pErrorPaneNMv4);
+                }
+                /* Add into layout: */
+                pLayoutInterface->addLayout(pLayoutNMv4, 3, 2);
+            }
+
+            /* Create IPv6 address label: */
+            m_pLabelIPv6 = new QLabel;
+            AssertPtrReturnVoid(m_pLabelIPv6);
+            {
+                /* Configure label: */
+                m_pLabelIPv6->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
+                /* Add into layout: */
+                pLayoutInterface->addWidget(m_pLabelIPv6, 4, 1);
+            }
+            /* Create IPv6 layout: */
+            QHBoxLayout *pLayoutIPv6 = new QHBoxLayout;
+            AssertPtrReturnVoid(pLayoutIPv6);
+            {
+                /* Configure layout: */
+                pLayoutIPv6->setContentsMargins(0, 0, 0, 0);
+                /* Create IPv6 address editor: */
+                m_pEditorIPv6 = new QILineEdit;
+                AssertPtrReturnVoid(m_pEditorIPv6);
+                {
+                    /* Configure editor: */
+                    m_pLabelIPv6->setBuddy(m_pEditorIPv6);
+                    connect(m_pEditorIPv6, &QLineEdit::textChanged,
+                            this, &UIDetailsWidgetHostNetwork::sltTextChangedIPv6);
+                    /* Add into layout: */
+                    pLayoutIPv6->addWidget(m_pEditorIPv6);
+                }
+                /* Create IPv4 error pane: */
+                m_pErrorPaneIPv6 = new QLabel;
+                AssertPtrReturnVoid(m_pErrorPaneIPv6);
+                {
+                    /* Configure label: */
+                    m_pErrorPaneIPv6->setAlignment(Qt::AlignCenter);
+                    m_pErrorPaneIPv6->setPixmap(UIIconPool::iconSet(":/status_error_16px.png")
+                                                .pixmap(QSize(iIconMetric, iIconMetric)));
+                    /* Add into layout: */
+                    pLayoutIPv6->addWidget(m_pErrorPaneIPv6);
+                }
+                /* Add into layout: */
+                pLayoutInterface->addLayout(pLayoutIPv6, 4, 2);
+            }
+
+            /* Create NMv6 network mask label: */
+            m_pLabelNMv6 = new QLabel;
+            AssertPtrReturnVoid(m_pLabelNMv6);
+            {
+                /* Configure label: */
+                m_pLabelNMv6->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
+                /* Add into layout: */
+                pLayoutInterface->addWidget(m_pLabelNMv6, 5, 1);
+            }
+            /* Create NMv6 layout: */
+            QHBoxLayout *pLayoutNMv6 = new QHBoxLayout;
+            AssertPtrReturnVoid(pLayoutNMv6);
+            {
+                /* Configure layout: */
+                pLayoutNMv6->setContentsMargins(0, 0, 0, 0);
+                /* Create NMv6 network mask editor: */
+                m_pEditorNMv6 = new QILineEdit;
+                AssertPtrReturnVoid(m_pEditorNMv6);
+                {
+                    /* Configure editor: */
+                    m_pLabelNMv6->setBuddy(m_pEditorNMv6);
+                    connect(m_pEditorNMv6, &QLineEdit::textChanged,
+                            this, &UIDetailsWidgetHostNetwork::sltTextChangedNMv6);
+                    /* Add into layout: */
+                    pLayoutNMv6->addWidget(m_pEditorNMv6);
+                }
+                /* Create NMv6 error pane: */
+                m_pErrorPaneNMv6 = new QLabel;
+                AssertPtrReturnVoid(m_pErrorPaneNMv6);
+                {
+                    /* Configure label: */
+                    m_pErrorPaneNMv6->setAlignment(Qt::AlignCenter);
+                    m_pErrorPaneNMv6->setPixmap(UIIconPool::iconSet(":/status_error_16px.png")
+                                                .pixmap(QSize(iIconMetric, iIconMetric)));
+                    /* Add into layout: */
+                    pLayoutNMv6->addWidget(m_pErrorPaneNMv6);
+                }
+                /* Add into layout: */
+                pLayoutInterface->addLayout(pLayoutNMv6, 5, 2);
+            }
+
+            /* Create indent: */
+            QStyleOption options;
+            options.initFrom(m_pButtonManual);
+            const int iWidth = m_pButtonManual->style()->pixelMetric(QStyle::PM_ExclusiveIndicatorWidth, &options, m_pButtonManual) +
+                               m_pButtonManual->style()->pixelMetric(QStyle::PM_RadioButtonLabelSpacing, &options, m_pButtonManual) -
+                               pLayoutInterface->spacing() - 1;
+            QSpacerItem *pSpacer1 = new QSpacerItem(iWidth, 0, QSizePolicy::Fixed, QSizePolicy::Expanding);
+            AssertPtrReturnVoid(pSpacer1);
+            {
+                /* Add into layout: */
+                pLayoutInterface->addItem(pSpacer1, 2, 0, 4);
+            }
+            /* Create stretch: */
+            QSpacerItem *pSpacer2 = new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding);
+            AssertPtrReturnVoid(pSpacer2);
+            {
+                /* Add into layout: */
+                pLayoutInterface->addItem(pSpacer2, 6, 0, 1, 3);
+            }
+
+            /* If parent embedded into stack: */
+            if (m_enmEmbedding == EmbedTo_Stack)
+            {
+                /* Create button-box: */
+                m_pButtonBoxInterface = new QIDialogButtonBox;
+                AssertPtrReturnVoid(m_pButtonBoxInterface);
+                /* Configure button-box: */
+                m_pButtonBoxInterface->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok);
+                connect(m_pButtonBoxInterface, &QIDialogButtonBox::clicked, this, &UIDetailsWidgetHostNetwork::sltHandleButtonBoxClick);
+
+                /* Add into layout: */
+                pLayoutInterface->addWidget(m_pButtonBoxInterface, 7, 0, 1, 3);
+            }
+        }
+        /* Add to tab-widget: */
+        m_pTabWidget->addTab(pTabInterface, QString());
+    }
+}
+
+void UIDetailsWidgetHostNetwork::prepareTabDHCPServer()
+{
+    /* Create 'DHCP server' tab: */
+    QWidget *pTabDHCPServer = new QWidget;
+    AssertPtrReturnVoid(pTabDHCPServer);
+    {
+        /* Create 'DHCP server' layout: */
+        QGridLayout *pLayoutDHCPServer = new QGridLayout(pTabDHCPServer);
+        AssertPtrReturnVoid(pLayoutDHCPServer);
+        {
+#ifdef VBOX_WS_MAC
+            /* Configure layout: */
+            pLayoutDHCPServer->setSpacing(10);
+            pLayoutDHCPServer->setContentsMargins(10, 10, 10, 10);
+#endif
+
+            /* Get the required icon metric: */
+            const int iIconMetric = QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize);
+
+            /* Create DHCP server status check-box: */
+            m_pCheckBoxDHCP = new QCheckBox;
+            AssertPtrReturnVoid(m_pCheckBoxDHCP);
+            {
+                /* Configure check-box: */
+                connect(m_pCheckBoxDHCP, &QCheckBox::stateChanged,
+                        this, &UIDetailsWidgetHostNetwork::sltStatusChangedServer);
+                /* Add into layout: */
+                pLayoutDHCPServer->addWidget(m_pCheckBoxDHCP, 0, 0, 1, 2);
+#ifdef VBOX_WS_MAC
+                pLayoutDHCPServer->setRowMinimumHeight(0, 22);
+#endif
+            }
+
+            /* Create DHCP address label: */
+            m_pLabelDHCPAddress = new QLabel;
+            AssertPtrReturnVoid(m_pLabelDHCPAddress);
+            {
+                /* Configure label: */
+                m_pLabelDHCPAddress->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
+                /* Add into layout: */
+                pLayoutDHCPServer->addWidget(m_pLabelDHCPAddress, 1, 1);
+            }
+            /* Create DHCP address layout: */
+            QHBoxLayout *pLayoutDHCPAddress = new QHBoxLayout;
+            AssertPtrReturnVoid(pLayoutDHCPAddress);
+            {
+                /* Configure layout: */
+                pLayoutDHCPAddress->setContentsMargins(0, 0, 0, 0);
+                /* Create DHCP address editor: */
+                m_pEditorDHCPAddress = new QILineEdit;
+                AssertPtrReturnVoid(m_pEditorDHCPAddress);
+                {
+                    /* Configure editor: */
+                    m_pLabelDHCPAddress->setBuddy(m_pEditorDHCPAddress);
+                    connect(m_pEditorDHCPAddress, &QLineEdit::textChanged,
+                            this, &UIDetailsWidgetHostNetwork::sltTextChangedAddress);
+                    /* Add into layout: */
+                    pLayoutDHCPAddress->addWidget(m_pEditorDHCPAddress);
+                }
+                /* Create DHCP address error pane: */
+                m_pErrorPaneDHCPAddress = new QLabel;
+                AssertPtrReturnVoid(m_pErrorPaneDHCPAddress);
+                {
+                    /* Configure label: */
+                    m_pErrorPaneDHCPAddress->setAlignment(Qt::AlignCenter);
+                    m_pErrorPaneDHCPAddress->setPixmap(UIIconPool::iconSet(":/status_error_16px.png")
+                                                       .pixmap(QSize(iIconMetric, iIconMetric)));
+                    /* Add into layout: */
+                    pLayoutDHCPAddress->addWidget(m_pErrorPaneDHCPAddress);
+                }
+                /* Add into layout: */
+                pLayoutDHCPServer->addLayout(pLayoutDHCPAddress, 1, 2);
+            }
+
+            /* Create DHCP network mask label: */
+            m_pLabelDHCPMask = new QLabel;
+            AssertPtrReturnVoid(m_pLabelDHCPMask);
+            {
+                /* Configure label: */
+                m_pLabelDHCPMask->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
+                /* Add into layout: */
+                pLayoutDHCPServer->addWidget(m_pLabelDHCPMask, 2, 1);
+            }
+            /* Create DHCP mask layout: */
+            QHBoxLayout *pLayoutDHCPMask = new QHBoxLayout;
+            AssertPtrReturnVoid(pLayoutDHCPMask);
+            {
+                /* Configure layout: */
+                pLayoutDHCPMask->setContentsMargins(0, 0, 0, 0);
+                /* Create DHCP network mask editor: */
+                m_pEditorDHCPMask = new QILineEdit;
+                AssertPtrReturnVoid(m_pEditorDHCPMask);
+                {
+                    /* Configure editor: */
+                    m_pLabelDHCPMask->setBuddy(m_pEditorDHCPMask);
+                    connect(m_pEditorDHCPMask, &QLineEdit::textChanged,
+                            this, &UIDetailsWidgetHostNetwork::sltTextChangedMask);
+                    /* Add into layout: */
+                    pLayoutDHCPMask->addWidget(m_pEditorDHCPMask);
+                }
+                /* Create DHCP mask error pane: */
+                m_pErrorPaneDHCPMask = new QLabel;
+                AssertPtrReturnVoid(m_pErrorPaneDHCPMask);
+                {
+                    /* Configure label: */
+                    m_pErrorPaneDHCPMask->setAlignment(Qt::AlignCenter);
+                    m_pErrorPaneDHCPMask->setPixmap(UIIconPool::iconSet(":/status_error_16px.png")
+                                                    .pixmap(QSize(iIconMetric, iIconMetric)));
+                    /* Add into layout: */
+                    pLayoutDHCPMask->addWidget(m_pErrorPaneDHCPMask);
+                }
+                /* Add into layout: */
+                pLayoutDHCPServer->addLayout(pLayoutDHCPMask, 2, 2);
+            }
+
+            /* Create DHCP lower address label: */
+            m_pLabelDHCPLowerAddress = new QLabel;
+            AssertPtrReturnVoid(m_pLabelDHCPLowerAddress);
+            {
+                /* Configure label: */
+                m_pLabelDHCPLowerAddress->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
+                /* Add into layout: */
+                pLayoutDHCPServer->addWidget(m_pLabelDHCPLowerAddress, 3, 1);
+            }
+            /* Create DHCP lower address layout: */
+            QHBoxLayout *pLayoutDHCPLowerAddress = new QHBoxLayout;
+            AssertPtrReturnVoid(pLayoutDHCPLowerAddress);
+            {
+                /* Configure layout: */
+                pLayoutDHCPLowerAddress->setContentsMargins(0, 0, 0, 0);
+                /* Create DHCP lower address editor: */
+                m_pEditorDHCPLowerAddress = new QILineEdit;
+                AssertPtrReturnVoid(m_pEditorDHCPLowerAddress);
+                {
+                    /* Configure editor: */
+                    m_pLabelDHCPLowerAddress->setBuddy(m_pEditorDHCPLowerAddress);
+                    connect(m_pEditorDHCPLowerAddress, &QLineEdit::textChanged,
+                            this, &UIDetailsWidgetHostNetwork::sltTextChangedLowerAddress);
+                    /* Add into layout: */
+                    pLayoutDHCPLowerAddress->addWidget(m_pEditorDHCPLowerAddress);
+                }
+                /* Create DHCP lower address error pane: */
+                m_pErrorPaneDHCPLowerAddress = new QLabel;
+                AssertPtrReturnVoid(m_pErrorPaneDHCPLowerAddress);
+                {
+                    /* Configure label: */
+                    m_pErrorPaneDHCPLowerAddress->setAlignment(Qt::AlignCenter);
+                    m_pErrorPaneDHCPLowerAddress->setPixmap(UIIconPool::iconSet(":/status_error_16px.png")
+                                                            .pixmap(QSize(iIconMetric, iIconMetric)));
+                    /* Add into layout: */
+                    pLayoutDHCPLowerAddress->addWidget(m_pErrorPaneDHCPLowerAddress);
+                }
+                /* Add into layout: */
+                pLayoutDHCPServer->addLayout(pLayoutDHCPLowerAddress, 3, 2);
+            }
+
+            /* Create DHCP upper address label: */
+            m_pLabelDHCPUpperAddress = new QLabel;
+            AssertPtrReturnVoid(m_pLabelDHCPUpperAddress);
+            {
+                /* Configure label: */
+                m_pLabelDHCPUpperAddress->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
+                /* Add into layout: */
+                pLayoutDHCPServer->addWidget(m_pLabelDHCPUpperAddress, 4, 1);
+            }
+            /* Create DHCP upper address layout: */
+            QHBoxLayout *pLayoutDHCPUpperAddress = new QHBoxLayout;
+            AssertPtrReturnVoid(pLayoutDHCPUpperAddress);
+            {
+                /* Configure layout: */
+                pLayoutDHCPUpperAddress->setContentsMargins(0, 0, 0, 0);
+                /* Create DHCP upper address editor: */
+                m_pEditorDHCPUpperAddress = new QILineEdit;
+                AssertPtrReturnVoid(m_pEditorDHCPUpperAddress);
+                {
+                    /* Configure editor: */
+                    m_pLabelDHCPUpperAddress->setBuddy(m_pEditorDHCPUpperAddress);
+                    connect(m_pEditorDHCPUpperAddress, &QLineEdit::textChanged,
+                            this, &UIDetailsWidgetHostNetwork::sltTextChangedUpperAddress);
+                    /* Add into layout: */
+                    pLayoutDHCPUpperAddress->addWidget(m_pEditorDHCPUpperAddress);
+                }
+                /* Create DHCP upper address error pane: */
+                m_pErrorPaneDHCPUpperAddress = new QLabel;
+                AssertPtrReturnVoid(m_pErrorPaneDHCPUpperAddress);
+                {
+                    /* Configure label: */
+                    m_pErrorPaneDHCPUpperAddress->setAlignment(Qt::AlignCenter);
+                    m_pErrorPaneDHCPUpperAddress->setPixmap(UIIconPool::iconSet(":/status_error_16px.png")
+                                                            .pixmap(QSize(iIconMetric, iIconMetric)));
+                    /* Add into layout: */
+                    pLayoutDHCPUpperAddress->addWidget(m_pErrorPaneDHCPUpperAddress);
+                }
+                /* Add into layout: */
+                pLayoutDHCPServer->addLayout(pLayoutDHCPUpperAddress, 4, 2);
+            }
+
+            /* Create indent: */
+            QStyleOption options;
+            options.initFrom(m_pCheckBoxDHCP);
+            const int iWidth = m_pCheckBoxDHCP->style()->pixelMetric(QStyle::PM_IndicatorWidth, &options, m_pCheckBoxDHCP) +
+                               m_pCheckBoxDHCP->style()->pixelMetric(QStyle::PM_CheckBoxLabelSpacing, &options, m_pCheckBoxDHCP) -
+                               pLayoutDHCPServer->spacing() - 1;
+            QSpacerItem *pSpacer1 = new QSpacerItem(iWidth, 0, QSizePolicy::Fixed, QSizePolicy::Expanding);
+            AssertPtrReturnVoid(pSpacer1);
+            {
+                /* Add into layout: */
+                pLayoutDHCPServer->addItem(pSpacer1, 1, 0, 4);
+            }
+            /* Create stretch: */
+            QSpacerItem *pSpacer2 = new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding);
+            AssertPtrReturnVoid(pSpacer2);
+            {
+                /* Add into layout: */
+                pLayoutDHCPServer->addItem(pSpacer2, 5, 0, 1, 3);
+            }
+
+            /* If parent embedded into stack: */
+            if (m_enmEmbedding == EmbedTo_Stack)
+            {
+                /* Create button-box: */
+                m_pButtonBoxServer = new QIDialogButtonBox;
+                AssertPtrReturnVoid(m_pButtonBoxServer);
+                /* Configure button-box: */
+                m_pButtonBoxServer->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok);
+                connect(m_pButtonBoxServer, &QIDialogButtonBox::clicked, this, &UIDetailsWidgetHostNetwork::sltHandleButtonBoxClick);
+
+                /* Add into layout: */
+                pLayoutDHCPServer->addWidget(m_pButtonBoxServer, 6, 0, 1, 3);
+            }
+        }
+        /* Add to tab-widget: */
+        m_pTabWidget->addTab(pTabDHCPServer, QString());
+    }
+}
+
+void UIDetailsWidgetHostNetwork::loadDataForInterface()
+{
+    /* Toggle IPv4 & IPv6 interface fields availability: */
+    const bool fIsInterfaceConfigurable = !m_newData.m_interface.m_fDHCPEnabled;
+    m_pLabelIPv4->setEnabled(fIsInterfaceConfigurable);
+    m_pLabelNMv4->setEnabled(fIsInterfaceConfigurable);
+    m_pEditorIPv4->setEnabled(fIsInterfaceConfigurable);
+    m_pEditorNMv4->setEnabled(fIsInterfaceConfigurable);
+
+    /* Load IPv4 interface fields: */
+    m_pButtonAutomatic->setChecked(!fIsInterfaceConfigurable);
+    m_pButtonManual->setChecked(fIsInterfaceConfigurable);
+    m_pEditorIPv4->setText(m_newData.m_interface.m_strAddress);
+    m_pEditorNMv4->setText(m_newData.m_interface.m_strMask);
+
+    /* Toggle IPv6 interface fields availability: */
+    const bool fIsIpv6Configurable = fIsInterfaceConfigurable && m_newData.m_interface.m_fSupportedIPv6;
+    m_pLabelIPv6->setEnabled(fIsIpv6Configurable);
+    m_pLabelNMv6->setEnabled(fIsIpv6Configurable);
+    m_pEditorIPv6->setEnabled(fIsIpv6Configurable);
+    m_pEditorNMv6->setEnabled(fIsIpv6Configurable);
+
+    /* Load IPv6 interface fields: */
+    m_pEditorIPv6->setText(m_newData.m_interface.m_strAddress6);
+    m_pEditorNMv6->setText(m_newData.m_interface.m_strPrefixLength6);
+}
+
+void UIDetailsWidgetHostNetwork::loadDataForDHCPServer()
+{
+    /* Toggle DHCP server fields availability: */
+    const bool fIsDHCPServerEnabled = m_newData.m_dhcpserver.m_fEnabled;
+    m_pLabelDHCPAddress->setEnabled(fIsDHCPServerEnabled);
+    m_pLabelDHCPMask->setEnabled(fIsDHCPServerEnabled);
+    m_pLabelDHCPLowerAddress->setEnabled(fIsDHCPServerEnabled);
+    m_pLabelDHCPUpperAddress->setEnabled(fIsDHCPServerEnabled);
+    m_pEditorDHCPAddress->setEnabled(fIsDHCPServerEnabled);
+    m_pEditorDHCPMask->setEnabled(fIsDHCPServerEnabled);
+    m_pEditorDHCPLowerAddress->setEnabled(fIsDHCPServerEnabled);
+    m_pEditorDHCPUpperAddress->setEnabled(fIsDHCPServerEnabled);
+
+    /* Load DHCP server fields: */
+    m_pCheckBoxDHCP->setChecked(fIsDHCPServerEnabled);
+    m_pEditorDHCPAddress->setText(m_newData.m_dhcpserver.m_strAddress);
+    m_pEditorDHCPMask->setText(m_newData.m_dhcpserver.m_strMask);
+    m_pEditorDHCPLowerAddress->setText(m_newData.m_dhcpserver.m_strLowerAddress);
+    m_pEditorDHCPUpperAddress->setText(m_newData.m_dhcpserver.m_strUpperAddress);
+
+    /* Invent default values if server was enabled
+     * but at least one current value is invalid: */
+    if (   fIsDHCPServerEnabled
+        && (   m_pEditorDHCPAddress->text().isEmpty()
+            || m_pEditorDHCPAddress->text() == "0.0.0.0"
+            || m_pEditorDHCPMask->text().isEmpty()
+            || m_pEditorDHCPMask->text() == "0.0.0.0"
+            || m_pEditorDHCPLowerAddress->text().isEmpty()
+            || m_pEditorDHCPLowerAddress->text() == "0.0.0.0"
+            || m_pEditorDHCPUpperAddress->text().isEmpty()
+            || m_pEditorDHCPUpperAddress->text() == "0.0.0.0"))
+    {
+        const QStringList &proposal = makeDhcpServerProposal(m_oldData.m_interface.m_strAddress,
+                                                             m_oldData.m_interface.m_strMask);
+        m_pEditorDHCPAddress->setText(proposal.at(0));
+        m_pEditorDHCPMask->setText(proposal.at(1));
+        m_pEditorDHCPLowerAddress->setText(proposal.at(2));
+        m_pEditorDHCPUpperAddress->setText(proposal.at(3));
+    }
+}
+
+void UIDetailsWidgetHostNetwork::revalidate(QWidget *pWidget /* = 0 */)
+{
+    /* Validate 'Interface' tab content: */
+    if (!pWidget || pWidget == m_pErrorPaneAutomatic)
+    {
+        const bool fError =    m_newData.m_interface.m_fDHCPEnabled
+                            && !m_newData.m_dhcpserver.m_fEnabled;
+        m_pErrorPaneAutomatic->setVisible(fError);
+    }
+    if (!pWidget || pWidget == m_pErrorPaneManual)
+    {
+        const bool fError = false;
+        m_pErrorPaneManual->setVisible(fError);
+    }
+    if (!pWidget || pWidget == m_pErrorPaneIPv4)
+    {
+        const bool fError =    !m_newData.m_interface.m_fDHCPEnabled
+                            && !m_newData.m_interface.m_strAddress.trimmed().isEmpty()
+                            && (   !RTNetIsIPv4AddrStr(m_newData.m_interface.m_strAddress.toUtf8().constData())
+                                || RTNetStrIsIPv4AddrAny(m_newData.m_interface.m_strAddress.toUtf8().constData()));
+        m_pErrorPaneIPv4->setVisible(fError);
+    }
+    if (!pWidget || pWidget == m_pErrorPaneNMv4)
+    {
+        const bool fError =    !m_newData.m_interface.m_fDHCPEnabled
+                            && !m_newData.m_interface.m_strMask.trimmed().isEmpty()
+                            && (   !RTNetIsIPv4AddrStr(m_newData.m_interface.m_strMask.toUtf8().constData())
+                                || RTNetStrIsIPv4AddrAny(m_newData.m_interface.m_strMask.toUtf8().constData()));
+        m_pErrorPaneNMv4->setVisible(fError);
+    }
+    if (!pWidget || pWidget == m_pErrorPaneIPv6)
+    {
+        const bool fError =    !m_newData.m_interface.m_fDHCPEnabled
+                            && m_newData.m_interface.m_fSupportedIPv6
+                            && !m_newData.m_interface.m_strAddress6.trimmed().isEmpty()
+                            && (   !RTNetIsIPv6AddrStr(m_newData.m_interface.m_strAddress6.toUtf8().constData())
+                                || RTNetStrIsIPv6AddrAny(m_newData.m_interface.m_strAddress6.toUtf8().constData()));
+        m_pErrorPaneIPv6->setVisible(fError);
+    }
+    if (!pWidget || pWidget == m_pErrorPaneNMv6)
+    {
+        bool fIsMaskPrefixLengthNumber = false;
+        const int iMaskPrefixLength = m_newData.m_interface.m_strPrefixLength6.trimmed().toInt(&fIsMaskPrefixLengthNumber);
+        const bool fError =    !m_newData.m_interface.m_fDHCPEnabled
+                            && m_newData.m_interface.m_fSupportedIPv6
+                            && (   !fIsMaskPrefixLengthNumber
+                                || iMaskPrefixLength < 0
+                                || iMaskPrefixLength > 128);
+        m_pErrorPaneNMv6->setVisible(fError);
+    }
+
+    /* Validate 'DHCP server' tab content: */
+    if (!pWidget || pWidget == m_pErrorPaneDHCPAddress)
+    {
+        const bool fError =    m_newData.m_dhcpserver.m_fEnabled
+                            && (   !RTNetIsIPv4AddrStr(m_newData.m_dhcpserver.m_strAddress.toUtf8().constData())
+                                || RTNetStrIsIPv4AddrAny(m_newData.m_dhcpserver.m_strAddress.toUtf8().constData()));
+        m_pErrorPaneDHCPAddress->setVisible(fError);
+    }
+    if (!pWidget || pWidget == m_pErrorPaneDHCPMask)
+    {
+        const bool fError =    m_newData.m_dhcpserver.m_fEnabled
+                            && (   !RTNetIsIPv4AddrStr(m_newData.m_dhcpserver.m_strMask.toUtf8().constData())
+                                || RTNetStrIsIPv4AddrAny(m_newData.m_dhcpserver.m_strMask.toUtf8().constData()));
+        m_pErrorPaneDHCPMask->setVisible(fError);
+    }
+    if (!pWidget || pWidget == m_pErrorPaneDHCPLowerAddress)
+    {
+        const bool fError =    m_newData.m_dhcpserver.m_fEnabled
+                            && (   !RTNetIsIPv4AddrStr(m_newData.m_dhcpserver.m_strLowerAddress.toUtf8().constData())
+                                || RTNetStrIsIPv4AddrAny(m_newData.m_dhcpserver.m_strLowerAddress.toUtf8().constData()));
+        m_pErrorPaneDHCPLowerAddress->setVisible(fError);
+    }
+    if (!pWidget || pWidget == m_pErrorPaneDHCPUpperAddress)
+    {
+        const bool fError =    m_newData.m_dhcpserver.m_fEnabled
+                            && (   !RTNetIsIPv4AddrStr(m_newData.m_dhcpserver.m_strUpperAddress.toUtf8().constData())
+                                || RTNetStrIsIPv4AddrAny(m_newData.m_dhcpserver.m_strUpperAddress.toUtf8().constData()));
+        m_pErrorPaneDHCPUpperAddress->setVisible(fError);
+    }
+
+    /* Retranslate validation: */
+    retranslateValidation(pWidget);
+}
+
+void UIDetailsWidgetHostNetwork::retranslateValidation(QWidget *pWidget /* = 0 */)
+{
+    /* Translate 'Interface' tab content: */
+    if (!pWidget || pWidget == m_pErrorPaneAutomatic)
+        m_pErrorPaneAutomatic->setToolTip(tr("Host interface <nobr><b>%1</b></nobr> is set to obtain the address automatically "
+                                             "but the corresponding DHCP server is not enabled.").arg(m_newData.m_interface.m_strName));
+    if (!pWidget || pWidget == m_pErrorPaneIPv4)
+        m_pErrorPaneIPv4->setToolTip(tr("Host interface <nobr><b>%1</b></nobr> does not currently have a valid "
+                                        "IPv4 address.").arg(m_newData.m_interface.m_strName));
+    if (!pWidget || pWidget == m_pErrorPaneNMv4)
+        m_pErrorPaneNMv4->setToolTip(tr("Host interface <nobr><b>%1</b></nobr> does not currently have a valid "
+                                        "IPv4 network mask.").arg(m_newData.m_interface.m_strName));
+    if (!pWidget || pWidget == m_pErrorPaneIPv6)
+        m_pErrorPaneIPv6->setToolTip(tr("Host interface <nobr><b>%1</b></nobr> does not currently have a valid "
+                                        "IPv6 address.").arg(m_newData.m_interface.m_strName));
+    if (!pWidget || pWidget == m_pErrorPaneNMv6)
+        m_pErrorPaneNMv6->setToolTip(tr("Host interface <nobr><b>%1</b></nobr> does not currently have a valid "
+                                        "IPv6 prefix length.").arg(m_newData.m_interface.m_strName));
+
+    /* Translate 'DHCP server' tab content: */
+    if (!pWidget || pWidget == m_pErrorPaneDHCPAddress)
+        m_pErrorPaneDHCPAddress->setToolTip(tr("Host interface <nobr><b>%1</b></nobr> does not currently have a valid "
+                                               "DHCP server address.").arg(m_newData.m_interface.m_strName));
+    if (!pWidget || pWidget == m_pErrorPaneDHCPMask)
+        m_pErrorPaneDHCPMask->setToolTip(tr("Host interface <nobr><b>%1</b></nobr> does not currently have a valid "
+                                            "DHCP server mask.").arg(m_newData.m_interface.m_strName));
+    if (!pWidget || pWidget == m_pErrorPaneDHCPLowerAddress)
+        m_pErrorPaneDHCPLowerAddress->setToolTip(tr("Host interface <nobr><b>%1</b></nobr> does not currently have a valid "
+                                                    "DHCP server lower address bound.").arg(m_newData.m_interface.m_strName));
+    if (!pWidget || pWidget == m_pErrorPaneDHCPUpperAddress)
+        m_pErrorPaneDHCPUpperAddress->setToolTip(tr("Host interface <nobr><b>%1</b></nobr> does not currently have a valid "
+                                                    "DHCP server upper address bound.").arg(m_newData.m_interface.m_strName));
+}
+
+void UIDetailsWidgetHostNetwork::updateButtonStates()
+{
+//    if (m_oldData != m_newData)
+//        printf("Interface: %s, %s, %s, %s;  DHCP server: %d, %s, %s, %s, %s\n",
+//               m_newData.m_interface.m_strAddress.toUtf8().constData(),
+//               m_newData.m_interface.m_strMask.toUtf8().constData(),
+//               m_newData.m_interface.m_strAddress6.toUtf8().constData(),
+//               m_newData.m_interface.m_strPrefixLength6.toUtf8().constData(),
+//               (int)m_newData.m_dhcpserver.m_fEnabled,
+//               m_newData.m_dhcpserver.m_strAddress.toUtf8().constData(),
+//               m_newData.m_dhcpserver.m_strMask.toUtf8().constData(),
+//               m_newData.m_dhcpserver.m_strLowerAddress.toUtf8().constData(),
+//               m_newData.m_dhcpserver.m_strUpperAddress.toUtf8().constData());
+
+    /* Update 'Apply' / 'Reset' button states: */
+    if (m_pButtonBoxInterface)
+    {
+        m_pButtonBoxInterface->button(QDialogButtonBox::Cancel)->setEnabled(m_oldData != m_newData);
+        m_pButtonBoxInterface->button(QDialogButtonBox::Ok)->setEnabled(m_oldData != m_newData);
+    }
+    if (m_pButtonBoxServer)
+    {
+        m_pButtonBoxServer->button(QDialogButtonBox::Cancel)->setEnabled(m_oldData != m_newData);
+        m_pButtonBoxServer->button(QDialogButtonBox::Ok)->setEnabled(m_oldData != m_newData);
+    }
+
+    /* Notify listeners as well: */
+    emit sigDataChanged(m_oldData != m_newData);
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UIDetailsWidgetHostNetwork.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UIDetailsWidgetHostNetwork.h	(revision 87219)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UIDetailsWidgetHostNetwork.h	(revision 87219)
@@ -0,0 +1,357 @@
+/* $Id$ */
+/** @file
+ * VBox Qt GUI - UIDetailsWidgetHostNetwork class declaration.
+ */
+
+/*
+ * Copyright (C) 2009-2021 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+#ifndef FEQT_INCLUDED_SRC_networkmanager_UIDetailsWidgetHostNetwork_h
+#define FEQT_INCLUDED_SRC_networkmanager_UIDetailsWidgetHostNetwork_h
+#ifndef RT_WITHOUT_PRAGMA_ONCE
+# pragma once
+#endif
+
+/* Qt includes: */
+#include <QWidget>
+
+/* GUI includes: */
+#include "QIManagerDialog.h"
+#include "QIWithRetranslateUI.h"
+
+/* Forward declarations: */
+class QAbstractButton;
+class QCheckBox;
+class QLabel;
+class QRadioButton;
+class QIDialogButtonBox;
+class QILineEdit;
+class QITabWidget;
+
+
+/** Host Network Manager: Host Network Interface data structure. */
+struct UIDataHostNetworkInterface
+{
+    /** Constructs data. */
+    UIDataHostNetworkInterface()
+        : m_strName(QString())
+        , m_fDHCPEnabled(false)
+        , m_strAddress(QString())
+        , m_strMask(QString())
+        , m_fSupportedIPv6(false)
+        , m_strAddress6(QString())
+        , m_strPrefixLength6(QString())
+    {}
+
+    /** Returns whether the @a other passed data is equal to this one. */
+    bool equal(const UIDataHostNetworkInterface &other) const
+    {
+        return true
+               && (m_strName == other.m_strName)
+               && (m_fDHCPEnabled == other.m_fDHCPEnabled)
+               && (m_strAddress == other.m_strAddress)
+               && (m_strMask == other.m_strMask)
+               && (m_fSupportedIPv6 == other.m_fSupportedIPv6)
+               && (m_strAddress6 == other.m_strAddress6)
+               && (m_strPrefixLength6 == other.m_strPrefixLength6)
+               ;
+    }
+
+    /** Returns whether the @a other passed data is equal to this one. */
+    bool operator==(const UIDataHostNetworkInterface &other) const { return equal(other); }
+    /** Returns whether the @a other passed data is different from this one. */
+    bool operator!=(const UIDataHostNetworkInterface &other) const { return !equal(other); }
+
+    /** Holds interface name. */
+    QString  m_strName;
+    /** Holds whether DHCP is enabled for that interface. */
+    bool     m_fDHCPEnabled;
+    /** Holds IPv4 interface address. */
+    QString  m_strAddress;
+    /** Holds IPv4 interface mask. */
+    QString  m_strMask;
+    /** Holds whether IPv6 protocol supported. */
+    bool     m_fSupportedIPv6;
+    /** Holds IPv6 interface address. */
+    QString  m_strAddress6;
+    /** Holds IPv6 interface prefix length. */
+    QString  m_strPrefixLength6;
+};
+
+
+/** Host Network Manager: DHCP Server data structure. */
+struct UIDataDHCPServer
+{
+    /** Constructs data. */
+    UIDataDHCPServer()
+        : m_fEnabled(false)
+        , m_strAddress(QString())
+        , m_strMask(QString())
+        , m_strLowerAddress(QString())
+        , m_strUpperAddress(QString())
+    {}
+
+    /** Returns whether the @a other passed data is equal to this one. */
+    bool equal(const UIDataDHCPServer &other) const
+    {
+        return true
+               && (m_fEnabled == other.m_fEnabled)
+               && (m_strAddress == other.m_strAddress)
+               && (m_strMask == other.m_strMask)
+               && (m_strLowerAddress == other.m_strLowerAddress)
+               && (m_strUpperAddress == other.m_strUpperAddress)
+               ;
+    }
+
+    /** Returns whether the @a other passed data is equal to this one. */
+    bool operator==(const UIDataDHCPServer &other) const { return equal(other); }
+    /** Returns whether the @a other passed data is different from this one. */
+    bool operator!=(const UIDataDHCPServer &other) const { return !equal(other); }
+
+    /** Holds whether DHCP server enabled. */
+    bool     m_fEnabled;
+    /** Holds DHCP server address. */
+    QString  m_strAddress;
+    /** Holds DHCP server mask. */
+    QString  m_strMask;
+    /** Holds DHCP server lower address. */
+    QString  m_strLowerAddress;
+    /** Holds DHCP server upper address. */
+    QString  m_strUpperAddress;
+};
+
+
+/** Host Network Manager: Host network data structure. */
+struct UIDataHostNetwork
+{
+    /** Constructs data. */
+    UIDataHostNetwork()
+        : m_interface(UIDataHostNetworkInterface())
+        , m_dhcpserver(UIDataDHCPServer())
+    {}
+
+    /** Returns whether the @a other passed data is equal to this one. */
+    bool equal(const UIDataHostNetwork &other) const
+    {
+        return true
+               && (m_interface == other.m_interface)
+               && (m_dhcpserver == other.m_dhcpserver)
+               ;
+    }
+
+    /** Returns whether the @a other passed data is equal to this one. */
+    bool operator==(const UIDataHostNetwork &other) const { return equal(other); }
+    /** Returns whether the @a other passed data is different from this one. */
+    bool operator!=(const UIDataHostNetwork &other) const { return !equal(other); }
+
+    /** Holds the interface data. */
+    UIDataHostNetworkInterface  m_interface;
+    /** Holds the DHCP server data. */
+    UIDataDHCPServer            m_dhcpserver;
+};
+
+
+/** Host Network Manager: Host network details-widget. */
+class UIDetailsWidgetHostNetwork : public QIWithRetranslateUI<QWidget>
+{
+    Q_OBJECT;
+
+signals:
+
+    /** Notifies listeners about data changed and whether it @a fDiffers. */
+    void sigDataChanged(bool fDiffers);
+
+    /** Notifies listeners about data change rejected and should be reseted. */
+    void sigDataChangeRejected();
+    /** Notifies listeners about data change accepted and should be applied. */
+    void sigDataChangeAccepted();
+
+public:
+
+    /** Constructs medium details dialog passing @a pParent to the base-class.
+      * @param  enmEmbedding  Brings embedding type. */
+    UIDetailsWidgetHostNetwork(EmbedTo enmEmbedding, QWidget *pParent = 0);
+
+    /** Returns the host network data. */
+    const UIDataHostNetwork &data() const { return m_newData; }
+    /** Defines the host network @a data. */
+    void setData(const UIDataHostNetwork &data);
+
+protected:
+
+    /** Handles translation event. */
+    virtual void retranslateUi() /* override */;
+
+private slots:
+
+    /** @name Change handling stuff.
+      * @{ */
+        /** Handles interface automatic configuration choice change. */
+        void sltToggledButtonAutomatic(bool fChecked);
+        /** Handles interface manual configuration choice change. */
+        void sltToggledButtonManual(bool fChecked);
+        /** Handles interface IPv4 text change. */
+        void sltTextChangedIPv4(const QString &strText);
+        /** Handles interface NMv4 text change. */
+        void sltTextChangedNMv4(const QString &strText);
+        /** Handles interface IPv6 text change. */
+        void sltTextChangedIPv6(const QString &strText);
+        /** Handles interface NMv6 text change. */
+        void sltTextChangedNMv6(const QString &strText);
+
+        /** Handles DHCP server status change. */
+        void sltStatusChangedServer(int iChecked);
+        /** Handles DHCP server address text change. */
+        void sltTextChangedAddress(const QString &strText);
+        /** Handles DHCP server mask text change. */
+        void sltTextChangedMask(const QString &strText);
+        /** Handles DHCP server lower address text change. */
+        void sltTextChangedLowerAddress(const QString &strText);
+        /** Handles DHCP server upper address text change. */
+        void sltTextChangedUpperAddress(const QString &strText);
+
+        /** Handles button-box button click. */
+        void sltHandleButtonBoxClick(QAbstractButton *pButton);
+    /** @} */
+
+private:
+
+    /** @name Prepare/cleanup cascade.
+      * @{ */
+        /** Prepares all. */
+        void prepare();
+        /** Prepares this. */
+        void prepareThis();
+        /** Prepares tab-widget. */
+        void prepareTabWidget();
+        /** Prepares 'Interface' tab. */
+        void prepareTabInterface();
+        /** Prepares 'DHCP server' tab. */
+        void prepareTabDHCPServer();
+    /** @} */
+
+    /** @name Loading stuff.
+      * @{ */
+        /** Loads interface data. */
+        void loadDataForInterface();
+        /** Loads server data. */
+        void loadDataForDHCPServer();
+    /** @} */
+
+    /** @name Change handling stuff.
+      * @{ */
+        /** Revalidates changes for passed @a pWidget. */
+        void revalidate(QWidget *pWidget = 0);
+        /** Retranslates validation for passed @a pWidget. */
+        void retranslateValidation(QWidget *pWidget = 0);
+        /** Updates button states. */
+        void updateButtonStates();
+    /** @} */
+
+    /** @name General variables.
+      * @{ */
+        /** Holds the parent widget embedding type. */
+        const EmbedTo m_enmEmbedding;
+
+        /** Holds the old data copy. */
+        UIDataHostNetwork  m_oldData;
+        /** Holds the new data copy. */
+        UIDataHostNetwork  m_newData;
+
+        /** Holds the tab-widget. */
+        QITabWidget *m_pTabWidget;
+    /** @} */
+
+    /** @name Interface variables.
+      * @{ */
+        /** Holds the automatic interface configuration button. */
+        QRadioButton *m_pButtonAutomatic;
+        /** Holds the automatic interface configuration error pane. */
+        QLabel       *m_pErrorPaneAutomatic;
+
+        /** Holds the manual interface configuration button. */
+        QRadioButton *m_pButtonManual;
+        /** Holds the manual interface configuration error pane. */
+        QLabel       *m_pErrorPaneManual;
+
+        /** Holds the IPv4 address label. */
+        QLabel       *m_pLabelIPv4;
+        /** Holds the IPv4 address editor. */
+        QILineEdit   *m_pEditorIPv4;
+        /** Holds the IPv4 address error pane. */
+        QLabel       *m_pErrorPaneIPv4;
+
+        /** Holds the IPv4 network mask label. */
+        QLabel       *m_pLabelNMv4;
+        /** Holds the IPv4 network mask editor. */
+        QILineEdit   *m_pEditorNMv4;
+        /** Holds the IPv4 network mask error pane. */
+        QLabel       *m_pErrorPaneNMv4;
+
+        /** Holds the IPv6 address label. */
+        QLabel       *m_pLabelIPv6;
+        /** Holds the IPv6 address editor. */
+        QILineEdit   *m_pEditorIPv6;
+        /** Holds the IPv6 address error pane. */
+        QLabel       *m_pErrorPaneIPv6;
+
+        /** Holds the IPv6 network mask label. */
+        QLabel       *m_pLabelNMv6;
+        /** Holds the IPv6 network mask editor. */
+        QILineEdit   *m_pEditorNMv6;
+        /** Holds the IPv6 network mask error pane. */
+        QLabel       *m_pErrorPaneNMv6;
+
+        /** Holds the interface button-box instance. */
+        QIDialogButtonBox *m_pButtonBoxInterface;
+    /** @} */
+
+    /** @name DHCP server variables.
+      * @{ */
+        /** Holds the DHCP server status chack-box. */
+        QCheckBox  *m_pCheckBoxDHCP;
+
+        /** Holds the DHCP address label. */
+        QLabel     *m_pLabelDHCPAddress;
+        /** Holds the DHCP address editor. */
+        QILineEdit *m_pEditorDHCPAddress;
+        /** Holds the DHCP address error pane. */
+        QLabel     *m_pErrorPaneDHCPAddress;
+
+        /** Holds the DHCP network mask label. */
+        QLabel     *m_pLabelDHCPMask;
+        /** Holds the DHCP network mask editor. */
+        QILineEdit *m_pEditorDHCPMask;
+        /** Holds the DHCP network mask error pane. */
+        QLabel     *m_pErrorPaneDHCPMask;
+
+        /** Holds the DHCP lower address label. */
+        QLabel     *m_pLabelDHCPLowerAddress;
+        /** Holds the DHCP lower address editor. */
+        QILineEdit *m_pEditorDHCPLowerAddress;
+        /** Holds the DHCP lower address error pane. */
+        QLabel     *m_pErrorPaneDHCPLowerAddress;
+
+        /** Holds the DHCP upper address label. */
+        QLabel     *m_pLabelDHCPUpperAddress;
+        /** Holds the DHCP upper address editor. */
+        QILineEdit *m_pEditorDHCPUpperAddress;
+        /** Holds the DHCP upper address error pane. */
+        QLabel     *m_pErrorPaneDHCPUpperAddress;
+
+        /** Holds the server button-box instance. */
+        QIDialogButtonBox *m_pButtonBoxServer;
+    /** @} */
+};
+
+#endif /* !FEQT_INCLUDED_SRC_networkmanager_UIDetailsWidgetHostNetwork_h */
+
Index: unk/src/VBox/Frontends/VirtualBox/src/networkmanager/UINetworkDetailsWidget.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UINetworkDetailsWidget.cpp	(revision 87218)
+++ 	(revision )
@@ -1,1023 +1,0 @@
-/* $Id$ */
-/** @file
- * VBox Qt GUI - UINetworkDetailsWidget class implementation.
- */
-
-/*
- * Copyright (C) 2009-2020 Oracle Corporation
- *
- * This file is part of VirtualBox Open Source Edition (OSE), as
- * available from http://www.virtualbox.org. This file is free software;
- * you can redistribute it and/or modify it under the terms of the GNU
- * General Public License (GPL) as published by the Free Software
- * Foundation, in version 2 as it comes in the "COPYING" file of the
- * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
- */
-
-/* Qt includes: */
-#include <QCheckBox>
-#include <QLabel>
-#include <QPushButton>
-#include <QRadioButton>
-#include <QRegExpValidator>
-#include <QStyleOption>
-#include <QVBoxLayout>
-
-/* GUI includes: */
-#include "QIDialogButtonBox.h"
-#include "QILineEdit.h"
-#include "QITabWidget.h"
-#include "UIIconPool.h"
-#include "UINetworkDetailsWidget.h"
-#include "UINetworkManagerUtils.h"
-
-/* Other VBox includes: */
-#include "iprt/assert.h"
-#include "iprt/cidr.h"
-
-
-UINetworkDetailsWidget::UINetworkDetailsWidget(EmbedTo enmEmbedding, QWidget *pParent /* = 0 */)
-    : QIWithRetranslateUI<QWidget>(pParent)
-    , m_enmEmbedding(enmEmbedding)
-    , m_pTabWidget(0)
-    , m_pButtonAutomatic(0), m_pErrorPaneAutomatic(0)
-    , m_pButtonManual(0), m_pErrorPaneManual(0)
-    , m_pLabelIPv4(0), m_pEditorIPv4(0), m_pErrorPaneIPv4(0)
-    , m_pLabelNMv4(0), m_pEditorNMv4(0), m_pErrorPaneNMv4(0)
-    , m_pLabelIPv6(0), m_pEditorIPv6(0), m_pErrorPaneIPv6(0)
-    , m_pLabelNMv6(0), m_pEditorNMv6(0), m_pErrorPaneNMv6(0)
-    , m_pButtonBoxInterface(0)
-    , m_pCheckBoxDHCP(0)
-    , m_pLabelDHCPAddress(0), m_pEditorDHCPAddress(0), m_pErrorPaneDHCPAddress(0)
-    , m_pLabelDHCPMask(0), m_pEditorDHCPMask(0), m_pErrorPaneDHCPMask(0)
-    , m_pLabelDHCPLowerAddress(0), m_pEditorDHCPLowerAddress(0), m_pErrorPaneDHCPLowerAddress(0)
-    , m_pLabelDHCPUpperAddress(0), m_pEditorDHCPUpperAddress(0), m_pErrorPaneDHCPUpperAddress(0)
-    , m_pButtonBoxServer(0)
-{
-    /* Prepare: */
-    prepare();
-}
-
-void UINetworkDetailsWidget::setData(const UIDataHostNetwork &data)
-{
-    /* Cache old/new data: */
-    m_oldData = data;
-    m_newData = m_oldData;
-
-    /* Load 'Interface' data: */
-    loadDataForInterface();
-    /* Load 'DHCP server' data: */
-    loadDataForDHCPServer();
-}
-
-void UINetworkDetailsWidget::retranslateUi()
-{
-    /* Translate tab-widget: */
-    m_pTabWidget->setTabText(0, tr("&Adapter"));
-    m_pTabWidget->setTabText(1, tr("&DHCP Server"));
-
-    /* Translate 'Interface' tab content: */
-    m_pButtonAutomatic->setText(tr("Configure Adapter &Automatically"));
-    m_pButtonManual->setText(tr("Configure Adapter &Manually"));
-    m_pLabelIPv4->setText(tr("&IPv4 Address:"));
-    m_pEditorIPv4->setToolTip(tr("Holds the host IPv4 address for this adapter."));
-    m_pLabelNMv4->setText(tr("IPv4 Network &Mask:"));
-    m_pEditorNMv4->setToolTip(tr("Holds the host IPv4 network mask for this adapter."));
-    m_pLabelIPv6->setText(tr("I&Pv6 Address:"));
-    m_pEditorIPv6->setToolTip(tr("Holds the host IPv6 address for this adapter if IPv6 is supported."));
-    m_pLabelNMv6->setText(tr("IPv6 Prefix &Length:"));
-    m_pEditorNMv6->setToolTip(tr("Holds the host IPv6 prefix length for this adapter if IPv6 is supported."));
-    if (m_pButtonBoxInterface)
-    {
-        m_pButtonBoxInterface->button(QDialogButtonBox::Cancel)->setText(tr("Reset"));
-        m_pButtonBoxInterface->button(QDialogButtonBox::Ok)->setText(tr("Apply"));
-        m_pButtonBoxInterface->button(QDialogButtonBox::Cancel)->setShortcut(Qt::Key_Escape);
-        m_pButtonBoxInterface->button(QDialogButtonBox::Ok)->setShortcut(QString("Ctrl+Return"));
-        m_pButtonBoxInterface->button(QDialogButtonBox::Cancel)->setStatusTip(tr("Reset changes in current interface details"));
-        m_pButtonBoxInterface->button(QDialogButtonBox::Ok)->setStatusTip(tr("Apply changes in current interface details"));
-        m_pButtonBoxInterface->button(QDialogButtonBox::Cancel)->
-            setToolTip(tr("Reset Changes (%1)").arg(m_pButtonBoxInterface->button(QDialogButtonBox::Cancel)->shortcut().toString()));
-        m_pButtonBoxInterface->button(QDialogButtonBox::Ok)->
-            setToolTip(tr("Apply Changes (%1)").arg(m_pButtonBoxInterface->button(QDialogButtonBox::Ok)->shortcut().toString()));
-    }
-
-    /* Translate 'DHCP server' tab content: */
-    m_pCheckBoxDHCP->setText(tr("&Enable Server"));
-    m_pCheckBoxDHCP->setToolTip(tr("When checked, the DHCP Server will be enabled for this network on machine start-up."));
-    m_pLabelDHCPAddress->setText(tr("Server Add&ress:"));
-    m_pEditorDHCPAddress->setToolTip(tr("Holds the address of the DHCP server servicing the network associated with this host-only adapter."));
-    m_pLabelDHCPMask->setText(tr("Server &Mask:"));
-    m_pEditorDHCPMask->setToolTip(tr("Holds the network mask of the DHCP server servicing the network associated with this host-only adapter."));
-    m_pLabelDHCPLowerAddress->setText(tr("&Lower Address Bound:"));
-    m_pEditorDHCPLowerAddress->setToolTip(tr("Holds the lower address bound offered by the DHCP server servicing the network associated with this host-only adapter."));
-    m_pLabelDHCPUpperAddress->setText(tr("&Upper Address Bound:"));
-    m_pEditorDHCPUpperAddress->setToolTip(tr("Holds the upper address bound offered by the DHCP server servicing the network associated with this host-only adapter."));
-    if (m_pButtonBoxServer)
-    {
-        m_pButtonBoxServer->button(QDialogButtonBox::Cancel)->setText(tr("Reset"));
-        m_pButtonBoxServer->button(QDialogButtonBox::Ok)->setText(tr("Apply"));
-        m_pButtonBoxServer->button(QDialogButtonBox::Cancel)->setShortcut(Qt::Key_Escape);
-        m_pButtonBoxServer->button(QDialogButtonBox::Ok)->setShortcut(QString("Ctrl+Return"));
-        m_pButtonBoxServer->button(QDialogButtonBox::Cancel)->setStatusTip(tr("Reset changes in current DHCP server details"));
-        m_pButtonBoxServer->button(QDialogButtonBox::Ok)->setStatusTip(tr("Apply changes in current DHCP server details"));
-        m_pButtonBoxServer->button(QDialogButtonBox::Cancel)->
-            setToolTip(tr("Reset Changes (%1)").arg(m_pButtonBoxServer->button(QDialogButtonBox::Cancel)->shortcut().toString()));
-        m_pButtonBoxServer->button(QDialogButtonBox::Ok)->
-            setToolTip(tr("Apply Changes (%1)").arg(m_pButtonBoxServer->button(QDialogButtonBox::Ok)->shortcut().toString()));
-    }
-
-    /* Retranslate validation: */
-    retranslateValidation();
-}
-
-void UINetworkDetailsWidget::sltToggledButtonAutomatic(bool fChecked)
-{
-    m_newData.m_interface.m_fDHCPEnabled = fChecked;
-    loadDataForInterface();
-    revalidate();
-    updateButtonStates();
-}
-
-void UINetworkDetailsWidget::sltToggledButtonManual(bool fChecked)
-{
-    m_newData.m_interface.m_fDHCPEnabled = !fChecked;
-    loadDataForInterface();
-    revalidate();
-    updateButtonStates();
-}
-
-void UINetworkDetailsWidget::sltTextChangedIPv4(const QString &strText)
-{
-    m_newData.m_interface.m_strAddress = strText;
-    revalidate(m_pErrorPaneIPv4);
-    updateButtonStates();
-}
-
-void UINetworkDetailsWidget::sltTextChangedNMv4(const QString &strText)
-{
-    m_newData.m_interface.m_strMask = strText;
-    revalidate(m_pErrorPaneNMv4);
-    updateButtonStates();
-}
-
-void UINetworkDetailsWidget::sltTextChangedIPv6(const QString &strText)
-{
-    m_newData.m_interface.m_strAddress6 = strText;
-    revalidate(m_pErrorPaneIPv6);
-    updateButtonStates();
-}
-
-void UINetworkDetailsWidget::sltTextChangedNMv6(const QString &strText)
-{
-    m_newData.m_interface.m_strPrefixLength6 = strText;
-    revalidate(m_pErrorPaneNMv6);
-    updateButtonStates();
-}
-
-void UINetworkDetailsWidget::sltStatusChangedServer(int iChecked)
-{
-    m_newData.m_dhcpserver.m_fEnabled = (bool)iChecked;
-    loadDataForDHCPServer();
-    revalidate();
-    updateButtonStates();
-}
-
-void UINetworkDetailsWidget::sltTextChangedAddress(const QString &strText)
-{
-    m_newData.m_dhcpserver.m_strAddress = strText;
-    revalidate(m_pErrorPaneDHCPAddress);
-    updateButtonStates();
-}
-
-void UINetworkDetailsWidget::sltTextChangedMask(const QString &strText)
-{
-    m_newData.m_dhcpserver.m_strMask = strText;
-    revalidate(m_pErrorPaneDHCPMask);
-    updateButtonStates();
-}
-
-void UINetworkDetailsWidget::sltTextChangedLowerAddress(const QString &strText)
-{
-    m_newData.m_dhcpserver.m_strLowerAddress = strText;
-    revalidate(m_pErrorPaneDHCPLowerAddress);
-    updateButtonStates();
-}
-
-void UINetworkDetailsWidget::sltTextChangedUpperAddress(const QString &strText)
-{
-    m_newData.m_dhcpserver.m_strUpperAddress = strText;
-    revalidate(m_pErrorPaneDHCPUpperAddress);
-    updateButtonStates();
-}
-
-void UINetworkDetailsWidget::sltHandleButtonBoxClick(QAbstractButton *pButton)
-{
-    /* Make sure button-box exists: */
-    AssertPtrReturnVoid(m_pButtonBoxInterface);
-    AssertPtrReturnVoid(m_pButtonBoxServer);
-
-    /* Disable buttons first of all: */
-    m_pButtonBoxInterface->button(QDialogButtonBox::Cancel)->setEnabled(false);
-    m_pButtonBoxInterface->button(QDialogButtonBox::Ok)->setEnabled(false);
-    m_pButtonBoxServer->button(QDialogButtonBox::Cancel)->setEnabled(false);
-    m_pButtonBoxServer->button(QDialogButtonBox::Ok)->setEnabled(false);
-
-    /* Compare with known buttons: */
-    if (   pButton == m_pButtonBoxInterface->button(QDialogButtonBox::Cancel)
-        || pButton == m_pButtonBoxServer->button(QDialogButtonBox::Cancel))
-        emit sigDataChangeRejected();
-    else
-    if (   pButton == m_pButtonBoxInterface->button(QDialogButtonBox::Ok)
-        || pButton == m_pButtonBoxServer->button(QDialogButtonBox::Ok))
-        emit sigDataChangeAccepted();
-}
-
-void UINetworkDetailsWidget::prepare()
-{
-    /* Prepare this: */
-    prepareThis();
-
-    /* Apply language settings: */
-    retranslateUi();
-
-    /* Update button states finally: */
-    updateButtonStates();
-}
-
-void UINetworkDetailsWidget::prepareThis()
-{
-    /* Create layout: */
-    QVBoxLayout *pLayout = new QVBoxLayout(this);
-    AssertPtrReturnVoid(pLayout);
-    {
-        /* Configure layout: */
-        pLayout->setContentsMargins(0, 0, 0, 0);
-
-        /* Prepare tab-widget: */
-        prepareTabWidget();
-    }
-}
-
-void UINetworkDetailsWidget::prepareTabWidget()
-{
-    /* Create tab-widget: */
-    m_pTabWidget = new QITabWidget;
-    AssertPtrReturnVoid(m_pTabWidget);
-    {
-        /* Prepare 'Interface' tab: */
-        prepareTabInterface();
-        /* Prepare 'DHCP server' tab: */
-        prepareTabDHCPServer();
-
-        /* Add into layout: */
-        layout()->addWidget(m_pTabWidget);
-    }
-}
-
-void UINetworkDetailsWidget::prepareTabInterface()
-{
-    /* Create 'Interface' tab: */
-    QWidget *pTabInterface = new QWidget;
-    AssertPtrReturnVoid(pTabInterface);
-    {
-        /* Create 'Interface' layout: */
-        QGridLayout *pLayoutInterface = new QGridLayout(pTabInterface);
-        AssertPtrReturnVoid(pLayoutInterface);
-        {
-#ifdef VBOX_WS_MAC
-            /* Configure layout: */
-            pLayoutInterface->setSpacing(10);
-            pLayoutInterface->setContentsMargins(10, 10, 10, 10);
-#endif
-
-            /* Get the required icon metric: */
-            const int iIconMetric = QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize);
-
-            /* Create automatic interface configuration layout: */
-            QHBoxLayout *pLayoutAutomatic = new QHBoxLayout;
-            AssertPtrReturnVoid(pLayoutAutomatic);
-            {
-                /* Configure layout: */
-                pLayoutAutomatic->setContentsMargins(0, 0, 0, 0);
-
-                /* Create automatic interface configuration radio-button: */
-                m_pButtonAutomatic = new QRadioButton;
-                AssertPtrReturnVoid(m_pButtonAutomatic);
-                {
-                    /* Configure radio-button: */
-                    connect(m_pButtonAutomatic, &QRadioButton::toggled,
-                            this, &UINetworkDetailsWidget::sltToggledButtonAutomatic);
-                    /* Add into layout: */
-                    pLayoutAutomatic->addWidget(m_pButtonAutomatic);
-                }
-                /* Create automatic interface configuration error pane: */
-                m_pErrorPaneAutomatic = new QLabel;
-                AssertPtrReturnVoid(m_pErrorPaneAutomatic);
-                {
-                    /* Configure label: */
-                    m_pErrorPaneAutomatic->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
-                    m_pErrorPaneAutomatic->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum);
-                    m_pErrorPaneAutomatic->setPixmap(UIIconPool::iconSet(":/status_error_16px.png")
-                                                     .pixmap(QSize(iIconMetric, iIconMetric)));
-                    /* Add into layout: */
-                    pLayoutAutomatic->addWidget(m_pErrorPaneAutomatic);
-                }
-                /* Add into layout: */
-                pLayoutInterface->addLayout(pLayoutAutomatic, 0, 0, 1, 3);
-#ifdef VBOX_WS_MAC
-                pLayoutInterface->setRowMinimumHeight(0, 22);
-#endif
-            }
-
-            /* Create manual interface configuration layout: */
-            QHBoxLayout *pLayoutManual = new QHBoxLayout;
-            AssertPtrReturnVoid(pLayoutManual);
-            {
-                /* Configure layout: */
-                pLayoutManual->setContentsMargins(0, 0, 0, 0);
-                /* Create manual interface configuration radio-button: */
-                m_pButtonManual = new QRadioButton;
-                AssertPtrReturnVoid(m_pButtonManual);
-                {
-                    /* Configure radio-button: */
-                    connect(m_pButtonManual, &QRadioButton::toggled,
-                            this, &UINetworkDetailsWidget::sltToggledButtonManual);
-                    /* Add into layout: */
-                    pLayoutManual->addWidget(m_pButtonManual);
-                }
-                /* Create manual interface configuration error pane: */
-                m_pErrorPaneManual = new QLabel;
-                AssertPtrReturnVoid(m_pErrorPaneManual);
-                {
-                    /* Configure label: */
-                    m_pErrorPaneManual->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
-                    m_pErrorPaneManual->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum);
-                    m_pErrorPaneManual->setPixmap(UIIconPool::iconSet(":/status_error_16px.png")
-                                                  .pixmap(QSize(iIconMetric, iIconMetric)));
-                    /* Add into layout: */
-                    pLayoutManual->addWidget(m_pErrorPaneManual);
-                }
-                /* Add into layout: */
-                pLayoutInterface->addLayout(pLayoutManual, 1, 0, 1, 3);
-#ifdef VBOX_WS_MAC
-                pLayoutInterface->setRowMinimumHeight(1, 22);
-#endif
-            }
-
-            /* Create IPv4 address label: */
-            m_pLabelIPv4 = new QLabel;
-            AssertPtrReturnVoid(m_pLabelIPv4);
-            {
-                /* Configure label: */
-                m_pLabelIPv4->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
-                /* Add into layout: */
-                pLayoutInterface->addWidget(m_pLabelIPv4, 2, 1);
-            }
-            /* Create IPv4 layout: */
-            QHBoxLayout *pLayoutIPv4 = new QHBoxLayout;
-            AssertPtrReturnVoid(pLayoutIPv4);
-            {
-                /* Configure layout: */
-                pLayoutIPv4->setContentsMargins(0, 0, 0, 0);
-                /* Create IPv4 address editor: */
-                m_pEditorIPv4 = new QILineEdit;
-                AssertPtrReturnVoid(m_pEditorIPv4);
-                {
-                    /* Configure editor: */
-                    m_pLabelIPv4->setBuddy(m_pEditorIPv4);
-                    connect(m_pEditorIPv4, &QLineEdit::textChanged,
-                            this, &UINetworkDetailsWidget::sltTextChangedIPv4);
-                    /* Add into layout: */
-                    pLayoutIPv4->addWidget(m_pEditorIPv4);
-                }
-                /* Create IPv4 error pane: */
-                m_pErrorPaneIPv4 = new QLabel;
-                AssertPtrReturnVoid(m_pErrorPaneIPv4);
-                {
-                    /* Configure label: */
-                    m_pErrorPaneIPv4->setAlignment(Qt::AlignCenter);
-                    m_pErrorPaneIPv4->setPixmap(UIIconPool::iconSet(":/status_error_16px.png")
-                                                .pixmap(QSize(iIconMetric, iIconMetric)));
-                    /* Add into layout: */
-                    pLayoutIPv4->addWidget(m_pErrorPaneIPv4);
-                }
-                /* Add into layout: */
-                pLayoutInterface->addLayout(pLayoutIPv4, 2, 2);
-            }
-
-            /* Create NMv4 network mask label: */
-            m_pLabelNMv4 = new QLabel;
-            AssertPtrReturnVoid(m_pLabelNMv4);
-            {
-                /* Configure label: */
-                m_pLabelNMv4->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
-                /* Add into layout: */
-                pLayoutInterface->addWidget(m_pLabelNMv4, 3, 1);
-            }
-            /* Create NMv4 layout: */
-            QHBoxLayout *pLayoutNMv4 = new QHBoxLayout;
-            AssertPtrReturnVoid(pLayoutNMv4);
-            {
-                /* Configure layout: */
-                pLayoutNMv4->setContentsMargins(0, 0, 0, 0);
-                /* Create NMv4 network mask editor: */
-                m_pEditorNMv4 = new QILineEdit;
-                AssertPtrReturnVoid(m_pEditorNMv4);
-                {
-                    /* Configure editor: */
-                    m_pLabelNMv4->setBuddy(m_pEditorNMv4);
-                    connect(m_pEditorNMv4, &QLineEdit::textChanged,
-                            this, &UINetworkDetailsWidget::sltTextChangedNMv4);
-                    /* Add into layout: */
-                    pLayoutNMv4->addWidget(m_pEditorNMv4);
-                }
-                /* Create NMv4 error pane: */
-                m_pErrorPaneNMv4 = new QLabel;
-                AssertPtrReturnVoid(m_pErrorPaneNMv4);
-                {
-                    /* Configure label: */
-                    m_pErrorPaneNMv4->setAlignment(Qt::AlignCenter);
-                    m_pErrorPaneNMv4->setPixmap(UIIconPool::iconSet(":/status_error_16px.png")
-                                                .pixmap(QSize(iIconMetric, iIconMetric)));
-                    /* Add into layout: */
-                    pLayoutNMv4->addWidget(m_pErrorPaneNMv4);
-                }
-                /* Add into layout: */
-                pLayoutInterface->addLayout(pLayoutNMv4, 3, 2);
-            }
-
-            /* Create IPv6 address label: */
-            m_pLabelIPv6 = new QLabel;
-            AssertPtrReturnVoid(m_pLabelIPv6);
-            {
-                /* Configure label: */
-                m_pLabelIPv6->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
-                /* Add into layout: */
-                pLayoutInterface->addWidget(m_pLabelIPv6, 4, 1);
-            }
-            /* Create IPv6 layout: */
-            QHBoxLayout *pLayoutIPv6 = new QHBoxLayout;
-            AssertPtrReturnVoid(pLayoutIPv6);
-            {
-                /* Configure layout: */
-                pLayoutIPv6->setContentsMargins(0, 0, 0, 0);
-                /* Create IPv6 address editor: */
-                m_pEditorIPv6 = new QILineEdit;
-                AssertPtrReturnVoid(m_pEditorIPv6);
-                {
-                    /* Configure editor: */
-                    m_pLabelIPv6->setBuddy(m_pEditorIPv6);
-                    connect(m_pEditorIPv6, &QLineEdit::textChanged,
-                            this, &UINetworkDetailsWidget::sltTextChangedIPv6);
-                    /* Add into layout: */
-                    pLayoutIPv6->addWidget(m_pEditorIPv6);
-                }
-                /* Create IPv4 error pane: */
-                m_pErrorPaneIPv6 = new QLabel;
-                AssertPtrReturnVoid(m_pErrorPaneIPv6);
-                {
-                    /* Configure label: */
-                    m_pErrorPaneIPv6->setAlignment(Qt::AlignCenter);
-                    m_pErrorPaneIPv6->setPixmap(UIIconPool::iconSet(":/status_error_16px.png")
-                                                .pixmap(QSize(iIconMetric, iIconMetric)));
-                    /* Add into layout: */
-                    pLayoutIPv6->addWidget(m_pErrorPaneIPv6);
-                }
-                /* Add into layout: */
-                pLayoutInterface->addLayout(pLayoutIPv6, 4, 2);
-            }
-
-            /* Create NMv6 network mask label: */
-            m_pLabelNMv6 = new QLabel;
-            AssertPtrReturnVoid(m_pLabelNMv6);
-            {
-                /* Configure label: */
-                m_pLabelNMv6->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
-                /* Add into layout: */
-                pLayoutInterface->addWidget(m_pLabelNMv6, 5, 1);
-            }
-            /* Create NMv6 layout: */
-            QHBoxLayout *pLayoutNMv6 = new QHBoxLayout;
-            AssertPtrReturnVoid(pLayoutNMv6);
-            {
-                /* Configure layout: */
-                pLayoutNMv6->setContentsMargins(0, 0, 0, 0);
-                /* Create NMv6 network mask editor: */
-                m_pEditorNMv6 = new QILineEdit;
-                AssertPtrReturnVoid(m_pEditorNMv6);
-                {
-                    /* Configure editor: */
-                    m_pLabelNMv6->setBuddy(m_pEditorNMv6);
-                    connect(m_pEditorNMv6, &QLineEdit::textChanged,
-                            this, &UINetworkDetailsWidget::sltTextChangedNMv6);
-                    /* Add into layout: */
-                    pLayoutNMv6->addWidget(m_pEditorNMv6);
-                }
-                /* Create NMv6 error pane: */
-                m_pErrorPaneNMv6 = new QLabel;
-                AssertPtrReturnVoid(m_pErrorPaneNMv6);
-                {
-                    /* Configure label: */
-                    m_pErrorPaneNMv6->setAlignment(Qt::AlignCenter);
-                    m_pErrorPaneNMv6->setPixmap(UIIconPool::iconSet(":/status_error_16px.png")
-                                                .pixmap(QSize(iIconMetric, iIconMetric)));
-                    /* Add into layout: */
-                    pLayoutNMv6->addWidget(m_pErrorPaneNMv6);
-                }
-                /* Add into layout: */
-                pLayoutInterface->addLayout(pLayoutNMv6, 5, 2);
-            }
-
-            /* Create indent: */
-            QStyleOption options;
-            options.initFrom(m_pButtonManual);
-            const int iWidth = m_pButtonManual->style()->pixelMetric(QStyle::PM_ExclusiveIndicatorWidth, &options, m_pButtonManual) +
-                               m_pButtonManual->style()->pixelMetric(QStyle::PM_RadioButtonLabelSpacing, &options, m_pButtonManual) -
-                               pLayoutInterface->spacing() - 1;
-            QSpacerItem *pSpacer1 = new QSpacerItem(iWidth, 0, QSizePolicy::Fixed, QSizePolicy::Expanding);
-            AssertPtrReturnVoid(pSpacer1);
-            {
-                /* Add into layout: */
-                pLayoutInterface->addItem(pSpacer1, 2, 0, 4);
-            }
-            /* Create stretch: */
-            QSpacerItem *pSpacer2 = new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding);
-            AssertPtrReturnVoid(pSpacer2);
-            {
-                /* Add into layout: */
-                pLayoutInterface->addItem(pSpacer2, 6, 0, 1, 3);
-            }
-
-            /* If parent embedded into stack: */
-            if (m_enmEmbedding == EmbedTo_Stack)
-            {
-                /* Create button-box: */
-                m_pButtonBoxInterface = new QIDialogButtonBox;
-                AssertPtrReturnVoid(m_pButtonBoxInterface);
-                /* Configure button-box: */
-                m_pButtonBoxInterface->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok);
-                connect(m_pButtonBoxInterface, &QIDialogButtonBox::clicked, this, &UINetworkDetailsWidget::sltHandleButtonBoxClick);
-
-                /* Add into layout: */
-                pLayoutInterface->addWidget(m_pButtonBoxInterface, 7, 0, 1, 3);
-            }
-        }
-        /* Add to tab-widget: */
-        m_pTabWidget->addTab(pTabInterface, QString());
-    }
-}
-
-void UINetworkDetailsWidget::prepareTabDHCPServer()
-{
-    /* Create 'DHCP server' tab: */
-    QWidget *pTabDHCPServer = new QWidget;
-    AssertPtrReturnVoid(pTabDHCPServer);
-    {
-        /* Create 'DHCP server' layout: */
-        QGridLayout *pLayoutDHCPServer = new QGridLayout(pTabDHCPServer);
-        AssertPtrReturnVoid(pLayoutDHCPServer);
-        {
-#ifdef VBOX_WS_MAC
-            /* Configure layout: */
-            pLayoutDHCPServer->setSpacing(10);
-            pLayoutDHCPServer->setContentsMargins(10, 10, 10, 10);
-#endif
-
-            /* Get the required icon metric: */
-            const int iIconMetric = QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize);
-
-            /* Create DHCP server status check-box: */
-            m_pCheckBoxDHCP = new QCheckBox;
-            AssertPtrReturnVoid(m_pCheckBoxDHCP);
-            {
-                /* Configure check-box: */
-                connect(m_pCheckBoxDHCP, &QCheckBox::stateChanged,
-                        this, &UINetworkDetailsWidget::sltStatusChangedServer);
-                /* Add into layout: */
-                pLayoutDHCPServer->addWidget(m_pCheckBoxDHCP, 0, 0, 1, 2);
-#ifdef VBOX_WS_MAC
-                pLayoutDHCPServer->setRowMinimumHeight(0, 22);
-#endif
-            }
-
-            /* Create DHCP address label: */
-            m_pLabelDHCPAddress = new QLabel;
-            AssertPtrReturnVoid(m_pLabelDHCPAddress);
-            {
-                /* Configure label: */
-                m_pLabelDHCPAddress->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
-                /* Add into layout: */
-                pLayoutDHCPServer->addWidget(m_pLabelDHCPAddress, 1, 1);
-            }
-            /* Create DHCP address layout: */
-            QHBoxLayout *pLayoutDHCPAddress = new QHBoxLayout;
-            AssertPtrReturnVoid(pLayoutDHCPAddress);
-            {
-                /* Configure layout: */
-                pLayoutDHCPAddress->setContentsMargins(0, 0, 0, 0);
-                /* Create DHCP address editor: */
-                m_pEditorDHCPAddress = new QILineEdit;
-                AssertPtrReturnVoid(m_pEditorDHCPAddress);
-                {
-                    /* Configure editor: */
-                    m_pLabelDHCPAddress->setBuddy(m_pEditorDHCPAddress);
-                    connect(m_pEditorDHCPAddress, &QLineEdit::textChanged,
-                            this, &UINetworkDetailsWidget::sltTextChangedAddress);
-                    /* Add into layout: */
-                    pLayoutDHCPAddress->addWidget(m_pEditorDHCPAddress);
-                }
-                /* Create DHCP address error pane: */
-                m_pErrorPaneDHCPAddress = new QLabel;
-                AssertPtrReturnVoid(m_pErrorPaneDHCPAddress);
-                {
-                    /* Configure label: */
-                    m_pErrorPaneDHCPAddress->setAlignment(Qt::AlignCenter);
-                    m_pErrorPaneDHCPAddress->setPixmap(UIIconPool::iconSet(":/status_error_16px.png")
-                                                       .pixmap(QSize(iIconMetric, iIconMetric)));
-                    /* Add into layout: */
-                    pLayoutDHCPAddress->addWidget(m_pErrorPaneDHCPAddress);
-                }
-                /* Add into layout: */
-                pLayoutDHCPServer->addLayout(pLayoutDHCPAddress, 1, 2);
-            }
-
-            /* Create DHCP network mask label: */
-            m_pLabelDHCPMask = new QLabel;
-            AssertPtrReturnVoid(m_pLabelDHCPMask);
-            {
-                /* Configure label: */
-                m_pLabelDHCPMask->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
-                /* Add into layout: */
-                pLayoutDHCPServer->addWidget(m_pLabelDHCPMask, 2, 1);
-            }
-            /* Create DHCP mask layout: */
-            QHBoxLayout *pLayoutDHCPMask = new QHBoxLayout;
-            AssertPtrReturnVoid(pLayoutDHCPMask);
-            {
-                /* Configure layout: */
-                pLayoutDHCPMask->setContentsMargins(0, 0, 0, 0);
-                /* Create DHCP network mask editor: */
-                m_pEditorDHCPMask = new QILineEdit;
-                AssertPtrReturnVoid(m_pEditorDHCPMask);
-                {
-                    /* Configure editor: */
-                    m_pLabelDHCPMask->setBuddy(m_pEditorDHCPMask);
-                    connect(m_pEditorDHCPMask, &QLineEdit::textChanged,
-                            this, &UINetworkDetailsWidget::sltTextChangedMask);
-                    /* Add into layout: */
-                    pLayoutDHCPMask->addWidget(m_pEditorDHCPMask);
-                }
-                /* Create DHCP mask error pane: */
-                m_pErrorPaneDHCPMask = new QLabel;
-                AssertPtrReturnVoid(m_pErrorPaneDHCPMask);
-                {
-                    /* Configure label: */
-                    m_pErrorPaneDHCPMask->setAlignment(Qt::AlignCenter);
-                    m_pErrorPaneDHCPMask->setPixmap(UIIconPool::iconSet(":/status_error_16px.png")
-                                                    .pixmap(QSize(iIconMetric, iIconMetric)));
-                    /* Add into layout: */
-                    pLayoutDHCPMask->addWidget(m_pErrorPaneDHCPMask);
-                }
-                /* Add into layout: */
-                pLayoutDHCPServer->addLayout(pLayoutDHCPMask, 2, 2);
-            }
-
-            /* Create DHCP lower address label: */
-            m_pLabelDHCPLowerAddress = new QLabel;
-            AssertPtrReturnVoid(m_pLabelDHCPLowerAddress);
-            {
-                /* Configure label: */
-                m_pLabelDHCPLowerAddress->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
-                /* Add into layout: */
-                pLayoutDHCPServer->addWidget(m_pLabelDHCPLowerAddress, 3, 1);
-            }
-            /* Create DHCP lower address layout: */
-            QHBoxLayout *pLayoutDHCPLowerAddress = new QHBoxLayout;
-            AssertPtrReturnVoid(pLayoutDHCPLowerAddress);
-            {
-                /* Configure layout: */
-                pLayoutDHCPLowerAddress->setContentsMargins(0, 0, 0, 0);
-                /* Create DHCP lower address editor: */
-                m_pEditorDHCPLowerAddress = new QILineEdit;
-                AssertPtrReturnVoid(m_pEditorDHCPLowerAddress);
-                {
-                    /* Configure editor: */
-                    m_pLabelDHCPLowerAddress->setBuddy(m_pEditorDHCPLowerAddress);
-                    connect(m_pEditorDHCPLowerAddress, &QLineEdit::textChanged,
-                            this, &UINetworkDetailsWidget::sltTextChangedLowerAddress);
-                    /* Add into layout: */
-                    pLayoutDHCPLowerAddress->addWidget(m_pEditorDHCPLowerAddress);
-                }
-                /* Create DHCP lower address error pane: */
-                m_pErrorPaneDHCPLowerAddress = new QLabel;
-                AssertPtrReturnVoid(m_pErrorPaneDHCPLowerAddress);
-                {
-                    /* Configure label: */
-                    m_pErrorPaneDHCPLowerAddress->setAlignment(Qt::AlignCenter);
-                    m_pErrorPaneDHCPLowerAddress->setPixmap(UIIconPool::iconSet(":/status_error_16px.png")
-                                                            .pixmap(QSize(iIconMetric, iIconMetric)));
-                    /* Add into layout: */
-                    pLayoutDHCPLowerAddress->addWidget(m_pErrorPaneDHCPLowerAddress);
-                }
-                /* Add into layout: */
-                pLayoutDHCPServer->addLayout(pLayoutDHCPLowerAddress, 3, 2);
-            }
-
-            /* Create DHCP upper address label: */
-            m_pLabelDHCPUpperAddress = new QLabel;
-            AssertPtrReturnVoid(m_pLabelDHCPUpperAddress);
-            {
-                /* Configure label: */
-                m_pLabelDHCPUpperAddress->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
-                /* Add into layout: */
-                pLayoutDHCPServer->addWidget(m_pLabelDHCPUpperAddress, 4, 1);
-            }
-            /* Create DHCP upper address layout: */
-            QHBoxLayout *pLayoutDHCPUpperAddress = new QHBoxLayout;
-            AssertPtrReturnVoid(pLayoutDHCPUpperAddress);
-            {
-                /* Configure layout: */
-                pLayoutDHCPUpperAddress->setContentsMargins(0, 0, 0, 0);
-                /* Create DHCP upper address editor: */
-                m_pEditorDHCPUpperAddress = new QILineEdit;
-                AssertPtrReturnVoid(m_pEditorDHCPUpperAddress);
-                {
-                    /* Configure editor: */
-                    m_pLabelDHCPUpperAddress->setBuddy(m_pEditorDHCPUpperAddress);
-                    connect(m_pEditorDHCPUpperAddress, &QLineEdit::textChanged,
-                            this, &UINetworkDetailsWidget::sltTextChangedUpperAddress);
-                    /* Add into layout: */
-                    pLayoutDHCPUpperAddress->addWidget(m_pEditorDHCPUpperAddress);
-                }
-                /* Create DHCP upper address error pane: */
-                m_pErrorPaneDHCPUpperAddress = new QLabel;
-                AssertPtrReturnVoid(m_pErrorPaneDHCPUpperAddress);
-                {
-                    /* Configure label: */
-                    m_pErrorPaneDHCPUpperAddress->setAlignment(Qt::AlignCenter);
-                    m_pErrorPaneDHCPUpperAddress->setPixmap(UIIconPool::iconSet(":/status_error_16px.png")
-                                                            .pixmap(QSize(iIconMetric, iIconMetric)));
-                    /* Add into layout: */
-                    pLayoutDHCPUpperAddress->addWidget(m_pErrorPaneDHCPUpperAddress);
-                }
-                /* Add into layout: */
-                pLayoutDHCPServer->addLayout(pLayoutDHCPUpperAddress, 4, 2);
-            }
-
-            /* Create indent: */
-            QStyleOption options;
-            options.initFrom(m_pCheckBoxDHCP);
-            const int iWidth = m_pCheckBoxDHCP->style()->pixelMetric(QStyle::PM_IndicatorWidth, &options, m_pCheckBoxDHCP) +
-                               m_pCheckBoxDHCP->style()->pixelMetric(QStyle::PM_CheckBoxLabelSpacing, &options, m_pCheckBoxDHCP) -
-                               pLayoutDHCPServer->spacing() - 1;
-            QSpacerItem *pSpacer1 = new QSpacerItem(iWidth, 0, QSizePolicy::Fixed, QSizePolicy::Expanding);
-            AssertPtrReturnVoid(pSpacer1);
-            {
-                /* Add into layout: */
-                pLayoutDHCPServer->addItem(pSpacer1, 1, 0, 4);
-            }
-            /* Create stretch: */
-            QSpacerItem *pSpacer2 = new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding);
-            AssertPtrReturnVoid(pSpacer2);
-            {
-                /* Add into layout: */
-                pLayoutDHCPServer->addItem(pSpacer2, 5, 0, 1, 3);
-            }
-
-            /* If parent embedded into stack: */
-            if (m_enmEmbedding == EmbedTo_Stack)
-            {
-                /* Create button-box: */
-                m_pButtonBoxServer = new QIDialogButtonBox;
-                AssertPtrReturnVoid(m_pButtonBoxServer);
-                /* Configure button-box: */
-                m_pButtonBoxServer->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok);
-                connect(m_pButtonBoxServer, &QIDialogButtonBox::clicked, this, &UINetworkDetailsWidget::sltHandleButtonBoxClick);
-
-                /* Add into layout: */
-                pLayoutDHCPServer->addWidget(m_pButtonBoxServer, 6, 0, 1, 3);
-            }
-        }
-        /* Add to tab-widget: */
-        m_pTabWidget->addTab(pTabDHCPServer, QString());
-    }
-}
-
-void UINetworkDetailsWidget::loadDataForInterface()
-{
-    /* Toggle IPv4 & IPv6 interface fields availability: */
-    const bool fIsInterfaceConfigurable = !m_newData.m_interface.m_fDHCPEnabled;
-    m_pLabelIPv4->setEnabled(fIsInterfaceConfigurable);
-    m_pLabelNMv4->setEnabled(fIsInterfaceConfigurable);
-    m_pEditorIPv4->setEnabled(fIsInterfaceConfigurable);
-    m_pEditorNMv4->setEnabled(fIsInterfaceConfigurable);
-
-    /* Load IPv4 interface fields: */
-    m_pButtonAutomatic->setChecked(!fIsInterfaceConfigurable);
-    m_pButtonManual->setChecked(fIsInterfaceConfigurable);
-    m_pEditorIPv4->setText(m_newData.m_interface.m_strAddress);
-    m_pEditorNMv4->setText(m_newData.m_interface.m_strMask);
-
-    /* Toggle IPv6 interface fields availability: */
-    const bool fIsIpv6Configurable = fIsInterfaceConfigurable && m_newData.m_interface.m_fSupportedIPv6;
-    m_pLabelIPv6->setEnabled(fIsIpv6Configurable);
-    m_pLabelNMv6->setEnabled(fIsIpv6Configurable);
-    m_pEditorIPv6->setEnabled(fIsIpv6Configurable);
-    m_pEditorNMv6->setEnabled(fIsIpv6Configurable);
-
-    /* Load IPv6 interface fields: */
-    m_pEditorIPv6->setText(m_newData.m_interface.m_strAddress6);
-    m_pEditorNMv6->setText(m_newData.m_interface.m_strPrefixLength6);
-}
-
-void UINetworkDetailsWidget::loadDataForDHCPServer()
-{
-    /* Toggle DHCP server fields availability: */
-    const bool fIsDHCPServerEnabled = m_newData.m_dhcpserver.m_fEnabled;
-    m_pLabelDHCPAddress->setEnabled(fIsDHCPServerEnabled);
-    m_pLabelDHCPMask->setEnabled(fIsDHCPServerEnabled);
-    m_pLabelDHCPLowerAddress->setEnabled(fIsDHCPServerEnabled);
-    m_pLabelDHCPUpperAddress->setEnabled(fIsDHCPServerEnabled);
-    m_pEditorDHCPAddress->setEnabled(fIsDHCPServerEnabled);
-    m_pEditorDHCPMask->setEnabled(fIsDHCPServerEnabled);
-    m_pEditorDHCPLowerAddress->setEnabled(fIsDHCPServerEnabled);
-    m_pEditorDHCPUpperAddress->setEnabled(fIsDHCPServerEnabled);
-
-    /* Load DHCP server fields: */
-    m_pCheckBoxDHCP->setChecked(fIsDHCPServerEnabled);
-    m_pEditorDHCPAddress->setText(m_newData.m_dhcpserver.m_strAddress);
-    m_pEditorDHCPMask->setText(m_newData.m_dhcpserver.m_strMask);
-    m_pEditorDHCPLowerAddress->setText(m_newData.m_dhcpserver.m_strLowerAddress);
-    m_pEditorDHCPUpperAddress->setText(m_newData.m_dhcpserver.m_strUpperAddress);
-
-    /* Invent default values if server was enabled
-     * but at least one current value is invalid: */
-    if (   fIsDHCPServerEnabled
-        && (   m_pEditorDHCPAddress->text().isEmpty()
-            || m_pEditorDHCPAddress->text() == "0.0.0.0"
-            || m_pEditorDHCPMask->text().isEmpty()
-            || m_pEditorDHCPMask->text() == "0.0.0.0"
-            || m_pEditorDHCPLowerAddress->text().isEmpty()
-            || m_pEditorDHCPLowerAddress->text() == "0.0.0.0"
-            || m_pEditorDHCPUpperAddress->text().isEmpty()
-            || m_pEditorDHCPUpperAddress->text() == "0.0.0.0"))
-    {
-        const QStringList &proposal = makeDhcpServerProposal(m_oldData.m_interface.m_strAddress,
-                                                             m_oldData.m_interface.m_strMask);
-        m_pEditorDHCPAddress->setText(proposal.at(0));
-        m_pEditorDHCPMask->setText(proposal.at(1));
-        m_pEditorDHCPLowerAddress->setText(proposal.at(2));
-        m_pEditorDHCPUpperAddress->setText(proposal.at(3));
-    }
-}
-
-void UINetworkDetailsWidget::revalidate(QWidget *pWidget /* = 0 */)
-{
-    /* Validate 'Interface' tab content: */
-    if (!pWidget || pWidget == m_pErrorPaneAutomatic)
-    {
-        const bool fError =    m_newData.m_interface.m_fDHCPEnabled
-                            && !m_newData.m_dhcpserver.m_fEnabled;
-        m_pErrorPaneAutomatic->setVisible(fError);
-    }
-    if (!pWidget || pWidget == m_pErrorPaneManual)
-    {
-        const bool fError = false;
-        m_pErrorPaneManual->setVisible(fError);
-    }
-    if (!pWidget || pWidget == m_pErrorPaneIPv4)
-    {
-        const bool fError =    !m_newData.m_interface.m_fDHCPEnabled
-                            && !m_newData.m_interface.m_strAddress.trimmed().isEmpty()
-                            && (   !RTNetIsIPv4AddrStr(m_newData.m_interface.m_strAddress.toUtf8().constData())
-                                || RTNetStrIsIPv4AddrAny(m_newData.m_interface.m_strAddress.toUtf8().constData()));
-        m_pErrorPaneIPv4->setVisible(fError);
-    }
-    if (!pWidget || pWidget == m_pErrorPaneNMv4)
-    {
-        const bool fError =    !m_newData.m_interface.m_fDHCPEnabled
-                            && !m_newData.m_interface.m_strMask.trimmed().isEmpty()
-                            && (   !RTNetIsIPv4AddrStr(m_newData.m_interface.m_strMask.toUtf8().constData())
-                                || RTNetStrIsIPv4AddrAny(m_newData.m_interface.m_strMask.toUtf8().constData()));
-        m_pErrorPaneNMv4->setVisible(fError);
-    }
-    if (!pWidget || pWidget == m_pErrorPaneIPv6)
-    {
-        const bool fError =    !m_newData.m_interface.m_fDHCPEnabled
-                            && m_newData.m_interface.m_fSupportedIPv6
-                            && !m_newData.m_interface.m_strAddress6.trimmed().isEmpty()
-                            && (   !RTNetIsIPv6AddrStr(m_newData.m_interface.m_strAddress6.toUtf8().constData())
-                                || RTNetStrIsIPv6AddrAny(m_newData.m_interface.m_strAddress6.toUtf8().constData()));
-        m_pErrorPaneIPv6->setVisible(fError);
-    }
-    if (!pWidget || pWidget == m_pErrorPaneNMv6)
-    {
-        bool fIsMaskPrefixLengthNumber = false;
-        const int iMaskPrefixLength = m_newData.m_interface.m_strPrefixLength6.trimmed().toInt(&fIsMaskPrefixLengthNumber);
-        const bool fError =    !m_newData.m_interface.m_fDHCPEnabled
-                            && m_newData.m_interface.m_fSupportedIPv6
-                            && (   !fIsMaskPrefixLengthNumber
-                                || iMaskPrefixLength < 0
-                                || iMaskPrefixLength > 128);
-        m_pErrorPaneNMv6->setVisible(fError);
-    }
-
-    /* Validate 'DHCP server' tab content: */
-    if (!pWidget || pWidget == m_pErrorPaneDHCPAddress)
-    {
-        const bool fError =    m_newData.m_dhcpserver.m_fEnabled
-                            && (   !RTNetIsIPv4AddrStr(m_newData.m_dhcpserver.m_strAddress.toUtf8().constData())
-                                || RTNetStrIsIPv4AddrAny(m_newData.m_dhcpserver.m_strAddress.toUtf8().constData()));
-        m_pErrorPaneDHCPAddress->setVisible(fError);
-    }
-    if (!pWidget || pWidget == m_pErrorPaneDHCPMask)
-    {
-        const bool fError =    m_newData.m_dhcpserver.m_fEnabled
-                            && (   !RTNetIsIPv4AddrStr(m_newData.m_dhcpserver.m_strMask.toUtf8().constData())
-                                || RTNetStrIsIPv4AddrAny(m_newData.m_dhcpserver.m_strMask.toUtf8().constData()));
-        m_pErrorPaneDHCPMask->setVisible(fError);
-    }
-    if (!pWidget || pWidget == m_pErrorPaneDHCPLowerAddress)
-    {
-        const bool fError =    m_newData.m_dhcpserver.m_fEnabled
-                            && (   !RTNetIsIPv4AddrStr(m_newData.m_dhcpserver.m_strLowerAddress.toUtf8().constData())
-                                || RTNetStrIsIPv4AddrAny(m_newData.m_dhcpserver.m_strLowerAddress.toUtf8().constData()));
-        m_pErrorPaneDHCPLowerAddress->setVisible(fError);
-    }
-    if (!pWidget || pWidget == m_pErrorPaneDHCPUpperAddress)
-    {
-        const bool fError =    m_newData.m_dhcpserver.m_fEnabled
-                            && (   !RTNetIsIPv4AddrStr(m_newData.m_dhcpserver.m_strUpperAddress.toUtf8().constData())
-                                || RTNetStrIsIPv4AddrAny(m_newData.m_dhcpserver.m_strUpperAddress.toUtf8().constData()));
-        m_pErrorPaneDHCPUpperAddress->setVisible(fError);
-    }
-
-    /* Retranslate validation: */
-    retranslateValidation(pWidget);
-}
-
-void UINetworkDetailsWidget::retranslateValidation(QWidget *pWidget /* = 0 */)
-{
-    /* Translate 'Interface' tab content: */
-    if (!pWidget || pWidget == m_pErrorPaneAutomatic)
-        m_pErrorPaneAutomatic->setToolTip(tr("Host interface <nobr><b>%1</b></nobr> is set to obtain the address automatically "
-                                             "but the corresponding DHCP server is not enabled.").arg(m_newData.m_interface.m_strName));
-    if (!pWidget || pWidget == m_pErrorPaneIPv4)
-        m_pErrorPaneIPv4->setToolTip(tr("Host interface <nobr><b>%1</b></nobr> does not currently have a valid "
-                                        "IPv4 address.").arg(m_newData.m_interface.m_strName));
-    if (!pWidget || pWidget == m_pErrorPaneNMv4)
-        m_pErrorPaneNMv4->setToolTip(tr("Host interface <nobr><b>%1</b></nobr> does not currently have a valid "
-                                        "IPv4 network mask.").arg(m_newData.m_interface.m_strName));
-    if (!pWidget || pWidget == m_pErrorPaneIPv6)
-        m_pErrorPaneIPv6->setToolTip(tr("Host interface <nobr><b>%1</b></nobr> does not currently have a valid "
-                                        "IPv6 address.").arg(m_newData.m_interface.m_strName));
-    if (!pWidget || pWidget == m_pErrorPaneNMv6)
-        m_pErrorPaneNMv6->setToolTip(tr("Host interface <nobr><b>%1</b></nobr> does not currently have a valid "
-                                        "IPv6 prefix length.").arg(m_newData.m_interface.m_strName));
-
-    /* Translate 'DHCP server' tab content: */
-    if (!pWidget || pWidget == m_pErrorPaneDHCPAddress)
-        m_pErrorPaneDHCPAddress->setToolTip(tr("Host interface <nobr><b>%1</b></nobr> does not currently have a valid "
-                                               "DHCP server address.").arg(m_newData.m_interface.m_strName));
-    if (!pWidget || pWidget == m_pErrorPaneDHCPMask)
-        m_pErrorPaneDHCPMask->setToolTip(tr("Host interface <nobr><b>%1</b></nobr> does not currently have a valid "
-                                            "DHCP server mask.").arg(m_newData.m_interface.m_strName));
-    if (!pWidget || pWidget == m_pErrorPaneDHCPLowerAddress)
-        m_pErrorPaneDHCPLowerAddress->setToolTip(tr("Host interface <nobr><b>%1</b></nobr> does not currently have a valid "
-                                                    "DHCP server lower address bound.").arg(m_newData.m_interface.m_strName));
-    if (!pWidget || pWidget == m_pErrorPaneDHCPUpperAddress)
-        m_pErrorPaneDHCPUpperAddress->setToolTip(tr("Host interface <nobr><b>%1</b></nobr> does not currently have a valid "
-                                                    "DHCP server upper address bound.").arg(m_newData.m_interface.m_strName));
-}
-
-void UINetworkDetailsWidget::updateButtonStates()
-{
-//    if (m_oldData != m_newData)
-//        printf("Interface: %s, %s, %s, %s;  DHCP server: %d, %s, %s, %s, %s\n",
-//               m_newData.m_interface.m_strAddress.toUtf8().constData(),
-//               m_newData.m_interface.m_strMask.toUtf8().constData(),
-//               m_newData.m_interface.m_strAddress6.toUtf8().constData(),
-//               m_newData.m_interface.m_strPrefixLength6.toUtf8().constData(),
-//               (int)m_newData.m_dhcpserver.m_fEnabled,
-//               m_newData.m_dhcpserver.m_strAddress.toUtf8().constData(),
-//               m_newData.m_dhcpserver.m_strMask.toUtf8().constData(),
-//               m_newData.m_dhcpserver.m_strLowerAddress.toUtf8().constData(),
-//               m_newData.m_dhcpserver.m_strUpperAddress.toUtf8().constData());
-
-    /* Update 'Apply' / 'Reset' button states: */
-    if (m_pButtonBoxInterface)
-    {
-        m_pButtonBoxInterface->button(QDialogButtonBox::Cancel)->setEnabled(m_oldData != m_newData);
-        m_pButtonBoxInterface->button(QDialogButtonBox::Ok)->setEnabled(m_oldData != m_newData);
-    }
-    if (m_pButtonBoxServer)
-    {
-        m_pButtonBoxServer->button(QDialogButtonBox::Cancel)->setEnabled(m_oldData != m_newData);
-        m_pButtonBoxServer->button(QDialogButtonBox::Ok)->setEnabled(m_oldData != m_newData);
-    }
-
-    /* Notify listeners as well: */
-    emit sigDataChanged(m_oldData != m_newData);
-}
-
Index: unk/src/VBox/Frontends/VirtualBox/src/networkmanager/UINetworkDetailsWidget.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UINetworkDetailsWidget.h	(revision 87218)
+++ 	(revision )
@@ -1,357 +1,0 @@
-/* $Id$ */
-/** @file
- * VBox Qt GUI - UINetworkDetailsWidget class declaration.
- */
-
-/*
- * Copyright (C) 2009-2020 Oracle Corporation
- *
- * This file is part of VirtualBox Open Source Edition (OSE), as
- * available from http://www.virtualbox.org. This file is free software;
- * you can redistribute it and/or modify it under the terms of the GNU
- * General Public License (GPL) as published by the Free Software
- * Foundation, in version 2 as it comes in the "COPYING" file of the
- * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
- */
-
-#ifndef FEQT_INCLUDED_SRC_networkmanager_UINetworkDetailsWidget_h
-#define FEQT_INCLUDED_SRC_networkmanager_UINetworkDetailsWidget_h
-#ifndef RT_WITHOUT_PRAGMA_ONCE
-# pragma once
-#endif
-
-/* Qt includes: */
-#include <QWidget>
-
-/* GUI includes: */
-#include "QIManagerDialog.h"
-#include "QIWithRetranslateUI.h"
-
-/* Forward declarations: */
-class QAbstractButton;
-class QCheckBox;
-class QLabel;
-class QRadioButton;
-class QIDialogButtonBox;
-class QILineEdit;
-class QITabWidget;
-
-
-/** Host Network Manager: Host Network Interface data structure. */
-struct UIDataHostNetworkInterface
-{
-    /** Constructs data. */
-    UIDataHostNetworkInterface()
-        : m_strName(QString())
-        , m_fDHCPEnabled(false)
-        , m_strAddress(QString())
-        , m_strMask(QString())
-        , m_fSupportedIPv6(false)
-        , m_strAddress6(QString())
-        , m_strPrefixLength6(QString())
-    {}
-
-    /** Returns whether the @a other passed data is equal to this one. */
-    bool equal(const UIDataHostNetworkInterface &other) const
-    {
-        return true
-               && (m_strName == other.m_strName)
-               && (m_fDHCPEnabled == other.m_fDHCPEnabled)
-               && (m_strAddress == other.m_strAddress)
-               && (m_strMask == other.m_strMask)
-               && (m_fSupportedIPv6 == other.m_fSupportedIPv6)
-               && (m_strAddress6 == other.m_strAddress6)
-               && (m_strPrefixLength6 == other.m_strPrefixLength6)
-               ;
-    }
-
-    /** Returns whether the @a other passed data is equal to this one. */
-    bool operator==(const UIDataHostNetworkInterface &other) const { return equal(other); }
-    /** Returns whether the @a other passed data is different from this one. */
-    bool operator!=(const UIDataHostNetworkInterface &other) const { return !equal(other); }
-
-    /** Holds interface name. */
-    QString m_strName;
-    /** Holds whether DHCP is enabled for that interface. */
-    bool m_fDHCPEnabled;
-    /** Holds IPv4 interface address. */
-    QString m_strAddress;
-    /** Holds IPv4 interface mask. */
-    QString m_strMask;
-    /** Holds whether IPv6 protocol supported. */
-    bool m_fSupportedIPv6;
-    /** Holds IPv6 interface address. */
-    QString m_strAddress6;
-    /** Holds IPv6 interface prefix length. */
-    QString m_strPrefixLength6;
-};
-
-
-/** Host Network Manager: DHCP Server data structure. */
-struct UIDataDHCPServer
-{
-    /** Constructs data. */
-    UIDataDHCPServer()
-        : m_fEnabled(false)
-        , m_strAddress(QString())
-        , m_strMask(QString())
-        , m_strLowerAddress(QString())
-        , m_strUpperAddress(QString())
-    {}
-
-    /** Returns whether the @a other passed data is equal to this one. */
-    bool equal(const UIDataDHCPServer &other) const
-    {
-        return true
-               && (m_fEnabled == other.m_fEnabled)
-               && (m_strAddress == other.m_strAddress)
-               && (m_strMask == other.m_strMask)
-               && (m_strLowerAddress == other.m_strLowerAddress)
-               && (m_strUpperAddress == other.m_strUpperAddress)
-               ;
-    }
-
-    /** Returns whether the @a other passed data is equal to this one. */
-    bool operator==(const UIDataDHCPServer &other) const { return equal(other); }
-    /** Returns whether the @a other passed data is different from this one. */
-    bool operator!=(const UIDataDHCPServer &other) const { return !equal(other); }
-
-    /** Holds whether DHCP server enabled. */
-    bool m_fEnabled;
-    /** Holds DHCP server address. */
-    QString m_strAddress;
-    /** Holds DHCP server mask. */
-    QString m_strMask;
-    /** Holds DHCP server lower address. */
-    QString m_strLowerAddress;
-    /** Holds DHCP server upper address. */
-    QString m_strUpperAddress;
-};
-
-
-/** Host Network Manager: Host network data structure. */
-struct UIDataHostNetwork
-{
-    /** Constructs data. */
-    UIDataHostNetwork()
-        : m_interface(UIDataHostNetworkInterface())
-        , m_dhcpserver(UIDataDHCPServer())
-    {}
-
-    /** Returns whether the @a other passed data is equal to this one. */
-    bool equal(const UIDataHostNetwork &other) const
-    {
-        return true
-               && (m_interface == other.m_interface)
-               && (m_dhcpserver == other.m_dhcpserver)
-               ;
-    }
-
-    /** Returns whether the @a other passed data is equal to this one. */
-    bool operator==(const UIDataHostNetwork &other) const { return equal(other); }
-    /** Returns whether the @a other passed data is different from this one. */
-    bool operator!=(const UIDataHostNetwork &other) const { return !equal(other); }
-
-    /** Holds the interface data. */
-    UIDataHostNetworkInterface m_interface;
-    /** Holds the DHCP server data. */
-    UIDataDHCPServer m_dhcpserver;
-};
-
-
-/** Host Network Manager: Host network details-widget. */
-class UINetworkDetailsWidget : public QIWithRetranslateUI<QWidget>
-{
-    Q_OBJECT;
-
-signals:
-
-    /** Notifies listeners about data changed and whether it @a fDiffers. */
-    void sigDataChanged(bool fDiffers);
-
-    /** Notifies listeners about data change rejected and should be reseted. */
-    void sigDataChangeRejected();
-    /** Notifies listeners about data change accepted and should be applied. */
-    void sigDataChangeAccepted();
-
-public:
-
-    /** Constructs medium details dialog passing @a pParent to the base-class.
-      * @param  enmEmbedding  Brings embedding type. */
-    UINetworkDetailsWidget(EmbedTo enmEmbedding, QWidget *pParent = 0);
-
-    /** Returns the host network data. */
-    const UIDataHostNetwork &data() const { return m_newData; }
-    /** Defines the host network @a data. */
-    void setData(const UIDataHostNetwork &data);
-
-protected:
-
-    /** Handles translation event. */
-    virtual void retranslateUi() /* override */;
-
-private slots:
-
-    /** @name Change handling stuff.
-      * @{ */
-        /** Handles interface automatic configuration choice change. */
-        void sltToggledButtonAutomatic(bool fChecked);
-        /** Handles interface manual configuration choice change. */
-        void sltToggledButtonManual(bool fChecked);
-        /** Handles interface IPv4 text change. */
-        void sltTextChangedIPv4(const QString &strText);
-        /** Handles interface NMv4 text change. */
-        void sltTextChangedNMv4(const QString &strText);
-        /** Handles interface IPv6 text change. */
-        void sltTextChangedIPv6(const QString &strText);
-        /** Handles interface NMv6 text change. */
-        void sltTextChangedNMv6(const QString &strText);
-
-        /** Handles DHCP server status change. */
-        void sltStatusChangedServer(int iChecked);
-        /** Handles DHCP server address text change. */
-        void sltTextChangedAddress(const QString &strText);
-        /** Handles DHCP server mask text change. */
-        void sltTextChangedMask(const QString &strText);
-        /** Handles DHCP server lower address text change. */
-        void sltTextChangedLowerAddress(const QString &strText);
-        /** Handles DHCP server upper address text change. */
-        void sltTextChangedUpperAddress(const QString &strText);
-
-        /** Handles button-box button click. */
-        void sltHandleButtonBoxClick(QAbstractButton *pButton);
-    /** @} */
-
-private:
-
-    /** @name Prepare/cleanup cascade.
-      * @{ */
-        /** Prepares all. */
-        void prepare();
-        /** Prepares this. */
-        void prepareThis();
-        /** Prepares tab-widget. */
-        void prepareTabWidget();
-        /** Prepares 'Interface' tab. */
-        void prepareTabInterface();
-        /** Prepares 'DHCP server' tab. */
-        void prepareTabDHCPServer();
-    /** @} */
-
-    /** @name Loading stuff.
-      * @{ */
-        /** Loads interface data. */
-        void loadDataForInterface();
-        /** Loads server data. */
-        void loadDataForDHCPServer();
-    /** @} */
-
-    /** @name Change handling stuff.
-      * @{ */
-        /** Revalidates changes for passed @a pWidget. */
-        void revalidate(QWidget *pWidget = 0);
-        /** Retranslates validation for passed @a pWidget. */
-        void retranslateValidation(QWidget *pWidget = 0);
-        /** Updates button states. */
-        void updateButtonStates();
-    /** @} */
-
-    /** @name General variables.
-      * @{ */
-        /** Holds the parent widget embedding type. */
-        const EmbedTo m_enmEmbedding;
-
-        /** Holds the old data copy. */
-        UIDataHostNetwork  m_oldData;
-        /** Holds the new data copy. */
-        UIDataHostNetwork  m_newData;
-
-        /** Holds the tab-widget. */
-        QITabWidget *m_pTabWidget;
-    /** @} */
-
-    /** @name Interface variables.
-      * @{ */
-        /** Holds the automatic interface configuration button. */
-        QRadioButton *m_pButtonAutomatic;
-        /** Holds the automatic interface configuration error pane. */
-        QLabel       *m_pErrorPaneAutomatic;
-
-        /** Holds the manual interface configuration button. */
-        QRadioButton *m_pButtonManual;
-        /** Holds the manual interface configuration error pane. */
-        QLabel       *m_pErrorPaneManual;
-
-        /** Holds the IPv4 address label. */
-        QLabel       *m_pLabelIPv4;
-        /** Holds the IPv4 address editor. */
-        QILineEdit   *m_pEditorIPv4;
-        /** Holds the IPv4 address error pane. */
-        QLabel       *m_pErrorPaneIPv4;
-
-        /** Holds the IPv4 network mask label. */
-        QLabel       *m_pLabelNMv4;
-        /** Holds the IPv4 network mask editor. */
-        QILineEdit   *m_pEditorNMv4;
-        /** Holds the IPv4 network mask error pane. */
-        QLabel       *m_pErrorPaneNMv4;
-
-        /** Holds the IPv6 address label. */
-        QLabel       *m_pLabelIPv6;
-        /** Holds the IPv6 address editor. */
-        QILineEdit   *m_pEditorIPv6;
-        /** Holds the IPv6 address error pane. */
-        QLabel       *m_pErrorPaneIPv6;
-
-        /** Holds the IPv6 network mask label. */
-        QLabel       *m_pLabelNMv6;
-        /** Holds the IPv6 network mask editor. */
-        QILineEdit   *m_pEditorNMv6;
-        /** Holds the IPv6 network mask error pane. */
-        QLabel       *m_pErrorPaneNMv6;
-
-        /** Holds the interface button-box instance. */
-        QIDialogButtonBox *m_pButtonBoxInterface;
-    /** @} */
-
-    /** @name DHCP server variables.
-      * @{ */
-        /** Holds the DHCP server status chack-box. */
-        QCheckBox  *m_pCheckBoxDHCP;
-
-        /** Holds the DHCP address label. */
-        QLabel     *m_pLabelDHCPAddress;
-        /** Holds the DHCP address editor. */
-        QILineEdit *m_pEditorDHCPAddress;
-        /** Holds the DHCP address error pane. */
-        QLabel     *m_pErrorPaneDHCPAddress;
-
-        /** Holds the DHCP network mask label. */
-        QLabel     *m_pLabelDHCPMask;
-        /** Holds the DHCP network mask editor. */
-        QILineEdit *m_pEditorDHCPMask;
-        /** Holds the DHCP network mask error pane. */
-        QLabel     *m_pErrorPaneDHCPMask;
-
-        /** Holds the DHCP lower address label. */
-        QLabel     *m_pLabelDHCPLowerAddress;
-        /** Holds the DHCP lower address editor. */
-        QILineEdit *m_pEditorDHCPLowerAddress;
-        /** Holds the DHCP lower address error pane. */
-        QLabel     *m_pErrorPaneDHCPLowerAddress;
-
-        /** Holds the DHCP upper address label. */
-        QLabel     *m_pLabelDHCPUpperAddress;
-        /** Holds the DHCP upper address editor. */
-        QILineEdit *m_pEditorDHCPUpperAddress;
-        /** Holds the DHCP upper address error pane. */
-        QLabel     *m_pErrorPaneDHCPUpperAddress;
-
-        /** Holds the server button-box instance. */
-        QIDialogButtonBox *m_pButtonBoxServer;
-    /** @} */
-};
-
-#endif /* !FEQT_INCLUDED_SRC_networkmanager_UINetworkDetailsWidget_h */
-
Index: /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UINetworkManager.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UINetworkManager.cpp	(revision 87218)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UINetworkManager.cpp	(revision 87219)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2009-2020 Oracle Corporation
+ * Copyright (C) 2009-2021 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -27,8 +27,8 @@
 #include "QITreeWidget.h"
 #include "UIActionPoolManager.h"
+#include "UIDetailsWidgetHostNetwork.h"
 #include "UIExtraDataManager.h"
 #include "UIIconPool.h"
 #include "UIMessageCenter.h"
-#include "UINetworkDetailsWidget.h"
 #include "UINetworkManager.h"
 #include "UINetworkManagerUtils.h"
@@ -890,14 +890,14 @@
 {
     /* Prepare host network details-widget: */
-    m_pDetailsWidgetHostNetwork = new UINetworkDetailsWidget(m_enmEmbedding, m_pTabHostNetwork);
+    m_pDetailsWidgetHostNetwork = new UIDetailsWidgetHostNetwork(m_enmEmbedding, m_pTabHostNetwork);
     if (m_pDetailsWidgetHostNetwork)
     {
         m_pDetailsWidgetHostNetwork->setVisible(false);
         m_pDetailsWidgetHostNetwork->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
-        connect(m_pDetailsWidgetHostNetwork, &UINetworkDetailsWidget::sigDataChanged,
+        connect(m_pDetailsWidgetHostNetwork, &UIDetailsWidgetHostNetwork::sigDataChanged,
                 this, &UINetworkManagerWidget::sigDetailsDataChangedHostNetwork);
-        connect(m_pDetailsWidgetHostNetwork, &UINetworkDetailsWidget::sigDataChangeRejected,
+        connect(m_pDetailsWidgetHostNetwork, &UIDetailsWidgetHostNetwork::sigDataChangeRejected,
                 this, &UINetworkManagerWidget::sltHandleCurrentItemChangeHostNetwork);
-        connect(m_pDetailsWidgetHostNetwork, &UINetworkDetailsWidget::sigDataChangeAccepted,
+        connect(m_pDetailsWidgetHostNetwork, &UIDetailsWidgetHostNetwork::sigDataChangeAccepted,
                 this, &UINetworkManagerWidget::sltApplyDetailsChangesHostNetwork);
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UINetworkManager.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UINetworkManager.h	(revision 87218)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/networkmanager/UINetworkManager.h	(revision 87219)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2009-2020 Oracle Corporation
+ * Copyright (C) 2009-2021 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -38,5 +38,5 @@
 class QITreeWidget;
 class UIActionPool;
-class UINetworkDetailsWidget;
+class UIDetailsWidgetHostNetwork;
 class UIItemHostNetwork;
 class QIToolBar;
@@ -188,11 +188,11 @@
 
         /** Holds the host network tab. */
-        QWidget                *m_pTabHostNetwork;
+        QWidget                    *m_pTabHostNetwork;
         /** Holds the host network layout. */
-        QVBoxLayout            *m_pLayoutHostNetwork;
+        QVBoxLayout                *m_pLayoutHostNetwork;
         /** Holds the host network tree-widget instance. */
-        QITreeWidget           *m_pTreeWidgetHostNetwork;
+        QITreeWidget               *m_pTreeWidgetHostNetwork;
         /** Holds the host network details-widget instance. */
-        UINetworkDetailsWidget *m_pDetailsWidgetHostNetwork;
+        UIDetailsWidgetHostNetwork *m_pDetailsWidgetHostNetwork;
     /** @} */
 };
