diff --git a/EQ2/source/WorldServer/Entity.cpp b/EQ2/source/WorldServer/Entity.cpp
index c1d10020e..5778a4876 100644
--- a/EQ2/source/WorldServer/Entity.cpp
+++ b/EQ2/source/WorldServer/Entity.cpp
@@ -2347,23 +2347,20 @@ void Entity::RemoveSafefallSpell(LuaSpell* spell){
 		((Player*)this)->SetPlayerControlFlag(4, 32, false);
 }
 
-void Entity::UpdateGroupMemberInfo() {
-	if (!group_member_info)
+void Entity::UpdateGroupMemberInfo(bool inGroupMgrLock, bool groupMembersLocked) {
+	if (!group_member_info || group_id == 0)
 		return;
 
-	group_member_info->class_id = GetAdventureClass();
-	group_member_info->hp_max = GetTotalHP();
-	group_member_info->hp_current = GetHP();
-	group_member_info->level_max = GetLevel();
-	group_member_info->level_current = GetLevel();
-	group_member_info->name = string(GetName());
-	group_member_info->power_current = GetPower();
-	group_member_info->power_max = GetTotalPower();
-	group_member_info->race_id = GetRace();
-	if (GetZone())
-		group_member_info->zone = GetZone()->GetZoneDescription();
-	else
-		group_member_info->zone = "Unknown";
+	if(!inGroupMgrLock)
+		world.GetGroupManager()->GroupLock(__FUNCTION__, __LINE__);
+
+	PlayerGroup* group = world.GetGroupManager()->GetGroup(group_id);
+
+	if (group)
+		group->UpdateGroupMemberInfo(this, groupMembersLocked);
+
+	if(!inGroupMgrLock)
+		world.GetGroupManager()->ReleaseGroupLock(__FUNCTION__, __LINE__);
 }
 
 #include "WorldDatabase.h"
diff --git a/EQ2/source/WorldServer/Entity.h b/EQ2/source/WorldServer/Entity.h
index 7215e8dda..e391759ce 100644
--- a/EQ2/source/WorldServer/Entity.h
+++ b/EQ2/source/WorldServer/Entity.h
@@ -793,7 +793,7 @@ public:
 
 	GroupMemberInfo* GetGroupMemberInfo() { return group_member_info; }
 	void SetGroupMemberInfo(GroupMemberInfo* info) { group_member_info = info; }
-	void UpdateGroupMemberInfo();
+	void UpdateGroupMemberInfo(bool inGroupMgrLock=false, bool groupMembersLocked=false);
 
 	void CustomizeAppearance(PacketStruct* packet);
 
diff --git a/EQ2/source/WorldServer/PlayerGroups.cpp b/EQ2/source/WorldServer/PlayerGroups.cpp
index 9eefffaeb..1f1926c5c 100644
--- a/EQ2/source/WorldServer/PlayerGroups.cpp
+++ b/EQ2/source/WorldServer/PlayerGroups.cpp
@@ -62,10 +62,10 @@ bool PlayerGroup::AddMember(Entity* member) {
 		gmi->client = 0;
 
 	member->SetGroupMemberInfo(gmi);
-	member->UpdateGroupMemberInfo();
-
+	member->group_id = gmi->group_id;
 	MGroupMembers.writelock();
 	m_members.push_back(gmi);
+	member->UpdateGroupMemberInfo(true, true);
 	MGroupMembers.releasewritelock();
 
 	SendGroupUpdate();
@@ -257,14 +257,15 @@ void PlayerGroupManager::NewGroup(Entity* leader) {
 
 	// Create a new group with the valid ID we got from above
 	PlayerGroup* new_group = new PlayerGroup(m_nextGroupID);
+
+	// Add the new group to the list (need to do this first, AddMember needs ref to the PlayerGroup ptr -> UpdateGroupMemberInfo)
+	m_groups[m_nextGroupID] = new_group;
+
 	// Add the leader to the group
 	new_group->AddMember(leader);
 
 	leader->GetGroupMemberInfo()->leader = true;
 
-	// Add the new group to the list
-	m_groups[m_nextGroupID] = new_group;
-
 	MGroups.releasewritelock(__FUNCTION__, __LINE__);
 }
 
@@ -767,4 +768,32 @@ void PlayerGroup::RemoveClientReference(Client* remove) {
 		}
 	}
 	MGroupMembers.releasewritelock();
+}
+
+void PlayerGroup::UpdateGroupMemberInfo(Entity* ent, bool groupMembersLocked) {
+	Player* player = (Player*)ent;
+
+	if (!player || !player->GetGroupMemberInfo())
+		return;
+
+	if(!groupMembersLocked)
+		MGroupMembers.writelock();
+
+	GroupMemberInfo* group_member_info = player->GetGroupMemberInfo();
+	player->GetGroupMemberInfo()->class_id = player->GetAdventureClass();
+	group_member_info->hp_max = player->GetTotalHP();
+	group_member_info->hp_current = player->GetHP();
+	group_member_info->level_max = player->GetLevel();
+	group_member_info->level_current = player->GetLevel();
+	group_member_info->name = string(player->GetName());
+	group_member_info->power_current = player->GetPower();
+	group_member_info->power_max = player->GetTotalPower();
+	group_member_info->race_id = player->GetRace();
+	if (player->GetZone())
+		group_member_info->zone = player->GetZone()->GetZoneDescription();
+	else
+		group_member_info->zone = "Unknown";
+
+	if(!groupMembersLocked)
+		MGroupMembers.releasewritelock();
 }
\ No newline at end of file
diff --git a/EQ2/source/WorldServer/PlayerGroups.h b/EQ2/source/WorldServer/PlayerGroups.h
index 0bac74ed0..0bcebe650 100644
--- a/EQ2/source/WorldServer/PlayerGroups.h
+++ b/EQ2/source/WorldServer/PlayerGroups.h
@@ -84,6 +84,7 @@ public:
 	void MakeLeader(Entity* new_leader);
 
 	void RemoveClientReference(Client* remove);
+	void UpdateGroupMemberInfo(Entity* ent, bool groupMembersLocked=false);
 
 	Mutex MGroupMembers;				// Mutex for the group members
 private:
diff --git a/EQ2/source/WorldServer/World.cpp b/EQ2/source/WorldServer/World.cpp
index a1c759747..c37de074d 100644
--- a/EQ2/source/WorldServer/World.cpp
+++ b/EQ2/source/WorldServer/World.cpp
@@ -1499,7 +1499,7 @@ void World::RejoinGroup(Client* client, int32 group_id){
 			info->member = client->GetPlayer();
 			client->GetPlayer()->SetGroup(group);
 			client->GetPlayer()->SetGroupMemberInfo(info);
-			client->GetPlayer()->UpdateGroupMemberInfo();
+			client->GetPlayer()->UpdateGroupMemberInfo(true, true);
 			LogWrite(PLAYER__DEBUG, 0, "Player", "Identified group match for player %s to group id %u", name.c_str(), group_id);
 			match = true;
 			break;
diff --git a/EQ2/source/WorldServer/client.cpp b/EQ2/source/WorldServer/client.cpp
index e22096edc..4f7bd6d29 100644
--- a/EQ2/source/WorldServer/client.cpp
+++ b/EQ2/source/WorldServer/client.cpp
@@ -1338,6 +1338,7 @@ bool Client::HandlePacket(EQApplicationPacket* app) {
 		if (!IsReadyForSpawns())
 			SetReadyForSpawns(true);
 		SendCharInfo();
+		world.RejoinGroup(this, rejoin_group_id);
 		pos_update.Start();
 		quest_pos_timer.Start();
 		break;
@@ -3513,9 +3514,6 @@ void Client::Zone(ZoneServer* new_zone, bool set_coords) {
 		return;
 	}
 
-	// block out the member info for the group
-	TempRemoveGroup();
-
 	client_zoning = true;
 	LogWrite(CCLIENT__DEBUG, 0, "Client", "%s: Setting player Resurrecting to 'true'", __FUNCTION__);
 	player->SetResurrecting(true);
@@ -3543,6 +3541,9 @@ void Client::Zone(ZoneServer* new_zone, bool set_coords) {
 		world.GetGroupManager()->SendGroupUpdate(player->GetGroupMemberInfo()->group_id, this);
 	}
 
+	// block out the member info for the group
+	TempRemoveGroup();
+
 	UpdateTimeStampFlag(ZONE_UPDATE_FLAG);
 
 	if (set_coords)
@@ -8703,7 +8704,6 @@ bool Client::HandleNewLogin(int32 account_id, int32 access_code)
 				new_client_login = true;
 				GetCurrentZone()->AddClient(this); //add to zones client list
 
-				world.RejoinGroup(this, rejoin_group_id);
 				zone_list.AddClientToMap(player->GetName(), this);
 			}
 			else {