diff --git a/modules/client/sync/rooms/state.cc b/modules/client/sync/rooms/state.cc
index a2a4bbc80..12c256c78 100644
--- a/modules/client/sync/rooms/state.cc
+++ b/modules/client/sync/rooms/state.cc
@@ -294,7 +294,7 @@ ircd::m::sync::room_state_phased_events(data &data)
 		*data.out, "events"
 	};
 
-	static const std::pair<string_view, string_view> keys[]
+	const std::pair<string_view, string_view> keys[]
 	{
 		{ "m.room.create",           ""                        },
 		{ "m.room.canonical_alias",  ""                        },
@@ -344,47 +344,59 @@ bool
 ircd::m::sync::room_state_phased_member_events(data &data,
                                                json::stack::array &array)
 {
-	static const auto count{10}, bufsz{48}, limit{10};
+	static const auto count{20}, bufsz{32}, limit{20};
+
+	size_t i(0), ret(0);
 	std::array<char[bufsz], count> buf;
 	std::array<string_view, count> last;
-	size_t i(0), ret(0);
+	const auto already
+	{
+		[&last, &ret](const string_view &sender) -> bool
+		{
+			return std::any_of(begin(last), begin(last)+ret, [&sender]
+			(const auto &last)
+			{
+				return startswith(last, sender);
+			});
+		}
+	};
+
 	m::room::messages it
 	{
 		*data.room
 	};
 
-	const auto already{[&last, &ret]
-	(const string_view &sender) -> bool
-	{
-		return std::any_of(begin(last), begin(last)+ret, [&sender]
-		(const auto &last)
-		{
-			return startswith(last, sender);
-		});
-	}};
-
 	for(; it && ret < count && i < limit; --it, ++i)
-	{
-		const auto &event_idx(it.event_idx());
-		m::get(std::nothrow, event_idx, "sender", [&]
+		m::get(std::nothrow, it.event_idx(), "sender", [&]
 		(const auto &sender)
 		{
 			if(already(sender))
 				return;
 
+			const auto sender_idx
+			{
+				data.room->get(std::nothrow, "m.room.member", sender)
+			};
+
+			if(!sender_idx)
+				return;
+
+			// check if this is an m.room.member event in the timeline.
+			if(sender_idx == it.event_idx())
+				return;
+
 			const m::event::fetch event
 			{
-				event_idx, std::nothrow
+				sender_idx, std::nothrow
 			};
 
 			if(!event.valid)
 				return;
 
 			last.at(ret) = strlcpy(buf.at(ret), sender);
-			room_state_append(data, array, event, event_idx);
+			room_state_append(data, array, event, sender_idx);
 			++ret;
 		});
-	};
 
 	return ret;
 }