Merge branch 'release/2.18'
diff --git a/pom.xml b/pom.xml
index 84b9ec2..7fa95d4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
 
   <groupId>edu.psu.swe.scim</groupId>
   <artifactId>scim-parent</artifactId>
-  <version>2.17</version>
+  <version>2.18</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 7338e5e..62c2ac4 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.17</version>
+    <version>2.18</version>
   </parent>
   <artifactId>scim-client</artifactId>
   <name>SCIM - Client</name>
diff --git a/scim-common/pom.xml b/scim-common/pom.xml
index 601743b..9101d31 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.17</version>
+    <version>2.18</version>
   </parent>
 
   <artifactId>scim-common</artifactId>
@@ -14,12 +14,12 @@
     <dependency>
       <groupId>edu.psu.swe.scim</groupId>
       <artifactId>scim-spec-protocol</artifactId>
-      <version>2.17</version>
+      <version>2.18</version>
     </dependency>
     <dependency>
       <groupId>edu.psu.swe.scim</groupId>
       <artifactId>scim-spec-schema</artifactId>
-      <version>2.17</version>
+      <version>2.18</version>
     </dependency>
   </dependencies>
 
diff --git a/scim-compliance/pom.xml b/scim-compliance/pom.xml
index 03d519f..a86471e 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.17</version>
+    <version>2.18</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 3202199..eb7aff6 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.17</version>
+    <version>2.18</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 df0a030..098fc33 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.17</version>
+    <version>2.18</version>
   </parent>
 
   <artifactId>scim-compliance-server</artifactId>
diff --git a/scim-errai/pom.xml b/scim-errai/pom.xml
index 46226e1..9c1bf4a 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.17</version>
+    <version>2.18</version>
   </parent>
 
   <artifactId>scim-errai</artifactId>
diff --git a/scim-server/pom.xml b/scim-server/pom.xml
index 7b39058..fa56bf8 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.17</version>
+    <version>2.18</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 c4e4d94..6c8c03b 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.17</version>
+    <version>2.18</version>
   </parent>
 
   <artifactId>scim-server-common</artifactId>
diff --git a/scim-server/scim-server-common/src/main/java/edu/psu/swe/scim/server/exception/UnableToResolveIdException.java b/scim-server/scim-server-common/src/main/java/edu/psu/swe/scim/server/exception/UnableToResolveIdException.java
new file mode 100644
index 0000000..ebc94f4
--- /dev/null
+++ b/scim-server/scim-server-common/src/main/java/edu/psu/swe/scim/server/exception/UnableToResolveIdException.java
@@ -0,0 +1,28 @@
+package edu.psu.swe.scim.server.exception;
+
+import javax.ws.rs.core.Response.Status;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper=true)
+public class UnableToResolveIdException extends Exception {
+
+  private static final long serialVersionUID = -7401709416973728017L;
+
+  private Status status;
+  
+  public UnableToResolveIdException(Status status, String what) {
+    super(what);
+    
+    this.status = status;
+  }
+  
+  public UnableToResolveIdException(Status status, String what, Throwable why) {
+    super(what, why);
+    
+    this.status = status;
+  }
+
+}
diff --git a/scim-server/scim-server-common/src/main/java/edu/psu/swe/scim/server/provider/SelfIdResolver.java b/scim-server/scim-server-common/src/main/java/edu/psu/swe/scim/server/provider/SelfIdResolver.java
index 8e2f488..e991de1 100644
--- a/scim-server/scim-server-common/src/main/java/edu/psu/swe/scim/server/provider/SelfIdResolver.java
+++ b/scim-server/scim-server-common/src/main/java/edu/psu/swe/scim/server/provider/SelfIdResolver.java
@@ -2,6 +2,8 @@
 
 import java.security.Principal;
 
+import edu.psu.swe.scim.server.exception.UnableToResolveIdException;
+
 public interface SelfIdResolver {
 
   String resolveToInternalId(Principal principal) throws UnableToResolveIdException;
diff --git a/scim-server/scim-server-common/src/main/java/edu/psu/swe/scim/server/provider/UnableToResolveIdException.java b/scim-server/scim-server-common/src/main/java/edu/psu/swe/scim/server/provider/UnableToResolveIdException.java
deleted file mode 100644
index 1b83309..0000000
--- a/scim-server/scim-server-common/src/main/java/edu/psu/swe/scim/server/provider/UnableToResolveIdException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package edu.psu.swe.scim.server.provider;
-
-public class UnableToResolveIdException extends Exception {
-
-  private static final long serialVersionUID = -7401709416973728017L;
-
-  public UnableToResolveIdException() {
-  }
-
-  public UnableToResolveIdException(String message) {
-    super(message);
-  }
-
-  public UnableToResolveIdException(Throwable cause) {
-    super(cause);
-  }
-
-  public UnableToResolveIdException(String message, Throwable cause) {
-    super(message, cause);
-  }
-
-  public UnableToResolveIdException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
-    super(message, cause, enableSuppression, writableStackTrace);
-  }
-
-}
diff --git a/scim-server/scim-server-common/src/main/java/edu/psu/swe/scim/server/rest/SelfResourceImpl.java b/scim-server/scim-server-common/src/main/java/edu/psu/swe/scim/server/rest/SelfResourceImpl.java
index 93de10d..66c0715 100644
--- a/scim-server/scim-server-common/src/main/java/edu/psu/swe/scim/server/rest/SelfResourceImpl.java
+++ b/scim-server/scim-server-common/src/main/java/edu/psu/swe/scim/server/rest/SelfResourceImpl.java
@@ -9,9 +9,9 @@
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
+import edu.psu.swe.scim.server.exception.UnableToResolveIdException;
 import edu.psu.swe.scim.server.provider.ProviderRegistry;
 import edu.psu.swe.scim.server.provider.SelfIdResolver;
-import edu.psu.swe.scim.server.provider.UnableToResolveIdException;
 import edu.psu.swe.scim.spec.protocol.SelfResource;
 import edu.psu.swe.scim.spec.protocol.UserResource;
 import edu.psu.swe.scim.spec.protocol.attribute.AttributeReferenceListWrapper;
@@ -42,7 +42,9 @@
     try {
       String internalId = getInternalId();
       return userResource.getById(internalId, attributes, excludedAttributes);
-    } catch (UnableToResolveIdException | ScimException e) {
+    } catch (UnableToResolveIdException e) {
+      return createErrorResponse(e);
+    } catch (ScimException e) {
       return createErrorResponse(e);
     }
   }
@@ -60,7 +62,9 @@
     try {
       String internalId = getInternalId();
       return userResource.update(resource, internalId, attributes, excludedAttributes);
-    } catch (UnableToResolveIdException | ScimException e) {
+    } catch (UnableToResolveIdException e) {
+      return createErrorResponse(e);
+    } catch (ScimException e) {
       return createErrorResponse(e);
     }
   }
@@ -70,7 +74,9 @@
     try {
       String internalId = getInternalId();
       return userResource.patch(patchRequest, internalId, attributes, excludedAttributes);
-    } catch (UnableToResolveIdException | ScimException e) {
+    } catch (UnableToResolveIdException e) {
+      return createErrorResponse(e);
+    } catch (ScimException e) {
       return createErrorResponse(e);
     }
   }
@@ -80,13 +86,21 @@
     try {
       String internalId = getInternalId();
       return userResource.delete(internalId);
-    } catch (UnableToResolveIdException | ScimException e) {
+    } catch (UnableToResolveIdException e) {
+      return createErrorResponse(e);
+    } catch (ScimException e) {
       return createErrorResponse(e);
     }
   }
 
-  private Response createErrorResponse(Exception e) {
-    ErrorResponse er = new ErrorResponse(Status.BAD_REQUEST, "Error");
+  private Response createErrorResponse(ScimException e) {
+    ErrorResponse er = new ErrorResponse(e.getStatus(), "Error");
+    er.addErrorMessage(e.getMessage());
+    return er.toResponse();
+  }
+
+  private Response createErrorResponse(UnableToResolveIdException e) {
+    ErrorResponse er = new ErrorResponse(e.getStatus(), "Error");
     er.addErrorMessage(e.getMessage());
     return er.toResponse();
   }
@@ -97,7 +111,7 @@
     if (callerPrincipal != null) {
       log.info("Resolved SelfResource principal to : {}", callerPrincipal.getName());
     } else {
-      throw new UnableToResolveIdException("Caller Principal was null");
+      throw new UnableToResolveIdException(Status.UNAUTHORIZED, "Unauthorized");
     }
 
     String internalId = selfIdResolver.resolveToInternalId(callerPrincipal);
diff --git a/scim-server/scim-server-example/pom.xml b/scim-server/scim-server-example/pom.xml
index 4068e9e..557c84d 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.17</version>
+    <version>2.18</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 7101376..2bd4f1d 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.17</version>
+    <version>2.18</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 ab330c8..e72f745 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.17</version>
+    <version>2.18</version>
   </parent>
 
   <artifactId>scim-server-memory</artifactId>
diff --git a/scim-server/scim-server-example/scim-server-memory/src/main/java/edu/psu/swe/scim/memory/service/InMemorySelfResolverImpl.java b/scim-server/scim-server-example/scim-server-memory/src/main/java/edu/psu/swe/scim/memory/service/InMemorySelfResolverImpl.java
index 0b68f13..079486c 100644
--- a/scim-server/scim-server-example/scim-server-memory/src/main/java/edu/psu/swe/scim/memory/service/InMemorySelfResolverImpl.java
+++ b/scim-server/scim-server-example/scim-server-memory/src/main/java/edu/psu/swe/scim/memory/service/InMemorySelfResolverImpl.java
@@ -3,16 +3,17 @@
 import java.security.Principal;
 
 import javax.ejb.Stateless;
+import javax.ws.rs.core.Response.Status;
 
+import edu.psu.swe.scim.server.exception.UnableToResolveIdException;
 import edu.psu.swe.scim.server.provider.SelfIdResolver;
-import edu.psu.swe.scim.server.provider.UnableToResolveIdException;
 
 @Stateless
 public class InMemorySelfResolverImpl implements SelfIdResolver {
 
   @Override
   public String resolveToInternalId(Principal principal) throws UnableToResolveIdException {
-    throw new UnableToResolveIdException("Caller Principal not available");
+    throw new UnableToResolveIdException(Status.NOT_IMPLEMENTED, "Caller Principal not available");
   }
 
 }
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 7e0eb19..232ce3c 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.17</version>
+    <version>2.18</version>
   </parent>
 
   <artifactId>scim-server-rdbms</artifactId>
diff --git a/scim-spec/pom.xml b/scim-spec/pom.xml
index b11217c..38ff75f 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.17</version>
+    <version>2.18</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 a13af73..bd63cf9 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.17</version>
+    <version>2.18</version>
   </parent>
 
   <artifactId>scim-spec-protocol</artifactId>
diff --git a/scim-spec/scim-spec-protocol/src/main/java/edu/psu/swe/scim/spec/protocol/attribute/AttributeReferenceListWrapper.java b/scim-spec/scim-spec-protocol/src/main/java/edu/psu/swe/scim/spec/protocol/attribute/AttributeReferenceListWrapper.java
index c290fa9..221d83b 100644
--- a/scim-spec/scim-spec-protocol/src/main/java/edu/psu/swe/scim/spec/protocol/attribute/AttributeReferenceListWrapper.java
+++ b/scim-spec/scim-spec-protocol/src/main/java/edu/psu/swe/scim/spec/protocol/attribute/AttributeReferenceListWrapper.java
@@ -27,4 +27,10 @@
       attributeReferences.add(attributeReference);
     }
   }
+  
+  public static AttributeReferenceListWrapper of(Set<AttributeReference> attributeReferences) {
+    AttributeReferenceListWrapper wrapper = new AttributeReferenceListWrapper("");
+    wrapper.attributeReferences = attributeReferences;
+    return wrapper;
+  }
 }
diff --git a/scim-spec/scim-spec-schema/pom.xml b/scim-spec/scim-spec-schema/pom.xml
index c404447..4b05b77 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.17</version>
+		<version>2.18</version>
 	</parent>
 
 	<artifactId>scim-spec-schema</artifactId>
diff --git a/scim-spec/scim-spec-schema/src/main/java/edu/psu/swe/scim/spec/resources/ScimUser.java b/scim-spec/scim-spec-schema/src/main/java/edu/psu/swe/scim/spec/resources/ScimUser.java
index 702b204..2b4e275 100644
--- a/scim-spec/scim-spec-schema/src/main/java/edu/psu/swe/scim/spec/resources/ScimUser.java
+++ b/scim-spec/scim-spec-schema/src/main/java/edu/psu/swe/scim/spec/resources/ScimUser.java
@@ -17,8 +17,10 @@
 import edu.psu.swe.scim.spec.schema.Schema.Attribute.Uniqueness;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.ToString;
 
 @Data
+@ToString(callSuper = true)
 @EqualsAndHashCode(callSuper = true)
 @ScimResourceType(id = ScimUser.RESOURCE_NAME, name = ScimUser.RESOURCE_NAME, schema = ScimUser.SCHEMA_URI, description = "Top level ScimUser", endpoint = "/Users")
 @XmlRootElement(name = ScimUser.RESOURCE_NAME)
@@ -123,20 +125,32 @@
   }
   
   public Optional<Address> getPrimaryAddress() {
+    if (addresses == null) {
+      return Optional.empty();
+    }
+    
     return addresses.stream()
-                    .filter(a -> a.primary)
+                    .filter(Address::getPrimary)
                     .findFirst();
   }
   
   public Optional<Email> getPrimaryEmailAddress() {
+    if (emails == null) {
+      return Optional.empty();
+    }
+    
     return emails.stream()
-                 .filter(e -> e.getPrimary())
+                 .filter(Email::getPrimary)
                  .findFirst();
   }
   
   public Optional<PhoneNumber> getPrimaryPhoneNumber() {
+    if (phoneNumbers == null) {
+      return Optional.empty();
+    }
+    
     return phoneNumbers.stream()
-                       .filter(p -> p.getPrimary())
+                       .filter(PhoneNumber::getPrimary)
                        .findFirst();
   }
 }
diff --git a/scim-tools/pom.xml b/scim-tools/pom.xml
index c7ffbce..a594216 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.17</version>
+    <version>2.18</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 03568e5..3e9ed90 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.17</version>
+    <version>2.18</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 06d6aad..44248aa 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.17</version>
+    <version>2.18</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 3aff30d..6f1dc5b 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.17</version>
+    <version>2.18</version>
   </parent>
 
   <artifactId>scim-tools-studio</artifactId>