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 97%
rename from src/main/edu/wisc/doit/UWUserDetails.php
rename to src/main/edu/wisc/doit/uwphps/UWUserDetails.php
index 1708f134097be1fa8b67b9d289a5e72c3e0cf0c1..cb1a6469e92cfa5088e1227ae347dffe79a726c9 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.
@@ -20,7 +20,7 @@ class UWUserDetails implements UserDetails
     private $emailAddress;
     /** @var string */
     private $source;
-    /** @var isisEmplid */
+    /** @var string */
     private $isisEmplid;
     /** @var string */
     private $firstName;
diff --git a/src/main/edu/wisc/doit/UserDetails.php b/src/main/edu/wisc/doit/uwphps/UserDetails.php
similarity index 98%
rename from src/main/edu/wisc/doit/UserDetails.php
rename to src/main/edu/wisc/doit/uwphps/UserDetails.php
index b7d8fc1037abedd9064b2ef066a20b38af391949..93cb4220ed926b171802b0ffccfd6cba278ab179 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.
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..1cf730d62d52a992d574b809e6b1b5d958899582
--- /dev/null
+++ b/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php
@@ -0,0 +1,58 @@
+<?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;
+    
+    // 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";
+
+    /**
+     * UserDetailsProvider constructor.
+     * @param $http
+     */
+    public function __construct($http = true)
+    {
+        $this->http = $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 87%
rename from src/main/edu/wisc/doit/LocalUserDetailsProvider.php
rename to src/main/edu/wisc/doit/uwphps/local/LocalUserDetailsProvider.php
index bbbbf02efd1ef2e7ad42e624082b1bf2b950b091..96436837b40b8940589509ddf2c0a9819aa26118 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\UWUserDetails;
+use edu\wisc\doit\uwphps\UserDetailsProvider;
 
 /**
  * LocalUserDetailsProvider provides a developer with a {@link UWUserDetails} suitable for use in local development.
  */
-class LocalUserDetailsProvider implements UserDetailsProvider
+class LocalUserDetailsProvider extends UserDetailsProvider
 {
 
     /** @var string */
@@ -18,6 +21,7 @@ class LocalUserDetailsProvider implements UserDetailsProvider
      */
     public function __construct($filePath)
     {
+        parent::__construct(false);
         $this->filePath = $filePath;
     }
 
diff --git a/src/main/edu/wisc/doit/FederatedPreauthUserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php
similarity index 64%
rename from src/main/edu/wisc/doit/FederatedPreauthUserDetailsProvider.php
rename to src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php
index a0c17d476ca71eccaf07585f4889fcc337a0eb46..b5a85112f205b0dc132abb40cead76e72d2c387e 100644
--- a/src/main/edu/wisc/doit/FederatedPreauthUserDetailsProvider.php
+++ b/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php
@@ -1,27 +1,19 @@
 <?php
 
-namespace edu\wisc\doit;
+namespace edu\wisc\doit\uwphps\preauth;
+
+use edu\wisc\doit\uwphps\UWUserDetails;
+use edu\wisc\doit\uwphps\UserDetailsProvider;
 
 /**
- * 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.
+ * 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 implements UserDetailsProvider
+class FederatedPreauthUserDetailsProvider extends 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}
      */
@@ -62,15 +54,4 @@ class FederatedPreauthUserDetailsProvider implements UserDetailsProvider
         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/uwphps/preauth/PreauthUserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php
new file mode 100644
index 0000000000000000000000000000000000000000..77bcecc23141a583c35c4ea453be7d34b1cb9cdf
--- /dev/null
+++ b/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php
@@ -0,0 +1,22 @@
+<?php
+
+namespace edu\wisc\doit\uwphps\preauth;
+
+/**
+ * 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
+{
+
+    /**
+     * {@inheritdoc}
+     */
+    public function loadUser()
+    {
+
+    }
+
+}
diff --git a/src/test/edu/wisc/doit/HTTPFederatedPreauthUserDetailsProviderTest.php b/src/test/edu/wisc/doit/HTTPFederatedPreauthUserDetailsProviderTest.php
index 683915a8cf0ad7df20511edd932756f44fbd281c..c4f1d70ca5a453feb0ce3542e6181010c05c7e32 100644
--- a/src/test/edu/wisc/doit/HTTPFederatedPreauthUserDetailsProviderTest.php
+++ b/src/test/edu/wisc/doit/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}.
@@ -27,7 +27,7 @@ class HTTPFederatedPreauthUserDetailsProviderTest extends \PHPUnit_Framework_Tes
         }
 
         $this->attributes = json_decode($jsonString, true);
-        $this->userProvider = new FederatedPreauthUserDetailsProvider(true);
+        $this->userProvider = new FederatedPreauthUserDetailsProvider();
 
         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)]);
diff --git a/src/test/edu/wisc/doit/LocalUserDetailsProviderTest.php b/src/test/edu/wisc/doit/LocalUserDetailsProviderTest.php
index 52b4bb8fa1d4d6754791333cea72b7ae24c74614..35c73e0efa17186f3f3410b396c7820b3e373347 100644
--- a/src/test/edu/wisc/doit/LocalUserDetailsProviderTest.php
+++ b/src/test/edu/wisc/doit/LocalUserDetailsProviderTest.php
@@ -1,6 +1,6 @@
 <?php
 
-use edu\wisc\doit\LocalUserDetailsProvider;
+use edu\wisc\doit\uwphps\local\LocalUserDetailsProvider;
 
 /**
  * Tests for {@link LocalUserDetailsProvider}.