Index: trunk/src/VBox/Frontends/VirtualBox/src/VBoxGlobal.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/VBoxGlobal.cpp	(revision 1235)
+++ trunk/src/VBox/Frontends/VirtualBox/src/VBoxGlobal.cpp	(revision 1236)
@@ -721,5 +721,5 @@
     static const char *sSectionHrefTpl =
         "<tr><td rowspan=%1 align=left><img src='%2'></td>"
-            "<td width=100% colspan=2><a href='%3'><nobr>%4</nobr></a></td></tr>"
+            "<td width=100% colspan=2><b><a href='%3'><nobr>%4</nobr></a></b></td></tr>"
             "%5"
         "<tr><td width=100% colspan=2><font size=1>&nbsp;</font></td></tr>";
Index: trunk/src/VBox/Frontends/VirtualBox/src/VBoxSelectorWnd.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/VBoxSelectorWnd.cpp	(revision 1235)
+++ trunk/src/VBox/Frontends/VirtualBox/src/VBoxSelectorWnd.cpp	(revision 1236)
@@ -218,6 +218,9 @@
 
     void goToSettings();
+    void sessionStateChanged (const VBoxSessionStateChangeEvent &aE);
 
 private:
+
+    QUuid mMachineId;
 
     VBoxSelectorWnd *mParent;
@@ -264,4 +267,8 @@
                                           QSizePolicy::Minimum));
 
+    /* connect VirtualBox callback events */
+    connect (&vboxGlobal(), SIGNAL (sessionStateChanged (const VBoxSessionStateChangeEvent &)),
+             this, SLOT (sessionStateChanged (const VBoxSessionStateChangeEvent &)));
+
     /* apply language settings */
     languageChange();
@@ -270,5 +277,14 @@
 void VBoxVMDescriptionPage::setMachine (const CMachine &aMachine)
 {
+    Assert (!aMachine.isNull());
+
+    QUuid id = aMachine.GetId();
+    if (id == mMachineId)
+        return;
+
+    mMachineId = id;
+
     QString text = aMachine.GetDescription();
+
     if (text.isEmpty())
         text = QString::null;
@@ -298,4 +314,15 @@
 {
     mParent->vmSettings ("#general", 2);
+}
+
+void VBoxVMDescriptionPage::sessionStateChanged (const VBoxSessionStateChangeEvent &aE)
+{
+    if (aE.id != mMachineId)
+        return; /* not interested in other machines */
+
+    /* whether another direct session is open or not */
+    bool busy = aE.state != CEnums::SessionClosed;
+
+    mBtnEdit->setEnabled (!busy);
 }
 
@@ -1028,9 +1055,13 @@
         CMachine m = item->machine();
 
+        CEnums::MachineState state = item->state();
+        bool running = item->sessionState() != CEnums::SessionClosed;
+        bool modifyEnabled = !running && state != CEnums::Saved;
+
         if (aRefreshDetails)
         {
             vmDetailsView->setDetailsText (
                 vboxGlobal().detailsReport (m, false /* isNewVM */,
-                                               true /* withLinks */));
+                                               !running /* withLinks */));
         }
         if (aRefreshSnapshots)
@@ -1050,13 +1081,4 @@
         }
 
-        CEnums::MachineState state = item->state();
-        bool running = item->sessionState() != CEnums::SessionClosed;
-        bool modifyEnabled = !running && state != CEnums::Saved;
-
-        /* enable/disable info panes */
-        vmDetailsView->setEnabled (modifyEnabled);
-        vmSnapshotsWgt->setEnabled (!running);
-        vmDescriptionPage->setEnabled (!running);
-
         /* enable/disable modify actions */
         vmConfigAction->setEnabled (modifyEnabled);
@@ -1194,5 +1216,5 @@
 void VBoxSelectorWnd::sessionStateChanged (const VBoxSessionStateChangeEvent &e)
 {
-    refreshVMItem (e.id, false, false, false);
+    refreshVMItem (e.id, true, false, false);
 }
 
Index: trunk/src/VBox/Frontends/VirtualBox/ui/VBoxSnapshotsWgt.ui
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/ui/VBoxSnapshotsWgt.ui	(revision 1235)
+++ trunk/src/VBox/Frontends/VirtualBox/ui/VBoxSnapshotsWgt.ui	(revision 1236)
@@ -239,4 +239,10 @@
     <connection>
         <sender>&amp;vboxGlobal()</sender>
+        <signal>sessionStateChanged (const VBoxSessionStateChangeEvent &amp;)</signal>
+        <receiver>VBoxSnapshotsWgt</receiver>
+        <slot>sessionStateChanged (const VBoxSessionStateChangeEvent &amp;)</slot>
+    </connection>
+    <connection>
+        <sender>&amp;vboxGlobal()</sender>
         <signal>snapshotChanged (const VBoxSnapshotEvent &amp;)</signal>
         <receiver>VBoxSnapshotsWgt</receiver>
@@ -264,4 +270,5 @@
     <variable access="private">CMachine mMachine;</variable>
     <variable access="private">QUuid mMachineId;</variable>
+    <variable access="private">CEnums::SessionState mSessionState;</variable>
     <variable access="private">class ListViewItem; ListViewItem *mCurSnapshotItem;</variable>
     <variable access="private">class ToolTip; ToolTip *mToolTip;</variable>
@@ -279,4 +286,5 @@
     <slot>machineDataChanged (const VBoxMachineDataChangeEvent &amp; aE)</slot>
     <slot>machineStateChanged (const VBoxMachineStateChangeEvent &amp; aE)</slot>
+    <slot>sessionStateChanged (const VBoxSessionStateChangeEvent &amp; aE)</slot>
     <slot>snapshotChanged (const VBoxSnapshotEvent &amp; aE)</slot>
 </slots>
Index: trunk/src/VBox/Frontends/VirtualBox/ui/VBoxSnapshotsWgt.ui.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/ui/VBoxSnapshotsWgt.ui.h	(revision 1235)
+++ trunk/src/VBox/Frontends/VirtualBox/ui/VBoxSnapshotsWgt.ui.h	(revision 1236)
@@ -116,4 +116,6 @@
     CSnapshot snapshot() const { return mSnapshot; }
     QUuid snapshotId() const { return mId; }
+
+    CEnums::MachineState machineState() const { return mMachineState; }
 
     void recache()
@@ -336,5 +338,16 @@
 {
     mMachine = aMachine;
-    mMachineId = aMachine.isNull() ? QUuid() : aMachine.GetId();
+
+    if (aMachine.isNull())
+    {
+        mMachineId = QUuid();
+        mSessionState = CEnums::InvalidSessionState;
+    }
+    else
+    {
+        mMachineId = aMachine.GetId();
+        mSessionState = aMachine.GetSessionState();
+    }
+
     refreshAll();
 }
@@ -458,16 +471,21 @@
         listView->ensureItemVisible (item);
 
+    /* whether another direct session is open or not */
+    bool busy = mSessionState != CEnums::SessionClosed;
+
     /* enable/disable snapshot actions */
-    snapshotActionGroup->setEnabled (
+    snapshotActionGroup->setEnabled (!busy &&
         item && mCurSnapshotItem && item != mCurSnapshotItem->firstChild());
 
-    showSnapshotDetailsAction->setEnabled (snapshotActionGroup->isEnabled());
+    /* enable/disable the details action regardles of the session state */
+    showSnapshotDetailsAction->setEnabled (
+        item && mCurSnapshotItem && item != mCurSnapshotItem->firstChild());
 
     /* enable/disable current state actions */
-    curStateActionGroup->setEnabled (
+    curStateActionGroup->setEnabled (!busy &&
         item && mCurSnapshotItem && item == mCurSnapshotItem->firstChild());
 
     /* the Take Snapshot action is always enabled for the current state */
-    takeSnapshotAction->setEnabled (curStateActionGroup->isEnabled() ||
+    takeSnapshotAction->setEnabled (!busy && curStateActionGroup->isEnabled() ||
                                     (item && !mCurSnapshotItem));
 
@@ -489,5 +507,5 @@
         {
             /* we have only one item -- current state */
-            takeSnapshotAction->addTo (mContextMenu);
+            curStateActionGroup->addTo (mContextMenu);
         }
         else
@@ -672,4 +690,13 @@
 }
 
+void VBoxSnapshotsWgt::sessionStateChanged (const VBoxSessionStateChangeEvent &aE)
+{
+    if (aE.id != mMachineId)
+        return; /* not interested in other machines */
+
+    mSessionState = aE.state;
+    listView_currentChanged (listView->currentItem());
+}
+
 void VBoxSnapshotsWgt::snapshotChanged (const VBoxSnapshotEvent &aE)
 {
