diff --git a/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/schema/Mapper.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/schema/Mapper.java
index 7ab2afb..90f0f86 100644
--- a/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/schema/Mapper.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/schema/Mapper.java
@@ -22,12 +22,9 @@
  */
 package org.apache.directory.scim.spec.schema;
 
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.SimpleTimeZone;
-import java.util.TimeZone;
-import java.util.regex.Pattern;
+import java.time.Instant;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAccessor;
 
 /**
  * The Mapper provides methods to bi-directionally transform SCIM attribute
@@ -50,88 +47,23 @@
  */
 public class Mapper {
 
-  // Pattern for ISO 8601 DateTime - see: https://en.wikipedia.org/wiki/ISO_8601
-  static final String ISO8601_PATTERN = "^([0-9]{4})-([0-9]{2})-([0-9]{2})[Tt]([0-9]{2}):([0-9]{2}):([0-9]{2})([Zz]|([+-]{1}[0-9]{2}:[0-9]{2}))";
-
-  // Date time component indexes
-  static final int DATE_COMPONENT_INDEX_YEAR = 1;
-  static final int DATE_COMPONENT_INDEX_MONTH = 2;
-  static final int DATE_COMPONENT_INDEX_DAY = 3;
-  static final int TIME_COMPONENT_INDEX_HOUR = 4;
-  static final int TIME_COMPONENT_INDEX_MINUTE = 5;
-  static final int TIME_COMPONENT_INDEX_SECOND = 6;
-  static final int TIMEZONE_COMPONENT_INDEX = 7;
-
-  // Format string to create an ISO 8601 date string from a Java date object
-  static final String ISO8601_DATETIME_FORMATTER = "yyyy-MM-dd'T'HH:mm:ssXXX";
-
-  SimpleDateFormat iso8601DateFormat;
-  Pattern iso8601Pattern;
+  DateTimeFormatter iso8601DateTimeFormatter = DateTimeFormatter.ISO_DATE_TIME;
 
   public Mapper() {
-    iso8601DateFormat = new SimpleDateFormat(ISO8601_DATETIME_FORMATTER);
-    iso8601Pattern = Pattern.compile(ISO8601_PATTERN);
   }
 
-  public String convertDateTime(Date date) {
-    return iso8601DateFormat.format(date);
+  public String convertDateTime(Instant instant) {
+    return iso8601DateTimeFormatter.format(instant);
   }
 
   /**
    * Converts an ISO 8601 DateTime string into the equivalent Java Date object.
-   * 
-   * @param date the ISO 8601 DateTime to be converted.
-   * @return the equivalent Java Date object.
-   * @throws ParseException 
+   *
+   * @param isodate the ISO 8601 DateTime to be converted.
+   * @return the equivalent Java Instant object.
    */
-  public Date convertDateTime(String isodate) throws ParseException {
-//    Calendar calendar = null;
-//    Matcher matcher = iso8601Pattern.matcher(date);
-//    if (matcher.matches()) {
-//      TimeZone timeZone = convertTimeZone(matcher.group(TIMEZONE_COMPONENT_INDEX));
-//      calendar = new GregorianCalendar(timeZone);
-//      calendar.set(
-//          Integer.parseInt(matcher.group(DATE_COMPONENT_INDEX_YEAR)),
-//          Integer.parseInt(matcher.group(DATE_COMPONENT_INDEX_MONTH)),
-//          Integer.parseInt(matcher.group(DATE_COMPONENT_INDEX_DAY)),
-//          Integer.parseInt(matcher.group(TIME_COMPONENT_INDEX_HOUR)),
-//          Integer.parseInt(matcher.group(TIME_COMPONENT_INDEX_MINUTE)),
-//          Integer.parseInt(matcher.group(TIME_COMPONENT_INDEX_SECOND))
-//          );
-//    } else {
-//      // TODO - This is an error
-//    }
-//    return calendar.getTime();
-    Date date = iso8601DateFormat.parse(isodate);
-    return date;
+  public Instant convertDateTime(String isodate) {
+    TemporalAccessor temporal = iso8601DateTimeFormatter.parse(isodate);
+    return Instant.from(temporal);
   }
-
-  /**
-   * Converts the timeZone portion of an ISO 8601 date into a Java TimeZone
-   * object.
-   * 
-   * @param timeZone the ISO 8601 representation of the time zone.
-   * @return the equivalent Java TimeZone object.
-   */
-  TimeZone convertTimeZone(String timeZone) {
-    String[] timeZoneTokens = timeZone.split(":");
-    int hours = 0;
-    int minutes = 0;
-
-    if (!timeZone.startsWith("Z") && !timeZone.startsWith("z")) {
-      if (timeZoneTokens.length > 0) {
-        hours = Integer.parseInt(timeZoneTokens[0]);
-      }
-      if (timeZoneTokens.length > 1) {
-        minutes = Integer.parseInt(timeZoneTokens[1]);
-        if (timeZone.startsWith("-")) {
-          minutes = minutes * -1;
-        }
-      }
-    }
-    
-    int timeZoneOffsetMilliSeconds = ((hours * 60) + minutes) * 1000;
-    return new SimpleTimeZone(timeZoneOffsetMilliSeconds, "");
-  }
-
 }
diff --git a/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/schema/MapperTest.java b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/schema/MapperTest.java
new file mode 100644
index 0000000..d307743
--- /dev/null
+++ b/scim-spec/scim-spec-schema/src/test/java/org/apache/directory/scim/spec/schema/MapperTest.java
@@ -0,0 +1,77 @@
+/*
+* 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.spec.schema;
+
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+
+import java.text.ParseException;
+import java.time.Instant;
+import java.util.*;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+
+public class MapperTest {
+
+  static final String[] ISO_DATETIME_EXAMPLES = {
+      "2015-04-26T01:37:17+00:00",
+      "2015-04-26T01:37:17Z"
+  };
+
+  static String[] getIsoDateTimeExamples() {
+    return ISO_DATETIME_EXAMPLES;
+  }
+
+  @ParameterizedTest
+  @MethodSource("getIsoDateTimeExamples")
+  public void testConvertDateTimeFromString(String isoDateTime) throws ParseException {
+    Mapper mapper = new Mapper();
+    Instant instant = mapper.convertDateTime(isoDateTime);
+    TimeZone timeZone = new SimpleTimeZone(0, "GMT");
+    GregorianCalendar calendar = new GregorianCalendar(timeZone);
+    calendar.setTime(Date.from(instant));
+    assertEquals(2015, calendar.get(Calendar.YEAR));
+    assertEquals(3, calendar.get(Calendar.MONTH));
+    assertEquals(26, calendar.get(Calendar.DATE));
+    assertEquals(1, calendar.get(Calendar.HOUR_OF_DAY));
+    assertEquals(37, calendar.get(Calendar.MINUTE));
+    assertEquals(17, calendar.get(Calendar.SECOND));
+  }
+  
+  @Test
+  @Disabled
+  public void convertDateTimeFromDate() {
+    Mapper mapper = new Mapper();
+    TimeZone timeZone = new SimpleTimeZone(0, "GMT");
+    GregorianCalendar calendar = new GregorianCalendar(timeZone);
+    calendar.set(Calendar.YEAR, 2015);
+    calendar.set(Calendar.MONTH, 03);
+    calendar.set(Calendar.DATE, 26);
+    calendar.set(Calendar.HOUR_OF_DAY, 1);
+    calendar.set(Calendar.MINUTE, 37);
+    calendar.set(Calendar.SECOND, 17);
+    Instant instant = calendar.toInstant();
+    String actualDateTime = mapper.convertDateTime(instant);
+    assertEquals(ISO_DATETIME_EXAMPLES[0], actualDateTime);
+  }
+}
diff --git a/scim-tools/scim-tools-common/src/main/java/org/apache/directory/scim/spec/schema/Mapper.java b/scim-tools/scim-tools-common/src/main/java/org/apache/directory/scim/spec/schema/Mapper.java
deleted file mode 100644
index 7ab2afb..0000000
--- a/scim-tools/scim-tools-common/src/main/java/org/apache/directory/scim/spec/schema/Mapper.java
+++ /dev/null
@@ -1,137 +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.spec.schema;
-
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.SimpleTimeZone;
-import java.util.TimeZone;
-import java.util.regex.Pattern;
-
-/**
- * The Mapper provides methods to bi-directionally transform SCIM attribute
- * values into Java types. The eight types supported by SCIM are defined in
- * section 2.2 of the SCIM schema specification. The mapping to Java objects are
- * as follows:
- * 
- * <pre>
- *   String    -> string    -> String
- *   Boolean   -> boolean   -> Boolean
- *   Decimal   -> decimal   -> Double
- *   Integer -  > integer   -> Long
- *   DateTime  -> dateTime  -> Date
- *   Binary    -> binary    -> Byte[]
- *   Reference -> reference -> URN?
- *   Complex   -> complex   -> (Java Object as defined)
- * </pre>
- * 
- * @author Steve Moyer
- */
-public class Mapper {
-
-  // Pattern for ISO 8601 DateTime - see: https://en.wikipedia.org/wiki/ISO_8601
-  static final String ISO8601_PATTERN = "^([0-9]{4})-([0-9]{2})-([0-9]{2})[Tt]([0-9]{2}):([0-9]{2}):([0-9]{2})([Zz]|([+-]{1}[0-9]{2}:[0-9]{2}))";
-
-  // Date time component indexes
-  static final int DATE_COMPONENT_INDEX_YEAR = 1;
-  static final int DATE_COMPONENT_INDEX_MONTH = 2;
-  static final int DATE_COMPONENT_INDEX_DAY = 3;
-  static final int TIME_COMPONENT_INDEX_HOUR = 4;
-  static final int TIME_COMPONENT_INDEX_MINUTE = 5;
-  static final int TIME_COMPONENT_INDEX_SECOND = 6;
-  static final int TIMEZONE_COMPONENT_INDEX = 7;
-
-  // Format string to create an ISO 8601 date string from a Java date object
-  static final String ISO8601_DATETIME_FORMATTER = "yyyy-MM-dd'T'HH:mm:ssXXX";
-
-  SimpleDateFormat iso8601DateFormat;
-  Pattern iso8601Pattern;
-
-  public Mapper() {
-    iso8601DateFormat = new SimpleDateFormat(ISO8601_DATETIME_FORMATTER);
-    iso8601Pattern = Pattern.compile(ISO8601_PATTERN);
-  }
-
-  public String convertDateTime(Date date) {
-    return iso8601DateFormat.format(date);
-  }
-
-  /**
-   * Converts an ISO 8601 DateTime string into the equivalent Java Date object.
-   * 
-   * @param date the ISO 8601 DateTime to be converted.
-   * @return the equivalent Java Date object.
-   * @throws ParseException 
-   */
-  public Date convertDateTime(String isodate) throws ParseException {
-//    Calendar calendar = null;
-//    Matcher matcher = iso8601Pattern.matcher(date);
-//    if (matcher.matches()) {
-//      TimeZone timeZone = convertTimeZone(matcher.group(TIMEZONE_COMPONENT_INDEX));
-//      calendar = new GregorianCalendar(timeZone);
-//      calendar.set(
-//          Integer.parseInt(matcher.group(DATE_COMPONENT_INDEX_YEAR)),
-//          Integer.parseInt(matcher.group(DATE_COMPONENT_INDEX_MONTH)),
-//          Integer.parseInt(matcher.group(DATE_COMPONENT_INDEX_DAY)),
-//          Integer.parseInt(matcher.group(TIME_COMPONENT_INDEX_HOUR)),
-//          Integer.parseInt(matcher.group(TIME_COMPONENT_INDEX_MINUTE)),
-//          Integer.parseInt(matcher.group(TIME_COMPONENT_INDEX_SECOND))
-//          );
-//    } else {
-//      // TODO - This is an error
-//    }
-//    return calendar.getTime();
-    Date date = iso8601DateFormat.parse(isodate);
-    return date;
-  }
-
-  /**
-   * Converts the timeZone portion of an ISO 8601 date into a Java TimeZone
-   * object.
-   * 
-   * @param timeZone the ISO 8601 representation of the time zone.
-   * @return the equivalent Java TimeZone object.
-   */
-  TimeZone convertTimeZone(String timeZone) {
-    String[] timeZoneTokens = timeZone.split(":");
-    int hours = 0;
-    int minutes = 0;
-
-    if (!timeZone.startsWith("Z") && !timeZone.startsWith("z")) {
-      if (timeZoneTokens.length > 0) {
-        hours = Integer.parseInt(timeZoneTokens[0]);
-      }
-      if (timeZoneTokens.length > 1) {
-        minutes = Integer.parseInt(timeZoneTokens[1]);
-        if (timeZone.startsWith("-")) {
-          minutes = minutes * -1;
-        }
-      }
-    }
-    
-    int timeZoneOffsetMilliSeconds = ((hours * 60) + minutes) * 1000;
-    return new SimpleTimeZone(timeZoneOffsetMilliSeconds, "");
-  }
-
-}
diff --git a/scim-tools/scim-tools-common/src/test/java/org/apache/directory/scim/spec/schema/MapperTest.java b/scim-tools/scim-tools-common/src/test/java/org/apache/directory/scim/spec/schema/MapperTest.java
deleted file mode 100644
index 136d325..0000000
--- a/scim-tools/scim-tools-common/src/test/java/org/apache/directory/scim/spec/schema/MapperTest.java
+++ /dev/null
@@ -1,162 +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.spec.schema;
-
-import java.text.ParseException;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.SimpleTimeZone;
-import java.util.TimeZone;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvSource;
-import org.junit.jupiter.params.provider.MethodSource;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assumptions.assumeTrue;
-
-
-public class MapperTest {
-
-  static final String[] ISO_DATETIME_EXAMPLES = {
-      "2015-04-26T01:37:17+00:00",
-      "2015-04-26T01:37:17Z"
-  };
-
-  static String[] getIsoDateTimeExamples() {
-    return ISO_DATETIME_EXAMPLES;
-  }
-
-  /**
-   * Tests that the regular expression provided used to decompose an ISO 8601
-   * DateTime string works with the examples from wikipedia.
-   * 
-   * @param isoDateTime a String[] of examples to test.
-   */
-  @ParameterizedTest
-  @MethodSource("getIsoDateTimeExamples")
-  public void testDateTimePatternWorksForIso8601Strings(String isoDateTime) {
-    Pattern pattern = Pattern.compile(Mapper.ISO8601_PATTERN);
-    assertNotNull(pattern);
-    Matcher matcher = pattern.matcher(isoDateTime);
-    assertTrue(matcher.matches());
-  }
-
-  /**
-   * Tests that the static final indexes in the Mapper class correspond to the
-   * correct matching groups in the ISO 8601 regular expression.
-   * 
-   * @param isoDateTime a String[] of examples to test.
-   */
-  @ParameterizedTest
-  @MethodSource("getIsoDateTimeExamples")
-  public void testDateTimeGroupIndexesProvideCorrectSubstrings(String isoDateTime) {
-    Pattern pattern = Pattern.compile(Mapper.ISO8601_PATTERN);
-    Matcher matcher = pattern.matcher(isoDateTime);
-    assumeTrue(matcher.matches());
-    assertEquals("2015", matcher.group(Mapper.DATE_COMPONENT_INDEX_YEAR));
-    assertEquals("04", matcher.group(Mapper.DATE_COMPONENT_INDEX_MONTH));
-    assertEquals("26", matcher.group(Mapper.DATE_COMPONENT_INDEX_DAY));
-    assertEquals("01", matcher.group(Mapper.TIME_COMPONENT_INDEX_HOUR));
-    assertEquals("37", matcher.group(Mapper.TIME_COMPONENT_INDEX_MINUTE));
-    assertEquals("17", matcher.group(Mapper.TIME_COMPONENT_INDEX_SECOND));
-    assertTrue("+00:00".equals(matcher.group(Mapper.TIMEZONE_COMPONENT_INDEX)) ||
-        "Z".equals(matcher.group(Mapper.TIMEZONE_COMPONENT_INDEX)));
-  }
-  
-  @ParameterizedTest
-  @MethodSource("getIsoDateTimeExamples")
-  public void testConvertDateTimeFromString(String isoDateTime) throws ParseException {
-    Mapper mapper = new Mapper();
-    Date date = mapper.convertDateTime(isoDateTime);
-    TimeZone timeZone = new SimpleTimeZone(0, "GMT");
-    GregorianCalendar calendar = new GregorianCalendar(timeZone);
-    calendar.setTime(date);
-    assertEquals(2015, calendar.get(Calendar.YEAR));
-    assertEquals(3, calendar.get(Calendar.MONTH));
-    assertEquals(26, calendar.get(Calendar.DATE));
-    assertEquals(1, calendar.get(Calendar.HOUR_OF_DAY));
-    assertEquals(37, calendar.get(Calendar.MINUTE));
-    assertEquals(17, calendar.get(Calendar.SECOND));
-  }
-  
-  @Test
-  @Disabled
-  public void convertDateTimeFromDate() {
-    Mapper mapper = new Mapper();
-    TimeZone timeZone = new SimpleTimeZone(0, "GMT");
-    GregorianCalendar calendar = new GregorianCalendar(timeZone);
-    calendar.set(Calendar.YEAR, 2015);
-    calendar.set(Calendar.MONTH, 03);
-    calendar.set(Calendar.DATE, 26);
-    calendar.set(Calendar.HOUR_OF_DAY, 1);
-    calendar.set(Calendar.MINUTE, 37);
-    calendar.set(Calendar.SECOND, 17);
-    Date date = calendar.getTime();
-    String actualDateTime = mapper.convertDateTime(date);
-    assertEquals(ISO_DATETIME_EXAMPLES[0], actualDateTime);
-  }
-
-  /**
-   * Tests that the convertTimeZone() method properly sets the raw offset of
-   * the Java TimeZone object (ignoring locality so there are no IDs provided).
-   * 
-   * @param isoTimeZone an ISO 8601 formatted timezone string.
-   * @param expectedHours the expected hours.
-   * @param expectedMinutes the expected minutes.
-   */
-  @ParameterizedTest
-  @CsvSource({
-      " 00:00,   0,    0",
-      "+00:00,   0,    0",
-      "-00:00,  -0,    0",
-      " 00:30,   0,   30",
-      "+00:30,   0,   30",
-      "-00:30,   0,  -30",
-      " 05:00,   5,    0",
-      "+05:00,   5,    0",
-      "-05:00,  -5,    0",
-      " 05:30,   5,   30",
-      "+05:30,   5,   30",
-      "-05:30,  -5,  -30",
-      " 00,      0,    0",
-      "+00,      0,    0",
-      "-00,      0,    0",
-      "+05,      5,    0",
-      "-05,     -5,    0",
-  })
-  public void testConvertTimeZone(String isoTimeZone, int expectedHours, int expectedMinutes) {
-    Mapper mapper = new Mapper();
-    TimeZone timeZone = mapper.convertTimeZone(isoTimeZone);
-    int actualOffsetMinutes = timeZone.getRawOffset() / 1000;
-    int actualHours = actualOffsetMinutes / 60;
-    int actualMinutes = actualOffsetMinutes % 60;
-    assertEquals(expectedHours, actualHours);
-    assertEquals(expectedMinutes, actualMinutes);
-  }
-
-}
