diff --git a/deploy.py b/deploy.py
new file mode 100755
index 0000000..9b069c9
--- /dev/null
+++ b/deploy.py
@@ -0,0 +1,165 @@
+#!/usr/bin/env python3
+
+import time
+from uiautomator import Device
+import sys
+import subprocess
+import pathlib
+
+# Prepare the DUT
+def prepare_dut(serial, scenarios_dir, data_dir, apps):
+    # Copy the scenarios
+    ret = subprocess.run(['adb', '-s', serial, 'push', scenarios_dir,
+            '/sdcard/viser'], stdout=subprocess.PIPE, stderr=subprocess.PIPE,
+            universal_newlines=True)
+    if 0 < ret.returncode:
+        print('Could not push the scenarios, error was: {}'.format(ret.stderr),
+                file=sys.stderr)
+    else:
+        print('Scenarios pushed.')
+
+    # Copy the scenarios data
+    ret = subprocess.run(['adb', '-s', serial, 'push', data_dir,
+            '/sdcard/viser/data'], stdout=subprocess.PIPE,
+            stderr=subprocess.PIPE, universal_newlines=True)
+    if 0 < ret.returncode:
+        print('Could not push the scenarios data, error was: {}'.format(ret.stderr),
+                file=sys.stderr)
+    else:
+        print('Scenarios data pushed.')
+
+    # Install the smartviser apps
+    for app in apps:
+        ret = subprocess.run(['adb', '-s', serial, 'install', '-r', app],
+                stdout=subprocess.PIPE, stderr=subprocess.PIPE,
+                universal_newlines=True)
+        if 0 < ret.returncode:
+            print('Could not install app `{}`, error was: {}'.format(app,
+                    ret.stderr), file=sys.stderr)
+        else:
+            print('App `{}` installed.'.format(app))
+
+# Grant the permissions through the UI
+def configure_perms(dut):
+    prompt = dut(resourceId='android:id/content') \
+        .child_by_text('You need to grant access for the Permissions Group '
+                'Calendar Camera Contacts Microphone SMS Storage Telephone Location',
+                className='android.widget.LinearLayout') \
+        .child(text='OK', className='android.widget.Button').click()
+
+    # Accept any permission that is asked for
+    prompt = dut(resourceId='com.android.packageinstaller:id/permission_allow_button',
+            className='android.widget.Button')
+    while prompt.exists:
+        prompt.click()
+
+    # Input the credentials
+    dut(resourceId='android:id/content') \
+        .child(text='Username') \
+        .child(className='android.widget.EditText') \
+        .set_text('borjan@fairphone.com')
+    dut(resourceId='android:id/content') \
+        .child(text='Password') \
+        .child(className='android.widget.EditText') \
+        .set_text('Rickisalso1niceguy!')
+
+    # Sign in
+    dut(resourceId='android:id/content') \
+        .child(text='Sign in', className='android.widget.Button') \
+        .click()
+
+def configure_sms(dut):
+    # TODO wait for the connection to be established and time-out
+    prompt = dut(resourceId='android:id/content') \
+        .child(text='Viser must be your SMS app to send messages')
+    while not prompt.exists:
+        time.sleep(1)
+
+    # Make viser the default SMS app
+    dut(resourceId='android:id/content') \
+        .child_by_text('Viser must be your SMS app to send messages',
+                className='android.widget.LinearLayout') \
+        .child(text='OK', className='android.widget.Button') \
+        .click()
+
+    dut(resourceId='android:id/content') \
+        .child_by_text('Change SMS app?', className='android.widget.LinearLayout') \
+        .child(text='Yes', className='android.widget.Button') \
+        .click()
+
+def configure_settings(dut):
+    # Set the e-mail account
+    dut(text='Settings', className='android.widget.TextView') \
+        .click()
+    dut(resourceId='android:id/list') \
+        .child_by_text('User settings', className='android.widget.LinearLayout') \
+        .click()
+    dut(resourceId='android:id/list') \
+        .child_by_text('Email account', className='android.widget.LinearLayout') \
+        .click()
+    prompt = dut(resourceId='android:id/content') \
+        .child_by_text('Email account', className='android.widget.LinearLayout')
+    prompt.child(resourceId='android:id/edit') \
+        .set_text('fairphone.viser@gmail.com')
+    prompt.child(text='OK', className='android.widget.Button') \
+        .click()
+    dut(resourceId='android:id/list') \
+        .child_by_text('Email password', className='android.widget.LinearLayout') \
+        .click()
+    dut(text='Password :') \
+        .child(className='android.widget.EditText') \
+        .set_text('fairphoneviser2017')
+    dut(description='OK', className='android.widget.TextView') \
+        .click()
+    dut.press.back()
+    dut.press.back()
+
+serials = []
+
+if len(sys.argv) > 1:
+    serials.append(sys.argv[1])
+else:
+    # List devices attached to adb
+    ret = subprocess.run(
+            "adb devices | grep -E '^[a-z0-9-]+\s+device$' | awk '{{print $1}}'",
+            shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
+            universal_newlines=True)
+
+    if 0 < ret.returncode:
+        # TODO handle the error
+        raise Exception('Failed to list adb devices')
+    elif ret.stdout:
+        for line in ret.stdout.splitlines():
+            serial = line.strip()
+            if serial:
+                serials.append(serial)
+
+for serial in serials:
+    print('Configuring device {}'.format(serial))
+
+    dut = Device(serial)
+
+    # Push the scenarios, their data, and install the apps
+    prepare_dut(serial, '../scenarios', '../scenarios-data', [
+        '../../vendor/smartviser/viser/prebuilts/apk/com.smartviser.demogame.apk',
+        '../../vendor/smartviser/viser/prebuilts/apk/com.lunarlabs.panda.proxy.apk',
+        '../../vendor/smartviser/viser/prebuilts/apk/com.lunarlabs.panda.apk'
+    ])
+
+    # Start the viser app
+    ret = subprocess.run(['adb', '-s', serial, 'shell', 'monkey', '-p',
+            'com.lunarlabs.panda', '-c', 'android.intent.category.LAUNCHER',
+            '1'], stdout=subprocess.PIPE, stderr=subprocess.PIPE,
+            universal_newlines=True)
+    if 0 < ret.returncode:
+        print('Could not start the viser app, error was: {}'.format(app,
+                ret.stderr), file=sys.stderr)
+        exit(-1)
+
+    configure_perms(dut)
+
+    # TODO DO NOT DO THE FOLLOWING IF NO SIM CARD IS IN THE DUT
+    # time.sleep(10)
+    # configure_sms(dut)
+
+    configure_settings(dut)
