Update examples to pass external SCIM testing
diff --git a/pom.xml b/pom.xml
index c2b519b..43e9223 100644
--- a/pom.xml
+++ b/pom.xml
@@ -175,7 +175,6 @@
         <groupId>org.hibernate.validator</groupId>
         <artifactId>hibernate-validator</artifactId>
         <version>7.0.5.Final</version>
-        <scope>test</scope>
       </dependency>
       <dependency>
         <groupId>org.glassfish</groupId>
diff --git a/scim-server-examples/scim-server-jersey/pom.xml b/scim-server-examples/scim-server-jersey/pom.xml
index c8b05ff..f7ff32d 100644
--- a/scim-server-examples/scim-server-jersey/pom.xml
+++ b/scim-server-examples/scim-server-jersey/pom.xml
@@ -28,7 +28,7 @@
   <name>SCIM - Server - Examples - Jersey</name>
 
   <properties>
-    <jersey.version>3.0.6</jersey.version>
+    <jersey.version>3.0.5</jersey.version>
   </properties>
 
   <dependencyManagement>
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 0e0e62b..5fcd742 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
@@ -19,6 +19,9 @@
 
 package org.apache.directory.scim.example.jersey;
 
+import jakarta.inject.Inject;
+import org.apache.directory.scim.server.ScimConfiguration;
+import org.apache.directory.scim.server.configuration.ServerConfiguration;
 import org.apache.directory.scim.server.rest.ScimResourceHelper;
 
 import java.net.URI;
@@ -33,6 +36,8 @@
 import org.slf4j.LoggerFactory;
 import org.slf4j.bridge.SLF4JBridgeHandler;
 
+import static org.apache.directory.scim.spec.schema.ServiceProviderConfiguration.AuthenticationSchema.oauthBearer;
+
 // @ApplicationPath("v2")
 // Embedded Jersey + Jetty ignores the ApplicationPath annotation
 // https://github.com/eclipse-ee4j/jersey/issues/3222
@@ -44,7 +49,30 @@
   
   @Override
   public Set<Class<?>> getClasses() {
-    return new HashSet<>(ScimResourceHelper.getScimClassesToLoad());
+    Set<Class<?>> clazzes = new HashSet<>(ScimResourceHelper.getScimClassesToLoad());
+    clazzes.add(ServerConfigInitializer.class);
+    return clazzes;
+  }
+
+  /**
+   * A {@link ScimConfiguration} allow for eager initialization of beans, this class configures the {@link ServerConfiguration}.
+   */
+  public static class ServerConfigInitializer implements ScimConfiguration {
+
+    @Inject
+    private ServerConfiguration serverConfiguration;
+
+    @Override
+    public void configure() {
+
+      // Set any unique configuration bits
+      serverConfiguration
+        .setId("scimple-jersey-example")
+        .setDocumentationUri("https://github.com/apache/directory-scimple");
+
+        // set the auth scheme too
+        // .addAuthenticationSchema(oauthBearer());
+    }
   }
 
   public static void main(String[] args) {
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 7f4ae69..fca8299 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
@@ -20,9 +20,14 @@
 package org.apache.directory.scim.example.jersey.service;
 
 import jakarta.annotation.PostConstruct;
+import jakarta.inject.Inject;
+import jakarta.ws.rs.core.Response;
+import org.apache.directory.scim.server.exception.UnableToCreateResourceException;
 import org.apache.directory.scim.server.exception.UnableToUpdateResourceException;
 import org.apache.directory.scim.server.repository.Repository;
 import org.apache.directory.scim.server.repository.UpdateRequest;
+import org.apache.directory.scim.server.schema.SchemaRegistry;
+import org.apache.directory.scim.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;
@@ -34,6 +39,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Named;
@@ -44,6 +50,15 @@
 
   private final Map<String, ScimGroup> groups = new HashMap<>();
 
+  private SchemaRegistry schemaRegistry;
+
+  @Inject
+  public InMemoryGroupService(SchemaRegistry schemaRegistry) {
+    this.schemaRegistry = schemaRegistry;
+  }
+
+  protected InMemoryGroupService() {}
+
   @PostConstruct
   public void init() {
     ScimGroup group = new ScimGroup();
@@ -57,7 +72,7 @@
   }
 
   @Override
-  public ScimGroup create(ScimGroup resource) {
+  public ScimGroup create(ScimGroup resource) throws UnableToCreateResourceException {
     String resourceId = resource.getId();
     int idCandidate = resource.hashCode();
     String id = resourceId != null ? resourceId : Integer.toString(idCandidate);
@@ -66,8 +81,17 @@
       id = Integer.toString(idCandidate);
       ++idCandidate;
     }
-    groups.put(id, resource);
+
+    // check to make sure the group doesn't already exist
+    boolean existingUserFound = groups.values().stream()
+      .anyMatch(group -> group.getExternalId().equals(resource.getExternalId()));
+    if (existingUserFound) {
+      // HTTP leaking into data layer
+      throw new UnableToCreateResourceException(Response.Status.CONFLICT, "Group '" + resource.getExternalId() + "' already exists.");
+    }
+
     resource.setId(id);
+    groups.put(id, resource);
     return resource;
   }
 
@@ -91,7 +115,18 @@
 
   @Override
   public FilterResponse<ScimGroup> find(Filter filter, PageRequest pageRequest, SortRequest sortRequest) {
-    return new FilterResponse<>(groups.values(), pageRequest, groups.size());
+    long count = pageRequest.getCount() != null ? pageRequest.getCount() : groups.size();
+    long startIndex = pageRequest.getStartIndex() != null
+      ? pageRequest.getStartIndex() - 1 // SCIM is 1-based indexed
+      : 0;
+
+    List<ScimGroup> result = groups.values().stream()
+      .skip(startIndex)
+      .limit(count)
+      .filter(FilterExpressions.inMemory(filter, schemaRegistry.getSchema(ScimGroup.SCHEMA_URI)))
+      .collect(Collectors.toList());
+
+    return new FilterResponse<>(result, pageRequest, result.size());
   }
 
   @Override
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 971a248..7dc686b 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
@@ -19,38 +19,40 @@
 
 package org.apache.directory.scim.example.jersey.service;
 
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import jakarta.annotation.PostConstruct;
 import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
 import jakarta.inject.Named;
 
+import jakarta.ws.rs.core.Response;
 import org.apache.directory.scim.example.jersey.extensions.LuckyNumberExtension;
+import org.apache.directory.scim.server.exception.UnableToCreateResourceException;
 import org.apache.directory.scim.server.exception.UnableToUpdateResourceException;
 import org.apache.directory.scim.server.repository.Repository;
 import org.apache.directory.scim.server.repository.UpdateRequest;
+import org.apache.directory.scim.server.schema.SchemaRegistry;
+import org.apache.directory.scim.spec.protocol.filter.FilterExpressions;
 import org.apache.directory.scim.spec.protocol.filter.FilterResponse;
 import org.apache.directory.scim.spec.protocol.search.Filter;
 import org.apache.directory.scim.spec.protocol.search.PageRequest;
 import org.apache.directory.scim.spec.protocol.search.SortRequest;
-import org.apache.directory.scim.spec.resources.Email;
-import org.apache.directory.scim.spec.resources.ScimExtension;
-import org.apache.directory.scim.spec.resources.ScimResource;
-import org.apache.directory.scim.spec.resources.ScimUser;
+import org.apache.directory.scim.spec.resources.*;
 
 /**
  * Creates a singleton (effectively) Repository<ScimUser> with a memory-based
  * persistence layer.
- * 
+ *
  * @author Chris Harm &lt;crh5255@psu.edu&gt;
  */
 @Named
 @ApplicationScoped
 public class InMemoryUserService implements Repository<ScimUser> {
-  
+
   static final String DEFAULT_USER_ID = "1";
   static final String DEFAULT_USER_EXTERNAL_ID = "e" + DEFAULT_USER_ID;
   static final String DEFAULT_USER_DISPLAY_NAME = "User " + DEFAULT_USER_ID;
@@ -58,8 +60,17 @@
   static final String DEFAULT_USER_EMAIL_TYPE = "work";
   static final int DEFAULT_USER_LUCKY_NUMBER = 7;
 
-  private Map<String, ScimUser> users = new HashMap<>();
-  
+  private final Map<String, ScimUser> users = new HashMap<>();
+
+  private SchemaRegistry schemaRegistry;
+
+  @Inject
+  public InMemoryUserService(SchemaRegistry schemaRegistry) {
+    this.schemaRegistry = schemaRegistry;
+  }
+
+  protected InMemoryUserService() {}
+
   @PostConstruct
   public void init() {
     ScimUser user = new ScimUser();
@@ -67,18 +78,21 @@
     user.setExternalId(DEFAULT_USER_EXTERNAL_ID);
     user.setUserName(DEFAULT_USER_EXTERNAL_ID);
     user.setDisplayName(DEFAULT_USER_DISPLAY_NAME);
+    user.setName(new Name()
+      .setGivenName("Tester")
+      .setFamilyName("McTest"));
     Email email = new Email();
     email.setDisplay(DEFAULT_USER_EMAIL_VALUE);
     email.setValue(DEFAULT_USER_EMAIL_VALUE);
     email.setType(DEFAULT_USER_EMAIL_TYPE);
     email.setPrimary(true);
-    user.setEmails(Arrays.asList(email));
-    
+    user.setEmails(List.of(email));
+
     LuckyNumberExtension luckyNumberExtension = new LuckyNumberExtension();
     luckyNumberExtension.setLuckyNumber(DEFAULT_USER_LUCKY_NUMBER);
-    
+
     user.addExtension(luckyNumberExtension);
-    
+
     users.put(user.getId(), user);
   }
 
@@ -91,7 +105,7 @@
    * @see Repository#create(ScimResource)
    */
   @Override
-  public ScimUser create(ScimUser resource) {
+  public ScimUser create(ScimUser resource) throws UnableToCreateResourceException {
     String resourceId = resource.getId();
     int idCandidate = resource.hashCode();
     String id = resourceId != null ? resourceId : Integer.toString(idCandidate);
@@ -100,8 +114,17 @@
       id = Integer.toString(idCandidate);
       ++idCandidate;
     }
-    users.put(id, resource);
+
+    // check to make sure the user doesn't already exist
+    boolean existingUserFound = users.values().stream()
+      .anyMatch(user -> user.getUserName().equals(resource.getUserName()));
+    if (existingUserFound) {
+      // HTTP leaking into data layer
+      throw new UnableToCreateResourceException(Response.Status.CONFLICT, "User '" + resource.getUserName() + "' already exists.");
+    }
+
     resource.setId(id);
+    users.put(id, resource);
     return resource;
   }
 
@@ -137,7 +160,19 @@
    */
   @Override
   public FilterResponse<ScimUser> find(Filter filter, PageRequest pageRequest, SortRequest sortRequest) {
-    return new FilterResponse<>(users.values(), pageRequest, users.size());
+
+    long count = pageRequest.getCount() != null ? pageRequest.getCount() : users.size();
+    long startIndex = pageRequest.getStartIndex() != null
+      ? pageRequest.getStartIndex() - 1 // SCIM is 1-based indexed
+      : 0;
+
+    List<ScimUser> result = users.values().stream()
+      .skip(startIndex)
+      .limit(count)
+      .filter(FilterExpressions.inMemory(filter, schemaRegistry.getSchema(ScimUser.SCHEMA_URI)))
+      .collect(Collectors.toList());
+
+    return new FilterResponse<>(result, pageRequest, result.size());
   }
 
   /**
@@ -145,7 +180,6 @@
    */
   @Override
   public List<Class<? extends ScimExtension>> getExtensionList() {
-    return Arrays.asList(LuckyNumberExtension.class);
+    return List.of(LuckyNumberExtension.class);
   }
-
 }
diff --git a/scim-server-examples/scim-server-memory/pom.xml b/scim-server-examples/scim-server-memory/pom.xml
index 0a89d63..4fd4b02 100644
--- a/scim-server-examples/scim-server-memory/pom.xml
+++ b/scim-server-examples/scim-server-memory/pom.xml
@@ -45,6 +45,7 @@
   </dependencies>
 
   <build>
+    <defaultGoal>package tomee:run</defaultGoal>
     <plugins>
       <plugin>
         <groupId>org.apache.geronimo.genesis.plugins</groupId>
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 864136f..5a65c00 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
@@ -19,6 +19,9 @@
 
 package org.apache.directory.scim.example.memory.rest;
 
+import jakarta.inject.Inject;
+import org.apache.directory.scim.server.ScimConfiguration;
+import org.apache.directory.scim.server.configuration.ServerConfiguration;
 import org.apache.directory.scim.server.rest.ScimResourceHelper;
 
 import java.util.HashSet;
@@ -26,6 +29,9 @@
 
 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 {
@@ -35,8 +41,28 @@
     Set<Class<?>> clazzes = new HashSet<>();
     
     clazzes.addAll(ScimResourceHelper.getScimClassesToLoad());
+    clazzes.add(ServerConfigInitializer.class);
 
     return clazzes;
   }
-  
+
+  /**
+   * A {@link ScimConfiguration} allow for eager initialization of beans, this class configures the {@link ServerConfiguration}.
+   */
+  public static class ServerConfigInitializer implements ScimConfiguration {
+
+    @Inject
+    private ServerConfiguration serverConfiguration;
+
+    @Override
+    public void configure() {
+      // Set any unique configuration bits
+      serverConfiguration
+        .setId("scimple-in-memory-example")
+        .setDocumentationUri("https://github.com/apache/directory-scimple");
+
+      // set the auth scheme too
+      // .addAuthenticationSchema(oauthBearer());
+    }
+  }
 }
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 e2d2e0e..2288eba 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
@@ -20,9 +20,14 @@
 package org.apache.directory.scim.example.memory.service;
 
 import jakarta.annotation.PostConstruct;
+import jakarta.inject.Inject;
+import jakarta.ws.rs.core.Response;
+import org.apache.directory.scim.server.exception.UnableToCreateResourceException;
 import org.apache.directory.scim.server.exception.UnableToUpdateResourceException;
 import org.apache.directory.scim.server.repository.Repository;
 import org.apache.directory.scim.server.repository.UpdateRequest;
+import org.apache.directory.scim.server.schema.SchemaRegistry;
+import org.apache.directory.scim.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;
@@ -34,6 +39,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Named;
@@ -44,6 +50,15 @@
 
   private final Map<String, ScimGroup> groups = new HashMap<>();
 
+  private SchemaRegistry schemaRegistry;
+
+  @Inject
+  public InMemoryGroupService(SchemaRegistry schemaRegistry) {
+    this.schemaRegistry = schemaRegistry;
+  }
+
+  protected InMemoryGroupService() {}
+
   @PostConstruct
   public void init() {
     ScimGroup group = new ScimGroup();
@@ -57,7 +72,7 @@
   }
 
   @Override
-  public ScimGroup create(ScimGroup resource) {
+  public ScimGroup create(ScimGroup resource) throws UnableToCreateResourceException {
     String resourceId = resource.getId();
     int idCandidate = resource.hashCode();
     String id = resourceId != null ? resourceId : Integer.toString(idCandidate);
@@ -66,8 +81,17 @@
       id = Integer.toString(idCandidate);
       ++idCandidate;
     }
-    groups.put(id, resource);
+
+    // check to make sure the group doesn't already exist
+    boolean existingUserFound = groups.values().stream()
+      .anyMatch(group -> group.getExternalId().equals(resource.getExternalId()));
+    if (existingUserFound) {
+      // HTTP leaking into data layer
+      throw new UnableToCreateResourceException(Response.Status.CONFLICT, "Group '" + resource.getExternalId() + "' already exists.");
+    }
+
     resource.setId(id);
+    groups.put(id, resource);
     return resource;
   }
 
@@ -91,7 +115,18 @@
 
   @Override
   public FilterResponse<ScimGroup> find(Filter filter, PageRequest pageRequest, SortRequest sortRequest) {
-    return new FilterResponse<>(groups.values(), pageRequest, groups.size());
+    long count = pageRequest.getCount() != null ? pageRequest.getCount() : groups.size();
+    long startIndex = pageRequest.getStartIndex() != null
+      ? pageRequest.getStartIndex() - 1 // SCIM is 1-based indexed
+      : 0;
+
+    List<ScimGroup> result = groups.values().stream()
+      .skip(startIndex)
+      .limit(count)
+      .filter(FilterExpressions.inMemory(filter, schemaRegistry.getSchema(ScimGroup.SCHEMA_URI)))
+      .collect(Collectors.toList());
+
+    return new FilterResponse<>(result, pageRequest, result.size());
   }
 
   @Override
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 e9a378e..f845b9e 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
@@ -19,27 +19,29 @@
 
 package org.apache.directory.scim.example.memory.service;
 
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import jakarta.annotation.PostConstruct;
 import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
 import jakarta.inject.Named;
 
+import jakarta.ws.rs.core.Response;
 import org.apache.directory.scim.example.memory.extensions.LuckyNumberExtension;
+import org.apache.directory.scim.server.exception.UnableToCreateResourceException;
 import org.apache.directory.scim.server.exception.UnableToUpdateResourceException;
 import org.apache.directory.scim.server.repository.Repository;
 import org.apache.directory.scim.server.repository.UpdateRequest;
+import org.apache.directory.scim.server.schema.SchemaRegistry;
+import org.apache.directory.scim.spec.protocol.filter.FilterExpressions;
 import org.apache.directory.scim.spec.protocol.filter.FilterResponse;
 import org.apache.directory.scim.spec.protocol.search.Filter;
 import org.apache.directory.scim.spec.protocol.search.PageRequest;
 import org.apache.directory.scim.spec.protocol.search.SortRequest;
-import org.apache.directory.scim.spec.resources.Email;
-import org.apache.directory.scim.spec.resources.ScimExtension;
-import org.apache.directory.scim.spec.resources.ScimResource;
-import org.apache.directory.scim.spec.resources.ScimUser;
+import org.apache.directory.scim.spec.resources.*;
 
 /**
  * Creates a singleton (effectively) Repository<ScimUser> with a memory-based
@@ -50,7 +52,7 @@
 @Named
 @ApplicationScoped
 public class InMemoryUserService implements Repository<ScimUser> {
-  
+
   static final String DEFAULT_USER_ID = "1";
   static final String DEFAULT_USER_EXTERNAL_ID = "e" + DEFAULT_USER_ID;
   static final String DEFAULT_USER_DISPLAY_NAME = "User " + DEFAULT_USER_ID;
@@ -58,8 +60,17 @@
   static final String DEFAULT_USER_EMAIL_TYPE = "work";
   static final int DEFAULT_USER_LUCKY_NUMBER = 7;
 
-  private Map<String, ScimUser> users = new HashMap<>();
-  
+  private final Map<String, ScimUser> users = new HashMap<>();
+
+  private SchemaRegistry schemaRegistry;
+
+  @Inject
+  public InMemoryUserService(SchemaRegistry schemaRegistry) {
+    this.schemaRegistry = schemaRegistry;
+  }
+
+  protected InMemoryUserService() {}
+
   @PostConstruct
   public void init() {
     ScimUser user = new ScimUser();
@@ -67,12 +78,15 @@
     user.setExternalId(DEFAULT_USER_EXTERNAL_ID);
     user.setUserName(DEFAULT_USER_EXTERNAL_ID);
     user.setDisplayName(DEFAULT_USER_DISPLAY_NAME);
+    user.setName(new Name()
+        .setGivenName("Tester")
+        .setFamilyName("McTest"));
     Email email = new Email();
     email.setDisplay(DEFAULT_USER_EMAIL_VALUE);
     email.setValue(DEFAULT_USER_EMAIL_VALUE);
     email.setType(DEFAULT_USER_EMAIL_TYPE);
     email.setPrimary(true);
-    user.setEmails(Arrays.asList(email));
+    user.setEmails(List.of(email));
     
     LuckyNumberExtension luckyNumberExtension = new LuckyNumberExtension();
     luckyNumberExtension.setLuckyNumber(DEFAULT_USER_LUCKY_NUMBER);
@@ -91,7 +105,7 @@
    * @see Repository#create(ScimResource)
    */
   @Override
-  public ScimUser create(ScimUser resource) {
+  public ScimUser create(ScimUser resource) throws UnableToCreateResourceException {
     String resourceId = resource.getId();
     int idCandidate = resource.hashCode();
     String id = resourceId != null ? resourceId : Integer.toString(idCandidate);
@@ -100,8 +114,17 @@
       id = Integer.toString(idCandidate);
       ++idCandidate;
     }
-    users.put(id, resource);
+
+    // check to make sure the user doesn't already exist
+    boolean existingUserFound = users.values().stream()
+      .anyMatch(user -> user.getUserName().equals(resource.getUserName()));
+    if (existingUserFound) {
+      // HTTP leaking into data layer
+      throw new UnableToCreateResourceException(Response.Status.CONFLICT, "User '" + resource.getUserName() + "' already exists.");
+    }
+
     resource.setId(id);
+    users.put(id, resource);
     return resource;
   }
 
@@ -137,7 +160,19 @@
    */
   @Override
   public FilterResponse<ScimUser> find(Filter filter, PageRequest pageRequest, SortRequest sortRequest) {
-    return new FilterResponse<>(users.values(), pageRequest, users.size());
+
+    long count = pageRequest.getCount() != null ? pageRequest.getCount() : users.size();
+    long startIndex = pageRequest.getStartIndex() != null
+      ? pageRequest.getStartIndex() - 1 // SCIM is 1-based indexed
+      : 0;
+
+    List<ScimUser> result = users.values().stream()
+      .skip(startIndex)
+      .limit(count)
+      .filter(FilterExpressions.inMemory(filter, schemaRegistry.getSchema(ScimUser.SCHEMA_URI)))
+      .collect(Collectors.toList());
+
+    return new FilterResponse<>(result, pageRequest, result.size());
   }
 
   /**
@@ -145,7 +180,6 @@
    */
   @Override
   public List<Class<? extends ScimExtension>> getExtensionList() {
-    return Arrays.asList(LuckyNumberExtension.class);
+    return List.of(LuckyNumberExtension.class);
   }
-
 }