diff --git a/src/index.ts b/src/index.ts
index 2908e2ff..79f6761d 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -17,6 +17,7 @@ import { BotControlPlugin } from "./plugins/BotControl";
 import { ModActionsPlugin } from "./plugins/ModActions";
 import { UtilityPlugin } from "./plugins/Utility";
 import { LogsPlugin } from "./plugins/Logs";
+import { PostPlugin } from "./plugins/Post";
 import knex from "./knex";
 
 // Run latest database migrations
@@ -28,7 +29,8 @@ knex.migrate.latest().then(() => {
     plugins: {
       utility: UtilityPlugin,
       mod_actions: ModActionsPlugin,
-      logs: LogsPlugin
+      logs: LogsPlugin,
+      post: PostPlugin
     },
     globalPlugins: {
       bot_control: BotControlPlugin
diff --git a/src/plugins/Post.ts b/src/plugins/Post.ts
new file mode 100644
index 00000000..aab78f94
--- /dev/null
+++ b/src/plugins/Post.ts
@@ -0,0 +1,59 @@
+import { Plugin, decorators as d } from "knub";
+import { Channel, Message, TextChannel } from "eris";
+import { errorMessage } from "../utils";
+
+export class PostPlugin extends Plugin {
+  getDefaultOptions() {
+    return {
+      permissions: {
+        post: false,
+        edit: false
+      },
+
+      overrides: [
+        {
+          level: ">=100",
+          permissions: {
+            post: true,
+            edit: true
+          }
+        }
+      ]
+    };
+  }
+
+  /**
+   * Post a message as the bot to the specified channel
+   */
+  @d.command("post", "<channel:channel> <content:string$>")
+  @d.permission("post")
+  async postCmd(msg: Message, args: { channel: Channel; content: string }) {
+    if (!(args.channel instanceof TextChannel)) {
+      msg.channel.createMessage(errorMessage("Channel is not a text channel"));
+      return;
+    }
+
+    args.channel.createMessage(args.content);
+  }
+
+  /**
+   * Edit the specified message posted by the bot
+   */
+  @d.command("edit", "<channel:channel> <messageId:string> <content:string$>")
+  @d.permission("edit")
+  async editCmd(msg, args) {
+    const message = await this.bot.getMessage(args.channel.id, args.messageId);
+
+    if (!message) {
+      args.channel.createMessage(errorMessage("Unknown message"));
+      return;
+    }
+
+    if (message.author.id !== this.bot.user.id) {
+      args.channel.createMessage(errorMessage("Message wasn't posted by me"));
+      return;
+    }
+
+    message.edit(args.content);
+  }
+}