Index: /trunk/src/lib/shell/shell_command.cc
===================================================================
--- /trunk/src/lib/shell/shell_command.cc	(revision 7411)
+++ /trunk/src/lib/shell/shell_command.cc	(revision 7412)
@@ -295,4 +295,23 @@
   }
 
+  ShellCommand* ShellCommand::completionPlugin(unsigned int parameter, const CompletorPlugin& completorPlugin)
+  {
+    if (this == NULL || this->executor == NULL)
+      return NULL;
+
+    if (parameter >= this->executor->getParamCount())
+    {
+      PRINTF(1)("Parameter %d not inside of valid ParameterCount %d of Command %s::%s\n",
+    parameter, this->executor->getParamCount(), this->getName(), this->shellClass->getName());
+    }
+    else
+    {
+      delete this->completors[parameter];
+      this->completors[parameter] = completorPlugin.clone();
+    }
+    return this;
+  }
+
+
   /**
    * @brief prints out nice information about the Shells Commands
@@ -331,4 +350,9 @@
 
 
+
+  ///////////
+  // ALIAS //
+  ///////////
+
   /**
    * @param aliasName the name of the Alias
Index: /trunk/src/lib/shell/shell_command.h
===================================================================
--- /trunk/src/lib/shell/shell_command.h	(revision 7411)
+++ /trunk/src/lib/shell/shell_command.h	(revision 7412)
@@ -62,14 +62,4 @@
     friend class ShellCommandClass;
   public:
-    //! an enumerator for different types the Shell parses.
-    typedef enum {
-      NullRecognition         = 0,
-      ClassRecognition              = 1,
-      ObjectRecognition             = 2,
-      FunctionRecognition           = 4,
-      AliasRecognition              = 8,
-      ParameterRecognition          = 16,
-    } RecognitionType;
-
     static bool execute (const std::string& executionString);
 
@@ -79,4 +69,5 @@
                                 const MultiType& value2 = MT_NULL, const MultiType& value3 = MT_NULL,
                                 const MultiType& value4 = MT_NULL);
+    ShellCommand* completionPlugin(unsigned int parameter, const CompletorPlugin& completorPlugin);
 
     static ShellCommand* registerCommand(const std::string& commandName, const std::string& className, const Executor& executor);
Index: /trunk/src/lib/shell/shell_completion.cc
===================================================================
--- /trunk/src/lib/shell/shell_completion.cc	(revision 7411)
+++ /trunk/src/lib/shell/shell_completion.cc	(revision 7412)
@@ -114,6 +114,8 @@
       if (sc != NULL)
       {
-        std::vector<std::string> test;
-        sc->getCompletorPlugin(0)->addToCompleteList(test, inputSplits[inputSplits.size()-1]);
+        std::vector<std::string> completed;
+        sc->getCompletorPlugin(0)->addToCompleteList(completed, inputSplits[inputSplits.size()-1]);
+        for (unsigned int i = 0; i < completed.size(); i++)
+          this->completionList.push_back(CompletionElement(completed[i], ParamCompletion));
       }
     }
@@ -256,8 +258,5 @@
           !nocaseCmp(*string, completionBegin, searchLength))
       {
-        CompletionElement newElem;
-        newElem.name = (*string);
-        newElem.type = type;
-        this->completionList.push_back(newElem);
+        this->completionList.push_back(CompletionElement (*string, type));
       }
     }
@@ -282,8 +281,5 @@
           !nocaseCmp((*bo)->getName(), completionBegin, searchLength))
       {
-        CompletionElement newElem;
-        newElem.name = (*bo)->getName();
-        newElem.type = type;
-        this->completionList.push_back(newElem);
+        this->completionList.push_back(CompletionElement((*bo)->getName(), type));
       }
     }
@@ -316,4 +312,6 @@
       case AliasCompletion:
         return typeNames[4];
+      case ParamCompletion:
+        return typeNames[5];
     }
   }
@@ -326,5 +324,6 @@
       "object",
       "function",
-      "alias"
+      "alias",
+      "parameter",
     };
 
Index: /trunk/src/lib/shell/shell_completion.h
===================================================================
--- /trunk/src/lib/shell/shell_completion.h	(revision 7411)
+++ /trunk/src/lib/shell/shell_completion.h	(revision 7412)
@@ -29,4 +29,5 @@
         FunctionCompletion     = 4,
         AliasCompletion        = 8,
+        ParamCompletion        = 16,
     } CompletionType;
 
@@ -34,4 +35,5 @@
       struct CompletionElement
       {
+        CompletionElement(std::string name, CompletionType type) : name(name), type(type) {}
         std::string     name;     //!< the Name of the Element to be completed.
         CompletionType  type;     //!< the type of the Element
Index: /trunk/src/lib/shell/shell_completion_plugin.cc
===================================================================
--- /trunk/src/lib/shell/shell_completion_plugin.cc	(revision 7411)
+++ /trunk/src/lib/shell/shell_completion_plugin.cc	(revision 7412)
@@ -47,8 +47,12 @@
   void CompletorStringArray::addToCompleteList(std::vector<std::string>& completionList, const std::string& completionBegin) const
   {
+    printf("TEST\n");
     unsigned int inputLen = completionBegin.size();
     for (unsigned int i = 0; i < this->_size; ++i)
+    {
+      printf("%s\n", this->_stringArray[i].c_str());
       if (!nocaseCmp(this->_stringArray[i], completionBegin, inputLen))
         completionList.push_back(this->_stringArray[i]);
+    }
   }
 
Index: /trunk/src/lib/util/helper_functions.cc
===================================================================
--- /trunk/src/lib/util/helper_functions.cc	(revision 7411)
+++ /trunk/src/lib/util/helper_functions.cc	(revision 7412)
@@ -146,4 +146,6 @@
 int nocaseCmp(const std::string& s1, const std::string& s2, unsigned int len)
 {
+  if (len == 0)
+    return 0;
   std::string::const_iterator it1=s1.begin();
   std::string::const_iterator it2=s2.begin();
Index: /trunk/src/story_entities/game_world.cc
===================================================================
--- /trunk/src/story_entities/game_world.cc	(revision 7411)
+++ /trunk/src/story_entities/game_world.cc	(revision 7412)
@@ -62,6 +62,9 @@
 
 
-SHELL_COMMAND(speed, GameWorld, setSpeed);
-SHELL_COMMAND(playmode, GameWorld, setPlaymode);
+SHELL_COMMAND(speed, GameWorld, setSpeed) ->describe("set the Speed of the Level");
+SHELL_COMMAND(playmode, GameWorld, setPlaymode)
+    ->describe("Set the Playmode of the current Level")
+    ->completionPlugin(0, OrxShell::CompletorStringArray(Playable::playmodeNames, Playable::PlaymodeCount));
+
 SHELL_COMMAND_STATIC(togglePNodeVisibility, GameWorld, GameWorld::togglePNodeVisibility);
 SHELL_COMMAND_STATIC(toggleBVVisibility, GameWorld, GameWorld::toggleBVVisibility);
@@ -292,9 +295,9 @@
       this->dataTank->localPlayer->getPlayable()->setPlaymode(playmode))
   {
-    PRINTF(3)("Set Playmode to %d:%s\n", playmode, Playable::playmodeToString(playmode));
+    PRINTF(3)("Set Playmode to %d:%s\n", playmode, Playable::playmodeToString(playmode).c_str());
   }
   else
   {
-    PRINTF(1)("Unable to set Playmode %d:%s\n", playmode, Playable::playmodeToString(playmode));
+    PRINTF(1)("Unable to set Playmode %d:%s\n", playmode, Playable::playmodeToString(playmode).c_str());
   }
 }
Index: /trunk/src/world_entities/playable.cc
===================================================================
--- /trunk/src/world_entities/playable.cc	(revision 7411)
+++ /trunk/src/world_entities/playable.cc	(revision 7412)
@@ -563,11 +563,11 @@
 Playable::Playmode Playable::stringToPlaymode(const std::string& playmode)
 {
-  if (playmode == "Vertical")
+  if (playmode == Playable::playmodeNames[0])
     return Playable::Vertical;
-  if (playmode == "Horizontal")
+  if (playmode == Playable::playmodeNames[1])
     return Playable::Horizontal;
-  if (playmode == "FromBehind")
+  if (playmode == Playable::playmodeNames[2])
     return Playable::FromBehind;
-  if (playmode == "Full3D")
+  if (playmode == Playable::playmodeNames[3])
     return Playable::Full3D;
 
@@ -581,20 +581,30 @@
  * @returns the String.
  */
-const char* Playable::playmodeToString(Playable::Playmode playmode)
+const std::string& Playable::playmodeToString(Playable::Playmode playmode)
 {
   switch(playmode)
   {
     case Playable::Vertical:
-      return "Vertical";
+      return Playable::playmodeNames[0];
     case Playable::Horizontal:
-      return "Horizontal";
+      return Playable::playmodeNames[1];
     case Playable::FromBehind:
-      return "FromBehind";
+      return Playable::playmodeNames[2];
     case Playable::Full3D:
-      return "Full3D";
+      return Playable::playmodeNames[3];
 
     default:
-      return "Full3D";
-  }
-
-}
+      return Playable::playmodeNames[3];
+  }
+}
+
+/**
+ * @brief PlaymodeNames
+ */
+const std::string Playable::playmodeNames[] =
+{
+  "Vertical",
+  "Horizontal",
+  "FromBehind",
+  "Full3D"
+};
Index: /trunk/src/world_entities/playable.h
===================================================================
--- /trunk/src/world_entities/playable.h	(revision 7411)
+++ /trunk/src/world_entities/playable.h	(revision 7412)
@@ -33,4 +33,6 @@
     FromBehind       = 4,       //!< Seen from behind (move in z-y)
     Full3D           = 8,       //!< Full featured 3D-mode. (move in all directions x-y-z)
+
+    PlaymodeCount    = 4,
   } Playmode;
 
@@ -87,5 +89,7 @@
   // Transformations:
   static Playable::Playmode stringToPlaymode(const std::string& playmode);
-  static const char* playmodeToString(Playable::Playmode playmode);
+  static const std::string& playmodeToString(Playable::Playmode playmode);
+  static const std::string playmodeNames[];
+
 protected:
   Playable();
