diff --git a/README b/README
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/irc.py b/irc.py
index 769b10ff5af0b3e2bfc6e70c945bcfd7f0a1c423..3784116985169a05e11169edeb2cc0d6cc62140c 100644
--- a/irc.py
+++ b/irc.py
@@ -325,7 +325,7 @@ class IRC(threading.Thread):
         self.pluginManager.event("action", channel, self.config["nickname"], action)
     
     def doQuit(self, message=None):
-        self.sendLine("QUIT " + (message or ""))
+        self.sendLine("QUIT :" + (message or ""))
         self.pluginManager.event("quit", self.config["nickname"], (message or ""))
         self.running = False
     
diff --git a/plugins/ddg.py b/plugins/ddg.py
new file mode 100644
index 0000000000000000000000000000000000000000..86ad9c49380036773bf1f041c5a5838bb5344b32
--- /dev/null
+++ b/plugins/ddg.py
@@ -0,0 +1,32 @@
+# ddg module
+# --gry
+
+import urllib
+import socket
+import json
+
+@plugin
+class ddg(object):
+    def __init__(self, server):
+        self.server = server
+        self.commands = ["ddg"]
+        self.server.handle("command", self.handle_command, self.commands)
+    
+    def handle_command(self, channel, user, cmd, args):
+        if cmd == "ddg":
+            if len(args) < 1:
+                self.server.doMessage(channel, user+": DuckDuckGo.com Zero-Click infoboxes search. Syntax: ddg <query>.")
+                return
+            try:
+                request = "+".join(args)
+                sock = urllib.urlopen("http://api.duckduckgo.com/?q=%s&o=json"%request)
+                data = sock.read()
+                sock.close()
+                if json.loads(data)["AbstractText"] != "":
+                    self.server.doMessage(channel, user+": "+"%s %s)"%(json.loads(data)["AbstractURL"].encode('utf-8'),json.loads(data)["AbstractText"].encode('utf-8')[0:200]))
+                elif json.loads(data)["Definition"] != "":
+                    self.server.doMessage(channel, user+": "+"%s %s"%(json.loads(data)["DefinitionURL"].encode('utf-8'),json.loads(data)["Definition"].encode('utf-8')))
+            except Exception, e:
+                self.server.doMessage(channel, user+": "+str(e))
+
+
diff --git a/plugins/dns.py b/plugins/dns.py
new file mode 100644
index 0000000000000000000000000000000000000000..5967502b86cf86f323f478a1846903cfbabe3235
--- /dev/null
+++ b/plugins/dns.py
@@ -0,0 +1,24 @@
+# dns module
+# --gry
+
+import urllib
+import socket
+
+@plugin
+class dns(object):
+    def __init__(self, server):
+        self.server = server
+        self.commands = ["dns"]
+        self.server.handle("command", self.handle_command, self.commands)
+    
+    def handle_command(self, channel, user, cmd, args):
+        if cmd == "dns":
+            if len(args) < 1:
+                self.server.doMessage(channel, user+": Return a fully qualified domain name for a list of space-separated IPs or hostnames.")
+                return
+            try:
+                for each in args:
+                    self.server.doMessage(channel, user+": "+ each+" = "+socket.getfqdn(each))
+            except Exception, e:
+                self.server.doMessage(channel, user+": "+str(e))
+
diff --git a/plugins/rpn.py b/plugins/rpn.py
new file mode 100644
index 0000000000000000000000000000000000000000..16147fc7a3f441f972d4c90e03a389fefb171852
--- /dev/null
+++ b/plugins/rpn.py
@@ -0,0 +1,42 @@
+# rpn module
+# --gry
+
+
+@plugin
+class rpn(object):
+    def __init__(self, server):
+        self.server = server
+        self.commands = ["rpn"]
+        self.server.handle("command", self.handle_command, self.commands)
+    
+    def handle_command(self, channel, user, cmd, args):
+        if cmd == "rpn":
+            if len(args) < 1:
+                self.server.doMessage(channel, user+": reverse-polish-notation calculator. syntax: rpn 2 4 1 + / gives 2/5.")
+                return
+            self.stack = []
+            for char in args:
+                try:
+                    char = float(char)# if it succeeds, then char is a number
+                    self.stack.append(char)
+                except Exception,e: #float(char) failed, it's nonsense or an operator
+                    try:
+                        a = float(self.stack.pop()) #last
+                        b = float(self.stack.pop()) #pre-last
+                        if(char == "+"):
+                            self.stack.append(a + b)
+                        elif(char == "-"):
+                            self.stack.append(b - a)
+                        elif(char == "^"):
+                            self.stack.append(pow(b,a))
+                        elif(char == "*"):
+                            self.stack.append(a * b)
+                        elif(char == "/"):
+                            self.stack.append(b / a)
+                    except Exception, e:
+                        self.conn.reply(str(e))
+                        return
+            try:
+                self.server.doMessage(channel, user+": "+str(self.stack[0]))
+            except Exception, e:
+                return