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 cc5772f9e9d5a6dc1ba5812a800f82fe8e05c010..da5aa1b30d06489bbbd78c66a08bfdd95c202494 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
@@ -30,6 +30,7 @@ public class UdsPersonUserDetailsImpl implements UWUserDetails {
 
   private static final long serialVersionUID = 2930942419916444606L;
   public static final String NETID_IDNAME = "NETID";
+  public static final String PVI_IDNAME = "PVI";
   public static final String PHOTOID_IDNAME = "PHOTOID";
   public static final String UWMSNSUDS_SOURCE = "UWMSNSUDS";
   public static final String USER_DETAILS_SOURCE = "uds";
@@ -180,22 +181,24 @@ public class UdsPersonUserDetailsImpl implements UWUserDetails {
   
   /**
    * {@inheritDoc}
-   * 
-   * This implementation always returns null.
-   * 
-   * TODO it may be possible to extract a PVI value from person.getIdentifiers
    */
   @Override
   public String getPvi() {
+    if(person.getIdentifiers() == null) {
+      return null;
+    }
+    for(Identifier identifier: person.getIdentifiers().getIdentifiers()) {
+      if(UWMSNSUDS_SOURCE.equals(identifier.getSource()) && PVI_IDNAME.equals(identifier.getIdName())) {
+        return identifier.getValue();
+      }
+    }
     return null;
   }
   
   /**
    * {@inheritDoc}
    * 
-   * This implementation always returns null.
-   * 
-   * TODO it may be possible to extract a EPPN value from person.getIdentifiers
+   * This implementation always returns null; UDS Person does not return EPPN.
    */
   @Override
   public String getEppn() {
@@ -207,6 +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]
    */
   @Override
   public String getIsisEmplid() {
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 036dfa9c10845c76f6386bf871921710db53d068..9397790a0aa4263628e8cc56a7a48aa6a091a094 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
@@ -120,4 +120,23 @@ public class UdsPersonUserDetailsImplTest {
     assertEquals("Badger", new UdsPersonUserDetailsImpl(person).getLastName());
   }
 
+  /**
+   * Confirm successful result for {@link UdsPersonUserDetailsImpl#getPvi()}.
+   */
+  @Test
+  public void getPvi_success() {
+    String pvi = "UW111E111";
+    Identifier identifier = new Identifier();
+    identifier.setSource("UWMSNSUDS");
+    identifier.setIdName("PVI");
+    identifier.setValue(pvi);
+
+    Identifiers identifiers = new Identifiers();
+    identifiers.getIdentifiers().add(identifier);
+    Person person = new Person();
+    person.setIdentifiers(identifiers);
+
+    assertEquals(pvi, new UdsPersonUserDetailsImpl(person).getPvi());
+  }
+
 }