Index: /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk	(revision 71562)
+++ /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk	(revision 71563)
@@ -600,4 +600,5 @@
 	src/runtime/guestctrl/UIGuestControlFileTable.cpp \
 	src/runtime/guestctrl/UIGuestControlWidget.cpp \
+	src/runtime/guestctrl/UIGuestFileTable.cpp \
 	src/runtime/guestctrl/UIHostFileTable.cpp \
 	src/selector/UIActionPoolSelector.cpp \
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestControlFileTable.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestControlFileTable.cpp	(revision 71562)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestControlFileTable.cpp	(revision 71563)
@@ -137,4 +137,29 @@
 
 /*********************************************************************************************************************************
+*   UIHostDirectoryDiskUsageComputer implementation.                                                                             *
+*********************************************************************************************************************************/
+
+UIDirectoryDiskUsageComputer::UIDirectoryDiskUsageComputer(QObject *parent, QStringList pathList)
+    :QThread(parent)
+    , m_pathList(pathList)
+    , m_bContinueRunning(true)
+{
+}
+
+void UIDirectoryDiskUsageComputer::run()
+{
+    for (int i = 0; i < m_pathList.size(); ++i)
+        directoryStatisticsRecursive(m_pathList[i], m_resultStatistics);
+}
+
+void UIDirectoryDiskUsageComputer::stopRecursion()
+{
+    m_mutex.lock();
+    m_bContinueRunning = false;
+    m_mutex.unlock();
+}
+
+
+/*********************************************************************************************************************************
 *   UIPathOperations implementation.                                                                                             *
 *********************************************************************************************************************************/
@@ -668,4 +693,5 @@
     , m_pCut(0)
     , m_pPaste(0)
+    , m_pPropertiesDialog(0)
     , m_pMainLayout(0)
     , m_pLocationComboBox(0)
@@ -1432,4 +1458,10 @@
 }
 
+void UIGuestControlFileTable::sltReceiveDirectoryStatistics(UIDirectoryStatistics statistics)
+{
+    if (!m_pPropertiesDialog)
+        return;
+    m_pPropertiesDialog->addDirectoryStatistics(statistics);
+}
 
 #include "UIGuestControlFileTable.moc"
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestControlFileTable.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestControlFileTable.h	(revision 71562)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestControlFileTable.h	(revision 71563)
@@ -20,4 +20,6 @@
 
 /* Qt includes: */
+# include <QMutex>
+#include <QThread>
 #include <QWidget>
 
@@ -67,4 +69,34 @@
 
 Q_DECLARE_METATYPE(UIDirectoryStatistics);
+
+
+/** Examines the paths in @p strStartPath and collects some staticstics from them recursively (in case directories)
+    Runs on a worker thread to avoid GUI freezes. UIGuestFileTable and UIHostFileTable uses specialized children
+    of this class since the call made on file objects are different */
+class UIDirectoryDiskUsageComputer : public QThread
+{
+    Q_OBJECT;
+
+signals:
+
+    void sigResultUpdated(UIDirectoryStatistics);
+
+public:
+
+    UIDirectoryDiskUsageComputer(QObject *parent, QStringList strStartPath);
+    void stopRecursion();
+
+protected:
+
+    /** Read the directory with the path @p path recursively and collect #of objects and
+        total size */
+    virtual void directoryStatisticsRecursive(const QString &path, UIDirectoryStatistics &statistics) = 0;
+    void                  run();
+    QStringList           m_pathList;
+    UIDirectoryStatistics m_resultStatistics;
+    bool                  m_bContinueRunning;
+    QMutex                m_mutex;
+};
+
 
 /** A QIDialog child to display properties of a file object */
@@ -243,5 +275,9 @@
     QAction                 *m_pCut;
     QAction                 *m_pPaste;
-
+    UIPropertiesDialog      *m_pPropertiesDialog;
+
+protected slots:
+
+    void sltReceiveDirectoryStatistics(UIDirectoryStatistics statictics);
 
 private slots:
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestFileTable.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestFileTable.cpp	(revision 71562)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestFileTable.cpp	(revision 71563)
@@ -37,4 +37,90 @@
 
 #endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
+
+
+/*********************************************************************************************************************************
+*   UIGuestDirectoryDiskUsageComputer definition.                                                                                *
+*********************************************************************************************************************************/
+
+/** Open directories recursively and sum the disk usage. Don't block the GUI thread while doing this */
+class UIGuestDirectoryDiskUsageComputer : public UIDirectoryDiskUsageComputer
+{
+    Q_OBJECT;
+
+public:
+
+    UIGuestDirectoryDiskUsageComputer(QObject *parent, QStringList strStartPath, const CGuestSession &session);
+
+protected:
+
+    virtual void directoryStatisticsRecursive(const QString &path, UIDirectoryStatistics &statistics) /* override */;
+
+private:
+
+    CGuestSession m_comGuestSession;
+};
+
+
+/*********************************************************************************************************************************
+*   UIGuestDirectoryDiskUsageComputer implementation.                                                                            *
+*********************************************************************************************************************************/
+
+UIGuestDirectoryDiskUsageComputer::UIGuestDirectoryDiskUsageComputer(QObject *parent, QStringList pathList, const CGuestSession &session)
+    :UIDirectoryDiskUsageComputer(parent, pathList)
+    , m_comGuestSession(session)
+{
+}
+
+void UIGuestDirectoryDiskUsageComputer::directoryStatisticsRecursive(const QString &path, UIDirectoryStatistics &statistics)
+{
+    if (m_comGuestSession.isNull())
+        return;
+    if (!m_bContinueRunning)
+        return;
+    CGuestFsObjInfo fileInfo = m_comGuestSession.FsObjQueryInfo(path, true);
+
+    if (!m_comGuestSession.isOk())
+        return;
+
+    /* if the object is a file or a symlink then read the size and return: */
+    if (fileInfo.GetType() == KFsObjType_File)
+    {
+        statistics.m_totalSize += fileInfo.GetObjectSize();
+        ++statistics.m_uFileCount;
+        sigResultUpdated(statistics);
+        return;
+    }
+    else if (fileInfo.GetType() == KFsObjType_Symlink)
+    {
+        statistics.m_totalSize += fileInfo.GetObjectSize();
+        ++statistics.m_uSymlinkCount;
+        sigResultUpdated(statistics);
+        return;
+    }
+
+    if (fileInfo.GetType() != KFsObjType_Directory)
+        return;
+    /* Open the directory to start reading its content: */
+    QVector<KDirectoryOpenFlag> flag(KDirectoryOpenFlag_None);
+    CGuestDirectory directory = m_comGuestSession.DirectoryOpen(path, /*aFilter*/ "", flag);
+
+    if (directory.isOk())
+    {
+        CFsObjInfo fsInfo = directory.Read();
+        while (fsInfo.isOk())
+        {
+            if (fsInfo.GetType() == KFsObjType_File)
+                statistics.m_uFileCount++;
+            else if (fsInfo.GetType() == KFsObjType_Symlink)
+                statistics.m_uSymlinkCount++;
+            else if(fsInfo.GetType() == KFsObjType_Directory)
+            {
+                QString dirPath = UIPathOperations::mergePaths(path, fsInfo.GetName());
+                directoryStatisticsRecursive(dirPath, statistics);
+            }
+        }
+    }
+    sigResultUpdated(statistics);
+}
 
 UIGuestFileTable::UIGuestFileTable(QWidget *pParent /*= 0*/)
@@ -290,7 +376,4 @@
 QString UIGuestFileTable::fsObjectPropertyString()
 {
-    if (m_comGuestSession.isNull())
-        return QString();
-
     QStringList selectedObjects = selectedItemPathList();
     if (selectedObjects.isEmpty())
@@ -300,4 +383,5 @@
         if (selectedObjects.at(0).isNull())
             return QString();
+
         CGuestFsObjInfo fileInfo = m_comGuestSession.FsObjQueryInfo(selectedObjects.at(0), true);
         if (!m_comGuestSession.isOk())
@@ -305,4 +389,5 @@
 
         QString propertyString;
+
         /* Name: */
         propertyString += "<b>Name:</b> " + UIPathOperations::getObjectName(fileInfo.GetName()) + "\n";
@@ -327,19 +412,85 @@
         return propertyString;
     }
-    return QString();
+
+    int fileCount = 0;
+    int directoryCount = 0;
+    ULONG64 totalSize = 0;
+
+    for(int i = 0; i < selectedObjects.size(); ++i)
+    {
+        CGuestFsObjInfo fileInfo = m_comGuestSession.FsObjQueryInfo(selectedObjects.at(0), true);
+        if (!m_comGuestSession.isOk())
+            continue;
+        FileObjectType type = fileType(fileInfo);
+
+        if (type == FileObjectType_File)
+            ++fileCount;
+        if (type == FileObjectType_Directory)
+            ++directoryCount;
+        totalSize += fileInfo.GetObjectSize();
+    }
+    QString propertyString;
+    propertyString += "<b>Selected:</b> " + QString::number(fileCount) + " files ";
+    propertyString += "and " + QString::number(directoryCount) + " directories";
+    propertyString += "<br/>";
+    propertyString += "<b>Size:</b> " + QString::number(totalSize) + QString(" bytes");
+    if (totalSize >= m_iKiloByte)
+        propertyString += " (" + humanReadableSize(totalSize) + ")";
+
+    return propertyString;
 }
 
 void UIGuestFileTable::showProperties()
 {
+    if (m_comGuestSession.isNull())
+        return;
     QString fsPropertyString = fsObjectPropertyString();
     if (fsPropertyString.isEmpty())
         return;
 
-    UIPropertiesDialog *dialog = new UIPropertiesDialog();
-    if (!dialog)
-        return;
-    dialog->setWindowTitle("Properties");
-    dialog->setPropertyText(fsPropertyString);
-    dialog->execute();
-    delete dialog;
-}
+    delete m_pPropertiesDialog;
+
+    m_pPropertiesDialog = new UIPropertiesDialog();
+    if (!m_pPropertiesDialog)
+        return;
+
+    QStringList selectedObjects = selectedItemPathList();
+    if (selectedObjects.size() == 0)
+        return;
+    UIGuestDirectoryDiskUsageComputer *directoryThread = 0;
+
+    /** @todo I have decided to look into this afterwards when API is more mature, for
+        currently this stuff runs into an assert in Main: */
+    /* if the selection include a directory or it is a multiple selection the create a worker thread
+       to compute total size of the selection (recusively) */
+    // bool createWorkerThread = (selectedObjects.size() > 1);
+    // if (!createWorkerThread &&
+    //     fileType(m_comGuestSession.FsObjQueryInfo(selectedObjects[0], true)) == FileObjectType_Directory)
+    //     createWorkerThread = true;
+    // if (createWorkerThread)
+    // {
+    //     directoryThread = new UIGuestDirectoryDiskUsageComputer(this, selectedObjects, m_comGuestSession);
+    //     if (directoryThread)
+    //     {
+    //         connect(directoryThread, &UIGuestDirectoryDiskUsageComputer::sigResultUpdated,
+    //                 this, &UIGuestFileTable::sltReceiveDirectoryStatistics/*, Qt::DirectConnection*/);
+    //         directoryThread->start();
+    //     }
+    // }
+
+    m_pPropertiesDialog->setWindowTitle("Properties");
+    m_pPropertiesDialog->setPropertyText(fsPropertyString);
+    m_pPropertiesDialog->execute();
+
+    if (directoryThread)
+    {
+        if (directoryThread->isRunning())
+            directoryThread->stopRecursion();
+        disconnect(directoryThread, &UIGuestDirectoryDiskUsageComputer::sigResultUpdated,
+                   this, &UIGuestFileTable::sltReceiveDirectoryStatistics/*, Qt::DirectConnection*/);
+    }
+
+    delete m_pPropertiesDialog;
+}
+
+#include "UIGuestFileTable.moc"
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestFileTable.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestFileTable.h	(revision 71562)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestFileTable.h	(revision 71563)
@@ -49,4 +49,5 @@
     virtual QString fsObjectPropertyString() /* override */;
     virtual void  showProperties() /* override */;
+
 private:
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIHostFileTable.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIHostFileTable.cpp	(revision 71562)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIHostFileTable.cpp	(revision 71563)
@@ -24,6 +24,4 @@
 # include <QDateTime>
 # include <QDir>
-# include <QMutex>
-# include <QThread>
 
 /* GUI includes: */
@@ -39,27 +37,15 @@
 
 /** Open directories recursively and sum the disk usage. Don't block the GUI thread while doing this */
-class UIHostDirectoryDiskUsageComputer : public QThread
+class UIHostDirectoryDiskUsageComputer : public UIDirectoryDiskUsageComputer
 {
     Q_OBJECT;
 
-signals:
-
-    void sigResultUpdated(UIDirectoryStatistics);
-
 public:
 
     UIHostDirectoryDiskUsageComputer(QObject *parent, QStringList strStartPath);
-    void stopRecursion();
-
-private:
-
-    /** Read the directory with the path @p path recursively and collect #of objects and
-        total size */
-    void directoryStatisticsRecursive(const QString &path, UIDirectoryStatistics &statistics);
-    void                  run();
-    QStringList           m_pathList;
-    UIDirectoryStatistics m_resultStatistics;
-    bool                  m_bContinueRunning;
-    QMutex                m_mutex;
+
+protected:
+
+    virtual void directoryStatisticsRecursive(const QString &path, UIDirectoryStatistics &statistics) /* override */;
 };
 
@@ -70,17 +56,8 @@
 
 UIHostDirectoryDiskUsageComputer::UIHostDirectoryDiskUsageComputer(QObject *parent, QStringList pathList)
-    :QThread(parent)
-    , m_pathList(pathList)
-    , m_bContinueRunning(true)
-{
-}
-
-void UIHostDirectoryDiskUsageComputer::run()
-{
-    for (int i = 0; i < m_pathList.size(); ++i)
-        directoryStatisticsRecursive(m_pathList[i], m_resultStatistics);
-}
-
-/** @todo Move the following function to a worker thread as it may take atbitrarly long time */
+    :UIDirectoryDiskUsageComputer(parent, pathList)
+{
+}
+
 void UIHostDirectoryDiskUsageComputer::directoryStatisticsRecursive(const QString &path, UIDirectoryStatistics &statistics)
 {
@@ -132,12 +109,4 @@
 }
 
-void UIHostDirectoryDiskUsageComputer::stopRecursion()
-{
-    m_mutex.lock();
-    m_bContinueRunning = false;
-    m_mutex.unlock();
-
-}
-
 
 /*********************************************************************************************************************************
@@ -147,5 +116,4 @@
 UIHostFileTable::UIHostFileTable(QWidget *pParent /* = 0 */)
     :UIGuestControlFileTable(pParent)
-    , m_pPropertiesDialog(0)
 {
     initializeFileTree();
@@ -369,4 +337,6 @@
         return;
 
+    delete m_pPropertiesDialog;
+
     m_pPropertiesDialog = new UIPropertiesDialog();
     if (!m_pPropertiesDialog)
@@ -405,10 +375,3 @@
 }
 
-void UIHostFileTable::sltReceiveDirectoryStatistics(UIDirectoryStatistics statistics)
-{
-    if (!m_pPropertiesDialog)
-        return;
-    m_pPropertiesDialog->addDirectoryStatistics(statistics);
-}
-
 #include "UIHostFileTable.moc"
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIHostFileTable.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIHostFileTable.h	(revision 71562)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIHostFileTable.h	(revision 71563)
@@ -44,13 +44,7 @@
     virtual void  showProperties() /* override */;
 
-private slots:
-
-    void sltReceiveDirectoryStatistics(UIDirectoryStatistics statictics);
-
 private:
 
     void prepareActions();
-
-    UIPropertiesDialog *m_pPropertiesDialog;
 };
 
