Merge pull request #133 from apache/new-scim-core-module

new scim core module
diff --git a/pom.xml b/pom.xml
index eee0a73..73dc88e 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>
@@ -125,6 +126,11 @@
       </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>
         <version>2.23-SNAPSHOT</version>
       </dependency>
diff --git a/scim-client/src/main/java/org/apache/directory/scim/client/rest/BaseScimClient.java b/scim-client/src/main/java/org/apache/directory/scim/client/rest/BaseScimClient.java
index 523b662..ddcf0c3 100644
--- a/scim-client/src/main/java/org/apache/directory/scim/client/rest/BaseScimClient.java
+++ b/scim-client/src/main/java/org/apache/directory/scim/client/rest/BaseScimClient.java
@@ -36,15 +36,15 @@
 import org.apache.directory.scim.spec.annotation.ScimResourceType;
 import org.apache.directory.scim.spec.protocol.BaseResourceTypeResource;
 import org.apache.directory.scim.spec.protocol.Constants;
-import org.apache.directory.scim.spec.protocol.attribute.AttributeReference;
-import org.apache.directory.scim.spec.protocol.attribute.AttributeReferenceListWrapper;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReference;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReferenceListWrapper;
 import org.apache.directory.scim.spec.protocol.data.ErrorResponse;
 import org.apache.directory.scim.spec.protocol.data.ListResponse;
 import org.apache.directory.scim.spec.protocol.data.PatchRequest;
 import org.apache.directory.scim.spec.protocol.data.SearchRequest;
 import org.apache.directory.scim.spec.protocol.exception.ScimException;
-import org.apache.directory.scim.spec.protocol.search.Filter;
-import org.apache.directory.scim.spec.protocol.search.SortOrder;
+import org.apache.directory.scim.spec.filter.Filter;
+import org.apache.directory.scim.spec.filter.SortOrder;
 import org.apache.directory.scim.spec.resources.ScimResource;
 
 public abstract class BaseScimClient<T extends ScimResource> implements AutoCloseable {
diff --git a/scim-client/src/main/java/org/apache/directory/scim/client/rest/ScimSelfClient.java b/scim-client/src/main/java/org/apache/directory/scim/client/rest/ScimSelfClient.java
index 8580f12..746ce15 100644
--- a/scim-client/src/main/java/org/apache/directory/scim/client/rest/ScimSelfClient.java
+++ b/scim-client/src/main/java/org/apache/directory/scim/client/rest/ScimSelfClient.java
@@ -27,7 +27,7 @@
 
 import org.apache.directory.scim.spec.protocol.Constants;
 import org.apache.directory.scim.spec.protocol.SelfResource;
-import org.apache.directory.scim.spec.protocol.attribute.AttributeReferenceListWrapper;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReferenceListWrapper;
 import org.apache.directory.scim.spec.protocol.data.PatchRequest;
 import org.apache.directory.scim.spec.protocol.exception.ScimException;
 import org.apache.directory.scim.spec.resources.ScimUser;
diff --git a/scim-core/pom.xml b/scim-core/pom.xml
new file mode 100644
index 0000000..1ab5ba6
--- /dev/null
+++ b/scim-core/pom.xml
@@ -0,0 +1,90 @@
+<!--  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. -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.directory.scim</groupId>
+    <artifactId>scim-parent</artifactId>
+    <version>2.23-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>scim-core</artifactId>
+  <name>SCIM - Core</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>jakarta.inject</groupId>
+      <artifactId>jakarta.inject-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>jakarta.enterprise</groupId>
+      <artifactId>jakarta.enterprise.cdi-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>jakarta.annotation</groupId>
+      <artifactId>jakarta.annotation-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.directory.scim</groupId>
+      <artifactId>scim-spec-schema</artifactId>
+    </dependency>
+    <dependency>
+      <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.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-junit-jupiter</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.assertj</groupId>
+      <artifactId>assertj-core</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-simple</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.hamcrest</groupId>
+      <artifactId>hamcrest</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 90%
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 25d7b19..cd47f1b 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 @@
  * 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 86%
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 08014f3..6b18ff8 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 96%
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 222ec15..9f56ea8 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 ae9ce8c..e7c6ce9 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 70%
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 212e56b..646886f 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,19 +17,14 @@
 * 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;
-import org.apache.directory.scim.spec.protocol.search.SortRequest;
+import org.apache.directory.scim.spec.filter.FilterResponse;
+import org.apache.directory.scim.spec.filter.Filter;
+import org.apache.directory.scim.spec.filter.PageRequest;
+import org.apache.directory.scim.spec.filter.SortRequest;
 import org.apache.directory.scim.spec.resources.ScimExtension;
 import org.apache.directory.scim.spec.resources.ScimResource;
 
@@ -55,10 +50,10 @@
    * 
    * @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 @@
    * 
    * @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 @@
    * @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 @@
    * 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 89%
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 f94ac5b..21e4702 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.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.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 @@
 @Data
 @Slf4j
 @ApplicationScoped
-public class RepositoryRegistry implements ScimConfiguration {
+public class RepositoryRegistry implements Initializable {
 
   private SchemaRegistry schemaRegistry;
 
@@ -69,19 +67,19 @@
 
   @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 @@
     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 c8e21ef..0a98763 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 @@
 @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-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/ValueFilterExpression.java b/scim-core/src/main/java/org/apache/directory/scim/core/repository/SelfIdResolver.java
similarity index 79%
copy from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/ValueFilterExpression.java
copy to scim-core/src/main/java/org/apache/directory/scim/core/repository/SelfIdResolver.java
index 04e97a7..6245994 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/ValueFilterExpression.java
+++ b/scim-core/src/main/java/org/apache/directory/scim/core/repository/SelfIdResolver.java
@@ -17,10 +17,12 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.core.repository;
 
-public interface ValueFilterExpression {
+import java.security.Principal;
 
-  public String toFilter();
+public interface SelfIdResolver {
 
+  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 96%
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 d5b0f17..a2b99c1 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,22 +37,22 @@
 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;
-import org.apache.directory.scim.spec.protocol.data.PatchOperation.Type;
-import org.apache.directory.scim.spec.protocol.data.PatchOperationPath;
-import org.apache.directory.scim.spec.protocol.filter.AttributeComparisonExpression;
-import org.apache.directory.scim.spec.protocol.filter.CompareOperator;
-import org.apache.directory.scim.spec.protocol.filter.FilterExpression;
-import org.apache.directory.scim.spec.protocol.filter.ValuePathExpression;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReference;
+import org.apache.directory.scim.spec.patch.PatchOperation;
+import org.apache.directory.scim.spec.patch.PatchOperation.Type;
+import org.apache.directory.scim.spec.patch.PatchOperationPath;
+import org.apache.directory.scim.spec.filter.AttributeComparisonExpression;
+import org.apache.directory.scim.spec.filter.CompareOperator;
+import org.apache.directory.scim.spec.filter.FilterExpression;
+import org.apache.directory.scim.spec.filter.ValuePathExpression;
 import org.apache.directory.scim.spec.resources.ScimExtension;
 import org.apache.directory.scim.spec.resources.ScimResource;
 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 @@
     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 94%
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 3697823..3fc0fc8 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 02eb465..db146db 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.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 889440f..ef63aaa 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,9 @@
 * 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.filter.attribute.ScimRequestContext;
 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%
rename from scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/exceptions/ClientFilterException.java
rename to scim-core/src/main/java/org/apache/directory/scim/core/repository/extensions/ClientFilterException.java
index 805aaa9..e93e7e7 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 @@
 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 8384c03..6ab280b 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/schema/ScimExtensionRegistryProducer.java b/scim-core/src/main/java/org/apache/directory/scim/core/repository/extensions/ScimExtensionRegistryProducer.java
similarity index 94%
rename from scim-server/src/main/java/org/apache/directory/scim/server/schema/ScimExtensionRegistryProducer.java
rename to scim-core/src/main/java/org/apache/directory/scim/core/repository/extensions/ScimExtensionRegistryProducer.java
index 5c564e9..a26f174 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/repository/extensions/ScimExtensionRegistryProducer.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.schema;
+package org.apache.directory.scim.core.repository.extensions;
 
 import jakarta.enterprise.inject.Produces;
 
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 bbd6c09..bb573c0 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-core/src/main/resources/META-INF/beans.xml b/scim-core/src/main/resources/META-INF/beans.xml
new file mode 100644
index 0000000..a47f43b
--- /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 4b32c97..22b28d0 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 559d874..64bb0a6 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 87%
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 38ba5e7..669e5f9 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,32 +17,29 @@
 * 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;
-import org.apache.directory.scim.spec.protocol.data.PatchOperationPath;
-import org.apache.directory.scim.spec.protocol.filter.FilterParseException;
+import org.apache.directory.scim.spec.patch.PatchOperation;
+import org.apache.directory.scim.spec.patch.PatchOperation.Type;
+import org.apache.directory.scim.spec.patch.PatchOperationPath;
+import org.apache.directory.scim.spec.filter.FilterParseException;
 import org.apache.directory.scim.spec.resources.Address;
 import org.apache.directory.scim.spec.resources.Email;
 import org.apache.directory.scim.spec.resources.Name;
@@ -50,27 +47,23 @@
 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 @@
 
   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 @@
   
   @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 @@
 
   @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 @@
 
   @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 @@
    */
   @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 @@
     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 @@
   
   @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 @@
 
   @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 @@
   
   @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 @@
 
   @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 @@
 
   @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 @@
 
   @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 @@
   
   @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 @@
 
   @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 @@
 
   @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 @@
 
   @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 @@
   
   @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 @@
   
   @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 @@
   
   @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 @@
   
   @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 @@
     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 @@
    */
   @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 @@
     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 @@
   
   @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 @@
   @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 @@
   @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 @@
   @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 @@
   @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 @@
   //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 @@
   @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 @@
   @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 @@
   @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 @@
   @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 @@
 //    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 @@
   }
 
   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 @@
     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 @@
     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 0000000..963d172
--- /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-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/FilterExpression.java b/scim-core/src/test/java/org/apache/directory/scim/core/repository/utility/Order.java
similarity index 68%
copy from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/FilterExpression.java
copy to scim-core/src/test/java/org/apache/directory/scim/core/repository/utility/Order.java
index 2fd1b2d..c992ab8 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/FilterExpression.java
+++ b/scim-core/src/test/java/org/apache/directory/scim/core/repository/utility/Order.java
@@ -17,19 +17,28 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.core.repository.utility;
 
-import java.util.function.Function;
-
-public interface FilterExpression {
+public enum Order {
   
-  String toFilter();
-
-  void setAttributePath(String urn, String parentAttributeName);
-
-  String toUnqualifiedFilter();
-
-  default <U> U map(Function<? super FilterExpression, U> mapper) {
-    return mapper.apply(this);
+  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-core/src/test/java/org/apache/directory/scim/core/repository/utility/Subobject.java b/scim-core/src/test/java/org/apache/directory/scim/core/repository/utility/Subobject.java
new file mode 100644
index 0000000..c0e087d
--- /dev/null
+++ b/scim-core/src/test/java/org/apache/directory/scim/core/repository/utility/Subobject.java
@@ -0,0 +1,57 @@
+/*
+* 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.XmlElement;
+import lombok.Data;
+import org.apache.directory.scim.spec.annotation.ScimAttribute;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class Subobject implements Serializable {
+  
+  private static final long serialVersionUID = -8081556701833520316L;
+
+  @ScimAttribute
+  @XmlElement
+  private String string1;
+  
+  @ScimAttribute
+  @XmlElement
+  private String string2;
+  
+  @ScimAttribute
+  @XmlElement
+  private Boolean boolean1;
+  
+  @ScimAttribute
+  @XmlElement
+  private Boolean boolean2;
+  
+  @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 eb88fb2..ac369c7 100644
--- a/scim-coverage/pom.xml
+++ b/scim-coverage/pom.xml
@@ -42,6 +42,10 @@
       </dependency>
       <dependency>
         <groupId>org.apache.directory.scim</groupId>
+        <artifactId>scim-core</artifactId>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.directory.scim</groupId>
         <artifactId>scim-server</artifactId>
       </dependency>
       <dependency>
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 1ff38f1..a63fd67 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 @@
 
 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 @@
   }
 
   /**
-   * 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 fca8299..2455246 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,14 +24,13 @@
 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.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.core.repository.Repository;
+import org.apache.directory.scim.core.repository.UpdateRequest;
+import org.apache.directory.scim.spec.filter.FilterExpressions;
+import org.apache.directory.scim.spec.filter.FilterResponse;
+import org.apache.directory.scim.spec.filter.Filter;
+import org.apache.directory.scim.spec.filter.PageRequest;
+import org.apache.directory.scim.spec.filter.SortRequest;
 import org.apache.directory.scim.spec.resources.ScimExtension;
 import org.apache.directory.scim.spec.resources.ScimGroup;
 
@@ -43,6 +42,7 @@
 
 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 1d19096..2372420 100644
--- a/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemorySelfResolverImpl.java
+++ b/scim-server-examples/scim-server-jersey/src/main/java/org/apache/directory/scim/example/jersey/service/InMemorySelfResolverImpl.java
@@ -21,7 +21,7 @@
 
 import jakarta.enterprise.context.ApplicationScoped;
 import org.apache.directory.scim.server.exception.UnableToResolveIdResourceException;
-import org.apache.directory.scim.server.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 7dc686b..6bfcdd5 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 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.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.core.repository.Repository;
+import org.apache.directory.scim.core.repository.UpdateRequest;
+import org.apache.directory.scim.spec.filter.FilterExpressions;
+import org.apache.directory.scim.spec.filter.FilterResponse;
+import org.apache.directory.scim.spec.filter.Filter;
+import org.apache.directory.scim.spec.filter.PageRequest;
+import org.apache.directory.scim.spec.filter.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 5a65c00..97f0850 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 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 @@
   }
 
   /**
-   * 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 2288eba..63ed582 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,14 +24,13 @@
 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.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.core.repository.Repository;
+import org.apache.directory.scim.core.repository.UpdateRequest;
+import org.apache.directory.scim.spec.filter.FilterExpressions;
+import org.apache.directory.scim.spec.filter.FilterResponse;
+import org.apache.directory.scim.spec.filter.Filter;
+import org.apache.directory.scim.spec.filter.PageRequest;
+import org.apache.directory.scim.spec.filter.SortRequest;
 import org.apache.directory.scim.spec.resources.ScimExtension;
 import org.apache.directory.scim.spec.resources.ScimGroup;
 
@@ -43,6 +42,7 @@
 
 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 96019d3..711a1ea 100644
--- a/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemorySelfResolverImpl.java
+++ b/scim-server-examples/scim-server-memory/src/main/java/org/apache/directory/scim/example/memory/service/InMemorySelfResolverImpl.java
@@ -21,7 +21,7 @@
 
 import jakarta.enterprise.context.ApplicationScoped;
 import org.apache.directory.scim.server.exception.UnableToResolveIdResourceException;
-import org.apache.directory.scim.server.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 f845b9e..408d473 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 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.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.core.repository.Repository;
+import org.apache.directory.scim.core.repository.UpdateRequest;
+import org.apache.directory.scim.spec.filter.FilterExpressions;
+import org.apache.directory.scim.spec.filter.FilterResponse;
+import org.apache.directory.scim.spec.filter.Filter;
+import org.apache.directory.scim.spec.filter.PageRequest;
+import org.apache.directory.scim.spec.filter.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 583617a..4fb9590 100644
--- a/scim-server/pom.xml
+++ b/scim-server/pom.xml
@@ -43,6 +43,10 @@
     </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>
     </dependency>
     <dependency>
@@ -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 8c7bfe6..ceb7ea9 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.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 @@
   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/FilterParseExceptionMapper.java b/scim-server/src/main/java/org/apache/directory/scim/server/exception/FilterParseExceptionMapper.java
index c4bd212..521e36a 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/exception/FilterParseExceptionMapper.java
+++ b/scim-server/src/main/java/org/apache/directory/scim/server/exception/FilterParseExceptionMapper.java
@@ -25,7 +25,7 @@
 
 import org.apache.directory.scim.spec.protocol.ErrorMessageType;
 import org.apache.directory.scim.spec.protocol.data.ErrorResponse;
-import org.apache.directory.scim.spec.protocol.filter.FilterParseException;
+import org.apache.directory.scim.spec.filter.FilterParseException;
 
 public class FilterParseExceptionMapper implements ExceptionMapper<FilterParseException> {
 
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 335a076..be83d53 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 lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.apache.directory.scim.core.repository.ResourceException;
 
 @Data
 @EqualsAndHashCode(callSuper=true)
@@ -31,10 +32,10 @@
   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 64a21dd..d332fc6 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 lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.apache.directory.scim.core.repository.ResourceException;
 
 @Data
 @EqualsAndHashCode(callSuper=true)
@@ -31,10 +32,10 @@
   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 21b5908..cacae1b 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 @@
   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 37c184e..edf646d 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 lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.apache.directory.scim.core.repository.ResourceException;
 
 @Data
 @EqualsAndHashCode(callSuper=true)
@@ -31,10 +32,10 @@
   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 f407d22..3c1c8bb 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 lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.apache.directory.scim.core.repository.ResourceException;
 
 @Data
 @EqualsAndHashCode(callSuper=true)
@@ -31,10 +32,10 @@
   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 8938a80..075d085 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 lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.apache.directory.scim.core.repository.ResourceException;
 
 @Data
 @EqualsAndHashCode(callSuper=true)
@@ -31,10 +32,10 @@
   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/repository/SelfIdResolver.java b/scim-server/src/main/java/org/apache/directory/scim/server/repository/SelfIdResolver.java
deleted file mode 100644
index ce491ba..0000000
--- a/scim-server/src/main/java/org/apache/directory/scim/server/repository/SelfIdResolver.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
-* 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.server.repository;
-
-import java.security.Principal;
-
-import org.apache.directory.scim.server.exception.UnableToResolveIdResourceException;
-
-public interface SelfIdResolver {
-
-  String resolveToInternalId(Principal principal) throws UnableToResolveIdResourceException;
-  
-}
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 d5b0042..7a4b541 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,9 +27,8 @@
 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.filter.attribute.AttributeReference;
 import org.apache.directory.scim.spec.resources.ScimExtension;
 import org.apache.directory.scim.spec.resources.ScimGroup;
 import org.apache.directory.scim.spec.resources.ScimResource;
@@ -39,6 +38,7 @@
 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 6d2e860..f4489cd 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,34 +37,34 @@
 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.spec.filter.attribute.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;
-import org.apache.directory.scim.spec.protocol.attribute.AttributeReference;
-import org.apache.directory.scim.spec.protocol.attribute.AttributeReferenceListWrapper;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReference;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReferenceListWrapper;
 import org.apache.directory.scim.spec.protocol.data.ErrorResponse;
 import org.apache.directory.scim.spec.protocol.data.ListResponse;
 import org.apache.directory.scim.spec.protocol.data.PatchRequest;
 import org.apache.directory.scim.spec.protocol.data.SearchRequest;
-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.SortOrder;
-import org.apache.directory.scim.spec.protocol.search.SortRequest;
+import org.apache.directory.scim.spec.filter.FilterResponse;
+import org.apache.directory.scim.spec.filter.Filter;
+import org.apache.directory.scim.spec.filter.PageRequest;
+import org.apache.directory.scim.spec.filter.SortOrder;
+import org.apache.directory.scim.spec.filter.SortRequest;
 import org.apache.directory.scim.spec.resources.ScimResource;
 import lombok.extern.slf4j.Slf4j;
 
@@ -120,10 +120,10 @@
       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 @@
       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 @@
       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 @@
         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 @@
                   .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 00f2a78..659cd6e 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.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.schema.Schema;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.directory.scim.core.schema.SchemaRegistry;
 
 @Slf4j
 @ApplicationScoped
@@ -228,7 +229,7 @@
       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 @@
         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 @@
       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 @@
           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 @@
    * @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 @@
     }
   }
 
+  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 c47afc7..a76d9fa 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 @@
 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 365745f..04d38fb 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.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 ef08366..0566901 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.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 21b61b7..fb6d21c 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.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 3e395c9..13280ac 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.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 0a46544..26f52bf 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 6242152..afc4b12 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,11 +27,12 @@
 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;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReferenceListWrapper;
 import org.apache.directory.scim.spec.protocol.data.ErrorResponse;
 import org.apache.directory.scim.spec.protocol.data.PatchRequest;
 import org.apache.directory.scim.spec.protocol.exception.ScimException;
@@ -64,7 +65,7 @@
     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 @@
     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 @@
     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 @@
     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 @@
     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 433f299..daee288 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 @@
 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 0044689..1b52f5a 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 @@
 
 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 @@
   }
 
   /**
-   * 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 7551899..f5e2676 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,16 +26,16 @@
 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.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.core.repository.Repository;
+import org.apache.directory.scim.core.repository.UpdateRequest;
+import org.apache.directory.scim.spec.filter.FilterExpressions;
+import org.apache.directory.scim.spec.filter.FilterResponse;
+import org.apache.directory.scim.spec.filter.Filter;
+import org.apache.directory.scim.spec.filter.PageRequest;
+import org.apache.directory.scim.spec.filter.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 4988940..9a1468d 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 @@
 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 e597877..241b428 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.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.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.core.repository.Repository;
+import org.apache.directory.scim.core.repository.UpdateRequest;
+import org.apache.directory.scim.spec.filter.FilterExpressions;
+import org.apache.directory.scim.spec.filter.FilterResponse;
+import org.apache.directory.scim.spec.filter.Filter;
+import org.apache.directory.scim.spec.filter.PageRequest;
+import org.apache.directory.scim.spec.filter.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 21b6ce0..0a553a4 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,21 +24,20 @@
 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;
 import org.apache.directory.scim.spec.extension.EnterpriseExtension.Manager;
 import org.apache.directory.scim.spec.json.ObjectMapperFactory;
 import org.apache.directory.scim.spec.phonenumber.PhoneNumberParseException;
-import org.apache.directory.scim.spec.protocol.attribute.AttributeReference;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReference;
 import org.apache.directory.scim.spec.resources.Address;
 import org.apache.directory.scim.spec.resources.Name;
 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 f562ca4..a44b908 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,13 +45,13 @@
 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;
 import org.apache.directory.scim.spec.extension.EnterpriseExtension.Manager;
 import org.apache.directory.scim.spec.phonenumber.PhoneNumberParseException;
-import org.apache.directory.scim.spec.protocol.attribute.AttributeReferenceListWrapper;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReferenceListWrapper;
 import org.apache.directory.scim.spec.protocol.data.ErrorResponse;
 import org.apache.directory.scim.spec.protocol.data.PatchRequest;
 import org.apache.directory.scim.spec.protocol.data.SearchRequest;
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 514773d..bacb3b7 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.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 9dd6f08..ebb0ace 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.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 @@
   }
 
   @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/pom.xml b/scim-spec/scim-spec-protocol/pom.xml
index 02cc587..3466f9f 100644
--- a/scim-spec/scim-spec-protocol/pom.xml
+++ b/scim-spec/scim-spec-protocol/pom.xml
@@ -64,28 +64,5 @@
       <artifactId>assertj-core</artifactId>
       <scope>test</scope>
     </dependency>
-	<dependency>
-		<groupId>org.antlr</groupId>
-		<artifactId>antlr4-runtime</artifactId>
-		<version>${version.antlr4}</version>
-	</dependency>
 </dependencies>
-
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.antlr</groupId>
-				<artifactId>antlr4-maven-plugin</artifactId>
-				<version>${version.antlr4}</version>
-				<executions>
-					<execution>
-						<goals>
-							<goal>antlr4</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-		</plugins>
-	</build>
-
 </project>
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/adapter/AttributeReferenceAdapter.java b/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/adapter/AttributeReferenceAdapter.java
index 43876a6..13b5673 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/adapter/AttributeReferenceAdapter.java
+++ b/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/adapter/AttributeReferenceAdapter.java
@@ -21,7 +21,7 @@
 
 import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 
-import org.apache.directory.scim.spec.protocol.attribute.AttributeReference;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReference;
 
 public class AttributeReferenceAdapter extends XmlAdapter<String, AttributeReference> {
 
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/adapter/FilterAdapter.java b/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/adapter/FilterAdapter.java
index 3da65ef..ccac5cf 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/adapter/FilterAdapter.java
+++ b/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/adapter/FilterAdapter.java
@@ -21,7 +21,7 @@
 
 import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 
-import org.apache.directory.scim.spec.protocol.search.Filter;
+import org.apache.directory.scim.spec.filter.Filter;
 import lombok.extern.slf4j.Slf4j;
 
 @Slf4j
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/adapter/FilterWrapper.java b/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/adapter/FilterWrapper.java
index 6cd2e30..04b0662 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/adapter/FilterWrapper.java
+++ b/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/adapter/FilterWrapper.java
@@ -25,8 +25,8 @@
 
 import org.apache.directory.scim.spec.protocol.ErrorMessageType;
 import org.apache.directory.scim.spec.protocol.data.ErrorResponse;
-import org.apache.directory.scim.spec.protocol.filter.FilterParseException;
-import org.apache.directory.scim.spec.protocol.search.Filter;
+import org.apache.directory.scim.spec.filter.FilterParseException;
+import org.apache.directory.scim.spec.filter.Filter;
 
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/BaseResourceTypeResource.java b/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/BaseResourceTypeResource.java
index e6c4e39..c53235e 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/BaseResourceTypeResource.java
+++ b/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/BaseResourceTypeResource.java
@@ -43,12 +43,12 @@
 import jakarta.ws.rs.core.Response.Status;
 
 import org.apache.directory.scim.spec.adapter.FilterWrapper;
-import org.apache.directory.scim.spec.protocol.attribute.AttributeReference;
-import org.apache.directory.scim.spec.protocol.attribute.AttributeReferenceListWrapper;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReference;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReferenceListWrapper;
 import org.apache.directory.scim.spec.protocol.data.PatchRequest;
 import org.apache.directory.scim.spec.protocol.data.SearchRequest;
 import org.apache.directory.scim.spec.protocol.exception.ScimException;
-import org.apache.directory.scim.spec.protocol.search.SortOrder;
+import org.apache.directory.scim.spec.filter.SortOrder;
 import org.apache.directory.scim.spec.resources.ScimResource;
 
 import static org.apache.directory.scim.spec.protocol.Constants.SCIM_CONTENT_TYPE;
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/SelfResource.java b/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/SelfResource.java
index d040b41..d7d18c1 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/SelfResource.java
+++ b/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/SelfResource.java
@@ -40,7 +40,7 @@
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.Response.Status;
 
-import org.apache.directory.scim.spec.protocol.attribute.AttributeReferenceListWrapper;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReferenceListWrapper;
 import org.apache.directory.scim.spec.protocol.data.PatchRequest;
 import org.apache.directory.scim.spec.resources.ScimResource;
 import org.apache.directory.scim.spec.resources.ScimUser;
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 c0665f6..38e769a 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 @@
     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;
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/PatchRequest.java b/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/PatchRequest.java
index 4c9db03..941bda8 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/PatchRequest.java
+++ b/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/PatchRequest.java
@@ -28,6 +28,7 @@
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.apache.directory.scim.spec.patch.PatchOperation;
 import org.apache.directory.scim.spec.resources.BaseResource;
 
 @Data
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/SearchRequest.java b/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/SearchRequest.java
index 5779503..89eea52 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/SearchRequest.java
+++ b/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/SearchRequest.java
@@ -31,11 +31,11 @@
 import lombok.EqualsAndHashCode;
 import org.apache.directory.scim.spec.adapter.AttributeReferenceAdapter;
 import org.apache.directory.scim.spec.adapter.FilterAdapter;
-import org.apache.directory.scim.spec.protocol.attribute.AttributeReference;
-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.SortOrder;
-import org.apache.directory.scim.spec.protocol.search.SortRequest;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReference;
+import org.apache.directory.scim.spec.filter.Filter;
+import org.apache.directory.scim.spec.filter.PageRequest;
+import org.apache.directory.scim.spec.filter.SortOrder;
+import org.apache.directory.scim.spec.filter.SortRequest;
 import org.apache.directory.scim.spec.resources.BaseResource;
 
 /**
diff --git a/scim-spec/scim-spec-schema/pom.xml b/scim-spec/scim-spec-schema/pom.xml
index 2b5c799..26dba0b 100644
--- a/scim-spec/scim-spec-schema/pom.xml
+++ b/scim-spec/scim-spec-schema/pom.xml
@@ -94,6 +94,11 @@
 		<artifactId>slf4j-simple</artifactId>
 		<scope>test</scope>
 	</dependency>
+    <dependency>
+      <groupId>org.assertj</groupId>
+      <artifactId>assertj-core</artifactId>
+      <scope>test</scope>
+    </dependency>
 </dependencies>
 
 	<build>
diff --git a/scim-spec/scim-spec-protocol/src/main/antlr4/imports/Json.g4 b/scim-spec/scim-spec-schema/src/main/antlr4/imports/Json.g4
similarity index 100%
rename from scim-spec/scim-spec-protocol/src/main/antlr4/imports/Json.g4
rename to scim-spec/scim-spec-schema/src/main/antlr4/imports/Json.g4
diff --git a/scim-spec/scim-spec-protocol/src/main/antlr4/imports/Urn.g4 b/scim-spec/scim-spec-schema/src/main/antlr4/imports/Urn.g4
similarity index 100%
rename from scim-spec/scim-spec-protocol/src/main/antlr4/imports/Urn.g4
rename to scim-spec/scim-spec-schema/src/main/antlr4/imports/Urn.g4
diff --git a/scim-spec/scim-spec-protocol/src/main/antlr4/org/apache/directory/scim/server/filter/Filter.g4 b/scim-spec/scim-spec-schema/src/main/antlr4/org/apache/directory/scim/spec/filter/Filter.g4
similarity index 100%
rename from scim-spec/scim-spec-protocol/src/main/antlr4/org/apache/directory/scim/server/filter/Filter.g4
rename to scim-spec/scim-spec-schema/src/main/antlr4/org/apache/directory/scim/spec/filter/Filter.g4
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/PatchOperationPathAdapter.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/adapter/PatchOperationPathAdapter.java
similarity index 91%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/PatchOperationPathAdapter.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/adapter/PatchOperationPathAdapter.java
index f35666d..f767230 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/PatchOperationPathAdapter.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/adapter/PatchOperationPathAdapter.java
@@ -17,9 +17,10 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.data;
+package org.apache.directory.scim.spec.adapter;
 
 import jakarta.xml.bind.annotation.adapters.XmlAdapter;
+import org.apache.directory.scim.spec.patch.PatchOperationPath;
 
 public class PatchOperationPathAdapter extends XmlAdapter<String, PatchOperationPath>{
 
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/AttributeComparisonExpression.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/AttributeComparisonExpression.java
similarity index 96%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/AttributeComparisonExpression.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/AttributeComparisonExpression.java
index ef134fd..50573ae 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/AttributeComparisonExpression.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/AttributeComparisonExpression.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
@@ -27,7 +27,7 @@
 
 import org.apache.commons.lang3.StringEscapeUtils;
 
-import org.apache.directory.scim.spec.protocol.attribute.AttributeReference;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReference;
 import lombok.Value;
 
 @Value
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/AttributePresentExpression.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/AttributePresentExpression.java
similarity index 92%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/AttributePresentExpression.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/AttributePresentExpression.java
index f7a7670..8e54245 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/AttributePresentExpression.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/AttributePresentExpression.java
@@ -17,10 +17,10 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 import lombok.Value;
-import org.apache.directory.scim.spec.protocol.attribute.AttributeReference;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReference;
 
 @Value
 public class AttributePresentExpression implements FilterExpression, ValueFilterExpression {
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/CompareOperator.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/CompareOperator.java
similarity index 94%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/CompareOperator.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/CompareOperator.java
index 47cccea..189e4f0 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/CompareOperator.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/CompareOperator.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 public enum CompareOperator {
   
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/ComplexLogicalFilterBuilder.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/ComplexLogicalFilterBuilder.java
similarity index 97%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/ComplexLogicalFilterBuilder.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/ComplexLogicalFilterBuilder.java
index bf015ee..7cae6af 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/ComplexLogicalFilterBuilder.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/ComplexLogicalFilterBuilder.java
@@ -1,4 +1,4 @@
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 abstract class ComplexLogicalFilterBuilder extends SimpleLogicalFilterBuilder {
 
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/ExpressionBuildingListener.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/ExpressionBuildingListener.java
similarity index 86%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/ExpressionBuildingListener.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/ExpressionBuildingListener.java
index 186b835..fed0292 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/ExpressionBuildingListener.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/ExpressionBuildingListener.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 import java.util.ArrayDeque;
 import java.util.Deque;
@@ -26,18 +26,17 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.directory.scim.server.filter.FilterBaseListener;
-import org.apache.directory.scim.server.filter.FilterParser.AttributeCompareExpressionContext;
-import org.apache.directory.scim.server.filter.FilterParser.AttributeGroupExpressionContext;
-import org.apache.directory.scim.server.filter.FilterParser.AttributeLogicExpressionContext;
-import org.apache.directory.scim.server.filter.FilterParser.AttributePresentExpressionContext;
-import org.apache.directory.scim.server.filter.FilterParser.FilterAttributeCompareExpressionContext;
-import org.apache.directory.scim.server.filter.FilterParser.FilterAttributePresentExpressionContext;
-import org.apache.directory.scim.server.filter.FilterParser.FilterContext;
-import org.apache.directory.scim.server.filter.FilterParser.FilterGroupExpressionContext;
-import org.apache.directory.scim.server.filter.FilterParser.FilterLogicExpressionContext;
-import org.apache.directory.scim.server.filter.FilterParser.FilterValuePathExpressionContext;
-import org.apache.directory.scim.spec.protocol.attribute.AttributeReference;
+import org.apache.directory.scim.spec.filter.FilterParser.AttributeCompareExpressionContext;
+import org.apache.directory.scim.spec.filter.FilterParser.AttributeGroupExpressionContext;
+import org.apache.directory.scim.spec.filter.FilterParser.AttributeLogicExpressionContext;
+import org.apache.directory.scim.spec.filter.FilterParser.AttributePresentExpressionContext;
+import org.apache.directory.scim.spec.filter.FilterParser.FilterAttributeCompareExpressionContext;
+import org.apache.directory.scim.spec.filter.FilterParser.FilterAttributePresentExpressionContext;
+import org.apache.directory.scim.spec.filter.FilterParser.FilterContext;
+import org.apache.directory.scim.spec.filter.FilterParser.FilterGroupExpressionContext;
+import org.apache.directory.scim.spec.filter.FilterParser.FilterLogicExpressionContext;
+import org.apache.directory.scim.spec.filter.FilterParser.FilterValuePathExpressionContext;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReference;
 
 public class ExpressionBuildingListener extends FilterBaseListener {
 
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/search/Filter.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/Filter.java
similarity index 89%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/search/Filter.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/Filter.java
index 5ab936d..df8ef65 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/search/Filter.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/Filter.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.search;
+package org.apache.directory.scim.spec.filter;
 
 import lombok.AccessLevel;
 import lombok.Data;
@@ -26,11 +26,6 @@
 import org.antlr.v4.runtime.*;
 import org.antlr.v4.runtime.tree.ParseTree;
 import org.antlr.v4.runtime.tree.ParseTreeWalker;
-import org.apache.directory.scim.server.filter.FilterLexer;
-import org.apache.directory.scim.server.filter.FilterParser;
-import org.apache.directory.scim.spec.protocol.filter.ExpressionBuildingListener;
-import org.apache.directory.scim.spec.protocol.filter.FilterExpression;
-import org.apache.directory.scim.spec.protocol.filter.FilterParseException;
 
 import java.net.URLDecoder;
 import java.net.URLEncoder;
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilder.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/FilterBuilder.java
similarity index 96%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilder.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/FilterBuilder.java
index 5303aa7..3c569cc 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilder.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/FilterBuilder.java
@@ -1,6 +1,4 @@
-package org.apache.directory.scim.spec.protocol.filter;
-
-import org.apache.directory.scim.spec.protocol.search.Filter;
+package org.apache.directory.scim.spec.filter;
 
 import java.time.LocalDate;
 import java.time.LocalDateTime;
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/FilterComparisonFilterBuilder.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/FilterComparisonFilterBuilder.java
similarity index 98%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/FilterComparisonFilterBuilder.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/FilterComparisonFilterBuilder.java
index ad83323..37e61ef 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/FilterComparisonFilterBuilder.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/FilterComparisonFilterBuilder.java
@@ -1,6 +1,6 @@
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
-import org.apache.directory.scim.spec.protocol.attribute.AttributeReference;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReference;
 
 import java.time.LocalDate;
 import java.time.LocalDateTime;
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/FilterExpression.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/FilterExpression.java
similarity index 94%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/FilterExpression.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/FilterExpression.java
index 2fd1b2d..dfb9ce1 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/FilterExpression.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/FilterExpression.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 import java.util.function.Function;
 
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/FilterExpressions.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/FilterExpressions.java
similarity index 87%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/FilterExpressions.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/FilterExpressions.java
index 3356355..8d0bd20 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/FilterExpressions.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/FilterExpressions.java
@@ -1,6 +1,5 @@
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
-import org.apache.directory.scim.spec.protocol.search.Filter;
 import org.apache.directory.scim.spec.resources.ScimResource;
 import org.apache.directory.scim.spec.schema.Schema;
 
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/FilterParseException.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/FilterParseException.java
similarity index 95%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/FilterParseException.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/FilterParseException.java
index 96dfea0..0c9e834 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/FilterParseException.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/FilterParseException.java
@@ -20,7 +20,7 @@
 /**
  * 
  */
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 /**
  * @author stevemoyer
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/FilterResponse.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/FilterResponse.java
similarity index 91%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/FilterResponse.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/FilterResponse.java
index 93b2642..777d8a4 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/FilterResponse.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/FilterResponse.java
@@ -17,14 +17,13 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 import java.util.Collection;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
-import org.apache.directory.scim.spec.protocol.search.PageRequest;
 
 @Data
 @EqualsAndHashCode
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/GroupExpression.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/GroupExpression.java
similarity index 95%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/GroupExpression.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/GroupExpression.java
index 736e18c..9de7ae0 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/GroupExpression.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/GroupExpression.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/InMemoryScimFilterMatcher.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/InMemoryScimFilterMatcher.java
similarity index 98%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/InMemoryScimFilterMatcher.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/InMemoryScimFilterMatcher.java
index 1802deb..8e2e707 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/InMemoryScimFilterMatcher.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/InMemoryScimFilterMatcher.java
@@ -17,10 +17,10 @@
  * under the License.
  */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 import org.apache.directory.scim.spec.exception.ScimResourceInvalidException;
-import org.apache.directory.scim.spec.protocol.attribute.AttributeReference;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReference;
 import org.apache.directory.scim.spec.schema.AttributeContainer;
 import org.apache.directory.scim.spec.schema.Schema;
 import org.slf4j.Logger;
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/LogicalExpression.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/LogicalExpression.java
similarity index 97%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/LogicalExpression.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/LogicalExpression.java
index f9b2228..1f64b3e 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/LogicalExpression.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/LogicalExpression.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/LogicalOperator.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/LogicalOperator.java
similarity index 93%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/LogicalOperator.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/LogicalOperator.java
index 829d284..a674683 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/LogicalOperator.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/LogicalOperator.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 public enum LogicalOperator {
   
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/search/PageRequest.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/PageRequest.java
similarity index 93%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/search/PageRequest.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/PageRequest.java
index 73691d5..a7c389c 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/search/PageRequest.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/PageRequest.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.search;
+package org.apache.directory.scim.spec.filter;
 
 import lombok.Data;
 
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/SimpleLogicalFilterBuilder.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/SimpleLogicalFilterBuilder.java
similarity index 96%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/SimpleLogicalFilterBuilder.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/SimpleLogicalFilterBuilder.java
index 4f9d2a2..8f87136 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/SimpleLogicalFilterBuilder.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/SimpleLogicalFilterBuilder.java
@@ -1,7 +1,6 @@
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 import lombok.extern.slf4j.Slf4j;
-import org.apache.directory.scim.spec.protocol.search.Filter;
 
 @Slf4j
 abstract class SimpleLogicalFilterBuilder implements FilterBuilder {
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/search/SortOrder.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/SortOrder.java
similarity index 94%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/search/SortOrder.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/SortOrder.java
index a0d550b..ab7bfce 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/search/SortOrder.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/SortOrder.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.search;
+package org.apache.directory.scim.spec.filter;
 
 import jakarta.xml.bind.annotation.XmlEnumValue;
 
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/search/SortRequest.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/SortRequest.java
similarity index 86%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/search/SortRequest.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/SortRequest.java
index c485d80..8913ef7 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/search/SortRequest.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/SortRequest.java
@@ -17,9 +17,9 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.search;
+package org.apache.directory.scim.spec.filter;
 
-import org.apache.directory.scim.spec.protocol.attribute.AttributeReference;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReference;
 import lombok.Data;
 
 @Data
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/TreePrintingListener.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/TreePrintingListener.java
similarity index 84%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/TreePrintingListener.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/TreePrintingListener.java
index 20054d3..6d1aa81 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/TreePrintingListener.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/TreePrintingListener.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 import org.antlr.v4.runtime.ParserRuleContext;
 import org.antlr.v4.runtime.tree.ErrorNode;
@@ -26,19 +26,19 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.directory.scim.server.filter.FilterParser.AttributeCompareExpressionContext;
-import org.apache.directory.scim.server.filter.FilterParser.AttributeGroupExpressionContext;
-import org.apache.directory.scim.server.filter.FilterParser.AttributeLogicExpressionContext;
-import org.apache.directory.scim.server.filter.FilterParser.AttributePresentExpressionContext;
-import org.apache.directory.scim.server.filter.FilterParser.FilterAttributeCompareExpressionContext;
-import org.apache.directory.scim.server.filter.FilterParser.FilterAttributeExpressionContext;
-import org.apache.directory.scim.server.filter.FilterParser.FilterAttributePresentExpressionContext;
-import org.apache.directory.scim.server.filter.FilterParser.FilterContext;
-import org.apache.directory.scim.server.filter.FilterParser.FilterGroupExpressionContext;
-import org.apache.directory.scim.server.filter.FilterParser.FilterLogicExpressionContext;
-import org.apache.directory.scim.server.filter.FilterParser.FilterValuePathExpressionContext;
-import org.apache.directory.scim.server.filter.FilterParser.FullAttributePathContext;
-import org.apache.directory.scim.server.filter.FilterParser.PartialAttributePathContext;
+import org.apache.directory.scim.spec.filter.FilterParser.AttributeCompareExpressionContext;
+import org.apache.directory.scim.spec.filter.FilterParser.AttributeGroupExpressionContext;
+import org.apache.directory.scim.spec.filter.FilterParser.AttributeLogicExpressionContext;
+import org.apache.directory.scim.spec.filter.FilterParser.AttributePresentExpressionContext;
+import org.apache.directory.scim.spec.filter.FilterParser.FilterAttributeCompareExpressionContext;
+import org.apache.directory.scim.spec.filter.FilterParser.FilterAttributeExpressionContext;
+import org.apache.directory.scim.spec.filter.FilterParser.FilterAttributePresentExpressionContext;
+import org.apache.directory.scim.spec.filter.FilterParser.FilterContext;
+import org.apache.directory.scim.spec.filter.FilterParser.FilterGroupExpressionContext;
+import org.apache.directory.scim.spec.filter.FilterParser.FilterLogicExpressionContext;
+import org.apache.directory.scim.spec.filter.FilterParser.FilterValuePathExpressionContext;
+import org.apache.directory.scim.spec.filter.FilterParser.FullAttributePathContext;
+import org.apache.directory.scim.spec.filter.FilterParser.PartialAttributePathContext;
 
 public class TreePrintingListener extends ExpressionBuildingListener {
 
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/ValueFilterExpression.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/ValueFilterExpression.java
similarity index 93%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/ValueFilterExpression.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/ValueFilterExpression.java
index 04e97a7..8ce5668 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/ValueFilterExpression.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/ValueFilterExpression.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 public interface ValueFilterExpression {
 
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/ValuePathExpression.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/ValuePathExpression.java
similarity index 96%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/ValuePathExpression.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/ValuePathExpression.java
index ac44f24..a39a5aa 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/filter/ValuePathExpression.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/ValuePathExpression.java
@@ -17,9 +17,9 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
-import org.apache.directory.scim.spec.protocol.attribute.AttributeReference;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReference;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/attribute/AttributeReference.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/attribute/AttributeReference.java
similarity index 97%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/attribute/AttributeReference.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/attribute/AttributeReference.java
index d941d32..ffe52ad 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/attribute/AttributeReference.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/attribute/AttributeReference.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.attribute;
+package org.apache.directory.scim.spec.filter.attribute;
 
 import java.io.Serializable;
 
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/attribute/AttributeReferenceListWrapper.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/attribute/AttributeReferenceListWrapper.java
similarity index 96%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/attribute/AttributeReferenceListWrapper.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/attribute/AttributeReferenceListWrapper.java
index 6d383f6..f2819a6 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/attribute/AttributeReferenceListWrapper.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/attribute/AttributeReferenceListWrapper.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.attribute;
+package org.apache.directory.scim.spec.filter.attribute;
 
 import java.util.HashSet;
 import java.util.Set;
diff --git a/scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/ScimRequestContext.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/attribute/ScimRequestContext.java
similarity index 87%
rename from scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/ScimRequestContext.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/attribute/ScimRequestContext.java
index 2ca929e..9ddc86c 100644
--- a/scim-server/src/main/java/org/apache/directory/scim/server/repository/extensions/ScimRequestContext.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/attribute/ScimRequestContext.java
@@ -17,11 +17,11 @@
 * under the License.
 */
 
-package org.apache.directory.scim.server.repository.extensions;
+package org.apache.directory.scim.spec.filter.attribute;
 
 import java.util.Set;
 
-import org.apache.directory.scim.spec.protocol.attribute.AttributeReference;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReference;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/PatchOperation.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/patch/PatchOperation.java
similarity index 93%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/PatchOperation.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/patch/PatchOperation.java
index 2a79318..141e91b 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/PatchOperation.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/patch/PatchOperation.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.data;
+package org.apache.directory.scim.spec.patch;
 
 import jakarta.xml.bind.annotation.XmlAccessType;
 import jakarta.xml.bind.annotation.XmlAccessorType;
@@ -29,6 +29,7 @@
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.apache.directory.scim.spec.adapter.PatchOperationPathAdapter;
 
 @Data
 @EqualsAndHashCode
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/PatchOperationPath.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/patch/PatchOperationPath.java
similarity index 87%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/PatchOperationPath.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/patch/PatchOperationPath.java
index 4190778..5191042 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/PatchOperationPath.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/patch/PatchOperationPath.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.data;
+package org.apache.directory.scim.spec.patch;
 
 import org.antlr.v4.runtime.ANTLRInputStream;
 import org.antlr.v4.runtime.BaseErrorListener;
@@ -27,10 +27,10 @@
 import org.antlr.v4.runtime.tree.ParseTree;
 import org.antlr.v4.runtime.tree.ParseTreeWalker;
 
-import org.apache.directory.scim.server.filter.FilterLexer;
-import org.apache.directory.scim.server.filter.FilterParser;
-import org.apache.directory.scim.spec.protocol.filter.FilterParseException;
-import org.apache.directory.scim.spec.protocol.filter.ValuePathExpression;
+import org.apache.directory.scim.spec.filter.FilterLexer;
+import org.apache.directory.scim.spec.filter.FilterParser;
+import org.apache.directory.scim.spec.filter.FilterParseException;
+import org.apache.directory.scim.spec.filter.ValuePathExpression;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 
diff --git a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/PatchPathListener.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/patch/PatchPathListener.java
similarity index 79%
rename from scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/PatchPathListener.java
rename to scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/patch/PatchPathListener.java
index 504f15e..283d2f1 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/org/apache/directory/scim/spec/protocol/data/PatchPathListener.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/patch/PatchPathListener.java
@@ -17,14 +17,14 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.data;
+package org.apache.directory.scim.spec.patch;
 
-import org.apache.directory.scim.server.filter.FilterParser.PatchPathFullContext;
-import org.apache.directory.scim.server.filter.FilterParser.PatchPathPartialContext;
-import org.apache.directory.scim.spec.protocol.attribute.AttributeReference;
-import org.apache.directory.scim.spec.protocol.filter.ExpressionBuildingListener;
-import org.apache.directory.scim.spec.protocol.filter.FilterExpression;
-import org.apache.directory.scim.spec.protocol.filter.ValuePathExpression;
+import org.apache.directory.scim.spec.filter.FilterParser.PatchPathFullContext;
+import org.apache.directory.scim.spec.filter.FilterParser.PatchPathPartialContext;
+import org.apache.directory.scim.spec.filter.attribute.AttributeReference;
+import org.apache.directory.scim.spec.filter.ExpressionBuildingListener;
+import org.apache.directory.scim.spec.filter.FilterExpression;
+import org.apache.directory.scim.spec.filter.ValuePathExpression;
 import lombok.Getter;
 
 @Getter
diff --git a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/LuckyNumberExtension.java b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/LuckyNumberExtension.java
similarity index 97%
rename from scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/LuckyNumberExtension.java
rename to scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/LuckyNumberExtension.java
index 482cad8..b50c45f 100644
--- a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/LuckyNumberExtension.java
+++ b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/LuckyNumberExtension.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol;
+package org.apache.directory.scim.spec;
 
 import jakarta.xml.bind.annotation.XmlAccessType;
 import jakarta.xml.bind.annotation.XmlAccessorType;
diff --git a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/AbstractLexerParserTest.java b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/AbstractLexerParserTest.java
similarity index 98%
rename from scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/AbstractLexerParserTest.java
rename to scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/AbstractLexerParserTest.java
index 227e34c..0f6644d 100644
--- a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/AbstractLexerParserTest.java
+++ b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/AbstractLexerParserTest.java
@@ -20,7 +20,7 @@
 /**
  * 
  */
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 import org.apache.commons.lang3.ArrayUtils;
 
diff --git a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderEqualsTest.java b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterBuilderEqualsTest.java
similarity index 94%
rename from scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderEqualsTest.java
rename to scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterBuilderEqualsTest.java
index c354b4e..56e911f 100644
--- a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderEqualsTest.java
+++ b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterBuilderEqualsTest.java
@@ -17,10 +17,12 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 import lombok.extern.slf4j.Slf4j;
-import org.apache.directory.scim.spec.protocol.search.Filter;
+import org.apache.directory.scim.spec.filter.Filter;
+import org.apache.directory.scim.spec.filter.FilterBuilder;
+import org.apache.directory.scim.spec.filter.FilterParseException;
 import org.junit.jupiter.api.Test;
 
 import java.text.SimpleDateFormat;
diff --git a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderGreaterTest.java b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterBuilderGreaterTest.java
similarity index 96%
rename from scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderGreaterTest.java
rename to scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterBuilderGreaterTest.java
index 7cd482b..efd9fcb 100644
--- a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderGreaterTest.java
+++ b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterBuilderGreaterTest.java
@@ -17,10 +17,12 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 import lombok.extern.slf4j.Slf4j;
-import org.apache.directory.scim.spec.protocol.search.Filter;
+import org.apache.directory.scim.spec.filter.Filter;
+import org.apache.directory.scim.spec.filter.FilterBuilder;
+import org.apache.directory.scim.spec.filter.FilterParseException;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
diff --git a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderLessThanTest.java b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterBuilderLessThanTest.java
similarity index 96%
rename from scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderLessThanTest.java
rename to scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterBuilderLessThanTest.java
index 763a139..3a636ae 100644
--- a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderLessThanTest.java
+++ b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterBuilderLessThanTest.java
@@ -17,10 +17,12 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 import lombok.extern.slf4j.Slf4j;
-import org.apache.directory.scim.spec.protocol.search.Filter;
+import org.apache.directory.scim.spec.filter.Filter;
+import org.apache.directory.scim.spec.filter.FilterBuilder;
+import org.apache.directory.scim.spec.filter.FilterParseException;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
diff --git a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderNotEqualsTest.java b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterBuilderNotEqualsTest.java
similarity index 94%
rename from scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderNotEqualsTest.java
rename to scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterBuilderNotEqualsTest.java
index 61e4215..fd55ea0 100644
--- a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderNotEqualsTest.java
+++ b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterBuilderNotEqualsTest.java
@@ -17,10 +17,12 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 import lombok.extern.slf4j.Slf4j;
-import org.apache.directory.scim.spec.protocol.search.Filter;
+import org.apache.directory.scim.spec.filter.Filter;
+import org.apache.directory.scim.spec.filter.FilterBuilder;
+import org.apache.directory.scim.spec.filter.FilterParseException;
 import org.junit.jupiter.api.Test;
 
 import java.text.SimpleDateFormat;
diff --git a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderPresentTest.java b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterBuilderPresentTest.java
similarity index 87%
rename from scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderPresentTest.java
rename to scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterBuilderPresentTest.java
index 5e47864..f9cb497 100644
--- a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderPresentTest.java
+++ b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterBuilderPresentTest.java
@@ -17,10 +17,12 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 import lombok.extern.slf4j.Slf4j;
-import org.apache.directory.scim.spec.protocol.search.Filter;
+import org.apache.directory.scim.spec.filter.Filter;
+import org.apache.directory.scim.spec.filter.FilterBuilder;
+import org.apache.directory.scim.spec.filter.FilterParseException;
 import org.junit.jupiter.api.Test;
 
 import static org.assertj.core.api.Assertions.assertThat;
diff --git a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderStringTest.java b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterBuilderStringTest.java
similarity index 88%
rename from scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderStringTest.java
rename to scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterBuilderStringTest.java
index 1f3dc1d..a909b59 100644
--- a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderStringTest.java
+++ b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterBuilderStringTest.java
@@ -17,10 +17,12 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 import lombok.extern.slf4j.Slf4j;
-import org.apache.directory.scim.spec.protocol.search.Filter;
+import org.apache.directory.scim.spec.filter.Filter;
+import org.apache.directory.scim.spec.filter.FilterBuilder;
+import org.apache.directory.scim.spec.filter.FilterParseException;
 import org.junit.jupiter.api.Test;
 
 import static org.assertj.core.api.Assertions.assertThat;
diff --git a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderTest.java b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterBuilderTest.java
similarity index 96%
rename from scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderTest.java
rename to scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterBuilderTest.java
index cd26126..641fad0 100644
--- a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterBuilderTest.java
+++ b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterBuilderTest.java
@@ -17,16 +17,16 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 import lombok.extern.slf4j.Slf4j;
-import org.apache.directory.scim.spec.protocol.search.Filter;
+import org.apache.directory.scim.spec.filter.Filter;
+import org.apache.directory.scim.spec.filter.FilterBuilder;
+import org.apache.directory.scim.spec.filter.FilterParseException;
 import org.junit.jupiter.api.Test;
 
 import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
 
-import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
diff --git a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterTest.java b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterTest.java
similarity index 92%
rename from scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterTest.java
rename to scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterTest.java
index a73e60f..dbff6ef 100644
--- a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/FilterTest.java
+++ b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/FilterTest.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -25,8 +25,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.directory.scim.spec.protocol.search.Filter;
-
 public class FilterTest extends AbstractLexerParserTest {
 
   private static final Logger LOG = LoggerFactory.getLogger(FilterTest.class);
diff --git a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/InMemoryScimFilterMatcherTest.java b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/InMemoryScimFilterMatcherTest.java
similarity index 97%
rename from scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/InMemoryScimFilterMatcherTest.java
rename to scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/InMemoryScimFilterMatcherTest.java
index 87b7681..2afa04f 100644
--- a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/filter/InMemoryScimFilterMatcherTest.java
+++ b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/InMemoryScimFilterMatcherTest.java
@@ -17,10 +17,9 @@
  * under the License.
  */
 
-package org.apache.directory.scim.spec.protocol.filter;
+package org.apache.directory.scim.spec.filter;
 
-import org.apache.directory.scim.spec.protocol.LuckyNumberExtension;
-import org.apache.directory.scim.spec.protocol.search.Filter;
+import org.apache.directory.scim.spec.LuckyNumberExtension;
 import org.apache.directory.scim.spec.resources.*;
 import org.apache.directory.scim.spec.schema.Meta;
 import org.apache.directory.scim.spec.schema.Schemas;
diff --git a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/attribute/AttributeReferenceTest.java b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/attribute/AttributeReferenceTest.java
similarity index 97%
rename from scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/attribute/AttributeReferenceTest.java
rename to scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/attribute/AttributeReferenceTest.java
index 51ea100..237b775 100644
--- a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/attribute/AttributeReferenceTest.java
+++ b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/filter/attribute/AttributeReferenceTest.java
@@ -17,7 +17,7 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.attribute;
+package org.apache.directory.scim.spec.filter.attribute;
 
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
diff --git a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/data/PatchOperationPathTest.java b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/patch/PatchOperationPathTest.java
similarity index 93%
rename from scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/data/PatchOperationPathTest.java
rename to scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/patch/PatchOperationPathTest.java
index 1132d8b..df1cf7b 100644
--- a/scim-spec/scim-spec-protocol/src/test/java/org/apache/directory/scim/spec/protocol/data/PatchOperationPathTest.java
+++ b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/patch/PatchOperationPathTest.java
@@ -17,8 +17,9 @@
 * under the License.
 */
 
-package org.apache.directory.scim.spec.protocol.data;
+package org.apache.directory.scim.spec.patch;
 
+import org.apache.directory.scim.spec.patch.PatchOperationPath;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;