Index: /trunk/src/game/Unit.h
===================================================================
--- /trunk/src/game/Unit.h (revision 229)
+++ /trunk/src/game/Unit.h (revision 231)
@@ -364,4 +364,5 @@
     UNIT_STAT_ISOLATED        = 0x2000,                     // area auras do not affect other players
     UNIT_STAT_ATTACK_PLAYER   = 0x4000,
+    UNIT_STAT_CASTING         = 0x8000,
     UNIT_STAT_ALL_STATE       = 0xffff                      //(UNIT_STAT_STOPPED | UNIT_STAT_MOVING | UNIT_STAT_IN_COMBAT | UNIT_STAT_IN_FLIGHT)
 };
Index: /trunk/src/game/Unit.cpp
===================================================================
--- /trunk/src/game/Unit.cpp (revision 229)
+++ /trunk/src/game/Unit.cpp (revision 231)
@@ -284,10 +284,13 @@
     }
 
-    if(uint32 base_att = getAttackTimer(BASE_ATTACK))
-        setAttackTimer(BASE_ATTACK, (p_time >= base_att ? 0 : base_att - p_time) );
-    if(uint32 ranged_att = getAttackTimer(RANGED_ATTACK))
-        setAttackTimer(RANGED_ATTACK, (p_time >= ranged_att ? 0 : ranged_att - p_time) );
-    if(uint32 off_att = getAttackTimer(OFF_ATTACK))
-        setAttackTimer(OFF_ATTACK, (p_time >= off_att ? 0 : off_att - p_time) );
+    if(!hasUnitState(UNIT_STAT_CASTING))
+    {
+        if(uint32 base_att = getAttackTimer(BASE_ATTACK))
+            setAttackTimer(BASE_ATTACK, (p_time >= base_att ? 0 : base_att - p_time) );
+        if(uint32 ranged_att = getAttackTimer(RANGED_ATTACK))
+            setAttackTimer(RANGED_ATTACK, (p_time >= ranged_att ? 0 : ranged_att - p_time) );
+        if(uint32 off_att = getAttackTimer(OFF_ATTACK))
+            setAttackTimer(OFF_ATTACK, (p_time >= off_att ? 0 : off_att - p_time) );
+    }
 
     // update abilities available only for fraction of time
Index: /trunk/src/game/Spell.cpp
===================================================================
--- /trunk/src/game/Spell.cpp (revision 229)
+++ /trunk/src/game/Spell.cpp (revision 231)
@@ -2143,4 +2143,5 @@
         m_selfContainer = &(m_caster->m_currentSpells[GetCurrentContainer()]);
         SendSpellStart();
+        m_caster->addUnitState(UNIT_STAT_CASTING);
     }
 }
@@ -2667,11 +2668,14 @@
         return;
 
+    if(m_spellState == SPELL_STATE_FINISHED)
+        return;
+
+    m_spellState = SPELL_STATE_FINISHED;
+
     if(IsChanneledSpell(m_spellInfo))
         m_caster->UpdateInterruptMask();
 
-    if(m_spellState == SPELL_STATE_FINISHED)
-        return;
-
-    m_spellState = SPELL_STATE_FINISHED;
+    if(!m_caster->IsNonMeleeSpellCasted(false, false, true))
+        m_caster->clearUnitState(UNIT_STAT_CASTING);
 
     //remove spell mods
@@ -2708,10 +2712,10 @@
     }
 
-    if (IsMeleeAttackResetSpell())
+    /*if (IsMeleeAttackResetSpell())
     {
         m_caster->resetAttackTimer(BASE_ATTACK);
         if(m_caster->haveOffhandWeapon())
             m_caster->resetAttackTimer(OFF_ATTACK);
-    }
+    }*/
 
     /*if (IsRangedAttackResetSpell())
