diff --git a/vm/init-waydroid.sh b/vm/init-waydroid.sh
new file mode 100755
index 0000000000000000000000000000000000000000..6ce4b1c74e2336fbc051607c8023abde1f77daef
--- /dev/null
+++ b/vm/init-waydroid.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+cd "$(dirname "$0")"
+. ../userconfig-lib.sh
+install_begin
+
+confln waydroid-run.py ~/bin/ E
+
+install_ok
diff --git a/vm/waydroid-run.py b/vm/waydroid-run.py
new file mode 100644
index 0000000000000000000000000000000000000000..827ccf7e435754038eb28c86c8d469583b5bd845
--- /dev/null
+++ b/vm/waydroid-run.py
@@ -0,0 +1,38 @@
+#!/bin/python3
+import os, sys, subprocess
+import time, select
+import select
+
+app_name = sys.argv[1] if len(sys.argv) >= 2 else None
+session = None
+
+def init():
+    global session
+    session = subprocess.Popen(["waydroid", "session", "start"], stderr=subprocess.PIPE)
+    time.sleep(0.1)
+    p = subprocess.run(["waydroid", "show-full-ui"])
+
+def clean():
+    subprocess.run(["waydroid", "session", "stop"])
+    session.communicate()
+
+init()
+while True:
+    poll = select.poll()
+    poll.register(session.stderr.fileno(), select.POLLIN)
+    poll.register(sys.stdin.fileno(), select.POLLIN)
+    for fd, event in poll.poll():
+        if fd == sys.stdin.fileno():
+            inp = input()
+            print("STDIN", inp)
+            if inp == "reload":
+                clean()
+                init()
+        if fd == session.stderr.fileno():
+            print("SESSION")
+            l = session.stderr.readline().strip().decode("utf-8")
+            print(l)
+            if l.endswith("Android with user 0 is ready"):
+                if app_name:
+                    p = subprocess.run(["waydroid", "app", "launch", app_name])
+                    p = subprocess.run(["waydroid", "show-full-ui"])