Index: /trunk/src/VBox/Frontends/VirtualBox/VirtualBox.qrc
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/VirtualBox.qrc	(revision 16801)
+++ /trunk/src/VBox/Frontends/VirtualBox/VirtualBox.qrc	(revision 16802)
@@ -319,4 +319,8 @@
     <file alias="monitor.png">images/monitor.png</file>
     <file alias="monitor_glossy.png">images/monitor_glossy.png</file>
+    <file alias="arrow_right_10px.png">images/arrow_right_10px.png</file>
+    <file alias="arrow_left_10px.png">images/arrow_left_10px.png</file>
+    <file alias="arrow_up_10px.png">images/arrow_up_10px.png</file>
+    <file alias="arrow_down_10px.png">images/arrow_down_10px.png</file>
     <file alias="name_16px.png">images/name_16px.png</file>
     <file alias="os_type_16px.png">images/os_type_16px.png</file>
Index: /trunk/src/VBox/Frontends/VirtualBox/include/QIMessageBox.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/include/QIMessageBox.h	(revision 16801)
+++ /trunk/src/VBox/Frontends/VirtualBox/include/QIMessageBox.h	(revision 16802)
@@ -24,4 +24,5 @@
 #define __QIMessageBox_h__
 
+/* VBox includes */
 #include "QIDialog.h"
 
@@ -31,15 +32,53 @@
 #include <QTextEdit>
 
+/* VBox forwards */
+class QIArrowSplitter;
+class QIDialogButtonBox;
 class QILabel;
+
+/* Qt forwards */
+class QCloseEvent;
 class QLabel;
 class QPushButton;
 class QSpacerItem;
-class QCloseEvent;
+class QToolButton;
+class QVBoxLayout;
 
-class QIDialogButtonBox;
+/** @class QIArrowSplitter
+ *
+ *  The QIArrowSplitter class is a folding widget placeholder.
+ *  It is declared here until moved into separate file in case
+ *  of it will be used somewhere except problem-reporter dialog.
+ */
+class QIArrowSplitter : public QWidget
+{
+    Q_OBJECT;
 
+public:
+
+    QIArrowSplitter (QWidget *aParent = 0);
+
+    void addWidget (const QString &aName, QWidget *aWidget);
+
+public slots:
+
+    void toggleWidget();
+
+private:
+
+    QVBoxLayout *mMainLayout;
+    QList <QToolButton*> mButtonsList;
+    QList <QWidget*> mWidgetsList;
+};
+
+/** @class QIMessageBox
+ *
+ *  The QIMessageBox class is a message box similar to QMessageBox.
+ *  It partly implements the QMessageBox interface and adds some enhanced
+ *  functionality.
+ */
 class QIMessageBox : public QIDialog
 {
-    Q_OBJECT
+    Q_OBJECT;
 
 public:
@@ -92,4 +131,5 @@
 
     void closeEvent (QCloseEvent *e);
+    void showEvent (QShowEvent *e);
 
 private slots:
@@ -109,8 +149,10 @@
     QCheckBox *mFlagCB, *mFlagCB_Main, *mFlagCB_Details;
     QWidget *mDetailsVBox;
+    QIArrowSplitter *mDetailsSplitter;
     QTextEdit *mDetailsText;
     QSpacerItem *mSpacer;
     QIDialogButtonBox *mButtonBox;
     bool mWasDone : 1;
+    bool mWasPolished : 1;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/QIMessageBox.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/QIMessageBox.cpp	(revision 16801)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/QIMessageBox.cpp	(revision 16802)
@@ -21,7 +21,7 @@
  */
 
+/* VBox includes */
 #include "VBoxDefs.h"
 #include "VBoxGlobal.h"
-
 #include "QIMessageBox.h"
 #include "QILabel.h"
@@ -33,6 +33,78 @@
 /* Qt includes */
 #include <QHBoxLayout>
+#include <QLabel>
 #include <QPushButton>
-#include <QLabel>
+#include <QToolButton>
+
+/** @class QIArrowSplitter
+ *
+ *  The QIArrowSplitter class is a folding widget placeholder.
+ */
+QIArrowSplitter::QIArrowSplitter (QWidget *aParent)
+    : QWidget (aParent)
+    , mMainLayout (new QVBoxLayout (this))
+{
+    VBoxGlobal::setLayoutMargin (mMainLayout, 0);
+}
+
+void QIArrowSplitter::addWidget (const QString &aName, QWidget *aWidget)
+{
+    /* Creating arrow tool-button */
+    QToolButton *arrowButton = new QToolButton();
+    connect (arrowButton, SIGNAL (clicked (bool)), this, SLOT (toggleWidget()));
+    arrowButton->setIcon (VBoxGlobal::iconSet (":/arrow_right_10px.png"));
+    arrowButton->setFocusPolicy (Qt::StrongFocus);
+    arrowButton->setAutoRaise (true);
+    arrowButton->setFixedSize (14, 16);
+    mButtonsList.append (arrowButton);
+
+    /* Creating description label */
+    QLabel *descriptionLabel = new QLabel (aName);
+    descriptionLabel->setBuddy (arrowButton);
+
+    mWidgetsList.append (aWidget);
+
+    QHBoxLayout *lineLayout = new QHBoxLayout();
+    lineLayout->addWidget (arrowButton);
+    lineLayout->addWidget (descriptionLabel);
+
+    mMainLayout->insertWidget (0, aWidget);
+    mMainLayout->insertLayout (0, lineLayout);
+}
+
+void QIArrowSplitter::toggleWidget()
+{
+    QToolButton *arrowButton = qobject_cast <QToolButton*> (sender());
+
+    /* Toggle all or the specified arrow & related widget */
+    foreach (QToolButton *itemButton, mButtonsList)
+    {
+        if ((itemButton == arrowButton) || (!arrowButton))
+        {
+            QWidget *relatedWidget = mWidgetsList [mButtonsList.indexOf (itemButton)];
+            Assert (relatedWidget);
+            relatedWidget->setVisible (!relatedWidget->isVisible());
+            itemButton->setIcon (VBoxGlobal::iconSet (relatedWidget->isVisible() ?
+                                 ":/arrow_down_10px.png" : ":/arrow_right_10px.png"));
+        }
+    }
+
+    /* Update full layout system of message window */
+    QList <QLayout*> layouts = findChildren <QLayout*> ();
+    foreach (QLayout *item, layouts)
+    {
+        item->update();
+        item->activate();
+    }
+
+    /* Update main layout of message window at last */
+    window()->layout()->update();
+    window()->layout()->activate();
+
+    /* Now resize window to minimum possible size */
+    window()->resize (window()->minimumSizeHint());
+    qApp->processEvents();
+    window()->setFixedSize (window()->size());
+}
 
 /** @class QIMessageBox
@@ -51,4 +123,5 @@
     : QIDialog (aParent)
     , mWasDone (false)
+    , mWasPolished (false)
 {
 #ifdef Q_WS_MAC
@@ -99,12 +172,10 @@
     hLayout->addLayout (messageVBoxLayout);
 
-    mTextLabel = new QILabel (aText, NULL);
+    mTextLabel = new QILabel (aText);
     mTextLabel->setAlignment (Qt::AlignLeft | Qt::AlignTop);
     mTextLabel->setWordWrap (true);
-    QSizePolicy sp (QSizePolicy::Minimum, QSizePolicy::Minimum);
+    QSizePolicy sp (QSizePolicy::Preferred, QSizePolicy::Preferred);
     sp.setHeightForWidth (true);
     mTextLabel->setSizePolicy (sp);
-    mTextLabel->adjustSize();
-    mTextLabel->setMinimumWidth (mTextLabel->sizeHint().width());
     messageVBoxLayout->addWidget (mTextLabel);
 
@@ -116,7 +187,10 @@
     layout->addWidget (mDetailsVBox);
 
-    QVBoxLayout* detailsVBoxLayout = new QVBoxLayout(mDetailsVBox);
+    QVBoxLayout* detailsVBoxLayout = new QVBoxLayout (mDetailsVBox);
     VBoxGlobal::setLayoutMargin (detailsVBoxLayout, 0);
     detailsVBoxLayout->setSpacing (10);
+
+    mDetailsSplitter = new QIArrowSplitter();
+    detailsVBoxLayout->addWidget (mDetailsSplitter);
 
     mDetailsText = new QTextEdit();
@@ -130,5 +204,5 @@
     mDetailsText->setSizePolicy (QSizePolicy::Expanding,
                                  QSizePolicy::MinimumExpanding);
-    detailsVBoxLayout->addWidget (mDetailsText);
+    mDetailsSplitter->addWidget (tr ("&Details:"), mDetailsText);
 
     mFlagCB_Details = new QCheckBox();
@@ -157,7 +231,4 @@
     /* this call is a must -- it initializes mFlagCB and mSpacer */
     setDetailsShown (false);
-
-    /* Set fixed size */
-    setSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed);
 }
 
@@ -379,4 +450,20 @@
 }
 
+void QIMessageBox::showEvent (QShowEvent *e)
+{
+    if (!mWasPolished)
+    {
+        /* Polishing sub-widgets */
+        resize (minimumSizeHint());
+        qApp->processEvents();
+        mTextLabel->setMinimumWidth (mTextLabel->width());
+        mTextLabel->updateSizeHint();
+        mDetailsSplitter->toggleWidget();
+        mWasPolished = true;
+    }
+
+    QIDialog::showEvent (e);
+}
+
 void QIMessageBox::reject()
 {
