Index: /trunk/src/game/WaypointManager.cpp
===================================================================
--- /trunk/src/game/WaypointManager.cpp (revision 279)
+++ /trunk/src/game/WaypointManager.cpp (revision 290)
@@ -125,30 +125,16 @@
             be.spell            = fields[8].GetUInt32();
 
-            // load and store without holes in array
-            int j = 0;
             for(int i = 0; i < MAX_WAYPOINT_TEXT; ++i)
             {
-                be.textid[j]        = fields[9+i].GetUInt32();
-                if(be.textid[j])
+                be.textid[i]        = fields[9+i].GetUInt32();
+                if(be.textid[i])
                 {
-                    if (be.textid[j] < MIN_DB_SCRIPT_STRING_ID || be.textid[j] >= MAX_DB_SCRIPT_STRING_ID)
+                    if (be.textid[i] < MIN_DB_SCRIPT_STRING_ID || be.textid[i] >= MAX_DB_SCRIPT_STRING_ID)
                     {
-                        sLog.outErrorDb( "Table `db_script_string` not have string id  %u", be.textid[j]);
+                        sLog.outErrorDb( "Table `db_script_string` not have string id  %u", be.textid[i]);
                         continue;
                     }
-
-                    if (!objmgr.GetTrinityStringLocale (be.textid[j]))
-                    {
-                        sLog.outErrorDb("ERROR: Waypoint path %d (point %d), have invalid text id (%i) in `textid%d, ignored.",
-                            id, point, be.textid[j], i+1);
-                        continue;
-                    }
-
-                    ++j;                                    // to next internal field
                 }
             }
-            // fill array tail
-            for(; j < MAX_WAYPOINT_TEXT; ++j)
-                be.textid[j] = 0;
 
             // save memory by not storing empty behaviors
@@ -309,2 +295,48 @@
     }
 }
+
+void WaypointManager::CheckTextsExistance(std::set<int32>& ids)
+{
+    WaypointPathMap::iterator pmItr = m_pathMap.begin();
+    for ( ; pmItr != m_pathMap.end(); ++pmItr)
+    {
+        for (int i = 0; i < pmItr->second.size(); ++i)
+        {
+            if (!pmItr->second[i].behavior)
+                continue;
+
+            // Now we check text existence and put all zero texts ids to the end of array
+
+            // Counting leading zeros for futher textid shift
+            int zeroCount = 0;
+            for (int j = 0; j < MAX_WAYPOINT_TEXT; ++j)
+            {
+                if (!pmItr->second[i].behavior->textid[j])
+                {
+                    ++zeroCount;
+                    continue;
+                }
+                else
+                {
+                    if (!objmgr.GetMangosStringLocale(pmItr->second[i].behavior->textid[j]))
+                    {
+                        sLog.outErrorDb("ERROR: Some waypoint has textid%u with not existing %u text.", j, pmItr->second[i].behavior->textid[j]);
+                        pmItr->second[i].behavior->textid[j] = 0;
+                        ++zeroCount;
+                        continue;
+                    }
+                    else
+                        ids.erase(pmItr->second[i].behavior->textid[j]);
+
+                    // Shifting check
+                    if (zeroCount)
+                    {
+                        // Correct textid but some zeros leading, so move it forward.
+                        pmItr->second[i].behavior->textid[j-zeroCount] = pmItr->second[i].behavior->textid[j];
+                        pmItr->second[i].behavior->textid[j] = 0;
+                    }
+                }
+            }
+        }
+    }
+}
Index: /trunk/src/game/Unit.cpp
===================================================================
--- /trunk/src/game/Unit.cpp (revision 288)
+++ /trunk/src/game/Unit.cpp (revision 290)
@@ -9623,4 +9623,7 @@
 void Unit::SetPower(Powers power, uint32 val)
 {
+    if(GetPower(power) == val)
+        return;
+
     uint32 maxPower = GetMaxPower(power);
     if(maxPower < val)
Index: /trunk/src/game/Player.cpp
===================================================================
--- /trunk/src/game/Player.cpp (revision 284)
+++ /trunk/src/game/Player.cpp (revision 290)
@@ -1017,4 +1017,11 @@
     CheckExploreSystem();
 
+    /*if(isCharmed())
+    {
+        if(Unit *charmer = GetCharmer())
+            if(charmer->GetTypeId() == TYPEID_UNIT && ((Creature*)charmer)->AI())
+                ((Creature*)charmer)->AI()->UpdateCharmedAI(this, p_time);
+    }*/
+
     // Update items that have just a limited lifetime
     if (now>m_Last_tick)
@@ -5267,4 +5274,8 @@
         y = GetPositionY();
         z = GetPositionZ();
+
+        // group update
+        if(GetGroup() && (old_x != x || old_y != y))
+            SetGroupUpdateFlag(GROUP_UPDATE_FLAG_POSITION);
     }
 
@@ -5273,8 +5284,4 @@
 
     CheckExploreSystem();
-
-    // group update
-    if(GetGroup())
-        SetGroupUpdateFlag(GROUP_UPDATE_FLAG_POSITION);
 
     return true;
Index: /trunk/src/game/WaypointManager.h
===================================================================
--- /trunk/src/game/WaypointManager.h (revision 279)
+++ /trunk/src/game/WaypointManager.h (revision 290)
@@ -79,4 +79,5 @@
         void SetNodePosition(uint32 id, uint32 point, float x, float y, float z);
         void SetNodeText(uint32 id, uint32 point, const char *text_field, const char *text);
+        void CheckTextsExistance(std::set<int32>& ids);
 
     private:
Index: /trunk/src/game/ObjectMgr.cpp
===================================================================
--- /trunk/src/game/ObjectMgr.cpp (revision 279)
+++ /trunk/src/game/ObjectMgr.cpp (revision 290)
@@ -45,4 +45,5 @@
 #include "SpellAuras.h"
 #include "Util.h"
+#include "WaypointManager.h"
 
 INSTANTIATE_SINGLETON_1(ObjectMgr);
@@ -7472,4 +7473,6 @@
     CheckScripts(sEventScripts,ids);
 
+    WaypointMgr.CheckTextsExistance(ids);
+
     for(std::set<int32>::const_iterator itr = ids.begin(); itr != ids.end(); ++itr)
         sLog.outErrorDb( "Table `db_script_string` has unused string id  %u", *itr);
