Index: trunk/src/bindings/scripts/sql/scripts_structure.sql
===================================================================
--- trunk/src/bindings/scripts/sql/scripts_structure.sql (revision 47)
+++ trunk/src/bindings/scripts/sql/scripts_structure.sql (revision 109)
@@ -1,74 +1,79 @@
+DROP TABLE IF EXISTS `custom_texts`;
+CREATE TABLE `custom_texts` (
+  `entry` mediumint(8) NOT NULL,
+  `content_default` text NOT NULL,
+  `content_loc1` text,
+  `content_loc2` text,
+  `content_loc3` text,
+  `content_loc4` text,
+  `content_loc5` text,
+  `content_loc6` text,
+  `content_loc7` text,
+  `content_loc8` text,
+  `sound` mediumint(8) unsigned NOT NULL default '0',
+  `type` tinyint unsigned NOT NULL default '0',
+  `language` tinyint unsigned NOT NULL default '0',
+  `comment` text,
+  PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Custom Texts';
+
 DROP TABLE IF EXISTS `eventai_scripts`;
 CREATE TABLE `eventai_scripts` (
-`id` int(11) unsigned NOT NULL COMMENT 'Identifier' AUTO_INCREMENT,
-`creature_id` int(11) unsigned NOT NULL default '0' COMMENT 'Creature Template Identifier',
+  `id` int(11) unsigned NOT NULL COMMENT 'Identifier' AUTO_INCREMENT,
+  `creature_id` int(11) unsigned NOT NULL default '0' COMMENT 'Creature Template Identifier',
+  `event_type` tinyint(5) unsigned NOT NULL default '0' COMMENT 'Event Type',
+  `event_inverse_phase_mask` int(11) signed NOT NULL default '0' COMMENT 'Mask which phases this event will not trigger in',
+  `event_chance` int(3) unsigned NOT NULL default '100',
+  `event_flags` int(3) unsigned NOT NULL default '0',
+  `event_param1` int(11) signed NOT NULL default '0',
+  `event_param2` int(11) signed NOT NULL default '0',
+  `event_param3` int(11) signed NOT NULL default '0',
+  `event_param4` int(11) signed NOT NULL default '0',
+  `action1_type` tinyint(5) unsigned NOT NULL default '0' COMMENT 'Action Type',
+  `action1_param1` int(11) signed NOT NULL default '0',
+  `action1_param2` int(11) signed NOT NULL default '0',
+  `action1_param3` int(11) signed NOT NULL default '0',
+  `action2_type` tinyint(5) unsigned NOT NULL default '0' COMMENT 'Action Type',
+  `action2_param1` int(11) signed NOT NULL default '0',
+  `action2_param2` int(11) signed NOT NULL default '0',
+  `action2_param3` int(11) signed NOT NULL default '0',
+  `action3_type` tinyint(5) unsigned NOT NULL default '0' COMMENT 'Action Type',
+  `action3_param1` int(11) signed NOT NULL default '0',
+  `action3_param2` int(11) signed NOT NULL default '0',
+  `action3_param3` int(11) signed NOT NULL default '0',
+  `comment` varchar(255) NOT NULL default '' COMMENT 'Event Comment',
+  PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='EventAI Scripts';
 
-`event_type` tinyint(5) unsigned NOT NULL default '0' COMMENT 'Event Type',
-`event_inverse_phase_mask` int(11) signed NOT NULL default '0' COMMENT 'Mask which phases this event will not trigger in',
-`event_chance` int(3) unsigned NOT NULL default '100',
-`event_flags` int(3) unsigned NOT NULL default '0',
-`event_param1` int(11) signed NOT NULL default '0',
-`event_param2` int(11) signed NOT NULL default '0',
-`event_param3` int(11) signed NOT NULL default '0',
-`event_param4` int(11) signed NOT NULL default '0',
-
-`action1_type` tinyint(5) unsigned NOT NULL default '0' COMMENT 'Action Type',
-`action1_param1` int(11) signed NOT NULL default '0',
-`action1_param2` int(11) signed NOT NULL default '0',
-`action1_param3` int(11) signed NOT NULL default '0',
-
-`action2_type` tinyint(5) unsigned NOT NULL default '0' COMMENT 'Action Type',
-`action2_param1` int(11) signed NOT NULL default '0',
-`action2_param2` int(11) signed NOT NULL default '0',
-`action2_param3` int(11) signed NOT NULL default '0',
-
-`action3_type` tinyint(5) unsigned NOT NULL default '0' COMMENT 'Action Type',
-`action3_param1` int(11) signed NOT NULL default '0',
-`action3_param2` int(11) signed NOT NULL default '0',
-`action3_param3` int(11) signed NOT NULL default '0',
-
-`comment` varchar(255) NOT NULL default '' COMMENT 'Event Comment',
-
-  PRIMARY KEY  (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='EventAI Scripts';
+DROP TABLE IF EXISTS `eventai_summons`;
+CREATE TABLE `eventai_summons` (
+  `id` int(11) unsigned NOT NULL COMMENT 'Location Identifier' AUTO_INCREMENT,
+  `position_x` float NOT NULL default '0',
+  `position_y` float NOT NULL default '0',
+  `position_z` float NOT NULL default '0',
+  `orientation` float NOT NULL default '0',
+  `spawntimesecs` int(11) unsigned NOT NULL default '120',
+  `comment` varchar(255) NOT NULL default '' COMMENT 'Summon Comment',
+  PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='EventAI Summoning Locations';
 
 DROP TABLE IF EXISTS `eventai_texts`;
 CREATE TABLE `eventai_texts` (
-
-`id` int(11) unsigned NOT NULL default '0' COMMENT 'Identifier',
-`text` varchar(255) character set utf8 NOT NULL default '',  
-`comment` varchar(255) character set utf8 NOT NULL default '' COMMENT 'Text Comment',
-
-PRIMARY KEY (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Texts used in EventAI';
-
-DROP TABLE IF EXISTS `eventai_localized_texts`;
-CREATE TABLE `eventai_localized_texts` (
-
-`id` int(11) unsigned NOT NULL COMMENT 'Identifier' AUTO_INCREMENT,
-`locale_1` varchar(255) NOT NULL default '',
-`locale_2` varchar(255) NOT NULL default '',
-`locale_3` varchar(255) NOT NULL default '',
-`locale_4` varchar(255) NOT NULL default '',
-`locale_5` varchar(255) NOT NULL default '',
-`locale_6` varchar(255) NOT NULL default '',
-`locale_7` varchar(255) NOT NULL default '',
-`locale_8` varchar(255) NOT NULL default '',
-`comment` varchar(255) NOT NULL default '' COMMENT 'Text Comment',
-
-PRIMARY KEY  (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='EventAI Localized Text';
-
-DROP TABLE IF EXISTS `eventai_summons`;
-CREATE TABLE `eventai_summons` (
-`id` int(11) unsigned NOT NULL COMMENT 'Location Identifier' AUTO_INCREMENT,
-`position_x` float NOT NULL default '0',
-`position_y` float NOT NULL default '0',
-`position_z` float NOT NULL default '0',
-`orientation` float NOT NULL default '0',
-`spawntimesecs` int(11) unsigned NOT NULL default '120',
-`comment` varchar(255) NOT NULL default '' COMMENT 'Summon Comment',
-PRIMARY KEY (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='EventAI Summoning Locations';
+  `entry` mediumint(8) NOT NULL,
+  `content_default` text NOT NULL,
+  `content_loc1` text,
+  `content_loc2` text,
+  `content_loc3` text,
+  `content_loc4` text,
+  `content_loc5` text,
+  `content_loc6` text,
+  `content_loc7` text,
+  `content_loc8` text,
+  `sound` mediumint(8) unsigned NOT NULL default '0',
+  `type` tinyint unsigned NOT NULL default '0',
+  `language` tinyint unsigned NOT NULL default '0',
+  `comment` text,
+  PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Script Texts';
 
 DROP TABLE IF EXISTS `script_texts`;
@@ -91,25 +96,6 @@
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Script Texts';
 
-DROP TABLE IF EXISTS `custom_texts`;
-CREATE TABLE `custom_texts` (
-  `entry` mediumint(8) NOT NULL,
-  `content_default` text NOT NULL,
-  `content_loc1` text,
-  `content_loc2` text,
-  `content_loc3` text,
-  `content_loc4` text,
-  `content_loc5` text,
-  `content_loc6` text,
-  `content_loc7` text,
-  `content_loc8` text,
-  `sound` mediumint(8) unsigned NOT NULL default '0',
-  `type` tinyint unsigned NOT NULL default '0',
-  `language` tinyint unsigned NOT NULL default '0',
-  `comment` text,
-  PRIMARY KEY  (`entry`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Custom Texts';
-
 DROP TABLE IF EXISTS `script_db_version`;
 CREATE TABLE `script_db_version` (
-`version` varchar(255) NOT NULL default '' COMMENT 'Script Database version string'
+  `version` varchar(255) NOT NULL default '' COMMENT 'Script Database version string'
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Index: trunk/src/bindings/scripts/ScriptMgr.h
===================================================================
--- trunk/src/bindings/scripts/ScriptMgr.h (revision 44)
+++ trunk/src/bindings/scripts/ScriptMgr.h (revision 109)
@@ -66,10 +66,4 @@
 extern Script *m_scripts[MAX_SCRIPTS];
 
-// Localized Text function
-const char* GetEventAILocalizedText(uint32 entry);
-
-//EventAI text function
-const char* GetEventAIText(uint32 entry);                   // TODO: Locales
-
 //Generic scripting text function
 void DoScriptText(int32 textEntry, WorldObject* pSource, Unit* target = NULL);
Index: trunk/src/bindings/scripts/include/sc_creature.cpp
===================================================================
--- trunk/src/bindings/scripts/include/sc_creature.cpp (revision 106)
+++ trunk/src/bindings/scripts/include/sc_creature.cpp (revision 109)
@@ -12,6 +12,6 @@
 // Spell summary for ScriptedAI::SelectSpell
 struct TSpellSummary {
-    uint8 Targets;    // set of enum SelectTarget
-    uint8 Effects;    // set of enum SelectEffect
+    uint8 Targets;                                          // set of enum SelectTarget
+    uint8 Effects;                                          // set of enum SelectEffect
 } *SpellSummary;
 
@@ -26,5 +26,5 @@
 void ScriptedAI::MoveInLineOfSight(Unit *who)
 {
-    if( !m_creature->getVictim() && who->isTargetableForAttack() && ( m_creature->IsHostileTo( who )) && who->isInAccessablePlaceFor(m_creature) )
+    if (!m_creature->getVictim() && who->isTargetableForAttack() && ( m_creature->IsHostileTo( who )) && who->isInAccessablePlaceFor(m_creature))
     {
         if (!m_creature->canFly() && m_creature->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
@@ -32,27 +32,22 @@
 
         float attackRadius = m_creature->GetAttackDistance(who);
-        if( m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who) )
-        {
-            DoStartAttackAndMovement(who);
+        if (m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who))
+        {
             who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
-
-            if (!InCombat)
-            {
-                InCombat = true;
-                Aggro(who);
-            }
-        }
-    }
-}
-
-void ScriptedAI::AttackStart(Unit* who)
+            AttackStart(who);
+        }
+    }
+}
+
+void ScriptedAI::AttackStart(Unit* who, bool melee)
 {
     if (!who)
         return;
 
-    if (who->isTargetableForAttack())
-    {
-        //Begin attack
-        DoStartAttackAndMovement(who);
+    if (m_creature->Attack(who, melee))
+    {
+        m_creature->AddThreat(who, 0.0f);
+        m_creature->SetInCombatWith(who);
+        who->SetInCombatWith(m_creature);
 
         if (!InCombat)
@@ -61,4 +56,30 @@
             Aggro(who);
         }
+
+        if(melee)
+            DoStartMovement(who);
+        else
+            DoStartNoMovement(who);
+    }
+}
+
+void ScriptedAI::AttackStart(Unit* who)
+{
+    if (!who)
+        return;
+
+    if (m_creature->Attack(who, true))
+    {
+        m_creature->AddThreat(who, 0.0f);
+        m_creature->SetInCombatWith(who);
+        who->SetInCombatWith(m_creature);
+
+        if (!InCombat)
+        {
+            InCombat = true;
+            Aggro(who);
+        }
+
+        DoStartMovement(who);
     }
 }
@@ -67,10 +88,10 @@
 {
     //Check if we have a current target
-    if( m_creature->isAlive() && m_creature->SelectHostilTarget() && m_creature->getVictim())
-    {
-        if( m_creature->isAttackReady() )
+    if (m_creature->isAlive() && m_creature->SelectHostilTarget() && m_creature->getVictim())
+    {
+        if (m_creature->isAttackReady() )
         {
             //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
+            if (m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
             {
                 m_creature->AttackerStateUpdate(m_creature->getVictim());
@@ -89,5 +110,5 @@
     m_creature->LoadCreaturesAddon();
 
-    if( m_creature->isAlive() )
+    if (m_creature->isAlive())
         m_creature->GetMotionMaster()->MoveTargetedHome();
 
@@ -104,25 +125,19 @@
 }
 
-void ScriptedAI::DoStartAttackAndMovement(Unit* victim, float distance, float angle)
+void ScriptedAI::DoStartMovement(Unit* victim, float distance, float angle)
 {
     if (!victim)
         return;
 
-    if ( m_creature->Attack(victim, true) )
-    {
-        m_creature->GetMotionMaster()->MoveChase(victim, distance, angle);
-        m_creature->AddThreat(victim, 0.0f);
-    }
-}
-
-void ScriptedAI::DoStartAttackNoMovement(Unit* victim)
+    m_creature->GetMotionMaster()->MoveChase(victim, distance, angle);
+}
+
+void ScriptedAI::DoStartNoMovement(Unit* victim)
 {
     if (!victim)
         return;
 
-    if ( m_creature->Attack(victim, true) )
-    {
-        m_creature->AddThreat(victim, 0.0f);
-    }
+    m_creature->GetMotionMaster()->MoveIdle();
+    m_creature->StopMoving();
 }
 
@@ -131,8 +146,8 @@
 {
     //Make sure our attack is ready and we aren't currently casting before checking distance
-    if( m_creature->isAttackReady() && !m_creature->IsNonMeleeSpellCasted(false))
+    if (m_creature->isAttackReady() && !m_creature->IsNonMeleeSpellCasted(false))
     {
         //If we are within range melee the target
-        if( m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE))
+        if (m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
         {
             m_creature->AttackerStateUpdate(m_creature->getVictim());
@@ -144,5 +159,5 @@
 void ScriptedAI::DoStopAttack()
 {
-    if( m_creature->getVictim() != NULL )
+    if (m_creature->getVictim() != NULL)
     {
         m_creature->AttackStop();
@@ -170,5 +185,5 @@
 void ScriptedAI::DoSay(const char* text, uint32 language, Unit* target)
 {
-    if (target)m_creature->Say(text, language, target->GetGUID());
+    if (target) m_creature->Say(text, language, target->GetGUID());
     else m_creature->Say(text, language, 0);
 }
@@ -176,5 +191,5 @@
 void ScriptedAI::DoYell(const char* text, uint32 language, Unit* target)
 {
-    if (target)m_creature->Yell(text, language, target->GetGUID());
+    if (target) m_creature->Yell(text, language, target->GetGUID());
     else m_creature->Yell(text, language, 0);
 }
@@ -182,5 +197,5 @@
 void ScriptedAI::DoTextEmote(const char* text, Unit* target, bool IsBossEmote)
 {
-    if (target)m_creature->TextEmote(text, target->GetGUID(), IsBossEmote);
+    if (target) m_creature->TextEmote(text, target->GetGUID(), IsBossEmote);
     else m_creature->TextEmote(text, 0, IsBossEmote);
 }
@@ -205,5 +220,8 @@
     }
 
-    unit->SendPlaySound(sound, false);
+    WorldPacket data(4);
+    data.SetOpcode(SMSG_PLAY_SOUND);
+    data << uint32(sound);
+    unit->SendMessageToSet(&data,false);
 }
 
@@ -462,4 +480,5 @@
     {
         error_log("SD2: DoZoneInCombat called for creature that either cannot have threat list or has empty threat list (pUnit entry = %d)", pUnit->GetTypeId() == TYPEID_UNIT ? ((Creature*)pUnit)->GetEntry() : 0);
+
         return;
     }*/
@@ -580,12 +599,6 @@
         if( m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who) )
         {
-            DoStartAttackNoMovement(who);
             who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
-
-            if (!InCombat)
-            {
-                InCombat = true;
-                Aggro(who);
-            }
+            AttackStart(who);
         }
     }
@@ -597,8 +610,9 @@
         return;
 
-    if (who->isTargetableForAttack())
-    {
-        //Begin attack
-        DoStartAttackNoMovement(who);
+    if (m_creature->Attack(who, true))
+    {
+        m_creature->AddThreat(who, 0.0f);
+        m_creature->SetInCombatWith(who);
+        who->SetInCombatWith(m_creature);
 
         if (!InCombat)
@@ -607,4 +621,6 @@
             Aggro(who);
         }
-    }
-}
+
+        DoStartNoMovement(who);
+    }
+}
Index: trunk/src/bindings/scripts/include/sc_creature.h
===================================================================
--- trunk/src/bindings/scripts/include/sc_creature.h (revision 55)
+++ trunk/src/bindings/scripts/include/sc_creature.h (revision 109)
@@ -26,4 +26,5 @@
     //Called at each attack of m_creature by any victim
     void AttackStart(Unit *);
+    void AttackStart(Unit *, bool melee);
 
     //Called at stoping attack by any attacker
@@ -90,9 +91,9 @@
     //*************
 
-    //Start attack of victim and go to him
-    void DoStartAttackAndMovement(Unit* victim, float distance = 0, float angle = 0);
+    //Start movement toward victim
+    void DoStartMovement(Unit* victim, float distance = 0, float angle = 0);
 
-    //Start attack on victim but do not move
-    void DoStartAttackNoMovement(Unit* victim);
+    //Start no movement on victim
+    void DoStartNoMovement(Unit* victim);
 
     //Do melee swing of current victim if in rnage and ready and not casting
Index: trunk/src/bindings/scripts/scripts/guard/guards.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/guard/guards.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/guard/guards.cpp (revision 109)
@@ -530,5 +530,5 @@
                     }
                 }
-                DoStartAttackAndMovement(who);
+                DoStartMovement(who);
             }
         }
Index: trunk/src/bindings/scripts/scripts/creature/mob_event_ai.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/creature/mob_event_ai.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/creature/mob_event_ai.cpp (revision 109)
@@ -524,12 +524,57 @@
         switch (type)
         {
-        case ACTION_T_SAY:
-            DoSay(GetEventAIText(param1), LANG_UNIVERSAL, pActionInvoker ? pActionInvoker : m_creature->getVictim());
-            break;
-        case ACTION_T_YELL:
-            DoYell(GetEventAIText(param1), LANG_UNIVERSAL, pActionInvoker ? pActionInvoker : m_creature->getVictim());
-            break;
-        case ACTION_T_TEXTEMOTE:
-            DoTextEmote(GetEventAIText(param1), pActionInvoker ? pActionInvoker : m_creature->getVictim());
+        case ACTION_T_TEXT:
+            {
+                if (!param1)
+                    return;
+
+                uint32 temp = 0;
+
+                if (param2 && param3)
+                {
+                    switch( rand()%3 )
+                    {
+                        case 0: temp = param1; break;
+                        case 2: temp = param2; break;
+                        case 3: temp = param3; break;
+                    }
+                }else if ( param2 && urand(0,1) )
+                {
+                    temp = param2;
+                }else
+                {
+                    temp = param1;
+                }
+
+                if (temp)
+                {
+                    Unit* target = NULL;
+                    Unit* owner = NULL;
+
+                    if (pActionInvoker)
+                    {
+                        if (pActionInvoker->GetTypeId() == TYPEID_PLAYER)
+                            target = pActionInvoker;
+                        else if (owner = pActionInvoker->GetOwner())
+                        {
+                            if (owner->GetTypeId() == TYPEID_PLAYER)
+                                target = owner;
+                        }
+                    }
+                    else if (target = m_creature->getVictim())
+                    {
+                        if (target->GetTypeId() != TYPEID_PLAYER)
+                        {
+                            if (owner = target->GetOwner())
+                            {
+                                if (owner->GetTypeId() == TYPEID_PLAYER)
+                                    target = owner;
+                            }
+                        }
+                    }
+
+                    DoScriptText(temp, m_creature, target);
+                }
+            }
             break;
         case ACTION_T_SOUND:
@@ -538,28 +583,4 @@
         case ACTION_T_EMOTE:
             m_creature->HandleEmoteCommand(param1);
-            break;
-        case ACTION_T_RANDOM_SAY:
-            {
-                uint32 temp = GetRandActionParam(rnd, param1, param2, param3);
-
-                if (temp != 0xffffffff)
-                    DoSay(GetEventAIText(temp), LANG_UNIVERSAL, pActionInvoker ? pActionInvoker : m_creature->getVictim());
-            }
-            break;
-        case ACTION_T_RANDOM_YELL:
-            {
-                uint32 temp = GetRandActionParam(rnd, param1, param2, param3);
-
-                if (temp != 0xffffffff)
-                    DoYell(GetEventAIText(temp), LANG_UNIVERSAL, pActionInvoker ? pActionInvoker : m_creature->getVictim());
-            }
-            break;
-        case ACTION_T_RANDOM_TEXTEMOTE:
-            {
-                uint32 temp = GetRandActionParam(rnd, param1, param2, param3);
-
-                if (temp != 0xffffffff)
-                    DoTextEmote(GetEventAIText(temp), pActionInvoker ? pActionInvoker : m_creature->getVictim());
-            }
             break;
         case ACTION_T_RANDOM_SOUND:
Index: trunk/src/bindings/scripts/scripts/creature/mob_event_ai.h
===================================================================
--- trunk/src/bindings/scripts/scripts/creature/mob_event_ai.h (revision 90)
+++ trunk/src/bindings/scripts/scripts/creature/mob_event_ai.h (revision 109)
@@ -31,5 +31,5 @@
     EVENT_T_QUEST_ACCEPT            = 19,   //QuestID
     EVENT_T_QUEST_COMPLETE          = 20,   //
-    
+
     EVENT_T_END,
 };
@@ -38,12 +38,12 @@
 {
     ACTION_T_NONE                   = 0,    //No action
-    ACTION_T_SAY                    = 1,    //TextId
-    ACTION_T_YELL                   = 2,    //TextId
-    ACTION_T_TEXTEMOTE              = 3,    //TextId
+    ACTION_T_TEXT                   = 1,    //-TextId1, optionally -TextId2, optionally -TextId3(if -TextId2 exist). If more than just -TextId1 is defined, randomize. Negative values.
+    ACTION_T_YELL                   = 2,    //UNUSED
+    ACTION_T_TEXTEMOTE              = 3,    //UNUSED
     ACTION_T_SOUND                  = 4,    //SoundId
     ACTION_T_EMOTE                  = 5,    //EmoteId
-    ACTION_T_RANDOM_SAY             = 6,    //TextId1, TextId2, TextId3 (-1 in any field means no output if randomed that field)
-    ACTION_T_RANDOM_YELL            = 7,    //TextId1, TextId2, TextId3 (-1 in any field means no output if randomed that field)
-    ACTION_T_RANDOM_TEXTEMOTE       = 8,    //TextId1, TextId2, TextId3 (-1 in any field means no output if randomed that field)
+    ACTION_T_RANDOM_SAY             = 6,    //UNUSED
+    ACTION_T_RANDOM_YELL            = 7,    //UNUSED
+    ACTION_T_RANDOM_TEXTEMOTE       = 8,    //UNUSED
     ACTION_T_RANDOM_SOUND           = 9,    //SoundId1, SoundId2, SoundId3 (-1 in any field means no output if randomed that field)
     ACTION_T_RANDOM_EMOTE           = 10,   //EmoteId1, EmoteId2, EmoteId3 (-1 in any field means no output if randomed that field)
@@ -209,5 +209,5 @@
 
 //Error prevention list
-extern HM_NAMESPACE::hash_map<uint32, EventAI_CreatureError> EventAI_CreatureErrorPreventionList; 
+extern HM_NAMESPACE::hash_map<uint32, EventAI_CreatureError> EventAI_CreatureErrorPreventionList;
 
 //Defines
Index: trunk/src/bindings/scripts/scripts/zone/zulgurub/boss_thekal.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/zulgurub/boss_thekal.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/zulgurub/boss_thekal.cpp (revision 109)
@@ -206,6 +206,6 @@
                     DoCast(target,SPELL_CHARGE);
                     m_creature->SendMonsterMove(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, true,1);
-                    DoStartAttackAndMovement(target);
                     DoResetThreat();
+                    AttackStart(target);
 
                     Charge_Timer = 15000 + rand()%7000;
Index: trunk/src/bindings/scripts/scripts/zone/zulgurub/boss_jeklik.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/zulgurub/boss_jeklik.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/zulgurub/boss_jeklik.cpp (revision 109)
@@ -110,5 +110,5 @@
                         m_creature->Relocate(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0);
                         m_creature->SendMonsterMove(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, true,1);
-                        DoStartAttackAndMovement(target);
+                        AttackStart(target);
                     }
 
Index: trunk/src/bindings/scripts/scripts/zone/zulgurub/boss_grilek.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/zulgurub/boss_grilek.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/zulgurub/boss_grilek.cpp (revision 109)
@@ -63,5 +63,5 @@
                 m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(),-50);
             if (target)
-                DoStartAttackAndMovement(target);
+                AttackStart(target);
 
             Avartar_Timer = 25000 + rand()%10000;
Index: trunk/src/bindings/scripts/scripts/zone/zulgurub/boss_renataki.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/zulgurub/boss_renataki.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/zulgurub/boss_renataki.cpp (revision 109)
@@ -122,5 +122,5 @@
 
             if (target)
-                DoStartAttackAndMovement(target);
+                AttackStart(target);
 
             Aggro_Timer = 7000 + rand()%13000;
Index: trunk/src/bindings/scripts/scripts/zone/zulgurub/boss_arlokk.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/zulgurub/boss_arlokk.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/zulgurub/boss_arlokk.cpp (revision 109)
@@ -168,5 +168,5 @@
                     m_creature->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35)));
                     m_creature->UpdateDamagePhysical(BASE_ATTACK);
-                    DoStartAttackAndMovement(target);
+                    AttackStart(target);
                     //The Panther Model
                     m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,15215);
Index: trunk/src/bindings/scripts/scripts/zone/zulgurub/boss_mandokir.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/zulgurub/boss_mandokir.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/zulgurub/boss_mandokir.cpp (revision 109)
@@ -143,5 +143,5 @@
                             DoCast(pUnit,SPELL_CHARGE);
                             m_creature->SendMonsterMove(pUnit->GetPositionX(), pUnit->GetPositionY(), pUnit->GetPositionZ(), 0, true,1);
-                            DoStartAttackAndMovement(pUnit);
+                            AttackStart(pUnit);
                         }
                     }
Index: trunk/src/bindings/scripts/scripts/zone/zulgurub/boss_marli.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/zulgurub/boss_marli.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/zulgurub/boss_marli.cpp (revision 109)
@@ -166,8 +166,10 @@
                     }
                     if (target)
+                    {
                         DoCast(target, SPELL_CHARGE);
-                    //                    m_creature->Relocate(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0);
-                    //                    m_creature->SendMonsterMove(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, true,1);
-                    DoStartAttackAndMovement(target);
+                        //m_creature->Relocate(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0);
+                        //m_creature->SendMonsterMove(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, true,1);
+                        AttackStart(target);
+                    }
 
                     Charge_Timer = 8000;
Index: trunk/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_watchkeeper_gargolmar.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_watchkeeper_gargolmar.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_watchkeeper_gargolmar.cpp (revision 109)
@@ -104,12 +104,6 @@
             if(m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who))
             {
-                DoStartAttackAndMovement(who);
                 who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
-
-                if (!InCombat)
-                {
-                    InCombat = true;
-                    Aggro(who);
-                }
+                AttackStart(who);
             }
             else if (!HasTaunted && m_creature->IsWithinDistInMap(who, 60.0f))
Index: trunk/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp (revision 109)
@@ -55,7 +55,7 @@
 #define SOUND_WIPE                  10283
 
-struct TRINITY_DLL_DECL boss_omor_the_unscarredAI : public ScriptedAI
+struct TRINITY_DLL_DECL boss_omor_the_unscarredAI : public Scripted_NoMovementAI
 {
-    boss_omor_the_unscarredAI(Creature *c) : ScriptedAI(c) {Reset();}
+    boss_omor_the_unscarredAI(Creature *c) : Scripted_NoMovementAI(c) {Reset();}
 
     uint32 OrbitalStrike_Timer;
@@ -104,43 +104,4 @@
                 DoPlaySoundToSet(m_creature,SOUND_AGGRO_3);
                 break;
-        }
-    }
-
-    void AttackStart(Unit* who)
-    {
-        if (!who)
-            return;
-
-        if (who->isTargetableForAttack())
-        {
-            DoStartAttackNoMovement(who);
-
-            if (!InCombat)
-            {
-                InCombat = true;
-                Aggro(who);
-            }
-        }
-    }
-
-    void MoveInLineOfSight(Unit* who)
-    {
-        if( !m_creature->getVictim() && who->isTargetableForAttack() && ( m_creature->IsHostileTo( who )) && who->isInAccessablePlaceFor(m_creature) )
-        {
-            if (!m_creature->canFly() && m_creature->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
-                return;
-
-            float attackRadius = m_creature->GetAttackDistance(who);
-            if(m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who))
-            {
-                DoStartAttackNoMovement(who);
-                who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
-
-                if (!InCombat)
-                {
-                    InCombat = true;
-                    Aggro(who);
-                }
-            }
         }
     }
Index: trunk/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/boss_nethekurse.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/boss_nethekurse.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/hellfire_citadel/shattered_halls/boss_nethekurse.cpp (revision 109)
@@ -194,14 +194,18 @@
             return;
 
-        if( who->isTargetableForAttack() )
-        {
-            if( Phase ) DoStartAttackNoMovement(who);
-            else DoStartAttackAndMovement(who);
-
-            if( !InCombat )
+        if (m_creature->Attack(who, true))
+        {
+            m_creature->AddThreat(who, 0.0f);
+            m_creature->SetInCombatWith(who);
+            who->SetInCombatWith(m_creature);
+
+            if (!InCombat)
             {
                 InCombat = true;
                 Aggro(who);
             }
+
+            if (Phase) DoStartNoMovement(who);
+            else DoStartMovement(who);
         }
     }
@@ -231,14 +235,6 @@
             if( m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who) )
             {
-                if( Phase ) DoStartAttackNoMovement(who);
-                else DoStartAttackAndMovement(who);
-
                 who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
-
-                if( !InCombat )
-                {
-                    InCombat = true;
-                    Aggro(who);
-                }
+                AttackStart(who);
             }
         }
Index: trunk/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp (revision 108)
+++ trunk/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp (revision 109)
@@ -442,17 +442,8 @@
             return;
 
-        if (who->isTargetableForAttack())
-        {
-            if(Phase == PHASE_FLIGHT || Phase == PHASE_DEMON)
-                m_creature->Attack(who, false);
-            else
-                DoStartAttackAndMovement(who);
-
-            if (!InCombat)
-            {
-                Aggro(who);
-                InCombat = true;
-            }
-        }
+        if(Phase == PHASE_FLIGHT || Phase == PHASE_DEMON)
+            ScriptedAI::AttackStart(who, false);
+        else
+            ScriptedAI::AttackStart(who, true);
     }
 
@@ -1511,24 +1502,15 @@
             return;
 
-        if (who->isTargetableForAttack())
-        {
-            if(Phase == PHASE_TALK_SEQUENCE)
-                m_creature->Attack(who, false);
-            else if(Phase == PHASE_DEMON || Phase == PHASE_TRANSFORM_SEQUENCE )
-            {
-                GETUNIT(Illidan, IllidanGUID);
-                if(Illidan && m_creature->IsWithinDistInMap(Illidan, 25))
-                    BlinkToPlayer();//Do not let dread aura hurt her.
-                m_creature->Attack(who, false);
-            }
-            else
-                DoStartAttackAndMovement(who);
-
-            if (!InCombat)
-            {
-                Aggro(who);
-                InCombat = true;
-            }
-        }
+        if(Phase == PHASE_TALK_SEQUENCE)
+            ScriptedAI::AttackStart(who, false);
+        else if(Phase == PHASE_DEMON || Phase == PHASE_TRANSFORM_SEQUENCE )
+        {
+            GETUNIT(Illidan, IllidanGUID);
+            if(Illidan && m_creature->IsWithinDistInMap(Illidan, 25))
+                BlinkToPlayer();//Do not let dread aura hurt her.
+            ScriptedAI::AttackStart(who, false);
+        }
+        else
+            ScriptedAI::AttackStart(who, true);
     }
 
Index: trunk/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/black_temple/boss_shade_of_akama.cpp (revision 109)
@@ -261,5 +261,5 @@
 
         if(who->isTargetableForAttack() && who != m_creature)
-            DoStartAttackAndMovement(who);
+            DoStartMovement(who);
     }
 
Index: trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp (revision 109)
@@ -211,12 +211,6 @@
             if(m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who) )
             {
-                DoStartAttackAndMovement(who);
                 who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
-
-                if (!InCombat)
-                {
-                    InCombat = true;
-                    Aggro(who);
-                }
+                AttackStart(who);
             }
         }
@@ -228,8 +222,9 @@
             return;
 
-        if (who->isTargetableForAttack())
-        {
-            //Begin attack
-            DoStartAttackAndMovement(who);
+        if (m_creature->Attack(who, true))
+        {
+            m_creature->AddThreat(who, 0.0f);
+            m_creature->SetInCombatWith(who);
+            who->SetInCombatWith(m_creature);
 
             if (!InCombat)
@@ -238,4 +233,6 @@
                 Aggro(who);
             }
+
+            DoStartMovement(who);
         }
     }
@@ -436,5 +433,5 @@
             if(target)
             {
-                DoStartAttackAndMovement(target);
+                AttackStart(target);
             }
         }else
@@ -507,8 +504,6 @@
             if (Phase >= 4 && m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who))
             {
-                if(who->HasStealthAura())
-                    who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
-
-                DoStartAttackAndMovement(who);
+                who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
+                AttackStart(who);
             }
             else if(who->isAlive())
@@ -775,5 +770,5 @@
                     if(target)
                     {
-                        DoStartAttackAndMovement(target);
+                        AttackStart(target);
                     }
                     Phase_Timer = 30000;
@@ -932,5 +927,5 @@
                         m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
                         Phase = 6;
-                        DoStartAttackAndMovement(m_creature->getVictim());
+                        AttackStart(m_creature->getVictim());
                         m_creature->GetMotionMaster()->Clear();
                         m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
@@ -1038,5 +1033,5 @@
                                 GravityLapse_Timer = 60000;
                                 GravityLapse_Phase = 0;
-                                DoStartAttackAndMovement(m_creature->getVictim());
+                                AttackStart(m_creature->getVictim());
                                 m_creature->GetMotionMaster()->Clear();
                                 m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
@@ -1242,8 +1237,9 @@
             return;
 
-        if (who->isTargetableForAttack())
-        {
-            //Begin attack
-            DoStartAttackAndMovement(who, CAPERNIAN_DISTANCE, M_PI/2);
+        if (m_creature->Attack(who, true))
+        {
+            m_creature->AddThreat(who, 0.0f);
+            m_creature->SetInCombatWith(who);
+            who->SetInCombatWith(m_creature);
 
             if (!InCombat)
@@ -1252,4 +1248,6 @@
                 Aggro(who);
             }
+
+            DoStartMovement(who, CAPERNIAN_DISTANCE, M_PI/2);
         }
     }
Index: trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_alar.cpp (revision 109)
@@ -157,7 +157,7 @@
             //Begin attack
             if(Phase1)
-                DoStartAttackNoMovement(who);
+                DoStartNoMovement(who);
             else
-                DoStartAttackAndMovement(who);
+                DoStartMovement(who);
 
             if(!InCombat)
Index: trunk/src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/boss_harbinger_skyriss.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/boss_harbinger_skyriss.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/boss_harbinger_skyriss.cpp (revision 109)
@@ -126,12 +126,6 @@
             if( m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who) )
             {
-                DoStartAttackAndMovement(who);
                 who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
-
-                if (!InCombat)
-                {
-                    InCombat = true;
-                    Aggro(who);
-                }
+                AttackStart(who);
             }
         }
@@ -143,13 +137,17 @@
             return;
 
-        if( who->isTargetableForAttack() )
-        {
-            DoStartAttackAndMovement(who);
-
-            if( !InCombat )
+        if (m_creature->Attack(who, true))
+        {
+            m_creature->AddThreat(who, 0.0f);
+            m_creature->SetInCombatWith(who);
+            who->SetInCombatWith(m_creature);
+
+            if (!InCombat)
             {
                 InCombat = true;
                 Aggro(who);
             }
+
+            DoStartMovement(who);
         }
     }
Index: trunk/src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/arcatraz.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/arcatraz.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/tempest_keep/arcatraz/arcatraz.cpp (revision 109)
@@ -124,31 +124,11 @@
     }
 
-    void MoveInLineOfSight(Unit *who)
-    {
-        if( !m_creature->getVictim() && who->isTargetableForAttack() && ( m_creature->IsHostileTo( who )) && who->isInAccessablePlaceFor(m_creature) )
-        {
-            if (!m_creature->canFly() && m_creature->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
-                return;
-
-            float attackRadius = m_creature->GetAttackDistance(who);
-            if( m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who) )
-            {
-                DoStartAttackNoMovement(who);
-                who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
-
-                if (!InCombat)
-                {
-                    InCombat = true;
-                    Aggro(who);
-                }
-            }
-        }
-    }
-
     void AttackStart(Unit* who)
     {
-        if (who->isTargetableForAttack())
-        {
-            DoStartAttackNoMovement(who);
+        if (m_creature->Attack(who, true))
+        {
+            m_creature->AddThreat(who, 0.0f);
+            m_creature->SetInCombatWith(who);
+            who->SetInCombatWith(m_creature);
 
             if (!InCombat)
@@ -157,4 +137,7 @@
                 Aggro(who);
             }
+
+            //TODO: Make it so he moves when target out of range
+            DoStartNoMovement(who);
         }
     }
Index: trunk/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_bug_trio.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_bug_trio.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_bug_trio.cpp (revision 109)
@@ -178,5 +178,5 @@
                 DoCast(target, SPELL_CHARGE);
                 m_creature->SendMonsterMove(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, true,1);
-                DoStartAttackAndMovement(target);
+                AttackStart(target);
             }
 
Index: trunk/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_sartura.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_sartura.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/temple_of_ahnqiraj/boss_sartura.cpp (revision 109)
@@ -81,5 +81,5 @@
                 target = SelectUnit(SELECT_TARGET_RANDOM,1);
                 if (target)
-                    DoStartAttackAndMovement(target);
+                    AttackStart(target);
 
                 WhirlWindRandom_Timer = 3000 + rand()%4000;
@@ -220,5 +220,5 @@
                 target = SelectUnit(SELECT_TARGET_RANDOM,1);
                 if (target)
-                    DoStartAttackAndMovement(target);
+                    AttackStart(target);
 
                 AggroReset = true;
Index: trunk/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_eredar_twins.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_eredar_twins.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_eredar_twins.cpp (revision 109)
@@ -418,5 +418,5 @@
             if (!InCombat)
             {
-                DoStartAttackNoMovement(who);
+                DoStartNoMovement(who);
                 Aggro(who);
                 InCombat = true;
@@ -441,5 +441,5 @@
                 if (!InCombat)
                 {
-                    DoStartAttackNoMovement(who);
+                    DoStartNoMovement(who);
                     Aggro(who);
                     InCombat = true;
Index: trunk/src/bindings/scripts/scripts/zone/blackwing_lair/boss_vaelastrasz.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/blackwing_lair/boss_vaelastrasz.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/blackwing_lair/boss_vaelastrasz.cpp (revision 109)
@@ -120,39 +120,37 @@
         //Speach
         if (DoingSpeach)
+        {
             if (SpeachTimer < diff)
-        {
-            switch (SpeachNum)
             {
-                case 0:
-                    //16 seconds till next line
-                    DoYell(SAY_LINE2,LANG_UNIVERSAL,NULL);
-                    DoPlaySoundToSet(m_creature,SOUND_LINE2);
-                    SpeachTimer = 16000;
-                    SpeachNum++;
-                    break;
-
-                case 1:
-                    //This one is actually 16 seconds but we only go to 10 seconds because he starts attacking after he says "I must fight this!"
-                    DoYell(SAY_LINE3,LANG_UNIVERSAL,NULL);
-                    DoPlaySoundToSet(m_creature,SOUND_LINE3);
-                    SpeachTimer = 10000;
-                    SpeachNum++;
-                    break;
-
-                case 2:
-                default:
-                    m_creature->setFaction(103);
-                    m_creature->SetHealth(int(m_creature->GetMaxHealth()*.3));
-                    if (PlayerGUID && Unit::GetUnit((*m_creature),PlayerGUID))
-                    {
-                        DoStartAttackAndMovement(Unit::GetUnit((*m_creature),PlayerGUID));
-                        DoCast(m_creature,SPELL_ESSENCEOFTHERED);
-                    }
-
-                    SpeachTimer = 0;
-                    DoingSpeach = false;
-                    break;
-            }
-        }else SpeachTimer -= diff;
+                switch (SpeachNum)
+                {
+                    case 0:
+                        //16 seconds till next line
+                        DoYell(SAY_LINE2,LANG_UNIVERSAL,NULL);
+                        DoPlaySoundToSet(m_creature,SOUND_LINE2);
+                        SpeachTimer = 16000;
+                        SpeachNum++;
+                        break;
+                    case 1:
+                        //This one is actually 16 seconds but we only go to 10 seconds because he starts attacking after he says "I must fight this!"
+                        DoYell(SAY_LINE3,LANG_UNIVERSAL,NULL);
+                        DoPlaySoundToSet(m_creature,SOUND_LINE3);
+                        SpeachTimer = 10000;
+                        SpeachNum++;
+                        break;
+                    case 2:
+                        m_creature->setFaction(103);
+                        m_creature->SetHealth(int(m_creature->GetMaxHealth()*.3));
+                        if (PlayerGUID && Unit::GetUnit((*m_creature),PlayerGUID))
+                        {
+                            AttackStart(Unit::GetUnit((*m_creature),PlayerGUID));
+                            DoCast(m_creature,SPELL_ESSENCEOFTHERED);
+                        }
+                        SpeachTimer = 0;
+                        DoingSpeach = false;
+                        break;
+                }
+            }else SpeachTimer -= diff;
+        }
 
         //Return since we have no target
Index: trunk/src/bindings/scripts/scripts/zone/blades_edge_mountains/blades_edge_mountains.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/blades_edge_mountains/blades_edge_mountains.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/blades_edge_mountains/blades_edge_mountains.cpp (revision 109)
@@ -295,9 +295,6 @@
             if (m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who))
             {
-                if(who->HasStealthAura())
-                    who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
-
-                //Begin melee attack if we are within range
-                DoStartAttackAndMovement(who);
+                who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
+                AttackStart(who);
             }
         }
Index: trunk/src/bindings/scripts/scripts/zone/aunchindoun/mana_tombs/boss_nexusprince_shaffar.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/aunchindoun/mana_tombs/boss_nexusprince_shaffar.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/aunchindoun/mana_tombs/boss_nexusprince_shaffar.cpp (revision 109)
@@ -102,12 +102,6 @@
             if( m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who) )
             {
-                DoStartAttackAndMovement(who);
                 who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
-
-                if (!InCombat)
-                {
-                    InCombat = true;
-                    Aggro(who);
-                }
+                AttackStart(who);
             }
         }
Index: trunk/src/bindings/scripts/scripts/zone/aunchindoun/auchenai_crypts/boss_exarch_maladaar.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/aunchindoun/auchenai_crypts/boss_exarch_maladaar.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/aunchindoun/auchenai_crypts/boss_exarch_maladaar.cpp (revision 109)
@@ -198,12 +198,6 @@
             if( m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who) )
             {
-                DoStartAttackAndMovement(who);
                 who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
-
-                if (!InCombat)
-                {
-                    InCombat = true;
-                    Aggro(who);
-                }
+                AttackStart(who);
             }
         }
Index: trunk/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/boss_tailonking_ikiss.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/boss_tailonking_ikiss.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/aunchindoun/sethekk_halls/boss_tailonking_ikiss.cpp (revision 109)
@@ -111,12 +111,6 @@
             if( m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who) )
             {
-                DoStartAttackAndMovement(who);
                 who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
-
-                if (!InCombat)
-                {
-                    InCombat = true;
-                    Aggro(who);
-                }
+                AttackStart(who);
             }
         }
Index: trunk/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp (revision 109)
@@ -215,6 +215,5 @@
                     who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
 
-                DoStartAttackAndMovement(who);
-                Aggro(who);
+                AttackStart(who);
             }
         }
Index: trunk/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_murmur.cpp (revision 109)
@@ -33,7 +33,7 @@
 #define SPELL_SHOCKWAVE             33686
 
-struct TRINITY_DLL_DECL boss_murmurAI : public ScriptedAI
+struct TRINITY_DLL_DECL boss_murmurAI : public Scripted_NoMovementAI
 {
-    boss_murmurAI(Creature *c) : ScriptedAI(c) {Reset();}
+    boss_murmurAI(Creature *c) : Scripted_NoMovementAI(c) {Reset();}
 
     uint32 SonicBoom_Timer;
@@ -62,44 +62,4 @@
 
     void Aggro(Unit *who) { }
-
-    void AttackStart(Unit* who)
-    {
-        if (!who)
-            return;
-
-        if (who->isTargetableForAttack())
-        {
-            //Begin attack
-            DoStartAttackNoMovement(who);
-
-            if (!InCombat)
-            {
-                InCombat = true;
-                Aggro(who);
-            }
-        }
-    }
-
-    void MoveInLineOfSight(Unit* who)
-    {
-        if( !m_creature->getVictim() && who->isTargetableForAttack() && ( m_creature->IsHostileTo( who )) && who->isInAccessablePlaceFor(m_creature) )
-        {
-            if (!m_creature->canFly() && m_creature->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
-                return;
-
-            float attackRadius = m_creature->GetAttackDistance(who);
-            if(m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who))
-            {
-                DoStartAttackNoMovement(who);
-                who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
-
-                if (!InCombat)
-                {
-                    InCombat = true;
-                    Aggro(who);
-                }
-            }
-        }
-    }
 
     void UpdateAI(const uint32 diff)
Index: trunk/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp (revision 109)
@@ -238,5 +238,5 @@
         //Begin melee attack if we are within range
         if(Phase != 2)
-            DoStartAttackAndMovement(who);
+            DoStartMovement(who);
 
         StartEvent();
Index: trunk/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_fathomlord_karathress.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_fathomlord_karathress.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_fathomlord_karathress.cpp (revision 109)
@@ -198,10 +198,6 @@
             if(target)
             {
-                DoStartAttackAndMovement(target);
-
+                AttackStart(target);
                 GetAdvisors();
-
-                DoPlaySoundToSet(m_creature, SOUND_AGGRO);
-                DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL);
             }
         }
@@ -295,5 +291,5 @@
             if(target)
             {
-                DoStartAttackAndMovement(target);
+                AttackStart(target);
             }
         }
@@ -376,5 +372,5 @@
             if(target)
             {
-                DoStartAttackAndMovement(target);
+                AttackStart(target);
             }
         }
@@ -454,5 +450,5 @@
             if(target)
             {
-                DoStartAttackAndMovement(target);
+                AttackStart(target);
             }
         }
Index: trunk/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp (revision 109)
@@ -352,8 +352,6 @@
         {
             //no attack radius check - it attacks the first target that moves in his los
-            if(who->HasStealthAura())
-                who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
-
-            DoStartAttackAndMovement(who);
+            who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
+            AttackStart(who);
         }
     }
Index: trunk/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/boss_temporus.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/boss_temporus.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/caverns_of_time/dark_portal/boss_temporus.cpp (revision 109)
@@ -109,13 +109,6 @@
             if (m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who))
             {
-                if(who->HasStealthAura())
-                    who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
-
-                DoStartAttackAndMovement(who);
-                if (!InCombat)
-                {
-                    DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL);
-                    DoPlaySoundToSet(m_creature, SOUND_AGGRO);
-                }
+                who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
+                AttackStart(who);
             }
         }
Index: trunk/src/bindings/scripts/scripts/zone/burning_steppes/burning_steppes.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/burning_steppes/burning_steppes.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/burning_steppes/burning_steppes.cpp (revision 109)
@@ -57,12 +57,6 @@
             if( m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who) )
             {
-                DoStartAttackAndMovement(who);
                 who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
-
-                if (!InCombat)
-                {
-                    InCombat = true;
-                    Aggro(who);
-                }
+                AttackStart(who);
             }
         }
Index: trunk/src/bindings/scripts/scripts/zone/gruuls_lair/boss_high_king_maulgar.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/gruuls_lair/boss_high_king_maulgar.cpp (revision 106)
+++ trunk/src/bindings/scripts/scripts/zone/gruuls_lair/boss_high_king_maulgar.cpp (revision 109)
@@ -189,5 +189,8 @@
 
 
-    void Aggro(Unit *who) { StartEvent(who); }
+    void Aggro(Unit *who)
+    {
+        StartEvent(who);
+    }
 
     void GetCouncil()
@@ -225,9 +228,6 @@
             if(target)
             {
-                DoStartAttackAndMovement(target);
-
+                AttackStart(target);
                 GetCouncil();
-
-                DoPlaySoundToSet(m_creature, SOUND_AGGRO);
             }
         }
@@ -284,6 +284,6 @@
                 Unit* target = NULL;
                 target = SelectUnit(SELECT_TARGET_RANDOM, 0);
-                if(target)
-                    DoStartAttackAndMovement(target);
+                if (target)
+                    AttackStart(target);
                                        DoCast(target, SPELL_BERSERKER_C);      
 
@@ -359,5 +359,5 @@
             if(target)
             {
-                DoStartAttackAndMovement(target);
+                AttackStart(target);
             }
         }
@@ -466,5 +466,5 @@
                 if(!InCombat)
                 {
-                    DoStartAttackAndMovement(who);
+                    AttackStart(who);
                     if(pInstance)
                     {
@@ -486,5 +486,5 @@
             if(target)
             {
-                DoStartAttackAndMovement(target);
+                AttackStart(target);
             }
         }
@@ -596,5 +596,5 @@
                 if(!InCombat)
                 {
-                    DoStartAttackAndMovement(who);
+                    AttackStart(who);
                     if(pInstance)
                     {
@@ -616,5 +616,5 @@
             if(target)
             {
-                DoStartAttackAndMovement(target);
+                AttackStart(target);
             }
         }
@@ -710,5 +710,5 @@
                 if(!InCombat)
                 {
-                    DoStartAttackAndMovement(who);
+                    AttackStart(who);
                     if(pInstance)
                     {
@@ -730,5 +730,5 @@
             if(target)
             {
-                DoStartAttackAndMovement(target);
+                AttackStart(target);
             }
         }
Index: trunk/src/bindings/scripts/scripts/zone/karazhan/boss_terestian_illhoof.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/karazhan/boss_terestian_illhoof.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/karazhan/boss_terestian_illhoof.cpp (revision 109)
@@ -17,6 +17,6 @@
 /* ScriptData
 SDName: Boss_Terestian_Illhoof
-SD%Complete: 100
-SDComment: Complete!
+SD%Complete: 95
+SDComment: Complete! Needs adjustments to use spell though.
 SDCategory: Karazhan
 EndScriptData */
@@ -32,4 +32,9 @@
 #define SPELL_BERSERK               32965                   // Increases attack speed by 75%. Periodically casts Shadow Bolt Volley.
 
+#define SPELL_SUMMON_IMP            30066                   // Summons Kil'rek
+
+#define SPELL_FIENDISH_PORTAL       30171                   // Opens portal and summons Fiendish Portal, 2 sec cast
+#define SPELL_FIENDISH_PORTAL_1     30179                   // Opens portal and summons Fiendish Portal, instant cast
+
 #define SPELL_FIREBOLT              18086                   // Blasts a target for 150 Fire damage.
 
@@ -62,8 +67,4 @@
 #define CREATURE_FIENDISHIMP    17267
 #define CREATURE_PORTAL         17265
-
-#define SACRIFICE_X     -11240.599
-#define SACRIFICE_Y     -1694.2700
-#define SACRIFICE_Z     179.720007
 
 #define PORTAL_Z        179.434
@@ -310,5 +311,5 @@
             {
                 DoCast(target, SPELL_SACRIFICE, true);
-                Creature* Chains = m_creature->SummonCreature(CREATURE_DEMONCHAINS, SACRIFICE_X, SACRIFICE_Y, SACRIFICE_Z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 21000);
+                Creature* Chains = m_creature->SummonCreature(CREATURE_DEMONCHAINS, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 21000);
                 if(Chains)
                 {
Index: trunk/src/bindings/scripts/scripts/zone/karazhan/bosses_opera.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/karazhan/bosses_opera.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/karazhan/bosses_opera.cpp (revision 109)
@@ -1125,5 +1125,5 @@
             {
                 m_creature->AddThreat(Julianne->getVictim(), 1.0f);
-                DoStartAttackAndMovement(Julianne->getVictim());
+                AttackStart(Julianne->getVictim());
             }
         }
Index: trunk/src/bindings/scripts/scripts/zone/karazhan/boss_moroes.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/karazhan/boss_moroes.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/karazhan/boss_moroes.cpp (revision 109)
@@ -17,5 +17,5 @@
 /* ScriptData
 SDName: Boss_Moroes
-SD%Complete: 100
+SD%Complete: 95
 SDComment:
 SDCategory: Karazhan
@@ -46,19 +46,18 @@
 #define SOUND_DEATH         9213
 
-#define SPELL_VANISH        24699
+#define SPELL_VANISH        29448
 #define SPELL_GARROTE       37066
-#define SPELL_BLIND         34654
-#define SPELL_GOUGE         28456
-#define SPELL_ENRAGE        37023
-
-#define ORIENT              4.5784
+#define SPELL_BLIND         34694
+#define SPELL_GOUGE         29425
+#define SPELL_FRENZY        37023
+
 #define POS_Z               81.73
 
-float Locations[4][2]=
-{
-    {-10976.2793, -1878.1736},
-    {-10979.7587, -1877.8706},
-    {-10985.6650, -1877.2458},
-    {-10989.1367, -1876.8309},
+float Locations[4][3]=
+{
+    {-10991.0, -1884.33, 0.614315},
+    {-10989.4, -1885.88, 0.904913},
+    {-10978.1, -1887.07, 2.035550},
+    {-10975.9, -1885.81, 2.253890},
 };
 
@@ -160,5 +159,5 @@
         DoPlaySoundToSet(m_creature, SOUND_DEATH);
 
-        if(pInstance)
+        if (pInstance)
             pInstance->SetData(DATA_MOROES_EVENT, DONE);
 
@@ -169,12 +168,11 @@
     {
         Unit* pUnit = Unit::GetUnit((*m_creature), guid);
-        if(pUnit)
-        {
-            if(!pUnit->isAlive())
+        if (pUnit)
+        {
+            if (!pUnit->isAlive())
                 return 1;                                   // Exists but is dead
             else
                 return 2;                                   // Exists and is alive
         }
-
         return 0;                                           // Does not exist
     }
@@ -184,5 +182,5 @@
         Creature *pCreature = NULL;
 
-        if(FirstTime)
+        if (FirstTime)
         {
             std::vector<uint32> AddList;
@@ -199,6 +197,6 @@
                 uint32 entry = *itr;
 
-                pCreature = m_creature->SummonCreature(entry, Locations[i][0], Locations[i][1], POS_Z, ORIENT, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
-                if(pCreature)
+                pCreature = m_creature->SummonCreature(entry, Locations[i][0], Locations[i][1], POS_Z, Locations[i][2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
+                if (pCreature)
                 {
                     AddGUID[i] = pCreature->GetGUID();
@@ -217,11 +215,11 @@
                 {
                     case 0:
-                        pCreature = m_creature->SummonCreature(AddId[i], Locations[i][0], Locations[i][1], POS_Z, ORIENT, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
-                        if(pCreature)
+                        pCreature = m_creature->SummonCreature(AddId[i], Locations[i][0], Locations[i][1], POS_Z, Locations[i][2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000);
+                        if (pCreature)
                             AddGUID[i] = pCreature->GetGUID();
                         break;
                     case 1:
                         pCreature = ((Creature*)Unit::GetUnit((*m_creature), AddGUID[i]));
-                        if(pCreature)
+                        if (pCreature)
                         {
                             pCreature->Respawn();
@@ -231,5 +229,5 @@
                     case 2:
                         pCreature = ((Creature*)Unit::GetUnit((*m_creature), AddGUID[i]));
-                        if(!pCreature->IsInEvadeMode())
+                        if (!pCreature->IsInEvadeMode())
                             pCreature->AI()->EnterEvadeMode();
                         break;
@@ -244,8 +242,8 @@
         {
             Unit* Temp = NULL;
-            if(AddGUID[i])
+            if (AddGUID[i])
             {
                 Temp = Unit::GetUnit((*m_creature),AddGUID[i]);
-                if(Temp && Temp->isAlive())
+                if (Temp && Temp->isAlive())
                     Temp->DealDamage(Temp, Temp->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
             }
@@ -258,8 +256,8 @@
         {
             Unit* Temp = NULL;
-            if(AddGUID[i])
+            if (AddGUID[i])
             {
                 Temp = Unit::GetUnit((*m_creature),AddGUID[i]);
-                if(Temp && Temp->isAlive())
+                if (Temp && Temp->isAlive())
                     ((Creature*)Temp)->AI()->AttackStart(m_creature->getVictim());
                 else
@@ -279,18 +277,18 @@
         if(!Enrage && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 30)
         {
-            DoCast(m_creature, SPELL_ENRAGE);
+            DoCast(m_creature, SPELL_FRENZY);
             Enrage = true;
         }
 
-        if(CheckAdds_Timer < diff)
-        {
-            for(uint8 i = 0; i < 4; ++i)
+        if (CheckAdds_Timer < diff)
+        {
+            for (uint8 i = 0; i < 4; ++i)
             {
                 Unit* Temp = NULL;
-                if(AddGUID[i])
+                if (AddGUID[i])
                 {
                     Temp = Unit::GetUnit((*m_creature),AddGUID[i]);
-                    if(Temp && Temp->isAlive())
-                        if(!Temp->SelectHostilTarget() || !Temp->getVictim() )
+                    if (Temp && Temp->isAlive())
+                        if (!Temp->SelectHostilTarget() || !Temp->getVictim() )
                             ((Creature*)Temp)->AI()->AttackStart(m_creature->getVictim());
                 }
@@ -299,78 +297,81 @@
         }else CheckAdds_Timer -= diff;
 
-        //Cast Vanish, then Garrote random victim
-        if(Vanish_Timer < diff)
-        {
-            m_creature->setFaction(35);
-            m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
-            m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
-            DoCast(m_creature, SPELL_VANISH);
-            InVanish = true;
-            Vanish_Timer = 30000;
-            Wait_Timer = 5000;
-        }else Vanish_Timer -= diff;
-
-        if(InVanish)
-        {
-            if(Wait_Timer < diff)
-            {
-                switch(rand()%2)
+        if (!Enrage)
+        {
+            //Cast Vanish, then Garrote random victim
+            if (Vanish_Timer < diff)
+            {
+                m_creature->setFaction(35);
+                m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+                m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+                DoCast(m_creature, SPELL_VANISH);
+                InVanish = true;
+                Vanish_Timer = 30000;
+                Wait_Timer = 5000;
+            }else Vanish_Timer -= diff;
+
+            if (InVanish)
+            {
+                if (Wait_Timer < diff)
                 {
-                    case 0:
-                        DoYell(SAY_SPECIAL_1, LANG_UNIVERSAL, NULL);
-                        DoPlaySoundToSet(m_creature, SOUND_SPECIAL_1);
-                        break;
-                    case 1:
-                        DoYell(SAY_SPECIAL_2, LANG_UNIVERSAL, NULL);
-                        DoPlaySoundToSet(m_creature, SOUND_SPECIAL_2);
-                        break;
+                    switch(rand()%2)
+                    {
+                        case 0:
+                            DoYell(SAY_SPECIAL_1, LANG_UNIVERSAL, NULL);
+                            DoPlaySoundToSet(m_creature, SOUND_SPECIAL_1);
+                            break;
+                        case 1:
+                            DoYell(SAY_SPECIAL_2, LANG_UNIVERSAL, NULL);
+                            DoPlaySoundToSet(m_creature, SOUND_SPECIAL_2);
+                            break;
+                    }
+
+                    Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0);
+                    if (target)
+                        target->CastSpell(target, SPELL_GARROTE,true);
+
+                    m_creature->setFaction(16);
+                    m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+                    m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+                    m_creature->AI()->AttackStart(m_creature->getVictim());
+                    InVanish = false;
+                }else Wait_Timer -= diff;
+            }
+
+            //Blind highest aggro, and attack second highest
+            if (Gouge_Timer < diff)
+            {
+                DoCast(m_creature->getVictim(), SPELL_GOUGE);
+                if (m_creature->getThreatManager().getThreat(m_creature->getVictim()))
+                    m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(),-100);
+                Gouge_Timer = 40000;
+            }else Gouge_Timer -= diff;
+
+            if (Blind_Timer < diff)
+            {
+                Unit* target = NULL;
+                std::list<HostilReference*> t_list = m_creature->getThreatManager().getThreatList();
+
+                if (t_list.empty())
+                    return;
+
+                std::vector<Unit*> target_list;
+                for (std::list<HostilReference*>::iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
+                {
+                    target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid());
+                    if (target && target->GetDistance2d(m_creature) < 5)
+                        target_list.push_back(target);
                 }
-
-                Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0);
-                if(target)
-                    target->CastSpell(target, SPELL_GARROTE,true);
-
-                m_creature->setFaction(16);
-                m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
-                m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
-                m_creature->AI()->AttackStart(m_creature->getVictim());
-                InVanish = false;
-            }else Wait_Timer -= diff;
-        }
-
-        //Blind highest aggro, and attack second highest
-        if(Gouge_Timer < diff)
-        {
-            DoCast(m_creature->getVictim(), SPELL_GOUGE);
-            if(m_creature->getThreatManager().getThreat(m_creature->getVictim()))
-                m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(),-100);
-            Gouge_Timer = 40000;
-        }else Gouge_Timer -= diff;
-
-        if(Blind_Timer < diff)
-        {
-            Unit* target = NULL;
-            std::list<HostilReference*> t_list = m_creature->getThreatManager().getThreatList();
-
-            if(t_list.empty())
-                return;
-
-            std::vector<Unit*> target_list;
-            for(std::list<HostilReference*>::iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
-            {
-                target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid());
-                if(target && target->GetDistance2d(m_creature) < 5)
-                    target_list.push_back(target);
-            }
-            if(target_list.size())
-                target = *(target_list.begin()+rand()%target_list.size());
-
-            if(target)
-                DoCast(target, SPELL_BLIND);
-
-            Blind_Timer = 40000;
-        }else Blind_Timer -= diff;
-
-        if(!InVanish)
+                if (target_list.size())
+                    target = *(target_list.begin()+rand()%target_list.size());
+
+                if (target)
+                    DoCast(target, SPELL_BLIND);
+
+                Blind_Timer = 40000;
+            }else Blind_Timer -= diff;
+        }
+
+        if (!InVanish)
             DoMeleeAttackIfReady();
     }
Index: trunk/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp (revision 109)
@@ -277,5 +277,5 @@
                 m_creature->Attack(who, false);
             else
-                DoStartAttackAndMovement(who);
+                DoStartMovement(who);
 
             if (!InCombat)
Index: trunk/src/bindings/scripts/scripts/zone/stratholme/boss_timmy_the_cruel.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/stratholme/boss_timmy_the_cruel.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/stratholme/boss_timmy_the_cruel.cpp (revision 109)
@@ -55,7 +55,4 @@
             if (m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->GetDistanceZ(who) <= CREATURE_Z_ATTACK_RANGE && m_creature->IsWithinLOSInMap(who))
             {
-                if(who->HasStealthAura())
-                    who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
-
                 if (!HasYelled)
                 {
@@ -64,6 +61,6 @@
                 }
 
-                //Begin melee attack if we are within range
-                DoStartAttackAndMovement(who);
+                who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
+                AttackStart(who);
             }
         }
Index: trunk/src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/naxxramas/boss_anubrekhan.cpp (revision 109)
@@ -108,10 +108,4 @@
             if (m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who))
             {
-                if(who->HasStealthAura())
-                    who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
-
-                //Begin melee attack if we are within range
-                DoStartAttackAndMovement(who);
-
                 if (!InCombat)
                 {
@@ -132,4 +126,7 @@
                     }
                 }
+
+                who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
+                AttackStart(who);
             }
             else if (!HasTaunted && m_creature->IsWithinDistInMap(who, 60.0f))
Index: trunk/src/bindings/scripts/scripts/zone/naxxramas/boss_faerlina.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/naxxramas/boss_faerlina.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/naxxramas/boss_faerlina.cpp (revision 109)
@@ -98,8 +98,4 @@
             if (m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who))
             {
-                if(who->HasStealthAura())
-                    who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
-
-                DoStartAttackAndMovement(who);
                 //Say our dialog on initial aggro
                 if (!InCombat)
@@ -125,4 +121,7 @@
                     }
                 }
+
+                who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
+                AttackStart(who);
             }
             else if (!HasTaunted && m_creature->IsWithinDistInMap(who, 60.0f))
Index: trunk/src/bindings/scripts/docs/EventAI.txt
===================================================================
--- trunk/src/bindings/scripts/docs/EventAI.txt (revision 37)
+++ trunk/src/bindings/scripts/docs/EventAI.txt (revision 109)
@@ -83,12 +83,12 @@
 (#   Internal Name                     Param usage                     Discription)
 0    ACTION_T_NONE                     No Action                       Does Nothing
-1    ACTION_T_SAY                      TextId                          Says Text
-2    ACTION_T_YELL                     TextId                          Yells Text
-3    ACTION_T_TEXTEMOTE                TextId                          Text Emotes Text
+1    ACTION_T_TEXT                     -TextId1, -TextId2, -TextId3    Displays the -TextId as defined. In case -TextId2 and optionally -TextId3, the output will be randomized. Type text are defined in the text table itself(say, yell, whisper, etc) along with other options for the text. All values are required to be negative.
+2    ACTION_T_YELL                                                     UNUSED
+3    ACTION_T_TEXTEMOTE                                                UNUSED
 4    ACTION_T_SOUND                    SoundId                         Plays Sound
 5    ACTION_T_EMOTE                    EmoteId                         Does emote
-6    ACTION_T_RANDOM_SAY               TextId1, TextId2, TextId3       Says random text between 3 params*
-7    ACTION_T_RANDOM_YELL              TextId1, TextId2, TextId3       Yells random text between 3 params*
-8    ACTION_T_RANDOM_TEXTEMOTE         TextId1, TextId2, TextId3       Text Emotes random text between 3 params*
+6    ACTION_T_RANDOM_SAY                                               UNUSED
+7    ACTION_T_RANDOM_YELL                                              UNUSED
+8    ACTION_T_RANDOM_TEXTEMOTE                                         UNUSED
 9    ACTION_T_RANDOM_SOUND             SoundId1, SoundId2, SoundId3    Plays random sound between 3 params*
 10   ACTION_T_RANDOM_EMOTE             EmoteId1, EmoteId2, EmoteId3    Emotes random emote between 3 params
@@ -312,24 +312,23 @@
 
 -----------------
-1 = ACTION_T_SAY:
+1 = ACTION_T_TEXT:
 -----------------
-Parameter 1: The ID of the text that the NPC should SAY from the Localized_Texts Table. 
-
-This action is pretty straightforward. When activated, the creature will SAY the specified text (Speech Bubble). 
+Parameter 1: The entry of the text that the NPC should use from eventai_texts table. Optionally a entry from other tables can be used (such as custom_texts).
+             Entry are required to be negative and exist in a *_texts-table. The type text to be displayed are defined in the texts-table itself (Say, Yell, Whisper, Emote Text, Boss Whisper, Boss Emote)
+             Other options are also to be defined in the texts-table, such as a sound to be heard with the text and the language used in output (common, dwarvish, etc).
+             In case this entry has a localized version of the text, the localized text will be displayed in client that support this locale.
+
+Parameter 2: Optional. TextId can be defined in addition. The same apply to this as explained above, however eventAI will randomize between the two.
+Parameter 3: Optional, if Parameter 2 exist. In this case, eventAI will randomize between three.
 
 ------------------
 2 = ACTION_T_YELL:
 ------------------
-Parameter 1: The ID of the text that the NPC should YELL from the Localized_Texts Table. 
-
-The creature will YELL the specified text (Red Speech Bubble). 
+UNUSED       Can be reused to create new action type
 
 -----------------------
 3 = ACTION_T_TEXTEMOTE:
 -----------------------
-Parameter 1: The ID of the text that the NPC should TEXTEMOTE from the Localized_Texts Table.  
-
-When activated, the creature will do a text emote using the specified text. A text emote is what you would regularly see by using the /em slash command. 
-NOTE: The text should be written with the assumption that the creature's name is the first word or words in the sentence (for example, "is doing a text emote" would appear as "XYZ is doing a text emote" for a creature named XYZ). 
+UNUSED       Can be reused to create new action type
 
 -------------------
@@ -352,30 +351,15 @@
 6 = ACTION_T_RANDOM_SAY:
 ------------------------
-Parameter 1: The ID of the text that the NPC should SAY from the Localized_Texts Table (Random Choice #1). 
-Parameter 2: The ID of the text that the NPC should SAY from the Localized_Texts Table (Random Choice #2). 
-Parameter 3: The ID of the text that the NPC should SAY from the Localized_Texts Table (Random Choice #3). 
-
-Similar to the ACTION_T_SAY action, it will choose at random a text entry to SAY. This action will pick a random entry from the three.
-NOTE: If you want any of the options if selected to do nothing you set that Param to -1 value. Then if selected it will do nothing.
-NOTE: When using Random Select Actions, ALL The Actions using Random in a Single Event (Action 1,2,3) will select the SAME Random Choice when it expires. This can come in handy if you are doing a ACTION_T_RANDOM_YELL for Action1 and then the corresponding sounds for ACTION_T_RANDOM_SOUND in Action2. If it selects Random Choice #2 for the Yell it will Select Random Choice #2 for the sound so you can match them up as required.
-This is commonly used for NPC's who have several different Aggro Say's and you would like one of them selected at random.
+UNUSED       Can be reused to create new action type
 
 -------------------------
 7 = ACTION_T_RANDOM_YELL:
 -------------------------
-Parameter 1: The ID of the text that the NPC should YELL from the Localized_Texts Table (Random Choice #1). 
-Parameter 2: The ID of the text that the NPC should YELL from the Localized_Texts Table (Random Choice #2). 
-Parameter 3: The ID of the text that the NPC should YELL from the Localized_Texts Table (Random Choice #3). 
-
-Similar to the ACTION_T_YELL action, it will choose at random a text entry to YELL. 
+UNUSED       Can be reused to create new action type
 
 ------------------------------
 8 = ACTION_T_RANDOM_TEXTEMOTE:
 ------------------------------
-Parameter 1: The ID of the text that the NPC should TEXTEMOTE from the Localized_Texts Table (Random Choice #1). 
-Parameter 2: The ID of the text that the NPC should TEXTEMOTE from the Localized_Texts Table (Random Choice #2). 
-Parameter 3: The ID of the text that the NPC should TEXTEMOTE from the Localized_Texts Table (Random Choice #3). 
-
-Similar to the ACTION_T_TEXTEMOTE action, it will choose at random a text entry to TEXTEMOTE. 
+UNUSED       Can be reused to create new action type
 
 --------------------------
Index: trunk/src/bindings/scripts/ScriptMgr.cpp
===================================================================
--- trunk/src/bindings/scripts/ScriptMgr.cpp (revision 105)
+++ trunk/src/bindings/scripts/ScriptMgr.cpp (revision 109)
@@ -23,5 +23,4 @@
 DatabaseType TScriptDB;
 Config TScriptConfig;
-uint32 Locale;
 
 // String text additional data, used in TextMap
@@ -44,27 +43,13 @@
 };
 
-#define TEXT_SOURCE_RANGE   -100000                         //the amount of entries each text source has available
+#define TEXT_SOURCE_RANGE   -1000000                        //the amount of entries each text source has available
 
 // Text Maps
-HM_NAMESPACE::hash_map<uint32, std::string> EventAI_Text_Map;
 HM_NAMESPACE::hash_map<int32, StringTextData> TextMap;
 
-// Localized Text structure for storing locales (for EAI and SD2 scripts).
-struct Localized_Text
-{
-    std::string locale_1;
-    std::string locale_2;
-    std::string locale_3;
-    std::string locale_4;
-    std::string locale_5;
-    std::string locale_6;
-    std::string locale_7;
-    std::string locale_8;
-};
+
 //*** End Global data ***
 
 //*** EventAI data ***
-HM_NAMESPACE::hash_map<uint32, Localized_Text> EventAI_LocalizedTextMap;
-
 //Event AI structure. Used exclusivly by mob_event_ai.cpp (60 bytes each)
 std::list<EventAI_Event> EventAI_Event_List;
@@ -605,5 +590,5 @@
     char const* dbstring = NULL;
 
-    if( !TScriptConfig.GetString("WorldDatabaseInfo", &dbstring) )
+    if (!TScriptConfig.GetString("WorldDatabaseInfo", &dbstring) )
     {
         error_log("TSCR: Missing world database info from configuration file. Load database aborted.");
@@ -612,5 +597,5 @@
 
     //Initialize connection to DB
-    if( dbstring && TScriptDB.Initialize(dbstring) )
+    if (dbstring && TScriptDB.Initialize(dbstring) )
         outstring_log("TSCR: TrinityScript database: %s",dbstring);
     else
@@ -642,14 +627,12 @@
     TextMap.clear();
 
-    //TODO: Add load from eventai_texts here
-
-    // Load Script Text 
-    outstring_log("TSCR: Loading Script Texts...");
-    LoadTrinityStrings(TScriptDB,"script_texts",TEXT_SOURCE_RANGE,(TEXT_SOURCE_RANGE*2)+1);
-
-    // Gather Additional data from Script Texts
-    result = TScriptDB.PQuery("SELECT entry, sound, type, language FROM script_texts");
-
-    outstring_log("TSCR: Loading Script Texts additional data...");
+    // Load EventAI Text 
+    outstring_log("TSCR: Loading EventAI Texts...");
+    LoadTrinityStrings(TScriptDB,"eventai_texts",-1,1+(TEXT_SOURCE_RANGE));
+
+    // Gather Additional data from EventAI Texts
+    result = TScriptDB.PQuery("SELECT entry, sound, type, language FROM eventai_texts");
+
+    outstring_log("TSCR: Loading EventAI Texts additional data...");
     if (result)
     {
@@ -670,4 +653,68 @@
             if (i >= 0)
             {
+                error_db_log("TSCR: Entry %i in table `eventai_texts` is not a negative value.",i);
+                continue;
+            }
+
+            if (i <= TEXT_SOURCE_RANGE)
+            {
+                error_db_log("TSCR: Entry %i in table `eventai_texts` is out of accepted entry range for table.",i);
+                continue;
+            }
+
+            if (temp.SoundId)
+            {
+                if (!GetSoundEntriesStore()->LookupEntry(temp.SoundId))
+                    error_db_log("TSCR: Entry %i in table `eventai_texts` has soundId %u but sound does not exist.",i,temp.SoundId);
+            }
+
+            if (!GetLanguageDescByID(temp.Language))
+                error_db_log("TSCR: Entry %i in table `eventai_texts` using Language %u but Language does not exist.",i,temp.Language);
+
+            if (temp.Type > CHAT_TYPE_BOSS_WHISPER)
+                error_db_log("TSCR: Entry %i in table `eventai_texts` has Type %u but this Chat Type does not exist.",i,temp.Type);
+
+            TextMap[i] = temp;
+            ++count;
+        } while (result->NextRow());
+
+        delete result;
+
+        outstring_log("");
+        outstring_log(">> TSCR: Loaded %u additional EventAI Texts data.", count);
+    }else
+    {
+        barGoLink bar(1);
+        bar.step();
+        outstring_log("");
+        outstring_log(">> Loaded 0 additional EventAI Texts data. DB table `eventai_texts` is empty.");
+    }
+
+    // Load Script Text 
+    outstring_log("TSCR: Loading Script Texts...");
+    LoadTrinityStrings(TScriptDB,"script_texts",TEXT_SOURCE_RANGE,1+(TEXT_SOURCE_RANGE*2));
+
+    // Gather Additional data from Script Texts
+    result = TScriptDB.PQuery("SELECT entry, sound, type, language FROM script_texts");
+
+    outstring_log("TSCR: Loading Script Texts additional data...");
+    if (result)
+    {
+        barGoLink bar(result->GetRowCount());
+        uint32 count = 0;
+
+        do
+        {
+            bar.step();
+            Field* fields = result->Fetch();
+            StringTextData temp;
+
+            int32 i             = fields[0].GetInt32();
+            temp.SoundId        = fields[1].GetInt32();
+            temp.Type           = fields[2].GetInt32();
+            temp.Language       = fields[3].GetInt32();
+
+            if (i >= 0)
+            {
                 error_db_log("TSCR: Entry %i in table `script_texts` is not a negative value.",i);
                 continue;
@@ -710,5 +757,5 @@
     // Load Custom Text 
     outstring_log("TSCR: Loading Custom Texts...");
-    LoadTrinityStrings(TScriptDB,"custom_texts",TEXT_SOURCE_RANGE*2,(TEXT_SOURCE_RANGE*3)+1);
+    LoadTrinityStrings(TScriptDB,"custom_texts",TEXT_SOURCE_RANGE*2,1+(TEXT_SOURCE_RANGE*3));
 
     // Gather Additional data from Custom Texts
@@ -772,94 +819,5 @@
     }
 
-    // Drop existing Event AI Localized Text hash map
-    EventAI_LocalizedTextMap.clear();
-
-    // Gather EventAI Localized Texts
-    result = TScriptDB.PQuery("SELECT id, locale_1, locale_2, locale_3, locale_4, locale_5, locale_6, locale_7, locale_8 "
-        "FROM eventai_localized_texts");
-
-    outstring_log("TSCR: Loading EventAI Localized Texts...");
-    if(result)
-    {
-        barGoLink bar(result->GetRowCount());
-        uint32 count = 0;
-
-        do
-        {
-            Localized_Text temp;
-            bar.step();
-
-            Field *fields = result->Fetch();
-
-            uint32 i = fields[0].GetInt32();
-
-            temp.locale_1 = fields[1].GetString();
-            temp.locale_2 = fields[2].GetString();
-            temp.locale_3 = fields[3].GetString();
-            temp.locale_4 = fields[4].GetString();
-            temp.locale_5 = fields[5].GetString();
-            temp.locale_6 = fields[6].GetString();
-            temp.locale_7 = fields[7].GetString();
-            temp.locale_8 = fields[8].GetString();
-
-            EventAI_LocalizedTextMap[i] = temp;
-            ++count;
-
-        }while(result->NextRow());
-
-        delete result;
-
-        outstring_log("");
-        outstring_log(">> Loaded %u EventAI Localized Texts", count);
-    }else
-    {
-        barGoLink bar(1);
-        bar.step();
-        outstring_log("");
-        outstring_log(">> Loaded 0 EventAI Localized Texts. DB table `eventai_localized_texts` is empty");
-    }
-
-    //Drop existing EventAI Text hash map
-    EventAI_Text_Map.clear();
-
-    //Gather EventAI Text Entries
-    result = TScriptDB.PQuery("SELECT id, text FROM eventai_texts");
-
-    outstring_log("TSCR: Loading EventAI_Texts...");
-    if (result)
-    {
-        barGoLink bar(result->GetRowCount());
-        uint32 Count = 0;
-
-        do
-        {
-            bar.step();
-            Field *fields = result->Fetch();
-
-            uint32 i = fields[0].GetInt32();
-
-            std::string text = fields[1].GetString();
-
-            if (!strlen(text.c_str()))
-                error_db_log("TSCR: EventAI text %u is empty", i);
-
-            EventAI_Text_Map[i] = text;
-            ++Count;
-
-        }while (result->NextRow());
-
-        delete result;
-
-        outstring_log("");
-        outstring_log(">> Loaded %u EventAI texts", Count);
-    }else
-    {
-        barGoLink bar(1);
-        bar.step();
-        outstring_log("");
-        outstring_log(">> Loaded 0 EventAI texts. DB table `eventai_texts` is empty.");
-    }
-
-    //Gather event data
+    //Gather additional data for EventAI
     result = TScriptDB.PQuery("SELECT id, position_x, position_y, position_z, orientation, spawntimesecs FROM eventai_summons");
 
@@ -867,5 +825,5 @@
     EventAI_Summon_Map.clear();
 
-    outstring_log("TSCR: Loading EventAI_Summons...");
+    outstring_log("TSCR: Loading EventAI Summons...");
     if (result)
     {
@@ -915,5 +873,5 @@
     EventAI_Event_List.clear();
 
-    outstring_log("TSCR: Loading EventAI_Scripts...");
+    outstring_log("TSCR: Loading EventAI scripts...");
     if (result)
     {
@@ -1055,9 +1013,28 @@
                 switch (temp.action[j].type)
                 {
-                    case ACTION_T_SAY:
-                    case ACTION_T_YELL:
-                    case ACTION_T_TEXTEMOTE:
-                        if (GetEventAIText(temp.action[j].param1) == DEFAULT_TEXT)
-                            error_db_log("TSCR: Event %u Action %u refrences missing Localized_Text entry", i, j+1);
+                    case ACTION_T_TEXT:
+                        {
+                            if (temp.action[j].param1_s < 0)
+                            {
+                                if (TextMap.find(temp.action[j].param1_s) == TextMap.end())
+                                    error_db_log("TSCR: Event %u Action %u param1 refrences non-existing entry in texts table.", i, j+1);
+                            }
+                            if (temp.action[j].param2_s < 0)
+                            {
+                                if (TextMap.find(temp.action[j].param2_s) == TextMap.end())
+                                    error_db_log("TSCR: Event %u Action %u param2 refrences non-existing entry in texts table.", i, j+1);
+
+                                if (!temp.action[j].param1_s)
+                                    error_db_log("TSCR: Event %u Action %u has param2, but param1 is not set. Required for randomized text.", i, j+1);
+                            }
+                            if (temp.action[j].param3_s < 0)
+                            {
+                                if (TextMap.find(temp.action[j].param3_s) == TextMap.end())
+                                    error_db_log("TSCR: Event %u Action %u param3 refrences non-existing entry in texts table.", i, j+1);
+
+                                if (!temp.action[j].param1_s || !temp.action[j].param2_s)
+                                    error_db_log("TSCR: Event %u Action %u has param3, but param1 and/or param2 is not set. Required for randomized text.", i, j+1);
+                            }
+                        }
                         break;
 
@@ -1067,12 +1044,14 @@
                         break;
 
-                    case ACTION_T_RANDOM_SAY:
-                    case ACTION_T_RANDOM_YELL:
-                    case ACTION_T_RANDOM_TEXTEMOTE:
-                        if ((temp.action[j].param1 != 0xffffffff && GetEventAIText(temp.action[j].param1) == DEFAULT_TEXT) ||
-                            (temp.action[j].param2 != 0xffffffff && GetEventAIText(temp.action[j].param2) == DEFAULT_TEXT) ||
-                            (temp.action[j].param3 != 0xffffffff && GetEventAIText(temp.action[j].param3) == DEFAULT_TEXT))
-                            error_db_log("TSCR: Event %u Action %u refrences missing Localized_Text entry", i, j+1);
-                        break;
+                    /*case ACTION_T_RANDOM_SOUND:
+                        {
+                            if(!GetSoundEntriesStore()->LookupEntry(temp.action[j].param1))
+                                error_db_log("TSCR: Event %u Action %u param1 uses non-existant SoundID %u.", i, j+1, temp.action[j].param1);
+                            if(!GetSoundEntriesStore()->LookupEntry(temp.action[j].param2))
+                                error_db_log("TSCR: Event %u Action %u param2 uses non-existant SoundID %u.", i, j+1, temp.action[j].param2);
+                            if(!GetSoundEntriesStore()->LookupEntry(temp.action[j].param3))
+                                error_db_log("TSCR: Event %u Action %u param3 uses non-existant SoundID %u.", i, j+1, temp.action[j].param3);
+                        }
+                        break;*/
 
                     case ACTION_T_CAST:
@@ -1153,4 +1132,12 @@
                         break;
 
+                    case ACTION_T_YELL:
+                    case ACTION_T_TEXTEMOTE:
+                    case ACTION_T_RANDOM_SAY:
+                    case ACTION_T_RANDOM_YELL:
+                    case ACTION_T_RANDOM_TEXTEMOTE:
+                        error_db_log("TSCR: Event %u Action %u currently unused ACTION type. Did you forget to update database?", i, j+1);
+                        break;
+
                     default:
                         if (temp.action[j].type >= ACTION_T_END)
@@ -1223,32 +1210,21 @@
     else outstring_log("TSCR: Using configuration file %s",_TRINITY_SCRIPT_CONFIG);
 
-    //Locale
-    Locale = TScriptConfig.GetIntDefault("Locale", 0);
-
-    if (Locale > 8)
-    {
-        Locale = 0;
-        error_log("TSCR: Locale set to invalid language id. Defaulting to 0.");
-    }
-
-    outstring_log("TSCR: Using locale %u", Locale);
-
     EAI_ErrorLevel = TScriptConfig.GetIntDefault("EAIErrorLevel", 1);
 
     switch (EAI_ErrorLevel)
     {
-    case 0:
-        outstring_log("TSCR: EventAI Error Reporting level set to 0 (Startup Errors only)");
-        break;
-    case 1:
-        outstring_log("TSCR: EventAI Error Reporting level set to 1 (Startup errors and Runtime event errors)");
-        break;
-    case 2:
-        outstring_log("TSCR: EventAI Error Reporting level set to 2 (Startup errors, Runtime event errors, and Creation errors)");
-        break;
-    default:
-        outstring_log("TSCR: Unknown EventAI Error Reporting level. Defaulting to 1 (Startup errors and Runtime event errors)");
-        EAI_ErrorLevel = 1;
-        break;
+        case 0:
+            outstring_log("TSCR: EventAI Error Reporting level set to 0 (Startup Errors only)");
+            break;
+        case 1:
+            outstring_log("TSCR: EventAI Error Reporting level set to 1 (Startup errors and Runtime event errors)");
+            break;
+        case 2:
+            outstring_log("TSCR: EventAI Error Reporting level set to 2 (Startup errors, Runtime event errors, and Creation errors)");
+            break;
+        default:
+            outstring_log("TSCR: Unknown EventAI Error Reporting level. Defaulting to 1 (Startup errors and Runtime event errors)");
+            EAI_ErrorLevel = 1;
+            break;
     }
 
@@ -1795,86 +1771,5 @@
 
 //*********************************
-//*** Functions used internally ***
-
-const char* GetEventAILocalizedText(uint32 entry)
-{
-    if (entry == 0xffffffff)
-        error_log("TSCR: Entry = -1, GetEventAILocalizedText should not be called in this case.");
-
-    const char* temp = NULL;
-
-    HM_NAMESPACE::hash_map<uint32, Localized_Text>::iterator i = EventAI_LocalizedTextMap.find(entry);
-
-    if (i == EventAI_LocalizedTextMap.end())
-    {
-        error_log("TSCR: EventAI Localized Text %u not found", entry);
-        return DEFAULT_TEXT;
-    }
-
-    switch (Locale)
-    {
-        case 1:
-            temp =  (*i).second.locale_1.c_str();
-            break;
-
-        case 2:
-            temp =  (*i).second.locale_2.c_str();
-            break;
-
-        case 3:
-            temp =  (*i).second.locale_3.c_str();
-            break;
-
-        case 4:
-            temp =  (*i).second.locale_4.c_str();
-            break;
-
-        case 5:
-            temp =  (*i).second.locale_5.c_str();
-            break;
-
-        case 6:
-            temp =  (*i).second.locale_6.c_str();
-            break;
-
-        case 7:
-            temp =  (*i).second.locale_7.c_str();
-            break;
-
-        case 8:
-            temp =  (*i).second.locale_8.c_str();
-            break;
-    };
-
-    if (strlen(temp))
-        return temp;
-
-    return DEFAULT_TEXT;
-}
-
-const char* GetEventAIText(uint32 entry)
-{
-    if(entry == 0xffffffff)
-        error_log("TSCR: Entry = -1, GetEventAIText should not be called in this case.");
-
-    const char* str = NULL;
-
-    HM_NAMESPACE::hash_map<uint32, std::string>::iterator itr = EventAI_Text_Map.find(entry);
-    if(itr == EventAI_Text_Map.end())
-    {
-        error_log("TSCR: Unable to find EventAI Text %u", entry);
-        return DEFAULT_TEXT;
-    }
-
-    str = (*itr).second.c_str();
-
-    if(strlen(str))
-        return str;
-
-    if(strlen((*itr).second.c_str()))
-        return (*itr).second.c_str();
-
-    return DEFAULT_TEXT;
-}
+//*** Functions used globally ***
 
 void DoScriptText(int32 textEntry, WorldObject* pSource, Unit* target)
@@ -1888,5 +1783,5 @@
     if (textEntry >= 0)
     {
-        error_log("TSCR: DoScriptText attempts to process entry %i, but entry must be negative.",textEntry);
+        error_log("TSCR: DoScriptText with source entry %u (TypeId=%u, guid=%u) attempts to process text entry %i, but text entry must be negative.",pSource->GetEntry(),pSource->GetTypeId(),pSource->GetGUIDLow(),textEntry);
         return;
     }
@@ -1896,7 +1791,9 @@
     if (i == TextMap.end())
     {
-        error_log("TSCR: DoScriptText could not find text entry %i.",textEntry);
+        error_log("TSCR: DoScriptText with source entry %u (TypeId=%u, guid=%u) could not find text entry %i.",pSource->GetEntry(),pSource->GetTypeId(),pSource->GetGUIDLow(),textEntry);
         return;
     }
+
+    debug_log("TSCR: DoScriptText: text entry=%i, Sound=%u, Type=%u, Language=%u",textEntry,(*i).second.SoundId,(*i).second.Type,(*i).second.Language);
 
     if((*i).second.SoundId)
@@ -1939,12 +1836,15 @@
 }
 
+//*********************************
+//*** Functions used internally ***
+
 Script* GetScriptByName(std::string Name)
 {
-    if(Name.empty())
+    if (Name.empty())
         return NULL;
 
     for(int i=0;i<MAX_SCRIPTS;i++)
     {
-        if( m_scripts[i] && m_scripts[i]->Name == Name )
+        if (m_scripts[i] && m_scripts[i]->Name == Name)
             return m_scripts[i];
     }
@@ -1959,5 +1859,5 @@
 {
     Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
-    if(!tmpscript || !tmpscript->pGossipHello) return false;
+    if (!tmpscript || !tmpscript->pGossipHello) return false;
 
     player->PlayerTalkClass->ClearMenus();
@@ -1971,5 +1871,5 @@
 
     Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
-    if(!tmpscript || !tmpscript->pGossipSelect) return false;
+    if (!tmpscript || !tmpscript->pGossipSelect) return false;
 
     player->PlayerTalkClass->ClearMenus();
@@ -1983,5 +1883,5 @@
 
     Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
-    if(!tmpscript || !tmpscript->pGossipSelectWithCode) return false;
+    if (!tmpscript || !tmpscript->pGossipSelectWithCode) return false;
 
     player->PlayerTalkClass->ClearMenus();
@@ -1993,5 +1893,5 @@
 {
     Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
-    if(!tmpscript || !tmpscript->pQuestAccept) return false;
+    if (!tmpscript || !tmpscript->pQuestAccept) return false;
 
     player->PlayerTalkClass->ClearMenus();
@@ -2003,5 +1903,5 @@
 {
     Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
-    if(!tmpscript || !tmpscript->pQuestSelect) return false;
+    if (!tmpscript || !tmpscript->pQuestSelect) return false;
 
     player->PlayerTalkClass->ClearMenus();
@@ -2013,5 +1913,5 @@
 {
     Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
-    if(!tmpscript || !tmpscript->pQuestComplete) return false;
+    if (!tmpscript || !tmpscript->pQuestComplete) return false;
 
     player->PlayerTalkClass->ClearMenus();
@@ -2023,5 +1923,5 @@
 {
     Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
-    if(!tmpscript || !tmpscript->pChooseReward) return false;
+    if (!tmpscript || !tmpscript->pChooseReward) return false;
 
     player->PlayerTalkClass->ClearMenus();
@@ -2033,5 +1933,5 @@
 {
     Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
-    if(!tmpscript || !tmpscript->pNPCDialogStatus) return 100;
+    if (!tmpscript || !tmpscript->pNPCDialogStatus) return 100;
 
     player->PlayerTalkClass->ClearMenus();
@@ -2053,5 +1953,5 @@
 {
     Script *tmpscript = GetScriptByName(_Item->GetProto()->ScriptName);
-    if(!tmpscript || !tmpscript->pItemHello) return false;
+    if (!tmpscript || !tmpscript->pItemHello) return false;
 
     player->PlayerTalkClass->ClearMenus();
@@ -2063,5 +1963,5 @@
 {
     Script *tmpscript = GetScriptByName(_Item->GetProto()->ScriptName);
-    if(!tmpscript || !tmpscript->pItemQuestAccept) return false;
+    if (!tmpscript || !tmpscript->pItemQuestAccept) return false;
 
     player->PlayerTalkClass->ClearMenus();
@@ -2073,5 +1973,5 @@
 {
     Script *tmpscript = GetScriptByName(_GO->GetGOInfo()->ScriptName);
-    if(!tmpscript || !tmpscript->pGOHello) return false;
+    if (!tmpscript || !tmpscript->pGOHello) return false;
 
     player->PlayerTalkClass->ClearMenus();
@@ -2083,5 +1983,5 @@
 {
     Script *tmpscript = GetScriptByName(_GO->GetGOInfo()->ScriptName);
-    if(!tmpscript || !tmpscript->pGOQuestAccept) return false;
+    if (!tmpscript || !tmpscript->pGOQuestAccept) return false;
 
     player->PlayerTalkClass->ClearMenus();
@@ -2093,5 +1993,5 @@
 {
     Script *tmpscript = GetScriptByName(_GO->GetGOInfo()->ScriptName);
-    if(!tmpscript || !tmpscript->pGOChooseReward) return false;
+    if (!tmpscript || !tmpscript->pGOChooseReward) return false;
 
     player->PlayerTalkClass->ClearMenus();
@@ -2105,5 +2005,5 @@
 
     tmpscript = GetScriptByName(GetAreaTriggerScriptNameById(atEntry->id));
-    if(!tmpscript || !tmpscript->pAreaTrigger) return false;
+    if (!tmpscript || !tmpscript->pAreaTrigger) return false;
 
     return tmpscript->pAreaTrigger(player, atEntry);
@@ -2115,5 +2015,5 @@
     Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
 
-    if(!tmpscript || !tmpscript->GetAI) return NULL;
+    if (!tmpscript || !tmpscript->GetAI) return NULL;
     return tmpscript->GetAI(_Creature);
 }
@@ -2123,5 +2023,5 @@
 {
     Script *tmpscript = GetScriptByName(_Item->GetProto()->ScriptName);
-    if(!tmpscript || !tmpscript->pItemUse) return false;
+    if (!tmpscript || !tmpscript->pItemUse) return false;
 
     return tmpscript->pItemUse(player,_Item,targets);
@@ -2132,5 +2032,5 @@
 {
     Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
-    if(!tmpscript || !tmpscript->pReceiveEmote) return false;
+    if (!tmpscript || !tmpscript->pReceiveEmote) return false;
 
     return tmpscript->pReceiveEmote(player, _Creature, emote);
@@ -2142,8 +2042,8 @@
     Script *tmpscript = NULL;
 
-    if(!map->IsDungeon()) return false;
+    if (!map->IsDungeon()) return false;
 
     tmpscript = GetScriptByName(((InstanceMap*)map)->GetScript());
-    if(!tmpscript || !tmpscript->GetInstanceData) return false;
+    if (!tmpscript || !tmpscript->GetInstanceData) return false;
 
     return tmpscript->GetInstanceData(map);
Index: trunk/sql/updates/117_trinityscript.sql
===================================================================
--- trunk/sql/updates/117_trinityscript.sql (revision 109)
+++ trunk/sql/updates/117_trinityscript.sql (revision 109)
@@ -0,0 +1,64 @@
+-- 
+-- NOTE: If you have temporary stored data in table `eventai_localized_texts` make sure to make backup of this before running this update!
+-- NOTE: If you have any texts in current eventai_texts and they are not using entries valid for *_texts table, you _will_ get error messages on startup.
+-- NOTE: Do not run this update twice, it may create bad data if you choose to do so.
+-- 
+
+-- drop obsolete table
+DROP TABLE eventai_localized_texts;
+
+-- alter and add fields in table `eventai_texts`
+ALTER TABLE eventai_texts CHANGE COLUMN `id` `entry` mediumint(8) NOT NULL;
+ALTER TABLE eventai_texts CHANGE COLUMN `text` `content_default` text NOT NULL AFTER `entry`;
+ALTER TABLE eventai_texts ADD COLUMN `content_loc1` text AFTER `content_default`;
+ALTER TABLE eventai_texts ADD COLUMN `content_loc2` text AFTER `content_loc1`;
+ALTER TABLE eventai_texts ADD COLUMN `content_loc3` text AFTER `content_loc2`;
+ALTER TABLE eventai_texts ADD COLUMN `content_loc4` text AFTER `content_loc3`;
+ALTER TABLE eventai_texts ADD COLUMN `content_loc5` text AFTER `content_loc4`;
+ALTER TABLE eventai_texts ADD COLUMN `content_loc6` text AFTER `content_loc5`;
+ALTER TABLE eventai_texts ADD COLUMN `content_loc7` text AFTER `content_loc6`;
+ALTER TABLE eventai_texts ADD COLUMN `content_loc8` text AFTER `content_loc7`;
+ALTER TABLE eventai_texts ADD COLUMN `sound` mediumint(8) unsigned NOT NULL default '0' AFTER `content_loc8`;
+ALTER TABLE eventai_texts ADD COLUMN `type` tinyint unsigned NOT NULL default '0' AFTER `sound`;
+ALTER TABLE eventai_texts ADD COLUMN `language` tinyint unsigned NOT NULL default '0' AFTER `type`;
+ALTER TABLE eventai_texts MODIFY COLUMN `comment` text;
+
+-- get our current action type, and update text type = yell
+UPDATE eventai_texts,eventai_scripts SET eventai_texts.type=1 WHERE eventai_scripts.action1_type IN (2,7) AND eventai_scripts.action1_param1=eventai_texts.entry;
+UPDATE eventai_texts,eventai_scripts SET eventai_texts.type=1 WHERE eventai_scripts.action2_type IN (2,7) AND eventai_scripts.action2_param1=eventai_texts.entry;
+UPDATE eventai_texts,eventai_scripts SET eventai_texts.type=1 WHERE eventai_scripts.action3_type IN (2,7) AND eventai_scripts.action3_param1=eventai_texts.entry;
+-- get our current action type, and update text type = textemote
+UPDATE eventai_texts,eventai_scripts SET eventai_texts.type=2 WHERE eventai_scripts.action1_type IN (3,8) AND eventai_scripts.action1_param1=eventai_texts.entry;
+UPDATE eventai_texts,eventai_scripts SET eventai_texts.type=2 WHERE eventai_scripts.action2_type IN (3,8) AND eventai_scripts.action2_param1=eventai_texts.entry;
+UPDATE eventai_texts,eventai_scripts SET eventai_texts.type=2 WHERE eventai_scripts.action3_type IN (3,8) AND eventai_scripts.action3_param1=eventai_texts.entry;
+
+-- update our scripts, for all action type 2, 3, 6, 7 & 8 to become 1
+UPDATE eventai_scripts SET action1_type=1 WHERE action1_type IN (2,3,6,7,8);
+UPDATE eventai_scripts SET action2_type=1 WHERE action2_type IN (2,3,6,7,8);
+UPDATE eventai_scripts SET action3_type=1 WHERE action3_type IN (2,3,6,7,8);
+
+-- was OOC, so at least one could be -1, set this to 0 (dev note: below will be bad, if run twice)
+UPDATE eventai_scripts SET action1_param2=0 WHERE action1_type=1 AND action1_param2=-1;
+UPDATE eventai_scripts SET action1_param3=0 WHERE action1_type=1 AND action1_param3=-1;
+UPDATE eventai_scripts SET action2_param2=0 WHERE action2_type=1 AND action2_param2=-1;
+UPDATE eventai_scripts SET action2_param3=0 WHERE action2_type=1 AND action2_param3=-1;
+UPDATE eventai_scripts SET action3_param2=0 WHERE action3_type=1 AND action3_param2=-1;
+UPDATE eventai_scripts SET action3_param3=0 WHERE action3_type=1 AND action3_param3=-1;
+
+-- expect all to be action type 1 now, continue convert to negative text entry
+UPDATE eventai_scripts SET action1_param1=(`action1_param1`) *-1 WHERE action1_type=1 AND action1_param1>0;
+UPDATE eventai_scripts SET action2_param1=(`action2_param1`) *-1 WHERE action2_type=1 AND action2_param1>0;
+UPDATE eventai_scripts SET action3_param1=(`action3_param1`) *-1 WHERE action3_type=1 AND action3_param1>0;
+
+UPDATE eventai_scripts SET action1_param2=(`action1_param2`) *-1 WHERE action1_type=1 AND action1_param2>0;
+UPDATE eventai_scripts SET action2_param2=(`action2_param2`) *-1 WHERE action2_type=1 AND action2_param2>0;
+UPDATE eventai_scripts SET action3_param2=(`action3_param2`) *-1 WHERE action3_type=1 AND action3_param2>0;
+
+UPDATE eventai_scripts SET action1_param3=(`action1_param3`) *-1 WHERE action1_type=1 AND action1_param3>0;
+UPDATE eventai_scripts SET action2_param3=(`action2_param3`) *-1 WHERE action2_type=1 AND action2_param3>0;
+UPDATE eventai_scripts SET action3_param3=(`action3_param3`) *-1 WHERE action3_type=1 AND action3_param3>0;
+
+-- now we have negative numbers in script, must make sure text entries have same entry as script
+UPDATE eventai_texts SET entry=(`entry`) *-1 WHERE entry>0;
+
+ALTER TABLE script_texts MODIFY COLUMN `sound` mediumint(8) unsigned NOT NULL default '0';
Index: trunk/sql/world.sql
===================================================================
--- trunk/sql/world.sql (revision 97)
+++ trunk/sql/world.sql (revision 109)
@@ -570,8 +570,8 @@
   `content_loc8` text,
   `sound` mediumint(8) unsigned NOT NULL default '0',
-  `type` tinyint(3) unsigned NOT NULL default '0',
-  `language` tinyint(3) unsigned NOT NULL default '0',
+  `type` tinyint unsigned NOT NULL default '0',
+  `language` tinyint unsigned NOT NULL default '0',
   `comment` text,
-  PRIMARY KEY  (`entry`)
+  PRIMARY KEY (`entry`)
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Custom Texts';
 
@@ -691,28 +691,28 @@
 DROP TABLE IF EXISTS `eventai_scripts`;
 CREATE TABLE `eventai_scripts` (
-  `id` int(11) unsigned NOT NULL auto_increment COMMENT 'Identifier',
+  `id` int(11) unsigned NOT NULL COMMENT 'Identifier' AUTO_INCREMENT,
   `creature_id` int(11) unsigned NOT NULL default '0' COMMENT 'Creature Template Identifier',
   `event_type` tinyint(5) unsigned NOT NULL default '0' COMMENT 'Event Type',
-  `event_inverse_phase_mask` int(11) NOT NULL default '0' COMMENT 'Mask which phases this event will not trigger in',
+  `event_inverse_phase_mask` int(11) signed NOT NULL default '0' COMMENT 'Mask which phases this event will not trigger in',
   `event_chance` int(3) unsigned NOT NULL default '100',
   `event_flags` int(3) unsigned NOT NULL default '0',
-  `event_param1` int(11) NOT NULL default '0',
-  `event_param2` int(11) NOT NULL default '0',
-  `event_param3` int(11) NOT NULL default '0',
-  `event_param4` int(11) NOT NULL default '0',
+  `event_param1` int(11) signed NOT NULL default '0',
+  `event_param2` int(11) signed NOT NULL default '0',
+  `event_param3` int(11) signed NOT NULL default '0',
+  `event_param4` int(11) signed NOT NULL default '0',
   `action1_type` tinyint(5) unsigned NOT NULL default '0' COMMENT 'Action Type',
-  `action1_param1` int(11) NOT NULL default '0',
-  `action1_param2` int(11) NOT NULL default '0',
-  `action1_param3` int(11) NOT NULL default '0',
+  `action1_param1` int(11) signed NOT NULL default '0',
+  `action1_param2` int(11) signed NOT NULL default '0',
+  `action1_param3` int(11) signed NOT NULL default '0',
   `action2_type` tinyint(5) unsigned NOT NULL default '0' COMMENT 'Action Type',
-  `action2_param1` int(11) NOT NULL default '0',
-  `action2_param2` int(11) NOT NULL default '0',
-  `action2_param3` int(11) NOT NULL default '0',
+  `action2_param1` int(11) signed NOT NULL default '0',
+  `action2_param2` int(11) signed NOT NULL default '0',
+  `action2_param3` int(11) signed NOT NULL default '0',
   `action3_type` tinyint(5) unsigned NOT NULL default '0' COMMENT 'Action Type',
-  `action3_param1` int(11) NOT NULL default '0',
-  `action3_param2` int(11) NOT NULL default '0',
-  `action3_param3` int(11) NOT NULL default '0',
+  `action3_param1` int(11) signed NOT NULL default '0',
+  `action3_param2` int(11) signed NOT NULL default '0',
+  `action3_param3` int(11) signed NOT NULL default '0',
   `comment` varchar(255) NOT NULL default '' COMMENT 'Event Comment',
-  PRIMARY KEY  (`id`)
+  PRIMARY KEY (`id`)
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='EventAI Scripts';
 
@@ -732,5 +732,5 @@
 DROP TABLE IF EXISTS `eventai_summons`;
 CREATE TABLE `eventai_summons` (
-  `id` int(11) unsigned NOT NULL auto_increment COMMENT 'Location Identifier',
+  `id` int(11) unsigned NOT NULL COMMENT 'Location Identifier' AUTO_INCREMENT,
   `position_x` float NOT NULL default '0',
   `position_y` float NOT NULL default '0',
@@ -739,5 +739,5 @@
   `spawntimesecs` int(11) unsigned NOT NULL default '120',
   `comment` varchar(255) NOT NULL default '' COMMENT 'Summon Comment',
-  PRIMARY KEY  (`id`)
+  PRIMARY KEY (`id`)
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='EventAI Summoning Locations';
 
@@ -757,9 +757,20 @@
 DROP TABLE IF EXISTS `eventai_texts`;
 CREATE TABLE `eventai_texts` (
-  `id` int(11) unsigned NOT NULL default '0' COMMENT 'Identifier',
-  `text` varchar(255) NOT NULL default '',
-  `comment` varchar(255) NOT NULL default '' COMMENT 'Text Comment',
-  PRIMARY KEY  (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Texts used in EventAI';
+  `entry` mediumint(8) NOT NULL,
+  `content_default` text NOT NULL,
+  `content_loc1` text,
+  `content_loc2` text,
+  `content_loc3` text,
+  `content_loc4` text,
+  `content_loc5` text,
+  `content_loc6` text,
+  `content_loc7` text,
+  `content_loc8` text,
+  `sound` mediumint(8) unsigned NOT NULL default '0',
+  `type` tinyint unsigned NOT NULL default '0',
+  `language` tinyint unsigned NOT NULL default '0',
+  `comment` text,
+  PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Script Texts';
 
 --
@@ -770,4 +781,36 @@
 /*!40000 ALTER TABLE `eventai_texts` DISABLE KEYS */;
 /*!40000 ALTER TABLE `eventai_texts` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `script_texts`
+--
+
+DROP TABLE IF EXISTS `script_texts`;
+CREATE TABLE `script_texts` (
+  `entry` mediumint(8) NOT NULL,
+  `content_default` text NOT NULL,
+  `content_loc1` text,
+  `content_loc2` text,
+  `content_loc3` text,
+  `content_loc4` text,
+  `content_loc5` text,
+  `content_loc6` text,
+  `content_loc7` text,
+  `content_loc8` text,
+  `sound` mediumint(8) unsigned NOT NULL default '0',
+  `type` tinyint unsigned NOT NULL default '0',
+  `language` tinyint unsigned NOT NULL default '0',
+  `comment` text,
+  PRIMARY KEY  (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Script Texts';
+
+--
+-- Dumping data for table `script_texts`
+--
+
+LOCK TABLES `eventai_texts` WRITE;
+/*!40000 ALTER TABLE `script_texts` DISABLE KEYS */;
+/*!40000 ALTER TABLE `script_texts` ENABLE KEYS */;
 UNLOCK TABLES;
 
