Index: trunk/src/shared/Common.h
===================================================================
--- trunk/src/shared/Common.h (revision 102)
+++ trunk/src/shared/Common.h (revision 112)
@@ -170,5 +170,6 @@
     SEC_MODERATOR      = 1,
     SEC_GAMEMASTER     = 2,
-    SEC_ADMINISTRATOR  = 3
+    SEC_ADMINISTRATOR  = 3,
+	SEC_CONSOLE        = 4                                  // must be always last in list, accounts must have less security level always also
 };
 
Index: trunk/src/game/PlayerDump.cpp
===================================================================
--- trunk/src/game/PlayerDump.cpp (revision 102)
+++ trunk/src/game/PlayerDump.cpp (revision 112)
@@ -27,5 +27,5 @@
 
 // Character Dump tables
-#define DUMP_TABLE_COUNT 20
+#define DUMP_TABLE_COUNT 19
 
 struct DumpTable
@@ -259,9 +259,6 @@
 
 // Writing - High-level functions
-bool PlayerDumpWriter::DumpTable(std::string& dump, uint32 guid, char const*tableFrom, char const*tableTo, DumpTableType type)
-{
-    if (!tableFrom || !tableTo)
-        return false;
-
+void PlayerDumpWriter::DumpTable(std::string& dump, uint32 guid, char const*tableFrom, char const*tableTo, DumpTableType type)
+{
     GUIDs const* guids = NULL;
     char const* fieldname = NULL;
@@ -281,5 +278,5 @@
     // for guid set stop if set is empty
     if(guids && guids->empty())
-        return true;                                        // nothing to do
+        return;                                        // nothing to do
 
     // setup for guids case start position
@@ -299,5 +296,5 @@
         QueryResult *result = CharacterDatabase.PQuery("SELECT * FROM %s WHERE %s", tableFrom, wherestr.c_str());
         if(!result)
-            return false;
+            return;
 
         do
@@ -329,6 +326,4 @@
     }
     while(guids && guids_itr != guids->end());              // not set case iterate single time, set case iterate for all guids
-
-    return true;
 }
 
@@ -339,5 +334,5 @@
         DumpTable(dump, guid, dumpTables[i].name, dumpTables[i].name, dumpTables[i].type);
 
-    // TODO: Add instance/group/gifts..
+    // TODO: Add instance/group..
     // TODO: Add a dump level option to skip some non-important tables
 
@@ -345,8 +340,9 @@
 }
 
-bool PlayerDumpWriter::WriteDump(std::string file, uint32 guid)
+DumpReturn PlayerDumpWriter::WriteDump(std::string file, uint32 guid)
 {
     FILE *fout = fopen(file.c_str(), "w");
-    if (!fout) { sLog.outError("Failed to open file!\r\n"); return false; }
+    if (!fout)
+		return DUMP_FILE_OPEN_ERROR;
 
     std::string dump = GetDump(guid);
@@ -354,11 +350,11 @@
     fprintf(fout,"%s\n",dump.c_str());
     fclose(fout);
-    return true;
+    return DUMP_SUCCESS;
 }
 
 // Reading - High-level functions
-#define ROLLBACK {CharacterDatabase.RollbackTransaction(); fclose(fin); return false;}
-
-bool PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string name, uint32 guid)
+#define ROLLBACK(DR) {CharacterDatabase.RollbackTransaction(); fclose(fin); return (DR);}
+
+DumpReturn PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string name, uint32 guid)
 {
     // check character count
@@ -373,11 +369,10 @@
 
             if (charcount >= 10)
-            {
-                return false;
-            }
+                return DUMP_TOO_MANY_CHARS;
         }
     }
     FILE *fin = fopen(file.c_str(), "r");
-    if(!fin) return false;
+    if(!fin)
+		return DUMP_FILE_OPEN_ERROR;
 
     QueryResult * result = NULL;
@@ -435,6 +430,5 @@
         {
             if(feof(fin)) break;
-            sLog.outError("LoadPlayerDump: File read error!");
-            ROLLBACK;
+            ROLLBACK(DUMP_FILE_BROKEN);
         }
 
@@ -450,5 +444,5 @@
         {
             sLog.outError("LoadPlayerDump: Can't extract table name from line: '%s'!", line.c_str());
-            ROLLBACK;
+            ROLLBACK(DUMP_FILE_BROKEN);
         }
 
@@ -467,5 +461,5 @@
         {
             sLog.outError("LoadPlayerDump: Unknown table: '%s'!", tn.c_str());
-            ROLLBACK;
+            ROLLBACK(DUMP_FILE_BROKEN);
         }
 
@@ -474,18 +468,28 @@
         {
             case DTT_CHAR_TABLE:
-                if(!changenth(line, 1, newguid)) ROLLBACK;
+                if(!changenth(line, 1, newguid))
+					ROLLBACK(DUMP_FILE_BROKEN);
                 break;
 
             case DTT_CHARACTER:                             // character t.
             {
-                if(!changenth(line, 1, newguid)) ROLLBACK;
+                if(!changenth(line, 1, newguid))
+					ROLLBACK(DUMP_FILE_BROKEN);
 
                 // guid, data field:guid, items
-                if(!changenth(line, 2, chraccount)) ROLLBACK;
+                if(!changenth(line, 2, chraccount))
+					ROLLBACK(DUMP_FILE_BROKEN);
+
                 std::string vals = getnth(line, 3);
-                if(!changetoknth(vals, OBJECT_FIELD_GUID+1, newguid)) ROLLBACK;
+                if(!changetoknth(vals, OBJECT_FIELD_GUID+1, newguid))
+					ROLLBACK(DUMP_FILE_BROKEN);
+
                 for(uint16 field = PLAYER_FIELD_INV_SLOT_HEAD; field < PLAYER_FARSIGHT; field++)
-                    if(!changetokGuid(vals, field+1, items, objmgr.m_hiItemGuid, true)) ROLLBACK;
-                if(!changenth(line, 3, vals.c_str())) ROLLBACK;
+                    if(!changetokGuid(vals, field+1, items, objmgr.m_hiItemGuid, true))
+						ROLLBACK(DUMP_FILE_BROKEN);
+
+                if(!changenth(line, 3, vals.c_str()))
+					ROLLBACK(DUMP_FILE_BROKEN);
+
                 if (name == "")
                 {
@@ -499,8 +503,10 @@
                         delete result;
                                                             // rename on login: `at_login` field 30 in raw field list
-                        if(!changenth(line, 30, "1")) ROLLBACK;
+                        if(!changenth(line, 30, "1"))
+							ROLLBACK(DUMP_FILE_BROKEN);
                     }
                 }
-                else if(!changenth(line, 4, name.c_str())) ROLLBACK;
+                else if(!changenth(line, 4, name.c_str()))
+					ROLLBACK(DUMP_FILE_BROKEN);
 
                 break;
@@ -508,9 +514,12 @@
             case DTT_INVENTORY:                             // character_inventory t.
             {
-                if(!changenth(line, 1, newguid)) ROLLBACK;
+                if(!changenth(line, 1, newguid))
+					ROLLBACK(DUMP_FILE_BROKEN);
 
                 // bag, item
-                if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid, true)) ROLLBACK;
-                if(!changeGuid(line, 4, items, objmgr.m_hiItemGuid)) ROLLBACK;
+                if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid, true))
+					ROLLBACK(DUMP_FILE_BROKEN);
+				if(!changeGuid(line, 4, items, objmgr.m_hiItemGuid))
+					ROLLBACK(DUMP_FILE_BROKEN);
                 break;
             }
@@ -518,10 +527,16 @@
             {
                 // item, owner, data field:item, owner guid
-                if(!changeGuid(line, 1, items, objmgr.m_hiItemGuid)) ROLLBACK;
-                if(!changenth(line, 2, newguid)) ROLLBACK;
+                if(!changeGuid(line, 1, items, objmgr.m_hiItemGuid))
+					ROLLBACK(DUMP_FILE_BROKEN);
+				if(!changenth(line, 2, newguid))
+					ROLLBACK(DUMP_FILE_BROKEN);
+
                 std::string vals = getnth(line,3);
-                if(!changetokGuid(vals, OBJECT_FIELD_GUID+1, items, objmgr.m_hiItemGuid)) ROLLBACK;
-                if(!changetoknth(vals, ITEM_FIELD_OWNER+1, newguid)) ROLLBACK;
-                if(!changenth(line, 3, vals.c_str())) ROLLBACK;
+                if(!changetokGuid(vals, OBJECT_FIELD_GUID+1, items, objmgr.m_hiItemGuid))
+					ROLLBACK(DUMP_FILE_BROKEN);
+				if(!changetoknth(vals, ITEM_FIELD_OWNER+1, newguid))
+					ROLLBACK(DUMP_FILE_BROKEN);
+				if(!changenth(line, 3, vals.c_str()))
+					ROLLBACK(DUMP_FILE_BROKEN);
                 break;
             }
@@ -529,6 +544,8 @@
             {
                 // guid,item_guid,
-                if(!changenth(line, 1, newguid)) ROLLBACK;
-                if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid)) ROLLBACK;
+                if(!changenth(line, 1, newguid))
+					ROLLBACK(DUMP_FILE_BROKEN);
+				if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid))
+					ROLLBACK(DUMP_FILE_BROKEN);
                 break;
             }
@@ -552,6 +569,8 @@
 
                 // item, entry, owner, ...
-                if(!changenth(line, 1, newpetid)) ROLLBACK;
-                if(!changenth(line, 3, newguid)) ROLLBACK;
+                if(!changenth(line, 1, newpetid))
+					ROLLBACK(DUMP_FILE_BROKEN);
+				if(!changenth(line, 3, newguid))
+					ROLLBACK(DUMP_FILE_BROKEN);
 
                 break;
@@ -563,9 +582,11 @@
                 // lookup currpetid and match to new inserted pet id
                 std::map<uint32, uint32> :: const_iterator petids_iter = petids.find(atoi(currpetid));
-                if(petids_iter == petids.end()) ROLLBACK;   // couldn't find new inserted id
+                if(petids_iter == petids.end())             // couldn't find new inserted id
+					ROLLBACK(DUMP_FILE_BROKEN);
 
                 snprintf(newpetid, 20, "%d", petids_iter->second);
 
-                if(!changenth(line, 1, newpetid)) ROLLBACK;
+                if(!changenth(line, 1, newpetid))
+					ROLLBACK(DUMP_FILE_BROKEN);
 
                 break;
@@ -574,6 +595,8 @@
             {
                 // id,messageType,stationery,sender,receiver
-                if(!changeGuid(line, 1, mails, objmgr.m_mailid)) ROLLBACK;
-                if(!changenth(line, 5, newguid)) ROLLBACK;
+                if(!changeGuid(line, 1, mails, objmgr.m_mailid))
+					ROLLBACK(DUMP_FILE_BROKEN);
+				if(!changenth(line, 5, newguid))
+					ROLLBACK(DUMP_FILE_BROKEN);
                 break;
             }
@@ -581,7 +604,10 @@
             {
                 // mail_id,item_guid,item_template,receiver
-                if(!changeGuid(line, 1, mails, objmgr.m_mailid)) ROLLBACK;
-                if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid)) ROLLBACK;
-                if(!changenth(line, 4, newguid)) ROLLBACK;
+                if(!changeGuid(line, 1, mails, objmgr.m_mailid))
+					ROLLBACK(DUMP_FILE_BROKEN);
+				if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid))
+					ROLLBACK(DUMP_FILE_BROKEN);
+				if(!changenth(line, 4, newguid))
+					ROLLBACK(DUMP_FILE_BROKEN);
                 break;
             }
@@ -591,5 +617,6 @@
         }
 
-        if(!CharacterDatabase.Execute(line.c_str())) ROLLBACK;
+        if(!CharacterDatabase.Execute(line.c_str()))
+			ROLLBACK(DUMP_FILE_BROKEN);
     }
 
@@ -604,4 +631,4 @@
     fclose(fin);
 
-    return true;
-}
+    return DUMP_SUCCESS;
+}
Index: trunk/src/game/Chat.h
===================================================================
--- trunk/src/game/Chat.h (revision 102)
+++ trunk/src/game/Chat.h (revision 112)
@@ -36,4 +36,5 @@
         const char *       Name;
         uint32             SecurityLevel;                   // function pointer required correct align (use uint32)
+        bool               AllowConsole;
         bool (ChatHandler::*Handler)(const char* args);
         std::string        Help;
@@ -62,7 +63,7 @@
         static char* LineFromMessage(char*& pos) { char* start = strtok(pos,"\n"); pos = NULL; return start; }
 
-        const char *GetTrinityString(int32 entry);
-
-        void SendSysMessage(          const char *str);
+        virtual const char *GetTrinityString(int32 entry) const;
+
+        virtual void SendSysMessage(  const char *str);
         void SendSysMessage(          int32     entry);
         void PSendSysMessage(         const char *format, ...) ATTR_PRINTF(2,3);
@@ -72,5 +73,10 @@
 
     protected:
+		explicit ChatHandler() : m_session(NULL) {}      // for CLI subclass
+
         bool hasStringAbbr(const char* name, const char* part);
+
+		virtual bool isAvailable(ChatCommand const& cmd) const;
+
         void SendGlobalSysMessage(const char *str);
 
@@ -81,12 +87,20 @@
         ChatCommand* getCommandTable();
 
+		bool HandleAccountCommand(const char* args);
+		bool HandleAccountCreateCommand(const char* args);
+		bool HandleAccountDeleteCommand(const char* args);
+		bool HandleAccountOnlineListCommand(const char* args);
+		bool HandleAccountSetAddonCommand(const char* args);
+		bool HandleAccountSetGmLevelCommand(const char* args);
+		bool HandleAccountSetPasswordCommand(const char* args);
+
         bool HandleHelpCommand(const char* args);
         bool HandleCommandsCommand(const char* args);
-        bool HandleAcctCommand(const char* args);
         bool HandleStartCommand(const char* args);
         bool HandleInfoCommand(const char* args);
         bool HandleDismountCommand(const char* args);
         bool HandleSaveCommand(const char* args);
-        bool HandleGMListCommand(const char* args);
+        bool HandleGMListIngameCommand(const char* args);
+		bool HandleGMListFullCommand(const char* args);
 
         bool HandleNamegoCommand(const char* args);
@@ -209,4 +223,10 @@
         bool HandleInstanceSaveDataCommand(const char * args);
 
+		bool HandleServerCorpsesCommand(const char* args);
+		bool HandleServerExitCommand(const char* args);
+		bool HandleServerMotdCommand(const char* args);
+		bool HandleServerSetMotdCommand(const char* args);
+		bool HandleServerSetLogLevelCommand(const char* args);
+
         bool HandleAddHonorCommand(const char* args);
         bool HandleHonorAddKillCommand(const char* args);
@@ -258,8 +278,17 @@
         bool HandleListFreezeCommand(const char* args);
 
-        bool HandleBanCommand(const char* args);
-        bool HandleUnBanCommand(const char* args);
-        bool HandleBanInfoCommand(const char* args);
-        bool HandleBanListCommand(const char* args);
+		bool HandleCharacterDeleteCommand(const char* args);
+        bool HandleBanAccountCommand(const char* args);
+		bool HandleBanCharacterCommand(const char* args);
+		bool HandleBanIPCommand(const char* args);
+		bool HandleUnBanAccountCommand(const char* args);
+		bool HandleUnBanCharacterCommand(const char* args);
+		bool HandleUnBanIPCommand(const char* args);
+		bool HandleBanInfoAccountCommand(const char* args);
+		bool HandleBanInfoCharacterCommand(const char* args);
+		bool HandleBanInfoIPCommand(const char* args);
+		bool HandleBanListAccountCommand(const char* args);
+		bool HandleBanListCharacterCommand(const char* args);
+		bool HandleBanListIPCommand(const char* args);
         bool HandleIdleRestartCommand(const char* args);
         bool HandleIdleShutDownCommand(const char* args);
@@ -388,4 +417,5 @@
         bool HandleComeToMeCommand(const char *args);
         bool HandleCombatStopCommand(const char *args);
+		bool HandleSendMessageCommand(const char * args);
         bool HandleFlushArenaPointsCommand(const char *args);
 
@@ -416,18 +446,38 @@
         GameObject* GetObjectGlobalyWithGuidOrNearWithDbGuid(uint32 lowguid,uint32 entry);
 
-        WorldSession * m_session;
-
         // Utility methods for commands
         void ShowTicket(uint64 guid, char const* text, char const* time);
         uint32 GetTicketIDByNum(uint32 num);
         bool LookupPlayerSearchCommand(QueryResult* result, int32 limit);
+		bool HandleBanListHelper(QueryResult* result);
+		bool HandleBanHelper(BanMode mode,char const* args);
+		bool HandleBanInfoHelper(uint32 accountid, char const* accountname);
+		bool HandleUnBanHelper(BanMode mode,char const* args);
 
         void SetSentErrorMessage(bool val){ sentErrorMessage = val;};
     private:
+		WorldSession * m_session;                           // != NULL for chat command call and NULL for CLI command
+
         // common global flag
         static bool load_command_table;
         bool sentErrorMessage;
 };
+
+class CliHandler : public ChatHandler
+{
+	public:
+		typedef void Print(char const*);
+		explicit CliHandler(Print* zprint) : m_print(zprint) {}
+
+		// overwrite functions
+		const char *GetTrinityString(int32 entry) const;
+		bool isAvailable(ChatCommand const& cmd) const;
+		void SendSysMessage(const char *str);
+
+	private:
+		Print* m_print;
+};
+
+char const *fmtstring( char const *format, ... );
+
 #endif
-
-char const *fmtstring( char const *format, ... );
Index: trunk/src/game/Level1.cpp
===================================================================
--- trunk/src/game/Level1.cpp (revision 102)
+++ trunk/src/game/Level1.cpp (revision 112)
@@ -1693,5 +1693,5 @@
 bool ChatHandler::HandleLookupAreaCommand(const char* args)
 {
-    if(!*args)
+    if (!*args)
         return false;
 
@@ -1699,5 +1699,5 @@
     std::wstring wnamepart;
 
-    if(!Utf8toWStr(namepart,wnamepart))
+    if (!Utf8toWStr (namepart,wnamepart))
         return false;
 
@@ -1705,41 +1705,44 @@
 
     // converting string that we try to find to lower case
-    wstrToLower( wnamepart );
+    wstrToLower (wnamepart);
 
     // Search in AreaTable.dbc
-    for (uint32 areaflag = 0; areaflag < sAreaStore.GetNumRows(); ++areaflag)
-    {
-        AreaTableEntry const *areaEntry = sAreaStore.LookupEntry(areaflag);
-        if(areaEntry)
-        {
-            int loc = m_session->GetSessionDbcLocale();
+    for (uint32 areaflag = 0; areaflag < sAreaStore.GetNumRows (); ++areaflag)
+    {
+        AreaTableEntry const *areaEntry = sAreaStore.LookupEntry (areaflag);
+        if (areaEntry)
+        {
+            int loc = m_session ? m_session->GetSessionDbcLocale () : sWorld.GetDefaultDbcLocale();
             std::string name = areaEntry->area_name[loc];
-            if(name.empty())
+            if (name.empty())
                 continue;
 
-            if(!Utf8FitTo(name, wnamepart))
+            if (!Utf8FitTo (name, wnamepart))
             {
                 loc = 0;
                 for(; loc < MAX_LOCALE; ++loc)
                 {
-                    if(loc==m_session->GetSessionDbcLocale())
+                    if (m_session && loc==m_session->GetSessionDbcLocale ())
                         continue;
 
                     name = areaEntry->area_name[loc];
-                    if(name.empty())
+                    if (name.empty ())
                         continue;
 
-                    if (Utf8FitTo(name, wnamepart))
+                    if (Utf8FitTo (name, wnamepart))
                         break;
                 }
             }
 
-            if(loc < MAX_LOCALE)
+            if (loc < MAX_LOCALE)
             {
                 // send area in "id - [name]" format
                 std::ostringstream ss;
-                ss << areaEntry->ID << " - |cffffffff|Harea:" << areaEntry->ID << "|h[" << name << " " << localeNames[loc]<< "]|h|r";
-
-                SendSysMessage(ss.str().c_str());
+                if (m_session)
+					ss << areaEntry->ID << " - |cffffffff|Harea:" << areaEntry->ID << "|h[" << name << " " << localeNames[loc]<< "]|h|r";
+				else
+					ss << areaEntry->ID << " - " << name << " " << localeNames[loc];
+
+                SendSysMessage (ss.str ().c_str());
 
                 ++counter;
@@ -1747,6 +1750,6 @@
         }
     }
-    if (counter == 0)                                       // if counter == 0 then we found nth
-        SendSysMessage(LANG_COMMAND_NOAREAFOUND);
+    if (counter == 0)                                      // if counter == 0 then we found nth
+        SendSysMessage (LANG_COMMAND_NOAREAFOUND);
     return true;
 }
@@ -1761,4 +1764,5 @@
         return false;
     }
+
     char const* str = strtok((char*)args, " ");
     if(!str)
@@ -1774,7 +1778,7 @@
     wstrToLower( wnamepart );
 
-    GameTeleMap const & teleMap = objmgr.GetGameTeleMap();
-
     std::ostringstream reply;
+
+	GameTeleMap const & teleMap = objmgr.GetGameTeleMap();
     for(GameTeleMap::const_iterator itr = teleMap.begin(); itr != teleMap.end(); ++itr)
     {
@@ -1784,9 +1788,8 @@
             continue;
 
-        reply << "  |cffffffff|Htele:";
-        reply << itr->first;
-        reply << "|h[";
-        reply << tele->name;
-        reply << "]|h|r\n";
+        if (m_session)
+			reply << "  |cffffffff|Htele:" << itr->first << "|h[" << tele->name << "]|h|r\n";
+		else
+			reply << "  " << itr->first << " " << tele->name << "\n";
     }
 
@@ -2073,6 +2076,11 @@
         PSendSysMessage(LANG_TELEPORTING_TO, chr->GetName(),"", tele->name.c_str());
 
-        if (m_session->GetPlayer()->IsVisibleGloballyFor(chr))
-            ChatHandler(chr).PSendSysMessage(LANG_TELEPORTED_TO_BY, m_session->GetPlayer()->GetName());
+        if (m_session)
+		{
+			if(m_session->GetPlayer()->IsVisibleGloballyFor(chr))
+				ChatHandler(chr).PSendSysMessage(LANG_TELEPORTED_TO_BY, m_session->GetPlayer()->GetName());
+		}
+		else
+			ChatHandler(chr).SendSysMessage(LANG_TELEPORTED_TO_BY_CONSOLE);
 
         // stop flight if need
Index: trunk/src/game/Level3.cpp
===================================================================
--- trunk/src/game/Level3.cpp (revision 102)
+++ trunk/src/game/Level3.cpp (revision 112)
@@ -53,4 +53,5 @@
 #include "InstanceSaveMgr.h"
 #include "InstanceData.h"
+#include "AccountMgr.h"
 
 //reload commands
@@ -682,5 +683,5 @@
 }
 
-bool ChatHandler::HandleSecurityCommand(const char* args)
+bool ChatHandler::HandleAccountSetGmLevelCommand(const char* args)
 {
     char* arg1 = strtok((char*)args, " ");
@@ -688,48 +689,39 @@
         return false;
 
-    char* arg2 = 0;
-
-    std::string targetName;
+    char* arg2 = strtok(NULL, " ");
+
+    std::string targetAccountName;
     uint32 targetAccountId = 0;
     uint32 targetSecurity = 0;
 
+	/// only target player different from self allowed (if targetPlayer!=NULL then not console)
     Player* targetPlayer = getSelectedPlayer();
-    if(targetPlayer)
-    {
-        targetName = targetPlayer->GetName();
+    if(targetPlayer && m_session->GetPlayer()!=targetPlayer)
+    {
+        /// wrong command syntax or unexpected targeting
+		if(arg2)
+			return false;
+
         targetAccountId = targetPlayer->GetSession()->GetAccountId();
         targetSecurity = targetPlayer->GetSession()->GetSecurity();
-        arg2 = arg1;
+        if(!accmgr.GetName(targetAccountId,targetAccountName))
+		{
+			PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,targetAccountName.c_str());
+			SetSentErrorMessage(true);
+			return false;
+		}
     }
     else
     {
-        targetName = arg1;
-        if(!normalizePlayerName(targetName))
+        targetAccountName = arg1;
+        if(!AccountMgr::normilizeString(targetAccountName))
         {
-            SendSysMessage(LANG_PLAYER_NOT_FOUND);
+            PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,targetAccountName.c_str());
             SetSentErrorMessage(true);
             return false;
         }
 
-        targetPlayer = ObjectAccessor::Instance().FindPlayerByName(targetName.c_str());
-        if(targetPlayer)
-        {
-            targetAccountId = targetPlayer->GetSession()->GetAccountId();
-            targetSecurity = targetPlayer->GetSession()->GetSecurity();
-        }
-        else
-        {
-            uint64 targetGUID = objmgr.GetPlayerGUIDByName(targetName.c_str());
-            if(!targetGUID)
-            {
-                SendSysMessage(LANG_PLAYER_NOT_FOUND);
-                SetSentErrorMessage(true);
-                return false;
-            }
-            targetAccountId = objmgr.GetPlayerAccountIdByGUID(targetGUID);
-            targetSecurity = accmgr.GetSecurity(targetAccountId);
-        }
-
-        arg2 = strtok(NULL, " ");
+        targetAccountId = accmgr.GetId(targetAccountName);
+		targetSecurity = accmgr.GetSecurity(targetAccountId);
     }
 
@@ -742,6 +734,10 @@
     }
 
-    // can set security level only for target with less security and to less security that we have
-    if(targetSecurity >= m_session->GetSecurity() || uint32(gm) >= m_session->GetSecurity() )
+    /// m_session==NULL only for console
+	uint32 plSecurity = m_session ? m_session->GetSecurity() : SEC_CONSOLE;
+
+	/// can set security level only for target with less security and to less security that we have
+	/// This is also reject self apply in fact
+	if(targetSecurity >= plSecurity || uint32(gm) >= plSecurity )
     {
         SendSysMessage(LANG_YOURS_SECURITY_IS_LOW);
@@ -752,14 +748,87 @@
     if(targetPlayer)
     {
-        if( targetPlayer != m_session->GetPlayer() )
-            ChatHandler(targetPlayer).PSendSysMessage(LANG_YOURS_SECURITY_CHANGED,m_session->GetPlayer()->GetName(), gm);
-
+        ChatHandler(targetPlayer).PSendSysMessage(LANG_YOURS_SECURITY_CHANGED,m_session->GetPlayer()->GetName(), gm);
         targetPlayer->GetSession()->SetSecurity(gm);
     }
 
-    PSendSysMessage(LANG_YOU_CHANGE_SECURITY, targetName.c_str(), gm);
+    PSendSysMessage(LANG_YOU_CHANGE_SECURITY, targetAccountName.c_str(), gm);
     loginDatabase.PExecute("UPDATE account SET gmlevel = '%i' WHERE id = '%u'", gm, targetAccountId);
 
     return true;
+}
+
+/// Set password for account
+bool ChatHandler::HandleAccountSetPasswordCommand(const char* args)
+{
+	if(!*args)
+		return false;
+
+	///- Get the command line arguments
+	char *szAccount = strtok ((char*)args," ");
+	char *szPassword1 =  strtok (NULL," ");
+	char *szPassword2 =  strtok (NULL," ");
+
+	if (!szAccount||!szPassword1 || !szPassword2)
+		return false;
+
+	std::string account_name = szAccount;
+	if(!AccountMgr::normilizeString(account_name))
+	{
+		PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+		SetSentErrorMessage(true);
+		return false;
+	}
+
+	uint32 targetAccountId = accmgr.GetId(account_name);
+	if (!targetAccountId)
+	{
+		PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+		SetSentErrorMessage(true);
+		return false;
+	}
+
+	uint32 targetSecurity = accmgr.GetSecurity(targetAccountId);
+
+	/// m_session==NULL only for console
+	uint32 plSecurity = m_session ? m_session->GetSecurity() : SEC_CONSOLE;
+
+	/// can set password only for target with less security
+	/// This is also reject self apply in fact
+	if (targetSecurity >= plSecurity)
+	{
+		SendSysMessage (LANG_YOURS_SECURITY_IS_LOW);
+		SetSentErrorMessage (true);
+		return false;
+	}
+
+	if (strcmp(szPassword1,szPassword2))
+	{
+		SendSysMessage (LANG_NEW_PASSWORDS_NOT_MATCH);
+		SetSentErrorMessage (true);
+		return false;
+	}
+
+	AccountOpResult result = accmgr.ChangePassword(targetAccountId, szPassword1);
+
+	switch(result)
+	{
+		case AOR_OK:
+			SendSysMessage(LANG_COMMAND_PASSWORD);
+			break;
+		case AOR_NAME_NOT_EXIST:
+			PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+			SetSentErrorMessage(true);
+			return false;
+		case AOR_PASS_TOO_LONG:
+			SendSysMessage(LANG_PASSWORD_TOO_LONG);
+			SetSentErrorMessage(true);
+			return false;
+		default:
+			SendSysMessage(LANG_COMMAND_NOTCHANGEPASSWORD);
+			SetSentErrorMessage(true);
+			return false;
+	}
+
+	return true;
 }
 
@@ -1977,8 +2046,14 @@
     if(!cId)
         return false;
+
     uint32 item_id = atol(cId);
-
-    ItemPrototype const* itemProto = item_id ? itemProto = objmgr.GetItemPrototype(item_id) : NULL;
-
+	if(!item_id)
+	{
+		PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, item_id);
+		SetSentErrorMessage(true);
+		return false;
+	}
+
+	ItemPrototype const* itemProto = objmgr.GetItemPrototype(item_id);
     if(!itemProto)
     {
@@ -2136,5 +2211,44 @@
     }
 
-    if(inv_count+mail_count+auc_count == 0)
+    // guild bank case
+	uint32 guild_count = 0;
+	result=CharacterDatabase.PQuery("SELECT COUNT(item_entry) FROM guild_bank_item WHERE item_entry='%u'",item_id);
+	if(result)
+	{
+		guild_count = (*result)[0].GetUInt32();
+		delete result;
+	}
+
+	result=CharacterDatabase.PQuery(
+		//      0             1           2
+		"SELECT gi.item_guid, gi.guildid, guild.name "
+		"FROM guild_bank_item AS gi, guild WHERE gi.item_entry='%u' AND gi.guildid = guild.guildid LIMIT %u ",
+		item_id,uint32(count));
+
+	if(result)
+	{
+		do
+		{
+			Field *fields = result->Fetch();
+			uint32 item_guid = fields[0].GetUInt32();
+			uint32 guild_guid = fields[1].GetUInt32();
+			std::string guild_name = fields[2].GetCppString();
+
+			char const* item_pos = "[in guild bank]";
+
+			PSendSysMessage(LANG_ITEMLIST_GUILD,item_guid,guild_name.c_str(),guild_guid,item_pos);
+		} while (result->NextRow());
+
+		int64 res_count = result->GetRowCount();
+
+		delete result;
+
+		if(count > res_count)
+			count-=res_count;
+		else if(count)
+			count = 0;
+	}
+
+	if(inv_count+mail_count+auc_count+guild_count == 0)
     {
         SendSysMessage(LANG_COMMAND_NOITEMFOUND);
@@ -2143,5 +2257,5 @@
     }
 
-    PSendSysMessage(LANG_COMMAND_LISTITEMMESSAGE,item_id,inv_count+mail_count+auc_count,inv_count,mail_count,auc_count);
+    PSendSysMessage(LANG_COMMAND_LISTITEMMESSAGE,item_id,inv_count+mail_count+auc_count+guild_count,inv_count,mail_count,auc_count,guild_count);
 
     return true;
@@ -2153,5 +2267,5 @@
         return false;
 
-                                                            // number or [name] Shift-click form |color|Hgameobject_entry:go_id|h[name]|h|r
+    // number or [name] Shift-click form |color|Hgameobject_entry:go_id|h[name]|h|r
     char* cId = extractKeyFromLink((char*)args,"Hgameobject_entry");
     if(!cId)
@@ -2159,8 +2273,13 @@
 
     uint32 go_id = atol(cId);
+	if(!go_id)
+	{
+		PSendSysMessage(LANG_COMMAND_LISTOBJINVALIDID, go_id);
+		SetSentErrorMessage(true);
+		return false;
+	}
 
     GameObjectInfo const * gInfo = objmgr.GetGameObjectInfo(go_id);
-
-    if(!go_id || !gInfo)
+	if(!gInfo)
     {
         PSendSysMessage(LANG_COMMAND_LISTOBJINVALIDID, go_id);
@@ -2175,5 +2294,4 @@
         return false;
 
-    Player* pl = m_session->GetPlayer();
     QueryResult *result;
 
@@ -2186,6 +2304,13 @@
     }
 
-    result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM gameobject WHERE id = '%u' ORDER BY order_ ASC LIMIT %u",
-        pl->GetPositionX(), pl->GetPositionY(), pl->GetPositionZ(),go_id,uint32(count));
+    if(m_session)
+	{
+		Player* pl = m_session->GetPlayer();
+		result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM gameobject WHERE id = '%u' ORDER BY order_ ASC LIMIT %u",
+			pl->GetPositionX(), pl->GetPositionY(), pl->GetPositionZ(),go_id,uint32(count));
+	}
+	else
+		result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map FROM gameobject WHERE id = '%u' LIMIT %u",
+		go_id,uint32(count));
 
     if (result)
@@ -2200,5 +2325,8 @@
             int mapid = fields[4].GetUInt16();
 
-            PSendSysMessage(LANG_GO_LIST, guid, guid, gInfo->name, x, y, z, mapid);
+            if (m_session)
+				PSendSysMessage(LANG_GO_LIST_CHAT, guid, guid, gInfo->name, x, y, z, mapid);
+			else
+				PSendSysMessage(LANG_GO_LIST_CONSOLE, guid, gInfo->name, x, y, z, mapid);
         } while (result->NextRow());
 
@@ -2239,5 +2367,5 @@
                 continue;
 
-            PSendSysMessage(LANG_GO_LIST, guid, guid, gInfo->name, x, y, z, mapid);
+            PSendSysMessage(LANG_GO_LIST_CHAT, guid, guid, gInfo->name, x, y, z, mapid);
 
             ++count;
@@ -2294,5 +2422,5 @@
         return false;
 
-                                                            // number or [name] Shift-click form |color|Hcreature_entry:creature_id|h[name]|h|r
+    // number or [name] Shift-click form |color|Hcreature_entry:creature_id|h[name]|h|r
     char* cId = extractKeyFromLink((char*)args,"Hcreature_entry");
     if(!cId)
@@ -2300,8 +2428,13 @@
 
     uint32 cr_id = atol(cId);
+	if(!cr_id)
+	{
+		PSendSysMessage(LANG_COMMAND_INVALIDCREATUREID, cr_id);
+		SetSentErrorMessage(true);
+		return false;
+	}
 
     CreatureInfo const* cInfo = objmgr.GetCreatureTemplate(cr_id);
-
-    if(!cr_id || !cInfo)
+	if(!cInfo)
     {
         PSendSysMessage(LANG_COMMAND_INVALIDCREATUREID, cr_id);
@@ -2316,5 +2449,4 @@
         return false;
 
-    Player* pl = m_session->GetPlayer();
     QueryResult *result;
 
@@ -2327,6 +2459,13 @@
     }
 
-    result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM creature WHERE id = '%u' ORDER BY order_ ASC LIMIT %u",
-        pl->GetPositionX(), pl->GetPositionY(), pl->GetPositionZ(), cr_id,uint32(count));
+    if(m_session)
+	{
+		Player* pl = m_session->GetPlayer();
+		result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM creature WHERE id = '%u' ORDER BY order_ ASC LIMIT %u",
+			pl->GetPositionX(), pl->GetPositionY(), pl->GetPositionZ(), cr_id,uint32(count));
+	}
+	else
+		result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map FROM creature WHERE id = '%u' LIMIT %u",
+			cr_id,uint32(count));
 
     if (result)
@@ -2341,5 +2480,8 @@
             int mapid = fields[4].GetUInt16();
 
-            PSendSysMessage(LANG_CREATURE_LIST, guid, guid, cInfo->Name, x, y, z, mapid);
+            if  (m_session)
+				PSendSysMessage(LANG_CREATURE_LIST_CHAT, guid, guid, cInfo->Name, x, y, z, mapid);
+			else
+				PSendSysMessage(LANG_CREATURE_LIST_CONSOLE, guid, cInfo->Name, x, y, z, mapid);
         } while (result->NextRow());
 
@@ -2374,5 +2516,5 @@
             continue;
 
-        int loc_idx = m_session->GetSessionDbLocaleIndex();
+        int loc_idx = m_session ? m_session->GetSessionDbLocaleIndex() : objmgr.GetDBCLocaleIndex();
         if ( loc_idx >= 0 )
         {
@@ -2386,5 +2528,8 @@
                     if (Utf8FitTo(name, wnamepart))
                     {
-                        PSendSysMessage(LANG_ITEM_LIST, id, id, name.c_str());
+                        if (m_session)
+							PSendSysMessage(LANG_ITEM_LIST_CHAT, id, id, name.c_str());
+						else
+							PSendSysMessage(LANG_ITEM_LIST_CONSOLE, id, name.c_str());
                         ++counter;
                         continue;
@@ -2400,5 +2545,8 @@
         if (Utf8FitTo(name, wnamepart))
         {
-            PSendSysMessage(LANG_ITEM_LIST, id, id, name.c_str());
+            if (m_session)
+				PSendSysMessage(LANG_ITEM_LIST_CHAT, id, id, name.c_str());
+			else
+				PSendSysMessage(LANG_ITEM_LIST_CONSOLE, id, name.c_str());
             ++counter;
         }
@@ -2433,6 +2581,6 @@
         if(set)
         {
-            int loc = m_session->GetSessionDbcLocale();
-            std::string name = set->name[m_session->GetSessionDbcLocale()];
+            int loc = m_session ? m_session->GetSessionDbcLocale() : sWorld.GetDefaultDbcLocale();
+			std::string name = set->name[loc];
             if(name.empty())
                 continue;
@@ -2443,8 +2591,8 @@
                 for(; loc < MAX_LOCALE; ++loc)
                 {
-                    if(loc==m_session->GetSessionDbcLocale())
+                    if(m_session && loc==m_session->GetSessionDbcLocale())
                         continue;
 
-                    name = set->name[m_session->GetSessionDbcLocale()];
+                    name = set->name[loc];
                     if(name.empty())
                         continue;
@@ -2458,5 +2606,8 @@
             {
                 // send item set in "id - [namedlink locale]" format
-                PSendSysMessage(LANG_ITEMSET_LIST,id,id,name.c_str(),localeNames[loc]);
+                if (m_session)
+					PSendSysMessage(LANG_ITEMSET_LIST_CHAT,id,id,name.c_str(),localeNames[loc]);
+				else
+					PSendSysMessage(LANG_ITEMSET_LIST_CONSOLE,id,name.c_str(),localeNames[loc]);
                 ++counter;
             }
@@ -2470,14 +2621,9 @@
 bool ChatHandler::HandleLookupSkillCommand(const char* args)
 {
-    Player* target = getSelectedPlayer();
-    if(!target)
-    {
-        SendSysMessage(LANG_PLAYER_NOT_FOUND);
-        SetSentErrorMessage(true);
-        return false;
-    }
-
-    if(!*args)
-        return false;
+	if (!*args)
+        return false;
+
+	// can be NULL in console call
+	Player* target = getSelectedPlayer();
 
     std::string namepart = args;
@@ -2498,5 +2644,5 @@
         if(skillInfo)
         {
-            int loc = m_session->GetSessionDbcLocale();
+            int loc = m_session ? m_session->GetSessionDbcLocale() : sWorld.GetDefaultDbcLocale();
             std::string name = skillInfo->name[loc];
             if(name.empty())
@@ -2508,5 +2654,5 @@
                 for(; loc < MAX_LOCALE; ++loc)
                 {
-                    if(loc==m_session->GetSessionDbcLocale())
+                    if(m_session && loc==m_session->GetSessionDbcLocale())
                         continue;
 
@@ -2522,6 +2668,13 @@
             if(loc < MAX_LOCALE)
             {
+				char const* knownStr = "";
+				if(target && target->HasSkill(id))
+					knownStr = GetTrinityString(LANG_KNOWN);
+
                 // send skill in "id - [namedlink locale]" format
-                PSendSysMessage(LANG_SKILL_LIST,id,id,name.c_str(),localeNames[loc],(target->HasSkill(id) ? m_session->GetTrinityString(LANG_KNOWN) : ""));
+                if (m_session)
+					PSendSysMessage(LANG_SKILL_LIST_CHAT,id,id,name.c_str(),localeNames[loc],knownStr);
+				else
+					PSendSysMessage(LANG_SKILL_LIST_CONSOLE,id,name.c_str(),localeNames[loc],knownStr);
 
                 ++counter;
@@ -2536,14 +2689,9 @@
 bool ChatHandler::HandleLookupSpellCommand(const char* args)
 {
-    Player* target = getSelectedPlayer();
-    if( !target )
-    {
-        SendSysMessage(LANG_PLAYER_NOT_FOUND);
-        SetSentErrorMessage(true);
-        return false;
-    }
-
-    if(!*args)
-        return false;
+	if (!*args)
+        return false;
+
+	// can be NULL at console call
+	Player* target = getSelectedPlayer();
 
     std::string namepart = args;
@@ -2564,5 +2712,5 @@
         if(spellInfo)
         {
-            int loc = m_session->GetSessionDbcLocale();
+            int loc = m_session ? m_session->GetSessionDbcLocale() : sWorld.GetDefaultDbcLocale();
             std::string name = spellInfo->SpellName[loc];
             if(name.empty())
@@ -2574,5 +2722,5 @@
                 for(; loc < MAX_LOCALE; ++loc)
                 {
-                    if(loc==m_session->GetSessionDbcLocale())
+                    if(m_session && loc==m_session->GetSessionDbcLocale())
                         continue;
 
@@ -2588,5 +2736,5 @@
             if(loc < MAX_LOCALE)
             {
-                bool known = target->HasSpell(id);
+                bool known = target && target->HasSpell(id);
                 bool learn = (spellInfo->Effect[0] == SPELL_EFFECT_LEARN_SPELL);
 
@@ -2595,5 +2743,5 @@
                 bool talent = (telentCost > 0);
                 bool passive = IsPassiveSpell(id);
-                bool active = target->HasAura(id,0) || target->HasAura(id,1) || target->HasAura(id,2);
+                bool active = target && (target->HasAura(id,0) || target->HasAura(id,1) || target->HasAura(id,2));
 
                 // unit32 used to prevent interpreting uint8 as char at output
@@ -2603,5 +2751,8 @@
                 // send spell in "id - [name, rank N] [talent] [passive] [learn] [known]" format
                 std::ostringstream ss;
-                ss << id << " - |cffffffff|Hspell:" << id << "|h[" << name;
+                if (m_session)
+					ss << id << " - |cffffffff|Hspell:" << id << "|h[" << name;
+				else
+					ss << id << " - " << name;
 
                 // include rank in link name
@@ -2609,5 +2760,8 @@
                     ss << GetTrinityString(LANG_SPELL_RANK) << rank;
 
-                ss << " " << localeNames[loc] << "]|h|r";
+                if (m_session)
+					ss << " " << localeNames[loc] << "]|h|r";
+				else
+					ss << " " << localeNames[loc];
 
                 if(talent)
@@ -2635,14 +2789,9 @@
 bool ChatHandler::HandleLookupQuestCommand(const char* args)
 {
-    Player* target = getSelectedPlayer();
-    if( !target )
-    {
-        SendSysMessage(LANG_PLAYER_NOT_FOUND);
-        SetSentErrorMessage(true);
-        return false;
-    }
-
-    if(!*args)
-        return false;
+	if (!*args)
+        return false;
+
+	// can be NULL at console call
+	Player* target = getSelectedPlayer();
 
     std::string namepart = args;
@@ -2662,5 +2811,5 @@
         Quest * qinfo = iter->second;
 
-        int loc_idx = m_session->GetSessionDbLocaleIndex();
+        int loc_idx = m_session ? m_session->GetSessionDbLocaleIndex() : objmgr.GetDBCLocaleIndex();
         if ( loc_idx >= 0 )
         {
@@ -2674,18 +2823,26 @@
                     if (Utf8FitTo(title, wnamepart))
                     {
-                        QuestStatus status = target->GetQuestStatus(qinfo->GetQuestId());
-
                         char const* statusStr = "";
-                        if(status == QUEST_STATUS_COMPLETE)
+
+						if(target)
                         {
-                            if(target->GetQuestRewardStatus(qinfo->GetQuestId()))
-                                statusStr = GetTrinityString(LANG_COMMAND_QUEST_REWARDED);
-                            else
-                                statusStr = GetTrinityString(LANG_COMMAND_QUEST_COMPLETE);
+                            QuestStatus status = target->GetQuestStatus(qinfo->GetQuestId());
+
+							if(status == QUEST_STATUS_COMPLETE)
+							{
+								if(target->GetQuestRewardStatus(qinfo->GetQuestId()))
+									statusStr = GetTrinityString(LANG_COMMAND_QUEST_REWARDED);
+								else
+									statusStr = GetTrinityString(LANG_COMMAND_QUEST_COMPLETE);
+							}
+							else if(status == QUEST_STATUS_INCOMPLETE)
+								statusStr = GetTrinityString(LANG_COMMAND_QUEST_ACTIVE);
                         }
-                        else if(status == QUEST_STATUS_INCOMPLETE)
-                            statusStr = GetTrinityString(LANG_COMMAND_QUEST_ACTIVE);
-
-                        PSendSysMessage(LANG_QUEST_LIST,qinfo->GetQuestId(),qinfo->GetQuestId(),title.c_str(),(status == QUEST_STATUS_COMPLETE ? GetTrinityString(LANG_COMPLETE) : (status == QUEST_STATUS_INCOMPLETE ? GetTrinityString(LANG_ACTIVE) : "") ));
+                        
+						if (m_session)
+							PSendSysMessage(LANG_QUEST_LIST_CHAT,qinfo->GetQuestId(),qinfo->GetQuestId(),title.c_str(),statusStr);
+						else
+							PSendSysMessage(LANG_QUEST_LIST_CONSOLE,qinfo->GetQuestId(),title.c_str(),statusStr);
+
                         ++counter;
                         continue;
@@ -2701,18 +2858,26 @@
         if (Utf8FitTo(title, wnamepart))
         {
-            QuestStatus status = target->GetQuestStatus(qinfo->GetQuestId());
-
             char const* statusStr = "";
-            if(status == QUEST_STATUS_COMPLETE)
+            
+			if(target)
             {
-                if(target->GetQuestRewardStatus(qinfo->GetQuestId()))
-                    statusStr = GetTrinityString(LANG_COMMAND_QUEST_REWARDED);
-                else
-                    statusStr = GetTrinityString(LANG_COMMAND_QUEST_COMPLETE);
+                QuestStatus status = target->GetQuestStatus(qinfo->GetQuestId());
+
+				if(status == QUEST_STATUS_COMPLETE)
+				{
+					if(target->GetQuestRewardStatus(qinfo->GetQuestId()))
+						statusStr = GetTrinityString(LANG_COMMAND_QUEST_REWARDED);
+					else
+						statusStr = GetTrinityString(LANG_COMMAND_QUEST_COMPLETE);
+				}
+				else if(status == QUEST_STATUS_INCOMPLETE)
+					statusStr = GetTrinityString(LANG_COMMAND_QUEST_ACTIVE);
             }
-            else if(status == QUEST_STATUS_INCOMPLETE)
-                statusStr = GetTrinityString(LANG_COMMAND_QUEST_ACTIVE);
-
-            PSendSysMessage(LANG_QUEST_LIST,qinfo->GetQuestId(),qinfo->GetQuestId(), title.c_str(),(status == QUEST_STATUS_COMPLETE ? GetTrinityString(LANG_COMPLETE) : (status == QUEST_STATUS_INCOMPLETE ? GetTrinityString(LANG_ACTIVE) : "") ));
+            
+			if (m_session)
+				PSendSysMessage(LANG_QUEST_LIST_CHAT,qinfo->GetQuestId(),qinfo->GetQuestId(),title.c_str(),statusStr);
+			else
+				PSendSysMessage(LANG_QUEST_LIST_CONSOLE,qinfo->GetQuestId(),title.c_str(),statusStr);
+
             ++counter;
         }
@@ -2727,5 +2892,5 @@
 bool ChatHandler::HandleLookupCreatureCommand(const char* args)
 {
-    if(!*args)
+    if (!*args)
         return false;
 
@@ -2734,30 +2899,34 @@
 
     // converting string that we try to find to lower case
-    if(!Utf8toWStr(namepart,wnamepart))
-        return false;
-
-    wstrToLower(wnamepart);
+    if (!Utf8toWStr (namepart,wnamepart))
+        return false;
+
+    wstrToLower (wnamepart);
 
     uint32 counter = 0;
 
-    for (uint32 id = 0; id< sCreatureStorage.MaxEntry; id++ )
-    {
-        CreatureInfo const* cInfo = sCreatureStorage.LookupEntry<CreatureInfo>(id);
+    for (uint32 id = 0; id< sCreatureStorage.MaxEntry; ++id)
+    {
+        CreatureInfo const* cInfo = sCreatureStorage.LookupEntry<CreatureInfo> (id);
         if(!cInfo)
             continue;
 
-        int loc_idx = m_session->GetSessionDbLocaleIndex();
-        if ( loc_idx >= 0 )
+        int loc_idx = m_session ? m_session->GetSessionDbLocaleIndex() : objmgr.GetDBCLocaleIndex();
+		if (loc_idx >= 0)
         {
-            CreatureLocale const *cl = objmgr.GetCreatureLocale(id);
+            CreatureLocale const *cl = objmgr.GetCreatureLocale (id);
             if (cl)
             {
-                if (cl->Name.size() > loc_idx && !cl->Name[loc_idx].empty())
+                if (cl->Name.size() > loc_idx && !cl->Name[loc_idx].empty ())
                 {
                     std::string name = cl->Name[loc_idx];
 
-                    if (Utf8FitTo(name, wnamepart))
+                    if (Utf8FitTo (name, wnamepart))
                     {
-                        PSendSysMessage(LANG_CREATURE_ENTRY_LIST, id, id, name.c_str());
+                        if (m_session)
+							PSendSysMessage (LANG_CREATURE_ENTRY_LIST_CHAT, id, id, name.c_str ());
+						else
+							PSendSysMessage (LANG_CREATURE_ENTRY_LIST_CONSOLE, id, name.c_str ());
+
                         ++counter;
                         continue;
@@ -2768,10 +2937,13 @@
 
         std::string name = cInfo->Name;
-        if(name.empty())
+        if (name.empty ())
             continue;
 
         if (Utf8FitTo(name, wnamepart))
         {
-            PSendSysMessage(LANG_CREATURE_ENTRY_LIST,id,id,name.c_str());
+            if (m_session)
+				PSendSysMessage (LANG_CREATURE_ENTRY_LIST_CHAT, id, id, name.c_str ());
+			else
+				PSendSysMessage (LANG_CREATURE_ENTRY_LIST_CONSOLE, id, name.c_str ());
             ++counter;
         }
@@ -2779,5 +2951,5 @@
 
     if (counter==0)
-        SendSysMessage(LANG_COMMAND_NOCREATUREFOUND);
+        SendSysMessage (LANG_COMMAND_NOCREATUREFOUND);
 
     return true;
@@ -2806,5 +2978,5 @@
             continue;
 
-        int loc_idx = m_session->GetSessionDbLocaleIndex();
+        int loc_idx = m_session ? m_session->GetSessionDbLocaleIndex() : objmgr.GetDBCLocaleIndex();
         if ( loc_idx >= 0 )
         {
@@ -2818,5 +2990,8 @@
                     if (Utf8FitTo(name, wnamepart))
                     {
-                        PSendSysMessage(LANG_GO_ENTRY_LIST, id, id, name.c_str());
+                        if (m_session)
+							PSendSysMessage(LANG_GO_ENTRY_LIST_CHAT, id, id, name.c_str());
+						else
+							PSendSysMessage(LANG_GO_ENTRY_LIST_CONSOLE, id, name.c_str());
                         ++counter;
                         continue;
@@ -2832,5 +3007,8 @@
         if(Utf8FitTo(name, wnamepart))
         {
-            PSendSysMessage(LANG_GO_ENTRY_LIST, id, id, name.c_str());
+            if (m_session)
+				PSendSysMessage(LANG_GO_ENTRY_LIST_CHAT, id, id, name.c_str());
+			else
+				PSendSysMessage(LANG_GO_ENTRY_LIST_CONSOLE, id, name.c_str());
             ++counter;
         }
@@ -2857,47 +3035,43 @@
         return false;
 
-    Guild *guild;
-    Player * player;
-    char *lname,*gname;
-    std::string guildname;
-
-    lname = strtok((char*)args, " ");
-    gname = strtok(NULL, "");
-
-    if(!lname)
-        return false;
-    else if(!gname)
-    {
-        SendSysMessage(LANG_INSERT_GUILD_NAME);
-        SetSentErrorMessage(true);
-        return false;
-    }
-
-    guildname = gname;
-    player = ObjectAccessor::Instance().FindPlayerByName(lname);
-
-    if(!player)
-    {
-        SendSysMessage(LANG_PLAYER_NOT_FOUND);
-        SetSentErrorMessage(true);
-        return false;
-    }
-
-    if(!player->GetGuildId())
-    {
-        guild = new Guild;
-        if(!guild->create(player->GetGUID(),guildname))
-        {
-            delete guild;
-            SendSysMessage(LANG_GUILD_NOT_CREATED);
-            SetSentErrorMessage(true);
-            return false;
-        }
-
-        objmgr.AddGuild(guild);
-    }
-    else
-        SendSysMessage(LANG_PLAYER_IN_GUILD);
-
+    char *lname = strtok ((char*)args, " ");
+	char *gname = strtok (NULL, "");
+
+    if (!lname)
+        return false;
+    
+	if (!gname)
+    {
+        SendSysMessage (LANG_INSERT_GUILD_NAME);
+		SetSentErrorMessage (true);
+        return false;
+    }
+
+    std::string guildname = gname;
+
+    Player* player = ObjectAccessor::Instance ().FindPlayerByName (lname);
+	if (!player)
+    {
+        SendSysMessage (LANG_PLAYER_NOT_FOUND);
+		SetSentErrorMessage (true);
+        return false;
+    }
+
+    if (player->GetGuildId())
+    {
+        SendSysMessage (LANG_PLAYER_IN_GUILD);
+		return true;
+	}
+
+	Guild *guild = new Guild;
+	if (!guild->create (player->GetGUID (),guildname))
+	{
+		delete guild;
+		SendSysMessage (LANG_GUILD_NOT_CREATED);
+		SetSentErrorMessage (true);
+		return false;
+    }
+    
+	objmgr.AddGuild (guild);
     return true;
 }
@@ -2905,8 +3079,8 @@
 bool ChatHandler::HandleGuildInviteCommand(const char *args)
 {
-    if(!*args)
-        return false;
-
-    char* par1 = strtok((char*)args, " ");
+    if (!*args)
+        return false;
+
+    char* par1 = strtok ((char*)args, " ");
     char* par2 = strtok (NULL, "");
     if(!par1 || !par2)
@@ -2914,27 +3088,27 @@
 
     std::string glName = par2;
-    Guild* targetGuild = objmgr.GetGuildByName(glName);
-    if(!targetGuild)
+    Guild* targetGuild = objmgr.GetGuildByName (glName);
+	if (!targetGuild)
         return false;
 
     std::string plName = par1;
-    if(!normalizePlayerName(plName))
-    {
-        SendSysMessage(LANG_PLAYER_NOT_FOUND);
-        SetSentErrorMessage(true);
+    if (!normalizePlayerName (plName))
+    {
+        SendSysMessage (LANG_PLAYER_NOT_FOUND);
+		SetSentErrorMessage (true);
         return false;
     }
 
     uint64 plGuid = 0;
-    if(Player* targetPlayer = ObjectAccessor::Instance().FindPlayerByName(plName.c_str()))
-        plGuid = targetPlayer->GetGUID();
+    if (Player* targetPlayer = ObjectAccessor::Instance ().FindPlayerByName (plName.c_str ()))
+		plGuid = targetPlayer->GetGUID ();
     else
-        plGuid = objmgr.GetPlayerGUIDByName(plName.c_str());
-
-    if(!plGuid)
+        plGuid = objmgr.GetPlayerGUIDByName (plName.c_str ());
+
+    if (!plGuid)
         false;
 
     // players's guild membership checked in AddMember before add
-    if(!targetGuild->AddMember(plGuid,targetGuild->GetLowestRank()))
+    if (!targetGuild->AddMember (plGuid,targetGuild->GetLowestRank ()))
         return false;
 
@@ -2944,15 +3118,16 @@
 bool ChatHandler::HandleGuildUninviteCommand(const char *args)
 {
-    if(!*args)
-        return false;
-
-    char* par1 = strtok((char*)args, " ");
+    if (!*args)
+        return false;
+
+    char* par1 = strtok ((char*)args, " ");
     if(!par1)
         return false;
+
     std::string plName = par1;
-    if(!normalizePlayerName(plName))
-    {
-        SendSysMessage(LANG_PLAYER_NOT_FOUND);
-        SetSentErrorMessage(true);
+    if (!normalizePlayerName (plName))
+    {
+        SendSysMessage (LANG_PLAYER_NOT_FOUND);
+		SetSentErrorMessage (true);
         return false;
     }
@@ -2960,23 +3135,23 @@
     uint64 plGuid = 0;
     uint32 glId   = 0;
-    if(Player* targetPlayer = ObjectAccessor::Instance().FindPlayerByName(plName.c_str()))
-    {
-        plGuid = targetPlayer->GetGUID();
-        glId   = targetPlayer->GetGuildId();
+    if (Player* targetPlayer = ObjectAccessor::Instance ().FindPlayerByName (plName.c_str ()))
+    {
+        plGuid = targetPlayer->GetGUID ();
+		glId   = targetPlayer->GetGuildId ();
     }
     else
     {
-        plGuid = objmgr.GetPlayerGUIDByName(plName.c_str());
-        glId = Player::GetGuildIdFromDB(plGuid);
-    }
-
-    if(!plGuid || !glId)
-        return false;
-
-    Guild* targetGuild = objmgr.GetGuildById(glId);
-    if(!targetGuild)
-        return false;
-
-    targetGuild->DelMember(plGuid);
+        plGuid = objmgr.GetPlayerGUIDByName (plName.c_str ());
+		glId = Player::GetGuildIdFromDB (plGuid);
+    }
+
+    if (!plGuid || !glId)
+        return false;
+
+    Guild* targetGuild = objmgr.GetGuildById (glId);
+	if (!targetGuild)
+        return false;
+
+    targetGuild->DelMember (plGuid);
 
     return true;
@@ -2985,16 +3160,17 @@
 bool ChatHandler::HandleGuildRankCommand(const char *args)
 {
-    if(!*args)
-        return false;
-
-    char* par1 = strtok((char*)args, " ");
-    char* par2 = strtok(NULL, " ");
-    if(!par1 || !par2)
-        return false;
+    if (!*args)
+        return false;
+
+    char* par1 = strtok ((char*)args, " ");
+	char* par2 = strtok (NULL, " ");
+	if (!par1 || !par2)
+        return false;
+
     std::string plName = par1;
-    if(!normalizePlayerName(plName))
-    {
-        SendSysMessage(LANG_PLAYER_NOT_FOUND);
-        SetSentErrorMessage(true);
+    if (!normalizePlayerName (plName))
+    {
+        SendSysMessage (LANG_PLAYER_NOT_FOUND);
+		SetSentErrorMessage (true);
         return false;
     }
@@ -3002,27 +3178,27 @@
     uint64 plGuid = 0;
     uint32 glId   = 0;
-    if(Player* targetPlayer = ObjectAccessor::Instance().FindPlayerByName(plName.c_str()))
-    {
-        plGuid = targetPlayer->GetGUID();
-        glId   = targetPlayer->GetGuildId();
+    if (Player* targetPlayer = ObjectAccessor::Instance ().FindPlayerByName (plName.c_str ()))
+    {
+        plGuid = targetPlayer->GetGUID ();
+		glId   = targetPlayer->GetGuildId ();
     }
     else
     {
-        plGuid = objmgr.GetPlayerGUIDByName(plName.c_str());
-        glId = Player::GetGuildIdFromDB(plGuid);
-    }
-
-    if(!plGuid || !glId)
-        return false;
-
-    Guild* targetGuild = objmgr.GetGuildById(glId);
-    if(!targetGuild)
-        return false;
-
-    uint32 newrank = uint32(atoi(par2));
-    if(newrank > targetGuild->GetLowestRank())
-        return false;
-
-    targetGuild->ChangeRank(plGuid,newrank);
+        plGuid = objmgr.GetPlayerGUIDByName (plName.c_str ());
+		glId = Player::GetGuildIdFromDB (plGuid);
+    }
+
+    if (!plGuid || !glId)
+        return false;
+
+    Guild* targetGuild = objmgr.GetGuildById (glId);
+	if (!targetGuild)
+        return false;
+
+    uint32 newrank = uint32 (atoi (par2));
+	if (newrank > targetGuild->GetLowestRank ())
+        return false;
+
+    targetGuild->ChangeRank (plGuid,newrank);
 
     return true;
@@ -3031,18 +3207,18 @@
 bool ChatHandler::HandleGuildDeleteCommand(const char* args)
 {
-    if(!*args)
-        return false;
-
-    char* par1 = strtok((char*)args, " ");
-    if(!par1)
+    if (!*args)
+        return false;
+
+    char* par1 = strtok ((char*)args, " ");
+	if (!par1)
         return false;
 
     std::string gld = par1;
 
-    Guild* targetGuild = objmgr.GetGuildByName(gld);
-    if(!targetGuild)
-        return false;
-
-    targetGuild->Disband();
+    Guild* targetGuild = objmgr.GetGuildByName (gld);
+	if (!targetGuild)
+        return false;
+
+    targetGuild->Disband ();
 
     return true;
@@ -3472,9 +3648,4 @@
 }
 
-bool ChatHandler::HandleSpawnTransportCommand(const char* /*args*/)
-{
-    return true;
-}
-
 //play npc emote
 bool ChatHandler::HandlePlayEmoteCommand(const char* args)
@@ -4721,102 +4892,130 @@
 }
 
-bool ChatHandler::HandleBanCommand(const char* args)
-{
-    if(!args)
-        return false;
-
-    char* type = strtok((char*)args, " ");
-
-    if(!type)
-        return false;
-    char* nameOrIP = strtok(NULL, " ");
-
-    if(!nameOrIP)
-        return false;
-
-    char* duration = strtok(NULL," ");
+bool ChatHandler::HandleBanAccountCommand(const char* args)
+{
+    return HandleBanHelper(BAN_ACCOUNT,args);
+}
+
+bool ChatHandler::HandleBanCharacterCommand(const char* args)
+{
+	return HandleBanHelper(BAN_CHARACTER,args);
+}
+
+bool ChatHandler::HandleBanIPCommand(const char* args)
+{
+	return HandleBanHelper(BAN_IP,args);
+}
+
+bool ChatHandler::HandleBanHelper(BanMode mode, const char* args)
+{
+	if(!args)
+        return false;
+
+    char* cnameOrIP = strtok ((char*)args, " ");
+	if (!cnameOrIP)
+        return false;
+
+    std::string nameOrIP = cnameOrIP;
+
+	char* duration = strtok (NULL," ");
     if(!duration || !atoi(duration))
         return false;
 
-    char* reason = strtok(NULL,"");
+    char* reason = strtok (NULL,"");
     if(!reason)
         return false;
 
-    switch(sWorld.BanAccount(type, nameOrIP, duration, reason,m_session->GetPlayerName()))
+    switch(mode)
+	{
+		case BAN_ACCOUNT:
+			if(!AccountMgr::normilizeString(nameOrIP))
+			{
+				PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,nameOrIP.c_str());
+				SetSentErrorMessage(true);
+				return false;
+			}
+			break;
+		case BAN_CHARACTER:
+			if(!normalizePlayerName(nameOrIP))
+			{
+				SendSysMessage(LANG_PLAYER_NOT_FOUND);
+				SetSentErrorMessage(true);
+				return false;
+			}
+			break;
+		case BAN_IP:
+			if(!IsIPAddress(nameOrIP.c_str()))
+				return false;
+			break;
+	}
+
+	switch(sWorld.BanAccount(mode, nameOrIP, duration, reason,m_session ? m_session->GetPlayerName() : ""))
     {
         case BAN_SUCCESS:
             if(atoi(duration)>0)
-                PSendSysMessage(LANG_BAN_YOUBANNED,nameOrIP,secsToTimeString(TimeStringToSecs(duration),true).c_str(),reason);
+                PSendSysMessage(LANG_BAN_YOUBANNED,nameOrIP.c_str(),secsToTimeString(TimeStringToSecs(duration),true).c_str(),reason);
             else
-                PSendSysMessage(LANG_BAN_YOUPERMBANNED,nameOrIP,reason);
+                PSendSysMessage(LANG_BAN_YOUPERMBANNED,nameOrIP.c_str(),reason);
             break;
         case BAN_SYNTAX_ERROR:
             return false;
         case BAN_NOTFOUND:
-            PSendSysMessage(LANG_BAN_NOTFOUND,type,nameOrIP);
-            break;
-    }
-
-    return true;
-}
-
-bool ChatHandler::HandleUnBanCommand(const char* args)
+           switch(mode)
+		   {
+			   default:
+				   PSendSysMessage(LANG_BAN_NOTFOUND,"account",nameOrIP.c_str());
+				   break;
+			   case BAN_CHARACTER:
+				   PSendSysMessage(LANG_BAN_NOTFOUND,"character",nameOrIP.c_str());
+				   break;
+			   case BAN_IP:
+				   PSendSysMessage(LANG_BAN_NOTFOUND,"ip",nameOrIP.c_str());
+				   break;
+
+		   }
+		   SetSentErrorMessage(true);
+		   return false;
+    }
+
+    return true;
+}
+
+bool ChatHandler::HandleUnBanAccountCommand(const char* args)
+{
+    return HandleUnBanHelper(BAN_ACCOUNT,args);
+}
+
+bool ChatHandler::HandleUnBanCharacterCommand(const char* args)
+{
+	return HandleUnBanHelper(BAN_CHARACTER,args);
+}
+
+bool ChatHandler::HandleUnBanIPCommand(const char* args)
+{
+	return HandleUnBanHelper(BAN_IP,args);
+}
+
+bool ChatHandler::HandleUnBanHelper(BanMode mode, const char* args)
 {
     if(!args)
         return false;
-    char* type = strtok((char*)args, " ");
-    if(!type)
-        return false;
-    char* nameOrIP = strtok(NULL, " ");
-
-    if(!nameOrIP)
-        return false;
-
-    if(sWorld.RemoveBanAccount(type,nameOrIP))
-        PSendSysMessage(LANG_UNBAN_UNBANNED,nameOrIP);
-    else
-        PSendSysMessage(LANG_UNBAN_ERROR,nameOrIP);
-
-    return true;
-}
-
-bool ChatHandler::HandleBanInfoCommand(const char* args)
-{
-    if(!args)
-        return false;
-
-    char* cType = strtok((char*)args, " ");
-    char* cnameOrIP = strtok(NULL, "");
-    if(!cType || !cnameOrIP)
+
+    char* cnameOrIP = strtok ((char*)args, " ");
+	if(!cnameOrIP)
         return false;
 
     std::string nameOrIP = cnameOrIP;
-    std::string type = cType;
-    if (!IsIPAddress(cnameOrIP) && type=="ip")
-        return false;
-
-    Field *fields;
-    if(type != "ip")
-    {
-        //look the accountid up
-        uint32 accountid;
-        std::string accountname;
-        if(type == "account")
-        {
-            loginDatabase.escape_string(nameOrIP);
-            QueryResult *result = loginDatabase.PQuery("SELECT id, username FROM account WHERE username = '%s'",nameOrIP.c_str());
-            if (!result)
+    switch(mode)
+    {
+        case BAN_ACCOUNT:
+			if(!AccountMgr::normilizeString(nameOrIP))
             {
-                PSendSysMessage(LANG_BANINFO_NOACCOUNT);
-                return true;
-            }
-            fields = result->Fetch();
-            accountid = fields[0].GetUInt32();
-            accountname = fields[1].GetCppString();
-            delete result;
-        }
-        else if(type == "character")
-        {
-            if(!normalizePlayerName(nameOrIP))
+                PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,nameOrIP.c_str());
+				SetSentErrorMessage(true);
+				return false;
+			}
+			break;
+		case BAN_CHARACTER:
+			if(!normalizePlayerName(nameOrIP))
             {
                 SendSysMessage(LANG_PLAYER_NOT_FOUND);
@@ -4824,133 +5023,337 @@
                 return false;
             }
-
-            accountid = objmgr.GetPlayerAccountIdByPlayerName (nameOrIP);
-            if (!accountid)
-            {
-                PSendSysMessage(LANG_BANINFO_NOCHARACTER);
-                return true;
-            }
-            
-            if (!accmgr.GetName (accountid,accountname))
-            {
-                PSendSysMessage(LANG_BANINFO_NOCHARACTER);
-                return true;
-            }
-        }
-        else
-            return false;
-
-        QueryResult *result = loginDatabase.PQuery("SELECT FROM_UNIXTIME(bandate), unbandate-bandate, active, unbandate,banreason,bannedby FROM account_banned WHERE id = '%u' ORDER BY bandate ASC",accountid);
-        if(!result)
+			break;
+		case BAN_IP:
+			if(!IsIPAddress(nameOrIP.c_str()))
+				return false;
+			break;
+	}
+
+	if(sWorld.RemoveBanAccount(mode,nameOrIP))
+		PSendSysMessage(LANG_UNBAN_UNBANNED,nameOrIP.c_str());
+	else
+		PSendSysMessage(LANG_UNBAN_ERROR,nameOrIP.c_str());
+
+	return true;
+}
+
+bool ChatHandler::HandleBanInfoAccountCommand(const char* args)
+{
+	if(!args)
+		return false;
+
+	char* cname = strtok((char*)args, "");
+	if(!cname)
+		return false;
+
+	std::string account_name = cname;
+	if(!AccountMgr::normilizeString(account_name))
+	{
+		PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+		SetSentErrorMessage(true);
+		return false;
+    }
+    
+	uint32 accountid = accmgr.GetId(account_name);
+	if(!accountid)
+    {
+        PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+		return true;
+    }
+    
+	return HandleBanInfoHelper(accountid,account_name.c_str());
+}
+
+bool ChatHandler::HandleBanInfoCharacterCommand(const char* args)
+{
+    if(!args)
+        return false;
+
+    char* cname = strtok ((char*)args, "");
+	if(!cname)
+        return false;
+
+    std::string name = cname;
+	if(!normalizePlayerName(name))
+	{
+		SendSysMessage(LANG_PLAYER_NOT_FOUND);
+		SetSentErrorMessage(true);
+		return false;
+	}
+
+    uint32 accountid = objmgr.GetPlayerAccountIdByPlayerName(name);
+	if(!accountid)
+    {
+        SendSysMessage(LANG_PLAYER_NOT_FOUND);
+		SetSentErrorMessage(true);
+		return false;
+	}
+
+	std::string accountname;
+	if(!accmgr.GetName(accountid,accountname))
+	{
+		PSendSysMessage(LANG_BANINFO_NOCHARACTER);
+        return true;
+    }
+    
+	return HandleBanInfoHelper(accountid,accountname.c_str());
+}
+
+bool ChatHandler::HandleBanInfoHelper(uint32 accountid, char const* accountname)
+{
+	QueryResult *result = loginDatabase.PQuery("SELECT FROM_UNIXTIME(bandate), unbandate-bandate, active, unbandate,banreason,bannedby FROM account_banned WHERE id = '%u' ORDER BY bandate ASC",accountid);
+	if(!result)
+    {
+        PSendSysMessage(LANG_BANINFO_NOACCOUNTBAN, accountname);
+		return true;
+    }
+    
+	PSendSysMessage(LANG_BANINFO_BANHISTORY,accountname);
+	do
+    {
+        Field* fields = result->Fetch();
+
+		time_t unbandate = time_t(fields[3].GetUInt64());
+		bool active = false;
+		if(fields[2].GetBool() && (fields[1].GetUInt64() == (uint64)0 ||unbandate >= time(NULL)) )
+			active = true;
+		bool permanent = (fields[1].GetUInt64() == (uint64)0);
+		std::string bantime = permanent?GetTrinityString(LANG_BANINFO_INFINITE):secsToTimeString(fields[1].GetUInt64(), true);
+		PSendSysMessage(LANG_BANINFO_HISTORYENTRY,
+			fields[0].GetString(), bantime.c_str(), active ? GetTrinityString(LANG_BANINFO_YES):GetTrinityString(LANG_BANINFO_NO), fields[4].GetString(), fields[5].GetString());
+	}while (result->NextRow());
+
+	delete result;
+	return true;
+}
+
+bool ChatHandler::HandleBanInfoIPCommand(const char* args)
+{
+	if(!args)
+		return false;
+
+	char* cIP = strtok ((char*)args, "");
+	if(!cIP)
+		return false;
+
+	if (!IsIPAddress(cIP))
+		return false;
+
+	std::string IP = cIP;
+
+	loginDatabase.escape_string(IP);
+	QueryResult *result = loginDatabase.PQuery("SELECT ip, FROM_UNIXTIME(bandate), FROM_UNIXTIME(unbandate), unbandate-UNIX_TIMESTAMP(), banreason,bannedby,unbandate-bandate FROM ip_banned WHERE ip = '%s'",IP.c_str());
+	if(!result)
+	{
+		PSendSysMessage(LANG_BANINFO_NOIP);
+		return true;
+    }
+    
+	Field *fields = result->Fetch();
+	bool permanent = !fields[6].GetUInt64();
+	PSendSysMessage(LANG_BANINFO_IPENTRY,
+		fields[0].GetString(), fields[1].GetString(), permanent ? GetTrinityString(LANG_BANINFO_NEVER):fields[2].GetString(),
+		permanent ? GetTrinityString(LANG_BANINFO_INFINITE):secsToTimeString(fields[3].GetUInt64(), true).c_str(), fields[4].GetString(), fields[5].GetString());
+	delete result;
+	return true;
+}
+
+bool ChatHandler::HandleBanListCharacterCommand(const char* args)
+{
+	loginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
+
+	char* cFilter = strtok ((char*)args, " ");
+	if(!cFilter)
+        return false;
+
+	std::string filter = cFilter;
+	loginDatabase.escape_string(filter);
+	QueryResult* result = CharacterDatabase.PQuery("SELECT account FROM characters WHERE name "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"),filter.c_str());
+	if (!result)
+	{
+		PSendSysMessage(LANG_BANLIST_NOCHARACTER);
+		return true;
+	}
+
+	return HandleBanListHelper(result);
+}
+
+bool ChatHandler::HandleBanListAccountCommand(const char* args)
+{
+	loginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
+
+	char* cFilter = strtok((char*)args, " ");
+	std::string filter = cFilter ? cFilter : "";
+	loginDatabase.escape_string(filter);
+
+	QueryResult* result;
+
+	if(filter.empty())
+	{
+		 result = loginDatabase.Query("SELECT account.id, username FROM account, account_banned"
+			 " WHERE account.id = account_banned.id AND active = 1 GROUP BY account.id");
+	}
+	else
+	{
+		result = loginDatabase.PQuery("SELECT account.id, username FROM account, account_banned"
+			" WHERE account.id = account_banned.id AND active = 1 AND username "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'")" GROUP BY account.id",
+			filter.c_str());
+	}
+
+	if (!result)
+	{
+		PSendSysMessage(LANG_BANLIST_NOACCOUNT);
+		return true;
+	}
+
+	return HandleBanListHelper(result);
+}
+
+bool ChatHandler::HandleBanListHelper(QueryResult* result)
+{
+    PSendSysMessage(LANG_BANLIST_MATCHINGACCOUNT);
+    
+	// Chat short output
+	if(m_session)
+    {
+        do
+		{
+			Field* fields = result->Fetch();
+			uint32 accountid = fields[0].GetUInt32();
+
+			QueryResult* banresult = loginDatabase.PQuery("SELECT account.username FROM account,account_banned WHERE account_banned.id='%u' AND account_banned.id=account.id",accountid);
+			if(banresult)
+			{
+				Field* fields2 = banresult->Fetch();
+				PSendSysMessage("%s",fields2[0].GetString());
+				delete banresult;
+			}
+		} while (result->NextRow());
+	}
+	// Console wide output
+	else
+	{
+		SendSysMessage(LANG_BANLIST_ACCOUNTS);
+		SendSysMessage("===============================================================================");
+		SendSysMessage(LANG_BANLIST_ACCOUNTS_HEADER);
+		do
+		{
+			SendSysMessage("-------------------------------------------------------------------------------");
+			Field *fields = result->Fetch();
+			uint32 account_id = fields[0].GetUInt32 ();
+
+			std::string account_name;
+
+			// "account" case, name can be get in same quary
+			if(result->GetFieldCount() > 1)
+				account_name = fields[1].GetCppString();
+			// "character" case, name need extract from another DB
+			else
+				accmgr.GetName (account_id,account_name);
+
+			// No SQL injection. id is uint32.
+			QueryResult *banInfo = loginDatabase.PQuery("SELECT bandate,unbandate,bannedby,banreason FROM account_banned WHERE id = %u ORDER BY unbandate", account_id);
+			if (banInfo)
+			{
+				Field *fields2 = banInfo->Fetch();
+				do
+				{
+					time_t t_ban = fields2[0].GetUInt64();
+					tm* aTm_ban = localtime(&t_ban);
+
+					if (fields2[0].GetUInt64() == fields2[1].GetUInt64())
+					{
+						PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d|   permanent  |%-15.15s|%-15.15s|",
+							account_name.c_str(),aTm_ban->tm_year%100, aTm_ban->tm_mon+1, aTm_ban->tm_mday, aTm_ban->tm_hour, aTm_ban->tm_min,
+							fields2[2].GetString(),fields2[3].GetString());
+					}
+					else
+					{
+						time_t t_unban = fields2[1].GetUInt64();
+						tm* aTm_unban = localtime(&t_unban);
+						PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d|%02d-%02d-%02d %02d:%02d|%-15.15s|%-15.15s|",
+							account_name.c_str(),aTm_ban->tm_year%100, aTm_ban->tm_mon+1, aTm_ban->tm_mday, aTm_ban->tm_hour, aTm_ban->tm_min,
+							aTm_unban->tm_year%100, aTm_unban->tm_mon+1, aTm_unban->tm_mday, aTm_unban->tm_hour, aTm_unban->tm_min,
+							fields2[2].GetString(),fields2[3].GetString());
+					}
+				}while ( banInfo->NextRow() );
+				delete banInfo;
+			}
+		}while( result->NextRow() );
+		SendSysMessage("===============================================================================");
+	}
+
+	delete result;
+	return true;
+}
+
+bool ChatHandler::HandleBanListIPCommand(const char* args)
+{
+	loginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
+
+	char* cFilter = strtok((char*)args, " ");
+	std::string filter = cFilter ? cFilter : "";
+	loginDatabase.escape_string(filter);
+
+	QueryResult* result;
+
+	if(filter.empty())
+	{
+		result = loginDatabase.Query ("SELECT ip,bandate,unbandate,bannedby,banreason FROM ip_banned"
+			" WHERE (bandate=unbandate OR unbandate>UNIX_TIMESTAMP())"
+			" ORDER BY unbandate" );
+	}
+	else
+	{
+		result = loginDatabase.PQuery( "SELECT ip,bandate,unbandate,bannedby,banreason FROM ip_banned"
+			" WHERE (bandate=unbandate OR unbandate>UNIX_TIMESTAMP()) AND ip "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'")
+			" ORDER BY unbandate",filter.c_str() );
+	}
+
+	if(!result)
+	{
+		PSendSysMessage(LANG_BANLIST_NOIP);
+		return true;
+	}
+
+	PSendSysMessage(LANG_BANLIST_MATCHINGIP);
+	// Chat short output
+	if(m_session)
+	{
+		do
+		{
+			Field* fields = result->Fetch();
+			PSendSysMessage("%s",fields[0].GetString());
+		}while (result->NextRow());
+	}
+	// Console wide output
+	else
+	{
+		SendSysMessage(LANG_BANLIST_IPS);SendSysMessage("===============================================================================");
+		SendSysMessage(LANG_BANLIST_IPS_HEADER);
+		do
         {
-            PSendSysMessage(LANG_BANINFO_NOACCOUNTBAN, accountname.c_str());
-            return true;
-        }
-
-        PSendSysMessage(LANG_BANINFO_BANHISTORY,accountname.c_str());
-        do
-        {
-            fields = result->Fetch();
-
-            time_t unbandate = time_t(fields[3].GetUInt64());
-            bool active = false;
-            if(fields[2].GetBool() && (fields[1].GetUInt64() == (uint64)0 ||unbandate >= time(NULL)) )
-                active = true;
-            bool permanent = (fields[1].GetUInt64() == (uint64)0);
-            std::string bantime = permanent?GetTrinityString(LANG_BANINFO_INFINITE):secsToTimeString(fields[1].GetUInt64(), true);
-            PSendSysMessage(LANG_BANINFO_HISTORYENTRY,
-                fields[0].GetString(), bantime.c_str(), active ? GetTrinityString(LANG_BANINFO_YES):GetTrinityString(LANG_BANINFO_NO), fields[4].GetString(), fields[5].GetString());
-        }while (result->NextRow());
-
-        delete result;
-    }
-    else
-    {
-        loginDatabase.escape_string(nameOrIP);
-        QueryResult *result = loginDatabase.PQuery("SELECT ip, FROM_UNIXTIME(bandate), FROM_UNIXTIME(unbandate), unbandate-UNIX_TIMESTAMP(), banreason,bannedby,unbandate-bandate FROM ip_banned WHERE ip = '%s'",nameOrIP.c_str());
-        if(!result)
-        {
-            PSendSysMessage(LANG_BANINFO_NOIP);
-            return true;
-        }
-        fields = result->Fetch();
-        bool permanent = (fields[6].GetUInt64()==(uint64)0);
-        PSendSysMessage(LANG_BANINFO_IPENTRY,
-            fields[0].GetString(), fields[1].GetString(), permanent ? GetTrinityString(LANG_BANINFO_NEVER):fields[2].GetString(),
-            permanent ? GetTrinityString(LANG_BANINFO_INFINITE):secsToTimeString(fields[3].GetUInt64(), true).c_str(), fields[4].GetString(), fields[5].GetString());
-        delete result;
-    }
-    return true;
-}
-
-bool ChatHandler::HandleBanListCommand(const char* args)
-{
-    loginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
-    if(!*args)
-        return false;
-    char* cType = strtok((char*)args, " ");
-    char* cFilter = strtok(NULL, "");
-    if(!cType || !cFilter)
-        return false;
-    std::string Filter = cFilter;
-    std::string Type = cType;
-    loginDatabase.escape_string(Filter);
-
-    QueryResult* result  = NULL;
-    Field *fields = NULL;
-    if(Type == "ip")
-    {
-        result = loginDatabase.PQuery("SELECT ip FROM ip_banned WHERE ip "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"),Filter.c_str());
-        if(!result)
-        {
-            PSendSysMessage(LANG_BANLIST_NOIP);
-            return true;
-        }
-        PSendSysMessage(LANG_BANLIST_MATCHINGIP);
-        do
-        {
-            fields = result->Fetch();
-            PSendSysMessage("%s",fields[0].GetString());
-        } while (result->NextRow());
-
-        delete result;
-        return true;
-    }
-    //lookup accountid
-    if(Type == "account")
-    {
-        result = loginDatabase.PQuery("SELECT id FROM account WHERE username "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"),Filter.c_str());
-        if (!result)
-        {
-            PSendSysMessage(LANG_BANLIST_NOACCOUNT);
-            return true;
-        }
-        //do not delete result
-    }
-    else if(Type == "characters")
-    {
-        result = CharacterDatabase.PQuery("SELECT account FROM characters, WHERE name "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"),Filter.c_str());
-        if (!result)
-        {
-            PSendSysMessage(LANG_BANLIST_NOCHARACTER);
-            return true;
-        }
-    }
-    else
-        return false;
-
-    PSendSysMessage(LANG_BANLIST_MATCHINGACCOUNT);
-    do
-    {
-        fields = result->Fetch();
-        uint32 accountid = fields[0].GetUInt32();
-        QueryResult* banresult = loginDatabase.PQuery("SELECT account.username FROM account,account_banned WHERE account_banned.id='%u' AND account_banned.active = '1' AND account_banned.id=account.id",accountid);
-        if(banresult)
-        {
-            Field* fields2 = banresult->Fetch();
-            PSendSysMessage("%s",fields2[0].GetString());
-            delete banresult;
-        }
-    } while (result->NextRow());
+            SendSysMessage("-------------------------------------------------------------------------------");
+			Field *fields = result->Fetch();
+			time_t t_ban = fields[1].GetUInt64();
+			tm* aTm_ban = localtime(&t_ban);
+			if ( fields[1].GetUInt64() == fields[2].GetUInt64() )
+			{
+				PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d|   permanent  |%-15.15s|%-15.15s|",
+					fields[0].GetString(), aTm_ban->tm_year%100, aTm_ban->tm_mon+1, aTm_ban->tm_mday, aTm_ban->tm_hour, aTm_ban->tm_min,
+					fields[3].GetString(), fields[4].GetString());
+			}
+			else
+			{
+				time_t t_unban = fields[2].GetUInt64();
+				tm* aTm_unban = localtime(&t_unban);
+				PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d|%02d-%02d-%02d %02d:%02d|%-15.15s|%-15.15s|",
+					fields[0].GetString(), aTm_ban->tm_year%100, aTm_ban->tm_mon+1, aTm_ban->tm_mday, aTm_ban->tm_hour, aTm_ban->tm_min,
+					aTm_unban->tm_year%100, aTm_unban->tm_mon+1, aTm_unban->tm_mday, aTm_unban->tm_hour, aTm_unban->tm_min,
+					fields[3].GetString(), fields[4].GetString());
+			}
+		}while( result->NextRow() );
+		SendSysMessage("===============================================================================");
+    }
 
     delete result;
@@ -5013,35 +5416,109 @@
 bool ChatHandler::HandleLoadPDumpCommand(const char *args)
 {
-    if(!args)
-        return false;
-
-    char * file = strtok((char*)args, " "); if(!file) return false;
-    char * acc = strtok(NULL, " "); if(!acc) return false;
-    if(!file || !acc)
-        return false;
-
-    uint32 account_id = accmgr.GetId(acc);
+    if (!args)
+        return false;
+
+    char * file = strtok((char*)args, " ");
+	if(!file)
+		return false;
+
+	char * account = strtok(NULL, " ");
+	if(!account)
+		return false;
+
+	std::string account_name = account;
+	if(!AccountMgr::normilizeString(account_name))
+	{
+		PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+		SetSentErrorMessage(true);
+        return false;
+	}
+
+    uint32 account_id = accmgr.GetId(account_name);
     if(!account_id)
     {
-        account_id = atoi(acc);
-        if(account_id)
+        account_id = atoi(account);                             // use original string
+        if(!account_id)
         {
-            std::string acc_name;
-            if(!accmgr.GetName(account_id,acc_name))
-                return false;
+            PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+			SetSentErrorMessage(true);
+			return false;
         }
-        else
+	}
+
+	if(!accmgr.GetName(account_id,account_name))
+	{
+		PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+		SetSentErrorMessage(true);
+		return false;
+	}
+
+	char* guid_str = NULL;
+	char* name_str = strtok(NULL, " ");
+
+	std::string name;
+	if(name_str)
+	{
+		name = name_str;
+		// normalize the name if specified and check if it exists
+		if(!normalizePlayerName(name))
+		{
+			PSendSysMessage(LANG_INVALID_CHARACTER_NAME);
+			SetSentErrorMessage(true);
+			return false;
+		}
+
+		if(!ObjectMgr::IsValidName(name,true))
+		{
+			PSendSysMessage(LANG_INVALID_CHARACTER_NAME);
+			SetSentErrorMessage(true);
             return false;
-    }
-
-    char * name = strtok(NULL, " ");
-    char * guid_str = name ? strtok(NULL, " ") : NULL;
-
-    uint32 guid = guid_str ? atoi(guid_str) : 0;
-
-    if(PlayerDumpReader().LoadDump(file, account_id, name ? name : "", guid))
-        PSendSysMessage(LANG_COMMAND_IMPORT_SUCCESS);
-    else
-        PSendSysMessage(LANG_COMMAND_IMPORT_FAILED);
+		}
+
+		guid_str = strtok(NULL, " ");
+    }
+
+    uint32 guid = 0;
+
+    if(guid_str)
+	{
+		guid = atoi(guid_str);
+		if(!guid)
+		{
+			PSendSysMessage(LANG_INVALID_CHARACTER_GUID);
+			SetSentErrorMessage(true);
+			return false;
+		}
+		
+		if(objmgr.GetPlayerAccountIdByGUID(guid))
+		{
+			PSendSysMessage(LANG_CHARACTER_GUID_IN_USE,guid);
+			SetSentErrorMessage(true);
+			return false;
+		}
+	}
+
+	switch(PlayerDumpReader().LoadDump(file, account_id, name, guid))
+	{
+		case DUMP_SUCCESS:
+			PSendSysMessage(LANG_COMMAND_IMPORT_SUCCESS);
+			break;
+		case DUMP_FILE_OPEN_ERROR:
+			PSendSysMessage(LANG_FILE_OPEN_FAIL,file);
+			SetSentErrorMessage(true);
+			return false;
+		case DUMP_FILE_BROKEN:
+			PSendSysMessage(LANG_DUMP_BROKEN,file);
+			SetSentErrorMessage(true);
+			return false;
+		case DUMP_TOO_MANY_CHARS:
+			PSendSysMessage(LANG_ACCOUNT_CHARACTER_LIST_FULL,account_name,account_id);
+			SetSentErrorMessage(true);
+			return false;
+		default:
+			PSendSysMessage(LANG_COMMAND_IMPORT_FAILED);
+			SetSentErrorMessage(true);
+			return false;
+	}
 
     return true;
@@ -5087,8 +5564,25 @@
         guid = atoi(p2);
 
-    if (PlayerDumpWriter().WriteDump(file, guid))
-        PSendSysMessage(LANG_COMMAND_EXPORT_SUCCESS);
-    else
-        PSendSysMessage(LANG_COMMAND_EXPORT_FAILED);
+    if(!objmgr.GetPlayerAccountIdByGUID(guid))
+	{
+		PSendSysMessage(LANG_PLAYER_NOT_FOUND);
+		SetSentErrorMessage(true);
+		return false;
+	}
+
+	switch(PlayerDumpWriter().WriteDump(file, guid))
+	{
+		case DUMP_SUCCESS:
+			PSendSysMessage(LANG_COMMAND_EXPORT_SUCCESS);
+			break;
+		case DUMP_FILE_OPEN_ERROR:
+			PSendSysMessage(LANG_FILE_OPEN_FAIL,file);
+			SetSentErrorMessage(true);
+			return false;
+		default:
+			PSendSysMessage(LANG_COMMAND_EXPORT_FAILED);
+			SetSentErrorMessage(true);
+			return false;
+	}
 
     return true;
@@ -5574,4 +6068,133 @@
 }
 
+/// Display the list of GMs
+bool ChatHandler::HandleGMListFullCommand(const char* /*args*/)
+{
+	///- Get the accounts with GM Level >0
+	QueryResult *result = loginDatabase.Query( "SELECT username,gmlevel FROM account WHERE gmlevel > 0" );
+	if(result)
+	{
+		SendSysMessage(LANG_GMLIST);
+		SendSysMessage("========================");
+		SendSysMessage(LANG_GMLIST_HEADER);
+		SendSysMessage("========================");
+
+		///- Circle through them. Display username and GM level
+		do
+		{
+			Field *fields = result->Fetch();
+			PSendSysMessage("|%15s|%6s|", fields[0].GetString(),fields[1].GetString());
+		} while( result->NextRow() );
+
+		PSendSysMessage("========================");
+		delete result;
+	}
+	else
+		PSendSysMessage(LANG_GMLIST_EMPTY);
+	return true;
+}
+
+/// Define the 'Message of the day' for the realm
+bool ChatHandler::HandleServerSetMotdCommand(const char* args)
+{
+	sWorld.SetMotd(args);
+	PSendSysMessage(LANG_MOTD_NEW, args);
+	return true;
+}
+
+/// Set/Unset the expansion level for an account
+bool ChatHandler::HandleAccountSetAddonCommand(const char* args)
+{
+	///- Get the command line arguments
+	char *szAcc = strtok((char*)args," ");
+	char *szExp = strtok(NULL," ");
+
+	if(!szAcc)
+		return false;
+
+	std::string account_name;
+	uint32 account_id;
+
+	if(!szExp)
+	{
+		Player* player = getSelectedPlayer();
+		if(!player)
+			return false;
+
+		account_id = player->GetSession()->GetAccountId();
+		accmgr.GetName(account_id,account_name);
+		szExp = szAcc;
+	}
+	else
+	{
+		///- Convert Account name to Upper Format
+		account_name = szAcc;
+		if(!AccountMgr::normilizeString(account_name))
+		{
+			PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+			SetSentErrorMessage(true);
+			return false;
+		}
+
+		account_id = accmgr.GetId(account_name);
+		if(!account_id)
+		{
+			PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+			SetSentErrorMessage(true);
+			return false;
+		}
+	}
+
+	int lev=atoi(szExp);                                    //get int anyway (0 if error)
+	if(lev < 0)
+		return false;
+
+	// No SQL injection
+	loginDatabase.PExecute("UPDATE account SET expansion = '%d' WHERE id = '%u'",lev,account_id);
+	PSendSysMessage(LANG_ACCOUNT_SETADDON,account_name.c_str(),account_id,lev);
+	return true;
+}
+
+/// Send a message to a player in game
+bool ChatHandler::HandleSendMessageCommand(const char* args)
+{
+	///- Get the command line arguments
+	char* name_str = strtok((char*)args, " ");
+	char* msg_str = strtok(NULL, "");
+
+	if(!name_str || !msg_str)
+		return false;
+
+	std::string name = name_str;
+
+	if(!normalizePlayerName(name))
+		return false;
+
+	///- Find the player and check that he is not logging out.
+	Player *rPlayer = objmgr.GetPlayer(name.c_str());
+	if(!rPlayer)
+	{
+		SendSysMessage(LANG_PLAYER_NOT_FOUND);
+		SetSentErrorMessage(true);
+		return false;
+	}
+
+	if(rPlayer->GetSession()->isLogingOut())
+	{
+		SendSysMessage(LANG_PLAYER_NOT_FOUND);
+		SetSentErrorMessage(true);
+		return false;
+	}
+
+	///- Send the message
+	//Use SendAreaTriggerMessage for fastest delivery.
+	rPlayer->GetSession()->SendAreaTriggerMessage("%s", msg_str);
+	rPlayer->GetSession()->SendAreaTriggerMessage("|cffff0000[Message from administrator]:|r");
+
+	//Confirmation message
+	PSendSysMessage(LANG_SENDMESSAGE,name.c_str(),msg_str);
+	return true;
+}
+
 bool ChatHandler::HandleFreezeCommand(const char *args)
 {
Index: trunk/src/game/Chat.cpp
===================================================================
--- trunk/src/game/Chat.cpp (revision 102)
+++ trunk/src/game/Chat.cpp (revision 112)
@@ -39,452 +39,504 @@
 ChatCommand * ChatHandler::getCommandTable()
 {
+	static ChatCommand accountSetCommandTable[] =
+	{
+		{ "addon",          SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleAccountSetAddonCommand,     "", NULL },
+		{ "gmlevel",        SEC_CONSOLE,        true,  &ChatHandler::HandleAccountSetGmLevelCommand,   "", NULL },
+		{ "password",       SEC_CONSOLE,        true,  &ChatHandler::HandleAccountSetPasswordCommand,  "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
+	};
+
+	static ChatCommand accountCommandTable[] =
+	{
+		{ "create",         SEC_CONSOLE,        true,  &ChatHandler::HandleAccountCreateCommand,       "", NULL },
+		{ "delete",         SEC_CONSOLE,        true,  &ChatHandler::HandleAccountDeleteCommand,       "", NULL },
+		{ "onlinelist",     SEC_CONSOLE,        true,  &ChatHandler::HandleAccountOnlineListCommand,   "", NULL },
+		{ "set",            SEC_ADMINISTRATOR,  true,  NULL,                                           "", accountSetCommandTable },
+		{ "",               SEC_PLAYER,         false, &ChatHandler::HandleAccountCommand,             "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
+	};
+
+	static ChatCommand serverSetCommandTable[] =
+	{
+		{ "loglevel",       SEC_CONSOLE,        true,  &ChatHandler::HandleServerSetLogLevelCommand,   "", NULL },
+		{ "motd",           SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleServerSetMotdCommand,       "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
+	};
+
     static ChatCommand serverCommandTable[] =
     {
-        { "idlerestart",    SEC_ADMINISTRATOR,  &ChatHandler::HandleIdleRestartCommand,         "", NULL },
-        { "idleshutdown",   SEC_ADMINISTRATOR,  &ChatHandler::HandleIdleShutDownCommand,        "", NULL },
-        { "info",           SEC_PLAYER,         &ChatHandler::HandleInfoCommand,                "", NULL },
-        { "restart",        SEC_ADMINISTRATOR,  &ChatHandler::HandleRestartCommand,             "", NULL },
-        { "shutdown",       SEC_ADMINISTRATOR,  &ChatHandler::HandleShutDownCommand,            "", NULL },
-        { NULL,             0,                  NULL,                                           "", NULL }
+        { "corpses",        SEC_GAMEMASTER,     true,  &ChatHandler::HandleServerCorpsesCommand,       "", NULL },
+		{ "exit",           SEC_CONSOLE,        true,  &ChatHandler::HandleServerExitCommand,          "", NULL },
+		{ "idlerestart",    SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleIdleRestartCommand,         "", NULL },
+		{ "idleshutdown",   SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleIdleShutDownCommand,        "", NULL },
+		{ "info",           SEC_PLAYER,         true,  &ChatHandler::HandleInfoCommand,                "", NULL },
+		{ "motd",           SEC_PLAYER,         true,  &ChatHandler::HandleServerMotdCommand,          "", NULL },
+		{ "restart",        SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleRestartCommand,             "", NULL },
+		{ "shutdown",       SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleShutDownCommand,            "", NULL },
+		{ "set",            SEC_ADMINISTRATOR,  true,  NULL,                                           "", serverSetCommandTable },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
     };
 
     static ChatCommand modifyCommandTable[] =
     {
-        { "hp",             SEC_MODERATOR,      &ChatHandler::HandleModifyHPCommand,            "", NULL },
-        { "mana",           SEC_MODERATOR,      &ChatHandler::HandleModifyManaCommand,          "", NULL },
-        { "rage",           SEC_MODERATOR,      &ChatHandler::HandleModifyRageCommand,          "", NULL },
-        { "energy",         SEC_MODERATOR,      &ChatHandler::HandleModifyEnergyCommand,        "", NULL },
-        { "money",          SEC_MODERATOR,      &ChatHandler::HandleModifyMoneyCommand,         "", NULL },
-        { "speed",          SEC_MODERATOR,      &ChatHandler::HandleModifySpeedCommand,         "", NULL },
-        { "swim",           SEC_MODERATOR,      &ChatHandler::HandleModifySwimCommand,          "", NULL },
-        { "scale",          SEC_MODERATOR,      &ChatHandler::HandleModifyScaleCommand,         "", NULL },
-        { "bit",            SEC_MODERATOR,      &ChatHandler::HandleModifyBitCommand,           "", NULL },
-        { "bwalk",          SEC_MODERATOR,      &ChatHandler::HandleModifyBWalkCommand,         "", NULL },
-        { "fly",            SEC_MODERATOR,      &ChatHandler::HandleModifyFlyCommand,           "", NULL },
-        { "aspeed",         SEC_MODERATOR,      &ChatHandler::HandleModifyASpeedCommand,        "", NULL },
-        { "faction",        SEC_MODERATOR,      &ChatHandler::HandleModifyFactionCommand,       "", NULL },
-        { "spell",          SEC_MODERATOR,      &ChatHandler::HandleModifySpellCommand,         "", NULL },
-        { "tp",             SEC_MODERATOR,      &ChatHandler::HandleModifyTalentCommand,        "", NULL },
-        { "titles",         SEC_MODERATOR,      &ChatHandler::HandleModifyKnownTitlesCommand,   "", NULL },
-        { "mount",          SEC_MODERATOR,      &ChatHandler::HandleModifyMountCommand,         "", NULL },
-        { "honor",          SEC_MODERATOR,      &ChatHandler::HandleModifyHonorCommand,         "", NULL },
-        { "rep",            SEC_MODERATOR,      &ChatHandler::HandleModifyRepCommand,           "", NULL },
-        { "arena",          SEC_MODERATOR,      &ChatHandler::HandleModifyArenaCommand,         "", NULL },
-        { "drunk",          SEC_MODERATOR,      &ChatHandler::HandleDrunkCommand,               "", NULL },
-        { "standstate",     SEC_GAMEMASTER,     &ChatHandler::HandleStandStateCommand,          "", NULL },
-        { "morph",          SEC_GAMEMASTER,     &ChatHandler::HandleMorphCommand,               "", NULL },
-        { NULL,             0,                  NULL,                                           "", NULL }
+        { "hp",             SEC_MODERATOR,      false, &ChatHandler::HandleModifyHPCommand,            "", NULL },
+		{ "mana",           SEC_MODERATOR,      false, &ChatHandler::HandleModifyManaCommand,          "", NULL },
+		{ "rage",           SEC_MODERATOR,      false, &ChatHandler::HandleModifyRageCommand,          "", NULL },
+		{ "energy",         SEC_MODERATOR,      false, &ChatHandler::HandleModifyEnergyCommand,        "", NULL },
+		{ "money",          SEC_MODERATOR,      false, &ChatHandler::HandleModifyMoneyCommand,         "", NULL },
+		{ "speed",          SEC_MODERATOR,      false, &ChatHandler::HandleModifySpeedCommand,         "", NULL },
+		{ "swim",           SEC_MODERATOR,      false, &ChatHandler::HandleModifySwimCommand,          "", NULL },
+		{ "scale",          SEC_MODERATOR,      false, &ChatHandler::HandleModifyScaleCommand,         "", NULL },
+		{ "bit",            SEC_MODERATOR,      false, &ChatHandler::HandleModifyBitCommand,           "", NULL },
+		{ "bwalk",          SEC_MODERATOR,      false, &ChatHandler::HandleModifyBWalkCommand,         "", NULL },
+		{ "fly",            SEC_MODERATOR,      false, &ChatHandler::HandleModifyFlyCommand,           "", NULL },
+		{ "aspeed",         SEC_MODERATOR,      false, &ChatHandler::HandleModifyASpeedCommand,        "", NULL },
+		{ "faction",        SEC_MODERATOR,      false, &ChatHandler::HandleModifyFactionCommand,       "", NULL },
+		{ "spell",          SEC_MODERATOR,      false, &ChatHandler::HandleModifySpellCommand,         "", NULL },
+		{ "tp",             SEC_MODERATOR,      false, &ChatHandler::HandleModifyTalentCommand,        "", NULL },
+		{ "titles",         SEC_MODERATOR,      false, &ChatHandler::HandleModifyKnownTitlesCommand,   "", NULL },
+		{ "mount",          SEC_MODERATOR,      false, &ChatHandler::HandleModifyMountCommand,         "", NULL },
+		{ "honor",          SEC_MODERATOR,      false, &ChatHandler::HandleModifyHonorCommand,         "", NULL },
+		{ "rep",            SEC_MODERATOR,      false, &ChatHandler::HandleModifyRepCommand,           "", NULL },
+		{ "arena",          SEC_MODERATOR,      false, &ChatHandler::HandleModifyArenaCommand,         "", NULL },
+		{ "drunk",          SEC_MODERATOR,      false, &ChatHandler::HandleDrunkCommand,               "", NULL },
+		{ "standstate",     SEC_GAMEMASTER,     false, &ChatHandler::HandleStandStateCommand,          "", NULL },
+		{ "morph",          SEC_GAMEMASTER,     false, &ChatHandler::HandleMorphCommand,               "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
     };
 
     static ChatCommand wpCommandTable[] =
     {
-        { "show",           SEC_GAMEMASTER,     &ChatHandler::HandleWpShowCommand,              "", NULL },
-        { "add",            SEC_GAMEMASTER,     &ChatHandler::HandleWpAddCommand,               "", NULL },
-        { "modify",         SEC_GAMEMASTER,     &ChatHandler::HandleWpModifyCommand,            "", NULL },
-        { "export",         SEC_ADMINISTRATOR,  &ChatHandler::HandleWpExportCommand,            "", NULL },
-        { "import",         SEC_ADMINISTRATOR,  &ChatHandler::HandleWpImportCommand,            "", NULL },
-        { NULL,             0,                  NULL,                                           "", NULL }
-    };
+        { "show",           SEC_GAMEMASTER,     false, &ChatHandler::HandleWpShowCommand,              "", NULL },
+		{ "add",            SEC_GAMEMASTER,     false, &ChatHandler::HandleWpAddCommand,               "", NULL },
+		{ "modify",         SEC_GAMEMASTER,     false, &ChatHandler::HandleWpModifyCommand,            "", NULL },
+		{ "export",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleWpExportCommand,            "", NULL },
+		{ "import",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleWpImportCommand,            "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
+    };
+
+	static ChatCommand banCommandTable[] =
+	{
+		{ "account",        SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleBanAccountCommand,          "", NULL },
+		{ "character",      SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleBanCharacterCommand,        "", NULL },
+		{ "ip",             SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleBanIPCommand,               "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
+	};
+
+	static ChatCommand baninfoCommandTable[] =
+	{
+		{ "account",        SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleBanInfoAccountCommand,      "", NULL },
+		{ "character",      SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleBanInfoCharacterCommand,    "", NULL },
+		{ "ip",             SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleBanInfoIPCommand,           "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
+	};
+
+	static ChatCommand banlistCommandTable[] =
+	{
+		{ "account",        SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleBanListAccountCommand,      "", NULL },
+		{ "character",      SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleBanListCharacterCommand,    "", NULL },
+		{ "ip",             SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleBanListIPCommand,           "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
+	};
+
+	static ChatCommand unbanCommandTable[] =
+	{
+		{ "account",        SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleUnBanAccountCommand,      "", NULL },
+		{ "character",      SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleUnBanCharacterCommand,    "", NULL },
+		{ "ip",             SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleUnBanIPCommand,           "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
+	};
 
     static ChatCommand debugCommandTable[] =
     {
-        { "inarc",          SEC_ADMINISTRATOR,  &ChatHandler::HandleDebugInArcCommand,          "", NULL },
-        { "spellfail",      SEC_ADMINISTRATOR,  &ChatHandler::HandleDebugSpellFailCommand,      "", NULL },
-        { "setpoi",         SEC_ADMINISTRATOR,  &ChatHandler::HandleSetPoiCommand,              "", NULL },
-        { "qpartymsg",      SEC_ADMINISTRATOR,  &ChatHandler::HandleSendQuestPartyMsgCommand,   "", NULL },
-        { "qinvalidmsg",    SEC_ADMINISTRATOR,  &ChatHandler::HandleSendQuestInvalidMsgCommand, "", NULL },
-        { "equiperr",       SEC_ADMINISTRATOR,  &ChatHandler::HandleEquipErrorCommand,          "", NULL },
-        { "sellerr",        SEC_ADMINISTRATOR,  &ChatHandler::HandleSellErrorCommand,           "", NULL },
-        { "buyerr",         SEC_ADMINISTRATOR,  &ChatHandler::HandleBuyErrorCommand,            "", NULL },
-        { "sendopcode",     SEC_ADMINISTRATOR,  &ChatHandler::HandleSendOpcodeCommand,          "", NULL },
-        { "uws",            SEC_ADMINISTRATOR,  &ChatHandler::HandleUpdateWorldStateCommand,    "", NULL },
-        { "ps",             SEC_ADMINISTRATOR,  &ChatHandler::HandlePlaySound2Command,          "", NULL },
-        { "scn",            SEC_ADMINISTRATOR,  &ChatHandler::HandleSendChannelNotifyCommand,   "", NULL },
-        { "scm",            SEC_ADMINISTRATOR,  &ChatHandler::HandleSendChatMsgCommand,         "", NULL },
-        { "getitemstate",   SEC_ADMINISTRATOR,  &ChatHandler::HandleGetItemState,               "", NULL },
-        { "playsound",      SEC_MODERATOR,      &ChatHandler::HandlePlaySoundCommand,           "", NULL },
-        { "update",         SEC_ADMINISTRATOR,  &ChatHandler::HandleUpdate,                     "", NULL },
-        { "setvalue",       SEC_ADMINISTRATOR,  &ChatHandler::HandleSetValue,                   "", NULL },
-        { "getvalue",       SEC_ADMINISTRATOR,  &ChatHandler::HandleGetValue,                   "", NULL },
-        { "Mod32Value",     SEC_ADMINISTRATOR,  &ChatHandler::HandleMod32Value,                 "", NULL },
-        { "anim",           SEC_GAMEMASTER,     &ChatHandler::HandleAnimCommand,                "", NULL },
-        { "lootrecipient",  SEC_GAMEMASTER,     &ChatHandler::HandleGetLootRecipient,           "", NULL },
-        { "arena",          SEC_ADMINISTRATOR,  &ChatHandler::HandleDebugArenaCommand,          "", NULL },
-        { "threatlist",     SEC_ADMINISTRATOR,  &ChatHandler::HandleDebugThreatList,            "", NULL },
-        { "hostilrefs",     SEC_ADMINISTRATOR,  &ChatHandler::HandleDebugHostilRefList,         "", NULL },
-        { NULL,             0,                  NULL,                                           "", NULL }
+        { "inarc",          SEC_ADMINISTRATOR,  false, &ChatHandler::HandleDebugInArcCommand,          "", NULL },
+		{ "spellfail",      SEC_ADMINISTRATOR,  false, &ChatHandler::HandleDebugSpellFailCommand,      "", NULL },
+		{ "setpoi",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleSetPoiCommand,              "", NULL },
+		{ "qpartymsg",      SEC_ADMINISTRATOR,  false, &ChatHandler::HandleSendQuestPartyMsgCommand,   "", NULL },
+		{ "qinvalidmsg",    SEC_ADMINISTRATOR,  false, &ChatHandler::HandleSendQuestInvalidMsgCommand, "", NULL },
+		{ "equiperr",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleEquipErrorCommand,          "", NULL },
+		{ "sellerr",        SEC_ADMINISTRATOR,  false, &ChatHandler::HandleSellErrorCommand,           "", NULL },
+		{ "buyerr",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleBuyErrorCommand,            "", NULL },
+		{ "sendopcode",     SEC_ADMINISTRATOR,  false, &ChatHandler::HandleSendOpcodeCommand,          "", NULL },
+		{ "uws",            SEC_ADMINISTRATOR,  false, &ChatHandler::HandleUpdateWorldStateCommand,    "", NULL },
+		{ "ps",             SEC_ADMINISTRATOR,  false, &ChatHandler::HandlePlaySound2Command,          "", NULL },
+		{ "scn",            SEC_ADMINISTRATOR,  false, &ChatHandler::HandleSendChannelNotifyCommand,   "", NULL },
+		{ "scm",            SEC_ADMINISTRATOR,  false, &ChatHandler::HandleSendChatMsgCommand,         "", NULL },
+		{ "getitemstate",   SEC_ADMINISTRATOR,  false, &ChatHandler::HandleGetItemState,               "", NULL },
+		{ "playsound",      SEC_MODERATOR,      false, &ChatHandler::HandlePlaySoundCommand,           "", NULL },
+		{ "update",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleUpdate,                     "", NULL },
+		{ "setvalue",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleSetValue,                   "", NULL },
+		{ "getvalue",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleGetValue,                   "", NULL },
+		{ "Mod32Value",     SEC_ADMINISTRATOR,  false, &ChatHandler::HandleMod32Value,                 "", NULL },
+		{ "anim",           SEC_GAMEMASTER,     false, &ChatHandler::HandleAnimCommand,                "", NULL },
+		{ "lootrecipient",  SEC_GAMEMASTER,     false, &ChatHandler::HandleGetLootRecipient,           "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
     };
 
     static ChatCommand eventCommandTable[] =
     {
-        { "activelist",     SEC_GAMEMASTER,     &ChatHandler::HandleEventActiveListCommand,     "", NULL },
-        { "start",          SEC_GAMEMASTER,     &ChatHandler::HandleEventStartCommand,          "", NULL },
-        { "stop",           SEC_GAMEMASTER,     &ChatHandler::HandleEventStopCommand,           "", NULL },
-        { "",               SEC_GAMEMASTER,     &ChatHandler::HandleEventInfoCommand,           "", NULL },
-        { NULL,             0,                  NULL,                                           "", NULL }
+        { "activelist",     SEC_GAMEMASTER,     true,  &ChatHandler::HandleEventActiveListCommand,     "", NULL },
+		{ "start",          SEC_GAMEMASTER,     true,  &ChatHandler::HandleEventStartCommand,          "", NULL },
+		{ "stop",           SEC_GAMEMASTER,     true,  &ChatHandler::HandleEventStopCommand,           "", NULL },
+		{ "",               SEC_GAMEMASTER,     true, &ChatHandler::HandleEventInfoCommand,            "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
     };
 
     static ChatCommand learnCommandTable[] =
     {
-        { "all",            SEC_ADMINISTRATOR,  &ChatHandler::HandleLearnAllCommand,            "", NULL },
-        { "all_gm",         SEC_GAMEMASTER,     &ChatHandler::HandleLearnAllGMCommand,          "", NULL },
-        { "all_crafts",     SEC_GAMEMASTER,     &ChatHandler::HandleLearnAllCraftsCommand,      "", NULL },
-        { "all_default",    SEC_MODERATOR,      &ChatHandler::HandleLearnAllDefaultCommand,     "", NULL },
-        { "all_lang",       SEC_MODERATOR,      &ChatHandler::HandleLearnAllLangCommand,        "", NULL },
-        { "all_myclass",    SEC_ADMINISTRATOR,  &ChatHandler::HandleLearnAllMyClassCommand,     "", NULL },
-        { "all_myspells",   SEC_ADMINISTRATOR,  &ChatHandler::HandleLearnAllMySpellsCommand,    "", NULL },
-        { "all_mytalents",  SEC_ADMINISTRATOR,  &ChatHandler::HandleLearnAllMyTalentsCommand,   "", NULL },
-        { "all_recipes",    SEC_GAMEMASTER,     &ChatHandler::HandleLearnAllRecipesCommand,     "", NULL },
-        { "",               SEC_ADMINISTRATOR,  &ChatHandler::HandleLearnCommand,               "", NULL },
-        { NULL,             0,                  NULL,                                           "", NULL }
+        { "all",            SEC_ADMINISTRATOR,  false, &ChatHandler::HandleLearnAllCommand,            "", NULL },
+		{ "all_gm",         SEC_GAMEMASTER,     false, &ChatHandler::HandleLearnAllGMCommand,          "", NULL },
+		{ "all_crafts",     SEC_GAMEMASTER,     false, &ChatHandler::HandleLearnAllCraftsCommand,      "", NULL },
+		{ "all_default",    SEC_MODERATOR,      false, &ChatHandler::HandleLearnAllDefaultCommand,     "", NULL },
+		{ "all_lang",       SEC_MODERATOR,      false, &ChatHandler::HandleLearnAllLangCommand,        "", NULL },
+		{ "all_myclass",    SEC_ADMINISTRATOR,  false, &ChatHandler::HandleLearnAllMyClassCommand,     "", NULL },
+		{ "all_myspells",   SEC_ADMINISTRATOR,  false, &ChatHandler::HandleLearnAllMySpellsCommand,    "", NULL },
+		{ "all_mytalents",  SEC_ADMINISTRATOR,  false, &ChatHandler::HandleLearnAllMyTalentsCommand,   "", NULL },
+		{ "all_recipes",    SEC_GAMEMASTER,     false, &ChatHandler::HandleLearnAllRecipesCommand,     "", NULL },
+		{ "",               SEC_ADMINISTRATOR,  false, &ChatHandler::HandleLearnCommand,               "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
     };
 
     static ChatCommand reloadCommandTable[] =
     {
-        { "all",            SEC_ADMINISTRATOR,  &ChatHandler::HandleReloadAllCommand,           "", NULL },
-        { "all_loot",       SEC_ADMINISTRATOR,  &ChatHandler::HandleReloadAllLootCommand,       "", NULL },
-        { "all_npc",        SEC_ADMINISTRATOR,  &ChatHandler::HandleReloadAllNpcCommand,        "", NULL },
-        { "all_quest",      SEC_ADMINISTRATOR,  &ChatHandler::HandleReloadAllQuestCommand,      "", NULL },
-        { "all_scripts",    SEC_ADMINISTRATOR,  &ChatHandler::HandleReloadAllScriptsCommand,    "", NULL },
-        { "all_spell",      SEC_ADMINISTRATOR,  &ChatHandler::HandleReloadAllSpellCommand,      "", NULL },
-        { "all_item",       SEC_ADMINISTRATOR,  &ChatHandler::HandleReloadAllItemCommand,       "", NULL },
-        { "all_locales",    SEC_ADMINISTRATOR,  &ChatHandler::HandleReloadAllLocalesCommand,    "", NULL },
-
-        { "config",         SEC_ADMINISTRATOR,  &ChatHandler::HandleReloadConfigCommand,        "", NULL },
-
-        { "areatrigger_tavern",          SEC_ADMINISTRATOR, &ChatHandler::HandleReloadAreaTriggerTavernCommand,       "", NULL },
-        { "areatrigger_teleport",        SEC_ADMINISTRATOR, &ChatHandler::HandleReloadAreaTriggerTeleportCommand,     "", NULL },
-        { "areatrigger_involvedrelation",SEC_ADMINISTRATOR, &ChatHandler::HandleReloadQuestAreaTriggersCommand,       "", NULL },
-        { "event_scripts",               SEC_ADMINISTRATOR, &ChatHandler::HandleReloadEventScriptsCommand,            "", NULL },
-        { "command",                     SEC_ADMINISTRATOR, &ChatHandler::HandleReloadCommandCommand,                 "", NULL },
-        { "creature_involvedrelation",   SEC_ADMINISTRATOR, &ChatHandler::HandleReloadCreatureQuestInvRelationsCommand,"",NULL },
-        { "creature_loot_template",      SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesCreatureCommand,   "", NULL },
-        { "creature_questrelation",      SEC_ADMINISTRATOR, &ChatHandler::HandleReloadCreatureQuestRelationsCommand,  "", NULL },
-        { "disenchant_loot_template",    SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesDisenchantCommand, "", NULL },
-        { "fishing_loot_template",       SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesFishingCommand,    "", NULL },
-        { "game_graveyard_zone",         SEC_ADMINISTRATOR, &ChatHandler::HandleReloadGameGraveyardZoneCommand,       "", NULL },
-        { "game_tele",                   SEC_ADMINISTRATOR, &ChatHandler::HandleReloadGameTeleCommand,                "", NULL },
-        { "gameobject_involvedrelation", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadGOQuestInvRelationsCommand,     "", NULL },
-        { "gameobject_loot_template",    SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesGameobjectCommand, "", NULL },
-        { "gameobject_questrelation",    SEC_ADMINISTRATOR, &ChatHandler::HandleReloadGOQuestRelationsCommand,        "", NULL },
-        { "gameobject_scripts",          SEC_ADMINISTRATOR, &ChatHandler::HandleReloadGameObjectScriptsCommand,       "", NULL },
-        { "item_enchantment_template",   SEC_ADMINISTRATOR, &ChatHandler::HandleReloadItemEnchantementsCommand,       "", NULL },
-        { "item_loot_template",          SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesItemCommand,       "", NULL },
-        { "trinity_string",              SEC_ADMINISTRATOR, &ChatHandler::HandleReloadTrinityStringCommand,           "", NULL },
-        { "npc_gossip",                  SEC_ADMINISTRATOR, &ChatHandler::HandleReloadNpcGossipCommand,               "", NULL },
-        { "npc_trainer",                 SEC_ADMINISTRATOR, &ChatHandler::HandleReloadNpcTrainerCommand,              "", NULL },
-        { "npc_vendor",                  SEC_ADMINISTRATOR, &ChatHandler::HandleReloadNpcVendorCommand,               "", NULL },
-        { "page_text",                   SEC_ADMINISTRATOR, &ChatHandler::HandleReloadPageTextsCommand,               "", NULL },
-        { "pickpocketing_loot_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesPickpocketingCommand,"",NULL},
-        { "prospecting_loot_template",   SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesProspectingCommand,"", NULL },
-        { "quest_mail_loot_template",    SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesQuestMailCommand,  "", NULL },
-        { "quest_end_scripts",           SEC_ADMINISTRATOR, &ChatHandler::HandleReloadQuestEndScriptsCommand,         "", NULL },
-        { "quest_start_scripts",         SEC_ADMINISTRATOR, &ChatHandler::HandleReloadQuestStartScriptsCommand,       "", NULL },
-        { "quest_template",              SEC_ADMINISTRATOR, &ChatHandler::HandleReloadQuestTemplateCommand,           "", NULL },
-        { "reference_loot_template",     SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesReferenceCommand,  "", NULL },
-        { "reserved_name",               SEC_ADMINISTRATOR, &ChatHandler::HandleReloadReservedNameCommand,            "", NULL },
-        { "skill_discovery_template",    SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSkillDiscoveryTemplateCommand,  "", NULL },
-        { "skill_extra_item_template",   SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSkillExtraItemTemplateCommand,  "", NULL },
-        { "skill_fishing_base_level",    SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSkillFishingBaseLevelCommand,   "", NULL },
-        { "skinning_loot_template",      SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesSkinningCommand,   "", NULL },
-        { "spell_affect",                SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellAffectCommand,             "", NULL },
-        { "spell_chain",                 SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellChainCommand,              "", NULL },
-        { "spell_elixir",                SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellElixirCommand,             "", NULL },
-        { "spell_learn_spell",           SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellLearnSpellCommand,         "", NULL },
-        { "spell_pet_auras",             SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellPetAurasCommand,           "", NULL },
-        { "spell_proc_event",            SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellProcEventCommand,          "", NULL },
-        { "spell_script_target",         SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellScriptTargetCommand,       "", NULL },
-        { "spell_scripts",               SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellScriptsCommand,            "", NULL },
-        { "spell_target_position",       SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellTargetPositionCommand,     "", NULL },
-        { "spell_threats",               SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellThreatsCommand,            "", NULL },
-        { "spell_disabled",              SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellDisabledCommand,           "", NULL },
-        { "locales_creature",            SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLocalesCreatureCommand,         "", NULL },
-        { "locales_gameobject",          SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLocalesGameobjectCommand,       "", NULL },
-        { "locales_item",                SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLocalesItemCommand,             "", NULL },
-        { "locales_npc_text",            SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLocalesNpcTextCommand,          "", NULL },
-        { "locales_page_text",           SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLocalesPageTextCommand,         "", NULL },
-        { "locales_quest",               SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLocalesQuestCommand,            "", NULL },
-        { "",                            SEC_ADMINISTRATOR, &ChatHandler::HandleReloadCommand,                        "", NULL },
-        { NULL,                          0,                 NULL,                                                     "", NULL }
+        { "all", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllCommand, "", NULL },
+		{"all_loot", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllLootCommand, "", NULL },
+		{ "all_npc", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllNpcCommand, "", NULL },
+		{ "all_quest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllQuestCommand, "", NULL },
+		{ "all_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllScriptsCommand, "", NULL },
+		{ "all_spell", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllSpellCommand, "", NULL },
+		{ "all_item", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllItemCommand, "", NULL },
+		{ "all_locales", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllLocalesCommand, "", NULL },
+
+		{ "config", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadConfigCommand, "", NULL },
+
+		{ "areatrigger_tavern", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAreaTriggerTavernCommand, "", NULL },
+		{ "areatrigger_teleport", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAreaTriggerTeleportCommand, "", NULL },
+		{ "areatrigger_involvedrelation",SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestAreaTriggersCommand, "", NULL },
+		{ "event_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadEventScriptsCommand, "", NULL },
+		{ "command", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCommandCommand, "", NULL },
+		{ "creature_involvedrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCreatureQuestInvRelationsCommand,"",NULL },
+		{ "creature_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesCreatureCommand, "", NULL },
+		{ "creature_questrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCreatureQuestRelationsCommand, "", NULL },
+		{ "disenchant_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesDisenchantCommand, "", NULL },
+		{ "fishing_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesFishingCommand, "", NULL },
+		{ "game_graveyard_zone", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGameGraveyardZoneCommand, "", NULL },
+		{ "game_tele", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGameTeleCommand, "", NULL },
+		{ "gameobject_involvedrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGOQuestInvRelationsCommand, "", NULL },
+		{ "gameobject_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesGameobjectCommand, "", NULL },
+		{ "gameobject_questrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGOQuestRelationsCommand, "", NULL },
+		{ "gameobject_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGameObjectScriptsCommand, "", NULL },
+		{ "item_enchantment_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadItemEnchantementsCommand, "", NULL },
+		{ "item_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesItemCommand, "", NULL },
+		{ "trinity_string", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadTrinityStringCommand, "", NULL },
+		{ "npc_gossip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcGossipCommand, "", NULL },
+		{ "npc_trainer", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcTrainerCommand, "", NULL },
+		{ "npc_vendor", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcVendorCommand, "", NULL },
+		{ "page_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadPageTextsCommand, "", NULL },
+		{ "pickpocketing_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesPickpocketingCommand,"",NULL},
+		{ "prospecting_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesProspectingCommand,"", NULL },
+		{ "quest_mail_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesQuestMailCommand, "", NULL },
+		{ "quest_end_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestEndScriptsCommand, "", NULL },
+		{ "quest_start_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestStartScriptsCommand, "", NULL },
+		{ "quest_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestTemplateCommand, "", NULL },
+		{ "reference_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesReferenceCommand, "", NULL },
+		{ "reserved_name", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadReservedNameCommand, "", NULL },
+		{ "skill_discovery_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSkillDiscoveryTemplateCommand, "", NULL },
+		{ "skill_extra_item_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSkillExtraItemTemplateCommand, "", NULL },
+		{ "skill_fishing_base_level", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSkillFishingBaseLevelCommand, "", NULL },
+		{ "skinning_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesSkinningCommand, "", NULL },
+		{ "spell_affect", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellAffectCommand, "", NULL },
+		{ "spell_chain", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellChainCommand, "", NULL },
+		{ "spell_elixir", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellElixirCommand, "", NULL },
+		{ "spell_learn_spell", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellLearnSpellCommand, "", NULL },
+		{ "spell_pet_auras", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellPetAurasCommand, "", NULL },
+		{ "spell_proc_event", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellProcEventCommand, "", NULL },
+		{ "spell_script_target", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellScriptTargetCommand, "", NULL },
+		{ "spell_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellScriptsCommand, "", NULL },
+		{ "spell_target_position", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellTargetPositionCommand, "", NULL },
+		{ "spell_threats", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellThreatsCommand, "", NULL },
+		{ "locales_creature", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesCreatureCommand, "", NULL },
+		{ "locales_gameobject", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesGameobjectCommand, "", NULL },
+		{ "locales_item", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesItemCommand, "", NULL },
+		{ "locales_npc_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesNpcTextCommand, "", NULL },
+		{ "locales_page_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesPageTextCommand, "", NULL },
+		{ "locales_quest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesQuestCommand, "", NULL },
+
+		{ "", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCommand, "", NULL },
+		{ NULL,                          0,                 false, NULL,                                                     "", NULL }
     };
 
     static ChatCommand honorCommandTable[] =
     {
-        { "add",            SEC_GAMEMASTER,     &ChatHandler::HandleAddHonorCommand,            "", NULL },
-        { "addkill",        SEC_GAMEMASTER,     &ChatHandler::HandleHonorAddKillCommand,        "", NULL },
-        { "update",         SEC_GAMEMASTER,     &ChatHandler::HandleUpdateHonorFieldsCommand,   "", NULL },
-        { NULL,             0,                  NULL,                                           "", NULL }
+        { "add",            SEC_GAMEMASTER,     false, &ChatHandler::HandleAddHonorCommand,            "", NULL },
+		{ "addkill",        SEC_GAMEMASTER,     false, &ChatHandler::HandleHonorAddKillCommand,        "", NULL },
+		{ "update",         SEC_GAMEMASTER,     false, &ChatHandler::HandleUpdateHonorFieldsCommand,   "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
     };
 
     static ChatCommand guildCommandTable[] =
     {
-        { "create",         SEC_GAMEMASTER,     &ChatHandler::HandleGuildCreateCommand,         "", NULL },
-        { "delete",         SEC_GAMEMASTER,     &ChatHandler::HandleGuildDeleteCommand,         "", NULL },
-        { "invite",         SEC_GAMEMASTER,     &ChatHandler::HandleGuildInviteCommand,         "", NULL },
-        { "uninvite",       SEC_GAMEMASTER,     &ChatHandler::HandleGuildUninviteCommand,       "", NULL },
-        { "rank",           SEC_GAMEMASTER,     &ChatHandler::HandleGuildRankCommand,           "", NULL },
-        { NULL,             0,                  NULL,                                           "", NULL }
+		{ "create",         SEC_GAMEMASTER,     true,  &ChatHandler::HandleGuildCreateCommand,         "", NULL },
+		{ "delete",         SEC_GAMEMASTER,     true,  &ChatHandler::HandleGuildDeleteCommand,         "", NULL },
+		{ "invite",         SEC_GAMEMASTER,     true,  &ChatHandler::HandleGuildInviteCommand,         "", NULL },
+		{ "uninvite",       SEC_GAMEMASTER,     true,  &ChatHandler::HandleGuildUninviteCommand,       "", NULL },
+		{ "rank",           SEC_GAMEMASTER,     true,  &ChatHandler::HandleGuildRankCommand,           "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
     };
 
     static ChatCommand groupCommandTable[] =
     {
-        { "leader",         SEC_ADMINISTRATOR,  &ChatHandler::HandleGroupLeaderCommand,         "", NULL },
-        { "disband",        SEC_ADMINISTRATOR,  &ChatHandler::HandleGroupDisbandCommand,        "", NULL },
-        { "remove",         SEC_ADMINISTRATOR,  &ChatHandler::HandleGroupRemoveCommand,         "", NULL },
-        { NULL,             0,                  NULL,                                           "", NULL }
+        { "leader",         SEC_ADMINISTRATOR,     false,  &ChatHandler::HandleGroupLeaderCommand,         "", NULL },
+        { "disband",        SEC_ADMINISTRATOR,     false,  &ChatHandler::HandleGroupDisbandCommand,        "", NULL },
+        { "remove",         SEC_ADMINISTRATOR,     false,  &ChatHandler::HandleGroupRemoveCommand,         "", NULL },
+        { NULL,             0,					   false, NULL,                                           "", NULL }
     };
 
     static ChatCommand lookupPlayerCommandTable[] =
     {
-        { "ip",            SEC_GAMEMASTER,     &ChatHandler::HandleLookupPlayerIpCommand,       "", NULL },
-        { "account",       SEC_GAMEMASTER,     &ChatHandler::HandleLookupPlayerAccountCommand,  "", NULL },
-        { "email",         SEC_GAMEMASTER,     &ChatHandler::HandleLookupPlayerEmailCommand,    "", NULL },
-        { NULL,            0,                  NULL,                                            "", NULL }
+		{ "ip", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerIpCommand, "", NULL },
+		{ "account", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerAccountCommand, "", NULL },
+		{ "email", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerEmailCommand, "", NULL },
+		{ NULL,             0,                  false, NULL,                                            "", NULL }
     };
 
     static ChatCommand lookupCommandTable[] =
     {
-        { "area",           SEC_MODERATOR,      &ChatHandler::HandleLookupAreaCommand,          "", NULL },
-        { "creature",       SEC_ADMINISTRATOR,  &ChatHandler::HandleLookupCreatureCommand,      "", NULL },
-        { "event",          SEC_GAMEMASTER,     &ChatHandler::HandleLookupEventCommand,         "", NULL },
-        { "faction",        SEC_ADMINISTRATOR,  &ChatHandler::HandleLookupFactionCommand,       "", NULL },
-        { "item",           SEC_ADMINISTRATOR,  &ChatHandler::HandleLookupItemCommand,          "", NULL },
-        { "itemset",        SEC_ADMINISTRATOR,  &ChatHandler::HandleLookupItemSetCommand,       "", NULL },
-        { "object",         SEC_ADMINISTRATOR,  &ChatHandler::HandleLookupObjectCommand,        "", NULL },
-        { "quest",          SEC_ADMINISTRATOR,  &ChatHandler::HandleLookupQuestCommand,         "", NULL },
-        { "player",         SEC_GAMEMASTER,     NULL,                                           "", lookupPlayerCommandTable },
-        { "skill",          SEC_ADMINISTRATOR,  &ChatHandler::HandleLookupSkillCommand,         "", NULL },
-        { "spell",          SEC_ADMINISTRATOR,  &ChatHandler::HandleLookupSpellCommand,         "", NULL },
-        { "tele",           SEC_MODERATOR,      &ChatHandler::HandleLookupTeleCommand,          "", NULL },
-        { NULL,             0,                  NULL,                                           "", NULL }
+        { "area",           SEC_MODERATOR,      true,  &ChatHandler::HandleLookupAreaCommand,          "", NULL },
+		{ "creature",       SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleLookupCreatureCommand,      "", NULL },
+		{ "event",          SEC_GAMEMASTER,     true,  &ChatHandler::HandleLookupEventCommand,         "", NULL },
+		{ "faction",        SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleLookupFactionCommand,       "", NULL },
+		{ "item",           SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleLookupItemCommand,          "", NULL },
+		{ "itemset",        SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleLookupItemSetCommand,       "", NULL },
+		{ "object",         SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleLookupObjectCommand,        "", NULL },
+		{ "quest",          SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleLookupQuestCommand,         "", NULL },
+		{ "player",         SEC_GAMEMASTER,     true,  NULL,                                           "", lookupPlayerCommandTable },
+		{ "skill",          SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleLookupSkillCommand,         "", NULL },
+		{ "spell",          SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleLookupSpellCommand,         "", NULL },
+		{ "tele",           SEC_MODERATOR,      true,  &ChatHandler::HandleLookupTeleCommand,          "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
     };
 
     static ChatCommand resetCommandTable[] =
     {
-        { "honor",          SEC_ADMINISTRATOR,  &ChatHandler::HandleResetHonorCommand,          "", NULL },
-        { "level",          SEC_ADMINISTRATOR,  &ChatHandler::HandleResetLevelCommand,          "", NULL },
-        { "spells",         SEC_ADMINISTRATOR,  &ChatHandler::HandleResetSpellsCommand,         "", NULL },
-        { "stats",          SEC_ADMINISTRATOR,  &ChatHandler::HandleResetStatsCommand,          "", NULL },
-        { "talents",        SEC_ADMINISTRATOR,  &ChatHandler::HandleResetTalentsCommand,        "", NULL },
-        { "all",            SEC_ADMINISTRATOR,  &ChatHandler::HandleResetAllCommand,            "", NULL },
-        { NULL,             0,                  NULL,                                           "", NULL }
+        { "honor",          SEC_ADMINISTRATOR,  false, &ChatHandler::HandleResetHonorCommand,          "", NULL },
+		{ "level",          SEC_ADMINISTRATOR,  false, &ChatHandler::HandleResetLevelCommand,          "", NULL },
+		{ "spells",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleResetSpellsCommand,         "", NULL },
+		{ "stats",          SEC_ADMINISTRATOR,  false, &ChatHandler::HandleResetStatsCommand,          "", NULL },
+		{ "talents",        SEC_ADMINISTRATOR,  false, &ChatHandler::HandleResetTalentsCommand,        "", NULL },
+		{ "all",            SEC_ADMINISTRATOR,  false, &ChatHandler::HandleResetAllCommand,            "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
     };
 
     static ChatCommand castCommandTable[] =
     {
-        { "back",           SEC_ADMINISTRATOR,  &ChatHandler::HandleCastBackCommand,            "", NULL },
-        { "dist",           SEC_ADMINISTRATOR,  &ChatHandler::HandleCastDistCommand,            "", NULL },
-        { "self",           SEC_ADMINISTRATOR,  &ChatHandler::HandleCastSelfCommand,            "", NULL },
-        { "target",         SEC_ADMINISTRATOR,  &ChatHandler::HandleCastTargetCommand,          "", NULL },
-        { "",               SEC_ADMINISTRATOR,  &ChatHandler::HandleCastCommand,                "", NULL },
-        { NULL,             0,                  NULL,                                           "", NULL }
+        { "back",           SEC_ADMINISTRATOR,  false, &ChatHandler::HandleCastBackCommand,            "", NULL },
+		{ "dist",           SEC_ADMINISTRATOR,  false, &ChatHandler::HandleCastDistCommand,            "", NULL },
+		{ "self",           SEC_ADMINISTRATOR,  false, &ChatHandler::HandleCastSelfCommand,            "", NULL },
+		{ "target",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleCastTargetCommand,          "", NULL },
+		{ "",               SEC_ADMINISTRATOR,  false, &ChatHandler::HandleCastCommand,                "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
     };
 
     static ChatCommand pdumpCommandTable[] =
     {
-        { "load",           SEC_ADMINISTRATOR,  &ChatHandler::HandleLoadPDumpCommand,           "", NULL },
-        { "write",          SEC_ADMINISTRATOR,  &ChatHandler::HandleWritePDumpCommand,          "", NULL },
-        { NULL,             0,                  NULL,                                           "", NULL }
+        { "load",           SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleLoadPDumpCommand,           "", NULL },
+		{ "write",          SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleWritePDumpCommand,          "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
     };
 
     static ChatCommand listCommandTable[] =
     {
-        { "creature",       SEC_ADMINISTRATOR,  &ChatHandler::HandleListCreatureCommand,        "", NULL },
-        { "item",           SEC_ADMINISTRATOR,  &ChatHandler::HandleListItemCommand,            "", NULL },
-        { "object",         SEC_ADMINISTRATOR,  &ChatHandler::HandleListObjectCommand,          "", NULL },
-        { "auras",          SEC_ADMINISTRATOR,  &ChatHandler::HandleListAurasCommand,           "", NULL },
-        { NULL,             0,                  NULL,                                           "", NULL }
+        { "creature",       SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleListCreatureCommand,        "", NULL },
+		{ "item",           SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleListItemCommand,            "", NULL },
+		{ "object",         SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleListObjectCommand,          "", NULL },
+		{ "auras",          SEC_ADMINISTRATOR,  false, &ChatHandler::HandleListAurasCommand,           "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
     };
 
     static ChatCommand teleCommandTable[] =
     {
-        { "add",            SEC_ADMINISTRATOR,  &ChatHandler::HandleAddTeleCommand,             "", NULL },
-        { "del",            SEC_ADMINISTRATOR,  &ChatHandler::HandleDelTeleCommand,             "", NULL },
-        { "name",           SEC_MODERATOR,      &ChatHandler::HandleNameTeleCommand,            "", NULL },
-        { "group",          SEC_MODERATOR,      &ChatHandler::HandleGroupTeleCommand,           "", NULL },
-        { "",               SEC_MODERATOR,      &ChatHandler::HandleTeleCommand,                "", NULL },
-        { NULL,             0,                  NULL,                                           "", NULL }
+        { "add",            SEC_ADMINISTRATOR,  false, &ChatHandler::HandleAddTeleCommand,             "", NULL },
+		{ "del",            SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleDelTeleCommand,             "", NULL },
+		{ "name",           SEC_MODERATOR,      true,  &ChatHandler::HandleNameTeleCommand,            "", NULL },
+		{ "group",          SEC_MODERATOR,      false, &ChatHandler::HandleGroupTeleCommand,           "", NULL },
+		{ "",               SEC_MODERATOR,      false, &ChatHandler::HandleTeleCommand,                "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
     };
 
     static ChatCommand npcCommandTable[] =
     {
-        { "say",            SEC_MODERATOR,      &ChatHandler::HandleSayCommand,                 "", NULL },
-        { "whisper",        SEC_MODERATOR,      &ChatHandler::HandleNpcWhisperCommand,          "", NULL },
-        { "yell",           SEC_MODERATOR,      &ChatHandler::HandleYellCommand,                "", NULL },
-        { "textemote",      SEC_MODERATOR,      &ChatHandler::HandleTextEmoteCommand,           "", NULL },
-        { "add",            SEC_GAMEMASTER,     &ChatHandler::HandleAddSpwCommand,              "", NULL },
-        { "delete",         SEC_GAMEMASTER,     &ChatHandler::HandleDelCreatureCommand,         "", NULL },
-        { "spawndist",      SEC_GAMEMASTER,     &ChatHandler::HandleSpawnDistCommand,           "", NULL },
-        { "spawntime",      SEC_GAMEMASTER,     &ChatHandler::HandleSpawnTimeCommand,           "", NULL },
-        { "factionid",      SEC_GAMEMASTER,     &ChatHandler::HandleFactionIdCommand,           "", NULL },
-        { "addmove",        SEC_GAMEMASTER,     &ChatHandler::HandleAddMoveCommand,             "", NULL },
-        { "setmovetype",    SEC_GAMEMASTER,     &ChatHandler::HandleSetMoveTypeCommand,         "", NULL },
-        { "move",           SEC_GAMEMASTER,     &ChatHandler::HandleMoveCreatureCommand,        "", NULL },
-        { "changelevel",    SEC_GAMEMASTER,     &ChatHandler::HandleChangeLevelCommand,         "", NULL },
-        { "setmodel",       SEC_GAMEMASTER,     &ChatHandler::HandleSetModelCommand,            "", NULL },
-        { "additem",        SEC_GAMEMASTER,     &ChatHandler::HandleAddVendorItemCommand,       "", NULL },
-        { "delitem",        SEC_GAMEMASTER,     &ChatHandler::HandleDelVendorItemCommand,       "", NULL },
-        { "flag",           SEC_GAMEMASTER,     &ChatHandler::HandleNPCFlagCommand,             "", NULL },
-        { "changeentry",    SEC_ADMINISTRATOR,  &ChatHandler::HandleChangeEntryCommand,         "", NULL },
-        { "info",           SEC_ADMINISTRATOR,  &ChatHandler::HandleNpcInfoCommand,             "", NULL },
-        { "playemote",      SEC_ADMINISTRATOR,  &ChatHandler::HandlePlayEmoteCommand,           "", NULL },
+        { "say",            SEC_MODERATOR,      false, &ChatHandler::HandleSayCommand,                 "", NULL },
+		{ "whisper",        SEC_MODERATOR,      false, &ChatHandler::HandleNpcWhisperCommand,          "", NULL },
+		{ "yell",           SEC_MODERATOR,      false, &ChatHandler::HandleYellCommand,                "", NULL },
+		{ "textemote",      SEC_MODERATOR,      false, &ChatHandler::HandleTextEmoteCommand,           "", NULL },
+		{ "add",            SEC_GAMEMASTER,     false, &ChatHandler::HandleAddSpwCommand,              "", NULL },
+		{ "delete",         SEC_GAMEMASTER,     false, &ChatHandler::HandleDelCreatureCommand,         "", NULL },
+		{ "spawndist",      SEC_GAMEMASTER,     false, &ChatHandler::HandleSpawnDistCommand,           "", NULL },
+		{ "spawntime",      SEC_GAMEMASTER,     false, &ChatHandler::HandleSpawnTimeCommand,           "", NULL },
+		{ "factionid",      SEC_GAMEMASTER,     false, &ChatHandler::HandleFactionIdCommand,           "", NULL },
+		{ "addmove",        SEC_GAMEMASTER,     false, &ChatHandler::HandleAddMoveCommand,             "", NULL },
+		{ "setmovetype",    SEC_GAMEMASTER,     false, &ChatHandler::HandleSetMoveTypeCommand,         "", NULL },
+		{ "move",           SEC_GAMEMASTER,     false, &ChatHandler::HandleMoveCreatureCommand,        "", NULL },
+		{ "changelevel",    SEC_GAMEMASTER,     false, &ChatHandler::HandleChangeLevelCommand,         "", NULL },
+		{ "setmodel",       SEC_GAMEMASTER,     false, &ChatHandler::HandleSetModelCommand,            "", NULL },
+		{ "additem",        SEC_GAMEMASTER,     false, &ChatHandler::HandleAddVendorItemCommand,       "", NULL },
+		{ "delitem",        SEC_GAMEMASTER,     false, &ChatHandler::HandleDelVendorItemCommand,       "", NULL },
+		{ "flag",           SEC_GAMEMASTER,     false, &ChatHandler::HandleNPCFlagCommand,             "", NULL },
+		{ "changeentry",    SEC_ADMINISTRATOR,  false, &ChatHandler::HandleChangeEntryCommand,         "", NULL },
+		{ "info",           SEC_ADMINISTRATOR,  false, &ChatHandler::HandleNpcInfoCommand,             "", NULL },
+		{ "playemote",      SEC_ADMINISTRATOR,  false, &ChatHandler::HandlePlayEmoteCommand,           "", NULL },
 
         //{ TODO: fix or remove this commands
-        { "name",           SEC_GAMEMASTER,     &ChatHandler::HandleNameCommand,                "", NULL },
-        { "subname",        SEC_GAMEMASTER,     &ChatHandler::HandleSubNameCommand,             "", NULL },
-        { "addweapon",      SEC_ADMINISTRATOR,  &ChatHandler::HandleAddWeaponCommand,           "", NULL },
+        { "name",           SEC_GAMEMASTER,     false, &ChatHandler::HandleNameCommand,                "", NULL },
+		{ "subname",        SEC_GAMEMASTER,     false, &ChatHandler::HandleSubNameCommand,             "", NULL },
+		{ "addweapon",      SEC_ADMINISTRATOR,  false, &ChatHandler::HandleAddWeaponCommand,           "", NULL },
         //}
 
-        { NULL,             0,                  NULL,                                           "", NULL }
+        { NULL,             0,                  false, NULL,                                           "", NULL }
     };
 
     static ChatCommand goCommandTable[] =
     {
-        { "grid",           SEC_MODERATOR,      &ChatHandler::HandleGoGridCommand,              "", NULL },
-        { "creature",       SEC_GAMEMASTER,     &ChatHandler::HandleGoCreatureCommand,          "", NULL },
-        { "object",         SEC_GAMEMASTER,     &ChatHandler::HandleGoObjectCommand,            "", NULL },
-        { "trigger",        SEC_GAMEMASTER,     &ChatHandler::HandleGoTriggerCommand,           "", NULL },
-        { "graveyard",      SEC_GAMEMASTER,     &ChatHandler::HandleGoGraveyardCommand,         "", NULL },
-        { "zonexy",         SEC_MODERATOR,      &ChatHandler::HandleGoZoneXYCommand,            "", NULL },
-        { "xy",             SEC_MODERATOR,      &ChatHandler::HandleGoXYCommand,                "", NULL },
-        { "xyz",            SEC_MODERATOR,      &ChatHandler::HandleGoXYZCommand,               "", NULL },
-        { "",               SEC_MODERATOR,      &ChatHandler::HandleGoXYZCommand,               "", NULL },
-        { NULL,             0,                  NULL,                                           "", NULL }
+        { "grid",           SEC_MODERATOR,      false, &ChatHandler::HandleGoGridCommand,              "", NULL },
+		{ "creature",       SEC_GAMEMASTER,     false, &ChatHandler::HandleGoCreatureCommand,          "", NULL },
+		{ "object",         SEC_GAMEMASTER,     false, &ChatHandler::HandleGoObjectCommand,            "", NULL },
+		{ "trigger",        SEC_GAMEMASTER,     false, &ChatHandler::HandleGoTriggerCommand,           "", NULL },
+		{ "graveyard",      SEC_GAMEMASTER,     false, &ChatHandler::HandleGoGraveyardCommand,         "", NULL },
+		{ "zonexy",         SEC_MODERATOR,      false, &ChatHandler::HandleGoZoneXYCommand,            "", NULL },
+		{ "xy",             SEC_MODERATOR,      false, &ChatHandler::HandleGoXYCommand,                "", NULL },
+		{ "xyz",            SEC_MODERATOR,      false, &ChatHandler::HandleGoXYZCommand,               "", NULL },
+		{ "",               SEC_MODERATOR,      false, &ChatHandler::HandleGoXYZCommand,               "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
     };
 
     static ChatCommand gobjectCommandTable[] =
     {
-        { "add",            SEC_GAMEMASTER,     &ChatHandler::HandleGameObjectCommand,          "", NULL },
-        { "delete",         SEC_GAMEMASTER,     &ChatHandler::HandleDelObjectCommand,           "", NULL },
-        { "target",         SEC_GAMEMASTER,     &ChatHandler::HandleTargetObjectCommand,        "", NULL },
-        { "turn",           SEC_GAMEMASTER,     &ChatHandler::HandleTurnObjectCommand,          "", NULL },
-        { "move",           SEC_GAMEMASTER,     &ChatHandler::HandleMoveObjectCommand,          "", NULL },
-        { "near",           SEC_ADMINISTRATOR,  &ChatHandler::HandleNearObjectCommand,          "", NULL },
-        { "state",          SEC_ADMINISTRATOR,  &ChatHandler::HandleObjectStateCommand,         "", NULL },
-        { NULL,             0,                  NULL,                                           "", NULL }
+        { "add",            SEC_GAMEMASTER,     false, &ChatHandler::HandleGameObjectCommand,          "", NULL },
+		{ "delete",         SEC_GAMEMASTER,     false, &ChatHandler::HandleDelObjectCommand,           "", NULL },
+		{ "target",         SEC_GAMEMASTER,     false, &ChatHandler::HandleTargetObjectCommand,        "", NULL },
+		{ "turn",           SEC_GAMEMASTER,     false, &ChatHandler::HandleTurnObjectCommand,          "", NULL },
+		{ "move",           SEC_GAMEMASTER,     false, &ChatHandler::HandleMoveObjectCommand,          "", NULL },
+		{ "near",           SEC_ADMINISTRATOR,  false, &ChatHandler::HandleNearObjectCommand,          "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
     };
 
     static ChatCommand questCommandTable[] =
     {
-        { "add",            SEC_ADMINISTRATOR,  &ChatHandler::HandleAddQuest,                   "", NULL },
-        { "complete",       SEC_ADMINISTRATOR,  &ChatHandler::HandleCompleteQuest,              "", NULL },
-        { "remove",         SEC_ADMINISTRATOR,  &ChatHandler::HandleRemoveQuest,                "", NULL },
-        { NULL,             0,                  NULL,                                           "", NULL }
+        { "add",            SEC_ADMINISTRATOR,  false, &ChatHandler::HandleAddQuest,                   "", NULL },
+		{ "complete",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleCompleteQuest,              "", NULL },
+		{ "remove",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleRemoveQuest,                "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
     };
 
     static ChatCommand gmCommandTable[] =
     {
-        { "chat",           SEC_MODERATOR,      &ChatHandler::HandleGMChatCommand,              "", NULL },
-        { "list",           SEC_PLAYER,         &ChatHandler::HandleGMListCommand,              "", NULL },
-        { "visible",        SEC_MODERATOR,      &ChatHandler::HandleVisibleCommand,             "", NULL },
-        { "fly",            SEC_ADMINISTRATOR,  &ChatHandler::HandleFlyModeCommand,             "", NULL },
-        { "",               SEC_MODERATOR,      &ChatHandler::HandleGMmodeCommand,              "", NULL },
-        { NULL,             0,                  NULL,                                           "", NULL }
+        { "chat",           SEC_MODERATOR,      false, &ChatHandler::HandleGMChatCommand,              "", NULL },
+		{ "ingame",         SEC_PLAYER,         true,  &ChatHandler::HandleGMListIngameCommand,        "", NULL },
+		{ "list",           SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleGMListFullCommand,          "", NULL },
+		{ "visible",        SEC_MODERATOR,      false, &ChatHandler::HandleVisibleCommand,             "", NULL },
+		{ "fly",            SEC_ADMINISTRATOR,  false, &ChatHandler::HandleFlyModeCommand,             "", NULL },
+		{ "",               SEC_MODERATOR,      false, &ChatHandler::HandleGMmodeCommand,              "", NULL },
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
     };
 
     static ChatCommand instanceCommandTable[] =
     {
-        { "listbinds",      SEC_MODERATOR,      &ChatHandler::HandleInstanceListBindsCommand,   "", NULL },
-        { "unbind",         SEC_MODERATOR,      &ChatHandler::HandleInstanceUnbindCommand,      "", NULL },
-        { "stats",          SEC_MODERATOR,      &ChatHandler::HandleInstanceStatsCommand,       "", NULL },
-        { "savedata",       SEC_MODERATOR,      &ChatHandler::HandleInstanceSaveDataCommand,    "", NULL },
-        { NULL,             0,                  NULL,                                           "", NULL }
+       { "listbinds",      SEC_MODERATOR,      false, &ChatHandler::HandleInstanceListBindsCommand,   "", NULL },
+	   { "unbind",         SEC_MODERATOR,      false, &ChatHandler::HandleInstanceUnbindCommand,      "", NULL },
+	   { "stats",          SEC_MODERATOR,      true,  &ChatHandler::HandleInstanceStatsCommand,       "", NULL },
+	   { "savedata",       SEC_MODERATOR,      false, &ChatHandler::HandleInstanceSaveDataCommand,    "", NULL },
+	   { NULL,             0,                  false, NULL,                                           "", NULL }
     };
 
     static ChatCommand commandTable[] =
     {
-        { "gm",             SEC_MODERATOR,      NULL,                                           "", gmCommandTable },
-        { "npc",            SEC_MODERATOR,      NULL,                                           "", npcCommandTable },
-        { "go",             SEC_MODERATOR,      NULL,                                           "", goCommandTable },
-        { "learn",          SEC_MODERATOR,      NULL,                                           "", learnCommandTable },
-        { "modify",         SEC_MODERATOR,      NULL,                                           "", modifyCommandTable },
-        { "debug",          SEC_MODERATOR,      NULL,                                           "", debugCommandTable },
-        { "tele",           SEC_MODERATOR,      NULL,                                           "", teleCommandTable },
-        { "event",          SEC_GAMEMASTER,     NULL,                                           "", eventCommandTable },
-        { "gobject",        SEC_GAMEMASTER,     NULL,                                           "", gobjectCommandTable },
-        { "honor",          SEC_GAMEMASTER,     NULL,                                           "", honorCommandTable },
-        { "wp",             SEC_GAMEMASTER,     NULL,                                           "", wpCommandTable },
-        { "quest",          SEC_ADMINISTRATOR,  NULL,                                           "", questCommandTable },
-        { "reload",         SEC_ADMINISTRATOR,  NULL,                                           "", reloadCommandTable },
-        { "list",           SEC_ADMINISTRATOR,  NULL,                                           "", listCommandTable },
-        { "lookup",         SEC_ADMINISTRATOR,  NULL,                                           "", lookupCommandTable },
-        { "pdump",          SEC_ADMINISTRATOR,  NULL,                                           "", pdumpCommandTable },
-        { "group",          SEC_ADMINISTRATOR,  NULL,                                           "", groupCommandTable },
-        { "guild",          SEC_ADMINISTRATOR,  NULL,                                           "", guildCommandTable },
-        { "cast",           SEC_ADMINISTRATOR,  NULL,                                           "", castCommandTable },
-        { "reset",          SEC_ADMINISTRATOR,  NULL,                                           "", resetCommandTable },
-        { "instance",       SEC_ADMINISTRATOR,  NULL,                                           "", instanceCommandTable },
-        { "server",         SEC_ADMINISTRATOR,  NULL,                                           "", serverCommandTable },
-
-        { "aura",           SEC_ADMINISTRATOR,  &ChatHandler::HandleAuraCommand,                "", NULL },
-        { "unaura",         SEC_ADMINISTRATOR,  &ChatHandler::HandleUnAuraCommand,              "", NULL },
-        { "acct",           SEC_PLAYER,         &ChatHandler::HandleAcctCommand,                "", NULL },
-        { "nameannounce",   SEC_MODERATOR,      &ChatHandler::HandleNameAnnounceCommand,        "", NULL },
-        { "announce",       SEC_ADMINISTRATOR,  &ChatHandler::HandleAnnounceCommand,            "", NULL },
-        { "notify",         SEC_MODERATOR,      &ChatHandler::HandleNotifyCommand,              "", NULL },
-        { "goname",         SEC_MODERATOR,      &ChatHandler::HandleGonameCommand,              "", NULL },
-        { "namego",         SEC_MODERATOR,      &ChatHandler::HandleNamegoCommand,              "", NULL },
-        { "groupgo",        SEC_MODERATOR,      &ChatHandler::HandleGroupgoCommand,             "", NULL },
-        { "commands",       SEC_PLAYER,         &ChatHandler::HandleCommandsCommand,            "", NULL },
-        { "demorph",        SEC_GAMEMASTER,     &ChatHandler::HandleDeMorphCommand,             "", NULL },
-        { "die",            SEC_ADMINISTRATOR,  &ChatHandler::HandleDieCommand,                 "", NULL },
-        { "revive",         SEC_ADMINISTRATOR,  &ChatHandler::HandleReviveCommand,              "", NULL },
-        { "dismount",       SEC_PLAYER,         &ChatHandler::HandleDismountCommand,            "", NULL },
-        { "gps",            SEC_MODERATOR,      &ChatHandler::HandleGPSCommand,                 "", NULL },
-        { "guid",           SEC_GAMEMASTER,     &ChatHandler::HandleGUIDCommand,                "", NULL },
-        { "help",           SEC_PLAYER,         &ChatHandler::HandleHelpCommand,                "", NULL },
-        { "itemmove",       SEC_GAMEMASTER,     &ChatHandler::HandleItemMoveCommand,            "", NULL },
-        { "cooldown",       SEC_ADMINISTRATOR,  &ChatHandler::HandleCooldownCommand,            "", NULL },
-        { "unlearn",        SEC_ADMINISTRATOR,  &ChatHandler::HandleUnLearnCommand,             "", NULL },
-        { "distance",       SEC_ADMINISTRATOR,  &ChatHandler::HandleGetDistanceCommand,         "", NULL },
-        { "recall",         SEC_MODERATOR,      &ChatHandler::HandleRecallCommand,              "", NULL },
-        { "save",           SEC_PLAYER,         &ChatHandler::HandleSaveCommand,                "", NULL },
-        { "saveall",        SEC_MODERATOR,      &ChatHandler::HandleSaveAllCommand,             "", NULL },
-        { "kick",           SEC_GAMEMASTER,     &ChatHandler::HandleKickPlayerCommand,          "", NULL },
-        { "security",       SEC_ADMINISTRATOR,  &ChatHandler::HandleSecurityCommand,            "", NULL },
-        { "ban",            SEC_ADMINISTRATOR,  &ChatHandler::HandleBanCommand,                 "", NULL },
-        { "unban",          SEC_ADMINISTRATOR,  &ChatHandler::HandleUnBanCommand,               "", NULL },
-        { "baninfo",        SEC_ADMINISTRATOR,  &ChatHandler::HandleBanInfoCommand,             "", NULL },
-        { "banlist",        SEC_ADMINISTRATOR,  &ChatHandler::HandleBanListCommand,             "", NULL },
-        { "plimit",         SEC_ADMINISTRATOR,  &ChatHandler::HandlePLimitCommand,              "", NULL },
-        { "start",          SEC_PLAYER,         &ChatHandler::HandleStartCommand,               "", NULL },
-        { "taxicheat",      SEC_MODERATOR,      &ChatHandler::HandleTaxiCheatCommand,           "", NULL },
-        { "allowmove",      SEC_ADMINISTRATOR,  &ChatHandler::HandleAllowMovementCommand,       "", NULL },
-        { "linkgrave",      SEC_ADMINISTRATOR,  &ChatHandler::HandleLinkGraveCommand,           "", NULL },
-        { "neargrave",      SEC_ADMINISTRATOR,  &ChatHandler::HandleNearGraveCommand,           "", NULL },
-        { "transport",      SEC_ADMINISTRATOR,  &ChatHandler::HandleSpawnTransportCommand,      "", NULL },
-        { "explorecheat",   SEC_ADMINISTRATOR,  &ChatHandler::HandleExploreCheatCommand,        "", NULL },
-        { "hover",          SEC_ADMINISTRATOR,  &ChatHandler::HandleHoverCommand,               "", NULL },
-        { "levelup",        SEC_ADMINISTRATOR,  &ChatHandler::HandleLevelUpCommand,             "", NULL },
-        { "showarea",       SEC_ADMINISTRATOR,  &ChatHandler::HandleShowAreaCommand,            "", NULL },
-        { "hidearea",       SEC_ADMINISTRATOR,  &ChatHandler::HandleHideAreaCommand,            "", NULL },
-        { "additem",        SEC_ADMINISTRATOR,  &ChatHandler::HandleAddItemCommand,             "", NULL },
-        { "additemset",     SEC_ADMINISTRATOR,  &ChatHandler::HandleAddItemSetCommand,          "", NULL },
-        { "bank",           SEC_ADMINISTRATOR,  &ChatHandler::HandleBankCommand,                "", NULL },
-        { "wchange",        SEC_ADMINISTRATOR,  &ChatHandler::HandleChangeWeather,              "", NULL },
-        { "ticket",         SEC_GAMEMASTER,     &ChatHandler::HandleTicketCommand,              "", NULL },
-        { "delticket",      SEC_GAMEMASTER,     &ChatHandler::HandleDelTicketCommand,           "", NULL },
-        { "maxskill",       SEC_ADMINISTRATOR,  &ChatHandler::HandleMaxSkillCommand,            "", NULL },
-        { "setskill",       SEC_ADMINISTRATOR,  &ChatHandler::HandleSetSkillCommand,            "", NULL },
-        { "whispers",       SEC_MODERATOR,      &ChatHandler::HandleWhispersCommand,            "", NULL },
-        { "pinfo",          SEC_GAMEMASTER,     &ChatHandler::HandlePInfoCommand,               "", NULL },
-        { "password",       SEC_PLAYER,         &ChatHandler::HandlePasswordCommand,            "", NULL },
-        { "lockaccount",    SEC_PLAYER,         &ChatHandler::HandleLockAccountCommand,         "", NULL },
-        { "respawn",        SEC_ADMINISTRATOR,  &ChatHandler::HandleRespawnCommand,             "", NULL },
-        { "sendmail",       SEC_MODERATOR,      &ChatHandler::HandleSendMailCommand,            "", NULL },
-        { "rename",         SEC_GAMEMASTER,     &ChatHandler::HandleRenameCommand,              "", NULL },
-        { "loadscripts",    SEC_ADMINISTRATOR,  &ChatHandler::HandleLoadScriptsCommand,         "", NULL },
-        { "mute",           SEC_GAMEMASTER,     &ChatHandler::HandleMuteCommand,                "", NULL },
-        { "unmute",         SEC_GAMEMASTER,     &ChatHandler::HandleUnmuteCommand,              "", NULL },
-        { "movegens",       SEC_ADMINISTRATOR,  &ChatHandler::HandleMovegensCommand,            "", NULL },
-        { "cometome",       SEC_ADMINISTRATOR,  &ChatHandler::HandleComeToMeCommand,            "", NULL },
-        { "damage",         SEC_ADMINISTRATOR,  &ChatHandler::HandleDamageCommand,              "", NULL },
-        { "combatstop",     SEC_GAMEMASTER,     &ChatHandler::HandleCombatStopCommand,          "", NULL },
-        { "freeze",         SEC_ADMINISTRATOR,  &ChatHandler::HandleFreezeCommand,              "", NULL },
-        { "unfreeze",       SEC_ADMINISTRATOR,  &ChatHandler::HandleUnFreezeCommand,            "", NULL },
-        { "listfreeze",     SEC_ADMINISTRATOR,  &ChatHandler::HandleListFreezeCommand,          "", NULL },
-        { "flusharenapoints",    SEC_ADMINISTRATOR, &ChatHandler::HandleFlushArenaPointsCommand,         "",   NULL },
-
-        { NULL,             0,                  NULL,                                           "", NULL }
+        { "account",        SEC_PLAYER,         true,  NULL,                                           "", accountCommandTable },
+		{ "gm",             SEC_MODERATOR,      true,  NULL,                                           "", gmCommandTable },
+		{ "npc",            SEC_MODERATOR,      false, NULL,                                           "", npcCommandTable },
+		{ "go",             SEC_MODERATOR,      false, NULL,                                           "", goCommandTable },
+		{ "learn",          SEC_MODERATOR,      false, NULL,                                           "", learnCommandTable },
+		{ "modify",         SEC_MODERATOR,      false, NULL,                                           "", modifyCommandTable },
+		{ "debug",          SEC_MODERATOR,      false, NULL,                                           "", debugCommandTable },
+		{ "tele",           SEC_MODERATOR,      true,  NULL,                                           "", teleCommandTable },
+		{ "event",          SEC_GAMEMASTER,     false, NULL,                                           "", eventCommandTable },
+		{ "gobject",        SEC_GAMEMASTER,     false, NULL,                                           "", gobjectCommandTable },
+		{ "honor",          SEC_GAMEMASTER,     false, NULL,                                           "", honorCommandTable },
+		{ "wp",             SEC_GAMEMASTER,     false, NULL,                                           "", wpCommandTable },
+		{ "quest",          SEC_ADMINISTRATOR,  false, NULL,                                           "", questCommandTable },
+		{ "reload",         SEC_ADMINISTRATOR,  true,  NULL,                                           "", reloadCommandTable },
+		{ "list",           SEC_ADMINISTRATOR,  true,  NULL,                                           "", listCommandTable },
+		{ "lookup",         SEC_ADMINISTRATOR,  true,  NULL,                                           "", lookupCommandTable },
+		{ "pdump",          SEC_ADMINISTRATOR,  true,  NULL,                                           "", pdumpCommandTable },
+		{ "guild",          SEC_ADMINISTRATOR,  true,  NULL,                                           "", guildCommandTable },
+		{ "cast",           SEC_ADMINISTRATOR,  false, NULL,                                           "", castCommandTable },
+		{ "reset",          SEC_ADMINISTRATOR,  false, NULL,                                           "", resetCommandTable },
+		{ "instance",       SEC_ADMINISTRATOR,  true,  NULL,                                           "", instanceCommandTable },
+		{ "server",         SEC_ADMINISTRATOR,  true,  NULL,                                           "", serverCommandTable },
+
+		{ "aura",           SEC_ADMINISTRATOR,  false, &ChatHandler::HandleAuraCommand,                "", NULL },
+		{ "unaura",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleUnAuraCommand,              "", NULL },
+		{ "announce",       SEC_MODERATOR,      true,  &ChatHandler::HandleAnnounceCommand,            "", NULL },
+		{ "notify",         SEC_MODERATOR,      true,  &ChatHandler::HandleNotifyCommand,              "", NULL },
+		{ "goname",         SEC_MODERATOR,      false, &ChatHandler::HandleGonameCommand,              "", NULL },
+		{ "namego",         SEC_MODERATOR,      false, &ChatHandler::HandleNamegoCommand,              "", NULL },
+		{ "groupgo",        SEC_MODERATOR,      false, &ChatHandler::HandleGroupgoCommand,             "", NULL },
+		{ "commands",       SEC_PLAYER,         true,  &ChatHandler::HandleCommandsCommand,            "", NULL },
+		{ "demorph",        SEC_GAMEMASTER,     false, &ChatHandler::HandleDeMorphCommand,             "", NULL },
+		{ "die",            SEC_ADMINISTRATOR,  false, &ChatHandler::HandleDieCommand,                 "", NULL },
+		{ "revive",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleReviveCommand,              "", NULL },
+		{ "dismount",       SEC_PLAYER,         false, &ChatHandler::HandleDismountCommand,            "", NULL },
+		{ "gps",            SEC_MODERATOR,      false, &ChatHandler::HandleGPSCommand,                 "", NULL },
+		{ "guid",           SEC_GAMEMASTER,     false, &ChatHandler::HandleGUIDCommand,                "", NULL },
+		{ "help",           SEC_PLAYER,         true,  &ChatHandler::HandleHelpCommand,                "", NULL },
+		{ "itemmove",       SEC_GAMEMASTER,     false, &ChatHandler::HandleItemMoveCommand,            "", NULL },
+		{ "cooldown",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleCooldownCommand,            "", NULL },
+		{ "unlearn",        SEC_ADMINISTRATOR,  false, &ChatHandler::HandleUnLearnCommand,             "", NULL },
+		{ "distance",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleGetDistanceCommand,         "", NULL },
+		{ "recall",         SEC_MODERATOR,      false, &ChatHandler::HandleRecallCommand,              "", NULL },
+		{ "save",           SEC_PLAYER,         false, &ChatHandler::HandleSaveCommand,                "", NULL },
+		{ "saveall",        SEC_MODERATOR,      true,  &ChatHandler::HandleSaveAllCommand,             "", NULL },
+		{ "kick",           SEC_GAMEMASTER,     true,  &ChatHandler::HandleKickPlayerCommand,          "", NULL },
+		{ "ban",            SEC_ADMINISTRATOR,  true,  NULL,                                           "", banCommandTable },
+		{ "unban",          SEC_ADMINISTRATOR,  true,  NULL,                                           "", unbanCommandTable },
+		{ "baninfo",        SEC_ADMINISTRATOR,  false, NULL,                                           "", baninfoCommandTable },
+		{ "banlist",        SEC_ADMINISTRATOR,  true,  NULL,                                           "", banlistCommandTable },
+		{ "plimit",         SEC_ADMINISTRATOR,  true,  &ChatHandler::HandlePLimitCommand,              "", NULL },
+		{ "start",          SEC_PLAYER,         false, &ChatHandler::HandleStartCommand,               "", NULL },
+		{ "taxicheat",      SEC_MODERATOR,      false, &ChatHandler::HandleTaxiCheatCommand,           "", NULL },
+		{ "allowmove",      SEC_ADMINISTRATOR,  false, &ChatHandler::HandleAllowMovementCommand,       "", NULL },
+		{ "linkgrave",      SEC_ADMINISTRATOR,  false, &ChatHandler::HandleLinkGraveCommand,           "", NULL },
+		{ "neargrave",      SEC_ADMINISTRATOR,  false, &ChatHandler::HandleNearGraveCommand,           "", NULL },
+		{ "explorecheat",   SEC_ADMINISTRATOR,  false, &ChatHandler::HandleExploreCheatCommand,        "", NULL },
+		{ "hover",          SEC_ADMINISTRATOR,  false, &ChatHandler::HandleHoverCommand,               "", NULL },
+		{ "levelup",        SEC_ADMINISTRATOR,  false, &ChatHandler::HandleLevelUpCommand,             "", NULL },
+		{ "showarea",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleShowAreaCommand,            "", NULL },
+		{ "hidearea",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleHideAreaCommand,            "", NULL },
+		{ "additem",        SEC_ADMINISTRATOR,  false, &ChatHandler::HandleAddItemCommand,             "", NULL },
+		{ "additemset",     SEC_ADMINISTRATOR,  false, &ChatHandler::HandleAddItemSetCommand,          "", NULL },
+		{ "bank",           SEC_ADMINISTRATOR,  false, &ChatHandler::HandleBankCommand,                "", NULL },
+		{ "wchange",        SEC_ADMINISTRATOR,  false, &ChatHandler::HandleChangeWeather,              "", NULL },
+		{ "ticket",         SEC_GAMEMASTER,     true,  &ChatHandler::HandleTicketCommand,              "", NULL },
+		{ "delticket",      SEC_GAMEMASTER,     true,  &ChatHandler::HandleDelTicketCommand,           "", NULL },
+		{ "maxskill",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleMaxSkillCommand,            "", NULL },
+		{ "setskill",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleSetSkillCommand,            "", NULL },
+		{ "whispers",       SEC_MODERATOR,      false, &ChatHandler::HandleWhispersCommand,            "", NULL },
+		{ "pinfo",          SEC_GAMEMASTER,     true,  &ChatHandler::HandlePInfoCommand,               "", NULL },
+		{ "password",       SEC_PLAYER,         false, &ChatHandler::HandlePasswordCommand,            "", NULL },
+		{ "lockaccount",    SEC_PLAYER,         false, &ChatHandler::HandleLockAccountCommand,         "", NULL },
+		{ "respawn",        SEC_ADMINISTRATOR,  false, &ChatHandler::HandleRespawnCommand,             "", NULL },
+		{ "sendmail",       SEC_MODERATOR,      false, &ChatHandler::HandleSendMailCommand,            "", NULL },
+		{ "rename",         SEC_GAMEMASTER,     true,  &ChatHandler::HandleRenameCommand,              "", NULL },
+		{ "loadscripts",    SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleLoadScriptsCommand,         "", NULL },
+		{ "mute",           SEC_GAMEMASTER,     true,  &ChatHandler::HandleMuteCommand,                "", NULL },
+		{ "unmute",         SEC_GAMEMASTER,     true,  &ChatHandler::HandleUnmuteCommand,              "", NULL },
+		{ "movegens",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleMovegensCommand,            "", NULL },
+		{ "cometome",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleComeToMeCommand,            "", NULL },
+		{ "damage",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleDamageCommand,              "", NULL },
+		{ "combatstop",     SEC_GAMEMASTER,     false, &ChatHandler::HandleCombatStopCommand,          "", NULL },
+		{ "chardelete",     SEC_CONSOLE,        true,  &ChatHandler::HandleCombatStopCommand,          "", NULL },
+		{ "sendmessage",    SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleSendMessageCommand,         "", NULL },
+
+		{ NULL,             0,                  false, NULL,                                           "", NULL }
     };
 
@@ -530,7 +582,13 @@
 }
 
-const char *ChatHandler::GetTrinityString(int32 entry)
+const char *ChatHandler::GetTrinityString(int32 entry) const
 {
     return m_session->GetTrinityString(entry);
+}
+
+bool ChatHandler::isAvailable(ChatCommand const& cmd) const
+{
+	// check security level only for simple  command (without child commands)
+	return m_session->GetSecurity() >= cmd.SecurityLevel;
 }
 
@@ -579,4 +637,5 @@
 void ChatHandler::SendGlobalSysMessage(const char *str)
 {
+	// Chat output
     WorldPacket data;
 
@@ -654,6 +713,6 @@
         }
 
-        // check security level only for simple  command (without child commands)
-        if(m_session->GetSecurity() < table[i].SecurityLevel)
+        // must be available and have handler
+		if(!table[i].Handler || !isAvailable(table[i]))
             continue;
 
@@ -664,9 +723,13 @@
             if(table[i].SecurityLevel > SEC_PLAYER)
             {
-                Player* p = m_session->GetPlayer();
-                uint64 sel_guid = p->GetSelection();
-                sLog.outCommand("Command: %s [Player: %s (Account: %u) X: %f Y: %f Z: %f Map: %u Selected: %s (GUID: %u)]",
-                    fullcmd.c_str(),p->GetName(),m_session->GetAccountId(),p->GetPositionX(),p->GetPositionY(),p->GetPositionZ(),p->GetMapId(),
-                    GetLogNameForGuid(sel_guid),GUID_LOPART(sel_guid));
+                // chat case
+				if(m_session)
+				{
+					Player* p = m_session->GetPlayer();
+					uint64 sel_guid = p->GetSelection();
+					sLog.outCommand("Command: %s [Player: %s (Account: %u) X: %f Y: %f Z: %f Map: %u Selected: %s (GUID: %u)]",
+						fullcmd.c_str(),p->GetName(),m_session->GetAccountId(),p->GetPositionX(),p->GetPositionY(),p->GetPositionZ(),p->GetMapId(),
+						GetLogNameForGuid(sel_guid),GUID_LOPART(sel_guid));
+				}
             }
         }
@@ -694,16 +757,22 @@
     //    return 0;
 
-    if(text[0] != '!' && text[0] != '.')
-        return 0;
-
-    // ignore single . and ! in line
+    /// chat case (.command or !command format)
+	if(m_session)
+	{
+		if(text[0] != '!' && text[0] != '.')
+			return 0;
+	}
+
+    /// ignore single . and ! in line
     if(strlen(text) < 2)
         return 0;
 
-    // ignore messages staring from many dots.
+    /// ignore messages staring from many dots.
     if(text[0] == '.' && text[1] == '.' || text[0] == '!' && text[1] == '!')
         return 0;
 
-    ++text;
+    /// skip first . or ! (in console allowed use command with . and ! and without its)
+	if(text[0] == '!' || text[0] == '.')
+		++text;
 
     std::string fullcmd = text;                             // original `text` can't be used. It content destroyed in command code processing.
@@ -720,5 +789,6 @@
     for(uint32 i = 0; table[i].Name != NULL; ++i)
     {
-        if(m_session->GetSecurity() < table[i].SecurityLevel)
+		// must be available (ignore handler existence for show command with possibe avalable subcomands
+        if(!isAvailable(table[i]))
             continue;
 
@@ -727,4 +797,6 @@
 
         (list += "\n    ") += table[i].Name;
+		if(table[i].ChildCommands)
+			list += " ...";
     }
 
@@ -749,5 +821,6 @@
         for(uint32 i = 0; table[i].Name != NULL; ++i)
         {
-            if(m_session->GetSecurity() < table[i].SecurityLevel)
+			// must be available (ignore handler existence for show command with possibe avalable subcomands
+            if(!isAvailable(table[i]))
                 continue;
 
@@ -778,5 +851,6 @@
         for(uint32 i = 0; table[i].Name != NULL; ++i)
         {
-            if(m_session->GetSecurity() < table[i].SecurityLevel)
+			// must be available (ignore handler existence for show command with possibe avalable subcomands
+            if(!isAvailable(table[i]))
                 continue;
 
@@ -879,4 +953,7 @@
 Player * ChatHandler::getSelectedPlayer()
 {
+	if(!m_session)
+		return NULL;
+
     uint64 guid  = m_session->GetPlayer()->GetSelection();
 
@@ -889,4 +966,7 @@
 Unit* ChatHandler::getSelectedUnit()
 {
+	if(!m_session)
+		return NULL;
+
     uint64 guid = m_session->GetPlayer()->GetSelection();
 
@@ -899,4 +979,7 @@
 Creature* ChatHandler::getSelectedCreature()
 {
+	if(!m_session)
+		return NULL;
+
     return ObjectAccessor::GetCreatureOrPet(*m_session->GetPlayer(),m_session->GetPlayer()->GetSelection());
 }
@@ -1037,4 +1120,7 @@
 GameObject* ChatHandler::GetObjectGlobalyWithGuidOrNearWithDbGuid(uint32 lowguid,uint32 entry)
 {
+	if(!m_session)
+		return NULL;
+
     Player* pl = m_session->GetPlayer();
 
@@ -1109,4 +1195,21 @@
 
     return objmgr.GetGameTele(cId);
+}
+
+const char *CliHandler::GetTrinityString(int32 entry) const
+{
+	return objmgr.GetTrinityStringForDBCLocale(entry);
+}
+
+bool CliHandler::isAvailable(ChatCommand const& cmd) const
+{
+	// skip non-console commands in console case
+	return cmd.AllowConsole;
+}
+
+void CliHandler::SendSysMessage(const char *str)
+{
+	m_print(str);
+	m_print("\r\n");
 }
 
Index: trunk/src/game/PlayerDump.h
===================================================================
--- trunk/src/game/PlayerDump.h (revision 102)
+++ trunk/src/game/PlayerDump.h (revision 112)
@@ -74,4 +74,13 @@
 };
 
+enum DumpReturn
+{
+	DUMP_SUCCESS,
+	DUMP_FILE_OPEN_ERROR,
+	DUMP_TOO_MANY_CHARS,
+	DUMP_UNEXPECTED_END,
+	DUMP_FILE_BROKEN,
+};
+
 class PlayerDump
 {
@@ -86,9 +95,9 @@
 
         std::string GetDump(uint32 guid);
-        bool WriteDump(std::string file, uint32 guid);
+        DumpReturn WriteDump(std::string file, uint32 guid);
     private:
         typedef std::set<uint32> GUIDs;
 
-        bool DumpTable(std::string& dump, uint32 guid, char const*tableFrom, char const*tableTo, DumpTableType type);
+        void DumpTable(std::string& dump, uint32 guid, char const*tableFrom, char const*tableTo, DumpTableType type);
         std::string GenerateWhereStr(char const* field, GUIDs const& guids, GUIDs::const_iterator& itr);
         std::string GenerateWhereStr(char const* field, uint32 guid);
@@ -105,5 +114,5 @@
         PlayerDumpReader() {}
 
-        bool LoadDump(std::string file, uint32 account, std::string name, uint32 guid);
+        DumpReturn LoadDump(std::string file, uint32 account, std::string name, uint32 guid);
 };
 
Index: trunk/src/game/World.h
===================================================================
--- trunk/src/game/World.h (revision 102)
+++ trunk/src/game/World.h (revision 112)
@@ -29,4 +29,5 @@
 #include "Timer.h"
 #include "Policies/Singleton.h"
+#include "SharedDefines.h"
 
 #include <map>
@@ -41,5 +42,4 @@
 struct ScriptAction;
 struct ScriptInfo;
-class CliCommandHolder;
 class SqlResultQueue;
 class QueryResult;
@@ -297,12 +297,4 @@
 };
 
-/// Ban function return codes
-enum BanReturn
-{
-    BAN_SUCCESS,
-    BAN_SYNTAX_ERROR,
-    BAN_NOTFOUND
-};
-
 // DB scripting commands
 #define SCRIPT_COMMAND_TALK                  0              // source = unit, target=any, datalong ( 0=say, 1=whisper, 2=yell, 3=emote text)
@@ -322,35 +314,21 @@
 #define SCRIPT_COMMAND_CAST_SPELL           15              // source (datalong2!=0) or target (datalong==0) unit, datalong = spell_id
 
-/// CLI related stuff, define here to prevent cyclic dependancies
-
-typedef int(* pPrintf)(const char*,...);
-typedef void(* pCliFunc)(char *,pPrintf);
-
-/// Command Template class
-struct CliCommand
-{
-    char const * cmd;
-    pCliFunc Func;
-    char const * description;
-};
-
 /// Storage class for commands issued for delayed execution
-class CliCommandHolder
-{
-    private:
-        const CliCommand *cmd;
-        char *args;
-        pPrintf m_zprintf;
-    public:
-        CliCommandHolder(const CliCommand *command, const char *arguments, pPrintf p_zprintf)
-            : cmd(command), m_zprintf(p_zprintf)
-        {
-            size_t len = strlen(arguments)+1;
-            args = new char[len];
-            memcpy(args, arguments, len);
-        }
-        ~CliCommandHolder() { delete[] args; }
-        void Execute() const { cmd->Func(args, m_zprintf); }
-        pPrintf GetOutputMethod() const {return (m_zprintf);}
+struct CliCommandHolder
+{
+	typedef void Print(const char*);
+
+	char *m_command;
+	Print* m_print;
+
+	CliCommandHolder(const char *command, Print* zprint)
+		: m_print(zprint)
+	{
+		size_t len = strlen(command)+1;
+		m_command = new char[len];
+		memcpy(m_command, command, len);
+	}
+
+	~CliCommandHolder() { delete[] m_command; }
 };
 
@@ -475,6 +453,6 @@
         void KickAllLess(AccountTypes sec);
         void KickAllQueued();
-        uint8 BanAccount(std::string type, std::string nameOrIP, std::string duration, std::string reason, std::string author);
-        bool RemoveBanAccount(std::string type, std::string nameOrIP);
+        BanReturn BanAccount(BanMode mode, std::string nameOrIP, std::string duration, std::string reason, std::string author);
+		bool RemoveBanAccount(BanMode mode, std::string nameOrIP);
 
         void ScriptsStart(std::map<uint32, std::multimap<uint32, ScriptInfo> > const& scripts, uint32 id, Object* source, Object* target);
@@ -493,5 +471,5 @@
 
         void ProcessCliCommands();
-        void QueueCliCommand(CliCommandHolder* command) { cliCmdQueue.add(command); }
+        void QueueCliCommand( CliCommandHolder::Print* zprintf, char const* input ) { cliCmdQueue.add(new CliCommandHolder(input, zprintf)); }
 
         void UpdateResultQueue();
Index: trunk/src/game/WorldSession.h
===================================================================
--- trunk/src/game/WorldSession.h (revision 102)
+++ trunk/src/game/WorldSession.h (revision 112)
@@ -195,7 +195,7 @@
 
         // Locales
-        LocaleConstant GetSessionDbcLocale() { return m_sessionDbcLocale; }
-        int GetSessionDbLocaleIndex() { return m_sessionDbLocaleIndex; }
-        const char *GetTrinityString(int32 entry);
+        LocaleConstant GetSessionDbcLocale() const { return m_sessionDbcLocale; }
+		int GetSessionDbLocaleIndex() const { return m_sessionDbLocaleIndex; }
+		const char *GetTrinityString(int32 entry) const;
 
         uint32 GetLatency() const { return m_latency; }
Index: trunk/src/game/ObjectMgr.h
===================================================================
--- trunk/src/game/ObjectMgr.h (revision 102)
+++ trunk/src/game/ObjectMgr.h (revision 112)
@@ -681,4 +681,5 @@
         const char *GetTrinityString(int32 entry, int locale_idx) const;
         const char *GetTrinityStringForDBCLocale(int32 entry) const { return GetTrinityString(entry,DBCLocaleIndex); }
+		int32 GetDBCLocaleIndex() const { return DBCLocaleIndex; }
         void SetDBCLocaleIndex(uint32 lang) { DBCLocaleIndex = GetIndexForLocale(LocaleConstant(lang)); }
 
Index: trunk/src/game/Level0.cpp
===================================================================
--- trunk/src/game/Level0.cpp (revision 102)
+++ trunk/src/game/Level0.cpp (revision 112)
@@ -36,13 +36,15 @@
 bool ChatHandler::HandleHelpCommand(const char* args)
 {
-    if(!*args)
-        return false;
-
-    char* cmd = strtok((char*)args, " ");
+	char* cmd = strtok((char*)args, " ");
     if(!cmd)
-        return false;
-
-    if(!ShowHelpForCommand(getCommandTable(), cmd))
-        SendSysMessage(LANG_NO_HELP_CMD);
+	{
+		ShowHelpForCommand(getCommandTable(), "help");
+		ShowHelpForCommand(getCommandTable(), "");
+	}
+	else
+	{
+		if(!ShowHelpForCommand(getCommandTable(), cmd))
+			SendSysMessage(LANG_NO_HELP_CMD);
+	}
 
     return true;
@@ -55,5 +57,5 @@
 }
 
-bool ChatHandler::HandleAcctCommand(const char* /*args*/)
+bool ChatHandler::HandleAccountCommand(const char* /*args*/)
 {
     uint32 gmlevel = m_session->GetSecurity();
@@ -142,5 +144,5 @@
 }
 
-bool ChatHandler::HandleGMListCommand(const char* /*args*/)
+bool ChatHandler::HandleGMListIngameCommand(const char* /*args*/)
 {
     bool first = true;
@@ -150,6 +152,7 @@
     for(; itr != m.end(); ++itr)
     {
-        if( itr->second->GetSession()->GetSecurity() && (itr->second->isGameMaster() || sWorld.getConfig(CONFIG_GM_IN_GM_LIST) ) &&
-            itr->second->IsVisibleGloballyFor(m_session->GetPlayer()) )
+        if (itr->second->GetSession()->GetSecurity() &&
+			(itr->second->isGameMaster() || sWorld.getConfig(CONFIG_GM_IN_GM_LIST)) &&
+			(!m_session || itr->second->IsVisibleGloballyFor(m_session->GetPlayer())) )
         {
             if(first)
@@ -178,5 +181,5 @@
     char *new_pass_c  = strtok (NULL, " ");
 
-    if( !old_pass || !new_pass || !new_pass_c )
+    if (!old_pass || !new_pass || !new_pass_c)
         return false;
 
@@ -185,8 +188,15 @@
     std::string password_new_c = new_pass_c;
 
-    if(!accmgr.CheckPassword(m_session->GetAccountId(), password_old) || password_new != password_new_c)
-    {
-        SendSysMessage(LANG_COMMAND_WRONGOLDPASSWORD);
-        SetSentErrorMessage(true);
+    if (password_new != password_new_c)
+    {
+        SendSysMessage (LANG_NEW_PASSWORDS_NOT_MATCH);
+		SetSentErrorMessage (true);
+		return false;
+	}
+
+	if (!accmgr.CheckPassword (m_session->GetAccountId(), password_old))
+	{
+		SendSysMessage (LANG_COMMAND_WRONGOLDPASSWORD);
+		SetSentErrorMessage (true);
         return false;
     }
@@ -199,4 +209,9 @@
             SendSysMessage(LANG_COMMAND_PASSWORD);
             break;
+		case AOR_PASS_TOO_LONG:
+			SendSysMessage(LANG_PASSWORD_TOO_LONG);
+			SetSentErrorMessage(true);
+			return false;
+		case AOR_NAME_NOT_EXIST:                            // not possible case, don't want get account name for output
         default:
             SendSysMessage(LANG_COMMAND_NOTCHANGEPASSWORD);
@@ -234,2 +249,9 @@
     return true;
 }
+
+/// Display the 'Message of the day' for the realm
+bool ChatHandler::HandleServerMotdCommand(const char* /*args*/)
+{
+	PSendSysMessage(LANG_MOTD_CURRENT, sWorld.GetMotd());
+	return true;
+}
Index: trunk/src/game/World.cpp
===================================================================
--- trunk/src/game/World.cpp (revision 111)
+++ trunk/src/game/World.cpp (revision 112)
@@ -2265,5 +2265,5 @@
 
 /// Ban an account or ban an IP address, duration will be parsed using TimeStringToSecs if it is positive, otherwise permban
-uint8 World::BanAccount(std::string type, std::string nameOrIP, std::string duration, std::string reason, std::string author)
+BanReturn World::BanAccount(BanMode mode, std::string nameOrIP, std::string duration, std::string reason, std::string author)
 {
     loginDatabase.escape_string(nameOrIP);
@@ -2272,36 +2272,34 @@
     loginDatabase.escape_string(safe_author);
 
-    if(type != "ip" && !normalizePlayerName(nameOrIP))
-        return BAN_NOTFOUND;                                // Nobody to ban
-
     uint32 duration_secs = TimeStringToSecs(duration);
     QueryResult *resultAccounts = NULL;                     //used for kicking
 
     ///- Update the database with ban information
-
-    if(type=="ip")
-    {
-        //No SQL injection as strings are escaped
-        resultAccounts = loginDatabase.PQuery("SELECT id FROM account WHERE last_ip = '%s'",nameOrIP.c_str());
-        loginDatabase.PExecute("INSERT INTO ip_banned VALUES ('%s',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+%u,'%s','%s')",nameOrIP.c_str(),duration_secs,safe_author.c_str(),reason.c_str());
-    }
-    else if(type=="account")
-    {
-        //No SQL injection as string is escaped
-        resultAccounts = loginDatabase.PQuery("SELECT id FROM account WHERE username = '%s'",nameOrIP.c_str());
-    }
-    else if(type=="character")
-    {
-        //No SQL injection as string is escaped
-        resultAccounts = CharacterDatabase.PQuery("SELECT account FROM characters WHERE name = '%s'",nameOrIP.c_str());
-    }
-    else
-        return BAN_SYNTAX_ERROR;                            //Syntax problem
-
-    if(!resultAccounts)
-        if(type=="ip")
-            return BAN_SUCCESS;                             // ip correctly banned but nobody affected (yet)
-    else
-        return BAN_NOTFOUND;                                // Nobody to ban
+	switch(mode)
+    {
+        case BAN_IP:
+			//No SQL injection as strings are escaped
+			resultAccounts = loginDatabase.PQuery("SELECT id FROM account WHERE last_ip = '%s'",nameOrIP.c_str());
+			loginDatabase.PExecute("INSERT INTO ip_banned VALUES ('%s',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+%u,'%s','%s')",nameOrIP.c_str(),duration_secs,safe_author.c_str(),reason.c_str());
+			break;
+		case BAN_ACCOUNT:
+			//No SQL injection as string is escaped
+			resultAccounts = loginDatabase.PQuery("SELECT id FROM account WHERE username = '%s'",nameOrIP.c_str());
+			break;
+		case BAN_CHARACTER:
+			//No SQL injection as string is escaped
+			resultAccounts = CharacterDatabase.PQuery("SELECT account FROM characters WHERE name = '%s'",nameOrIP.c_str());
+			break;
+		default:
+			return BAN_SYNTAX_ERROR;
+    }
+    
+	if(!resultAccounts)
+	{
+		if(mode==BAN_IP)
+            return BAN_SUCCESS;
+		else
+			return BAN_NOTFOUND;                                // Nobody to ban
+	}
 
     ///- Disconnect all affected players (for IP it can be several)
@@ -2311,11 +2309,12 @@
         uint32 account = fieldsAccount->GetUInt32();
 
-        if(type != "ip")
+        if(mode!=BAN_IP)
+		{
             //No SQL injection as strings are escaped
             loginDatabase.PExecute("INSERT INTO account_banned VALUES ('%u', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+%u, '%s', '%s', '1')",
                 account,duration_secs,safe_author.c_str(),reason.c_str());
-
-        WorldSession* sess = FindSession(account);
-        if( sess )
+		}
+
+        if (WorldSession* sess = FindSession(account))
             if(std::string(sess->GetPlayerName()) != author)
                 sess->KickPlayer();
@@ -2328,7 +2327,7 @@
 
 /// Remove a ban from an account or IP address
-bool World::RemoveBanAccount(std::string type, std::string nameOrIP)
-{
-    if(type == "ip")
+bool World::RemoveBanAccount(BanMode mode, std::string nameOrIP)
+{
+    if (mode == BAN_IP)
     {
         loginDatabase.escape_string(nameOrIP);
@@ -2338,18 +2337,9 @@
     {
         uint32 account=0;
-        if(type == "account")
-        {
-            if (!AccountMgr::normilizeString (nameOrIP))
-                return false;
-            
+        if (mode == BAN_ACCOUNT)
             account = accmgr.GetId (nameOrIP);
-        }
-        else if(type == "character")
-        {
-            if(!normalizePlayerName(nameOrIP))
-                return false;
-
+        else if (mode == BAN_CHARACTER)
             account = objmgr.GetPlayerAccountIdByPlayerName (nameOrIP);
-        }
+
         if(!account)
             return false;
@@ -2504,18 +2494,22 @@
 void World::ProcessCliCommands()
 {
-    if (cliCmdQueue.empty()) return;
-
-    CliCommandHolder *command;
-    pPrintf p_zprintf;
+    if (cliCmdQueue.empty())
+		return;
+
+    CliCommandHolder::Print* zprint;
     while (!cliCmdQueue.empty())
     {
         sLog.outDebug("CLI command under processing...");
-        command = cliCmdQueue.next();
-        command->Execute();
-        p_zprintf=command->GetOutputMethod();
+        CliCommandHolder *command = cliCmdQueue.next();
+
+		zprint = command->m_print;
+
+		CliHandler(zprint).ParseCommands(command->m_command);
+
         delete command;
     }
+
     // print the console message here so it looks right
-    p_zprintf("TC> ");
+    zprint("TC> ");
 }
 
Index: trunk/src/game/Level2.cpp
===================================================================
--- trunk/src/game/Level2.cpp (revision 102)
+++ trunk/src/game/Level2.cpp (revision 112)
@@ -43,4 +43,5 @@
 #include <fstream>
 #include <map>
+#include "GlobalEvents.h"
 
 static uint32 ReputationRankStrIndex[MAX_REPUTATION_RANK] =
@@ -100,5 +101,5 @@
     }
 
-    if(security >= m_session->GetSecurity())
+    if(m_session && security >= m_session->GetSecurity())
     {
         SendSysMessage(LANG_YOURS_SECURITY_IS_LOW);
@@ -166,5 +167,5 @@
     }
 
-    if(security >= m_session->GetSecurity())
+    if(m_session && security >= m_session->GetSecurity())
     {
         SendSysMessage(LANG_YOURS_SECURITY_IS_LOW);
@@ -556,36 +557,35 @@
 bool ChatHandler::HandleLookupFactionCommand(const char* args)
 {
-    if(!*args)
-        return false;
-
-    Player *target = getSelectedPlayer();
-    if (!target)
-    {
-        SendSysMessage(LANG_NO_CHAR_SELECTED);
-        SetSentErrorMessage(true);
-        return false;
-    }
+    if (!*args)
+        return false;
+
+    // Can be NULL at console call
+	Player *target = getSelectedPlayer ();
 
     std::string namepart = args;
     std::wstring wnamepart;
 
-    if(!Utf8toWStr(namepart,wnamepart))
+    if (!Utf8toWStr (namepart,wnamepart))
         return false;
 
     // converting string that we try to find to lower case
-    wstrToLower( wnamepart );
+    wstrToLower (wnamepart);
 
     uint32 counter = 0;                                     // Counter for figure out that we found smth.
 
-    for (uint32 id = 0; id < sFactionStore.GetNumRows(); id++)
-        //for(FactionStateList::const_iterator itr = target->m_factions.begin(); itr != target->m_factions.end(); ++itr)
-    {
-        FactionEntry const *factionEntry = sFactionStore.LookupEntry(id);
-        //FactionEntry const *factionEntry = sFactionStore.LookupEntry(itr->second.ID);
+    for (uint32 id = 0; id < sFactionStore.GetNumRows(); ++id)
+    {
+        FactionEntry const *factionEntry = sFactionStore.LookupEntry (id);
         if (factionEntry)
         {
-            FactionStateList::const_iterator repItr = target->m_factions.find(factionEntry->reputationListID);
-
-            int loc = m_session->GetSessionDbcLocale();
+            FactionState const* repState = NULL;
+			if(target)
+			{
+				FactionStateList::const_iterator repItr = target->m_factions.find (factionEntry->reputationListID);
+				if(repItr != target->m_factions.end())
+					repState = &repItr->second;
+			}
+
+            int loc = m_session ? m_session->GetSessionDbcLocale() : sWorld.GetDefaultDbcLocale();
             std::string name = factionEntry->name[loc];
             if(name.empty())
@@ -597,5 +597,5 @@
                 for(; loc < MAX_LOCALE; ++loc)
                 {
-                    if(loc==m_session->GetSessionDbcLocale())
+                    if(m_session && loc==m_session->GetSessionDbcLocale())
                         continue;
 
@@ -614,7 +614,10 @@
                 // or              "id - [faction] [no reputation]" format
                 std::ostringstream ss;
-                ss << id << " - |cffffffff|Hfaction:" << id << "|h[" << name << " " << localeNames[loc] << "]|h|r";
-
-                if (repItr != target->m_factions.end())
+                if (m_session)
+					ss << id << " - |cffffffff|Hfaction:" << id << "|h[" << name << " " << localeNames[loc] << "]|h|r";
+				else
+					ss << id << " - " << name << " " << localeNames[loc];
+
+                if (repState)                               // and then target!=NULL also
                 {
                     ReputationRank rank = target->GetReputationRank(factionEntry);
@@ -623,15 +626,15 @@
                     ss << " " << rankName << "|h|r (" << target->GetReputation(factionEntry) << ")";
 
-                    if(repItr->second.Flags & FACTION_FLAG_VISIBLE)
+                    if(repState->Flags & FACTION_FLAG_VISIBLE)
                         ss << GetTrinityString(LANG_FACTION_VISIBLE);
-                    if(repItr->second.Flags & FACTION_FLAG_AT_WAR)
+                    if(repState->Flags & FACTION_FLAG_AT_WAR)
                         ss << GetTrinityString(LANG_FACTION_ATWAR);
-                    if(repItr->second.Flags & FACTION_FLAG_PEACE_FORCED)
+                    if(repState->Flags & FACTION_FLAG_PEACE_FORCED)
                         ss << GetTrinityString(LANG_FACTION_PEACE_FORCED);
-                    if(repItr->second.Flags & FACTION_FLAG_HIDDEN)
+                    if(repState->Flags & FACTION_FLAG_HIDDEN)
                         ss << GetTrinityString(LANG_FACTION_HIDDEN);
-                    if(repItr->second.Flags & FACTION_FLAG_INVISIBLE_FORCED)
+                    if(repState->Flags & FACTION_FLAG_INVISIBLE_FORCED)
                         ss << GetTrinityString(LANG_FACTION_INVISIBLE_FORCED);
-                    if(repItr->second.Flags & FACTION_FLAG_INACTIVE)
+                    if(repState->Flags & FACTION_FLAG_INACTIVE)
                         ss << GetTrinityString(LANG_FACTION_INACTIVE);
                 }
@@ -1703,5 +1706,5 @@
         }
 
-        if(name==m_session->GetPlayer()->GetName())
+        if(m_session && name==m_session->GetPlayer()->GetName())
         {
             SendSysMessage(LANG_COMMAND_KICKSELF);
@@ -1810,5 +1813,6 @@
         username = fields[0].GetCppString();
         security = fields[1].GetUInt32();
-        if(m_session->GetSecurity() >= security)
+        
+		if(!m_session || m_session->GetSecurity() >= security)
         {
             last_ip = fields[2].GetCppString();
@@ -1892,4 +1896,11 @@
     if (!px)
     {
+		if(!m_session)
+		{
+			SendSysMessage(LANG_PLAYER_NOT_FOUND);
+			SetSentErrorMessage(true);
+			return false;
+		}
+
         size_t count;
         QueryResult *result = CharacterDatabase.Query("SELECT COUNT(ticket_id) FROM character_ticket");
@@ -1902,5 +1913,7 @@
             count = 0;
 
-        PSendSysMessage(LANG_COMMAND_TICKETCOUNT, count, m_session->GetPlayer()->isAcceptTickets() ?  GetTrinityString(LANG_ON) : GetTrinityString(LANG_OFF));
+        bool accept = m_session->GetPlayer()->isAcceptTickets();
+		
+		PSendSysMessage(LANG_COMMAND_TICKETCOUNT, count, accept ?  GetTrinityString(LANG_ON) : GetTrinityString(LANG_OFF));
         return true;
     }
@@ -1909,4 +1922,11 @@
     if(strncmp(px,"on",3) == 0)
     {
+		if(!m_session)
+		{
+			SendSysMessage(LANG_PLAYER_NOT_FOUND);
+			SetSentErrorMessage(true);
+			return false;
+		}
+
         m_session->GetPlayer()->SetAcceptTicket(true);
         SendSysMessage(LANG_COMMAND_TICKETON);
@@ -1917,4 +1937,11 @@
     if(strncmp(px,"off",4) == 0)
     {
+		if(!m_session)
+		{
+			SendSysMessage(LANG_PLAYER_NOT_FOUND);
+			SetSentErrorMessage(true);
+			return false;
+		}
+
         m_session->GetPlayer()->SetAcceptTicket(false);
         SendSysMessage(LANG_COMMAND_TICKETOFF);
@@ -3591,5 +3618,10 @@
         {
             char const* active = activeEvents.find(id) != activeEvents.end() ? GetTrinityString(LANG_ACTIVE) : "";
-            PSendSysMessage(LANG_EVENT_ENTRY_LIST,id,id,descr.c_str(),active );
+            
+			if(m_session)
+				PSendSysMessage(LANG_EVENT_ENTRY_LIST_CHAT,id,id,eventData.description.c_str(),active );
+			else
+				PSendSysMessage(LANG_EVENT_ENTRY_LIST_CONSOLE,id,eventData.description.c_str(),active );
+
             ++counter;
         }
@@ -3616,5 +3648,9 @@
         GameEventData const& eventData = events[event_id];
 
-        PSendSysMessage(LANG_EVENT_ENTRY_LIST,event_id,event_id,eventData.description.c_str(),active );
+        if(m_session)
+			PSendSysMessage(LANG_EVENT_ENTRY_LIST_CHAT,event_id,event_id,eventData.description.c_str(),active );
+		else
+			PSendSysMessage(LANG_EVENT_ENTRY_LIST_CONSOLE,event_id,eventData.description.c_str(),active );
+
         ++counter;
     }
@@ -3849,5 +3885,5 @@
     }
 
-    if(!*args)
+    if (!*args)
         return false;
 
@@ -3917,35 +3953,35 @@
 {
   
-    if(!*args)
-        return false;
-
-    std::string ip = strtok((char*)args, " ");
-    char* limit_str = strtok(NULL, " ");
-    int32 limit = limit_str ? atoi(limit_str) : -1;
-
-    loginDatabase.escape_string(ip);
-
-    QueryResult* result = loginDatabase.PQuery("SELECT id,username FROM account WHERE last_ip = '%s'", ip.c_str());
-
-    return LookupPlayerSearchCommand(result,limit);
+    if (!*args)
+        return false;
+
+    std::string ip = strtok ((char*)args, " ");
+	char* limit_str = strtok (NULL, " ");
+	int32 limit = limit_str ? atoi (limit_str) : -1;
+
+    loginDatabase.escape_string (ip);
+
+    QueryResult* result = loginDatabase.PQuery ("SELECT id,username FROM account WHERE last_ip = '%s'", ip.c_str ());
+
+    return LookupPlayerSearchCommand (result,limit);
 }
 
 bool ChatHandler::HandleLookupPlayerAccountCommand(const char* args)
 {
-    if(!*args)
-        return false;
-
-    std::string account = strtok((char*)args, " ");
-    char* limit_str = strtok(NULL, " ");
-    int32 limit = limit_str ? atoi(limit_str) : -1;
-
-    if(!AccountMgr::normilizeString(account))
-        return false;
-
-    loginDatabase.escape_string(account);
-
-    QueryResult* result = loginDatabase.PQuery("SELECT id,username FROM account WHERE username = '%s'", account.c_str());
-
-    return LookupPlayerSearchCommand(result,limit);
+    if (!*args)
+        return false;
+
+    std::string account = strtok ((char*)args, " ");
+	char* limit_str = strtok (NULL, " ");
+	int32 limit = limit_str ? atoi (limit_str) : -1;
+
+    if (!AccountMgr::normilizeString (account))
+        return false;
+
+    loginDatabase.escape_string (account);
+
+    QueryResult* result = loginDatabase.PQuery ("SELECT id,username FROM account WHERE username = '%s'", account.c_str ());
+
+    return LookupPlayerSearchCommand (result,limit);
 }
 
@@ -3953,16 +3989,16 @@
 {
   
-    if(!*args)
-        return false;
-
-    std::string email = strtok((char*)args, " ");
-    char* limit_str = strtok(NULL, " ");
-    int32 limit = limit_str ? atoi(limit_str) : -1;
-
-    loginDatabase.escape_string(email);
-
-    QueryResult* result = loginDatabase.PQuery("SELECT id,username FROM account WHERE email = '%s'", email.c_str());
-
-    return LookupPlayerSearchCommand(result,limit);
+    if (!*args)
+        return false;
+
+    std::string email = strtok ((char*)args, " ");
+	char* limit_str = strtok (NULL, " ");
+	int32 limit = limit_str ? atoi (limit_str) : -1;
+
+    loginDatabase.escape_string (email);
+
+    QueryResult* result = loginDatabase.PQuery ("SELECT id,username FROM account WHERE email = '%s'", email.c_str ());
+
+    return LookupPlayerSearchCommand (result,limit);
 }
 
@@ -4010,2 +4046,9 @@
     return true;
 }
+
+/// Triggering corpses expire check in world
+bool ChatHandler::HandleServerCorpsesCommand(const char* /*args*/)
+{
+	CorpsesErase();
+	return true;
+}
Index: trunk/src/game/WorldSession.cpp
===================================================================
--- trunk/src/game/WorldSession.cpp (revision 102)
+++ trunk/src/game/WorldSession.cpp (revision 112)
@@ -467,5 +467,5 @@
 }
 
-const char * WorldSession::GetTrinityString( int32 entry )
+const char * WorldSession::GetTrinityString( int32 entry ) const
 {
     return objmgr.GetTrinityString(entry,GetSessionDbLocaleIndex());
Index: trunk/src/game/AccountMgr.h
===================================================================
--- trunk/src/game/AccountMgr.h (revision 102)
+++ trunk/src/game/AccountMgr.h (revision 112)
@@ -51,5 +51,4 @@
 
         uint32 GetId(std::string username);
-        uint32 GetIdByGUID(const uint64 &guid) const;
         uint32 GetSecurity(uint32 acc_id);
         bool GetName(uint32 acc_id, std::string &name);
Index: trunk/src/game/SharedDefines.h
===================================================================
--- trunk/src/game/SharedDefines.h (revision 108)
+++ trunk/src/game/SharedDefines.h (revision 112)
@@ -2168,3 +2168,19 @@
     CHAR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME            = 0x5A,
 };
+
+/// Ban function modes
+enum BanMode
+{
+	BAN_ACCOUNT,
+	BAN_CHARACTER,
+	BAN_IP
+};
+
+/// Ban function return codes
+enum BanReturn
+{
+	BAN_SUCCESS,
+	BAN_SYNTAX_ERROR,
+	BAN_NOTFOUND
+};
 #endif
Index: trunk/src/game/Language.h
===================================================================
--- trunk/src/game/Language.h (revision 102)
+++ trunk/src/game/Language.h (revision 112)
@@ -80,5 +80,8 @@
     LANG_COMMAND_INVALID_ITEM_COUNT     = 52,
     LANG_COMMAND_MAIL_ITEMS_LIMIT       = 53,
-    // Room for more level 0              54-99 not used
+    LANG_NEW_PASSWORDS_NOT_MATCH        = 54,
+	LANG_PASSWORD_TOO_LONG              = 55,
+	LANG_MOTD_CURRENT                   = 56,
+	// Room for more level 0              57-99 not used
 
     // level 1 chat
@@ -164,5 +167,6 @@
     LANG_MAIL_SENT                      = 169,
     LANG_SOUND_NOT_EXIST                = 170,
-    // Room for more level 1              171-199 not used
+    LANG_TELEPORTED_TO_BY_CONSOLE       = 171,
+	// Room for more level 1              172-199 not used
 
     // level 2 chat
@@ -332,5 +336,6 @@
     LANG_UNBAN_ERROR                    = 412,
 
-    LANG_BANINFO_NOACCOUNT              = 413,
+    LANG_ACCOUNT_NOT_EXIST              = 413,
+
     LANG_BANINFO_NOCHARACTER            = 414,
     LANG_BANINFO_NOIP                   = 415,
@@ -445,14 +450,14 @@
 
     LANG_WRONG_LINK_TYPE                = 511,
-    LANG_ITEM_LIST                      = 512,
-    LANG_QUEST_LIST                     = 513,
-    LANG_CREATURE_ENTRY_LIST            = 514,
-    LANG_CREATURE_LIST                  = 515,
-    LANG_GO_ENTRY_LIST                  = 516,
-    LANG_GO_LIST                        = 517,
-    LANG_ITEMSET_LIST                   = 518,
+    LANG_ITEM_LIST_CHAT                 = 512,
+    LANG_QUEST_LIST_CHAT                = 513,
+    LANG_CREATURE_ENTRY_LIST_CHAT       = 514,
+    LANG_CREATURE_LIST_CHAT             = 515,
+    LANG_GO_ENTRY_LIST_CHAT             = 516,
+    LANG_GO_LIST_CHAT                   = 517,
+    LANG_ITEMSET_LIST_CHAT              = 518,
     LANG_TELE_LIST                      = 519,
     LANG_SPELL_LIST                     = 520,
-    LANG_SKILL_LIST                     = 521,
+    LANG_SKILL_LIST_CHAT                = 521,
 
     LANG_GAMEOBJECT_NOT_EXIST           = 522,
@@ -527,5 +532,5 @@
     LANG_COMMAND_RAWPAWNTIMES           = 582,
 
-    LANG_EVENT_ENTRY_LIST               = 583,
+    LANG_EVENT_ENTRY_LIST_CHAT          = 583,
     LANG_NOEVENTFOUND                   = 584,
     LANG_EVENT_NOT_EXIST                = 585,
@@ -539,4 +544,12 @@
 
     LANG_COMMAND_LEARN_ALL_RECIPES      = 592,
+	LANG_BANLIST_ACCOUNTS               = 593,
+	LANG_BANLIST_ACCOUNTS_HEADER        = 594,
+	LANG_BANLIST_IPS                    = 595,
+	LANG_BANLIST_IPS_HEADER             = 596,
+	LANG_GMLIST                         = 597,
+	LANG_GMLIST_HEADER                  = 598,
+	LANG_GMLIST_EMPTY                   = 599,
+	// End Level 3 list, continued at 1100
 
     // Battleground
@@ -659,12 +672,50 @@
     // Room for in-game strings           810-999 not used
 
-    // FREE IDS                           1000-9999
-    LANG_COMMAND_FREEZE                 = 1000,
-    LANG_COMMAND_FREEZE_ERROR           = 1001,
-    LANG_COMMAND_FREEZE_WRONG           = 1002,
-    LANG_COMMAND_UNFREEZE               = 1003,
-    LANG_COMMAND_NO_FROZEN_PLAYERS      = 1004,
-    LANG_COMMAND_LIST_FREEZE            = 1005,
-    LANG_COMMAND_FROZEN_PLAYERS         = 1006,
+    // Level 4 (CLI only commands)
+	LANG_COMMAND_EXIT = 1000,
+	LANG_ACCOUNT_DELETED = 1001,
+	LANG_ACCOUNT_NOT_DELETED_SQL_ERROR = 1002,
+	LANG_ACCOUNT_NOT_DELETED = 1003,
+	LANG_ACCOUNT_CREATED = 1004,
+	LANG_ACCOUNT_TOO_LONG = 1005,
+	LANG_ACCOUNT_ALREADY_EXIST = 1006,
+	LANG_ACCOUNT_NOT_CREATED_SQL_ERROR = 1007,
+	LANG_ACCOUNT_NOT_CREATED = 1008,
+	LANG_CHARACTER_DELETED = 1009,
+	LANG_ACCOUNT_LIST_HEADER = 1010,
+	LANG_ACCOUNT_LIST_ERROR = 1011,
+	// Room for more level 4 1012-1099 not used
+
+	// Level 3 (continue)
+    LANG_MOTD_NEW                       = 1100,
+    LANG_ACCOUNT_SETADDON               = 1101,
+    LANG_SENDMESSAGE                    = 1102,
+    LANG_EVENT_ENTRY_LIST_CONSOLE       = 1103,
+	LANG_CREATURE_ENTRY_LIST_CONSOLE    = 1104,
+	LANG_ITEM_LIST_CONSOLE              = 1105,
+	LANG_ITEMSET_LIST_CONSOLE           = 1106,
+	LANG_GO_ENTRY_LIST_CONSOLE          = 1107,
+	LANG_QUEST_LIST_CONSOLE             = 1108,
+	LANG_SKILL_LIST_CONSOLE             = 1109,
+	LANG_CREATURE_LIST_CONSOLE          = 1110,
+	LANG_GO_LIST_CONSOLE                = 1111,
+	LANG_FILE_OPEN_FAIL                 = 1112,
+	LANG_ACCOUNT_CHARACTER_LIST_FULL    = 1113,
+	LANG_DUMP_BROKEN                    = 1114,
+	LANG_INVALID_CHARACTER_NAME         = 1115,
+	LANG_INVALID_CHARACTER_GUID         = 1116,
+	LANG_CHARACTER_GUID_IN_USE          = 1117,
+	LANG_ITEMLIST_GUILD                 = 1118,
+	// Room for more level 3              1119-1199 not used
+	
+	// Trinity custom patches             5000-9999
+    LANG_COMMAND_FREEZE                 = 5000,
+    LANG_COMMAND_FREEZE_ERROR           = 5001,
+    LANG_COMMAND_FREEZE_WRONG           = 5002,
+    LANG_COMMAND_UNFREEZE               = 5003,
+    LANG_COMMAND_NO_FROZEN_PLAYERS      = 5004,
+    LANG_COMMAND_LIST_FREEZE            = 5005,
+    LANG_COMMAND_FROZEN_PLAYERS         = 5006,
+	// Room for more Trinity custom patches 5007-9999
 
     // Use for not-in-svn patches         10000-10999
Index: trunk/src/trinitycore/CliRunnable.cpp
===================================================================
--- trunk/src/trinitycore/CliRunnable.cpp (revision 102)
+++ trunk/src/trinitycore/CliRunnable.cpp (revision 112)
@@ -28,5 +28,4 @@
 #include "World.h"
 #include "ScriptCalls.h"
-#include "GlobalEvents.h"
 #include "ObjectMgr.h"
 #include "WorldSession.h"
@@ -37,252 +36,107 @@
 #include "CliRunnable.h"
 #include "MapManager.h"
-#include "PlayerDump.h"
 #include "Player.h"
-
-//CliCommand and CliCommandHolder are defined in World.h to avoid cyclic deps
-
-//func prototypes must be defined
-
-void CliHelp(char*,pPrintf);
-void CliInfo(char*,pPrintf);
-void CliBan(char*,pPrintf);
-void CliBanList(char*,pPrintf);
-void CliRemoveBan(char*,pPrintf);
-void CliSetGM(char*,pPrintf);
-void CliListGM(char*,pPrintf);
-void CliVersion(char*,pPrintf);
-void CliExit(char*,pPrintf);
-void CliIdleRestart(char*,pPrintf zprintf);
-void CliRestart(char*,pPrintf zprintf);
-void CliIdleShutdown(char*,pPrintf zprintf);
-void CliShutdown(char*,pPrintf zprintf);
-void CliBroadcast(char*,pPrintf);
-void CliCreate(char*,pPrintf);
-void CliDelete(char*,pPrintf);
-void CliCharDelete(char *,pPrintf);
-void CliLoadScripts(char*,pPrintf);
-void CliKick(char*,pPrintf);
-void CliTele(char*,pPrintf);
-void CliMotd(char*,pPrintf);
-void CliCorpses(char*,pPrintf);
-void CliSetLogLevel(char*,pPrintf);
-void CliUpTime(char*,pPrintf);
-void CliSetAddon(char*,pPrintf);
-void CliWritePlayerDump(char*,pPrintf);
-void CliLoadPlayerDump(char*,pPrintf);
-void CliSave(char*,pPrintf);
-void CliSend(char*,pPrintf);
-void CliPLimit(char*,pPrintf);
-void CliSetPassword(char*,pPrintf);
-/// Table of known commands
-const CliCommand Commands[]=
-{
-    {"help", & CliHelp,"Display this help message"},
-    {"broadcast", & CliBroadcast,"Announce in-game message"},
-    {"create", & CliCreate,"Create account"},
-    {"delete", & CliDelete,"Delete account and characters"},
-    {"chardelete", & CliCharDelete,"Delete character"},
-    {"info", & CliInfo,"Display Server infomation"},
-    {"uptime", & CliUpTime, "Displays the server uptime"},
-    {"motd", & CliMotd,"Change or display motd"},
-    {"kick", & CliKick,"Kick user"},
-    {"ban", & CliBan,"Ban account|ip"},
-    {"listbans", & CliBanList,"List bans"},
-    {"unban", & CliRemoveBan,"Remove ban from account|ip"},
-    {"setgm", & CliSetGM,"Edit user privileges"},
-    {"setpass", & CliSetPassword,"Set password for account"},
-    {"setaddon", & CliSetAddon,"Set user expansion addon level allowed"},
-    {"listgm", & CliListGM,"Display user privileges"},
-    {"loadscripts", & CliLoadScripts,"Load script library"},
-    {"setloglevel", & CliSetLogLevel,"Set Log Level"},
-    {"corpses", & CliCorpses,"Manually call corpses erase global even code"},
-    {"version", & CliVersion,"Display server version"},
-    {"idlerestart", & CliIdleRestart,"Restart server with some delay when there are no active connections remaining"},
-    {"restart", & CliRestart,"Restart server with some delay"},
-    {"idleshutdown", & CliIdleShutdown,"Shutdown server with some delay when there are no active connections remaining"},
-    {"shutdown", & CliShutdown,"Shutdown server with some delay"},
-    {"exit", & CliExit,"Shutdown server NOW"},
-    {"writepdump", &CliWritePlayerDump,"Write a player dump to a file"},
-    {"loadpdump", &CliLoadPlayerDump,"Load a player dump from a file"},
-    {"saveall", &CliSave,"Save all players"},
-    {"send", &CliSend,"Send message to a player"},
-    {"tele", &CliTele,"Teleport player to location"},
-    {"plimit", &CliPLimit,"Show or set player login limitations"}
-};
-/// \todo Need some pragma pack? Else explain why in a comment.
-#define CliTotalCmds sizeof(Commands)/sizeof(CliCommand)
-
+#include "Chat.h"
+
+void utf8print(const char* str)
+{
 #if PLATFORM == PLATFORM_WINDOWS
-int utf8printf(const char* str,...)
-{
-    UTF8PRINTF(stdout,str,1);
-    return 0;
-}
 #define UTF8ZPRINTF utf8printf
+	wchar_t wtemp_buf[6000];
+    size_t wtemp_len = 6000-1;
+    if(!Utf8toWStr(str,strlen(str),wtemp_buf,wtemp_len))
+        return;
+
+    char temp_buf[6000];
+    CharToOemBuffW(&wtemp_buf[0],&temp_buf[0],wtemp_len+1);
+    printf(temp_buf);
 #else
-#define UTF8ZPRINTF printf
+	printf(str);
 #endif
-
-/// Create a character dump file
-void CliWritePlayerDump(char*command,pPrintf zprintf)
-{
-    char * file = strtok(command, " ");
-    char * p2 = strtok(NULL, " ");
-    if(!file || !p2)
-    {
-        zprintf("Syntax is: writepdump $filename $playerNameOrGUID\r\n");
-        return;
-    }
-
-    std::string name;
-    if(!consoleToUtf8(p2,name))                             // convert from console encoding to utf8
-        return;
-
-    if(!normalizePlayerName(name))
-    {
-        zprintf("Syntax is: writepdump $filename $playerNameOrGUID\r\n");
-        return;
-    }
-
-    uint32 guid = objmgr.GetPlayerGUIDByName(name);
-    if(!guid)
-        guid = atoi(p2);
-
-    if(!guid)
-    {
-        zprintf("Syntax is: writepdump $filename $playerNameOrGUID\r\n");
-        return;
-    }
-
-    PlayerDumpWriter().WriteDump(file, guid);
-}
-
-/// Load a character from a dump file
-void CliLoadPlayerDump(char*command,pPrintf zprintf)
-{
-    char * file = strtok(command, " ");
-    char * acc = strtok(NULL, " ");
-    if (!file ||!acc)
-    {
-        zprintf("Syntax is: loadpdump $filename $account ($newname) ($newguid)\r\n");
-        return;
-    }
-
-    uint32 account_id = accmgr.GetId(acc);
-    if(!account_id)
-    {
-        account_id = atoi(acc);
-        if(account_id)
-        {
-            std::string acc_name;
-            if(!accmgr.GetName(account_id,acc_name))
-            {
-                zprintf("Failed to load the character! Account not exist.\r\n");
-                return;
-            }
-        }
-        else
-        {
-            zprintf("Failed to load the character! Account not exist.\r\n");
-            return;
-        }
-    }
-
-    char * name_str = strtok(NULL, " ");
-    char * guid_str = name_str ? strtok(NULL, " ") : NULL;
-
-    uint32 guid = guid_str ? atoi(guid_str) : 0;
-
-    std::string name;
-    if(name_str)
-    {
-        if(!consoleToUtf8(name_str,name))                   // convert from console encoding to utf8
-            return;
-
-        if(!normalizePlayerName(name))
-        {
-            zprintf("Syntax is: loadpdump $filename $account ($newname) ($newguid)\r\n");
-            return;
-        }
-    }
-
-    if(PlayerDumpReader().LoadDump(file, account_id, name, guid))
-        zprintf("Character loaded successfully!\r\n");
-    else
-        zprintf("Failed to load the character!\r\n");
-}
-
-/// Reload the scripts and notify the players
-void CliLoadScripts(char*command,pPrintf zprintf)
-{
-    char const *del=strtok(command," ");
-    if (!del)
-        del="";
-    if(!LoadScriptingModule(del))                           // Error report is already done by LoadScriptingModule
-        return;
-
-    sWorld.SendWorldText(LANG_SCRIPTS_RELOADED);
 }
 
 /// Delete a user account and all associated characters in this realm
 /// \todo This function has to be enhanced to respect the login/realm split (delete char, delete account chars in realm, delete account chars in realm then delete account
-void CliDelete(char*command,pPrintf zprintf)
-{
+bool ChatHandler::HandleAccountDeleteCommand(const char* args)
+{
+    if(!*args)
+        return false;
+
     ///- Get the account name from the command line
-    char *account_name_str=strtok(command," ");
-    if(!account_name_str)
-    {
-        // \r\n is used because this function can also be called from RA
-        zprintf("Syntax is: delete $account\r\n");
-        return;
-    }
-
-    std::string account_name;
-    if(!consoleToUtf8(account_name_str,account_name))       // convert from console encoding to utf8
-        return;
-
-    AccountOpResult result = accmgr.DeleteAccount(accmgr.GetId(account_name));
+    char *account_name_str=strtok ((char*)args," ");
+    if (!account_name_str)
+        return false;
+
+    std::string account_name = account_name_str;
+    if(!AccountMgr::normilizeString(account_name))
+    {
+        PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+        SetSentErrorMessage(true);
+        return false;
+    }
+
+    uint32 account_id = accmgr.GetId(account_name);
+    if(!account_id)
+    {
+        PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+        SetSentErrorMessage(true);
+        return false;
+    }
+
+    /// Commands not recommended call from chat, but support anyway
+    if(m_session)
+    {
+        uint32 targetSecurity = accmgr.GetSecurity(account_id);
+
+        /// can delete only for account with less security
+        /// This is also reject self apply in fact
+        if (targetSecurity >= m_session->GetSecurity())
+        {
+            SendSysMessage (LANG_YOURS_SECURITY_IS_LOW);
+            SetSentErrorMessage (true);
+            return false;
+        }
+    }
+
+    AccountOpResult result = accmgr.DeleteAccount(account_id);
     switch(result)
     {
         case AOR_OK:
-            zprintf("We deleted account: %s\r\n",account_name.c_str());
+            PSendSysMessage(LANG_ACCOUNT_DELETED,account_name.c_str());
             break;
         case AOR_NAME_NOT_EXIST:
-            zprintf("User %s does not exist\r\n",account_name.c_str());
-            break;
+            PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+            SetSentErrorMessage(true);
+            return false;
         case AOR_DB_INTERNAL_ERROR:
-            zprintf("User %s NOT deleted (probably sql file format was updated)\r\n",account_name.c_str());
-            break;
+            PSendSysMessage(LANG_ACCOUNT_NOT_DELETED_SQL_ERROR,account_name.c_str());
+            SetSentErrorMessage(true);
+            return false;
         default:
-            zprintf("User %s NOT deleted (unknown error)\r\n",account_name.c_str());
-            break;
-    }
-}
-
-void CliCharDelete(char*command,pPrintf zprintf)
-{
-    char *character_name_str = strtok(command," ");
-
+            PSendSysMessage(LANG_ACCOUNT_NOT_DELETED,account_name.c_str());
+            SetSentErrorMessage(true);
+            return false;
+    }
+
+	return true;
+}
+
+bool ChatHandler::HandleCharacterDeleteCommand(const char* args)
+{
+    if(!*args)
+        return false;
+
+	char *character_name_str = strtok((char*)args," ");
     if(!character_name_str)
-    {
-        zprintf("Syntax is: chardelete $character_name\r\n");
-        return;
-    }
-
-    std::string character_name;
-    if(!consoleToUtf8(character_name_str,character_name))   // convert from console encoding to utf8
-        return;
-
+		return false;
+
+    std::string character_name = character_name_str;
     if(!normalizePlayerName(character_name))
-    {
-        zprintf("Syntax is: chardelete $character_name\r\n");
-        return;
-    }
-
-    Player *player = objmgr.GetPlayer(character_name.c_str());
+		return false;
 
     uint64 character_guid;
     uint32 account_id;
 
+	Player *player = objmgr.GetPlayer(character_name.c_str());
     if(player)
     {
@@ -296,6 +150,7 @@
         if(!character_guid)
         {
-            zprintf("Player %s not found!\r\n",character_name.c_str());
-            return;
+            PSendSysMessage(LANG_NO_PLAYER,character_name.c_str());
+            SetSentErrorMessage(true);
+            return false;
         }
 
@@ -303,176 +158,32 @@
     }
 
+	std::string account_name;
+    accmgr.GetName (account_id,account_name);
+
     Player::DeleteFromDB(character_guid, account_id, true); 
-    zprintf("Player %s (Guid: %u AccountId: %u) deleted\r\n",character_name.c_str(),GUID_LOPART(character_guid),account_id);
-}
-
-/// Broadcast a message to the World
-void CliBroadcast(char *text,pPrintf zprintf)
-{
-    std::string textUtf8;
-    if(!consoleToUtf8(text,textUtf8))                       // convert from console encoding to utf8
-        return;
-
-    sWorld.SendWorldText(LANG_SYSTEMMESSAGE,textUtf8.c_str());
-    zprintf("Broadcasting to the world: %s\r\n",textUtf8.c_str());
-}
-
-/// Print the list of commands and associated description
-void CliHelp(char*,pPrintf zprintf)
-{
-    for (unsigned int x=0;x<CliTotalCmds;x++)
-        zprintf("%-13s - %s.\r\n",Commands[x].cmd ,Commands[x].description);
+    PSendSysMessage(LANG_CHARACTER_DELETED,character_name.c_str(),GUID_LOPART(character_guid),account_name.c_str(), account_id);
+    return true;
 }
 
 /// Exit the realm
-void CliExit(char*,pPrintf zprintf)
-{
-    zprintf( "Exiting daemon...\r\n" );
+bool ChatHandler::HandleServerExitCommand(const char* args)
+{
+    SendSysMessage(LANG_COMMAND_EXIT);
     World::m_stopEvent = true;
-}
-
-/// Restart the server (with some delay) as soon as no active connections remain on the server
-void CliIdleRestart(char* command,pPrintf zprintf)
-{
-    char *args = strtok(command," ");
-
-    if(!args)
-    {
-        zprintf("Syntax is: idlerestart $seconds|cancel\r\n");
-        return;
-    }
-
-    if(std::string(args)=="cancel")
-    {
-        sWorld.ShutdownCancel();
-    }
-    else
-    {
-
-        uint32 time = atoi(args);
-
-        ///- Prevent interpret wrong arg value as 0 secs shutdown time
-        if(time==0 && (args[0]!='0' || args[1]!='\0') || time < 0)
-        {
-            zprintf("Syntax is: idlerestart $seconds|cancel\r\n");
-            return;
-        }
-
-        sWorld.ShutdownServ(time,SHUTDOWN_MASK_RESTART|SHUTDOWN_MASK_IDLE);
-    }
-}
-
-/// Restart the server with some delay
-void CliRestart(char* command,pPrintf zprintf)
-{
-    char *args = strtok(command," ");
-
-    if(!args)
-    {
-        zprintf("Syntax is: restart $seconds|cancel\r\n");
-        return;
-    }
-
-    if(std::string(args)=="cancel")
-    {
-        sWorld.ShutdownCancel();
-    }
-    else
-    {
-        int32 time = atoi(args);
-
-        ///- Prevent interpret wrong arg value as 0 secs shutdown time
-        if(time==0 && (args[0]!='0' || args[1]!='\0') || time < 0)
-        {
-            zprintf("Syntax is: restart $seconds|cancel\r\n");
-            return;
-        }
-
-        sWorld.ShutdownServ(time,SHUTDOWN_MASK_RESTART);
-    }
-}
-
-/// Shutdown the server (with some delay) as soon as no active connections remain on the server
-void CliIdleShutdown(char* command,pPrintf zprintf)
-{
-    char *args = strtok(command," ");
-
-    if(!args)
-    {
-        zprintf("Syntax is: idleshutdown $seconds|cancel\r\n");
-        return;
-    }
-
-    if(std::string(args)=="cancel")
-    {
-        sWorld.ShutdownCancel();
-    }
-    else
-    {
-
-        uint32 time = atoi(args);
-
-        ///- Prevent interpret wrong arg value as 0 secs shutdown time
-        if(time==0 && (args[0]!='0' || args[1]!='\0') || time < 0)
-        {
-            zprintf("Syntax is: idleshutdown $seconds|cancel\r\n");
-            return;
-        }
-
-        sWorld.ShutdownServ(time,SHUTDOWN_MASK_IDLE);
-    }
-}
-
-/// Shutdown the server with some delay
-void CliShutdown(char* command,pPrintf zprintf)
-{
-    char *args = strtok(command," ");
-
-    if(!args)
-    {
-        zprintf("Syntax is: shutdown $seconds|cancel\r\n");
-        return;
-    }
-
-    if(std::string(args)=="cancel")
-    {
-        sWorld.ShutdownCancel();
-    }
-    else
-    {
-        int32 time = atoi(args);
-
-        ///- Prevent interpret wrong arg value as 0 secs shutdown time
-        if(time==0 && (args[0]!='0' || args[1]!='\0') || time < 0)
-        {
-            zprintf("Syntax is: shutdown $seconds|cancel\r\n");
-            return;
-        }
-
-        sWorld.ShutdownServ(time);
-    }
+	return true;
 }
 
 /// Display info on users currently in the realm
-void CliInfo(char*,pPrintf zprintf)
-{
-    uint32 activeClientsNum = sWorld.GetActiveSessionCount();
-    uint32 queuedClientsNum = sWorld.GetQueuedSessionCount();
-    uint32 maxActiveClientsNum = sWorld.GetMaxActiveSessionCount();
-    uint32 maxQueuedClientsNum = sWorld.GetMaxQueuedSessionCount();
-    std::string timeStr = secsToTimeString(sWorld.GetUptime(),true);
-
-    zprintf("Online players: %u (max: %u) queued: %u (max: %u) Uptime: %s\r\n",activeClientsNum,maxActiveClientsNum,queuedClientsNum,maxQueuedClientsNum,timeStr.c_str());
-
+bool ChatHandler::HandleAccountOnlineListCommand(const char* args)
+{
     ///- Get the list of accounts ID logged to the realm
     QueryResult *resultDB = CharacterDatabase.Query("SELECT name,account FROM characters WHERE online > 0");
-
     if (!resultDB)
-        return;
+        return true;
 
     ///- Display the list of account/characters online
-    zprintf("=====================================================================\r\n");
-    zprintf("|    Account    |       Character      |       IP        | GM | Exp |\r\n");
-    zprintf("=====================================================================\r\n");
+    SendSysMessage("=====================================================================");
+    SendSysMessage(LANG_ACCOUNT_LIST_HEADER);
+    SendSysMessage("=====================================================================");
 
     ///- Circle through accounts
@@ -491,5 +202,5 @@
         {
             Field *fieldsLogin = resultLogin->Fetch();
-            zprintf("|%15s| %20s | %15s |%4d|%5d|\r\n",
+            PSendSysMessage("|%15s| %20s | %15s |%4d|%5d|",
                 fieldsLogin[0].GetString(),name.c_str(),fieldsLogin[1].GetString(),fieldsLogin[2].GetUInt32(),fieldsLogin[3].GetUInt32());
 
@@ -497,5 +208,5 @@
         }
         else
-            zprintf("|<Error>        | %20s |<Error>          |<Er>|<Err>|\r\n",name.c_str());
+            PSendSysMessage(LANG_ACCOUNT_LIST_ERROR,name.c_str());
 
     }while(resultDB->NextRow());
@@ -503,335 +214,23 @@
     delete resultDB;
 
-    zprintf("=====================================================================\r\n");
-}
-
-/// Display a list of banned accounts and ip addresses
-void CliBanList(char*,pPrintf zprintf)
-{
-    bool found = false;
-    ///- Get the list of banned accounts and display them
-    QueryResult *result = loginDatabase.Query("SELECT id,username FROM account WHERE id IN (SELECT id FROM account_banned WHERE active = 1)");
-    if(result)
-    {
-        found = true;
-
-        zprintf("Currently Banned Accounts:\r\n");
-        zprintf("===============================================================================\r\n");
-        zprintf("|    Account    |   BanDate    |   UnbanDate  |  Banned By    |   Ban Reason  |\r\n");
-        do
-        {
-            zprintf("-------------------------------------------------------------------------------\r\n");
-            Field *fields = result->Fetch();
-            // No SQL injection. id is uint32.
-            QueryResult *banInfo = loginDatabase.PQuery("SELECT bandate,unbandate,bannedby,banreason FROM account_banned WHERE id = %u AND active = 1 ORDER BY unbandate", fields[0].GetUInt32());
-            if (banInfo)
-            {
-                Field *fields2 = banInfo->Fetch();
-                do
-                {
-                    time_t t_ban = fields2[0].GetUInt64();
-                    tm* aTm_ban = localtime(&t_ban);
-                    zprintf("|%-15.15s|", fields[1].GetString());
-                    zprintf("%02d-%02d-%02d %02d:%02d|", aTm_ban->tm_year%100, aTm_ban->tm_mon+1, aTm_ban->tm_mday, aTm_ban->tm_hour, aTm_ban->tm_min);
-                    if ( fields2[0].GetUInt64() == fields2[1].GetUInt64() )
-                        zprintf("   permanent  |");
-                    else
-                    {
-                        time_t t_unban = fields2[1].GetUInt64();
-                        tm* aTm_unban = localtime(&t_unban);
-                        zprintf("%02d-%02d-%02d %02d:%02d|",aTm_unban->tm_year%100, aTm_unban->tm_mon+1, aTm_unban->tm_mday, aTm_unban->tm_hour, aTm_unban->tm_min);
-                    }
-                    zprintf("%-15.15s|%-15.15s|\r\n",fields2[2].GetString(),fields2[3].GetString());
-                }while ( banInfo->NextRow() );
-                delete banInfo;
-            }
-        }while( result->NextRow() );
-        zprintf("===============================================================================\r\n");
-        delete result;
-    }
-
-    ///- Get the list of banned IP addresses and display them
-    result = loginDatabase.Query( "SELECT ip,bandate,unbandate,bannedby,banreason FROM ip_banned WHERE (bandate=unbandate OR unbandate>UNIX_TIMESTAMP()) ORDER BY unbandate" );
-    if(result)
-    {
-        found = true;
-
-        zprintf("Currently Banned IPs:\r\n");
-        zprintf("===============================================================================\r\n");
-        zprintf("|      IP       |   BanDate    |   UnbanDate  |  Banned By    |   Ban Reason  |\r\n");
-        do
-        {
-            zprintf("-------------------------------------------------------------------------------\r\n");
-            Field *fields = result->Fetch();
-            time_t t_ban = fields[1].GetUInt64();
-            tm* aTm_ban = localtime(&t_ban);
-            zprintf("|%-15.15s|", fields[0].GetString());
-            zprintf("%02d-%02d-%02d %02d:%02d|", aTm_ban->tm_year%100, aTm_ban->tm_mon+1, aTm_ban->tm_mday, aTm_ban->tm_hour, aTm_ban->tm_min);
-            if ( fields[1].GetUInt64() == fields[2].GetUInt64() )
-                zprintf("   permanent  |");
-            else
-            {
-                time_t t_unban = fields[2].GetUInt64();
-                tm* aTm_unban = localtime(&t_unban);
-                zprintf("%02d-%02d-%02d %02d:%02d|", aTm_unban->tm_year%100, aTm_unban->tm_mon+1, aTm_unban->tm_mday, aTm_unban->tm_hour, aTm_unban->tm_min);
-            }
-            zprintf("%-15.15s|%-15.15s|\r\n", fields[3].GetString(), fields[4].GetString());
-        }while( result->NextRow() );
-        zprintf("===============================================================================\r\n");
-        delete result;
-    }
-
-    if(!found)
-        zprintf("We do not have banned users\r\n");
-}
-
-/// Ban an IP address or a user account
-void CliBan(char*command,pPrintf zprintf)
-{
-    ///- Get the command parameter
-    char* type_str = strtok((char*)command, " ");
-    char* nameOrIP_str = strtok(NULL, " ");
-    char* duration_str = strtok(NULL," ");
-    char* reason_str = strtok(NULL,"");
-
-    if(!type_str||!nameOrIP_str||!duration_str||!reason_str)// ?!? input of single char "0"-"9" wouldn't detect when with: || !atoi(duration)
-    {
-        zprintf("Syntax: ban account|ip|character $AccountOrIpOrCharacter $duration[s|m|h|d] $reason \r\n");
-        return;
-    }
-
-    std::string type;
-    if(!consoleToUtf8(type_str,type))                       // convert from console encoding to utf8
-        return;
-
-    std::string nameOrIP;
-    if(!consoleToUtf8(nameOrIP_str,nameOrIP))               // convert from console encoding to utf8
-        return;
-
-    std::string duration;
-    if(!consoleToUtf8(duration_str,duration))               // convert from console encoding to utf8
-        return;
-
-    std::string reason;
-    if(!consoleToUtf8(reason_str,reason))                   // convert from console encoding to utf8
-        return;
-
-    switch (sWorld.BanAccount(type, nameOrIP, duration, reason, "Set by console."))
-    {
-        case BAN_SUCCESS:
-            if(atoi(duration_str)>0)
-                zprintf("%s is banned for %s. Reason: %s.\r\n",nameOrIP.c_str(),secsToTimeString(TimeStringToSecs(duration_str),true,false).c_str(),reason.c_str());
-            else
-                zprintf("%s is banned permanently. Reason: %s.\r\n",nameOrIP.c_str(),reason.c_str());
-            break;
-        case BAN_NOTFOUND:
-            zprintf("%s %s not found\r\n", type.c_str(), nameOrIP.c_str());
-            break;
-        case BAN_SYNTAX_ERROR:
-            zprintf("Syntax: ban account|ip|character $AccountOrIpOrCharacter $duration[s|m|h|d] $reason \r\n");
-            break;
-    }
-}
-
-/// Display %TrinIty version
-void CliVersion(char*,pPrintf zprintf)
-{
-                                                            //<--maybe better append to info cmd
-    zprintf( "%s (world-daemon)\r\n", _FULLVERSION );
-}
-
-/// Unban an IP adress or a user account
-void CliRemoveBan(char *command,pPrintf zprintf)
-{
-    ///- Get the command parameter
-    char *type_str = strtok(command," ");
-    char *nameorip_str = strtok(NULL," ");
-    if(!nameorip_str||!type_str)
-    {
-        zprintf("Syntax is: unban account|ip|character $nameorip\r\n");
-        return;
-    }
-
-    std::string type;
-    if(!consoleToUtf8(type_str,type))                       // convert from console encoding to utf8
-        return;
-
-    std::string nameorip;
-    if(!consoleToUtf8(nameorip_str,nameorip))               // convert from console encoding to utf8
-        return;
-
-    if (!sWorld.RemoveBanAccount(type, nameorip))
-        zprintf("%s %s not found\r\n", type.c_str(), nameorip.c_str());
-    else
-        zprintf("We removed ban from %s: %s\r\n",type_str,nameorip.c_str());
-}
-
-/// Display the list of GMs
-void CliListGM(char*,pPrintf zprintf)
-{
-
-    ///- Get the accounts with GM Level >0
-    Field *fields;
-
-    QueryResult *result = loginDatabase.Query( "SELECT username,gmlevel FROM account WHERE gmlevel > 0" );
-    if(result)
-    {
-
-        zprintf("Current gamemasters:\r\n");
-        zprintf("========================\r\n");
-        zprintf("|    Account    |  GM  |\r\n");
-        zprintf("========================\r\n");
-
-        ///- Circle through them. Display username and GM level
-        do
-        {
-            fields = result->Fetch();
-            zprintf("|%15s|", fields[0].GetString());
-            zprintf("%6s|\r\n",fields[1].GetString());
-        }while( result->NextRow() );
-
-        zprintf("========================\r\n");
-        delete result;
-    }
-    else
-    {
-        zprintf("No gamemasters\r\n");
-    }
-}
-
-/// Set the GM level of an account
-void CliSetGM(char *command,pPrintf zprintf)
-{
-    ///- Get the command line arguments
-    char *szAcc = strtok(command," ");
-    char *szLevel =  strtok(NULL," ");
-
-    if(!szAcc||!szLevel)                                    //wrong syntax 'setgm' without name
-    {
-        zprintf("Syntax is: setgm $account $number (0 - normal, 3 - gamemaster)>\r\n");
-        return;
-    }
-
-    //wow it's ok,let's hope it was integer given
-    int lev=atoi(szLevel);                                  //get int anyway (0 if error)
-
-    std::string safe_account_name;
-    if(!consoleToUtf8(szAcc,safe_account_name))             // convert from console encoding to utf8
-        return;
-
-    ///- Convert Account name to Upper Format
-    AccountMgr::normilizeString(safe_account_name);
-
-    ///- Escape the account name to allow quotes in names
-    loginDatabase.escape_string(safe_account_name);
-
-    ///- Try to find the account, then update the GM level
-    // No SQL injection (account name is escaped)
-    QueryResult *result = loginDatabase.PQuery("SELECT id FROM account WHERE username = '%s'",safe_account_name.c_str());
-
-    if (result)
-    {
-        Field *fields = result->Fetch();
-        uint32 account_id = fields[0].GetUInt32();
-        delete result;
-
-        WorldSession* session = sWorld.FindSession(account_id);
-        if(session)
-            session->SetSecurity(lev);
-
-        // No SQL injection (account name is escaped)
-        loginDatabase.PExecute("UPDATE account SET gmlevel = '%d' WHERE username = '%s'",lev,safe_account_name.c_str());
-        zprintf("We set %s gmlevel %d\r\n",safe_account_name.c_str(),lev);
-    }
-    else
-    {
-        zprintf("No account %s found\r\n",safe_account_name.c_str());
-    }
-}
-
-/// Set password for account
-void CliSetPassword(char *command,pPrintf zprintf)
-{
-    ///- Get the command line arguments
-    char *szAcc = strtok(command," ");
-    char *szPassword1 =  strtok(NULL," ");
-    char *szPassword2 =  strtok(NULL," ");
-
-    if(!szAcc||!szPassword1 || !szPassword2)
-    {
-        zprintf("Syntax is: setpass $account $password $password\r\n");
-        return;
-    }
-
-    std::string account_name;
-    if(!consoleToUtf8(szAcc,account_name))                  // convert from console encoding to utf8
-        return;
-
-    std::string pass1;
-    if(!consoleToUtf8(szPassword1,pass1))                   // convert from console encoding to utf8
-        return;
-
-    std::string pass2;
-    if(!consoleToUtf8(szPassword2,pass2))                   // convert from console encoding to utf8
-        return;
-
-    uint32 acc_id = accmgr.GetId(szAcc);
-    if (!acc_id)
-    {
-        zprintf("Account '%s' does not exist!\r\n", account_name.c_str());
-        return;
-    }
-
-    if (pass1 != pass2)
-    {
-        zprintf("Password does not match the confirm password, password not changed!\r\n");
-        return;
-    }
-
-    AccountOpResult result = accmgr.ChangePassword(acc_id, pass1);
-
-    switch(result)
-    {
-        case AOR_OK:
-            zprintf("The password was changed for account '%s' (ID: %u).\r\n",account_name.c_str(),acc_id);
-            break;
-        case AOR_PASS_TOO_LONG:
-            zprintf("Password can't be longer than 16 characters (client limit), password not changed!\r\n");
-            break;
-        case AOR_NAME_NOT_EXIST:
-            zprintf("Account '%s' does not exist!\r\n", account_name.c_str());
-            break;
-        case AOR_DB_INTERNAL_ERROR:
-            zprintf("Password not changed! (probably sql file format was updated)\r\n");
-            break;
-        default:
-            zprintf("Password not changed! (unknown error\r\n");
-            break;
-    }
+    SendSysMessage("=====================================================================");
+    return true;
 }
 
 /// Create an account
-void CliCreate(char *command,pPrintf zprintf)
-{
-    //I see no need in this function (why would an admin personally create accounts
-    //instead of using account registration page or accessing db directly?)
-    //but still let it be
+bool ChatHandler::HandleAccountCreateCommand(const char* args)
+{
+    if(!*args)
+        return false;
 
     ///- %Parse the command line arguments
-    char *szAcc = strtok(command, " ");
+    char *szAcc = strtok((char*)args, " ");
     char *szPassword = strtok(NULL, " ");
     if(!szAcc || !szPassword)
-    {
-        zprintf("Syntax is: create $username $password\r\n");
-        return;
-    }
-
-    std::string account_name;
-    if(!consoleToUtf8(szAcc,account_name))                   // convert from console encoding to utf8
-        return;
-
-    std::string password;
-    if(!consoleToUtf8(szPassword,password))                 // convert from console encoding to utf8
-        return;
+		return false;
+
+    // normilized in accmgr.CreateAccount
+    std::string account_name = szAcc;
+    std::string password = szPassword;
 
     AccountOpResult result = accmgr.CreateAccount(account_name, password);
@@ -839,358 +238,39 @@
     {
         case AOR_OK:
-            zprintf("User %s with password %s created successfully\r\n",account_name.c_str(),password.c_str());
+            PSendSysMessage(LANG_ACCOUNT_CREATED,account_name.c_str());
             break;
         case AOR_NAME_TOO_LONG:
-            zprintf("Username %s is too long\r\n", account_name.c_str());
-            break;
+            SendSysMessage(LANG_ACCOUNT_TOO_LONG);
+            SetSentErrorMessage(true);
+            return false;
         case AOR_NAME_ALREDY_EXIST:
-            zprintf("User %s already exists\r\n",account_name.c_str());
-            break;
+            SendSysMessage(LANG_ACCOUNT_ALREADY_EXIST);
+            SetSentErrorMessage(true);
+            return false;
         case AOR_DB_INTERNAL_ERROR:
-            zprintf("User %s with password %s NOT created (probably sql file format was updated)\r\n",account_name.c_str(),password.c_str());
-            break;
+            PSendSysMessage(LANG_ACCOUNT_NOT_CREATED_SQL_ERROR,account_name.c_str());
+            SetSentErrorMessage(true);
+            return false;
         default:
-            zprintf("User %s with password %s NOT created (unknown error)\r\n",account_name.c_str(),password.c_str());
-            break;
-    }
-}
-
-/// Command parser and dispatcher
-void ParseCommand( pPrintf zprintf, char* input)
-{
-    unsigned int x;
-    bool bSuccess=false;
-    if (!input)
-        return;
-
-    unsigned int l=strlen(input);
-    char *supposedCommand=NULL,* arguments=(char*)("");
-    if(l)
-    {
-        ///- Get the command and the arguments
-        supposedCommand = strtok(input," ");
-        if (supposedCommand)
-        {
-            if (l>strlen(supposedCommand))
-                arguments=&input[strlen(supposedCommand)+1];
-
-            ///- Circle through the command table and, if found, put the command in the queue
-            for ( x=0;x<CliTotalCmds;x++)
-                if(!strcmp(Commands[x].cmd,supposedCommand))
-            {
-                sWorld.QueueCliCommand(new CliCommandHolder(&Commands[x], arguments, zprintf));
-                bSuccess=true;
-                break;
-            }
-
-            ///- Display an error message if the command is unknown
-            if(x==CliTotalCmds)
-                zprintf("Unknown command: %s\r\n", input);
-        }
-    }
-    if (!bSuccess)
-        zprintf("TC>");
-}
-
-/// Kick a character out of the realm
-void CliKick(char*command,pPrintf zprintf)
-{
-    char *kickName = strtok(command, " ");
-
-    if (!kickName)
-    {
-        zprintf("Syntax is: kick $charactername\r\n");
-        return;
-    }
-
-    std::string name;
-    if(!consoleToUtf8(kickName,name))                       // convert from console encoding to utf8
-        return;
-    
-    if(!normalizePlayerName(name))
-        return;
-
-    sWorld.KickPlayer(name);
-}
-
-/// Teleport a character to location
-void CliTele(char*command,pPrintf zprintf)
-{
-    char *charName = strtok(command, " ");
-    char *locName = strtok(NULL, " ");
-
-    if (!charName || !locName)
-    {
-        zprintf("Syntax is: tele $charactername $location\r\n");
-        return;
-    }
-
-    std::string name = charName;
-    if(!consoleToUtf8(charName,name))                       // convert from console encoding to utf8
-        return;
-    
-    if(!normalizePlayerName(name))
-        return;
-
-    std::string location;
-    if(!consoleToUtf8(locName,location))                    // convert from console encoding to utf8
-        return;
-
-    WorldDatabase.escape_string(location);
-    QueryResult *result = WorldDatabase.PQuery("SELECT position_x,position_y,position_z,orientation,map FROM game_tele WHERE name = '%s'",location.c_str());
-    if (!result)
-    {
-        zprintf(objmgr.GetTrinityStringForDBCLocale(LANG_COMMAND_TELE_NOTFOUND),"\r\n");
-        return;
-    }
-
-    Field *fields = result->Fetch();
-    float x = fields[0].GetFloat();
-    float y = fields[1].GetFloat();
-    float z = fields[2].GetFloat();
-    float ort = fields[3].GetFloat();
-    int mapid = fields[4].GetUInt16();
-    delete result;
-
-    if(!MapManager::IsValidMapCoord(mapid,x,y,z,ort))
-    {
-        zprintf(objmgr.GetTrinityStringForDBCLocale(LANG_INVALID_TARGET_COORD),"\r\n",x,y,mapid);
-        return;
-    }
-
-    Player *chr = objmgr.GetPlayer(name.c_str());
-    if (chr)
-    {
-
-        if(chr->IsBeingTeleported()==true)
-        {
-            zprintf(objmgr.GetTrinityStringForDBCLocale(LANG_IS_TELEPORTED),"\r\n",chr->GetName());
-            return;
-        }
-
-        if(chr->isInFlight())
-        {
-            zprintf(objmgr.GetTrinityStringForDBCLocale(LANG_CHAR_IN_FLIGHT),"\r\n",chr->GetName());
-            return;
-        }
-
-        zprintf(objmgr.GetTrinityStringForDBCLocale(LANG_TELEPORTING_TO),"\r\n",chr->GetName(),"", location.c_str());
-
-        chr->SaveRecallPosition();
-
-        chr->TeleportTo(mapid,x,y,z,chr->GetOrientation());
-    }
-    else if (uint64 guid = objmgr.GetPlayerGUIDByName(name.c_str()))
-    {
-        zprintf(objmgr.GetTrinityStringForDBCLocale(LANG_TELEPORTING_TO),"\r\n",name.c_str(), objmgr.GetTrinityStringForDBCLocale(LANG_OFFLINE), location.c_str());
-        Player::SavePositionInDB(mapid,x,y,z,ort,MapManager::Instance().GetZoneId(mapid,x,y),guid);
-    }
-    else
-        zprintf(objmgr.GetTrinityStringForDBCLocale(LANG_NO_PLAYER),"\r\n",name.c_str());
-}
-
-/// Display/Define the 'Message of the day' for the realm
-void CliMotd(char*command,pPrintf zprintf)
-{
-
-    if (strlen(command) == 0)
-    {
-        zprintf("Current Message of the day: \r\n%s\r\n", sWorld.GetMotd());
-        return;
-    }
-    else
-    {
-        std::string commandUtf8;
-        if(!consoleToUtf8(command,commandUtf8))             // convert from console encoding to utf8
-            return;
-
-        sWorld.SetMotd(commandUtf8);
-        zprintf("Message of the day changed to:\r\n%s\r\n", commandUtf8.c_str());
-    }
-}
-
-/// Comment me
-/// \todo What is CorpsesErase for?
-void CliCorpses(char*,pPrintf)
-{
-    CorpsesErase();
+            PSendSysMessage(LANG_ACCOUNT_NOT_CREATED,account_name.c_str());
+            SetSentErrorMessage(true);
+            return false;
+    }
+	
+	return true;
 }
 
 /// Set the level of logging
-void CliSetLogLevel(char*command,pPrintf zprintf)
-{
-    char *NewLevel = strtok(command, " ");
+bool ChatHandler::HandleServerSetLogLevelCommand(const char *args)
+{
+    if(!*args)
+        return false;
+
+    char *NewLevel = strtok((char*)args, " ");
     if (!NewLevel)
-    {
-        zprintf("Syntax is: setloglevel $loglevel\r\n");
-        return;
-    }
+		return false;
+
     sLog.SetLogLevel(NewLevel);
-}
-
-/// Display the server uptime
-void CliUpTime(char*,pPrintf zprintf)
-{
-    uint32 uptime = sWorld.GetUptime();
-    std::string suptime = secsToTimeString(uptime,true,(uptime > 86400));
-    zprintf("Server has been up for: %s\r\n", suptime.c_str());
-}
-
-/// Set/Unset the TBC flag for an account
-void CliSetAddon(char *command,pPrintf zprintf)
-{
-    ///- Get the command line arguments
-    char *szAcc = strtok(command," ");
-    char *szExp =  strtok(NULL," ");
-
-    if(!szAcc||!szExp)
-    {
-        zprintf("Syntax is: setbc $account $number (0 - normal, 1 - tbc, 2 - wotlk)>\r\n");
-        return;
-    }
-
-    int lev=atoi(szExp);                                    //get int anyway (0 if error)
-
-    if(lev < 0)
-    {
-        zprintf("Syntax is: setbc $account $number (0 - normal, 1 - tbc, 2 - wotlk)>\r\n");
-        return;
-    }
-
-    ///- Escape the account name to allow quotes in names
-    std::string safe_account_name;
-    if(!consoleToUtf8(szAcc,safe_account_name))             // convert from console encoding to utf8
-        return;
-
-    ///- Convert Account name to Upper Format
-    AccountMgr::normilizeString(safe_account_name);
-
-    ///- Escape the account name to allow quotes in names
-    loginDatabase.escape_string(safe_account_name);
-
-    // No SQL injection (account name is escaped)
-    QueryResult *result = loginDatabase.PQuery("SELECT 1 FROM account WHERE username = '%s'",safe_account_name.c_str());
-
-    if (result)
-    {
-        // No SQL injection (account name is escaped)
-        loginDatabase.PExecute("UPDATE account SET expansion = '%d' WHERE username = '%s'",lev,safe_account_name.c_str());
-        zprintf("We set %s to expansion allowed %d\r\n",safe_account_name.c_str(),lev);
-
-        delete result;
-    }
-    else
-    {
-        zprintf("No account %s found\r\n",safe_account_name.c_str());
-    }
-}
-
-/// Save all players
-void CliSave(char*,pPrintf zprintf)
-{
-    ///- Save players
-    ObjectAccessor::Instance().SaveAllPlayers();
-    zprintf( objmgr.GetTrinityStringForDBCLocale(LANG_PLAYERS_SAVED) );
-
-    ///- Send a message
-    sWorld.SendWorldText(LANG_PLAYERS_SAVED);
-}
-
-/// Send a message to a player in game
-void CliSend(char *playerN,pPrintf zprintf)
-{
-    ///- Get the command line arguments
-    char* name_str = strtok((char*)playerN, " ");
-    char* msg_str = strtok(NULL, "");
-
-    if(!name_str || !msg_str)
-    {
-        zprintf("Syntax: send $player $message (Player name is case sensitive)\r\n");
-        return;
-    }
-
-    std::string name;
-    if(!consoleToUtf8(name_str,name))                       // convert from console encoding to utf8
-        return;
-
-    std::string msg;
-    if(!consoleToUtf8(msg_str,msg))             // convert from console encoding to utf8
-        return;
-
-    if(!normalizePlayerName(name))
-    {
-        zprintf("Syntax: send $player $message (Player name is case sensitive)\r\n");
-        return;
-    }
-
-    ///- Find the player and check that he is not logging out.
-    Player *rPlayer = objmgr.GetPlayer(name.c_str());
-    if(!rPlayer)
-    {
-        zprintf("Player %s not found!\r\n", name.c_str());
-        return;
-    }
-
-    if (rPlayer->GetSession()->isLogingOut())
-    {
-        zprintf("Cannot send message while player %s is logging out!\r\n",name.c_str());
-        return;
-    }
-
-    ///- Send the message
-    //Use SendAreaTriggerMessage for fastest delivery.
-    rPlayer->GetSession()->SendAreaTriggerMessage("%s", msg.c_str());
-    rPlayer->GetSession()->SendAreaTriggerMessage("|cffff0000[Message from administrator]:|r");
-
-    //Confirmation message
-    zprintf("Message '%s' sent to %s\r\n",msg.c_str(), name.c_str());
-}
-
-void CliPLimit(char *args,pPrintf zprintf)
-{
-    if(*args)
-    {
-        char* param = strtok((char*)args, " ");
-        if(!param || !*param)
-            return;
-
-        int l = strlen(param);
-
-        if(     strncmp(param,"player",l) == 0 )
-            sWorld.SetPlayerLimit(-SEC_PLAYER);
-        else if(strncmp(param,"moderator",l) == 0 )
-            sWorld.SetPlayerLimit(-SEC_MODERATOR);
-        else if(strncmp(param,"gamemaster",l) == 0 )
-            sWorld.SetPlayerLimit(-SEC_GAMEMASTER);
-        else if(strncmp(param,"administrator",l) == 0 )
-            sWorld.SetPlayerLimit(-SEC_ADMINISTRATOR);
-        else if(strncmp(param,"reset",l) == 0 )
-            sWorld.SetPlayerLimit(sConfig.GetIntDefault("PlayerLimit", DEFAULT_PLAYER_LIMIT));
-        else
-        {
-            int val = atoi(param);
-            if(val < -SEC_ADMINISTRATOR) val = -SEC_ADMINISTRATOR;
-
-            sWorld.SetPlayerLimit(val);
-        }
-
-        // kick all low security level players
-        if(sWorld.GetPlayerAmountLimit() > SEC_PLAYER)
-            sWorld.KickAllLess(sWorld.GetPlayerSecurityLimit());
-    }
-
-    uint32 pLimit = sWorld.GetPlayerAmountLimit();
-    AccountTypes allowedAccountType = sWorld.GetPlayerSecurityLimit();
-    char const* secName = "";
-    switch(allowedAccountType)
-    {
-        case SEC_PLAYER:        secName = "Player";        break;
-        case SEC_MODERATOR:     secName = "Moderator";     break;
-        case SEC_GAMEMASTER:    secName = "Gamemaster";    break;
-        case SEC_ADMINISTRATOR: secName = "Administrator"; break;
-        default:                secName = "<unknown>";     break;
-    }
-
-    zprintf("Player limits: amount %u, min. security level %s.\r\n",pLimit,secName);
+	return true;
 }
 
@@ -1222,11 +302,7 @@
     ///- Display the list of available CLI functions then beep
     sLog.outString();
-    /// \todo Shoudn't we use here also the sLog singleton?
-    CliHelp(NULL,&UTF8ZPRINTF);
 
     if(sConfig.GetBoolDefault("BeepAtStart", true))
-    {
         printf("\a");                                       // \a = Alert
-    }
 
     // print this here the first time
@@ -1245,20 +321,31 @@
             break;
         #endif
-        char *command = fgets(commandbuf,sizeof(commandbuf),stdin);
-        if (command != NULL)
+        char *command_str = fgets(commandbuf,sizeof(commandbuf),stdin);
+        if (command_str != NULL)
         {
-            for(int x=0;command[x];x++)
-                if(command[x]=='\r'||command[x]=='\n')
+            for(int x=0;command_str[x];x++)
+                if(command_str[x]=='\r'||command_str[x]=='\n')
+				{
+					command_str[x]=0;
+					break;
+				}
+
+			if(!*command_str)
             {
-                command[x]=0;
-                break;
+                printf("TC>");
+                continue;
             }
-            //// \todo Shoudn't we use here also the sLog singleton?
-            ParseCommand(&UTF8ZPRINTF,command);
+
+            std::string command;
+            if(!consoleToUtf8(command_str,command))         // convert from console encoding to utf8
+            {
+                printf("TC>");
+                continue;
+            }
+
+            sWorld.QueueCliCommand(&utf8print,command.c_str());
         }
         else if (feof(stdin))
-        {
             World::m_stopEvent = true;
-        }
     }
 
Index: trunk/src/trinitycore/RASocket.cpp
===================================================================
--- trunk/src/trinitycore/RASocket.cpp (revision 102)
+++ trunk/src/trinitycore/RASocket.cpp (revision 112)
@@ -45,5 +45,5 @@
 typedef int(* pPrintf)(const char*,...);
 
-void ParseCommand(pPrintf zprintf, char*command);
+void ParseCommand(CliCommandHolder::Print*, char*command);
 
 /// RASocket constructor
@@ -223,5 +223,5 @@
                 {
                     sLog.outRALog("Got '%s' cmd.\n",buff);
-                    ParseCommand(&RASocket::zprintf , buff);
+                    sWorld.QueueCliCommand(&RASocket::zprint , buff);
                 }
                 else
@@ -235,19 +235,22 @@
 
 /// Output function
-int RASocket::zprintf( const char * szText, ... )
-{
-    if( !szText ) return 0;
-    va_list ap;
-    va_start(ap, szText);
-    /// \todo Remove buffer length here. Can be >1024 (e.g. list of users)
-    char *megabuffer=new char[1024];
-    unsigned int sz=vsnprintf(megabuffer,1024,szText,ap);
+void RASocket::zprint( const char * szText )
+{
+    if( !szText )
+        return;
+
     #ifdef RA_CRYPT
+
+	char *megabuffer=strdup(szText);
+    unsigned int sz=strlen(megabuffer);
     Encrypt(megabuffer,sz);
+	send(r,megabuffer,sz,0);
+    delete [] megabuffer;
+    
+	#else
+
+    unsigned int sz=strlen(szText);
+    send(r,szText,sz,0);
+
     #endif
-
-    send(r,megabuffer,sz,0);
-    delete [] megabuffer;
-    va_end(ap);
-    return 0;
-}
+}
Index: trunk/src/trinitycore/RASocket.h
===================================================================
--- trunk/src/trinitycore/RASocket.h (revision 102)
+++ trunk/src/trinitycore/RASocket.h (revision 112)
@@ -62,5 +62,5 @@
         }stage;
 
-        static int zprintf( const char * szText, ... );
+        static void zprint( const char * szText );
 };
 #endif
