diff --git a/evennia/contrib/bettermenusystem.py b/evennia/contrib/bettermenusystem.py
new file mode 100644
index 0000000000..dc08d1c9a0
--- /dev/null
+++ b/evennia/contrib/bettermenusystem.py
@@ -0,0 +1,654 @@
+"""
+(Better) MenuSystem
+
+Evennia contribution - Griatch 2015
+
+
+This implements a better menu system for Evennia. Contrary to the old
+contrib menusystem, this is controlled from a simple module with
+function definitions, rather than building a set of classes with
+arguments.
+
+To start the menu, just import the Menu class from this module,
+and call
+
+ from evennia.contrib.bettermenusystem import Menu
+
+ Menu(caller, menu_module_path,
+ startnode="start", allow_quit=True,
+ cmdset_mergetype="Replace", cmdset_priority=1):
+
+Where `caller` is the Object to use the menu on - it will get a new
+cmdset while using the Menu. The menu_module_path is the python path
+to a python module containing function defintions. By adjusting the
+keyword options of the Menu() initialization call you can start the
+menu at different places in the menu definition file, adjust if the
+menu command should overload the normal commands or not etc.
+
+The menu is defined in a module with function defintions:
+
+ def nodename1(caller):
+ # code
+ return text, options
+
+The return values must be given in the above order, but each can be
+given as None as well
+
+ text (str or tuple): Text shown at this node. If a tuple, the second
+ element in the tuple is a help text to display at this node when
+ the user enters the menu help command there.
+ helptext (str): Help text shown at this node.
+ options (tuple): ( {'key': name, # can also be a list of aliases
+ 'desc': description, # option description
+ 'goto': nodekey, # node to go to when chosen
+ 'exec': nodekey, # node or callback to trigger as callback when chosen
+ {...}, ...)
+
+If key is not given, the option will automatically be identified by
+its number 1..N.
+
+Example:
+
+```python
+
+ # in menu_module.py
+
+ def node1(caller):
+ text = ("This is a node text",
+ "This is help text for this node")
+ options = ({"key": "testing",
+ "desc": "Select this to go to node 2"
+ "goto": "node2",
+ "exec": "callback1"},
+ {"desc": "Go to node 3."
+ "goto": "node3"} )
+ return text, options
+
+ def callback1(caller):
+ # this is called when choosing the "testing" option in node1
+ # (before going to node2). It needs not have return values.
+ caller.msg("Callback called!")
+
+ def node2(caller):
+ text = '''
+ This is node 2. It only allows you to go back
+ to the original node1. This extra indent will
+ be stripped. We don't include a help text.
+ '''
+ options = {"goto": "node1"}
+ return text, options
+
+ def node3(caller):
+ text = "This ends the menu since there are no options."
+ return text, None
+
+```
+
+When starting this menu with `Menu(caller, "path.to.menu_module")`,
+the first node will look something like this:
+
+ This is a node text
+ ______________________________________
+
+ testing: Select this to go to node 2
+ 2: Go to node 3
+
+Where you can both enter "testing" and "1" to select the first option.
+If the client supports MXP, they may also mouse-click on "testing" to
+do the same. When making this selection, a function "callback1" in the
+same Using `help` will show the help text, otherwise a list of
+available commands while in menu mode.
+
+The menu tree is exited either by using the in-menu quit command or by
+reaching a node without any options.
+
+
+For a menu demo, import CmdTestDemo form this
+
+"""
+
+from textwrap import dedent
+from inspect import isfunction, getargspec
+from django.conf import settings
+from evennia import syscmdkeys
+from evennia import Command, CmdSet
+from evennia.utils.evtable import EvTable
+from evennia.utils.ansi import ANSIString
+from evennia.utils.utils import mod_import, make_iter, pad, m_len
+
+# read from protocol NAWS later?
+_MAX_TEXT_WIDTH = settings.CLIENT_DEFAULT_WIDTH
+
+_CMD_NOMATCH = syscmdkeys.CMD_NOMATCH
+_CMD_NOINPUT = syscmdkeys.CMD_NOINPUT
+
+# Return messages
+
+_ERR_NOT_IMPLEMENTED = "Menu node '{nodename}' is not implemented. Make another choice."
+_ERR_GENERAL = "Error in menu node '{nodename}'."
+_ERR_NO_OPTION_DESC = "No description."
+_HELP_FULL = "Commands: