Index: /trunk/doc/manual/en_US/man_VBoxManage-modifyvm.xml
===================================================================
--- /trunk/doc/manual/en_US/man_VBoxManage-modifyvm.xml	(revision 95367)
+++ /trunk/doc/manual/en_US/man_VBoxManage-modifyvm.xml	(revision 95368)
@@ -386,4 +386,5 @@
           <arg choice="plain">usbtablet</arg>
           <arg choice="plain">usbmultitouch</arg>
+          <arg choice="plain">usbmtscreenpluspad</arg>
         </group></arg>
       <arg>--keyboard=<group choice="plain">
@@ -1752,10 +1753,11 @@
       <variablelist>
         <varlistentry>
-          <term><option>--mouse=ps2 | usb | usbtablet | usbmultitouch</option></term>
+          <term><option>--mouse=ps2 | usb | usbtablet | usbmultitouch | usbmtscreenpluspad</option></term>
           <listitem><para>
               Specifies the mode of the mouse to use in the VM. Valid
               values are: <literal>ps2</literal>,
-              <literal>usb</literal>, <literal>usbtablet</literal>, and
-              <literal>usbmultitouch</literal>.
+              <literal>usb</literal>, <literal>usbtablet</literal>,
+              <literal>usbmultitouch</literal> and
+              <literal>usbmtscreenpluspad</literal>.
             </para></listitem>
         </varlistentry>
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp	(revision 95367)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp	(revision 95368)
@@ -2283,4 +2283,10 @@
                         fEnableUsb = true;
                 }
+                else if (!RTStrICmp(ValueUnion.psz, "usbmtscreenpluspad"))
+                {
+                    CHECK_ERROR(sessionMachine, COMSETTER(PointingHIDType)(PointingHIDType_USBMultiTouchScreenPlusPad));
+                    if (SUCCEEDED(hrc))
+                        fEnableUsb = true;
+                }
                 else if (!RTStrICmp(ValueUnion.psz, "none"))
                 {
Index: /trunk/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendCOM.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendCOM.cpp	(revision 95367)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendCOM.cpp	(revision 95368)
@@ -285,10 +285,11 @@
     switch (type)
     {
-        case KPointingHIDType_None:          return QApplication::translate("UICommon", "None", "PointingHIDType");
-        case KPointingHIDType_PS2Mouse:      return QApplication::translate("UICommon", "PS/2 Mouse", "PointingHIDType");
-        case KPointingHIDType_USBMouse:      return QApplication::translate("UICommon", "USB Mouse", "PointingHIDType");
-        case KPointingHIDType_USBTablet:     return QApplication::translate("UICommon", "USB Tablet", "PointingHIDType");
-        case KPointingHIDType_ComboMouse:    return QApplication::translate("UICommon", "PS/2 and USB Mouse", "PointingHIDType");
-        case KPointingHIDType_USBMultiTouch: return QApplication::translate("UICommon", "USB Multi-Touch Tablet", "PointingHIDType");
+        case KPointingHIDType_None:                       return QApplication::translate("UICommon", "None", "PointingHIDType");
+        case KPointingHIDType_PS2Mouse:                   return QApplication::translate("UICommon", "PS/2 Mouse", "PointingHIDType");
+        case KPointingHIDType_USBMouse:                   return QApplication::translate("UICommon", "USB Mouse", "PointingHIDType");
+        case KPointingHIDType_USBTablet:                  return QApplication::translate("UICommon", "USB Tablet", "PointingHIDType");
+        case KPointingHIDType_ComboMouse:                 return QApplication::translate("UICommon", "PS/2 and USB Mouse", "PointingHIDType");
+        case KPointingHIDType_USBMultiTouch:              return QApplication::translate("UICommon", "USB Multi-Touch Tablet", "PointingHIDType");
+        case KPointingHIDType_USBMultiTouchScreenPlusPad: return QApplication::translate("UICommon", "USB MT TouchScreen and TouchPad", "PointingHIDType");
         default: AssertMsgFailed(("No text for %d", type)); break;
     }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.cpp	(revision 95367)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.cpp	(revision 95368)
@@ -428,5 +428,6 @@
             CMouseCapabilityChangedEvent comEventSpecific(pEvent);
             emit sigMouseCapabilityChange(comEventSpecific.GetSupportsAbsolute(), comEventSpecific.GetSupportsRelative(),
-                                          comEventSpecific.GetSupportsMultiTouch(), comEventSpecific.GetNeedsHostCursor());
+                                          comEventSpecific.GetSupportsTouchScreen(), comEventSpecific.GetSupportsTouchPad(),
+                                          comEventSpecific.GetNeedsHostCursor());
             break;
         }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.h	(revision 95367)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.h	(revision 95368)
@@ -149,6 +149,6 @@
         /** Notifies about mouse pointer @a shapeData change. */
         void sigMousePointerShapeChange(const UIMousePointerShapeData &shapeData);
-        /** Notifies about mouse capability change to @a fSupportsAbsolute, @a fSupportsRelative, @a fSupportsMultiTouch and @a fNeedsHostCursor. */
-        void sigMouseCapabilityChange(bool fSupportsAbsolute, bool fSupportsRelative, bool fSupportsMultiTouch, bool fNeedsHostCursor);
+        /** Notifies about mouse capability change to @a fSupportsAbsolute, @a fSupportsRelative, @a fSupportsMTAbsolute, @a fSupportsMTRelative and @a fNeedsHostCursor. */
+        void sigMouseCapabilityChange(bool fSupportsAbsolute, bool fSupportsRelative, bool fSupportsMTAbsolute, bool fSupportsMTRelative, bool fNeedsHostCursor);
         /** Notifies about 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. */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIConsoleEventHandler.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIConsoleEventHandler.cpp	(revision 95367)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIConsoleEventHandler.cpp	(revision 95368)
@@ -44,6 +44,9 @@
     /** Notifies about mouse pointer @a shapeData change. */
     void sigMousePointerShapeChange(const UIMousePointerShapeData &shapeData);
-    /** Notifies about mouse capability change to @a fSupportsAbsolute, @a fSupportsRelative, @a fSupportsMultiTouch and @a fNeedsHostCursor. */
-    void sigMouseCapabilityChange(bool fSupportsAbsolute, bool fSupportsRelative, bool fSupportsMultiTouch, bool fNeedsHostCursor);
+    /** Notifies about mouse capability change to @a fSupportsAbsolute, @a fSupportsRelative,
+      * @a fSupportsTouchScreen, @a fSupportsTouchPad, and @a fNeedsHostCursor. */
+    void sigMouseCapabilityChange(bool fSupportsAbsolute, bool fSupportsRelative,
+                                  bool fSupportsTouchScreen, bool fSupportsTouchPad,
+                                  bool fNeedsHostCursor);
     /** Notifies about 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. */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIConsoleEventHandler.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIConsoleEventHandler.h	(revision 95367)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIConsoleEventHandler.h	(revision 95368)
@@ -49,6 +49,9 @@
     /** Notifies about mouse pointer @a shapeData change. */
     void sigMousePointerShapeChange(const UIMousePointerShapeData &shapeData);
-    /** Notifies about mouse capability change to @a fSupportsAbsolute, @a fSupportsRelative, @a fSupportsMultiTouch and @a fNeedsHostCursor. */
-    void sigMouseCapabilityChange(bool fSupportsAbsolute, bool fSupportsRelative, bool fSupportsMultiTouch, bool fNeedsHostCursor);
+    /** Notifies about mouse capability change to @a fSupportsAbsolute, @a fSupportsRelative,
+     * @a fSupportsTouchScreen, @a fSupportsTouchPad and @a fNeedsHostCursor. */
+    void sigMouseCapabilityChange(bool fSupportsAbsolute, bool fSupportsRelative,
+                                  bool fSupportsTouchScreen, bool fSupportsTouchPad,
+                                  bool fNeedsHostCursor);
     /** Notifies about 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. */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp	(revision 95367)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp	(revision 95368)
@@ -593,9 +593,11 @@
     bool fIsMouseSupportsAbsolute = uisession()->isMouseSupportsAbsolute();
     bool fIsMouseSupportsRelative = uisession()->isMouseSupportsRelative();
-    bool fIsMouseSupportsMultiTouch = uisession()->isMouseSupportsMultiTouch();
+    bool fIsMouseSupportsTouchScreen = uisession()->isMouseSupportsTouchScreen();
+    bool fIsMouseSupportsTouchPad = uisession()->isMouseSupportsTouchPad();
     bool fIsMouseHostCursorNeeded = uisession()->isMouseHostCursorNeeded();
 
     /* For now MT stuff is not important for MI action: */
-    Q_UNUSED(fIsMouseSupportsMultiTouch);
+    Q_UNUSED(fIsMouseSupportsTouchScreen);
+    Q_UNUSED(fIsMouseSupportsTouchPad);
 
     /* Update action state: */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.cpp	(revision 95367)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.cpp	(revision 95368)
@@ -746,5 +746,5 @@
                 case QEvent::TouchEnd:
                 {
-                    if (uisession()->isMouseSupportsMultiTouch())
+                    if (uisession()->isMouseSupportsTouchScreen() || uisession()->isMouseSupportsTouchPad())
                         return multiTouchEvent(static_cast<QTouchEvent*>(pEvent), uScreenId);
                     break;
@@ -912,5 +912,6 @@
 {
     /* Ignore fake mouse events. */
-    if (uisession()->isMouseSupportsMultiTouch() && mouseIsTouchSource(iEventType, mouseButtons))
+    if (   (uisession()->isMouseSupportsTouchScreen() || uisession()->isMouseSupportsTouchPad())
+        && mouseIsTouchSource(iEventType, mouseButtons))
         return true;
 
@@ -1194,7 +1195,10 @@
 
     LONG xShift = 0, yShift = 0;
-    ULONG dummy;
-    KGuestMonitorStatus monitorStatus = KGuestMonitorStatus_Enabled;
-    display().GetScreenResolution(uScreenId, dummy, dummy, dummy, xShift, yShift, monitorStatus);
+    if (pTouchEvent->device()->type() == QTouchDevice::TouchScreen)
+    {
+        ULONG dummy;
+        KGuestMonitorStatus monitorStatus = KGuestMonitorStatus_Enabled;
+        display().GetScreenResolution(uScreenId, dummy, dummy, dummy, xShift, yShift, monitorStatus);
+    }
 
     /* Pass all multi-touch events into guest: */
@@ -1202,7 +1206,4 @@
     foreach (const QTouchEvent::TouchPoint &touchPoint, pTouchEvent->touchPoints())
     {
-        /* Get touch-point origin: */
-        QPoint currentTouchPoint = touchPoint.pos().toPoint();
-
         /* Get touch-point state: */
         LONG iTouchPointState = KTouchContactState_None;
@@ -1212,5 +1213,7 @@
             case Qt::TouchPointMoved:
             case Qt::TouchPointStationary:
-                iTouchPointState = KTouchContactState_InContact | KTouchContactState_InRange;
+                iTouchPointState = KTouchContactState_InContact;
+                if (pTouchEvent->device()->type() == QTouchDevice::TouchScreen)
+                    iTouchPointState |= KTouchContactState_InRange;
                 break;
             default:
@@ -1218,12 +1221,31 @@
         }
 
-        /* Pass absolute touch-point data: */
-        LogRelFlow(("UIMouseHandler::multiTouchEvent: Origin: %dx%d, Id: %d, State: %d\n",
-                    currentTouchPoint.x(), currentTouchPoint.y(), touchPoint.id(), iTouchPointState));
-
-        contacts[iTouchPointIndex] = RT_MAKE_U64_FROM_U16((uint16_t)currentTouchPoint.x() + 1 + xShift,
-                                                          (uint16_t)currentTouchPoint.y() + 1 + yShift,
-                                                          RT_MAKE_U16(touchPoint.id(), iTouchPointState),
-                                                          0);
+        if (pTouchEvent->device()->type() == QTouchDevice::TouchScreen)
+        {
+            /* Get absolute touch-point origin: */
+            QPoint currentTouchPoint = touchPoint.pos().toPoint();
+
+            /* Pass absolute touch-point data: */
+            LogRelFlow(("UIMouseHandler::multiTouchEvent: TouchScreen, Origin: %dx%d, Id: %d, State: %d\n",
+                        currentTouchPoint.x(), currentTouchPoint.y(), touchPoint.id(), iTouchPointState));
+
+            contacts[iTouchPointIndex] = RT_MAKE_U64_FROM_U16((uint16_t)currentTouchPoint.x() + 1 + xShift,
+                                                              (uint16_t)currentTouchPoint.y() + 1 + yShift,
+                                                              RT_MAKE_U16(touchPoint.id(), iTouchPointState),
+                                                              0);
+        } else {
+            /* Get relative touch-point normalized position: */
+            QPointF rawTouchPoint = touchPoint.normalizedPos();
+
+            /* Pass relative touch-point data as Normalized Integer: */
+            uint16_t xNorm = rawTouchPoint.x() * 0xffff;
+            uint16_t yNorm = rawTouchPoint.y() * 0xffff;
+            LogRelFlow(("UIMouseHandler::multiTouchEvent: TouchPad, Normalized Position: %ux%u, Id: %d, State: %d\n",
+                        xNorm, yNorm, touchPoint.id(), iTouchPointState));
+
+            contacts[iTouchPointIndex] = RT_MAKE_U64_FROM_U16(xNorm, yNorm,
+                                                              RT_MAKE_U16(touchPoint.id(), iTouchPointState),
+                                                              0);
+        }
 
         LogRelFlow(("UIMouseHandler::multiTouchEvent: %RX64\n", contacts[iTouchPointIndex]));
@@ -1234,4 +1256,5 @@
     mouse().PutEventMultiTouch(pTouchEvent->touchPoints().size(),
                                contacts,
+                               pTouchEvent->device()->type() == QTouchDevice::TouchScreen,
                                (ULONG)RTTimeMilliTS());
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp	(revision 95367)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp	(revision 95368)
@@ -210,5 +210,6 @@
         m_fIsMouseSupportsAbsolute = mouse().GetAbsoluteSupported();
         m_fIsMouseSupportsRelative = mouse().GetRelativeSupported();
-        m_fIsMouseSupportsMultiTouch = mouse().GetMultiTouchSupported();
+        m_fIsMouseSupportsTouchScreen = mouse().GetTouchScreenSupported();
+        m_fIsMouseSupportsTouchPad = mouse().GetTouchPadSupported();
         m_fIsMouseHostCursorNeeded = mouse().GetNeedsHostCursor();
         sltAdditionsChange();
@@ -510,16 +511,21 @@
 }
 
-void UISession::sltMouseCapabilityChange(bool fSupportsAbsolute, bool fSupportsRelative, bool fSupportsMultiTouch, bool fNeedsHostCursor)
+void UISession::sltMouseCapabilityChange(bool fSupportsAbsolute, bool fSupportsRelative,
+                                         bool fSupportsTouchScreen, bool fSupportsTouchPad,
+                                         bool fNeedsHostCursor)
 {
     LogRelFlow(("GUI: UISession::sltMouseCapabilityChange: "
                 "Supports absolute: %s, Supports relative: %s, "
-                "Supports multi-touch: %s, Needs host cursor: %s\n",
+                "Supports touchscreen: %s, Supports touchpad: %s, "
+                "Needs host cursor: %s\n",
                 fSupportsAbsolute ? "TRUE" : "FALSE", fSupportsRelative ? "TRUE" : "FALSE",
-                fSupportsMultiTouch ? "TRUE" : "FALSE", fNeedsHostCursor ? "TRUE" : "FALSE"));
+                fSupportsTouchScreen ? "TRUE" : "FALSE", fSupportsTouchPad ? "TRUE" : "FALSE",
+                fNeedsHostCursor ? "TRUE" : "FALSE"));
 
     /* Check if something had changed: */
     if (   m_fIsMouseSupportsAbsolute != fSupportsAbsolute
         || m_fIsMouseSupportsRelative != fSupportsRelative
-        || m_fIsMouseSupportsMultiTouch != fSupportsMultiTouch
+        || m_fIsMouseSupportsTouchScreen != fSupportsTouchScreen
+        || m_fIsMouseSupportsTouchPad != fSupportsTouchPad
         || m_fIsMouseHostCursorNeeded != fNeedsHostCursor)
     {
@@ -527,5 +533,6 @@
         m_fIsMouseSupportsAbsolute = fSupportsAbsolute;
         m_fIsMouseSupportsRelative = fSupportsRelative;
-        m_fIsMouseSupportsMultiTouch = fSupportsMultiTouch;
+        m_fIsMouseSupportsTouchScreen = fSupportsTouchScreen;
+        m_fIsMouseSupportsTouchPad = fSupportsTouchPad;
         m_fIsMouseHostCursorNeeded = fNeedsHostCursor;
 
@@ -892,5 +899,6 @@
     , m_fIsMouseSupportsAbsolute(false)
     , m_fIsMouseSupportsRelative(false)
-    , m_fIsMouseSupportsMultiTouch(false)
+    , m_fIsMouseSupportsTouchScreen(false)
+    , m_fIsMouseSupportsTouchPad(false)
     , m_fIsMouseHostCursorNeeded(false)
     , m_fIsMouseCaptured(false)
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UISession.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UISession.h	(revision 95367)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UISession.h	(revision 95368)
@@ -209,5 +209,6 @@
     bool isMouseSupportsAbsolute() const { return m_fIsMouseSupportsAbsolute; }
     bool isMouseSupportsRelative() const { return m_fIsMouseSupportsRelative; }
-    bool isMouseSupportsMultiTouch() const { return m_fIsMouseSupportsMultiTouch; }
+    bool isMouseSupportsTouchScreen() const { return m_fIsMouseSupportsTouchScreen; }
+    bool isMouseSupportsTouchPad() const { return m_fIsMouseSupportsTouchPad; }
     bool isMouseHostCursorNeeded() const { return m_fIsMouseHostCursorNeeded; }
     bool isMouseCaptured() const { return m_fIsMouseCaptured; }
@@ -368,6 +369,9 @@
     /** Handles signal about mouse pointer @a shapeData change. */
     void sltMousePointerShapeChange(const UIMousePointerShapeData &shapeData);
-    /** Handles signal about mouse capability change to @a fSupportsAbsolute, @a fSupportsRelative, @a fSupportsMultiTouch and @a fNeedsHostCursor. */
-    void sltMouseCapabilityChange(bool fSupportsAbsolute, bool fSupportsRelative, bool fSupportsMultiTouch, bool fNeedsHostCursor);
+    /** Handles signal about mouse capability change to @a fSupportsAbsolute, @a fSupportsRelative,
+      * @a fSupportsTouchScreen, @a fSupportsTouchPad and @a fNeedsHostCursor. */
+    void sltMouseCapabilityChange(bool fSupportsAbsolute, bool fSupportsRelative,
+                                  bool fSupportsTouchScreen, bool fSupportsTouchPad,
+                                  bool fNeedsHostCursor);
     /** Handles signal about 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. */
@@ -587,5 +591,6 @@
     bool m_fIsMouseSupportsAbsolute : 1;
     bool m_fIsMouseSupportsRelative : 1;
-    bool m_fIsMouseSupportsMultiTouch: 1;
+    bool m_fIsMouseSupportsTouchScreen: 1;
+    bool m_fIsMouseSupportsTouchPad: 1;
     bool m_fIsMouseHostCursorNeeded : 1;
     bool m_fIsMouseCaptured : 1;
Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 95367)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 95368)
@@ -1445,5 +1445,5 @@
   <enum
     name="PointingHIDType"
-    uuid="19964e93-0050-45c4-9382-a7bccc53e666"
+    uuid="b3fd8215-6870-4e61-b6d9-2998fa625de0"
     >
     <desc>
@@ -1473,5 +1473,12 @@
     <const name="USBMultiTouch"     value="6">
       <desc>
-        USB multi-touch device.  Also enables the USB tablet and mouse devices.
+        USB multi-touch device, just touchscreen.  It is a specific mode of the
+        USB tablet and also enables the mouse device.
+      </desc>
+    </const>
+    <const name="USBMultiTouchScreenPlusPad" value="7">
+      <desc>
+        USB multi-touch device, touchscreen plus touchpad.  It also enables the
+        mouse device.
       </desc>
     </const>
@@ -1968,5 +1975,5 @@
     <method name="removePortForwardRule">
       <rest request="post" path="/natnetworks/{networkid}/configuration/"/>
-      <param name="iSipv6" type="boolean" dir="in"/>
+      <param name="isIpv6" type="boolean" dir="in"/>
       <param name="ruleName" type="wstring" dir="in"/>
     </method>
@@ -19976,5 +19983,5 @@
   <interface
     name="IMouse" extends="$unknown"
-    uuid="10cd08d0-e8b8-4838-b10c-45ba193734c1"
+    uuid="25360a74-55e5-4f14-ac2a-f5cf8e62e4af"
     wsmap="managed"
     rest="managed"
@@ -20015,7 +20022,21 @@
     </attribute>
 
-    <attribute name="multiTouchSupported" type="boolean" readonly="yes">
-      <desc>
-        Whether the guest OS has enabled the multi-touch reporting device.
+    <attribute name="touchScreenSupported" type="boolean" readonly="yes">
+      <desc>
+        Whether the guest OS has enabled the multi-touch reporting device,
+        touchscreen variant.
+        <note>
+          You can use the <link to="IMouseCapabilityChangedEvent"/>
+          event to be instantly informed about changes of this attribute
+          during virtual machine execution.
+        </note>
+        <see><link to="#putMouseEvent"/></see>
+      </desc>
+    </attribute>
+
+    <attribute name="touchPadSupported" type="boolean" readonly="yes">
+      <desc>
+        Whether the guest OS has enabled the multi-touch reporting device,
+        touchpad variant.
         <note>
           You can use the <link to="IMouseCapabilityChangedEvent"/>
@@ -20168,7 +20189,8 @@
     <method name="putEventMultiTouch">
       <desc>
-        Sends a multi-touch pointer event. The coordinates are expressed in
-        pixels and start from <tt>[1,1]</tt> which corresponds to the top left
-        corner of the virtual display.
+        Sends a multi-touch pointer event. For touchscreen events the
+        coordinates are expressed in pixels and start from <tt>[1,1]</tt> which
+        corresponds to the top left corner of the virtual display, for
+        touchpad events the coordinates are normalized to the range 0..0xffff.
 
         <result name="E_ACCESSDENIED">
@@ -20183,5 +20205,5 @@
         </note>
 
-        <see><link to="#multiTouchSupported"/></see>
+        <see><link to="#touchScreenSupported"/> and <link to="#touchPadSupported"/></see>
       </desc>
 
@@ -20195,6 +20217,6 @@
         <desc>
           Each array element contains packed information about one contact.
-          Bits 0..15: X coordinate in pixels.
-          Bits 16..31: Y coordinate in pixels.
+          Bits 0..15: X coordinate in pixels or normalized X position.
+          Bits 16..31: Y coordinate in pixels or normalized Y position.
           Bits 32..39: contact identifier.
           Bit 40: "in contact" flag, which indicates that there is a contact with the touch surface.
@@ -20204,4 +20226,10 @@
       </param>
 
+      <param name="isTouchScreen" type="boolean" dir="in">
+        <desc>
+          Distinguishes between touchscreen and touchpad events.
+        </desc>
+      </param>
+
       <param name="scanTime" type="unsigned long" dir="in">
         <desc>
@@ -20227,4 +20255,10 @@
           "id1,x1,y1,inContact1,inRange1;...;idN,xN,yN,inContactN,inRangeN".
           For example for two contacts: "0,10,20,1,1;1,30,40,1,1"
+        </desc>
+      </param>
+
+      <param name="isTouchScreen" type="boolean" dir="in">
+        <desc>
+          Distinguishes between touchscreen and touchpad events.
         </desc>
       </param>
@@ -26021,5 +26055,5 @@
     <const name="OnGuestMultiTouch" value="93">
       <desc>
-        See <link to="IGuestMouseEvent">IGuestMouseEvent</link>.
+        See <link to="IGuestMultiTouchEvent">IGuestMultiTouchEvent</link>.
       </desc>
     </const>
@@ -26759,5 +26793,5 @@
   <interface
     name="IMouseCapabilityChangedEvent" extends="IEvent"
-    uuid="70e7779a-e64a-4908-804e-371cad23a756"
+    uuid="4a773393-7a8c-4d57-b228-9ade4049a81f"
     wsmap="managed" autogen="VBoxEvent" id="OnMouseCapabilityChanged"
     >
@@ -26776,7 +26810,12 @@
       </desc>
     </attribute>
-    <attribute name="supportsMultiTouch" type="boolean" readonly="yes">
-      <desc>
-        Supports multi-touch events coordinates.
+    <attribute name="supportsTouchScreen" type="boolean" readonly="yes">
+      <desc>
+        Supports multi-touch events, touchscreen variant.
+      </desc>
+    </attribute>
+    <attribute name="supportsTouchPad" type="boolean" readonly="yes">
+      <desc>
+        Supports multi-touch events, touchpad variant.
       </desc>
     </attribute>
@@ -27124,5 +27163,5 @@
   <interface
     name="IGuestMultiTouchEvent" extends="IEvent"
-    uuid="be8a0eb5-f4f4-4dd0-9d30-c89b873247ec"
+    uuid="1f99d9dc-c144-4c28-9f88-e6f488db5441"
     wsmap="managed" autogen="VBoxEvent" id="OnGuestMultiTouch"
     >
@@ -27155,4 +27194,9 @@
         Bit 0: in contact.
         Bit 1: in range.
+      </desc>
+    </attribute>
+    <attribute name="isTouchScreen" type="boolean" readonly="yes">
+      <desc>
+        Distinguishes between touchscreen and touchpad events.
       </desc>
     </attribute>
Index: /trunk/src/VBox/Main/include/ConsoleImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 95367)
+++ /trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 95368)
@@ -122,6 +122,10 @@
     virtual void i_onMouseCapabilityChange(BOOL supportsAbsolute,
                                            BOOL supportsRelative,
-                                           BOOL supportsMT,
-                                           BOOL needsHostCursor){NOREF(supportsAbsolute); NOREF(supportsRelative); NOREF(supportsMT); NOREF(needsHostCursor);}
+                                           BOOL supportsTouchScreen,
+                                           BOOL supportsTouchPad,
+                                           BOOL needsHostCursor)
+    {
+        RT_NOREF(supportsAbsolute, supportsRelative, supportsTouchScreen, supportsTouchPad, needsHostCursor);
+    }
 };
 
@@ -277,5 +281,6 @@
                                      uint32_t cbShape);
     void i_onMouseCapabilityChange(BOOL supportsAbsolute, BOOL supportsRelative,
-                                   BOOL supportsMT, BOOL needsHostCursor);
+                                   BOOL supportsTouchScreen, BOOL supportsTouchPad,
+                                   BOOL needsHostCursor);
     void i_onStateChange(MachineState_T aMachineState);
     void i_onAdditionsStateChange();
Index: /trunk/src/VBox/Main/include/MouseImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/MouseImpl.h	(revision 95367)
+++ /trunk/src/VBox/Main/include/MouseImpl.h	(revision 95368)
@@ -69,5 +69,6 @@
     HRESULT getAbsoluteSupported(BOOL *aAbsoluteSupported);
     HRESULT getRelativeSupported(BOOL *aRelativeSupported);
-    HRESULT getMultiTouchSupported(BOOL *aMultiTouchSupported);
+    HRESULT getTouchScreenSupported(BOOL *aTouchScreenSupported);
+    HRESULT getTouchPadSupported(BOOL *aTouchPadSupported);
     HRESULT getNeedsHostCursor(BOOL *aNeedsHostCursor);
     HRESULT getPointerShape(ComPtr<IMousePointerShape> &aPointerShape);
@@ -87,7 +88,9 @@
     HRESULT putEventMultiTouch(LONG aCount,
                                const std::vector<LONG64> &aContacts,
+                               BOOL isTouchScreen,
                                ULONG aScanTime);
     HRESULT putEventMultiTouchString(LONG aCount,
                                      const com::Utf8Str &aContacts,
+                                     BOOL isTouchScreen,
                                      ULONG aScanTime);
 
@@ -105,5 +108,5 @@
     HRESULT i_reportMTEventToMouseDev(int32_t x, int32_t z, uint32_t cContact,
                                     uint32_t fContact);
-    HRESULT i_reportMultiTouchEventToDevice(uint8_t cContacts, const uint64_t *pau64Contacts, uint32_t u32ScanTime);
+    HRESULT i_reportMultiTouchEventToDevice(uint8_t cContacts, const uint64_t *pau64Contacts, bool fTouchScreen, uint32_t u32ScanTime);
     HRESULT i_reportAbsEventToVMMDev(int32_t x, int32_t y);
     HRESULT i_reportAbsEventToInputDevices(int32_t x, int32_t y, int32_t dz, int32_t dw, uint32_t fButtons,
@@ -112,7 +115,7 @@
     HRESULT i_convertDisplayRes(LONG x, LONG y, int32_t *pxAdj, int32_t *pyAdj,
                                  bool *pfValid);
-    HRESULT i_putEventMultiTouch(LONG aCount, const LONG64 *paContacts, ULONG aScanTime);
+    HRESULT i_putEventMultiTouch(LONG aCount, const LONG64 *paContacts, BOOL isTouchScreen, ULONG aScanTime);
 
-    void i_getDeviceCaps(bool *pfAbs, bool *pfRel, bool *fMT);
+    void i_getDeviceCaps(bool *pfAbs, bool *pfRel, bool *pfTS, bool *pfTP);
     void i_sendMouseCapsNotifications(void);
     bool i_guestNeedsHostCursor(void);
@@ -121,5 +124,6 @@
     bool i_supportsAbs(void);
     bool i_supportsRel(void);
-    bool i_supportsMT(void);
+    bool i_supportsTS(void);
+    bool i_supportsTP(void);
 
     ConsoleMouseInterface * const         mParent;
@@ -153,4 +157,5 @@
     void i_fireMultiTouchEvent(uint8_t cContacts,
                                const LONG64 *paContacts,
+                               bool fTouchScreen,
                                uint32_t u32ScanTime);
 };
Index: /trunk/src/VBox/Main/src-client/ConsoleImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/ConsoleImpl.cpp	(revision 95367)
+++ /trunk/src/VBox/Main/src-client/ConsoleImpl.cpp	(revision 95368)
@@ -7525,13 +7525,13 @@
 
 void Console::i_onMouseCapabilityChange(BOOL supportsAbsolute, BOOL supportsRelative,
-                                        BOOL supportsMT, BOOL needsHostCursor)
-{
-    LogFlowThisFunc(("supportsAbsolute=%d supportsRelative=%d needsHostCursor=%d\n",
-                     supportsAbsolute, supportsRelative, needsHostCursor));
+                                        BOOL supportsTouchScreen, BOOL supportsTouchPad, BOOL needsHostCursor)
+{
+    LogFlowThisFunc(("supportsAbsolute=%d supportsRelative=%d supportsTouchScreen=%d supportsTouchPad=%d needsHostCursor=%d\n",
+                     supportsAbsolute, supportsRelative, supportsTouchScreen, supportsTouchPad, needsHostCursor));
 
     AutoCaller autoCaller(this);
     AssertComRCReturnVoid(autoCaller.rc());
 
-    ::FireMouseCapabilityChangedEvent(mEventSource, supportsAbsolute, supportsRelative, supportsMT, needsHostCursor);
+    ::FireMouseCapabilityChangedEvent(mEventSource, supportsAbsolute, supportsRelative, supportsTouchScreen, supportsTouchPad, needsHostCursor);
 }
 
Index: /trunk/src/VBox/Main/src-client/ConsoleVRDPServer.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/ConsoleVRDPServer.cpp	(revision 95367)
+++ /trunk/src/VBox/Main/src-client/ConsoleVRDPServer.cpp	(revision 95368)
@@ -2879,4 +2879,5 @@
                     pMouse->PutEventMultiTouch(pFrame->u16ContactCount,
                                                ComSafeArrayAsInParam(aContacts),
+                                               true /* isTouchScreen */,
                                                (ULONG)(pThis->mu64TouchInputTimestampMCS / 1000)); /* Micro->milliseconds. */
                 }
Index: /trunk/src/VBox/Main/src-client/MouseImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/MouseImpl.cpp	(revision 95367)
+++ /trunk/src/VBox/Main/src-client/MouseImpl.cpp	(revision 95368)
@@ -397,12 +397,25 @@
 /**
  * Returns whether the currently active device portfolio can accept multi-touch
- * mouse events.
+ * touchscreen events.
  *
  * @returns COM status code
- * @param aMultiTouchSupported address of result variable
- */
-HRESULT Mouse::getMultiTouchSupported(BOOL *aMultiTouchSupported)
-{
-    *aMultiTouchSupported = i_supportsMT();
+ * @param aTouchScreenSupported address of result variable
+ */
+HRESULT Mouse::getTouchScreenSupported(BOOL *aTouchScreenSupported)
+{
+    *aTouchScreenSupported = i_supportsTS();
+    return S_OK;
+}
+
+/**
+ * Returns whether the currently active device portfolio can accept multi-touch
+ * touchpad events.
+ *
+ * @returns COM status code
+ * @param aTouchPadSupported address of result variable
+ */
+HRESULT Mouse::getTouchPadSupported(BOOL *aTouchPadSupported)
+{
+    *aTouchPadSupported = i_supportsTP();
     return S_OK;
 }
@@ -563,8 +576,10 @@
 HRESULT Mouse::i_reportMultiTouchEventToDevice(uint8_t cContacts,
                                                const uint64_t *pau64Contacts,
+                                               bool fTouchScreen,
                                                uint32_t u32ScanTime)
 {
     HRESULT hrc = S_OK;
 
+    int match = fTouchScreen ? MOUSE_DEVCAP_MT_ABSOLUTE : MOUSE_DEVCAP_MT_RELATIVE;
     PPDMIMOUSEPORT pUpPort = NULL;
     {
@@ -575,5 +590,5 @@
         {
             if (   mpDrv[i]
-                && (mpDrv[i]->u32DevCaps & MOUSE_DEVCAP_MT_ABSOLUTE))
+                && (mpDrv[i]->u32DevCaps & match))
             {
                 pUpPort = mpDrv[i]->pUpPort;
@@ -707,4 +722,5 @@
 void Mouse::i_fireMultiTouchEvent(uint8_t cContacts,
                                   const LONG64 *paContacts,
+                                  bool fTouchScreen,
                                   uint32_t u32ScanTime)
 {
@@ -726,5 +742,5 @@
 
     ::FireGuestMultiTouchEvent(mEventSource, cContacts, ComSafeArrayAsInParam(xPositions), ComSafeArrayAsInParam(yPositions),
-                               ComSafeArrayAsInParam(contactIds), ComSafeArrayAsInParam(contactFlags), u32ScanTime);
+                               ComSafeArrayAsInParam(contactIds), ComSafeArrayAsInParam(contactFlags), fTouchScreen, u32ScanTime);
 }
 
@@ -895,8 +911,10 @@
  * @param aCount     Number of contacts.
  * @param aContacts  Information about each contact.
+ * @param aIsTouchscreen Distinguishes between touchscreen and touchpad events.
  * @param aScanTime  Timestamp.
  */
 HRESULT Mouse::putEventMultiTouch(LONG aCount,
                                   const std::vector<LONG64> &aContacts,
+                                  BOOL aIsTouchscreen,
                                   ULONG aScanTime)
 {
@@ -910,5 +928,5 @@
         const LONG64 *paContacts = aCount > 0? &aContacts.front(): NULL;
 
-        hrc = i_putEventMultiTouch(aCount, paContacts, aScanTime);
+        hrc = i_putEventMultiTouch(aCount, paContacts, aIsTouchscreen, aScanTime);
     }
     else
@@ -926,8 +944,10 @@
  * @param aCount     Number of contacts.
  * @param aContacts  Information about each contact.
+ * @param aIsTouchscreen Distinguishes between touchscreen and touchpad events.
  * @param aScanTime  Timestamp.
  */
 HRESULT Mouse::putEventMultiTouchString(LONG aCount,
                                         const com::Utf8Str &aContacts,
+                                        BOOL aIsTouchscreen,
                                         ULONG aScanTime)
 {
@@ -935,4 +955,5 @@
     NOREF(aCount);
     NOREF(aContacts);
+    NOREF(aIsTouchscreen);
     NOREF(aScanTime);
     return E_NOTIMPL;
@@ -946,4 +967,5 @@
 HRESULT Mouse::i_putEventMultiTouch(LONG aCount,
                                     const LONG64 *paContacts,
+                                    BOOL aIsTouchscreen,
                                     ULONG aScanTime)
 {
@@ -953,20 +975,26 @@
     }
 
-    DisplayMouseInterface *pDisplay = mParent->i_getDisplayMouseInterface();
-    ComAssertRet(pDisplay, E_FAIL);
-
-    /* Touch events are mapped to the primary monitor, because the emulated USB
-     * touchscreen device is associated with one (normally the primary) screen in the guest.
-     */
+    HRESULT hrc = S_OK;
+
+    /* Touch events in the touchscreen variant are currently mapped to the
+     * primary monitor, because the emulated USB touchscreen device is
+     * associated with one (normally the primary) screen in the guest.
+     * In the future this could/should be extended to multi-screen support. */
     ULONG uScreenId = 0;
 
     ULONG cWidth  = 0;
     ULONG cHeight = 0;
-    ULONG cBPP    = 0;
     LONG  xOrigin = 0;
     LONG  yOrigin = 0;
-    HRESULT hrc = pDisplay->i_getScreenResolution(uScreenId, &cWidth, &cHeight, &cBPP, &xOrigin, &yOrigin);
-    NOREF(cBPP);
-    ComAssertComRCRetRC(hrc);
+
+    if (aIsTouchscreen)
+    {
+        DisplayMouseInterface *pDisplay = mParent->i_getDisplayMouseInterface();
+        ComAssertRet(pDisplay, E_FAIL);
+        ULONG cBPP    = 0;
+        hrc = pDisplay->i_getScreenResolution(uScreenId, &cWidth, &cHeight, &cBPP, &xOrigin, &yOrigin);
+        NOREF(cBPP);
+        ComAssertComRCRetRC(hrc);
+    }
 
     uint64_t* pau64Contacts = NULL;
@@ -980,51 +1008,75 @@
         if (pau64Contacts)
         {
-            int32_t x1 = xOrigin;
-            int32_t y1 = yOrigin;
-            int32_t x2 = x1 + cWidth;
-            int32_t y2 = y1 + cHeight;
-
-            LogRel3(("%s: screen [%d] %d,%d %d,%d\n",
-                     __FUNCTION__, uScreenId, x1, y1, x2, y2));
-
-            LONG i;
-            for (i = 0; i < aCount; i++)
+            if (aIsTouchscreen)
             {
-                uint32_t u32Lo = RT_LO_U32(paContacts[i]);
-                uint32_t u32Hi = RT_HI_U32(paContacts[i]);
-                int32_t x = (int16_t)u32Lo;
-                int32_t y = (int16_t)(u32Lo >> 16);
-                uint8_t contactId =  RT_BYTE1(u32Hi);
-                bool fInContact   = (RT_BYTE2(u32Hi) & 0x1) != 0;
-                bool fInRange     = (RT_BYTE2(u32Hi) & 0x2) != 0;
-
-                LogRel3(("%s: [%d] %d,%d id %d, inContact %d, inRange %d\n",
-                         __FUNCTION__, i, x, y, contactId, fInContact, fInRange));
-
-                /* x1,y1 are inclusive and x2,y2 are exclusive,
-                 * while x,y start from 1 and are inclusive.
-                 */
-                if (x <= x1 || x > x2 || y <= y1 || y > y2)
+                int32_t x1 = xOrigin;
+                int32_t y1 = yOrigin;
+                int32_t x2 = x1 + cWidth;
+                int32_t y2 = y1 + cHeight;
+
+                LogRel3(("%s: screen [%d] %d,%d %d,%d\n",
+                         __FUNCTION__, uScreenId, x1, y1, x2, y2));
+
+                LONG i;
+                for (i = 0; i < aCount; i++)
                 {
-                    /* Out of range. Skip the contact. */
-                    continue;
+                    uint32_t u32Lo = RT_LO_U32(paContacts[i]);
+                    uint32_t u32Hi = RT_HI_U32(paContacts[i]);
+                    int32_t x = (int16_t)u32Lo;
+                    int32_t y = (int16_t)(u32Lo >> 16);
+                    uint8_t contactId =  RT_BYTE1(u32Hi);
+                    bool fInContact   = (RT_BYTE2(u32Hi) & 0x1) != 0;
+                    bool fInRange     = (RT_BYTE2(u32Hi) & 0x2) != 0;
+
+                    LogRel3(("%s: touchscreen [%d] %d,%d id %d, inContact %d, inRange %d\n",
+                             __FUNCTION__, i, x, y, contactId, fInContact, fInRange));
+
+                    /* x1,y1 are inclusive and x2,y2 are exclusive,
+                     * while x,y start from 1 and are inclusive.
+                     */
+                    if (x <= x1 || x > x2 || y <= y1 || y > y2)
+                    {
+                        /* Out of range. Skip the contact. */
+                        continue;
+                    }
+
+                    int32_t xAdj = x1 < x2? ((x - 1 - x1) * VMMDEV_MOUSE_RANGE) / (x2 - x1) : 0;
+                    int32_t yAdj = y1 < y2? ((y - 1 - y1) * VMMDEV_MOUSE_RANGE) / (y2 - y1) : 0;
+
+                    bool fValid = (   xAdj >= VMMDEV_MOUSE_RANGE_MIN
+                                   && xAdj <= VMMDEV_MOUSE_RANGE_MAX
+                                   && yAdj >= VMMDEV_MOUSE_RANGE_MIN
+                                   && yAdj <= VMMDEV_MOUSE_RANGE_MAX);
+
+                    if (fValid)
+                    {
+                        uint8_t fu8 = (uint8_t)(  (fInContact? 0x01: 0x00)
+                                                | (fInRange?   0x02: 0x00));
+                        pau64Contacts[cContacts] = RT_MAKE_U64_FROM_U16((uint16_t)xAdj,
+                                                                        (uint16_t)yAdj,
+                                                                        RT_MAKE_U16(contactId, fu8),
+                                                                        0);
+                        cContacts++;
+                    }
                 }
-
-                int32_t xAdj = x1 < x2? ((x - 1 - x1) * VMMDEV_MOUSE_RANGE) / (x2 - x1) : 0;
-                int32_t yAdj = y1 < y2? ((y - 1 - y1) * VMMDEV_MOUSE_RANGE) / (y2 - y1) : 0;
-
-                bool fValid = (   xAdj >= VMMDEV_MOUSE_RANGE_MIN
-                               && xAdj <= VMMDEV_MOUSE_RANGE_MAX
-                               && yAdj >= VMMDEV_MOUSE_RANGE_MIN
-                               && yAdj <= VMMDEV_MOUSE_RANGE_MAX);
-
-                if (fValid)
+            } else {
+                LONG i;
+                for (i = 0; i < aCount; i++)
                 {
-                    uint8_t fu8 = (uint8_t)(  (fInContact? 0x01: 0x00)
-                                            | (fInRange?   0x02: 0x00));
-                    pau64Contacts[cContacts] = RT_MAKE_U64_FROM_U16((uint16_t)xAdj,
-                                                                    (uint16_t)yAdj,
+                    uint32_t u32Lo = RT_LO_U32(paContacts[i]);
+                    uint32_t u32Hi = RT_HI_U32(paContacts[i]);
+                    uint16_t x = (uint16_t)u32Lo;
+                    uint16_t y = (uint16_t)(u32Lo >> 16);
+                    uint8_t contactId =  RT_BYTE1(u32Hi);
+                    bool fInContact   = (RT_BYTE2(u32Hi) & 0x1) != 0;
+
+                    LogRel3(("%s: touchpad [%d] %#04x,%#04x id %d, inContact %d\n",
+                             __FUNCTION__, i, x, y, contactId, fInContact));
+
+                    uint8_t fu8 = (uint8_t)(fInContact? 0x01: 0x00);
+
+                    pau64Contacts[cContacts] = RT_MAKE_U64_FROM_U16(x, y,
                                                                     RT_MAKE_U16(contactId, fu8),
-                                                                    0);
+                                                                     0);
                     cContacts++;
                 }
@@ -1039,8 +1091,8 @@
     if (SUCCEEDED(hrc))
     {
-        hrc = i_reportMultiTouchEventToDevice(cContacts, cContacts? pau64Contacts: NULL, (uint32_t)aScanTime);
+        hrc = i_reportMultiTouchEventToDevice(cContacts, cContacts? pau64Contacts: NULL, !!aIsTouchscreen, (uint32_t)aScanTime);
 
         /* Send the original contact information. */
-        i_fireMultiTouchEvent(cContacts, cContacts? paContacts: NULL, (uint32_t)aScanTime);
+        i_fireMultiTouchEvent(cContacts, cContacts? paContacts: NULL, !!aIsTouchscreen, (uint32_t)aScanTime);
     }
 
@@ -1064,11 +1116,13 @@
  * @param   pfAbs   supports absolute mouse coordinates.
  * @param   pfRel   supports relative mouse coordinates.
- * @param   pfMT    supports multitouch.
- */
-void Mouse::i_getDeviceCaps(bool *pfAbs, bool *pfRel, bool *pfMT)
+ * @param   pfTS    supports touchscreen.
+ * @param   pfTP    supports touchpad.
+ */
+void Mouse::i_getDeviceCaps(bool *pfAbs, bool *pfRel, bool *pfTS, bool *pfTP)
 {
     bool fAbsDev = false;
     bool fRelDev = false;
-    bool fMTDev  = false;
+    bool fTSDev  = false;
+    bool fTPDev  = false;
 
     AutoReadLock aLock(this COMMA_LOCKVAL_SRC_POS);
@@ -1082,5 +1136,7 @@
                fRelDev = true;
            if (mpDrv[i]->u32DevCaps & MOUSE_DEVCAP_MT_ABSOLUTE)
-               fMTDev  = true;
+               fTSDev  = true;
+           if (mpDrv[i]->u32DevCaps & MOUSE_DEVCAP_MT_RELATIVE)
+               fTPDev  = true;
         }
     if (pfAbs)
@@ -1088,6 +1144,8 @@
     if (pfRel)
         *pfRel = fRelDev;
-    if (pfMT)
-        *pfMT = fMTDev;
+    if (pfTS)
+        *pfTS = fTSDev;
+    if (pfTP)
+        *pfTP = fTPDev;
 }
 
@@ -1098,5 +1156,5 @@
     bool fRelDev;
 
-    i_getDeviceCaps(NULL, &fRelDev, NULL);
+    i_getDeviceCaps(NULL, &fRelDev, NULL, NULL);
     return    (mfVMMDevGuestCaps & VMMDEV_MOUSE_GUEST_CAN_ABSOLUTE)
            && fRelDev;
@@ -1109,5 +1167,5 @@
     bool fAbsDev;
 
-    i_getDeviceCaps(&fAbsDev, NULL, NULL);
+    i_getDeviceCaps(&fAbsDev, NULL, NULL, NULL);
     return fAbsDev;
 }
@@ -1119,5 +1177,5 @@
     bool fRelDev;
 
-    i_getDeviceCaps(NULL, &fRelDev, NULL);
+    i_getDeviceCaps(NULL, &fRelDev, NULL, NULL);
     return fRelDev;
 }
@@ -1129,5 +1187,5 @@
     bool fAbsDev;
 
-    i_getDeviceCaps(&fAbsDev, NULL, NULL);
+    i_getDeviceCaps(&fAbsDev, NULL, NULL, NULL);
     return fAbsDev || i_vmmdevCanAbs();
 }
@@ -1135,10 +1193,10 @@
 
 /** Can we currently send absolute events to the guest? */
-bool Mouse::i_supportsMT(void)
-{
-    bool fMTDev;
-
-    i_getDeviceCaps(NULL, NULL, &fMTDev);
-    return fMTDev;
+bool Mouse::i_supportsTS(void)
+{
+    bool fTSDev;
+
+    i_getDeviceCaps(NULL, NULL, &fTSDev, NULL);
+    return fTSDev;
 }
 
@@ -1149,14 +1207,14 @@
 void Mouse::i_sendMouseCapsNotifications(void)
 {
-    bool fRelDev, fMTDev, fCanAbs, fNeedsHostCursor;
+    bool fRelDev, fTSDev, fTPDev, fCanAbs, fNeedsHostCursor;
 
     {
         AutoReadLock aLock(this COMMA_LOCKVAL_SRC_POS);
 
-        i_getDeviceCaps(NULL, &fRelDev, &fMTDev);
+        i_getDeviceCaps(NULL, &fRelDev, &fTSDev, &fTPDev);
         fCanAbs = i_supportsAbs();
         fNeedsHostCursor = i_guestNeedsHostCursor();
     }
-    mParent->i_onMouseCapabilityChange(fCanAbs, fRelDev, fMTDev, fNeedsHostCursor);
+    mParent->i_onMouseCapabilityChange(fCanAbs, fRelDev, fTSDev, fTPDev, fNeedsHostCursor);
 }
 
