diff --git a/Lib/test/test_cmd.py b/Lib/test/test_cmd.py
new file mode 100644
index 0000000..5aa1c40
--- /dev/null
+++ b/Lib/test/test_cmd.py
@@ -0,0 +1,186 @@
+#!/usr/bin/env python
+"""
+Test script for the 'cmd' module
+Original by Michael Schneider
+"""
+
+
+from test import test_support
+import cmd
+import sys
+
+class samplecmdclass(cmd.Cmd):
+    """
+    Instance the sampleclass:
+    >>> mycmd = samplecmdclass()
+
+    Test for the function parseline():
+    >>> mycmd.parseline("")
+    (None, None, '')
+    >>> mycmd.parseline("?")
+    ('help', '', 'help ')
+    >>> mycmd.parseline("?help")
+    ('help', 'help', 'help help')
+    >>> mycmd.parseline("!")
+    ('shell', '', 'shell ')
+    >>> mycmd.parseline("!command")
+    ('shell', 'command', 'shell command')
+    >>> mycmd.parseline("func")
+    ('func', '', 'func')
+    >>> mycmd.parseline("func arg1")
+    ('func', 'arg1', 'func arg1')
+
+
+    Test for the function onecmd():
+    >>> mycmd.onecmd("")
+    >>> mycmd.onecmd("add 4 5")
+    9
+    >>> mycmd.onecmd("")
+    9
+    >>> mycmd.onecmd("test")
+    *** Unknown syntax: test
+
+    Test for the function emptyline():
+    >>> mycmd.emptyline()
+    *** Unknown syntax: test
+
+    Test for the function default():
+    >>> mycmd.default("default")
+    *** Unknown syntax: default
+
+    Test for the function completedefault():
+    >>> mycmd.completedefault()
+    This is the completedefault methode
+    >>> mycmd.completenames("a")
+    ['add']
+
+    Test for the function completenames():
+    >>> mycmd.completenames("12")
+    []
+    >>> mycmd.completenames("help")
+    ['help', 'help']
+
+    Test for the function complete_help():
+    >>> mycmd.complete_help("a")
+    ['add']
+    >>> mycmd.complete_help("he")
+    ['help', 'help']
+    >>> mycmd.complete_help("12")
+    []
+
+    Test for the function do_help():
+    >>> mycmd.do_help("testet")
+    *** No help on testet
+    >>> mycmd.do_help("add")
+    help text for add
+    >>> mycmd.onecmd("help add")
+    help text for add
+    >>> mycmd.do_help("")
+    <BLANKLINE>
+    Documented commands (type help <topic>):
+    ========================================
+    add
+    <BLANKLINE>
+    Undocumented commands:
+    ======================
+    exit  help  shell
+    <BLANKLINE>
+
+    Test for the function print_topics():
+    >>> mycmd.print_topics("header", ["command1", "command2"], 2 ,10)
+    header
+    ======
+    command1
+    command2
+    <BLANKLINE>
+
+    Test for the function columnize():
+    >>> mycmd.columnize([str(i) for i in xrange(20)])
+    0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19
+    >>> mycmd.columnize([str(i) for i in xrange(20)], 10)
+    0  7   14
+    1  8   15
+    2  9   16
+    3  10  17
+    4  11  18
+    5  12  19
+    6  13
+
+    This is a interactive test, put some commands in the cmdqueue attribute
+    and let it execute
+    This test includes the preloop(), postloop(), default(), emptyline(),
+    parseline(), do_help() functions
+    >>> mycmd.use_rawinput=0
+    >>> mycmd.cmdqueue=["", "add", "add 4 5", "help", "help add","exit"]
+    >>> mycmd.cmdloop()
+    Hello from preloop
+    help text for add
+    *** invalid number of arguments
+    9
+    <BLANKLINE>
+    Documented commands (type help <topic>):
+    ========================================
+    add
+    <BLANKLINE>
+    Undocumented commands:
+    ======================
+    exit  help  shell
+    <BLANKLINE>
+    help text for add
+    Hello from postloop
+    """
+
+    def preloop(self):
+        print "Hello from preloop"
+
+    def postloop(self):
+        print "Hello from postloop"
+
+    def completedefault(self, *ignored):
+        print "This is the completedefault methode"
+        return
+
+    def complete_command(self):
+        print "complete command"
+        return
+
+    def do_shell(self):
+        pass
+
+    def do_add(self, s):
+        l = s.split()
+        if len(l) != 2:
+            print "*** invalid number of arguments"
+            return
+        try:
+            l = [int(i) for i in l]
+        except ValueError:
+            print "*** arguments should be numbers"
+            return
+        print l[0]+l[1]
+
+    def help_add(self):
+        print "help text for add"
+        return
+
+    def do_exit(self, arg):
+        return True
+
+def test_main(verbose=None):
+    from test import test_support, test_cmd
+    test_support.run_doctest(test_cmd, verbose)
+
+import trace, sys,re,StringIO
+def test_coverage(coverdir):
+    tracer=trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix,],
+                        trace=0, count=1)
+    tracer.run('reload(cmd);test_main()')
+    r=tracer.results()
+    print "Writing coverage results..."
+    r.write_results(show_missing=True, summary=True, coverdir=coverdir)
+
+if __name__ == "__main__":
+    if "-c" in sys.argv:
+        test_coverage('/tmp/cmd.cover')
+    else:
+        test_main()
