diff --git a/services/agent/internal/server/server.go b/services/agent/internal/server/server.go
index 55e239f..893d4e7 100644
--- a/services/agent/internal/server/server.go
+++ b/services/agent/internal/server/server.go
@@ -11,12 +11,12 @@
 	"crypto/sha512"
 	"crypto/x509"
 	"encoding/base64"
+	"fmt"
 	"io"
 	"net"
 	"os"
 	"path/filepath"
 	"strconv"
-	"sync"
 
 	"v.io/v23"
 	"v.io/v23/context"
@@ -59,10 +59,8 @@
 
 type keymgr struct {
 	path       string
-	principals map[keyHandle]keyData // GUARDED_BY(Mutex)
 	passphrase []byte
 	ctx        *context.T
-	mu         sync.Mutex
 }
 
 // RunAnonymousAgent starts the agent server listening on an
@@ -90,16 +88,16 @@
 	return remote, agentlib.AgentEndpoint(remoteFd), nil
 }
 
-// RunKeyManager starts the key manager server listening on an
-// anonymous unix domain socket. It will persist principals in 'path' using 'passphrase'.
-// Typically only used by the device manager.
-// The returned 'client' is typically passed via cmd.ExtraFiles to a child process.
+// RunKeyManager starts the key manager server listening on an anonymous unix
+// domain socket. It will persist principals in 'path' using 'passphrase'.
+// The returned 'client' is typically passed via cmd.ExtraFiles to a child
+// process.
 func RunKeyManager(ctx *context.T, path string, passphrase []byte) (client *os.File, err error) {
 	if path == "" {
 		return nil, verror.New(errStoragePathRequired, nil)
 	}
 
-	mgr := &keymgr{path: path, passphrase: passphrase, principals: make(map[keyHandle]keyData), ctx: ctx}
+	mgr := &keymgr{path: path, passphrase: passphrase, ctx: ctx}
 
 	if err := os.MkdirAll(filepath.Join(mgr.path, "keys"), 0700); err != nil {
 		return nil, err
@@ -113,12 +111,13 @@
 		return nil, err
 	}
 
-	go mgr.readDMConns(local)
+	go mgr.readConns(local)
 
 	return client, nil
 }
 
-func (a keymgr) readDMConns(conn *net.UnixConn) {
+func (a *keymgr) readConns(conn *net.UnixConn) {
+	cache := make(map[keyHandle]keyData)
 	donech := a.ctx.Done()
 	if donech != nil {
 		go func() {
@@ -144,17 +143,24 @@
 			}
 		}
 		ack()
-		var data *keyData
+		var data keyData
 		if n == len(buf) {
-			data = a.readKey(buf)
+			if cached, ok := cache[buf]; ok {
+				data = cached
+			} else if data, err = a.readKey(buf); err != nil {
+				vlog.Error(err)
+				continue
+			} else {
+				cache[buf] = data
+			}
 		} else if n == 1 {
-			var handle []byte
-			if handle, data, err = a.newKey(buf[0] == 1); err != nil {
+			if buf, data, err = a.newKey(buf[0] == 1); err != nil {
 				vlog.Infof("Error creating key: %v", err)
 				unixfd.CloseUnixAddr(addr)
 				continue
 			}
-			if _, err = conn.Write(handle); err != nil {
+			cache[buf] = data
+			if _, err = conn.Write(buf[:]); err != nil {
 				vlog.Infof("Error sending key handle: %v", err)
 				unixfd.CloseUnixAddr(addr)
 				continue
@@ -164,69 +170,52 @@
 			unixfd.CloseUnixAddr(addr)
 			continue
 		}
-		conn := dial(addr)
-		if data != nil && conn != nil {
-			if err := startAgent(a.ctx, conn, data.w, data.p); err != nil {
-				vlog.Infof("error starting agent: %v", err)
-			}
+		conn, err := dial(addr)
+		if err != nil {
+			vlog.Info(err)
+			continue
+		}
+		if err := startAgent(a.ctx, conn, data.w, data.p); err != nil {
+			vlog.Infof("error starting agent: %v", err)
 		}
 	}
 }
 
-func (a *keymgr) readKey(handle keyHandle) *keyData {
-	a.mu.Lock()
-	cachedData, ok := a.principals[handle]
-	a.mu.Unlock()
-	if ok {
-		return &cachedData
-	}
+func (a *keymgr) readKey(handle keyHandle) (keyData, error) {
+	var nodata keyData
 	filename := base64.URLEncoding.EncodeToString(handle[:])
 	in, err := os.Open(filepath.Join(a.path, "keys", filename))
 	if err != nil {
-		vlog.Errorf("unable to open key file: %v", err)
-		return nil
+		return nodata, fmt.Errorf("unable to open key file: %v", err)
 	}
 	defer in.Close()
 	key, err := vsecurity.LoadPEMKey(in, a.passphrase)
 	if err != nil {
-		vlog.Errorf("unable to load key: %v", err)
-		return nil
+		return nodata, fmt.Errorf("unable to load key in %q: %v", in.Name(), err)
 	}
 	state, err := vsecurity.NewPrincipalStateSerializer(filepath.Join(a.path, "creds", filename))
 	if err != nil {
-		vlog.Errorf("unable to create persisted state serializer: %v", err)
-		return nil
+		return nodata, fmt.Errorf("unable to create persisted state serializer: %v", err)
 	}
 	principal, err := vsecurity.NewPrincipalFromSigner(security.NewInMemoryECDSASigner(key.(*ecdsa.PrivateKey)), state)
 	if err != nil {
-		vlog.Errorf("unable to load principal: %v", err)
-		return nil
+		return nodata, fmt.Errorf("unable to load principal: %v", err)
 	}
-	data := keyData{newWatchers(), principal}
-	a.mu.Lock()
-	cachedData, ok = a.principals[handle]
-	if !ok {
-		a.principals[handle] = data
-		cachedData = data
-	}
-	a.mu.Unlock()
-
-	return &cachedData
+	return keyData{newWatchers(), principal}, nil
 }
 
-func dial(addr net.Addr) *net.UnixConn {
+func dial(addr net.Addr) (*net.UnixConn, error) {
 	fd, err := strconv.ParseInt(addr.String(), 10, 32)
 	if err != nil {
-		vlog.Errorf("Invalid address %v", addr)
-		return nil
+		return nil, fmt.Errorf("invalid address: %v", addr)
 	}
 	file := os.NewFile(uintptr(fd), "client")
 	defer file.Close()
 	conn, err := net.FileConn(file)
 	if err != nil {
-		vlog.Infof("unable to create conn: %v", err)
+		return nil, fmt.Errorf("unable to create conn: %v", err)
 	}
-	return conn.(*net.UnixConn)
+	return conn.(*net.UnixConn), nil
 }
 
 func startAgent(ctx *context.T, conn *net.UnixConn, w *watchers, principal security.Principal) error {
@@ -306,47 +295,46 @@
 	return a.principal.MintDischarge(forCaveat, caveatOnDischarge, additionalCaveatsOnDischarge...)
 }
 
-func (a keymgr) newKey(in_memory bool) (id []byte, data *keyData, err error) {
+func (a *keymgr) newKey(in_memory bool) (keyHandle, keyData, error) {
+	var handle keyHandle
+	var nodata keyData
 	if a.path == "" {
-		return nil, nil, verror.New(errNotMultiKeyMode, nil)
+		return handle, nodata, verror.New(errNotMultiKeyMode, nil)
 	}
 	key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
-	keyHandle, err := keyid(key)
 	if err != nil {
-		return nil, nil, err
+		return handle, nodata, err
+	}
+	if handle, err = keyid(key); err != nil {
+		return handle, nodata, err
 	}
 	signer := security.NewInMemoryECDSASigner(key)
 	var p security.Principal
 	if in_memory {
-		p, err = vsecurity.NewPrincipalFromSigner(signer, nil)
-		if err != nil {
-			return nil, nil, err
+		if p, err = vsecurity.NewPrincipalFromSigner(signer, nil); err != nil {
+			return handle, nodata, err
 		}
 	} else {
-		filename := base64.URLEncoding.EncodeToString(keyHandle[:])
+		filename := base64.URLEncoding.EncodeToString(handle[:])
 		out, err := os.OpenFile(filepath.Join(a.path, "keys", filename), os.O_WRONLY|os.O_CREATE, 0600)
 		if err != nil {
-			return nil, nil, err
+			return handle, nodata, err
 		}
 		defer out.Close()
 		err = vsecurity.SavePEMKey(out, key, a.passphrase)
 		if err != nil {
-			return nil, nil, err
+			return handle, nodata, err
 		}
 		state, err := vsecurity.NewPrincipalStateSerializer(filepath.Join(a.path, "creds", filename))
 		if err != nil {
-			return nil, nil, err
+			return handle, nodata, err
 		}
 		p, err = vsecurity.NewPrincipalFromSigner(signer, state)
 		if err != nil {
-			return nil, nil, err
+			return handle, nodata, err
 		}
 	}
-	data = &keyData{newWatchers(), p}
-	a.mu.Lock()
-	a.principals[keyHandle] = *data
-	a.mu.Unlock()
-	return keyHandle[:], data, nil
+	return handle, keyData{newWatchers(), p}, nil
 }
 
 func keyid(key *ecdsa.PrivateKey) (handle keyHandle, err error) {
diff --git a/services/identity/internal/templates/partials.go b/services/identity/internal/templates/partials.go
index 729f15b..d2a8d11 100644
--- a/services/identity/internal/templates/partials.go
+++ b/services/identity/internal/templates/partials.go
@@ -64,7 +64,7 @@
   <div class="provider-info-section">
     <h5>Root name</h5>
     <span class="provider-address">
-      dev.v.io/root
+      {{.Self}}
     </span>
 
     <h5>Public key</h5>
