diff --git a/syncapi/synctypes/clientevent.go b/syncapi/synctypes/clientevent.go
index 0c332fb72..3abb9c350 100644
--- a/syncapi/synctypes/clientevent.go
+++ b/syncapi/synctypes/clientevent.go
@@ -173,99 +173,120 @@ func ToClientEvent(se gomatrixserverlib.PDU, format ClientEventFormat, userIDFor
 
 	if format != FormatSyncFederation {
 		if se.Version() == gomatrixserverlib.RoomVersionPseudoIDs {
-			ce.SenderKey = se.SenderID()
-
-			validRoomID, err := spec.NewRoomID(se.RoomID())
+			err := updatePseudoIDs(&ce, se, userIDForSender, format)
 			if err != nil {
 				return nil, err
 			}
-			userID, err := userIDForSender(*validRoomID, se.SenderID())
-			if err == nil && userID != nil {
-				ce.Sender = userID.String()
-			}
-
-			sk := se.StateKey()
-			if sk != nil && *sk != "" {
-				skUserID, err := userIDForSender(*validRoomID, spec.SenderID(*sk))
-				if err == nil && skUserID != nil {
-					skString := skUserID.String()
-					ce.StateKey = &skString
-				}
-			}
-
-			var prev PrevEventRef
-			if err := json.Unmarshal(se.Unsigned(), &prev); err == nil && prev.PrevSenderID != "" {
-				prevUserID, err := userIDForSender(*validRoomID, spec.SenderID(prev.PrevSenderID))
-				if err == nil && userID != nil {
-					prev.PrevSenderID = prevUserID.String()
-				} else {
-					errString := "userID unknown"
-					if err != nil {
-						errString = err.Error()
-					}
-					logrus.Warnf("Failed to find userID for prev_sender in ClientEvent: %s", errString)
-					// NOTE: Not much can be done here, so leave the previous value in place.
-				}
-				ce.Unsigned, err = json.Marshal(prev)
-				if err != nil {
-					err = fmt.Errorf("Failed to marshal unsigned content for ClientEvent: %s", err.Error())
-					return nil, err
-				}
-			}
-
-			// TODO: Refactor all this stuff
-			if se.Type() == spec.MRoomCreate {
-				if creator := gjson.GetBytes(se.Content(), "creator"); creator.Exists() {
-					oldCreator := creator.Str
-					userID, err := userIDForSender(*validRoomID, spec.SenderID(oldCreator))
-					if err != nil {
-						err = fmt.Errorf("Failed to find userID for creator in ClientEvent: %s", err.Error())
-						return nil, err
-					}
-
-					if userID != nil {
-						var newCreatorBytes, newContent []byte
-						newCreatorBytes, err = json.Marshal(userID.String())
-						if err != nil {
-							err = fmt.Errorf("Failed to marshal new creator for ClientEvent: %s", err.Error())
-							return nil, err
-						}
-						newContent, err = sjson.SetRawBytes([]byte(se.Content()), "creator", newCreatorBytes)
-						if err != nil {
-							err = fmt.Errorf("Failed to set new creator for ClientEvent: %s", err.Error())
-							return nil, err
-						}
-
-						ce.Content = newContent
-					}
-				}
-			}
-
-			if se.Type() == spec.MRoomMember {
-				updatedEvent, err := updateInviteRoomState(userIDForSender, se, format)
-				if err != nil {
-					err = fmt.Errorf("Failed to update m.room.member event for ClientEvent: %s", err.Error())
-					return nil, err
-				}
-				ce.Unsigned = updatedEvent.Unsigned()
-			}
-
-			if se.Type() == spec.MRoomPowerLevels && se.StateKeyEquals("") {
-				se, err = updatePowerLevelEvent(userIDForSender, se, format)
-				if err != nil {
-					err = fmt.Errorf("Failed update power levels for ClientEvent: %s", err.Error())
-					return nil, err
-				}
-				ce.Content = se.Content()
-				ce.Unsigned = se.Unsigned()
-			}
 		}
 	}
 
 	return &ce, nil
 }
 
-func updateInviteRoomState(userIDForSender spec.UserIDForSender, ev gomatrixserverlib.PDU, eventFormat ClientEventFormat) (gomatrixserverlib.PDU, error) {
+func updatePseudoIDs(ce *ClientEvent, se gomatrixserverlib.PDU, userIDForSender spec.UserIDForSender, format ClientEventFormat) error {
+	ce.SenderKey = se.SenderID()
+
+	validRoomID, err := spec.NewRoomID(se.RoomID())
+	if err != nil {
+		return err
+	}
+	userID, err := userIDForSender(*validRoomID, se.SenderID())
+	if err == nil && userID != nil {
+		ce.Sender = userID.String()
+	}
+
+	sk := se.StateKey()
+	if sk != nil && *sk != "" {
+		skUserID, err := userIDForSender(*validRoomID, spec.SenderID(*sk))
+		if err == nil && skUserID != nil {
+			skString := skUserID.String()
+			ce.StateKey = &skString
+		}
+	}
+
+	var prev PrevEventRef
+	if err := json.Unmarshal(se.Unsigned(), &prev); err == nil && prev.PrevSenderID != "" {
+		prevUserID, err := userIDForSender(*validRoomID, spec.SenderID(prev.PrevSenderID))
+		if err == nil && userID != nil {
+			prev.PrevSenderID = prevUserID.String()
+		} else {
+			errString := "userID unknown"
+			if err != nil {
+				errString = err.Error()
+			}
+			logrus.Warnf("Failed to find userID for prev_sender in ClientEvent: %s", errString)
+			// NOTE: Not much can be done here, so leave the previous value in place.
+		}
+		ce.Unsigned, err = json.Marshal(prev)
+		if err != nil {
+			err = fmt.Errorf("Failed to marshal unsigned content for ClientEvent: %s", err.Error())
+			return err
+		}
+	}
+
+	switch se.Type() {
+	case spec.MRoomCreate:
+		updatedContent, err := updateCreateEvent(se.Content(), userIDForSender, *validRoomID)
+		if err != nil {
+			err = fmt.Errorf("Failed to update m.room.create event for ClientEvent: %s", err.Error())
+			return err
+		}
+		ce.Content = updatedContent
+	case spec.MRoomMember:
+		updatedEvent, err := updateInviteEvent(userIDForSender, se, format)
+		if err != nil {
+			err = fmt.Errorf("Failed to update m.room.member event for ClientEvent: %s", err.Error())
+			return err
+		}
+		if updatedEvent != nil {
+			ce.Unsigned = updatedEvent.Unsigned()
+		}
+	case spec.MRoomPowerLevels:
+		updatedEvent, err := updatePowerLevelEvent(userIDForSender, se, format)
+		if err != nil {
+			err = fmt.Errorf("Failed update m.room.power_levels event for ClientEvent: %s", err.Error())
+			return err
+		}
+		if updatedEvent != nil {
+			ce.Content = updatedEvent.Content()
+			ce.Unsigned = updatedEvent.Unsigned()
+		}
+	}
+
+	return nil
+}
+
+func updateCreateEvent(content spec.RawJSON, userIDForSender spec.UserIDForSender, roomID spec.RoomID) (spec.RawJSON, error) {
+	if creator := gjson.GetBytes(content, "creator"); creator.Exists() {
+		oldCreator := creator.Str
+		userID, err := userIDForSender(roomID, spec.SenderID(oldCreator))
+		if err != nil {
+			err = fmt.Errorf("Failed to find userID for creator in ClientEvent: %s", err.Error())
+			return nil, err
+		}
+
+		if userID != nil {
+			var newCreatorBytes, newContent []byte
+			newCreatorBytes, err = json.Marshal(userID.String())
+			if err != nil {
+				err = fmt.Errorf("Failed to marshal new creator for ClientEvent: %s", err.Error())
+				return nil, err
+			}
+
+			newContent, err = sjson.SetRawBytes([]byte(content), "creator", newCreatorBytes)
+			if err != nil {
+				err = fmt.Errorf("Failed to set new creator for ClientEvent: %s", err.Error())
+				return nil, err
+			}
+
+			return newContent, nil
+		}
+	}
+
+	return content, nil
+}
+
+func updateInviteEvent(userIDForSender spec.UserIDForSender, ev gomatrixserverlib.PDU, eventFormat ClientEventFormat) (gomatrixserverlib.PDU, error) {
 	if inviteRoomState := gjson.GetBytes(ev.Unsigned(), "invite_room_state"); inviteRoomState.Exists() {
 		validRoomID, err := spec.NewRoomID(ev.RoomID())
 		if err != nil {
@@ -335,27 +356,12 @@ func getUpdatedInviteRoomState(userIDForSender spec.UserIDForSender, inviteRoomS
 				}
 			}
 
-			if creator := gjson.GetBytes(ev.Content, "creator"); creator.Exists() {
-				oldCreator := creator.Str
-				userID, err := userIDForSender(*validRoomID, spec.SenderID(oldCreator))
-				if err != nil {
-					return nil, err
-				}
-
-				if userID != nil {
-					var newCreatorBytes, newContent []byte
-					newCreatorBytes, err = json.Marshal(userID.String())
-					if err != nil {
-						return nil, err
-					}
-					newContent, err = sjson.SetRawBytes([]byte(ev.Content), "creator", newCreatorBytes)
-					if err != nil {
-						return nil, err
-					}
-
-					inviteStateEvents[i].Content = newContent
-				}
+			updatedContent, err := updateCreateEvent(ev.Content, userIDForSender, *validRoomID)
+			if err != nil {
+				err = fmt.Errorf("Failed to update m.room.create event for ClientEvent: %s", err.Error())
+				return nil, err
 			}
+			inviteStateEvents[i].Content = updatedContent
 		}
 	}
 
@@ -368,6 +374,10 @@ func getUpdatedInviteRoomState(userIDForSender spec.UserIDForSender, inviteRoomS
 }
 
 func updatePowerLevelEvent(userIDForSender spec.UserIDForSender, se gomatrixserverlib.PDU, eventFormat ClientEventFormat) (gomatrixserverlib.PDU, error) {
+	if !se.StateKeyEquals("") {
+		return se, nil
+	}
+
 	pls, err := gomatrixserverlib.NewPowerLevelContentFromEvent(se)
 	if err != nil {
 		return nil, err