Index: trunk/src/bindings/scripts/include/sc_creature.cpp
===================================================================
--- trunk/src/bindings/scripts/include/sc_creature.cpp (revision 186)
+++ trunk/src/bindings/scripts/include/sc_creature.cpp (revision 203)
@@ -201,4 +201,13 @@
             m_creature->AttackerStateUpdate(m_creature->getVictim());
             m_creature->resetAttackTimer();
+        }
+    }
+    if (m_creature->haveOffhandWeapon() && m_creature->isAttackReady(OFF_ATTACK) && !m_creature->IsNonMeleeSpellCasted(false))
+    {
+        //If we are within range melee the target
+        if (m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE))
+        {
+            m_creature->AttackerStateUpdate(m_creature->getVictim(), OFF_ATTACK);
+            m_creature->resetAttackTimer(OFF_ATTACK);
         }
     }
Index: trunk/src/bindings/scripts/include/sc_creature.h
===================================================================
--- trunk/src/bindings/scripts/include/sc_creature.h (revision 202)
+++ trunk/src/bindings/scripts/include/sc_creature.h (revision 203)
@@ -182,3 +182,19 @@
     void AttackStart(Unit *);
 };
+
+struct TRINITY_DLL_DECL NullCreatureAI : public CreatureAI
+{
+    NullCreatureAI(Creature* c) : m_creature(c) {}
+    ~NullCreatureAI() {}
+
+    Creature *m_creature;
+
+    void MoveInLineOfSight(Unit *) {}
+    void AttackStart(Unit *) {}
+    void EnterEvadeMode() {}
+    bool IsVisible(Unit *) const { return false; }
+
+    void UpdateAI(const uint32) {}
+};
+
 #endif
Index: trunk/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/boss_magtheridon.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/boss_magtheridon.cpp (revision 166)
+++ trunk/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/boss_magtheridon.cpp (revision 203)
@@ -228,4 +228,5 @@
         m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
         m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+        m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN2);
         m_creature->addUnitState(UNIT_STAT_STUNNED);
         m_creature->CastSpell(m_creature, SPELL_SHADOW_CAGE_C, true);
Index: trunk/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp (revision 186)
+++ trunk/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp (revision 203)
@@ -72,4 +72,5 @@
 #define SPELL_DRAW_SOUL                 40904 // 5k Shadow Damage in front of him. Heals Illidan for 100k health (script effect)
 #define SPELL_PARASITIC_SHADOWFIEND     41917 // DoT of 3k Shadow every 2 seconds. Lasts 10 seconds. (Script effect: Summon 2 parasites once the debuff has ticked off)
+#define SPELL_PARASITIC_SHADOWFIEND2    41914 // Used by Parasitic
 #define SPELL_SUMMON_PARASITICS         41915 // Summons 2 Parasitic Shadowfiends on the target. It's supposed to be cast as soon as the Parasitic Shadowfiend debuff is gone, but the spells aren't linked :(
 #define SPELL_AGONIZING_FLAMES          40932 // 4k fire damage initial to target and anyone w/i 5 yards. PHASE 3 ONLY
@@ -554,5 +555,5 @@
                 {
                     GlaiveGUID[i] = Glaive->GetGUID();
-                    Glaive->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+                    Glaive->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                     Glaive->SetUInt32Value(UNIT_FIELD_DISPLAYID, 11686);
                     Glaive->setFaction(m_creature->getFaction());
@@ -571,5 +572,5 @@
                 {
                     GlaiveGUID[i] = Glaive->GetGUID();
-                    Glaive->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+                    Glaive->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                     Glaive->SetUInt32Value(UNIT_FIELD_DISPLAYID, 11686);
                     Glaive->setFaction(m_creature->getFaction());
@@ -1338,4 +1339,5 @@
                         Elite->AddThreat(m_creature, 1000000.0f);
                         AttackStart(Elite);
+                        m_creature->AddThreat(Elite, 1000000.0f);
                     }
                     Timer = 10000 + rand()%6000;
@@ -1350,5 +1352,5 @@
         }
 
-        if(!m_creature->SelectHostilTarget() || !m_creature->getVictim())
+        if(!m_creature->SelectHostilTarget() && !m_creature->getVictim())
             return;
 
@@ -1742,7 +1744,7 @@
         if( m_creature->isAttackReady() && m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE))
         {
-            if(!m_creature->getVictim()->HasAura(SPELL_PARASITIC_SHADOWFIEND, 0))
-            {
-                m_creature->getVictim()->CastSpell(m_creature->getVictim(), SPELL_PARASITIC_SHADOWFIEND, true, 0, 0, IllidanGUID); //do not stack
+            if(!m_creature->getVictim()->HasAura(SPELL_PARASITIC_SHADOWFIEND, 0) && !m_creature->getVictim()->HasAura(SPELL_PARASITIC_SHADOWFIEND2, 0))
+            {
+                m_creature->CastSpell(m_creature->getVictim(), SPELL_PARASITIC_SHADOWFIEND2, true, 0, 0, IllidanGUID); //do not stack
             }
             m_creature->AttackerStateUpdate(m_creature->getVictim());
@@ -1913,4 +1915,5 @@
 
     m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, 21135);
+    m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN2);
     m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
     m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
@@ -1927,4 +1930,5 @@
     switch(summon->GetEntry())
     {
+    case PARASITIC_SHADOWFIEND:
     case SHADOW_DEMON:
         {
@@ -2159,5 +2163,5 @@
             m_creature->RemoveAllAuras();
             m_creature->InterruptNonMeleeSpells(false);
-            m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE + UNIT_FLAG_NOT_SELECTABLE);
+            m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
             m_creature->GetMotionMaster()->Clear(false);
             m_creature->AttackStop();
Index: trunk/src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp (revision 160)
+++ trunk/src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp (revision 203)
@@ -28,5 +28,5 @@
 #define SPELL_MOLTEN_PUNCH          40126
 #define SPELL_HURTFUL_STRIKE        41926
-#define SPELL_MOLTEN_FLAME          40253
+#define SPELL_MOLTEN_FLAME          40980
 #define SPELL_VOLCANIC_ERUPTION     40117
 #define SPELL_VOLCANIC_SUMMON       40276
@@ -36,45 +36,12 @@
 #define CREATURE_STALKER            23095
 
-struct TRINITY_DLL_DECL molten_flameAI : public ScriptedAI
-{
-    molten_flameAI(Creature *c) : ScriptedAI(c)
-    {
-        FlameTimer = 0;
+struct TRINITY_DLL_DECL molten_flameAI : public NullCreatureAI
+{
+    molten_flameAI(Creature *c) : NullCreatureAI(c)
+    {
         float x, y, z;
-        m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
         m_creature->GetNearPoint(m_creature, x, y, z, 1, 50, M_PI*2*rand_norm());
         m_creature->GetMotionMaster()->MovePoint(0, x, y, z);
     }
-
-    uint32 FlameTimer;
-
-    void Reset() {}
-    void Aggro(Unit *who) {}
-    void AttackStart(Unit* who) {}
-    void MoveInLineOfSight(Unit *who) {}
-    void UpdateAI(const uint32 diff)
-    {
-        if(FlameTimer < diff)
-        {
-            m_creature->CastSpell(m_creature, SPELL_MOLTEN_FLAME, true);
-            FlameTimer = 1000;
-        }else FlameTimer -= diff;
-    }
-};
-
-struct TRINITY_DLL_DECL npc_volcanoAI : public ScriptedAI
-{
-    npc_volcanoAI(Creature *c) : ScriptedAI(c)
-    {
-        m_creature->CastSpell(m_creature, SPELL_VOLCANIC_ERUPTION, false);
-        m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
-        m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
-    }
-
-    void Reset() {}
-    void Aggro(Unit *who) {}
-    void AttackStart(Unit* who) {}
-    void MoveInLineOfSight(Unit* who) {}
-    void UpdateAI(const uint32 diff) {}
 };
 
@@ -264,9 +231,4 @@
 }
 
-CreatureAI* GetAI_npc_volcano(Creature *_Creature)
-{
-    return new npc_volcanoAI (_Creature);
-}
-
 void AddSC_boss_supremus()
 {
@@ -281,8 +243,3 @@
     newscript->GetAI = GetAI_molten_flame;
     m_scripts[nrscripts++] = newscript;
-
-    newscript = new Script;
-    newscript->Name="npc_volcano";
-    newscript->GetAI = GetAI_npc_volcano;
-    m_scripts[nrscripts++] = newscript;
 }
