Index: /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk	(revision 68151)
+++ /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk	(revision 68152)
@@ -445,4 +445,5 @@
 	src/widgets/UIPortForwardingTable.h \
 	src/widgets/UIProgressDialog.h \
+	src/widgets/UISlidingWidget.h \
 	src/widgets/UISpacerWidgets.h \
 	src/widgets/UISpecialControls.h \
@@ -761,4 +762,5 @@
 	src/widgets/UIPortForwardingTable.cpp \
 	src/widgets/UIProgressDialog.cpp \
+	src/widgets/UISlidingWidget.cpp \
 	src/widgets/UISpecialControls.cpp \
 	src/widgets/UITabBar.cpp \
Index: /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UISlidingWidget.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UISlidingWidget.cpp	(revision 68152)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UISlidingWidget.cpp	(revision 68152)
@@ -0,0 +1,138 @@
+/* $Id$ */
+/** @file
+ * VBox Qt GUI - UISlidingWidget class implementation.
+ */
+
+/*
+ * Copyright (C) 2017 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 <QHBoxLayout>
+
+/* GUI includes: */
+#include "UISlidingWidget.h"
+#include "UIAnimationFramework.h"
+
+
+UISlidingWidget::UISlidingWidget(QWidget *pParent /* = 0 */)
+    : QWidget(pParent)
+    , m_fStateIsFinal(false)
+    , m_pAnimation(0)
+    , m_pWidget(0)
+    , m_pLayout(0)
+    , m_pWidget1(0)
+    , m_pWidget2(0)
+{
+    /* Prepare: */
+    prepare();
+}
+
+QSize UISlidingWidget::minimumSizeHint() const
+{
+    /* Return maximum of minimum size-hints: */
+    QSize msh = QSize();
+    if (m_pWidget1)
+        msh = msh.expandedTo(m_pWidget1->minimumSizeHint());
+    if (m_pWidget2)
+        msh = msh.expandedTo(m_pWidget2->minimumSizeHint());
+    return msh;
+}
+
+void UISlidingWidget::setWidgets(QWidget *pWidget1, QWidget *pWidget2)
+{
+    /* Clear animation/widgets if any: */
+    delete m_pAnimation;
+    delete m_pWidget1;
+    delete m_pWidget2;
+
+    /* Remember widgets: */
+    m_pWidget1 = pWidget1;
+    m_pWidget2 = pWidget2;
+    m_pLayout->addWidget(m_pWidget1);
+    m_pLayout->addWidget(m_pWidget2);
+
+    /* Install new animation: */
+    m_pAnimation = UIAnimation::installPropertyAnimation(this,
+                                                         "widgetGeometry",
+                                                         "startWidgetGeometry", "finalWidgetGeometry",
+                                                         SIGNAL(sigForward()), SIGNAL(sigBackward()));
+    connect(m_pAnimation, &UIAnimation::sigStateEnteredStart, this, &UISlidingWidget::sltSetStateToStart);
+    connect(m_pAnimation, &UIAnimation::sigStateEnteredFinal, this, &UISlidingWidget::sltSetStateToFinal);
+
+    /* Update animation: */
+    updateAnimation();
+    /* Update widget geometry: */
+    m_pWidget->setGeometry(m_fStateIsFinal ? m_finalWidgetGeometry : m_startWidgetGeometry);
+}
+
+void UISlidingWidget::resizeEvent(QResizeEvent *pEvent)
+{
+    /* Call to base-class: */
+    QWidget::resizeEvent(pEvent);
+
+    /* Update animation: */
+    updateAnimation();
+    /* Update widget geometry: */
+    m_pWidget->setGeometry(m_fStateIsFinal ? m_finalWidgetGeometry : m_startWidgetGeometry);
+
+    // TODO: Make this properly, dirty hack.
+    /* A bit expensive but.. */
+    updateGeometry();
+}
+
+void UISlidingWidget::prepare()
+{
+    /* Create private sliding widget: */
+    m_pWidget = new QWidget(this);
+    if (m_pWidget)
+    {
+        /* Create layout: */
+        m_pLayout = new QHBoxLayout(m_pWidget);
+        if (m_pLayout)
+        {
+            /* Configure layout: */
+            m_pLayout->setSpacing(0);
+            m_pLayout->setContentsMargins(0, 0, 0, 0);
+        }
+    }
+
+    /* Update animation: */
+    updateAnimation();
+    /* Update widget geometry: */
+    m_pWidget->setGeometry(m_fStateIsFinal ? m_finalWidgetGeometry : m_startWidgetGeometry);
+}
+
+void UISlidingWidget::updateAnimation()
+{
+    /* Recalculate sub-window geometry animation boundaries based on size-hint: */
+    m_startWidgetGeometry = QRect(  0,           0,
+                                    2 * width(), height());
+    m_finalWidgetGeometry = QRect(- width(),     0,
+                                    2 * width(), height());
+
+    /* Update animation finally: */
+    if (m_pAnimation)
+        m_pAnimation->update();
+}
+
+void UISlidingWidget::setWidgetGeometry(const QRect &rect)
+{
+    /* Apply widget geometry: */
+    m_pWidget->setGeometry(rect);
+}
+
+QRect UISlidingWidget::widgetGeometry() const
+{
+    /* Return widget geometry: */
+    return m_pWidget->geometry();
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UISlidingWidget.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UISlidingWidget.h	(revision 68152)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UISlidingWidget.h	(revision 68152)
@@ -0,0 +1,111 @@
+/* $Id$ */
+/** @file
+ * VBox Qt GUI - UISlidingWidget class declaration.
+ */
+
+/*
+ * Copyright (C) 2017 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 ___UISlidingWidget_h___
+#define ___UISlidingWidget_h___
+
+/* Qt includes: */
+#include <QWidget>
+
+/* Forward declarations: */
+class QHBoxLayout;
+class QWidget;
+class UIAnimation;
+
+
+/** Some kind of splitter which allows to switch between
+  * two widgets using horizontal sliding animation. */
+class UISlidingWidget : public QWidget
+{
+    Q_OBJECT;
+    Q_PROPERTY(QRect widgetGeometry READ widgetGeometry WRITE setWidgetGeometry);
+    Q_PROPERTY(QRect startWidgetGeometry READ startWidgetGeometry);
+    Q_PROPERTY(QRect finalWidgetGeometry READ finalWidgetGeometry);
+
+signals:
+
+    /** Commands to move animation forward. */
+    void sigForward();
+    /** Commands to move animation backward. */
+    void sigBackward();
+
+public:
+
+    /** Constructs sliding widget passing @a pParent to the base-class. */
+    UISlidingWidget(QWidget *pParent = 0);
+
+    /** Holds the minimum widget size. */
+    virtual QSize minimumSizeHint() const /* pverride */;
+
+    /** Defines @a pWidget1 and @a pWidget2. */
+    void setWidgets(QWidget *pWidget1, QWidget *pWidget2);
+
+    /** Moves animation forward. */
+    void moveForward() { emit sigForward(); }
+    /** Moves animation backward. */
+    void moveBackward() { emit sigBackward(); }
+
+protected:
+
+    /** Handles resize @a pEvent. */
+    virtual void resizeEvent(QResizeEvent *pEvent) /* override */;
+
+private slots:
+
+    /** Marks state as start. */
+    void sltSetStateToStart() { m_fStateIsFinal = false; }
+    /** Marks state as final. */
+    void sltSetStateToFinal() { m_fStateIsFinal = true; }
+
+private:
+
+    /** Prepares all. */
+    void prepare();
+
+    /** Updates animation. */
+    void updateAnimation();
+
+    /** Defines sub-window geometry. */
+    void setWidgetGeometry(const QRect &rect);
+    /** Returns sub-window geometry. */
+    QRect widgetGeometry() const;
+    /** Returns sub-window start-geometry. */
+    QRect startWidgetGeometry() const { return m_startWidgetGeometry; }
+    /** Returns sub-window final-geometry. */
+    QRect finalWidgetGeometry() const { return m_finalWidgetGeometry; }
+
+    /** Holds whether we are in animation final state. */
+    bool         m_fStateIsFinal;
+    /** Holds the shift left/right animation instance. */
+    UIAnimation *m_pAnimation;
+    /** Holds sub-window start-geometry. */
+    QRect        m_startWidgetGeometry;
+    /** Holds sub-window final-geometry. */
+    QRect        m_finalWidgetGeometry;
+
+    /** Holds the private sliding widget instance. */
+    QWidget     *m_pWidget;
+    /** Holds the widget layout instance. */
+    QHBoxLayout *m_pLayout;
+    /** Holds the 1st widget reference. */
+    QWidget     *m_pWidget1;
+    /** Holds the 2nd widget reference. */
+    QWidget     *m_pWidget2;
+};
+
+#endif /* !___UISlidingWidget_h___ */
+
