diff --git a/README.md b/README.md
index 67e01f8fbf5c31d431b27ff0a483c79fea9aebdc..418c7bb926f80e1f549415a6c28838ba184f2506 100644
--- a/README.md
+++ b/README.md
@@ -60,7 +60,8 @@ and get back an instance of [UWUserDetails](uw-spring-security-core/src/main/jav
   customLogoutUrl: null,
   isisEmplid: null,
   firstName: null,
-  lastName: null
+  lastName: null,
+  displayName: null
 }
 ```
 
diff --git a/pom.xml b/pom.xml
index d88cecb56408bcab42a5b76414a35286a1c7aaae..9bca073faf6a9390297e5e374cc869b3936fdf39 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2,7 +2,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>edu.wisc.uwss</groupId>
 	<artifactId>uw-spring-security</artifactId>
-	<version>1.7.1-SNAPSHOT</version>
+	<version>2.0.0-SNAPSHOT</version>
 	<packaging>pom</packaging>
 	<name>UW Spring Security Parent</name>
 	<description>Parent project for module to integrate Spring Security with UW authentication mechanism.</description>
@@ -29,6 +29,10 @@
 			<id>code.doit-uw-releases</id>
 			<url>https://code.doit.wisc.edu/maven/content/repositories/uw-releases/</url>
 		</repository>
+		<repository>
+			<id>code.doit-public-releases</id>
+			<url>https://code.doit.wisc.edu/maven/content/repositories/public-releases</url>
+		</repository>
 	</repositories>
 
 	<properties>
@@ -62,24 +66,33 @@
 		    </dependency>
 		    <dependency>
                 <groupId>edu.wisc.services.uds</groupId>
-                <artifactId>uds-person-data-model-1.1</artifactId>
-                <version>1.1.0</version>
+                <artifactId>uds-person-data-model-1.2</artifactId>
+                <version>1.0.0</version>
+            </dependency>
+
+            <dependency>
+                <groupId>edu.wisc.services.uds</groupId>
+                <artifactId>uds-person-client-java</artifactId>
+                <version>2.0.0</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.apache.santuario</groupId>
+                        <artifactId>xmlsec</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework.security</groupId>
+                        <artifactId>spring-security-core</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework.ws</groupId>
+                        <artifactId>spring-ws-core</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework.ws</groupId>
+                        <artifactId>spring-ws-security</artifactId>
+                    </exclusion>
+                </exclusions>
             </dependency>
-			<dependency>
-				<groupId>edu.wisc.services.uds</groupId>
-    			<artifactId>uds-person-ws</artifactId>
-    			<version>1.1.0</version>
-    			<exclusions>
-    				<exclusion>
-    					<groupId>org.springframework.ws</groupId>
-    					<artifactId>spring-ws-core</artifactId>
-    				</exclusion>
-    				<exclusion>
-    					<groupId>org.springframework.ws</groupId>
-    					<artifactId>spring-ws-security</artifactId>
-    				</exclusion>
-    			</exclusions>
-			</dependency>
 			<dependency>
 				<groupId>edu.wisc.uwss</groupId>
 				<artifactId>uw-spring-security-config</artifactId>
diff --git a/uw-spring-security-config/pom.xml b/uw-spring-security-config/pom.xml
index bebbdf2853c5b67874df00e813ddf8a101e9faa5..058dda02cdb85986c359dd1fd0e9995a2cbf6cc1 100644
--- a/uw-spring-security-config/pom.xml
+++ b/uw-spring-security-config/pom.xml
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>edu.wisc.uwss</groupId>
 		<artifactId>uw-spring-security</artifactId>
-		<version>1.7.1-SNAPSHOT</version>
+		<version>2.0.0-SNAPSHOT</version>
 	</parent>
 	<artifactId>uw-spring-security-config</artifactId>
 	<name>UW Spring Security Configuration</name>
diff --git a/uw-spring-security-config/src/main/java/edu/wisc/uwss/configuration/local/LocalAuthenticationSecurityConfiguration.java b/uw-spring-security-config/src/main/java/edu/wisc/uwss/configuration/local/LocalAuthenticationSecurityConfiguration.java
index 0880a298f40d07335a6be9279d5fb446555d2fd9..384f95f074617130669d038ff861cead8143ffb1 100644
--- a/uw-spring-security-config/src/main/java/edu/wisc/uwss/configuration/local/LocalAuthenticationSecurityConfiguration.java
+++ b/uw-spring-security-config/src/main/java/edu/wisc/uwss/configuration/local/LocalAuthenticationSecurityConfiguration.java
@@ -55,24 +55,7 @@ public class LocalAuthenticationSecurityConfiguration extends GlobalMethodSecuri
   public UserDetailsManager localUserDetailsManager() {
     return new LocalUserDetailsManagerImpl();
   }
-  /**
-   * 
-   * @return a {@link Properties} instance containing all local user accounts.
-   */
-  @Bean @Qualifier("demo-users") @Value("${edu.wisc.uwss.local.userdetails.resource:classpath:/edu/wisc/uwss/local/local-users.properties}")
-  public Properties demoUserProperties(String resourcePath) {
-    logger.info("local-users loading demo users from {}", resourcePath);
-      Resource resource = this.resourceLoader.getResource(resourcePath);
-      PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
-      propertiesFactoryBean.setLocation(resource);
-      Properties properties = null;
-      try {
-          propertiesFactoryBean.afterPropertiesSet();
-          properties = propertiesFactoryBean.getObject();
-      } catch (IOException e) {
-          throw new IllegalStateException("unable to load demo users from resource path: "+resourcePath, e);
-      }
-      return properties;
-  }
+
+
 
 }
diff --git a/uw-spring-security-config/src/main/resources/edu/wisc/uwss/configuration/uwss-SAMPLE.properties b/uw-spring-security-config/src/main/resources/edu/wisc/uwss/configuration/uwss-SAMPLE.properties
index 9d0eae9645f0c3a6a6562c7cceeb9e75bdd442dc..a5665dc122a64206fe2f35201a29ef4a4293b060 100644
--- a/uw-spring-security-config/src/main/resources/edu/wisc/uwss/configuration/uwss-SAMPLE.properties
+++ b/uw-spring-security-config/src/main/resources/edu/wisc/uwss/configuration/uwss-SAMPLE.properties
@@ -6,6 +6,7 @@ preauth.headerValues=admin;admin@wisc.edu;UW000A000;Amy Administrator;A535000;am
 #preauth.pviHeader=wiscedupvi
 #preauth.usernameHeader=uid
 #preauth.fullnameHeader=cn
+#preauth.displayNameHeader=displayName
 #preauth.uddsHeader=wisceduudds
 #preauth.emailAddressHeader=mail
 #preauth.identityProviderHeader=Shib-Identity-Provider
diff --git a/uw-spring-security-config/src/test/java/edu/wisc/uwss/configuration/local/LocalConfigurationTest.java b/uw-spring-security-config/src/test/java/edu/wisc/uwss/configuration/local/LocalConfigurationTest.java
index ee428edb66a553a34b5058569afc34eb479a1d6e..2530b48047c2d9645703c2dd1803ca44ce4a7b16 100644
--- a/uw-spring-security-config/src/test/java/edu/wisc/uwss/configuration/local/LocalConfigurationTest.java
+++ b/uw-spring-security-config/src/test/java/edu/wisc/uwss/configuration/local/LocalConfigurationTest.java
@@ -15,6 +15,8 @@ import org.springframework.web.context.support.AnnotationConfigWebApplicationCon
 
 import edu.wisc.uwss.local.LocalUserDetailsManagerImpl;
 
+import java.util.Properties;
+
 /**
  * A unit test that activates the {@link Configuration} classes in the "edu.wisc.uwss.configuration.local" package.
  * 
diff --git a/uw-spring-security-core/pom.xml b/uw-spring-security-core/pom.xml
index 01a792994658c74821fb6e774e3dae563c74d43d..cb4b56687a2ac97ffb1c158f764105e770473dba 100644
--- a/uw-spring-security-core/pom.xml
+++ b/uw-spring-security-core/pom.xml
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>edu.wisc.uwss</groupId>
 		<artifactId>uw-spring-security</artifactId>
-		<version>1.7.1-SNAPSHOT</version>
+		<version>2.0.0-SNAPSHOT</version>
 	</parent>
 	<artifactId>uw-spring-security-core</artifactId>
 	<name>UW Spring Security Core</name>
@@ -18,10 +18,14 @@
 			<groupId>com.fasterxml.jackson.dataformat</groupId>
 			<artifactId>jackson-dataformat-yaml</artifactId>
 		</dependency>
-		<dependency>
+		<!--<dependency>
 			<groupId>edu.wisc.services.uds</groupId>
     		<artifactId>uds-person-ws</artifactId>
-    	</dependency>
+    	</dependency>-->
+		<dependency>
+			<groupId>edu.wisc.services.uds</groupId>
+			<artifactId>uds-person-client-java</artifactId>
+		</dependency>
 		<dependency>
 			<groupId>javax.servlet</groupId>
 			<artifactId>javax.servlet-api</artifactId>
diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/UWUserDetails.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/UWUserDetails.java
index d0e6954bf82b420570ade3498ebe3dc244588373..2c63fc665f2f5d1fecce4b03471833b3d9ac77b6 100644
--- a/uw-spring-security-core/src/main/java/edu/wisc/uwss/UWUserDetails.java
+++ b/uw-spring-security-core/src/main/java/edu/wisc/uwss/UWUserDetails.java
@@ -47,6 +47,13 @@ public interface UWUserDetails extends UserDetails {
    */
   String getFullName();
 
+  /**
+   * The Display Name is the preferred name if the user has set one, otherwise is simply
+   * the full name.
+   * @return the display name for this user, or null if not available
+   */
+  String getDisplayName();
+
   /**
    * @return a never null, but potentially empty, {@link Collection} of {@link String}s each
    *         representing the UDDS Ids of the groups this user is a member of.
diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/UWUserDetailsImpl.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/UWUserDetailsImpl.java
index 00ed3537d96b8bd2e8df0be9a2d728aad0f6b52a..6fdd401928c3668ebc71c9574e613327df0370c2 100644
--- a/uw-spring-security-core/src/main/java/edu/wisc/uwss/UWUserDetailsImpl.java
+++ b/uw-spring-security-core/src/main/java/edu/wisc/uwss/UWUserDetailsImpl.java
@@ -39,6 +39,8 @@ public class UWUserDetailsImpl extends User implements UWUserDetails, HasModifia
   private String isisEmplid;
   private String firstName;
   private String lastName;
+  private String displayName;
+
   /**
    * 
    * @param pvi
@@ -126,6 +128,7 @@ public class UWUserDetailsImpl extends User implements UWUserDetails, HasModifia
     setSource(original.getSource());
     setFirstName(original.getFirstName());
     setLastName(original.getLastName());
+    setDisplayName(original.getDisplayName());
   }
 
   /* (non-Javadoc)
@@ -140,6 +143,15 @@ public class UWUserDetailsImpl extends User implements UWUserDetails, HasModifia
     return this.fullName;
   }
 
+  public String getDisplayName() {
+    return this.displayName;
+  }
+
+  public UWUserDetailsImpl setDisplayName(String displayName) {
+    this.displayName = displayName;
+    return this;
+  }
+
   public Collection<String> getUddsMembership() {
     return uddsMembership;
   }
@@ -214,6 +226,7 @@ public class UWUserDetailsImpl extends User implements UWUserDetails, HasModifia
     .append("; ");
     sb.append("Source: ").append(getSource()).append("; ");
     sb.append("Emplid: ").append(getIsisEmplid()).append("; ");
+    sb.append("DisplayName: ").append(getDisplayName()).append("; ");
     sb.append("Custom Logout Url: ").append(getCustomLogoutUrl());
     
     return sb.toString();
@@ -271,6 +284,7 @@ public class UWUserDetailsImpl extends User implements UWUserDetails, HasModifia
     if (eppn != null ? !eppn.equals(that.eppn) : that.eppn != null) return false;
     if (pvi != null ? !pvi.equals(that.pvi) : that.pvi != null) return false;
     if (fullName != null ? !fullName.equals(that.fullName) : that.fullName != null) return false;
+    if (displayName != null ? !displayName.equals(that.displayName) : that.displayName != null) return false;
     if (uddsMembership != null ? !uddsMembership.equals(that.uddsMembership) : that.uddsMembership != null)
       return false;
     if (emailAddress != null ? !emailAddress.equals(that.emailAddress) : that.emailAddress != null)
@@ -292,6 +306,7 @@ public class UWUserDetailsImpl extends User implements UWUserDetails, HasModifia
     result = 31 * result + (eppn != null ? eppn.hashCode() : 0);
     result = 31 * result + (pvi != null ? pvi.hashCode() : 0);
     result = 31 * result + (fullName != null ? fullName.hashCode() : 0);
+    result = 31 * result + (displayName != null ? displayName.hashCode() : 0);
     result = 31 * result + (uddsMembership != null ? uddsMembership.hashCode() : 0);
     result = 31 * result + (emailAddress != null ? emailAddress.hashCode() : 0);
     result = 31 * result + (source != null ? source.hashCode() : 0);
diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUserDetailsAttributesMapper.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUserDetailsAttributesMapper.java
deleted file mode 100644
index 8e85c680158d83958bd8aa85f0dfa949708ee9b1..0000000000000000000000000000000000000000
--- a/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUserDetailsAttributesMapper.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/**
- * 
- */
-package edu.wisc.uwss.local;
-
-import edu.wisc.uwss.UWUserDetails;
-import edu.wisc.uwss.UWUserDetailsImpl;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Interface providing a mechanism to bind a row from the local users properties
- * file to a {@link UWUserDetails} instance.
- *
- * This interface is used during application initialization - not during
- * authentication attempts. Since it is executed during Spring ApplicationContext initialization,
- * implementations should avoid injecting other service or dao interfaces, as it may be
- * affected by a race condition.
- *
- * If you have custom {@link UWUserDetails} that depend on services/daos to complete the model,
- * you may want to consider implementing a {@link LocalUsersAuthenticationAttemptCallback}; that interface
- * participates in the authentication attempt itself, not during application initialization.
- *
- * @deprecated use {@link LocalUserDetailsLoader} instead, to be removed in 2.0
- * @author Nicholas Blair
- */
-@Deprecated
-public interface LocalUserDetailsAttributesMapper {
-
-  /**
-   * Map a list of attributes to a {@link UWUserDetails}.
-   * 
-   * @param username the value to use from {@link UWUserDetails#getUsername()} 
-   * @param row the values from a row in the properties file, in order
-   * @return a {@link UWUserDetails} instance (never null)
-   * @throws IllegalArgumentException if the row is malformed
-   */
-  UWUserDetails mapUser(String username, String [] row);
-
-  /**
-   * Default {@link LocalUserDetailsAttributesMapper} implementation.
-   * 
-   * @author Nicholas Blair
-   */
-  public static class Default implements LocalUserDetailsAttributesMapper {
-
-    private static final Logger logger = LoggerFactory.getLogger(LocalUserDetailsAttributesMapper.class);
-
-    /**
-     * {@inheritDoc}
-     * 
-     * The format of the properties is as follows (key=value):
-     * <pre>
-     * username=password,fullName,firstName,lastName,emailAddress[,membership1,[membership2...]]
-     * </pre>
-     * 
-     * Membership can be 1 or more UDDS values, comma separated.
-     */
-    @Override
-    public UWUserDetails mapUser(String username, String[] values) {
-      if (values.length > 6) {
-        String[] uddsValues = Arrays.copyOfRange(values, 6, values.length);
-        List<String> membership = new ArrayList<>();
-        Collections.addAll(membership, uddsValues);
-        // pvi, username, password, email,
-        return new UWUserDetailsImpl(values[1], username, values[0], values[2], values[5], membership)
-                .setFirstName(values[3])
-                .setLastName(values[4]);
-      } else if (values.length == 6) {
-        // String pvi, String username, String password, String fullName, String emailAddress
-        return new UWUserDetailsImpl(values[1], username, values[0], values[2], values[5])
-                .setFirstName(values[3])
-                .setLastName(values[4]);
-      }
-      return mapUserDeprecatedFormat(username, values);
-
-    }
-
-    @Deprecated
-    UWUserDetails mapUserDeprecatedFormat(String username, String[] values) {
-      if (values.length == 5) {
-        logger.warn("Mapping deprecated in UWSS 1.2. Expected: username=password,fullName,firstName,lastName,emailAddress[,membership1,[membership2...]]");
-        List<String> membership = new ArrayList<>();
-        membership.add(values[4]);
-        return new UWUserDetailsImpl(values[1], username, values[0], values[2], values[3], membership);
-      } else {
-        //length must equal 4
-        logger.warn("Mapping deprecated in UWSS 1.2. Expected: username=password,fullName,firstName,lastName,emailAddress[,membership1,[membership2...]]");
-        return new UWUserDetailsImpl(values[1], username, values[0], values[2], values[3]);
-      }
-    }
-  }
-}
diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUserDetailsManagerImpl.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUserDetailsManagerImpl.java
index 3e3683bbcec55c4d7a0f7ba6c7a65487353d84ed..03d4c41a241a4e6d569218bc30de0a6001d8d950 100644
--- a/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUserDetailsManagerImpl.java
+++ b/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUserDetailsManagerImpl.java
@@ -46,26 +46,15 @@ public class LocalUserDetailsManagerImpl implements UserDetailsManager {
   @Autowired(required=false)
   private List<LocalUsersAuthenticationAttemptCallback> callbacks = new ArrayList<>();
   @Autowired(required=false)
-  private LocalUserDetailsAttributesMapper localUserDetailsAttributeMapper = new LocalUserDetailsAttributesMapper.Default();
-  @Autowired(required=false)
   private LocalUserDetailsLoader localUserDetailsLoader = new LocalUserDetailsLoader.Default();
   @Value("#{environment['edu.wisc.uwss.local.userDetailsLoader.resource'] ?: 'classpath:/edu/wisc/uwss/local/local-users.json' }")
   private Resource localUserResource;
-  @Value("#{environment['edu.wisc.uwss.local.userDetailsLoader.enabled'] ?: false }")
+  @Value("#{environment['edu.wisc.uwss.local.userDetailsLoader.enabled'] ?: true }")
   private boolean loaderEnabled;
 
   private Properties properties = new Properties();
 
-  /**
-   * Visible for testing.
-   *
-   * @param loaderEnabled whether or not to enable the {@link LocalUserDetailsLoader}
-   * @return a reference to this instance
-   */
-  LocalUserDetailsManagerImpl setLoaderEnabled(boolean loaderEnabled) {
-    this.loaderEnabled = loaderEnabled;
-    return this;
-  }
+
   /**
    * Visible for testing.
    *
@@ -91,33 +80,12 @@ public class LocalUserDetailsManagerImpl implements UserDetailsManager {
    */
   @PostConstruct
   public void init() {
-    if(loaderEnabled) {
       logger.debug("LocalUserDetailsLoader of type {} enabled, processing resource {}", localUserDetailsLoader.getClass(), localUserResource);
       List<UWUserDetails> users = localUserDetailsLoader.loadUsers(localUserResource);
       for(UWUserDetails u : users) {
         addDemoUser(u);
       }
-    } else {
-      logger.debug("LocalUserDetailsAttributesMapper of type {} enabled, processing properties file of size {}", localUserDetailsAttributeMapper.getClass(), properties.size());
-      for (Entry<Object, Object> entry : properties.entrySet()) {
-        String[] values = ((String) entry.getValue()).split(",");
-        String username = (String) entry.getKey();
-
-        final UWUserDetails user = localUserDetailsAttributeMapper.mapUser(username, values);
-        addDemoUser(user);
-      }
-    }
-  }
-  /**
-   * Populate the internal map of {@link UWUserDetailsImpl} via the entries in the
-   * injected {@link Properties}.
-   * 
-   * @see LocalUserDetailsAttributesMapper
-   * @param properties
-   */
-  @Autowired
-  public void setDemoUsers(@Qualifier("demo-users") Properties properties) {
-   this.properties = properties;
+
   }
 
   /**
diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUsersAuthenticationAttemptCallback.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUsersAuthenticationAttemptCallback.java
index f862109e514a70df950f2ec50cf246bc3486d209..8ed1aa56ddabb2445f8c7e6b2d144a9e5c1a4c59 100644
--- a/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUsersAuthenticationAttemptCallback.java
+++ b/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUsersAuthenticationAttemptCallback.java
@@ -24,7 +24,7 @@ import edu.wisc.uwss.UWUserDetails;
  * if you need a particular order of execution.
  *
  * If instead you need to modify {@link UWUserDetails} instances during application initialization only,
- * see {@link LocalUserDetailsAttributesMapper}.
+ * see {@link LocalUserDetailsLoader}.
  *
  * @author Nicholas Blair
  */
diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUsersUdsPersonServiceImpl.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUsersUdsPersonServiceImpl.java
index a499be1f21ce3247f6ce693091b906f9d5cb3dca..66e6d903aedff90310c2c9f92c70222fae727194 100644
--- a/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUsersUdsPersonServiceImpl.java
+++ b/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUsersUdsPersonServiceImpl.java
@@ -12,15 +12,15 @@ import org.springframework.context.annotation.Profile;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
 
-import edu.wisc.services.uds.person.v1_1.Appointment;
-import edu.wisc.services.uds.person.v1_1.Appointments;
-import edu.wisc.services.uds.person.v1_1.Demographic;
-import edu.wisc.services.uds.person.v1_1.Employee;
-import edu.wisc.services.uds.person.v1_1.Identifier;
-import edu.wisc.services.uds.person.v1_1.Identifiers;
-import edu.wisc.services.uds.person.v1_1.Name;
-import edu.wisc.services.uds.person.v1_1.Person;
-import edu.wisc.services.uds.person.v1_1.UDDS;
+import edu.wisc.uds.person.Appointment;
+import edu.wisc.uds.person.Appointments;
+import edu.wisc.uds.person.Demographic;
+import edu.wisc.uds.person.Employee;
+import edu.wisc.uds.person.Identifier;
+import edu.wisc.uds.person.Identifiers;
+import edu.wisc.uds.person.Name;
+import edu.wisc.uds.person.Person;
+import edu.wisc.uds.person.UDDS;
 import edu.wisc.uds.UdsPersonService;
 import edu.wisc.uwss.UWUserDetails;
 
@@ -37,7 +37,7 @@ public class LocalUsersUdsPersonServiceImpl implements UdsPersonService {
   @Autowired
   private UserDetailsService userDetailsService;
   /* (non-Javadoc)
-   * @see edu.wisc.uds.UdsPersonService#getPerson(edu.wisc.services.uds.person.v1_1.Identifiers)
+   * @see edu.wisc.uds.UdsPersonService#getPerson(edu.wisc.uds.person.Identifiers)
    */
   @Override
   public Person getPerson(Identifiers identifiers) {
diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/preauth/PreauthenticatedUserDetailsAttributeMapper.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/preauth/PreauthenticatedUserDetailsAttributeMapper.java
index 5f49a42c5fb9785904ef1177a7af7b706f5034f9..ef6a2f314f6facc910f55f48ec8068035983910b 100644
--- a/uw-spring-security-core/src/main/java/edu/wisc/uwss/preauth/PreauthenticatedUserDetailsAttributeMapper.java
+++ b/uw-spring-security-core/src/main/java/edu/wisc/uwss/preauth/PreauthenticatedUserDetailsAttributeMapper.java
@@ -56,6 +56,7 @@ public interface PreauthenticatedUserDetailsAttributeMapper {
     private String uddsHeader = "wisceduudds";
     private String emailAddressHeader = "mail";
     private String firstNameHeader = "givenName";
+    private String displayNameHeader = "displayName";
     private String lastNameHeader = "sn";
     private String isisEmplidHeader = "wisceduisisemplid";
     private String identityProviderHeader = "Shib-Identity-Provider";
@@ -85,6 +86,7 @@ public interface PreauthenticatedUserDetailsAttributeMapper {
       String emplid = request.getHeader(isisEmplidHeader);
       Collection<String> uddsMembership = safeGetHeaders(request, uddsHeader);
       String email = request.getHeader(emailAddressHeader);
+      String displayName = request.getHeader(displayNameHeader);
 
       Collection<String> manifestGroups = new ArrayList<>();
       String manifestValue = request.getHeader(manifestHeader);
@@ -105,6 +107,7 @@ public interface PreauthenticatedUserDetailsAttributeMapper {
       result.setLastName(request.getHeader(lastNameHeader));
       String identityProvider = request.getHeader(identityProviderHeader);
       result.setCustomLogoutUrl(toCustomLogoutUrl(identityProvider));
+      result.setDisplayName(displayName);
       
       logger.debug("mapUser constructed {} from headers in request", result);
       return result;
@@ -221,6 +224,17 @@ public interface PreauthenticatedUserDetailsAttributeMapper {
     public void setFullNameHeader(String fullNameHeader) {
       this.fullNameHeader = fullNameHeader;
     }
+    /**
+     *
+     * @return the displayNameHeader
+     */
+    public String getDisplayNameHeader() { return displayNameHeader; }
+    /**
+     *
+     * @param displayNameHeader the displayNameHeader to set
+     */
+    @Value("${preauth.displayNameHeader:displayName")
+    public void setDisplayNameHeader(String displayNameHeader) { this.displayNameHeader = displayNameHeader; }
     /**
      * @return the uddsHeader
      */
diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/IdentifiersBuilder.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/IdentifiersBuilder.java
index d015c2ab0f100d77cf52ebc2bb3b9553d294583a..921aede6fe2f1f77490483634f10913e903ed1bb 100644
--- a/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/IdentifiersBuilder.java
+++ b/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/IdentifiersBuilder.java
@@ -3,8 +3,8 @@ package edu.wisc.uwss.uds;
 import java.util.ArrayList;
 import java.util.List;
 
-import edu.wisc.services.uds.person.v1_1.Identifier;
-import edu.wisc.services.uds.person.v1_1.Identifiers;
+import edu.wisc.uds.person.Identifier;
+import edu.wisc.uds.person.Identifiers;
 
 /**
  * Builder pattern for constructing {@link IdentifiersBuilder}.
diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/IdentifiersFactory.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/IdentifiersFactory.java
index d09a0ccf24a9377c8b0f73cf981480fab175efb1..65f60dcc4201977ce6d9d7b1c22c94b115b46a5f 100644
--- a/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/IdentifiersFactory.java
+++ b/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/IdentifiersFactory.java
@@ -1,6 +1,7 @@
 package edu.wisc.uwss.uds;
 
-import edu.wisc.services.uds.person.v1_1.Identifiers;
+
+import edu.wisc.uds.person.Identifiers;
 
 /**
  * Factory interface for constructing {@link Identifiers} for use with {@link UdsPersonUserDetailsServiceImpl}.
diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/UdsPersonUserDetailsImpl.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/UdsPersonUserDetailsImpl.java
index da5aa1b30d06489bbbd78c66a08bfdd95c202494..41814c3b730d3daaa9c74a09180b57b1476de31e 100644
--- a/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/UdsPersonUserDetailsImpl.java
+++ b/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/UdsPersonUserDetailsImpl.java
@@ -11,13 +11,13 @@ import java.util.Set;
 import org.springframework.security.core.GrantedAuthority;
 import org.springframework.util.Assert;
 
-import edu.wisc.services.uds.person.v1_1.Appointment;
-import edu.wisc.services.uds.person.v1_1.Appointments;
-import edu.wisc.services.uds.person.v1_1.Demographic;
-import edu.wisc.services.uds.person.v1_1.Employee;
-import edu.wisc.services.uds.person.v1_1.Identifier;
-import edu.wisc.services.uds.person.v1_1.Name;
-import edu.wisc.services.uds.person.v1_1.Person;
+import edu.wisc.uds.person.Appointment;
+import edu.wisc.uds.person.Appointments;
+import edu.wisc.uds.person.Demographic;
+import edu.wisc.uds.person.Employee;
+import edu.wisc.uds.person.Identifier;
+import edu.wisc.uds.person.Name;
+import edu.wisc.uds.person.Person;
 import edu.wisc.uwss.UWUserDetails;
 
 /**
@@ -210,7 +210,7 @@ public class UdsPersonUserDetailsImpl implements UWUserDetails {
    * This implementation always returns null.
    * 
    * TODO it may be possible to extract an emplid value from person.getIdentifiers
-   * Example observed: edu.wisc.services.uds.person.v1_1.Identifier@715ef617[source=UWMSNSS, idName=EMPLID, value=000123456]
+   * Example observed: edu.wisc.uds.person.Identifier@715ef617[source=UWMSNSS, idName=EMPLID, value=000123456]
    */
   @Override
   public String getIsisEmplid() {
@@ -238,6 +238,40 @@ public class UdsPersonUserDetailsImpl implements UWUserDetails {
   public String getLastName() {
     return getName() != null ? getName().getLast() : null;
   }
+
+  /**
+   * Construct the Display Name from the preferred name.
+   *
+   * @return displayName value
+   */
+  @Override
+  public String getDisplayName() {
+    if(getName()!=null) {
+      StringBuilder stringBuilder = new StringBuilder();
+
+
+      /**
+       * If the preferred first name is empty, then use the
+       * given name. Shib should already be doing this
+       * for preauthenticated users.
+       */
+      if(getName().getPreferredFirst()!=null) {
+        stringBuilder.append(getName().getPreferredFirst());
+      } else if(getName().getFirst()!=null) {
+        stringBuilder.append(getName().getFirst());
+      }
+
+      if(getName().getLast()!=null) {
+        if(stringBuilder.length()>0) {
+          stringBuilder.append(" ");
+        }
+        stringBuilder.append(getName().getLast());
+      }
+      return stringBuilder.toString();
+    } else {
+      return null;
+    }
+  }
   /**
    * 
    * @return {@link Demographic#getName()}, or null if not available
diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/UdsPersonUserDetailsServiceImpl.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/UdsPersonUserDetailsServiceImpl.java
index 1b152ec735211a4db8a8ea4245fb02428b08cb18..5934c39c69439dbee2743bff4b385b4fafbc317b 100644
--- a/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/UdsPersonUserDetailsServiceImpl.java
+++ b/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/UdsPersonUserDetailsServiceImpl.java
@@ -7,9 +7,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
 
-import edu.wisc.services.uds.person.v1_1.Identifier;
-import edu.wisc.services.uds.person.v1_1.Identifiers;
-import edu.wisc.services.uds.person.v1_1.Person;
+import edu.wisc.uds.person.Identifier;
+import edu.wisc.uds.person.Identifiers;
+import edu.wisc.uds.person.Person;
 import edu.wisc.uds.UdsPersonService;
 import edu.wisc.uwss.UWUserDetails;
 
diff --git a/uw-spring-security-core/src/main/resources/edu/wisc/uwss/local/local-users.properties b/uw-spring-security-core/src/main/resources/edu/wisc/uwss/local/local-users.properties
deleted file mode 100644
index 8df9dbe5f6514be10e820fcf4da4ab85b10a9e21..0000000000000000000000000000000000000000
--- a/uw-spring-security-core/src/main/resources/edu/wisc/uwss/local/local-users.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-admin=admin,UW000A000,Amy Administrator,Amy,Administrator,amy.administrator@demo.wisc.edu,A535900
-jane=jane,UW000A001,Jane Doe,Jane,Doe,jane.doe@demo.wisc.edu,A535005
-john=john,UW000A002,John Doe,John,Doe,john.doe@demo.wisc.edu,A535005
-jim=jim,UW000A003,Jim Doe,Jim,Doe,jim.doe@demo.wisc.edu
\ No newline at end of file
diff --git a/uw-spring-security-core/src/test/java/edu/wisc/uwss/local/LocalUserDetailsManagerImplTest.java b/uw-spring-security-core/src/test/java/edu/wisc/uwss/local/LocalUserDetailsManagerImplTest.java
index 4a4c9721e9fb0c4e74bf1b040d634f11e3c261bc..c7b07a4e43f2cd2fde603d429469b277518b8a65 100644
--- a/uw-spring-security-core/src/test/java/edu/wisc/uwss/local/LocalUserDetailsManagerImplTest.java
+++ b/uw-spring-security-core/src/test/java/edu/wisc/uwss/local/LocalUserDetailsManagerImplTest.java
@@ -65,11 +65,8 @@ public class LocalUserDetailsManagerImplTest {
    */
   @Test
   public void init_demoUsers_control() throws IOException {
-      Properties properties = new Properties();
-      properties.load(new ClassPathResource("edu/wisc/uwss/local/local-users.properties").getInputStream());
-      
       LocalUserDetailsManagerImpl service = new LocalUserDetailsManagerImpl();
-      service.setDemoUsers(properties);
+      service.setLocalUserResource(new ClassPathResource("test-users.yaml"));
       service.init();
       
       UWUserDetails userDetails = service.loadUserByUsername("admin");
@@ -80,92 +77,29 @@ public class LocalUserDetailsManagerImplTest {
       UWUserDetails jane = service.loadUserByUsername("jane");
       assertEquals("UW000A001", jane.getPvi());
       assertEquals("Jane Doe", jane.getFullName());
-     
+      assertEquals("Loretta Doe", jane.getDisplayName());
+
       UWUserDetails john = service.loadUserByUsername("john");
-      assertEquals("UW000A002", john.getPvi());
+      assertEquals("UW000A004", john.getPvi());
       assertEquals("John Doe", john.getFullName());
+      assertEquals("Jack Doe", john.getDisplayName());
 
       assertTrue(john.getUddsMembership().contains("A535005"));
   }
-  /**
-   * Confirm that {@link LocalUserDetailsManagerImpl} with {@link LocalUserDetailsManagerImpl#setLoaderEnabled(boolean)}
-   * of true results in equivalent {@link UWUserDetails} instances being loaded from JSON.
-   *
-   * Note: As of 1.5.x, this test passes, but potentially should not, as the {@link UWUserDetails}
-   * provided by the default {@link LocalUserDetailsAttributesMapper} do not have any
-   * {@link GrantedAuthority}, where the {@link UWUserDetails} provided by the
-   * {@link LocalUserDetailsLoader} do. See https://git.doit.wisc.edu/adi-ia/uw-spring-security/issues/5.
-   *
-   * @throws IOException
-   */
-  @Test
-  public void init_compare_default_loader_vs_attributesmapper() throws IOException {
-    Properties properties = new Properties();
-    properties.load(new ClassPathResource("edu/wisc/uwss/local/local-users.properties").getInputStream());
-
-    LocalUserDetailsManagerImpl withAttributesMapper = new LocalUserDetailsManagerImpl();
-    withAttributesMapper.setDemoUsers(properties);
-    withAttributesMapper.init();
-
-    LocalUserDetailsManagerImpl withLoader = new LocalUserDetailsManagerImpl()
-            .setLocalUserResource(new ClassPathResource("edu/wisc/uwss/local/local-users.json"))
-            .setLoaderEnabled(true);
-    withLoader.init();
-
-    assertEquals(withAttributesMapper.getUserCount(), withLoader.getUserCount());
-    assertEquals(withAttributesMapper.loadUserByUsername("admin"), withLoader.loadUserByUsername("admin"));
-    assertEquals(withAttributesMapper.loadUserByUsername("jane"), withLoader.loadUserByUsername("jane"));
-    assertEquals(withAttributesMapper.loadUserByUsername("john"), withLoader.loadUserByUsername("john"));
-    assertEquals(withAttributesMapper.loadUserByUsername("jim"), withLoader.loadUserByUsername("jim"));
-
-  }
-  /**
-   * Confirm that {@link LocalUserDetailsManagerImpl} with {@link LocalUserDetailsManagerImpl#setLoaderEnabled(boolean)}
-   * of true results in equivalent {@link UWUserDetails} instances being loaded from YAML.
-   *
-   * Note: As of 1.5.x, this test passes, but potentially should not, as the {@link UWUserDetails}
-   * provided by the default {@link LocalUserDetailsAttributesMapper} do not have any
-   * {@link GrantedAuthority}, where the {@link UWUserDetails} provided by the
-   * {@link LocalUserDetailsLoader} do. See https://git.doit.wisc.edu/adi-ia/uw-spring-security/issues/5.
-   *
-   * @throws IOException
-   */
-  @Test
-  public void init_compare_yaml_loader_vs_attributesmapper() throws IOException {
-    Properties properties = new Properties();
-    properties.load(new ClassPathResource("edu/wisc/uwss/local/local-users.properties").getInputStream());
-
-    LocalUserDetailsManagerImpl withAttributesMapper = new LocalUserDetailsManagerImpl();
-    withAttributesMapper.setDemoUsers(properties);
-    withAttributesMapper.init();
-
-    LocalUserDetailsManagerImpl withLoader = new LocalUserDetailsManagerImpl()
-            .setLocalUserResource(new ClassPathResource("edu/wisc/uwss/local/local-users.yaml"))
-            .setLoaderEnabled(true);
-    withLoader.init();
 
-    assertEquals(withAttributesMapper.getUserCount(), withLoader.getUserCount());
-    assertEquals(withAttributesMapper.loadUserByUsername("admin"), withLoader.loadUserByUsername("admin"));
-    assertEquals(withAttributesMapper.loadUserByUsername("jane"), withLoader.loadUserByUsername("jane"));
-    assertEquals(withAttributesMapper.loadUserByUsername("john"), withLoader.loadUserByUsername("john"));
-    assertEquals(withAttributesMapper.loadUserByUsername("jim"), withLoader.loadUserByUsername("jim"));
-  }
   /**
    * Set up a properties instance including a user with a single UDDS.
    * Verify that value properly set in {@link UWUserDetails#getUddsMembership()}.
    */
   @Test
   public void init_demoUsers_with_no_udds_and_no_control() {
-      Properties properties = new Properties();
-      properties.put("test", "test,UW000A000,Nothing,Nothing,,foo@foo.wisc.edu");
-      
       LocalUserDetailsManagerImpl service = new LocalUserDetailsManagerImpl();
-      service.setDemoUsers(properties);
+      service.setLocalUserResource(new ClassPathResource("test-users.yaml"));
       service.init();
       
-      UWUserDetails userDetails = service.loadUserByUsername("test");
+      UWUserDetails userDetails = service.loadUserByUsername("testnoudds");
       assertNotNull(userDetails);
-      assertEquals("UW000A000", userDetails.getPvi());
+      assertEquals("UW000A003", userDetails.getPvi());
       assertEquals("Nothing", userDetails.getFullName());
       assertTrue(userDetails.getUddsMembership().isEmpty());
   }
@@ -175,18 +109,15 @@ public class LocalUserDetailsManagerImplTest {
    */
   @Test
   public void init_demoUsers_with_single_udds() {
-      Properties properties = new Properties();
-      properties.put("test", "test,UW000A000,Single UDDS,Single,UDDS,foo@foo.wisc.edu,A061234");
-      
       LocalUserDetailsManagerImpl service = new LocalUserDetailsManagerImpl();
-      service.setDemoUsers(properties);
+      service.setLocalUserResource(new ClassPathResource("test-users.yaml"));
       service.init();
       
-      UWUserDetails userDetails = service.loadUserByUsername("test");
+      UWUserDetails userDetails = service.loadUserByUsername("testsingleudds");
       assertNotNull(userDetails);
-      assertEquals("UW000A000", userDetails.getPvi());
-      assertEquals("Single UDDS", ((UWUserDetails) userDetails).getFullName());
-      assertTrue(((UWUserDetails) userDetails).getUddsMembership().contains("A061234"));
+      assertEquals("UW000A002", userDetails.getPvi());
+      assertEquals("Single UDDS", userDetails.getFullName());
+      assertTrue(userDetails.getUddsMembership().contains("A535005"));
   }
   /**
    * Set up a properties instance including a user with multiple UDDS values.
@@ -194,19 +125,16 @@ public class LocalUserDetailsManagerImplTest {
    */
   @Test
   public void setDemoUsers_with_multiple_udds() {
-      Properties properties = new Properties();
-      properties.put("test", "test,UW000A000,Multiple UDDS,Multiple,UDDS,foo@foo.wisc.edu,A061234,A061235,A061236");
-      
       LocalUserDetailsManagerImpl service = new LocalUserDetailsManagerImpl();
-      service.setDemoUsers(properties);
+      service.setLocalUserResource(new ClassPathResource("test-users.yaml"));
       service.init();
       
-      UWUserDetails userDetails = service.loadUserByUsername("test");
+      UWUserDetails userDetails = service.loadUserByUsername("testmultiudds");
       assertNotNull(userDetails);
-      assertEquals("UW000A000", userDetails.getPvi());
+      assertEquals("UW000B003", userDetails.getPvi());
       assertEquals("Multiple UDDS", userDetails.getFullName());
-      assertTrue(userDetails.getUddsMembership().contains("A061234"));
-      assertTrue(userDetails.getUddsMembership().contains("A061235"));
+      assertTrue(userDetails.getUddsMembership().contains("A535005"));
+      assertTrue(userDetails.getUddsMembership().contains("A535900"));
       assertTrue(userDetails.getUddsMembership().contains("A061236"));
   }
   
@@ -368,13 +296,13 @@ public class LocalUserDetailsManagerImplTest {
 
   @Test
   public void unsupportedFormatWithUDDS() {
-    LocalUserDetailsAttributesMapper attributesMapper = new LocalUserDetailsAttributesMapper.Default();
+    LocalUserDetailsLoader attributesMapper = new LocalUserDetailsLoader.Default();
+    List<UWUserDetails> users = attributesMapper.loadUsers(new ClassPathResource("test-users.json"));
+
     //demo STAR user with UDDS:
-    String row = "aalpaca,UW123D455,Amy Alpaca,amy.alpaca@demo.wisc.edu,A064079";
-    String[] values = row.split(",");
     String username = "aalpaca";
 
-    UWUserDetails uwUserDetails = attributesMapper.mapUser(username, values);
+    UWUserDetails uwUserDetails = users.get(0);
     assertEquals(username, uwUserDetails.getUsername());
     assertEquals("aalpaca", uwUserDetails.getPassword());
     assertEquals("UW123D455", uwUserDetails.getPvi());
@@ -386,13 +314,12 @@ public class LocalUserDetailsManagerImplTest {
 
   @Test
   public void unsupportedFormatWithoutUDDS() {
-    LocalUserDetailsAttributesMapper attributesMapper = new LocalUserDetailsAttributesMapper.Default();
+    LocalUserDetailsLoader attributesMapper = new LocalUserDetailsLoader.Default();
+    List<UWUserDetails> users = attributesMapper.loadUsers(new ClassPathResource("test-users.json"));
     //demo STAR user without UDDS:
-    String row = "jim,UW000A003,Jim Doe,jim.doe@demo.wisc.edu";
-    String[] values = row.split(",");
-    String username = "aalpaca";
+    String username = "jim";
 
-    UWUserDetails uwUserDetails = attributesMapper.mapUser(username, values);
+    UWUserDetails uwUserDetails = users.get(1);
     assertEquals(username, uwUserDetails.getUsername());
     assertEquals("jim", uwUserDetails.getPassword());
     assertEquals("UW000A003", uwUserDetails.getPvi());
diff --git a/uw-spring-security-core/src/test/java/edu/wisc/uwss/local/NotHasModifiableSourceUWUserDetails.java b/uw-spring-security-core/src/test/java/edu/wisc/uwss/local/NotHasModifiableSourceUWUserDetails.java
index 9f71f6a1689acb762ef29cc4462590cd5de57c98..9a11b70b51b4de7e5bab4f1c7844b8c49b4ec832 100644
--- a/uw-spring-security-core/src/test/java/edu/wisc/uwss/local/NotHasModifiableSourceUWUserDetails.java
+++ b/uw-spring-security-core/src/test/java/edu/wisc/uwss/local/NotHasModifiableSourceUWUserDetails.java
@@ -63,6 +63,9 @@ final class NotHasModifiableSourceUWUserDetails implements UWUserDetails {
   @Override
   public String getFullName() { return null; }
 
+  @Override
+  public String getDisplayName() { return null; }
+
   @Override
   public String getFirstName() { return null; }
 
diff --git a/uw-spring-security-core/src/test/java/edu/wisc/uwss/preauth/PreauthenticatedUserDetailsAttributeMapperTest.java b/uw-spring-security-core/src/test/java/edu/wisc/uwss/preauth/PreauthenticatedUserDetailsAttributeMapperTest.java
index 08aa10d075b1e826bd36c1e31391f0509cb9fe29..1ff6f2bf1652b77391b1eeddb3e78b46decdb366 100644
--- a/uw-spring-security-core/src/test/java/edu/wisc/uwss/preauth/PreauthenticatedUserDetailsAttributeMapperTest.java
+++ b/uw-spring-security-core/src/test/java/edu/wisc/uwss/preauth/PreauthenticatedUserDetailsAttributeMapperTest.java
@@ -185,6 +185,7 @@ public class PreauthenticatedUserDetailsAttributeMapperTest {
     request.addHeader("wiscedupvi", "1234567");
     request.addHeader("uid", "somebody");
     request.addHeader("cn", "some body");
+    request.addHeader("displayName", "some one");
     request.addHeader("mail", "some.body@wisc.edu");
     request.addHeader("wisceduisisemplid", "0000123456");
     request.addHeader("Shib-Identity-Provider", "https://logintest.wisc.edu/idp/shibboleth");
@@ -200,6 +201,7 @@ public class PreauthenticatedUserDetailsAttributeMapperTest {
     assertEquals("somebody@wisc.edu", result.getEppn());
     assertEquals("1234567", result.getPvi());
     assertEquals("some body", result.getFullName());
+    assertEquals("some one", result.getDisplayName());
     assertEquals("some.body@wisc.edu", result.getEmailAddress());
     assertEquals("0000123456", result.getIsisEmplid());
     assertEquals("/Shibboleth.sso/Logout?return=https://logintest.wisc.edu/logout/", result.getCustomLogoutUrl());
diff --git a/uw-spring-security-core/src/test/java/edu/wisc/uwss/preauth/UWUserDetailsAuthenticationFilterTest.java b/uw-spring-security-core/src/test/java/edu/wisc/uwss/preauth/UWUserDetailsAuthenticationFilterTest.java
index 324dbd62b36d611007b61fd30bebcab4565e3aac..5ce695073521fe312539b21572c67c449644afac 100644
--- a/uw-spring-security-core/src/test/java/edu/wisc/uwss/preauth/UWUserDetailsAuthenticationFilterTest.java
+++ b/uw-spring-security-core/src/test/java/edu/wisc/uwss/preauth/UWUserDetailsAuthenticationFilterTest.java
@@ -36,6 +36,7 @@ public class UWUserDetailsAuthenticationFilterTest {
     when(request.getHeader("uid")).thenReturn("bbadger");
 		when(request.getHeader("eppn")).thenReturn("bbadger@wisc.edu");
 		when(request.getHeader("cn")).thenReturn("Bucky Badger");
+		when(request.getHeader("displayName")).thenReturn("Buckingham Badger");
 		when(request.getHeaders("wisceduudds")).thenReturn(Collections.enumeration(Arrays.asList("A061234")));
 		when(request.getHeader("mail")).thenReturn("foo@foo.wisc.edu");
     when(request.getHeader("isMemberOf")).thenReturn("somegroup");
@@ -43,6 +44,7 @@ public class UWUserDetailsAuthenticationFilterTest {
 		assertEquals("bbadger", userDetails.getUsername());
 		assertEquals("bbadger@wisc.edu", userDetails.getEppn());
 		assertEquals("Bucky Badger", userDetails.getFullName());
+		assertEquals("Buckingham Badger", userDetails.getDisplayName());
 		assertEquals("foo@foo.wisc.edu", userDetails.getEmailAddress());
 		assertEquals(1, userDetails.getUddsMembership().size());
 		assertEquals("A061234", userDetails.getUddsMembership().iterator().next());
@@ -59,10 +61,12 @@ public class UWUserDetailsAuthenticationFilterTest {
 		HttpServletRequest request = mock(HttpServletRequest.class);
 		
 		when(request.getHeader("uid")).thenReturn("bbadger");
+		when(request.getHeader("displayName")).thenReturn("Buckingham Badger");
 		when(request.getHeader("cn")).thenReturn("Bucky Badger");
 		UWUserDetails userDetails = filter.getPreAuthenticatedPrincipal(request);
 		assertEquals("bbadger", userDetails.getUsername());
 		assertEquals("Bucky Badger", userDetails.getFullName());
+		assertEquals("Buckingham Badger", userDetails.getDisplayName());
 		assertTrue(userDetails.getUddsMembership().isEmpty());
 	}
   /**
@@ -76,10 +80,12 @@ public class UWUserDetailsAuthenticationFilterTest {
     HttpServletRequest request = mock(HttpServletRequest.class);
 
     when(request.getHeader("uid")).thenReturn("bbadger");
-    when(request.getHeader("cn")).thenReturn("Bucky Badger");
+	  when(request.getHeader("displayName")).thenReturn("Buckingham Badger");
+	  when(request.getHeader("cn")).thenReturn("Bucky Badger");
     UWUserDetails userDetails = filter.getPreAuthenticatedPrincipal(request);
     assertEquals("bbadger", userDetails.getUsername());
-    assertEquals("Bucky Badger", userDetails.getFullName());
+	  assertEquals("Bucky Badger", userDetails.getFullName());
+	  assertEquals("Buckingham Badger", userDetails.getDisplayName());
     assertTrue(userDetails.getAuthorities().isEmpty());
   }
   /**
diff --git a/uw-spring-security-core/src/test/java/edu/wisc/uwss/uds/IdentifiersBuilderTest.java b/uw-spring-security-core/src/test/java/edu/wisc/uwss/uds/IdentifiersBuilderTest.java
index fc4a782707a8a2b38ae1d7f8d407cccaaf2a0f3c..8963a04ee11661e1d49ba48cc329affdc61af0be 100644
--- a/uw-spring-security-core/src/test/java/edu/wisc/uwss/uds/IdentifiersBuilderTest.java
+++ b/uw-spring-security-core/src/test/java/edu/wisc/uwss/uds/IdentifiersBuilderTest.java
@@ -2,8 +2,8 @@ package edu.wisc.uwss.uds;
 
 import org.junit.Test;
 
-import edu.wisc.services.uds.person.v1_1.Identifier;
-import edu.wisc.services.uds.person.v1_1.Identifiers;
+import edu.wisc.uds.person.Identifier;
+import edu.wisc.uds.person.Identifiers;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
diff --git a/uw-spring-security-core/src/test/java/edu/wisc/uwss/uds/UdsPersonUserDetailsImplTest.java b/uw-spring-security-core/src/test/java/edu/wisc/uwss/uds/UdsPersonUserDetailsImplTest.java
index 9397790a0aa4263628e8cc56a7a48aa6a091a094..c949209aa6642bc8ff3361f482b475c29e5145a2 100644
--- a/uw-spring-security-core/src/test/java/edu/wisc/uwss/uds/UdsPersonUserDetailsImplTest.java
+++ b/uw-spring-security-core/src/test/java/edu/wisc/uwss/uds/UdsPersonUserDetailsImplTest.java
@@ -9,11 +9,11 @@ import java.util.Collections;
 
 import org.junit.Test;
 
-import edu.wisc.services.uds.person.v1_1.Demographic;
-import edu.wisc.services.uds.person.v1_1.Identifier;
-import edu.wisc.services.uds.person.v1_1.Identifiers;
-import edu.wisc.services.uds.person.v1_1.Name;
-import edu.wisc.services.uds.person.v1_1.Person;
+import edu.wisc.uds.person.Demographic;
+import edu.wisc.uds.person.Identifier;
+import edu.wisc.uds.person.Identifiers;
+import edu.wisc.uds.person.Name;
+import edu.wisc.uds.person.Person;
 
 /**
  * Tests for {@link UdsPersonUserDetailsImpl}
@@ -43,6 +43,7 @@ public class UdsPersonUserDetailsImplTest {
     assertNull(userDetails.getCustomLogoutUrl());
     assertNull(userDetails.getEmailAddress());
     assertNull(userDetails.getFullName());
+    assertNull(userDetails.getDisplayName());
     assertNull(userDetails.getPassword());
     assertNull(userDetails.getPvi());
     assertEquals(UdsPersonUserDetailsImpl.USER_DETAILS_SOURCE, userDetails.getSource());
@@ -138,5 +139,21 @@ public class UdsPersonUserDetailsImplTest {
 
     assertEquals(pvi, new UdsPersonUserDetailsImpl(person).getPvi());
   }
+  /**
+   * Confirm successfully retrieve {@link UdsPersonUserDetailsImpl#getDisplayName()},
+   * that it uses preferred name, and also overrides the given name.
+   */
+  @Test
+  public void getDisplayName_control() {
+    Person person = new Person();
+    Demographic demographic = new Demographic();
+    Name name = new Name();
+    name.setLast("Badger");
+    name.setFirst("Bucky");
+    name.setPreferredFirst("Buckingham");
+    demographic.setName(name);
+    person.setDemographic(demographic);
+    assertEquals("Buckingham Badger", new UdsPersonUserDetailsImpl(person).getDisplayName());
+  }
 
 }
diff --git a/uw-spring-security-core/src/test/resources/test-users.json b/uw-spring-security-core/src/test/resources/test-users.json
new file mode 100644
index 0000000000000000000000000000000000000000..e9299272e924d389499572976b50084ff5081318
--- /dev/null
+++ b/uw-spring-security-core/src/test/resources/test-users.json
@@ -0,0 +1,24 @@
+[
+  {
+    "username": "aalpaca",
+    "password": "aalpaca",
+    "fullName": "Amy Alpaca",
+    "firstName": "Amy",
+    "lastName": "Alpaca",
+    "emailAddress": "amy.alpaca@demo.wisc.edu",
+    "pvi": "UW123D455",
+    "uddsMembership": [ "A064079" ],
+    "authorities": []
+  },
+  {
+    "username": "jim",
+    "password": "jim",
+    "fullName": "Jim Doe",
+    "firstName": "Jim",
+    "lastName": "Doe",
+    "emailAddress": "jim.doe@demo.wisc.edu",
+    "pvi": "UW000A003",
+    "uddsMembership": [ ],
+    "authorities": []
+  }
+]
\ No newline at end of file
diff --git a/uw-spring-security-core/src/test/resources/test-users.yaml b/uw-spring-security-core/src/test/resources/test-users.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..df94f2e631d4cf0fded22a5c4eea7823fd8665e2
--- /dev/null
+++ b/uw-spring-security-core/src/test/resources/test-users.yaml
@@ -0,0 +1,62 @@
+---
+- pvi: "UW000A000"
+  username: "admin"
+  password: "admin"
+  fullName: "Amy Administrator"
+  emailAddress: "amy.administrator@demo.wisc.edu"
+  uddsMembership:
+  - "A535900"
+  authorities:
+  - "edu.wisc.uwss.local.administrator"
+  firstName: "Amy"
+  lastName: "Administrator"
+- pvi: "UW000A001"
+  username: "jane"
+  password: "jane"
+  fullName: "Jane Doe"
+  displayName: "Loretta Doe"
+  emailAddress: "jane.doe@demo.wisc.edu"
+  uddsMembership:
+  - "A535005"
+  authorities: []
+  firstName: "John"
+  lastName: "Doe"
+- pvi: "UW000A004"
+  username: "john"
+  password: "john"
+  fullName: "John Doe"
+  displayName: "Jack Doe"
+  emailAddress: "john.doe@demo.wisc.edu"
+  uddsMembership:
+  - "A535005"
+  authorities: []
+  firstName: "John"
+  lastName: "Doe"
+- pvi: "UW000A002"
+  username: "testsingleudds"
+  password: "john"
+  fullName: "Single UDDS"
+  emailAddress: "john.doe@demo.wisc.edu"
+  uddsMembership:
+  - "A535005"
+  authorities: []
+  firstName: "John"
+  lastName: "Doe"
+- pvi: "UW000A003"
+  username: "testnoudds"
+  password: "jim123"
+  fullName: "Nothing"
+  emailAddress: "jim.doe@demo.wisc.edu"
+  uddsMembership: []
+  authorities: []
+  firstName: "Jim"
+  lastName: "Doe"
+- pvi: "UW000B003"
+  username: "testmultiudds"
+  password: "udds1"
+  fullName: "Multiple UDDS"
+  emailAddress: "multi.udds@demo.wisc.edu"
+  uddsMembership: ["A535005","A535900","A061236"]
+  authorities: []
+  firstName: "Test"
+  lastName: "Multi"
\ No newline at end of file
diff --git a/uw-spring-security-sample-war/pom.xml b/uw-spring-security-sample-war/pom.xml
index 1acbabda22592cfb2ffcde828c5885d530ce9ca0..44a82e31b2ff71d61dba8cd040235e2bec8dd094 100644
--- a/uw-spring-security-sample-war/pom.xml
+++ b/uw-spring-security-sample-war/pom.xml
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>edu.wisc.uwss</groupId>
 		<artifactId>uw-spring-security</artifactId>
-		<version>1.7.1-SNAPSHOT</version>
+		<version>2.0.0-SNAPSHOT</version>
 	</parent>
 	<artifactId>uw-spring-security-sample-war</artifactId>
 	<name>UW Spring Security Sample War</name>
diff --git a/uw-spring-security-sample-war/src/main/resources/edu/wisc/uwss/configuration/sample-war.properties b/uw-spring-security-sample-war/src/main/resources/edu/wisc/uwss/configuration/sample-war.properties
index 493481b3cc283a20d70c505ca5ef438b9c769ea7..4c6f93553a38c351114ecb8f9ebc5cbce477e80b 100644
--- a/uw-spring-security-sample-war/src/main/resources/edu/wisc/uwss/configuration/sample-war.properties
+++ b/uw-spring-security-sample-war/src/main/resources/edu/wisc/uwss/configuration/sample-war.properties
@@ -1,2 +1 @@
-edu.wisc.uwss.local.userDetailsLoader.enabled=true
 edu.wisc.uwss.local.userDetailsLoader.resource=classpath:/edu/wisc/uwss/local/local-users.yaml
\ No newline at end of file
diff --git a/uw-spring-security-web/pom.xml b/uw-spring-security-web/pom.xml
index b7cff5dd26cc5577855d1f283a1ad5c9e9ca5f5d..4c6eedf84af3bfa43b89c83bf899f636fbef6843 100644
--- a/uw-spring-security-web/pom.xml
+++ b/uw-spring-security-web/pom.xml
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>edu.wisc.uwss</groupId>
 		<artifactId>uw-spring-security</artifactId>
-		<version>1.7.1-SNAPSHOT</version>
+		<version>2.0.0-SNAPSHOT</version>
 	</parent>
 	<artifactId>uw-spring-security-web</artifactId>
 	<name>UW Spring Security Web</name>
diff --git a/uw-spring-security-web/src/main/java/edu/wisc/uwss/web/uwframe/UwframeSession.java b/uw-spring-security-web/src/main/java/edu/wisc/uwss/web/uwframe/UwframeSession.java
index 665f5bacbd4f9783f0d761821c27601a92a715b6..0e61c6e4ae3e9db4ebb465a0923cf461492545ec 100644
--- a/uw-spring-security-web/src/main/java/edu/wisc/uwss/web/uwframe/UwframeSession.java
+++ b/uw-spring-security-web/src/main/java/edu/wisc/uwss/web/uwframe/UwframeSession.java
@@ -60,7 +60,8 @@ public class UwframeSession {
    * @param userDetails
    */
   public UwframeSession(Environment environment, UWUserDetails userDetails) {
-    this(environment, userDetails.getUsername(), userDetails.getFullName(), userDetails.getFirstName(), userDetails.getLastName());
+    this(environment, userDetails.getUsername(), userDetails.getDisplayName()!=null ? userDetails.getDisplayName() : userDetails.getFullName(),
+            userDetails.getFirstName(), userDetails.getLastName());
   }
   /**
    *