Index: /trunk/src/game/PetHandler.cpp
===================================================================
--- /trunk/src/game/PetHandler.cpp (revision 211)
+++ /trunk/src/game/PetHandler.cpp (revision 277)
@@ -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/Unit.h
===================================================================
--- /trunk/src/game/Unit.h (revision 272)
+++ /trunk/src/game/Unit.h (revision 277)
@@ -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/Unit.cpp
===================================================================
--- /trunk/src/game/Unit.cpp (revision 276)
+++ /trunk/src/game/Unit.cpp (revision 277)
@@ -3422,25 +3422,23 @@
     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();
         m_currentSpells[CURRENT_CHANNELED_SPELL]->SetReferencedFromCurrent(false);
         m_currentSpells[CURRENT_CHANNELED_SPELL] = NULL;
-
-        // Unsummon any summoned as possessed creatures on channel interrupt
-        SpellEntry const *spellInfo = sSpellStore.LookupEntry(spell_id);
-        if (!spellInfo || !interrupted)
-            return;
-        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(); 
-            }
-        }
     }
 }
@@ -9821,5 +9819,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)
@@ -9832,4 +9830,7 @@
 void CharmInfo::InitPetActionBar()
 {
+    if (m_barInit)
+        return;
+
     // the first 3 SpellOrActions are attack, follow and stay
     for(uint32 i = 0; i < 3; i++)
@@ -9846,15 +9847,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/PossessedAI.cpp
===================================================================
--- /trunk/src/game/PossessedAI.cpp (revision 200)
+++ /trunk/src/game/PossessedAI.cpp (revision 277)
@@ -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());
