diff --git a/synapse/client/__init__.py b/synapse/client/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..1a84d94cd989161324481969f22f8f5f7841bcaa
--- /dev/null
+++ b/synapse/client/__init__.py
@@ -0,0 +1,14 @@
+# -*- coding: utf-8 -*-
+# Copyright 2015 OpenMarket Ltd
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
diff --git a/synapse/rest/__init__.py b/synapse/client/v1/__init__.py
similarity index 100%
rename from synapse/rest/__init__.py
rename to synapse/client/v1/__init__.py
diff --git a/synapse/rest/admin.py b/synapse/client/v1/admin.py
similarity index 100%
rename from synapse/rest/admin.py
rename to synapse/client/v1/admin.py
diff --git a/synapse/rest/base.py b/synapse/client/v1/base.py
similarity index 97%
rename from synapse/rest/base.py
rename to synapse/client/v1/base.py
index c583945527a19dfba8fae6fb33624cef37993fc4..d005206b7790cc0fa428f5e138caf31d127cd4ea 100644
--- a/synapse/rest/base.py
+++ b/synapse/client/v1/base.py
@@ -15,7 +15,7 @@
 
 """ This module contains base REST classes for constructing REST servlets. """
 from synapse.api.urls import CLIENT_PREFIX
-from synapse.rest.transactions import HttpTransactionStore
+from .transactions import HttpTransactionStore
 import re
 
 import logging
diff --git a/synapse/rest/directory.py b/synapse/client/v1/directory.py
similarity index 100%
rename from synapse/rest/directory.py
rename to synapse/client/v1/directory.py
diff --git a/synapse/rest/events.py b/synapse/client/v1/events.py
similarity index 97%
rename from synapse/rest/events.py
rename to synapse/client/v1/events.py
index bedcb2bcc6cfba987cb55e19e46e647e503968cc..c2515528ac89a46781e4d2e21de91435847629e1 100644
--- a/synapse/rest/events.py
+++ b/synapse/client/v1/events.py
@@ -18,7 +18,7 @@ from twisted.internet import defer
 
 from synapse.api.errors import SynapseError
 from synapse.streams.config import PaginationConfig
-from synapse.rest.base import RestServlet, client_path_pattern
+from .base import RestServlet, client_path_pattern
 
 import logging
 
diff --git a/synapse/rest/initial_sync.py b/synapse/client/v1/initial_sync.py
similarity index 100%
rename from synapse/rest/initial_sync.py
rename to synapse/client/v1/initial_sync.py
diff --git a/synapse/rest/login.py b/synapse/client/v1/login.py
similarity index 100%
rename from synapse/rest/login.py
rename to synapse/client/v1/login.py
diff --git a/synapse/rest/presence.py b/synapse/client/v1/presence.py
similarity index 100%
rename from synapse/rest/presence.py
rename to synapse/client/v1/presence.py
diff --git a/synapse/rest/profile.py b/synapse/client/v1/profile.py
similarity index 100%
rename from synapse/rest/profile.py
rename to synapse/client/v1/profile.py
diff --git a/synapse/rest/register.py b/synapse/client/v1/register.py
similarity index 100%
rename from synapse/rest/register.py
rename to synapse/client/v1/register.py
diff --git a/synapse/rest/room.py b/synapse/client/v1/room.py
similarity index 100%
rename from synapse/rest/room.py
rename to synapse/client/v1/room.py
diff --git a/synapse/rest/transactions.py b/synapse/client/v1/transactions.py
similarity index 100%
rename from synapse/rest/transactions.py
rename to synapse/client/v1/transactions.py
diff --git a/synapse/rest/voip.py b/synapse/client/v1/voip.py
similarity index 100%
rename from synapse/rest/voip.py
rename to synapse/client/v1/voip.py
diff --git a/synapse/server.py b/synapse/server.py
index d861efd2fd578b8f89e79f888c5ec62d30cf7215..57a95bf75354e67ca29849bcec9c27bb56ab5437 100644
--- a/synapse/server.py
+++ b/synapse/server.py
@@ -24,7 +24,7 @@ from synapse.events.utils import serialize_event
 from synapse.notifier import Notifier
 from synapse.api.auth import Auth
 from synapse.handlers import Handlers
-from synapse.rest import RestServletFactory
+from synapse.client.v1 import RestServletFactory
 from synapse.state import StateHandler
 from synapse.storage import DataStore
 from synapse.types import UserID, RoomAlias, RoomID, EventID
diff --git a/tests/client/__init__.py b/tests/client/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..1a84d94cd989161324481969f22f8f5f7841bcaa
--- /dev/null
+++ b/tests/client/__init__.py
@@ -0,0 +1,14 @@
+# -*- coding: utf-8 -*-
+# Copyright 2015 OpenMarket Ltd
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
diff --git a/tests/rest/__init__.py b/tests/client/v1/__init__.py
similarity index 100%
rename from tests/rest/__init__.py
rename to tests/client/v1/__init__.py
diff --git a/tests/rest/test_events.py b/tests/client/v1/test_events.py
similarity index 94%
rename from tests/rest/test_events.py
rename to tests/client/v1/test_events.py
index d3159e2cf4f7288e75a639510c5f880d9cf964a4..9b36dd3225b52d6f321f209dfcad76aa855c74ce 100644
--- a/tests/rest/test_events.py
+++ b/tests/client/v1/test_events.py
@@ -19,13 +19,13 @@ from tests import unittest
 # twisted imports
 from twisted.internet import defer
 
-import synapse.rest.events
-import synapse.rest.register
-import synapse.rest.room
+import synapse.client.v1.events
+import synapse.client.v1.register
+import synapse.client.v1.room
 
 from synapse.server import HomeServer
 
-from ..utils import MockHttpResource, SQLiteMemoryDbPool, MockKey
+from ...utils import MockHttpResource, SQLiteMemoryDbPool, MockKey
 from .utils import RestTestCase
 
 from mock import Mock, NonCallableMock
@@ -144,9 +144,9 @@ class EventStreamPermissionsTestCase(RestTestCase):
         hs.get_clock().time_msec.return_value = 1000000
         hs.get_clock().time.return_value = 1000
 
-        synapse.rest.register.register_servlets(hs, self.mock_resource)
-        synapse.rest.events.register_servlets(hs, self.mock_resource)
-        synapse.rest.room.register_servlets(hs, self.mock_resource)
+        synapse.client.v1.register.register_servlets(hs, self.mock_resource)
+        synapse.client.v1.events.register_servlets(hs, self.mock_resource)
+        synapse.client.v1.room.register_servlets(hs, self.mock_resource)
 
         # register an account
         self.user_id = "sid1"
diff --git a/tests/rest/test_presence.py b/tests/client/v1/test_presence.py
similarity index 99%
rename from tests/rest/test_presence.py
rename to tests/client/v1/test_presence.py
index 769c7824bccd1cd2cca8f1ec6ed9f66f262e6e3b..e7d636c74d51cabf66d20cab24fade5835e6d7c0 100644
--- a/tests/rest/test_presence.py
+++ b/tests/client/v1/test_presence.py
@@ -20,7 +20,7 @@ from twisted.internet import defer
 
 from mock import Mock
 
-from ..utils import MockHttpResource, MockKey
+from ...utils import MockHttpResource, MockKey
 
 from synapse.api.constants import PresenceState
 from synapse.handlers.presence import PresenceHandler
diff --git a/tests/rest/test_profile.py b/tests/client/v1/test_profile.py
similarity index 99%
rename from tests/rest/test_profile.py
rename to tests/client/v1/test_profile.py
index 3a0d1e700a9dfd85b889aa622f0aaca53d67b0b4..1182cc54eb983d0f86a4d278d74d884ba77f6ade 100644
--- a/tests/rest/test_profile.py
+++ b/tests/client/v1/test_profile.py
@@ -20,7 +20,7 @@ from twisted.internet import defer
 
 from mock import Mock, NonCallableMock
 
-from ..utils import MockHttpResource, MockKey
+from ...utils import MockHttpResource, MockKey
 
 from synapse.api.errors import SynapseError, AuthError
 from synapse.server import HomeServer
diff --git a/tests/rest/test_rooms.py b/tests/client/v1/test_rooms.py
similarity index 98%
rename from tests/rest/test_rooms.py
rename to tests/client/v1/test_rooms.py
index 8e65ff9a1ccf1fcad261b061ef9284f2ac81d371..33a8631d76fb8704d067aaf786700e70a582b266 100644
--- a/tests/rest/test_rooms.py
+++ b/tests/client/v1/test_rooms.py
@@ -18,7 +18,7 @@
 # twisted imports
 from twisted.internet import defer
 
-import synapse.rest.room
+import synapse.client.v1.room
 from synapse.api.constants import Membership
 
 from synapse.server import HomeServer
@@ -30,7 +30,7 @@ import json
 import urllib
 import types
 
-from ..utils import MockHttpResource, SQLiteMemoryDbPool, MockKey
+from ...utils import MockHttpResource, SQLiteMemoryDbPool, MockKey
 from .utils import RestTestCase
 
 from mock import Mock, NonCallableMock
@@ -82,7 +82,7 @@ class RoomPermissionsTestCase(RestTestCase):
 
         self.auth_user_id = self.rmcreator_id
 
-        synapse.rest.room.register_servlets(hs, self.mock_resource)
+        synapse.client.v1.room.register_servlets(hs, self.mock_resource)
 
         self.auth = hs.get_auth()
 
@@ -476,7 +476,7 @@ class RoomsMemberListTestCase(RestTestCase):
             return defer.succeed(None)
         hs.get_datastore().insert_client_ip = _insert_client_ip
 
-        synapse.rest.room.register_servlets(hs, self.mock_resource)
+        synapse.client.v1.room.register_servlets(hs, self.mock_resource)
 
     def tearDown(self):
         pass
@@ -565,7 +565,7 @@ class RoomsCreateTestCase(RestTestCase):
             return defer.succeed(None)
         hs.get_datastore().insert_client_ip = _insert_client_ip
 
-        synapse.rest.room.register_servlets(hs, self.mock_resource)
+        synapse.client.v1.room.register_servlets(hs, self.mock_resource)
 
     def tearDown(self):
         pass
@@ -668,7 +668,7 @@ class RoomTopicTestCase(RestTestCase):
             return defer.succeed(None)
         hs.get_datastore().insert_client_ip = _insert_client_ip
 
-        synapse.rest.room.register_servlets(hs, self.mock_resource)
+        synapse.client.v1.room.register_servlets(hs, self.mock_resource)
 
         # create the room
         self.room_id = yield self.create_room_as(self.user_id)
@@ -783,7 +783,7 @@ class RoomMemberStateTestCase(RestTestCase):
             return defer.succeed(None)
         hs.get_datastore().insert_client_ip = _insert_client_ip
 
-        synapse.rest.room.register_servlets(hs, self.mock_resource)
+        synapse.client.v1.room.register_servlets(hs, self.mock_resource)
 
         self.room_id = yield self.create_room_as(self.user_id)
 
@@ -919,7 +919,7 @@ class RoomMessagesTestCase(RestTestCase):
             return defer.succeed(None)
         hs.get_datastore().insert_client_ip = _insert_client_ip
 
-        synapse.rest.room.register_servlets(hs, self.mock_resource)
+        synapse.client.v1.room.register_servlets(hs, self.mock_resource)
 
         self.room_id = yield self.create_room_as(self.user_id)
 
@@ -1023,7 +1023,7 @@ class RoomInitialSyncTestCase(RestTestCase):
             return defer.succeed(None)
         hs.get_datastore().insert_client_ip = _insert_client_ip
 
-        synapse.rest.room.register_servlets(hs, self.mock_resource)
+        synapse.client.v1.room.register_servlets(hs, self.mock_resource)
 
         # Since I'm getting my own presence I need to exist as far as presence
         # is concerned.
diff --git a/tests/rest/test_typing.py b/tests/client/v1/test_typing.py
similarity index 96%
rename from tests/rest/test_typing.py
rename to tests/client/v1/test_typing.py
index 18138af1b5d602c003b569afc86a0f5383a1c826..d6d677bde3bfd86e86769b8b35d7c66e37d48d4f 100644
--- a/tests/rest/test_typing.py
+++ b/tests/client/v1/test_typing.py
@@ -18,10 +18,10 @@
 # twisted imports
 from twisted.internet import defer
 
-import synapse.rest.room
+import synapse.client.v1.room
 from synapse.server import HomeServer
 
-from ..utils import MockHttpResource, MockClock, SQLiteMemoryDbPool, MockKey
+from ...utils import MockHttpResource, MockClock, SQLiteMemoryDbPool, MockKey
 from .utils import RestTestCase
 
 from mock import Mock, NonCallableMock
@@ -104,7 +104,7 @@ class RoomTypingTestCase(RestTestCase):
         hs.get_handlers().room_member_handler.fetch_room_distributions_into = (
                 fetch_room_distributions_into)
 
-        synapse.rest.room.register_servlets(hs, self.mock_resource)
+        synapse.client.v1.room.register_servlets(hs, self.mock_resource)
 
         self.room_id = yield self.create_room_as(self.user_id)
         # Need another user to make notifications actually work
diff --git a/tests/rest/utils.py b/tests/client/v1/utils.py
similarity index 100%
rename from tests/rest/utils.py
rename to tests/client/v1/utils.py