diff --git a/pom.xml b/pom.xml
index 69882cdfe613a8f321df6859d07ec0dd86fac2c3..1dd8dcfa60a7a5a19edbafc030ba25cccd5f1e56 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,10 +3,16 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
+    <packaging>pom</packaging>
     <prerequisites>
         <maven>3.0.0</maven>
     </prerequisites>
 
+    <modules>
+        <module>redis-dispatch</module>
+        <module>service</module>
+    </modules>
+
     <groupId>org.whispersystems.textsecure</groupId>
     <artifactId>TextSecureServer</artifactId>
     <version>2.52</version>
@@ -14,7 +20,6 @@
     <properties>
         <dropwizard.version>1.3.9</dropwizard.version>
         <jackson.api.version>2.9.8</jackson.api.version>
-        <resilience4j.version>0.14.1</resilience4j.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
 
@@ -44,109 +49,6 @@
             <artifactId>dropwizard-migrations</artifactId>
             <version>${dropwizard.version}</version>
         </dependency>
-        <dependency>
-            <groupId>io.dropwizard</groupId>
-            <artifactId>dropwizard-testing</artifactId>
-            <version>${dropwizard.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>io.dropwizard</groupId>
-            <artifactId>dropwizard-metrics-graphite</artifactId>
-            <version>${dropwizard.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.bouncycastle</groupId>
-            <artifactId>bcprov-jdk16</artifactId>
-            <version>1.46</version>
-        </dependency>
-        <dependency>
-            <groupId>org.syslog4j</groupId>
-            <artifactId>syslog4j</artifactId>
-            <version>0.9.30</version>
-        </dependency>
-
-        <dependency>
-            <groupId>io.github.resilience4j</groupId>
-            <artifactId>resilience4j-circuitbreaker</artifactId>
-            <version>${resilience4j.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>io.github.resilience4j</groupId>
-            <artifactId>resilience4j-retry</artifactId>
-            <version>${resilience4j.version}</version>
-        </dependency>
-
-
-        <dependency>
-            <groupId>com.amazonaws</groupId>
-            <artifactId>aws-java-sdk-s3</artifactId>
-            <version>1.11.366</version>
-        </dependency>
-        <dependency>
-            <groupId>com.amazonaws</groupId>
-            <artifactId>aws-java-sdk-sqs</artifactId>
-            <version>1.11.362</version>
-        </dependency>
-        <dependency>
-            <groupId>com.google.protobuf</groupId>
-            <artifactId>protobuf-java</artifactId>
-            <version>2.6.1</version>
-        </dependency>
-
-        <dependency>
-            <groupId>redis.clients</groupId>
-            <artifactId>jedis</artifactId>
-            <version>2.9.0</version>
-            <type>jar</type>
-            <scope>compile</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.postgresql</groupId>
-            <artifactId>postgresql</artifactId>
-            <version>9.4-1201-jdbc41</version>
-        </dependency>
-        <dependency>
-            <groupId>org.whispersystems</groupId>
-            <artifactId>websocket-resources</artifactId>
-            <version>0.5.10</version>
-        </dependency>
-        <dependency>
-            <groupId>org.whispersystems</groupId>
-            <artifactId>curve25519-java</artifactId>
-            <version>0.5.0</version>
-        </dependency>
-
-
-        <dependency>
-            <groupId>com.turo</groupId>
-            <artifactId>pushy</artifactId>
-            <version>0.13.7</version>
-        </dependency>
-        <dependency>
-            <groupId>com.turo</groupId>
-            <artifactId>pushy-dropwizard-metrics-listener</artifactId>
-            <version>0.13.7</version>
-        </dependency>
-        <dependency>
-            <groupId>io.netty</groupId>
-            <artifactId>netty-tcnative-boringssl-static</artifactId>
-            <version>2.0.20.Final</version>
-            <scope>runtime</scope>
-        </dependency>
-
-
-        <dependency>
-            <groupId>org.whispersystems</groupId>
-            <artifactId>gcm-sender-async</artifactId>
-            <version>0.1.6</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.googlecode.libphonenumber</groupId>
-            <artifactId>libphonenumber</artifactId>
-            <version>8.10.2</version>
-        </dependency>
 
         <dependency>
             <groupId>javax.xml.bind</groupId>
@@ -161,33 +63,9 @@
 
 
         <dependency>
-            <groupId>org.glassfish.jersey.test-framework.providers</groupId>
-            <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
-            <version>2.19</version>
-            <scope>test</scope>
-            <exclusions>
-                <exclusion>
-                    <groupId>javax.servlet</groupId>
-                    <artifactId>javax.servlet-api</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>junit</groupId>
-                    <artifactId>junit</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-
-        <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-core</artifactId>
-            <version>2.25.1</version>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>com.opentable.components</groupId>
-            <artifactId>otj-pg-embedded</artifactId>
-            <version>0.13.1</version>
+            <groupId>io.dropwizard</groupId>
+            <artifactId>dropwizard-testing</artifactId>
+            <version>${dropwizard.version}</version>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -210,30 +88,14 @@
                 </exclusion>
             </exclusions>
         </dependency>
-
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <version>2.25.1</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>org.apache.httpcomponents</groupId>
-                <artifactId>httpclient</artifactId>
-                <version>4.4.1</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.httpcomponents</groupId>
-                <artifactId>httpcore</artifactId>
-                <version>4.4.1</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.fasterxml.jackson.core</groupId>
-                <artifactId>jackson-databind</artifactId>
-                <version>${jackson.api.version}</version>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
     <build>
         <plugins>
             <plugin>
@@ -257,40 +119,6 @@
                     </archive>
                 </configuration>
             </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <version>1.6</version>
-                <configuration>
-                    <createDependencyReducedPom>true</createDependencyReducedPom>
-                    <filters>
-                        <filter>
-                            <artifact>*:*</artifact>
-                            <excludes>
-                                <exclude>META-INF/*.SF</exclude>
-                                <exclude>META-INF/*.DSA</exclude>
-                                <exclude>META-INF/*.RSA</exclude>
-                            </excludes>
-                        </filter>
-                    </filters>
-                </configuration>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <transformers>
-                                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
-                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
-                                    <mainClass>org.whispersystems.textsecuregcm.WhisperServerService</mainClass>
-                                </transformer>
-                            </transformers>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
 
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
@@ -298,33 +126,7 @@
                 <version>3.0.0-M1</version>
             </plugin>
 
-            <plugin>
-                <artifactId>maven-assembly-plugin</artifactId>
-                <version>2.4</version>
-                <configuration>
-                    <descriptors>
-                        <descriptor>assembly.xml</descriptor>
-                    </descriptors>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>make-assembly</id> <!-- this is used for inheritance merges -->
-                        <phase>package</phase> <!-- bind to the packaging phase -->
-                        <goals>
-                            <goal>single</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-
         </plugins>
     </build>
 
-    <repositories>
-        <repository>
-            <id>gcm-server-repository</id>
-            <url>https://raw.github.com/whispersystems/maven/master/gcm-server/releases/</url>
-        </repository>
-    </repositories>
-
 </project>
diff --git a/redis-dispatch/pom.xml b/redis-dispatch/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..55a86d2159cbfbe6364a43e66aeaf8acb7c38238
--- /dev/null
+++ b/redis-dispatch/pom.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>TextSecureServer</artifactId>
+        <groupId>org.whispersystems.textsecure</groupId>
+        <version>2.49</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>org.whispersystems.textsecure</groupId>
+    <artifactId>redis-dispatch</artifactId>
+    <version>2.49</version>
+
+
+</project>
\ No newline at end of file
diff --git a/src/main/java/org/whispersystems/dispatch/DispatchChannel.java b/redis-dispatch/src/main/java/org/whispersystems/dispatch/DispatchChannel.java
similarity index 100%
rename from src/main/java/org/whispersystems/dispatch/DispatchChannel.java
rename to redis-dispatch/src/main/java/org/whispersystems/dispatch/DispatchChannel.java
diff --git a/src/main/java/org/whispersystems/dispatch/DispatchManager.java b/redis-dispatch/src/main/java/org/whispersystems/dispatch/DispatchManager.java
similarity index 100%
rename from src/main/java/org/whispersystems/dispatch/DispatchManager.java
rename to redis-dispatch/src/main/java/org/whispersystems/dispatch/DispatchManager.java
diff --git a/src/main/java/org/whispersystems/dispatch/io/RedisInputStream.java b/redis-dispatch/src/main/java/org/whispersystems/dispatch/io/RedisInputStream.java
similarity index 100%
rename from src/main/java/org/whispersystems/dispatch/io/RedisInputStream.java
rename to redis-dispatch/src/main/java/org/whispersystems/dispatch/io/RedisInputStream.java
diff --git a/src/main/java/org/whispersystems/dispatch/io/RedisPubSubConnectionFactory.java b/redis-dispatch/src/main/java/org/whispersystems/dispatch/io/RedisPubSubConnectionFactory.java
similarity index 100%
rename from src/main/java/org/whispersystems/dispatch/io/RedisPubSubConnectionFactory.java
rename to redis-dispatch/src/main/java/org/whispersystems/dispatch/io/RedisPubSubConnectionFactory.java
diff --git a/src/main/java/org/whispersystems/dispatch/redis/PubSubConnection.java b/redis-dispatch/src/main/java/org/whispersystems/dispatch/redis/PubSubConnection.java
similarity index 100%
rename from src/main/java/org/whispersystems/dispatch/redis/PubSubConnection.java
rename to redis-dispatch/src/main/java/org/whispersystems/dispatch/redis/PubSubConnection.java
diff --git a/src/main/java/org/whispersystems/dispatch/redis/PubSubReply.java b/redis-dispatch/src/main/java/org/whispersystems/dispatch/redis/PubSubReply.java
similarity index 100%
rename from src/main/java/org/whispersystems/dispatch/redis/PubSubReply.java
rename to redis-dispatch/src/main/java/org/whispersystems/dispatch/redis/PubSubReply.java
diff --git a/src/main/java/org/whispersystems/dispatch/redis/protocol/ArrayReplyHeader.java b/redis-dispatch/src/main/java/org/whispersystems/dispatch/redis/protocol/ArrayReplyHeader.java
similarity index 100%
rename from src/main/java/org/whispersystems/dispatch/redis/protocol/ArrayReplyHeader.java
rename to redis-dispatch/src/main/java/org/whispersystems/dispatch/redis/protocol/ArrayReplyHeader.java
diff --git a/src/main/java/org/whispersystems/dispatch/redis/protocol/IntReply.java b/redis-dispatch/src/main/java/org/whispersystems/dispatch/redis/protocol/IntReply.java
similarity index 100%
rename from src/main/java/org/whispersystems/dispatch/redis/protocol/IntReply.java
rename to redis-dispatch/src/main/java/org/whispersystems/dispatch/redis/protocol/IntReply.java
diff --git a/src/main/java/org/whispersystems/dispatch/redis/protocol/StringReplyHeader.java b/redis-dispatch/src/main/java/org/whispersystems/dispatch/redis/protocol/StringReplyHeader.java
similarity index 100%
rename from src/main/java/org/whispersystems/dispatch/redis/protocol/StringReplyHeader.java
rename to redis-dispatch/src/main/java/org/whispersystems/dispatch/redis/protocol/StringReplyHeader.java
diff --git a/src/main/java/org/whispersystems/dispatch/util/Util.java b/redis-dispatch/src/main/java/org/whispersystems/dispatch/util/Util.java
similarity index 100%
rename from src/main/java/org/whispersystems/dispatch/util/Util.java
rename to redis-dispatch/src/main/java/org/whispersystems/dispatch/util/Util.java
diff --git a/src/test/java/org/whispersystems/dispatch/DispatchManagerTest.java b/redis-dispatch/src/test/java/org/whispersystems/dispatch/DispatchManagerTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/dispatch/DispatchManagerTest.java
rename to redis-dispatch/src/test/java/org/whispersystems/dispatch/DispatchManagerTest.java
diff --git a/src/test/java/org/whispersystems/dispatch/redis/PubSubConnectionTest.java b/redis-dispatch/src/test/java/org/whispersystems/dispatch/redis/PubSubConnectionTest.java
similarity index 99%
rename from src/test/java/org/whispersystems/dispatch/redis/PubSubConnectionTest.java
rename to redis-dispatch/src/test/java/org/whispersystems/dispatch/redis/PubSubConnectionTest.java
index c0fc63c5f35895fcd6dc245f5937021a54adfb55..d827cdff8611d3465da04feb7b32a2e1c22264e9 100644
--- a/src/test/java/org/whispersystems/dispatch/redis/PubSubConnectionTest.java
+++ b/redis-dispatch/src/test/java/org/whispersystems/dispatch/redis/PubSubConnectionTest.java
@@ -9,7 +9,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.Socket;
-import java.security.NoSuchAlgorithmException;
 import java.security.SecureRandom;
 
 import static org.junit.Assert.*;
diff --git a/src/test/java/org/whispersystems/dispatch/redis/protocol/ArrayReplyHeaderTest.java b/redis-dispatch/src/test/java/org/whispersystems/dispatch/redis/protocol/ArrayReplyHeaderTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/dispatch/redis/protocol/ArrayReplyHeaderTest.java
rename to redis-dispatch/src/test/java/org/whispersystems/dispatch/redis/protocol/ArrayReplyHeaderTest.java
diff --git a/src/test/java/org/whispersystems/dispatch/redis/protocol/IntReplyHeaderTest.java b/redis-dispatch/src/test/java/org/whispersystems/dispatch/redis/protocol/IntReplyHeaderTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/dispatch/redis/protocol/IntReplyHeaderTest.java
rename to redis-dispatch/src/test/java/org/whispersystems/dispatch/redis/protocol/IntReplyHeaderTest.java
diff --git a/src/test/java/org/whispersystems/dispatch/redis/protocol/StringReplyHeaderTest.java b/redis-dispatch/src/test/java/org/whispersystems/dispatch/redis/protocol/StringReplyHeaderTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/dispatch/redis/protocol/StringReplyHeaderTest.java
rename to redis-dispatch/src/test/java/org/whispersystems/dispatch/redis/protocol/StringReplyHeaderTest.java
diff --git a/service/pom.xml b/service/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7a710b21e9eaca78e5a30ae09c22c25941587816
--- /dev/null
+++ b/service/pom.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>TextSecureServer</artifactId>
+        <groupId>org.whispersystems.textsecure</groupId>
+        <version>2.49</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>org.whispersystems.textsecure</groupId>
+    <artifactId>service</artifactId>
+    <version>2.49</version>
+
+    <properties>
+        <resilience4j.version>0.14.1</resilience4j.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.whispersystems.textsecure</groupId>
+            <artifactId>redis-dispatch</artifactId>
+            <version>2.49</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk16</artifactId>
+            <version>1.46</version>
+        </dependency>
+        <dependency>
+            <groupId>org.syslog4j</groupId>
+            <artifactId>syslog4j</artifactId>
+            <version>0.9.30</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>io.github.resilience4j</groupId>
+            <artifactId>resilience4j-circuitbreaker</artifactId>
+            <version>${resilience4j.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.github.resilience4j</groupId>
+            <artifactId>resilience4j-retry</artifactId>
+            <version>${resilience4j.version}</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>com.amazonaws</groupId>
+            <artifactId>aws-java-sdk-s3</artifactId>
+            <version>1.11.366</version>
+        </dependency>
+        <dependency>
+            <groupId>com.amazonaws</groupId>
+            <artifactId>aws-java-sdk-sqs</artifactId>
+            <version>1.11.362</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java</artifactId>
+            <version>2.6.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+            <version>2.9.0</version>
+            <type>jar</type>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.twilio.sdk</groupId>
+            <artifactId>twilio-java-sdk</artifactId>
+            <version>4.4.4</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+            <version>9.4-1201-jdbc41</version>
+        </dependency>
+        <dependency>
+            <groupId>org.whispersystems</groupId>
+            <artifactId>websocket-resources</artifactId>
+            <version>0.5.10</version>
+        </dependency>
+        <dependency>
+            <groupId>org.whispersystems</groupId>
+            <artifactId>curve25519-java</artifactId>
+            <version>0.5.0</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>com.turo</groupId>
+            <artifactId>pushy</artifactId>
+            <version>0.13.7</version>
+        </dependency>
+        <dependency>
+            <groupId>com.turo</groupId>
+            <artifactId>pushy-dropwizard-metrics-listener</artifactId>
+            <version>0.13.7</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>io.dropwizard.metrics</groupId>
+                    <artifactId>metrics-core</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-tcnative-boringssl-static</artifactId>
+            <version>2.0.20.Final</version>
+            <scope>runtime</scope>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.whispersystems</groupId>
+            <artifactId>gcm-sender-async</artifactId>
+            <version>0.1.6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.googlecode.libphonenumber</groupId>
+            <artifactId>libphonenumber</artifactId>
+            <version>8.10.2</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.glassfish.jersey.test-framework.providers</groupId>
+            <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
+            <version>2.25.1</version>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>javax.servlet</groupId>
+                    <artifactId>javax.servlet-api</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>junit</groupId>
+                    <artifactId>junit</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>com.opentable.components</groupId>
+            <artifactId>otj-pg-embedded</artifactId>
+            <version>0.13.1</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.httpcomponents</groupId>
+                <artifactId>httpclient</artifactId>
+                <version>4.4.1</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.httpcomponents</groupId>
+                <artifactId>httpcore</artifactId>
+                <version>4.4.1</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.fasterxml.jackson.core</groupId>
+                <artifactId>jackson-databind</artifactId>
+                <version>${jackson.api.version}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <version>1.6</version>
+                <configuration>
+                    <createDependencyReducedPom>true</createDependencyReducedPom>
+                    <filters>
+                        <filter>
+                            <artifact>*:*</artifact>
+                            <excludes>
+                                <exclude>META-INF/*.SF</exclude>
+                                <exclude>META-INF/*.DSA</exclude>
+                                <exclude>META-INF/*.RSA</exclude>
+                            </excludes>
+                        </filter>
+                    </filters>
+                </configuration>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                        <configuration>
+                            <transformers>
+                                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
+                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+                                    <mainClass>org.whispersystems.textsecuregcm.WhisperServerService</mainClass>
+                                </transformer>
+                            </transformers>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+
+</project>
diff --git a/protobuf/Makefile b/service/protobuf/Makefile
similarity index 100%
rename from protobuf/Makefile
rename to service/protobuf/Makefile
diff --git a/protobuf/PubSubMessage.proto b/service/protobuf/PubSubMessage.proto
similarity index 100%
rename from protobuf/PubSubMessage.proto
rename to service/protobuf/PubSubMessage.proto
diff --git a/protobuf/TextSecure.proto b/service/protobuf/TextSecure.proto
similarity index 100%
rename from protobuf/TextSecure.proto
rename to service/protobuf/TextSecure.proto
diff --git a/src/main/java/org/whispersystems/textsecuregcm/WhisperServerConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/WhisperServerConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/auth/AccountAuthenticator.java b/service/src/main/java/org/whispersystems/textsecuregcm/auth/AccountAuthenticator.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/auth/AccountAuthenticator.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/auth/AccountAuthenticator.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/auth/Anonymous.java b/service/src/main/java/org/whispersystems/textsecuregcm/auth/Anonymous.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/auth/Anonymous.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/auth/Anonymous.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/auth/AuthenticationCredentials.java b/service/src/main/java/org/whispersystems/textsecuregcm/auth/AuthenticationCredentials.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/auth/AuthenticationCredentials.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/auth/AuthenticationCredentials.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/auth/AuthorizationHeader.java b/service/src/main/java/org/whispersystems/textsecuregcm/auth/AuthorizationHeader.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/auth/AuthorizationHeader.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/auth/AuthorizationHeader.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/auth/CertificateGenerator.java b/service/src/main/java/org/whispersystems/textsecuregcm/auth/CertificateGenerator.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/auth/CertificateGenerator.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/auth/CertificateGenerator.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/auth/DirectoryCredentials.java b/service/src/main/java/org/whispersystems/textsecuregcm/auth/DirectoryCredentials.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/auth/DirectoryCredentials.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/auth/DirectoryCredentials.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/auth/DirectoryCredentialsGenerator.java b/service/src/main/java/org/whispersystems/textsecuregcm/auth/DirectoryCredentialsGenerator.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/auth/DirectoryCredentialsGenerator.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/auth/DirectoryCredentialsGenerator.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/auth/InvalidAuthorizationHeaderException.java b/service/src/main/java/org/whispersystems/textsecuregcm/auth/InvalidAuthorizationHeaderException.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/auth/InvalidAuthorizationHeaderException.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/auth/InvalidAuthorizationHeaderException.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/auth/OptionalAccess.java b/service/src/main/java/org/whispersystems/textsecuregcm/auth/OptionalAccess.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/auth/OptionalAccess.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/auth/OptionalAccess.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/auth/StoredVerificationCode.java b/service/src/main/java/org/whispersystems/textsecuregcm/auth/StoredVerificationCode.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/auth/StoredVerificationCode.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/auth/StoredVerificationCode.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/auth/TurnToken.java b/service/src/main/java/org/whispersystems/textsecuregcm/auth/TurnToken.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/auth/TurnToken.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/auth/TurnToken.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/auth/TurnTokenGenerator.java b/service/src/main/java/org/whispersystems/textsecuregcm/auth/TurnTokenGenerator.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/auth/TurnTokenGenerator.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/auth/TurnTokenGenerator.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/auth/UnidentifiedAccessChecksum.java b/service/src/main/java/org/whispersystems/textsecuregcm/auth/UnidentifiedAccessChecksum.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/auth/UnidentifiedAccessChecksum.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/auth/UnidentifiedAccessChecksum.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/AccountDatabaseCrawlerConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/AccountDatabaseCrawlerConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/AccountDatabaseCrawlerConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/AccountDatabaseCrawlerConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/ApnConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/ApnConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/ApnConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/ApnConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/AttachmentsConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/AttachmentsConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/AttachmentsConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/AttachmentsConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/CircuitBreakerConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/CircuitBreakerConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/CircuitBreakerConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/CircuitBreakerConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/DatabaseConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/DatabaseConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/DatabaseConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/DatabaseConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/DirectoryClientConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/DirectoryClientConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/DirectoryClientConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/DirectoryClientConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/DirectoryConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/DirectoryConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/DirectoryConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/DirectoryConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/DirectoryServerConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/DirectoryServerConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/DirectoryServerConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/DirectoryServerConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/GcmConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/GcmConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/GcmConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/GcmConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/GraphiteConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/GraphiteConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/GraphiteConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/GraphiteConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/MaxDeviceConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/MaxDeviceConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/MaxDeviceConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/MaxDeviceConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/MessageCacheConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/MessageCacheConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/MessageCacheConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/MessageCacheConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/ProfilesConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/ProfilesConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/ProfilesConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/ProfilesConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/PushConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/PushConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/PushConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/PushConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/RateLimitsConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/RateLimitsConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/RateLimitsConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/RateLimitsConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/RecaptchaConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/RecaptchaConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/RecaptchaConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/RecaptchaConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/RedisConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/RedisConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/RedisConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/RedisConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/RetryConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/RetryConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/RetryConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/RetryConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/SqsConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/SqsConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/SqsConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/SqsConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/TestDeviceConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/TestDeviceConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/TestDeviceConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/TestDeviceConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/TurnConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/TurnConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/TurnConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/TurnConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/TwilioConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/TwilioConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/TwilioConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/TwilioConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/UnidentifiedDeliveryConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/UnidentifiedDeliveryConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/UnidentifiedDeliveryConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/UnidentifiedDeliveryConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/configuration/VoiceVerificationConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/configuration/VoiceVerificationConfiguration.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/configuration/VoiceVerificationConfiguration.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/configuration/VoiceVerificationConfiguration.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/AccountController.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/AccountController.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/controllers/AccountController.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/controllers/AccountController.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/AttachmentControllerBase.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/AttachmentControllerBase.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/controllers/AttachmentControllerBase.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/controllers/AttachmentControllerBase.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/AttachmentControllerV1.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/AttachmentControllerV1.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/controllers/AttachmentControllerV1.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/controllers/AttachmentControllerV1.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/AttachmentControllerV2.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/AttachmentControllerV2.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/controllers/AttachmentControllerV2.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/controllers/AttachmentControllerV2.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/CertificateController.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/CertificateController.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/controllers/CertificateController.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/controllers/CertificateController.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceController.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceController.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceController.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceController.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceLimitExceededException.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceLimitExceededException.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceLimitExceededException.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceLimitExceededException.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/DirectoryController.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/DirectoryController.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/controllers/DirectoryController.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/controllers/DirectoryController.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/InvalidDestinationException.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/InvalidDestinationException.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/controllers/InvalidDestinationException.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/controllers/InvalidDestinationException.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/KeepAliveController.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/KeepAliveController.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/controllers/KeepAliveController.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/controllers/KeepAliveController.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/KeysController.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/KeysController.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/controllers/KeysController.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/controllers/KeysController.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/MismatchedDevicesException.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/MismatchedDevicesException.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/controllers/MismatchedDevicesException.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/controllers/MismatchedDevicesException.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/NoSuchUserException.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/NoSuchUserException.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/controllers/NoSuchUserException.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/controllers/NoSuchUserException.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/ProfileController.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/ProfileController.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/controllers/ProfileController.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/controllers/ProfileController.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/ProvisioningController.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/ProvisioningController.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/controllers/ProvisioningController.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/controllers/ProvisioningController.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/RateLimitExceededException.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/RateLimitExceededException.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/controllers/RateLimitExceededException.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/controllers/RateLimitExceededException.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/StaleDevicesException.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/StaleDevicesException.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/controllers/StaleDevicesException.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/controllers/StaleDevicesException.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/TransparentDataController.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/TransparentDataController.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/controllers/TransparentDataController.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/controllers/TransparentDataController.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/ValidationException.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/ValidationException.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/controllers/ValidationException.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/controllers/ValidationException.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/VoiceVerificationController.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/VoiceVerificationController.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/controllers/VoiceVerificationController.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/controllers/VoiceVerificationController.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/crypto/Curve.java b/service/src/main/java/org/whispersystems/textsecuregcm/crypto/Curve.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/crypto/Curve.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/crypto/Curve.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/crypto/DjbECPrivateKey.java b/service/src/main/java/org/whispersystems/textsecuregcm/crypto/DjbECPrivateKey.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/crypto/DjbECPrivateKey.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/crypto/DjbECPrivateKey.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/crypto/DjbECPublicKey.java b/service/src/main/java/org/whispersystems/textsecuregcm/crypto/DjbECPublicKey.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/crypto/DjbECPublicKey.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/crypto/DjbECPublicKey.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/crypto/ECKeyPair.java b/service/src/main/java/org/whispersystems/textsecuregcm/crypto/ECKeyPair.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/crypto/ECKeyPair.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/crypto/ECKeyPair.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/crypto/ECPrivateKey.java b/service/src/main/java/org/whispersystems/textsecuregcm/crypto/ECPrivateKey.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/crypto/ECPrivateKey.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/crypto/ECPrivateKey.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/crypto/ECPublicKey.java b/service/src/main/java/org/whispersystems/textsecuregcm/crypto/ECPublicKey.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/crypto/ECPublicKey.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/crypto/ECPublicKey.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/AccountAttributes.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/AccountAttributes.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/AccountAttributes.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/AccountAttributes.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/AccountCount.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/AccountCount.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/AccountCount.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/AccountCount.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/AcknowledgeWebsocketMessage.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/AcknowledgeWebsocketMessage.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/AcknowledgeWebsocketMessage.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/AcknowledgeWebsocketMessage.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/ActiveUserTally.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/ActiveUserTally.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/ActiveUserTally.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/ActiveUserTally.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/ApnRegistrationId.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/ApnRegistrationId.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/ApnRegistrationId.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/ApnRegistrationId.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/AttachmentDescriptorV1.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/AttachmentDescriptorV1.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/AttachmentDescriptorV1.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/AttachmentDescriptorV1.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/AttachmentDescriptorV2.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/AttachmentDescriptorV2.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/AttachmentDescriptorV2.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/AttachmentDescriptorV2.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/AttachmentUri.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/AttachmentUri.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/AttachmentUri.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/AttachmentUri.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/ClientContact.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/ClientContact.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/ClientContact.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/ClientContact.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/ClientContactTokens.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/ClientContactTokens.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/ClientContactTokens.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/ClientContactTokens.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/ClientContacts.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/ClientContacts.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/ClientContacts.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/ClientContacts.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/CryptoEncodingException.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/CryptoEncodingException.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/CryptoEncodingException.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/CryptoEncodingException.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/DeliveryCertificate.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/DeliveryCertificate.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/DeliveryCertificate.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/DeliveryCertificate.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/DeviceInfo.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/DeviceInfo.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/DeviceInfo.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/DeviceInfo.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/DeviceInfoList.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/DeviceInfoList.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/DeviceInfoList.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/DeviceInfoList.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/DeviceName.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/DeviceName.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/DeviceName.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/DeviceName.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/DeviceResponse.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/DeviceResponse.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/DeviceResponse.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/DeviceResponse.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/DirectoryFeedbackRequest.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/DirectoryFeedbackRequest.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/DirectoryFeedbackRequest.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/DirectoryFeedbackRequest.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/DirectoryReconciliationRequest.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/DirectoryReconciliationRequest.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/DirectoryReconciliationRequest.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/DirectoryReconciliationRequest.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/DirectoryReconciliationResponse.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/DirectoryReconciliationResponse.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/DirectoryReconciliationResponse.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/DirectoryReconciliationResponse.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/EncryptedOutgoingMessage.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/EncryptedOutgoingMessage.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/EncryptedOutgoingMessage.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/EncryptedOutgoingMessage.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/GcmRegistrationId.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/GcmRegistrationId.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/GcmRegistrationId.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/GcmRegistrationId.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/IncomingMessage.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/IncomingMessage.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/IncomingMessage.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/IncomingMessage.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/IncomingMessageList.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/IncomingMessageList.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/IncomingMessageList.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/IncomingMessageList.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/IncomingWebsocketMessage.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/IncomingWebsocketMessage.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/IncomingWebsocketMessage.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/IncomingWebsocketMessage.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/MessageProtos.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/MessageProtos.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/MessageProtos.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/MessageProtos.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/MessageResponse.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/MessageResponse.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/MessageResponse.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/MessageResponse.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/MismatchedDevices.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/MismatchedDevices.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/MismatchedDevices.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/MismatchedDevices.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntity.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntity.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntity.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntity.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntityList.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntityList.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntityList.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntityList.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/PreKey.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/PreKey.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/PreKey.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/PreKey.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/PreKeyCount.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/PreKeyCount.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/PreKeyCount.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/PreKeyCount.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/PreKeyResponse.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/PreKeyResponse.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/PreKeyResponse.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/PreKeyResponse.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/PreKeyResponseItem.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/PreKeyResponseItem.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/PreKeyResponseItem.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/PreKeyResponseItem.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/PreKeyState.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/PreKeyState.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/PreKeyState.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/PreKeyState.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/Profile.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/Profile.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/Profile.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/Profile.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/ProfileAvatarUploadAttributes.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/ProfileAvatarUploadAttributes.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/ProfileAvatarUploadAttributes.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/ProfileAvatarUploadAttributes.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/ProvisioningMessage.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/ProvisioningMessage.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/ProvisioningMessage.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/ProvisioningMessage.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/RegistrationLock.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/RegistrationLock.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/RegistrationLock.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/RegistrationLock.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/RegistrationLockFailure.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/RegistrationLockFailure.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/RegistrationLockFailure.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/RegistrationLockFailure.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/SendMessageResponse.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/SendMessageResponse.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/SendMessageResponse.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/SendMessageResponse.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/SignedPreKey.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/SignedPreKey.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/SignedPreKey.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/SignedPreKey.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/StaleDevices.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/StaleDevices.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/StaleDevices.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/StaleDevices.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/UnregisteredEvent.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/UnregisteredEvent.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/UnregisteredEvent.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/UnregisteredEvent.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/UnregisteredEventList.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/UnregisteredEventList.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/entities/UnregisteredEventList.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/entities/UnregisteredEventList.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/http/FaultTolerantHttpClient.java b/service/src/main/java/org/whispersystems/textsecuregcm/http/FaultTolerantHttpClient.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/http/FaultTolerantHttpClient.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/http/FaultTolerantHttpClient.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/http/FormDataBodyPublisher.java b/service/src/main/java/org/whispersystems/textsecuregcm/http/FormDataBodyPublisher.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/http/FormDataBodyPublisher.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/http/FormDataBodyPublisher.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/limits/LeakyBucket.java b/service/src/main/java/org/whispersystems/textsecuregcm/limits/LeakyBucket.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/limits/LeakyBucket.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/limits/LeakyBucket.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/limits/LockingRateLimiter.java b/service/src/main/java/org/whispersystems/textsecuregcm/limits/LockingRateLimiter.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/limits/LockingRateLimiter.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/limits/LockingRateLimiter.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/limits/RateLimiter.java b/service/src/main/java/org/whispersystems/textsecuregcm/limits/RateLimiter.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/limits/RateLimiter.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/limits/RateLimiter.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/limits/RateLimiters.java b/service/src/main/java/org/whispersystems/textsecuregcm/limits/RateLimiters.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/limits/RateLimiters.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/limits/RateLimiters.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/liquibase/AbstractLiquibaseCommand.java b/service/src/main/java/org/whispersystems/textsecuregcm/liquibase/AbstractLiquibaseCommand.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/liquibase/AbstractLiquibaseCommand.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/liquibase/AbstractLiquibaseCommand.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/liquibase/CloseableLiquibase.java b/service/src/main/java/org/whispersystems/textsecuregcm/liquibase/CloseableLiquibase.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/liquibase/CloseableLiquibase.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/liquibase/CloseableLiquibase.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/liquibase/DbMigrateCommand.java b/service/src/main/java/org/whispersystems/textsecuregcm/liquibase/DbMigrateCommand.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/liquibase/DbMigrateCommand.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/liquibase/DbMigrateCommand.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/liquibase/DbStatusCommand.java b/service/src/main/java/org/whispersystems/textsecuregcm/liquibase/DbStatusCommand.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/liquibase/DbStatusCommand.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/liquibase/DbStatusCommand.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/liquibase/NameableDbCommand.java b/service/src/main/java/org/whispersystems/textsecuregcm/liquibase/NameableDbCommand.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/liquibase/NameableDbCommand.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/liquibase/NameableDbCommand.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/liquibase/NameableMigrationsBundle.java b/service/src/main/java/org/whispersystems/textsecuregcm/liquibase/NameableMigrationsBundle.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/liquibase/NameableMigrationsBundle.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/liquibase/NameableMigrationsBundle.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/mappers/DeviceLimitExceededExceptionMapper.java b/service/src/main/java/org/whispersystems/textsecuregcm/mappers/DeviceLimitExceededExceptionMapper.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/mappers/DeviceLimitExceededExceptionMapper.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/mappers/DeviceLimitExceededExceptionMapper.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/mappers/IOExceptionMapper.java b/service/src/main/java/org/whispersystems/textsecuregcm/mappers/IOExceptionMapper.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/mappers/IOExceptionMapper.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/mappers/IOExceptionMapper.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/mappers/InvalidWebsocketAddressExceptionMapper.java b/service/src/main/java/org/whispersystems/textsecuregcm/mappers/InvalidWebsocketAddressExceptionMapper.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/mappers/InvalidWebsocketAddressExceptionMapper.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/mappers/InvalidWebsocketAddressExceptionMapper.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/mappers/RateLimitExceededExceptionMapper.java b/service/src/main/java/org/whispersystems/textsecuregcm/mappers/RateLimitExceededExceptionMapper.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/mappers/RateLimitExceededExceptionMapper.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/mappers/RateLimitExceededExceptionMapper.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/metrics/CpuUsageGauge.java b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/CpuUsageGauge.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/metrics/CpuUsageGauge.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/metrics/CpuUsageGauge.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/metrics/FileDescriptorGauge.java b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/FileDescriptorGauge.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/metrics/FileDescriptorGauge.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/metrics/FileDescriptorGauge.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/metrics/FreeMemoryGauge.java b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/FreeMemoryGauge.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/metrics/FreeMemoryGauge.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/metrics/FreeMemoryGauge.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/metrics/JsonMetricsReporter.java b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/JsonMetricsReporter.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/metrics/JsonMetricsReporter.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/metrics/JsonMetricsReporter.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/metrics/JsonMetricsReporterFactory.java b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/JsonMetricsReporterFactory.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/metrics/JsonMetricsReporterFactory.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/metrics/JsonMetricsReporterFactory.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/metrics/LoggingNetworkAppenderFactory.java b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/LoggingNetworkAppenderFactory.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/metrics/LoggingNetworkAppenderFactory.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/metrics/LoggingNetworkAppenderFactory.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/metrics/NetworkGauge.java b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/NetworkGauge.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/metrics/NetworkGauge.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/metrics/NetworkGauge.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/metrics/NetworkReceivedGauge.java b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/NetworkReceivedGauge.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/metrics/NetworkReceivedGauge.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/metrics/NetworkReceivedGauge.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/metrics/NetworkSentGauge.java b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/NetworkSentGauge.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/metrics/NetworkSentGauge.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/metrics/NetworkSentGauge.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/providers/RedisClientFactory.java b/service/src/main/java/org/whispersystems/textsecuregcm/providers/RedisClientFactory.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/providers/RedisClientFactory.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/providers/RedisClientFactory.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/providers/RedisHealthCheck.java b/service/src/main/java/org/whispersystems/textsecuregcm/providers/RedisHealthCheck.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/providers/RedisHealthCheck.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/providers/RedisHealthCheck.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/providers/TimeProvider.java b/service/src/main/java/org/whispersystems/textsecuregcm/providers/TimeProvider.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/providers/TimeProvider.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/providers/TimeProvider.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/push/APNSender.java b/service/src/main/java/org/whispersystems/textsecuregcm/push/APNSender.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/push/APNSender.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/push/APNSender.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/push/ApnFallbackManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/push/ApnFallbackManager.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/push/ApnFallbackManager.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/push/ApnFallbackManager.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/push/ApnMessage.java b/service/src/main/java/org/whispersystems/textsecuregcm/push/ApnMessage.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/push/ApnMessage.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/push/ApnMessage.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/push/GCMSender.java b/service/src/main/java/org/whispersystems/textsecuregcm/push/GCMSender.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/push/GCMSender.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/push/GCMSender.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/push/GcmMessage.java b/service/src/main/java/org/whispersystems/textsecuregcm/push/GcmMessage.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/push/GcmMessage.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/push/GcmMessage.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/push/NotPushRegisteredException.java b/service/src/main/java/org/whispersystems/textsecuregcm/push/NotPushRegisteredException.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/push/NotPushRegisteredException.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/push/NotPushRegisteredException.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/push/PushSender.java b/service/src/main/java/org/whispersystems/textsecuregcm/push/PushSender.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/push/PushSender.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/push/PushSender.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/push/ReceiptSender.java b/service/src/main/java/org/whispersystems/textsecuregcm/push/ReceiptSender.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/push/ReceiptSender.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/push/ReceiptSender.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/push/RetryingApnsClient.java b/service/src/main/java/org/whispersystems/textsecuregcm/push/RetryingApnsClient.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/push/RetryingApnsClient.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/push/RetryingApnsClient.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/push/TransientPushFailureException.java b/service/src/main/java/org/whispersystems/textsecuregcm/push/TransientPushFailureException.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/push/TransientPushFailureException.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/push/TransientPushFailureException.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/push/WebsocketSender.java b/service/src/main/java/org/whispersystems/textsecuregcm/push/WebsocketSender.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/push/WebsocketSender.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/push/WebsocketSender.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/recaptcha/RecaptchaClient.java b/service/src/main/java/org/whispersystems/textsecuregcm/recaptcha/RecaptchaClient.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/recaptcha/RecaptchaClient.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/recaptcha/RecaptchaClient.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/redis/LuaScript.java b/service/src/main/java/org/whispersystems/textsecuregcm/redis/LuaScript.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/redis/LuaScript.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/redis/LuaScript.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/redis/RedisException.java b/service/src/main/java/org/whispersystems/textsecuregcm/redis/RedisException.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/redis/RedisException.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/redis/RedisException.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/redis/RedisOperation.java b/service/src/main/java/org/whispersystems/textsecuregcm/redis/RedisOperation.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/redis/RedisOperation.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/redis/RedisOperation.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/redis/ReplicatedJedisPool.java b/service/src/main/java/org/whispersystems/textsecuregcm/redis/ReplicatedJedisPool.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/redis/ReplicatedJedisPool.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/redis/ReplicatedJedisPool.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/s3/PolicySigner.java b/service/src/main/java/org/whispersystems/textsecuregcm/s3/PolicySigner.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/s3/PolicySigner.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/s3/PolicySigner.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/s3/PostPolicyGenerator.java b/service/src/main/java/org/whispersystems/textsecuregcm/s3/PostPolicyGenerator.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/s3/PostPolicyGenerator.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/s3/PostPolicyGenerator.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/s3/UrlSigner.java b/service/src/main/java/org/whispersystems/textsecuregcm/s3/UrlSigner.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/s3/UrlSigner.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/s3/UrlSigner.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/sms/SmsSender.java b/service/src/main/java/org/whispersystems/textsecuregcm/sms/SmsSender.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/sms/SmsSender.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/sms/SmsSender.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/sms/TwilioSmsSender.java b/service/src/main/java/org/whispersystems/textsecuregcm/sms/TwilioSmsSender.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/sms/TwilioSmsSender.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/sms/TwilioSmsSender.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/sqs/DirectoryQueue.java b/service/src/main/java/org/whispersystems/textsecuregcm/sqs/DirectoryQueue.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/sqs/DirectoryQueue.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/sqs/DirectoryQueue.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/AbusiveHostRule.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AbusiveHostRule.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/AbusiveHostRule.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/AbusiveHostRule.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/AbusiveHostRules.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AbusiveHostRules.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/AbusiveHostRules.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/AbusiveHostRules.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/Account.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/Account.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/Account.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/Account.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawler.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawler.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawler.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawler.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawlerCache.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawlerCache.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawlerCache.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawlerCache.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawlerListener.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawlerListener.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawlerListener.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawlerListener.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawlerRestartException.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawlerRestartException.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawlerRestartException.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawlerRestartException.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/Accounts.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/Accounts.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/Accounts.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/Accounts.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/ActiveUserCounter.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/ActiveUserCounter.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/ActiveUserCounter.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/ActiveUserCounter.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/Device.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/Device.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/Device.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/Device.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/DirectoryManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/DirectoryManager.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/DirectoryManager.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/DirectoryManager.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/DirectoryReconciler.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/DirectoryReconciler.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/DirectoryReconciler.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/DirectoryReconciler.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/DirectoryReconciliationClient.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/DirectoryReconciliationClient.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/DirectoryReconciliationClient.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/DirectoryReconciliationClient.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/FaultTolerantDatabase.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/FaultTolerantDatabase.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/FaultTolerantDatabase.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/FaultTolerantDatabase.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/KeyRecord.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/KeyRecord.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/KeyRecord.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/KeyRecord.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/Keys.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/Keys.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/Keys.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/Keys.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/Messages.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/Messages.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/Messages.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/Messages.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCache.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCache.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCache.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCache.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesManager.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/MessagesManager.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesManager.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/PendingAccounts.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/PendingAccounts.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/PendingAccounts.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/PendingAccounts.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/PendingAccountsManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/PendingAccountsManager.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/PendingAccountsManager.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/PendingAccountsManager.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/PendingDevices.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/PendingDevices.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/PendingDevices.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/PendingDevices.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/PendingDevicesManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/PendingDevicesManager.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/PendingDevicesManager.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/PendingDevicesManager.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/PubSubAddress.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/PubSubAddress.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/PubSubAddress.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/PubSubAddress.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/PubSubManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/PubSubManager.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/PubSubManager.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/PubSubManager.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/PubSubProtos.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/PubSubProtos.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/PubSubProtos.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/PubSubProtos.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/PublicAccount.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/PublicAccount.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/PublicAccount.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/PublicAccount.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/mappers/AbusiveHostRuleRowMapper.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/mappers/AbusiveHostRuleRowMapper.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/mappers/AbusiveHostRuleRowMapper.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/mappers/AbusiveHostRuleRowMapper.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/mappers/AccountRowMapper.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/mappers/AccountRowMapper.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/mappers/AccountRowMapper.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/mappers/AccountRowMapper.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/mappers/KeyRecordRowMapper.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/mappers/KeyRecordRowMapper.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/mappers/KeyRecordRowMapper.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/mappers/KeyRecordRowMapper.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/mappers/OutgoingMessageEntityRowMapper.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/mappers/OutgoingMessageEntityRowMapper.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/mappers/OutgoingMessageEntityRowMapper.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/mappers/OutgoingMessageEntityRowMapper.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/mappers/StoredVerificationCodeRowMapper.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/mappers/StoredVerificationCodeRowMapper.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/storage/mappers/StoredVerificationCodeRowMapper.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/storage/mappers/StoredVerificationCodeRowMapper.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/util/Base64.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/Base64.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/util/Base64.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/util/Base64.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/util/BlockingThreadPoolExecutor.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/BlockingThreadPoolExecutor.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/util/BlockingThreadPoolExecutor.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/util/BlockingThreadPoolExecutor.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/util/ByteArrayAdapter.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/ByteArrayAdapter.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/util/ByteArrayAdapter.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/util/ByteArrayAdapter.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/util/ByteUtil.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/ByteUtil.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/util/ByteUtil.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/util/ByteUtil.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/util/CircuitBreakerUtil.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/CircuitBreakerUtil.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/util/CircuitBreakerUtil.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/util/CircuitBreakerUtil.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/util/Constants.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/Constants.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/util/Constants.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/util/Constants.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/util/Conversions.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/Conversions.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/util/Conversions.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/util/Conversions.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/util/ExecutorUtils.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/ExecutorUtils.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/util/ExecutorUtils.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/util/ExecutorUtils.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/util/Hex.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/Hex.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/util/Hex.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/util/Hex.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/util/IterablePair.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/IterablePair.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/util/IterablePair.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/util/IterablePair.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/util/Pair.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/Pair.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/util/Pair.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/util/Pair.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/util/SystemMapper.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/SystemMapper.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/util/SystemMapper.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/util/SystemMapper.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/util/Util.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/Util.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/util/Util.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/util/Util.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/util/VerificationCode.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/VerificationCode.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/util/VerificationCode.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/util/VerificationCode.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/websocket/AuthenticatedConnectListener.java b/service/src/main/java/org/whispersystems/textsecuregcm/websocket/AuthenticatedConnectListener.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/websocket/AuthenticatedConnectListener.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/websocket/AuthenticatedConnectListener.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/websocket/DeadLetterHandler.java b/service/src/main/java/org/whispersystems/textsecuregcm/websocket/DeadLetterHandler.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/websocket/DeadLetterHandler.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/websocket/DeadLetterHandler.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/websocket/InvalidWebsocketAddressException.java b/service/src/main/java/org/whispersystems/textsecuregcm/websocket/InvalidWebsocketAddressException.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/websocket/InvalidWebsocketAddressException.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/websocket/InvalidWebsocketAddressException.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/websocket/ProvisioningAddress.java b/service/src/main/java/org/whispersystems/textsecuregcm/websocket/ProvisioningAddress.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/websocket/ProvisioningAddress.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/websocket/ProvisioningAddress.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/websocket/ProvisioningConnectListener.java b/service/src/main/java/org/whispersystems/textsecuregcm/websocket/ProvisioningConnectListener.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/websocket/ProvisioningConnectListener.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/websocket/ProvisioningConnectListener.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/websocket/ProvisioningConnection.java b/service/src/main/java/org/whispersystems/textsecuregcm/websocket/ProvisioningConnection.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/websocket/ProvisioningConnection.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/websocket/ProvisioningConnection.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketAccountAuthenticator.java b/service/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketAccountAuthenticator.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketAccountAuthenticator.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketAccountAuthenticator.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java b/service/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/websocket/WebsocketAddress.java b/service/src/main/java/org/whispersystems/textsecuregcm/websocket/WebsocketAddress.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/websocket/WebsocketAddress.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/websocket/WebsocketAddress.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/workers/CertificateCommand.java b/service/src/main/java/org/whispersystems/textsecuregcm/workers/CertificateCommand.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/workers/CertificateCommand.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/workers/CertificateCommand.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/workers/DeleteUserCommand.java b/service/src/main/java/org/whispersystems/textsecuregcm/workers/DeleteUserCommand.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/workers/DeleteUserCommand.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/workers/DeleteUserCommand.java
diff --git a/src/main/java/org/whispersystems/textsecuregcm/workers/VacuumCommand.java b/service/src/main/java/org/whispersystems/textsecuregcm/workers/VacuumCommand.java
similarity index 100%
rename from src/main/java/org/whispersystems/textsecuregcm/workers/VacuumCommand.java
rename to service/src/main/java/org/whispersystems/textsecuregcm/workers/VacuumCommand.java
diff --git a/src/main/resources/META-INF/services/io.dropwizard.logging.AppenderFactory b/service/src/main/resources/META-INF/services/io.dropwizard.logging.AppenderFactory
similarity index 100%
rename from src/main/resources/META-INF/services/io.dropwizard.logging.AppenderFactory
rename to service/src/main/resources/META-INF/services/io.dropwizard.logging.AppenderFactory
diff --git a/src/main/resources/META-INF/services/io.dropwizard.metrics.ReporterFactory b/service/src/main/resources/META-INF/services/io.dropwizard.metrics.ReporterFactory
similarity index 100%
rename from src/main/resources/META-INF/services/io.dropwizard.metrics.ReporterFactory
rename to service/src/main/resources/META-INF/services/io.dropwizard.metrics.ReporterFactory
diff --git a/src/main/resources/abusedb.xml b/service/src/main/resources/abusedb.xml
similarity index 100%
rename from src/main/resources/abusedb.xml
rename to service/src/main/resources/abusedb.xml
diff --git a/src/main/resources/accountsdb.xml b/service/src/main/resources/accountsdb.xml
similarity index 100%
rename from src/main/resources/accountsdb.xml
rename to service/src/main/resources/accountsdb.xml
diff --git a/src/main/resources/banner.txt b/service/src/main/resources/banner.txt
similarity index 100%
rename from src/main/resources/banner.txt
rename to service/src/main/resources/banner.txt
diff --git a/src/main/resources/lua/account_database_crawler/unlock.lua b/service/src/main/resources/lua/account_database_crawler/unlock.lua
similarity index 100%
rename from src/main/resources/lua/account_database_crawler/unlock.lua
rename to service/src/main/resources/lua/account_database_crawler/unlock.lua
diff --git a/src/main/resources/lua/apn/get.lua b/service/src/main/resources/lua/apn/get.lua
similarity index 100%
rename from src/main/resources/lua/apn/get.lua
rename to service/src/main/resources/lua/apn/get.lua
diff --git a/src/main/resources/lua/apn/insert.lua b/service/src/main/resources/lua/apn/insert.lua
similarity index 100%
rename from src/main/resources/lua/apn/insert.lua
rename to service/src/main/resources/lua/apn/insert.lua
diff --git a/src/main/resources/lua/apn/remove.lua b/service/src/main/resources/lua/apn/remove.lua
similarity index 100%
rename from src/main/resources/lua/apn/remove.lua
rename to service/src/main/resources/lua/apn/remove.lua
diff --git a/src/main/resources/lua/get_items.lua b/service/src/main/resources/lua/get_items.lua
similarity index 100%
rename from src/main/resources/lua/get_items.lua
rename to service/src/main/resources/lua/get_items.lua
diff --git a/src/main/resources/lua/get_queues_to_persist.lua b/service/src/main/resources/lua/get_queues_to_persist.lua
similarity index 100%
rename from src/main/resources/lua/get_queues_to_persist.lua
rename to service/src/main/resources/lua/get_queues_to_persist.lua
diff --git a/src/main/resources/lua/insert_item.lua b/service/src/main/resources/lua/insert_item.lua
similarity index 100%
rename from src/main/resources/lua/insert_item.lua
rename to service/src/main/resources/lua/insert_item.lua
diff --git a/src/main/resources/lua/remove_item_by_guid.lua b/service/src/main/resources/lua/remove_item_by_guid.lua
similarity index 100%
rename from src/main/resources/lua/remove_item_by_guid.lua
rename to service/src/main/resources/lua/remove_item_by_guid.lua
diff --git a/src/main/resources/lua/remove_item_by_id.lua b/service/src/main/resources/lua/remove_item_by_id.lua
similarity index 100%
rename from src/main/resources/lua/remove_item_by_id.lua
rename to service/src/main/resources/lua/remove_item_by_id.lua
diff --git a/src/main/resources/lua/remove_item_by_sender.lua b/service/src/main/resources/lua/remove_item_by_sender.lua
similarity index 100%
rename from src/main/resources/lua/remove_item_by_sender.lua
rename to service/src/main/resources/lua/remove_item_by_sender.lua
diff --git a/src/main/resources/lua/remove_queue.lua b/service/src/main/resources/lua/remove_queue.lua
similarity index 100%
rename from src/main/resources/lua/remove_queue.lua
rename to service/src/main/resources/lua/remove_queue.lua
diff --git a/src/main/resources/messagedb.xml b/service/src/main/resources/messagedb.xml
similarity index 100%
rename from src/main/resources/messagedb.xml
rename to service/src/main/resources/messagedb.xml
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/auth/OptionalAccessTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/auth/OptionalAccessTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/auth/OptionalAccessTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/auth/OptionalAccessTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/AccountControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/AccountControllerTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/controllers/AccountControllerTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/AccountControllerTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/AttachmentControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/AttachmentControllerTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/controllers/AttachmentControllerTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/AttachmentControllerTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/CertificateControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/CertificateControllerTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/controllers/CertificateControllerTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/CertificateControllerTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/DeviceControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/DeviceControllerTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/controllers/DeviceControllerTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/DeviceControllerTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/DirectoryControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/DirectoryControllerTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/controllers/DirectoryControllerTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/DirectoryControllerTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/KeyControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/KeyControllerTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/controllers/KeyControllerTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/KeyControllerTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/MessageControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/MessageControllerTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/controllers/MessageControllerTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/MessageControllerTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/ProfileControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/ProfileControllerTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/controllers/ProfileControllerTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/ProfileControllerTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/TransparentDataControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/TransparentDataControllerTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/controllers/TransparentDataControllerTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/TransparentDataControllerTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/VoiceVerificationControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/VoiceVerificationControllerTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/controllers/VoiceVerificationControllerTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/VoiceVerificationControllerTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/entities/ClientContactTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/entities/ClientContactTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/entities/ClientContactTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/entities/ClientContactTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/entities/PreKeyTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/entities/PreKeyTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/entities/PreKeyTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/entities/PreKeyTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/http/FaultTolerantHttpClientTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/http/FaultTolerantHttpClientTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/http/FaultTolerantHttpClientTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/http/FaultTolerantHttpClientTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/limits/LeakyBucketTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/limits/LeakyBucketTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/limits/LeakyBucketTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/limits/LeakyBucketTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/push/APNSenderTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/push/APNSenderTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/push/APNSenderTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/push/APNSenderTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/push/GCMSenderTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/push/GCMSenderTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/push/GCMSenderTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/push/GCMSenderTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/redis/ReplicatedJedisPoolTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/redis/ReplicatedJedisPoolTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/redis/ReplicatedJedisPoolTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/redis/ReplicatedJedisPoolTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/s3/PolicySignerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/s3/PolicySignerTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/s3/PolicySignerTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/s3/PolicySignerTest.java
diff --git a/src/test/java/org/whispersystems/sms/TwilioSmsSenderTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/sms/TwilioSmsSenderTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/sms/TwilioSmsSenderTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/sms/TwilioSmsSenderTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AbusiveHostRulesTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AbusiveHostRulesTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/storage/AbusiveHostRulesTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AbusiveHostRulesTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountDatabaseCrawlerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountDatabaseCrawlerTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountDatabaseCrawlerTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountDatabaseCrawlerTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsManagerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsManagerTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsManagerTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsManagerTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/storage/ActiveUserCounterTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/ActiveUserCounterTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/storage/ActiveUserCounterTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/ActiveUserCounterTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/storage/DirectoryReconcilerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/DirectoryReconcilerTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/storage/DirectoryReconcilerTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/DirectoryReconcilerTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/storage/KeysTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/KeysTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/storage/KeysTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/KeysTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/storage/MessagesTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/MessagesTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/storage/MessagesTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/MessagesTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/storage/PendingAccountsTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/PendingAccountsTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/storage/PendingAccountsTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/PendingAccountsTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/storage/PendingDevicesTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/PendingDevicesTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/storage/PendingDevicesTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/PendingDevicesTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/storage/PublicAccountTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/PublicAccountTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/storage/PublicAccountTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/PublicAccountTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/util/AuthHelper.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/util/AuthHelper.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/util/AuthHelper.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/util/AuthHelper.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/util/BlockingThreadPoolExecutorTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/util/BlockingThreadPoolExecutorTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/util/BlockingThreadPoolExecutorTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/util/BlockingThreadPoolExecutorTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/util/JsonHelpers.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/util/JsonHelpers.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/util/JsonHelpers.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/util/JsonHelpers.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/util/NumberPrefixTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/util/NumberPrefixTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/util/NumberPrefixTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/util/NumberPrefixTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/util/SynchronousExecutorService.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/util/SynchronousExecutorService.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/util/SynchronousExecutorService.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/util/SynchronousExecutorService.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/util/UrlSignerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/util/UrlSignerTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/util/UrlSignerTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/util/UrlSignerTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/util/ValidNumberTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/util/ValidNumberTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/util/ValidNumberTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/util/ValidNumberTest.java
diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/websocket/WebSocketConnectionTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/websocket/WebSocketConnectionTest.java
similarity index 100%
rename from src/test/java/org/whispersystems/textsecuregcm/tests/websocket/WebSocketConnectionTest.java
rename to service/src/test/java/org/whispersystems/textsecuregcm/tests/websocket/WebSocketConnectionTest.java
diff --git a/src/test/resources/fixtures/contact.json b/service/src/test/resources/fixtures/contact.json
similarity index 100%
rename from src/test/resources/fixtures/contact.json
rename to service/src/test/resources/fixtures/contact.json
diff --git a/src/test/resources/fixtures/contact.relay.json b/service/src/test/resources/fixtures/contact.relay.json
similarity index 100%
rename from src/test/resources/fixtures/contact.relay.json
rename to service/src/test/resources/fixtures/contact.relay.json
diff --git a/src/test/resources/fixtures/contact.relay.video.json b/service/src/test/resources/fixtures/contact.relay.video.json
similarity index 100%
rename from src/test/resources/fixtures/contact.relay.video.json
rename to service/src/test/resources/fixtures/contact.relay.video.json
diff --git a/src/test/resources/fixtures/contact.relay.voice.json b/service/src/test/resources/fixtures/contact.relay.voice.json
similarity index 100%
rename from src/test/resources/fixtures/contact.relay.voice.json
rename to service/src/test/resources/fixtures/contact.relay.voice.json
diff --git a/src/test/resources/fixtures/current_message_extra_device.json b/service/src/test/resources/fixtures/current_message_extra_device.json
similarity index 100%
rename from src/test/resources/fixtures/current_message_extra_device.json
rename to service/src/test/resources/fixtures/current_message_extra_device.json
diff --git a/src/test/resources/fixtures/current_message_multi_device.json b/service/src/test/resources/fixtures/current_message_multi_device.json
similarity index 100%
rename from src/test/resources/fixtures/current_message_multi_device.json
rename to service/src/test/resources/fixtures/current_message_multi_device.json
diff --git a/src/test/resources/fixtures/current_message_registration_id.json b/service/src/test/resources/fixtures/current_message_registration_id.json
similarity index 100%
rename from src/test/resources/fixtures/current_message_registration_id.json
rename to service/src/test/resources/fixtures/current_message_registration_id.json
diff --git a/src/test/resources/fixtures/current_message_single_device.json b/service/src/test/resources/fixtures/current_message_single_device.json
similarity index 100%
rename from src/test/resources/fixtures/current_message_single_device.json
rename to service/src/test/resources/fixtures/current_message_single_device.json
diff --git a/src/test/resources/fixtures/legacy_message_single_device.json b/service/src/test/resources/fixtures/legacy_message_single_device.json
similarity index 100%
rename from src/test/resources/fixtures/legacy_message_single_device.json
rename to service/src/test/resources/fixtures/legacy_message_single_device.json
diff --git a/src/test/resources/fixtures/mismatched_registration_id.json b/service/src/test/resources/fixtures/mismatched_registration_id.json
similarity index 100%
rename from src/test/resources/fixtures/mismatched_registration_id.json
rename to service/src/test/resources/fixtures/mismatched_registration_id.json
diff --git a/src/test/resources/fixtures/missing_device_response.json b/service/src/test/resources/fixtures/missing_device_response.json
similarity index 100%
rename from src/test/resources/fixtures/missing_device_response.json
rename to service/src/test/resources/fixtures/missing_device_response.json
diff --git a/src/test/resources/fixtures/missing_device_response2.json b/service/src/test/resources/fixtures/missing_device_response2.json
similarity index 100%
rename from src/test/resources/fixtures/missing_device_response2.json
rename to service/src/test/resources/fixtures/missing_device_response2.json
diff --git a/src/test/resources/fixtures/prekey.json b/service/src/test/resources/fixtures/prekey.json
similarity index 100%
rename from src/test/resources/fixtures/prekey.json
rename to service/src/test/resources/fixtures/prekey.json
diff --git a/src/test/resources/fixtures/prekey_v2.json b/service/src/test/resources/fixtures/prekey_v2.json
similarity index 100%
rename from src/test/resources/fixtures/prekey_v2.json
rename to service/src/test/resources/fixtures/prekey_v2.json
diff --git a/src/test/resources/fixtures/transparent_account.json b/service/src/test/resources/fixtures/transparent_account.json
similarity index 100%
rename from src/test/resources/fixtures/transparent_account.json
rename to service/src/test/resources/fixtures/transparent_account.json
diff --git a/src/test/resources/fixtures/transparent_account2.json b/service/src/test/resources/fixtures/transparent_account2.json
similarity index 100%
rename from src/test/resources/fixtures/transparent_account2.json
rename to service/src/test/resources/fixtures/transparent_account2.json
diff --git a/src/test/resources/fixtures/voice_verification_en_us.xml b/service/src/test/resources/fixtures/voice_verification_en_us.xml
similarity index 100%
rename from src/test/resources/fixtures/voice_verification_en_us.xml
rename to service/src/test/resources/fixtures/voice_verification_en_us.xml
diff --git a/src/test/resources/fixtures/voice_verification_pt_br.xml b/service/src/test/resources/fixtures/voice_verification_pt_br.xml
similarity index 100%
rename from src/test/resources/fixtures/voice_verification_pt_br.xml
rename to service/src/test/resources/fixtures/voice_verification_pt_br.xml
diff --git a/src/test/resources/fixtures/voice_verification_ru.xml b/service/src/test/resources/fixtures/voice_verification_ru.xml
similarity index 100%
rename from src/test/resources/fixtures/voice_verification_ru.xml
rename to service/src/test/resources/fixtures/voice_verification_ru.xml
diff --git a/system.properties b/system.properties
deleted file mode 100644
index 97270b43fdb85b77e797fe0f60fb267ac574faee..0000000000000000000000000000000000000000
--- a/system.properties
+++ /dev/null
@@ -1 +0,0 @@
-java.runtime.version=1.7