diff --git a/src/game/Group.cpp b/src/game/Group.cpp 
index e6e01aa..39d12db 100644 
--- a/src/game/Group.cpp 
+++ b/src/game/Group.cpp 
@@ -310,6 +310,8 @@ bool Group::AddMember(const uint64 &guid, const char* name) 
  
 uint32 Group::RemoveMember(const uint64 &guid, const uint8 &method) 
 { 
+    BroadcastGroupUpdate(); 
+ 
     // remove member and change leader (if need) only if strong more 2 members _before_ member remove 
     if(GetMembersCount() > (isBGGroup() ? 1 : 2))           // in BG group case allow 1 members group 
     { 
@@ -1595,3 +1597,18 @@ void Group::_homebindIfInstance(Player *player) 
             player->m_InstanceValid = false; 
     } 
 } 
+void Group::BroadcastGroupUpdate(void) 
+{ 
+    // FG: HACK: force flags update on group leave - for values update hack 
+    // -- not very efficient but safe 
+    for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) 
+    { 
+        Player *pp = objmgr.GetPlayer(citr->guid); 
+        if(pp && pp->IsInWorld()) 
+        { 
+            pp->ForceValuesUpdateAtIndex(UNIT_FIELD_BYTES_2); 
+            pp->ForceValuesUpdateAtIndex(UNIT_FIELD_FACTIONTEMPLATE); 
+            DEBUG_LOG("-- Forced group value update for '%s'", pp->GetName()); 
+        } 
+    } 
+} 
 No newline at end of file 
diff --git a/src/game/Group.h b/src/game/Group.h 
index 478b7c5..2ccf421 100644 
--- a/src/game/Group.h 
+++ b/src/game/Group.h 
@@ -330,6 +330,10 @@ class MANGOS_DLL_SPEC Group 
         InstanceGroupBind* GetBoundInstance(uint32 mapid, uint8 difficulty); 
         BoundInstancesMap& GetBoundInstances(uint8 difficulty) { return m_boundInstances[difficulty]; } 
  
+        // FG: evil hacks 
+        void BroadcastGroupUpdate(void); 
+ 
+ 
     protected: 
         bool _addMember(const uint64 &guid, const char* name, bool isAssistant=false); 
         bool _addMember(const uint64 &guid, const char* name, bool isAssistant, uint8 group); 
diff --git a/src/game/GroupHandler.cpp b/src/game/GroupHandler.cpp 
index d1de13a..e05cb1d 100644 
--- a/src/game/GroupHandler.cpp 
+++ b/src/game/GroupHandler.cpp 
@@ -197,6 +197,8 @@ void WorldSession::HandleGroupAcceptOpcode( WorldPacket & /*recv_data*/ ) 
         return; 
  
     uint8 subgroup = group->GetMemberGroup(GetPlayer()->GetGUID()); 
+ 
+    group->BroadcastGroupUpdate(); 
 } 
  
 void WorldSession::HandleGroupDeclineOpcode( WorldPacket & /*recv_data*/ ) 
diff --git a/src/game/Object.cpp b/src/game/Object.cpp 
index c09d94c..8d37bac 100644 
--- a/src/game/Object.cpp 
+++ b/src/game/Object.cpp 
@@ -628,6 +628,31 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask 
                     else 
                         *data << (m_uint32Values[ index ] & ~UNIT_DYNFLAG_OTHER_TAGGER); 
                 } 
+                // FG: pretend that OTHER players in own group are friendly ("blue") 
+                else if(index == UNIT_FIELD_BYTES_2 || index == UNIT_FIELD_FACTIONTEMPLATE) 
+                { 
+                    bool ch = false; 
+                    if(target->GetTypeId() == TYPEID_PLAYER && GetTypeId() == TYPEID_PLAYER && target != this) 
+                    { 
+                        if(target->IsInSameGroupWith((Player*)this) || target->IsInSameRaidWith((Player*)this)) 
+                        { 
+                            if(index == UNIT_FIELD_BYTES_2) 
+                            { 
+                                DEBUG_LOG("-- VALUES_UPDATE: Sending '%s' the blue-group-fix from '%s' (flag)", target->GetName(), ((Player*)this)->GetName()); 
+                                *data << ( m_uint32Values[ index ] & (UNIT_BYTE2_FLAG_SANCTUARY << 8) ); // this flag is at uint8 offset 1 !! 
+                                ch = true; 
+                            } 
+                            else if(index == UNIT_FIELD_FACTIONTEMPLATE) 
+                            { 
+                                DEBUG_LOG("-- VALUES_UPDATE: Sending '%s' the blue-group-fix from '%s' (faction)", target->GetName(), ((Player*)this)->GetName()); 
+                                *data << uint32(35); 
+                                ch = true; 
+                            } 
+                        } 
+                    } 
+                    if(!ch) 
+                        *data << m_uint32Values[ index ]; 
+                } 
                 else 
                 { 
                     // send in current format (float as float, uint32 as uint32) 
@@ -1471,6 +1496,19 @@ Creature* WorldObject::SummonCreature(uint32 id, float x, float y, float z, floa 
     return pCreature; 
 } 
  
+void Object::ForceValuesUpdateAtIndex(uint32 i) 
+{ 
+    m_uint32Values_mirror[i] = GetUInt32Value(i) + 1; // makes server think the field changed 
+    if(m_inWorld) 
+    { 
+        if(!m_objectUpdated) 
+        { 
+            ObjectAccessor::Instance().AddUpdateObject(this); 
+            m_objectUpdated = true; 
+        } 
+    } 
+} 
+ 
 namespace MaNGOS 
 { 
     class NearUsedPosDo 
diff --git a/src/game/Object.h b/src/game/Object.h 
index cac1300..c993077 100644 
--- a/src/game/Object.h 
+++ b/src/game/Object.h 
@@ -300,6 +300,10 @@ class MANGOS_DLL_SPEC Object 
  
         virtual bool hasQuest(uint32 /* quest_id */) const { return false; } 
         virtual bool hasInvolvedQuest(uint32 /* quest_id */) const { return false; } 
+ 
+        // FG: some hacky helpers 
+        void ForceValuesUpdateAtIndex(uint32); 
+ 
     protected: 
  
         Object ( );