Index: /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk	(revision 78566)
+++ /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk	(revision 78567)
@@ -310,4 +310,5 @@
 	./src/settings/global \
 	./src/settings/machine \
+	./src/softkeyboard \
 	./src/snapshots \
 	./src/widgets \
@@ -747,4 +748,6 @@
 	src/runtime/seamless/UIMachineViewSeamless.h \
 	src/runtime/seamless/UIMachineWindowSeamless.h \
+	src/softkeyboard/UISoftKeyboard.h \
+	src/softkeyboard/UISoftKeyboardDialog.h \
 	src/widgets/UIMiniToolBar.h \
 	src/wizards/firstrun/UIWizardFirstRun.h \
@@ -961,4 +964,5 @@
 	src/guestctrl/UIFileManagerHostTable.cpp \
 	src/guestctrl/UIGuestProcessControlWidget.cpp \
+	src/softkeyboard/UISoftKeyboard.cpp \
 	src/widgets/UIMiniToolBar.cpp
 
@@ -1198,4 +1202,6 @@
 	src/runtime/seamless/UIMachineViewSeamless.cpp \
 	src/runtime/seamless/UIMachineWindowSeamless.cpp \
+	src/softkeyboard/UISoftKeyboard.cpp \
+	src/softkeyboard/UISoftKeyboardDialog.cpp \
 	src/widgets/UIMiniToolBar.cpp \
 	src/wizards/firstrun/UIWizardFirstRun.cpp \
@@ -1521,4 +1527,6 @@
 VBoxGlobal_SOURCES          += VirtualBox2_x4.qrc
 VirtualBox2_x4.qrc_RCCFLAGS  = -name BASIC2_X4
+VBoxGlobal_SOURCES          += VirtualBox_xml.qrc
+VirtualBox_xml.qrc_RCCFLAGS  = -name BASIC_XML
 VBoxGlobal_SOURCES += $(VBOX_VIRTUALBOX_OUT_DIR)/VirtualBoxBrand.qrc
 $(VBOX_VIRTUALBOX_OUT_DIR)/VirtualBoxBrand.qrc_RCCFLAGS = -name BRAND
Index: /trunk/src/VBox/Frontends/VirtualBox/VirtualBox_xml.qrc
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/VirtualBox_xml.qrc	(revision 78567)
+++ /trunk/src/VBox/Frontends/VirtualBox/VirtualBox_xml.qrc	(revision 78567)
@@ -0,0 +1,5 @@
+<RCC>
+    <qresource suffix="/">
+        <file alias="us_layout.xml">xml/us_layout.xml</file>
+    </qresource>
+</RCC>
Index: /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.h	(revision 78566)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.h	(revision 78567)
@@ -569,15 +569,16 @@
         RuntimeMenuInputActionType_Keyboard           = RT_BIT(0),
         RuntimeMenuInputActionType_KeyboardSettings   = RT_BIT(1),
-        RuntimeMenuInputActionType_TypeCAD            = RT_BIT(2),
+        RuntimeMenuInputActionType_SoftKeyboard       = RT_BIT(2),
+        RuntimeMenuInputActionType_TypeCAD            = RT_BIT(3),
 #ifdef VBOX_WS_X11
-        RuntimeMenuInputActionType_TypeCABS           = RT_BIT(3),
-#endif
-        RuntimeMenuInputActionType_TypeCtrlBreak      = RT_BIT(4),
-        RuntimeMenuInputActionType_TypeInsert         = RT_BIT(5),
-        RuntimeMenuInputActionType_TypePrintScreen    = RT_BIT(6),
-        RuntimeMenuInputActionType_TypeAltPrintScreen = RT_BIT(7),
-        RuntimeMenuInputActionType_Mouse              = RT_BIT(8),
-        RuntimeMenuInputActionType_MouseIntegration   = RT_BIT(9),
-        RuntimeMenuInputActionType_TypeHostKeyCombo   = RT_BIT(10),
+        RuntimeMenuInputActionType_TypeCABS           = RT_BIT(4),
+#endif
+        RuntimeMenuInputActionType_TypeCtrlBreak      = RT_BIT(5),
+        RuntimeMenuInputActionType_TypeInsert         = RT_BIT(6),
+        RuntimeMenuInputActionType_TypePrintScreen    = RT_BIT(7),
+        RuntimeMenuInputActionType_TypeAltPrintScreen = RT_BIT(8),
+        RuntimeMenuInputActionType_Mouse              = RT_BIT(9),
+        RuntimeMenuInputActionType_MouseIntegration   = RT_BIT(10),
+        RuntimeMenuInputActionType_TypeHostKeyCombo   = RT_BIT(11),
         RuntimeMenuInputActionType_All                = 0xFFFF
     };
Index: /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIActionPoolRuntime.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIActionPoolRuntime.cpp	(revision 78566)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIActionPoolRuntime.cpp	(revision 78567)
@@ -1541,4 +1541,48 @@
         setName(QApplication::translate("UIActionPool", "&Keyboard Settings..."));
         setStatusTip(QApplication::translate("UIActionPool", "Display global preferences window to configure keyboard shortcuts"));
+    }
+};
+
+/** Simple action extension, used as 'Show Soft Keyboard' action class. */
+class UIActionSimpleRuntimeShowSoftKeyboard : public UIActionSimple
+{
+    Q_OBJECT;
+
+public:
+
+    /** Constructs action passing @a pParent to the base-class. */
+    UIActionSimpleRuntimeShowSoftKeyboard(UIActionPool *pParent)
+        : UIActionSimple(pParent, ":/keyboard_settings_16px.png", ":/keyboard_settings_disabled_16px.png", true)
+    {}
+
+protected:
+
+    /** Returns action extra-data ID. */
+    virtual int extraDataID() const /* override */
+    {
+        return UIExtraDataMetaDefs::RuntimeMenuInputActionType_SoftKeyboard;
+    }
+    /** Returns action extra-data key. */
+    virtual QString extraDataKey() const /* override */
+    {
+        return gpConverter->toInternalString(UIExtraDataMetaDefs::RuntimeMenuInputActionType_SoftKeyboard);
+    }
+    /** Returns whether action is allowed. */
+    virtual bool isAllowed() const /* override */
+    {
+        return actionPool()->toRuntime()->isAllowedInMenuInput(UIExtraDataMetaDefs::RuntimeMenuInputActionType_SoftKeyboard);
+    }
+
+    /** Returns shortcut extra-data ID. */
+    virtual QString shortcutExtraDataID() const /* override */
+    {
+        return QString("SoftKeyboard");
+    }
+
+    /** Handles translation event. */
+    virtual void retranslateUi() /* override */
+    {
+        setName(QApplication::translate("UIActionPool", "&Soft Keyboard..."));
+        setStatusTip(QApplication::translate("UIActionPool", "Display soft keyboard"));
     }
 };
@@ -3346,4 +3390,5 @@
     m_pool[UIActionIndexRT_M_Input_M_Keyboard] = new UIActionMenuRuntimeKeyboard(this);
     m_pool[UIActionIndexRT_M_Input_M_Keyboard_S_Settings] = new UIActionSimpleRuntimeShowKeyboardSettings(this);
+    m_pool[UIActionIndexRT_M_Input_M_Keyboard_S_SoftKeyboard] = new UIActionSimpleRuntimeShowSoftKeyboard(this);
     m_pool[UIActionIndexRT_M_Input_M_Keyboard_S_TypeCAD] = new UIActionSimpleRuntimePerformTypeCAD(this);
 #ifdef VBOX_WS_X11
@@ -4083,5 +4128,6 @@
     /* 'Keyboard Settings' action: */
     fSeparator = addAction(pMenu, action(UIActionIndexRT_M_Input_M_Keyboard_S_Settings)) || fSeparator;
-
+    /* 'Soft Keyboard' action: */
+    fSeparator = addAction(pMenu, action(UIActionIndexRT_M_Input_M_Keyboard_S_SoftKeyboard)) || fSeparator;
     /* Separator: */
     if (fSeparator)
Index: /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIActionPoolRuntime.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIActionPoolRuntime.h	(revision 78566)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIActionPoolRuntime.h	(revision 78567)
@@ -83,4 +83,5 @@
     UIActionIndexRT_M_Input_M_Keyboard,
     UIActionIndexRT_M_Input_M_Keyboard_S_Settings,
+    UIActionIndexRT_M_Input_M_Keyboard_S_SoftKeyboard,
     UIActionIndexRT_M_Input_M_Keyboard_S_TypeCAD,
 #ifdef VBOX_WS_X11
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp	(revision 78566)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp	(revision 78567)
@@ -64,4 +64,5 @@
 #include "UIFileManagerDialog.h"
 #include "UIGuestProcessControlDialog.h"
+#include "UISoftKeyboardDialog.h"
 #ifdef VBOX_WS_MAC
 # include "DockIconPreview.h"
@@ -849,4 +850,5 @@
     , m_pFileManagerDialog(0)
     , m_pProcessControlDialog(0)
+    , m_pSoftKeyboardDialog(0)
 {
 }
@@ -1055,4 +1057,5 @@
     m_pRunningOrPausedActions->addAction(actionPool()->action(UIActionIndexRT_M_Input_M_Keyboard));
     m_pRunningOrPausedActions->addAction(actionPool()->action(UIActionIndexRT_M_Input_M_Keyboard_S_Settings));
+    m_pRunningOrPausedActions->addAction(actionPool()->action(UIActionIndexRT_M_Input_M_Keyboard_S_SoftKeyboard));
     m_pRunningOrPausedActions->addAction(actionPool()->action(UIActionIndexRT_M_Input_M_Mouse));
     m_pRunningOrPausedActions->addAction(actionPool()->action(UIActionIndexRT_M_Input_M_Mouse_T_Integration));
@@ -1134,4 +1137,6 @@
     connect(actionPool()->action(UIActionIndexRT_M_Input_M_Keyboard_S_Settings), SIGNAL(triggered()),
             this, SLOT(sltShowKeyboardSettings()));
+    connect(actionPool()->action(UIActionIndexRT_M_Input_M_Keyboard_S_SoftKeyboard), SIGNAL(triggered()),
+            this, SLOT(sltShowSoftKeyboard()));
     connect(actionPool()->action(UIActionIndexRT_M_Input_M_Keyboard_S_TypeCAD), SIGNAL(triggered()),
             this, SLOT(sltTypeCAD()));
@@ -1593,4 +1598,41 @@
 }
 
+void UIMachineLogic::sltShowSoftKeyboard()
+{
+    if (machine().isNull() || !activeMachineWindow())
+        return;
+
+    /* Create the soft keyboard only once: */
+    if (m_pSoftKeyboardDialog)
+        return;
+
+    QIManagerDialog *pSoftKeyboardDialog;
+    UISoftKeyboardDialogFactory dialogFactory(actionPool(), machine().GetName());
+    dialogFactory.prepare(pSoftKeyboardDialog, activeMachineWindow());
+    if (pSoftKeyboardDialog)
+    {
+        m_pSoftKeyboardDialog = pSoftKeyboardDialog;
+
+        /* Show instance: */
+        pSoftKeyboardDialog->show();
+        pSoftKeyboardDialog->setWindowState(pSoftKeyboardDialog->windowState() & ~Qt::WindowMinimized);
+        pSoftKeyboardDialog->activateWindow();
+        connect(pSoftKeyboardDialog, &QIManagerDialog::sigClose,
+                this, &UIMachineLogic::sltCloseSoftKeyboard);
+    }
+}
+
+void UIMachineLogic::sltCloseSoftKeyboard()
+{
+    QIManagerDialog* pDialog = qobject_cast<QIManagerDialog*>(sender());
+    if (m_pSoftKeyboardDialog != pDialog || !pDialog)
+        return;
+
+    /* Set the m_pSoftKeyboardDialog to NULL before closing the dialog. or we will have redundant deletes*/
+    m_pSoftKeyboardDialog = 0;
+    pDialog->close();
+    UISoftKeyboardDialogFactory().cleanup(pDialog);
+}
+
 void UIMachineLogic::sltToggleMouseIntegration(bool fEnabled)
 {
@@ -1776,5 +1818,5 @@
         return;
 
-    /* Create a logviewer only if we don't have one already */
+    /* Create a file manager only if we don't have one already: */
     if (m_pFileManagerDialog)
         return;
@@ -1802,5 +1844,5 @@
         return;
 
-    /* Set the m_pLogViewerDialog to NULL before closing the dialog. or we will have redundant deletes*/
+    /* Set the m_pFileManagerDialog to NULL before closing the dialog. or we will have redundant deletes*/
     m_pFileManagerDialog = 0;
     pDialog->close();
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.h	(revision 78566)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.h	(revision 78567)
@@ -265,4 +265,6 @@
     /* "Machine" menu functionality: */
     void sltShowKeyboardSettings();
+    void sltShowSoftKeyboard();
+    void sltCloseSoftKeyboard();
     void sltToggleMouseIntegration(bool fEnabled);
     void sltTypeCAD();
@@ -436,4 +438,5 @@
     QIManagerDialog *m_pFileManagerDialog;
     QIManagerDialog *m_pProcessControlDialog;
+    QIManagerDialog *m_pSoftKeyboardDialog;
 
     /* Friend classes: */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/softkeyboard/UISoftKeyboard.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/softkeyboard/UISoftKeyboard.cpp	(revision 78567)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/softkeyboard/UISoftKeyboard.cpp	(revision 78567)
@@ -0,0 +1,199 @@
+/* $Id$ */
+/** @file
+ * VBox Qt GUI - UISoftKeyboard class implementation.
+ */
+
+/*
+ * Copyright (C) 2016-2019 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 <QApplication>
+#include <QFile>
+#include <QMenu>
+#include <QPushButton>
+#include <QSplitter>
+#include <QXmlStreamReader>
+#include <QVBoxLayout>
+
+/* GUI includes: */
+#include "QIDialogButtonBox.h"
+#include "UIExtraDataManager.h"
+#include "UISoftKeyboard.h"
+#include "VBoxGlobal.h"
+
+/* COM includes: */
+#include "CGuest.h"
+#include "CEventSource.h"
+
+/*********************************************************************************************************************************
+*   UIKeyboardLayoutReader definition.                                                                                  *
+*********************************************************************************************************************************/
+
+class UIKeyboardLayoutReader
+{
+
+public:
+
+    bool parseXMLFile(const QString &strFileName);
+
+private:
+
+    bool parseRow();
+    bool parseKey();
+    QXmlStreamReader m_xmlReader;
+};
+
+
+/*********************************************************************************************************************************
+*   UISoftKeyboardKey definition.                                                                                  *
+*********************************************************************************************************************************/
+
+class UISoftKeyboardKey : public QPushButton
+{
+    Q_OBJECT;
+
+public:
+
+    UISoftKeyboardKey(QWidget *pParent);
+};
+
+/*********************************************************************************************************************************
+*   UIKeyboardLayoutReader implementation.                                                                                  *
+*********************************************************************************************************************************/
+
+bool UIKeyboardLayoutReader::parseXMLFile(const QString &strFileName)
+{
+    QFile xmlFile(strFileName);
+    if (!xmlFile.exists())
+        return false;
+
+    if (!xmlFile.open(QIODevice::ReadOnly))
+        return false;
+
+    m_xmlReader.setDevice(&xmlFile);
+
+    if (!m_xmlReader.readNextStartElement() || m_xmlReader.name() != "layout")
+        return false;
+
+    while (m_xmlReader.readNextStartElement())
+    {
+        if (m_xmlReader.name() == "row")
+            parseRow();
+        else
+            m_xmlReader.skipCurrentElement();
+    }
+
+    return true;
+}
+
+bool UIKeyboardLayoutReader::parseRow()
+{
+    while (m_xmlReader.readNextStartElement())
+    {
+        if (m_xmlReader.name() == "key")
+            parseKey();
+        else
+            m_xmlReader.skipCurrentElement();
+    }
+
+    return true;
+}
+
+bool UIKeyboardLayoutReader::parseKey()
+{
+    while (m_xmlReader.readNextStartElement())
+    {
+
+        // if (m_xmlReader.name() == "key")
+        //     parseKey();
+        // else
+            m_xmlReader.skipCurrentElement();
+    }
+
+    return true;
+}
+
+/*********************************************************************************************************************************
+*   UISoftKeyboardKey implementation.                                                                                  *
+*********************************************************************************************************************************/
+
+UISoftKeyboardKey::UISoftKeyboardKey(QWidget *pParent)
+    :QPushButton(pParent)
+{
+}
+
+/*********************************************************************************************************************************
+*   UISoftKeyboard implementation.                                                                                  *
+*********************************************************************************************************************************/
+
+UISoftKeyboard::UISoftKeyboard(EmbedTo /* enmEmbedding */,
+                               QWidget *pParent, QString strMachineName /* = QString()*/,
+                               bool fShowToolbar /* = false */)
+    :QIWithRetranslateUI<QWidget>(pParent)
+    , m_pMainLayout(0)
+    , m_pToolBar(0)
+    , m_fShowToolbar(fShowToolbar)
+    , m_strMachineName(strMachineName)
+{
+    parseLayout();
+    prepareObjects();
+    prepareConnections();
+    prepareToolBar();
+    loadSettings();
+    retranslateUi();
+}
+
+UISoftKeyboard::~UISoftKeyboard()
+{
+    saveSettings();
+}
+
+void UISoftKeyboard::retranslateUi()
+{
+}
+
+void UISoftKeyboard::prepareObjects()
+{
+    /* Create layout: */
+    m_pMainLayout = new QVBoxLayout(this);
+    if (!m_pMainLayout)
+        return;
+
+    /* Configure layout: */
+    m_pMainLayout->setSpacing(0);
+}
+
+void UISoftKeyboard::prepareConnections()
+{
+}
+
+void UISoftKeyboard::prepareToolBar()
+{
+}
+
+void UISoftKeyboard::saveSettings()
+{
+}
+
+void UISoftKeyboard::loadSettings()
+{
+}
+
+void UISoftKeyboard::parseLayout()
+{
+    UIKeyboardLayoutReader reader;
+    if (!reader.parseXMLFile(":/us_layout.xml"))
+    {
+    }
+}
+
+#include "UISoftKeyboard.moc"
Index: /trunk/src/VBox/Frontends/VirtualBox/src/softkeyboard/UISoftKeyboard.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/softkeyboard/UISoftKeyboard.h	(revision 78567)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/softkeyboard/UISoftKeyboard.h	(revision 78567)
@@ -0,0 +1,73 @@
+/* $Id$ */
+/** @file
+ * VBox Qt GUI - UISoftKeyboard class declaration.
+ */
+
+/*
+ * Copyright (C) 2016-2019 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_softkeyboard_UISoftKeyboard_h
+#define FEQT_INCLUDED_SRC_softkeyboard_UISoftKeyboard_h
+#ifndef RT_WITHOUT_PRAGMA_ONCE
+# pragma once
+#endif
+
+/* Qt includes: */
+#include <QWidget>
+
+/* COM includes: */
+#include "COMEnums.h"
+#include "CGuest.h"
+#include "CEventListener.h"
+
+/* GUI includes: */
+#include "QIManagerDialog.h"
+#include "QIWithRetranslateUI.h"
+
+/* Forward declarations: */
+class UISoftKeyboardKey;
+class QVBoxLayout;
+class UIToolBar;
+
+class UISoftKeyboard : public QIWithRetranslateUI<QWidget>
+{
+    Q_OBJECT;
+
+public:
+
+    UISoftKeyboard(EmbedTo enmEmbedding, QWidget *pParent,
+                                QString strMachineName = QString(), bool fShowToolbar = false);
+    ~UISoftKeyboard();
+
+protected:
+
+    void retranslateUi();
+
+private slots:
+
+private:
+
+    void prepareObjects();
+    void prepareConnections();
+    void prepareToolBar();
+    void saveSettings();
+    void loadSettings();
+    void parseLayout();
+
+    QVBoxLayout   *m_pMainLayout;
+    UIToolBar     *m_pToolBar;
+    const bool    m_fShowToolbar;
+    QString       m_strMachineName;
+    QVector<UISoftKeyboardKey*> m_keys;
+};
+
+#endif /* !FEQT_INCLUDED_SRC_softkeyboard_UISoftKeyboard_h */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/softkeyboard/UISoftKeyboardDialog.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/softkeyboard/UISoftKeyboardDialog.cpp	(revision 78567)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/softkeyboard/UISoftKeyboardDialog.cpp	(revision 78567)
@@ -0,0 +1,146 @@
+/* $Id$ */
+/** @file
+ * VBox Qt GUI - UISoftKeyboardDialog class implementation.
+ */
+
+/*
+ * Copyright (C) 2010-2019 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 <QPushButton>
+#include <QVBoxLayout>
+
+/* GUI includes: */
+#include "UIDesktopWidgetWatchdog.h"
+#include "UIExtraDataManager.h"
+#include "UIIconPool.h"
+#include "UIGuestControlConsole.h"
+#include "UISoftKeyboardDialog.h"
+#include "UISoftKeyboard.h"
+#include "VBoxGlobal.h"
+#ifdef VBOX_WS_MAC
+# include "VBoxUtils-darwin.h"
+#endif
+
+
+/*********************************************************************************************************************************
+*   Class UISoftKeyboardDialogFactory implementation.                                                                     *
+*********************************************************************************************************************************/
+
+UISoftKeyboardDialogFactory::UISoftKeyboardDialogFactory(UIActionPool *pActionPool /* = 0 */,
+                                                         const QString &strMachineName /* = QString() */)
+    : m_pActionPool(pActionPool)
+    , m_strMachineName(strMachineName)
+{
+}
+
+void UISoftKeyboardDialogFactory::create(QIManagerDialog *&pDialog, QWidget *pCenterWidget)
+{
+    pDialog = new UISoftKeyboardDialog(pCenterWidget, m_pActionPool, m_strMachineName);
+}
+
+
+/*********************************************************************************************************************************
+*   Class UISoftKeyboardDialog implementation.                                                                            *
+*********************************************************************************************************************************/
+
+UISoftKeyboardDialog::UISoftKeyboardDialog(QWidget *pCenterWidget,
+                                           UIActionPool *pActionPool,
+                                           const QString &strMachineName /* = QString() */)
+    : QIWithRetranslateUI<QIManagerDialog>(pCenterWidget)
+    , m_pActionPool(pActionPool)
+    , m_strMachineName(strMachineName)
+{
+}
+
+void UISoftKeyboardDialog::retranslateUi()
+{
+    /* Translate window title: */
+    setWindowTitle(tr("%1 - Guest Control").arg(m_strMachineName));
+    /* Translate buttons: */
+    button(ButtonType_Close)->setText(tr("Close"));
+}
+
+void UISoftKeyboardDialog::configure()
+{
+    /* Apply window icons: */
+    setWindowIcon(UIIconPool::iconSetFull(":/vm_show_logs_32px.png", ":/vm_show_logs_16px.png"));
+}
+
+void UISoftKeyboardDialog::configureCentralWidget()
+{
+    /* Create widget: */
+    UISoftKeyboard  *pSoftKeyboard = new UISoftKeyboard(EmbedTo_Dialog, 0, "");
+
+    if (pSoftKeyboard)
+    {
+        /* Configure widget: */
+        setWidget(pSoftKeyboard);
+        //setWidgetMenu(pWidget->menu());
+#ifdef VBOX_WS_MAC
+        //setWidgetToolbar(pWidget->toolbar());
+#endif
+        /* Add into layout: */
+        centralWidget()->layout()->addWidget(pSoftKeyboard);
+    }
+}
+
+void UISoftKeyboardDialog::finalize()
+{
+    /* Apply language settings: */
+    retranslateUi();
+}
+
+void UISoftKeyboardDialog::loadSettings()
+{
+    const QRect desktopRect = gpDesktop->availableGeometry(this);
+    int iDefaultWidth = desktopRect.width() / 2;
+    int iDefaultHeight = desktopRect.height() * 3 / 4;
+
+    QRect defaultGeometry(0, 0, iDefaultWidth, iDefaultHeight);
+    if (centerWidget())
+        defaultGeometry.moveCenter(centerWidget()->geometry().center());
+
+    /* Load geometry from extradata: */
+    QRect geometry = gEDataManager->guestProcessControlDialogGeometry(this, defaultGeometry);
+
+    /* Restore geometry: */
+    LogRel2(("GUI: UISoftKeyboardDialog: Restoring geometry to: Origin=%dx%d, Size=%dx%d\n",
+             geometry.x(), geometry.y(), geometry.width(), geometry.height()));
+    setDialogGeometry(geometry);
+}
+
+void UISoftKeyboardDialog::saveSettings() const
+{
+    /* Save window geometry to extradata: */
+    const QRect saveGeometry = geometry();
+#ifdef VBOX_WS_MAC
+    /* darwinIsWindowMaximized expects a non-const QWidget*. thus const_cast: */
+    QWidget *pw = const_cast<QWidget*>(qobject_cast<const QWidget*>(this));
+    gEDataManager->setGuestProcessControlDialogGeometry(saveGeometry, ::darwinIsWindowMaximized(pw));
+#else /* !VBOX_WS_MAC */
+    gEDataManager->setGuestProcessControlDialogGeometry(saveGeometry, isMaximized());
+#endif /* !VBOX_WS_MAC */
+    LogRel2(("GUI: Guest Process Control Dialog: Geometry saved as: Origin=%dx%d, Size=%dx%d\n",
+             saveGeometry.x(), saveGeometry.y(), saveGeometry.width(), saveGeometry.height()));
+}
+
+bool UISoftKeyboardDialog::shouldBeMaximized() const
+{
+    return gEDataManager->guestProcessControlDialogShouldBeMaximized();
+}
+
+void UISoftKeyboardDialog::sltSetCloseButtonShortCut(QKeySequence shortcut)
+{
+    if (button(ButtonType_Close))
+        button(ButtonType_Close)->setShortcut(shortcut);
+}
Index: /trunk/src/VBox/Frontends/VirtualBox/src/softkeyboard/UISoftKeyboardDialog.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/softkeyboard/UISoftKeyboardDialog.h	(revision 78567)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/softkeyboard/UISoftKeyboardDialog.h	(revision 78567)
@@ -0,0 +1,110 @@
+/* $Id$ */
+/** @file
+ * VBox Qt GUI - UISoftKeyboardDialog class declaration.
+ */
+
+/*
+ * Copyright (C) 2010-2019 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_softkeyboard_UISoftKeyboardDialog_h
+#define FEQT_INCLUDED_SRC_softkeyboard_UISoftKeyboardDialog_h
+#ifndef RT_WITHOUT_PRAGMA_ONCE
+# pragma once
+#endif
+
+/* Qt includes: */
+#include <QString>
+
+/* GUI includes: */
+#include "QIManagerDialog.h"
+#include "QIWithRetranslateUI.h"
+
+/* COM includes: */
+#include "COMEnums.h"
+#include "CGuest.h"
+
+/* Forward declarations: */
+class UIActionPool;
+class UISoftKeyboardDialog;
+class CGuest;
+
+/** QIManagerDialogFactory extension used as a factory for the Guest Control dialog. */
+class UISoftKeyboardDialogFactory : public QIManagerDialogFactory
+{
+public:
+
+    UISoftKeyboardDialogFactory(UIActionPool *pActionPool = 0, const QString &strMachineName = QString());
+
+protected:
+
+    /** Creates derived @a pDialog instance.
+      * @param  pCenterWidget  Passes the widget to center wrt. pCenterWidget. */
+    virtual void create(QIManagerDialog *&pDialog, QWidget *pCenterWidget) /* override */;
+
+    UIActionPool *m_pActionPool;
+    QString       m_strMachineName;
+};
+
+
+/** QIManagerDialog extension providing GUI with the dialog displaying guest control releated logs. */
+class UISoftKeyboardDialog : public QIWithRetranslateUI<QIManagerDialog>
+{
+    Q_OBJECT;
+
+public:
+
+    /** Constructs Guest Control dialog.
+      * @param  pCenterWidget  Passes the widget reference to center according to.
+      * @param  pActionPool    Passes the action-pool reference. */
+    UISoftKeyboardDialog(QWidget *pCenterWidget, UIActionPool *pActionPool, const QString &strMachineName = QString());
+
+protected:
+
+    /** @name Event-handling stuff.
+      * @{ */
+        /** Handles translation event. */
+        virtual void retranslateUi() /* override */;
+    /** @} */
+
+    /** @name Prepare/cleanup cascade.
+     * @{ */
+        /** Configures all. */
+        virtual void configure() /* override */;
+        /** Configures central-widget. */
+        virtual void configureCentralWidget() /* override */;
+        /** Perform final preparations. */
+        virtual void finalize() /* override */;
+        /** Loads dialog setting such as geometry from extradata. */
+        virtual void loadSettings() /* override */;
+
+        /** Saves dialog setting into extradata. */
+        virtual void saveSettings() const /* override */;
+    /** @} */
+
+    /** @name Functions related to geometry restoration.
+     * @{ */
+        /** Returns whether the window should be maximized when geometry being restored. */
+        virtual bool shouldBeMaximized() const /* override */;
+    /** @} */
+
+private slots:
+
+    void sltSetCloseButtonShortCut(QKeySequence shortcut);
+
+private:
+
+    UIActionPool *m_pActionPool;
+    QString     m_strMachineName;
+};
+
+
+#endif /* !FEQT_INCLUDED_SRC_softkeyboard_UISoftKeyboardDialog_h */
Index: /trunk/src/VBox/Frontends/VirtualBox/xml/us_layout.xml
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/xml/us_layout.xml	(revision 78567)
+++ /trunk/src/VBox/Frontends/VirtualBox/xml/us_layout.xml	(revision 78567)
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<layout>
+    <row>
+        <height>50</height>
+        <key>
+            <width>30</width>
+            <label>Key1</label>
+            <scancode>X11</scancode>
+        </key>
+    </row>
+</layout>
