+ gid_t match_gid(gid_t gid, uint16 *flags_ptr)
+@@ -227,7 +232,7 @@ gid_t match_gid(gid_t gid, uint16 *flags_ptr)
+ break;
+ }
+ if (!list)
+- list = recv_add_gid(gid, NULL);
++ list = recv_add_id(&gidmap, gid, NULL);
+ last = list;
+ }
+
+@@ -320,7 +325,7 @@ uid_t recv_user_name(int f, uid_t uid)
+ free(name);
+ name = NULL;
+ }
+- node = recv_add_uid(uid, name); /* node keeps name's memory */
++ node = recv_add_id(&uidmap, uid, name); /* node keeps name's memory */
+ return node->id2;
+ }
+
+@@ -336,7 +341,7 @@ gid_t recv_group_name(int f, gid_t gid, uint16 *flags_ptr)
+ free(name);
+ name = NULL;
+ }
+- node = recv_add_gid(gid, name); /* node keeps name's memory */
++ node = recv_add_id(&gidmap, gid, name); /* node keeps name's memory */
+ if (flags_ptr && node->flags & FLAG_SKIP_GROUP)
+ *flags_ptr |= FLAG_SKIP_GROUP;
+ return node->id2;
+@@ -363,17 +368,93 @@ void recv_id_list(int f, struct file_list *flist)
+
+ /* Now convert all the uids/gids from sender values to our values. */
+ #ifdef SUPPORT_ACLS
+- if (preserve_acls && !numeric_ids)
++ if (preserve_acls && (!numeric_ids || usermap || groupmap))
+ match_acl_ids();
+ #endif
+- if (am_root && preserve_uid && !numeric_ids) {
++ if (am_root && preserve_uid && (!numeric_ids || usermap)) {
+ for (i = 0; i < flist->used; i++)
+ F_OWNER(flist->files[i]) = match_uid(F_OWNER(flist->files[i]));
+ }
+- if (preserve_gid && (!am_root || !numeric_ids)) {
++ if (preserve_gid && (!am_root || !numeric_ids || groupmap)) {
+ for (i = 0; i < flist->used; i++) {
+ F_GROUP(flist->files[i]) = match_gid(F_GROUP(flist->files[i]),
+ &flist->files[i]->flags);
+ }