Merge pull request #118 from apache/rename-provider

Rename Provider to Repository
diff --git a/README.md b/README.md
index fc12e37..e1869de 100644
--- a/README.md
+++ b/README.md
@@ -106,10 +106,10 @@
 
 This example shows how an extension is declared at the class level, but also provides an example of how complex SCIM types can be simply defined as suitably annotated inner classes.
 
-Implementations are fully customizable without altering the core server code. The example below shows how the implementation for a provider is declared:
+Implementations are fully customizable without altering the core server code. The example below shows how the implementation for a repository is declared:
 
 ```java
-public class InMemoryUserService implements Provider<ScimUser> {
+public class InMemoryUserService implements Respository<ScimUser> {
 ```
 
-Implementing the provider interface allows the customization of create, retrieve, update, and delete methods (as well as find).  Customization is flexible - if your system implements soft deletes, create a delete method that simply sets a flag and alter the find and retrieve methods to only return "undeleted" resources.
+Implementing the repository interface allows the customization of create, retrieve, update, and delete methods (as well as find).  Customization is flexible - if your system implements soft deletes, create a delete method that simply sets a flag and alter the find and retrieve methods to only return "undeleted" resources.
diff --git a/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemoryGroupService.java b/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemoryGroupService.java
index 0d0c883..7f4ae69 100644
--- a/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemoryGroupService.java
+++ b/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemoryGroupService.java
@@ -21,8 +21,8 @@
 
 import jakarta.annotation.PostConstruct;
 import org.apache.directory.scim.server.exception.UnableToUpdateResourceException;
-import org.apache.directory.scim.server.provider.Provider;
-import org.apache.directory.scim.server.provider.UpdateRequest;
+import org.apache.directory.scim.server.repository.Repository;
+import org.apache.directory.scim.server.repository.UpdateRequest;
 import org.apache.directory.scim.spec.protocol.filter.FilterResponse;
 import org.apache.directory.scim.spec.protocol.search.Filter;
 import org.apache.directory.scim.spec.protocol.search.PageRequest;
@@ -40,7 +40,7 @@
 
 @Named
 @ApplicationScoped
-public class InMemoryGroupService implements Provider<ScimGroup> {
+public class InMemoryGroupService implements Repository<ScimGroup> {
 
   private final Map<String, ScimGroup> groups = new HashMap<>();
 
diff --git a/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemorySelfResolverImpl.java b/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemorySelfResolverImpl.java
index c7e4240..1d19096 100644
--- a/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemorySelfResolverImpl.java
+++ b/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemorySelfResolverImpl.java
@@ -21,7 +21,7 @@
 
 import jakarta.enterprise.context.ApplicationScoped;
 import org.apache.directory.scim.server.exception.UnableToResolveIdResourceException;
-import org.apache.directory.scim.server.provider.SelfIdResolver;
+import org.apache.directory.scim.server.repository.SelfIdResolver;
 
 import java.security.Principal;
 
diff --git a/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemoryUserService.java b/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemoryUserService.java
index 2eb541c..971a248 100644
--- a/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemoryUserService.java
+++ b/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemoryUserService.java
@@ -30,8 +30,8 @@
 
 import org.apache.directory.scim.example.jersey.extensions.LuckyNumberExtension;
 import org.apache.directory.scim.server.exception.UnableToUpdateResourceException;
-import org.apache.directory.scim.server.provider.Provider;
-import org.apache.directory.scim.server.provider.UpdateRequest;
+import org.apache.directory.scim.server.repository.Repository;
+import org.apache.directory.scim.server.repository.UpdateRequest;
 import org.apache.directory.scim.spec.protocol.filter.FilterResponse;
 import org.apache.directory.scim.spec.protocol.search.Filter;
 import org.apache.directory.scim.spec.protocol.search.PageRequest;
@@ -42,14 +42,14 @@
 import org.apache.directory.scim.spec.resources.ScimUser;
 
 /**
- * Creates a singleton (effectively) Provider<User> with a memory-based
+ * Creates a singleton (effectively) Repository<ScimUser> with a memory-based
  * persistence layer.
  * 
  * @author Chris Harm &lt;crh5255@psu.edu&gt;
  */
 @Named
 @ApplicationScoped
-public class InMemoryUserService implements Provider<ScimUser> {
+public class InMemoryUserService implements Repository<ScimUser> {
   
   static final String DEFAULT_USER_ID = "1";
   static final String DEFAULT_USER_EXTERNAL_ID = "e" + DEFAULT_USER_ID;
@@ -88,7 +88,7 @@
   }
 
   /**
-   * @see Provider#create(ScimResource)
+   * @see Repository#create(ScimResource)
    */
   @Override
   public ScimUser create(ScimUser resource) {
@@ -106,7 +106,7 @@
   }
 
   /**
-   * @see Provider#update(UpdateRequest)
+   * @see Repository#update(UpdateRequest)
    */
   @Override
   public ScimUser update(UpdateRequest<ScimUser> updateRequest) throws UnableToUpdateResourceException {
@@ -117,7 +117,7 @@
   }
 
   /**
-   * @see Provider#get(java.lang.String)
+   * @see Repository#get(java.lang.String)
    */
   @Override
   public ScimUser get(String id) {
@@ -125,7 +125,7 @@
   }
 
   /**
-   * @see Provider#delete(java.lang.String)
+   * @see Repository#delete(java.lang.String)
    */
   @Override
   public void delete(String id) {
@@ -133,7 +133,7 @@
   }
 
   /**
-   * @see Provider#find(Filter, PageRequest, SortRequest)
+   * @see Repository#find(Filter, PageRequest, SortRequest)
    */
   @Override
   public FilterResponse<ScimUser> find(Filter filter, PageRequest pageRequest, SortRequest sortRequest) {
@@ -141,7 +141,7 @@
   }
 
   /**
-   * @see Provider#getExtensionList()
+   * @see Repository#getExtensionList()
    */
   @Override
   public List<Class<? extends ScimExtension>> getExtensionList() {
diff --git a/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemoryGroupService.java b/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemoryGroupService.java
index ec49bad..e2d2e0e 100644
--- a/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemoryGroupService.java
+++ b/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemoryGroupService.java
@@ -21,8 +21,8 @@
 
 import jakarta.annotation.PostConstruct;
 import org.apache.directory.scim.server.exception.UnableToUpdateResourceException;
-import org.apache.directory.scim.server.provider.Provider;
-import org.apache.directory.scim.server.provider.UpdateRequest;
+import org.apache.directory.scim.server.repository.Repository;
+import org.apache.directory.scim.server.repository.UpdateRequest;
 import org.apache.directory.scim.spec.protocol.filter.FilterResponse;
 import org.apache.directory.scim.spec.protocol.search.Filter;
 import org.apache.directory.scim.spec.protocol.search.PageRequest;
@@ -40,7 +40,7 @@
 
 @Named
 @ApplicationScoped
-public class InMemoryGroupService implements Provider<ScimGroup> {
+public class InMemoryGroupService implements Repository<ScimGroup> {
 
   private final Map<String, ScimGroup> groups = new HashMap<>();
 
diff --git a/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemorySelfResolverImpl.java b/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemorySelfResolverImpl.java
index 414ff76..96019d3 100644
--- a/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemorySelfResolverImpl.java
+++ b/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemorySelfResolverImpl.java
@@ -21,7 +21,7 @@
 
 import jakarta.enterprise.context.ApplicationScoped;
 import org.apache.directory.scim.server.exception.UnableToResolveIdResourceException;
-import org.apache.directory.scim.server.provider.SelfIdResolver;
+import org.apache.directory.scim.server.repository.SelfIdResolver;
 
 import java.security.Principal;
 
diff --git a/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemoryUserService.java b/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemoryUserService.java
index b60c399..e9a378e 100644
--- a/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemoryUserService.java
+++ b/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemoryUserService.java
@@ -30,8 +30,8 @@
 
 import org.apache.directory.scim.example.memory.extensions.LuckyNumberExtension;
 import org.apache.directory.scim.server.exception.UnableToUpdateResourceException;
-import org.apache.directory.scim.server.provider.Provider;
-import org.apache.directory.scim.server.provider.UpdateRequest;
+import org.apache.directory.scim.server.repository.Repository;
+import org.apache.directory.scim.server.repository.UpdateRequest;
 import org.apache.directory.scim.spec.protocol.filter.FilterResponse;
 import org.apache.directory.scim.spec.protocol.search.Filter;
 import org.apache.directory.scim.spec.protocol.search.PageRequest;
@@ -42,14 +42,14 @@
 import org.apache.directory.scim.spec.resources.ScimUser;
 
 /**
- * Creates a singleton (effectively) Provider<User> with a memory-based
+ * Creates a singleton (effectively) Repository<ScimUser> with a memory-based
  * persistence layer.
  * 
  * @author Chris Harm &lt;crh5255@psu.edu&gt;
  */
 @Named
 @ApplicationScoped
-public class InMemoryUserService implements Provider<ScimUser> {
+public class InMemoryUserService implements Repository<ScimUser> {
   
   static final String DEFAULT_USER_ID = "1";
   static final String DEFAULT_USER_EXTERNAL_ID = "e" + DEFAULT_USER_ID;
@@ -88,7 +88,7 @@
   }
 
   /**
-   * @see Provider#create(ScimResource)
+   * @see Repository#create(ScimResource)
    */
   @Override
   public ScimUser create(ScimUser resource) {
@@ -106,7 +106,7 @@
   }
 
   /**
-   * @see Provider#update(UpdateRequest)
+   * @see Repository#update(UpdateRequest)
    */
   @Override
   public ScimUser update(UpdateRequest<ScimUser> updateRequest) throws UnableToUpdateResourceException {
@@ -117,7 +117,7 @@
   }
 
   /**
-   * @see Provider#get(java.lang.String)
+   * @see Repository#get(java.lang.String)
    */
   @Override
   public ScimUser get(String id) {
@@ -125,7 +125,7 @@
   }
 
   /**
-   * @see Provider#delete(java.lang.String)
+   * @see Repository#delete(java.lang.String)
    */
   @Override
   public void delete(String id) {
@@ -133,7 +133,7 @@
   }
 
   /**
-   * @see Provider#find(Filter, PageRequest, SortRequest)
+   * @see Repository#find(Filter, PageRequest, SortRequest)
    */
   @Override
   public FilterResponse<ScimUser> find(Filter filter, PageRequest pageRequest, SortRequest sortRequest) {
@@ -141,7 +141,7 @@
   }
 
   /**
-   * @see Provider#getExtensionList()
+   * @see Repository#getExtensionList()
    */
   @Override
   public List<Class<? extends ScimExtension>> getExtensionList() {
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/exception/InvalidProviderException.java b/scim-server/src/main/java/org/apache/directory/scim/server/exception/InvalidRepositoryException.java
similarity index 88%
rename from scim-server/src/main/java/org/apache/directory/scim/server/exception/InvalidProviderException.java
rename to scim-server/src/main/java/org/apache/directory/scim/server/exception/InvalidRepositoryException.java
index f2c8ef5..08014f3 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/exception/InvalidProviderException.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/exception/InvalidRepositoryException.java
@@ -19,8 +19,8 @@
 
 package org.apache.directory.scim.server.exception;
 
-public class InvalidProviderException extends Exception {
-  public InvalidProviderException(String what) {
+public class InvalidRepositoryException extends Exception {
+  public InvalidRepositoryException(String what) {
     super(what);
   }
 }
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/provider/PrioritySortingComparitor.java b/scim-server/src/main/java/org/apache/directory/scim/server/repository/PrioritySortingComparitor.java
similarity index 96%
rename from scim-server/src/main/java/org/apache/directory/scim/server/provider/PrioritySortingComparitor.java
rename to scim-server/src/main/java/org/apache/directory/scim/server/repository/PrioritySortingComparitor.java
index f1699bf..0b46c46 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/provider/PrioritySortingComparitor.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/repository/PrioritySortingComparitor.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.provider;
+package org.apache.directory.scim.server.repository;
 
 import java.util.Comparator;
 import java.util.Set;
@@ -65,4 +65,4 @@
       return obj.toString();
     }
   }
-}
\ No newline at end of file
+}
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/provider/ReflectionUtils.java b/scim-server/src/main/java/org/apache/directory/scim/server/repository/ReflectionUtils.java
similarity index 96%
rename from scim-server/src/main/java/org/apache/directory/scim/server/provider/ReflectionUtils.java
rename to scim-server/src/main/java/org/apache/directory/scim/server/repository/ReflectionUtils.java
index 7ebb82b..ae9ce8c 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/provider/ReflectionUtils.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/repository/ReflectionUtils.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.provider;
+package org.apache.directory.scim.server.repository;
 
 import java.lang.reflect.Field;
 import java.util.ArrayList;
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/provider/Provider.java b/scim-server/src/main/java/org/apache/directory/scim/server/repository/Repository.java
similarity index 91%
rename from scim-server/src/main/java/org/apache/directory/scim/server/provider/Provider.java
rename to scim-server/src/main/java/org/apache/directory/scim/server/repository/Repository.java
index a6ab223..e3cc7da 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/provider/Provider.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/repository/Repository.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.provider;
+package org.apache.directory.scim.server.repository;
 
 import java.util.List;
 
@@ -40,17 +40,17 @@
 
 /**
  * Defines the interface between the SCIM protocol implementation and the
- * Provider implementation for type T.
+ * Repository implementation for type T.
  * 
  * @author Chris Harm &lt;crh5255@psu.edu&gt;
  *
  * @param <T> a SCIM ResourceType that extends ScimResource
  */
-public interface Provider<T extends ScimResource> {
+public interface Repository<T extends ScimResource> {
 
   /**
-   * Returns the type of ScimResource this provider manages.
-   * @return The type of resource this provider manages.
+   * Returns the type of ScimResource this repository manages.
+   * @return The type of resource this repository manages.
    */
   Class<T> getResourceClass();
 
@@ -119,18 +119,18 @@
   void delete(String id) throws UnableToDeleteResourceException;
 
   /**
-   * Returns a list of the SCIM Extensions that this provider considers to be
+   * Returns a list of the SCIM Extensions that this repository considers to be
    * associated with the ScimResource of type T.
    * 
    * @return A list of ScimExtension classes.
-   * @throws UnableToRetrieveExtensionsResourceException If the provider cannot return
+   * @throws UnableToRetrieveExtensionsResourceException If the repository cannot return
    *         the appropriate list.
    */
   List<Class<? extends ScimExtension>> getExtensionList() throws UnableToRetrieveExtensionsResourceException;
 
   /**
-   * <p>In the case where the provider throws an unhandled exception, this
-   * method will be passed that exception in order for the provider to convert
+   * <p>In the case where the repository throws an unhandled exception, this
+   * method will be passed that exception in order for the repository to convert
    * it into the desired response.</p>
    * <p>The returned response SHOULD fulfill the requirements for SCIM error
    * responses as defined in <a
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/provider/ProviderRegistry.java b/scim-server/src/main/java/org/apache/directory/scim/server/repository/RepositoryRegistry.java
similarity index 82%
rename from scim-server/src/main/java/org/apache/directory/scim/server/provider/ProviderRegistry.java
rename to scim-server/src/main/java/org/apache/directory/scim/server/repository/RepositoryRegistry.java
index 1ad3f73..57248a6 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/provider/ProviderRegistry.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/repository/RepositoryRegistry.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.provider;
+package org.apache.directory.scim.server.repository;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.ParameterizedType;
@@ -36,9 +36,9 @@
 import jakarta.xml.bind.annotation.XmlEnumValue;
 
 import org.apache.directory.scim.server.ScimConfiguration;
-import org.apache.directory.scim.server.exception.InvalidProviderException;
+import org.apache.directory.scim.server.exception.InvalidRepositoryException;
 import org.apache.directory.scim.server.exception.UnableToRetrieveExtensionsResourceException;
-import org.apache.directory.scim.server.schema.Registry;
+import org.apache.directory.scim.server.schema.SchemaRegistry;
 import org.apache.directory.scim.spec.annotation.ScimAttribute;
 import org.apache.directory.scim.spec.annotation.ScimExtensionType;
 import org.apache.directory.scim.spec.annotation.ScimResourceIdReference;
@@ -63,7 +63,7 @@
 @Data
 @Slf4j
 @ApplicationScoped
-public class ProviderRegistry implements ScimConfiguration {
+public class RepositoryRegistry implements ScimConfiguration {
 
   private static final String STRING_TYPE_IDENTIFIER = "class java.lang.String";
   private static final String CHARACTER_ARRAY_TYPE_IDENTIFIER = "class [C";
@@ -83,53 +83,53 @@
   private static final String BYTE_ARRAY_TYPE_IDENTIFIER = "class [B";
   private static final String RESOURCE_REFERENCE_TYPE_IDENTIFIER = "class org.apache.directory.scim.spec.schema.ResourceReference$ReferenceType";
 
-  private Registry registry;
+  private SchemaRegistry schemaRegistry;
 
   private ScimExtensionRegistry scimExtensionRegistry;
 
-  // Weld needs the '? extends' or the providers will not be found, some CDI
+  // Weld needs the '? extends' or the repositories will not be found, some CDI
   // implementations work fine with just <ScimResources>
-  private Instance<Provider<? extends ScimResource>> scimProviderInstances;
+  private Instance<Repository<? extends ScimResource>> scimRepositoryInstances;
 
-  private Map<Class<? extends ScimResource>, Provider<? extends ScimResource>> providerMap = new HashMap<>();
+  private Map<Class<? extends ScimResource>, Repository<? extends ScimResource>> repositoryMap = new HashMap<>();
 
   @Inject
-  public ProviderRegistry(Registry registry, ScimExtensionRegistry scimExtensionRegistry, Instance<Provider<? extends ScimResource>> scimProviderInstances) {
-    this.registry = registry;
+  public RepositoryRegistry(SchemaRegistry schemaRegistry, ScimExtensionRegistry scimExtensionRegistry, Instance<Repository<? extends ScimResource>> scimRepositoryInstances) {
+    this.schemaRegistry = schemaRegistry;
     this.scimExtensionRegistry = scimExtensionRegistry;
-    this.scimProviderInstances = scimProviderInstances;
+    this.scimRepositoryInstances = scimRepositoryInstances;
   }
 
-  ProviderRegistry() {}
+  RepositoryRegistry() {}
 
   @Override
   @SuppressWarnings("unchecked")
   public void configure() {
-    scimProviderInstances.stream()
-      .map(provider -> (Provider<ScimResource>) provider)
-      .forEach(provider -> {
+    scimRepositoryInstances.stream()
+      .map(repository -> (Repository<ScimResource>) repository)
+      .forEach(repository -> {
       try {
-        registerProvider(provider.getResourceClass(), provider);
-      } catch (InvalidProviderException | JsonProcessingException | UnableToRetrieveExtensionsResourceException e) {
-        throw new ScimResourceInvalidException("Failed to register provider " + provider.getClass() + " for ScimResource type " + provider.getResourceClass(), e);
+        registerRepository(repository.getResourceClass(), repository);
+      } catch (InvalidRepositoryException | JsonProcessingException | UnableToRetrieveExtensionsResourceException e) {
+        throw new ScimResourceInvalidException("Failed to register repository " + repository.getClass() + " for ScimResource type " + repository.getResourceClass(), e);
       }
     });
   }
 
-  public synchronized <T extends ScimResource> void registerProvider(Class<T> clazz, Provider<T> provider) throws InvalidProviderException, JsonProcessingException, UnableToRetrieveExtensionsResourceException {
+  public synchronized <T extends ScimResource> void registerRepository(Class<T> clazz, Repository<T> repository) throws InvalidRepositoryException, JsonProcessingException, UnableToRetrieveExtensionsResourceException {
 
-    ResourceType resourceType = generateResourceType(clazz, provider);
+    ResourceType resourceType = generateResourceType(clazz, repository);
 
     log.info("Calling addSchema on the base class: {}", clazz);
-    registry.addSchema(generateBaseSchema(clazz));
+    schemaRegistry.addSchema(generateBaseSchema(clazz));
     // NOTE generateResourceType() ensures ScimResourceType exists
     ScimResourceType scimResourceType = clazz.getAnnotation(ScimResourceType.class);
     String schemaUrn = scimResourceType.schema();
     String endpoint = scimResourceType.endpoint();
-    registry.addScimResourceSchemaUrn(schemaUrn, clazz);
-    registry.addScimResourceEndPoint(endpoint, clazz);
+    schemaRegistry.addScimResourceSchemaUrn(schemaUrn, clazz);
+    schemaRegistry.addScimResourceEndPoint(endpoint, clazz);
 
-    List<Class<? extends ScimExtension>> extensionList = provider.getExtensionList();
+    List<Class<? extends ScimExtension>> extensionList = repository.getExtensionList();
 
     if (extensionList != null) {
       for (Class<? extends ScimExtension> scimExtension : extensionList) {
@@ -137,25 +137,25 @@
         scimExtensionRegistry.registerExtension(clazz, scimExtension);
         
         log.info("Calling addSchema on an extension: " + scimExtension);
-        registry.addSchema(generateExtensionSchema(scimExtension));
+        schemaRegistry.addSchema(generateExtensionSchema(scimExtension));
       }
     }
 
-    registry.addResourceType(resourceType);
-    providerMap.put(clazz, provider);
+    schemaRegistry.addResourceType(resourceType);
+    repositoryMap.put(clazz, repository);
   }
 
   @SuppressWarnings("unchecked")
-  public <T extends ScimResource> Provider<T> getProvider(Class<T> clazz) {
-    return (Provider<T>) providerMap.get(clazz);
+  public <T extends ScimResource> Repository<T> getRepository(Class<T> clazz) {
+    return (Repository<T>) repositoryMap.get(clazz);
   }
 
-  private ResourceType generateResourceType(Class<? extends ScimResource> base, Provider<? extends ScimResource> provider) throws InvalidProviderException, UnableToRetrieveExtensionsResourceException {
+  private ResourceType generateResourceType(Class<? extends ScimResource> base, Repository<? extends ScimResource> repository) throws InvalidRepositoryException, UnableToRetrieveExtensionsResourceException {
 
     ScimResourceType scimResourceType = base.getAnnotation(ScimResourceType.class);
 
     if (scimResourceType == null) {
-      throw new InvalidProviderException("Missing annotation: ScimResourceType must be at the top of scim resource classes");
+      throw new InvalidRepositoryException("Missing annotation: ScimResourceType must be at the top of scim resource classes");
     }
 
     ResourceType resourceType = new ResourceType();
@@ -165,7 +165,7 @@
     resourceType.setEndpoint(scimResourceType.endpoint());
     resourceType.setSchemaUrn(scimResourceType.schema());
 
-    List<Class<? extends ScimExtension>> extensionList = provider.getExtensionList();
+    List<Class<? extends ScimExtension>> extensionList = repository.getExtensionList();
 
     if (extensionList != null) {
 
@@ -176,7 +176,7 @@
         ScimExtensionType extensionType = se.getAnnotation(ScimExtensionType.class);
 
         if (extensionType == null) {
-          throw new InvalidProviderException("Missing annotation: ScimExtensionType must be at the top of scim extension classes");
+          throw new InvalidRepositoryException("Missing annotation: ScimExtensionType must be at the top of scim extension classes");
         }
 
         ResourceType.SchemaExtentionConfiguration ext = new ResourceType.SchemaExtentionConfiguration();
@@ -191,23 +191,23 @@
     return resourceType;
   }
 
-  public static Schema generateSchema(Class<? extends ScimResource> clazz) throws InvalidProviderException {
+  public static Schema generateSchema(Class<? extends ScimResource> clazz) throws InvalidRepositoryException {
     return generateBaseSchema(clazz);
   }
 
-  private static Schema generateBaseSchema(Class<?> clazz) throws InvalidProviderException {
+  private static Schema generateBaseSchema(Class<?> clazz) throws InvalidRepositoryException {
     List<Field> fieldList = ReflectionUtils.getFieldsUpTo(clazz, BaseResource.class);
 
     return generateSchema(clazz, fieldList);
   }
   
-  public static Schema generateExtensionSchema(Class<?> clazz) throws InvalidProviderException {
+  public static Schema generateExtensionSchema(Class<?> clazz) throws InvalidRepositoryException {
     log.debug("----> In generateExtensionSchema");
     
     return generateSchema(clazz, ReflectionUtils.getFieldsUpTo(clazz, Object.class));
   }
   
-  private static Schema generateSchema(Class<?> clazz, List<Field> fieldList) throws InvalidProviderException {
+  private static Schema generateSchema(Class<?> clazz, List<Field> fieldList) throws InvalidRepositoryException {
 
     // Field [] fieldList = clazz.getDeclaredFields();
 
@@ -237,7 +237,7 @@
         sb.append("\n");
       }
 
-      throw new InvalidProviderException(sb.toString());
+      throw new InvalidRepositoryException(sb.toString());
     }
 
     if (srt != null) {
@@ -253,7 +253,7 @@
     return schema;
   }
 
-  private static List<Attribute> createAttributes(String urn, List<Field> fieldList, Set<String> invalidAttributes, String nameBase) throws InvalidProviderException {
+  private static List<Attribute> createAttributes(String urn, List<Field> fieldList, Set<String> invalidAttributes, String nameBase) throws InvalidRepositoryException {
     List<Attribute> attributeList = new ArrayList<>();
 
     for (Field f : fieldList) {
@@ -293,7 +293,7 @@
         
         //This looks goofy, but there's always at least the default value, so it's not an empty list
         if (sa.canonicalValueList().length != 1 && !sa.canonicalValueList()[0].isEmpty()) {
-          throw new InvalidProviderException("You cannont set both the canonicalEnumValue and canonicalValueList attributes on the same ScimAttribute");
+          throw new InvalidRepositoryException("You cannont set both the canonicalEnumValue and canonicalValueList attributes on the same ScimAttribute");
         }
         
         canonicalTypes = new ArrayList<>();
@@ -433,9 +433,4 @@
     log.debug("Returning " + attributeList.size() + " attributes");
     return attributeList;
   }
-
-  
-
-  // private Provider<ScimGroup> groupProvider = null;
-  // private Provider<ScimUser> userProvider = null;
 }
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/provider/SelfIdResolver.java b/scim-server/src/main/java/org/apache/directory/scim/server/repository/SelfIdResolver.java
similarity index 94%
rename from scim-server/src/main/java/org/apache/directory/scim/server/provider/SelfIdResolver.java
rename to scim-server/src/main/java/org/apache/directory/scim/server/repository/SelfIdResolver.java
index f1f17e4..ce491ba 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/provider/SelfIdResolver.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/repository/SelfIdResolver.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.provider;
+package org.apache.directory.scim.server.repository;
 
 import java.security.Principal;
 
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/provider/UpdateRequest.java b/scim-server/src/main/java/org/apache/directory/scim/server/repository/UpdateRequest.java
similarity index 96%
rename from scim-server/src/main/java/org/apache/directory/scim/server/provider/UpdateRequest.java
rename to scim-server/src/main/java/org/apache/directory/scim/server/repository/UpdateRequest.java
index 856e3b4..ee066c8 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/provider/UpdateRequest.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/repository/UpdateRequest.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.provider;
+package org.apache.directory.scim.server.repository;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.DeserializationFeature;
@@ -37,7 +37,7 @@
 import lombok.Getter;
 import lombok.ToString;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.directory.scim.server.schema.Registry;
+import org.apache.directory.scim.server.schema.SchemaRegistry;
 import org.apache.directory.scim.spec.json.ObjectMapperFactory;
 import org.apache.directory.scim.spec.protocol.attribute.AttributeReference;
 import org.apache.directory.scim.spec.protocol.data.PatchOperation;
@@ -87,33 +87,33 @@
 
   private Schema schema;
 
-  private Registry registry;
+  private SchemaRegistry schemaRegistry;
 
   private Map<Attribute, Integer> addRemoveOffsetMap = new HashMap<>();
 
-  public UpdateRequest(Registry registry) {
-    this.registry = registry;
+  public UpdateRequest(SchemaRegistry schemaRegistry) {
+    this.schemaRegistry = schemaRegistry;
 
     //Create a Jackson ObjectMapper that reads JaxB annotations
     objectMapper = ObjectMapperFactory.getObjectMapper();
     objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
   }
 
-  public UpdateRequest(String id, T original, T resource, Registry registry) {
-    this(registry);
+  public UpdateRequest(String id, T original, T resource, SchemaRegistry schemaRegistry) {
+    this(schemaRegistry);
     this.id = id;
     this.original = original;
     this.resource = resource;
-    this.schema = registry.getSchema(original.getBaseUrn());
+    this.schema = schemaRegistry.getSchema(original.getBaseUrn());
     initialized = true;
   }
 
-  public UpdateRequest(String id, T original, List<PatchOperation> patchOperations, Registry registry) {
-    this(registry);
+  public UpdateRequest(String id, T original, List<PatchOperation> patchOperations, SchemaRegistry schemaRegistry) {
+    this(schemaRegistry);
     this.id = id;
     this.original = original;
     this.patchOperations = patchOperations;
-    this.schema = registry.getSchema(original.getBaseUrn());
+    this.schema = schemaRegistry.getSchema(original.getBaseUrn());
 
     initialized = true;
   }
@@ -239,7 +239,7 @@
     keys.addAll(resourceExtensions.keySet());
     
     for(String key: keys) {
-      Schema extSchema = registry.getSchema(key);
+      Schema extSchema = schemaRegistry.getSchema(key);
       ScimExtension originalExtension = originalExtensions.get(key);
       ScimExtension resourceExtension = resourceExtensions.get(key);
       sortMultiValuedCollections(originalExtension, resourceExtension, extSchema);
@@ -526,7 +526,7 @@
       }
 
       if (pathUri != null) {
-        ac = registry.getSchema(pathUri);
+        ac = schemaRegistry.getSchema(pathUri);
         originalObject = original.getExtension(pathUri);
         resourceObject = resource.getExtension(pathUri);
       } else {
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/provider/annotations/ProcessingExtensions.java b/scim-server/src/main/java/org/apache/directory/scim/server/repository/annotations/ProcessingExtensions.java
similarity index 94%
rename from scim-server/src/main/java/org/apache/directory/scim/server/provider/annotations/ProcessingExtensions.java
rename to scim-server/src/main/java/org/apache/directory/scim/server/repository/annotations/ProcessingExtensions.java
index 596dd64..3697823 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/provider/annotations/ProcessingExtensions.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/repository/annotations/ProcessingExtensions.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.provider.annotations;
+package org.apache.directory.scim.server.repository.annotations;
 
 import java.lang.annotation.Documented;
 import java.lang.annotation.ElementType;
@@ -37,4 +37,4 @@
    */
   ScimProcessingExtension[] value();
 
-}
\ No newline at end of file
+}
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/provider/annotations/ScimProcessingExtension.java b/scim-server/src/main/java/org/apache/directory/scim/server/repository/annotations/ScimProcessingExtension.java
similarity index 89%
rename from scim-server/src/main/java/org/apache/directory/scim/server/provider/annotations/ScimProcessingExtension.java
rename to scim-server/src/main/java/org/apache/directory/scim/server/repository/annotations/ScimProcessingExtension.java
index 70988e3..02eb465 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/provider/annotations/ScimProcessingExtension.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/repository/annotations/ScimProcessingExtension.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.provider.annotations;
+package org.apache.directory.scim.server.repository.annotations;
 
 import java.lang.annotation.Documented;
 import java.lang.annotation.ElementType;
@@ -27,7 +27,7 @@
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
-import org.apache.directory.scim.server.provider.extensions.ProcessingExtension;
+import org.apache.directory.scim.server.repository.extensions.ProcessingExtension;
 
 @Retention(RetentionPolicy.RUNTIME)
 @Target({ElementType.TYPE})
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/provider/extensions/AttributeFilterExtension.java b/scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/AttributeFilterExtension.java
similarity index 86%
rename from scim-server/src/main/java/org/apache/directory/scim/server/provider/extensions/AttributeFilterExtension.java
rename to scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/AttributeFilterExtension.java
index cdd4052..889440f 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/provider/extensions/AttributeFilterExtension.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/AttributeFilterExtension.java
@@ -17,9 +17,9 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.provider.extensions;
+package org.apache.directory.scim.server.repository.extensions;
 
-import org.apache.directory.scim.server.provider.extensions.exceptions.ClientFilterException;
+import org.apache.directory.scim.server.repository.extensions.exceptions.ClientFilterException;
 import org.apache.directory.scim.spec.resources.ScimResource;
 
 public interface AttributeFilterExtension extends ProcessingExtension {
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/provider/extensions/ProcessingExtension.java b/scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/ProcessingExtension.java
similarity index 92%
rename from scim-server/src/main/java/org/apache/directory/scim/server/provider/extensions/ProcessingExtension.java
rename to scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/ProcessingExtension.java
index c8a4f02..8384c03 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/provider/extensions/ProcessingExtension.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/ProcessingExtension.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.provider.extensions;
+package org.apache.directory.scim.server.repository.extensions;
 
 public interface ProcessingExtension {
 
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/provider/extensions/ScimRequestContext.java b/scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/ScimRequestContext.java
similarity index 94%
rename from scim-server/src/main/java/org/apache/directory/scim/server/provider/extensions/ScimRequestContext.java
rename to scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/ScimRequestContext.java
index 186879e..2ca929e 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/provider/extensions/ScimRequestContext.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/ScimRequestContext.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.provider.extensions;
+package org.apache.directory.scim.server.repository.extensions;
 
 import java.util.Set;
 
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/provider/extensions/exceptions/ClientFilterException.java b/scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/exceptions/ClientFilterException.java
similarity index 93%
rename from scim-server/src/main/java/org/apache/directory/scim/server/provider/extensions/exceptions/ClientFilterException.java
rename to scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/exceptions/ClientFilterException.java
index 7822dd0..805aaa9 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/provider/extensions/exceptions/ClientFilterException.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/exceptions/ClientFilterException.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.provider.extensions.exceptions;
+package org.apache.directory.scim.server.repository.extensions.exceptions;
 
 import jakarta.ws.rs.core.Response.Status;
 
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/AttributeUtil.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/AttributeUtil.java
index ecf9ed8..812f4e4 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/AttributeUtil.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/AttributeUtil.java
@@ -23,12 +23,10 @@
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.module.SimpleModule;
-import jakarta.enterprise.context.ApplicationScoped;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.directory.scim.server.exception.AttributeDoesNotExistException;
-import org.apache.directory.scim.server.rest.ScimResourceDeserializer;
-import org.apache.directory.scim.server.schema.Registry;
+import org.apache.directory.scim.server.schema.SchemaRegistry;
 import org.apache.directory.scim.spec.json.ObjectMapperFactory;
 import org.apache.directory.scim.spec.protocol.attribute.AttributeReference;
 import org.apache.directory.scim.spec.resources.ScimExtension;
@@ -41,7 +39,6 @@
 import org.apache.directory.scim.spec.schema.Schema.Attribute.Returned;
 import org.apache.directory.scim.spec.schema.Schema.Attribute.Type;
 
-import jakarta.inject.Inject;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -58,12 +55,12 @@
 @Slf4j
 class AttributeUtil {
 
-  Registry registry;
+  SchemaRegistry schemaRegistry;
 
   ObjectMapper objectMapper;
 
-  AttributeUtil(Registry registry) {
-    this.registry = registry;
+  AttributeUtil(SchemaRegistry schemaRegistry) {
+    this.schemaRegistry = schemaRegistry;
 
     // TODO move this to a CDI producer
     objectMapper = ObjectMapperFactory.getObjectMapper();
@@ -71,7 +68,7 @@
     objectMapper.setSerializationInclusion(Include.NON_NULL);
 
     SimpleModule module = new SimpleModule();
-    module.addDeserializer(ScimResource.class, new ScimResourceDeserializer(this.registry, this.objectMapper));
+    module.addDeserializer(ScimResource.class, new ScimResourceDeserializer(this.schemaRegistry, this.objectMapper));
     objectMapper.registerModule(module);
   }
 
@@ -88,7 +85,7 @@
   private <T extends ScimResource> T setAttributesForDisplayInternal(T resource, Returned ... removeAttributesOfTypes) throws IllegalArgumentException, IllegalAccessException, AttributeDoesNotExistException, IOException {
     T copy = cloneScimResource(resource);
     String resourceType = copy.getResourceType();
-    Schema schema = registry.getBaseSchemaOfResourceType(resourceType);
+    Schema schema = schemaRegistry.getBaseSchemaOfResourceType(resourceType);
 
     // return always and default, exclude never and requested
     for (Returned removeAttributesOfType : removeAttributesOfTypes) {
@@ -99,7 +96,7 @@
       String extensionUrn = extensionEntry.getKey();
       ScimExtension scimExtension = extensionEntry.getValue();
 
-      Schema extensionSchema = registry.getSchema(extensionUrn);
+      Schema extensionSchema = schemaRegistry.getSchema(extensionUrn);
 
       for (Returned removeAttributesOfType : removeAttributesOfTypes) {
         removeAttributesOfType(scimExtension, extensionSchema, removeAttributesOfType);
@@ -115,7 +112,7 @@
       T copy = cloneScimResource(resource);
       
       String resourceType = copy.getResourceType();
-      Schema schema = registry.getBaseSchemaOfResourceType(resourceType);
+      Schema schema = schemaRegistry.getBaseSchemaOfResourceType(resourceType);
 
       // return always and specified attributes, exclude never
       Set<Attribute> attributesToKeep = resolveAttributeReferences(attributes, true);
@@ -141,7 +138,7 @@
 
           continue;
         }
-        Schema extensionSchema = registry.getSchema(extensionUrn);
+        Schema extensionSchema = schemaRegistry.getSchema(extensionUrn);
 
         removeAttributesOfType(scimExtension, extensionSchema, Returned.DEFAULT, attributesToKeep);
         removeAttributesOfType(scimExtension, extensionSchema, Returned.REQUEST, attributesToKeep);
@@ -162,7 +159,7 @@
       T copy = cloneScimResource(resource);
 
       String resourceType = copy.getResourceType();
-      Schema schema = registry.getBaseSchemaOfResourceType(resourceType);
+      Schema schema = schemaRegistry.getBaseSchemaOfResourceType(resourceType);
 
       // return always and default, exclude never and specified attributes
       Set<Attribute> attributesToRemove = resolveAttributeReferences(excludedAttributes, false);
@@ -174,7 +171,7 @@
         String extensionUrn = extensionEntry.getKey();
         ScimExtension scimExtension = extensionEntry.getValue();
 
-        Schema extensionSchema = registry.getSchema(extensionUrn);
+        Schema extensionSchema = schemaRegistry.getSchema(extensionUrn);
 
         removeAttributesOfType(scimExtension, extensionSchema, Returned.REQUEST);
         removeAttributesOfType(scimExtension, extensionSchema, Returned.NEVER);
@@ -306,7 +303,7 @@
     Set<Attribute> attributes;
     
     if (!StringUtils.isEmpty(schemaUrn)) {
-      schema = registry.getSchema(schemaUrn);
+      schema = schemaRegistry.getSchema(schemaUrn);
 
       attributes = findAttributeInSchema(schema, attributeReference, includeAttributeChain);
       if (attributes.isEmpty()) {
@@ -317,13 +314,13 @@
     }
 
     // Handle unqualified attributes, look in the core schemas
-    schema = registry.getSchema(ScimUser.SCHEMA_URI);
+    schema = schemaRegistry.getSchema(ScimUser.SCHEMA_URI);
     attributes = findAttributeInSchema(schema, attributeReference, includeAttributeChain);
     if (!attributes.isEmpty()) {
       return attributes;
     }
 
-    schema = registry.getSchema(ScimGroup.SCHEMA_URI);
+    schema = schemaRegistry.getSchema(ScimGroup.SCHEMA_URI);
     attributes = findAttributeInSchema(schema, attributeReference, includeAttributeChain);
     if (!attributes.isEmpty()) {
       return attributes;
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImpl.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImpl.java
index 5587576..148113e 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImpl.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImpl.java
@@ -36,8 +36,9 @@
 import jakarta.ws.rs.core.Response.Status;
 import jakarta.ws.rs.core.Response.Status.Family;
 
-import org.apache.directory.scim.server.provider.ProviderRegistry;
-import org.apache.directory.scim.server.schema.Registry;
+import org.apache.directory.scim.server.repository.RepositoryRegistry;
+import org.apache.directory.scim.server.repository.Repository;
+import org.apache.directory.scim.server.schema.SchemaRegistry;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -49,13 +50,12 @@
 import org.apache.directory.scim.server.exception.UnableToDeleteResourceException;
 import org.apache.directory.scim.server.exception.UnableToRetrieveResourceException;
 import org.apache.directory.scim.server.exception.UnableToUpdateResourceException;
-import org.apache.directory.scim.server.provider.Provider;
-import org.apache.directory.scim.server.provider.UpdateRequest;
-import org.apache.directory.scim.server.provider.annotations.ScimProcessingExtension;
-import org.apache.directory.scim.server.provider.extensions.AttributeFilterExtension;
-import org.apache.directory.scim.server.provider.extensions.ProcessingExtension;
-import org.apache.directory.scim.server.provider.extensions.ScimRequestContext;
-import org.apache.directory.scim.server.provider.extensions.exceptions.ClientFilterException;
+import org.apache.directory.scim.server.repository.UpdateRequest;
+import org.apache.directory.scim.server.repository.annotations.ScimProcessingExtension;
+import org.apache.directory.scim.server.repository.extensions.AttributeFilterExtension;
+import org.apache.directory.scim.server.repository.extensions.ProcessingExtension;
+import org.apache.directory.scim.server.repository.extensions.ScimRequestContext;
+import org.apache.directory.scim.server.repository.extensions.exceptions.ClientFilterException;
 import org.apache.directory.scim.spec.adapter.FilterWrapper;
 import org.apache.directory.scim.spec.protocol.BaseResourceTypeResource;
 import org.apache.directory.scim.spec.protocol.ErrorMessageType;
@@ -78,9 +78,9 @@
 
   private static final Logger LOG = LoggerFactory.getLogger(BaseResourceTypeResourceImpl.class);
 
-  private final Registry registry;
+  private final SchemaRegistry schemaRegistry;
 
-  private final ProviderRegistry providerRegistry;
+  private final RepositoryRegistry repositoryRegistry;
 
   private final  AttributeUtil attributeUtil;
 
@@ -90,25 +90,25 @@
 
   private final Class<T> resourceClass;
 
-  public BaseResourceTypeResourceImpl(Registry registry, ProviderRegistry providerRegistry, RequestContext requestContext, EtagGenerator etagGenerator, Class<T> resourceClass) {
-    this.registry = registry;
-    this.providerRegistry = providerRegistry;
+  public BaseResourceTypeResourceImpl(SchemaRegistry schemaRegistry, RepositoryRegistry repositoryRegistry, RequestContext requestContext, EtagGenerator etagGenerator, Class<T> resourceClass) {
+    this.schemaRegistry = schemaRegistry;
+    this.repositoryRegistry = repositoryRegistry;
     this.requestContext = requestContext;
     this.etagGenerator = etagGenerator;
     this.resourceClass = resourceClass;
-    this.attributeUtil = new AttributeUtil(registry);
+    this.attributeUtil = new AttributeUtil(schemaRegistry);
   }
 
-  public Provider<T> getProvider() {
-    return providerRegistry.getProvider(resourceClass);
+  public Repository<T> getRepository() {
+    return repositoryRegistry.getRepository(resourceClass);
   }
 
-  Provider<T> getProviderInternal() throws ScimServerException {
-    Provider<T> provider = getProvider();
-    if (provider == null) {
+  Repository<T> getRepositoryInternal() throws ScimServerException {
+    Repository<T> repository = getRepository();
+    if (repository == null) {
       throw new ScimServerException(Status.INTERNAL_SERVER_ERROR, "Provider not defined");
     }
-    return provider;
+    return repository;
   }
 
   @Override
@@ -119,11 +119,11 @@
     }
 
     try {
-      Provider<T> provider = getProviderInternal();
+      Repository<T> repository = getRepositoryInternal();
 
       T resource = null;
       try {
-        resource = provider.get(id);
+        resource = repository.get(id);
       } catch (UnableToRetrieveResourceException e2) {
         if (e2.getStatus()
               .getFamily()
@@ -131,9 +131,9 @@
           return createGenericExceptionResponse(e2, e2.getStatus());
         }
       } catch (Exception e) {
-        log.error("Uncaught provider exception", e);
+        log.error("Uncaught repository exception", e);
 
-        return provider.handleException(e);
+        return repository.handleException(e);
       }
 
       if (resource != null) {
@@ -177,7 +177,7 @@
 
       // Process Attributes
       try {
-        resource = processFilterAttributeExtensions(provider, resource, attributeReferences, excludedAttributeReferences);
+        resource = processFilterAttributeExtensions(repository, resource, attributeReferences, excludedAttributeReferences);
       } catch (ClientFilterException e1) {
         ErrorResponse er = new ErrorResponse(e1.getStatus(), e1.getMessage());
         return er.toResponse();
@@ -197,7 +197,7 @@
                        .build();
       } catch (IllegalArgumentException | IllegalAccessException | AttributeDoesNotExistException | IOException e) {
         e.printStackTrace();
-        return createAttriubteProcessingErrorResponse(e);
+        return createAttributeProcessingErrorResponse(e);
       }
     } catch (ScimServerException sse) {
       LOG.error("Error Processing SCIM Request", sse);
@@ -235,7 +235,7 @@
   @Override
   public Response create(T resource, AttributeReferenceListWrapper attributes, AttributeReferenceListWrapper excludedAttributes) {
     try {
-      Provider<T> provider = getProviderInternal();
+      Repository<T> repository = getRepositoryInternal();
 
       Set<AttributeReference> attributeReferences = Optional.ofNullable(attributes)
                                                             .map(wrapper -> wrapper.getAttributeReferences())
@@ -250,7 +250,7 @@
 
       T created;
       try {
-        created = provider.create(resource);
+        created = repository.create(resource);
       } catch (UnableToCreateResourceException e1) {
         Status status = e1.getStatus();
         ErrorResponse er = new ErrorResponse(status, "Error");
@@ -270,9 +270,9 @@
 
         return er.toResponse();
       } catch (Exception e) {
-        log.error("Uncaught provider exception", e);
+        log.error("Uncaught repository exception", e);
 
-        return provider.handleException(e);
+        return repository.handleException(e);
       }
 
       EntityTag etag = null;
@@ -284,7 +284,7 @@
 
       // Process Attributes
       try {
-        created = processFilterAttributeExtensions(provider, created, attributeReferences, excludedAttributeReferences);
+        created = processFilterAttributeExtensions(repository, created, attributeReferences, excludedAttributeReferences);
       } catch (ClientFilterException e1) {
         ErrorResponse er = new ErrorResponse(e1.getStatus(), e1.getMessage());
         return er.toResponse();
@@ -332,7 +332,7 @@
   @Override
   public Response find(SearchRequest request) {
     try {
-      Provider<T> provider = getProviderInternal();
+      Repository<T> repository = getRepositoryInternal();
 
       Set<AttributeReference> attributeReferences = Optional.ofNullable(request.getAttributes())
                                                             .orElse(Collections.emptySet());
@@ -350,15 +350,15 @@
 
       FilterResponse<T> filterResp = null;
       try {
-        filterResp = provider.find(filter, pageRequest, sortRequest);
+        filterResp = repository.find(filter, pageRequest, sortRequest);
       } catch (UnableToRetrieveResourceException e1) {
         log.info("Caught an UnableToRetrieveResourceException " + e1.getMessage() + " : " + e1.getStatus()
                                                                                               .toString());
         return createGenericExceptionResponse(e1, e1.getStatus());
       } catch (Exception e) {
-        log.error("Uncaught provider exception", e);
+        log.error("Uncaught repository exception", e);
 
-        return provider.handleException(e);
+        return repository.handleException(e);
       }
 
       // If no resources are found, we should still return a ListResponse with
@@ -390,7 +390,7 @@
           // Process Attributes
           try {
             log.info("=== Calling processFilterAttributeExtensions");
-            resource = processFilterAttributeExtensions(provider, resource, attributeReferences, excludedAttributeReferences);
+            resource = processFilterAttributeExtensions(repository, resource, attributeReferences, excludedAttributeReferences);
           } catch (ClientFilterException e1) {
             ErrorResponse er = new ErrorResponse(e1.getStatus(), e1.getMessage());
             return er.toResponse();
@@ -405,7 +405,7 @@
 
             results.add(resource);
           } catch (IllegalArgumentException | IllegalAccessException | AttributeDoesNotExistException | IOException e) {
-            return createAttriubteProcessingErrorResponse(e);
+            return createAttributeProcessingErrorResponse(e);
           }
         }
 
@@ -425,7 +425,7 @@
   @Override
   public Response update(T resource, String id, AttributeReferenceListWrapper attributes, AttributeReferenceListWrapper excludedAttributes) {
     try {
-      Provider<T> provider = getProviderInternal();
+      Repository<T> repository = getRepositoryInternal();
 
       Set<AttributeReference> attributeReferences = Optional.ofNullable(attributes)
                                                             .map(wrapper -> wrapper.getAttributeReferences())
@@ -440,14 +440,14 @@
 
       T stored;
       try {
-        stored = provider.get(id);
+        stored = repository.get(id);
       } catch (UnableToRetrieveResourceException e2) {
         log.error("Unable to retrieve resource with id: {}", id, e2);
         return createGenericExceptionResponse(e2, e2.getStatus());
       } catch (Exception e) {
-        log.error("Uncaught provider exception", e);
+        log.error("Uncaught repository exception", e);
 
-        return provider.handleException(e);
+        return repository.handleException(e);
       }
 
       if (stored == null) {
@@ -469,19 +469,19 @@
 
       T updated;
       try {
-        UpdateRequest<T> updateRequest = new UpdateRequest<>(id, stored, resource, registry);
-        updated = provider.update(updateRequest);
+        UpdateRequest<T> updateRequest = new UpdateRequest<>(id, stored, resource, schemaRegistry);
+        updated = repository.update(updateRequest);
       } catch (UnableToUpdateResourceException e1) {
         return createGenericExceptionResponse(e1, e1.getStatus());
       } catch (Exception e1) {
-        log.error("Uncaught provider exception", e1);
+        log.error("Uncaught repository exception", e1);
 
-        return provider.handleException(e1);
+        return repository.handleException(e1);
       }
 
       // Process Attributes
       try {
-        updated = processFilterAttributeExtensions(provider, updated, attributeReferences, excludedAttributeReferences);
+        updated = processFilterAttributeExtensions(repository, updated, attributeReferences, excludedAttributeReferences);
       } catch (ClientFilterException e1) {
         ErrorResponse er = new ErrorResponse(e1.getStatus(), e1.getMessage());
         return er.toResponse();
@@ -525,7 +525,7 @@
   @Override
   public Response patch(PatchRequest patchRequest, String id, AttributeReferenceListWrapper attributes, AttributeReferenceListWrapper excludedAttributes) {
     try {
-      Provider<T> provider = getProviderInternal();
+      Repository<T> repository = getRepositoryInternal();
 
       Set<AttributeReference> attributeReferences = Optional.ofNullable(attributes)
                                                             .map(wrapper -> wrapper.getAttributeReferences())
@@ -540,14 +540,14 @@
 
       T stored;
       try {
-        stored = provider.get(id);
+        stored = repository.get(id);
       } catch (UnableToRetrieveResourceException e2) {
         log.error("Unable to retrieve resource with id: {}", id, e2);
         return createGenericExceptionResponse(e2, e2.getStatus());
       } catch (Exception e) {
-        log.error("Uncaught provider exception", e);
+        log.error("Uncaught repository exception", e);
 
-        return provider.handleException(e);
+        return repository.handleException(e);
       }
 
       if (stored == null) {
@@ -569,21 +569,21 @@
 
       T updated;
       try {
-        UpdateRequest<T> updateRequest = new UpdateRequest<>(id, stored, patchRequest.getPatchOperationList(), registry);
-        updated = provider.update(updateRequest);
+        UpdateRequest<T> updateRequest = new UpdateRequest<>(id, stored, patchRequest.getPatchOperationList(), schemaRegistry);
+        updated = repository.update(updateRequest);
       } catch (UnableToUpdateResourceException e1) {
         return createGenericExceptionResponse(e1, e1.getStatus());
       } catch (UnsupportedOperationException e2) {
         return createGenericExceptionResponse(e2, Status.NOT_IMPLEMENTED);
       } catch (Exception e1) {
-        log.error("Uncaught provider exception", e1);
+        log.error("Uncaught repository exception", e1);
 
-        return provider.handleException(e1);
+        return repository.handleException(e1);
       }
 
       // Process Attributes
       try {
-        updated = processFilterAttributeExtensions(provider, updated, attributeReferences, excludedAttributeReferences);
+        updated = processFilterAttributeExtensions(repository, updated, attributeReferences, excludedAttributeReferences);
       } catch (ClientFilterException e1) {
         ErrorResponse er = new ErrorResponse(e1.getStatus(), e1.getMessage());
         return er.toResponse();
@@ -629,13 +629,13 @@
   public Response delete(String id) {
     Response response;
     try {
-      Provider<T> provider = getProviderInternal();
+      Repository<T> repository = getRepositoryInternal();
 
       try {
         response = Response.noContent()
                            .build();
 
-        provider.delete(id);
+        repository.delete(id);
         return response;
       } catch (UnableToDeleteResourceException e) {
         Status status = e.getStatus();
@@ -646,9 +646,9 @@
 
         return response;
       } catch (Exception e) {
-        log.error("Uncaught provider exception", e);
+        log.error("Uncaught repository exception", e);
 
-        return provider.handleException(e);
+        return repository.handleException(e);
       }
     } catch (ScimServerException sse) {
       LOG.error("Error Processing SCIM Request", sse);
@@ -658,8 +658,8 @@
   }
 
   @SuppressWarnings("unchecked")
-  private T processFilterAttributeExtensions(Provider<T> provider, T resource, Set<AttributeReference> attributeReferences, Set<AttributeReference> excludedAttributeReferences) throws ClientFilterException {
-    ScimProcessingExtension annotation = provider.getClass()
+  private T processFilterAttributeExtensions(Repository<T> repository, T resource, Set<AttributeReference> attributeReferences, Set<AttributeReference> excludedAttributeReferences) throws ClientFilterException {
+    ScimProcessingExtension annotation = repository.getClass()
                                                  .getAnnotation(ScimProcessingExtension.class);
     if (annotation != null) {
       Class<? extends ProcessingExtension>[] value = annotation.value();
@@ -681,7 +681,7 @@
   private URI buildLocationTag(T resource) {
     String id = resource.getId();
     if (id == null) {
-      LOG.warn("Provider must supply an id for a resource");
+      LOG.warn("Repository must supply an id for a resource");
       id = "unknown";
     }
     return requestContext.getUriInfo().getAbsolutePathBuilder()
@@ -714,13 +714,13 @@
     return er.toResponse();
   }
 
-  private Response createAttriubteProcessingErrorResponse(Exception e) {
+  private Response createAttributeProcessingErrorResponse(Exception e) {
     ErrorResponse er = new ErrorResponse(Status.INTERNAL_SERVER_ERROR, "Failed to parse the attribute query value " + e.getMessage());
     return er.toResponse();
   }
 
-  private Response createNoProviderException() {
-    ErrorResponse er = new ErrorResponse(Status.INTERNAL_SERVER_ERROR, "Provider not defined");
+  private Response createNoRepositoryException() {
+    ErrorResponse er = new ErrorResponse(Status.INTERNAL_SERVER_ERROR, "Repository not defined");
     return er.toResponse();
   }
 
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/BulkResourceImpl.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/BulkResourceImpl.java
index 0ffd13c..85a0632 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/BulkResourceImpl.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/BulkResourceImpl.java
@@ -39,10 +39,10 @@
 import org.apache.directory.scim.server.exception.UnableToDeleteResourceException;
 import org.apache.directory.scim.server.exception.UnableToRetrieveResourceException;
 import org.apache.directory.scim.server.exception.UnableToUpdateResourceException;
-import org.apache.directory.scim.server.provider.Provider;
-import org.apache.directory.scim.server.provider.ProviderRegistry;
-import org.apache.directory.scim.server.provider.UpdateRequest;
-import org.apache.directory.scim.server.schema.Registry;
+import org.apache.directory.scim.server.repository.Repository;
+import org.apache.directory.scim.server.repository.RepositoryRegistry;
+import org.apache.directory.scim.server.repository.UpdateRequest;
+import org.apache.directory.scim.server.schema.SchemaRegistry;
 import org.apache.directory.scim.spec.protocol.BulkResource;
 import org.apache.directory.scim.spec.protocol.data.BulkOperation;
 import org.apache.directory.scim.spec.protocol.data.BulkOperation.Method;
@@ -94,14 +94,14 @@
 //    METHOD_NOT_IMPLEMENTED_STATUS.setCode(METHOD_NOT_IMPLEMENTED);
 //  }
 
-  private final Registry registry;
+  private final SchemaRegistry schemaRegistry;
 
-  private final ProviderRegistry providerRegistry;
+  private final RepositoryRegistry repositoryRegistry;
 
   @Inject
-  public BulkResourceImpl(Registry registry, ProviderRegistry providerRegistry) {
-    this.registry = registry;
-    this.providerRegistry = providerRegistry;
+  public BulkResourceImpl(SchemaRegistry schemaRegistry, RepositoryRegistry repositoryRegistry) {
+    this.schemaRegistry = schemaRegistry;
+    this.repositoryRegistry = repositoryRegistry;
   }
 
   BulkResourceImpl() {
@@ -179,7 +179,7 @@
             createAndSetErrorResponse(operationRequest, Status.BAD_REQUEST, "path is not a valid path (e.g. \"/Groups/123abc\", \"/Users/123xyz\", ...)");
           } else {
             String endPoint = path.substring(0, path.lastIndexOf('/'));
-            Class<ScimResource> clazz = (Class<ScimResource>) registry.findScimResourceClassFromEndpoint(endPoint);
+            Class<ScimResource> clazz = (Class<ScimResource>) schemaRegistry.findScimResourceClassFromEndpoint(endPoint);
 
             if (clazz == null) {
               errorOccurred = true;
@@ -283,12 +283,12 @@
         String scimResourceId = scimResource.getId();
         @SuppressWarnings("unchecked")
         Class<ScimResource> scimResourceClass = (Class<ScimResource>) scimResource.getClass();
-        Provider<ScimResource> provider = providerRegistry.getProvider(scimResourceClass);
+        Repository<ScimResource> repository = repositoryRegistry.getRepository(scimResourceClass);
 
-        ScimResource original = provider.get(scimResourceId);
+        ScimResource original = repository.get(scimResourceId);
 
-        UpdateRequest<ScimResource> updateRequest = new UpdateRequest<>(scimResourceId, original, scimResource, registry);
-        provider.update(updateRequest);
+        UpdateRequest<ScimResource> updateRequest = new UpdateRequest<>(scimResourceId, original, scimResource, schemaRegistry);
+        repository.update(updateRequest);
       } catch (UnresolvableOperationException unresolvableOperationException) {
         log.error("Could not complete final resolution pass, unresolvable bulkId", unresolvableOperationException);
 
@@ -341,10 +341,10 @@
     ScimResource scimResource = operationResult.getData();
     @SuppressWarnings("unchecked")
     Class<ScimResource> scimResourceClass = (Class<ScimResource>) scimResource.getClass();
-    Provider<ScimResource> provider = this.providerRegistry.getProvider(scimResourceClass);
+    Repository<ScimResource> repository = this.repositoryRegistry.getRepository(scimResourceClass);
 
     try {
-      provider.delete(scimResource.getId());
+      repository.delete(scimResource.getId());
     } catch (UnableToDeleteResourceException unableToDeleteResourceException) {
       log.error("Could not delete ScimResource after failure: {}", scimResource);
     }
@@ -357,12 +357,12 @@
           String dependentResourceId = dependentResource.getId();
           @SuppressWarnings("unchecked")
           Class<ScimResource> dependentResourceClass = (Class<ScimResource>) dependentResource.getClass();
-          Provider<ScimResource> dependentResourceProvider = this.providerRegistry.getProvider(dependentResourceClass);
+          Repository<ScimResource> dependentResourceRepository = this.repositoryRegistry.getRepository(dependentResourceClass);
 
           dependentOperationResult.setData(null);
           dependentOperationResult.setLocation(null);
           createAndSetErrorResponse(dependentOperationResult, Status.CONFLICT, String.format(OPERATION_DEPENDS_ON_FAILED_OPERATION, bulkId, dependentBulkIdKey));
-          dependentResourceProvider.delete(dependentResourceId);
+          dependentResourceRepository.delete(dependentResourceId);
         } catch (UnableToDeleteResourceException unableToDeleteResourceException) {
           log.error("Could not delete depenedent ScimResource after failing to update dependee", unableToDeleteResourceException);
         }
@@ -392,14 +392,14 @@
     if (scimResource == null) {
       String path = operationResult.getPath();
       String endPoint = path.substring(0, path.lastIndexOf('/'));
-      Class<ScimResource> clazz = (Class<ScimResource>) registry.findScimResourceClassFromEndpoint(endPoint);
+      Class<ScimResource> clazz = (Class<ScimResource>) schemaRegistry.findScimResourceClassFromEndpoint(endPoint);
       scimResourceClass = clazz;
     } else {
       @SuppressWarnings("unchecked")
       Class<ScimResource> clazz = (Class<ScimResource>) scimResource.getClass();
       scimResourceClass = clazz;
     }
-    Provider<ScimResource> provider = providerRegistry.getProvider(scimResourceClass);
+    Repository<ScimResource> repository = repositoryRegistry.getRepository(scimResourceClass);
 
     switch (bulkOperationMethod) {
     case POST: {
@@ -409,7 +409,7 @@
 
       log.debug("Creating {}", scimResource);
 
-      ScimResource newScimResource = provider.create(scimResource);
+      ScimResource newScimResource = repository.create(scimResource);
       String bulkOperationPath = operationResult.getPath();
       String newResourceId = newScimResource.getId();
       String newResourceUri = uriInfo.getBaseUriBuilder()
@@ -439,7 +439,7 @@
                                                                        .lastIndexOf("/")
                                                  + 1);
 
-      provider.delete(scimResourceId);
+      repository.delete(scimResourceId);
       operationResult.setStatus(StatusWrapper.wrap(Status.NO_CONTENT));
     }
       break;
@@ -454,11 +454,11 @@
                                      + 1);
 
       try {
-        ScimResource original = provider.get(id);
+        ScimResource original = repository.get(id);
 
-        UpdateRequest<ScimResource> updateRequest = new UpdateRequest<>(id, original, scimResource, registry);
+        UpdateRequest<ScimResource> updateRequest = new UpdateRequest<>(id, original, scimResource, schemaRegistry);
         
-        provider.update(updateRequest);
+        repository.update(updateRequest);
         operationResult.setStatus(StatusWrapper.wrap(Status.OK));
       } catch (UnableToRetrieveResourceException e) {
         operationResult.setStatus(StatusWrapper.wrap(Status.NOT_FOUND));
@@ -649,7 +649,7 @@
   private void resolveTopLevel(List<IWishJavaHadTuples> unresolveds, BulkOperation bulkOperationResult, Map<String, BulkOperation> bulkIdKeyToOperationResult) throws UnresolvableOperationException {
     ScimResource scimResource = bulkOperationResult.getData();
     String schemaUrn = scimResource.getBaseUrn();
-    Schema schema = this.registry.getSchema(schemaUrn);
+    Schema schema = this.schemaRegistry.getSchema(schemaUrn);
     List<UnresolvedTopLevel> unresolvedTopLevels = new ArrayList<>();
 
     for (Schema.Attribute attribute : schema.getAttributes()) {
@@ -803,7 +803,7 @@
       if (bulkId != null) {
         ScimResource scimResource = bulkOperation.getData();
         String scimResourceBaseUrn = scimResource.getBaseUrn();
-        Schema schema = this.registry.getSchema(scimResourceBaseUrn);
+        Schema schema = this.schemaRegistry.getSchema(scimResourceBaseUrn);
         List<Schema.Attribute> attributes = schema.getAttributes();
 
         generateReverseDependenciesGraph(reverseDependenciesGraph, bulkId, scimResource, attributes);
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/GroupResourceImpl.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/GroupResourceImpl.java
index 8e81cd0..c47afc7 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/GroupResourceImpl.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/GroupResourceImpl.java
@@ -25,8 +25,8 @@
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.directory.scim.server.provider.ProviderRegistry;
-import org.apache.directory.scim.server.schema.Registry;
+import org.apache.directory.scim.server.repository.RepositoryRegistry;
+import org.apache.directory.scim.server.schema.SchemaRegistry;
 import org.apache.directory.scim.spec.protocol.GroupResource;
 import org.apache.directory.scim.spec.resources.ScimGroup;
 
@@ -35,8 +35,8 @@
 public class GroupResourceImpl extends BaseResourceTypeResourceImpl<ScimGroup> implements GroupResource {
 
   @Inject
-  public GroupResourceImpl(Registry registry, ProviderRegistry providerRegistry, RequestContext requestContext, EtagGenerator etagGenerator) {
-    super(registry, providerRegistry, requestContext, etagGenerator, ScimGroup.class);
+  public GroupResourceImpl(SchemaRegistry schemaRegistry, RepositoryRegistry repositoryRegistry, RequestContext requestContext, EtagGenerator etagGenerator) {
+    super(schemaRegistry, repositoryRegistry, requestContext, etagGenerator, ScimGroup.class);
   }
 
   GroupResourceImpl() {
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/ObjectMapperFactory.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/ObjectMapperFactory.java
index db884bb..365745f 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/ObjectMapperFactory.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/ObjectMapperFactory.java
@@ -23,7 +23,7 @@
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.module.SimpleModule;
-import org.apache.directory.scim.server.schema.Registry;
+import org.apache.directory.scim.server.schema.SchemaRegistry;
 import org.apache.directory.scim.spec.resources.ScimResource;
 
 import jakarta.enterprise.inject.Produces;
@@ -36,11 +36,11 @@
 @Provider
 public class ObjectMapperFactory {
 
-  private final Registry registry;
+  private final SchemaRegistry schemaRegistry;
 
   @Inject
-  public ObjectMapperFactory(Registry registry) {
-    this.registry = registry;
+  public ObjectMapperFactory(SchemaRegistry schemaRegistry) {
+    this.schemaRegistry = schemaRegistry;
   }
 
   @Produces
@@ -51,7 +51,7 @@
     objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
 
     SimpleModule module = new SimpleModule();
-    module.addDeserializer(ScimResource.class, new ScimResourceDeserializer(registry, objectMapper));
+    module.addDeserializer(ScimResource.class, new ScimResourceDeserializer(schemaRegistry, objectMapper));
     objectMapper.registerModule(module);
 
     return objectMapper;
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/ResourceTypesResourceImpl.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/ResourceTypesResourceImpl.java
index 0ae55f1..ef08366 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/ResourceTypesResourceImpl.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/ResourceTypesResourceImpl.java
@@ -25,12 +25,10 @@
 
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
-import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.Response.Status;
-import jakarta.ws.rs.core.UriInfo;
 
-import org.apache.directory.scim.server.schema.Registry;
+import org.apache.directory.scim.server.schema.SchemaRegistry;
 import org.apache.directory.scim.spec.protocol.ResourceTypesResource;
 import org.apache.directory.scim.spec.protocol.data.ListResponse;
 import org.apache.directory.scim.spec.schema.Meta;
@@ -39,13 +37,13 @@
 @ApplicationScoped
 public class ResourceTypesResourceImpl implements ResourceTypesResource {
 
-  private final Registry registry;
+  private final SchemaRegistry schemaRegistry;
 
   private final RequestContext requestContext;
 
   @Inject
-  public ResourceTypesResourceImpl(Registry registry, RequestContext requestContext) {
-    this.registry = registry;
+  public ResourceTypesResourceImpl(SchemaRegistry schemaRegistry, RequestContext requestContext) {
+    this.schemaRegistry = schemaRegistry;
     this.requestContext = requestContext;
   }
 
@@ -60,7 +58,7 @@
       return Response.status(Status.FORBIDDEN).build();
     }
 
-    Collection<ResourceType> resourceTypes = registry.getAllResourceTypes();
+    Collection<ResourceType> resourceTypes = schemaRegistry.getAllResourceTypes();
     
     for (ResourceType resourceType : resourceTypes) {
       Meta meta = new Meta();
@@ -83,7 +81,7 @@
 
   @Override
   public Response getResourceType(String name) {
-    ResourceType resourceType = registry.getResourceType(name);
+    ResourceType resourceType = schemaRegistry.getResourceType(name);
     if (resourceType == null){
       return Response.status(Status.NOT_FOUND).build();  
     }
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/SchemaResourceImpl.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/SchemaResourceImpl.java
index e4de3d1..21b61b7 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/SchemaResourceImpl.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/SchemaResourceImpl.java
@@ -25,12 +25,11 @@
 
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
-import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.Response.Status;
 import jakarta.ws.rs.core.UriInfo;
 
-import org.apache.directory.scim.server.schema.Registry;
+import org.apache.directory.scim.server.schema.SchemaRegistry;
 import org.apache.directory.scim.spec.protocol.SchemaResource;
 import org.apache.directory.scim.spec.protocol.data.ListResponse;
 import org.apache.directory.scim.spec.schema.Meta;
@@ -39,11 +38,11 @@
 @ApplicationScoped
 public class SchemaResourceImpl implements SchemaResource {
 
-  private final Registry registry;
+  private final SchemaRegistry schemaRegistry;
 
   @Inject
-  public SchemaResourceImpl(Registry registry) {
-    this.registry = registry;
+  public SchemaResourceImpl(SchemaRegistry schemaRegistry) {
+    this.schemaRegistry = schemaRegistry;
   }
 
   SchemaResourceImpl() {
@@ -58,7 +57,7 @@
     }
     
     ListResponse<Schema> listResponse = new ListResponse<>();
-    Collection<Schema> schemas = registry.getAllSchemas();
+    Collection<Schema> schemas = schemaRegistry.getAllSchemas();
     
     for (Schema schema : schemas) {
       Meta meta = new Meta();
@@ -81,7 +80,7 @@
   @Override
   public Response getSchema(String urn, UriInfo uriInfo) {
     
-    Schema schema = registry.getSchema(urn);
+    Schema schema = schemaRegistry.getSchema(urn);
     if (schema == null){
       return Response.status(Status.NOT_FOUND).build();  
     }
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/ScimResourceDeserializer.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/ScimResourceDeserializer.java
index 39a59ac..3e395c9 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/ScimResourceDeserializer.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/ScimResourceDeserializer.java
@@ -32,15 +32,15 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 
-import org.apache.directory.scim.server.schema.Registry;
+import org.apache.directory.scim.server.schema.SchemaRegistry;
 import org.apache.directory.scim.spec.resources.ScimResource;
 
 public class ScimResourceDeserializer extends JsonDeserializer<ScimResource> {
-  private final Registry registry;
+  private final SchemaRegistry schemaRegistry;
   private final ObjectMapper objectMapper;
 
-  public ScimResourceDeserializer(Registry registry, ObjectMapper objectMapper) {
-    this.registry = registry;
+  public ScimResourceDeserializer(SchemaRegistry schemaRegistry, ObjectMapper objectMapper) {
+    this.schemaRegistry = schemaRegistry;
     this.objectMapper = objectMapper;
   }
 
@@ -54,14 +54,14 @@
 
     for (JsonNode schemaUrnNode : schemas) {
       String schemaUrn = schemaUrnNode.textValue();
-      scimResourceClass = registry.findScimResourceClass(schemaUrn);
+      scimResourceClass = schemaRegistry.findScimResourceClass(schemaUrn);
 
       if (scimResourceClass != null) {
         break;
       }
     }
     if (scimResourceClass == null) {
-      throw new JsonParseException("Could not find a valid schema in: " + schemas + ", valid schemas are: " + registry.getAllSchemaUrns(), location);
+      throw new JsonParseException("Could not find a valid schema in: " + schemas + ", valid schemas are: " + schemaRegistry.getAllSchemaUrns(), location);
     }
     scimResource = objectMapper.readValue(node.toString(), scimResourceClass);
 
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/SelfResourceImpl.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/SelfResourceImpl.java
index f5d728a..6242152 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/SelfResourceImpl.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/SelfResourceImpl.java
@@ -28,7 +28,7 @@
 import jakarta.ws.rs.core.Response.Status;
 
 import org.apache.directory.scim.server.exception.UnableToResolveIdResourceException;
-import org.apache.directory.scim.server.provider.SelfIdResolver;
+import org.apache.directory.scim.server.repository.SelfIdResolver;
 import org.apache.directory.scim.spec.protocol.SelfResource;
 import org.apache.directory.scim.spec.protocol.UserResource;
 import org.apache.directory.scim.spec.protocol.attribute.AttributeReferenceListWrapper;
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/UserResourceImpl.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/UserResourceImpl.java
index 6229df6..433f299 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/UserResourceImpl.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/UserResourceImpl.java
@@ -25,8 +25,8 @@
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.directory.scim.server.provider.ProviderRegistry;
-import org.apache.directory.scim.server.schema.Registry;
+import org.apache.directory.scim.server.repository.RepositoryRegistry;
+import org.apache.directory.scim.server.schema.SchemaRegistry;
 import org.apache.directory.scim.spec.protocol.UserResource;
 import org.apache.directory.scim.spec.resources.ScimUser;
 
@@ -39,8 +39,8 @@
 public class UserResourceImpl extends BaseResourceTypeResourceImpl<ScimUser> implements UserResource {
 
   @Inject
-  public UserResourceImpl(Registry registry, ProviderRegistry providerRegistry, RequestContext requestContext, EtagGenerator etagGenerator) {
-    super(registry, providerRegistry, requestContext, etagGenerator, ScimUser.class);
+  public UserResourceImpl(SchemaRegistry schemaRegistry, RepositoryRegistry repositoryRegistry, RequestContext requestContext, EtagGenerator etagGenerator) {
+    super(schemaRegistry, repositoryRegistry, requestContext, etagGenerator, ScimUser.class);
   }
 
   UserResourceImpl() {
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/schema/Registry.java b/scim-server/src/main/java/org/apache/directory/scim/server/schema/SchemaRegistry.java
similarity index 99%
rename from scim-server/src/main/java/org/apache/directory/scim/server/schema/Registry.java
rename to scim-server/src/main/java/org/apache/directory/scim/server/schema/SchemaRegistry.java
index 3e5f337..bbd6c09 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/schema/Registry.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/schema/SchemaRegistry.java
@@ -36,7 +36,7 @@
 
 @Slf4j
 @ApplicationScoped
-public class Registry {
+public class SchemaRegistry {
 
   private Map<String, Schema> schemaMap = new HashMap<>();
   
diff --git a/scim-server/src/test/java/org/apache/directory/scim/server/provider/PrioritySortingComparitorTest.java b/scim-server/src/test/java/org/apache/directory/scim/server/repository/PrioritySortingComparitorTest.java
similarity index 97%
rename from scim-server/src/test/java/org/apache/directory/scim/server/provider/PrioritySortingComparitorTest.java
rename to scim-server/src/test/java/org/apache/directory/scim/server/repository/PrioritySortingComparitorTest.java
index 5a4d71f..647e9eb 100644
--- a/scim-server/src/test/java/org/apache/directory/scim/server/provider/PrioritySortingComparitorTest.java
+++ b/scim-server/src/test/java/org/apache/directory/scim/server/repository/PrioritySortingComparitorTest.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.provider;
+package org.apache.directory.scim.server.repository;
 
 import java.util.Arrays;
 import java.util.Collections;
diff --git a/scim-server/src/test/java/org/apache/directory/scim/server/provider/ProviderRegistryTest.java b/scim-server/src/test/java/org/apache/directory/scim/server/repository/RepositorySchemaRegistryTest.java
similarity index 67%
rename from scim-server/src/test/java/org/apache/directory/scim/server/provider/ProviderRegistryTest.java
rename to scim-server/src/test/java/org/apache/directory/scim/server/repository/RepositorySchemaRegistryTest.java
index 6c30f5b..559d874 100644
--- a/scim-server/src/test/java/org/apache/directory/scim/server/provider/ProviderRegistryTest.java
+++ b/scim-server/src/test/java/org/apache/directory/scim/server/repository/RepositorySchemaRegistryTest.java
@@ -17,11 +17,11 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.provider;
+package org.apache.directory.scim.server.repository;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-import org.apache.directory.scim.server.schema.Registry;
+import org.apache.directory.scim.server.schema.SchemaRegistry;
 import org.apache.directory.scim.spec.resources.ScimUser;
 import org.apache.directory.scim.spec.schema.Schema;
 import org.junit.jupiter.api.Test;
@@ -30,25 +30,25 @@
 import org.mockito.junit.jupiter.MockitoExtension;
 
 @ExtendWith(MockitoExtension.class)
-public class ProviderRegistryTest {
+public class RepositorySchemaRegistryTest {
 
-  Registry registry;
+  SchemaRegistry schemaRegistry;
   
   @Mock
-  Provider<ScimUser> provider;
+  Repository<ScimUser> repository;
   
-  ProviderRegistry providerRegistry;
+  RepositoryRegistry repositoryRegistry;
   
-  public ProviderRegistryTest() {
-    registry = new Registry();
-    providerRegistry = new ProviderRegistry(registry, null, null);
+  public RepositorySchemaRegistryTest() {
+    schemaRegistry = new SchemaRegistry();
+    repositoryRegistry = new RepositoryRegistry(schemaRegistry, null, null);
   }
 
   @Test
-  public void testAddProvider() throws Exception {
-    providerRegistry.registerProvider(ScimUser.class, provider);
+  public void testAddRepository() throws Exception {
+    repositoryRegistry.registerRepository(ScimUser.class, repository);
     
-    Schema schema = registry.getSchema(ScimUser.SCHEMA_URI);
+    Schema schema = schemaRegistry.getSchema(ScimUser.SCHEMA_URI);
     
     assertThat(schema).isNotNull();
     assertThat(schema.getId()).isEqualTo(ScimUser.SCHEMA_URI);
diff --git a/scim-server/src/test/java/org/apache/directory/scim/server/provider/ProviderTest.java b/scim-server/src/test/java/org/apache/directory/scim/server/repository/RepositoryTest.java
similarity index 88%
rename from scim-server/src/test/java/org/apache/directory/scim/server/provider/ProviderTest.java
rename to scim-server/src/test/java/org/apache/directory/scim/server/repository/RepositoryTest.java
index 4bfce59..c60fcc4 100644
--- a/scim-server/src/test/java/org/apache/directory/scim/server/provider/ProviderTest.java
+++ b/scim-server/src/test/java/org/apache/directory/scim/server/repository/RepositoryTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.directory.scim.server.provider;
+package org.apache.directory.scim.server.repository;
 
 import org.apache.directory.scim.spec.protocol.data.ErrorResponse;
 import org.apache.directory.scim.spec.protocol.filter.FilterResponse;
@@ -38,13 +38,13 @@
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.sameInstance;
 
-public class ProviderTest {
+public class RepositoryTest {
 
   @Test
   public void handleException_jaxrsExceptionTest() {
 
     Exception e = new WebApplicationException();
-    catchException(() -> new ProviderAdapter().handleException(e));
+    catchException(() -> new RepositoryAdapter().handleException(e));
     assertThat(caughtException(), sameInstance(e));
   }
 
@@ -52,7 +52,7 @@
   public void handleException_runtimeExceptionTest() {
 
     Exception e = new RuntimeException("fake test exception");
-    Response response = new ProviderAdapter().handleException(e);
+    Response response = new RepositoryAdapter().handleException(e);
     assertThat(response.getStatus(), is(500));
     assertThat(((ErrorResponse)response.getEntity()).getDetail(), is("fake test exception"));
   }
@@ -60,12 +60,12 @@
   @Test
   public void handleException_nullExceptionTest() {
 
-    Response response = new ProviderAdapter().handleException(null);
+    Response response = new RepositoryAdapter().handleException(null);
     assertThat(response.getStatus(), is(500));
     assertThat(((ErrorResponse)response.getEntity()).getDetail(), is("Unknown Server Error"));
   }
 
-  private class ProviderAdapter implements Provider<ScimResource> {
+  private class RepositoryAdapter implements Repository<ScimResource> {
 
     @Override
     public Class<ScimResource> getResourceClass() {
diff --git a/scim-server/src/test/java/org/apache/directory/scim/server/provider/UpdateRequestTest.java b/scim-server/src/test/java/org/apache/directory/scim/server/repository/UpdateRequestTest.java
similarity index 94%
rename from scim-server/src/test/java/org/apache/directory/scim/server/provider/UpdateRequestTest.java
rename to scim-server/src/test/java/org/apache/directory/scim/server/repository/UpdateRequestTest.java
index b094af5..38ba5e7 100644
--- a/scim-server/src/test/java/org/apache/directory/scim/server/provider/UpdateRequestTest.java
+++ b/scim-server/src/test/java/org/apache/directory/scim/server/repository/UpdateRequestTest.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.provider;
+package org.apache.directory.scim.server.repository;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -32,7 +32,7 @@
 import java.util.stream.Stream;
 
 import org.apache.directory.scim.server.rest.ObjectMapperFactory;
-import org.apache.directory.scim.server.schema.Registry;
+import org.apache.directory.scim.server.schema.SchemaRegistry;
 import org.apache.directory.scim.server.utility.ExampleObjectExtension;
 import org.apache.directory.scim.server.utility.Subobject;
 import org.apache.directory.scim.spec.extension.EnterpriseExtension;
@@ -82,27 +82,27 @@
   private static final String B = "B";
   private static final String C = "C";
 
-  private Registry registry;
+  private SchemaRegistry schemaRegistry;
 
   @Mock
-  Provider<ScimUser> provider;
+  Repository<ScimUser> repository;
 
-  ProviderRegistry providerRegistry;
+  RepositoryRegistry repositoryRegistry;
 
   @BeforeEach
   public void initialize() throws Exception {
-    registry = new Registry();
-    providerRegistry = new ProviderRegistry(registry, ScimExtensionRegistry.getInstance(), null);
+    schemaRegistry = new SchemaRegistry();
+    repositoryRegistry = new RepositoryRegistry(schemaRegistry, ScimExtensionRegistry.getInstance(), null);
 
-    Mockito.when(provider.getExtensionList())
+    Mockito.when(repository.getExtensionList())
            .thenReturn(Stream.of(EnterpriseExtension.class,ExampleObjectExtension.class).collect(Collectors.toList()));
 
-    providerRegistry.registerProvider(ScimUser.class, provider);
+    repositoryRegistry.registerRepository(ScimUser.class, repository);
   }
 
   @Test
   public void testResourcePassthrough() throws Exception {
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", createUser1(), createUser1(), registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", createUser1(), createUser1(), schemaRegistry);
     ScimUser result = updateRequest.getResource();
     log.info("testResourcePassthrough: " + result);
     Assertions.assertThat(result)
@@ -111,7 +111,7 @@
 
   @Test
   public void testPatchPassthrough() throws Exception {
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", createUser1(), createUser1PatchOps(), registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", createUser1(), createUser1PatchOps(), schemaRegistry);
     List<PatchOperation> result = updateRequest.getPatchOperations();
     log.info("testPatchPassthrough: " + result);
     Assertions.assertThat(result)
@@ -120,7 +120,7 @@
 
   @Test
   public void testPatchToUpdate() throws Exception {
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", createUser1(), createUser1PatchOps(), registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", createUser1(), createUser1PatchOps(), schemaRegistry);
     assertThrows(UnsupportedOperationException.class, () -> updateRequest.getResource());
   }
 
@@ -129,7 +129,7 @@
     ScimUser user1 = createUser1();
     ScimUser user2 = copy(user1);
     user2.setNickName("Jon");
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> result = updateRequest.getPatchOperations();
 
     PatchOperation actual = assertSingleResult(result);
@@ -144,7 +144,7 @@
     ScimUser user2 = copy(user1);
     user2.addExtension(ext);
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> result = updateRequest.getPatchOperations();
 
     PatchOperation actual = assertSingleResult(result);
@@ -159,7 +159,7 @@
     user2.getName()
          .setHonorificPrefix("Dr.");
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> result = updateRequest.getPatchOperations();
 
     PatchOperation actual = assertSingleResult(result);
@@ -176,7 +176,7 @@
     mobilePhone.setPrimary(false);
     user2.getPhoneNumbers().add(mobilePhone);
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> result = updateRequest.getPatchOperations();
 
     PatchOperation actual = assertSingleResult(result);
@@ -201,7 +201,7 @@
     mobilePhone.setPrimary(true);
     user2.getPhoneNumbers().add(mobilePhone);
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> operations = updateRequest.getPatchOperations();
     assertNotNull(operations);
     assertEquals(1, operations.size());
@@ -229,7 +229,7 @@
     user2.getPhoneNumbers().add(homePhone);
 
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> operations = updateRequest.getPatchOperations();
     assertNotNull(operations);
     assertEquals(2, operations.size());
@@ -251,7 +251,7 @@
     ScimUser user2 = copy(user1);
     user2.setActive(false);
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> result = updateRequest.getPatchOperations();
 
     PatchOperation actual = assertSingleResult(result);
@@ -265,7 +265,7 @@
     ScimUser user2 = copy(user1);
     user2.getExtension(EnterpriseExtension.class).setDepartment("Dept XYZ.");
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> result = updateRequest.getPatchOperations();
 
     PatchOperation actual = assertSingleResult(result);
@@ -280,7 +280,7 @@
     user2.getName()
          .setFamilyName("Nobody");
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> result = updateRequest.getPatchOperations();
 
     PatchOperation actual = assertSingleResult(result);
@@ -298,7 +298,7 @@
                        .equals("work"))
          .forEach(e -> e.setValue("nobody@example.com"));
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> result = updateRequest.getPatchOperations();
 
     PatchOperation actual = assertSingleResult(result);
@@ -312,7 +312,7 @@
     ScimUser user2 = copy(user1);
     user2.setUserName(null);
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> result = updateRequest.getPatchOperations();
 
     PatchOperation actual = assertSingleResult(result);
@@ -326,7 +326,7 @@
     ScimUser user2 = copy(user1);
     user2.removeExtension(EnterpriseExtension.class);
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> result = updateRequest.getPatchOperations();
 
     PatchOperation actual = assertSingleResult(result);
@@ -342,7 +342,7 @@
          .setMiddleName(null);
 
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> result = updateRequest.getPatchOperations();
 
     PatchOperation actual = assertSingleResult(result);
@@ -356,7 +356,7 @@
     ScimUser user2 = copy(user1);
     user2.setName(null);
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> result = updateRequest.getPatchOperations();
 
     PatchOperation actual = assertSingleResult(result);
@@ -375,7 +375,7 @@
                                  .collect(Collectors.toList());
     user2.setEmails(newEmails);
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> result = updateRequest.getPatchOperations();
 
     PatchOperation actual = assertSingleResult(result);
@@ -397,7 +397,7 @@
     
     user1.getAddresses().add(localAddress);
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> result = updateRequest.getPatchOperations();
 
     PatchOperation actual = assertSingleResult(result);
@@ -420,7 +420,7 @@
     user2.getAddresses().add(localAddress);
     user1.getAddresses().get(0).setKey("asdf");
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> result = updateRequest.getPatchOperations();
 
     assertEquals(2, result.size());
@@ -441,7 +441,7 @@
     ext2.setList(new ArrayList<>());
     user2.addExtension(ext2);
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> operations = updateRequest.getPatchOperations();
     assertTrue(operations.isEmpty(), "Empty Arrays caused a diff");
   }
@@ -453,7 +453,7 @@
     
     //Set empty list on root object and verify no differences
     user1.setPhotos(new ArrayList<>());
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> operations = updateRequest.getPatchOperations();
     assertTrue(operations.isEmpty(), "Empty Arrays are not being nulled out");
     
@@ -495,7 +495,7 @@
     ext2.setList(Stream.of(FIRST,SECOND).collect(Collectors.toList()));
     user2.addExtension(ext2);
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> operations = updateRequest.getPatchOperations();
 
     Assertions.assertThat(operations)
@@ -526,7 +526,7 @@
     ext2.setList(null);
     user2.addExtension(ext2);
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> operations = updateRequest.getPatchOperations();
     assertNotNull(operations);
     assertEquals(2, operations.size());
@@ -550,7 +550,7 @@
     ext2.setList(Stream.of(FIRST,SECOND,FOURTH).collect(Collectors.toList()));
     user2.addExtension(ext2);
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> operations = updateRequest.getPatchOperations();
     System.out.println("Number of operations: "+operations.size());
     operations.stream().forEach(op -> System.out.println(op));
@@ -570,7 +570,7 @@
     
     user2.getName().setFormatted(nickname);
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> operations = updateRequest.getPatchOperations();
     System.out.println("Number of operations: "+operations.size());
     operations.stream().forEach(op -> System.out.println(op));
@@ -590,7 +590,7 @@
     user2.getName().setFormatted(nickname);
     user1.getName().setFormatted("");
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> operations = updateRequest.getPatchOperations();
     System.out.println("Number of operations: "+operations.size());
     operations.stream().forEach(op -> System.out.println(op));
@@ -610,7 +610,7 @@
     user2.getName().setFormatted(nickname);
     user1.getName().setFormatted("");
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> operations = updateRequest.getPatchOperations();
     System.out.println("Number of operations: "+operations.size());
     operations.stream().forEach(op -> System.out.println(op));
@@ -631,7 +631,7 @@
     user2.getName().setFormatted(nickname);
     user1.getName().setFormatted(null);
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> operations = updateRequest.getPatchOperations();
     System.out.println("Number of operations: "+operations.size());
     operations.stream().forEach(op -> System.out.println(op));
@@ -651,7 +651,7 @@
     user2.getName().setFormatted(null);
     user1.getName().setFormatted(nickname);
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> operations = updateRequest.getPatchOperations();
     System.out.println("Number of operations: "+operations.size());
     operations.stream().forEach(op -> System.out.println(op));
@@ -671,7 +671,7 @@
     ext2.setList(list2);
     user2.addExtension(ext2);
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> operations = updateRequest.getPatchOperations();
     assertEquals(ops.size(), operations.size());
     for(int i = 0; i < operations.size(); i++) {
@@ -742,7 +742,7 @@
     ext2.setList(Stream.of("A","Z").collect(Collectors.toList()));
     user2.addExtension(ext2);
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> operations = updateRequest.getPatchOperations();
     System.out.println("Number of operations: "+operations.size());
     operations.stream().forEach(op -> System.out.println(op));
@@ -762,7 +762,7 @@
     user2.getName().setFormatted("");
     user1.getName().setFormatted(nickname);
 
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, registry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> operations = updateRequest.getPatchOperations();
     System.out.println("Number of operations: "+operations.size());
     operations.stream().forEach(op -> System.out.println(op));
@@ -921,7 +921,7 @@
   }
 
   private ScimUser copy(ScimUser scimUser) throws IOException {
-    ObjectMapper objMapper = new ObjectMapperFactory(registry).createObjectMapper();
+    ObjectMapper objMapper = new ObjectMapperFactory(schemaRegistry).createObjectMapper();
     String json = objMapper.writeValueAsString(scimUser);
     return objMapper.readValue(json, ScimUser.class);
   }
diff --git a/scim-server/src/test/java/org/apache/directory/scim/server/rest/AttributeUtilTest.java b/scim-server/src/test/java/org/apache/directory/scim/server/rest/AttributeUtilTest.java
index 685e0fb..ad745bc 100644
--- a/scim-server/src/test/java/org/apache/directory/scim/server/rest/AttributeUtilTest.java
+++ b/scim-server/src/test/java/org/apache/directory/scim/server/rest/AttributeUtilTest.java
@@ -24,8 +24,8 @@
 import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
-import org.apache.directory.scim.server.provider.ProviderRegistry;
-import org.apache.directory.scim.server.schema.Registry;
+import org.apache.directory.scim.server.repository.RepositoryRegistry;
+import org.apache.directory.scim.server.schema.SchemaRegistry;
 import org.apache.directory.scim.server.utility.ExampleObjectExtension;
 import org.apache.directory.scim.server.utility.ExampleObjectExtension.ComplexObject;
 import org.apache.directory.scim.spec.extension.EnterpriseExtension;
@@ -58,7 +58,7 @@
 
   private static final Logger LOG = LoggerFactory.getLogger(AttributeUtilTest.class);
 
-  Registry registry;
+  SchemaRegistry schemaRegistry;
 
   AttributeUtil attributeUtil;
 
@@ -66,19 +66,19 @@
 
   @BeforeEach
   public void setup() throws Exception {
-    registry = Mockito.mock(Registry.class);
-    attributeUtil = new AttributeUtil(registry);
-    Schema scimUserSchema = ProviderRegistry.generateSchema(ScimUser.class);
-    Schema scimEnterpriseUserSchema = ProviderRegistry.generateExtensionSchema(EnterpriseExtension.class);
-    Schema scimExampleSchema = ProviderRegistry.generateExtensionSchema(ExampleObjectExtension.class);
+    schemaRegistry = Mockito.mock(SchemaRegistry.class);
+    attributeUtil = new AttributeUtil(schemaRegistry);
+    Schema scimUserSchema = RepositoryRegistry.generateSchema(ScimUser.class);
+    Schema scimEnterpriseUserSchema = RepositoryRegistry.generateExtensionSchema(EnterpriseExtension.class);
+    Schema scimExampleSchema = RepositoryRegistry.generateExtensionSchema(ExampleObjectExtension.class);
 
 
-    Mockito.when(registry.getBaseSchemaOfResourceType(ScimUser.RESOURCE_NAME)).thenReturn(scimUserSchema);
-    Mockito.when(registry.getSchema(ScimUser.SCHEMA_URI)).thenReturn(scimUserSchema);
-    Mockito.when(registry.getSchema(EnterpriseExtension.URN)).thenReturn(scimEnterpriseUserSchema);
-    Mockito.when(registry.getSchema(ExampleObjectExtension.URN)).thenReturn(scimExampleSchema);
-    Mockito.when(registry.getAllSchemas()).thenReturn(Arrays.asList(scimUserSchema, scimEnterpriseUserSchema, scimExampleSchema));
-    Mockito.when(registry.getAllSchemaUrns()).thenReturn(new HashSet<>(Arrays.asList(ScimUser.SCHEMA_URI, EnterpriseExtension.URN, ExampleObjectExtension.URN)));
+    Mockito.when(schemaRegistry.getBaseSchemaOfResourceType(ScimUser.RESOURCE_NAME)).thenReturn(scimUserSchema);
+    Mockito.when(schemaRegistry.getSchema(ScimUser.SCHEMA_URI)).thenReturn(scimUserSchema);
+    Mockito.when(schemaRegistry.getSchema(EnterpriseExtension.URN)).thenReturn(scimEnterpriseUserSchema);
+    Mockito.when(schemaRegistry.getSchema(ExampleObjectExtension.URN)).thenReturn(scimExampleSchema);
+    Mockito.when(schemaRegistry.getAllSchemas()).thenReturn(Arrays.asList(scimUserSchema, scimEnterpriseUserSchema, scimExampleSchema));
+    Mockito.when(schemaRegistry.getAllSchemaUrns()).thenReturn(new HashSet<>(Arrays.asList(ScimUser.SCHEMA_URI, EnterpriseExtension.URN, ExampleObjectExtension.URN)));
 
     objectMapper = ObjectMapperFactory.getObjectMapper();
     objectMapper.setSerializationInclusion(Include.NON_NULL);
diff --git a/scim-server/src/test/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImplTest.java b/scim-server/src/test/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImplTest.java
index 63b5244..35ea18a 100644
--- a/scim-server/src/test/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImplTest.java
+++ b/scim-server/src/test/java/org/apache/directory/scim/server/rest/BaseResourceTypeResourceImplTest.java
@@ -39,7 +39,7 @@
 import org.mockito.Mockito;
 
 import org.apache.directory.scim.server.exception.ScimServerException;
-import org.apache.directory.scim.server.provider.Provider;
+import org.apache.directory.scim.server.repository.Repository;
 import org.apache.directory.scim.server.utility.ExampleObjectExtension;
 import org.apache.directory.scim.server.utility.ExampleObjectExtension.ComplexObject;
 import org.apache.directory.scim.spec.extension.EnterpriseExtension;
@@ -61,7 +61,7 @@
 public class BaseResourceTypeResourceImplTest {
   
   @Mock
-  Provider<ScimUser> provider;
+  Repository<ScimUser> repository;
   
   AttributeReferenceListWrapper includedAttributeList = new AttributeReferenceListWrapper("name.givenName, name.familyName");
   AttributeReferenceListWrapper excludedAttributeList = new AttributeReferenceListWrapper("emails, phoneNumbers");
@@ -72,10 +72,10 @@
     @SuppressWarnings("rawtypes")
     BaseResourceTypeResourceImpl baseResourceImpl = Mockito.mock(BaseResourceTypeResourceImpl.class);
     
-    when(baseResourceImpl.getProviderInternal()).thenCallRealMethod();
+    when(baseResourceImpl.getRepositoryInternal()).thenCallRealMethod();
     
     // when
-    assertThrows(ScimServerException.class, () -> baseResourceImpl.getProviderInternal());
+    assertThrows(ScimServerException.class, () -> baseResourceImpl.getRepositoryInternal());
   }
   
   @SuppressWarnings("unchecked")
diff --git a/scim-server/src/test/java/org/apache/directory/scim/server/rest/SelfResourceImplTest.java b/scim-server/src/test/java/org/apache/directory/scim/server/rest/SelfResourceImplTest.java
index 607e4ad..9dd6f08 100644
--- a/scim-server/src/test/java/org/apache/directory/scim/server/rest/SelfResourceImplTest.java
+++ b/scim-server/src/test/java/org/apache/directory/scim/server/rest/SelfResourceImplTest.java
@@ -34,7 +34,7 @@
 
 import jakarta.ws.rs.core.SecurityContext;
 import org.apache.directory.scim.server.exception.UnableToResolveIdResourceException;
-import org.apache.directory.scim.server.provider.SelfIdResolver;
+import org.apache.directory.scim.server.repository.SelfIdResolver;
 import org.apache.directory.scim.spec.protocol.UserResource;
 import org.apache.directory.scim.spec.protocol.data.ErrorResponse;
 import org.apache.directory.scim.spec.protocol.exception.ScimException;
diff --git a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderLessThanTest.java b/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderLessThanTest.java
index cc9e958..763a139 100644
--- a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderLessThanTest.java
+++ b/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderLessThanTest.java
@@ -95,7 +95,7 @@
   @Test
   public void testLessThanDate() throws FilterParseException {
     Date now = new Date();
-    Filter filter = FilterBuilder.create().lessThan("dog.dob", new Date()).build();
+    Filter filter = FilterBuilder.create().lessThan("dog.dob", now).build();
     Filter expected = new Filter("dog.dob LT \"" + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SS").format(now) + "\""); // FIXME: format is missing TZ
     // TODO: dates are parsed to strings, for now use string comparison
     assertThat(filter.getFilter()).isEqualTo(expected.getFilter());
diff --git a/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/annotation/ScimAttribute.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/annotation/ScimAttribute.java
index 14571fc..cad5f3d 100644
--- a/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/annotation/ScimAttribute.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/annotation/ScimAttribute.java
@@ -45,7 +45,7 @@
   boolean required() default false;
   
   //These two canonical attributes should be mutually exclusive, if both are 
-  //present we will reject the registered provider
+  //present we will reject the registered repository
   Class<? extends Enum<?>>  canonicalValueEnum() default NoOp.class;
   String [] canonicalValueList() default "";
   
@@ -55,4 +55,4 @@
   Uniqueness uniqueness() default Uniqueness.NONE;
   String [] referenceTypes() default "";
   String description() default "";
-}
\ No newline at end of file
+}