diff --git a/ash/wm/toplevel_window_event_handler.cc b/ash/wm/toplevel_window_event_handler.cc
index 0d0349de07d34..8206a33cb67e1 100644
--- a/ash/wm/toplevel_window_event_handler.cc
+++ b/ash/wm/toplevel_window_event_handler.cc
@@ -147,9 +147,9 @@ ui::EventResult ToplevelWindowEventHandler::OnScrollEvent(
   return ui::ER_UNHANDLED;
 }
 
-ui::TouchStatus ToplevelWindowEventHandler::OnTouchEvent(
+ui::EventResult ToplevelWindowEventHandler::OnTouchEvent(
     ui::TouchEvent* event) {
-  return ui::TOUCH_STATUS_UNKNOWN;
+  return ui::ER_UNHANDLED;
 }
 
 ui::EventResult ToplevelWindowEventHandler::OnGestureEvent(
diff --git a/ash/wm/toplevel_window_event_handler.h b/ash/wm/toplevel_window_event_handler.h
index 48deaea21bfd0..295ba8c1ddbea 100644
--- a/ash/wm/toplevel_window_event_handler.h
+++ b/ash/wm/toplevel_window_event_handler.h
@@ -41,7 +41,7 @@ class ASH_EXPORT ToplevelWindowEventHandler
   virtual ui::EventResult OnKeyEvent(ui::KeyEvent* event) OVERRIDE;
   virtual ui::EventResult OnMouseEvent(ui::MouseEvent* event) OVERRIDE;
   virtual ui::EventResult OnScrollEvent(ui::ScrollEvent* event) OVERRIDE;
-  virtual ui::TouchStatus OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
+  virtual ui::EventResult OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
   virtual ui::EventResult OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
 
   // Overridden form aura::client::WindowMoveClient:
diff --git a/ash/wm/window_modality_controller_unittest.cc b/ash/wm/window_modality_controller_unittest.cc
index d749bd6e4bbb6..f6f4271d24542 100644
--- a/ash/wm/window_modality_controller_unittest.cc
+++ b/ash/wm/window_modality_controller_unittest.cc
@@ -294,7 +294,7 @@ class TouchTrackerWindowDelegate : public aura::test::TestWindowDelegate {
 
  private:
   // Overridden from aura::test::TestWindowDelegate.
-  virtual ui::TouchStatus OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
+  virtual ui::EventResult OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
     received_touch_ = true;
     return aura::test::TestWindowDelegate::OnTouchEvent(event);
   }
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
index 8d4124abd4fb9..b5905bc84b14a 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -111,15 +111,6 @@ BOOL CALLBACK ShowWindowsCallback(HWND window, LPARAM param) {
 }
 #endif
 
-ui::TouchStatus DecideTouchStatus(const WebKit::WebTouchEvent& event,
-                                  WebKit::WebTouchPoint* point) {
-  if (event.type == WebKit::WebInputEvent::TouchEnd &&
-      event.touchesLength == 0)
-    return ui::TOUCH_STATUS_QUEUED_END;
-
-  return ui::TOUCH_STATUS_QUEUED;
-}
-
 void UpdateWebTouchEventAfterDispatch(WebKit::WebTouchEvent* event,
                                       WebKit::WebTouchPoint* point) {
   if (point->state != WebKit::WebTouchPoint::StateReleased)
@@ -1546,8 +1537,7 @@ ui::EventResult RenderWidgetHostViewAura::OnMouseEvent(ui::MouseEvent* event) {
   return ui::ER_HANDLED;
 }
 
-ui::TouchStatus RenderWidgetHostViewAura::OnTouchEvent(
-    ui::TouchEvent* event) {
+ui::EventResult RenderWidgetHostViewAura::OnTouchEvent(ui::TouchEvent* event) {
   TRACE_EVENT0("browser", "RenderWidgetHostViewAura::OnTouchEvent");
   // Update the touch event first.
   WebKit::WebTouchPoint* point = UpdateWebTouchEvent(event,
@@ -1558,10 +1548,10 @@ ui::TouchStatus RenderWidgetHostViewAura::OnTouchEvent(
   if (point && host_->has_touch_handler()) {
     host_->ForwardTouchEvent(touch_event_);
     UpdateWebTouchEventAfterDispatch(&touch_event_, point);
-    return DecideTouchStatus(touch_event_, point);
+    return ui::ER_ASYNC;
   }
 
-  return ui::TOUCH_STATUS_UNKNOWN;
+  return ui::ER_UNHANDLED;
 }
 
 ui::EventResult RenderWidgetHostViewAura::OnGestureEvent(
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h
index 47533cd64a002..022236b9846c1 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.h
+++ b/content/browser/renderer_host/render_widget_host_view_aura.h
@@ -187,7 +187,7 @@ class RenderWidgetHostViewAura
   // Overridden from ui::EventHandler:
   virtual ui::EventResult OnKeyEvent(ui::KeyEvent* event) OVERRIDE;
   virtual ui::EventResult OnMouseEvent(ui::MouseEvent* event) OVERRIDE;
-  virtual ui::TouchStatus OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
+  virtual ui::EventResult OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
   virtual ui::EventResult OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
 
   // Overridden from aura::client::ActivationDelegate:
diff --git a/content/browser/renderer_host/render_widget_host_view_win.cc b/content/browser/renderer_host/render_widget_host_view_win.cc
index 1d8dab36608a0..42d60cf67fad8 100644
--- a/content/browser/renderer_host/render_widget_host_view_win.cc
+++ b/content/browser/renderer_host/render_widget_host_view_win.cc
@@ -2246,7 +2246,7 @@ LRESULT RenderWidgetHostViewWin::OnTouchEvent(UINT message, WPARAM wparam,
         scoped_ptr<ui::GestureRecognizer::Gestures> gestures;
         gestures.reset(gesture_recognizer_->ProcessTouchEventForGesture(
             TouchEventFromWebTouchPoint(touch_event.touches[i], timestamp),
-            ui::TOUCH_STATUS_UNKNOWN, this));
+            ui::ER_UNHANDLED, this));
         ProcessGestures(gestures.get());
       }
     }
diff --git a/content/browser/web_contents/web_contents_view_aura.cc b/content/browser/web_contents/web_contents_view_aura.cc
index ddb410fc1ff5a..28819f4cb86c3 100644
--- a/content/browser/web_contents/web_contents_view_aura.cc
+++ b/content/browser/web_contents/web_contents_view_aura.cc
@@ -594,8 +594,8 @@ ui::EventResult WebContentsViewAura::OnMouseEvent(ui::MouseEvent* event) {
   return ui::ER_UNHANDLED;
 }
 
-ui::TouchStatus WebContentsViewAura::OnTouchEvent(ui::TouchEvent* event) {
-  return ui::TOUCH_STATUS_UNKNOWN;
+ui::EventResult WebContentsViewAura::OnTouchEvent(ui::TouchEvent* event) {
+  return ui::ER_UNHANDLED;
 }
 
 ui::EventResult WebContentsViewAura::OnGestureEvent(
diff --git a/content/browser/web_contents/web_contents_view_aura.h b/content/browser/web_contents/web_contents_view_aura.h
index 93a17dbd23e5b..260d37eb08fdf 100644
--- a/content/browser/web_contents/web_contents_view_aura.h
+++ b/content/browser/web_contents/web_contents_view_aura.h
@@ -114,7 +114,7 @@ class CONTENT_EXPORT WebContentsViewAura
   // Overridden from ui::EventHandler:
   virtual ui::EventResult OnKeyEvent(ui::KeyEvent* event) OVERRIDE;
   virtual ui::EventResult OnMouseEvent(ui::MouseEvent* event) OVERRIDE;
-  virtual ui::TouchStatus OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
+  virtual ui::EventResult OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
   virtual ui::EventResult OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
 
   // Overridden from aura::client::DragDropDelegate:
diff --git a/ui/aura/demo/demo_main.cc b/ui/aura/demo/demo_main.cc
index b3475ed9fe1df..6a6d43b5b6bd3 100644
--- a/ui/aura/demo/demo_main.cc
+++ b/ui/aura/demo/demo_main.cc
@@ -77,8 +77,8 @@ class DemoWindowDelegate : public aura::WindowDelegate {
   virtual ui::EventResult OnMouseEvent(ui::MouseEvent* event) OVERRIDE {
     return ui::ER_HANDLED;
   }
-  virtual ui::TouchStatus OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
-    return ui::TOUCH_STATUS_END;
+  virtual ui::EventResult OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
+    return ui::ER_UNHANDLED;
   }
   virtual ui::EventResult OnGestureEvent(ui::GestureEvent* event) OVERRIDE {
     return ui::ER_UNHANDLED;
diff --git a/ui/aura/event_filter.cc b/ui/aura/event_filter.cc
index d7f4719b46859..d8c4f287096a2 100644
--- a/ui/aura/event_filter.cc
+++ b/ui/aura/event_filter.cc
@@ -41,8 +41,10 @@ ui::EventResult EventFilter::OnScrollEvent(ui::ScrollEvent* event) {
   return ui::ER_UNHANDLED;
 }
 
-ui::TouchStatus EventFilter::OnTouchEvent(ui::TouchEvent* event) {
-  return PreHandleTouchEvent(static_cast<Window*>(event->target()), event);
+ui::EventResult EventFilter::OnTouchEvent(ui::TouchEvent* event) {
+  ui::TouchStatus status = PreHandleTouchEvent(
+      static_cast<Window*>(event->target()), event);
+  return ui::EventResultFromTouchStatus(status);
 }
 
 ui::EventResult EventFilter::OnGestureEvent(ui::GestureEvent* event) {
diff --git a/ui/aura/event_filter.h b/ui/aura/event_filter.h
index f6b0378e7e831..7af680b8cc051 100644
--- a/ui/aura/event_filter.h
+++ b/ui/aura/event_filter.h
@@ -66,7 +66,7 @@ class AURA_EXPORT EventFilter : public ui::EventHandler {
   virtual ui::EventResult OnKeyEvent(ui::KeyEvent* event) OVERRIDE;
   virtual ui::EventResult OnMouseEvent(ui::MouseEvent* event) OVERRIDE;
   virtual ui::EventResult OnScrollEvent(ui::ScrollEvent* event) OVERRIDE;
-  virtual ui::TouchStatus OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
+  virtual ui::EventResult OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
   virtual ui::EventResult OnGestureEvent(ui::GestureEvent* e) OVERRIDE;
 };
 
diff --git a/ui/aura/event_filter_unittest.cc b/ui/aura/event_filter_unittest.cc
index 616f80323042b..010fbfbbdb7dc 100644
--- a/ui/aura/event_filter_unittest.cc
+++ b/ui/aura/event_filter_unittest.cc
@@ -67,10 +67,10 @@ class TestEventFilterWindowDelegate : public test::TestWindowDelegate {
     return mouse_event_handling_result_;
   }
 
-  virtual ui::TouchStatus OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
+  virtual ui::EventResult OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
     ++touch_event_count_;
     // TODO(sadrul): !
-    return ui::TOUCH_STATUS_UNKNOWN;
+    return ui::ER_UNHANDLED;
   }
 
   virtual ui::EventResult OnGestureEvent(ui::GestureEvent* event) OVERRIDE {
diff --git a/ui/aura/gestures/gesture_recognizer_unittest.cc b/ui/aura/gestures/gesture_recognizer_unittest.cc
index b64ec7df2874c..788fbf47e06af 100644
--- a/ui/aura/gestures/gesture_recognizer_unittest.cc
+++ b/ui/aura/gestures/gesture_recognizer_unittest.cc
@@ -287,11 +287,8 @@ class QueueTouchEventDelegate : public GestureEventConsumeDelegate {
   }
   virtual ~QueueTouchEventDelegate() {}
 
-  virtual ui::TouchStatus OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
-    if (!queue_events_)
-      return ui::TOUCH_STATUS_UNKNOWN;
-    return event->type() == ui::ET_TOUCH_RELEASED ?
-        ui::TOUCH_STATUS_QUEUED_END : ui::TOUCH_STATUS_QUEUED;
+  virtual ui::EventResult OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
+    return queue_events_ ? ui::ER_ASYNC : ui::ER_UNHANDLED;
   }
 
   void ReceivedAck() {
@@ -2556,9 +2553,9 @@ class ConsumesTouchMovesDelegate : public GestureEventConsumeDelegate {
   void set_consume_touch_move(bool consume) { consume_touch_move_ = consume; }
 
  private:
-  virtual ui::TouchStatus OnTouchEvent(ui::TouchEvent* touch) OVERRIDE {
+  virtual ui::EventResult OnTouchEvent(ui::TouchEvent* touch) OVERRIDE {
     if (consume_touch_move_ && touch->type() == ui::ET_TOUCH_MOVED)
-      return ui::TOUCH_STATUS_CONTINUE;
+      return ui::ER_HANDLED;
     return GestureEventConsumeDelegate::OnTouchEvent(touch);
   }
 
diff --git a/ui/aura/root_window.cc b/ui/aura/root_window.cc
index b44deffaff4cf..833a0b6701dd1 100644
--- a/ui/aura/root_window.cc
+++ b/ui/aura/root_window.cc
@@ -661,55 +661,12 @@ bool RootWindow::ProcessKeyEvent(Window* target, ui::KeyEvent* event) {
   return false;
 }
 
-ui::TouchStatus RootWindow::ProcessTouchEvent(Window* target,
+ui::EventResult RootWindow::ProcessTouchEvent(Window* target,
                                               ui::TouchEvent* event) {
-  if (ProcessEvent(NULL, event) != ui::ER_UNHANDLED)
-    return ui::TOUCH_STATUS_CONTINUE;
-
-  if (!target->IsVisible())
-    return ui::TOUCH_STATUS_UNKNOWN;
-
-  ui::Event::DispatcherApi dispatch_helper(event);
-  dispatch_helper.set_target(target);
-
-  // It is necessary to dispatch the event to the event-handlers on env first.
-  // TODO(sad): Fix touch-event handling so it can use the same
-  // event-dispatching code used for other events.
-  ui::EventTarget::DispatcherApi dispatch_target_helper(Env::GetInstance());
-  const ui::EventHandlerList& pre_target =
-      dispatch_target_helper.pre_target_list();
-  for (ui::EventHandlerList::const_iterator iter = pre_target.begin();
-      iter != pre_target.end(); ++iter) {
-    ui::TouchStatus status = (*iter)->OnTouchEvent(event);
-    if (status != ui::TOUCH_STATUS_UNKNOWN)
-      return status;
-  }
-
-  EventFilters filters;
-  if (target == this)
-    GetEventFiltersToNotify(target, &filters);
-  else
-    GetEventFiltersToNotify(target->parent(), &filters);
-
-  // |target| can be deleted by any of the handlers below.
-  WindowTracker tracker;
-  tracker.Add(target);
-
-  for (EventFilters::const_reverse_iterator it = filters.rbegin(),
-           rend = filters.rend();
-       it != rend; ++it) {
-    ui::TouchStatus status = (*it)->PreHandleTouchEvent(target, event);
-    if (status != ui::TOUCH_STATUS_UNKNOWN)
-      return status;
-  }
-
-  if (tracker.Contains(target) && target->delegate()) {
-    ui::TouchStatus status = target->delegate()->OnTouchEvent(event);
-    if (status != ui::TOUCH_STATUS_UNKNOWN)
-      return status;
-  }
-
-  return ui::TOUCH_STATUS_UNKNOWN;
+  if (!target)
+    target = this;
+  AutoReset<Window*> reset(&event_dispatch_target_, target);
+  return static_cast<ui::EventResult>(ProcessEvent(target, event));
 }
 
 ui::EventResult RootWindow::ProcessGestureEvent(Window* target,
@@ -917,7 +874,7 @@ bool RootWindow::OnHostTouchEvent(ui::TouchEvent* event) {
   transform.ConcatScale(scale, scale);
   event->UpdateForRootTransform(transform);
   bool handled = false;
-  ui::TouchStatus status = ui::TOUCH_STATUS_UNKNOWN;
+  ui::EventResult result = ui::ER_UNHANDLED;
   Window* target = client::GetCaptureWindow(this);
   if (!target) {
     target = ConsumerToWindow(
@@ -931,8 +888,8 @@ bool RootWindow::OnHostTouchEvent(ui::TouchEvent* event) {
   if (!target && !bounds().Contains(event->location())) {
     // If the initial touch is outside the root window, target the root.
     target = this;
-    status = ProcessTouchEvent(target, event);
-    CHECK_EQ(ui::TOUCH_STATUS_UNKNOWN, status);
+    result = ProcessTouchEvent(target, event);
+    CHECK_EQ(ui::ER_UNHANDLED, result);
   } else {
     // We only come here when the first contact was within the root window.
     if (!target) {
@@ -943,11 +900,10 @@ bool RootWindow::OnHostTouchEvent(ui::TouchEvent* event) {
 
     ui::TouchEvent translated_event(
         *event, static_cast<Window*>(this), target);
-    status = ProcessTouchEvent(target, &translated_event);
-    handled = status != ui::TOUCH_STATUS_UNKNOWN;
+    result = ProcessTouchEvent(target, &translated_event);
+    handled = result != ui::ER_UNHANDLED;
 
-    if (status == ui::TOUCH_STATUS_QUEUED ||
-        status == ui::TOUCH_STATUS_QUEUED_END) {
+    if (result & ui::ER_ASYNC) {
       gesture_recognizer_->QueueTouchEventForGesture(target, *event);
       return true;
     }
@@ -956,7 +912,7 @@ bool RootWindow::OnHostTouchEvent(ui::TouchEvent* event) {
   // Get the list of GestureEvents from GestureRecognizer.
   scoped_ptr<ui::GestureRecognizer::Gestures> gestures;
   gestures.reset(gesture_recognizer_->ProcessTouchEventForGesture(
-      *event, status, target));
+      *event, result, target));
 
   return ProcessGestures(gestures.get()) ? true : handled;
 }
diff --git a/ui/aura/root_window.h b/ui/aura/root_window.h
index 0f56aad40bbca..71b72f0a2d16f 100644
--- a/ui/aura/root_window.h
+++ b/ui/aura/root_window.h
@@ -290,7 +290,7 @@ class AURA_EXPORT RootWindow : public ui::CompositorDelegate,
 
   bool ProcessMouseEvent(Window* target, ui::MouseEvent* event);
   bool ProcessKeyEvent(Window* target, ui::KeyEvent* event);
-  ui::TouchStatus ProcessTouchEvent(Window* target, ui::TouchEvent* event);
+  ui::EventResult ProcessTouchEvent(Window* target, ui::TouchEvent* event);
   ui::EventResult ProcessGestureEvent(Window* target,
                                       ui::GestureEvent* event);
   bool ProcessGestures(ui::GestureRecognizer::Gestures* gestures);
diff --git a/ui/aura/shared/compound_event_filter.cc b/ui/aura/shared/compound_event_filter.cc
index 0471819c91b10..c8758f22ec5b4 100644
--- a/ui/aura/shared/compound_event_filter.cc
+++ b/ui/aura/shared/compound_event_filter.cc
@@ -129,19 +129,16 @@ ui::EventResult CompoundEventFilter::FilterMouseEvent(ui::MouseEvent* event) {
   return static_cast<ui::EventResult>(result);
 }
 
-ui::TouchStatus CompoundEventFilter::FilterTouchEvent(
-    Window* target,
-    ui::TouchEvent* event) {
-  ui::TouchStatus status = ui::TOUCH_STATUS_UNKNOWN;
+ui::EventResult CompoundEventFilter::FilterTouchEvent(ui::TouchEvent* event) {
+  int result = ui::ER_UNHANDLED;
   if (filters_.might_have_observers()) {
     ObserverListBase<EventFilter>::Iterator it(filters_);
     EventFilter* filter;
-    while (status == ui::TOUCH_STATUS_UNKNOWN &&
-        (filter = it.GetNext()) != NULL) {
-      status = filter->OnTouchEvent(event);
+    while (!(result & ui::ER_CONSUMED) && (filter = it.GetNext()) != NULL) {
+      result |= filter->OnTouchEvent(event);
     }
   }
-  return status;
+  return static_cast<ui::EventResult>(result);
 }
 
 void CompoundEventFilter::SetCursorVisibilityOnEvent(aura::Window* target,
@@ -163,22 +160,6 @@ void CompoundEventFilter::SetCursorVisibilityOnEvent(aura::Window* target,
   }
 }
 
-////////////////////////////////////////////////////////////////////////////////
-// CompoundEventFilter, EventFilter implementation:
-
-ui::TouchStatus CompoundEventFilter::PreHandleTouchEvent(
-    Window* target,
-    ui::TouchEvent* event) {
-  // TODO(sad): Move the implementation into OnTouchEvent once touch-events are
-  // hooked up to go through EventDispatcher.
-  ui::TouchStatus status = FilterTouchEvent(target, event);
-  if (status == ui::TOUCH_STATUS_UNKNOWN &&
-      event->type() == ui::ET_TOUCH_PRESSED) {
-    SetCursorVisibilityOnEvent(target, event, false);
-  }
-  return status;
-}
-
 ////////////////////////////////////////////////////////////////////////////////
 // CompoundEventFilter, ui::EventHandler implementation:
 
@@ -229,8 +210,14 @@ ui::EventResult CompoundEventFilter::OnScrollEvent(ui::ScrollEvent* event) {
   return ui::ER_UNHANDLED;
 }
 
-ui::TouchStatus CompoundEventFilter::OnTouchEvent(ui::TouchEvent* event) {
-  return EventFilter::OnTouchEvent(event);
+ui::EventResult CompoundEventFilter::OnTouchEvent(ui::TouchEvent* event) {
+  ui::EventResult result = FilterTouchEvent(event);
+  if (result == ui::ER_UNHANDLED &&
+      event->type() == ui::ET_TOUCH_PRESSED) {
+    SetCursorVisibilityOnEvent(
+        static_cast<aura::Window*>(event->target()), event, false);
+  }
+  return result;
 }
 
 ui::EventResult CompoundEventFilter::OnGestureEvent(ui::GestureEvent* event) {
diff --git a/ui/aura/shared/compound_event_filter.h b/ui/aura/shared/compound_event_filter.h
index 5b35df1898709..9c0318c03cff9 100644
--- a/ui/aura/shared/compound_event_filter.h
+++ b/ui/aura/shared/compound_event_filter.h
@@ -55,7 +55,7 @@ class AURA_EXPORT CompoundEventFilter : public EventFilter {
   // Dispatches event to additional filters.
   ui::EventResult FilterKeyEvent(ui::KeyEvent* event);
   ui::EventResult FilterMouseEvent(ui::MouseEvent* event);
-  ui::TouchStatus FilterTouchEvent(Window* target, ui::TouchEvent* event);
+  ui::EventResult FilterTouchEvent(ui::TouchEvent* event);
 
   // Sets the visibility of the cursor if the event is not synthesized and
   // 1) it's hiding (show=false) when the cursor is currently shown, or
@@ -67,15 +67,11 @@ class AURA_EXPORT CompoundEventFilter : public EventFilter {
                                   ui::Event* event,
                                   bool show);
 
-  // Overridden from EventFilter:
-  virtual ui::TouchStatus PreHandleTouchEvent(Window* target,
-                                              ui::TouchEvent* event) OVERRIDE;
-
   // Overridden from ui::EventHandler:
   virtual ui::EventResult OnKeyEvent(ui::KeyEvent* event) OVERRIDE;
   virtual ui::EventResult OnMouseEvent(ui::MouseEvent* event) OVERRIDE;
   virtual ui::EventResult OnScrollEvent(ui::ScrollEvent* event) OVERRIDE;
-  virtual ui::TouchStatus OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
+  virtual ui::EventResult OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
   virtual ui::EventResult OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
   // Additional event filters that pre-handles events.
   ObserverList<EventFilter, true> filters_;
diff --git a/ui/aura/test/test_event_filter.cc b/ui/aura/test/test_event_filter.cc
index 74613f07dae5b..cd56b36aff2e1 100644
--- a/ui/aura/test/test_event_filter.cc
+++ b/ui/aura/test/test_event_filter.cc
@@ -39,10 +39,10 @@ ui::EventResult TestEventFilter::OnScrollEvent(ui::ScrollEvent* event) {
   return ui::ER_UNHANDLED;
 }
 
-ui::TouchStatus TestEventFilter::OnTouchEvent(ui::TouchEvent* event) {
+ui::EventResult TestEventFilter::OnTouchEvent(ui::TouchEvent* event) {
   ++touch_event_count_;
   // TODO(sadrul): !
-  return ui::TOUCH_STATUS_UNKNOWN;
+  return ui::ER_UNHANDLED;
 }
 
 ui::EventResult TestEventFilter::OnGestureEvent(ui::GestureEvent* event) {
diff --git a/ui/aura/test/test_event_filter.h b/ui/aura/test/test_event_filter.h
index a5016003cd5f3..11c1bdde3b7b3 100644
--- a/ui/aura/test/test_event_filter.h
+++ b/ui/aura/test/test_event_filter.h
@@ -42,7 +42,7 @@ class TestEventFilter : public EventFilter {
   virtual ui::EventResult OnKeyEvent(ui::KeyEvent* event) OVERRIDE;
   virtual ui::EventResult OnMouseEvent(ui::MouseEvent* event) OVERRIDE;
   virtual ui::EventResult OnScrollEvent(ui::ScrollEvent* event) OVERRIDE;
-  virtual ui::TouchStatus OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
+  virtual ui::EventResult OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
   virtual ui::EventResult OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
  private:
   int key_event_count_;
diff --git a/ui/aura/test/test_window_delegate.cc b/ui/aura/test/test_window_delegate.cc
index 8815c92a7ce48..62f5d8df42212 100644
--- a/ui/aura/test/test_window_delegate.cc
+++ b/ui/aura/test/test_window_delegate.cc
@@ -105,8 +105,8 @@ ui::EventResult TestWindowDelegate::OnMouseEvent(ui::MouseEvent* event) {
   return ui::ER_UNHANDLED;
 }
 
-ui::TouchStatus TestWindowDelegate::OnTouchEvent(ui::TouchEvent* event) {
-  return ui::TOUCH_STATUS_UNKNOWN;
+ui::EventResult TestWindowDelegate::OnTouchEvent(ui::TouchEvent* event) {
+  return ui::ER_UNHANDLED;
 }
 
 ui::EventResult TestWindowDelegate::OnGestureEvent(
diff --git a/ui/aura/test/test_window_delegate.h b/ui/aura/test/test_window_delegate.h
index 8076690a19d14..ba626914536d3 100644
--- a/ui/aura/test/test_window_delegate.h
+++ b/ui/aura/test/test_window_delegate.h
@@ -54,7 +54,7 @@ class TestWindowDelegate : public WindowDelegate {
   // Overridden from ui::EventHandler:
   virtual ui::EventResult OnKeyEvent(ui::KeyEvent* event) OVERRIDE;
   virtual ui::EventResult OnMouseEvent(ui::MouseEvent* event) OVERRIDE;
-  virtual ui::TouchStatus OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
+  virtual ui::EventResult OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
   virtual ui::EventResult OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
 
  private:
diff --git a/ui/aura/window_unittest.cc b/ui/aura/window_unittest.cc
index 5c93819534877..1330742c44887 100644
--- a/ui/aura/window_unittest.cc
+++ b/ui/aura/window_unittest.cc
@@ -171,9 +171,9 @@ class CaptureWindowDelegateImpl : public TestWindowDelegate {
     mouse_event_count_++;
     return ui::ER_UNHANDLED;
   }
-  virtual ui::TouchStatus OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
+  virtual ui::EventResult OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
     touch_event_count_++;
-    return ui::TOUCH_STATUS_UNKNOWN;
+    return ui::ER_UNHANDLED;
   }
   virtual ui::EventResult OnGestureEvent(
       ui::GestureEvent* event) OVERRIDE {
diff --git a/ui/base/events/event_constants.cc b/ui/base/events/event_constants.cc
new file mode 100644
index 0000000000000..fd95b35906ee7
--- /dev/null
+++ b/ui/base/events/event_constants.cc
@@ -0,0 +1,30 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/base/events/event_constants.h"
+
+#include "base/logging.h"
+
+namespace ui {
+
+EventResult EventResultFromTouchStatus(TouchStatus status) {
+  switch (status) {
+    case TOUCH_STATUS_UNKNOWN:
+      return ER_UNHANDLED;
+
+    case TOUCH_STATUS_START:
+    case TOUCH_STATUS_CONTINUE:
+    case TOUCH_STATUS_END:
+      return ER_CONSUMED;
+
+    case TOUCH_STATUS_QUEUED:
+    case TOUCH_STATUS_QUEUED_END:
+      return ER_ASYNC;
+  }
+
+  NOTREACHED();
+  return ER_UNHANDLED;
+}
+
+}  // namespace ui
diff --git a/ui/base/events/event_constants.h b/ui/base/events/event_constants.h
index 6785633f7782a..bd966eafb0e75 100644
--- a/ui/base/events/event_constants.h
+++ b/ui/base/events/event_constants.h
@@ -98,12 +98,14 @@ enum MouseEventFlags {
 
 // Result of dispatching an event.
 enum EventResult {
-  ER_UNHANDLED = 0,  // The event hasn't been handled. The event can be
-                     // propagated to other handlers.
-  ER_HANDLED,        // The event has already been handled, but it can still be
-                     // propagated to other handlers.
-  ER_CONSUMED,       // The event has been handled, and it should not be
-                     // propagated to other handlers.
+  ER_UNHANDLED = 0,       // The event hasn't been handled. The event can be
+                          // propagated to other handlers.
+  ER_HANDLED   = 1 << 0,  // The event has already been handled, but it can
+                          // still be propagated to other handlers.
+  ER_CONSUMED  = 1 << 1,  // The event has been handled, and it should not be
+                          // propagated to other handlers.
+  ER_ASYNC     = 1 << 2,  // The event will be processed asynchronously. The
+                          // event can still be propagated to other handlers.
 };
 
 // Phase of the event dispatch.
@@ -122,9 +124,6 @@ enum TouchStatus {
   TOUCH_STATUS_CONTINUE,     // The touch event is part of a previously
                              // started touch sequence.
   TOUCH_STATUS_END,          // The touch event ended the touch sequence.
-  TOUCH_STATUS_SYNTH_MOUSE,  // The touch event was not processed, but a
-                             // synthetic mouse event generated from the
-                             // unused touch event was handled.
   TOUCH_STATUS_QUEUED,       // The touch event has not been processed yet, but
                              // may be processed asynchronously later. This also
                              // places a lock on touch-events (i.e. all
@@ -135,6 +134,9 @@ enum TouchStatus {
                              // handler.
 };
 
+// Returns an equivalent EventResult from a TouchStatus.
+UI_EXPORT EventResult EventResultFromTouchStatus(TouchStatus status);
+
 // Updates the list of devices for cached properties.
 UI_EXPORT void UpdateDeviceList();
 
diff --git a/ui/base/events/event_dispatcher.cc b/ui/base/events/event_dispatcher.cc
index 23bad57e82cf8..ce0452e88090e 100644
--- a/ui/base/events/event_dispatcher.cc
+++ b/ui/base/events/event_dispatcher.cc
@@ -32,11 +32,7 @@ EventResult EventDispatcher::DispatchEventToSingleHandler(EventHandler* handler,
 
 EventResult EventDispatcher::DispatchEventToSingleHandler(EventHandler* handler,
                                                           TouchEvent* event) {
-  // TODO(sad): This needs fixing (especially for the QUEUED_ status).
-  TouchStatus status = handler->OnTouchEvent(event);
-  return status == ui::TOUCH_STATUS_UNKNOWN ? ER_UNHANDLED :
-         status == ui::TOUCH_STATUS_QUEUED_END ? ER_CONSUMED :
-                                                 ER_HANDLED;
+  return handler->OnTouchEvent(event);
 }
 
 EventResult EventDispatcher::DispatchEventToSingleHandler(EventHandler* handler,
diff --git a/ui/base/events/event_dispatcher_unittest.cc b/ui/base/events/event_dispatcher_unittest.cc
index 74e2ef8f6658b..7033be968bb71 100644
--- a/ui/base/events/event_dispatcher_unittest.cc
+++ b/ui/base/events/event_dispatcher_unittest.cc
@@ -91,9 +91,9 @@ class TestEventHandler : public EventHandler {
     return event_result_;
   }
 
-  virtual TouchStatus OnTouchEvent(TouchEvent* event) OVERRIDE {
+  virtual EventResult OnTouchEvent(TouchEvent* event) OVERRIDE {
     ReceivedEvent(event);
-    return ui::TOUCH_STATUS_UNKNOWN;
+    return event_result_;
   }
 
   virtual EventResult OnGestureEvent(GestureEvent* event) OVERRIDE {
diff --git a/ui/base/events/event_handler.h b/ui/base/events/event_handler.h
index 3e2e9c52405dc..84e6b6e2b9b6b 100644
--- a/ui/base/events/event_handler.h
+++ b/ui/base/events/event_handler.h
@@ -32,7 +32,7 @@ class UI_EXPORT EventHandler {
 
   virtual EventResult OnScrollEvent(ScrollEvent* event) = 0;
 
-  virtual TouchStatus OnTouchEvent(TouchEvent* event) = 0;
+  virtual EventResult OnTouchEvent(TouchEvent* event) = 0;
 
   virtual EventResult OnGestureEvent(GestureEvent* event) = 0;
 };
diff --git a/ui/base/events/event_target.cc b/ui/base/events/event_target.cc
index a11ec5b7938bf..505c299b236b6 100644
--- a/ui/base/events/event_target.cc
+++ b/ui/base/events/event_target.cc
@@ -84,10 +84,10 @@ EventResult EventTarget::OnScrollEvent(ScrollEvent* event) {
   return target_handler_ ? target_handler_->OnScrollEvent(event) : ER_UNHANDLED;
 }
 
-TouchStatus EventTarget::OnTouchEvent(TouchEvent* event) {
+EventResult EventTarget::OnTouchEvent(TouchEvent* event) {
   CHECK_EQ(this, event->target());
   return target_handler_ ? target_handler_->OnTouchEvent(event) :
-                           TOUCH_STATUS_UNKNOWN;
+                           ER_UNHANDLED;
 }
 
 EventResult EventTarget::OnGestureEvent(GestureEvent* event) {
diff --git a/ui/base/events/event_target.h b/ui/base/events/event_target.h
index 5687c6b5729ea..4215dcb89b7fa 100644
--- a/ui/base/events/event_target.h
+++ b/ui/base/events/event_target.h
@@ -87,7 +87,7 @@ class UI_EXPORT EventTarget : public EventHandler {
   virtual EventResult OnKeyEvent(KeyEvent* event) OVERRIDE;
   virtual EventResult OnMouseEvent(MouseEvent* event) OVERRIDE;
   virtual EventResult OnScrollEvent(ScrollEvent* event) OVERRIDE;
-  virtual TouchStatus OnTouchEvent(TouchEvent* event) OVERRIDE;
+  virtual EventResult OnTouchEvent(TouchEvent* event) OVERRIDE;
   virtual EventResult OnGestureEvent(GestureEvent* event) OVERRIDE;
 
   EventHandlerList pre_target_list_;
diff --git a/ui/base/gestures/gesture_recognizer.h b/ui/base/gestures/gesture_recognizer.h
index af3af54da7055..a49997faaa532 100644
--- a/ui/base/gestures/gesture_recognizer.h
+++ b/ui/base/gestures/gesture_recognizer.h
@@ -29,7 +29,7 @@ class UI_EXPORT GestureRecognizer {
   // TouchEvent.
   // Caller would be responsible for freeing up Gestures.
   virtual Gestures* ProcessTouchEventForGesture(const TouchEvent& event,
-                                                ui::TouchStatus status,
+                                                ui::EventResult result,
                                                 GestureConsumer* consumer) = 0;
 
   // Touch-events can be queued to be played back at a later time. The queues
diff --git a/ui/base/gestures/gesture_recognizer_impl.cc b/ui/base/gestures/gesture_recognizer_impl.cc
index a6db5a1eee612..7cb686ed1ced9 100644
--- a/ui/base/gestures/gesture_recognizer_impl.cc
+++ b/ui/base/gestures/gesture_recognizer_impl.cc
@@ -56,18 +56,18 @@ class MirroredTouchEvent : public TouchEvent {
 
 class QueuedTouchEvent : public MirroredTouchEvent {
  public:
-  QueuedTouchEvent(const TouchEvent* real, TouchStatus status)
+  QueuedTouchEvent(const TouchEvent* real, EventResult result)
       : MirroredTouchEvent(real),
-        status_(status) {
+        result_(result) {
   }
 
   virtual ~QueuedTouchEvent() {
   }
 
-  TouchStatus status() const { return status_; }
+  EventResult result() const { return result_; }
 
  private:
-  TouchStatus status_;
+  EventResult result_;
 
   DISALLOW_COPY_AND_ASSIGN(QueuedTouchEvent);
 };
@@ -258,41 +258,41 @@ void GestureRecognizerImpl::SetupTargets(const TouchEvent& event,
 
 GestureSequence::Gestures* GestureRecognizerImpl::AdvanceTouchQueueByOne(
     GestureConsumer* consumer,
-    ui::TouchStatus status) {
+    ui::EventResult result) {
   CHECK(event_queue_[consumer]);
   CHECK(!event_queue_[consumer]->empty());
 
   ScopedPop pop(event_queue_[consumer]);
   TouchEvent* event = event_queue_[consumer]->front();
   GestureSequence* sequence = GetGestureSequenceForConsumer(consumer);
-  if (status != ui::TOUCH_STATUS_UNKNOWN &&
-      event->type() == ui::ET_TOUCH_RELEASED) {
+  if (result != ER_UNHANDLED &&
+      event->type() == ET_TOUCH_RELEASED) {
     // A touch release was was processed (e.g. preventDefault()ed by a
     // web-page), but we still need to process a touch cancel.
     CancelledTouchEvent cancelled(event);
     return sequence->ProcessTouchEventForGesture(cancelled,
-                                                 ui::TOUCH_STATUS_UNKNOWN);
+                                                 ER_UNHANDLED);
   }
-  return sequence->ProcessTouchEventForGesture(*event, status);
+  return sequence->ProcessTouchEventForGesture(*event, result);
 }
 
 GestureSequence::Gestures* GestureRecognizerImpl::ProcessTouchEventForGesture(
     const TouchEvent& event,
-    ui::TouchStatus status,
+    ui::EventResult result,
     GestureConsumer* target) {
   if (event_queue_[target] && event_queue_[target]->size() > 0) {
     // There are some queued touch-events for this target. Processing |event|
     // before those queued events will result in unexpected gestures. So
     // postpone the processing of the events until the queued events have been
     // processed.
-    event_queue_[target]->push(new QueuedTouchEvent(&event, status));
+    event_queue_[target]->push(new QueuedTouchEvent(&event, result));
     return NULL;
   }
 
   SetupTargets(event, target);
 
   GestureSequence* gesture_sequence = GetGestureSequenceForConsumer(target);
-  return gesture_sequence->ProcessTouchEventForGesture(event, status);
+  return gesture_sequence->ProcessTouchEventForGesture(event, result);
 }
 
 void GestureRecognizerImpl::QueueTouchEventForGesture(GestureConsumer* consumer,
@@ -300,7 +300,7 @@ void GestureRecognizerImpl::QueueTouchEventForGesture(GestureConsumer* consumer,
   if (!event_queue_[consumer])
     event_queue_[consumer] = new std::queue<TouchEvent*>();
   event_queue_[consumer]->push(
-      new QueuedTouchEvent(&event, TOUCH_STATUS_QUEUED));
+      new QueuedTouchEvent(&event, ER_ASYNC));
 
   SetupTargets(event, consumer);
 }
@@ -314,18 +314,18 @@ GestureSequence::Gestures* GestureRecognizerImpl::AdvanceTouchQueue(
   }
 
   scoped_ptr<GestureSequence::Gestures> gestures(
-      AdvanceTouchQueueByOne(consumer, processed ? TOUCH_STATUS_CONTINUE :
-                                                   TOUCH_STATUS_UNKNOWN));
+      AdvanceTouchQueueByOne(consumer, processed ? ER_HANDLED :
+                                                   ER_UNHANDLED));
 
   // Are there any queued touch-events that should be auto-dequeued?
   while (!event_queue_[consumer]->empty()) {
     QueuedTouchEvent* event =
       static_cast<QueuedTouchEvent*>(event_queue_[consumer]->front());
-    if (event->status() == TOUCH_STATUS_QUEUED)
+    if (event->result() == ER_ASYNC)
       break;
 
     scoped_ptr<GestureSequence::Gestures> current_gestures(
-        AdvanceTouchQueueByOne(consumer, event->status()));
+        AdvanceTouchQueueByOne(consumer, event->result()));
     if (current_gestures.get()) {
       if (!gestures.get()) {
         gestures.reset(current_gestures.release());
diff --git a/ui/base/gestures/gesture_recognizer_impl.h b/ui/base/gestures/gesture_recognizer_impl.h
index 0af2a6cfd7ce2..e4cabbdf917b1 100644
--- a/ui/base/gestures/gesture_recognizer_impl.h
+++ b/ui/base/gestures/gesture_recognizer_impl.h
@@ -53,12 +53,12 @@ class UI_EXPORT GestureRecognizerImpl : public GestureRecognizer {
   // called must take ownership of the returned gestures and free them when they
   // are not needed anymore.
   Gestures* AdvanceTouchQueueByOne(GestureConsumer* consumer,
-                                   ui::TouchStatus status);
+                                   ui::EventResult result);
 
   // Overridden from GestureRecognizer
   virtual Gestures* ProcessTouchEventForGesture(
       const TouchEvent& event,
-      ui::TouchStatus status,
+      ui::EventResult result,
       GestureConsumer* target) OVERRIDE;
   virtual void QueueTouchEventForGesture(GestureConsumer* consumer,
                                          const TouchEvent& event) OVERRIDE;
diff --git a/ui/base/gestures/gesture_sequence.cc b/ui/base/gestures/gesture_sequence.cc
index e56bfca8d026c..7105aa9f14440 100644
--- a/ui/base/gestures/gesture_sequence.cc
+++ b/ui/base/gestures/gesture_sequence.cc
@@ -30,7 +30,7 @@ enum TouchState {
   TS_UNKNOWN,
 };
 
-// ui::TouchStatus is mapped to TouchStatusInternal to simply indicate whether a
+// ui::EventResult is mapped to TouchStatusInternal to simply indicate whether a
 // processed touch-event should affect gesture-recognition or not.
 enum TouchStatusInternal {
   TSI_NOT_PROCESSED,  // The touch-event should take-part into
@@ -307,11 +307,10 @@ GestureSequence::~GestureSequence() {
 
 GestureSequence::Gestures* GestureSequence::ProcessTouchEventForGesture(
     const TouchEvent& event,
-    ui::TouchStatus status) {
+    EventResult result) {
   StopLongPressTimerIfRequired(event);
   last_touch_location_ = event.location();
-  if (status == ui::TOUCH_STATUS_QUEUED ||
-      status == ui::TOUCH_STATUS_QUEUED_END)
+  if (result & ER_ASYNC)
     return NULL;
 
   // Set a limit on the number of simultaneous touches in a gesture.
@@ -351,7 +350,8 @@ GestureSequence::Gestures* GestureSequence::ProcessTouchEventForGesture(
   if (event.type() == ui::ET_TOUCH_PRESSED)
     AppendBeginGestureEvent(point, gestures.get());
 
-  TouchStatusInternal status_internal = (status == ui::TOUCH_STATUS_UNKNOWN) ?
+  CHECK_NE(ER_ASYNC, result);
+  TouchStatusInternal status_internal = (result == ER_UNHANDLED) ?
       TSI_NOT_PROCESSED : TSI_PROCESSED;
 
   EdgeStateSignatureType signature = Signature(state_, point_id,
@@ -577,7 +577,7 @@ bool GestureSequence::IsSecondTouchDownCloseEnoughForTwoFingerTap() {
   gfx::Point p1 = GetPointByPointId(0)->last_touch_position();
   gfx::Point p2 = GetPointByPointId(1)->last_touch_position();
   double max_distance =
-      ui::GestureConfiguration::max_distance_for_two_finger_tap_in_pixels();
+      GestureConfiguration::max_distance_for_two_finger_tap_in_pixels();
   double distance = (p1.x() - p2.x()) * (p1.x() - p2.x()) +
       (p1.y() - p2.y()) * (p1.y() - p2.y());
   if (distance < max_distance * max_distance)
diff --git a/ui/base/gestures/gesture_sequence.h b/ui/base/gestures/gesture_sequence.h
index 0581f1ea9b6ea..6849ae37a55c7 100644
--- a/ui/base/gestures/gesture_sequence.h
+++ b/ui/base/gestures/gesture_sequence.h
@@ -46,7 +46,7 @@ class UI_EXPORT GestureSequence {
   // TouchEvent.
   // Caller would be responsible for freeing up Gestures.
   virtual Gestures* ProcessTouchEventForGesture(const TouchEvent& event,
-                                                ui::TouchStatus status);
+                                                EventResult status);
   const GesturePoint* points() const { return points_; }
   int point_count() const { return point_count_; }
 
diff --git a/ui/ui.gyp b/ui/ui.gyp
index 66ee4ed880d8d..dd23816d65edc 100644
--- a/ui/ui.gyp
+++ b/ui/ui.gyp
@@ -218,6 +218,7 @@
         'base/dragdrop/os_exchange_data_provider_win.h',
         'base/events/event.cc',
         'base/events/event.h',
+        'base/events/event_constants.cc',
         'base/events/event_constants.h',
         'base/events/event_functions.cc',
         'base/events/event_functions.h',
diff --git a/ui/views/widget/desktop_native_widget_aura.cc b/ui/views/widget/desktop_native_widget_aura.cc
index 7d36459b8757f..159265a94e743 100644
--- a/ui/views/widget/desktop_native_widget_aura.cc
+++ b/ui/views/widget/desktop_native_widget_aura.cc
@@ -436,8 +436,9 @@ ui::EventResult DesktopNativeWidgetAura::OnMouseEvent(ui::MouseEvent* event) {
       ui::ER_HANDLED : ui::ER_UNHANDLED;
 }
 
-ui::TouchStatus DesktopNativeWidgetAura::OnTouchEvent(ui::TouchEvent* event) {
-  return native_widget_delegate_->OnTouchEvent(*event);
+ui::EventResult DesktopNativeWidgetAura::OnTouchEvent(ui::TouchEvent* event) {
+  ui::TouchStatus status = native_widget_delegate_->OnTouchEvent(*event);
+  return ui::EventResultFromTouchStatus(status);
 }
 
 ui::EventResult DesktopNativeWidgetAura::OnGestureEvent(
diff --git a/ui/views/widget/desktop_native_widget_aura.h b/ui/views/widget/desktop_native_widget_aura.h
index d6903b6208e1f..e382824c1d9e8 100644
--- a/ui/views/widget/desktop_native_widget_aura.h
+++ b/ui/views/widget/desktop_native_widget_aura.h
@@ -131,7 +131,7 @@ class VIEWS_EXPORT DesktopNativeWidgetAura
   // Overridden from ui::EventHandler:
   virtual ui::EventResult OnKeyEvent(ui::KeyEvent* event) OVERRIDE;
   virtual ui::EventResult OnMouseEvent(ui::MouseEvent* event) OVERRIDE;
-  virtual ui::TouchStatus OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
+  virtual ui::EventResult OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
   virtual ui::EventResult OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
 
  private:
diff --git a/ui/views/widget/native_widget_aura.cc b/ui/views/widget/native_widget_aura.cc
index b7c0404b3fbc9..be4dee4307435 100644
--- a/ui/views/widget/native_widget_aura.cc
+++ b/ui/views/widget/native_widget_aura.cc
@@ -875,9 +875,10 @@ ui::EventResult NativeWidgetAura::OnMouseEvent(ui::MouseEvent* event) {
   return delegate_->OnMouseEvent(*event) ? ui::ER_HANDLED : ui::ER_UNHANDLED;
 }
 
-ui::TouchStatus NativeWidgetAura::OnTouchEvent(ui::TouchEvent* event) {
+ui::EventResult NativeWidgetAura::OnTouchEvent(ui::TouchEvent* event) {
   DCHECK(window_->IsVisible());
-  return delegate_->OnTouchEvent(*event);
+  ui::TouchStatus status = delegate_->OnTouchEvent(*event);
+  return ui::EventResultFromTouchStatus(status);
 }
 
 ui::EventResult NativeWidgetAura::OnGestureEvent(ui::GestureEvent* event) {
diff --git a/ui/views/widget/native_widget_aura.h b/ui/views/widget/native_widget_aura.h
index 28dbb698f813a..ed65407a896de 100644
--- a/ui/views/widget/native_widget_aura.h
+++ b/ui/views/widget/native_widget_aura.h
@@ -153,7 +153,7 @@ class VIEWS_EXPORT NativeWidgetAura : public internal::NativeWidgetPrivate,
   // Overridden from ui::EventHandler:
   virtual ui::EventResult OnKeyEvent(ui::KeyEvent* event) OVERRIDE;
   virtual ui::EventResult OnMouseEvent(ui::MouseEvent* event) OVERRIDE;
-  virtual ui::TouchStatus OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
+  virtual ui::EventResult OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
   virtual ui::EventResult OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
 
   // Overridden from aura::client::ActivationDelegate: