Index: trunk/src/game/Chat.h
===================================================================
--- trunk/src/game/Chat.h (revision 44)
+++ trunk/src/game/Chat.h (revision 62)
@@ -246,4 +246,7 @@
         bool HandleUnmuteCommand(const char* args);
         bool HandleMovegensCommand(const char* args);
+        bool HandleFreezeCommand(const char *args);
+        bool HandleUnFreezeCommand(const char *args);
+        bool HandleListFreezeCommand(const char* args);
 
         bool HandleBanCommand(const char* args);
Index: trunk/src/game/Level3.cpp
===================================================================
--- trunk/src/game/Level3.cpp (revision 44)
+++ trunk/src/game/Level3.cpp (revision 62)
@@ -5508,4 +5508,180 @@
 }
 
+bool ChatHandler::HandleFreezeCommand(const char *args)
+{
+    std::string name;
+    Player* player;
+    char* TargetName = strtok((char*)args, " "); //get entered name
+    if (!TargetName) //if no name entered use target
+    {
+        player = getSelectedPlayer();
+		if (player) //prevent crash with creature as target
+        {   
+           name = player->GetName();
+           normalizePlayerName(name);
+        }
+    }
+    else // if name entered
+    {
+        name = TargetName;
+        normalizePlayerName(name);
+        player = objmgr.GetPlayer(name.c_str()); //get player by name
+    }
+    
+    if (!player)
+    {
+        SendSysMessage(LANG_COMMAND_FREEZE_WRONG);
+        return true;
+    }
+
+    if (player==m_session->GetPlayer())
+    {
+        SendSysMessage(LANG_COMMAND_FREEZE_ERROR);
+        return true;
+    }
+
+    //effect
+    if ((player) && (!(player==m_session->GetPlayer())))
+    {
+        PSendSysMessage(LANG_COMMAND_FREEZE,name.c_str());
+
+        //stop combat + make player unattackable + duel stop + stop some spells
+        player->setFaction(35);
+        player->CombatStop();
+		if(player->IsNonMeleeSpellCasted(true))
+        player->InterruptNonMeleeSpells(true);
+        player->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+        player->SetUInt32Value(PLAYER_DUEL_TEAM, 1);
+
+		//if player class = hunter || warlock remove pet if alive
+        if((player->getClass() == CLASS_HUNTER) || (player->getClass() == CLASS_WARLOCK))
+        {
+            if(Pet* pet = player->GetPet())
+            {
+                pet->SavePetToDB(PET_SAVE_AS_CURRENT);
+                // not let dismiss dead pet
+                if(pet && pet->isAlive())
+                player->RemovePet(pet,PET_SAVE_NOT_IN_SLOT);
+            }
+        }
+
+        //stop movement and disable spells
+        uint32 spellID = 9454;
+        //m_session->GetPlayer()->CastSpell(player,spellID,false);
+        SpellEntry const *spellInfo = sSpellStore.LookupEntry( spellID );
+        if(spellInfo) //TODO: Change the duration of the aura to -1 instead of 5000000
+        {
+            for(uint32 i = 0;i<3;i++)
+            {
+                uint8 eff = spellInfo->Effect[i];
+                if (eff>=TOTAL_SPELL_EFFECTS)
+                    continue;
+                if( eff == SPELL_EFFECT_APPLY_AREA_AURA_PARTY || eff == SPELL_EFFECT_APPLY_AURA ||
+                    eff == SPELL_EFFECT_PERSISTENT_AREA_AURA || eff == SPELL_EFFECT_APPLY_AREA_AURA_FRIEND || 
+                    eff == SPELL_EFFECT_APPLY_AREA_AURA_ENEMY)
+                {
+                    Aura *Aur = CreateAura(spellInfo, i, NULL, player);
+                    player->AddAura(Aur);
+               }
+            }
+        }
+
+        //save player
+        player->SaveToDB();
+    }
+    return true;
+}
+
+bool ChatHandler::HandleUnFreezeCommand(const char *args)
+{
+    std::string name;
+    Player* player;
+    char* TargetName = strtok((char*)args, " "); //get entered name
+    if (!TargetName) //if no name entered use target
+    {
+        player = getSelectedPlayer();
+		if (player) //prevent crash with creature as target
+        {   
+           name = player->GetName();
+        }
+    }
+
+    else // if name entered
+    {
+        name = TargetName;
+        normalizePlayerName(name);
+        player = objmgr.GetPlayer(name.c_str()); //get player by name
+    }
+
+    //effect
+    if (player)
+    {
+        PSendSysMessage(LANG_COMMAND_UNFREEZE,name.c_str());
+
+        //Reset player faction + allow combat + allow duels
+        player->setFactionForRace(player->getRace());
+        player->RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+
+        //allow movement and spells
+        uint32 spellID = 9454;
+        player->RemoveAurasDueToSpell(spellID);
+
+        //save player
+        player->SaveToDB();
+    }
+
+    if (!player)
+    {
+        if (TargetName)
+        {        
+            //check for offline players
+		    QueryResult *result = CharacterDatabase.PQuery("SELECT characters.guid FROM `characters` WHERE characters.name = '%s'",name.c_str());
+            if(!result)
+		    {
+			    SendSysMessage(LANG_COMMAND_FREEZE_WRONG);
+                return true;
+		    }
+		    //if player found: delete his freeze aura
+		    Field *fields=result->Fetch();
+            uint64 pguid = fields[0].GetUInt64();
+		    delete result;
+            CharacterDatabase.PQuery("DELETE FROM `character_aura` WHERE character_aura.spell = 9454 AND character_aura.guid = '%u'",pguid);
+            PSendSysMessage(LANG_COMMAND_UNFREEZE,name.c_str());
+            return true;
+		}
+		else
+        {
+	        SendSysMessage(LANG_COMMAND_FREEZE_WRONG);
+            return true;
+		}
+    }
+
+    return true;
+}
+
+bool ChatHandler::HandleListFreezeCommand(const char* args)
+{
+    //Get names from DB
+    QueryResult *result = CharacterDatabase.PQuery("SELECT characters.name FROM `characters` LEFT JOIN `character_aura` ON (characters.guid = character_aura.guid) WHERE character_aura.spell = 9454");
+    if(!result)
+    {
+        SendSysMessage(LANG_COMMAND_NO_FROZEN_PLAYERS);
+        return true;
+    }
+    //Header of the names
+    PSendSysMessage(LANG_COMMAND_LIST_FREEZE);
+    
+    //Output of the results
+	do
+    {
+        Field *fields = result->Fetch();
+        std::string fplayers = fields[0].GetCppString();
+        PSendSysMessage(LANG_COMMAND_FROZEN_PLAYERS,fplayers.c_str());
+    } while (result->NextRow());
+
+    delete result;
+    return true;
+}
+
 bool ChatHandler::HandleFlushArenaPointsCommand(const char * /*args*/)
 {
Index: trunk/src/game/Chat.cpp
===================================================================
--- trunk/src/game/Chat.cpp (revision 44)
+++ trunk/src/game/Chat.cpp (revision 62)
@@ -473,4 +473,7 @@
         { "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 },
 
Index: trunk/src/game/MiscHandler.cpp
===================================================================
--- trunk/src/game/MiscHandler.cpp (revision 44)
+++ trunk/src/game/MiscHandler.cpp (revision 62)
@@ -288,4 +288,5 @@
     if( GetPlayer()->isInCombat() ||                        //...is in combat
         GetPlayer()->duel         ||                        //...is in Duel
+        GetPlayer()->HasAura(9454,0)         ||             //...is frozen by GM via freeze command
                                                             //...is jumping ...is falling
         GetPlayer()->HasUnitMovementFlag(MOVEMENTFLAG_JUMPING | MOVEMENTFLAG_FALLING))
Index: trunk/src/game/Language.h
===================================================================
--- trunk/src/game/Language.h (revision 44)
+++ trunk/src/game/Language.h (revision 62)
@@ -660,4 +660,11 @@
 
     // 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,
 
     // Use for not-in-svn patches         10000-10999
Index: trunk/src/trinitycore/trinitycore.conf.dist
===================================================================
--- trunk/src/trinitycore/trinitycore.conf.dist (revision 51)
+++ trunk/src/trinitycore/trinitycore.conf.dist (revision 62)
@@ -84,5 +84,5 @@
 #
 #    ProcessPriority
-#        Process proirity setting (Used only at Windows)
+#        Process priority setting (Used only at Windows)
 #        Default: 1 (HIGH)
 #                 0 (Normal)
@@ -846,5 +846,5 @@
 #    Rate.Drop.Item.Referenced
 #    Rate.Drop.Money
-#         Drop rates (items by qualify and money)
+#         Drop rates (items by quality and money)
 #         Default: 1
 #
