diff --git a/user_migrate.sh b/user_migrate.sh
new file mode 100755
index 0000000000000000000000000000000000000000..8861e2110a89063e33c914dc4496d2b3ca970ca2
--- /dev/null
+++ b/user_migrate.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+
+group_options=(gpfs4 gpfs5)
+gpfs4_home="/gpfs4/data/user/home"
+gpfs5_home="/gpfs5/data/user/home"
+
+user=$1
+group_to=$2
+
+if [[ -z "${group_to}" ]]; then
+  echo "Usage: $0 USER TARGET_GROUP"
+  exit 1
+elif [[ ! " ${group_options[*]} " =~ [[:space:]]${group_to}[[:space:]] ]]; then
+  echo "Invalid target group"
+  echo "Available options: ${group_options[*]}, got ${group_to}"
+  exit 1
+fi
+
+if ! getent passwd "$user" > /dev/null 2>&1; then
+  echo "The user $user does not exist"
+  exit 1
+fi
+
+cd /cm/shared/rabbitmq_agents || exit
+source venv/bin/activate
+
+if [[ "$group_to" == "gpfs4" ]]; then
+  group_from=gpfs5
+  dir_from="$gpfs5_home/$user/"
+  dir_to="$gpfs4_home/$user"
+else
+  group_from=gpfs4
+  dir_from="$gpfs4_home/$user/"
+  dir_to="$gpfs5_home/$user"
+fi
+
+if [[ -d "/$group_from/data/user/home/$user" ]]; then
+  ./account_manager.py "$user" hold
+
+  rsync -a --delete "$dir_from" "$dir_to"
+
+  ./group_manager.py "$user" -g "$group_to"
+  ./group_manager.py "$user" -d -g "$group_from"
+
+  ./account_manager.py "$user" ok
+else
+  echo User home directory does not exist.
+  exit 1
+fi