Index: /trunk/src/game/PetHandler.cpp
===================================================================
--- /trunk/src/game/PetHandler.cpp (revision 191)
+++ /trunk/src/game/PetHandler.cpp (revision 200)
@@ -79,4 +79,8 @@
     {
         case ACT_COMMAND:                                   //0x0700
+            // Possessed pets are only able to attack
+            if (pet->isPossessed() && spellid != COMMAND_ATTACK)
+                return;
+
             switch(spellid)
             {
Index: /trunk/src/game/SpellHandler.cpp
===================================================================
--- /trunk/src/game/SpellHandler.cpp (revision 174)
+++ /trunk/src/game/SpellHandler.cpp (revision 200)
@@ -353,11 +353,13 @@
         return;
 
-    // Remove possess aura from the possessed as well
-    if(_player->isPossessing())
+    // Remove possess/charm aura from the possessed/charmed as well
+    // TODO: Remove this once the ability to cancel aura sets at once is implemented
+    if(_player->GetCharm())
     {
         for (int i = 0; i < 3; ++i)
         {
             if (spellInfo->EffectApplyAuraName[i] == SPELL_AURA_MOD_POSSESS ||
-                spellInfo->EffectApplyAuraName[i] == SPELL_AURA_MOD_POSSESS_PET)
+                spellInfo->EffectApplyAuraName[i] == SPELL_AURA_MOD_POSSESS_PET ||
+                spellInfo->EffectApplyAuraName[i] == SPELL_AURA_MOD_CHARM)
             {
                 _player->RemoveAurasDueToSpellByCancel(spellId);
Index: /trunk/src/game/Player.cpp
===================================================================
--- /trunk/src/game/Player.cpp (revision 193)
+++ /trunk/src/game/Player.cpp (revision 200)
@@ -18765,6 +18765,14 @@
     {
         target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
+        // Reinitialize the pet bar and make the pet come back to the owner
         if(((Creature*)target)->isPet())
+        {
             PetSpellInitialize();
+            if (!target->getVictim())
+            {
+                target->GetMotionMaster()->MoveFollow(this, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
+                target->GetCharmInfo()->SetCommandState(COMMAND_FOLLOW);
+            }
+        }
         else if (target->isAlive())
         {
Index: /trunk/src/game/PossessedAI.cpp
===================================================================
--- /trunk/src/game/PossessedAI.cpp (revision 186)
+++ /trunk/src/game/PossessedAI.cpp (revision 200)
@@ -25,6 +25,9 @@
 void PossessedAI::AttackStart(Unit *u)
 {
-    if( i_pet.getVictim() || !u )
+    if( !u )
         return;
+
+    if (i_pet.getVictim() && u != i_pet.getVictim())
+        i_pet.AttackStop();
 
     if(i_pet.Attack(u, true))
