diff --git a/src/discordas.ts b/src/discordas.ts
index c1952eec8196af74607b7d5be134b6e1936ce014..9a2fab766f336c77d7916695e5c4e962ff191f91 100644
--- a/src/discordas.ts
+++ b/src/discordas.ts
@@ -40,14 +40,14 @@ function run (port: number, config: DiscordBridgeConfig) {
   if (registration === null) {
     throw new Error("Failed to parse registration file");
   }
-
+  const botUserId = "@" + registration.sender_localpart + ":" + config.bridge.domain;
   const clientFactory = new ClientFactory({
-    appServiceUserId: "@" + registration.sender_localpart + ":" + config.bridge.domain,
+    appServiceUserId: botUserId,
     token: registration.as_token,
     url: config.bridge.homeserverUrl,
   });
   const discordbot = new DiscordBot(config);
-  const roomhandler = new MatrixRoomHandler(discordbot, config);
+  const roomhandler = new MatrixRoomHandler(discordbot, config, botUserId);
 
   const bridge = new Bridge({
     clientFactory,
diff --git a/src/matrixroomhandler.ts b/src/matrixroomhandler.ts
index 8be08bdddf3f9fbd51a65c96de7c7965eff7d7b2..c2545348b59bb0ecc42fb823cb7afb242aa2fdb6 100644
--- a/src/matrixroomhandler.ts
+++ b/src/matrixroomhandler.ts
@@ -12,15 +12,17 @@ import { DiscordBridgeConfig } from "./config";
 import * as Discord from "discord.js";
 import * as log from "npmlog";
 
+const ICON_URL = "https://matrix.org/_matrix/media/r0/download/matrix.org/mlxoESwIsTbJrfXyAAogrNxA";
+
 export class MatrixRoomHandler {
   private config: DiscordBridgeConfig;
   private bridge: Bridge;
   private discord: DiscordBot;
-  private aliasList: any;
-  constructor (discord: DiscordBot, config: DiscordBridgeConfig) {
+  private botUserId: string;
+  constructor (discord: DiscordBot, config: DiscordBridgeConfig, botUserId: string) {
     this.discord = discord;
     this.config = config;
-    this.aliasList = {};
+    this.botUserId = botUserId;
   }
 
   public get ThirdPartyLookup(): thirdPartyLookup {
@@ -39,22 +41,7 @@ export class MatrixRoomHandler {
   }
 
   public OnAliasQueried (alias: string, roomId: string) {
-    const aliasLocalpart = alias.substr(1, alias.length - `:${this.config.bridge.domain}`.length - 1);
-    log.info("MatrixRoomHandler", `Room created ${aliasLocalpart} => ${roomId}`);
-    if (this.aliasList[aliasLocalpart] == null) {
-      log.warn("MatrixRoomHandler", "Room was created but we couldn't assign additonal aliases");
-      return;
-    }
-    const mxClient = this.bridge.getClientFactory().getClientAs();
-    this.aliasList[aliasLocalpart].forEach((item) => {
-      if (item === "#" + aliasLocalpart) {
-        return;
-      }
-      mxClient.createAlias(item, roomId).catch( (err) => {
-        log.warn("MatrixRoomHandler", `Failed to create alias '${aliasLocalpart} for ${roomId}'`, err);
-      });
-    });
-    delete this.aliasList[aliasLocalpart];
+    return; // We don't use this.
   }
 
   public OnEvent (request, context) {
@@ -66,7 +53,7 @@ export class MatrixRoomHandler {
   }
 
   public OnAliasQuery (alias: string, aliasLocalpart: string): Promise<any> {
-    let srvChanPair = aliasLocalpart.substr("_discord_".length).split("#", 2);
+    let srvChanPair = aliasLocalpart.substr("_discord_".length).split("_", 2);
     if (srvChanPair.length < 2 || srvChanPair[0] === "" || srvChanPair[1] === "") {
       log.warn("MatrixRoomHandler", `Alias '${aliasLocalpart}' was missing a server and/or a channel`);
       return;
@@ -79,22 +66,66 @@ export class MatrixRoomHandler {
   }
 
   public tpGetProtocol(protocol: string): Promise<thirdPartyProtocolResult> {
-    return Promise.reject({err: "Unsupported", code: 501});
+    return Promise.resolve({
+      user_fields: ["username", "discriminator"],
+      location_fields: ["guild_id", "channel_name"],
+      field_types: {
+        // guild_name: {
+        //   regexp: "\S.{0,98}\S",
+        //   placeholder: "Guild",
+        // },
+        guild_id: {
+          regexp: "[0-9]*",
+          placeholder: "",
+        },
+        channel_id: {
+          regexp: "[0-9]*",
+          placeholder: "",
+        },
+        channel_name: {
+           regexp: "[A-Za-z0-9_\-]{2,100}",
+           placeholder: "#Channel",
+        },
+        username: {
+          regexp: "[A-Za-z0-9_\-]{2,100}",
+          placeholder: "Username",
+        },
+        discriminator: {
+          regexp: "[0-9]{4}",
+          placeholder: "1234",
+        },
+      },
+      instances: this.discord.GetGuilds().map((guild) => {
+        return {
+          network_id: guild.id,
+          bot_user_id: this.botUserId,
+          desc: guild.name,
+          icon: guild.iconURL || ICON_URL, // TODO: Use icons from our content repo. Potential security risk.
+          fields: {
+            guild_id: guild.id,
+          },
+        };
+      }),
+    });
   }
 
-  public tpGetLocation(protocol: string, fields: any): Promise<[thirdPartyLocationResult]> {
-    return Promise.reject({err: "Unsupported", code: 501});
+  public tpGetLocation(protocol: string, fields: any): Promise<thirdPartyLocationResult[]> {
+    log.info("MatrixRoomHandler", "Got location request ", protocol, fields);
+    const chans = this.discord.ThirdpartySearchForChannels(fields.guild_id, fields.channel_name);
+    console.log(chans);
+    return Promise.resolve(chans);
   }
 
-  public tpParseLocation(alias: string): Promise<[thirdPartyLocationResult]>  {
+  public tpParseLocation(alias: string): Promise<thirdPartyLocationResult[]>  {
     return Promise.reject({err: "Unsupported", code: 501});
   }
 
-  public tpGetUser(protocol: string, fields: any): Promise<[thirdPartyUserResult]> {
+  public tpGetUser(protocol: string, fields: any): Promise<thirdPartyUserResult[]> {
+    log.info("MatrixRoomHandler", "Got user request ", protocol, fields);
     return Promise.reject({err: "Unsupported", code: 501});
   }
 
-  public tpParseUser(userid: string): Promise<[thirdPartyUserResult]> {
+  public tpParseUser(userid: string): Promise<thirdPartyUserResult[]> {
     return Promise.reject({err: "Unsupported", code: 501});
   }
 
@@ -113,17 +144,10 @@ export class MatrixRoomHandler {
     const gname = channel.guild.name.replace(" ", "-");
     const cname = channel.name.replace(" ", "-");
 
-    this.aliasList[alias] = [
-      `#_discord_${channel.guild.id}#${channel.id}:${this.config.bridge.domain}`,
-      `#_discord_${channel.guild.id}#${cname}:${this.config.bridge.domain}`,
-      `#_discord_${gname}#${channel.id}:${this.config.bridge.domain}`,
-      `#_discord_${gname}#${cname}:${this.config.bridge.domain}`,
-    ];
-
     const creationOpts = {
       visibility: "public",
       room_alias_name: alias,
-      name: `[Discord] ${channel.guild.name}#${channel.name}`,
+      name: `[Discord] ${channel.guild.name} #${channel.name}`,
       topic: channel.topic ? channel.topic : "",
       // invite: [roomOwner],
       initial_state: [