From d0d375aeb732ee9fa27e13fcd1dbc6942ab14166 Mon Sep 17 00:00:00 2001
From: Moxie Marlinspike <moxie+github@signal.org>
Date: Sat, 20 Apr 2019 21:56:20 -0700
Subject: [PATCH] Break out into a multi-module project

---
 pom.xml                                       | 228 ++----------------
 redis-dispatch/pom.xml                        |  17 ++
 .../dispatch/DispatchChannel.java             |   0
 .../dispatch/DispatchManager.java             |   0
 .../dispatch/io/RedisInputStream.java         |   0
 .../io/RedisPubSubConnectionFactory.java      |   0
 .../dispatch/redis/PubSubConnection.java      |   0
 .../dispatch/redis/PubSubReply.java           |   0
 .../redis/protocol/ArrayReplyHeader.java      |   0
 .../dispatch/redis/protocol/IntReply.java     |   0
 .../redis/protocol/StringReplyHeader.java     |   0
 .../whispersystems/dispatch/util/Util.java    |   0
 .../dispatch/DispatchManagerTest.java         |   0
 .../dispatch/redis/PubSubConnectionTest.java  |   1 -
 .../redis/protocol/ArrayReplyHeaderTest.java  |   0
 .../redis/protocol/IntReplyHeaderTest.java    |   0
 .../redis/protocol/StringReplyHeaderTest.java |   0
 service/pom.xml                               | 223 +++++++++++++++++
 {protobuf => service/protobuf}/Makefile       |   0
 .../protobuf}/PubSubMessage.proto             |   0
 .../protobuf}/TextSecure.proto                |   0
 .../WhisperServerConfiguration.java           |   0
 .../textsecuregcm/WhisperServerService.java   |   0
 .../auth/AccountAuthenticator.java            |   0
 .../textsecuregcm/auth/Anonymous.java         |   0
 .../auth/AuthenticationCredentials.java       |   0
 .../auth/AuthorizationHeader.java             |   0
 .../auth/CertificateGenerator.java            |   0
 .../auth/DirectoryCredentials.java            |   0
 .../auth/DirectoryCredentialsGenerator.java   |   0
 .../InvalidAuthorizationHeaderException.java  |   0
 .../textsecuregcm/auth/OptionalAccess.java    |   0
 .../auth/StoredVerificationCode.java          |   0
 .../textsecuregcm/auth/TurnToken.java         |   0
 .../auth/TurnTokenGenerator.java              |   0
 .../auth/UnidentifiedAccessChecksum.java      |   0
 .../AccountDatabaseCrawlerConfiguration.java  |   0
 .../configuration/ApnConfiguration.java       |   0
 .../AttachmentsConfiguration.java             |   0
 .../CircuitBreakerConfiguration.java          |   0
 .../configuration/DatabaseConfiguration.java  |   0
 .../DirectoryClientConfiguration.java         |   0
 .../configuration/DirectoryConfiguration.java |   0
 .../DirectoryServerConfiguration.java         |   0
 .../configuration/GcmConfiguration.java       |   0
 .../configuration/GraphiteConfiguration.java  |   0
 .../configuration/MaxDeviceConfiguration.java |   0
 .../MessageCacheConfiguration.java            |   0
 .../configuration/ProfilesConfiguration.java  |   0
 .../configuration/PushConfiguration.java      |   0
 .../RateLimitsConfiguration.java              |   0
 .../configuration/RecaptchaConfiguration.java |   0
 .../configuration/RedisConfiguration.java     |   0
 .../configuration/RetryConfiguration.java     |   0
 .../configuration/SqsConfiguration.java       |   0
 .../TestDeviceConfiguration.java              |   0
 .../configuration/TurnConfiguration.java      |   0
 .../configuration/TwilioConfiguration.java    |   0
 .../UnidentifiedDeliveryConfiguration.java    |   0
 .../VoiceVerificationConfiguration.java       |   0
 .../controllers/AccountController.java        |   0
 .../controllers/AttachmentControllerBase.java |   0
 .../controllers/AttachmentControllerV1.java   |   0
 .../controllers/AttachmentControllerV2.java   |   0
 .../controllers/CertificateController.java    |   0
 .../controllers/DeviceController.java         |   0
 .../DeviceLimitExceededException.java         |   0
 .../controllers/DirectoryController.java      |   0
 .../InvalidDestinationException.java          |   0
 .../controllers/KeepAliveController.java      |   0
 .../controllers/KeysController.java           |   0
 .../controllers/MessageController.java        |   0
 .../MismatchedDevicesException.java           |   0
 .../controllers/NoSuchUserException.java      |   0
 .../controllers/ProfileController.java        |   0
 .../controllers/ProvisioningController.java   |   0
 .../RateLimitExceededException.java           |   0
 .../controllers/StaleDevicesException.java    |   0
 .../TransparentDataController.java            |   0
 .../controllers/ValidationException.java      |   0
 .../VoiceVerificationController.java          |   0
 .../textsecuregcm/crypto/Curve.java           |   0
 .../textsecuregcm/crypto/DjbECPrivateKey.java |   0
 .../textsecuregcm/crypto/DjbECPublicKey.java  |   0
 .../textsecuregcm/crypto/ECKeyPair.java       |   0
 .../textsecuregcm/crypto/ECPrivateKey.java    |   0
 .../textsecuregcm/crypto/ECPublicKey.java     |   0
 .../entities/AccountAttributes.java           |   0
 .../textsecuregcm/entities/AccountCount.java  |   0
 .../entities/AcknowledgeWebsocketMessage.java |   0
 .../entities/ActiveUserTally.java             |   0
 .../entities/ApnRegistrationId.java           |   0
 .../entities/AttachmentDescriptorV1.java      |   0
 .../entities/AttachmentDescriptorV2.java      |   0
 .../textsecuregcm/entities/AttachmentUri.java |   0
 .../textsecuregcm/entities/ClientContact.java |   0
 .../entities/ClientContactTokens.java         |   0
 .../entities/ClientContacts.java              |   0
 .../entities/CryptoEncodingException.java     |   0
 .../entities/DeliveryCertificate.java         |   0
 .../textsecuregcm/entities/DeviceInfo.java    |   0
 .../entities/DeviceInfoList.java              |   0
 .../textsecuregcm/entities/DeviceName.java    |   0
 .../entities/DeviceResponse.java              |   0
 .../entities/DirectoryFeedbackRequest.java    |   0
 .../DirectoryReconciliationRequest.java       |   0
 .../DirectoryReconciliationResponse.java      |   0
 .../entities/EncryptedOutgoingMessage.java    |   0
 .../entities/GcmRegistrationId.java           |   0
 .../entities/IncomingMessage.java             |   0
 .../entities/IncomingMessageList.java         |   0
 .../entities/IncomingWebsocketMessage.java    |   0
 .../textsecuregcm/entities/MessageProtos.java |   0
 .../entities/MessageResponse.java             |   0
 .../entities/MismatchedDevices.java           |   0
 .../entities/OutgoingMessageEntity.java       |   0
 .../entities/OutgoingMessageEntityList.java   |   0
 .../textsecuregcm/entities/PreKey.java        |   0
 .../textsecuregcm/entities/PreKeyCount.java   |   0
 .../entities/PreKeyResponse.java              |   0
 .../entities/PreKeyResponseItem.java          |   0
 .../textsecuregcm/entities/PreKeyState.java   |   0
 .../textsecuregcm/entities/Profile.java       |   0
 .../ProfileAvatarUploadAttributes.java        |   0
 .../entities/ProvisioningMessage.java         |   0
 .../entities/RegistrationLock.java            |   0
 .../entities/RegistrationLockFailure.java     |   0
 .../entities/SendMessageResponse.java         |   0
 .../textsecuregcm/entities/SignedPreKey.java  |   0
 .../textsecuregcm/entities/StaleDevices.java  |   0
 .../entities/UnregisteredEvent.java           |   0
 .../entities/UnregisteredEventList.java       |   0
 .../http/FaultTolerantHttpClient.java         |   0
 .../http/FormDataBodyPublisher.java           |   0
 .../textsecuregcm/limits/LeakyBucket.java     |   0
 .../limits/LockingRateLimiter.java            |   0
 .../textsecuregcm/limits/RateLimiter.java     |   0
 .../textsecuregcm/limits/RateLimiters.java    |   0
 .../liquibase/AbstractLiquibaseCommand.java   |   0
 .../liquibase/CloseableLiquibase.java         |   0
 .../liquibase/DbMigrateCommand.java           |   0
 .../liquibase/DbStatusCommand.java            |   0
 .../liquibase/NameableDbCommand.java          |   0
 .../liquibase/NameableMigrationsBundle.java   |   0
 .../DeviceLimitExceededExceptionMapper.java   |   0
 .../mappers/IOExceptionMapper.java            |   0
 ...nvalidWebsocketAddressExceptionMapper.java |   0
 .../RateLimitExceededExceptionMapper.java     |   0
 .../textsecuregcm/metrics/CpuUsageGauge.java  |   0
 .../metrics/FileDescriptorGauge.java          |   0
 .../metrics/FreeMemoryGauge.java              |   0
 .../metrics/JsonMetricsReporter.java          |   0
 .../metrics/JsonMetricsReporterFactory.java   |   0
 .../LoggingNetworkAppenderFactory.java        |   0
 .../textsecuregcm/metrics/NetworkGauge.java   |   0
 .../metrics/NetworkReceivedGauge.java         |   0
 .../metrics/NetworkSentGauge.java             |   0
 .../providers/RedisClientFactory.java         |   0
 .../providers/RedisHealthCheck.java           |   0
 .../textsecuregcm/providers/TimeProvider.java |   0
 .../textsecuregcm/push/APNSender.java         |   0
 .../push/ApnFallbackManager.java              |   0
 .../textsecuregcm/push/ApnMessage.java        |   0
 .../textsecuregcm/push/GCMSender.java         |   0
 .../textsecuregcm/push/GcmMessage.java        |   0
 .../push/NotPushRegisteredException.java      |   0
 .../textsecuregcm/push/PushSender.java        |   0
 .../textsecuregcm/push/ReceiptSender.java     |   0
 .../push/RetryingApnsClient.java              |   0
 .../push/TransientPushFailureException.java   |   0
 .../textsecuregcm/push/WebsocketSender.java   |   0
 .../recaptcha/RecaptchaClient.java            |   0
 .../textsecuregcm/redis/LuaScript.java        |   0
 .../textsecuregcm/redis/RedisException.java   |   0
 .../textsecuregcm/redis/RedisOperation.java   |   0
 .../redis/ReplicatedJedisPool.java            |   0
 .../textsecuregcm/s3/PolicySigner.java        |   0
 .../textsecuregcm/s3/PostPolicyGenerator.java |   0
 .../textsecuregcm/s3/UrlSigner.java           |   0
 .../textsecuregcm/sms/SmsSender.java          |   0
 .../textsecuregcm/sms/TwilioSmsSender.java    |   0
 .../textsecuregcm/sqs/DirectoryQueue.java     |   0
 .../storage/AbusiveHostRule.java              |   0
 .../storage/AbusiveHostRules.java             |   0
 .../textsecuregcm/storage/Account.java        |   0
 .../storage/AccountDatabaseCrawler.java       |   0
 .../storage/AccountDatabaseCrawlerCache.java  |   0
 .../AccountDatabaseCrawlerListener.java       |   0
 ...ccountDatabaseCrawlerRestartException.java |   0
 .../textsecuregcm/storage/Accounts.java       |   0
 .../storage/AccountsManager.java              |   0
 .../storage/ActiveUserCounter.java            |   0
 .../textsecuregcm/storage/Device.java         |   0
 .../storage/DirectoryManager.java             |   0
 .../storage/DirectoryReconciler.java          |   0
 .../DirectoryReconciliationClient.java        |   0
 .../storage/FaultTolerantDatabase.java        |   0
 .../textsecuregcm/storage/KeyRecord.java      |   0
 .../textsecuregcm/storage/Keys.java           |   0
 .../textsecuregcm/storage/Messages.java       |   0
 .../textsecuregcm/storage/MessagesCache.java  |   0
 .../storage/MessagesManager.java              |   0
 .../storage/PendingAccounts.java              |   0
 .../storage/PendingAccountsManager.java       |   0
 .../textsecuregcm/storage/PendingDevices.java |   0
 .../storage/PendingDevicesManager.java        |   0
 .../textsecuregcm/storage/PubSubAddress.java  |   0
 .../textsecuregcm/storage/PubSubManager.java  |   0
 .../textsecuregcm/storage/PubSubProtos.java   |   0
 .../textsecuregcm/storage/PublicAccount.java  |   0
 .../mappers/AbusiveHostRuleRowMapper.java     |   0
 .../storage/mappers/AccountRowMapper.java     |   0
 .../storage/mappers/KeyRecordRowMapper.java   |   0
 .../OutgoingMessageEntityRowMapper.java       |   0
 .../StoredVerificationCodeRowMapper.java      |   0
 .../textsecuregcm/util/Base64.java            |   0
 .../util/BlockingThreadPoolExecutor.java      |   0
 .../textsecuregcm/util/ByteArrayAdapter.java  |   0
 .../textsecuregcm/util/ByteUtil.java          |   0
 .../util/CircuitBreakerUtil.java              |   0
 .../textsecuregcm/util/Constants.java         |   0
 .../textsecuregcm/util/Conversions.java       |   0
 .../textsecuregcm/util/ExecutorUtils.java     |   0
 .../textsecuregcm/util/Hex.java               |   0
 .../textsecuregcm/util/IterablePair.java      |   0
 .../textsecuregcm/util/Pair.java              |   0
 .../textsecuregcm/util/SystemMapper.java      |   0
 .../textsecuregcm/util/Util.java              |   0
 .../textsecuregcm/util/VerificationCode.java  |   0
 .../AuthenticatedConnectListener.java         |   0
 .../websocket/DeadLetterHandler.java          |   0
 .../InvalidWebsocketAddressException.java     |   0
 .../websocket/ProvisioningAddress.java        |   0
 .../ProvisioningConnectListener.java          |   0
 .../websocket/ProvisioningConnection.java     |   0
 .../WebSocketAccountAuthenticator.java        |   0
 .../websocket/WebSocketConnection.java        |   0
 .../websocket/WebsocketAddress.java           |   0
 .../workers/CertificateCommand.java           |   0
 .../workers/DeleteUserCommand.java            |   0
 .../textsecuregcm/workers/VacuumCommand.java  |   0
 .../io.dropwizard.logging.AppenderFactory     |   0
 .../io.dropwizard.metrics.ReporterFactory     |   0
 .../src}/main/resources/abusedb.xml           |   0
 .../src}/main/resources/accountsdb.xml        |   0
 .../src}/main/resources/banner.txt            |   0
 .../lua/account_database_crawler/unlock.lua   |   0
 .../src}/main/resources/lua/apn/get.lua       |   0
 .../src}/main/resources/lua/apn/insert.lua    |   0
 .../src}/main/resources/lua/apn/remove.lua    |   0
 .../src}/main/resources/lua/get_items.lua     |   0
 .../resources/lua/get_queues_to_persist.lua   |   0
 .../src}/main/resources/lua/insert_item.lua   |   0
 .../resources/lua/remove_item_by_guid.lua     |   0
 .../main/resources/lua/remove_item_by_id.lua  |   0
 .../resources/lua/remove_item_by_sender.lua   |   0
 .../src}/main/resources/lua/remove_queue.lua  |   0
 .../src}/main/resources/messagedb.xml         |   0
 .../tests/auth/OptionalAccessTest.java        |   0
 .../controllers/AccountControllerTest.java    |   0
 .../controllers/AttachmentControllerTest.java |   0
 .../CertificateControllerTest.java            |   0
 .../controllers/DeviceControllerTest.java     |   0
 .../controllers/DirectoryControllerTest.java  |   0
 .../tests/controllers/KeyControllerTest.java  |   0
 .../controllers/MessageControllerTest.java    |   0
 .../controllers/ProfileControllerTest.java    |   0
 .../TransparentDataControllerTest.java        |   0
 .../VoiceVerificationControllerTest.java      |   0
 .../tests/entities/ClientContactTest.java     |   0
 .../tests/entities/PreKeyTest.java            |   0
 .../http/FaultTolerantHttpClientTest.java     |   0
 .../tests/limits/LeakyBucketTest.java         |   0
 .../tests/push/APNSenderTest.java             |   0
 .../tests/push/GCMSenderTest.java             |   0
 .../tests/redis/ReplicatedJedisPoolTest.java  |   0
 .../tests/s3/PolicySignerTest.java            |   0
 .../tests}/sms/TwilioSmsSenderTest.java       |   0
 .../tests/storage/AbusiveHostRulesTest.java   |   0
 .../storage/AccountDatabaseCrawlerTest.java   |   0
 .../tests/storage/AccountTest.java            |   0
 .../tests/storage/AccountsManagerTest.java    |   0
 .../tests/storage/AccountsTest.java           |   0
 .../tests/storage/ActiveUserCounterTest.java  |   0
 .../storage/DirectoryReconcilerTest.java      |   0
 .../textsecuregcm/tests/storage/KeysTest.java |   0
 .../tests/storage/MessagesTest.java           |   0
 .../tests/storage/PendingAccountsTest.java    |   0
 .../tests/storage/PendingDevicesTest.java     |   0
 .../tests/storage/PublicAccountTest.java      |   0
 .../textsecuregcm/tests/util/AuthHelper.java  |   0
 .../util/BlockingThreadPoolExecutorTest.java  |   0
 .../textsecuregcm/tests/util/JsonHelpers.java |   0
 .../tests/util/NumberPrefixTest.java          |   0
 .../util/SynchronousExecutorService.java      |   0
 .../tests/util/UrlSignerTest.java             |   0
 .../tests/util/ValidNumberTest.java           |   0
 .../websocket/WebSocketConnectionTest.java    |   0
 .../src}/test/resources/fixtures/contact.json |   0
 .../resources/fixtures/contact.relay.json     |   0
 .../fixtures/contact.relay.video.json         |   0
 .../fixtures/contact.relay.voice.json         |   0
 .../current_message_extra_device.json         |   0
 .../current_message_multi_device.json         |   0
 .../current_message_registration_id.json      |   0
 .../current_message_single_device.json        |   0
 .../legacy_message_single_device.json         |   0
 .../fixtures/mismatched_registration_id.json  |   0
 .../fixtures/missing_device_response.json     |   0
 .../fixtures/missing_device_response2.json    |   0
 .../src}/test/resources/fixtures/prekey.json  |   0
 .../test/resources/fixtures/prekey_v2.json    |   0
 .../fixtures/transparent_account.json         |   0
 .../fixtures/transparent_account2.json        |   0
 .../fixtures/voice_verification_en_us.xml     |   0
 .../fixtures/voice_verification_pt_br.xml     |   0
 .../fixtures/voice_verification_ru.xml        |   0
 system.properties                             |   1 -
 318 files changed, 255 insertions(+), 215 deletions(-)
 create mode 100644 redis-dispatch/pom.xml
 rename {src => redis-dispatch/src}/main/java/org/whispersystems/dispatch/DispatchChannel.java (100%)
 rename {src => redis-dispatch/src}/main/java/org/whispersystems/dispatch/DispatchManager.java (100%)
 rename {src => redis-dispatch/src}/main/java/org/whispersystems/dispatch/io/RedisInputStream.java (100%)
 rename {src => redis-dispatch/src}/main/java/org/whispersystems/dispatch/io/RedisPubSubConnectionFactory.java (100%)
 rename {src => redis-dispatch/src}/main/java/org/whispersystems/dispatch/redis/PubSubConnection.java (100%)
 rename {src => redis-dispatch/src}/main/java/org/whispersystems/dispatch/redis/PubSubReply.java (100%)
 rename {src => redis-dispatch/src}/main/java/org/whispersystems/dispatch/redis/protocol/ArrayReplyHeader.java (100%)
 rename {src => redis-dispatch/src}/main/java/org/whispersystems/dispatch/redis/protocol/IntReply.java (100%)
 rename {src => redis-dispatch/src}/main/java/org/whispersystems/dispatch/redis/protocol/StringReplyHeader.java (100%)
 rename {src => redis-dispatch/src}/main/java/org/whispersystems/dispatch/util/Util.java (100%)
 rename {src => redis-dispatch/src}/test/java/org/whispersystems/dispatch/DispatchManagerTest.java (100%)
 rename {src => redis-dispatch/src}/test/java/org/whispersystems/dispatch/redis/PubSubConnectionTest.java (99%)
 rename {src => redis-dispatch/src}/test/java/org/whispersystems/dispatch/redis/protocol/ArrayReplyHeaderTest.java (100%)
 rename {src => redis-dispatch/src}/test/java/org/whispersystems/dispatch/redis/protocol/IntReplyHeaderTest.java (100%)
 rename {src => redis-dispatch/src}/test/java/org/whispersystems/dispatch/redis/protocol/StringReplyHeaderTest.java (100%)
 create mode 100644 service/pom.xml
 rename {protobuf => service/protobuf}/Makefile (100%)
 rename {protobuf => service/protobuf}/PubSubMessage.proto (100%)
 rename {protobuf => service/protobuf}/TextSecure.proto (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/WhisperServerConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/auth/AccountAuthenticator.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/auth/Anonymous.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/auth/AuthenticationCredentials.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/auth/AuthorizationHeader.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/auth/CertificateGenerator.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/auth/DirectoryCredentials.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/auth/DirectoryCredentialsGenerator.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/auth/InvalidAuthorizationHeaderException.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/auth/OptionalAccess.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/auth/StoredVerificationCode.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/auth/TurnToken.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/auth/TurnTokenGenerator.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/auth/UnidentifiedAccessChecksum.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/AccountDatabaseCrawlerConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/ApnConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/AttachmentsConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/CircuitBreakerConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/DatabaseConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/DirectoryClientConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/DirectoryConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/DirectoryServerConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/GcmConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/GraphiteConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/MaxDeviceConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/MessageCacheConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/ProfilesConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/PushConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/RateLimitsConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/RecaptchaConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/RedisConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/RetryConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/SqsConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/TestDeviceConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/TurnConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/TwilioConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/UnidentifiedDeliveryConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/configuration/VoiceVerificationConfiguration.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/controllers/AccountController.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/controllers/AttachmentControllerBase.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/controllers/AttachmentControllerV1.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/controllers/AttachmentControllerV2.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/controllers/CertificateController.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/controllers/DeviceController.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/controllers/DeviceLimitExceededException.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/controllers/DirectoryController.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/controllers/InvalidDestinationException.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/controllers/KeepAliveController.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/controllers/KeysController.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/controllers/MismatchedDevicesException.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/controllers/NoSuchUserException.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/controllers/ProfileController.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/controllers/ProvisioningController.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/controllers/RateLimitExceededException.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/controllers/StaleDevicesException.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/controllers/TransparentDataController.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/controllers/ValidationException.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/controllers/VoiceVerificationController.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/crypto/Curve.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/crypto/DjbECPrivateKey.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/crypto/DjbECPublicKey.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/crypto/ECKeyPair.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/crypto/ECPrivateKey.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/crypto/ECPublicKey.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/AccountAttributes.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/AccountCount.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/AcknowledgeWebsocketMessage.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/ActiveUserTally.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/ApnRegistrationId.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/AttachmentDescriptorV1.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/AttachmentDescriptorV2.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/AttachmentUri.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/ClientContact.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/ClientContactTokens.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/ClientContacts.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/CryptoEncodingException.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/DeliveryCertificate.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/DeviceInfo.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/DeviceInfoList.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/DeviceName.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/DeviceResponse.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/DirectoryFeedbackRequest.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/DirectoryReconciliationRequest.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/DirectoryReconciliationResponse.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/EncryptedOutgoingMessage.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/GcmRegistrationId.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/IncomingMessage.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/IncomingMessageList.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/IncomingWebsocketMessage.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/MessageProtos.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/MessageResponse.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/MismatchedDevices.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntity.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntityList.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/PreKey.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/PreKeyCount.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/PreKeyResponse.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/PreKeyResponseItem.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/PreKeyState.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/Profile.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/ProfileAvatarUploadAttributes.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/ProvisioningMessage.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/RegistrationLock.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/RegistrationLockFailure.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/SendMessageResponse.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/SignedPreKey.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/StaleDevices.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/UnregisteredEvent.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/entities/UnregisteredEventList.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/http/FaultTolerantHttpClient.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/http/FormDataBodyPublisher.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/limits/LeakyBucket.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/limits/LockingRateLimiter.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/limits/RateLimiter.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/limits/RateLimiters.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/liquibase/AbstractLiquibaseCommand.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/liquibase/CloseableLiquibase.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/liquibase/DbMigrateCommand.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/liquibase/DbStatusCommand.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/liquibase/NameableDbCommand.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/liquibase/NameableMigrationsBundle.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/mappers/DeviceLimitExceededExceptionMapper.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/mappers/IOExceptionMapper.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/mappers/InvalidWebsocketAddressExceptionMapper.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/mappers/RateLimitExceededExceptionMapper.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/metrics/CpuUsageGauge.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/metrics/FileDescriptorGauge.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/metrics/FreeMemoryGauge.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/metrics/JsonMetricsReporter.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/metrics/JsonMetricsReporterFactory.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/metrics/LoggingNetworkAppenderFactory.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/metrics/NetworkGauge.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/metrics/NetworkReceivedGauge.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/metrics/NetworkSentGauge.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/providers/RedisClientFactory.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/providers/RedisHealthCheck.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/providers/TimeProvider.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/push/APNSender.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/push/ApnFallbackManager.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/push/ApnMessage.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/push/GCMSender.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/push/GcmMessage.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/push/NotPushRegisteredException.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/push/PushSender.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/push/ReceiptSender.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/push/RetryingApnsClient.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/push/TransientPushFailureException.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/push/WebsocketSender.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/recaptcha/RecaptchaClient.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/redis/LuaScript.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/redis/RedisException.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/redis/RedisOperation.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/redis/ReplicatedJedisPool.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/s3/PolicySigner.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/s3/PostPolicyGenerator.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/s3/UrlSigner.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/sms/SmsSender.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/sms/TwilioSmsSender.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/sqs/DirectoryQueue.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/AbusiveHostRule.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/AbusiveHostRules.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/Account.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawler.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawlerCache.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawlerListener.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/AccountDatabaseCrawlerRestartException.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/Accounts.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/ActiveUserCounter.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/Device.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/DirectoryManager.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/DirectoryReconciler.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/DirectoryReconciliationClient.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/FaultTolerantDatabase.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/KeyRecord.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/Keys.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/Messages.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/MessagesCache.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/MessagesManager.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/PendingAccounts.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/PendingAccountsManager.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/PendingDevices.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/PendingDevicesManager.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/PubSubAddress.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/PubSubManager.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/PubSubProtos.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/PublicAccount.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/mappers/AbusiveHostRuleRowMapper.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/mappers/AccountRowMapper.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/mappers/KeyRecordRowMapper.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/mappers/OutgoingMessageEntityRowMapper.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/storage/mappers/StoredVerificationCodeRowMapper.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/util/Base64.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/util/BlockingThreadPoolExecutor.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/util/ByteArrayAdapter.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/util/ByteUtil.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/util/CircuitBreakerUtil.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/util/Constants.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/util/Conversions.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/util/ExecutorUtils.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/util/Hex.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/util/IterablePair.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/util/Pair.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/util/SystemMapper.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/util/Util.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/util/VerificationCode.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/websocket/AuthenticatedConnectListener.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/websocket/DeadLetterHandler.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/websocket/InvalidWebsocketAddressException.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/websocket/ProvisioningAddress.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/websocket/ProvisioningConnectListener.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/websocket/ProvisioningConnection.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketAccountAuthenticator.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/websocket/WebsocketAddress.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/workers/CertificateCommand.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/workers/DeleteUserCommand.java (100%)
 rename {src => service/src}/main/java/org/whispersystems/textsecuregcm/workers/VacuumCommand.java (100%)
 rename {src => service/src}/main/resources/META-INF/services/io.dropwizard.logging.AppenderFactory (100%)
 rename {src => service/src}/main/resources/META-INF/services/io.dropwizard.metrics.ReporterFactory (100%)
 rename {src => service/src}/main/resources/abusedb.xml (100%)
 rename {src => service/src}/main/resources/accountsdb.xml (100%)
 rename {src => service/src}/main/resources/banner.txt (100%)
 rename {src => service/src}/main/resources/lua/account_database_crawler/unlock.lua (100%)
 rename {src => service/src}/main/resources/lua/apn/get.lua (100%)
 rename {src => service/src}/main/resources/lua/apn/insert.lua (100%)
 rename {src => service/src}/main/resources/lua/apn/remove.lua (100%)
 rename {src => service/src}/main/resources/lua/get_items.lua (100%)
 rename {src => service/src}/main/resources/lua/get_queues_to_persist.lua (100%)
 rename {src => service/src}/main/resources/lua/insert_item.lua (100%)
 rename {src => service/src}/main/resources/lua/remove_item_by_guid.lua (100%)
 rename {src => service/src}/main/resources/lua/remove_item_by_id.lua (100%)
 rename {src => service/src}/main/resources/lua/remove_item_by_sender.lua (100%)
 rename {src => service/src}/main/resources/lua/remove_queue.lua (100%)
 rename {src => service/src}/main/resources/messagedb.xml (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/auth/OptionalAccessTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/controllers/AccountControllerTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/controllers/AttachmentControllerTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/controllers/CertificateControllerTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/controllers/DeviceControllerTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/controllers/DirectoryControllerTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/controllers/KeyControllerTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/controllers/MessageControllerTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/controllers/ProfileControllerTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/controllers/TransparentDataControllerTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/controllers/VoiceVerificationControllerTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/entities/ClientContactTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/entities/PreKeyTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/http/FaultTolerantHttpClientTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/limits/LeakyBucketTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/push/APNSenderTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/push/GCMSenderTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/redis/ReplicatedJedisPoolTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/s3/PolicySignerTest.java (100%)
 rename {src/test/java/org/whispersystems => service/src/test/java/org/whispersystems/textsecuregcm/tests}/sms/TwilioSmsSenderTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/storage/AbusiveHostRulesTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountDatabaseCrawlerTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsManagerTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/storage/ActiveUserCounterTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/storage/DirectoryReconcilerTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/storage/KeysTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/storage/MessagesTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/storage/PendingAccountsTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/storage/PendingDevicesTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/storage/PublicAccountTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/util/AuthHelper.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/util/BlockingThreadPoolExecutorTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/util/JsonHelpers.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/util/NumberPrefixTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/util/SynchronousExecutorService.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/util/UrlSignerTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/util/ValidNumberTest.java (100%)
 rename {src => service/src}/test/java/org/whispersystems/textsecuregcm/tests/websocket/WebSocketConnectionTest.java (100%)
 rename {src => service/src}/test/resources/fixtures/contact.json (100%)
 rename {src => service/src}/test/resources/fixtures/contact.relay.json (100%)
 rename {src => service/src}/test/resources/fixtures/contact.relay.video.json (100%)
 rename {src => service/src}/test/resources/fixtures/contact.relay.voice.json (100%)
 rename {src => service/src}/test/resources/fixtures/current_message_extra_device.json (100%)
 rename {src => service/src}/test/resources/fixtures/current_message_multi_device.json (100%)
 rename {src => service/src}/test/resources/fixtures/current_message_registration_id.json (100%)
 rename {src => service/src}/test/resources/fixtures/current_message_single_device.json (100%)
 rename {src => service/src}/test/resources/fixtures/legacy_message_single_device.json (100%)
 rename {src => service/src}/test/resources/fixtures/mismatched_registration_id.json (100%)
 rename {src => service/src}/test/resources/fixtures/missing_device_response.json (100%)
 rename {src => service/src}/test/resources/fixtures/missing_device_response2.json (100%)
 rename {src => service/src}/test/resources/fixtures/prekey.json (100%)
 rename {src => service/src}/test/resources/fixtures/prekey_v2.json (100%)
 rename {src => service/src}/test/resources/fixtures/transparent_account.json (100%)
 rename {src => service/src}/test/resources/fixtures/transparent_account2.json (100%)
 rename {src => service/src}/test/resources/fixtures/voice_verification_en_us.xml (100%)
 rename {src => service/src}/test/resources/fixtures/voice_verification_pt_br.xml (100%)
 rename {src => service/src}/test/resources/fixtures/voice_verification_ru.xml (100%)
 delete mode 100644 system.properties

diff --git a/pom.xml b/pom.xml
index 69882cdfe..1dd8dcfa6 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 000000000..55a86d215
--- /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 c0fc63c5f..d827cdff8 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 000000000..7a710b21e
--- /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 97270b43f..000000000
--- a/system.properties
+++ /dev/null
@@ -1 +0,0 @@
-java.runtime.version=1.7
-- 
GitLab