Index: /trunk/src/game/SpellEffects.cpp
===================================================================
--- /trunk/src/game/SpellEffects.cpp (revision 283)
+++ /trunk/src/game/SpellEffects.cpp (revision 284)
@@ -3151,4 +3151,5 @@
         case SUMMON_TYPE_POSESSED:
         case SUMMON_TYPE_POSESSED2:
+        case SUMMON_TYPE_POSESSED3:
             EffectSummonPossessed(i);
             break;
@@ -3175,5 +3176,4 @@
             break;
         case SUMMON_TYPE_UNKNOWN1:
-        case SUMMON_TYPE_UNKNOWN2:
         case SUMMON_TYPE_UNKNOWN3:
         case SUMMON_TYPE_UNKNOWN4:
Index: /trunk/src/game/PetHandler.cpp
===================================================================
--- /trunk/src/game/PetHandler.cpp (revision 283)
+++ /trunk/src/game/PetHandler.cpp (revision 284)
@@ -98,4 +98,11 @@
                 case COMMAND_ATTACK:                        //spellid=1792  //ATTACK
                 {
+                    // Can't attack if owner is pacified
+                    if (_player->HasAuraType(SPELL_AURA_MOD_PACIFY))
+                    {
+                        //pet->SendPetCastFail(spellid, SPELL_FAILED_PACIFIED);
+                        //TODO: Send proper error message to client
+                        return;
+                    }
                     // only place where pet can be player
                     pet->clearUnitState(UNIT_STAT_FOLLOW);
Index: /trunk/src/game/SpellHandler.cpp
===================================================================
--- /trunk/src/game/SpellHandler.cpp (revision 283)
+++ /trunk/src/game/SpellHandler.cpp (revision 284)
@@ -34,4 +34,5 @@
 #include "ScriptCalls.h"
 #include "Totem.h"
+#include "TemporarySummon.h"
 
 void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket)
@@ -377,4 +378,12 @@
                 return;
             }
+            else if (spellInfo->Effect[i] == SPELL_EFFECT_SUMMON && 
+                (spellInfo->EffectMiscValueB[i] == SUMMON_TYPE_POSESSED || 
+                 spellInfo->EffectMiscValueB[i] == SUMMON_TYPE_POSESSED2 || 
+                 spellInfo->EffectMiscValueB[i] == SUMMON_TYPE_POSESSED3))
+            {
+                // Possession is removed in the UnSummon function
+                ((TemporarySummon*)_player->GetCharm())->UnSummon();
+            }
         }
     }
Index: /trunk/src/game/Unit.h
===================================================================
--- /trunk/src/game/Unit.h (revision 283)
+++ /trunk/src/game/Unit.h (revision 284)
@@ -641,5 +641,5 @@
 typedef std::list<Player*> SharedVisionList;
 
-struct CharmInfo
+struct TRINITY_DLL_SPEC CharmInfo
 {
     public:
@@ -658,5 +658,5 @@
         void InitCharmCreateSpells();
         void InitPetActionBar();
-        void InitEmptyActionBar();
+        void InitEmptyActionBar(bool withAttack = true);
                                                             //return true if successful
         bool AddSpellToAB(uint32 oldid, uint32 newid, ActiveStates newstate = ACT_DECIDE);
@@ -672,4 +672,5 @@
         ReactStates     m_reactState;
         uint32          m_petnumber;
+        bool            m_barInit;
 };
 
Index: /trunk/src/game/SpellAuras.cpp
===================================================================
--- /trunk/src/game/SpellAuras.cpp (revision 283)
+++ /trunk/src/game/SpellAuras.cpp (revision 284)
@@ -50,5 +50,4 @@
 #include "GridNotifiersImpl.h"
 #include "CellImpl.h"
-#include "TemporarySummon.h"
 
 #define NULL_AURA_SLOT 0xFF
@@ -2025,11 +2024,4 @@
             return;
         }
-
-        // Eye of Kilrogg, unsummon eye when aura is gone
-        if(GetId() == 126 && caster->GetTypeId() == TYPEID_PLAYER && caster->GetCharm())
-        {
-            ((TemporarySummon*)caster->GetCharm())->UnSummon();
-            return;
-        }
     }
 
Index: /trunk/src/game/SharedDefines.h
===================================================================
--- /trunk/src/game/SharedDefines.h (revision 283)
+++ /trunk/src/game/SharedDefines.h (revision 284)
@@ -2070,5 +2070,5 @@
     SUMMON_TYPE_CRITTER3    = 307,
     SUMMON_TYPE_UNKNOWN5    = 409,
-    SUMMON_TYPE_UNKNOWN2    = 427,
+    SUMMON_TYPE_POSESSED3   = 427,
     SUMMON_TYPE_POSESSED2   = 428
 };
Index: /trunk/src/game/Creature.cpp
===================================================================
--- /trunk/src/game/Creature.cpp (revision 283)
+++ /trunk/src/game/Creature.cpp (revision 284)
@@ -148,5 +148,9 @@
     i_AI = NULL;
 
-    DeletePossessedAI();
+    if (i_AI_possessed)
+    {
+        delete i_AI_possessed;
+        i_AI_possessed = NULL;
+    }
 }
 
@@ -563,10 +567,7 @@
 }
 
-void Creature::DeletePossessedAI()
+void Creature::DisablePossessedAI()
 {
     if (!i_AI_possessed) return;
-
-    delete i_AI_possessed;
-    i_AI_possessed = NULL;
 
     // Signal the old AI that it's been re-enabled
Index: /trunk/src/game/Creature.h
===================================================================
--- /trunk/src/game/Creature.h (revision 283)
+++ /trunk/src/game/Creature.h (revision 284)
@@ -461,5 +461,5 @@
         bool AIM_Initialize();
         void InitPossessedAI();
-        void DeletePossessedAI();
+        void DisablePossessedAI();
 
         void AI_SendMoveToPacket(float x, float y, float z, uint32 time, uint32 MovementFlags, uint8 type);
Index: /trunk/src/game/Unit.cpp
===================================================================
--- /trunk/src/game/Unit.cpp (revision 283)
+++ /trunk/src/game/Unit.cpp (revision 284)
@@ -47,4 +47,5 @@
 #include "CellImpl.h"
 #include "Path.h"
+#include "TemporarySummon.h"
 
 #include <math.h>
@@ -3412,4 +3413,19 @@
     if (m_currentSpells[CURRENT_CHANNELED_SPELL] && (!spell_id || m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->Id==spell_id))
     {
+        // Unsummon any summoned as possessed creatures on channel interrupt
+        SpellEntry const *spellInfo = m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo;
+        for (int i = 0; i < 3; i++)
+        {
+            if (spellInfo->Effect[i] == SPELL_EFFECT_SUMMON && 
+                (spellInfo->EffectMiscValueB[i] == SUMMON_TYPE_POSESSED || 
+                 spellInfo->EffectMiscValueB[i] == SUMMON_TYPE_POSESSED2 || 
+                 spellInfo->EffectMiscValueB[i] == SUMMON_TYPE_POSESSED3))
+            {
+                // Possession is removed in the UnSummon function
+                if (GetCharm())
+                    ((TemporarySummon*)GetCharm())->UnSummon(); 
+            }
+        }
+
         if (m_currentSpells[CURRENT_CHANNELED_SPELL]->getState() != SPELL_STATE_FINISHED)
             m_currentSpells[CURRENT_CHANNELED_SPELL]->cancel();
@@ -9791,5 +9807,5 @@
 
 CharmInfo::CharmInfo(Unit* unit)
-: m_unit(unit), m_CommandState(COMMAND_FOLLOW), m_reactState(REACT_PASSIVE), m_petnumber(0)
+: m_unit(unit), m_CommandState(COMMAND_FOLLOW), m_reactState(REACT_PASSIVE), m_petnumber(0), m_barInit(false)
 {
     for(int i =0; i<4; ++i)
@@ -9802,4 +9818,7 @@
 void CharmInfo::InitPetActionBar()
 {
+    if (m_barInit)
+        return;
+
     // the first 3 SpellOrActions are attack, follow and stay
     for(uint32 i = 0; i < 3; i++)
@@ -9816,15 +9835,23 @@
         PetActionBar[i + 3].SpellOrAction = 0;
     }
-}
-
-void CharmInfo::InitEmptyActionBar()
-{
-    for(uint32 x = 1; x < 10; ++x)
+    m_barInit = true;
+}
+
+void CharmInfo::InitEmptyActionBar(bool withAttack)
+{
+    if (m_barInit)
+        return;
+
+    for(uint32 x = 0; x < 10; ++x)
     {
         PetActionBar[x].Type = ACT_CAST;
         PetActionBar[x].SpellOrAction = 0;
     }
-    PetActionBar[0].Type = ACT_COMMAND;
-    PetActionBar[0].SpellOrAction = COMMAND_ATTACK;
+    if (withAttack)
+    {
+        PetActionBar[0].Type = ACT_COMMAND;
+        PetActionBar[0].SpellOrAction = COMMAND_ATTACK;
+    }
+    m_barInit = true;
 }
 
Index: /trunk/src/game/Player.cpp
===================================================================
--- /trunk/src/game/Player.cpp (revision 283)
+++ /trunk/src/game/Player.cpp (revision 284)
@@ -18957,6 +18957,6 @@
                 target->AddThreat(this, 1000000.0f);
         }
-        // Delete the assigned possessed AI
-        ((Creature*)target)->DeletePossessedAI();
+        // Disable the assigned possessed AI
+        ((Creature*)target)->DisablePossessedAI();
     }
 }
Index: /trunk/src/game/Spell.cpp
===================================================================
--- /trunk/src/game/Spell.cpp (revision 283)
+++ /trunk/src/game/Spell.cpp (revision 284)
@@ -1534,4 +1534,5 @@
         case TARGET_SCRIPT:
         case TARGET_SCRIPT_COORDINATES:
+        case TARGET_UNIT_AREA_SCRIPT:
         {
             SpellScriptTarget::const_iterator lower = spellmgr.GetBeginSpellScriptTarget(m_spellInfo->Id);
@@ -3866,4 +3867,5 @@
                     case SUMMON_TYPE_POSESSED:
                     case SUMMON_TYPE_POSESSED2:
+                    case SUMMON_TYPE_POSESSED3:
                     case SUMMON_TYPE_DEMON:
                     case SUMMON_TYPE_SUMMON:
Index: /trunk/src/game/PossessedAI.cpp
===================================================================
--- /trunk/src/game/PossessedAI.cpp (revision 283)
+++ /trunk/src/game/PossessedAI.cpp (revision 284)
@@ -25,5 +25,5 @@
 void PossessedAI::AttackStart(Unit *u)
 {
-    if( !u )
+    if( !u || i_pet.GetCharmer()->HasAuraType(SPELL_AURA_MOD_PACIFY))
         return;
 
@@ -96,5 +96,5 @@
             return;
         }
-        else if(i_pet.IsWithinCombatDist(i_pet.getVictim(), ATTACK_DISTANCE) && i_pet.isAttackReady())
+        else if(i_pet.IsWithinCombatDist(i_pet.getVictim(), ATTACK_DISTANCE) && i_pet.isAttackReady() && !i_pet.GetCharmer()->HasAuraType(SPELL_AURA_MOD_PACIFY))
         {
             i_pet.AttackerStateUpdate(i_pet.getVictim());
Index: /trunk/src/bindings/scripts/scripts/npc/npcs_special.cpp
===================================================================
--- /trunk/src/bindings/scripts/scripts/npc/npcs_special.cpp (revision 283)
+++ /trunk/src/bindings/scripts/scripts/npc/npcs_special.cpp (revision 284)
@@ -826,4 +826,69 @@
 }
 
+struct TRINITY_DLL_DECL npc_steam_tonkAI : public ScriptedAI
+{
+    npc_steam_tonkAI(Creature *c) : ScriptedAI(c) {Reset();}
+
+    void Reset() {}
+    void Aggro(Unit *who) {}
+    
+    void OnPossess(bool apply)
+    {
+        if (apply)
+        {
+            // Initialize the action bar without the melee attack command
+            m_creature->InitCharmInfo(m_creature);
+            m_creature->GetCharmInfo()->InitEmptyActionBar(false);
+
+            m_creature->SetAggressive(false);
+        }
+        else
+            m_creature->SetAggressive(true);
+    }
+
+};
+
+CreatureAI* GetAI_npc_steam_tonk(Creature *_Creature)
+{
+    return new npc_steam_tonkAI(_Creature);
+}
+
+#define SPELL_TONK_MINE_DETONATE 25099   
+
+struct TRINITY_DLL_DECL npc_tonk_mineAI : public ScriptedAI
+{
+    npc_tonk_mineAI(Creature *c) : ScriptedAI(c) 
+    {
+        m_creature->SetAggressive(false);
+        Reset();
+    }
+
+    uint32 ExplosionTimer;
+
+    void Reset()
+    {
+        ExplosionTimer = 3000;
+    }
+
+    void Aggro(Unit *who) {}
+    void AttackStart(Unit *who) {}
+    void MoveInLineOfSight(Unit *who) {}
+
+    void UpdateAI(const uint32 diff)
+    {
+        if (ExplosionTimer < diff)
+        {
+            m_creature->CastSpell(m_creature, SPELL_TONK_MINE_DETONATE, true);
+            m_creature->setDeathState(DEAD); // unsummon it
+        } else
+            ExplosionTimer -= diff;
+    }
+};
+
+CreatureAI* GetAI_npc_tonk_mine(Creature *_Creature)
+{
+    return new npc_tonk_mineAI(_Creature);
+}
+
 void AddSC_npcs_special()
 {
@@ -876,3 +941,13 @@
     newscript->pGossipSelect = &GossipSelect_npc_sayge;
     newscript->RegisterSelf();
-}
+
+    newscript = new Script;
+    newscript->Name="npc_steam_tonk";
+    newscript->GetAI = &GetAI_npc_steam_tonk;
+    newscript->RegisterSelf();
+
+    newscript = new Script;
+    newscript->Name="npc_tonk_mine";
+    newscript->GetAI = &GetAI_npc_tonk_mine;
+    newscript->RegisterSelf();
+}
