Index: /trunk/src/game/Chat.h
===================================================================
--- /trunk/src/game/Chat.h (revision 79)
+++ /trunk/src/game/Chat.h (revision 85)
@@ -194,4 +194,5 @@
         bool HandleReloadSpellThreatsCommand(const char* args);
         bool HandleReloadSpellPetAurasCommand(const char* args);
+        bool HandleReloadSpellDisabledCommand(const char* args);
         bool HandleReloadPageTextsCommand(const char* args);
         bool HandleReloadItemEnchantementsCommand(const char* args);
Index: /trunk/src/game/Level3.cpp
===================================================================
--- /trunk/src/game/Level3.cpp (revision 79)
+++ /trunk/src/game/Level3.cpp (revision 85)
@@ -151,4 +151,5 @@
     HandleReloadSpellThreatsCommand("a");
     HandleReloadSpellPetAurasCommand("a");
+    HandleReloadSpellDisabledCommand("a");
     return true;
 }
@@ -610,4 +611,15 @@
 
     SendGlobalSysMessage("DB table `game_tele` reloaded.");
+
+    return true;
+}
+
+bool ChatHandler::HandleReloadSpellDisabledCommand(const char* /*arg*/)
+{
+    sLog.outString( "Re-Loading spell disabled table...");
+
+    objmgr.LoadSpellDisabledEntrys();
+
+    SendGlobalSysMessage("DB table `spell_disabled` reloaded.");
 
     return true;
@@ -5577,5 +5589,5 @@
     {
         player = getSelectedPlayer();
-		if (player) //prevent crash with creature as target
+        if (player) //prevent crash with creature as target
         {   
            name = player->GetName();
@@ -5610,10 +5622,10 @@
         player->setFaction(35);
         player->CombatStop();
-		if(player->IsNonMeleeSpellCasted(true))
+        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 class = hunter || warlock remove pet if alive
         if((player->getClass() == CLASS_HUNTER) || (player->getClass() == CLASS_WARLOCK))
         {
@@ -5662,5 +5674,5 @@
     {
         player = getSelectedPlayer();
-		if (player) //prevent crash with creature as target
+        if (player) //prevent crash with creature as target
         {   
            name = player->GetName();
@@ -5697,23 +5709,23 @@
         {        
             //check for offline players
-		    QueryResult *result = CharacterDatabase.PQuery("SELECT characters.guid FROM `characters` WHERE characters.name = '%s'",name.c_str());
+            QueryResult *result = CharacterDatabase.PQuery("SELECT characters.guid FROM `characters` WHERE characters.name = '%s'",name.c_str());
             if(!result)
-		    {
-			    SendSysMessage(LANG_COMMAND_FREEZE_WRONG);
+            {
+                SendSysMessage(LANG_COMMAND_FREEZE_WRONG);
                 return true;
-		    }
-		    //if player found: delete his freeze aura
-		    Field *fields=result->Fetch();
+            }
+            //if player found: delete his freeze aura
+            Field *fields=result->Fetch();
             uint64 pguid = fields[0].GetUInt64();
-		    delete result;
+            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);
+        }
+        else
+        {
+            SendSysMessage(LANG_COMMAND_FREEZE_WRONG);
             return true;
-		}
+        }
     }
 
Index: /trunk/src/game/Chat.cpp
===================================================================
--- /trunk/src/game/Chat.cpp (revision 83)
+++ /trunk/src/game/Chat.cpp (revision 85)
@@ -198,4 +198,5 @@
         { "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 },
Index: /trunk/src/game/SpellMgr.h
===================================================================
--- /trunk/src/game/SpellMgr.h (revision 44)
+++ /trunk/src/game/SpellMgr.h (revision 85)
@@ -228,4 +228,10 @@
 };
 
+enum SpellDisableTypes
+{
+    SPELL_DISABLE_PLAYER = 1,
+    SPELL_DISABLE_CREATURE = 2
+};
+
 //Some SpellFamilyFlags
 #define SPELLFAMILYFLAG_ROGUE_VANISH            0x000000800LL
Index: /trunk/src/game/ObjectMgr.h
===================================================================
--- /trunk/src/game/ObjectMgr.h (revision 79)
+++ /trunk/src/game/ObjectMgr.h (revision 85)
@@ -690,4 +690,8 @@
         static bool CheckDeclinedNames(std::wstring mainpart, DeclinedName const& names);
 
+        void LoadSpellDisabledEntrys();
+        bool IsPlayerSpellDisabled(uint32 spellid) { return (m_DisabledPlayerSpells.count(spellid) != 0); }
+        bool IsCreatureSpellDisabled(uint32 spellid) { return (m_DisabledCreatureSpells.count(spellid) != 0); }
+
         int GetIndexForLocale(LocaleConstant loc);
         LocaleConstant GetLocaleForIndex(int i);
@@ -798,4 +802,7 @@
         typedef std::set<std::string> ReservedNamesMap;
         ReservedNamesMap    m_ReservedNames;
+
+        std::set<uint32>    m_DisabledPlayerSpells;
+        std::set<uint32>    m_DisabledCreatureSpells;
 
         GraveYardMap        mGraveYardMap;
Index: /trunk/src/game/World.cpp
===================================================================
--- /trunk/src/game/World.cpp (revision 83)
+++ /trunk/src/game/World.cpp (revision 85)
@@ -1110,4 +1110,7 @@
     objmgr.LoadCorpses();
 
+    sLog.outString( "Loading Disabled Spells..." );
+    objmgr.LoadSpellDisabledEntrys();
+
     sLog.outString( "Loading Loot Tables..." );
     LoadLootTables();
Index: /trunk/src/game/Spell.cpp
===================================================================
--- /trunk/src/game/Spell.cpp (revision 69)
+++ /trunk/src/game/Spell.cpp (revision 85)
@@ -2033,4 +2033,22 @@
     }
 
+    if(m_caster->GetTypeId() == TYPEID_PLAYER || (m_caster->GetTypeId() == TYPEID_UNIT && ((Creature*)m_caster)->isPet()))
+    {
+        if(objmgr.IsPlayerSpellDisabled(m_spellInfo->Id))
+        {
+            SendCastResult(SPELL_FAILED_SPELL_UNAVAILABLE);
+            finish(false);
+            return;
+        }
+    }
+    else
+    {
+        if(objmgr.IsCreatureSpellDisabled(m_spellInfo->Id))
+        {
+            finish(false);
+            return;
+        }
+    }
+
     // Fill cost data
     m_powerCost = CalculatePowerCost();
Index: /trunk/src/game/ObjectMgr.cpp
===================================================================
--- /trunk/src/game/ObjectMgr.cpp (revision 83)
+++ /trunk/src/game/ObjectMgr.cpp (revision 85)
@@ -6292,4 +6292,49 @@
 }
 
+void ObjectMgr::LoadSpellDisabledEntrys()
+{
+    m_DisabledPlayerSpells.clear();                                // need for reload case
+    m_DisabledCreatureSpells.clear();
+    QueryResult *result = WorldDatabase.Query("SELECT entry, disable_mask FROM spell_disabled");
+
+    uint32 total_count = 0;
+
+    if( !result )
+    {
+        barGoLink bar( 1 );
+        bar.step();
+
+        sLog.outString();
+        sLog.outString( ">> Loaded %u disabled spells", total_count );
+        return;
+    }
+
+    barGoLink bar( result->GetRowCount() );
+
+    Field* fields;
+    do
+    {
+        bar.step();
+        fields = result->Fetch();
+        uint32 spellid = fields[0].GetUInt32();
+        if(!sSpellStore.LookupEntry(spellid))
+        {
+            sLog.outErrorDb("Spell entry %u from `spell_disabled` doesn't exist in dbc, ignoring.",spellid);
+            continue;
+        }
+        uint32 disable_mask = fields[1].GetUInt32();
+        if(disable_mask & SPELL_DISABLE_PLAYER)
+            m_DisabledPlayerSpells.insert(spellid);
+        if(disable_mask & SPELL_DISABLE_CREATURE)
+            m_DisabledCreatureSpells.insert(spellid);
+        ++total_count;
+   } while ( result->NextRow() );
+
+    delete result;
+
+    sLog.outString();
+    sLog.outString( ">> Loaded %u disabled spells from `spell_disabled`", total_count);
+}
+
 void ObjectMgr::LoadFishingBaseSkillLevel()
 {
Index: /trunk/sql/updates/90_world.sql
===================================================================
--- /trunk/sql/updates/90_world.sql (revision 85)
+++ /trunk/sql/updates/90_world.sql (revision 85)
@@ -0,0 +1,7 @@
+DROP TABLE IF EXISTS `spell_disabled`;
+CREATE TABLE `spell_disabled` (
+  `entry` int(11) unsigned NOT NULL default '0' COMMENT 'Spell entry',
+  `disable_mask` int(8) unsigned NOT NULL default '0',
+  `comment` varchar(64) NOT NULL default '',
+  PRIMARY KEY  (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Disabled Spell System';
Index: /trunk/sql/world.sql
===================================================================
--- /trunk/sql/world.sql (revision 45)
+++ /trunk/sql/world.sql (revision 85)
@@ -2948,4 +2948,25 @@
 
 --
+-- Table structure for table `spell_disabled`
+--
+
+DROP TABLE IF EXISTS `spell_disabled`;
+CREATE TABLE `spell_disabled` (
+  `entry` int(11) unsigned NOT NULL default '0' COMMENT 'Spell entry',
+  `disable_mask` int(8) unsigned NOT NULL default '0',
+  `comment` varchar(64) NOT NULL default '',
+  PRIMARY KEY  (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Disabled Spell System';
+
+--
+-- Dumping data for table `spell_disabled`
+--
+
+LOCK TABLES `spell_disabled` WRITE;
+/*!40000 ALTER TABLE `spell_disabled` DISABLE KEYS */;
+/*!40000 ALTER TABLE `spell_disabled` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
 -- Table structure for table `spell_elixir`
 --
