diff --git a/src/main/java/sh/libre/scim/core/AbstractScimService.java b/src/main/java/sh/libre/scim/core/AbstractScimService.java
index e32f178977e3306e6669ca52dca1bcae0922b791..53a6738b35cf0b93cbfa0439402cb25c70b7f2a7 100644
--- a/src/main/java/sh/libre/scim/core/AbstractScimService.java
+++ b/src/main/java/sh/libre/scim/core/AbstractScimService.java
@@ -45,7 +45,7 @@ public abstract class AbstractScimService<RMM extends RoleMapperModel, S extends
             return;
         }
         ResourceNode scimForCreation = toScimForCreation(roleMapperModel);
-        EntityOnRemoteScimId externalId = scimClient.create(scimForCreation);
+        EntityOnRemoteScimId externalId = scimClient.create(id, scimForCreation);
         createMapping(id, externalId);
     }
 
diff --git a/src/main/java/sh/libre/scim/core/ScimClient.java b/src/main/java/sh/libre/scim/core/ScimClient.java
index ecbdb8d822760ea5ca917b52ec5ffbce74674b41..18460562c6fda59ba73fb096177ec2d3f6615642 100644
--- a/src/main/java/sh/libre/scim/core/ScimClient.java
+++ b/src/main/java/sh/libre/scim/core/ScimClient.java
@@ -63,8 +63,13 @@ public class ScimClient<S extends ResourceNode> implements AutoCloseable {
         return new ScimClient(scimRequestBuilder, scimResourceType);
     }
 
-    public EntityOnRemoteScimId create(ResourceNode scimForCreation) {
-        Retry retry = retryRegistry.retry("create-" + scimForCreation.getId().get());
+    public EntityOnRemoteScimId create(KeycloakId id, ResourceNode scimForCreation) {
+        if (scimForCreation.getId().isPresent()) {
+            throw new IllegalArgumentException(
+                    "%s is already created on remote with id %s".formatted(id, scimForCreation.getId().get())
+            );
+        }
+        Retry retry = retryRegistry.retry("create-%s".formatted(id.asString()));
         ServerResponse<S> response = retry.executeSupplier(() -> {
             try {
                 return scimRequestBuilder
@@ -98,7 +103,7 @@ public class ScimClient<S extends ResourceNode> implements AutoCloseable {
     }
 
     public void replace(EntityOnRemoteScimId externalId, ResourceNode scimForReplace) {
-        Retry retry = retryRegistry.retry("replace-" + scimForReplace.getId().get());
+        Retry retry = retryRegistry.retry("replace-%s".formatted(externalId.asString()));
         ServerResponse<S> response = retry.executeSupplier(() -> {
             try {
                 return scimRequestBuilder
@@ -113,7 +118,7 @@ public class ScimClient<S extends ResourceNode> implements AutoCloseable {
     }
 
     public void delete(EntityOnRemoteScimId externalId) {
-        Retry retry = retryRegistry.retry("delete-" + externalId.asString());
+        Retry retry = retryRegistry.retry("delete-%s".formatted(externalId.asString()));
         ServerResponse<S> response = retry.executeSupplier(() -> {
             try {
                 return scimRequestBuilder.delete(getResourceClass(), getScimEndpoint(), externalId.asString())