Index: trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp	(revision 77723)
+++ trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp	(revision 77724)
@@ -25,4 +25,5 @@
 #include "UIActionPool.h"
 #include "UIActionPoolRuntime.h"
+#include "UIConsoleEventHandler.h"
 #include "UIFrameBuffer.h"
 #include "UISession.h"
@@ -273,4 +274,10 @@
     virtual void viewportScrolled(int, int) {}
 #endif /* VBOX_WITH_VIDEOHWACCEL */
+
+protected slots:
+
+    /** Handles guest request to change the cursor position to @a uX * @a uY.
+      * @param  fContainsData  Brings whether the @a uX and @a uY values are valid and could be used by the GUI now. */
+    void sltCursorPositionChange(bool fContainsData, unsigned long uX, unsigned long uY);
 
 protected:
@@ -388,4 +395,9 @@
      /** Identifier returned by AttachFramebuffer. Used in DetachFramebuffer. */
      QUuid m_uFramebufferId;
+
+     /** Holds whether cursor position is valid. */
+     bool   m_fCursorPositionValid;
+     /** Holds the last cursor rectangle. */
+     QRect  m_cursorRectangle;
 };
 
@@ -530,4 +542,5 @@
     , m_dDevicePixelRatioActual(1.0)
     , m_fUseUnscaledHiDPIOutput(false)
+    , m_fCursorPositionValid(false)
 {
     /* Update coordinate-system: */
@@ -1290,4 +1303,39 @@
 }
 
+void UIFrameBufferPrivate::sltCursorPositionChange(bool fContainsData, unsigned long uX, unsigned long uY)
+{
+    /* Remember whether cursor position is valid: */
+    m_fCursorPositionValid = fContainsData;
+
+    /* Do we have view and valid cursor position? */
+    if (m_pMachineView && m_fCursorPositionValid)
+    {
+        /* Acquire cursor position and size: */
+        QPoint cursorPosition = QPoint(uX, uY);
+        QSize cursorSize = m_pMachineView->uisession()->cursorSize();
+
+        /* Apply the scale-factor if necessary: */
+        cursorPosition *= scaleFactor();
+        cursorSize *= scaleFactor();
+
+        /* Take the device-pixel-ratio into account: */
+        if (!useUnscaledHiDPIOutput())
+        {
+            cursorPosition *= devicePixelRatioActual();
+            cursorSize *= devicePixelRatioActual();
+        }
+        cursorPosition /= devicePixelRatio();
+        cursorSize /= devicePixelRatio();
+
+        /* Call for a viewport update, we need to update cumulative
+         * region containing previous and current cursor rectagles. */
+        const QRect cursorRectangle = QRect(cursorPosition, cursorSize);
+        m_pMachineView->viewport()->update(QRegion(m_cursorRectangle) + cursorRectangle);
+
+        /* Remember current cursor rectangle: */
+        m_cursorRectangle = cursorRectangle;
+    }
+}
+
 void UIFrameBufferPrivate::prepareConnections()
 {
@@ -1305,4 +1353,8 @@
             m_pMachineView, SLOT(sltHandle3DOverlayVisibilityChange(bool)),
             Qt::QueuedConnection);
+
+    /* Attach GUI connections: */
+    connect(gConsoleEvents, &UIConsoleEventHandler::sigCursorPositionChange,
+            this, &UIFrameBufferPrivate::sltCursorPositionChange);
 }
 
@@ -1318,4 +1370,8 @@
     disconnect(this, SIGNAL(sigNotifyAbout3DOverlayVisibilityChange(bool)),
                m_pMachineView, SLOT(sltHandle3DOverlayVisibilityChange(bool)));
+
+    /* Detach GUI connections: */
+    disconnect(gConsoleEvents, &UIConsoleEventHandler::sigCursorPositionChange,
+               this, &UIFrameBufferPrivate::sltCursorPositionChange);
 }
 
@@ -1407,4 +1463,17 @@
         pSourceImage = 0;
     }
+
+    /* Paint cursor if it has valid shape and position: */
+    if (m_pMachineView->uisession()->isValidPointerShapePresent() && m_fCursorPositionValid)
+    {
+        /* Acquire session cursor pixmap: */
+        QPixmap cursorPixmap = m_pMachineView->uisession()->cursorPixmap();
+
+        /* Take the device-pixel-ratio into account: */
+        cursorPixmap.setDevicePixelRatio(devicePixelRatio());
+
+        /* Draw sub-pixmap: */
+        painter.drawPixmap(m_cursorRectangle.topLeft(), cursorPixmap);
+    }
 }
 
@@ -1497,4 +1566,17 @@
         pSourceImage = 0;
     }
+
+    /* Paint cursor if it has valid shape and position: */
+    if (m_pMachineView->uisession()->isValidPointerShapePresent() && m_fCursorPositionValid)
+    {
+        /* Acquire session cursor pixmap: */
+        QPixmap cursorPixmap = m_pMachineView->uisession()->cursorPixmap();
+
+        /* Take the device-pixel-ratio into account: */
+        cursorPixmap.setDevicePixelRatio(devicePixelRatio());
+
+        /* Draw sub-pixmap: */
+        painter.drawPixmap(m_cursorRectangle.topLeft(), cursorPixmap);
+    }
 }
 
Index: trunk/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp	(revision 77723)
+++ trunk/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp	(revision 77724)
@@ -628,5 +628,4 @@
     /* Notify listeners about mouse capability changed: */
     emit sigMousePointerShapeChange();
-
 }
 
@@ -1831,4 +1830,8 @@
 
 #endif
+
+    /* Cache cursor pixmap data: */
+    m_cursorPixmap = m_cursor.pixmap();
+    m_cursorSize = m_cursorPixmap.size();
 }
 
Index: trunk/src/VBox/Frontends/VirtualBox/src/runtime/UISession.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/runtime/UISession.h	(revision 77723)
+++ trunk/src/VBox/Frontends/VirtualBox/src/runtime/UISession.h	(revision 77724)
@@ -27,4 +27,5 @@
 #include <QEvent>
 #include <QMap>
+#include <QPixmap>
 
 /* GUI includes: */
@@ -132,5 +133,11 @@
     WId mainMachineWindowId() const;
     UIMachineWindow *activeMachineWindow() const;
+
+    /** Returns currently cached mouse cursor. */
     QCursor cursor() const { return m_cursor; }
+    /** Returns currently cached mouse cursor pixmap. */
+    QPixmap cursorPixmap() const { return m_cursorPixmap; }
+    /** Returns currently cached mouse cursor size. */
+    QSize cursorSize() const { return m_cursorSize; }
 
     /** @name Branding stuff.
@@ -476,5 +483,11 @@
     KMachineState m_machineStatePrevious;
     KMachineState m_machineState;
-    QCursor m_cursor;
+
+    /** Holds cached mouse cursor. */
+    QCursor  m_cursor;
+    /** Holds cached mouse cursor pixmap. */
+    QPixmap  m_cursorPixmap;
+    /** Holds cached mouse cursor size. */
+    QSize    m_cursorSize;
 
     /** @name Branding variables.
