diff --git a/config/config.sample.yaml b/config/config.sample.yaml
index 07c3539ac470b29d9d4c6f92e1052bfbf794f48c..43d5913ed6bd0399342f547a7eda40569272fd9c 100644
--- a/config/config.sample.yaml
+++ b/config/config.sample.yaml
@@ -23,6 +23,9 @@ bridge:
   disableTypingNotifications: false
   # Disable deleting messages on Discord if a message is redacted on Matrix.
   disableDeletionForwarding: false
+  # Disable portal bridging, where Matrix users can search for unbridged Discord
+  # rooms on their Matrix server.
+  disablePortalBridging: false
   # Enable users to bridge rooms using !discord commands. See
   # https://t2bot.io/discord for instructions.
   enableSelfServiceBridging: false
diff --git a/config/config.schema.yaml b/config/config.schema.yaml
index 560508e582cad9f167a0a27fd3cba30fa71023e9..1a2381c30555576f136a816866adc3135a4888ae 100644
--- a/config/config.schema.yaml
+++ b/config/config.schema.yaml
@@ -20,6 +20,8 @@ properties:
             type: "boolean"
           disableDeletionForwarding:
             type: "boolean"
+          disablePortalBridging:
+            type: "boolean"
           enableSelfServiceBridging:
             type: "boolean"
           disableReadReceipts:
diff --git a/src/config.ts b/src/config.ts
index 51b6c2ae4c8ba12ed4c5d760044620768d2d73c3..3747e66e2958926e905e41ae98985e157f124413 100644
--- a/src/config.ts
+++ b/src/config.ts
@@ -89,6 +89,7 @@ class DiscordBridgeConfigBridge {
     public disableDiscordMentions: boolean;
     public disableDeletionForwarding: boolean;
     public enableSelfServiceBridging: boolean;
+    public disablePortalBridging: boolean;
     public disableReadReceipts: boolean;
     public disableEveryoneMention: boolean = false;
     public disableHereMention: boolean = false;
diff --git a/src/discordas.ts b/src/discordas.ts
index d56bc1fe892c91bc8ab4a6f775d779e55e938956..44200705294b7517467e332ff9f812684ad0c41f 100644
--- a/src/discordas.ts
+++ b/src/discordas.ts
@@ -186,16 +186,18 @@ async function run() {
         res.status(200).send("");
     });
 
-    // tslint:disable-next-line:no-any
-    appservice.on("query.room", async (roomAlias: string, createRoom: (opts: any) => Promise<void>) => {
-        try {
-            const createRoomOpts = await roomhandler.OnAliasQuery(roomAlias);
-            await createRoom(createRoomOpts);
-            await roomhandler.OnAliasQueried(roomAlias, createRoomOpts.__roomId);
-        } catch (err) {
-            log.error("Exception thrown while handling \"query.room\" event", err);
-        }
-    });
+    if (config.bridge.disablePortalBridging !== true) {
+        // tslint:disable-next-line:no-any
+        appservice.on("query.room", async (roomAlias: string, createRoom: (opts: any) => Promise<void>) => {
+            try {
+                const createRoomOpts = await roomhandler.OnAliasQuery(roomAlias);
+                await createRoom(createRoomOpts);
+                await roomhandler.OnAliasQueried(roomAlias, createRoomOpts.__roomId);
+            } catch (err) {
+                log.error("Exception thrown while handling \"query.room\" event", err);
+            }
+        });
+    }
 
     appservice.on("room.event", async (roomId: string, event: IMatrixEvent) => {
         try {