diff --git a/changelog.d/4307.feature b/changelog.d/4307.feature
new file mode 100644
index 0000000000000000000000000000000000000000..314fc031f043565cc8f32a1774198209edcefbaa
--- /dev/null
+++ b/changelog.d/4307.feature
@@ -0,0 +1 @@
+Add opt-in support for v2 rooms
diff --git a/synapse/api/constants.py b/synapse/api/constants.py
index b7f25a42a216b2c35b16291cda7334d9944178af..87bc1cb53d029d604a55eee0d825697ff00fc000 100644
--- a/synapse/api/constants.py
+++ b/synapse/api/constants.py
@@ -102,6 +102,7 @@ class ThirdPartyEntityKind(object):
 
 class RoomVersions(object):
     V1 = "1"
+    V2 = "2"
     VDH_TEST = "vdh-test-version"
     STATE_V2_TEST = "state-v2-test"
 
@@ -113,6 +114,7 @@ DEFAULT_ROOM_VERSION = RoomVersions.V1
 # until we have a working v2.
 KNOWN_ROOM_VERSIONS = {
     RoomVersions.V1,
+    RoomVersions.V2,
     RoomVersions.VDH_TEST,
     RoomVersions.STATE_V2_TEST,
 }
diff --git a/synapse/state/__init__.py b/synapse/state/__init__.py
index 70048b0c09a28736efb476253c6b5ebd5d8ea737..e9ecb00277dc6207d6b7a3d0c269dfe775131256 100644
--- a/synapse/state/__init__.py
+++ b/synapse/state/__init__.py
@@ -607,7 +607,9 @@ def resolve_events_with_store(room_version, state_sets, event_map, state_res_sto
         return v1.resolve_events_with_store(
             state_sets, event_map, state_res_store.get_events,
         )
-    elif room_version in (RoomVersions.VDH_TEST, RoomVersions.STATE_V2_TEST):
+    elif room_version in (
+        RoomVersions.VDH_TEST, RoomVersions.STATE_V2_TEST, RoomVersions.V2,
+    ):
         return v2.resolve_events_with_store(
             state_sets, event_map, state_res_store,
         )