Index: /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk	(revision 109018)
+++ /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk	(revision 109019)
@@ -980,4 +980,5 @@
 	src/manager/UIVirtualMachineItemCloud.cpp \
 	src/manager/chooser/UIChooserAbstractModel.cpp \
+	src/manager/tools/UIToolsItem.cpp \
 	src/manager/tools/UIToolsModel.cpp \
 	src/activity/overview/UIVMActivityOverviewWidget.cpp \
Index: /trunk/src/VBox/Frontends/VirtualBox/src/manager/tools/UIToolsItem.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/manager/tools/UIToolsItem.cpp	(revision 109018)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/manager/tools/UIToolsItem.cpp	(revision 109019)
@@ -31,4 +31,7 @@
 #include <QGraphicsScene>
 #include <QPainter>
+#include <QPropertyAnimation>
+#include <QSignalTransition>
+#include <QStateMachine>
 #include <QStyle>
 #include <QStyleOptionGraphicsItem>
@@ -175,4 +178,160 @@
     UIToolsItem *item() const { return qobject_cast<UIToolsItem*>(object()); }
 };
+
+
+/** QObject extension used as animation engine object. */
+class UIToolsItemAnimationEngine : public QObject
+{
+    Q_OBJECT;
+
+signals:
+
+    /** Initiates transition to hovered state. */
+    void sigHovered();
+    /** Initiates transition to unhovered state. */
+    void sigUnhovered();
+
+public:
+
+    /** Constructs animation engine passing @a pParent to the base-class. */
+    UIToolsItemAnimationEngine(UIToolsItem *pParent);
+
+private:
+
+    /** Prepares everything. */
+    void prepare();
+    /** Prepares machine. */
+    void prepareMachine();
+    /** Prepares connections. */
+    void prepareConnections();
+
+    /** Inits engine. */
+    void init();
+
+    /** Holds the parent item reference. */
+    UIToolsItem *m_pParent;
+
+    /** Holds the state-machine instance. */
+    QStateMachine *m_pMachine;
+
+    /** Holds the Unhovered state instance. */
+    QState *m_pStateUnhovered;
+    /** Holds the Hovered state instance. */
+    QState *m_pStateHovered;
+};
+
+
+/** QPropertyAnimation extension used as tool-item animation wrapper. */
+class UIToolsItemAnimation : public QPropertyAnimation
+{
+    Q_OBJECT;
+
+public:
+
+    /** Constructs tool-item animation passing @a pParent to the base-class.
+      * @param  pTarget       Brings the object animation alters property for.
+      * @param  propertyName  Brings the name of property inside the @a pTarget.
+      * @param  fForward      Brings whether animation goes to iValue or from it. */
+    UIToolsItemAnimation(QObject *pTarget, const QByteArray &propertyName, QObject *pParent, bool fForward);
+};
+
+
+/*********************************************************************************************************************************
+*   Class UIToolsItemAnimationEngine implementation.                                                                             *
+*********************************************************************************************************************************/
+
+UIToolsItemAnimationEngine::UIToolsItemAnimationEngine(UIToolsItem *pParent)
+    : QObject(pParent)
+    , m_pParent(pParent)
+    , m_pMachine(0)
+    , m_pStateUnhovered(0)
+    , m_pStateHovered(0)
+{
+    prepare();
+}
+
+void UIToolsItemAnimationEngine::prepare()
+{
+    /* Prepare everything: */
+    prepareMachine();
+    prepareConnections();
+
+    /* Init can be async,
+     * but for now it's Ok that way. */
+    init();
+}
+
+void UIToolsItemAnimationEngine::prepareMachine()
+{
+    /* Prepare animation machine: */
+    m_pMachine = new QStateMachine(this);
+    if (m_pMachine)
+    {
+        /* Prepare states: */
+        m_pStateUnhovered = new QState(m_pMachine);
+        m_pStateHovered = new QState(m_pMachine);
+
+        /* Configure Unhovered state: */
+        if (m_pStateUnhovered)
+        {
+            m_pStateUnhovered->assignProperty(m_pParent, "hoveringProgress", 0);
+
+            /* Add Unhovered=>Hovered state transition: */
+            QSignalTransition *pTrnUnhoveredToHovered =
+                m_pStateUnhovered->addTransition(this, SIGNAL(sigHovered()), m_pStateHovered);
+            if (pTrnUnhoveredToHovered)
+            {
+                /* Create animation for hoveringProgress: */
+                UIToolsItemAnimation *pAnmUnhoveredToHovered =
+                    new UIToolsItemAnimation(m_pParent, "hoveringProgress", this, true);
+                pTrnUnhoveredToHovered->addAnimation(pAnmUnhoveredToHovered);
+            }
+        }
+
+        /* Configure Hovered state: */
+        if (m_pStateHovered)
+        {
+            m_pStateHovered->assignProperty(m_pParent, "hoveringProgress", 100);
+
+            /* Add Hovered=>Unhovered state transition: */
+            QSignalTransition *pTrnHoveredToUnhovered =
+                m_pStateHovered->addTransition(this, SIGNAL(sigUnhovered()), m_pStateUnhovered);
+            if (pTrnHoveredToUnhovered)
+            {
+                /* Create animation for hoveringProgress: */
+                UIToolsItemAnimation *pAnmHoveredToUnhovered =
+                    new UIToolsItemAnimation(m_pParent, "hoveringProgress", this, false);
+                pTrnHoveredToUnhovered->addAnimation(pAnmHoveredToUnhovered);
+            }
+        }
+    }
+}
+
+void UIToolsItemAnimationEngine::prepareConnections()
+{
+    connect(m_pParent, &UIToolsItem::sigHovered, this, &UIToolsItemAnimationEngine::sigHovered);
+    connect(m_pParent, &UIToolsItem::sigUnhovered, this, &UIToolsItemAnimationEngine::sigUnhovered);
+}
+
+void UIToolsItemAnimationEngine::init()
+{
+    /* Define initial animation state: */
+    m_pMachine->setInitialState(m_pParent->isHovered() ? m_pStateHovered : m_pStateUnhovered);
+    m_pMachine->start();
+}
+
+
+/*********************************************************************************************************************************
+*   Class UIToolsItemAnimation implementation.                                                                                   *
+*********************************************************************************************************************************/
+
+UIToolsItemAnimation::UIToolsItemAnimation(QObject *pTarget, const QByteArray &propertyName, QObject *pParent, bool fForward)
+    : QPropertyAnimation(pTarget, propertyName, pParent)
+{
+    setEasingCurve(QEasingCurve(QEasingCurve::OutQuart));
+    setStartValue(fForward ? 0 : 100);
+    setEndValue(fForward ? 100 : 0);
+    setDuration(300);
+}
 
 
@@ -190,4 +349,6 @@
     , m_iPreviousMinimumWidthHint(0)
     , m_iPreviousMinimumHeightHint(0)
+    , m_pAnimationEngine(0)
+    , m_iHoveringProgress(0)
 {
     prepare();
@@ -360,4 +521,7 @@
             QToolTip::showText(posAtScreen, name());
         }
+
+        /* Notify listeners: */
+        emit sigHovered();
     }
 
@@ -374,4 +538,7 @@
         /* Hide tooltip for good: */
         QToolTip::hideText();
+
+        /* Notify listeners: */
+        emit sigUnhovered();
     }
 }
@@ -415,4 +582,7 @@
     updatePixmap();
     updateNameSize();
+
+    /* Create animation engine: */
+    m_pAnimationEngine = new UIToolsItemAnimationEngine(this);
 }
 
@@ -698,4 +868,9 @@
                                                                        || model()->currentItem(itemClass()) == this);
         if (fCondition1 || fCondition2)
+        {
+            /* Acquire font: */
+            const QFont fnt = data(Qt::FontRole).value<QFont>();
+
+            /* Paint text: */
             paintText(/* Painter: */
                       pPainter,
@@ -703,9 +878,20 @@
                       QPoint(iNameX, iNameY),
                       /* Font to paint text: */
-                      data(Qt::FontRole).value<QFont>(),
+                      fnt,
                       /* Paint device: */
                       model()->paintDevice(),
                       /* Text to paint: */
                       m_strName);
+
+            /* Paint animated underline: */
+            if (hoveringProgress())
+            {
+                QFontMetrics fm(fnt);
+                const double fRatio = (double)hoveringProgress() / 100;
+                const int iLength = fRatio * fm.horizontalAdvance(m_strName);
+                pPainter->drawLine(QPoint(iNameX, iNameY + fm.height()),
+                                   QPoint(iNameX + iLength, iNameY + fm.height()));
+            }
+        }
     }
 }
@@ -786,2 +972,11 @@
     pPainter->restore();
 }
+
+void UIToolsItem::setHoveringProgress(int iProgress)
+{
+    m_iHoveringProgress = iProgress;
+    update();
+}
+
+
+#include "UIToolsItem.moc"
Index: /trunk/src/VBox/Frontends/VirtualBox/src/manager/tools/UIToolsItem.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/manager/tools/UIToolsItem.h	(revision 109018)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/manager/tools/UIToolsItem.h	(revision 109019)
@@ -44,4 +44,5 @@
 class QGraphicsScene;
 class QGraphicsSceneHoverEvent;
+class UIToolsItemAnimationEngine;
 class UIToolsModel;
 
@@ -51,6 +52,15 @@
 {
     Q_OBJECT;
+    Q_PROPERTY(int hoveringProgress READ hoveringProgress WRITE setHoveringProgress);
 
 signals:
+
+    /** @name Item stuff.
+      * @{ */
+        /** Notifies listeners about item hovered. */
+        void sigHovered();
+        /** Notifies listeners about item unhovered. */
+        void sigUnhovered();
+    /** @} */
 
     /** @name Layout stuff.
@@ -102,4 +112,7 @@
         /** Defines whether item is @a fHidden by the @a enmReason. */
         void setHiddenByReason(bool fHidden, HidingReason enmReason);
+
+        /** Returns whether item is hovered. */
+        bool isHovered() const { return m_fHovered; }
     /** @} */
 
@@ -210,4 +223,12 @@
                                        const QColor &color,
                                        int iPadding);
+    /** @} */
+
+    /** @name Animation stuff.
+     * @{ */
+        /** Returns hovering progress. */
+        int hoveringProgress() const { return m_iHoveringProgress; }
+        /** Defines hovering @a iProgress. */
+        void setHoveringProgress(int iProgress);
     /** @} */
 
@@ -247,4 +268,13 @@
         QSize  m_nameSize;
     /** @} */
+
+    /** @name Animation stuff.
+     * @{ */
+        /** Holds the animation engine instance. */
+        UIToolsItemAnimationEngine *m_pAnimationEngine;
+
+        /** Holds the hovering progress. */
+        int  m_iHoveringProgress;
+    /** @} */
 };
 
