Index: trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk	(revision 104457)
+++ trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk	(revision 104458)
@@ -858,5 +858,5 @@
 	src/logviewer/UIVMLogViewerWidget.h \
 	src/activity/vmactivity/UIVMActivityMonitor.h \
-	src/activity/vmactivity/UIVMActivityMonitorPaneContainer.h \
+	src/activity/vmactivity/UIVMActivityMonitorContainer.h \
 	src/activity/UIMonitorCommon.h \
 	src/medium/UIFDCreationDialog.h \
@@ -1439,5 +1439,5 @@
 	src/activity/UIMonitorCommon.cpp \
 	src/activity/vmactivity/UIVMActivityMonitor.cpp \
-	src/activity/vmactivity/UIVMActivityMonitorPaneContainer.cpp \
+	src/activity/vmactivity/UIVMActivityMonitorContainer.cpp \
 	src/medium/UIFDCreationDialog.cpp \
 	src/medium/UIMedium.cpp \
Index: trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityMonitor.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityMonitor.cpp	(revision 104457)
+++ trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityMonitor.cpp	(revision 104458)
@@ -240,5 +240,5 @@
     m_pMouseOverLabel->hide();
     m_pMouseOverLabel->setFrameStyle(QFrame::Box);
-    m_pMouseOverLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+
     m_pMouseOverLabel->setAutoFillBackground(true);
     m_pMouseOverLabel->setMargin(0.1 * QStyle::PM_HeaderMargin);
@@ -424,4 +424,5 @@
         else
         {
+
             QString strToolTip = toolTipText();
             QPoint pos = mapFromGlobal(QCursor::pos());
@@ -432,4 +433,5 @@
                 m_pMouseOverLabel->move(QPoint(pos.x(), pos.y() - m_pMouseOverLabel->height()));
                 m_pMouseOverLabel->setVisible(true);
+                m_pMouseOverLabel->adjustSize();
             }
             else
Index: trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityMonitorContainer.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityMonitorContainer.cpp	(revision 104458)
+++ trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityMonitorContainer.cpp	(revision 104458)
@@ -0,0 +1,349 @@
+/* $Id$ */
+/** @file
+ * VBox Qt GUI - UIVMLogViewer class implementation.
+ */
+
+/*
+ * Copyright (C) 2010-2023 Oracle and/or its affiliates.
+ *
+ * This file is part of VirtualBox base platform packages, as
+ * available from https://www.virtualbox.org.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, in version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <https://www.gnu.org/licenses>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-only
+ */
+
+/* Qt includes: */
+#include <QApplication>
+#include <QColor>
+#include <QColorDialog>
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QPainter>
+#include <QPixmap>
+#include <QPlainTextEdit>
+#include <QPushButton>
+#include <QStyle>
+#include <QTabWidget>
+
+/* GUI includes: */
+#include "UIActionPool.h"
+#include "UIExtraDataManager.h"
+#include "UIGlobalSession.h"
+#include "UITranslationEventListener.h"
+#include "UIVMActivityMonitor.h"
+#include "UIVMActivityMonitorContainer.h"
+
+/* Other includes: */
+#include "iprt/assert.h"
+
+
+/*********************************************************************************************************************************
+*   UIVMActivityMonitorPaneContainer implementation.                                                                             *
+*********************************************************************************************************************************/
+
+
+UIVMActivityMonitorPaneContainer::UIVMActivityMonitorPaneContainer(QWidget *pParent)
+    : UIPaneContainer(pParent)
+    , m_pColorLabel{0, 0}
+    , m_pColorChangeButton{0, 0}
+    , m_pResetButton(0)
+{
+    setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
+    prepare();
+}
+
+void UIVMActivityMonitorPaneContainer::prepare()
+{
+    QWidget *pContainerWidget = new QWidget(this);
+    QVBoxLayout *pContainerLayout = new QVBoxLayout(pContainerWidget);
+    AssertReturnVoid(pContainerWidget);
+    AssertReturnVoid(pContainerLayout);
+    insertTab(Tab_Preferences, pContainerWidget, "");
+    pContainerWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
+
+    for (int i = 0; i < 2; ++i)
+    {
+        QHBoxLayout *pColorLayout = new QHBoxLayout;
+        AssertReturnVoid(pColorLayout);
+        m_pColorLabel[i] = new QLabel(this);
+        m_pColorChangeButton[i] = new QPushButton(this);
+        AssertReturnVoid(m_pColorLabel[i]);
+        AssertReturnVoid(m_pColorChangeButton[i]);
+        pColorLayout->addWidget(m_pColorLabel[i]);
+        pColorLayout->addWidget(m_pColorChangeButton[i]);
+        pColorLayout->addStretch();
+        pContainerLayout->addLayout(pColorLayout);
+        connect(m_pColorChangeButton[i], &QPushButton::pressed,
+                this, &UIVMActivityMonitorPaneContainer::sltColorChangeButtonPressed);
+    }
+    m_pResetButton = new QPushButton(this);
+    AssertReturnVoid(m_pResetButton);
+    m_pResetButton->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);
+    connect(m_pResetButton, &QPushButton::pressed,
+            this, &UIVMActivityMonitorPaneContainer::sltResetToDefaults);
+
+    pContainerLayout->addWidget(m_pResetButton);
+
+    pContainerLayout->addStretch();
+
+    sltRetranslateUI();
+    connect(&translationEventListener(), &UITranslationEventListener::sigRetranslateUI,
+            this, &UIVMActivityMonitorPaneContainer::sltRetranslateUI);
+
+}
+
+void UIVMActivityMonitorPaneContainer::sltRetranslateUI()
+{
+    setTabText(Tab_Preferences, QApplication::translate("UIVMActivityMonitorPaneContainer", "Preferences"));
+
+    if (m_pColorLabel[0])
+        m_pColorLabel[0]->setText(QApplication::translate("UIVMActivityMonitorPaneContainer", "Data Series 1 Color"));
+    if (m_pColorLabel[1])
+        m_pColorLabel[1]->setText(QApplication::translate("UIVMActivityMonitorPaneContainer", "Data Series 2 Color"));
+    if (m_pResetButton)
+        m_pResetButton->setText(QApplication::translate("UIVMActivityMonitorPaneContainer", "Reset to Defaults"));
+
+}
+
+void UIVMActivityMonitorPaneContainer::colorPushButtons(QPushButton *pButton, const QColor &color)
+{
+    AssertReturnVoid(pButton);
+    int iSize = qApp->style()->pixelMetric(QStyle::PM_ButtonIconSize);
+    QPixmap iconPixmap(iSize, iSize);
+    QPainter painter(&iconPixmap);
+    painter.setBrush(color);
+    painter.drawRect(iconPixmap.rect());
+    pButton->setIcon(QIcon(iconPixmap));
+}
+
+void UIVMActivityMonitorPaneContainer::setDataSeriesColor(int iIndex, const QColor &color)
+{
+    if (iIndex == 0 || iIndex == 1)
+    {
+        if (m_color[iIndex] != color)
+        {
+            m_color[iIndex] = color;
+            colorPushButtons(m_pColorChangeButton[iIndex], color);
+            emit sigColorChanged(iIndex, color);
+        }
+    }
+}
+
+QColor UIVMActivityMonitorPaneContainer::dataSeriesColor(int iIndex) const
+{
+    if (iIndex >= 0 && iIndex < 2)
+        return m_color[iIndex];
+    return QColor();
+}
+
+void UIVMActivityMonitorPaneContainer::sltColorChangeButtonPressed()
+{
+    int iIndex = -1;
+    if (sender() == m_pColorChangeButton[0])
+        iIndex = 0;
+    else if (sender() == m_pColorChangeButton[1])
+        iIndex = 1;
+    else
+        return;
+
+    QColorDialog colorDialog(m_color[iIndex], this);
+    if (colorDialog.exec() == QDialog::Rejected)
+        return;
+    QColor newColor = colorDialog.selectedColor();
+    if (m_color[iIndex] == newColor)
+        return;
+    m_color[iIndex] = newColor;
+    colorPushButtons(m_pColorChangeButton[iIndex], newColor);
+    emit sigColorChanged(iIndex, newColor);
+}
+
+void UIVMActivityMonitorPaneContainer::sltResetToDefaults()
+{
+    /* Reset data series colors: */
+    setDataSeriesColor(0, QApplication::palette().color(QPalette::LinkVisited));
+    setDataSeriesColor(1, QApplication::palette().color(QPalette::Link));
+}
+
+/*********************************************************************************************************************************
+*   UIVMActivityMonitorContainer implementation.                                                                            *
+*********************************************************************************************************************************/
+
+UIVMActivityMonitorContainer::UIVMActivityMonitorContainer(QWidget *pParent, UIActionPool *pActionPool, EmbedTo enmEmbedding)
+    :QWidget(pParent)
+    , m_pPaneContainer(0)
+    , m_pTabWidget(0)
+    , m_pExportToFileAction(0)
+    , m_pActionPool(pActionPool)
+    , m_enmEmbedding(enmEmbedding)
+{
+    prepare();
+    loadSettings();
+    sltCurrentTabChanged(0);
+}
+
+void UIVMActivityMonitorContainer::removeTabs(const QVector<QUuid> &machineIdsToRemove)
+{
+    AssertReturnVoid(m_pTabWidget);
+    QVector<UIVMActivityMonitor*> removeList;
+
+    for (int i = m_pTabWidget->count() - 1; i >= 0; --i)
+    {
+        UIVMActivityMonitor *pMonitor = qobject_cast<UIVMActivityMonitor*>(m_pTabWidget->widget(i));
+        if (!pMonitor)
+            continue;
+        if (machineIdsToRemove.contains(pMonitor->machineId()))
+        {
+            removeList << pMonitor;
+            m_pTabWidget->removeTab(i);
+        }
+    }
+    qDeleteAll(removeList.begin(), removeList.end());
+}
+
+void UIVMActivityMonitorContainer::prepare()
+{
+    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    pMainLayout->setContentsMargins(0, 0, 0, 0);
+
+    m_pTabWidget = new QTabWidget(this);
+    m_pTabWidget->setTabPosition(QTabWidget::East);
+    m_pTabWidget->setTabBarAutoHide(true);
+
+    m_pPaneContainer = new UIVMActivityMonitorPaneContainer(this);
+    m_pPaneContainer->hide();
+
+    pMainLayout->addWidget(m_pTabWidget);
+    pMainLayout->addWidget(m_pPaneContainer);
+
+    connect(m_pTabWidget, &QTabWidget::currentChanged,
+            this, &UIVMActivityMonitorContainer::sltCurrentTabChanged);
+    connect(m_pPaneContainer, &UIVMActivityMonitorPaneContainer::sigColorChanged,
+            this, &UIVMActivityMonitorContainer::sltDataSeriesColorChanged);
+    m_pExportToFileAction = m_pActionPool->action(UIActionIndex_M_Activity_S_Export);
+    if (m_pExportToFileAction)
+        connect(m_pExportToFileAction, &QAction::triggered, this, &UIVMActivityMonitorContainer::sltExportToFile);
+
+    if (m_pActionPool->action(UIActionIndex_M_Activity_T_Preferences))
+        connect(m_pActionPool->action(UIActionIndex_M_Activity_T_Preferences), &QAction::toggled,
+                this, &UIVMActivityMonitorContainer::sltTogglePreferencesPane);
+}
+
+void UIVMActivityMonitorContainer::loadSettings()
+{
+    if (m_pPaneContainer)
+    {
+        QStringList colorList = gEDataManager->VMActivityMonitorDataSeriesColors();
+        if (colorList.size() == 2)
+        {
+            for (int i = 0; i < 2; ++i)
+            {
+                QColor color(colorList[i]);
+                if (color.isValid())
+                    m_pPaneContainer->setDataSeriesColor(i, color);
+            }
+        }
+        if (!m_pPaneContainer->dataSeriesColor(0).isValid())
+            m_pPaneContainer->setDataSeriesColor(0, QApplication::palette().color(QPalette::LinkVisited));
+        if (!m_pPaneContainer->dataSeriesColor(1).isValid())
+            m_pPaneContainer->setDataSeriesColor(1, QApplication::palette().color(QPalette::Link));
+    }
+}
+
+void UIVMActivityMonitorContainer::saveSettings()
+{
+    if (m_pPaneContainer)
+    {
+        QStringList colorList;
+        colorList << m_pPaneContainer->dataSeriesColor(0).name(QColor::HexArgb);
+        colorList << m_pPaneContainer->dataSeriesColor(1).name(QColor::HexArgb);
+        gEDataManager->setVMActivityMonitorDataSeriesColors(colorList);
+    }
+}
+
+void UIVMActivityMonitorContainer::sltCurrentTabChanged(int iIndex)
+{
+    AssertReturnVoid(m_pTabWidget);
+    Q_UNUSED(iIndex);
+    UIVMActivityMonitor *pActivityMonitor = qobject_cast<UIVMActivityMonitor*>(m_pTabWidget->currentWidget());
+    if (pActivityMonitor)
+    {
+        CMachine comMachine = gpGlobalSession->virtualBox().FindMachine(pActivityMonitor->machineId().toString());
+        if (!comMachine.isNull())
+        {
+            setExportActionEnabled(comMachine.GetState() == KMachineState_Running);
+        }
+    }
+}
+
+void UIVMActivityMonitorContainer::sltDataSeriesColorChanged(int iIndex, const QColor &color)
+{
+    for (int i = m_pTabWidget->count() - 1; i >= 0; --i)
+    {
+        UIVMActivityMonitor *pMonitor = qobject_cast<UIVMActivityMonitor*>(m_pTabWidget->widget(i));
+        if (!pMonitor)
+            continue;
+        pMonitor->setDataSeriesColor(iIndex, color);
+    }
+    saveSettings();
+}
+
+void UIVMActivityMonitorContainer::setExportActionEnabled(bool fEnabled)
+{
+    if (m_pExportToFileAction)
+        m_pExportToFileAction->setEnabled(fEnabled);
+}
+
+void UIVMActivityMonitorContainer::sltExportToFile()
+{
+    AssertReturnVoid(m_pTabWidget);
+    UIVMActivityMonitor *pActivityMonitor = qobject_cast<UIVMActivityMonitor*>(m_pTabWidget->currentWidget());
+    if (pActivityMonitor)
+        pActivityMonitor->sltExportMetricsToFile();
+}
+
+void UIVMActivityMonitorContainer::addLocalMachine(const CMachine &comMachine)
+{
+    AssertReturnVoid(m_pTabWidget);
+    if (!comMachine.isOk())
+        return;
+    UIVMActivityMonitorLocal *pActivityMonitor = new UIVMActivityMonitorLocal(m_enmEmbedding, this, comMachine);
+    if (m_pPaneContainer)
+    {
+        pActivityMonitor->setDataSeriesColor(0, m_pPaneContainer->dataSeriesColor(0));
+        pActivityMonitor->setDataSeriesColor(1, m_pPaneContainer->dataSeriesColor(1));
+    }
+    m_pTabWidget->addTab(pActivityMonitor, comMachine.GetName());
+}
+
+void UIVMActivityMonitorContainer::addCloudMachine(const CCloudMachine &comMachine)
+{
+    AssertReturnVoid(m_pTabWidget);
+    if (!comMachine.isOk())
+        return;
+    UIVMActivityMonitorCloud *pActivityMonitor = new UIVMActivityMonitorCloud(m_enmEmbedding, this, comMachine);
+    if (m_pPaneContainer)
+    {
+        pActivityMonitor->setDataSeriesColor(0, m_pPaneContainer->dataSeriesColor(0));
+        pActivityMonitor->setDataSeriesColor(1, m_pPaneContainer->dataSeriesColor(1));
+    }
+    m_pTabWidget->addTab(pActivityMonitor, comMachine.GetName());
+}
+
+void UIVMActivityMonitorContainer::sltTogglePreferencesPane(bool fChecked)
+{
+    AssertReturnVoid(m_pPaneContainer);
+    m_pPaneContainer->setVisible(fChecked);
+}
Index: trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityMonitorContainer.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityMonitorContainer.h	(revision 104458)
+++ trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityMonitorContainer.h	(revision 104458)
@@ -0,0 +1,125 @@
+/* $Id$ */
+/** @file
+ * VBox Qt GUI - UIVMActivityMonitorPanel class declaration.
+ */
+
+/*
+ * Copyright (C) 2010-2023 Oracle and/or its affiliates.
+ *
+ * This file is part of VirtualBox base platform packages, as
+ * available from https://www.virtualbox.org.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, in version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <https://www.gnu.org/licenses>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-only
+ */
+
+#ifndef FEQT_INCLUDED_SRC_activity_vmactivity_UIVMActivityMonitorContainer_h
+#define FEQT_INCLUDED_SRC_activity_vmactivity_UIVMActivityMonitorContainer_h
+#ifndef RT_WITHOUT_PRAGMA_ONCE
+# pragma once
+#endif
+
+/* Qt includes: */
+#include <QUuid>
+
+/* GUI includes: */
+#include "UILibraryDefs.h"
+#include "UIPaneContainer.h"
+
+class CCloudMachine;
+class CMachine;
+class QColor;
+class QLabel;
+class QPushButton;
+class QTabWidget;
+class UIActionPool;
+
+/** A pane container class for activity monitor widget. It hosts several controls
+   for activity monitor settings. */
+class SHARED_LIBRARY_STUFF UIVMActivityMonitorPaneContainer : public UIPaneContainer
+{
+
+    Q_OBJECT;
+
+signals:
+
+    void sigColorChanged(int iIndex, const QColor &color);
+
+public:
+
+    UIVMActivityMonitorPaneContainer(QWidget *pParent);
+    void setDataSeriesColor(int iIndex, const QColor &color);
+    QColor dataSeriesColor(int iIndex) const;
+
+private slots:
+
+    void sltRetranslateUI();
+    void sltColorChangeButtonPressed();
+    void sltResetToDefaults();
+
+private:
+    enum Tab
+    {
+        Tab_Preferences = 0
+    };
+
+    void prepare();
+    void colorPushButtons(QPushButton *pButton, const QColor &color);
+    QString m_strTabText;
+
+    QLabel *m_pColorLabel[2];
+    QPushButton *m_pColorChangeButton[2];
+    QPushButton *m_pResetButton;
+
+    QColor m_color[2];
+
+};
+
+/** A QWidget extension to host a tab widget and UIVMActivityMonitorPaneContainer. The tab widget
+ hosts possibly multiple pages of UIVMActivityMonitor. */
+class SHARED_LIBRARY_STUFF UIVMActivityMonitorContainer : public QWidget
+{
+
+    Q_OBJECT;
+
+public:
+
+    UIVMActivityMonitorContainer(QWidget *pParent, UIActionPool *pActionPool, EmbedTo enmEmbedding);
+    void removeTabs(const QVector<QUuid> &machineIdsToRemove);
+    void addLocalMachine(const CMachine &comMachine);
+    void addCloudMachine(const CCloudMachine &comMachine);
+
+private slots:
+
+    void sltCurrentTabChanged(int iIndex);
+    void sltDataSeriesColorChanged(int iIndex, const QColor &color);
+    void sltExportToFile();
+    void sltTogglePreferencesPane(bool fChecked);
+
+private:
+
+    void prepare();
+    void loadSettings();
+    void saveSettings();
+    void setExportActionEnabled(bool fEnabled);
+
+    UIVMActivityMonitorPaneContainer *m_pPaneContainer;
+    QTabWidget *m_pTabWidget;
+    QAction *m_pExportToFileAction;
+    UIActionPool *m_pActionPool;
+    EmbedTo m_enmEmbedding;
+};
+
+#endif /* !FEQT_INCLUDED_SRC_activity_vmactivity_UIVMActivityMonitorContainer_h */
Index: trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityMonitorPaneContainer.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityMonitorPaneContainer.cpp	(revision 104457)
+++ 	(revision )
@@ -1,167 +1,0 @@
-/* $Id$ */
-/** @file
- * VBox Qt GUI - UIVMLogViewer class implementation.
- */
-
-/*
- * Copyright (C) 2010-2023 Oracle and/or its affiliates.
- *
- * This file is part of VirtualBox base platform packages, as
- * available from https://www.virtualbox.org.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation, in version 3 of the
- * License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <https://www.gnu.org/licenses>.
- *
- * SPDX-License-Identifier: GPL-3.0-only
- */
-
-/* Qt includes: */
-#include <QApplication>
-#include <QColor>
-#include <QColorDialog>
-#include <QHBoxLayout>
-#include <QLabel>
-#include <QPainter>
-#include <QPixmap>
-#include <QPlainTextEdit>
-#include <QPushButton>
-#include <QStyle>
-
-/* GUI includes: */
-#include "UITranslationEventListener.h"
-#include "UIVMActivityMonitorPaneContainer.h"
-
-/* Other includes: */
-#include "iprt/assert.h"
-
-UIVMActivityMonitorPaneContainer::UIVMActivityMonitorPaneContainer(QWidget *pParent,
-                                                                   EmbedTo enmEmbedTo /* = EmbedTo_Stack */)
-    : UIPaneContainer(pParent, enmEmbedTo, false /* detach not allowed */)
-    , m_pColorLabel{0, 0}
-    , m_pColorChangeButton{0, 0}
-    , m_pResetButton(0)
-{
-    setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
-    prepare();
-}
-
-void UIVMActivityMonitorPaneContainer::prepare()
-{
-    QWidget *pContainerWidget = new QWidget(this);
-    QVBoxLayout *pContainerLayout = new QVBoxLayout(pContainerWidget);
-    AssertReturnVoid(pContainerWidget);
-    AssertReturnVoid(pContainerLayout);
-    insertTab(Tab_Preferences, pContainerWidget, "");
-    pContainerWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
-
-    for (int i = 0; i < 2; ++i)
-    {
-        QHBoxLayout *pColorLayout = new QHBoxLayout;
-        AssertReturnVoid(pColorLayout);
-        m_pColorLabel[i] = new QLabel(this);
-        m_pColorChangeButton[i] = new QPushButton(this);
-        AssertReturnVoid(m_pColorLabel[i]);
-        AssertReturnVoid(m_pColorChangeButton[i]);
-        pColorLayout->addWidget(m_pColorLabel[i]);
-        pColorLayout->addWidget(m_pColorChangeButton[i]);
-        pColorLayout->addStretch();
-        pContainerLayout->addLayout(pColorLayout);
-        connect(m_pColorChangeButton[i], &QPushButton::pressed,
-                this, &UIVMActivityMonitorPaneContainer::sltColorChangeButtonPressed);
-    }
-    m_pResetButton = new QPushButton(this);
-    AssertReturnVoid(m_pResetButton);
-    m_pResetButton->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);
-    connect(m_pResetButton, &QPushButton::pressed,
-            this, &UIVMActivityMonitorPaneContainer::sltResetToDefaults);
-
-    pContainerLayout->addWidget(m_pResetButton);
-
-    pContainerLayout->addStretch();
-
-    sltRetranslateUI();
-    connect(&translationEventListener(), &UITranslationEventListener::sigRetranslateUI,
-            this, &UIVMActivityMonitorPaneContainer::sltRetranslateUI);
-}
-
-void UIVMActivityMonitorPaneContainer::sltRetranslateUI()
-{
-    setTabText(Tab_Preferences, QApplication::translate("UIVMActivityMonitorPaneContainer", "Preferences"));
-
-    if (m_pColorLabel[0])
-        m_pColorLabel[0]->setText(QApplication::translate("UIVMActivityMonitorPaneContainer", "Data Series 1 Color"));
-    if (m_pColorLabel[1])
-        m_pColorLabel[1]->setText(QApplication::translate("UIVMActivityMonitorPaneContainer", "Data Series 2 Color"));
-    if (m_pResetButton)
-        m_pResetButton->setText(QApplication::translate("UIVMActivityMonitorPaneContainer", "Reset to Defaults"));
-
-}
-
-void UIVMActivityMonitorPaneContainer::colorPushButtons(QPushButton *pButton, const QColor &color)
-{
-    AssertReturnVoid(pButton);
-    int iSize = qApp->style()->pixelMetric(QStyle::PM_ButtonIconSize);
-    QPixmap iconPixmap(iSize, iSize);
-    QPainter painter(&iconPixmap);
-    painter.setBrush(color);
-    painter.drawRect(iconPixmap.rect());
-    pButton->setIcon(QIcon(iconPixmap));
-}
-
-void UIVMActivityMonitorPaneContainer::setDataSeriesColor(int iIndex, const QColor &color)
-{
-    if (iIndex == 0 || iIndex == 1)
-    {
-        if (m_color[iIndex] != color)
-        {
-            m_color[iIndex] = color;
-            colorPushButtons(m_pColorChangeButton[iIndex], color);
-            emit sigColorChanged(iIndex, color);
-        }
-    }
-}
-
-QColor UIVMActivityMonitorPaneContainer::dataSeriesColor(int iIndex) const
-{
-    if (iIndex >= 0 && iIndex < 2)
-        return m_color[iIndex];
-    return QColor();
-}
-
-void UIVMActivityMonitorPaneContainer::sltColorChangeButtonPressed()
-{
-    int iIndex = -1;
-    if (sender() == m_pColorChangeButton[0])
-        iIndex = 0;
-    else if (sender() == m_pColorChangeButton[1])
-        iIndex = 1;
-    else
-        return;
-
-    QColorDialog colorDialog(m_color[iIndex], this);
-    if (colorDialog.exec() == QDialog::Rejected)
-        return;
-    QColor newColor = colorDialog.selectedColor();
-    if (m_color[iIndex] == newColor)
-        return;
-    m_color[iIndex] = newColor;
-    colorPushButtons(m_pColorChangeButton[iIndex], newColor);
-    emit sigColorChanged(iIndex, newColor);
-}
-
-void UIVMActivityMonitorPaneContainer::sltResetToDefaults()
-{
-    /* Reset data series colors: */
-    setDataSeriesColor(0, QApplication::palette().color(QPalette::LinkVisited));
-    setDataSeriesColor(1, QApplication::palette().color(QPalette::Link));
-}
Index: trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityMonitorPaneContainer.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityMonitorPaneContainer.h	(revision 104457)
+++ 	(revision )
@@ -1,84 +1,0 @@
-/* $Id$ */
-/** @file
- * VBox Qt GUI - UIVMActivityMonitorPanel class declaration.
- */
-
-/*
- * Copyright (C) 2010-2023 Oracle and/or its affiliates.
- *
- * This file is part of VirtualBox base platform packages, as
- * available from https://www.virtualbox.org.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation, in version 3 of the
- * License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <https://www.gnu.org/licenses>.
- *
- * SPDX-License-Identifier: GPL-3.0-only
- */
-
-#ifndef FEQT_INCLUDED_SRC_activity_vmactivity_UIVMActivityMonitorPaneContainer_h
-#define FEQT_INCLUDED_SRC_activity_vmactivity_UIVMActivityMonitorPaneContainer_h
-#ifndef RT_WITHOUT_PRAGMA_ONCE
-# pragma once
-#endif
-
-/* GUI includes: */
-#include "UILibraryDefs.h"
-#include "UIPaneContainer.h"
-
-class QColor;
-class QLabel;
-class QPushButton;
-
-class SHARED_LIBRARY_STUFF UIVMActivityMonitorPaneContainer : public UIPaneContainer
-{
-
-    Q_OBJECT;
-
-signals:
-
-    void sigColorChanged(int iIndex, const QColor &color);
-
-public:
-
-    UIVMActivityMonitorPaneContainer(QWidget *pParent, EmbedTo enmEmbedTo = EmbedTo_Stack);
-    void setDataSeriesColor(int iIndex, const QColor &color);
-    QColor dataSeriesColor(int iIndex) const;
-
-private slots:
-
-    void sltRetranslateUI();
-    void sltColorChangeButtonPressed();
-    void sltResetToDefaults();
-
-private:
-    enum Tab
-    {
-        Tab_Preferences = 0
-    };
-
-    void prepare();
-    void colorPushButtons(QPushButton *pButton, const QColor &color);
-    QString m_strTabText;
-
-    QLabel *m_pColorLabel[2];
-    QPushButton *m_pColorChangeButton[2];
-    QPushButton *m_pResetButton;
-
-    QColor m_color[2];
-
-};
-
-
-
-
-#endif /* !FEQT_INCLUDED_SRC_activity_vmactivity_UIVMActivityMonitorPaneContainer_h */
Index: trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityToolWidget.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityToolWidget.cpp	(revision 104457)
+++ trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityToolWidget.cpp	(revision 104458)
@@ -30,11 +30,8 @@
 #include <QVBoxLayout>
 #include <QStyle>
-#include <QTabWidget>
 
 /* GUI includes: */
 #include "QIToolBar.h"
 #include "UIActionPoolManager.h"
-#include "UIExtraDataManager.h"
-#include "UIGlobalSession.h"
 #include "UIVMActivityMonitor.h"
 #include "UIVMActivityToolWidget.h"
@@ -43,5 +40,5 @@
 #include "UIVirtualMachineItemCloud.h"
 #include "UIVirtualMachineItemLocal.h"
-#include "UIVMActivityMonitorPaneContainer.h"
+#include "UIVMActivityMonitorContainer.h"
 #ifdef VBOX_WS_MAC
 # include "UIWindowMenuManager.h"
@@ -49,7 +46,5 @@
 
 /* COM includes: */
-#include "assert.h"
 #include "CMachine.h"
-
 
 UIVMActivityToolWidget::UIVMActivityToolWidget(EmbedTo enmEmbedding, UIActionPool *pActionPool,
@@ -60,46 +55,11 @@
     , m_fShowToolbar(fShowToolbar)
     , m_pToolBar(0)
-    , m_pExportToFileAction(0)
-    , m_pPaneContainer(0)
-    , m_pTabWidget(0)
+    , m_pMonitorContainer(0)
 {
     prepare();
-    loadSettings();
     prepareActions();
     prepareToolBar();
-    sltCurrentTabChanged(0);
 }
 
-void UIVMActivityToolWidget::loadSettings()
-{
-    if (m_pPaneContainer)
-    {
-        QStringList colorList = gEDataManager->VMActivityMonitorDataSeriesColors();
-        if (colorList.size() == 2)
-        {
-            for (int i = 0; i < 2; ++i)
-            {
-                QColor color(colorList[i]);
-                if (color.isValid())
-                    m_pPaneContainer->setDataSeriesColor(i, color);
-            }
-        }
-        if (!m_pPaneContainer->dataSeriesColor(0).isValid())
-            m_pPaneContainer->setDataSeriesColor(0, QApplication::palette().color(QPalette::LinkVisited));
-        if (!m_pPaneContainer->dataSeriesColor(1).isValid())
-            m_pPaneContainer->setDataSeriesColor(1, QApplication::palette().color(QPalette::Link));
-    }
-}
-
-void UIVMActivityToolWidget::saveSettings()
-{
-    if (m_pPaneContainer)
-    {
-        QStringList colorList;
-        colorList << m_pPaneContainer->dataSeriesColor(0).name(QColor::HexArgb);
-        colorList << m_pPaneContainer->dataSeriesColor(1).name(QColor::HexArgb);
-        gEDataManager->setVMActivityMonitorDataSeriesColors(colorList);
-    }
-}
 
 QMenu *UIVMActivityToolWidget::menu() const
@@ -121,19 +81,7 @@
 {
     QVBoxLayout *pMainLayout = new QVBoxLayout(this);
-
-    m_pTabWidget = new QTabWidget(this);
-    m_pTabWidget->setTabPosition(QTabWidget::East);
-    m_pTabWidget->setTabBarAutoHide(true);
-
-    pMainLayout->addWidget(m_pTabWidget);
-
-
-    m_pPaneContainer = new UIVMActivityMonitorPaneContainer(this, m_enmEmbedding);
-    m_pPaneContainer->hide();
-    pMainLayout->addWidget(m_pPaneContainer);
-    connect(m_pTabWidget, &QTabWidget::currentChanged,
-            this, &UIVMActivityToolWidget::sltCurrentTabChanged);
-    connect(m_pPaneContainer, &UIVMActivityMonitorPaneContainer::sigColorChanged,
-            this, &UIVMActivityToolWidget::sltDataSeriesColorChanged);
+    pMainLayout->setContentsMargins(0, 0, 0, 0);
+    m_pMonitorContainer = new UIVMActivityMonitorContainer(this, m_pActionPool, m_enmEmbedding);
+    pMainLayout->addWidget(m_pMonitorContainer);
 }
 
@@ -167,5 +115,5 @@
     m_machineIds = machineIds;
 
-    removeTabs(unselectedMachines);
+    m_pMonitorContainer->removeTabs(unselectedMachines);
     addTabs(newSelections);
 }
@@ -177,12 +125,4 @@
     if (pToResourcesAction)
         connect(pToResourcesAction, &QAction::triggered, this, &UIVMActivityToolWidget::sigSwitchToActivityOverviewPane);
-
-    m_pExportToFileAction =
-        m_pActionPool->action(UIActionIndex_M_Activity_S_Export);
-    if (m_pExportToFileAction)
-        connect(m_pExportToFileAction, &QAction::triggered, this, &UIVMActivityToolWidget::sltExportToFile);
-    if (m_pActionPool->action(UIActionIndex_M_Activity_T_Preferences))
-        connect(m_pActionPool->action(UIActionIndex_M_Activity_T_Preferences), &QAction::toggled,
-                this, &UIVMActivityToolWidget::sltTogglePreferencesPane);
 }
 
@@ -212,26 +152,7 @@
 }
 
-void UIVMActivityToolWidget::removeTabs(const QVector<QUuid> &machineIdsToRemove)
-{
-    AssertReturnVoid(m_pTabWidget);
-    QVector<UIVMActivityMonitor*> removeList;
-
-    for (int i = m_pTabWidget->count() - 1; i >= 0; --i)
-    {
-        UIVMActivityMonitor *pMonitor = qobject_cast<UIVMActivityMonitor*>(m_pTabWidget->widget(i));
-        if (!pMonitor)
-            continue;
-        if (machineIdsToRemove.contains(pMonitor->machineId()))
-        {
-            removeList << pMonitor;
-            m_pTabWidget->removeTab(i);
-        }
-    }
-    qDeleteAll(removeList.begin(), removeList.end());
-}
-
 void UIVMActivityToolWidget::addTabs(const QList<UIVirtualMachineItem*> &machines)
 {
-    AssertReturnVoid(m_pTabWidget);
+    AssertReturnVoid(m_pMonitorContainer);
     foreach (UIVirtualMachineItem* pMachine, machines)
     {
@@ -241,11 +162,7 @@
         {
             CMachine comMachine = pMachine->toLocal()->machine();
-            UIVMActivityMonitorLocal *pActivityMonitor = new UIVMActivityMonitorLocal(m_enmEmbedding, this, comMachine);
-            if (m_pPaneContainer)
-            {
-                pActivityMonitor->setDataSeriesColor(0, m_pPaneContainer->dataSeriesColor(0));
-                pActivityMonitor->setDataSeriesColor(1, m_pPaneContainer->dataSeriesColor(1));
-            }
-            m_pTabWidget->addTab(pActivityMonitor, comMachine.GetName());
+            if (!comMachine.isOk())
+                continue;
+            m_pMonitorContainer->addLocalMachine(comMachine);
             continue;
         }
@@ -255,60 +172,7 @@
             if (!comMachine.isOk())
                 continue;
-            UIVMActivityMonitorCloud *pActivityMonitor = new UIVMActivityMonitorCloud(m_enmEmbedding, this, comMachine);
-            if (m_pPaneContainer)
-            {
-                pActivityMonitor->setDataSeriesColor(0, m_pPaneContainer->dataSeriesColor(0));
-                pActivityMonitor->setDataSeriesColor(1, m_pPaneContainer->dataSeriesColor(1));
-            }
-             m_pTabWidget->addTab(pActivityMonitor, comMachine.GetName());
+            m_pMonitorContainer->addCloudMachine(comMachine);
             continue;
         }
     }
 }
-
-void UIVMActivityToolWidget::sltExportToFile()
-{
-    AssertReturnVoid(m_pTabWidget);
-    UIVMActivityMonitor *pActivityMonitor = qobject_cast<UIVMActivityMonitor*>(m_pTabWidget->currentWidget());
-    if (pActivityMonitor)
-        pActivityMonitor->sltExportMetricsToFile();
-}
-
-void UIVMActivityToolWidget::sltCurrentTabChanged(int iIndex)
-{
-    AssertReturnVoid(m_pTabWidget);
-    Q_UNUSED(iIndex);
-    UIVMActivityMonitor *pActivityMonitor = qobject_cast<UIVMActivityMonitor*>(m_pTabWidget->currentWidget());
-    if (pActivityMonitor)
-    {
-        CMachine comMachine = gpGlobalSession->virtualBox().FindMachine(pActivityMonitor->machineId().toString());
-        if (!comMachine.isNull())
-        {
-            setExportActionEnabled(comMachine.GetState() == KMachineState_Running);
-        }
-    }
-}
-
-void UIVMActivityToolWidget::sltTogglePreferencesPane(bool fChecked)
-{
-    AssertReturnVoid(m_pPaneContainer);
-    m_pPaneContainer->setVisible(fChecked);
-}
-
-void UIVMActivityToolWidget::sltDataSeriesColorChanged(int iIndex, const QColor &color)
-{
-    for (int i = m_pTabWidget->count() - 1; i >= 0; --i)
-    {
-        UIVMActivityMonitor *pMonitor = qobject_cast<UIVMActivityMonitor*>(m_pTabWidget->widget(i));
-        if (!pMonitor)
-            continue;
-        pMonitor->setDataSeriesColor(iIndex, color);
-    }
-    saveSettings();
-}
-
-void UIVMActivityToolWidget::setExportActionEnabled(bool fEnabled)
-{
-    if (m_pExportToFileAction)
-        m_pExportToFileAction->setEnabled(fEnabled);
-}
Index: trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityToolWidget.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityToolWidget.h	(revision 104457)
+++ trunk/src/VBox/Frontends/VirtualBox/src/activity/vmactivity/UIVMActivityToolWidget.h	(revision 104458)
@@ -41,11 +41,8 @@
 
 /* Forward declarations: */
-class CMachine;
 class QIToolBar;
-class QTabWidget;
 class UIActionPool;
 class UIVirtualMachineItem;
-class UIVMActivityMonitorPaneContainer;
-
+class UIVMActivityMonitorContainer;
 
 /** QTabWidget extension host machine activity widget(s) in the Manager UI. */
@@ -73,15 +70,6 @@
 #endif
 
-private slots:
-
-    void sltExportToFile();
-    void sltCurrentTabChanged(int iIndex);
-    void sltTogglePreferencesPane(bool fChecked);
-    void sltDataSeriesColorChanged(int iIndex, const QColor &color);
-
 private:
 
-    void loadSettings();
-    void saveSettings();
     void setMachines(const QList<UIVirtualMachineItem*> &machines);
     /** @name Prepare/cleanup cascade.
@@ -93,6 +81,4 @@
     /** @} */
 
-    /** Remove tabs conaining machine monitors with ids @machineIdsToRemove. */
-    void removeTabs(const QVector<QUuid> &machineIdsToRemove);
     /** Add new tabs for each QUuid in @machineIdsToAdd. Does not check for duplicates. */
     void addTabs(const QList<UIVirtualMachineItem*> &machines);
@@ -107,12 +93,8 @@
 
     QIToolBar *m_pToolBar;
-
     /** Indicates if this widget's host tool is current tool. */
     bool    m_fIsCurrentTool;
     QVector<QUuid> m_machineIds;
-    QAction *m_pExportToFileAction;
-    UIVMActivityMonitorPaneContainer *m_pPaneContainer;
-    QTabWidget *m_pTabWidget;
-    //QColor m_dataSeriesColor[2];
+    UIVMActivityMonitorContainer *m_pMonitorContainer;
 };
 
