Merge "veyron/runtimes/google/ipc: Flush the relevant namespace cache entry if a startCall fails for a reason other than a resolution not finding anything.  This is to try to more quickly survive server restarts that might end up with a different ip address, port, or routeid."
diff --git a/examples/bank/pbankd/main.go b/examples/bank/pbankd/main.go
index f0a77e2..acf9382 100644
--- a/examples/bank/pbankd/main.go
+++ b/examples/bank/pbankd/main.go
@@ -172,7 +172,7 @@
 // 		fmt.Printf("ID: %d\n", randID)
 
 // 		// Bless the user
-// 		pp := security.PrincipalPattern(context.LocalID().Names()[0])
+// 		pp := security.BlessingPattern(context.LocalID().Names()[0])
 // 		pID, err := b.ID.Bless(
 // 			context.RemoteID(),
 // 			fmt.Sprintf("%d", randID),
@@ -443,7 +443,7 @@
 
 	// 	// Setup bank and account authorizers.
 	//  bankAuth := vsecurity.NewACLAuthorizer(security.NewWhitelistACL(
-	// 		map[security.PrincipalPattern]security.LabelSet{
+	// 		map[security.BlessingPattern]security.LabelSet{
 	// 			security.AllPrincipals: security.LabelSet(security.ReadLabel | security.WriteLabel),
 	// 		}))
 	// 	bankAccountAuth := AccountAuthorizer(runtime.Identity().PublicID().Names()[0] + SUFFIX_REGEXP)
diff --git a/examples/boxes/android/src/boxesp2p/main.go b/examples/boxes/android/src/boxesp2p/main.go
index 250d50d..c2dee7a 100644
--- a/examples/boxes/android/src/boxesp2p/main.go
+++ b/examples/boxes/android/src/boxesp2p/main.go
@@ -235,7 +235,7 @@
 
 func (gs *goState) registerAsPeer(ctx context.T) {
 	auth := vsecurity.NewACLAuthorizer(vsecurity.NewWhitelistACL(
-		map[security.PrincipalPattern]security.LabelSet{
+		map[security.BlessingPattern]security.LabelSet{
 			security.AllPrincipals: security.LabelSet(security.AdminLabel),
 		}))
 	gs.disp.drawAuth = auth
diff --git a/jni/runtimes/google/security/jni.go b/jni/runtimes/google/security/jni.go
index 0dc8a08..0852ec0 100644
--- a/jni/runtimes/google/security/jni.go
+++ b/jni/runtimes/google/security/jni.go
@@ -27,15 +27,15 @@
 	jCaveatClass C.jclass
 	// Global reference for com.veyron2.security.ServiceCaveat class.
 	jServiceCaveatClass C.jclass
-	// Global reference for com.veyron2.security.PrincipalPattern class.
-	jPrincipalPatternClass C.jclass
+	// Global reference for com.veyron2.security.BlessingPattern class.
+	jBlessingPatternClass C.jclass
 	// Global reference for org.joda.time.Duration class.
 	jDurationClass C.jclass
 
 	// Signature of the PublicID interface.
 	publicIDSign = util.ClassSign("com.veyron2.security.PublicID")
-	// Signature of the PrincipalPattern class.
-	principalPatternSign = util.ClassSign("com.veyron2.security.PrincipalPattern")
+	// Signature of the BlessingPattern class.
+	principalPatternSign = util.ClassSign("com.veyron2.security.BlessingPattern")
 )
 
 // Init initializes the JNI code with the given Java evironment. This method
@@ -53,7 +53,7 @@
 	jContextImplClass = C.jclass(util.JFindClassPtrOrDie(env, "com/veyron/runtimes/google/security/Context"))
 	jCaveatClass = C.jclass(util.JFindClassPtrOrDie(env, "com/veyron2/security/Caveat"))
 	jServiceCaveatClass = C.jclass(util.JFindClassPtrOrDie(env, "com/veyron2/security/ServiceCaveat"))
-	jPrincipalPatternClass = C.jclass(util.JFindClassPtrOrDie(env, "com/veyron2/security/PrincipalPattern"))
+	jBlessingPatternClass = C.jclass(util.JFindClassPtrOrDie(env, "com/veyron2/security/BlessingPattern"))
 	jDurationClass = C.jclass(util.JFindClassPtrOrDie(env, "org/joda/time/Duration"))
 }
 
@@ -82,7 +82,7 @@
 func Java_com_veyron_runtimes_google_security_PublicIDStore_nativeAdd(env *C.JNIEnv, jPublicIDStore C.jobject, goPublicIDStorePtr C.jlong, jID C.jobject, jPeerPattern C.jstring) {
 	idPtr := util.CallLongMethodOrCatch(env, jID, "getNativePtr", nil)
 	id := (*(*security.PublicID)(util.Ptr(idPtr)))
-	peerPattern := security.PrincipalPattern(util.GoString(env, jPeerPattern))
+	peerPattern := security.BlessingPattern(util.GoString(env, jPeerPattern))
 	if err := (*(*security.PublicIDStore)(util.Ptr(goPublicIDStorePtr))).Add(id, peerPattern); err != nil {
 		util.JThrowV(env, err)
 		return
@@ -113,10 +113,10 @@
 	return C.jlong(util.PtrValue(&id))
 }
 
-//export Java_com_veyron_runtimes_google_security_PublicIDStore_nativeSetDefaultPrincipalPattern
-func Java_com_veyron_runtimes_google_security_PublicIDStore_nativeSetDefaultPrincipalPattern(env *C.JNIEnv, jPublicIDStore C.jobject, goPublicIDStorePtr C.jlong, jPattern C.jstring) {
-	pattern := security.PrincipalPattern(util.GoString(env, jPattern))
-	if err := (*(*security.PublicIDStore)(util.Ptr(goPublicIDStorePtr))).SetDefaultPrincipalPattern(pattern); err != nil {
+//export Java_com_veyron_runtimes_google_security_PublicIDStore_nativeSetDefaultBlessingPattern
+func Java_com_veyron_runtimes_google_security_PublicIDStore_nativeSetDefaultBlessingPattern(env *C.JNIEnv, jPublicIDStore C.jobject, goPublicIDStorePtr C.jlong, jPattern C.jstring) {
+	pattern := security.BlessingPattern(util.GoString(env, jPattern))
+	if err := (*(*security.PublicIDStore)(util.Ptr(goPublicIDStorePtr))).SetDefaultBlessingPattern(pattern); err != nil {
 		util.JThrowV(env, err)
 		return
 	}
diff --git a/jni/runtimes/google/security/publicid.go b/jni/runtimes/google/security/publicid.go
index 541779e..9ef816b 100644
--- a/jni/runtimes/google/security/publicid.go
+++ b/jni/runtimes/google/security/publicid.go
@@ -89,7 +89,7 @@
 	sCaveats := make([]security.ServiceCaveat, len(jServiceCaveats))
 	for i, jcaveat := range jServiceCaveats {
 		sCaveats[i] = security.ServiceCaveat{
-			Service: security.PrincipalPattern(util.JStringField(env, C.jobject(jcaveat), "service")),
+			Service: security.BlessingPattern(util.JStringField(env, C.jobject(jcaveat), "service")),
 			Caveat:  newCaveat(env, C.jobject(jcaveat)),
 		}
 	}
diff --git a/jni/runtimes/google/security/publicid_store.go b/jni/runtimes/google/security/publicid_store.go
index 2c5237b..04334f5 100644
--- a/jni/runtimes/google/security/publicid_store.go
+++ b/jni/runtimes/google/security/publicid_store.go
@@ -54,14 +54,14 @@
 	jPublicIDStore C.jobject
 }
 
-func (s *publicIDStore) Add(id security.PublicID, peerPattern security.PrincipalPattern) error {
+func (s *publicIDStore) Add(id security.PublicID, peerPattern security.BlessingPattern) error {
 	envPtr, freeFunc := util.GetEnv(s.jVM)
 	env := (*C.JNIEnv)(envPtr)
 	defer freeFunc()
 	util.GoRef(&id) // Un-refed when the Java PublicID object created below is finalized.
 	jPublicID := C.jobject(util.NewObjectOrCatch(env, jPublicIDImplClass, []util.Sign{util.LongSign}, &id))
-	jPrincipalPattern := C.jobject(util.NewObjectOrCatch(env, jPrincipalPatternClass, []util.Sign{util.StringSign}, string(peerPattern)))
-	return util.CallVoidMethod(env, s.jPublicIDStore, "add", []util.Sign{publicIDSign, principalPatternSign}, jPublicID, jPrincipalPattern)
+	jBlessingPattern := C.jobject(util.NewObjectOrCatch(env, jBlessingPatternClass, []util.Sign{util.StringSign}, string(peerPattern)))
+	return util.CallVoidMethod(env, s.jPublicIDStore, "add", []util.Sign{publicIDSign, principalPatternSign}, jPublicID, jBlessingPattern)
 }
 
 func (s *publicIDStore) ForPeer(peer security.PublicID) (security.PublicID, error) {
@@ -90,10 +90,10 @@
 	return (*(*security.PublicID)(util.Ptr(publicIDPtr))), nil
 }
 
-func (s *publicIDStore) SetDefaultPrincipalPattern(pattern security.PrincipalPattern) error {
+func (s *publicIDStore) SetDefaultBlessingPattern(pattern security.BlessingPattern) error {
 	envPtr, freeFunc := util.GetEnv(s.jVM)
 	env := (*C.JNIEnv)(envPtr)
 	defer freeFunc()
-	jPattern := C.jobject(util.NewObjectOrCatch(env, jPrincipalPatternClass, []util.Sign{util.StringSign}, string(pattern)))
-	return util.CallVoidMethod(env, s.jPublicIDStore, "setDefaultPrincipalPattern", []util.Sign{principalPatternSign}, jPattern)
+	jPattern := C.jobject(util.NewObjectOrCatch(env, jBlessingPatternClass, []util.Sign{util.StringSign}, string(pattern)))
+	return util.CallVoidMethod(env, s.jPublicIDStore, "setDefaultBlessingPattern", []util.Sign{principalPatternSign}, jPattern)
 }
diff --git a/jni/runtimes/google/security/service_caveat.go b/jni/runtimes/google/security/service_caveat.go
index e4d8ff6..a6e599c 100644
--- a/jni/runtimes/google/security/service_caveat.go
+++ b/jni/runtimes/google/security/service_caveat.go
@@ -17,8 +17,8 @@
 	sCaveats := make([]security.ServiceCaveat, length)
 	for i := 0; i < length; i++ {
 		jServiceCaveat := C.GetObjectArrayElement(env, jServiceCaveats, C.jsize(i))
-		jPrincipalPattern := C.jobject(util.CallObjectMethodOrCatch(env, jServiceCaveat, "getServices", nil, util.ClassSign("com.veyron2.security.PrincipalPattern")))
-		services := util.CallStringMethodOrCatch(env, jPrincipalPattern, "getValue", nil)
+		jBlessingPattern := C.jobject(util.CallObjectMethodOrCatch(env, jServiceCaveat, "getServices", nil, util.ClassSign("com.veyron2.security.BlessingPattern")))
+		services := util.CallStringMethodOrCatch(env, jBlessingPattern, "getValue", nil)
 		jCaveat := C.jobject(util.CallObjectMethodOrCatch(env, jServiceCaveat, "getCaveat", nil, util.ClassSign("com.veyron2.security.Caveat")))
 		// TODO(spetrovic): we get native pointer for PublicID and it works because the plan is for
 		// PublicID to be an interface with only a few implementations in veyron2: folks aren't
@@ -30,7 +30,7 @@
 		caveatPtr := util.CallLongMethodOrCatch(env, jCaveat, "getNativePtr", nil)
 		caveat := (*(*security.Caveat)(util.Ptr(caveatPtr)))
 		sCaveats[i] = security.ServiceCaveat{
-			Service: security.PrincipalPattern(services),
+			Service: security.BlessingPattern(services),
 			Caveat:  caveat,
 		}
 	}
@@ -45,8 +45,8 @@
 		util.GoRef(&caveat) // Un-refed when the Java Caveat object is finalized.
 		jCaveat := C.jobject(util.NewObjectOrCatch(env, jCaveatImplClass, []util.Sign{util.LongSign}, &caveat))
 		services := string(sCaveat.Service)
-		jPattern := C.jobject(util.NewObjectOrCatch(env, jPrincipalPatternClass, []util.Sign{util.StringSign}, services))
-		patternSign := util.ClassSign("com.veyron2.security.PrincipalPattern")
+		jPattern := C.jobject(util.NewObjectOrCatch(env, jBlessingPatternClass, []util.Sign{util.StringSign}, services))
+		patternSign := util.ClassSign("com.veyron2.security.BlessingPattern")
 		caveatSign := util.ClassSign("com.veyron2.security.Caveat")
 		jServiceCaveat := C.jobject(util.NewObjectOrCatch(env, jServiceCaveatClass, []util.Sign{patternSign, caveatSign}, jPattern, jCaveat))
 		C.SetObjectArrayElement(env, jServiceCaveats, C.jsize(i), jServiceCaveat)
diff --git a/lib/testutil/security/util_test.go b/lib/testutil/security/util_test.go
index 856606b..3a2fd3a 100644
--- a/lib/testutil/security/util_test.go
+++ b/lib/testutil/security/util_test.go
@@ -51,12 +51,12 @@
 	}
 	defer r.Cleanup()
 	acl := security.ACL{}
-	acl.In.Principals = map[security.PrincipalPattern]security.LabelSet{
+	acl.In.Principals = map[security.BlessingPattern]security.LabelSet{
 		"veyron/*":     security.LabelSet(security.ReadLabel),
 		"veyron/alice": security.LabelSet(security.ReadLabel | security.WriteLabel),
 		"veyron/bob":   security.LabelSet(security.AdminLabel),
 	}
-	acl.NotIn.Principals = map[security.PrincipalPattern]security.LabelSet{
+	acl.NotIn.Principals = map[security.BlessingPattern]security.LabelSet{
 		"veyron/che": security.LabelSet(security.ReadLabel),
 	}
 
diff --git a/runtimes/google/ipc/client.go b/runtimes/google/ipc/client.go
index 1ccb51b..5bc53ce 100644
--- a/runtimes/google/ipc/client.go
+++ b/runtimes/google/ipc/client.go
@@ -197,7 +197,7 @@
 	for _, o := range opts {
 		switch v := o.(type) {
 		case veyron2.RemoteID:
-			if !security.PrincipalPattern(v).MatchedBy(authID) {
+			if !security.BlessingPattern(v).MatchedBy(authID.Names()...) {
 				return nil, fmt.Errorf("server %q does not match the provided pattern %q", authID, v)
 			}
 		case ipc.Granter:
diff --git a/runtimes/google/ipc/discharges.go b/runtimes/google/ipc/discharges.go
index 5e72ea8..173ecd9 100644
--- a/runtimes/google/ipc/discharges.go
+++ b/runtimes/google/ipc/discharges.go
@@ -24,7 +24,7 @@
 
 	var caveats []security.ThirdPartyCaveat
 	for _, cav := range blessing.ThirdPartyCaveats() {
-		if cav.Service.MatchedBy(server) {
+		if cav.Service.MatchedBy(server.Names()...) {
 			caveats = append(caveats, cav.Caveat.(security.ThirdPartyCaveat))
 		}
 	}
diff --git a/runtimes/google/ipc/full_test.go b/runtimes/google/ipc/full_test.go
index b1fdd33..9224834 100644
--- a/runtimes/google/ipc/full_test.go
+++ b/runtimes/google/ipc/full_test.go
@@ -162,7 +162,7 @@
 	case "aclAuth":
 		// Only authorize clients matching patterns "client" or "server/*".
 		authorizer = vsecurity.NewACLAuthorizer(vsecurity.NewWhitelistACL(
-			map[security.PrincipalPattern]security.LabelSet{
+			map[security.BlessingPattern]security.LabelSet{
 				"server/*": security.LabelSet(security.AdminLabel),
 				"client":   security.LabelSet(security.AdminLabel),
 			}))
@@ -471,7 +471,7 @@
 
 	tests := []struct {
 		clientID, serverID security.PrivateID
-		pattern            security.PrincipalPattern // pattern on the server identity expected by client.
+		pattern            security.BlessingPattern // pattern on the server identity expected by client.
 		err                string
 	}{
 		// Client accepts talking to server only if server's identity matches the
@@ -745,11 +745,11 @@
 		// a Discharge service as well.
 		dischargerID = serverID.PublicID()
 		cavTPValid   = security.ServiceCaveat{
-			Service: security.PrincipalPattern(serverID.PublicID().Names()[0]),
+			Service: security.BlessingPattern(serverID.PublicID().Names()[0]),
 			Caveat:  mkThirdPartyCaveat(dischargerID, "mountpoint/server/discharger", &caveat.Expiry{ExpiryTime: now.Add(24 * time.Hour)}),
 		}
 		cavTPExpired = security.ServiceCaveat{
-			Service: security.PrincipalPattern(serverID.PublicID().Names()[0]),
+			Service: security.BlessingPattern(serverID.PublicID().Names()[0]),
 			Caveat:  mkThirdPartyCaveat(dischargerID, "mountpoint/server/discharger", &caveat.Expiry{IssueTime: now, ExpiryTime: now}),
 		}
 
diff --git a/runtimes/google/ipc/server.go b/runtimes/google/ipc/server.go
index 9208a74..dec40be 100644
--- a/runtimes/google/ipc/server.go
+++ b/runtimes/google/ipc/server.go
@@ -382,9 +382,9 @@
 	if id == nil {
 		return security.ACL{}
 	}
-	in := map[security.PrincipalPattern]security.LabelSet{}
+	in := map[security.BlessingPattern]security.LabelSet{}
 	for _, n := range id.Names() {
-		in[security.PrincipalPattern(n+security.ChainSeparator+security.AllPrincipals)] = security.AllLabels
+		in[security.BlessingPattern(n+security.ChainSeparator+string(security.AllPrincipals))] = security.AllLabels
 	}
 	return vsecurity.NewWhitelistACL(in)
 }
diff --git a/runtimes/google/rt/ipc.go b/runtimes/google/rt/ipc.go
index d978865..ccd1319 100644
--- a/runtimes/google/rt/ipc.go
+++ b/runtimes/google/rt/ipc.go
@@ -23,7 +23,7 @@
 	id security.PublicID
 }
 
-func (fixedPublicIDStore) Add(id security.PublicID, peerPattern security.PrincipalPattern) error {
+func (fixedPublicIDStore) Add(id security.PublicID, peerPattern security.BlessingPattern) error {
 	return errors.New("adding new PublicIDs is disallowed for this PublicIDStore")
 }
 
@@ -35,8 +35,8 @@
 	return s.id, nil
 }
 
-func (fixedPublicIDStore) SetDefaultPrincipalPattern(pattern security.PrincipalPattern) error {
-	return errors.New("SetDefaultPrincipalPattern is disallowed on a fixed PublicIDStore")
+func (fixedPublicIDStore) SetDefaultBlessingPattern(pattern security.BlessingPattern) error {
+	return errors.New("SetDefaultBlessingPattern is disallowed on a fixed PublicIDStore")
 }
 
 // localID is an option for passing a PrivateID and PublicIDStore
diff --git a/runtimes/google/rt/ipc_test.go b/runtimes/google/rt/ipc_test.go
index d9938d8..f1499c5 100644
--- a/runtimes/google/rt/ipc_test.go
+++ b/runtimes/google/rt/ipc_test.go
@@ -42,7 +42,7 @@
 	return blessedID
 }
 
-func add(store security.PublicIDStore, id security.PublicID, pattern security.PrincipalPattern) {
+func add(store security.PublicIDStore, id security.PublicID, pattern security.BlessingPattern) {
 	if err := store.Add(id, pattern); err != nil {
 		panic(err)
 	}
@@ -103,7 +103,7 @@
 
 	type testcase struct {
 		server, client                   security.PublicID
-		defaultPattern                   security.PrincipalPattern
+		defaultPattern                   security.BlessingPattern
 		wantServerNames, wantClientNames []string
 	}
 	tests := []testcase{
@@ -146,8 +146,8 @@
 		return fmt.Sprintf("TestCase{clientPublicIDStore: %v, serverPublicIDStore: %v, client option: %v, server option: %v}", clientR.PublicIDStore(), serverR.PublicIDStore(), t.client, t.server)
 	}
 	for _, test := range tests {
-		if err := serverR.PublicIDStore().SetDefaultPrincipalPattern(test.defaultPattern); err != nil {
-			t.Errorf("serverR.PublicIDStore.SetDefaultPrincipalPattern failed: %s", err)
+		if err := serverR.PublicIDStore().SetDefaultBlessingPattern(test.defaultPattern); err != nil {
+			t.Errorf("serverR.PublicIDStore.SetDefaultBlessingPattern failed: %s", err)
 			continue
 		}
 		server, err := serverR.NewServer(veyron2.LocalID(test.server))
@@ -163,7 +163,7 @@
 		defer stopServer(server)
 		if err := server.Serve("", ipc.LeafDispatcher(&testService{},
 			vsecurity.NewACLAuthorizer(vsecurity.NewWhitelistACL(
-				map[security.PrincipalPattern]security.LabelSet{
+				map[security.BlessingPattern]security.LabelSet{
 					security.AllPrincipals: security.AllLabels,
 				})))); err != nil {
 			t.Errorf("error serving service: ", err)
diff --git a/runtimes/google/security/identity_test.go b/runtimes/google/security/identity_test.go
index a9961a9..eef3e12 100644
--- a/runtimes/google/security/identity_test.go
+++ b/runtimes/google/security/identity_test.go
@@ -78,7 +78,7 @@
 func TestMatch(t *testing.T) {
 	alice := newChain("alice")
 	type matchInstance struct {
-		pattern security.PrincipalPattern
+		pattern security.BlessingPattern
 		want    bool
 	}
 	testdata := []struct {
@@ -137,7 +137,7 @@
 	}
 	for _, d := range testdata {
 		for _, m := range d.matchData {
-			if got := m.pattern.MatchedBy(d.id); got != m.want {
+			if got := m.pattern.MatchedBy(d.id.Names()...); got != m.want {
 				t.Errorf("%q.Match(%s), Got %t, want %t", d.id, m.pattern, got, m.want)
 			}
 		}
diff --git a/runtimes/google/security/publicid_store.go b/runtimes/google/security/publicid_store.go
index fd87035..4763555 100644
--- a/runtimes/google/security/publicid_store.go
+++ b/runtimes/google/security/publicid_store.go
@@ -34,16 +34,16 @@
 	return fmt.Errorf("could not save PublicIDStore: %s", err)
 }
 
-type taggedIDStore map[security.PublicID][]security.PrincipalPattern
+type taggedIDStore map[security.PublicID][]security.BlessingPattern
 
 type persistentState struct {
 	// Store contains a set of PublicIDs mapped to a set of (peer) patterns. The
 	// patterns indicate the set of peers against whom the PublicID can be used.
 	// All PublicIDs in the store must have the same public key.
 	Store taggedIDStore
-	// DefaultPattern is the default PrincipalPattern to be used to select
+	// DefaultPattern is the default BlessingPattern to be used to select
 	// PublicIDs from the store in absence of any other search criterea.
-	DefaultPattern security.PrincipalPattern
+	DefaultPattern security.BlessingPattern
 }
 
 // publicIDStore implements security.PublicIDStore.
@@ -54,7 +54,7 @@
 	mu        sync.RWMutex
 }
 
-func (s *publicIDStore) addTaggedID(id security.PublicID, peerPattern security.PrincipalPattern) ([]security.PublicID, error) {
+func (s *publicIDStore) addTaggedID(id security.PublicID, peerPattern security.BlessingPattern) ([]security.PublicID, error) {
 	var updatedIDs []security.PublicID
 	switch p := id.(type) {
 	case *setPublicID:
@@ -85,7 +85,7 @@
 	}
 }
 
-func (s *publicIDStore) Add(id security.PublicID, peerPattern security.PrincipalPattern) error {
+func (s *publicIDStore) Add(id security.PublicID, peerPattern security.BlessingPattern) error {
 	s.mu.Lock()
 	defer s.mu.Unlock()
 
@@ -119,7 +119,7 @@
 	var matchingIDs []security.PublicID
 	for id, peerPatterns := range s.state.Store {
 		for _, peerPattern := range peerPatterns {
-			if peerPattern.MatchedBy(peer) {
+			if peerPattern.MatchedBy(peer.Names()...) {
 				matchingIDs = append(matchingIDs, id)
 				break
 			}
@@ -140,7 +140,7 @@
 	defer s.mu.RUnlock()
 	var matchingIDs []security.PublicID
 	for id, _ := range s.state.Store {
-		if s.state.DefaultPattern.MatchedBy(id) {
+		if s.state.DefaultPattern.MatchedBy(id.Names()...) {
 			matchingIDs = append(matchingIDs, id)
 		}
 	}
@@ -154,8 +154,8 @@
 	return id, nil
 }
 
-func (s *publicIDStore) SetDefaultPrincipalPattern(pattern security.PrincipalPattern) error {
-	if err := wire.ValidatePrincipalPattern(pattern); err != nil {
+func (s *publicIDStore) SetDefaultBlessingPattern(pattern security.BlessingPattern) error {
+	if err := wire.ValidateBlessingPattern(pattern); err != nil {
 		return err
 	}
 	s.mu.Lock()
diff --git a/runtimes/google/security/publicid_store_test.go b/runtimes/google/security/publicid_store_test.go
index 9598fde..394cb49 100644
--- a/runtimes/google/security/publicid_store_test.go
+++ b/runtimes/google/security/publicid_store_test.go
@@ -62,7 +62,7 @@
 		t.Fatalf("NewPublicIDStore failed: %s", err)
 	}
 	defaultPatterns := []struct {
-		pattern security.PrincipalPattern
+		pattern security.BlessingPattern
 		success bool
 	}{
 		{"veyron", true},
@@ -77,14 +77,14 @@
 		{"veyron/*/alice", false},
 	}
 	for _, d := range defaultPatterns {
-		if got := s.SetDefaultPrincipalPattern(d.pattern); d.success != (got == nil) {
+		if got := s.SetDefaultBlessingPattern(d.pattern); d.success != (got == nil) {
 			t.Errorf("%s.SetDefaultPattern(%q) returned: %v, expected it to succeed: %v", s, d.pattern, got, d.success)
 		}
 	}
 }
 
 func TestStoreGetters(t *testing.T) {
-	add := func(s security.PublicIDStore, id security.PublicID, peers security.PrincipalPattern) {
+	add := func(s security.PublicIDStore, id security.PublicID, peers security.BlessingPattern) {
 		if err := s.Add(id, peers); err != nil {
 			t.Fatalf("%s.Add(%q, %q) failed unexpectedly: %s", s, id, peers, err)
 		}
@@ -151,9 +151,9 @@
 		t.Errorf("%s.DefaultPublicID(): got: %s, want PublicID with the exact set of names: %s", s, got, defaultNames)
 	}
 
-	// Test SetDefaultPrincipalPattern.
-	testDataByPrincipalPattern := []struct {
-		defaultPattern security.PrincipalPattern
+	// Test SetDefaultBlessingPattern.
+	testDataByBlessingPattern := []struct {
+		defaultPattern security.BlessingPattern
 		defaultNames   []string
 	}{
 		{"veyron", nil},
@@ -166,8 +166,8 @@
 		{"google/service/*", []string{"google/service/user-42"}},
 		{"bob", nil},
 	}
-	for _, d := range testDataByPrincipalPattern {
-		s.SetDefaultPrincipalPattern(d.defaultPattern)
+	for _, d := range testDataByBlessingPattern {
+		s.SetDefaultBlessingPattern(d.defaultPattern)
 		if got, err := s.DefaultPublicID(); !verifyNamesAndPublicKey(got, err, d.defaultNames, pkey) {
 			t.Errorf("%s.DefaultPublicID(): got: %s, want PublicID with the exact set of names: %s", s, got, d.defaultNames)
 		}
@@ -206,8 +206,8 @@
 	if err := s.Add(sAllAlice, "google/*"); err != nil {
 		t.Fatalf("%s.Add(%q, ...) failed unexpectedly: %s", s, sAllAlice, err)
 	}
-	if err := s.SetDefaultPrincipalPattern("veyron/*"); err != nil {
-		t.Fatalf("%s.SetDefaultPrincipalPattern failed: %s", s, err)
+	if err := s.SetDefaultBlessingPattern("veyron/*"); err != nil {
+		t.Fatalf("%s.SetDefaultBlessingPattern failed: %s", s, err)
 	}
 
 	// Test that all mutations are appropriately reflected in a PublicIDStore read from
diff --git a/runtimes/google/security/util_test.go b/runtimes/google/security/util_test.go
index 1cc0a29..7cfb9db 100644
--- a/runtimes/google/security/util_test.go
+++ b/runtimes/google/security/util_test.go
@@ -109,13 +109,13 @@
 	return nil
 }
 
-func methodRestrictionCaveat(service security.PrincipalPattern, methods []string) []security.ServiceCaveat {
+func methodRestrictionCaveat(service security.BlessingPattern, methods []string) []security.ServiceCaveat {
 	return []security.ServiceCaveat{
 		{Service: service, Caveat: caveat.MethodRestriction(methods)},
 	}
 }
 
-func peerIdentityCaveat(p security.PrincipalPattern) []security.ServiceCaveat {
+func peerIdentityCaveat(p security.BlessingPattern) []security.ServiceCaveat {
 	return []security.ServiceCaveat{caveat.UniversalCaveat(caveat.PeerIdentity{p})}
 }
 
diff --git a/security/acl_authorizer.go b/security/acl_authorizer.go
index 9cda0e3..30f000d 100644
--- a/security/acl_authorizer.go
+++ b/security/acl_authorizer.go
@@ -62,7 +62,7 @@
 // no requests are authorized.
 //
 // The JSON-encoding of a ACL is essentially a JSON object describing a map from
-// PrincipalPatterns to encoded LabelSets (see LabelSet.MarshalJSON).
+// BlessingPatterns to encoded LabelSets (see LabelSet.MarshalJSON).
 // Examples:
 // * `{"*" : "RW"}` encodes an ACL that allows all principals to access all methods with
 //   ReadLabel or WriteLabel.
diff --git a/security/acl_authorizer_test.go b/security/acl_authorizer_test.go
index 07da673..d71363f 100644
--- a/security/acl_authorizer_test.go
+++ b/security/acl_authorizer_test.go
@@ -187,7 +187,7 @@
 
 	// ACL for testing
 	acl := security.ACL{}
-	acl.In.Principals = map[security.PrincipalPattern]security.LabelSet{
+	acl.In.Principals = map[security.BlessingPattern]security.LabelSet{
 		"*": LS(R),
 		"fake/veyron/alice/*": LS(W, R),
 		"fake/veyron/alice":   LS(A, D, M),
@@ -195,7 +195,7 @@
 		"fake/veyron/che/*":   LS(W, R),
 		"fake/veyron/che":     LS(W, R),
 	}
-	acl.NotIn.Principals = map[security.PrincipalPattern]security.LabelSet{
+	acl.NotIn.Principals = map[security.BlessingPattern]security.LabelSet{
 		"fake/veyron/che/friend": LS(W),
 	}
 
diff --git a/security/caveat/caveat.go b/security/caveat/caveat.go
index 6ad9f25..a008381 100644
--- a/security/caveat/caveat.go
+++ b/security/caveat/caveat.go
@@ -49,15 +49,15 @@
 
 // PeerIdentity is a security.Caveat that restricts the bearer of a credential
 // with this caveat from making or receiving RPCs to a limited set of peers -
-// those whose identities match one of the provided security.PrincipalPatterns.
+// those whose identities match one of the provided security.BlessingPatterns.
 // An empty set indicates that no peers can be communicated with.
-type PeerIdentity []security.PrincipalPattern
+type PeerIdentity []security.BlessingPattern
 
 // Validate checks that the identity of the peer is present on the set of services
-// identified by the PrincipalPatterns on the caveat.
+// identified by the BlessingPatterns on the caveat.
 func (c PeerIdentity) Validate(ctx security.Context) error {
 	for _, p := range c {
-		if ctx.LocalID() != nil && p.MatchedBy(ctx.LocalID()) {
+		if ctx.LocalID() != nil && p.MatchedBy(ctx.LocalID().Names()...) {
 			return nil
 		}
 	}
diff --git a/security/flag/flag_test.go b/security/flag/flag_test.go
index a52bf26..4bd60fe 100644
--- a/security/flag/flag_test.go
+++ b/security/flag/flag_test.go
@@ -30,7 +30,7 @@
 	}
 	var (
 		acl1 = security.ACL{}
-		acl2 = vsecurity.NewWhitelistACL(map[security.PrincipalPattern]security.LabelSet{
+		acl2 = vsecurity.NewWhitelistACL(map[security.BlessingPattern]security.LabelSet{
 			"veyron/alice": security.LabelSet(security.ReadLabel | security.WriteLabel),
 			"veyron/bob":   security.LabelSet(security.ReadLabel),
 		})
diff --git a/security/util.go b/security/util.go
index afdfd87..7755797 100644
--- a/security/util.go
+++ b/security/util.go
@@ -13,7 +13,7 @@
 
 // NewWhitelistACL creates an ACL that grants access to only the provided
 // principals.
-func NewWhitelistACL(principals map[security.PrincipalPattern]security.LabelSet) security.ACL {
+func NewWhitelistACL(principals map[security.BlessingPattern]security.LabelSet) security.ACL {
 	acl := security.ACL{}
 	acl.In.Principals = principals
 	return acl
diff --git a/security/util_test.go b/security/util_test.go
index 5fd6252..6c97fb6 100644
--- a/security/util_test.go
+++ b/security/util_test.go
@@ -27,12 +27,12 @@
 
 func TestLoadSaveACL(t *testing.T) {
 	acl := security.ACL{}
-	acl.In.Principals = map[security.PrincipalPattern]security.LabelSet{
+	acl.In.Principals = map[security.BlessingPattern]security.LabelSet{
 		"veyron/*":     security.LabelSet(security.ReadLabel),
 		"veyron/alice": security.LabelSet(security.ReadLabel | security.WriteLabel),
 		"veyron/bob":   security.LabelSet(security.AdminLabel),
 	}
-	acl.NotIn.Principals = map[security.PrincipalPattern]security.LabelSet{
+	acl.NotIn.Principals = map[security.BlessingPattern]security.LabelSet{
 		"veyron/che": security.LabelSet(security.ReadLabel),
 	}
 
diff --git a/services/identity/identityd/main.go b/services/identity/identityd/main.go
index d440bf3..255d91f 100644
--- a/services/identity/identityd/main.go
+++ b/services/identity/identityd/main.go
@@ -134,7 +134,7 @@
 	if err != nil {
 		return nil, nil, fmt.Errorf("server.Listen(%q, %q) failed: %v", "tcp", *address, err)
 	}
-	allowEveryoneACL := vsecurity.NewWhitelistACL(map[security.PrincipalPattern]security.LabelSet{
+	allowEveryoneACL := vsecurity.NewWhitelistACL(map[security.BlessingPattern]security.LabelSet{
 		security.AllPrincipals: security.AllLabels,
 	})
 	objectname := fmt.Sprintf("identity/%s/google", r.Identity().PublicID().Names()[0])
diff --git a/services/syncgroup/syncgroup.vdl.go b/services/syncgroup/syncgroup.vdl.go
index e38974f..962584c 100644
--- a/services/syncgroup/syncgroup.vdl.go
+++ b/services/syncgroup/syncgroup.vdl.go
@@ -496,7 +496,7 @@
 	}
 
 	result.TypeDefs = []_gen_vdlutil.Any{
-		_gen_wiretype.NamedPrimitiveType{Type: 0x1, Name: "anydata", Tags: []string(nil)}, _gen_wiretype.MapType{Key: 0x3, Elem: 0x41, Name: "", Tags: []string(nil)}, _gen_wiretype.NamedPrimitiveType{Type: 0x3, Name: "veyron2/security.PrincipalPattern", Tags: []string(nil)}, _gen_wiretype.NamedPrimitiveType{Type: 0x34, Name: "veyron2/security.LabelSet", Tags: []string(nil)}, _gen_wiretype.MapType{Key: 0x43, Elem: 0x44, Name: "", Tags: []string(nil)}, _gen_wiretype.StructType{
+		_gen_wiretype.NamedPrimitiveType{Type: 0x1, Name: "anydata", Tags: []string(nil)}, _gen_wiretype.MapType{Key: 0x3, Elem: 0x41, Name: "", Tags: []string(nil)}, _gen_wiretype.NamedPrimitiveType{Type: 0x3, Name: "veyron2/security.BlessingPattern", Tags: []string(nil)}, _gen_wiretype.NamedPrimitiveType{Type: 0x34, Name: "veyron2/security.LabelSet", Tags: []string(nil)}, _gen_wiretype.MapType{Key: 0x43, Elem: 0x44, Name: "", Tags: []string(nil)}, _gen_wiretype.StructType{
 			[]_gen_wiretype.FieldType{
 				_gen_wiretype.FieldType{Type: 0x45, Name: "Principals"},
 			},
diff --git a/services/wsprd/identity/identity.go b/services/wsprd/identity/identity.go
index b947a21..b9a9c7b 100644
--- a/services/wsprd/identity/identity.go
+++ b/services/wsprd/identity/identity.go
@@ -132,12 +132,12 @@
 }
 
 // AccountsMatching returns a list of accounts that match the given pattern.
-func (i *IDManager) AccountsMatching(trustedRoot security.PrincipalPattern) []string {
+func (i *IDManager) AccountsMatching(trustedRoot security.BlessingPattern) []string {
 	i.mu.Lock()
 	defer i.mu.Unlock()
 	result := []string{}
 	for name, id := range i.state.Accounts {
-		if trustedRoot.MatchedBy(id.PublicID()) {
+		if trustedRoot.MatchedBy(id.PublicID().Names()...) {
 			result = append(result, name)
 		}
 	}
diff --git a/services/wsprd/identity/identity_test.go b/services/wsprd/identity/identity_test.go
index 8ca77c4..0ea8f0e 100644
--- a/services/wsprd/identity/identity_test.go
+++ b/services/wsprd/identity/identity_test.go
@@ -79,7 +79,7 @@
 	manager.AddAccount(googleAccount2, createChain(r, googleAccount2))
 	manager.AddAccount(facebookAccount, createChain(r, facebookAccount))
 
-	result := manager.AccountsMatching(security.PrincipalPattern(topLevelName + "/google/*"))
+	result := manager.AccountsMatching(security.BlessingPattern(topLevelName + "/google/*"))
 	sort.StringSlice(result).Sort()
 	expected := []string{googleAccount1, googleAccount2}
 	if !reflect.DeepEqual(result, expected) {
diff --git a/services/wsprd/ipc/server/server.go b/services/wsprd/ipc/server/server.go
index 989a053..f0e78b6 100644
--- a/services/wsprd/ipc/server/server.go
+++ b/services/wsprd/ipc/server/server.go
@@ -178,7 +178,7 @@
 	if s.dispatcher == nil {
 		s.dispatcher = newDispatcher(invoker,
 			vsecurity.NewACLAuthorizer(vsecurity.NewWhitelistACL(
-				map[security.PrincipalPattern]security.LabelSet{
+				map[security.BlessingPattern]security.LabelSet{
 					security.AllPrincipals: security.AllLabels,
 				})))
 	}
diff --git a/services/wsprd/wspr/wspr_test.go b/services/wsprd/wspr/wspr_test.go
index 2677a54..9c3af33 100644
--- a/services/wsprd/wspr/wspr_test.go
+++ b/services/wsprd/wspr/wspr_test.go
@@ -98,7 +98,7 @@
 	// Verify that idManager has the new account
 	topLevelName := wspr.rt.Identity().PublicID().Names()[0]
 	expectedAccountName := topLevelName + "/mock-blessing-1"
-	gotAccounts := wspr.idManager.AccountsMatching(security.PrincipalPattern(expectedAccountName))
+	gotAccounts := wspr.idManager.AccountsMatching(security.BlessingPattern(expectedAccountName))
 	if len(gotAccounts) != 1 {
 		t.Fatalf("Expected to have 1 account with name %v, but got %v: %v", expectedAccountName, len(gotAccounts), gotAccounts)
 	}
@@ -124,7 +124,7 @@
 	}
 
 	// Verify that idManager has both accounts
-	gotAccounts = wspr.idManager.AccountsMatching(security.PrincipalPattern(topLevelName + "/*"))
+	gotAccounts = wspr.idManager.AccountsMatching(security.BlessingPattern(topLevelName + "/*"))
 	if len(gotAccounts) != 2 {
 		t.Fatalf("Expected to have 2 accounts, but got %v: %v", len(gotAccounts), gotAccounts)
 	}