Index: /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk	(revision 71132)
+++ /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk	(revision 71133)
@@ -378,4 +378,5 @@
 	src/runtime/information/guestctrl/UIGuestControlConsole.h \
 	src/runtime/information/guestctrl/UIGuestControlFileManager.h \
+	src/runtime/information/guestctrl/UIGuestControlFileTree.h \
 	src/runtime/information/guestctrl/UIGuestControlInterface.h \
 	src/runtime/information/guestctrl/UIGuestControlTreeItem.h \
@@ -567,4 +568,5 @@
 	src/runtime/UIStatusBarEditorWindow.cpp \
 	src/runtime/information/guestctrl/UIGuestControlFileManager.cpp \
+	src/runtime/information/guestctrl/UIGuestControlFileTree.cpp \
 	src/runtime/information/guestctrl/UIGuestControlWidget.cpp \
 	src/selector/UIActionPoolSelector.cpp \
@@ -710,4 +712,5 @@
 	src/runtime/information/guestctrl/UIGuestControlConsole.cpp \
 	src/runtime/information/guestctrl/UIGuestControlFileManager.cpp \
+	src/runtime/information/guestctrl/UIGuestControlFileTree.cpp \
 	src/runtime/information/guestctrl/UIGuestControlInterface.cpp \
 	src/runtime/information/guestctrl/UIGuestControlTreeItem.cpp \
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/information/guestctrl/UIGuestControlFileManager.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/information/guestctrl/UIGuestControlFileManager.cpp	(revision 71132)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/information/guestctrl/UIGuestControlFileManager.cpp	(revision 71133)
@@ -21,6 +21,9 @@
 
 /* Qt includes: */
+# include <QAbstractItemModel>
+# include <QHBoxLayout>
+# include <QPlainTextEdit>
+# include <QPushButton>
 # include <QSplitter>
-# include <QHBoxLayout>
 # include <QVBoxLayout>
 
@@ -28,7 +31,8 @@
 # include "QILabel.h"
 # include "QILineEdit.h"
-# include "QIToolButton.h"
 # include "QIWithRetranslateUI.h"
+# include "UIExtraDataManager.h"
 # include "UIGuestControlFileManager.h"
+# include "UIGuestControlFileTree.h"
 # include "UIVMInformationDialog.h"
 # include "VBoxGlobal.h"
@@ -36,18 +40,32 @@
 /* COM includes: */
 # include "CGuest.h"
+# include "CGuestDirectory.h"
+# include "CGuestSessionStateChangedEvent.h"
 
 #endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
 
+
 class UIGuestSessionCreateWidget : public QIWithRetranslateUI<QWidget>
 {
     Q_OBJECT;
 
+signals:
+
+    void sigCreateSession(QString strUserName, QString strPassword);
+    void sigCloseButtonClick();
+
 public:
 
     UIGuestSessionCreateWidget(QWidget *pParent = 0);
+    void switchSessionCreateMode();
+    void switchSessionCloseMode();
 
 protected:
 
     void retranslateUi();
+
+private slots:
+
+    void sltCreateButtonClick();
 
 private:
@@ -58,9 +76,16 @@
     QILabel      *m_pUserNameLabel;
     QILabel      *m_pPasswordLabel;
-    QIToolButton *m_pCreateButton;
+    QPushButton  *m_pCreateButton;
+    QPushButton  *m_pCloseButton;
 
     QHBoxLayout *m_pMainLayout;
 
 };
+
+
+
+/*********************************************************************************************************************************
+*   UIGuestSessionCreateWidget implementation.                                                                                   *
+*********************************************************************************************************************************/
 
 UIGuestSessionCreateWidget::UIGuestSessionCreateWidget(QWidget *pParent /* = 0 */)
@@ -71,4 +96,5 @@
     , m_pPasswordLabel(0)
     , m_pCreateButton(0)
+    , m_pCloseButton(0)
     , m_pMainLayout(0)
 {
@@ -103,10 +129,25 @@
     }
 
-    m_pCreateButton = new QIToolButton;
+    m_pCreateButton = new QPushButton;
     if (m_pCreateButton)
     {
         m_pMainLayout->addWidget(m_pCreateButton);
-    }
+        connect(m_pCreateButton, &QPushButton::clicked, this, &UIGuestSessionCreateWidget::sltCreateButtonClick);
+    }
+
+    m_pCloseButton = new QPushButton;
+    if (m_pCloseButton)
+    {
+        m_pMainLayout->addWidget(m_pCloseButton);
+        connect(m_pCloseButton, &QPushButton::clicked, this, &UIGuestSessionCreateWidget::sigCloseButtonClick);
+    }
+
     retranslateUi();
+}
+
+void UIGuestSessionCreateWidget::sltCreateButtonClick()
+{
+    if(m_pUserNameEdit && m_pPasswordEdit)
+        emit sigCreateSession(m_pUserNameEdit->text(), m_pPasswordEdit->text());
 }
 
@@ -132,8 +173,34 @@
     }
     if(m_pCreateButton)
-    {
         m_pCreateButton->setText(UIVMInformationDialog::tr("Create Session"));
-    }
-}
+    if(m_pCloseButton)
+        m_pCloseButton->setText(UIVMInformationDialog::tr("Close Session"));
+
+}
+
+void UIGuestSessionCreateWidget::switchSessionCreateMode()
+{
+    m_pUserNameEdit->setEnabled(true);
+    m_pPasswordEdit->setEnabled(true);
+    m_pUserNameLabel->setEnabled(true);
+    m_pPasswordLabel->setEnabled(true);
+    m_pCreateButton->setEnabled(true);
+    m_pCloseButton->setEnabled(false);
+}
+
+void UIGuestSessionCreateWidget::switchSessionCloseMode()
+{
+    m_pUserNameEdit->setEnabled(false);
+    m_pPasswordEdit->setEnabled(false);
+    m_pUserNameLabel->setEnabled(false);
+    m_pPasswordLabel->setEnabled(false);
+    m_pCreateButton->setEnabled(false);
+    m_pCloseButton->setEnabled(true);
+}
+
+
+/*********************************************************************************************************************************
+*   UIGuestControlFileManager implementation.                                                                                    *
+*********************************************************************************************************************************/
 
 UIGuestControlFileManager::UIGuestControlFileManager(QWidget *pParent, const CGuest &comGuest)
@@ -143,7 +210,30 @@
     , m_pSplitter(0)
     , m_pSessionCreateWidget(0)
-{
+    , m_pLogOutput(0)
+    , m_pGuestFileTree(0)
+{
+    prepareGuestListener();
     prepareObjects();
     prepareConnections();
+}
+
+UIGuestControlFileManager::~UIGuestControlFileManager()
+{
+    if(m_comGuest.isOk() && m_pQtGuestListener && m_comGuestListener.isOk())
+        cleanupListener(m_pQtGuestListener, m_comGuestListener, m_comGuest.GetEventSource());
+    if(m_comGuestSession.isOk() && m_pQtSessionListener && m_comSessionListener.isOk())
+        cleanupListener(m_pQtSessionListener, m_comSessionListener, m_comGuestSession.GetEventSource());
+}
+
+void UIGuestControlFileManager::prepareGuestListener()
+{
+    if(m_comGuest.isOk())
+    {
+        QVector<KVBoxEventType> eventTypes;
+        eventTypes << KVBoxEventType_OnGuestSessionRegistered;
+
+        prepareListener(m_pQtGuestListener, m_comGuestListener,
+                        m_comGuest.GetEventSource(), eventTypes);
+    }
 }
 
@@ -158,18 +248,30 @@
     m_pMainLayout->setSpacing(0);
 
-    m_pSplitter = new QSplitter;
-
-    if (!m_pSplitter)
-        return;
 
     m_pSessionCreateWidget = new UIGuestSessionCreateWidget();
     if (m_pSessionCreateWidget)
     {
-        m_pSplitter->addWidget(m_pSessionCreateWidget);
-    }
-
-    m_pSplitter->setOrientation(Qt::Vertical);
-    m_pMainLayout->addWidget(m_pSplitter);
-
+        m_pMainLayout->addWidget(m_pSessionCreateWidget, 0, Qt::AlignTop);
+    }
+
+    m_pSplitter = new QSplitter;
+    if (m_pSplitter)
+    {
+        m_pMainLayout->addWidget(m_pSplitter);
+        m_pSplitter->setOrientation(Qt::Vertical);
+    }
+
+    m_pGuestFileTree = new UIGuestControlFileTree;
+    if (m_pGuestFileTree)
+    {
+        m_pSplitter->addWidget(m_pGuestFileTree);
+    }
+
+    m_pLogOutput = new QPlainTextEdit;
+    if (m_pLogOutput)
+    {
+        m_pLogOutput->setReadOnly(true);
+        m_pMainLayout->addWidget(m_pLogOutput, 0, Qt::AlignBottom);
+    }
 
     // m_pSplitter->setStretchFactor(0, 9);
@@ -179,5 +281,176 @@
 void UIGuestControlFileManager::prepareConnections()
 {
-
+    if (m_pQtGuestListener)
+    {
+        connect(m_pQtGuestListener->getWrapped(), &UIMainEventListener::sigGuestSessionUnregistered,
+                this, &UIGuestControlFileManager::sltGuestSessionUnregistered, Qt::DirectConnection);
+    }
+    if(m_pSessionCreateWidget)
+    {
+        connect(m_pSessionCreateWidget, &UIGuestSessionCreateWidget::sigCreateSession,
+                this, &UIGuestControlFileManager::sltCreateSession);
+        connect(m_pSessionCreateWidget, &UIGuestSessionCreateWidget::sigCloseButtonClick,
+                this, &UIGuestControlFileManager::sltCloseSession);
+    }
+}
+
+void UIGuestControlFileManager::sltGuestSessionUnregistered(CGuestSession guestSession)
+{
+    if (!guestSession.isOk())
+        return;
+    if(guestSession == m_comGuestSession && m_comGuestSession.isOk())
+        m_comGuestSession.detach();
+    if (m_pSessionCreateWidget)
+        m_pSessionCreateWidget->switchSessionCreateMode();
+}
+
+void UIGuestControlFileManager::sltCreateSession(QString strUserName, QString strPassword)
+{
+    if(strUserName.isEmpty())
+    {
+        m_pLogOutput->appendPlainText("No user name is given");
+        return;
+    }
+    createSession(strUserName, strPassword);
+}
+
+void UIGuestControlFileManager::sltCloseSession()
+{
+    // if (!m_comGuestSession.isOk())
+    // {
+    //     m_pLogOutput->appendPlainText("Guest session is not valid");
+    //     return;
+    // }
+    // m_pLogOutput->appendPlainText("Guest session is closed");
+
+    if(m_comGuestSession.isOk() && m_pQtSessionListener && m_comSessionListener.isOk())
+        cleanupListener(m_pQtSessionListener, m_comSessionListener, m_comGuestSession.GetEventSource());
+
+    m_comGuestSession.Close();
+    if(m_pSessionCreateWidget)
+        m_pSessionCreateWidget->switchSessionCreateMode();
+}
+
+void UIGuestControlFileManager::sltGuestSessionStateChanged(const CGuestSessionStateChangedEvent &cEvent)
+{
+    //if (cEvent.isOk() && m_comGuestSession.isOk())// && m_comGuestProcess.GetStatus() == KProcessStatus_Error)
+    {
+        CVirtualBoxErrorInfo cErrorInfo = cEvent.GetError();
+        if (cErrorInfo.isOk())// && cErrorInfo.GetResultCode() != S_OK)
+        {
+    //         /* For some reason I am yet to find this emit is not working.
+    //            Thus we are calling the parent's function directly: */
+    //         //emit sigGuestProcessErrorText(cErrorInfo.GetText());
+    //         UIGuestSessionTreeItem *sessionParent = dynamic_cast<UIGuestSessionTreeItem*>(QTreeWidgetItem::parent());
+    //         if (sessionParent)
+    //         {
+    //             sessionParent->errorString(cErrorInfo.GetText().toStdString().c_str());
+    //         }
+            m_pLogOutput->appendPlainText(cErrorInfo.GetText());
+        }
+    }
+
+    if (m_comGuestSession.GetStatus() == KGuestSessionStatus_Started)
+    {
+
+        // printf("/lk %d c:/users %d\n", m_comGuestSession.DirectoryExists("/lk", true),
+        //        m_comGuestSession.DirectoryExists("c:/users", true));
+        QVector<KDirectoryOpenFlag> flag;
+        flag.push_back(KDirectoryOpenFlag_None);
+        CGuestDirectory directory = m_comGuestSession.DirectoryOpen("c:/", "*", flag);
+        if(directory.isOk())
+        {
+            m_pLogOutput->appendPlainText("Current Directory");
+            m_pLogOutput->appendPlainText(directory.GetDirectoryName());
+        }
+    }
+
+}
+
+
+bool UIGuestControlFileManager::createSession(const QString& strUserName, const QString& strPassword,
+                                              const QString& strDomain /* not used currently */)
+{
+    if (!m_comGuest.isOk())
+        return false;
+    m_comGuestSession = m_comGuest.CreateSession(strUserName, strPassword,
+                                                               strDomain, "File Manager Session");
+
+    if (!m_comGuestSession.isOk())
+    {
+        m_pLogOutput->appendPlainText("Guest session could not be created");
+        return false;
+    }
+
+    m_pLogOutput->appendPlainText("Guest session has been created");
+    if(m_pSessionCreateWidget)
+        m_pSessionCreateWidget->switchSessionCloseMode();
+
+    /* Prepare session listener */
+    QVector<KVBoxEventType> eventTypes;
+    eventTypes << KVBoxEventType_OnGuestSessionStateChanged;
+    //<< KVBoxEventType_OnGuestProcessRegistered;
+    prepareListener(m_pQtSessionListener, m_comSessionListener,
+                    m_comGuestSession.GetEventSource(), eventTypes);
+
+    /* Connect to session listener */
+    qRegisterMetaType<CGuestSessionStateChangedEvent>();
+
+
+    connect(m_pQtSessionListener->getWrapped(), &UIMainEventListener::sigGuestSessionStatedChanged,
+            this, &UIGuestControlFileManager::sltGuestSessionStateChanged);
+    // /* Wait session to start: */
+    // const ULONG waitTimeout = 2000;
+    // KGuestSessionWaitResult waitResult = guestSession.WaitFor(KGuestSessionWaitForFlag_Start, waitTimeout);
+    // if (waitResult != KGuestSessionWaitResult_Start)
+    //     return false;
+
+    // outSession = guestSession;
+
+    return true;
+}
+
+void UIGuestControlFileManager::prepareListener(ComObjPtr<UIMainEventListenerImpl> &QtListener,
+                                                CEventListener &comEventListener,
+                                                CEventSource comEventSource, QVector<KVBoxEventType>& eventTypes)
+{
+    if (!comEventSource.isOk())
+        return;
+    /* Create event listener instance: */
+    QtListener.createObject();
+    QtListener->init(new UIMainEventListener, this);
+    comEventListener = CEventListener(QtListener);
+
+    /* Register event listener for CProgress event source: */
+    comEventSource.RegisterListener(comEventListener, eventTypes,
+        gEDataManager->eventHandlingType() == EventHandlingType_Active ? TRUE : FALSE);
+
+    /* If event listener registered as passive one: */
+    if (gEDataManager->eventHandlingType() == EventHandlingType_Passive)
+    {
+        /* Register event sources in their listeners as well: */
+        QtListener->getWrapped()->registerSource(comEventSource, comEventListener);
+    }
+}
+
+void UIGuestControlFileManager::cleanupListener(ComObjPtr<UIMainEventListenerImpl> &QtListener,
+                                                CEventListener &comEventListener,
+                                                CEventSource comEventSource)
+{
+    if (!comEventSource.isOk())
+        return;
+    /* If event listener registered as passive one: */
+    if (gEDataManager->eventHandlingType() == EventHandlingType_Passive)
+    {
+        /* Unregister everything: */
+        QtListener->getWrapped()->unregisterSources();
+    }
+
+    /* Make sure VBoxSVC is available: */
+    if (!vboxGlobal().isVBoxSVCAvailable())
+        return;
+
+    /* Unregister event listener for CProgress event source: */
+    comEventSource.UnregisterListener(comEventListener);
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/information/guestctrl/UIGuestControlFileManager.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/information/guestctrl/UIGuestControlFileManager.h	(revision 71132)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/information/guestctrl/UIGuestControlFileManager.h	(revision 71133)
@@ -24,10 +24,21 @@
 /* COM includes: */
 #include "COMEnums.h"
+#include "CEventListener.h"
+#include "CEventSource.h"
 #include "CGuest.h"
+#include "CGuestSession.h"
+
+/* GUI includes: */
+#include "UIMainEventListener.h"
 
 /* Forward declarations: */
+class CGuestSessionStateChangedEvent;
+class QITreeView;
+class QPlainTextEdit;
 class QVBoxLayout;
 class QSplitter;
-
+class UIFileListModel;
+class UIGuestControlFileTree;
+class UIGuestSessionCreateWidget;
 
 /** QWidget extension
@@ -40,14 +51,44 @@
 
     UIGuestControlFileManager(QWidget *pParent, const CGuest &comGuest);
+    ~UIGuestControlFileManager();
+
+private slots:
+
+    void sltGuestSessionUnregistered(CGuestSession guestSession);
+    void sltCreateSession(QString strUserName, QString strPassword);
+    void sltCloseSession();
+    void sltGuestSessionStateChanged(const CGuestSessionStateChangedEvent &cEvent);
 
 private:
 
     void prepareObjects();
+    void prepareGuestListener();
     void prepareConnections();
+    bool createSession(const QString& strUserName, const QString& strPassword,
+                       const QString& strDomain = QString() /* not used currently */);
 
-    CGuest         m_comGuest;
-    QVBoxLayout   *m_pMainLayout;
-    QSplitter     *m_pSplitter;
-    QWidget       *m_pSessionCreateWidget;
+    void prepareListener(ComObjPtr<UIMainEventListenerImpl> &Qtistener,
+                         CEventListener &comEventListener,
+                         CEventSource comEventSource, QVector<KVBoxEventType>& eventTypes);
+
+    void cleanupListener(ComObjPtr<UIMainEventListenerImpl> &QtListener,
+                         CEventListener &comEventListener,
+                         CEventSource comEventSource);
+
+    CGuest            m_comGuest;
+    CGuestSession     m_comGuestSession;
+
+    QVBoxLayout      *m_pMainLayout;
+    QSplitter        *m_pSplitter;
+    UIGuestSessionCreateWidget        *m_pSessionCreateWidget;
+    QPlainTextEdit   *m_pLogOutput;
+    UIGuestControlFileTree* m_pGuestFileTree;
+
+    ComObjPtr<UIMainEventListenerImpl> m_pQtGuestListener;
+    CEventListener m_comGuestListener;
+
+    ComObjPtr<UIMainEventListenerImpl> m_pQtSessionListener;
+    CEventListener m_comSessionListener;
+
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/information/guestctrl/UIGuestControlFileTree.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/information/guestctrl/UIGuestControlFileTree.cpp	(revision 71133)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/information/guestctrl/UIGuestControlFileTree.cpp	(revision 71133)
@@ -0,0 +1,68 @@
+/* $Id$ */
+/** @file
+ * VBox Qt GUI - UIGuestControlFileTree class implementation.
+ */
+
+/*
+ * Copyright (C) 2016-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.
+ */
+
+#ifdef VBOX_WITH_PRECOMPILED_HEADERS
+# include <precomp.h>
+#else  /* !VBOX_WITH_PRECOMPILED_HEADERS */
+
+/* Qt includes: */
+// # include <QAbstractItemModel>
+// # include <QHBoxLayout>
+// # include <QPlainTextEdit>
+// # include <QPushButton>
+// # include <QSplitter>
+// # include <QVBoxLayout>
+
+/* GUI includes: */
+// # include "QILabel.h"
+// # include "QILineEdit.h"
+// # include "QIWithRetranslateUI.h"
+// # include "UIExtraDataManager.h"
+# include "UIGuestControlFileTree.h"
+// # include "UIVMInformationDialog.h"
+// # include "VBoxGlobal.h"
+
+/* COM includes: */
+// # include "CGuest.h"
+// # include "CGuestSessionStateChangedEvent.h"
+
+#endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
+
+class UIGuestControlFileTreeItem : public QITreeWidgetItem
+{
+    Q_OBJECT;
+
+public:
+    UIGuestControlFileTreeItem(UIGuestControlFileTree *pTreeWidget, const QStringList &strings = QStringList());
+    UIGuestControlFileTreeItem(UIGuestControlFileTreeItem *pTreeWidgetItem, const QStringList &strings = QStringList());
+    virtual ~UIGuestControlFileTreeItem();
+
+};
+
+UIGuestControlFileTreeItem::UIGuestControlFileTreeItem(UIGuestControlFileTree *pTreeWidget, const QStringList &strings /* = QStringList() */)
+    :QITreeWidgetItem(pTreeWidget, strings)
+
+{
+}
+UIGuestControlFileTreeItem::UIGuestControlFileTreeItem(UIGuestControlFileTreeItem *pTreeWidgetItem, const QStringList &strings /*= QStringList() */)
+    :QITreeWidgetItem(pTreeWidgetItem, strings)
+{
+}
+
+UIGuestControlFileTreeItem::~UIGuestControlFileTreeItem(){}
+
+#include "UIGuestControlFileTree.moc"
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/information/guestctrl/UIGuestControlFileTree.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/information/guestctrl/UIGuestControlFileTree.h	(revision 71133)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/information/guestctrl/UIGuestControlFileTree.h	(revision 71133)
@@ -0,0 +1,49 @@
+/* $Id$ */
+/** @file
+ * VBox Qt GUI - UIGuestControlFileTree class declaration.
+ */
+
+/*
+ * Copyright (C) 2016-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 ___UIGuestControlFileTree_h___
+#define ___UIGuestControlFileTree_h___
+
+/* Qt includes: */
+#include <QWidget>
+
+/* COM includes: */
+#include "COMEnums.h"
+#include "CEventListener.h"
+#include "CEventSource.h"
+#include "CGuest.h"
+#include "CGuestSession.h"
+
+/* GUI includes: */
+#include "QITreeWidget.h"
+
+/* Forward declarations: */
+
+
+class UIGuestControlFileTree : public QITreeWidget
+{
+    Q_OBJECT;
+
+public:
+
+
+private:
+
+
+};
+
+#endif /* !___UIGuestControlFileTree_h___ */
