diff --git a/src/discordbot.ts b/src/bot.ts
similarity index 95%
rename from src/discordbot.ts
rename to src/bot.ts
index 9379a2dd428ccd16a4778e00488cb73da8049284..43d93e297abc6d661eb87139ade9b829561d48ca 100644
--- a/src/discordbot.ts
+++ b/src/bot.ts
@@ -1,6 +1,7 @@
 import { DiscordBridgeConfig } from "./config";
-import { DiscordClientFactory } from "./discordclientfactory";
-import { DiscordStore } from "./discordstore";
+import { DiscordClientFactory } from "./clientfactory";
+import { DiscordStore } from "./store";
+import { DiscordDMHandler } from "./dmhandler";
 import { MatrixUser, RemoteUser, Bridge, RemoteRoom } from "matrix-appservice-bridge";
 import { Util } from "./util";
 import * as Discord from "discord.js";
@@ -8,6 +9,7 @@ import * as log from "npmlog";
 import * as Bluebird from "bluebird";
 import * as mime from "mime";
 import * as marked from "marked";
+import * as path from "path";
 
 // Due to messages often arriving before we get a response from the send call,
 // messages get delayed from discord.
@@ -149,9 +151,10 @@ export class DiscordBot {
       return Promise.resolve(null);
     }).then((attachment) => {
       if (attachment !== null) {
+        let name = this.GetFilenameForMediaEvent(event.content);
         return {
           file : {
-            name: event.content.body,
+            name,
             attachment,
           },
         };
@@ -173,6 +176,16 @@ export class DiscordBot {
     return false;
   }
 
+  private GetFilenameForMediaEvent(content) {
+    if (content.body) {
+      if (path.extname(content.body) !== "") {
+        return content.body;
+      }
+      return path.basename(content.body) + "." + mime.extension(content.mimetype);
+    }
+    return "matrix-media." + mime.extension(content.mimetype);
+  }
+
   private GetRoomIdFromChannel(channel: Discord.Channel): Promise<string> {
     return this.bridge.getRoomStore().getEntriesByRemoteRoomData({
       discord_channel: channel.id,
diff --git a/src/discordclientfactory.ts b/src/clientfactory.ts
similarity index 92%
rename from src/discordclientfactory.ts
rename to src/clientfactory.ts
index 461843e38fda9c9bc40f02269762837dad8833a3..f8e9958c7aeda30ed73254ff1f50107f6eed4100 100644
--- a/src/discordclientfactory.ts
+++ b/src/clientfactory.ts
@@ -1,5 +1,5 @@
 import { DiscordBridgeConfigAuth } from "./config";
-import { DiscordStore } from "./discordstore";
+import { DiscordStore } from "./store";
 import { Client } from "discord.js";
 import * as log from "npmlog";
 import * as Bluebird from "bluebird";
@@ -8,7 +8,7 @@ export class DiscordClientFactory {
   private config: DiscordBridgeConfigAuth;
   private store: DiscordStore;
   private botClient: any;
-  private clients: Map<string,any>;
+  private clients: Map<string, any>;
   constructor(config: DiscordBridgeConfigAuth, store: DiscordStore) {
     this.config = config;
     this.clients = new Map();
@@ -21,12 +21,13 @@ export class DiscordClientFactory {
     this.botClient = Bluebird.promisifyAll(new Client({
       fetchAllMembers: true,
       sync: true,
+      messageCacheLifetime: 5,
     }));
     return this.botClient.login(this.config.botToken).then(() => {
       return null; // Strip token from promise.
     }).catch((err) => {
       log.error("ClientFactory", "Could not login as the bot user. This is bad!");
-    })
+    });
   }
 
   public getClient(userId?: string): Promise<any> {
@@ -43,6 +44,7 @@ export class DiscordClientFactory {
         client = Bluebird.promisifyAll(new Client({
           fetchAllMembers: true,
           sync: true,
+          messageCacheLifetime: 5,
         }));
         log.verbose("ClientFactory", "Got user token. Logging in...");
         return client.login(token).then(() => {
@@ -51,7 +53,7 @@ export class DiscordClientFactory {
           return Promise.resolve(client);
         }).catch((err) => {
           log.warn("ClientFactory", `Could not log ${userId} in.`, err);
-        })
+        });
       });
       // Get from cache
     }
diff --git a/src/dbschema/dbschema.ts b/src/dbschema/dbschema.ts
index e8b7cfdc625be7662f5e0cad1a910c78efd9025c..ddb4310aeac765f916d80aea3e750c4bc03ee2fe 100644
--- a/src/dbschema/dbschema.ts
+++ b/src/dbschema/dbschema.ts
@@ -1,4 +1,4 @@
-import { DiscordStore } from "../discordstore";
+import { DiscordStore } from "../store";
 export interface IDbSchema {
   description: string,
   run(store: DiscordStore): Promise<null>;
diff --git a/src/dbschema/v1.ts b/src/dbschema/v1.ts
index 474544f7cfa27b50984e0711a479046c81c731bc..ca542623e9df7ec6ae46599c4eaf5e4e2be8c3e4 100644
--- a/src/dbschema/v1.ts
+++ b/src/dbschema/v1.ts
@@ -1,5 +1,5 @@
 import {IDbSchema} from "./dbschema";
-import {DiscordStore} from "../discordstore";
+import {DiscordStore} from "../store";
 export class Schema implements IDbSchema {
   public description = "Schema, Client Auth Table";
   public run(store: DiscordStore): Promise<null> {
diff --git a/src/discordas.ts b/src/discordas.ts
index 7d913fcb1f6cf94f9c3b1f8cedacada77a437fa4..c8d6eb6262847b4df5368be32e00b0457a424281 100644
--- a/src/discordas.ts
+++ b/src/discordas.ts
@@ -3,9 +3,9 @@ import * as log from "npmlog";
 import * as yaml from "js-yaml";
 import * as fs from "fs";
 import { DiscordBridgeConfig } from "./config";
-import { DiscordBot } from "./discordbot";
+import { DiscordBot } from "./bot";
 import { MatrixRoomHandler } from "./matrixroomhandler";
-import { DiscordStore } from "./discordstore";
+import { DiscordStore } from "./store";
 
 const cli = new Cli({
   bridgeConfig: {
@@ -62,7 +62,7 @@ function run (port: number, config: DiscordBridgeConfig) {
       thirdPartyLookup: roomhandler.ThirdPartyLookup,
       onLog: (line, isError) => {
         log.verbose("matrix-appservice-bridge", line);
-      }
+      },
     },
     domain: config.bridge.domain,
     homeserverUrl: config.bridge.homeserverUrl,
diff --git a/src/matrixroomhandler.ts b/src/matrixroomhandler.ts
index a705064e2a0356f1d8d90befd4c17a86e83c33b7..d719cd0ab256a14f42c456fbe36a98cdeac5d1ca 100644
--- a/src/matrixroomhandler.ts
+++ b/src/matrixroomhandler.ts
@@ -1,4 +1,4 @@
-import { DiscordBot } from "./discordbot";
+import { DiscordBot } from "./bot";
 import {
   Bridge,
   RemoteRoom,
@@ -8,7 +8,7 @@ import {
   thirdPartyLocationResult,
  } from "matrix-appservice-bridge";
 import { DiscordBridgeConfig } from "./config";
-import { DiscordClientFactory } from "./discordclientfactory";
+import { DiscordClientFactory } from "./clientfactory";
 
 import * as Discord from "discord.js";
 import * as log from "npmlog";
diff --git a/src/discordstore.ts b/src/store.ts
similarity index 88%
rename from src/discordstore.ts
rename to src/store.ts
index 83d981799427fccf16ef07326016789f5b114f4a..1c1799f9d0dc5161d87a3436fc1c6dde1e494bab 100644
--- a/src/discordstore.ts
+++ b/src/store.ts
@@ -74,8 +74,8 @@ export class DiscordStore {
       `REPLACE INTO user_tokens (userId,token) VALUES ($id,$token);`
     , {
       $id: userId,
-      $token: token
-    }).catch(err => {
+      $token: token,
+    }).catch( (err) => {
       log.error("TwitDB", "Error storing user token %s", err);
       throw err;
     });
@@ -90,10 +90,25 @@ export class DiscordStore {
       WHERE user_tokens.userId = $id;
       `
     , {
-      $id: userId
-    }).then(row => {
+      $id: userId,
+    }).then( (row) => {
       return row !== undefined ? row.token : null;
-    }).catch( err => {
+    }).catch( (err) => {
+      log.error("TwitDB", "Error getting user token  %s", err.Error);
+      throw err;
+    });
+  }
+
+  public get_users_tokens(): Promise<any> {
+    log.silly("SQL", "get_users_tokens");
+    return this.db.allAsync(
+      `
+      SELECT *
+      FROM user_tokens
+      `,
+    ).then( (rows) => {
+      return rows;
+    }).catch( (err) => {
       log.error("TwitDB", "Error getting user token  %s", err.Error);
       throw err;
     });