diff --git a/build.gradle b/build.gradle
index d9beda7673e1e3e41609b31276bd30052b129342..36a5303eacecfca75732749c28050905b858f079 100644
--- a/build.gradle
+++ b/build.gradle
@@ -19,6 +19,6 @@ allprojects {
     }
 }
 
-task clean (type: Delete) {
+task clean(type: Delete) {
     delete rootProject.buildDir
 }
diff --git a/mailbox/.gitignore b/mailbox-android/.gitignore
similarity index 100%
rename from mailbox/.gitignore
rename to mailbox-android/.gitignore
diff --git a/mailbox/build.gradle b/mailbox-android/build.gradle
similarity index 97%
rename from mailbox/build.gradle
rename to mailbox-android/build.gradle
index 1e313bb4db1b61bc056b0d14b851689cfa8dcc5d..a90a9f1c4351082f719b6578c7decf5eb64bb035 100644
--- a/mailbox/build.gradle
+++ b/mailbox-android/build.gradle
@@ -44,7 +44,8 @@ android {
 }
 
 dependencies {
-    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+    implementation project(path: ':mailbox-core', configuration: 'default')
+
     implementation 'androidx.appcompat:appcompat:1.3.1'
     implementation "androidx.activity:activity-ktx:1.3.0"
     implementation "androidx.fragment:fragment-ktx:1.3.6"
diff --git a/mailbox/proguard-rules.pro b/mailbox-android/proguard-rules.pro
similarity index 100%
rename from mailbox/proguard-rules.pro
rename to mailbox-android/proguard-rules.pro
diff --git a/mailbox/src/main/AndroidManifest.xml b/mailbox-android/src/main/AndroidManifest.xml
similarity index 85%
rename from mailbox/src/main/AndroidManifest.xml
rename to mailbox-android/src/main/AndroidManifest.xml
index 0e535a95782692fe221e63d110bd0f2681c52fde..7ecc940b5595f8575158169b7016c59617df104d 100644
--- a/mailbox/src/main/AndroidManifest.xml
+++ b/mailbox-android/src/main/AndroidManifest.xml
@@ -8,7 +8,7 @@
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
 
     <application
-        android:name=".MailboxApplication"
+        android:name=".android.MailboxApplication"
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
@@ -16,9 +16,9 @@
         android:supportsRtl="true"
         android:theme="@style/Theme.Briarmailbox">
 
-        <service android:name=".MailboxService" />
+        <service android:name=".android.MailboxService" />
 
-        <activity android:name=".MainActivity">
+        <activity android:name=".android.MainActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 
diff --git a/mailbox/src/main/java/org/briarproject/mailbox/ApplicationComponent.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ApplicationComponent.kt
similarity index 73%
rename from mailbox/src/main/java/org/briarproject/mailbox/ApplicationComponent.kt
rename to mailbox-android/src/main/java/org/briarproject/mailbox/android/ApplicationComponent.kt
index f9f2c7562ed247ac9d0e9a4c7ff7a03879e5e7de..72dab53170f5a22137ce276a388690307bab04b3 100644
--- a/mailbox/src/main/java/org/briarproject/mailbox/ApplicationComponent.kt
+++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ApplicationComponent.kt
@@ -1,4 +1,4 @@
-package org.briarproject.mailbox
+package org.briarproject.mailbox.android
 
 import dagger.Component
 
diff --git a/mailbox/src/main/java/org/briarproject/mailbox/MailboxApplication.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxApplication.kt
similarity index 86%
rename from mailbox/src/main/java/org/briarproject/mailbox/MailboxApplication.kt
rename to mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxApplication.kt
index 72f53354ea774fdd788292aa6d9ed7ac7632e282..ba58719345388507e89498d934089a8d94aff303 100644
--- a/mailbox/src/main/java/org/briarproject/mailbox/MailboxApplication.kt
+++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxApplication.kt
@@ -1,4 +1,4 @@
-package org.briarproject.mailbox
+package org.briarproject.mailbox.android
 
 import androidx.multidex.MultiDexApplication
 import dagger.hilt.android.HiltAndroidApp
diff --git a/mailbox/src/main/java/org/briarproject/mailbox/MailboxNotificationManager.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxNotificationManager.kt
similarity index 96%
rename from mailbox/src/main/java/org/briarproject/mailbox/MailboxNotificationManager.kt
rename to mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxNotificationManager.kt
index 476aaaa040e4063c423d7f474704e382bd245359..942b7bb700d9b05809d8da8a9cd0fb32788890c3 100644
--- a/mailbox/src/main/java/org/briarproject/mailbox/MailboxNotificationManager.kt
+++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxNotificationManager.kt
@@ -1,4 +1,4 @@
-package org.briarproject.mailbox
+package org.briarproject.mailbox.android
 
 import android.app.Notification
 import android.app.NotificationChannel
@@ -13,6 +13,7 @@ import androidx.core.app.NotificationCompat
 import androidx.core.app.NotificationCompat.PRIORITY_MIN
 import androidx.core.content.ContextCompat.getSystemService
 import dagger.hilt.android.qualifiers.ApplicationContext
+import org.briarproject.mailbox.R
 import javax.inject.Inject
 import javax.inject.Singleton
 
diff --git a/mailbox/src/main/java/org/briarproject/mailbox/MailboxService.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxService.kt
similarity index 91%
rename from mailbox/src/main/java/org/briarproject/mailbox/MailboxService.kt
rename to mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxService.kt
index be22c09ac7b0bd3c973b98601fcdc7c59e14edf7..6c9505fcebdbac9ccb6a1f6a868e2afb6288d95f 100644
--- a/mailbox/src/main/java/org/briarproject/mailbox/MailboxService.kt
+++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxService.kt
@@ -1,4 +1,4 @@
-package org.briarproject.mailbox
+package org.briarproject.mailbox.android
 
 import android.app.Service
 import android.content.Context
@@ -6,7 +6,7 @@ import android.content.Intent
 import android.os.IBinder
 import androidx.core.content.ContextCompat
 import dagger.hilt.android.AndroidEntryPoint
-import org.briarproject.mailbox.MailboxNotificationManager.Companion.NOTIFICATION_MAIN_ID
+import org.briarproject.mailbox.android.MailboxNotificationManager.Companion.NOTIFICATION_MAIN_ID
 import org.briarproject.mailbox.server.WebServerManager
 import javax.inject.Inject
 
diff --git a/mailbox/src/main/java/org/briarproject/mailbox/MailboxViewModel.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxViewModel.kt
similarity index 93%
rename from mailbox/src/main/java/org/briarproject/mailbox/MailboxViewModel.kt
rename to mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxViewModel.kt
index 2784d8038c3df078fdce47fad9663d70fbf3cf52..9ca00b30f7441bae9d11dc2df903950ff3e1f0e7 100644
--- a/mailbox/src/main/java/org/briarproject/mailbox/MailboxViewModel.kt
+++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxViewModel.kt
@@ -1,4 +1,4 @@
-package org.briarproject.mailbox
+package org.briarproject.mailbox.android
 
 import android.app.Application
 import androidx.lifecycle.AndroidViewModel
diff --git a/mailbox/src/main/java/org/briarproject/mailbox/MainActivity.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/MainActivity.kt
similarity index 91%
rename from mailbox/src/main/java/org/briarproject/mailbox/MainActivity.kt
rename to mailbox-android/src/main/java/org/briarproject/mailbox/android/MainActivity.kt
index 78ec30908d8fa8e260b3db3736bcf876b5206bbc..6d338040768cf0d36560aeef7fd41ac63d427e86 100644
--- a/mailbox/src/main/java/org/briarproject/mailbox/MainActivity.kt
+++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/MainActivity.kt
@@ -1,4 +1,4 @@
-package org.briarproject.mailbox
+package org.briarproject.mailbox.android
 
 import android.os.Bundle
 import android.widget.Button
@@ -6,6 +6,7 @@ import android.widget.TextView
 import androidx.activity.viewModels
 import androidx.appcompat.app.AppCompatActivity
 import dagger.hilt.android.AndroidEntryPoint
+import org.briarproject.mailbox.R
 
 @AndroidEntryPoint
 class MainActivity : AppCompatActivity() {
diff --git a/mailbox/src/main/java/org/briarproject/mailbox/server/Routing.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/server/Routing.kt
similarity index 100%
rename from mailbox/src/main/java/org/briarproject/mailbox/server/Routing.kt
rename to mailbox-android/src/main/java/org/briarproject/mailbox/android/server/Routing.kt
diff --git a/mailbox/src/main/java/org/briarproject/mailbox/server/WebServerManager.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/server/WebServerManager.kt
similarity index 100%
rename from mailbox/src/main/java/org/briarproject/mailbox/server/WebServerManager.kt
rename to mailbox-android/src/main/java/org/briarproject/mailbox/android/server/WebServerManager.kt
diff --git a/mailbox/src/main/res/drawable/ic_launcher_foreground.xml b/mailbox-android/src/main/res/drawable/ic_launcher_foreground.xml
similarity index 100%
rename from mailbox/src/main/res/drawable/ic_launcher_foreground.xml
rename to mailbox-android/src/main/res/drawable/ic_launcher_foreground.xml
diff --git a/mailbox/src/main/res/layout/activity_main.xml b/mailbox-android/src/main/res/layout/activity_main.xml
similarity index 96%
rename from mailbox/src/main/res/layout/activity_main.xml
rename to mailbox-android/src/main/res/layout/activity_main.xml
index d9571a8f01db7004980983960455c29a45575d8e..62bd8a4a775e0859a8e5bab58d0384860b85a1fe 100644
--- a/mailbox/src/main/res/layout/activity_main.xml
+++ b/mailbox-android/src/main/res/layout/activity_main.xml
@@ -4,7 +4,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context=".MainActivity">
+    tools:context=".android.MainActivity">
 
     <TextView
         android:id="@+id/text"
diff --git a/mailbox/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/mailbox-android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
similarity index 100%
rename from mailbox/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
rename to mailbox-android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
diff --git a/mailbox/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/mailbox-android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
similarity index 100%
rename from mailbox/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
rename to mailbox-android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
diff --git a/mailbox/src/main/res/values-night/themes.xml b/mailbox-android/src/main/res/values-night/themes.xml
similarity index 100%
rename from mailbox/src/main/res/values-night/themes.xml
rename to mailbox-android/src/main/res/values-night/themes.xml
diff --git a/mailbox/src/main/res/values/colors.xml b/mailbox-android/src/main/res/values/colors.xml
similarity index 100%
rename from mailbox/src/main/res/values/colors.xml
rename to mailbox-android/src/main/res/values/colors.xml
diff --git a/mailbox/src/main/res/values/ic_launcher_background.xml b/mailbox-android/src/main/res/values/ic_launcher_background.xml
similarity index 100%
rename from mailbox/src/main/res/values/ic_launcher_background.xml
rename to mailbox-android/src/main/res/values/ic_launcher_background.xml
diff --git a/mailbox/src/main/res/values/strings.xml b/mailbox-android/src/main/res/values/strings.xml
similarity index 100%
rename from mailbox/src/main/res/values/strings.xml
rename to mailbox-android/src/main/res/values/strings.xml
diff --git a/mailbox/src/main/res/values/themes.xml b/mailbox-android/src/main/res/values/themes.xml
similarity index 100%
rename from mailbox/src/main/res/values/themes.xml
rename to mailbox-android/src/main/res/values/themes.xml
diff --git a/mailbox-cli/build.gradle b/mailbox-cli/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..fac4db807ab8ed944265f77dcd37998eb769c9d7
--- /dev/null
+++ b/mailbox-cli/build.gradle
@@ -0,0 +1,39 @@
+import java.util.jar.JarEntry
+import java.util.jar.JarFile
+import java.util.jar.JarOutputStream
+
+import static java.util.Collections.list
+
+plugins {
+    id 'application'
+    id 'idea'
+    id 'org.jetbrains.kotlin.jvm'
+    id 'org.jetbrains.kotlin.kapt'
+}
+
+sourceCompatibility = 1.8
+targetCompatibility = 1.8
+
+dependencies {
+    implementation project(path: ':mailbox-core', configuration: 'default')
+
+    implementation 'org.slf4j:slf4j-simple:1.7.30'
+    implementation 'com.github.ajalt:clikt:2.2.0'
+
+    def junitVersion = '5.5.2'
+    testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion"
+    testImplementation "org.junit.jupiter:junit-jupiter-params:$junitVersion"
+    testRuntime "org.junit.jupiter:junit-jupiter-engine:$junitVersion"
+    testImplementation 'io.mockk:mockk:1.10.4'
+}
+
+application {
+    mainClassName = 'org.briarproject.mailbox.cli.MainKt'
+}
+
+test {
+    useJUnitPlatform()
+    testLogging {
+        events "passed", "skipped", "failed"
+    }
+}
diff --git a/mailbox-cli/src/main/java/org/briarproject/mailbox/cli/Main.kt b/mailbox-cli/src/main/java/org/briarproject/mailbox/cli/Main.kt
new file mode 100644
index 0000000000000000000000000000000000000000..ab13693777396c584feda930da7f410bb4cda41e
--- /dev/null
+++ b/mailbox-cli/src/main/java/org/briarproject/mailbox/cli/Main.kt
@@ -0,0 +1,54 @@
+package org.briarproject.mailbox.cli
+
+import com.github.ajalt.clikt.core.CliktCommand
+import com.github.ajalt.clikt.parameters.options.counted
+import com.github.ajalt.clikt.parameters.options.default
+import com.github.ajalt.clikt.parameters.options.flag
+import com.github.ajalt.clikt.parameters.options.option
+import com.github.ajalt.clikt.parameters.types.int
+import org.slf4j.impl.SimpleLogger.DEFAULT_LOG_LEVEL_KEY
+import java.io.File
+import java.io.File.separator
+import java.io.IOException
+import java.lang.System.getProperty
+import java.lang.System.setProperty
+import java.nio.file.Files.setPosixFilePermissions
+import java.nio.file.attribute.PosixFilePermission
+import java.nio.file.attribute.PosixFilePermission.*
+import java.util.logging.Level.*
+import java.util.logging.LogManager
+
+private class Main : CliktCommand(
+    name = "briar-mailbox",
+    help = "Command line interface for the Briar Mailbox"
+) {
+    private val debug by option("--debug", "-d", help = "Enable printing of debug messages").flag(
+        default = false
+    )
+    private val verbosity by option(
+        "--verbose",
+        "-v",
+        help = "Print verbose log messages"
+    ).counted()
+
+    override fun run() {
+        // logging
+        val levelSlf4j = if (debug) "DEBUG" else when (verbosity) {
+            0 -> "WARN"
+            1 -> "INFO"
+            else -> "DEBUG"
+        }
+        val level = if (debug) ALL else when (verbosity) {
+            0 -> WARNING
+            1 -> INFO
+            else -> ALL
+        }
+        setProperty(DEFAULT_LOG_LEVEL_KEY, levelSlf4j)
+        LogManager.getLogManager().getLogger("").level = level
+
+        println("Hello Mailbox")
+    }
+
+}
+
+fun main(args: Array<String>) = Main().main(args)
diff --git a/mailbox-core/build.gradle b/mailbox-core/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..c9959b80e7a3e8ac41b9fbd4e8c20e6e7b33e1f8
--- /dev/null
+++ b/mailbox-core/build.gradle
@@ -0,0 +1,26 @@
+plugins {
+    id 'java-library'
+    id 'idea'
+    id 'org.jetbrains.kotlin.jvm'
+    id 'org.jetbrains.kotlin.kapt'
+}
+
+sourceCompatibility = 1.8
+targetCompatibility = 1.8
+
+dependencies {
+    api "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+
+    def junitVersion = '5.5.2'
+    testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion"
+    testImplementation "org.junit.jupiter:junit-jupiter-params:$junitVersion"
+    testRuntime "org.junit.jupiter:junit-jupiter-engine:$junitVersion"
+    testImplementation 'io.mockk:mockk:1.10.4'
+}
+
+test {
+    useJUnitPlatform()
+    testLogging {
+        events "passed", "skipped", "failed"
+    }
+}
diff --git a/mailbox-core/src/main/java/org/briarproject/mailbox/core/Service.kt b/mailbox-core/src/main/java/org/briarproject/mailbox/core/Service.kt
new file mode 100644
index 0000000000000000000000000000000000000000..7edf91883510e5ee7f410e877a7fa658fcd0f9df
--- /dev/null
+++ b/mailbox-core/src/main/java/org/briarproject/mailbox/core/Service.kt
@@ -0,0 +1,4 @@
+package org.briarproject.mailbox.core
+
+interface Service {
+}
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
index 962945ceccc8cfd1cb7f10c50d65608d77d3d7d4..8ef7b26e7968e306807f269b864b9a0fb096fee9 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +1,3 @@
-include ':mailbox'
+include ':mailbox-core'
+include ':mailbox-android'
+include ':mailbox-cli'