You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by bd...@apache.org on 2022/09/07 15:20:29 UTC

[directory-scimple] branch new-scim-core-module created (now 2814d3a9)

This is an automated email from the ASF dual-hosted git repository.

bdemers pushed a change to branch new-scim-core-module
in repository https://gitbox.apache.org/repos/asf/directory-scimple.git


      at 2814d3a9 Move non-web bits from scim-server to new scim-core module

This branch includes the following new commits:

     new 2814d3a9 Move non-web bits from scim-server to new scim-core module

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[directory-scimple] 01/01: Move non-web bits from scim-server to new scim-core module

Posted by bd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

bdemers pushed a commit to branch new-scim-core-module
in repository https://gitbox.apache.org/repos/asf/directory-scimple.git

commit 2814d3a924d216ddbd9b1ed96ea99abccb9d8d5b
Author: Brian Demers <bd...@apache.org>
AuthorDate: Wed Sep 7 11:20:23 2022 -0400

    Move non-web bits from scim-server to new scim-core module
    
    * Rename ScimConfiguration to Initializable to avoid confusion with ScimConfiguration annotation
    * Repository methods now throw more generic ResourceException
    * ResourceException holds a statusCode instead of a Status to break the dependency on jax-rs
    
    NOTE: it should be possible to remove the need for the exceptions holding a status by adding exception handlers for specific exceptions
    e.g. a handler for ConfictResourceException (or something better named) could set the status to 409
    This change would be to large to also include in this commit
---
 pom.xml                                            |   6 +
 {scim-server => scim-core}/pom.xml                 |  58 +-----
 .../apache/directory/scim/core/Initializable.java  |   6 +-
 .../repository}/InvalidRepositoryException.java    |   6 +-
 .../repository/PrioritySortingComparator.java      |   2 +-
 .../scim/core}/repository/ReflectionUtils.java     |   2 +-
 .../scim/core}/repository/Repository.java          |  31 ++--
 .../scim/core}/repository/RepositoryRegistry.java  |  18 +-
 .../scim/core/repository}/ResourceException.java   |  16 +-
 .../scim/core}/repository/SelfIdResolver.java      |   6 +-
 .../scim/core}/repository/UpdateRequest.java       |   6 +-
 .../annotations/ProcessingExtensions.java          |   2 +-
 .../annotations/ScimProcessingExtension.java       |   4 +-
 .../extensions/AttributeFilterExtension.java       |   3 +-
 .../extensions}/ClientFilterException.java         |  14 +-
 .../repository/extensions/ProcessingExtension.java |   2 +-
 .../repository/extensions/ScimRequestContext.java  |   2 +-
 .../scim/core}/schema/SchemaRegistry.java          |   2 +-
 .../schema/ScimExtensionRegistryProducer.java      |   2 +-
 scim-core/src/main/resources/META-INF/beans.xml    |  22 +++
 .../repository/PrioritySortingComparatorTest.java  |   2 +-
 .../repository/RepositorySchemaRegistryTest.java   |   4 +-
 .../scim/core}/repository/UpdateRequestTest.java   | 197 ++++++++++-----------
 .../repository/utility/ExampleObjectExtension.java |  95 ++++++++++
 .../scim/core/repository/utility/Order.java        |  31 ++--
 .../scim/core/repository/utility/Subobject.java    |  41 +++--
 scim-coverage/pom.xml                              |   4 +
 .../scim/example/jersey/JerseyApplication.java     |   8 +-
 .../jersey/service/InMemoryGroupService.java       |   6 +-
 .../jersey/service/InMemorySelfResolverImpl.java   |   2 +-
 .../jersey/service/InMemoryUserService.java        |   6 +-
 .../scim/example/memory/rest/RestApplication.java  |  11 +-
 .../memory/service/InMemoryGroupService.java       |   6 +-
 .../memory/service/InMemorySelfResolverImpl.java   |   2 +-
 .../memory/service/InMemoryUserService.java        |   6 +-
 scim-server/pom.xml                                |   9 +-
 .../scim/server/ScimServerInitializer.java         |   7 +-
 .../exception/UnableToCreateResourceException.java |   5 +-
 .../exception/UnableToDeleteResourceException.java |   5 +-
 .../UnableToResolveIdResourceException.java        |   7 +-
 ...nableToRetrieveExtensionsResourceException.java |   5 +-
 .../UnableToRetrieveResourceException.java         |   5 +-
 .../exception/UnableToUpdateResourceException.java |   5 +-
 .../directory/scim/server/rest/AttributeUtil.java  |   2 +-
 .../server/rest/BaseResourceTypeResourceImpl.java  |  38 ++--
 .../scim/server/rest/BulkResourceImpl.java         |  23 ++-
 .../scim/server/rest/GroupResourceImpl.java        |   4 +-
 .../scim/server/rest/ObjectMapperFactory.java      |   2 +-
 .../server/rest/ResourceTypesResourceImpl.java     |   2 +-
 .../scim/server/rest/SchemaResourceImpl.java       |   2 +-
 .../scim/server/rest/ScimResourceDeserializer.java |   2 +-
 .../scim/server/rest/ScimResourceHelper.java       |   1 -
 .../scim/server/rest/SelfResourceImpl.java         |  15 +-
 .../scim/server/rest/UserResourceImpl.java         |   4 +-
 .../directory/scim/server/it/testapp/App.java      |   8 +-
 .../server/it/testapp/InMemoryGroupService.java    |   6 +-
 .../it/testapp/InMemorySelfResolverImpl.java       |   2 +-
 .../server/it/testapp/InMemoryUserService.java     |   6 +-
 .../scim/server/rest/AttributeUtilTest.java        |   3 +-
 .../rest/BaseResourceTypeResourceImplTest.java     |   2 +-
 .../scim/server/rest/BulkResourceImplTest.java     |   9 +-
 .../scim/server/rest/SelfResourceImplTest.java     |   6 +-
 .../scim/spec/protocol/data/ErrorResponse.java     |   4 +
 63 files changed, 451 insertions(+), 369 deletions(-)

diff --git a/pom.xml b/pom.xml
index e12c26c0..bf93d88e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -52,6 +52,7 @@
 
   <modules>
     <module>scim-client</module>
+    <module>scim-core</module>
     <module>scim-server</module>
     <module>scim-server-examples/scim-server-memory</module>
     <module>scim-server-examples/scim-server-jersey</module>
@@ -123,6 +124,11 @@
         <artifactId>scim-spec-schema</artifactId>
         <version>2.23-SNAPSHOT</version>
       </dependency>
+      <dependency>
+        <groupId>org.apache.directory.scim</groupId>
+        <artifactId>scim-core</artifactId>
+        <version>2.23-SNAPSHOT</version>
+      </dependency>
       <dependency>
         <groupId>org.apache.directory.scim</groupId>
         <artifactId>scim-tools-common</artifactId>
diff --git a/scim-server/pom.xml b/scim-core/pom.xml
similarity index 66%
copy from scim-server/pom.xml
copy to scim-core/pom.xml
index 583617ac..d8605d69 100644
--- a/scim-server/pom.xml
+++ b/scim-core/pom.xml
@@ -24,9 +24,8 @@
     <version>2.23-SNAPSHOT</version>
   </parent>
 
-  <artifactId>scim-server</artifactId>
-  <name>SCIM - Server</name>
-  <packaging>jar</packaging>
+  <artifactId>scim-core</artifactId>
+  <name>SCIM - Core</name>
 
   <dependencies>
     <dependency>
@@ -50,29 +49,21 @@
       <artifactId>scim-spec-protocol</artifactId>
     </dependency>
     <dependency>
-      <groupId>com.fasterxml.jackson.jakarta.rs</groupId>
-      <artifactId>jackson-jakarta-rs-json-provider</artifactId>
+      <groupId>com.flipkart.zjsonpatch</groupId>
+      <artifactId>zjsonpatch</artifactId>
+      <version>0.4.12</version>
     </dependency>
     <dependency>
       <groupId>org.projectlombok</groupId>
       <artifactId>lombok</artifactId>
       <scope>provided</scope>
     </dependency>
+
     <dependency>
       <groupId>org.junit.jupiter</groupId>
       <artifactId>junit-jupiter</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.jboss.resteasy</groupId>
-      <artifactId>resteasy-client</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.resteasy</groupId>
-      <artifactId>resteasy-jackson2-provider</artifactId>
-      <scope>test</scope>
-    </dependency>
     <dependency>
       <groupId>org.mockito</groupId>
       <artifactId>mockito-core</artifactId>
@@ -98,43 +89,6 @@
       <artifactId>hamcrest</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>eu.codearte.catch-exception</groupId>
-      <artifactId>catch-exception</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.flipkart.zjsonpatch</groupId>
-      <artifactId>zjsonpatch</artifactId>
-      <version>0.4.12</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.directory.scim</groupId>
-      <artifactId>scim-compliance-tests</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.glassfish.jersey.containers</groupId>
-      <artifactId>jersey-container-grizzly2-http</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.glassfish.jersey.inject</groupId>
-      <artifactId>jersey-hk2</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.glassfish.jersey.ext.cdi</groupId>
-      <artifactId>jersey-weld2-se</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.weld.se</groupId>
-      <artifactId>weld-se-core</artifactId>
-      <scope>test</scope>
-    </dependency>
-
   </dependencies>
 
 </project>
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/ScimConfiguration.java b/scim-core/src/main/java/org/apache/directory/scim/core/Initializable.java
similarity index 91%
rename from scim-server/src/main/java/org/apache/directory/scim/server/ScimConfiguration.java
rename to scim-core/src/main/java/org/apache/directory/scim/core/Initializable.java
index 25d7b19b..cd47f1b0 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/ScimConfiguration.java
+++ b/scim-core/src/main/java/org/apache/directory/scim/core/Initializable.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.directory.scim.server;
+package org.apache.directory.scim.core;
 
 /**
  * Classes implementing ScimConfiguration will be eagerly initialized.
@@ -25,7 +25,7 @@ package org.apache.directory.scim.server;
  * CDI does not have a way to eagerly initialize beans at startup. This is a workaround using a spi extension, for
  * non-EJB based deployments.
  */
-public interface ScimConfiguration {
+public interface Initializable {
 
-  void configure();
+  void initialize();
 }
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/exception/InvalidRepositoryException.java b/scim-core/src/main/java/org/apache/directory/scim/core/repository/InvalidRepositoryException.java
similarity index 87%
rename from scim-server/src/main/java/org/apache/directory/scim/server/exception/InvalidRepositoryException.java
rename to scim-core/src/main/java/org/apache/directory/scim/core/repository/InvalidRepositoryException.java
index 08014f3c..6b18ff8f 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/exception/InvalidRepositoryException.java
+++ b/scim-core/src/main/java/org/apache/directory/scim/core/repository/InvalidRepositoryException.java
@@ -17,10 +17,10 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.exception;
+package org.apache.directory.scim.core.repository;
 
 public class InvalidRepositoryException extends Exception {
-  public InvalidRepositoryException(String what) {
-    super(what);
+  public InvalidRepositoryException(String message) {
+    super(message);
   }
 }
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/repository/PrioritySortingComparator.java b/scim-core/src/main/java/org/apache/directory/scim/core/repository/PrioritySortingComparator.java
similarity index 97%
rename from scim-server/src/main/java/org/apache/directory/scim/server/repository/PrioritySortingComparator.java
rename to scim-core/src/main/java/org/apache/directory/scim/core/repository/PrioritySortingComparator.java
index 222ec152..9f56ea89 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/repository/PrioritySortingComparator.java
+++ b/scim-core/src/main/java/org/apache/directory/scim/core/repository/PrioritySortingComparator.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.repository;
+package org.apache.directory.scim.core.repository;
 
 import java.util.Comparator;
 import java.util.Set;
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/repository/ReflectionUtils.java b/scim-core/src/main/java/org/apache/directory/scim/core/repository/ReflectionUtils.java
similarity index 96%
rename from scim-server/src/main/java/org/apache/directory/scim/server/repository/ReflectionUtils.java
rename to scim-core/src/main/java/org/apache/directory/scim/core/repository/ReflectionUtils.java
index ae9ce8c1..e7c6ce9f 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/repository/ReflectionUtils.java
+++ b/scim-core/src/main/java/org/apache/directory/scim/core/repository/ReflectionUtils.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.repository;
+package org.apache.directory.scim.core.repository;
 
 import java.lang.reflect.Field;
 import java.util.ArrayList;
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/repository/Repository.java b/scim-core/src/main/java/org/apache/directory/scim/core/repository/Repository.java
similarity index 75%
rename from scim-server/src/main/java/org/apache/directory/scim/server/repository/Repository.java
rename to scim-core/src/main/java/org/apache/directory/scim/core/repository/Repository.java
index 212e56bc..0ba25ea1 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/repository/Repository.java
+++ b/scim-core/src/main/java/org/apache/directory/scim/core/repository/Repository.java
@@ -17,15 +17,10 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.repository;
+package org.apache.directory.scim.core.repository;
 
 import java.util.List;
 
-import org.apache.directory.scim.server.exception.UnableToCreateResourceException;
-import org.apache.directory.scim.server.exception.UnableToDeleteResourceException;
-import org.apache.directory.scim.server.exception.UnableToRetrieveExtensionsResourceException;
-import org.apache.directory.scim.server.exception.UnableToRetrieveResourceException;
-import org.apache.directory.scim.server.exception.UnableToUpdateResourceException;
 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;
@@ -55,10 +50,10 @@ public interface Repository<T extends ScimResource> {
    * 
    * @param resource The ScimResource to create and persist.
    * @return The newly created ScimResource.
-   * @throws UnableToCreateResourceException When the ScimResource cannot be
+   * @throws ResourceException When the ScimResource cannot be
    *         created.
    */
-  T create(T resource) throws UnableToCreateResourceException;
+  T create(T resource) throws ResourceException;
   
   /**
    * Allows the SCIM server's REST implementation to update and existing
@@ -66,19 +61,19 @@ public interface Repository<T extends ScimResource> {
    * 
    * @param updateRequest The ScimResource to update and persist.
    * @return The newly updated ScimResource.
-   * @throws UnableToUpdateResourceException When the ScimResource cannot be
+   * @throws ResourceException When the ScimResource cannot be
    *         updated.
    */
-  T update(UpdateRequest<T> updateRequest) throws UnableToUpdateResourceException;
+  T update(UpdateRequest<T> updateRequest) throws ResourceException;
   
   /**
    * Retrieves the ScimResource associated with the provided identifier.
    * @param id The identifier of the target ScimResource.
    * @return The requested ScimResource.
-   * @throws UnableToRetrieveResourceException When the ScimResource cannot be
+   * @throws ResourceException When the ScimResource cannot be
    *         retrieved.
    */
-  T get(String id) throws UnableToRetrieveResourceException;
+  T get(String id) throws ResourceException;
   
   /**
    * Finds and retrieves all ScimResource objects known to the persistence
@@ -97,10 +92,10 @@ public interface Repository<T extends ScimResource> {
    * @return A list of the ScimResources that pass the filter criteria,
    *         truncated to match the requested "page" and sorted according
    *         to the provided requirements.
-   * @throws UnableToRetrieveResourceException If one or more ScimResouces
+   * @throws ResourceException If one or more ScimResources
    *         cannot be retrieved.
    */
-  FilterResponse<T> find(Filter filter, PageRequest pageRequest, SortRequest sortRequest) throws UnableToRetrieveResourceException;
+  FilterResponse<T> find(Filter filter, PageRequest pageRequest, SortRequest sortRequest) throws ResourceException;
   
   /**
    * Deletes the ScimResource with the provided identifier (if it exists).
@@ -108,18 +103,18 @@ public interface Repository<T extends ScimResource> {
    * rather leaves that to the designer of the persistence layer.
    * 
    * @param id The ScimResource's identifier.
-   * @throws UnableToDeleteResourceException When the specified ScimResource
+   * @throws ResourceException When the specified ScimResource
    *         cannot be deleted.
    */
-  void delete(String id) throws UnableToDeleteResourceException;
+  void delete(String id) throws ResourceException;
 
   /**
    * 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 repository cannot return
+   * @throws ResourceException If the repository cannot return
    *         the appropriate list.
    */
-  List<Class<? extends ScimExtension>> getExtensionList() throws UnableToRetrieveExtensionsResourceException;
+  List<Class<? extends ScimExtension>> getExtensionList() throws ResourceException;
 }
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/repository/RepositoryRegistry.java b/scim-core/src/main/java/org/apache/directory/scim/core/repository/RepositoryRegistry.java
similarity index 90%
rename from scim-server/src/main/java/org/apache/directory/scim/server/repository/RepositoryRegistry.java
rename to scim-core/src/main/java/org/apache/directory/scim/core/repository/RepositoryRegistry.java
index f94ac5bc..21e47029 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/repository/RepositoryRegistry.java
+++ b/scim-core/src/main/java/org/apache/directory/scim/core/repository/RepositoryRegistry.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.repository;
+package org.apache.directory.scim.core.repository;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import jakarta.enterprise.context.ApplicationScoped;
@@ -25,10 +25,7 @@ import jakarta.enterprise.inject.Instance;
 import jakarta.inject.Inject;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.directory.scim.server.ScimConfiguration;
-import org.apache.directory.scim.server.exception.InvalidRepositoryException;
-import org.apache.directory.scim.server.exception.UnableToRetrieveExtensionsResourceException;
-import org.apache.directory.scim.server.schema.SchemaRegistry;
+import org.apache.directory.scim.core.Initializable;
 import org.apache.directory.scim.spec.annotation.ScimExtensionType;
 import org.apache.directory.scim.spec.annotation.ScimResourceType;
 import org.apache.directory.scim.spec.exception.ScimResourceInvalidException;
@@ -36,6 +33,7 @@ import org.apache.directory.scim.spec.extension.ScimExtensionRegistry;
 import org.apache.directory.scim.spec.resources.ScimExtension;
 import org.apache.directory.scim.spec.resources.ScimResource;
 import org.apache.directory.scim.spec.schema.ResourceType;
+import org.apache.directory.scim.core.schema.SchemaRegistry;
 import org.apache.directory.scim.spec.schema.Schemas;
 
 import java.util.ArrayList;
@@ -46,7 +44,7 @@ import java.util.Map;
 @Data
 @Slf4j
 @ApplicationScoped
-public class RepositoryRegistry implements ScimConfiguration {
+public class RepositoryRegistry implements Initializable {
 
   private SchemaRegistry schemaRegistry;
 
@@ -69,19 +67,19 @@ public class RepositoryRegistry implements ScimConfiguration {
 
   @Override
   @SuppressWarnings("unchecked")
-  public void configure() {
+  public void initialize() {
     scimRepositoryInstances.stream()
       .map(repository -> (Repository<ScimResource>) repository)
       .forEach(repository -> {
       try {
         registerRepository(repository.getResourceClass(), repository);
-      } catch (InvalidRepositoryException | JsonProcessingException | UnableToRetrieveExtensionsResourceException e) {
+      } catch (InvalidRepositoryException | JsonProcessingException | ResourceException e) {
         throw new ScimResourceInvalidException("Failed to register repository " + repository.getClass() + " for ScimResource type " + repository.getResourceClass(), e);
       }
     });
   }
 
-  public synchronized <T extends ScimResource> void registerRepository(Class<T> clazz, Repository<T> repository) throws InvalidRepositoryException, JsonProcessingException, UnableToRetrieveExtensionsResourceException {
+  public synchronized <T extends ScimResource> void registerRepository(Class<T> clazz, Repository<T> repository) throws InvalidRepositoryException, JsonProcessingException, ResourceException {
 
     ResourceType resourceType = generateResourceType(clazz, repository);
 
@@ -115,7 +113,7 @@ public class RepositoryRegistry implements ScimConfiguration {
     return (Repository<T>) repositoryMap.get(clazz);
   }
 
-  private ResourceType generateResourceType(Class<? extends ScimResource> base, Repository<? extends ScimResource> repository) throws InvalidRepositoryException, UnableToRetrieveExtensionsResourceException {
+  private ResourceType generateResourceType(Class<? extends ScimResource> base, Repository<? extends ScimResource> repository) throws InvalidRepositoryException, ResourceException {
 
     ScimResourceType scimResourceType = base.getAnnotation(ScimResourceType.class);
 
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/exception/ResourceException.java b/scim-core/src/main/java/org/apache/directory/scim/core/repository/ResourceException.java
similarity index 72%
rename from scim-server/src/main/java/org/apache/directory/scim/server/exception/ResourceException.java
rename to scim-core/src/main/java/org/apache/directory/scim/core/repository/ResourceException.java
index c8e21eff..0a987635 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/exception/ResourceException.java
+++ b/scim-core/src/main/java/org/apache/directory/scim/core/repository/ResourceException.java
@@ -17,9 +17,8 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.exception;
+package org.apache.directory.scim.core.repository;
 
-import jakarta.ws.rs.core.Response.Status;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -27,18 +26,15 @@ import lombok.EqualsAndHashCode;
 @EqualsAndHashCode(callSuper=true)
 public class ResourceException extends Exception {
 
-  private static final long serialVersionUID = -3872700870424005641L;
+  private final int status;
 
-  private Status status;
-
-  public ResourceException(Status status, String message) {
+  public ResourceException(int statusCode, String message) {
     super(message);
-
-    this.status = status;
+    this.status = statusCode;
   }
 
-  public ResourceException(Status status, String message, Throwable cause) {
+  public ResourceException(int statusCode, String message, Throwable cause) {
     super(message, cause);
-    this.status = status;
+    this.status = statusCode;
   }
 }
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/repository/SelfIdResolver.java b/scim-core/src/main/java/org/apache/directory/scim/core/repository/SelfIdResolver.java
similarity index 78%
rename from scim-server/src/main/java/org/apache/directory/scim/server/repository/SelfIdResolver.java
rename to scim-core/src/main/java/org/apache/directory/scim/core/repository/SelfIdResolver.java
index ce491baf..62459942 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/repository/SelfIdResolver.java
+++ b/scim-core/src/main/java/org/apache/directory/scim/core/repository/SelfIdResolver.java
@@ -17,14 +17,12 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.repository;
+package org.apache.directory.scim.core.repository;
 
 import java.security.Principal;
 
-import org.apache.directory.scim.server.exception.UnableToResolveIdResourceException;
-
 public interface SelfIdResolver {
 
-  String resolveToInternalId(Principal principal) throws UnableToResolveIdResourceException;
+  String resolveToInternalId(Principal principal) throws ResourceException;
   
 }
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/repository/UpdateRequest.java b/scim-core/src/main/java/org/apache/directory/scim/core/repository/UpdateRequest.java
similarity index 99%
rename from scim-server/src/main/java/org/apache/directory/scim/server/repository/UpdateRequest.java
rename to scim-core/src/main/java/org/apache/directory/scim/core/repository/UpdateRequest.java
index d5b0f177..fa98bb02 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/repository/UpdateRequest.java
+++ b/scim-core/src/main/java/org/apache/directory/scim/core/repository/UpdateRequest.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.repository;
+package org.apache.directory.scim.core.repository;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.DeserializationFeature;
@@ -37,7 +37,6 @@ import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.ToString;
 import lombok.extern.slf4j.Slf4j;
-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;
@@ -53,6 +52,7 @@ import org.apache.directory.scim.spec.resources.TypedAttribute;
 import org.apache.directory.scim.spec.schema.AttributeContainer;
 import org.apache.directory.scim.spec.schema.Schema;
 import org.apache.directory.scim.spec.schema.Schema.Attribute;
+import org.apache.directory.scim.core.schema.SchemaRegistry;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -146,7 +146,7 @@ public class UpdateRequest<T extends ScimResource> {
     return patchOperations;
   }
 
-  private void sortMultiValuedCollections(Object obj1, Object obj2, AttributeContainer ac) throws IllegalArgumentException, IllegalAccessException {
+  private void sortMultiValuedCollections(Object obj1, Object obj2, AttributeContainer ac) throws IllegalArgumentException {
     for (Attribute attribute : ac.getAttributes()) {
       Schema.AttributeAccessor accessor = attribute.getAccessor();
       if (attribute.isMultiValued()) {
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/repository/annotations/ProcessingExtensions.java b/scim-core/src/main/java/org/apache/directory/scim/core/repository/annotations/ProcessingExtensions.java
similarity index 95%
rename from scim-server/src/main/java/org/apache/directory/scim/server/repository/annotations/ProcessingExtensions.java
rename to scim-core/src/main/java/org/apache/directory/scim/core/repository/annotations/ProcessingExtensions.java
index 36978232..3fc0fc86 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/repository/annotations/ProcessingExtensions.java
+++ b/scim-core/src/main/java/org/apache/directory/scim/core/repository/annotations/ProcessingExtensions.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.repository.annotations;
+package org.apache.directory.scim.core.repository.annotations;
 
 import java.lang.annotation.Documented;
 import java.lang.annotation.ElementType;
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/repository/annotations/ScimProcessingExtension.java b/scim-core/src/main/java/org/apache/directory/scim/core/repository/annotations/ScimProcessingExtension.java
similarity index 89%
rename from scim-server/src/main/java/org/apache/directory/scim/server/repository/annotations/ScimProcessingExtension.java
rename to scim-core/src/main/java/org/apache/directory/scim/core/repository/annotations/ScimProcessingExtension.java
index 02eb4654..db146db6 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/repository/annotations/ScimProcessingExtension.java
+++ b/scim-core/src/main/java/org/apache/directory/scim/core/repository/annotations/ScimProcessingExtension.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.repository.annotations;
+package org.apache.directory.scim.core.repository.annotations;
 
 import java.lang.annotation.Documented;
 import java.lang.annotation.ElementType;
@@ -27,7 +27,7 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
-import org.apache.directory.scim.server.repository.extensions.ProcessingExtension;
+import org.apache.directory.scim.core.repository.extensions.ProcessingExtension;
 
 @Retention(RetentionPolicy.RUNTIME)
 @Target({ElementType.TYPE})
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/AttributeFilterExtension.java b/scim-core/src/main/java/org/apache/directory/scim/core/repository/extensions/AttributeFilterExtension.java
similarity index 86%
rename from scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/AttributeFilterExtension.java
rename to scim-core/src/main/java/org/apache/directory/scim/core/repository/extensions/AttributeFilterExtension.java
index 889440f9..00693165 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/AttributeFilterExtension.java
+++ b/scim-core/src/main/java/org/apache/directory/scim/core/repository/extensions/AttributeFilterExtension.java
@@ -17,9 +17,8 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.repository.extensions;
+package org.apache.directory.scim.core.repository.extensions;
 
-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/repository/extensions/exceptions/ClientFilterException.java b/scim-core/src/main/java/org/apache/directory/scim/core/repository/extensions/ClientFilterException.java
similarity index 81%
copy from scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/exceptions/ClientFilterException.java
copy to scim-core/src/main/java/org/apache/directory/scim/core/repository/extensions/ClientFilterException.java
index 805aaa9e..e93e7e76 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/exceptions/ClientFilterException.java
+++ b/scim-core/src/main/java/org/apache/directory/scim/core/repository/extensions/ClientFilterException.java
@@ -17,9 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.repository.extensions.exceptions;
-
-import jakarta.ws.rs.core.Response.Status;
+package org.apache.directory.scim.core.repository.extensions;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -29,12 +27,12 @@ import lombok.EqualsAndHashCode;
 public class ClientFilterException extends Exception {
   
   private static final long serialVersionUID = 3308947684934769952L;
-  
-  Status status;
-  
-  public ClientFilterException(Status status, String message) {
+
+  private final int status;
+
+  public ClientFilterException(int statusCode, String message) {
     super(message);
-    this.status = status;
+    this.status = statusCode;
   }
 
 }
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/ProcessingExtension.java b/scim-core/src/main/java/org/apache/directory/scim/core/repository/extensions/ProcessingExtension.java
similarity index 92%
rename from scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/ProcessingExtension.java
rename to scim-core/src/main/java/org/apache/directory/scim/core/repository/extensions/ProcessingExtension.java
index 8384c038..6ab280b4 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/ProcessingExtension.java
+++ b/scim-core/src/main/java/org/apache/directory/scim/core/repository/extensions/ProcessingExtension.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.repository.extensions;
+package org.apache.directory.scim.core.repository.extensions;
 
 public interface ProcessingExtension {
 
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/ScimRequestContext.java b/scim-core/src/main/java/org/apache/directory/scim/core/repository/extensions/ScimRequestContext.java
similarity index 94%
rename from scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/ScimRequestContext.java
rename to scim-core/src/main/java/org/apache/directory/scim/core/repository/extensions/ScimRequestContext.java
index 2ca929ed..f18eac5c 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/ScimRequestContext.java
+++ b/scim-core/src/main/java/org/apache/directory/scim/core/repository/extensions/ScimRequestContext.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.repository.extensions;
+package org.apache.directory.scim.core.repository.extensions;
 
 import java.util.Set;
 
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/schema/SchemaRegistry.java b/scim-core/src/main/java/org/apache/directory/scim/core/schema/SchemaRegistry.java
similarity index 98%
rename from scim-server/src/main/java/org/apache/directory/scim/server/schema/SchemaRegistry.java
rename to scim-core/src/main/java/org/apache/directory/scim/core/schema/SchemaRegistry.java
index bbd6c090..bb573c05 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/schema/SchemaRegistry.java
+++ b/scim-core/src/main/java/org/apache/directory/scim/core/schema/SchemaRegistry.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.schema;
+package org.apache.directory.scim.core.schema;
 
 import java.util.Collection;
 import java.util.Collections;
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/schema/ScimExtensionRegistryProducer.java b/scim-core/src/main/java/org/apache/directory/scim/core/schema/ScimExtensionRegistryProducer.java
similarity index 95%
copy from scim-server/src/main/java/org/apache/directory/scim/server/schema/ScimExtensionRegistryProducer.java
copy to scim-core/src/main/java/org/apache/directory/scim/core/schema/ScimExtensionRegistryProducer.java
index 5c564e95..b3de6d5a 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/schema/ScimExtensionRegistryProducer.java
+++ b/scim-core/src/main/java/org/apache/directory/scim/core/schema/ScimExtensionRegistryProducer.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.schema;
+package org.apache.directory.scim.core.schema;
 
 import jakarta.enterprise.inject.Produces;
 
diff --git a/scim-core/src/main/resources/META-INF/beans.xml b/scim-core/src/main/resources/META-INF/beans.xml
new file mode 100644
index 00000000..a47f43b0
--- /dev/null
+++ b/scim-core/src/main/resources/META-INF/beans.xml
@@ -0,0 +1,22 @@
+<!--  Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License. -->
+<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
+       version="1.1" bean-discovery-mode="all">
+       
+</beans>
diff --git a/scim-server/src/test/java/org/apache/directory/scim/server/repository/PrioritySortingComparatorTest.java b/scim-core/src/test/java/org/apache/directory/scim/core/repository/PrioritySortingComparatorTest.java
similarity index 97%
rename from scim-server/src/test/java/org/apache/directory/scim/server/repository/PrioritySortingComparatorTest.java
rename to scim-core/src/test/java/org/apache/directory/scim/core/repository/PrioritySortingComparatorTest.java
index 4b32c977..22b28d05 100644
--- a/scim-server/src/test/java/org/apache/directory/scim/server/repository/PrioritySortingComparatorTest.java
+++ b/scim-core/src/test/java/org/apache/directory/scim/core/repository/PrioritySortingComparatorTest.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.repository;
+package org.apache.directory.scim.core.repository;
 
 import java.util.Arrays;
 import java.util.Collections;
diff --git a/scim-server/src/test/java/org/apache/directory/scim/server/repository/RepositorySchemaRegistryTest.java b/scim-core/src/test/java/org/apache/directory/scim/core/repository/RepositorySchemaRegistryTest.java
similarity index 93%
rename from scim-server/src/test/java/org/apache/directory/scim/server/repository/RepositorySchemaRegistryTest.java
rename to scim-core/src/test/java/org/apache/directory/scim/core/repository/RepositorySchemaRegistryTest.java
index 559d8749..64bb0a6d 100644
--- a/scim-server/src/test/java/org/apache/directory/scim/server/repository/RepositorySchemaRegistryTest.java
+++ b/scim-core/src/test/java/org/apache/directory/scim/core/repository/RepositorySchemaRegistryTest.java
@@ -17,13 +17,13 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.repository;
+package org.apache.directory.scim.core.repository;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-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.apache.directory.scim.core.schema.SchemaRegistry;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
diff --git a/scim-server/src/test/java/org/apache/directory/scim/server/repository/UpdateRequestTest.java b/scim-core/src/test/java/org/apache/directory/scim/core/repository/UpdateRequestTest.java
similarity index 88%
rename from scim-server/src/test/java/org/apache/directory/scim/server/repository/UpdateRequestTest.java
rename to scim-core/src/test/java/org/apache/directory/scim/core/repository/UpdateRequestTest.java
index 38ba5e75..f40ccf0b 100644
--- a/scim-server/src/test/java/org/apache/directory/scim/server/repository/UpdateRequestTest.java
+++ b/scim-core/src/test/java/org/apache/directory/scim/core/repository/UpdateRequestTest.java
@@ -17,27 +17,24 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.repository;
+package org.apache.directory.scim.core.repository;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import org.apache.directory.scim.server.rest.ObjectMapperFactory;
-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.core.repository.utility.ExampleObjectExtension;
+import org.apache.directory.scim.core.repository.utility.Subobject;
 import org.apache.directory.scim.spec.extension.EnterpriseExtension;
 import org.apache.directory.scim.spec.extension.EnterpriseExtension.Manager;
-import org.apache.directory.scim.spec.extension.ScimExtensionRegistry;
 import org.apache.directory.scim.spec.phonenumber.PhoneNumberParseException;
 import org.apache.directory.scim.spec.protocol.data.PatchOperation;
 import org.apache.directory.scim.spec.protocol.data.PatchOperation.Type;
@@ -50,27 +47,23 @@ import org.apache.directory.scim.spec.resources.PhoneNumber;
 import org.apache.directory.scim.spec.resources.PhoneNumber.GlobalPhoneNumberBuilder;
 import org.apache.directory.scim.spec.resources.Photo;
 import org.apache.directory.scim.spec.resources.ScimUser;
-import org.assertj.core.api.Assertions;
+import org.apache.directory.scim.core.schema.SchemaRegistry;
+import org.apache.directory.scim.spec.schema.Schemas;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 
 import static org.assertj.core.groups.Tuple.tuple;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 @Slf4j
-@ExtendWith(MockitoExtension.class)
 public class UpdateRequestTest {
   
   private static final String FIRST = "first";
@@ -84,50 +77,42 @@ public class UpdateRequestTest {
 
   private SchemaRegistry schemaRegistry;
 
-  @Mock
-  Repository<ScimUser> repository;
-
-  RepositoryRegistry repositoryRegistry;
-
   @BeforeEach
   public void initialize() throws Exception {
-    schemaRegistry = new SchemaRegistry();
-    repositoryRegistry = new RepositoryRegistry(schemaRegistry, ScimExtensionRegistry.getInstance(), null);
-
-    Mockito.when(repository.getExtensionList())
-           .thenReturn(Stream.of(EnterpriseExtension.class,ExampleObjectExtension.class).collect(Collectors.toList()));
-
-    repositoryRegistry.registerRepository(ScimUser.class, repository);
+    schemaRegistry = mock(SchemaRegistry.class);
+    when(schemaRegistry.getSchema(ScimUser.SCHEMA_URI)).thenReturn(Schemas.schemaFor(ScimUser.class));
+    when(schemaRegistry.getSchema(EnterpriseExtension.URN)).thenReturn(Schemas.schemaForExtension(EnterpriseExtension.class));
+    when(schemaRegistry.getSchema(ExampleObjectExtension.URN)).thenReturn(Schemas.schemaForExtension(ExampleObjectExtension.class));
   }
 
   @Test
   public void testResourcePassthrough() throws Exception {
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", createUser1(), createUser1(), schemaRegistry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", createUser(), createUser(), schemaRegistry);
     ScimUser result = updateRequest.getResource();
     log.info("testResourcePassthrough: " + result);
-    Assertions.assertThat(result)
+    assertThat(result)
               .isNotNull();
   }
 
   @Test
   public void testPatchPassthrough() throws Exception {
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", createUser1(), createUser1PatchOps(), schemaRegistry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", createUser(), createUser1PatchOps(), schemaRegistry);
     List<PatchOperation> result = updateRequest.getPatchOperations();
     log.info("testPatchPassthrough: " + result);
-    Assertions.assertThat(result)
+    assertThat(result)
               .isNotNull();
   }
 
   @Test
   public void testPatchToUpdate() throws Exception {
-    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", createUser1(), createUser1PatchOps(), schemaRegistry);
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", createUser(), createUser1PatchOps(), schemaRegistry);
     assertThrows(UnsupportedOperationException.class, () -> updateRequest.getResource());
   }
 
   @Test
   public void testAddSingleAttribute() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     user2.setNickName("Jon");
     UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> result = updateRequest.getPatchOperations();
@@ -139,9 +124,9 @@ public class UpdateRequestTest {
   
   @Test
   public void testAddSingleExtension() throws Exception {
-    ScimUser user1 = createUser1();
+    ScimUser user1 = createUser();
     EnterpriseExtension ext = user1.removeExtension(EnterpriseExtension.class);
-    ScimUser user2 = copy(user1);
+    ScimUser user2 = createUser();
     user2.addExtension(ext);
 
     UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
@@ -154,8 +139,8 @@ public class UpdateRequestTest {
 
   @Test
   public void testAddComplexAttribute() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     user2.getName()
          .setHonorificPrefix("Dr.");
 
@@ -169,8 +154,8 @@ public class UpdateRequestTest {
 
   @Test
   public void testAddMultiValuedAttribute() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     PhoneNumber mobilePhone = new GlobalPhoneNumberBuilder().globalNumber("+1(814)867-5306").build();
     mobilePhone.setType("mobile");
     mobilePhone.setPrimary(false);
@@ -192,9 +177,10 @@ public class UpdateRequestTest {
    */
   @Test
   public void testAddObjectToEmptyCollection() throws Exception {
-    ScimUser user1 = createUser1();
+    ScimUser user1 = createUser();
     user1.setPhoneNumbers(new ArrayList<>());
-    ScimUser user2 = copy(user1);
+    ScimUser user2 = createUser();
+    user2.setPhoneNumbers(new ArrayList<>());
     
     PhoneNumber mobilePhone = new GlobalPhoneNumberBuilder().globalNumber("+1(814)867-5306").build();
     mobilePhone.setType("mobile");
@@ -204,7 +190,7 @@ public class UpdateRequestTest {
     UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> operations = updateRequest.getPatchOperations();
     assertNotNull(operations);
-    assertEquals(1, operations.size());
+    assertThat(operations).hasSize(1);
     PatchOperation operation = operations.get(0);
     assertNotNull(operation.getValue());
     assertEquals(Type.ADD, operation.getOperation());
@@ -213,9 +199,10 @@ public class UpdateRequestTest {
   
   @Test
   public void testAddObjectsToEmptyCollection() throws Exception {
-    ScimUser user1 = createUser1();
+    ScimUser user1 = createUser();
     user1.setPhoneNumbers(new ArrayList<>());
-    ScimUser user2 = copy(user1);
+    ScimUser user2 = createUser();
+    user2.setPhoneNumbers(new ArrayList<>());
     
     PhoneNumber mobilePhone = new GlobalPhoneNumberBuilder().globalNumber("+1(814)867-5306").build();
     mobilePhone.setType("mobile");
@@ -247,8 +234,8 @@ public class UpdateRequestTest {
 
   @Test
   public void testReplaceSingleAttribute() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     user2.setActive(false);
 
     UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
@@ -261,8 +248,8 @@ public class UpdateRequestTest {
   
   @Test
   public void testReplaceExtensionSingleAttribute() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     user2.getExtension(EnterpriseExtension.class).setDepartment("Dept XYZ.");
 
     UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
@@ -275,8 +262,8 @@ public class UpdateRequestTest {
 
   @Test
   public void testReplaceComplexAttribute() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     user2.getName()
          .setFamilyName("Nobody");
 
@@ -290,8 +277,8 @@ public class UpdateRequestTest {
 
   @Test
   public void testReplaceMultiValuedAttribute() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     user2.getEmails()
          .stream()
          .filter(e -> e.getType()
@@ -308,8 +295,8 @@ public class UpdateRequestTest {
 
   @Test
   public void testRemoveSingleAttribute() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     user2.setUserName(null);
 
     UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
@@ -322,8 +309,8 @@ public class UpdateRequestTest {
   
   @Test
   public void testRemoveSingleExtension() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     user2.removeExtension(EnterpriseExtension.class);
 
     UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
@@ -336,8 +323,8 @@ public class UpdateRequestTest {
 
   @Test
   public void testRemoveComplexAttribute() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     user2.getName()
          .setMiddleName(null);
 
@@ -352,8 +339,8 @@ public class UpdateRequestTest {
 
   @Test
   public void testRemoveFullComplexAttribute() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     user2.setName(null);
 
     UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
@@ -366,8 +353,8 @@ public class UpdateRequestTest {
 
   @Test
   public void testRemoveMultiValuedAttribute() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     List<Email> newEmails = user2.getEmails()
                                  .stream()
                                  .filter(e -> e.getType()
@@ -385,8 +372,8 @@ public class UpdateRequestTest {
   
   @Test
   public void testRemoveMultiValuedAttributeWithSorting() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     
     Address localAddress = new Address();
     localAddress.setStreetAddress("123 Main Street");
@@ -407,8 +394,8 @@ public class UpdateRequestTest {
   
   @Test
   public void testAddMultiValuedAttributeWithSorting() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     
     Address localAddress = new Address();
     localAddress.setStreetAddress("123 Main Street");
@@ -430,8 +417,8 @@ public class UpdateRequestTest {
   
   @Test
   public void verifyEmptyArraysDoNotCauseMove() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     
     user1.setPhotos(new ArrayList<>());
     ExampleObjectExtension ext1 = new ExampleObjectExtension();
@@ -448,8 +435,8 @@ public class UpdateRequestTest {
   
   @Test
   public void verifyEmptyArraysAreNulled() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     
     //Set empty list on root object and verify no differences
     user1.setPhotos(new ArrayList<>());
@@ -458,7 +445,7 @@ public class UpdateRequestTest {
     assertTrue(operations.isEmpty(), "Empty Arrays are not being nulled out");
     
     //Reset user 1 and empty list on Extension and verify no differences
-    user1 = createUser1();
+    user1 = createUser();
     ExampleObjectExtension ext = new ExampleObjectExtension();
     ext.setList(new ArrayList<>());
     operations = updateRequest.getPatchOperations();
@@ -478,8 +465,8 @@ public class UpdateRequestTest {
    */
   @Test
   public void testAddArray() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     
     Photo photo = new Photo();
     photo.setType("photo");
@@ -498,7 +485,7 @@ public class UpdateRequestTest {
     UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>("1234", user1, user2, schemaRegistry);
     List<PatchOperation> operations = updateRequest.getPatchOperations();
 
-    Assertions.assertThat(operations)
+    assertThat(operations)
       .hasSize(3)
       .extracting("operation","value")
       .contains(
@@ -509,8 +496,8 @@ public class UpdateRequestTest {
   
   @Test
   public void testRemoveArray() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     
     Photo photo = new Photo();
     photo.setType("photo");
@@ -539,8 +526,8 @@ public class UpdateRequestTest {
   @Disabled
   //TODO: do asserts
   public void testNonTypedAttributeListGetUseablePath() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     
     ExampleObjectExtension ext1 = new ExampleObjectExtension();
     ext1.setList(Stream.of(FIRST,SECOND,THIRD).collect(Collectors.toList()));
@@ -562,8 +549,8 @@ public class UpdateRequestTest {
   @Disabled
   //TODO: do asserts
   public void testMoveFormatNameToNicknamePart1() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     
     String nickname = "John Xander Anyman";
     user1.setNickName(nickname);
@@ -580,8 +567,8 @@ public class UpdateRequestTest {
   @Disabled
   //TODO: do asserts
   public void testMoveFormatNameToNicknamePart2() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     
     String nickname = "John Xander Anyman";
     user1.setNickName(nickname);
@@ -600,8 +587,8 @@ public class UpdateRequestTest {
   @Disabled
   //TODO: do asserts
   public void testMoveFormatNameToNicknamePart3() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     
     String nickname = "John Xander Anyman";
     user1.setNickName(nickname);
@@ -621,8 +608,8 @@ public class UpdateRequestTest {
   //TODO: do asserts
   public void testMoveFormatNameToNicknamePart4() throws Exception {
 
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     
     String nickname = "John Xander Anyman";
     user1.setNickName(nickname);
@@ -641,8 +628,8 @@ public class UpdateRequestTest {
   @Disabled
   //TODO: do asserts
   public void testMoveFormatNameToNicknamePart5() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     
     String nickname = "John Xander Anyman";
     user1.setNickName("");
@@ -660,8 +647,8 @@ public class UpdateRequestTest {
   @ParameterizedTest
   @MethodSource("testListOfStringsParameters")
   public void testListOfStringsParameterized(List<String> list1, List<String> list2, List<ExpectedPatchOperation> ops) throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     
     ExampleObjectExtension ext1 = new ExampleObjectExtension();
     ext1.setList(list1);
@@ -730,8 +717,8 @@ public class UpdateRequestTest {
   @Test
   //TODO: do parameterized test
   public void offsetTest1() throws Exception {
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     
     ExampleObjectExtension ext1 = new ExampleObjectExtension();
     ext1.setList(Stream.of("D","M","Y","Z","Z","Z","Z","Z").collect(Collectors.toList()));
@@ -752,8 +739,8 @@ public class UpdateRequestTest {
   @Test
   public void testMoveFormatNameToNicknamePart6() throws Exception {
 
-    ScimUser user1 = createUser1();
-    ScimUser user2 = copy(user1);
+    ScimUser user1 = createUser();
+    ScimUser user2 = createUser();
     
     String nickname = "John Xander Anyman";
     user1.setNickName(null);
@@ -781,7 +768,7 @@ public class UpdateRequestTest {
 //    final int expectedNumberOfOperationsWithBug = 4;
 //
 //    ScimUser user1 = createUser1();
-//    ScimUser user2 = copy(user1);
+//    ScimUser user2 = createUser();
 //    user2.getPhoneNumbers().removeIf(p -> p.getType().equals("home"));
 //    
 //    PhoneNumber workNumber = user2.getPhoneNumbers().stream().filter(p -> p.getType().equals("work")).findFirst().orElse(null);
@@ -796,21 +783,21 @@ public class UpdateRequestTest {
   }
 
   private PatchOperation assertSingleResult(List<PatchOperation> result) {
-    Assertions.assertThat(result)
+    assertThat(result)
               .isNotNull();
-    Assertions.assertThat(result)
+    assertThat(result)
               .hasSize(1);
     PatchOperation actual = result.get(0);
     return actual;
   }
 
   private void checkAssertions(PatchOperation actual, Type op, String path, Object value) throws FilterParseException {
-    Assertions.assertThat(actual.getOperation())
+    assertThat(actual.getOperation())
               .isEqualTo(op);
-    Assertions.assertThat(actual.getPath()
+    assertThat(actual.getPath()
                                 .toString())
               .isEqualTo(path);
-    Assertions.assertThat(actual.getValue())
+    assertThat(actual.getValue())
               .isEqualTo(value);
   }
   
@@ -835,7 +822,7 @@ public class UpdateRequestTest {
     return homeAddress;
   }
 
-  public static ScimUser createUser1() throws PhoneNumberParseException {
+  public static ScimUser createUser() throws PhoneNumberParseException {
     ScimUser user = new ScimUser();
     user.setId("912345678");
     user.setExternalId("912345678");
@@ -920,12 +907,6 @@ public class UpdateRequestTest {
     return user;
   }
 
-  private ScimUser copy(ScimUser scimUser) throws IOException {
-    ObjectMapper objMapper = new ObjectMapperFactory(schemaRegistry).createObjectMapper();
-    String json = objMapper.writeValueAsString(scimUser);
-    return objMapper.readValue(json, ScimUser.class);
-  }
-
   private List<PatchOperation> createUser1PatchOps() throws FilterParseException {
     List<PatchOperation> patchOperations = new ArrayList<>();
     PatchOperation removePhoneNumberOp = new PatchOperation();
diff --git a/scim-core/src/test/java/org/apache/directory/scim/core/repository/utility/ExampleObjectExtension.java b/scim-core/src/test/java/org/apache/directory/scim/core/repository/utility/ExampleObjectExtension.java
new file mode 100644
index 00000000..963d1720
--- /dev/null
+++ b/scim-core/src/test/java/org/apache/directory/scim/core/repository/utility/ExampleObjectExtension.java
@@ -0,0 +1,95 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+ 
+* http://www.apache.org/licenses/LICENSE-2.0
+
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.directory.scim.core.repository.utility;
+
+import jakarta.xml.bind.annotation.*;
+import lombok.Data;
+import org.apache.directory.scim.spec.annotation.ScimAttribute;
+import org.apache.directory.scim.spec.annotation.ScimExtensionType;
+import org.apache.directory.scim.spec.resources.ScimExtension;
+import org.apache.directory.scim.spec.schema.Schema.Attribute.Mutability;
+import org.apache.directory.scim.spec.schema.Schema.Attribute.Returned;
+
+import java.io.Serializable;
+import java.util.List;
+
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.NONE)
+@ScimExtensionType(required = false, name = "ExampleObject", id = ExampleObjectExtension.URN, description = "Example Object Extensions.")
+@Data
+public class ExampleObjectExtension implements ScimExtension {
+
+  private static final long serialVersionUID = -5398090056271556423L;
+
+  public static final String URN = "urn:ietf:params:scim:schemas:extension:example:2.0:Object";
+
+  @XmlType
+  @XmlAccessorType(XmlAccessType.NONE)
+  @Data
+  public static class ComplexObject implements Serializable {
+
+    private static final long serialVersionUID = 2822581434679824690L;
+
+    @ScimAttribute(description = "The \"id\" of the complex object.")
+    @XmlElement
+    private String value;
+
+    @ScimAttribute(mutability = Mutability.READ_ONLY, description = "displayName of the object.")
+    @XmlElement
+    private String displayName;
+  }
+
+  @ScimAttribute(returned = Returned.ALWAYS)
+  @XmlElement
+  private String valueAlways;
+
+  @ScimAttribute(returned = Returned.DEFAULT)
+  @XmlElement
+  private String valueDefault;
+
+  @ScimAttribute(returned = Returned.NEVER)
+  @XmlElement
+  private String valueNever;
+
+  @ScimAttribute(returned = Returned.REQUEST)
+  @XmlElement
+  private String valueRequest;
+  
+  @ScimAttribute(returned = Returned.REQUEST)
+  @XmlElement
+  private ComplexObject valueComplex;
+  
+  @ScimAttribute
+  @XmlElement
+  private List<String> list;
+  
+  @ScimAttribute
+  @XmlElement
+  private List<Order> enumList;
+  
+  @ScimAttribute
+  @XmlElement
+  private Subobject subobject;
+
+  @Override
+  public String getUrn() {
+    return URN;
+  }
+}
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/schema/ScimExtensionRegistryProducer.java b/scim-core/src/test/java/org/apache/directory/scim/core/repository/utility/Order.java
similarity index 69%
rename from scim-server/src/main/java/org/apache/directory/scim/server/schema/ScimExtensionRegistryProducer.java
rename to scim-core/src/test/java/org/apache/directory/scim/core/repository/utility/Order.java
index 5c564e95..c992ab8d 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/schema/ScimExtensionRegistryProducer.java
+++ b/scim-core/src/test/java/org/apache/directory/scim/core/repository/utility/Order.java
@@ -17,17 +17,28 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.schema;
+package org.apache.directory.scim.core.repository.utility;
 
-import jakarta.enterprise.inject.Produces;
-
-import org.apache.directory.scim.spec.extension.ScimExtensionRegistry;
-
-public class ScimExtensionRegistryProducer {
-
-  @Produces
-  public ScimExtensionRegistry produceScimExtensionRegistry() {
-    return ScimExtensionRegistry.getInstance();
+public enum Order {
+  
+  FIRST("first"),
+  SECOND("second"),
+  THIRD("third"),
+  FOURTH("fourth");
+  
+  Order(String value) {
+    this.value = value;
   }
   
+  private final String value;
+  
+  public String getValue() {
+    return value;
+  }
+  
+  @Override
+  public String toString() {
+    return value;
+  }
+
 }
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/exceptions/ClientFilterException.java b/scim-core/src/test/java/org/apache/directory/scim/core/repository/utility/Subobject.java
similarity index 54%
rename from scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/exceptions/ClientFilterException.java
rename to scim-core/src/test/java/org/apache/directory/scim/core/repository/utility/Subobject.java
index 805aaa9e..c0e087df 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/exceptions/ClientFilterException.java
+++ b/scim-core/src/test/java/org/apache/directory/scim/core/repository/utility/Subobject.java
@@ -17,24 +17,41 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.repository.extensions.exceptions;
-
-import jakarta.ws.rs.core.Response.Status;
+package org.apache.directory.scim.core.repository.utility;
 
+import jakarta.xml.bind.annotation.XmlElement;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
+import org.apache.directory.scim.spec.annotation.ScimAttribute;
+
+import java.io.Serializable;
+import java.util.List;
 
 @Data
-@EqualsAndHashCode(callSuper=true)
-public class ClientFilterException extends Exception {
+public class Subobject implements Serializable {
+  
+  private static final long serialVersionUID = -8081556701833520316L;
+
+  @ScimAttribute
+  @XmlElement
+  private String string1;
+  
+  @ScimAttribute
+  @XmlElement
+  private String string2;
   
-  private static final long serialVersionUID = 3308947684934769952L;
+  @ScimAttribute
+  @XmlElement
+  private Boolean boolean1;
   
-  Status status;
+  @ScimAttribute
+  @XmlElement
+  private Boolean boolean2;
   
-  public ClientFilterException(Status status, String message) {
-    super(message);
-    this.status = status;
-  }
+  @ScimAttribute
+  @XmlElement
+  private List<String> list1;
 
+  @ScimAttribute
+  @XmlElement
+  private List<String> list2;
 }
diff --git a/scim-coverage/pom.xml b/scim-coverage/pom.xml
index eb88fb2a..ac369c79 100644
--- a/scim-coverage/pom.xml
+++ b/scim-coverage/pom.xml
@@ -40,6 +40,10 @@
         <groupId>org.apache.directory.scim</groupId>
         <artifactId>scim-tools-common</artifactId>
       </dependency>
+      <dependency>
+        <groupId>org.apache.directory.scim</groupId>
+        <artifactId>scim-core</artifactId>
+      </dependency>
       <dependency>
         <groupId>org.apache.directory.scim</groupId>
         <artifactId>scim-server</artifactId>
diff --git a/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/JerseyApplication.java b/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/JerseyApplication.java
index 1ff38f1a..a63fd671 100644
--- a/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/JerseyApplication.java
+++ b/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/JerseyApplication.java
@@ -21,7 +21,7 @@ package org.apache.directory.scim.example.jersey;
 
 import jakarta.inject.Inject;
 import jakarta.ws.rs.core.UriBuilder;
-import org.apache.directory.scim.server.ScimConfiguration;
+import org.apache.directory.scim.core.Initializable;
 import org.apache.directory.scim.server.configuration.ServerConfiguration;
 import org.apache.directory.scim.server.rest.ScimResourceHelper;
 
@@ -54,15 +54,15 @@ public class JerseyApplication extends Application {
   }
 
   /**
-   * A {@link ScimConfiguration} allow for eager initialization of beans, this class configures the {@link ServerConfiguration}.
+   * A {@link Initializable} allow for eager initialization of beans, this class configures the {@link ServerConfiguration}.
    */
-  public static class ServerConfigInitializer implements ScimConfiguration {
+  public static class ServerConfigInitializer implements Initializable {
 
     @Inject
     private ServerConfiguration serverConfiguration;
 
     @Override
-    public void configure() {
+    public void initialize() {
 
       // Set any unique configuration bits
       serverConfiguration
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 fca8299b..3436da4d 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
@@ -24,9 +24,8 @@ import jakarta.inject.Inject;
 import jakarta.ws.rs.core.Response;
 import org.apache.directory.scim.server.exception.UnableToCreateResourceException;
 import org.apache.directory.scim.server.exception.UnableToUpdateResourceException;
-import org.apache.directory.scim.server.repository.Repository;
-import org.apache.directory.scim.server.repository.UpdateRequest;
-import org.apache.directory.scim.server.schema.SchemaRegistry;
+import org.apache.directory.scim.core.repository.Repository;
+import org.apache.directory.scim.core.repository.UpdateRequest;
 import org.apache.directory.scim.spec.protocol.filter.FilterExpressions;
 import org.apache.directory.scim.spec.protocol.filter.FilterResponse;
 import org.apache.directory.scim.spec.protocol.search.Filter;
@@ -43,6 +42,7 @@ import java.util.stream.Collectors;
 
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Named;
+import org.apache.directory.scim.core.schema.SchemaRegistry;
 
 @Named
 @ApplicationScoped
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 1d190962..23724204 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 @@ package org.apache.directory.scim.example.jersey.service;
 
 import jakarta.enterprise.context.ApplicationScoped;
 import org.apache.directory.scim.server.exception.UnableToResolveIdResourceException;
-import org.apache.directory.scim.server.repository.SelfIdResolver;
+import org.apache.directory.scim.core.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 7dc686b4..3b93eeb8 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
@@ -33,15 +33,15 @@ import jakarta.ws.rs.core.Response;
 import org.apache.directory.scim.example.jersey.extensions.LuckyNumberExtension;
 import org.apache.directory.scim.server.exception.UnableToCreateResourceException;
 import org.apache.directory.scim.server.exception.UnableToUpdateResourceException;
-import org.apache.directory.scim.server.repository.Repository;
-import org.apache.directory.scim.server.repository.UpdateRequest;
-import org.apache.directory.scim.server.schema.SchemaRegistry;
+import org.apache.directory.scim.core.repository.Repository;
+import org.apache.directory.scim.core.repository.UpdateRequest;
 import org.apache.directory.scim.spec.protocol.filter.FilterExpressions;
 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;
 import org.apache.directory.scim.spec.protocol.search.SortRequest;
 import org.apache.directory.scim.spec.resources.*;
+import org.apache.directory.scim.core.schema.SchemaRegistry;
 
 /**
  * Creates a singleton (effectively) Repository<ScimUser> with a memory-based
diff --git a/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/rest/RestApplication.java b/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/rest/RestApplication.java
index 5a65c002..97f0850c 100644
--- a/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/rest/RestApplication.java
+++ b/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/rest/RestApplication.java
@@ -20,7 +20,7 @@
 package org.apache.directory.scim.example.memory.rest;
 
 import jakarta.inject.Inject;
-import org.apache.directory.scim.server.ScimConfiguration;
+import org.apache.directory.scim.core.Initializable;
 import org.apache.directory.scim.server.configuration.ServerConfiguration;
 import org.apache.directory.scim.server.rest.ScimResourceHelper;
 
@@ -29,9 +29,6 @@ import java.util.Set;
 
 import jakarta.ws.rs.ApplicationPath;
 import jakarta.ws.rs.core.Application;
-import org.apache.directory.scim.spec.schema.ServiceProviderConfiguration;
-
-import static org.apache.directory.scim.spec.schema.ServiceProviderConfiguration.AuthenticationSchema.oauthBearer;
 
 @ApplicationPath("v2")
 public class RestApplication extends Application {
@@ -47,15 +44,15 @@ public class RestApplication extends Application {
   }
 
   /**
-   * A {@link ScimConfiguration} allow for eager initialization of beans, this class configures the {@link ServerConfiguration}.
+   * A {@link Initializable} allow for eager initialization of beans, this class configures the {@link ServerConfiguration}.
    */
-  public static class ServerConfigInitializer implements ScimConfiguration {
+  public static class ServerConfigInitializer implements Initializable {
 
     @Inject
     private ServerConfiguration serverConfiguration;
 
     @Override
-    public void configure() {
+    public void initialize() {
       // Set any unique configuration bits
       serverConfiguration
         .setId("scimple-in-memory-example")
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 2288eba2..c61f2572 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
@@ -24,9 +24,8 @@ import jakarta.inject.Inject;
 import jakarta.ws.rs.core.Response;
 import org.apache.directory.scim.server.exception.UnableToCreateResourceException;
 import org.apache.directory.scim.server.exception.UnableToUpdateResourceException;
-import org.apache.directory.scim.server.repository.Repository;
-import org.apache.directory.scim.server.repository.UpdateRequest;
-import org.apache.directory.scim.server.schema.SchemaRegistry;
+import org.apache.directory.scim.core.repository.Repository;
+import org.apache.directory.scim.core.repository.UpdateRequest;
 import org.apache.directory.scim.spec.protocol.filter.FilterExpressions;
 import org.apache.directory.scim.spec.protocol.filter.FilterResponse;
 import org.apache.directory.scim.spec.protocol.search.Filter;
@@ -43,6 +42,7 @@ import java.util.stream.Collectors;
 
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Named;
+import org.apache.directory.scim.core.schema.SchemaRegistry;
 
 @Named
 @ApplicationScoped
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 96019d32..711a1eac 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 @@ package org.apache.directory.scim.example.memory.service;
 
 import jakarta.enterprise.context.ApplicationScoped;
 import org.apache.directory.scim.server.exception.UnableToResolveIdResourceException;
-import org.apache.directory.scim.server.repository.SelfIdResolver;
+import org.apache.directory.scim.core.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 f845b9e1..02d44ae3 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
@@ -33,15 +33,15 @@ import jakarta.ws.rs.core.Response;
 import org.apache.directory.scim.example.memory.extensions.LuckyNumberExtension;
 import org.apache.directory.scim.server.exception.UnableToCreateResourceException;
 import org.apache.directory.scim.server.exception.UnableToUpdateResourceException;
-import org.apache.directory.scim.server.repository.Repository;
-import org.apache.directory.scim.server.repository.UpdateRequest;
-import org.apache.directory.scim.server.schema.SchemaRegistry;
+import org.apache.directory.scim.core.repository.Repository;
+import org.apache.directory.scim.core.repository.UpdateRequest;
 import org.apache.directory.scim.spec.protocol.filter.FilterExpressions;
 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;
 import org.apache.directory.scim.spec.protocol.search.SortRequest;
 import org.apache.directory.scim.spec.resources.*;
+import org.apache.directory.scim.core.schema.SchemaRegistry;
 
 /**
  * Creates a singleton (effectively) Repository<ScimUser> with a memory-based
diff --git a/scim-server/pom.xml b/scim-server/pom.xml
index 583617ac..4fb9590c 100644
--- a/scim-server/pom.xml
+++ b/scim-server/pom.xml
@@ -41,6 +41,10 @@
       <groupId>jakarta.annotation</groupId>
       <artifactId>jakarta.annotation-api</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.directory.scim</groupId>
+      <artifactId>scim-core</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.apache.directory.scim</groupId>
       <artifactId>scim-spec-schema</artifactId>
@@ -103,11 +107,6 @@
       <artifactId>catch-exception</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>com.flipkart.zjsonpatch</groupId>
-      <artifactId>zjsonpatch</artifactId>
-      <version>0.4.12</version>
-    </dependency>
 
     <dependency>
       <groupId>org.apache.directory.scim</groupId>
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/ScimServerInitializer.java b/scim-server/src/main/java/org/apache/directory/scim/server/ScimServerInitializer.java
index 8c7bfe62..ceb7ea91 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/ScimServerInitializer.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/ScimServerInitializer.java
@@ -25,6 +25,7 @@ import jakarta.enterprise.inject.spi.Bean;
 import jakarta.enterprise.inject.spi.BeanManager;
 import jakarta.enterprise.inject.spi.Extension;
 import jakarta.enterprise.inject.spi.ProcessBean;
+import org.apache.directory.scim.core.Initializable;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -34,15 +35,15 @@ public class ScimServerInitializer implements Extension {
   private List<Bean<?>> scimConfigBeans = new ArrayList<>();
 
   public <T> void collect(@Observes ProcessBean<T> event) {
-    if (ScimConfiguration.class.isAssignableFrom(event.getBean().getBeanClass())) {
+    if (Initializable.class.isAssignableFrom(event.getBean().getBeanClass())) {
       scimConfigBeans.add(event.getBean());
     }
   }
 
   public void load(@Observes AfterDeploymentValidation event, BeanManager beanManager) {
     scimConfigBeans.forEach(bean -> {
-      ScimConfiguration configBean = (ScimConfiguration) beanManager.getReference(bean, bean.getBeanClass(), beanManager.createCreationalContext(bean));
-      configBean.configure();
+      Initializable configBean = (Initializable) beanManager.getReference(bean, bean.getBeanClass(), beanManager.createCreationalContext(bean));
+      configBean.initialize();
     });
   }
 }
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToCreateResourceException.java b/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToCreateResourceException.java
index 335a076e..be83d53e 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToCreateResourceException.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToCreateResourceException.java
@@ -23,6 +23,7 @@ import jakarta.ws.rs.core.Response.Status;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.apache.directory.scim.core.repository.ResourceException;
 
 @Data
 @EqualsAndHashCode(callSuper=true)
@@ -31,10 +32,10 @@ public class UnableToCreateResourceException extends ResourceException {
   private static final long serialVersionUID = -3872700870424005641L;
 
   public UnableToCreateResourceException(Status status, String message) {
-    super(status, message);
+    super(status.getStatusCode(), message);
   }
 
   public UnableToCreateResourceException(Status status, String message, Throwable cause) {
-    super(status, message, cause);
+    super(status.getStatusCode(), message, cause);
   }
 }
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToDeleteResourceException.java b/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToDeleteResourceException.java
index 64a21dd9..d332fc62 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToDeleteResourceException.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToDeleteResourceException.java
@@ -23,6 +23,7 @@ import jakarta.ws.rs.core.Response.Status;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.apache.directory.scim.core.repository.ResourceException;
 
 @Data
 @EqualsAndHashCode(callSuper=true)
@@ -31,10 +32,10 @@ public class UnableToDeleteResourceException extends ResourceException {
   private static final long serialVersionUID = -3872700870424005641L;
 
   public UnableToDeleteResourceException(Status status, String message) {
-    super(status, message);
+    super(status.getStatusCode(), message);
   }
 
   public UnableToDeleteResourceException(Status status, String message, Throwable cause) {
-    super(status, message, cause);
+    super(status.getStatusCode(), message, cause);
   }
 }
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToResolveIdResourceException.java b/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToResolveIdResourceException.java
index 21b59085..cacae1b4 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToResolveIdResourceException.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToResolveIdResourceException.java
@@ -19,10 +19,11 @@
 
 package org.apache.directory.scim.server.exception;
 
-import jakarta.ws.rs.core.Response.Status;
 
+import jakarta.ws.rs.core.Response.Status;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.apache.directory.scim.core.repository.ResourceException;
 
 @Data
 @EqualsAndHashCode(callSuper=true)
@@ -31,10 +32,10 @@ public class UnableToResolveIdResourceException extends ResourceException {
   private static final long serialVersionUID = -7401709416973728017L;
 
   public UnableToResolveIdResourceException(Status status, String message) {
-    super(status, message);
+    super(status.getStatusCode(), message);
   }
 
   public UnableToResolveIdResourceException(Status status, String message, Throwable cause) {
-    super(status, message, cause);
+    super(status.getStatusCode(), message, cause);
   }
 }
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToRetrieveExtensionsResourceException.java b/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToRetrieveExtensionsResourceException.java
index 37c184e3..edf646da 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToRetrieveExtensionsResourceException.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToRetrieveExtensionsResourceException.java
@@ -23,6 +23,7 @@ import jakarta.ws.rs.core.Response.Status;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.apache.directory.scim.core.repository.ResourceException;
 
 @Data
 @EqualsAndHashCode(callSuper=true)
@@ -31,10 +32,10 @@ public class UnableToRetrieveExtensionsResourceException extends ResourceExcepti
   private static final long serialVersionUID = -3872700870424005641L;
 
   public UnableToRetrieveExtensionsResourceException(Status status, String message) {
-    super(status, message);
+    super(status.getStatusCode(), message);
   }
 
   public UnableToRetrieveExtensionsResourceException(Status status, String message, Throwable cause) {
-    super(status, message, cause);
+    super(status.getStatusCode(), message, cause);
   }
 }
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToRetrieveResourceException.java b/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToRetrieveResourceException.java
index f407d22e..3c1c8bb7 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToRetrieveResourceException.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToRetrieveResourceException.java
@@ -23,6 +23,7 @@ import jakarta.ws.rs.core.Response.Status;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.apache.directory.scim.core.repository.ResourceException;
 
 @Data
 @EqualsAndHashCode(callSuper=true)
@@ -31,10 +32,10 @@ public class UnableToRetrieveResourceException extends ResourceException {
   private static final long serialVersionUID = -3872700870424005641L;
 
   public UnableToRetrieveResourceException(Status status, String message) {
-    super(status, message);
+    super(status.getStatusCode(), message);
   }
 
   public UnableToRetrieveResourceException(Status status, String message, Throwable cause) {
-    super(status, message, cause);
+    super(status.getStatusCode(), message, cause);
   }
 }
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToUpdateResourceException.java b/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToUpdateResourceException.java
index 8938a805..075d0856 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToUpdateResourceException.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/exception/UnableToUpdateResourceException.java
@@ -23,6 +23,7 @@ import jakarta.ws.rs.core.Response.Status;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.apache.directory.scim.core.repository.ResourceException;
 
 @Data
 @EqualsAndHashCode(callSuper=true)
@@ -31,10 +32,10 @@ public class UnableToUpdateResourceException extends ResourceException {
   private static final long serialVersionUID = -3872700870424005641L;
 
   public UnableToUpdateResourceException(Status status, String message) {
-    super(status, message);
+    super(status.getStatusCode(), message);
   }
 
   public UnableToUpdateResourceException(Status status, String message, Throwable cause) {
-    super(status, message, cause);
+    super(status.getStatusCode(), message, cause);
   }
 }
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 d5b0042c..bd1fcebf 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
@@ -27,7 +27,6 @@ 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.exception.AttributeException;
-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;
@@ -39,6 +38,7 @@ import org.apache.directory.scim.spec.schema.Schema;
 import org.apache.directory.scim.spec.schema.Schema.Attribute;
 import org.apache.directory.scim.spec.schema.Schema.Attribute.Returned;
 import org.apache.directory.scim.spec.schema.Schema.Attribute.Type;
+import org.apache.directory.scim.core.schema.SchemaRegistry;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
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 6d2e8607..e0f40ff2 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
@@ -37,20 +37,20 @@ import jakarta.ws.rs.core.Response.Status;
 import jakarta.ws.rs.core.Response.Status.Family;
 
 import org.apache.directory.scim.server.exception.*;
-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.apache.directory.scim.core.repository.RepositoryRegistry;
+import org.apache.directory.scim.core.repository.Repository;
+import org.apache.directory.scim.core.schema.SchemaRegistry;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 
-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.core.repository.UpdateRequest;
+import org.apache.directory.scim.core.repository.annotations.ScimProcessingExtension;
+import org.apache.directory.scim.core.repository.extensions.AttributeFilterExtension;
+import org.apache.directory.scim.core.repository.extensions.ProcessingExtension;
+import org.apache.directory.scim.core.repository.extensions.ScimRequestContext;
+import org.apache.directory.scim.core.repository.extensions.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;
@@ -120,10 +120,10 @@ public abstract class BaseResourceTypeResourceImpl<T extends ScimResource> imple
       try {
         resource = repository.get(id);
       } catch (UnableToRetrieveResourceException e2) {
-        if (e2.getStatus()
-              .getFamily()
+        Status status = Status.fromStatusCode(e2.getStatus());
+        if (status.getFamily()
               .equals(Family.SERVER_ERROR)) {
-          return createGenericExceptionResponse(e2, e2.getStatus());
+          return createGenericExceptionResponse(e2, status);
         }
       } catch (Exception e) {
         log.error("Uncaught repository exception", e);
@@ -246,7 +246,7 @@ public abstract class BaseResourceTypeResourceImpl<T extends ScimResource> imple
       try {
         created = repository.create(resource);
       } catch (UnableToCreateResourceException e1) {
-        Status status = e1.getStatus();
+        Status status = Status.fromStatusCode(e1.getStatus());
         ErrorResponse er = new ErrorResponse(status, "Error");
 
         if (status == Status.CONFLICT) {
@@ -346,8 +346,7 @@ public abstract class BaseResourceTypeResourceImpl<T extends ScimResource> imple
       try {
         filterResp = repository.find(filter, pageRequest, sortRequest);
       } catch (UnableToRetrieveResourceException e1) {
-        log.info("Caught an UnableToRetrieveResourceException " + e1.getMessage() + " : " + e1.getStatus()
-                                                                                              .toString());
+        log.info("Caught an UnableToRetrieveResourceException " + e1.getMessage() + " : " + e1.getStatus());
         return createGenericExceptionResponse(e1, e1.getStatus());
       } catch (Exception e) {
         log.error("Uncaught repository exception", e);
@@ -632,10 +631,7 @@ public abstract class BaseResourceTypeResourceImpl<T extends ScimResource> imple
         repository.delete(id);
         return response;
       } catch (UnableToDeleteResourceException e) {
-        Status status = e.getStatus();
-        response = Response.status(status)
-                           .build();
-
+        response = Response.status(e.getStatus()).build();
         log.error("Unable to delete resource", e);
 
         return response;
@@ -683,6 +679,10 @@ public abstract class BaseResourceTypeResourceImpl<T extends ScimResource> imple
                   .build();
   }
 
+  static Response createGenericExceptionResponse(Throwable e1, int statusCode) {
+    return createGenericExceptionResponse(e1, Status.fromStatusCode(statusCode));
+  }
+
   public static Response createGenericExceptionResponse(Throwable e1, Status status) {
     Status myStatus = status;
     if (myStatus == null) {
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 00f2a78c..659cd6ec 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
@@ -29,14 +29,14 @@ import jakarta.ws.rs.core.Response.Status;
 import jakarta.ws.rs.core.UriInfo;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.directory.scim.core.repository.ResourceException;
 import org.apache.directory.scim.server.exception.UnableToCreateResourceException;
 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.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.core.repository.Repository;
+import org.apache.directory.scim.core.repository.RepositoryRegistry;
+import org.apache.directory.scim.core.repository.UpdateRequest;
 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;
@@ -49,6 +49,7 @@ import org.apache.directory.scim.spec.resources.ScimResource;
 import org.apache.directory.scim.spec.schema.Schema;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.directory.scim.core.schema.SchemaRegistry;
 
 @Slf4j
 @ApplicationScoped
@@ -228,7 +229,7 @@ public class BulkResourceImpl implements BulkResource {
       if (!errorCountExceeded && !(operationResult.getResponse() instanceof ErrorResponse)) {
         try {
           this.handleBulkOperationMethod(allUnresolveds, operationResult, bulkIdKeyToOperationResult, uriInfo);
-        } catch (UnableToCreateResourceException | UnableToDeleteResourceException | UnableToUpdateResourceException resourceException) {
+        } catch (ResourceException resourceException) {
           log.error("Failed to do bulk operation", resourceException);
 
           errorCount += errorCountIncrement;
@@ -308,7 +309,7 @@ public class BulkResourceImpl implements BulkResource {
         bulkOperationResult.setLocation(null);
         createAndSetErrorResponse(bulkOperationResult, unableToUpdateResourceException.getStatus(), detail);
         this.cleanup(bulkIdKey, transitiveReverseDependencies, bulkIdKeyToOperationResult);
-      } catch (UnableToRetrieveResourceException e) {
+      } catch (ResourceException e) {
         log.error("Could not complete final resolution pass, unresolvable bulkId", e);
 
         String detail = e.getLocalizedMessage();
@@ -352,7 +353,7 @@ public class BulkResourceImpl implements BulkResource {
       if (StringUtils.isNotBlank(scimResource.getId())) {
         repository.delete(scimResource.getId());
       }
-    } catch (UnableToDeleteResourceException unableToDeleteResourceException) {
+    } catch (ResourceException unableToDeleteResourceException) {
       log.error("Could not delete ScimResource after failure: {}", scimResource);
     }
     for (String dependentBulkIdKey : reverseDependencies) {
@@ -370,7 +371,7 @@ public class BulkResourceImpl implements BulkResource {
           dependentOperationResult.setLocation(null);
           createAndSetErrorResponse(dependentOperationResult, Status.CONFLICT, String.format(OPERATION_DEPENDS_ON_FAILED_OPERATION, bulkId, dependentBulkIdKey));
           dependentResourceRepository.delete(dependentResourceId);
-        } catch (UnableToDeleteResourceException unableToDeleteResourceException) {
+        } catch (ResourceException unableToDeleteResourceException) {
           log.error("Could not delete depenedent ScimResource after failing to update dependee", unableToDeleteResourceException);
         }
     }
@@ -390,7 +391,7 @@ public class BulkResourceImpl implements BulkResource {
    * @throws UnableToUpdateResourceException
    * @throws UnresolvableOperationException
    */
-  private void handleBulkOperationMethod(List<IWishJavaHadTuples> unresolveds, BulkOperation operationResult, Map<String, BulkOperation> bulkIdKeyToOperationResult, UriInfo uriInfo) throws UnableToCreateResourceException, UnableToDeleteResourceException, UnableToUpdateResourceException, UnresolvableOperationException {
+  private void handleBulkOperationMethod(List<IWishJavaHadTuples> unresolveds, BulkOperation operationResult, Map<String, BulkOperation> bulkIdKeyToOperationResult, UriInfo uriInfo) throws ResourceException, UnresolvableOperationException {
     ScimResource scimResource = operationResult.getData();
     Method bulkOperationMethod = operationResult.getMethod();
     String bulkId = operationResult.getBulkId();
@@ -485,6 +486,10 @@ public class BulkResourceImpl implements BulkResource {
     }
   }
 
+  private static void createAndSetErrorResponse(BulkOperation operationResult, int statusCode, String detail) {
+    createAndSetErrorResponse(operationResult, Status.fromStatusCode(statusCode), detail);
+  }
+
   private static void createAndSetErrorResponse(BulkOperation operationResult, Status status, String detail) {
     ErrorResponse error = new ErrorResponse(status, detail);
     operationResult.setResponse(error);
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 c47afc71..a76d9fad 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,10 +25,10 @@ package org.apache.directory.scim.server.rest;
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.directory.scim.server.repository.RepositoryRegistry;
-import org.apache.directory.scim.server.schema.SchemaRegistry;
+import org.apache.directory.scim.core.repository.RepositoryRegistry;
 import org.apache.directory.scim.spec.protocol.GroupResource;
 import org.apache.directory.scim.spec.resources.ScimGroup;
+import org.apache.directory.scim.core.schema.SchemaRegistry;
 
 @Slf4j
 @ApplicationScoped
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 365745f7..04d38fb4 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,12 +23,12 @@ import com.fasterxml.jackson.annotation.JsonInclude;
 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.SchemaRegistry;
 import org.apache.directory.scim.spec.resources.ScimResource;
 
 import jakarta.enterprise.inject.Produces;
 import jakarta.inject.Inject;
 import jakarta.ws.rs.ext.Provider;
+import org.apache.directory.scim.core.schema.SchemaRegistry;
 
 /**
  * Creates and configures an {@link ObjectMapper} used for {@code application/scim+json} parsing.
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 ef08366a..05669012 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
@@ -28,11 +28,11 @@ import jakarta.inject.Inject;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.Response.Status;
 
-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;
 import org.apache.directory.scim.spec.schema.ResourceType;
+import org.apache.directory.scim.core.schema.SchemaRegistry;
 
 @ApplicationScoped
 public class ResourceTypesResourceImpl implements ResourceTypesResource {
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 21b61b7b..fb6d21c5 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
@@ -29,11 +29,11 @@ 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.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;
 import org.apache.directory.scim.spec.schema.Schema;
+import org.apache.directory.scim.core.schema.SchemaRegistry;
 
 @ApplicationScoped
 public class SchemaResourceImpl implements SchemaResource {
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 3e395c93..13280acb 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,8 +32,8 @@ import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 
-import org.apache.directory.scim.server.schema.SchemaRegistry;
 import org.apache.directory.scim.spec.resources.ScimResource;
+import org.apache.directory.scim.core.schema.SchemaRegistry;
 
 public class ScimResourceDeserializer extends JsonDeserializer<ScimResource> {
   private final SchemaRegistry schemaRegistry;
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/rest/ScimResourceHelper.java b/scim-server/src/main/java/org/apache/directory/scim/server/rest/ScimResourceHelper.java
index 0a46544c..26f52bfd 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/rest/ScimResourceHelper.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/rest/ScimResourceHelper.java
@@ -19,7 +19,6 @@
 
 package org.apache.directory.scim.server.rest;
 
-import java.util.HashSet;
 import java.util.Set;
 
 import org.apache.directory.scim.server.exception.FilterParseExceptionMapper;
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 62421522..74fd476a 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
@@ -27,8 +27,9 @@ import jakarta.inject.Inject;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.Response.Status;
 
+import org.apache.directory.scim.core.repository.ResourceException;
 import org.apache.directory.scim.server.exception.UnableToResolveIdResourceException;
-import org.apache.directory.scim.server.repository.SelfIdResolver;
+import org.apache.directory.scim.core.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;
@@ -64,7 +65,7 @@ public class SelfResourceImpl implements SelfResource {
     try {
       String internalId = getInternalId();
       return userResource.getById(internalId, attributes, excludedAttributes);
-    } catch (UnableToResolveIdResourceException e) {
+    } catch (ResourceException e) {
       return createErrorResponse(e);
     } catch (ScimException e) {
       return createErrorResponse(e);
@@ -84,7 +85,7 @@ public class SelfResourceImpl implements SelfResource {
     try {
       String internalId = getInternalId();
       return userResource.update(resource, internalId, attributes, excludedAttributes);
-    } catch (UnableToResolveIdResourceException e) {
+    } catch (ResourceException e) {
       return createErrorResponse(e);
     } catch (ScimException e) {
       return createErrorResponse(e);
@@ -96,7 +97,7 @@ public class SelfResourceImpl implements SelfResource {
     try {
       String internalId = getInternalId();
       return userResource.patch(patchRequest, internalId, attributes, excludedAttributes);
-    } catch (UnableToResolveIdResourceException e) {
+    } catch (ResourceException e) {
       return createErrorResponse(e);
     } catch (ScimException e) {
       return createErrorResponse(e);
@@ -108,7 +109,7 @@ public class SelfResourceImpl implements SelfResource {
     try {
       String internalId = getInternalId();
       return userResource.delete(internalId);
-    } catch (UnableToResolveIdResourceException e) {
+    } catch (ResourceException e) {
       return createErrorResponse(e);
     } catch (ScimException e) {
       return createErrorResponse(e);
@@ -121,13 +122,13 @@ public class SelfResourceImpl implements SelfResource {
     return er.toResponse();
   }
 
-  private Response createErrorResponse(UnableToResolveIdResourceException e) {
+  private Response createErrorResponse(ResourceException e) {
     ErrorResponse er = new ErrorResponse(e.getStatus(), "Error");
     er.addErrorMessage(e.getMessage());
     return er.toResponse();
   }
 
-  private String getInternalId() throws UnableToResolveIdResourceException {
+  private String getInternalId() throws ResourceException {
     Principal callerPrincipal = requestContext.getSecurityContext().getUserPrincipal();
 
     if (callerPrincipal != null) {
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 433f2998..daee288c 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,10 +25,10 @@ package org.apache.directory.scim.server.rest;
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.directory.scim.server.repository.RepositoryRegistry;
-import org.apache.directory.scim.server.schema.SchemaRegistry;
+import org.apache.directory.scim.core.repository.RepositoryRegistry;
 import org.apache.directory.scim.spec.protocol.UserResource;
 import org.apache.directory.scim.spec.resources.ScimUser;
+import org.apache.directory.scim.core.schema.SchemaRegistry;
 
 /**
  * @author shawn
diff --git a/scim-server/src/test/java/org/apache/directory/scim/server/it/testapp/App.java b/scim-server/src/test/java/org/apache/directory/scim/server/it/testapp/App.java
index 0044689b..1b52f5a4 100644
--- a/scim-server/src/test/java/org/apache/directory/scim/server/it/testapp/App.java
+++ b/scim-server/src/test/java/org/apache/directory/scim/server/it/testapp/App.java
@@ -21,7 +21,7 @@ package org.apache.directory.scim.server.it.testapp;
 
 import jakarta.inject.Inject;
 import jakarta.ws.rs.core.Application;
-import org.apache.directory.scim.server.ScimConfiguration;
+import org.apache.directory.scim.core.Initializable;
 import org.apache.directory.scim.server.configuration.ServerConfiguration;
 import org.apache.directory.scim.server.rest.ScimResourceHelper;
 
@@ -40,15 +40,15 @@ public class App extends Application {
   }
 
   /**
-   * A {@link ScimConfiguration} allow for eager initialization of beans, this class configures the {@link ServerConfiguration}.
+   * A {@link Initializable} allow for eager initialization of beans, this class configures the {@link ServerConfiguration}.
    */
-  public static class ServerConfigInitializer implements ScimConfiguration {
+  public static class ServerConfigInitializer implements Initializable {
 
     @Inject
     private ServerConfiguration serverConfiguration;
 
     @Override
-    public void configure() {
+    public void initialize() {
 
       // Set any unique configuration bits
       serverConfiguration
diff --git a/scim-server/src/test/java/org/apache/directory/scim/server/it/testapp/InMemoryGroupService.java b/scim-server/src/test/java/org/apache/directory/scim/server/it/testapp/InMemoryGroupService.java
index 7551899b..f95b7d37 100644
--- a/scim-server/src/test/java/org/apache/directory/scim/server/it/testapp/InMemoryGroupService.java
+++ b/scim-server/src/test/java/org/apache/directory/scim/server/it/testapp/InMemoryGroupService.java
@@ -26,9 +26,8 @@ import jakarta.inject.Named;
 import jakarta.ws.rs.core.Response;
 import org.apache.directory.scim.server.exception.UnableToCreateResourceException;
 import org.apache.directory.scim.server.exception.UnableToUpdateResourceException;
-import org.apache.directory.scim.server.repository.Repository;
-import org.apache.directory.scim.server.repository.UpdateRequest;
-import org.apache.directory.scim.server.schema.SchemaRegistry;
+import org.apache.directory.scim.core.repository.Repository;
+import org.apache.directory.scim.core.repository.UpdateRequest;
 import org.apache.directory.scim.spec.protocol.filter.FilterExpressions;
 import org.apache.directory.scim.spec.protocol.filter.FilterResponse;
 import org.apache.directory.scim.spec.protocol.search.Filter;
@@ -36,6 +35,7 @@ import org.apache.directory.scim.spec.protocol.search.PageRequest;
 import org.apache.directory.scim.spec.protocol.search.SortRequest;
 import org.apache.directory.scim.spec.resources.ScimExtension;
 import org.apache.directory.scim.spec.resources.ScimGroup;
+import org.apache.directory.scim.core.schema.SchemaRegistry;
 
 import java.util.Collections;
 import java.util.HashMap;
diff --git a/scim-server/src/test/java/org/apache/directory/scim/server/it/testapp/InMemorySelfResolverImpl.java b/scim-server/src/test/java/org/apache/directory/scim/server/it/testapp/InMemorySelfResolverImpl.java
index 4988940c..9a1468d8 100644
--- a/scim-server/src/test/java/org/apache/directory/scim/server/it/testapp/InMemorySelfResolverImpl.java
+++ b/scim-server/src/test/java/org/apache/directory/scim/server/it/testapp/InMemorySelfResolverImpl.java
@@ -22,7 +22,7 @@ package org.apache.directory.scim.server.it.testapp;
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.ws.rs.core.Response.Status;
 import org.apache.directory.scim.server.exception.UnableToResolveIdResourceException;
-import org.apache.directory.scim.server.repository.SelfIdResolver;
+import org.apache.directory.scim.core.repository.SelfIdResolver;
 
 import java.security.Principal;
 
diff --git a/scim-server/src/test/java/org/apache/directory/scim/server/it/testapp/InMemoryUserService.java b/scim-server/src/test/java/org/apache/directory/scim/server/it/testapp/InMemoryUserService.java
index e5978774..47d8fc44 100644
--- a/scim-server/src/test/java/org/apache/directory/scim/server/it/testapp/InMemoryUserService.java
+++ b/scim-server/src/test/java/org/apache/directory/scim/server/it/testapp/InMemoryUserService.java
@@ -26,15 +26,15 @@ import jakarta.inject.Named;
 import jakarta.ws.rs.core.Response;
 import org.apache.directory.scim.server.exception.UnableToCreateResourceException;
 import org.apache.directory.scim.server.exception.UnableToUpdateResourceException;
-import org.apache.directory.scim.server.repository.Repository;
-import org.apache.directory.scim.server.repository.UpdateRequest;
-import org.apache.directory.scim.server.schema.SchemaRegistry;
+import org.apache.directory.scim.core.repository.Repository;
+import org.apache.directory.scim.core.repository.UpdateRequest;
 import org.apache.directory.scim.spec.protocol.filter.FilterExpressions;
 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;
 import org.apache.directory.scim.spec.protocol.search.SortRequest;
 import org.apache.directory.scim.spec.resources.*;
+import org.apache.directory.scim.core.schema.SchemaRegistry;
 
 import java.util.Collections;
 import java.util.HashMap;
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 21b6ce06..8e8416ba 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,6 @@ import com.fasterxml.jackson.core.JsonGenerationException;
 import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
-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;
@@ -39,6 +37,7 @@ import org.apache.directory.scim.spec.resources.PhoneNumber;
 import org.apache.directory.scim.spec.resources.PhoneNumber.LocalPhoneNumberBuilder;
 import org.apache.directory.scim.spec.resources.ScimUser;
 import org.apache.directory.scim.spec.schema.Schema;
+import org.apache.directory.scim.core.schema.SchemaRegistry;
 import org.apache.directory.scim.spec.schema.Schemas;
 import org.assertj.core.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
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 f562ca4f..84284d6f 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
@@ -45,7 +45,7 @@ import org.mockito.Mock;
 import org.mockito.Mockito;
 
 import org.apache.directory.scim.server.exception.ScimServerException;
-import org.apache.directory.scim.server.repository.Repository;
+import org.apache.directory.scim.core.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;
diff --git a/scim-server/src/test/java/org/apache/directory/scim/server/rest/BulkResourceImplTest.java b/scim-server/src/test/java/org/apache/directory/scim/server/rest/BulkResourceImplTest.java
index 514773d5..bacb3b79 100644
--- a/scim-server/src/test/java/org/apache/directory/scim/server/rest/BulkResourceImplTest.java
+++ b/scim-server/src/test/java/org/apache/directory/scim/server/rest/BulkResourceImplTest.java
@@ -19,18 +19,14 @@
 
 package org.apache.directory.scim.server.rest;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.ObjectWriter;
 import jakarta.enterprise.inject.Instance;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.UriBuilder;
 import jakarta.ws.rs.core.UriInfo;
 import org.apache.directory.scim.server.exception.UnableToCreateResourceException;
-import org.apache.directory.scim.server.repository.Repository;
-import org.apache.directory.scim.server.repository.RepositoryRegistry;
-import org.apache.directory.scim.server.schema.SchemaRegistry;
+import org.apache.directory.scim.core.repository.Repository;
+import org.apache.directory.scim.core.repository.RepositoryRegistry;
 import org.apache.directory.scim.spec.extension.ScimExtensionRegistry;
-import org.apache.directory.scim.spec.json.ObjectMapperFactory;
 import org.apache.directory.scim.spec.protocol.data.BulkOperation;
 import org.apache.directory.scim.spec.protocol.data.BulkRequest;
 import org.apache.directory.scim.spec.protocol.data.BulkResponse;
@@ -39,6 +35,7 @@ import org.apache.directory.scim.spec.resources.ScimGroup;
 import org.apache.directory.scim.spec.resources.ScimResource;
 import org.apache.directory.scim.spec.resources.ScimUser;
 import org.apache.directory.scim.spec.schema.ResourceReference;
+import org.apache.directory.scim.core.schema.SchemaRegistry;
 import org.junit.jupiter.api.Test;
 import org.mockito.InOrder;
 
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 9dd6f08e..ebb0ace6 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
@@ -33,8 +33,8 @@ import jakarta.enterprise.inject.Instance;
 import jakarta.ws.rs.core.Response;
 
 import jakarta.ws.rs.core.SecurityContext;
-import org.apache.directory.scim.server.exception.UnableToResolveIdResourceException;
-import org.apache.directory.scim.server.repository.SelfIdResolver;
+import org.apache.directory.scim.core.repository.ResourceException;
+import org.apache.directory.scim.core.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;
@@ -64,7 +64,7 @@ public class SelfResourceImplTest {
   }
 
   @Test
-  public void withSelfIdResolverTest() throws UnableToResolveIdResourceException, ScimException {
+  public void withSelfIdResolverTest() throws ResourceException, ScimException {
 
     String internalId = "test-user-resolved";
     Principal principal = mock(Principal.class);
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/ErrorResponse.java b/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/ErrorResponse.java
index c0665f6e..38e769a1 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/ErrorResponse.java
+++ b/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/ErrorResponse.java
@@ -61,6 +61,10 @@ public class ErrorResponse extends BaseResource {
     super(SCHEMA_URI);
   }
 
+  public ErrorResponse(int statusCode, String detail) {
+    this(Status.fromStatusCode(statusCode), detail);
+  }
+
   public ErrorResponse(Status status, String detail) {
     super(SCHEMA_URI);
     this.status = status;