Merge branch 'release/2.12'
diff --git a/pom.xml b/pom.xml
index de208de..598ea34 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
 
   <groupId>edu.psu.swe.scim</groupId>
   <artifactId>scim-parent</artifactId>
-  <version>2.11</version>
+  <version>2.12</version>
   <packaging>pom</packaging>
   <name>SCIM - Parent</name>
   <description>Penn State's Open Source JavaEE implmentation of the SCIM version 2.0 specification (RFC7642, RFC7643 and RFC7644)</description>
diff --git a/scim-client/pom.xml b/scim-client/pom.xml
index 550877f..b8b90fc 100644
--- a/scim-client/pom.xml
+++ b/scim-client/pom.xml
@@ -3,7 +3,7 @@
   <parent>
     <groupId>edu.psu.swe.scim</groupId>
     <artifactId>scim-parent</artifactId>
-    <version>2.11</version>
+    <version>2.12</version>
   </parent>
   <artifactId>scim-client</artifactId>
   <name>SCIM - Client</name>
diff --git a/scim-common/pom.xml b/scim-common/pom.xml
index d6e9b61..757a853 100644
--- a/scim-common/pom.xml
+++ b/scim-common/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>edu.psu.swe.scim</groupId>
     <artifactId>scim-parent</artifactId>
-    <version>2.11</version>
+    <version>2.12</version>
   </parent>
 
   <artifactId>scim-common</artifactId>
@@ -14,12 +14,12 @@
     <dependency>
       <groupId>edu.psu.swe.scim</groupId>
       <artifactId>scim-spec-protocol</artifactId>
-      <version>2.11</version>
+      <version>2.12</version>
     </dependency>
     <dependency>
       <groupId>edu.psu.swe.scim</groupId>
       <artifactId>scim-spec-schema</artifactId>
-      <version>2.11</version>
+      <version>2.12</version>
     </dependency>
   </dependencies>
 
diff --git a/scim-compliance/pom.xml b/scim-compliance/pom.xml
index 722dfca..61bc562 100644
--- a/scim-compliance/pom.xml
+++ b/scim-compliance/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>edu.psu.swe.scim</groupId>
     <artifactId>scim-parent</artifactId>
-    <version>2.11</version>
+    <version>2.12</version>
   </parent>
 
   <artifactId>scim-compliance</artifactId>
diff --git a/scim-compliance/scim-compliance-client/pom.xml b/scim-compliance/scim-compliance-client/pom.xml
index 6228b7a..062be4d 100644
--- a/scim-compliance/scim-compliance-client/pom.xml
+++ b/scim-compliance/scim-compliance-client/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>edu.psu.swe.scim</groupId>
     <artifactId>scim-compliance</artifactId>
-    <version>2.11</version>
+    <version>2.12</version>
   </parent>
 
   <artifactId>scim-compliance-client</artifactId>
diff --git a/scim-compliance/scim-compliance-server/pom.xml b/scim-compliance/scim-compliance-server/pom.xml
index 0fdf570..689043e 100644
--- a/scim-compliance/scim-compliance-server/pom.xml
+++ b/scim-compliance/scim-compliance-server/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>edu.psu.swe.scim</groupId>
     <artifactId>scim-compliance</artifactId>
-    <version>2.11</version>
+    <version>2.12</version>
   </parent>
 
   <artifactId>scim-compliance-server</artifactId>
diff --git a/scim-errai/pom.xml b/scim-errai/pom.xml
index ba6b64e..484130a 100644
--- a/scim-errai/pom.xml
+++ b/scim-errai/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>edu.psu.swe.scim</groupId>
     <artifactId>scim-parent</artifactId>
-    <version>2.11</version>
+    <version>2.12</version>
   </parent>
 
   <artifactId>scim-errai</artifactId>
diff --git a/scim-server/pom.xml b/scim-server/pom.xml
index cde7009..f1b7815 100644
--- a/scim-server/pom.xml
+++ b/scim-server/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>edu.psu.swe.scim</groupId>
     <artifactId>scim-parent</artifactId>
-    <version>2.11</version>
+    <version>2.12</version>
   </parent>
 
   <artifactId>scim-server</artifactId>
diff --git a/scim-server/scim-server-common/pom.xml b/scim-server/scim-server-common/pom.xml
index 552b864..80f9213 100644
--- a/scim-server/scim-server-common/pom.xml
+++ b/scim-server/scim-server-common/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>edu.psu.swe.scim</groupId>
     <artifactId>scim-server</artifactId>
-    <version>2.11</version>
+    <version>2.12</version>
   </parent>
 
   <artifactId>scim-server-common</artifactId>
diff --git a/scim-server/scim-server-common/src/main/java/edu/psu/swe/scim/server/provider/UpdateRequest.java b/scim-server/scim-server-common/src/main/java/edu/psu/swe/scim/server/provider/UpdateRequest.java
index ba902dd..74086df 100644
--- a/scim-server/scim-server-common/src/main/java/edu/psu/swe/scim/server/provider/UpdateRequest.java
+++ b/scim-server/scim-server-common/src/main/java/edu/psu/swe/scim/server/provider/UpdateRequest.java
@@ -1,9 +1,11 @@
 package edu.psu.swe.scim.server.provider;
 
+import java.io.IOException;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -18,8 +20,13 @@
 import lombok.extern.slf4j.Slf4j;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.AnnotationIntrospector;
+import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectWriter;
+import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair;
+import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.BooleanNode;
 import com.fasterxml.jackson.databind.node.DoubleNode;
@@ -29,9 +36,10 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.fasterxml.jackson.databind.node.POJONode;
 import com.fasterxml.jackson.databind.node.TextNode;
+import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector;
+import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
 import com.flipkart.zjsonpatch.JsonDiff;
 
-import edu.psu.swe.scim.server.rest.ObjectMapperContextResolver;
 import edu.psu.swe.scim.server.schema.Registry;
 import edu.psu.swe.scim.spec.protocol.attribute.AttributeReference;
 import edu.psu.swe.scim.spec.protocol.data.PatchOperation;
@@ -53,7 +61,7 @@
 @EqualsAndHashCode
 @ToString
 public class UpdateRequest<T extends ScimResource> {
-
+  
   private static final String OPERATION = "op";
   private static final String PATH = "path";
   private static final String VALUE = "value";
@@ -70,6 +78,8 @@
 
   private Registry registry;
 
+  private Map<Attribute, Integer> addRemoveOffsetMap = new HashMap<>();
+  
   @Inject
   public UpdateRequest(Registry registry) {
     this.registry = registry;
@@ -197,7 +207,7 @@
         if (node instanceof ObjectNode) {
           ObjectNode on = (ObjectNode)node;
           for(String name : objectsToDelete) {
-            on.remove(name);
+            on.putNull(name);
           }
         }
       }
@@ -219,15 +229,37 @@
       sortMultiValuedCollections(entry.getValue(), extSchema);
     }
 
-    ObjectMapperContextResolver ctxResolver = new ObjectMapperContextResolver();
-    ObjectMapper objMapper = ctxResolver.getContext(null); // TODO is there a
-                                                           // better way?
+//    ObjectMapperContextResolver ctxResolver = new ObjectMapperContextResolver();
+//    ObjectMapper objMapper = ctxResolver.getContext(null); // TODO is there a
+//                                                           // better way?
 
+    ObjectMapper objMapper = new ObjectMapper();
+
+    JaxbAnnotationModule jaxbAnnotationModule = new JaxbAnnotationModule();
+    objMapper.registerModule(jaxbAnnotationModule);
+    objMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+
+    AnnotationIntrospector jaxbIntrospector = new JaxbAnnotationIntrospector(objMapper.getTypeFactory());
+    AnnotationIntrospector jacksonIntrospector = new JacksonAnnotationIntrospector();
+    AnnotationIntrospector pair = new AnnotationIntrospectorPair(jacksonIntrospector, jaxbIntrospector);
+    objMapper.setAnnotationIntrospector(pair);
+    
     JsonNode node1 = objMapper.valueToTree(original);
     nullEmptyLists(node1);
     JsonNode node2 = objMapper.valueToTree(resource);
     nullEmptyLists(node2);
     JsonNode differences = JsonDiff.asJson(node1, node2);
+    
+    
+    /*
+    Commenting out debug statement to prevent PII from appearing in log
+    ObjectWriter writer = objMapper.writerWithDefaultPrettyPrinter();
+    try {
+      log.debug("Original: "+writer.writeValueAsString(node1));
+      log.debug("Resource: "+writer.writeValueAsString(node2));
+    } catch (IOException e) {
+      
+    }*/
 
     try {
       log.info("Differences: " + objMapper.writerWithDefaultPrettyPrinter().writeValueAsString(differences));
@@ -286,7 +318,7 @@
     if (diffPath == null || diffPath.length() < 1) {
       return null;
     }
-
+    
     ParseData parseData = new ParseData(diffPath);
 
     if (parseData.pathParts.isEmpty()) {
@@ -321,7 +353,7 @@
       if (done) {
         throw new RuntimeException("Path should be done... Attribute not supported by the schema: " + pathPart);
       } else if (processingMultiValued) {
-        parseData.traverseObjectsInArray(pathPart);
+        parseData.traverseObjectsInArray(pathPart, patchOpType);
 
         if (parseData.isLastIndex(i) && patchOpType == PatchOperation.Type.ADD) {
           break;
@@ -331,9 +363,15 @@
           TypedAttribute typedAttribute = (TypedAttribute) parseData.originalObject;
           String type = typedAttribute.getType();
           valueFilterExpression = new AttributeComparisonExpression(new AttributeReference("type"), CompareOperator.EQ, type);
+        } else if (parseData.originalObject instanceof String || parseData.originalObject instanceof Number) {
+          String toString = parseData.originalObject.toString();
+          valueFilterExpression = new AttributeComparisonExpression(new AttributeReference("value"), CompareOperator.EQ, toString);
+        } else if(parseData.originalObject instanceof Enum) {
+          Enum<?> tempEnum = (Enum<?>)parseData.originalObject;
+          valueFilterExpression = new AttributeComparisonExpression(new AttributeReference("value"), CompareOperator.EQ, tempEnum.name());
         } else {
-          log.warn("Attribute: {} doesn't implement TypedAttribute, can't create ValueFilterExpression", parseData.originalObject.getClass());
-          valueFilterExpression = new AttributeComparisonExpression(new AttributeReference("type"), CompareOperator.EQ, "?");
+          log.info("Attribute: {} doesn't implement TypedAttribute, can't create ValueFilterExpression", parseData.originalObject.getClass());
+          valueFilterExpression = new AttributeComparisonExpression(new AttributeReference("value"), CompareOperator.EQ, "?");
         }
         processingMultiValued = false;
         processedMultiValued = true;
@@ -361,6 +399,16 @@
       }
       ++i;
     }
+    
+    if (patchOpType == Type.REPLACE && parseData.resourceObject == null) {
+      patchOpType = Type.REMOVE;
+      valueNode = null;
+    }
+    
+    if (patchOpType == Type.REPLACE && parseData.originalObject == null) {
+      patchOpType = Type.ADD;
+      //valueNode = null;
+    }
 
     PatchOperation operation = new PatchOperation();
     operation.setOperation(patchOpType);
@@ -423,6 +471,7 @@
     Object resourceObject;
     AttributeContainer ac;
     String pathUri;
+    int addRemoveOffset = 0;
 
     public ParseData(String diffPath) {
       String path = diffPath.substring(1);
@@ -454,11 +503,27 @@
       ac = attribute;
     }
 
-    public void traverseObjectsInArray(String pathPart) {
+    public void traverseObjectsInArray(String pathPart, Type patchOpType) {
       int index = Integer.parseInt(pathPart);
 
-      originalObject = lookupIndexInArray(originalObject, index);
-      resourceObject = lookupIndexInArray(resourceObject, index);
+      Attribute attr = (Attribute) ac;
+      
+      Integer addRemoveOffset = addRemoveOffsetMap.getOrDefault(attr, 0);
+      switch (patchOpType) {
+      case ADD:
+        addRemoveOffsetMap.put(attr, addRemoveOffset - 1);
+        break;
+      case REMOVE:
+        addRemoveOffsetMap.put(attr, addRemoveOffset + 1);
+        break;
+      case REPLACE:
+      default:
+        // Do Nothing
+        break;
+      }
+      
+      originalObject = lookupIndexInArray(originalObject, index + addRemoveOffset);
+      resourceObject = lookupIndexInArray(resourceObject, index + addRemoveOffset);
     }
 
     public boolean isLastIndex(int index) {
diff --git a/scim-server/scim-server-common/src/test/java/edu/psu/swe/scim/server/provider/UpdateRequestTest.java b/scim-server/scim-server-common/src/test/java/edu/psu/swe/scim/server/provider/UpdateRequestTest.java
index 02c0420..8d61843 100644
--- a/scim-server/scim-server-common/src/test/java/edu/psu/swe/scim/server/provider/UpdateRequestTest.java
+++ b/scim-server/scim-server-common/src/test/java/edu/psu/swe/scim/server/provider/UpdateRequestTest.java
@@ -48,6 +48,8 @@
   
   private static final String FIRST = "first";
   private static final String SECOND = "second";
+  private static final String THIRD = "third";
+  private static final String FOURTH = "fourth";
 
   @Rule
   public MockitoRule mockito = MockitoJUnit.rule();
@@ -448,6 +450,183 @@
     Assert.assertNull(operation.getValue());
   }
   
+  @Test
+  @Ignore
+  //TODO: do asserts
+  public void testNonTypedAttributeListGetUseablePath() throws Exception {
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>(registry);
+
+    ScimUser user1 = createUser1();
+    ScimUser user2 = copy(user1);
+    
+    ExampleObjectExtension ext1 = new ExampleObjectExtension();
+    ext1.setList(Stream.of(FIRST,SECOND,THIRD).collect(Collectors.toList()));
+    user1.addExtension(ext1);
+    
+    ExampleObjectExtension ext2 = new ExampleObjectExtension();
+    ext2.setList(Stream.of(FIRST,SECOND,FOURTH).collect(Collectors.toList()));
+    user2.addExtension(ext2);
+    
+    updateRequest.initWithResource("1234", user1, user2);
+    List<PatchOperation> operations = updateRequest.getPatchOperations();
+    System.out.println("Number of operations: "+operations.size());
+    operations.stream().forEach(op -> System.out.println(op));
+    
+    //TODO: perform assert that proper add and remove paths are correct
+  }
+  
+  @Test
+  @Ignore
+  //TODO: do asserts
+  public void testMoveFormatNameToNicknamePart1() throws Exception {
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>(registry);
+
+    ScimUser user1 = createUser1();
+    ScimUser user2 = copy(user1);
+    
+    String nickname = "John Xander Anyman";
+    user1.setNickName(nickname);
+    
+    user2.getName().setFormatted(nickname);
+    
+    updateRequest.initWithResource("1234", user1, user2);
+    List<PatchOperation> operations = updateRequest.getPatchOperations();
+    System.out.println("Number of operations: "+operations.size());
+    operations.stream().forEach(op -> System.out.println(op));
+  }
+  
+  @Test
+  @Ignore
+  //TODO: do asserts
+  public void testMoveFormatNameToNicknamePart2() throws Exception {
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>(registry);
+
+    ScimUser user1 = createUser1();
+    ScimUser user2 = copy(user1);
+    
+    String nickname = "John Xander Anyman";
+    user1.setNickName(nickname);
+    user2.setNickName("");
+    
+    user2.getName().setFormatted(nickname);
+    user1.getName().setFormatted("");
+    
+    updateRequest.initWithResource("1234", user1, user2);
+    List<PatchOperation> operations = updateRequest.getPatchOperations();
+    System.out.println("Number of operations: "+operations.size());
+    operations.stream().forEach(op -> System.out.println(op));
+  }
+  
+  @Test
+  @Ignore
+  //TODO: do asserts
+  public void testMoveFormatNameToNicknamePart3() throws Exception {
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>(registry);
+
+    ScimUser user1 = createUser1();
+    ScimUser user2 = copy(user1);
+    
+    String nickname = "John Xander Anyman";
+    user1.setNickName(nickname);
+    user2.setNickName(null);
+    
+    user2.getName().setFormatted(nickname);
+    user1.getName().setFormatted("");
+    
+    updateRequest.initWithResource("1234", user1, user2);
+    List<PatchOperation> operations = updateRequest.getPatchOperations();
+    System.out.println("Number of operations: "+operations.size());
+    operations.stream().forEach(op -> System.out.println(op));
+  }
+  
+  @Test
+  @Ignore
+  //TODO: do asserts
+  public void testMoveFormatNameToNicknamePart4() throws Exception {
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>(registry);
+
+    ScimUser user1 = createUser1();
+    ScimUser user2 = copy(user1);
+    
+    String nickname = "John Xander Anyman";
+    user1.setNickName(nickname);
+    user2.setNickName("");
+    
+    user2.getName().setFormatted(nickname);
+    user1.getName().setFormatted(null);
+    
+    updateRequest.initWithResource("1234", user1, user2);
+    List<PatchOperation> operations = updateRequest.getPatchOperations();
+    System.out.println("Number of operations: "+operations.size());
+    operations.stream().forEach(op -> System.out.println(op));
+  }
+  
+  @Test
+  @Ignore
+  //TODO: do asserts
+  public void testMoveFormatNameToNicknamePart5() throws Exception {
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>(registry);
+
+    ScimUser user1 = createUser1();
+    ScimUser user2 = copy(user1);
+    
+    String nickname = "John Xander Anyman";
+    user1.setNickName("");
+    user2.setNickName(nickname);
+    
+    user2.getName().setFormatted(null);
+    user1.getName().setFormatted(nickname);
+    
+    updateRequest.initWithResource("1234", user1, user2);
+    List<PatchOperation> operations = updateRequest.getPatchOperations();
+    System.out.println("Number of operations: "+operations.size());
+    operations.stream().forEach(op -> System.out.println(op));
+  }
+  
+  @Test
+  //TODO: do parameterized test
+  public void offsetTest1() throws Exception {
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>(registry);
+
+    ScimUser user1 = createUser1();
+    ScimUser user2 = copy(user1);
+    
+    ExampleObjectExtension ext1 = new ExampleObjectExtension();
+    ext1.setList(Stream.of("D","M","Y","Z","Z","Z","Z","Z").collect(Collectors.toList()));
+    user1.addExtension(ext1);
+    
+    ExampleObjectExtension ext2 = new ExampleObjectExtension();
+    //ext2.setList(Stream.of("A","A","B","B","D","F","N","Q","Z").collect(Collectors.toList()));
+    ext2.setList(Stream.of("A","Z").collect(Collectors.toList()));
+    user2.addExtension(ext2);
+    
+    updateRequest.initWithResource("1234", user1, user2);
+    List<PatchOperation> operations = updateRequest.getPatchOperations();
+    System.out.println("Number of operations: "+operations.size());
+    operations.stream().forEach(op -> System.out.println(op));
+    
+  }
+  
+  @Test
+  public void testMoveFormatNameToNicknamePart6() throws Exception {
+    UpdateRequest<ScimUser> updateRequest = new UpdateRequest<>(registry);
+
+    ScimUser user1 = createUser1();
+    ScimUser user2 = copy(user1);
+    
+    String nickname = "John Xander Anyman";
+    user1.setNickName(null);
+    user2.setNickName(nickname);
+    
+    user2.getName().setFormatted("");
+    user1.getName().setFormatted(nickname);
+    
+    updateRequest.initWithResource("1234", user1, user2);
+    List<PatchOperation> operations = updateRequest.getPatchOperations();
+    System.out.println("Number of operations: "+operations.size());
+    operations.stream().forEach(op -> System.out.println(op));
+  }
+  
   /**
    * This is used to test an error condition. In this scenario a user has multiple phone numbers where home is marked primary and work is not. A SCIM update
    * is performed in which the new user only contains a work phone number where the type is null. When this happens it should only only be a single DELETE 
@@ -464,20 +643,16 @@
 //    ScimUser user1 = createUser1();
 //    ScimUser user2 = copy(user1);
 //    user2.getPhoneNumbers().removeIf(p -> p.getType().equals("home"));
+//    
 //    PhoneNumber workNumber = user2.getPhoneNumbers().stream().filter(p -> p.getType().equals("work")).findFirst().orElse(null);
+//    workNumber.setType("home");
 //    Assert.assertNotNull(workNumber);
-//    workNumber.setPrimary(null);
-//    workNumber.setPhoneContext(null);
-//    workNumber.setNumber(null);
-//    workNumber.setExtension(null);
 //    
 //    updateRequest.initWithResource("1234", user1, user2);
 //    List<PatchOperation> operations = updateRequest.getPatchOperations();
 //    Assert.assertNotNull(operations);
 //    Assert.assertEquals(expectedNumberOfOperationsWithBug, operations.size());
 //    Assert.assertNotEquals(expectedNumberOfOperationsWithoutBug, operations.size());
-//    
-//    
   }
 
   private PatchOperation assertSingleResult(List<PatchOperation> result) {
diff --git a/scim-server/scim-server-common/src/test/java/edu/psu/swe/scim/server/utility/ExampleObjectExtension.java b/scim-server/scim-server-common/src/test/java/edu/psu/swe/scim/server/utility/ExampleObjectExtension.java
index 8319564..34a452d 100644
--- a/scim-server/scim-server-common/src/test/java/edu/psu/swe/scim/server/utility/ExampleObjectExtension.java
+++ b/scim-server/scim-server-common/src/test/java/edu/psu/swe/scim/server/utility/ExampleObjectExtension.java
@@ -68,6 +68,10 @@
   
   @ScimAttribute
   @XmlElement
+  private List<Order> enumList;
+  
+  @ScimAttribute
+  @XmlElement
   private Subobject subobject;
 
   @Override
diff --git a/scim-server/scim-server-common/src/test/java/edu/psu/swe/scim/server/utility/Order.java b/scim-server/scim-server-common/src/test/java/edu/psu/swe/scim/server/utility/Order.java
new file mode 100644
index 0000000..92bc50e
--- /dev/null
+++ b/scim-server/scim-server-common/src/test/java/edu/psu/swe/scim/server/utility/Order.java
@@ -0,0 +1,25 @@
+package edu.psu.swe.scim.server.utility;
+
+public enum Order {
+  
+  FIRST("first"),
+  SECOND("second"),
+  THIRD("third"),
+  FOURTH("fourth");
+  
+  Order(String value) {
+    this.value = value;
+  }
+  
+  private final String value;
+  
+  public String getValue() {
+    return value;
+  }
+  
+  @Override
+  public String toString() {
+    return value;
+  }
+
+}
diff --git a/scim-server/scim-server-example/pom.xml b/scim-server/scim-server-example/pom.xml
index 7c5dd53..f8984ed 100644
--- a/scim-server/scim-server-example/pom.xml
+++ b/scim-server/scim-server-example/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>edu.psu.swe.scim</groupId>
     <artifactId>scim-server</artifactId>
-    <version>2.11</version>
+    <version>2.12</version>
   </parent>
 
   <artifactId>scim-server-examples</artifactId>
diff --git a/scim-server/scim-server-example/scim-server-couchdb/pom.xml b/scim-server/scim-server-example/scim-server-couchdb/pom.xml
index f422905..4664c4c 100644
--- a/scim-server/scim-server-example/scim-server-couchdb/pom.xml
+++ b/scim-server/scim-server-example/scim-server-couchdb/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>edu.psu.swe.scim</groupId>
     <artifactId>scim-server-examples</artifactId>
-    <version>2.11</version>
+    <version>2.12</version>
   </parent>
 
   <artifactId>scim-server-couchdb</artifactId>
diff --git a/scim-server/scim-server-example/scim-server-memory/pom.xml b/scim-server/scim-server-example/scim-server-memory/pom.xml
index bda8c2a..12af38f 100644
--- a/scim-server/scim-server-example/scim-server-memory/pom.xml
+++ b/scim-server/scim-server-example/scim-server-memory/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>edu.psu.swe.scim</groupId>
     <artifactId>scim-server-examples</artifactId>
-    <version>2.11</version>
+    <version>2.12</version>
   </parent>
 
   <artifactId>scim-server-memory</artifactId>
diff --git a/scim-server/scim-server-example/scim-server-rdbms/pom.xml b/scim-server/scim-server-example/scim-server-rdbms/pom.xml
index 0d7e2ec..7f7b5ad 100644
--- a/scim-server/scim-server-example/scim-server-rdbms/pom.xml
+++ b/scim-server/scim-server-example/scim-server-rdbms/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>edu.psu.swe.scim</groupId>
     <artifactId>scim-server-examples</artifactId>
-    <version>2.11</version>
+    <version>2.12</version>
   </parent>
 
   <artifactId>scim-server-rdbms</artifactId>
diff --git a/scim-spec/pom.xml b/scim-spec/pom.xml
index 6222638..fea3f6d 100644
--- a/scim-spec/pom.xml
+++ b/scim-spec/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>edu.psu.swe.scim</groupId>
     <artifactId>scim-parent</artifactId>
-    <version>2.11</version>
+    <version>2.12</version>
   </parent>
 
   <artifactId>scim-spec</artifactId>
diff --git a/scim-spec/scim-spec-protocol/pom.xml b/scim-spec/scim-spec-protocol/pom.xml
index 152967d..57680f6 100644
--- a/scim-spec/scim-spec-protocol/pom.xml
+++ b/scim-spec/scim-spec-protocol/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>edu.psu.swe.scim</groupId>
     <artifactId>scim-spec</artifactId>
-    <version>2.11</version>
+    <version>2.12</version>
   </parent>
 
   <artifactId>scim-spec-protocol</artifactId>
diff --git a/scim-spec/scim-spec-schema/pom.xml b/scim-spec/scim-spec-schema/pom.xml
index c60f79a..8bf9273 100644
--- a/scim-spec/scim-spec-schema/pom.xml
+++ b/scim-spec/scim-spec-schema/pom.xml
@@ -4,7 +4,7 @@
 	<parent>
 		<groupId>edu.psu.swe.scim</groupId>
 		<artifactId>scim-spec</artifactId>
-		<version>2.11</version>
+		<version>2.12</version>
 	</parent>
 
 	<artifactId>scim-spec-schema</artifactId>
diff --git a/scim-tools/pom.xml b/scim-tools/pom.xml
index b6a6266..0226036 100644
--- a/scim-tools/pom.xml
+++ b/scim-tools/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>edu.psu.swe.scim</groupId>
     <artifactId>scim-parent</artifactId>
-    <version>2.11</version>
+    <version>2.12</version>
   </parent>
 
   <artifactId>scim-tools</artifactId>
diff --git a/scim-tools/scim-tools-cli/pom.xml b/scim-tools/scim-tools-cli/pom.xml
index 33ac5d4..4721d41 100644
--- a/scim-tools/scim-tools-cli/pom.xml
+++ b/scim-tools/scim-tools-cli/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>edu.psu.swe.scim</groupId>
     <artifactId>scim-tools</artifactId>
-    <version>2.11</version>
+    <version>2.12</version>
   </parent>
 
   <artifactId>scim-tools-cli</artifactId>
diff --git a/scim-tools/scim-tools-common/pom.xml b/scim-tools/scim-tools-common/pom.xml
index dd39348..0eda31a 100644
--- a/scim-tools/scim-tools-common/pom.xml
+++ b/scim-tools/scim-tools-common/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>edu.psu.swe.scim</groupId>
     <artifactId>scim-tools</artifactId>
-    <version>2.11</version>
+    <version>2.12</version>
   </parent>
 
   <artifactId>scim-tools-common</artifactId>
diff --git a/scim-tools/scim-tools-studio/pom.xml b/scim-tools/scim-tools-studio/pom.xml
index 200c1e9..419bd16 100644
--- a/scim-tools/scim-tools-studio/pom.xml
+++ b/scim-tools/scim-tools-studio/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>edu.psu.swe.scim</groupId>
     <artifactId>scim-tools</artifactId>
-    <version>2.11</version>
+    <version>2.12</version>
   </parent>
 
   <artifactId>scim-tools-studio</artifactId>