diff --git a/settings.gradle b/settings.gradle
index 891daf3ba..6d889cad9 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -5,3 +5,4 @@ rootProject.name = 'monado'
include ':src:xrt:auxiliary:android'
include ':src:xrt:ipc_android'
+include ':src:xrt:targets:openxr_android'
diff --git a/src/xrt/targets/openxr_android/build.gradle b/src/xrt/targets/openxr_android/build.gradle
new file mode 100644
index 000000000..0b51935e9
--- /dev/null
+++ b/src/xrt/targets/openxr_android/build.gradle
@@ -0,0 +1,66 @@
+// Copyright 2020, Collabora, Ltd.
+// SPDX-License-Identifier: BSL-1.0
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+
+android {
+ compileSdkVersion project.sharedTargetSdk
+ buildToolsVersion '30.0.2'
+
+ ndkVersion "${ndk_version}"
+
+ defaultConfig {
+ applicationId 'org.freedesktop.monado.openxr_runtime'
+ minSdkVersion project.sharedMinSdk
+ targetSdkVersion project.sharedTargetSdk
+ versionCode 1
+ versionName '1.0'
+ externalNativeBuild {
+ cmake {
+ arguments "-DEIGEN3_INCLUDE_DIR=${project.eigenIncludeDir}", "-DANDROID_PLATFORM=26", "-DANDROID_STL=c++_shared", "-DANDROID_ARM_NEON=TRUE"
+ }
+ }
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ // proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+
+ externalNativeBuild {
+ cmake {
+ path "../../../../CMakeLists.txt"
+ }
+ }
+
+ flavorDimensions 'deployment'
+ productFlavors {
+ inProcess {
+ dimension 'deployment'
+ applicationIdSuffix '.in_process'
+ externalNativeBuild.cmake.arguments += "-DXRT_FEATURE_SERVICE=OFF"
+ externalNativeBuild.cmake.targets "openxr_monado"
+ }
+ outOfProcess {
+ dimension 'deployment'
+ applicationIdSuffix '.out_of_process'
+ externalNativeBuild.cmake.arguments += "-DXRT_FEATURE_SERVICE=ON"
+ externalNativeBuild.cmake.targets "openxr_monado", "monado-service"
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+ outOfProcessImplementation project(':src:xrt:ipc_android')
+ implementation project(':src:xrt:auxiliary:android')
+ implementation 'androidx.appcompat:appcompat:1.2.0'
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+ implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
+}
diff --git a/src/xrt/targets/openxr_android/src/main/AndroidManifest.xml b/src/xrt/targets/openxr_android/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..07cc7006e
--- /dev/null
+++ b/src/xrt/targets/openxr_android/src/main/AndroidManifest.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/xrt/targets/openxr_android/src/main/java/org/freedesktop/monado/openxr_runtime/MainActivity.java b/src/xrt/targets/openxr_android/src/main/java/org/freedesktop/monado/openxr_runtime/MainActivity.java
new file mode 100644
index 000000000..4f212fcd5
--- /dev/null
+++ b/src/xrt/targets/openxr_android/src/main/java/org/freedesktop/monado/openxr_runtime/MainActivity.java
@@ -0,0 +1,22 @@
+// Copyright 2020, Collabora, Ltd.
+// SPDX-License-Identifier: BSL-1.0
+/*!
+ * @file
+ * @brief Simple main activity for Android.
+ * @author Ryan Pavlik
+ */
+
+package org.freedesktop.monado.openxr_runtime;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.os.Bundle;
+
+public class MainActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ }
+}
diff --git a/src/xrt/targets/openxr_android/src/main/java/org/freedesktop/monado/openxr_runtime/OpenXRListener.kt b/src/xrt/targets/openxr_android/src/main/java/org/freedesktop/monado/openxr_runtime/OpenXRListener.kt
new file mode 100644
index 000000000..f48057041
--- /dev/null
+++ b/src/xrt/targets/openxr_android/src/main/java/org/freedesktop/monado/openxr_runtime/OpenXRListener.kt
@@ -0,0 +1,32 @@
+// Copyright 2020, Collabora, Ltd.
+// SPDX-License-Identifier: BSL-1.0
+/*!
+ * @file
+ * @brief Implementation of VrListenerService.
+ * @author Ryan Pavlik
+ */
+
+package org.freedesktop.monado.openxr_runtime
+
+import android.content.ComponentName
+import android.service.vr.VrListenerService
+import android.util.Log
+import android.widget.Toast
+
+class OpenXRListener : VrListenerService() {
+ // Would like to override
+ // void onCurrentVrActivityChanged(
+ // ComponentName component, boolean running2dInVr, int pid)
+ // as recommended, but not possible?
+ override fun onCurrentVrActivityChanged(component: ComponentName?) {
+ if (component == null) {
+ Toast.makeText(this, "Now in VR for 2D", Toast.LENGTH_SHORT).show()
+ Log.i("OpenXRListener", "Got VR mode for 2D")
+
+ } else {
+ Toast.makeText(this, "Now in VR for $component", Toast.LENGTH_SHORT).show()
+ Log.i("OpenXRListener", "Got VR mode for component: $component")
+ }
+
+ }
+}
diff --git a/src/xrt/targets/openxr_android/src/main/res/drawable/ic_monado_logo.xml b/src/xrt/targets/openxr_android/src/main/res/drawable/ic_monado_logo.xml
new file mode 100644
index 000000000..1b4b099b3
--- /dev/null
+++ b/src/xrt/targets/openxr_android/src/main/res/drawable/ic_monado_logo.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/xrt/targets/openxr_android/src/main/res/layout/activity_main.xml b/src/xrt/targets/openxr_android/src/main/res/layout/activity_main.xml
new file mode 100644
index 000000000..76d165db0
--- /dev/null
+++ b/src/xrt/targets/openxr_android/src/main/res/layout/activity_main.xml
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/xrt/targets/openxr_android/src/main/res/values/colors.xml b/src/xrt/targets/openxr_android/src/main/res/values/colors.xml
new file mode 100644
index 000000000..7274b4740
--- /dev/null
+++ b/src/xrt/targets/openxr_android/src/main/res/values/colors.xml
@@ -0,0 +1,10 @@
+
+
+
+ #6200EE
+ #3700B3
+ #03DAC5
+
diff --git a/src/xrt/targets/openxr_android/src/main/res/values/strings.xml b/src/xrt/targets/openxr_android/src/main/res/values/strings.xml
new file mode 100644
index 000000000..9bc548093
--- /dev/null
+++ b/src/xrt/targets/openxr_android/src/main/res/values/strings.xml
@@ -0,0 +1,9 @@
+
+
+ FD.O Monado
+ An XR Runtime, powered by Monado
+ NOTICE text goes here
+
diff --git a/src/xrt/targets/openxr_android/src/main/res/values/styles.xml b/src/xrt/targets/openxr_android/src/main/res/values/styles.xml
new file mode 100644
index 000000000..c05d9a8a6
--- /dev/null
+++ b/src/xrt/targets/openxr_android/src/main/res/values/styles.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+