diff --git a/config/config.sample.yaml b/config/config.sample.yaml
index e4ffdef3b260de13f60eeab096806f8e55dae676..2b8350597ca9ef0ddf984570efa16e2d3eda00cd 100644
--- a/config/config.sample.yaml
+++ b/config/config.sample.yaml
@@ -1,17 +1,44 @@
+# This is a sample of the config file showing all avaliable options.
+# Where possible we have documented what they do, and all values are the
+# default values.
+
 bridge:
+  # Domain part of the bridge, e.g. matrix.org
   domain: "localhost"
+  # This should be your publically facing URL because Discord may use it to
+  # fetch media from the media store.
   homeserverUrl: "http://localhost:8008"
+  # Interval at which to process users in the 'presence queue'. If you have
+  # 5 users, one user will be processed every 500 milliseconds according to the
+  # value below. This has a minimum value of 250.
+  # WARNING: This has a high chance of spamming the homeserver with presence
+  # updates since it will send one each time somebody changes state or is online.
   presenceInterval: 500
+  # Disable setting presence for 'ghost users' which means Discord users on Matrix
+  # will not be shown as away or online.
   disablePresence: false
+  # Disable sending typing notifications when somebody on Discord types.
   disableTypingNotifications: false
+  # Disable parsing discord usernames out of matrix messages so
+  # that it highlights discord users.
+  # WARNING: Not always 100% accurate, but close enough usually.
   disableDiscordMentions: false
+  # Disable deleting messages on Discord if a message is redacted on Matrix.
   disableDeletionForwarding: false
+  # Enable users to bridge rooms using !discord commands. See
+  # https://t2bot.io/discord for instructions.
   enableSelfServiceBridging: false
+  # For both below, a space is inserted after @ to stop the mentions working.
+  # Disable relaying @everyone to Discord. Non-puppeted users can abuse this.
+  disableEveryoneMention: false
+  # Disable relaying @here to Discord. Non-puppeted users can abuse this.
+  disableHereMention: false
+# Authentication configuration for the discord bot.
 auth:
-  clientID: "12345" # Get from discord
-  secret: "blah"
+  clientID: "12345"
   botToken: "foobar"
 logging:
+  # What level should the logger output to the console at.
   console: "warn" #silly, verbose, info, http, warn, error, silent
   lineDateFormat: "MMM-D HH:mm:ss.SSS" # This is in moment.js format
   files:
@@ -22,11 +49,43 @@ logging:
       level: "warn"
     - file: "botlogs.log" # Will capture logs from DiscordBot
       level: "info"
-      enable: 
-        - "DiscordBot" 
+      enable:
+        - "DiscordBot"
 database:
-  filename: "discord.db"
   userStorePath: "user-store.db"
   roomStorePath: "room-store.db"
+  # You may either use SQLite or Postgresql for the bridge database, which contains
+  # important mappings for events and user puppeting configurations.
+  # Use the filename option for SQLite, or connString for Postgresql.
+  # If you are migrating, see https://github.com/Half-Shot/matrix-appservice-discord/blob/master/docs/howto.md#migrate-to-postgres-from-sqlite
+  # WARNING: You will almost certainly be fine with sqlite unless your bridge
+  # is in heavy demand and you suffer from IO slowness.
+  filename: "discord.db"
+  # connString: "postgresql://user:password@localhost/database_name"
 room:
+  # Set the default visibility of alias rooms, defaults to "public".
+  # One of: "public", "private"
   defaultVisibility: "public"
+channel:
+    # Pattern of the name given to bridged rooms.
+    # Can use :guild for the guild name and :name for the channel name.
+    namePattern: "[Discord] :guild :name"
+    # Changes made to rooms when a channel is deleted.
+    deleteOptions:
+       # Prefix the room name with a string.
+       #namePrefix: "[Deleted]"
+       # Prefix the room topic with a string.
+       #topicPrefix: "This room has been deleted"
+       # Disable people from talking in the room by raising the event PL to 50
+       disableMessaging: false
+       # Remove the discord alias from the room.
+       unsetRoomAlias: true
+       # Remove the room from the directory.
+       unlistFromDirectory: true
+       # Set the room to be unavaliable for joining without an invite.
+       setInviteOnly: true
+       # Make all the discord users leave the room.
+       ghostsLeave: true
+limits:
+    # Delay between discord users joining a room.
+    roomGhostJoinDelay: 6000
diff --git a/config/config.schema.yaml b/config/config.schema.yaml
index 96cc1abae3f025bc906806d31ceed6f4c7fa58ca..56de3a8585438f47d06b7636f0849b9163a72c6a 100644
--- a/config/config.schema.yaml
+++ b/config/config.schema.yaml
@@ -22,19 +22,20 @@ properties:
             type: "boolean"
           enableSelfServiceBridging:
             type: "boolean"
+          disableEveryoneMention:
+            type: "boolean"
+          disableHereMention:
+            type: "boolean"
     auth:
         type: "object"
-        required: ["botToken"]
+        required: ["botToken", "clientID"]
         properties:
           clientID:
             type: "string"
-          secret:
-            type: "string"
           botToken:
             type: "string"
     logging:
         type: "object"
-        required: []
         properties:
           console:
             type: "string"
@@ -68,7 +69,6 @@ properties:
                     type: "string"
     database:
         type: "object"
-        required: []
         properties:
           connString:
             type: "string"
@@ -80,7 +80,34 @@ properties:
             type: "string"
     room:
         type: "object"
-        required: ["defaultVisibility"]
         properties:
           defaultVisibility:
             type: "string"
+            enum: ["public", "private"]
+    limits:
+        type: "object"
+        properties:
+            roomGhostJoinDelay:
+                type: "number"
+    channel:
+        type: "object"
+        properties:
+            namePattern:
+                type: "string"
+            deleteOptions:
+                type: "object"
+                properties:
+                   namePrefix:
+                       type: "string"
+                   topicPrefix:
+                       type: "string"
+                   disableMessaging:
+                     type: "boolean"
+                   unsetRoomAlias:
+                     type: "boolean"
+                   unlistFromDirectory:
+                     type: "boolean"
+                   setInviteOnly:
+                     type: "boolean"
+                   ghostsLeave:
+                     type: "boolean"
diff --git a/src/config.ts b/src/config.ts
index bb35047882be464802f00288eeeb7d8d87ee0b5b..c231adc639e3d24b11f221b49d7ce96886da6f4c 100644
--- a/src/config.ts
+++ b/src/config.ts
@@ -47,7 +47,6 @@ export class DiscordBridgeConfigDatabase {
 
 export class DiscordBridgeConfigAuth {
   public clientID: string;
-  public secret: string;
   public botToken: string;
 }
 
diff --git a/test/test_configschema.ts b/test/test_configschema.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0533016160c9240d477a1ec8db00d71afc17ae05
--- /dev/null
+++ b/test/test_configschema.ts
@@ -0,0 +1,22 @@
+import * as yaml from "js-yaml";
+import * as Chai from "chai";
+import { ConfigValidator } from "matrix-appservice-bridge";
+
+const expect = Chai.expect;
+
+describe("ConfigSchema", () => {
+    const validator = new ConfigValidator("./config/config.schema.yaml");
+    it("should successfully validate a minimal config", () => {
+        const yamlConfig = yaml.safeLoad(`
+            bridge:
+                domain: localhost
+                homeserverUrl: "http://localhost:8008"
+            auth:
+                clientID: foo
+                botToken: foobar`);
+        validator.validate(yamlConfig);
+    });
+    it("should successfully validate the sample config", () => {
+         validator.validate("./config/config.sample.yaml");
+    });
+});