diff --git a/synapse/api/filtering.py b/synapse/api/filtering.py
index 19f30c273cff0d0ca0c81bd77e2e56b6e550a182..bc03d6c2872bef80cb4bee5dc888a08d4963fb78 100644
--- a/synapse/api/filtering.py
+++ b/synapse/api/filtering.py
@@ -143,6 +143,10 @@ class FilterCollection(object):
             self.filter_json.get("account_data", {})
         )
 
+        self.include_leave = self.filter_json.get("room", {}).get(
+            "include_leave", False
+        )
+
     def timeline_limit(self):
         return self.room_timeline_filter.limit()
 
diff --git a/synapse/handlers/sync.py b/synapse/handlers/sync.py
index 943ce368ef43f142a521c5bace60af1cf82f41b5..24c2b2fad68b70477a21b9c3e54bd700370fedd4 100644
--- a/synapse/handlers/sync.py
+++ b/synapse/handlers/sync.py
@@ -186,14 +186,14 @@ class SyncHandler(BaseHandler):
             pagination_config=pagination_config.get_source_config("presence"),
             key=None
         )
+
+        membership_list = (Membership.INVITE, Membership.JOIN)
+        if sync_config.filter.include_leave:
+            membership_list += (Membership.LEAVE, Membership.BAN)
+
         room_list = yield self.store.get_rooms_for_user_where_membership_is(
             user_id=sync_config.user.to_string(),
-            membership_list=(
-                Membership.INVITE,
-                Membership.JOIN,
-                Membership.LEAVE,
-                Membership.BAN
-            )
+            membership_list=membership_list
         )
 
         account_data, account_data_by_room = (