diff --git a/composer.json b/composer.json
index c60f3b3bffa7fee2534847bc1f96a9b8554e65ab..40192f54270e744b65ae81859fcffcfaa56d9d8d 100644
--- a/composer.json
+++ b/composer.json
@@ -4,7 +4,7 @@
   "type": "library",
   "homepage": "https://git.doit.wisc.edu/adi-ia/uw-php-security",
   "license": "Apache-2.0",
-  "version": "1.0.3",
+  "version": "2.0.0",
   "authors": [{
     "name": "UW-Madison DoIT ADI Integrated Applications",
     "email": "adi-ia@lists.wisc.edu",
@@ -19,7 +19,7 @@
   },
   "autoload": {
     "psr-4": {
-      "edu\\wisc\\doit\\": "src/main/edu/wisc/doit/"
+      "edu\\wisc\\doit\\uwphps\\": "src/main/edu/wisc/doit/uwphps"
     }
   }
 }
diff --git a/src/main/edu/wisc/doit/FederatedPreauthUserDetailsProvider.php b/src/main/edu/wisc/doit/FederatedPreauthUserDetailsProvider.php
deleted file mode 100644
index a0c17d476ca71eccaf07585f4889fcc337a0eb46..0000000000000000000000000000000000000000
--- a/src/main/edu/wisc/doit/FederatedPreauthUserDetailsProvider.php
+++ /dev/null
@@ -1,76 +0,0 @@
-<?php
-
-namespace edu\wisc\doit;
-
-/**
- * FederatedPreauthUserDetailsProvider provides an application with a {@link UWUserDetails} from Shibboleth attributes.
- * The attributes use the keys as defined by UW System, which are distinct from those used specifically by UWMSN.
- */
-class FederatedPreauthUserDetailsProvider implements UserDetailsProvider
-{
-
-    /** @var bool */
-    private $httpHeaders;
-
-    /**
-     * FederatedPreauthUserDetailsProvider constructor.
-     *
-     * @param bool $http flag indicating if Shibboleth attributes are forwarded as HTTP headers
-     */
-    public function __construct($http = false)
-    {
-        $this->httpHeaders = $http;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function loadUser()
-    {
-        // Return null if no Shib session is found
-        if ($this->httpHeaders && !getenv(FederatedPreauthUserDetailsProvider::SHIB_SESSION_ID_HTTP) ||
-            !$this->httpHeaders && !getenv(FederatedPreauthUserDetailsProvider::SHIB_SESSION_ID)) {
-            return null;
-        }
-
-        if ($this->httpHeaders) {
-            $userDetails = new UWUserDetails(
-                getenv($this->mapAttribute(UserDetailsProvider::FED_EPPN)),
-                getenv($this->mapAttribute(UserDetailsProvider::FED_SPVI)),
-                getenv($this->mapAttribute(UserDetailsProvider::FED_FULLNAME)),
-                getenv($this->mapAttribute(UserDetailsProvider::UDDS)),
-                getenv($this->mapAttribute(UserDetailsProvider::FED_EMAIL)),
-                getenv($this->mapAttribute(UserDetailsProvider::SOURCE)),
-                getenv($this->mapAttribute(UserDetailsProvider::ISIS_EMPLID)),
-                getenv($this->mapAttribute(UserDetailsProvider::FED_FIRST_NAME)),
-                getenv($this->mapAttribute(UserDetailsProvider::FED_LAST_NAME))
-            );
-        } else {
-            $userDetails = new UWUserDetails(
-                getenv(UserDetailsProvider::FED_EPPN),
-                getenv(UserDetailsProvider::FED_SPVI),
-                getenv(UserDetailsProvider::FED_FULLNAME),
-                getenv(UserDetailsProvider::UDDS),
-                getenv(UserDetailsProvider::FED_EMAIL),
-                getenv(UserDetailsProvider::SOURCE),
-                getenv(UserDetailsProvider::ISIS_EMPLID),
-                getenv(UserDetailsProvider::FED_FIRST_NAME),
-                getenv(UserDetailsProvider::FED_LAST_NAME)
-            );
-        }
-
-        return $userDetails;
-    }
-
-    /**
-     * Map a Shibboleth attribute to its associated HTTP header name.
-     *
-     * @param string $attribute attribute to map
-     * @return string Shibboleth attribute name mapped to its equivalent HTTP header name
-     */
-    private function mapAttribute($attribute)
-    {
-        return 'HTTP_' . strtoupper($attribute);
-    }
-
-}
diff --git a/src/main/edu/wisc/doit/UserDetailsProvider.php b/src/main/edu/wisc/doit/UserDetailsProvider.php
deleted file mode 100644
index 36c7244322e5f9bd910792efd35b2b897f308b06..0000000000000000000000000000000000000000
--- a/src/main/edu/wisc/doit/UserDetailsProvider.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-namespace edu\wisc\doit;
-
-/**
- * TODO: Write documentation
- */
-interface UserDetailsProvider
-{
-    
-    // Constants representing UW Federated login Shibboleth headers
-    const FED_EPPN = "eppn";
-    const FED_SPVI = "eduWisconsinSPVI";
-    const FED_FULLNAME = "eduWisconsinCommonName";
-    const FED_FIRST_NAME = "eduWisconsinGivenName";
-    const FED_LAST_NAME = "eduWisconsinSurname";
-    const FED_EMAIL = "eduWisconsinEmailAddress";
-
-    // Generic and/or UWMSN constants
-    const SHIB_SESSION_ID = 'Shib-Session-Id';
-    const SHIB_SESSION_ID_HTTP = 'HTTP_SHIB_SESSION_ID';
-    const UDDS = "udds";
-    const SOURCE = "source";
-    const ISIS_EMPLID = "isisEmplid";
-
-    /**
-     * Map Shibboleth header values to an associative array.
-     *
-     * @return UserDetails
-     */
-    public function loadUser();
-
-}
\ No newline at end of file
diff --git a/src/main/edu/wisc/doit/UWUserDetails.php b/src/main/edu/wisc/doit/uwphps/UWUserDetails.php
similarity index 87%
rename from src/main/edu/wisc/doit/UWUserDetails.php
rename to src/main/edu/wisc/doit/uwphps/UWUserDetails.php
index 1708f134097be1fa8b67b9d289a5e72c3e0cf0c1..958066ec5d62760c1943c79db002476745e36ac5 100644
--- a/src/main/edu/wisc/doit/UWUserDetails.php
+++ b/src/main/edu/wisc/doit/uwphps/UWUserDetails.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace edu\wisc\doit;
+namespace edu\wisc\doit\uwphps;
 
 /**
  * Default, concrete implementation of {@link UserDetails} to represent a UW user.
@@ -14,13 +14,13 @@ class UWUserDetails implements UserDetails
     private $pvi;
     /** @var string */
     private $fullName;
-    /** @var string[] */
+    /** @var array */
     private $udds;
     /** @var string */
     private $emailAddress;
     /** @var string */
     private $source;
-    /** @var isisEmplid */
+    /** @var string */
     private $isisEmplid;
     /** @var string */
     private $firstName;
@@ -32,15 +32,24 @@ class UWUserDetails implements UserDetails
      * @param string $eppn
      * @param string $pvi
      * @param string $fullName
-     * @param string[] $udds
+     * @param array $udds
      * @param string $emailAddress
      * @param string $source
      * @param string $isisEmplid
      * @param string $firstName
      * @param string $lastName
      */
-    public function __construct($eppn, $pvi, $fullName, $udds, $emailAddress, $source, $isisEmplid, $firstName, $lastName)
-    {
+    public function __construct(
+        $eppn,
+        $pvi,
+        $fullName,
+        $udds,
+        $emailAddress,
+        $source,
+        $isisEmplid,
+        $firstName,
+        $lastName
+    ) {
         $this->eppn = $eppn;
         $this->pvi = $pvi;
         $this->fullName = $fullName;
diff --git a/src/main/edu/wisc/doit/UserDetails.php b/src/main/edu/wisc/doit/uwphps/UserDetails.php
similarity index 97%
rename from src/main/edu/wisc/doit/UserDetails.php
rename to src/main/edu/wisc/doit/uwphps/UserDetails.php
index b7d8fc1037abedd9064b2ef066a20b38af391949..6153cee0f1a4cc2ab1adb08a288c631f49ec5aa7 100644
--- a/src/main/edu/wisc/doit/UserDetails.php
+++ b/src/main/edu/wisc/doit/uwphps/UserDetails.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace edu\wisc\doit;
+namespace edu\wisc\doit\uwphps;
 
 /**
  * UserDetails defines a minimal representation of a user associated with UW.
@@ -34,7 +34,7 @@ interface UserDetails
     /**
      * A never null, but possibly empty, array of strings each representing the UDDS IDs of the group this user is a member of.
      * 
-     * @return string[]
+     * @return array
      */
     public function getUddsMembership();
 
@@ -74,4 +74,4 @@ interface UserDetails
      */
     public function getLastName();
     
-}
\ No newline at end of file
+}
diff --git a/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php
new file mode 100644
index 0000000000000000000000000000000000000000..78b9c9e0ddd2b0962b36bad27d0400adccae987d
--- /dev/null
+++ b/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace edu\wisc\doit\uwphps;
+
+/**
+ * UseDetailsProvider is an interface defining how to load an {@link UserDetails} and provides constants for
+ * supplied request header keys.
+ */
+abstract class UserDetailsProvider
+{
+
+    /** @var bool Flag indicating if headers are passed prefixed with 'HTTP_' */
+    protected $httpHeaders;
+    
+    // General, shared constants relevant to UWMSN and UW-System login
+    const EPPN = "eppn";
+    const SHIB_SESSION_ID = 'Shib-Session-Id';
+    const SHIB_SESSION_ID_HTTP = 'HTTP_SHIB_SESSION_ID';
+    const UDDS = "udds";
+    const SOURCE = "source";
+    const ISIS_EMPLID = "isisEmplid";
+
+    // Delimiter used by multi-valued headers
+    const DELIMITER = ';';
+
+    /**
+     * UserDetailsProvider constructor.
+     * @param $http
+     */
+    public function __construct($http = false)
+    {
+        $this->httpHeaders = $http;
+    }
+
+    /**
+     * Map Shibboleth header values to an associative array.
+     *
+     * @return UserDetails
+     */
+    abstract public function loadUser();
+
+
+    /**
+     * Map a Shibboleth attribute to its associated HTTP header name.
+     *
+     * @param string $attribute attribute to map
+     * @return string Shibboleth attribute name mapped to its equivalent HTTP header name
+     */
+    protected function mapAttribute($attribute)
+    {
+        return 'HTTP_' . strtoupper($attribute);
+    }
+
+}
diff --git a/src/main/edu/wisc/doit/LocalUserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/local/LocalUserDetailsProvider.php
similarity index 58%
rename from src/main/edu/wisc/doit/LocalUserDetailsProvider.php
rename to src/main/edu/wisc/doit/uwphps/local/LocalUserDetailsProvider.php
index bbbbf02efd1ef2e7ad42e624082b1bf2b950b091..7a15d83689c9ed9a2ca9b4f00754f8991b455192 100644
--- a/src/main/edu/wisc/doit/LocalUserDetailsProvider.php
+++ b/src/main/edu/wisc/doit/uwphps/local/LocalUserDetailsProvider.php
@@ -1,11 +1,14 @@
 <?php
 
-namespace edu\wisc\doit;
+namespace edu\wisc\doit\uwphps\local;
+
+use edu\wisc\doit\uwphps\preauth\PreauthUserDetailsProvider;
+use edu\wisc\doit\uwphps\UWUserDetails;
 
 /**
  * LocalUserDetailsProvider provides a developer with a {@link UWUserDetails} suitable for use in local development.
  */
-class LocalUserDetailsProvider implements UserDetailsProvider
+class LocalUserDetailsProvider extends PreauthUserDetailsProvider
 {
 
     /** @var string */
@@ -14,10 +17,11 @@ class LocalUserDetailsProvider implements UserDetailsProvider
     /**
      * LocalUserDetailsProvider constructor.
      *
-     * @param $filePath path to JSON file defining a local user.
+     * @param $filePath string Path to JSON file defining a local user.
      */
     public function __construct($filePath)
     {
+        parent::__construct(false);
         $this->filePath = $filePath;
     }
 
@@ -34,15 +38,15 @@ class LocalUserDetailsProvider implements UserDetailsProvider
         $attributes = json_decode($jsonString, true);
 
         return new UWUserDetails(
-            $attributes[UserDetailsProvider::FED_EPPN],
-            $attributes[UserDetailsProvider::FED_SPVI],
-            $attributes[UserDetailsProvider::FED_FULLNAME],
-            $attributes[UserDetailsProvider::UDDS],
-            $attributes[UserDetailsProvider::FED_EMAIL],
-            $attributes[UserDetailsProvider::SOURCE],
-            $attributes[UserDetailsProvider::ISIS_EMPLID],
-            $attributes[UserDetailsProvider::FED_FIRST_NAME],
-            $attributes[UserDetailsProvider::FED_LAST_NAME]
+            $attributes[static::EPPN],
+            $attributes[static::PVI],
+            $attributes[static::FULL_NAME],
+            explode(static::DELIMITER, $attributes[static::UDDS]),
+            $attributes[static::EMAIL],
+            $attributes[static::SOURCE],
+            $attributes[static::ISIS_EMPLID],
+            $attributes[static::FIRST_NAME],
+            $attributes[static::LAST_NAME]
         );
     }
 
diff --git a/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php
new file mode 100644
index 0000000000000000000000000000000000000000..e8d896b553bb289aad358fadf5778c4c48d33045
--- /dev/null
+++ b/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace edu\wisc\doit\uwphps\preauth;
+
+use edu\wisc\doit\uwphps\UserDetailsProvider;
+use edu\wisc\doit\uwphps\UWUserDetails;
+
+/**
+ * FederatedPreauthUserDetailsProvider is an implementation of {@link UserDetailsProvider} for loading users
+ * authenticated with UW-System Federated login.
+ *
+ * {@see PreauthUserDetailsProvider} for loading users authenticated through UW-Madison login.
+ */
+class FederatedPreauthUserDetailsProvider extends UserDetailsProvider
+{
+
+    // Constants defining common header values
+    const SPVI = "eduWisconsinSPVI";
+    const EMAIL = "eduWisconsinEmailAddress";
+    const FULL_NAME = "eduWisconsinCommonName";
+    const FIRST_NAME = "eduWisconsinGivenName";
+    const LAST_NAME = "eduWisconsinSurname";
+
+    /**
+     * {@inheritdoc}
+     */
+    public function loadUser()
+    {
+        // Return null if no Shib session is found
+        if ($this->httpHeaders && !getenv(static::SHIB_SESSION_ID_HTTP) ||
+            !$this->httpHeaders && !getenv(static::SHIB_SESSION_ID)) {
+            return null;
+        }
+
+        if ($this->httpHeaders) {
+            $userDetails = new UWUserDetails(
+                getenv($this->mapAttribute(static::EPPN)),
+                getenv($this->mapAttribute(static::SPVI)),
+                getenv($this->mapAttribute(static::FULL_NAME)),
+                explode(static::DELIMITER, getenv($this->mapAttribute(static::UDDS))),
+                getenv($this->mapAttribute(static::EMAIL)),
+                getenv($this->mapAttribute(static::SOURCE)),
+                getenv($this->mapAttribute(static::ISIS_EMPLID)),
+                getenv($this->mapAttribute(static::FIRST_NAME)),
+                getenv($this->mapAttribute(static::LAST_NAME))
+            );
+        } else {
+            $userDetails = new UWUserDetails(
+                getenv(static::EPPN),
+                getenv(static::SPVI),
+                getenv(static::FULL_NAME),
+                getenv(static::UDDS),
+                getenv(static::EMAIL),
+                getenv(static::SOURCE),
+                getenv(static::ISIS_EMPLID),
+                getenv(static::FIRST_NAME),
+                getenv(static::LAST_NAME)
+            );
+        }
+
+        return $userDetails;
+    }
+
+}
diff --git a/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php
new file mode 100644
index 0000000000000000000000000000000000000000..79631f24f7b0b585a08fd13fe5722c68d67e72f4
--- /dev/null
+++ b/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace edu\wisc\doit\uwphps\preauth;
+
+use edu\wisc\doit\uwphps\UserDetailsProvider;
+use edu\wisc\doit\uwphps\UWUserDetails;
+
+/**
+ * PreauthUserDetailsProvider is an implementation of {@link UserDetailsProvider} for loading users authenticated
+ * with UW-Madison login.
+ *
+ * {@see FederatedPreauthUserDetailsProvider} for loading users authenticated through UW-System Federated login.
+ */
+class PreauthUserDetailsProvider extends UserDetailsProvider
+{
+
+    // Constants defining common header values
+    const PVI = 'wiscEduPVI';
+    const FULL_NAME = 'cn';
+    const EMAIL = 'mail';
+    const UDDS = 'wiscEduUDDS';
+    const ISIS_EMPLID = 'wiscEduIsisEmplid';
+    const FIRST_NAME = 'givenName';
+    const LAST_NAME = 'sn';
+
+    /**
+     * {@inheritdoc}
+     */
+    public function loadUser()
+    {
+        // Return null if no Shib session is found
+        if ($this->httpHeaders && !getenv(static::SHIB_SESSION_ID_HTTP) ||
+            !$this->httpHeaders && !getenv(static::SHIB_SESSION_ID)) {
+            return null;
+        }
+
+        if ($this->httpHeaders) {
+            $userDetails = new UWUserDetails(
+                getenv($this->mapAttribute(static::EPPN)),
+                getenv($this->mapAttribute(static::PVI)),
+                getenv($this->mapAttribute(static::FULL_NAME)),
+                explode(static::DELIMITER, getenv($this->mapAttribute(static::UDDS))),
+                getenv($this->mapAttribute(static::EPPN)),
+                getenv($this->mapAttribute(static::SOURCE)),
+                getenv($this->mapAttribute(static::ISIS_EMPLID)),
+                getenv($this->mapAttribute(static::FIRST_NAME)),
+                getenv($this->mapAttribute(static::LAST_NAME))
+            );
+        } else {
+            $userDetails = new UWUserDetails(
+                getenv(static::EPPN),
+                getenv(static::PVI),
+                getenv(static::FULL_NAME),
+                getenv(static::UDDS),
+                getenv(static::EPPN),
+                getenv(static::SOURCE),
+                getenv(static::ISIS_EMPLID),
+                getenv(static::FIRST_NAME),
+                getenv(static::LAST_NAME)
+            );
+        }
+
+        return $userDetails;
+    }
+
+}
diff --git a/src/main/resources/localuser.json b/src/main/resources/localuser.json
index a3a534459cfdc2a46fbf549dc978220726505e98..731030b5374e207e9dba0c72eb56be13e4673655 100644
--- a/src/main/resources/localuser.json
+++ b/src/main/resources/localuser.json
@@ -1,15 +1,12 @@
 {
   "eppn": "bbadger@wisc.edu",
-  "eduWisconsinSPVI": "UW123A456",
+  "wiscEduPVI": "UW123A456",
   "cn": "BUCKINGHAM BADGER",
-  "eduWisconsinCommonName": "BUCKINGHAM BADGER",
-  "eduWisconsinGivenName": "BUCKINGHAM",
-  "eduWisconsinSurname": "BADGER",
-  "udds": [
-    "UW123A456",
-    "UW234A567"
-  ],
-  "eduWisconsinEmailAddress": "bucky.badger@wisc.edu",
+  "cn": "BUCKINGHAM BADGER",
+  "givenName": "BUCKINGHAM",
+  "sn": "BADGER",
+  "wiscEduUDDS": "A061234;A072345",
+  "mail": "bucky.badger@wisc.edu",
   "source": "a_source",
   "isisEmplid": "123456789"
 }
\ No newline at end of file
diff --git a/src/test/edu/wisc/doit/LocalUserDetailsProviderTest.php b/src/test/edu/wisc/doit/uwphps/local/LocalUserDetailsProviderTest.php
similarity index 82%
rename from src/test/edu/wisc/doit/LocalUserDetailsProviderTest.php
rename to src/test/edu/wisc/doit/uwphps/local/LocalUserDetailsProviderTest.php
index 52b4bb8fa1d4d6754791333cea72b7ae24c74614..3ee4255ec27d37fdbcb9a26ca5aad246a38799a6 100644
--- a/src/test/edu/wisc/doit/LocalUserDetailsProviderTest.php
+++ b/src/test/edu/wisc/doit/uwphps/local/LocalUserDetailsProviderTest.php
@@ -1,6 +1,6 @@
 <?php
 
-use edu\wisc\doit\LocalUserDetailsProvider;
+use edu\wisc\doit\uwphps\local\LocalUserDetailsProvider;
 
 /**
  * Tests for {@link LocalUserDetailsProvider}.
@@ -8,9 +8,12 @@ use edu\wisc\doit\LocalUserDetailsProvider;
 class LocalUserDetailsProviderTest extends \PHPUnit_Framework_TestCase
 {
 
-    public function testLoadUser()
+    /**
+     * @test
+     */
+    public function loadUser()
     {
-        $userDetailsService = new LocalUserDetailsProvider(__DIR__ . "/../../../resources/localuser.json");
+        $userDetailsService = new LocalUserDetailsProvider(__DIR__ . "/../../../../../resources/localuser.json");
         $user = $userDetailsService->loadUser();
         $this->assertEquals("bbadger@wisc.edu", $user->getEppn());
         $this->assertEquals("UW123A456", $user->getPvi());
@@ -21,4 +24,5 @@ class LocalUserDetailsProviderTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals("BUCKINGHAM", $user->getFirstName());
         $this->assertEquals("BADGER", $user->getLastName());
     }
+
 }
diff --git a/src/test/edu/wisc/doit/HTTPFederatedPreauthUserDetailsProviderTest.php b/src/test/edu/wisc/doit/uwphps/preauth/HTTPFederatedPreauthUserDetailsProviderTest.php
similarity index 55%
rename from src/test/edu/wisc/doit/HTTPFederatedPreauthUserDetailsProviderTest.php
rename to src/test/edu/wisc/doit/uwphps/preauth/HTTPFederatedPreauthUserDetailsProviderTest.php
index 683915a8cf0ad7df20511edd932756f44fbd281c..3d43e21085ed20ca0cc4f4a72e247e331ac88fc3 100644
--- a/src/test/edu/wisc/doit/HTTPFederatedPreauthUserDetailsProviderTest.php
+++ b/src/test/edu/wisc/doit/uwphps/preauth/HTTPFederatedPreauthUserDetailsProviderTest.php
@@ -1,7 +1,7 @@
 <?php
 
-use edu\wisc\doit\UserDetailsProvider;
-use edu\wisc\doit\FederatedPreauthUserDetailsProvider;
+use edu\wisc\doit\uwphps\UserDetailsProvider;
+use edu\wisc\doit\uwphps\preauth\FederatedPreauthUserDetailsProvider;
 
 /**
  * Tests for {@link FederatedPreauthUserDetailsProvider}.
@@ -16,12 +16,11 @@ class HTTPFederatedPreauthUserDetailsProviderTest extends \PHPUnit_Framework_Tes
     private $userProvider;
 
     /**
-     * Populate putenv with Shib attributes to simulate a logged in user
+     * Populate $_SERVER with Shib attributes to simulate a logged in user
      */
     protected function setUp()
     {
-        parent::setUp();
-        $jsonString = file_get_contents(__DIR__ . "/../../../resources/testuser_http.json");
+        $jsonString = file_get_contents(__DIR__ . "/../../../../../resources/testuser_http.json");
         if ($jsonString === false) {
             return null;
         }
@@ -29,19 +28,22 @@ class HTTPFederatedPreauthUserDetailsProviderTest extends \PHPUnit_Framework_Tes
         $this->attributes = json_decode($jsonString, true);
         $this->userProvider = new FederatedPreauthUserDetailsProvider(true);
 
-        putenv($this->mapAttribute(UserDetailsProvider::FED_EPPN) . '=' . $this->attributes[$this->mapAttribute(UserDetailsProvider::FED_EPPN)]);
-        putenv($this->mapAttribute(UserDetailsProvider::FED_SPVI) . '=' . $this->attributes[$this->mapAttribute(UserDetailsProvider::FED_SPVI)]);
-        putenv($this->mapAttribute(UserDetailsProvider::FED_FULLNAME) . '=' . $this->attributes[$this->mapAttribute(UserDetailsProvider::FED_FULLNAME)]);
-        putenv($this->mapAttribute(UserDetailsProvider::FED_FIRST_NAME) . '=' . $this->attributes[$this->mapAttribute(UserDetailsProvider::FED_FIRST_NAME)]);
-        putenv($this->mapAttribute(UserDetailsProvider::FED_LAST_NAME) . '=' . $this->attributes[$this->mapAttribute(UserDetailsProvider::FED_LAST_NAME)]);
-        putenv($this->mapAttribute(UserDetailsProvider::UDDS) . '=' . implode(",", $this->attributes[$this->mapAttribute(UserDetailsProvider::UDDS)]));
-        putenv($this->mapAttribute(UserDetailsProvider::FED_EMAIL) . '=' . $this->attributes[$this->mapAttribute(UserDetailsProvider::FED_EMAIL)]);
+        putenv($this->mapAttribute(UserDetailsProvider::EPPN) . '=' . $this->attributes[$this->mapAttribute(UserDetailsProvider::EPPN)]);
+        putenv($this->mapAttribute(FederatedPreauthUserDetailsProvider::SPVI) . '=' . $this->attributes[$this->mapAttribute(FederatedPreauthUserDetailsProvider::SPVI)]);
+        putenv($this->mapAttribute(FederatedPreauthUserDetailsProvider::FULL_NAME) . '=' . $this->attributes[$this->mapAttribute(FederatedPreauthUserDetailsProvider::FULL_NAME)]);
+        putenv($this->mapAttribute(FederatedPreauthUserDetailsProvider::FIRST_NAME) . '=' . $this->attributes[$this->mapAttribute(FederatedPreauthUserDetailsProvider::FIRST_NAME)]);
+        putenv($this->mapAttribute(FederatedPreauthUserDetailsProvider::LAST_NAME) . '=' . $this->attributes[$this->mapAttribute(FederatedPreauthUserDetailsProvider::LAST_NAME)]);
+        putenv($this->mapAttribute(UserDetailsProvider::UDDS) . '=' . $this->attributes[$this->mapAttribute(UserDetailsProvider::UDDS)]);
+        putenv($this->mapAttribute(FederatedPreauthUserDetailsProvider::EMAIL) . '=' . $this->attributes[$this->mapAttribute(FederatedPreauthUserDetailsProvider::EMAIL)]);
         putenv($this->mapAttribute(UserDetailsProvider::SOURCE) . '=' . $this->attributes[$this->mapAttribute(UserDetailsProvider::SOURCE)]);
         putenv($this->mapAttribute(UserDetailsProvider::ISIS_EMPLID) . '=' . $this->attributes[$this->mapAttribute(UserDetailsProvider::ISIS_EMPLID)]);
         putenv(UserDetailsProvider::SHIB_SESSION_ID_HTTP  . '=' . $this->attributes[UserDetailsProvider::SHIB_SESSION_ID_HTTP]);
     }
 
-    public function testLoadUser()
+    /**
+     * @test
+     */
+    public function loadUser()
     {
         $user = $this->userProvider->loadUser();
         $this->assertNotNull($user);
@@ -53,9 +55,13 @@ class HTTPFederatedPreauthUserDetailsProviderTest extends \PHPUnit_Framework_Tes
         $this->assertEquals("123456789", $user->getIsisEmplid());
         $this->assertEquals("BUCKINGHAM", $user->getFirstName());
         $this->assertEquals("BADGER", $user->getLastName());
+        $this->assertEquals(["A061234", "A072345"], $user->getUddsMembership());
     }
 
-    public function testLoadUserWithNoEPPN()
+    /**
+     * @test
+     */
+    public function loadUserWithNoEPPN()
     {
         // Clear Shib session ID to simulate no session
         putenv(UserDetailsProvider::SHIB_SESSION_ID_HTTP);
@@ -63,10 +69,13 @@ class HTTPFederatedPreauthUserDetailsProviderTest extends \PHPUnit_Framework_Tes
         $this->assertNull($user);
     }
 
-    public function testLoadUserWithNoEmail()
+    /**
+     * @test
+     */
+    public function loadUserWithNoEmail()
     {
         // Clear email to simulate no email
-        putenv('HTTP_' . strtoupper(UserDetailsProvider::FED_EMAIL));
+        putenv('HTTP_' . strtoupper(FederatedPreauthUserDetailsProvider::EMAIL));
         $user = $this->userProvider->loadUser();
         $this->assertFalse($user->getEmailAddress());
     }
diff --git a/src/test/resources/localuser.json b/src/test/resources/localuser.json
index a3a534459cfdc2a46fbf549dc978220726505e98..60704689076cf537659671938530c882a491c77f 100644
--- a/src/test/resources/localuser.json
+++ b/src/test/resources/localuser.json
@@ -1,15 +1,12 @@
 {
   "eppn": "bbadger@wisc.edu",
-  "eduWisconsinSPVI": "UW123A456",
+  "wiscEduPVI": "UW123A456",
   "cn": "BUCKINGHAM BADGER",
-  "eduWisconsinCommonName": "BUCKINGHAM BADGER",
-  "eduWisconsinGivenName": "BUCKINGHAM",
-  "eduWisconsinSurname": "BADGER",
-  "udds": [
-    "UW123A456",
-    "UW234A567"
-  ],
-  "eduWisconsinEmailAddress": "bucky.badger@wisc.edu",
+  "cn": "BUCKINGHAM BADGER",
+  "givenName": "BUCKINGHAM",
+  "sn": "BADGER",
+  "wiscEduUDDS": "A061234;A072345",
+  "mail": "bucky.badger@wisc.edu",
   "source": "a_source",
-  "isisEmplid": "123456789"
+  "wiscEduIsisEmplid": "123456789"
 }
\ No newline at end of file
diff --git a/src/test/resources/testuser_http.json b/src/test/resources/testuser_http.json
index 7de908f421b737c919579067ef9789b1286303ea..0d7f59178d65cfa4a37197a1bf1a828d5237fddf 100644
--- a/src/test/resources/testuser_http.json
+++ b/src/test/resources/testuser_http.json
@@ -5,10 +5,7 @@
   "HTTP_EDUWISCONSINCOMMONNAME": "BUCKINGHAM BADGER",
   "HTTP_EDUWISCONSINGIVENNAME": "BUCKINGHAM",
   "HTTP_EDUWISCONSINSURNAME": "BADGER",
-  "HTTP_UDDS": [
-    "UW123A456",
-    "UW234A567"
-  ],
+  "HTTP_UDDS": "A061234;A072345",
   "HTTP_EDUWISCONSINEMAILADDRESS": "bucky.badger@wisc.edu",
   "HTTP_SOURCE": "a_source",
   "HTTP_ISISEMPLID": "123456789",