diff --git a/mojo/tools/android_mojo_shell.py b/mojo/tools/android_mojo_shell.py
new file mode 100755
index 0000000..eb301dc
--- /dev/null
+++ b/mojo/tools/android_mojo_shell.py
@@ -0,0 +1,128 @@
+#!/usr/bin/env python
+# Copyright 2014 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.
+
+import argparse
+import atexit
+import logging
+import threading
+import os
+import sys
+
+import SimpleHTTPServer
+import SocketServer
+
+from mopy.config import Config
+from mopy.paths import Paths
+
+sys.path.insert(0, os.path.join(Paths().src_root, 'build', 'android'))
+from pylib import android_commands
+from pylib import constants
+from pylib import forwarder
+
+TAGS = [
+    'AndroidHandler',
+    'MojoMain',
+    'MojoShellActivity',
+    'MojoShellApplication',
+    'chromium',
+]
+
+USAGE = ("android_mojo_shell.py "
+         "[--args-for=<mojo-app>] "
+         "[--content-handlers=<handlers>] "
+         "[--enable-external-applications] "
+         "[--disable-cache] "
+         "[--enable-multiprocess] "
+         "[--url-mappings=from1=to1,from2=to2] "
+         "[<mojo-app> | --no-url] "
+         """
+
+A <mojo-app> is a Mojo URL or a Mojo URL and arguments within quotes.
+Example: mojo_shell "mojo:js_standalone test.js".
+<url-lib-path> is searched for shared libraries named by mojo URLs.
+The value of <handlers> is a comma separated list like:
+text/html,mojo:html_viewer,application/javascript,mojo:js_content_handler
+""")
+
+def GetHandlerForPath(base_path):
+  class RequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
+    """
+    Handler for SocketServer.TCPServer that will serve the files from
+    |base_path| directory over http.
+    """
+
+    def translate_path(self, path):
+      path_from_current = (
+          SimpleHTTPServer.SimpleHTTPRequestHandler.translate_path(self, path))
+      return os.path.join(base_path, os.path.relpath(path_from_current))
+
+  return RequestHandler
+
+def main():
+  logging.basicConfig()
+
+  parser = argparse.ArgumentParser(usage=USAGE)
+
+  debug_group = parser.add_mutually_exclusive_group()
+  debug_group.add_argument('--debug', help='Debug build (default)',
+                           default=True, action='store_true')
+  debug_group.add_argument('--release', help='Release build', default=False,
+                           dest='debug', action='store_false')
+  parser.add_argument('--no-url',
+                      help='Allows not to provide a application URL',
+                      action='store_true')
+  launcher_args, args = parser.parse_known_args()
+
+  paths = Paths(Config(target_os=Config.OS_ANDROID,
+                       is_debug=launcher_args.debug))
+  constants.SetOutputDirectort(paths.build_dir)
+
+  httpd = SocketServer.TCPServer(('127.0.0.1', 0),
+                                 GetHandlerForPath(paths.build_dir))
+  atexit.register(httpd.shutdown)
+  port = httpd.server_address[1]
+
+  http_thread = threading.Thread(target=httpd.serve_forever)
+  http_thread.daemon = True
+  http_thread.start()
+
+  device = android_commands.AndroidCommands(
+      android_commands.GetAttachedDevices()[0])
+  device.EnableAdbRoot()
+
+  atexit.register(forwarder.Forwarder.UnmapAllDevicePorts, device)
+  forwarder.Forwarder.Map([(0, port)], device)
+  device_port = forwarder.Forwarder.DevicePortForHostPort(port)
+
+  cmd = ('am start'
+         ' -W'
+         ' -S'
+         ' -a android.intent.action.VIEW'
+         ' -n org.chromium.mojo_shell_apk/.MojoShellActivity')
+
+  parameters = [
+      '--origin=http://127.0.0.1:%d/' % device_port
+  ]
+
+  url = None
+  if launcher_args.no_url:
+    parameters += args
+  else:
+    url = args[-1]
+    parameters += args[:-1]
+
+  cmd += ' --esa parameters \"%s\"' % ','.join(parameters)
+
+  if url:
+    cmd += ' -d %s' % url
+
+  device.RunShellCommand('logcat -c')
+  device.RunShellCommand(cmd)
+  os.system("%s logcat -s %s" % (constants.GetAdbPath(), ' '.join(TAGS)))
+  device.RunShellCommand("am force-stop org.chromium.mojo_shell_apk")
+  return 0
+
+if __name__ == "__main__":
+  sys.exit(main())
