Index: /trunk/src/game/SpellAuras.h
===================================================================
--- /trunk/src/game/SpellAuras.h (revision 2)
+++ /trunk/src/game/SpellAuras.h (revision 15)
@@ -284,4 +284,5 @@
 
         int32 m_procCharges;
+        void SetAuraProcCharges(int32 charges) { m_procCharges = charges; }
 
         virtual Unit* GetTriggerTarget() const { return m_target; }
Index: /trunk/src/game/Spell.h
===================================================================
--- /trunk/src/game/Spell.h (revision 6)
+++ /trunk/src/game/Spell.h (revision 15)
@@ -336,4 +336,5 @@
 
         Unit* SelectMagnetTarget();
+        std::pair <bool,Unit *> m_magnetPair;
         bool CheckTarget( Unit* target, uint32 eff, bool hitPhase );
 
Index: /trunk/src/game/Spell.cpp
===================================================================
--- /trunk/src/game/Spell.cpp (revision 6)
+++ /trunk/src/game/Spell.cpp (revision 15)
@@ -268,4 +268,6 @@
     m_selfContainer = NULL;
     m_triggeringContainer = triggeringContainer;
+    m_magnetPair.first = false;
+    m_magnetPair.second = NULL;
     m_deletable = true;
     m_delayAtDamageCount = 0;
@@ -948,4 +950,12 @@
         return;
 
+    // remove spell_magnet aura after first spell redirect and destroy target if its totem
+    if(m_magnetPair.first && m_magnetPair.second && m_magnetPair.second == unit)
+    {
+        if(unit->GetTypeId() == TYPEID_UNIT && ((Creature*)unit)->isTotem())
+            unit->DealDamage(unit,unit->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+        return;
+    }
+
     // Recheck immune (only for delayed spells)
     if( m_spellInfo->speed && (
@@ -4838,5 +4848,5 @@
 {
     // Check targets for creature type mask and remove not appropriate (skip explicit self target case, maybe need other explicit targets)
-    if(m_spellInfo->EffectImplicitTargetA[eff]!=TARGET_SELF )
+    if(m_spellInfo->EffectImplicitTargetA[eff]!=TARGET_SELF && !m_magnetPair.first)
     {
         if (!CheckTargetCreatureType(target))
@@ -4919,6 +4929,10 @@
             if(Unit* magnet = (*itr)->GetCaster())
             {
-                if(magnet->IsWithinLOSInMap(m_caster))
-                {
+                if((*itr)->m_procCharges>0 && magnet->IsWithinLOSInMap(m_caster))
+                {
+                    (*itr)->SetAuraProcCharges((*itr)->m_procCharges-1);
+                    m_magnetPair.first = true;
+                    m_magnetPair.second = magnet;
+
                     target = magnet;
                     m_targets.setUnitTarget(target);
