diff --git a/widget/src/windows/nsWinGesture.cpp b/widget/src/windows/nsWinGesture.cpp
--- a/widget/src/windows/nsWinGesture.cpp
+++ b/widget/src/windows/nsWinGesture.cpp
@@ -63,6 +63,11 @@ nsWinGesture::GetGestureConfigPtr nsWinG
 nsWinGesture::BeginPanningFeedbackPtr nsWinGesture::beginPanningFeedback = nsnull;
 nsWinGesture::EndPanningFeedbackPtr nsWinGesture::endPanningFeedback = nsnull;
 nsWinGesture::UpdatePanningFeedbackPtr nsWinGesture::updatePanningFeedback = nsnull;
+
+nsWinGesture::RegisterTouchWindowPtr nsWinGesture::registerTouchWindow = nsnull;
+nsWinGesture::GetTouchInputInfoPtr nsWinGesture::getTouchInputInfo = nsnull;
+nsWinGesture::CloseTouchInputHandlePtr nsWinGesture::closeTouchInputHandle = nsnull;
+
 static PRBool gEnableSingleFingerPanEvents = PR_FALSE;
 
 nsWinGesture::nsWinGesture() :
@@ -99,6 +104,9 @@ PRBool nsWinGesture::InitLibrary()
     getGestureExtraArgs = (GetGestureExtraArgsPtr)GetProcAddress(sLibraryHandle, "GetGestureExtraArgs");
     setGestureConfig = (SetGestureConfigPtr)GetProcAddress(sLibraryHandle, "SetGestureConfig");
     getGestureConfig = (GetGestureConfigPtr)GetProcAddress(sLibraryHandle, "GetGestureConfig");
+    registerTouchWindow = (RegisterTouchWindowPtr)GetProcAddress(sLibraryHandle, "RegisterTouchWindow");
+    getTouchInputInfo = (GetTouchInputInfoPtr)GetProcAddress(sLibraryHandle, "GetTouchInputInfo");
+    closeTouchInputHandle = (CloseTouchInputHandlePtr)GetProcAddress(sLibraryHandle, "CloseTouchInputHandle");
   }
 
   if (!getGestureInfo || !closeGestureInfoHandle || !getGestureExtraArgs ||
@@ -110,6 +118,12 @@ PRBool nsWinGesture::InitLibrary()
     getGestureConfig       = nsnull;
     return PR_FALSE;
   }
+  
+  if (!registerTouchWindow || !getTouchInputInfo || !closeTouchInputHandle) {
+    registerTouchWindow   = nsnull;
+    getTouchInputInfo     = nsnull;
+    closeTouchInputHandle = nsnull;
+  }
 
   // panning feedback interfaces
   if (hTheme) {
@@ -193,6 +207,30 @@ PRBool nsWinGesture::IsAvailable()
   return getGestureInfo != nsnull;
 }
 
+PRBool nsWinGesture::RegisterTouchWindow(HWND hWnd)
+{
+  if (!registerTouchWindow)
+    return PR_FALSE;
+
+  return registerTouchWindow(hWnd, 0);
+}
+
+PRBool nsWinGesture::GetTouchInputInfo(HTOUCHINPUT hTouchInput, PRUint32 cInputs, PTOUCHINPUT pInputs)
+{
+  if (!getTouchInputInfo)
+    return PR_FALSE;
+
+  return getTouchInputInfo(hTouchInput, cInputs, pInputs, sizeof(TOUCHINPUT));
+}
+
+PRBool nsWinGesture::CloseTouchInputHandle(HTOUCHINPUT hTouchInput)
+{
+  if (!closeTouchInputHandle)
+    return PR_FALSE;
+
+  return closeTouchInputHandle(hTouchInput);
+}
+
 PRBool nsWinGesture::GetGestureInfo(HGESTUREINFO hGestureInfo, PGESTUREINFO pGestureInfo)
 {
   if (!getGestureInfo || !hGestureInfo || !pGestureInfo)
@@ -228,6 +266,7 @@ PRBool nsWinGesture::SetGestureConfig(HW
   return setGestureConfig(hWnd, 0, cIDs, pGestureConfig, sizeof(GESTURECONFIG));
 }
 
+
 PRBool nsWinGesture::GetGestureConfig(HWND hWnd, DWORD dwFlags, PUINT pcIDs, PGESTURECONFIG pGestureConfig)
 {
   if (!getGestureInfo || !pGestureConfig)
diff --git a/widget/src/windows/nsWinGesture.h b/widget/src/windows/nsWinGesture.h
--- a/widget/src/windows/nsWinGesture.h
+++ b/widget/src/windows/nsWinGesture.h
@@ -108,6 +108,23 @@ typedef struct tagGESTURENOTIFYSTRUCT {
     DWORD dwInstanceID;             // internally used
 } GESTURENOTIFYSTRUCT, *PGESTURENOTIFYSTRUCT;
 
+/*
+ * Touch
+ */
+typedef struct _TOUCHINPUT {
+  LONG      x;
+  LONG      y;
+  HANDLE    hSource;
+  DWORD     dwID;
+  DWORD     dwFlags;
+  DWORD     dwMask;
+  DWORD     dwTime;
+  ULONG_PTR dwExtraInfo;
+  DWORD     cxContact;
+  DWORD     cyContact;
+}TOUCHINPUT, *PTOUCHINPUT;
+
+typedef HANDLE HTOUCHINPUT;
 
 /*
  * Gesture argument helpers
@@ -163,6 +180,25 @@ typedef struct tagGESTURENOTIFYSTRUCT {
 // WM_TABLET_QUERYSYSTEMGESTURESTATUS return values
 #define TABLET_ROTATE_GESTURE_ENABLE    0x02000000
 
+// TOUCH
+#define WM_TOUCH 0x0240
+
+#define TOUCHEVENTF_MOVE       0x0001
+#define TOUCHEVENTF_DOWN       0x0002
+#define TOUCHEVENTF_UP         0x0004
+#define TOUCHEVENTF_INRANGE    0x0008
+#define TOUCHEVENTF_PRIMARY    0x0010
+#define TOUCHEVENTF_NOCOALESCE 0x0020
+#define TOUCHEVENTF_PEN        0x0040
+#define TOUCHEVENTF_PALM       0x0080
+
+#define TOUCHINPUTMASKF_TIMEFROMSYSTEM 0x0001
+#define TOUCHINPUTMASKF_EXTRAINFO      0x0002
+#define TOUCHINPUTMASKF_CONTACTAREA    0x0004
+
+#define TOUCH_COORD_TO_PIXEL(C) (C/100)
+
+
 #endif /* NTDDI_VERSION < NTDDI_WIN7 */
 
 class nsPointWin : public nsIntPoint
@@ -195,6 +231,9 @@ public:
 
 public:
   PRBool InitWinGestureSupport(HWND hWnd);
+  PRBool RegisterTouchWindow(HWND hWnd);
+  PRBool GetTouchInputInfo(HTOUCHINPUT hTouchInput, PRUint32 cInputs, PTOUCHINPUT pInputs);
+  PRBool CloseTouchInputHandle(HTOUCHINPUT hTouchInput);
   PRBool ShutdownWinGestureSupport();
   PRBool IsAvailable();
   
@@ -233,6 +272,9 @@ private:
   typedef BOOL (WINAPI * BeginPanningFeedbackPtr)(HWND hWnd);
   typedef BOOL (WINAPI * EndPanningFeedbackPtr)(HWND hWnd, BOOL fAnimateBack);
   typedef BOOL (WINAPI * UpdatePanningFeedbackPtr)(HWND hWnd, LONG offsetX, LONG offsetY, BOOL fInInertia);
+  typedef BOOL (WINAPI * RegisterTouchWindowPtr)(HWND hWnd, ULONG flags);
+  typedef BOOL (WINAPI * GetTouchInputInfoPtr)(HTOUCHINPUT hTouchInput, PRUint32 cInputs, PTOUCHINPUT pInputs, PRInt32 cbSize);
+  typedef BOOL (WINAPI * CloseTouchInputHandlePtr)(HTOUCHINPUT hTouchInput);
 
   // Static function pointers
   static GetGestureInfoPtr getGestureInfo;
@@ -243,6 +285,9 @@ private:
   static BeginPanningFeedbackPtr beginPanningFeedback;
   static EndPanningFeedbackPtr endPanningFeedback;
   static UpdatePanningFeedbackPtr updatePanningFeedback;
+  static RegisterTouchWindowPtr registerTouchWindow;
+  static GetTouchInputInfoPtr getTouchInputInfo;
+  static CloseTouchInputHandlePtr closeTouchInputHandle;
 
   // Delay load info 
   PRBool InitLibrary();
diff --git a/widget/src/windows/nsWindow.cpp b/widget/src/windows/nsWindow.cpp
--- a/widget/src/windows/nsWindow.cpp
+++ b/widget/src/windows/nsWindow.cpp
@@ -724,7 +724,8 @@ nsWindow::StandardWindowCreate(nsIWidget
     // there prevents the user from interacting with the title bar or nc
     // areas using a single finger. Java and plugin windows can make their
     // own calls.
-    mGesture.InitWinGestureSupport(mWnd);
+    //mGesture.InitWinGestureSupport(mWnd);
+      mGesture.RegisterTouchWindow(mWnd);
   }
 #endif // !defined(WINCE)
 
@@ -4245,6 +4246,11 @@ PRBool nsWindow::ProcessMessage(UINT msg
     *aRetValue = TABLET_ROTATE_GESTURE_ENABLE;
     break;
 
+  case WM_TOUCH:
+    result = OnTouch(wParam, lParam);
+    *aRetValue = result;
+    break;
+
   case WM_GESTURE:
     result = OnGesture(wParam, lParam);
     break;
@@ -4603,6 +4609,63 @@ void nsWindow::OnWindowPosChanging(LPWIN
 }
 #endif
 
+PRBool nsWindow::OnTouch(WPARAM wParam, LPARAM lParam)
+{
+  //if (mContentType != eContentTypeContent) return PR_FALSE;
+  PRUint32 cInputs = LOWORD(wParam);
+  PTOUCHINPUT pInputs = new TOUCHINPUT[cInputs];
+  if (pInputs == nsnull)
+    return PR_FALSE;
+  
+  if (mGesture.GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs)) {
+    for (PRUint32 i=0; i < cInputs; i++) {
+
+      int MSG = 0;
+      if (pInputs[i].dwFlags & TOUCHEVENTF_MOVE) {
+        MSG = NS_MOZTOUCH_MOVE;
+      } else if (pInputs[i].dwFlags & TOUCHEVENTF_DOWN) {
+        MSG = NS_MOZTOUCH_DOWN;
+      } else if (pInputs[i].dwFlags & TOUCHEVENTF_UP) {
+        MSG = NS_MOZTOUCH_RELEASE;
+      }
+
+      if (!MSG)
+        continue;
+
+      nsPointWin touchPoint;
+      touchPoint.x = TOUCH_COORD_TO_PIXEL(pInputs[i].x);
+      touchPoint.y = TOUCH_COORD_TO_PIXEL(pInputs[i].y);
+      touchPoint.ScreenToClient(mWnd);
+      
+      nsMozTouchEvent touchEvent(PR_TRUE, MSG, this, 0);
+      touchEvent.refPoint = touchPoint;
+      touchEvent.streamId = pInputs[i].dwID;
+
+      nsEventStatus status;
+      DispatchEvent(&touchEvent, status);
+
+//      printf("Touch info: %d %d %d\n", pInputs[i].dwID,
+//                                       TOUCH_COORD_TO_PIXEL(pInputs[i].x),
+//                                       TOUCH_COORD_TO_PIXEL(pInputs[i].y));
+
+    }
+//    putchar('\n');
+  }
+  else
+  {
+      // GetLastError() and error handling
+  }
+
+  delete [] pInputs;
+
+  if (!mGesture.CloseTouchInputHandle((HTOUCHINPUT)lParam))
+  {
+    // error handling*/
+  }
+  return PR_FALSE;
+}
+
+
 // Gesture event processing. Handles WM_GESTURE events.
 #if !defined(WINCE)
 PRBool nsWindow::OnGesture(WPARAM wParam, LPARAM lParam)
diff --git a/widget/src/windows/nsWindow.h b/widget/src/windows/nsWindow.h
--- a/widget/src/windows/nsWindow.h
+++ b/widget/src/windows/nsWindow.h
@@ -307,6 +307,7 @@ protected:
   virtual PRBool          OnScroll(UINT scrollCode, int cPos);
   virtual HBRUSH          OnControlColor();
   PRBool                  OnGesture(WPARAM wParam, LPARAM lParam);
+  PRBool                  OnTouch(WPARAM wParam, LPARAM lParam);
   PRBool                  OnHotKey(WPARAM wParam, LPARAM lParam);
   BOOL                    OnInputLangChange(HKL aHKL);
   void                    OnSettingsChange(WPARAM wParam, LPARAM lParam);
