diff --git a/services/mgmt/application/application.vdl b/services/mgmt/application/application.vdl
deleted file mode 100644
index 71ebdc7..0000000
--- a/services/mgmt/application/application.vdl
+++ /dev/null
@@ -1,25 +0,0 @@
-// Package application contains implementation of the interface for
-// serving application metadata.
-package application
-
-import "veyron2/security"
-import public "veyron2/services/mgmt/application"
-
-// Repository describes an application repository internally. Besides
-// the public Repository interface, it allows to manage the actual
-// application metadata.
-type Repository interface {
-  public.Repository
-  // Put adds the given tuple of application version (specified
-  // through the veyron name suffix) and application envelope to all
-  // of the given application profiles.
-  Put(Profiles []string, Envelope public.Envelope) error {security.WriteLabel}
-  // Remove removes the application envelope for the given profile
-  // name and application version (specified through the veyron name
-  // suffix). If no version is specified as part of the suffix, the
-  // method removes all versions for the given profile.
-  //
-  // TODO(jsimsa): Add support for using "*" to specify all profiles
-  // when Matt implements Globing (or Ken implements querying).
-  Remove(Profile string) error {security.WriteLabel}
-}
diff --git a/services/mgmt/application/application.vdl.go b/services/mgmt/application/application.vdl.go
deleted file mode 100644
index 1be1d59..0000000
--- a/services/mgmt/application/application.vdl.go
+++ /dev/null
@@ -1,337 +0,0 @@
-// This file was auto-generated by the veyron vdl tool.
-// Source: application.vdl
-
-// Package application contains implementation of the interface for
-// serving application metadata.
-package application
-
-import (
-	"veyron2/security"
-
-	"veyron2/services/mgmt/application"
-
-	// The non-user imports are prefixed with "_gen_" to prevent collisions.
-	_gen_veyron2 "veyron2"
-	_gen_context "veyron2/context"
-	_gen_ipc "veyron2/ipc"
-	_gen_naming "veyron2/naming"
-	_gen_rt "veyron2/rt"
-	_gen_vdl "veyron2/vdl"
-	_gen_wiretype "veyron2/wiretype"
-)
-
-// Repository describes an application repository internally. Besides
-// the public Repository interface, it allows to manage the actual
-// application metadata.
-// Repository is the interface the client binds and uses.
-// Repository_ExcludingUniversal is the interface without internal framework-added methods
-// to enable embedding without method collisions.  Not to be used directly by clients.
-type Repository_ExcludingUniversal interface {
-	// Repository provides access to application envelopes. An
-	// application envelope is identified by an application name and an
-	// application version, which are specified through the veyron name,
-	// and a profile name, which is specified using a method argument.
-	//
-	// Example:
-	// /apps/search/v1.Match([]string{"base", "media"})
-	//   returns an application envelope that can be used for downloading
-	//   and executing the "search" application, version "v1", runnable
-	//   on either the "base" or "media" profile.
-	//
-	// Further, we envision that there will be special "latest" and
-	// "release" versions that will be symbolic links whose mapping is
-	// maintained by a mount table.
-	application.Repository_ExcludingUniversal
-	// Put adds the given tuple of application version (specified
-	// through the veyron name suffix) and application envelope to all
-	// of the given application profiles.
-	Put(ctx _gen_context.T, Profiles []string, Envelope application.Envelope, opts ..._gen_ipc.CallOpt) (err error)
-	// Remove removes the application envelope for the given profile
-	// name and application version (specified through the veyron name
-	// suffix). If no version is specified as part of the suffix, the
-	// method removes all versions for the given profile.
-	//
-	// TODO(jsimsa): Add support for using "*" to specify all profiles
-	// when Matt implements Globing (or Ken implements querying).
-	Remove(ctx _gen_context.T, Profile string, opts ..._gen_ipc.CallOpt) (err error)
-}
-type Repository interface {
-	_gen_ipc.UniversalServiceMethods
-	Repository_ExcludingUniversal
-}
-
-// RepositoryService is the interface the server implements.
-type RepositoryService interface {
-
-	// Repository provides access to application envelopes. An
-	// application envelope is identified by an application name and an
-	// application version, which are specified through the veyron name,
-	// and a profile name, which is specified using a method argument.
-	//
-	// Example:
-	// /apps/search/v1.Match([]string{"base", "media"})
-	//   returns an application envelope that can be used for downloading
-	//   and executing the "search" application, version "v1", runnable
-	//   on either the "base" or "media" profile.
-	//
-	// Further, we envision that there will be special "latest" and
-	// "release" versions that will be symbolic links whose mapping is
-	// maintained by a mount table.
-	application.RepositoryService
-	// Put adds the given tuple of application version (specified
-	// through the veyron name suffix) and application envelope to all
-	// of the given application profiles.
-	Put(context _gen_ipc.ServerContext, Profiles []string, Envelope application.Envelope) (err error)
-	// Remove removes the application envelope for the given profile
-	// name and application version (specified through the veyron name
-	// suffix). If no version is specified as part of the suffix, the
-	// method removes all versions for the given profile.
-	//
-	// TODO(jsimsa): Add support for using "*" to specify all profiles
-	// when Matt implements Globing (or Ken implements querying).
-	Remove(context _gen_ipc.ServerContext, Profile string) (err error)
-}
-
-// BindRepository returns the client stub implementing the Repository
-// interface.
-//
-// If no _gen_ipc.Client is specified, the default _gen_ipc.Client in the
-// global Runtime is used.
-func BindRepository(name string, opts ..._gen_ipc.BindOpt) (Repository, error) {
-	var client _gen_ipc.Client
-	switch len(opts) {
-	case 0:
-		client = _gen_rt.R().Client()
-	case 1:
-		switch o := opts[0].(type) {
-		case _gen_veyron2.Runtime:
-			client = o.Client()
-		case _gen_ipc.Client:
-			client = o
-		default:
-			return nil, _gen_vdl.ErrUnrecognizedOption
-		}
-	default:
-		return nil, _gen_vdl.ErrTooManyOptionsToBind
-	}
-	stub := &clientStubRepository{client: client, name: name}
-	stub.Repository_ExcludingUniversal, _ = application.BindRepository(name, client)
-
-	return stub, nil
-}
-
-// NewServerRepository creates a new server stub.
-//
-// It takes a regular server implementing the RepositoryService
-// interface, and returns a new server stub.
-func NewServerRepository(server RepositoryService) interface{} {
-	return &ServerStubRepository{
-		ServerStubRepository: *application.NewServerRepository(server).(*application.ServerStubRepository),
-		service:              server,
-	}
-}
-
-// clientStubRepository implements Repository.
-type clientStubRepository struct {
-	application.Repository_ExcludingUniversal
-
-	client _gen_ipc.Client
-	name   string
-}
-
-func (__gen_c *clientStubRepository) Put(ctx _gen_context.T, Profiles []string, Envelope application.Envelope, opts ..._gen_ipc.CallOpt) (err error) {
-	var call _gen_ipc.Call
-	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Put", []interface{}{Profiles, Envelope}, opts...); err != nil {
-		return
-	}
-	if ierr := call.Finish(&err); ierr != nil {
-		err = ierr
-	}
-	return
-}
-
-func (__gen_c *clientStubRepository) Remove(ctx _gen_context.T, Profile string, opts ..._gen_ipc.CallOpt) (err error) {
-	var call _gen_ipc.Call
-	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Remove", []interface{}{Profile}, opts...); err != nil {
-		return
-	}
-	if ierr := call.Finish(&err); ierr != nil {
-		err = ierr
-	}
-	return
-}
-
-func (__gen_c *clientStubRepository) UnresolveStep(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
-	var call _gen_ipc.Call
-	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
-		return
-	}
-	if ierr := call.Finish(&reply, &err); ierr != nil {
-		err = ierr
-	}
-	return
-}
-
-func (__gen_c *clientStubRepository) Signature(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
-	var call _gen_ipc.Call
-	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
-		return
-	}
-	if ierr := call.Finish(&reply, &err); ierr != nil {
-		err = ierr
-	}
-	return
-}
-
-func (__gen_c *clientStubRepository) GetMethodTags(ctx _gen_context.T, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
-	var call _gen_ipc.Call
-	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
-		return
-	}
-	if ierr := call.Finish(&reply, &err); ierr != nil {
-		err = ierr
-	}
-	return
-}
-
-// ServerStubRepository wraps a server that implements
-// RepositoryService and provides an object that satisfies
-// the requirements of veyron2/ipc.ReflectInvoker.
-type ServerStubRepository struct {
-	application.ServerStubRepository
-
-	service RepositoryService
-}
-
-func (__gen_s *ServerStubRepository) GetMethodTags(call _gen_ipc.ServerCall, method string) ([]interface{}, error) {
-	// TODO(bprosnitz) GetMethodTags() will be replaces with Signature().
-	// Note: This exhibits some weird behavior like returning a nil error if the method isn't found.
-	// This will change when it is replaced with Signature().
-	if resp, err := __gen_s.ServerStubRepository.GetMethodTags(call, method); resp != nil || err != nil {
-		return resp, err
-	}
-	switch method {
-	case "Put":
-		return []interface{}{security.Label(2)}, nil
-	case "Remove":
-		return []interface{}{security.Label(2)}, nil
-	default:
-		return nil, nil
-	}
-}
-
-func (__gen_s *ServerStubRepository) Signature(call _gen_ipc.ServerCall) (_gen_ipc.ServiceSignature, error) {
-	result := _gen_ipc.ServiceSignature{Methods: make(map[string]_gen_ipc.MethodSignature)}
-	result.Methods["Put"] = _gen_ipc.MethodSignature{
-		InArgs: []_gen_ipc.MethodArgument{
-			{Name: "Profiles", Type: 61},
-			{Name: "Envelope", Type: 65},
-		},
-		OutArgs: []_gen_ipc.MethodArgument{
-			{Name: "", Type: 66},
-		},
-	}
-	result.Methods["Remove"] = _gen_ipc.MethodSignature{
-		InArgs: []_gen_ipc.MethodArgument{
-			{Name: "Profile", Type: 3},
-		},
-		OutArgs: []_gen_ipc.MethodArgument{
-			{Name: "", Type: 66},
-		},
-	}
-
-	result.TypeDefs = []_gen_vdl.Any{
-		_gen_wiretype.StructType{
-			[]_gen_wiretype.FieldType{
-				_gen_wiretype.FieldType{Type: 0x3d, Name: "Args"},
-				_gen_wiretype.FieldType{Type: 0x3, Name: "Binary"},
-				_gen_wiretype.FieldType{Type: 0x3d, Name: "Env"},
-			},
-			"veyron2/services/mgmt/application.Envelope", []string(nil)},
-		_gen_wiretype.NamedPrimitiveType{Type: 0x1, Name: "error", Tags: []string(nil)}}
-	var ss _gen_ipc.ServiceSignature
-	var firstAdded int
-	ss, _ = __gen_s.ServerStubRepository.Signature(call)
-	firstAdded = len(result.TypeDefs)
-	for k, v := range ss.Methods {
-		for i, _ := range v.InArgs {
-			if v.InArgs[i].Type >= _gen_wiretype.TypeIDFirst {
-				v.InArgs[i].Type += _gen_wiretype.TypeID(firstAdded)
-			}
-		}
-		for i, _ := range v.OutArgs {
-			if v.OutArgs[i].Type >= _gen_wiretype.TypeIDFirst {
-				v.OutArgs[i].Type += _gen_wiretype.TypeID(firstAdded)
-			}
-		}
-		if v.InStream >= _gen_wiretype.TypeIDFirst {
-			v.InStream += _gen_wiretype.TypeID(firstAdded)
-		}
-		if v.OutStream >= _gen_wiretype.TypeIDFirst {
-			v.OutStream += _gen_wiretype.TypeID(firstAdded)
-		}
-		result.Methods[k] = v
-	}
-	//TODO(bprosnitz) combine type definitions from embeded interfaces in a way that doesn't cause duplication.
-	for _, d := range ss.TypeDefs {
-		switch wt := d.(type) {
-		case _gen_wiretype.SliceType:
-			if wt.Elem >= _gen_wiretype.TypeIDFirst {
-				wt.Elem += _gen_wiretype.TypeID(firstAdded)
-			}
-			d = wt
-		case _gen_wiretype.ArrayType:
-			if wt.Elem >= _gen_wiretype.TypeIDFirst {
-				wt.Elem += _gen_wiretype.TypeID(firstAdded)
-			}
-			d = wt
-		case _gen_wiretype.MapType:
-			if wt.Key >= _gen_wiretype.TypeIDFirst {
-				wt.Key += _gen_wiretype.TypeID(firstAdded)
-			}
-			if wt.Elem >= _gen_wiretype.TypeIDFirst {
-				wt.Elem += _gen_wiretype.TypeID(firstAdded)
-			}
-			d = wt
-		case _gen_wiretype.StructType:
-			for i, fld := range wt.Fields {
-				if fld.Type >= _gen_wiretype.TypeIDFirst {
-					wt.Fields[i].Type += _gen_wiretype.TypeID(firstAdded)
-				}
-			}
-			d = wt
-			// NOTE: other types are missing, but we are upgrading anyways.
-		}
-		result.TypeDefs = append(result.TypeDefs, d)
-	}
-
-	return result, nil
-}
-
-func (__gen_s *ServerStubRepository) UnresolveStep(call _gen_ipc.ServerCall) (reply []string, err error) {
-	if unresolver, ok := __gen_s.service.(_gen_ipc.Unresolver); ok {
-		return unresolver.UnresolveStep(call)
-	}
-	if call.Server() == nil {
-		return
-	}
-	var published []string
-	if published, err = call.Server().Published(); err != nil || published == nil {
-		return
-	}
-	reply = make([]string, len(published))
-	for i, p := range published {
-		reply[i] = _gen_naming.Join(p, call.Name())
-	}
-	return
-}
-
-func (__gen_s *ServerStubRepository) Put(call _gen_ipc.ServerCall, Profiles []string, Envelope application.Envelope) (err error) {
-	err = __gen_s.service.Put(call, Profiles, Envelope)
-	return
-}
-
-func (__gen_s *ServerStubRepository) Remove(call _gen_ipc.ServerCall, Profile string) (err error) {
-	err = __gen_s.service.Remove(call, Profile)
-	return
-}
diff --git a/services/mgmt/application/impl/dispatcher.go b/services/mgmt/application/impl/dispatcher.go
index aaaadc6..d438fd2 100644
--- a/services/mgmt/application/impl/dispatcher.go
+++ b/services/mgmt/application/impl/dispatcher.go
@@ -1,7 +1,7 @@
 package impl
 
 import (
-	"veyron/services/mgmt/application"
+	"veyron/services/mgmt/repository"
 
 	"veyron2/ipc"
 	"veyron2/security"
@@ -9,7 +9,7 @@
 	"veyron2/storage/vstore"
 )
 
-// dispatcher holds the state of the application manager dispatcher.
+// dispatcher holds the state of the application repository dispatcher.
 type dispatcher struct {
 	store storage.Store
 	auth  security.Authorizer
@@ -27,6 +27,6 @@
 // DISPATCHER INTERFACE IMPLEMENTATION
 
 func (d *dispatcher) Lookup(suffix string) (ipc.Invoker, security.Authorizer, error) {
-	invoker := ipc.ReflectInvoker(application.NewServerRepository(NewInvoker(d.store, suffix)))
+	invoker := ipc.ReflectInvoker(repository.NewServerApplication(NewInvoker(d.store, suffix)))
 	return invoker, d.auth, nil
 }
diff --git a/services/mgmt/application/impl/impl_test.go b/services/mgmt/application/impl/impl_test.go
index 756a46f..cee0cdb 100644
--- a/services/mgmt/application/impl/impl_test.go
+++ b/services/mgmt/application/impl/impl_test.go
@@ -4,8 +4,8 @@
 	"reflect"
 	"testing"
 
-	iapplication "veyron/services/mgmt/application"
-	istore "veyron/services/store/testutil"
+	"veyron/services/mgmt/repository"
+	"veyron/services/store/testutil"
 
 	"veyron2/naming"
 	"veyron2/rt"
@@ -19,14 +19,14 @@
 	ctx := runtime.NewContext()
 	defer runtime.Shutdown()
 
-	// Setup and start the application manager server.
+	// Setup and start the application repository server.
 	server, err := runtime.NewServer()
 	if err != nil {
 		t.Fatalf("NewServer() failed: %v", err)
 	}
 
 	// Setup and start a store server.
-	name, cleanup := istore.NewStore(t, server, runtime.Identity().PublicID())
+	name, cleanup := testutil.NewStore(t, server, runtime.Identity().PublicID())
 	defer cleanup()
 
 	dispatcher, err := NewDispatcher(name, nil)
@@ -44,15 +44,15 @@
 	}
 
 	// Create client stubs for talking to the server.
-	stub, err := iapplication.BindRepository(naming.JoinAddressName(endpoint.String(), "//search"))
+	stub, err := repository.BindApplication(naming.JoinAddressName(endpoint.String(), "//search"))
 	if err != nil {
 		t.Fatalf("BindRepository() failed: %v", err)
 	}
-	stubV1, err := iapplication.BindRepository(naming.JoinAddressName(endpoint.String(), "//search/v1"))
+	stubV1, err := repository.BindApplication(naming.JoinAddressName(endpoint.String(), "//search/v1"))
 	if err != nil {
 		t.Fatalf("BindRepository() failed: %v", err)
 	}
-	stubV2, err := iapplication.BindRepository(naming.JoinAddressName(endpoint.String(), "//search/v2"))
+	stubV2, err := repository.BindApplication(naming.JoinAddressName(endpoint.String(), "//search/v2"))
 	if err != nil {
 		t.Fatalf("BindRepository() failed: %v", err)
 	}
@@ -138,7 +138,7 @@
 		t.Fatalf("Unexpected error: expected %v, got %v", errNotFound, err)
 	}
 
-	// Shutdown the application manager server.
+	// Shutdown the application repository server.
 	if err := server.Stop(); err != nil {
 		t.Fatalf("Stop() failed: %v", err)
 	}
diff --git a/services/mgmt/application/impl/invoker.go b/services/mgmt/application/impl/invoker.go
index 4ec02e0..818d053 100644
--- a/services/mgmt/application/impl/invoker.go
+++ b/services/mgmt/application/impl/invoker.go
@@ -12,7 +12,7 @@
 	"veyron2/vlog"
 )
 
-// invoker holds the state of an application manager invocation.
+// invoker holds the state of an application repository invocation.
 type invoker struct {
 	// store is the storage server used for storing application
 	// metadata.
diff --git a/services/mgmt/content/impl/dispatcher.go b/services/mgmt/content/impl/dispatcher.go
index 8ba4074..065c101 100644
--- a/services/mgmt/content/impl/dispatcher.go
+++ b/services/mgmt/content/impl/dispatcher.go
@@ -5,10 +5,10 @@
 
 	"veyron2/ipc"
 	"veyron2/security"
-	"veyron2/services/mgmt/content"
+	"veyron2/services/mgmt/repository"
 )
 
-// dispatcher holds the state of the content manager dispatcher.
+// dispatcher holds the state of the content repository dispatcher.
 type dispatcher struct {
 	root  string
 	depth int
@@ -24,6 +24,6 @@
 // DISPATCHER INTERFACE IMPLEMENTATION
 
 func (d *dispatcher) Lookup(suffix string) (ipc.Invoker, security.Authorizer, error) {
-	invoker := ipc.ReflectInvoker(content.NewServerRepository(newInvoker(d.root, d.depth, &d.fs, suffix)))
+	invoker := ipc.ReflectInvoker(repository.NewServerContent(newInvoker(d.root, d.depth, &d.fs, suffix)))
 	return invoker, d.auth, nil
 }
diff --git a/services/mgmt/content/impl/impl_test.go b/services/mgmt/content/impl/impl_test.go
index 997b373..4d04924 100644
--- a/services/mgmt/content/impl/impl_test.go
+++ b/services/mgmt/content/impl/impl_test.go
@@ -11,7 +11,7 @@
 	"veyron2"
 	"veyron2/naming"
 	"veyron2/rt"
-	"veyron2/services/mgmt/content"
+	"veyron2/services/mgmt/repository"
 )
 
 const (
@@ -25,7 +25,7 @@
 
 // invokeUpload invokes the Upload RPC using the given client stub
 // <stub> and streams the given content <content> to it.
-func invokeUpload(t *testing.T, stub content.Repository, content []byte) (string, error) {
+func invokeUpload(t *testing.T, stub repository.Content, content []byte) (string, error) {
 	stream, err := stub.Upload(rt.R().NewContext())
 	if err != nil {
 		return "", err
@@ -47,7 +47,7 @@
 
 // invokeDownload invokes the Download RPC using the given client stub
 // <stub> and streams content from to it.
-func invokeDownload(t *testing.T, stub content.Repository) ([]byte, error) {
+func invokeDownload(t *testing.T, stub repository.Content) ([]byte, error) {
 	stream, err := stub.Download(rt.R().NewContext())
 	if err != nil {
 		return nil, err
@@ -62,19 +62,19 @@
 
 // invokeDelete invokes the Delete RPC using the given client stub
 // <stub>.
-func invokeDelete(t *testing.T, stub content.Repository) error {
+func invokeDelete(t *testing.T, stub repository.Content) error {
 	return stub.Delete(rt.R().NewContext())
 }
 
-// testInterface tests the content manager interface using the given
-// depth for hierarchy of content objects.
+// testInterface tests the content repository interface using the
+// given depth for hierarchy of content objects.
 func testInterface(t *testing.T, runtime veyron2.Runtime, depth int) {
 	root, err := ioutil.TempDir("", veyronPrefix)
 	if err != nil {
 		t.Fatalf("TempDir() failed: %v", err)
 	}
 
-	// Setup and start the content manager server.
+	// Setup and start the content repository server.
 	server, err := runtime.NewServer()
 	if err != nil {
 		t.Fatalf("NewServer() failed: %v", err)
@@ -92,7 +92,7 @@
 
 	// Create client stubs for talking to the server.
 	name := naming.JoinAddressName(endpoint.String(), "//")
-	stub, err := content.BindRepository(name)
+	stub, err := repository.BindContent(name)
 	if err != nil {
 		t.Fatalf("BindRepository() failed: %v", err)
 	}
@@ -110,7 +110,7 @@
 	}
 
 	// Download
-	stub, err = content.BindRepository(naming.Join(name, checksum))
+	stub, err = repository.BindContent(naming.Join(name, checksum))
 	if err != nil {
 		t.Fatalf("BindRepository() failed: %v", err)
 	}
@@ -133,13 +133,13 @@
 		t.Fatalf("Remove() failed: %v", err)
 	}
 
-	// Shutdown the content manager server.
+	// Shutdown the content repository server.
 	if err := server.Stop(); err != nil {
 		t.Fatalf("Stop() failed: %v", err)
 	}
 }
 
-// TestHierarchy checks that the content manager works correctly for
+// TestHierarchy checks that the content repository works correctly for
 // all possible valid values of the depth used for the directory
 // hierarchy that stores content objects in the local file system.
 func TestHierarchy(t *testing.T) {
diff --git a/services/mgmt/content/impl/invoker.go b/services/mgmt/content/impl/invoker.go
index 56775e3..2f5509d 100644
--- a/services/mgmt/content/impl/invoker.go
+++ b/services/mgmt/content/impl/invoker.go
@@ -14,17 +14,17 @@
 	"syscall"
 
 	"veyron2/ipc"
-	"veyron2/services/mgmt/content"
+	"veyron2/services/mgmt/repository"
 	"veyron2/vlog"
 )
 
-// invoker holds the state of a content manager invocation.
+// invoker holds the state of a content repository invocation.
 type invoker struct {
-	// root is the directory at which the content manager namespace is
+	// root is the directory at which the content repository namespace is
 	// mounted.
 	root string
 	// depth determines the depth of the directory hierarchy that the
-	// content manager uses to organize the content in the local file
+	// content repository uses to organize the content in the local file
 	// system. There is a trade-off here: smaller values lead to faster
 	// access, while higher values allow the performance to scale to
 	// large content collections. The number should be a value in
@@ -36,7 +36,7 @@
 	// filesystem limitations), then you should set depth to at least
 	// log_256(X/Y). For example, using hierarchyDepth = 3 with a local
 	// filesystem that can handle up to 1,000 entries per directory
-	// before its performance degrades allows the content manager to
+	// before its performance degrades allows the content repository to
 	// store 16B objects.
 	depth int
 	// fs is a lock used to atomatically modify the contents of the
@@ -116,7 +116,7 @@
 	return nil
 }
 
-func (i *invoker) Download(context ipc.ServerContext, stream content.RepositoryServiceDownloadStream) error {
+func (i *invoker) Download(context ipc.ServerContext, stream repository.ContentServiceDownloadStream) error {
 	vlog.VI(0).Infof("%v.Download()", i.suffix)
 	if !isValid(i.suffix) {
 		return errInvalidSuffix
@@ -147,7 +147,7 @@
 	return nil
 }
 
-func (i *invoker) Upload(context ipc.ServerContext, stream content.RepositoryServiceUploadStream) (string, error) {
+func (i *invoker) Upload(context ipc.ServerContext, stream repository.ContentServiceUploadStream) (string, error) {
 	vlog.VI(0).Infof("%v.Upload()", i.suffix)
 	if i.suffix != "" {
 		return "", errInvalidSuffix
diff --git a/services/mgmt/node/impl/impl_test.go b/services/mgmt/node/impl/impl_test.go
index 9876192..aa43a79 100644
--- a/services/mgmt/node/impl/impl_test.go
+++ b/services/mgmt/node/impl/impl_test.go
@@ -26,7 +26,7 @@
 	"veyron2/naming"
 	"veyron2/rt"
 	"veyron2/services/mgmt/application"
-	"veyron2/services/mgmt/content"
+	"veyron2/services/mgmt/repository"
 	"veyron2/vlog"
 )
 
@@ -66,7 +66,7 @@
 	return nil
 }
 
-func (i *crInvoker) Download(_ ipc.ServerContext, stream content.RepositoryServiceDownloadStream) error {
+func (i *crInvoker) Download(_ ipc.ServerContext, stream repository.ContentServiceDownloadStream) error {
 	vlog.VI(0).Infof("Download()")
 	file, err := os.Open(os.Args[0])
 	if err != nil {
@@ -93,7 +93,7 @@
 	}
 }
 
-func (i *crInvoker) Upload(ipc.ServerContext, content.RepositoryServiceUploadStream) (string, error) {
+func (i *crInvoker) Upload(ipc.ServerContext, repository.ContentServiceUploadStream) (string, error) {
 	vlog.VI(0).Infof("Upload()")
 	return "", nil
 }
@@ -244,7 +244,7 @@
 	if err != nil {
 		vlog.Fatalf("NewServer() failed: %v", err)
 	}
-	suffix, dispatcher := "", ipc.SoloDispatcher(application.NewServerRepository(&arInvoker{}), nil)
+	suffix, dispatcher := "", ipc.SoloDispatcher(repository.NewServerApplication(&arInvoker{}), nil)
 	if err := server.Register(suffix, dispatcher); err != nil {
 		vlog.Fatalf("Register(%v, %v) failed: %v", suffix, dispatcher, err)
 	}
@@ -270,7 +270,7 @@
 	if err != nil {
 		vlog.Fatalf("NewServer() failed: %v", err)
 	}
-	suffix, dispatcher := "", ipc.SoloDispatcher(content.NewServerRepository(&crInvoker{}), nil)
+	suffix, dispatcher := "", ipc.SoloDispatcher(repository.NewServerContent(&crInvoker{}), nil)
 	if err := server.Register(suffix, dispatcher); err != nil {
 		vlog.Fatalf("Register(%v, %v) failed: %v", suffix, dispatcher, err)
 	}
diff --git a/services/mgmt/node/impl/invoker.go b/services/mgmt/node/impl/invoker.go
index d230ed7..5f68e23 100644
--- a/services/mgmt/node/impl/invoker.go
+++ b/services/mgmt/node/impl/invoker.go
@@ -50,8 +50,8 @@
 	"veyron2/rt"
 	"veyron2/services/mgmt/application"
 	"veyron2/services/mgmt/build"
-	"veyron2/services/mgmt/content"
 	"veyron2/services/mgmt/node"
+	"veyron2/services/mgmt/repository"
 	"veyron2/vlog"
 )
 
@@ -327,7 +327,7 @@
 // APPLICATION INTERFACE IMPLEMENTATION
 
 func downloadBinary(workspace, binary string) error {
-	stub, err := content.BindRepository(binary)
+	stub, err := repository.BindContent(binary)
 	if err != nil {
 		vlog.Errorf("BindContent(%q) failed: %v", binary, err)
 		return errOperationFailed
@@ -371,7 +371,7 @@
 }
 
 func fetchEnvelope(origin string) (*application.Envelope, error) {
-	stub, err := application.BindRepository(origin)
+	stub, err := repository.BindApplication(origin)
 	if err != nil {
 		vlog.Errorf("BindRepository(%v) failed: %v", origin, err)
 		return nil, errOperationFailed
diff --git a/services/mgmt/profile/impl/dispatcher.go b/services/mgmt/profile/impl/dispatcher.go
index ccf5972..fd25fde 100644
--- a/services/mgmt/profile/impl/dispatcher.go
+++ b/services/mgmt/profile/impl/dispatcher.go
@@ -1,7 +1,7 @@
 package impl
 
 import (
-	"veyron/services/mgmt/profile"
+	"veyron/services/mgmt/repository"
 
 	"veyron2/ipc"
 	"veyron2/security"
@@ -9,7 +9,7 @@
 	"veyron2/storage/vstore"
 )
 
-// dispatcher holds the state of the profile manager dispatcher.
+// dispatcher holds the state of the profile repository dispatcher.
 type dispatcher struct {
 	store storage.Store
 	auth  security.Authorizer
@@ -27,6 +27,6 @@
 // DISPATCHER INTERFACE IMPLEMENTATION
 
 func (d *dispatcher) Lookup(suffix string) (ipc.Invoker, security.Authorizer, error) {
-	invoker := ipc.ReflectInvoker(profile.NewServerProfile(NewInvoker(d.store, suffix)))
+	invoker := ipc.ReflectInvoker(repository.NewServerProfile(NewInvoker(d.store, suffix)))
 	return invoker, d.auth, nil
 }
diff --git a/services/mgmt/profile/impl/impl_test.go b/services/mgmt/profile/impl/impl_test.go
index b3d28df..777444c 100644
--- a/services/mgmt/profile/impl/impl_test.go
+++ b/services/mgmt/profile/impl/impl_test.go
@@ -5,7 +5,8 @@
 	"testing"
 
 	"veyron/services/mgmt/profile"
-	istore "veyron/services/store/testutil"
+	"veyron/services/mgmt/repository"
+	"veyron/services/store/testutil"
 
 	"veyron2/naming"
 	"veyron2/rt"
@@ -17,7 +18,7 @@
 		Format:      profile.Format{Name: "elf", Attributes: map[string]string{"os": "linux", "arch": "amd64"}},
 		Libraries:   map[profile.Library]struct{}{profile.Library{Name: "foo", MajorVersion: "1", MinorVersion: "0"}: struct{}{}},
 		Label:       "example",
-		Description: "Example profile to test the profile manager implementation.",
+		Description: "Example profile to test the profile repository implementation.",
 	}
 )
 
@@ -29,14 +30,14 @@
 
 	ctx := runtime.NewContext()
 
-	// Setup and start the profile manager server.
+	// Setup and start the profile repository server.
 	server, err := runtime.NewServer()
 	if err != nil {
 		t.Fatalf("NewServer() failed: %v", err)
 	}
 
 	// Setup and start a store server.
-	mountPoint, cleanup := istore.NewStore(t, server, runtime.Identity().PublicID())
+	mountPoint, cleanup := testutil.NewStore(t, server, runtime.Identity().PublicID())
 	defer cleanup()
 
 	dispatcher, err := NewDispatcher(mountPoint, nil)
@@ -56,10 +57,10 @@
 	if err := server.Publish(name); err != nil {
 		t.Fatalf("Publish(%v) failed: %v", name, err)
 	}
-	t.Logf("Profile manager published at %v/%v", endpoint, name)
+	t.Logf("Profile repository published at %v/%v", endpoint, name)
 
 	// Create client stubs for talking to the server.
-	stub, err := profile.BindProfile(naming.JoinAddressName(endpoint.String(), "//linux/base"))
+	stub, err := repository.BindProfile(naming.JoinAddressName(endpoint.String(), "//linux/base"))
 	if err != nil {
 		t.Fatalf("BindApplication() failed: %v", err)
 	}
diff --git a/services/mgmt/profile/impl/invoker.go b/services/mgmt/profile/impl/invoker.go
index 2e4946c..bb7ad12 100644
--- a/services/mgmt/profile/impl/invoker.go
+++ b/services/mgmt/profile/impl/invoker.go
@@ -12,7 +12,7 @@
 	"veyron2/vlog"
 )
 
-// invoker holds the profile manager invocation.
+// invoker holds the profile repository invocation.
 type invoker struct {
 	// store is the storage server used for storing profile data.
 	store storage.Store
diff --git a/services/mgmt/profile/profile.vdl b/services/mgmt/profile/profile.vdl
index 80f3a7b..d37c59b 100644
--- a/services/mgmt/profile/profile.vdl
+++ b/services/mgmt/profile/profile.vdl
@@ -2,11 +2,6 @@
 // types used by the implementation of Veyron profiles.
 package profile
 
-import (
-  "veyron2/security"
-  public "veyron2/services/mgmt/profile"
-)
-
 // Format includes a type (e.g. ELF) and each instance of the format
 // has some specific attributes. The key attributes are the target
 // operating system (e.g. for ELF this could be one of System V,
@@ -14,45 +9,29 @@
 // the target instruction set architecture (e.g. for ELF this could be
 // one of SPARC, x86, PowerPC, ARM, IA-64, x86-64, and AArch64).
 type Format struct {
-  Name       string
-  Attributes map[string]string
+	Name       string
+	Attributes map[string]string
 }
 
 // Library describes a shared library that applications may use.
 type Library struct {
-  // Name is the name of the library.
-  Name string
-  // MajorVersion is the major version of the library.
-  MajorVersion string
-  // MinorVersion is the minor version of the library.
-  MinorVersion string
+	// Name is the name of the library.
+	Name         string
+	// MajorVersion is the major version of the library.
+	MajorVersion string
+	// MinorVersion is the minor version of the library.
+	MinorVersion string
 }
 
 // Specification is how we represent a profile internally. It should
 // provide enough information to allow matching of binaries to nodes.
 type Specification struct {
-  // Format is the file format of the application binary.
-  Format Format
-  // Libraries is a set of libraries the application binary depends on.
-  Libraries set[Library]
-  // A human-friendly concise label for the profile, e.g. "linux-media"
-  Label string
-  // A human-friendly description of the profile.
-  Description string
-}
-
-// Profile describes a profile internally. Besides the public Profile
-// interface, it allows to access and manage the actual profile
-// implementation information.
-type Profile interface {
-  public.Profile
-  // Specification returns the profile specification for the profile
-  // identified through the veyron name suffix.
-  Specification() (Specification, error) {security.ReadLabel}
-  // Put sets the profile specification for the profile identified
-  // through the veyron name suffix.
-  Put(Specification Specification) error {security.WriteLabel}
-  // Remove removes the profile specification for the profile
-  // identified through the veyron name suffix.
-  Remove() error {security.WriteLabel}
+	// Format is the file format of the application binary.
+	Format      Format
+	// Libraries is a set of libraries the application binary depends on.
+	Libraries   set[Library]
+	// A human-friendly concise label for the profile, e.g. "linux-media"
+	Label       string
+	// A human-friendly description of the profile.
+	Description string
 }
diff --git a/services/mgmt/profile/profile.vdl.go b/services/mgmt/profile/profile.vdl.go
index 8f460f0..c219f26 100644
--- a/services/mgmt/profile/profile.vdl.go
+++ b/services/mgmt/profile/profile.vdl.go
@@ -5,21 +5,6 @@
 // types used by the implementation of Veyron profiles.
 package profile
 
-import (
-	"veyron2/security"
-
-	"veyron2/services/mgmt/profile"
-
-	// The non-user imports are prefixed with "_gen_" to prevent collisions.
-	_gen_veyron2 "veyron2"
-	_gen_context "veyron2/context"
-	_gen_ipc "veyron2/ipc"
-	_gen_naming "veyron2/naming"
-	_gen_rt "veyron2/rt"
-	_gen_vdl "veyron2/vdl"
-	_gen_wiretype "veyron2/wiretype"
-)
-
 // Format includes a type (e.g. ELF) and each instance of the format
 // has some specific attributes. The key attributes are the target
 // operating system (e.g. for ELF this could be one of System V,
@@ -53,329 +38,3 @@
 	// A human-friendly description of the profile.
 	Description string
 }
-
-// Profile describes a profile internally. Besides the public Profile
-// interface, it allows to access and manage the actual profile
-// implementation information.
-// Profile is the interface the client binds and uses.
-// Profile_ExcludingUniversal is the interface without internal framework-added methods
-// to enable embedding without method collisions.  Not to be used directly by clients.
-type Profile_ExcludingUniversal interface {
-	// Profile abstracts a device's ability to run binaries, and hides
-	// specifics such as operating system, hardware architecture, and the
-	// set of installed libraries. Profiles describe binaries and devices,
-	// and are used to match them.
-	profile.Profile_ExcludingUniversal
-	// Specification returns the profile specification for the profile
-	// identified through the veyron name suffix.
-	Specification(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply Specification, err error)
-	// Put sets the profile specification for the profile identified
-	// through the veyron name suffix.
-	Put(ctx _gen_context.T, Specification Specification, opts ..._gen_ipc.CallOpt) (err error)
-	// Remove removes the profile specification for the profile
-	// identified through the veyron name suffix.
-	Remove(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (err error)
-}
-type Profile interface {
-	_gen_ipc.UniversalServiceMethods
-	Profile_ExcludingUniversal
-}
-
-// ProfileService is the interface the server implements.
-type ProfileService interface {
-
-	// Profile abstracts a device's ability to run binaries, and hides
-	// specifics such as operating system, hardware architecture, and the
-	// set of installed libraries. Profiles describe binaries and devices,
-	// and are used to match them.
-	profile.ProfileService
-	// Specification returns the profile specification for the profile
-	// identified through the veyron name suffix.
-	Specification(context _gen_ipc.ServerContext) (reply Specification, err error)
-	// Put sets the profile specification for the profile identified
-	// through the veyron name suffix.
-	Put(context _gen_ipc.ServerContext, Specification Specification) (err error)
-	// Remove removes the profile specification for the profile
-	// identified through the veyron name suffix.
-	Remove(context _gen_ipc.ServerContext) (err error)
-}
-
-// BindProfile returns the client stub implementing the Profile
-// interface.
-//
-// If no _gen_ipc.Client is specified, the default _gen_ipc.Client in the
-// global Runtime is used.
-func BindProfile(name string, opts ..._gen_ipc.BindOpt) (Profile, error) {
-	var client _gen_ipc.Client
-	switch len(opts) {
-	case 0:
-		client = _gen_rt.R().Client()
-	case 1:
-		switch o := opts[0].(type) {
-		case _gen_veyron2.Runtime:
-			client = o.Client()
-		case _gen_ipc.Client:
-			client = o
-		default:
-			return nil, _gen_vdl.ErrUnrecognizedOption
-		}
-	default:
-		return nil, _gen_vdl.ErrTooManyOptionsToBind
-	}
-	stub := &clientStubProfile{client: client, name: name}
-	stub.Profile_ExcludingUniversal, _ = profile.BindProfile(name, client)
-
-	return stub, nil
-}
-
-// NewServerProfile creates a new server stub.
-//
-// It takes a regular server implementing the ProfileService
-// interface, and returns a new server stub.
-func NewServerProfile(server ProfileService) interface{} {
-	return &ServerStubProfile{
-		ServerStubProfile: *profile.NewServerProfile(server).(*profile.ServerStubProfile),
-		service:           server,
-	}
-}
-
-// clientStubProfile implements Profile.
-type clientStubProfile struct {
-	profile.Profile_ExcludingUniversal
-
-	client _gen_ipc.Client
-	name   string
-}
-
-func (__gen_c *clientStubProfile) Specification(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply Specification, err error) {
-	var call _gen_ipc.Call
-	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Specification", nil, opts...); err != nil {
-		return
-	}
-	if ierr := call.Finish(&reply, &err); ierr != nil {
-		err = ierr
-	}
-	return
-}
-
-func (__gen_c *clientStubProfile) Put(ctx _gen_context.T, Specification Specification, opts ..._gen_ipc.CallOpt) (err error) {
-	var call _gen_ipc.Call
-	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Put", []interface{}{Specification}, opts...); err != nil {
-		return
-	}
-	if ierr := call.Finish(&err); ierr != nil {
-		err = ierr
-	}
-	return
-}
-
-func (__gen_c *clientStubProfile) Remove(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (err error) {
-	var call _gen_ipc.Call
-	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Remove", nil, opts...); err != nil {
-		return
-	}
-	if ierr := call.Finish(&err); ierr != nil {
-		err = ierr
-	}
-	return
-}
-
-func (__gen_c *clientStubProfile) UnresolveStep(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
-	var call _gen_ipc.Call
-	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
-		return
-	}
-	if ierr := call.Finish(&reply, &err); ierr != nil {
-		err = ierr
-	}
-	return
-}
-
-func (__gen_c *clientStubProfile) Signature(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
-	var call _gen_ipc.Call
-	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
-		return
-	}
-	if ierr := call.Finish(&reply, &err); ierr != nil {
-		err = ierr
-	}
-	return
-}
-
-func (__gen_c *clientStubProfile) GetMethodTags(ctx _gen_context.T, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
-	var call _gen_ipc.Call
-	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
-		return
-	}
-	if ierr := call.Finish(&reply, &err); ierr != nil {
-		err = ierr
-	}
-	return
-}
-
-// ServerStubProfile wraps a server that implements
-// ProfileService and provides an object that satisfies
-// the requirements of veyron2/ipc.ReflectInvoker.
-type ServerStubProfile struct {
-	profile.ServerStubProfile
-
-	service ProfileService
-}
-
-func (__gen_s *ServerStubProfile) GetMethodTags(call _gen_ipc.ServerCall, method string) ([]interface{}, error) {
-	// TODO(bprosnitz) GetMethodTags() will be replaces with Signature().
-	// Note: This exhibits some weird behavior like returning a nil error if the method isn't found.
-	// This will change when it is replaced with Signature().
-	if resp, err := __gen_s.ServerStubProfile.GetMethodTags(call, method); resp != nil || err != nil {
-		return resp, err
-	}
-	switch method {
-	case "Specification":
-		return []interface{}{security.Label(1)}, nil
-	case "Put":
-		return []interface{}{security.Label(2)}, nil
-	case "Remove":
-		return []interface{}{security.Label(2)}, nil
-	default:
-		return nil, nil
-	}
-}
-
-func (__gen_s *ServerStubProfile) Signature(call _gen_ipc.ServerCall) (_gen_ipc.ServiceSignature, error) {
-	result := _gen_ipc.ServiceSignature{Methods: make(map[string]_gen_ipc.MethodSignature)}
-	result.Methods["Put"] = _gen_ipc.MethodSignature{
-		InArgs: []_gen_ipc.MethodArgument{
-			{Name: "Specification", Type: 69},
-		},
-		OutArgs: []_gen_ipc.MethodArgument{
-			{Name: "", Type: 70},
-		},
-	}
-	result.Methods["Remove"] = _gen_ipc.MethodSignature{
-		InArgs: []_gen_ipc.MethodArgument{},
-		OutArgs: []_gen_ipc.MethodArgument{
-			{Name: "", Type: 70},
-		},
-	}
-	result.Methods["Specification"] = _gen_ipc.MethodSignature{
-		InArgs: []_gen_ipc.MethodArgument{},
-		OutArgs: []_gen_ipc.MethodArgument{
-			{Name: "", Type: 69},
-			{Name: "", Type: 70},
-		},
-	}
-
-	result.TypeDefs = []_gen_vdl.Any{
-		_gen_wiretype.MapType{Key: 0x3, Elem: 0x3, Name: "", Tags: []string(nil)}, _gen_wiretype.StructType{
-			[]_gen_wiretype.FieldType{
-				_gen_wiretype.FieldType{Type: 0x3, Name: "Name"},
-				_gen_wiretype.FieldType{Type: 0x41, Name: "Attributes"},
-			},
-			"veyron/services/mgmt/profile.Format", []string(nil)},
-		_gen_wiretype.StructType{
-			[]_gen_wiretype.FieldType{
-				_gen_wiretype.FieldType{Type: 0x3, Name: "Name"},
-				_gen_wiretype.FieldType{Type: 0x3, Name: "MajorVersion"},
-				_gen_wiretype.FieldType{Type: 0x3, Name: "MinorVersion"},
-			},
-			"veyron/services/mgmt/profile.Library", []string(nil)},
-		_gen_wiretype.MapType{Key: 0x43, Elem: 0x2, Name: "", Tags: []string(nil)}, _gen_wiretype.StructType{
-			[]_gen_wiretype.FieldType{
-				_gen_wiretype.FieldType{Type: 0x42, Name: "Format"},
-				_gen_wiretype.FieldType{Type: 0x44, Name: "Libraries"},
-				_gen_wiretype.FieldType{Type: 0x3, Name: "Label"},
-				_gen_wiretype.FieldType{Type: 0x3, Name: "Description"},
-			},
-			"veyron/services/mgmt/profile.Specification", []string(nil)},
-		_gen_wiretype.NamedPrimitiveType{Type: 0x1, Name: "error", Tags: []string(nil)}}
-	var ss _gen_ipc.ServiceSignature
-	var firstAdded int
-	ss, _ = __gen_s.ServerStubProfile.Signature(call)
-	firstAdded = len(result.TypeDefs)
-	for k, v := range ss.Methods {
-		for i, _ := range v.InArgs {
-			if v.InArgs[i].Type >= _gen_wiretype.TypeIDFirst {
-				v.InArgs[i].Type += _gen_wiretype.TypeID(firstAdded)
-			}
-		}
-		for i, _ := range v.OutArgs {
-			if v.OutArgs[i].Type >= _gen_wiretype.TypeIDFirst {
-				v.OutArgs[i].Type += _gen_wiretype.TypeID(firstAdded)
-			}
-		}
-		if v.InStream >= _gen_wiretype.TypeIDFirst {
-			v.InStream += _gen_wiretype.TypeID(firstAdded)
-		}
-		if v.OutStream >= _gen_wiretype.TypeIDFirst {
-			v.OutStream += _gen_wiretype.TypeID(firstAdded)
-		}
-		result.Methods[k] = v
-	}
-	//TODO(bprosnitz) combine type definitions from embeded interfaces in a way that doesn't cause duplication.
-	for _, d := range ss.TypeDefs {
-		switch wt := d.(type) {
-		case _gen_wiretype.SliceType:
-			if wt.Elem >= _gen_wiretype.TypeIDFirst {
-				wt.Elem += _gen_wiretype.TypeID(firstAdded)
-			}
-			d = wt
-		case _gen_wiretype.ArrayType:
-			if wt.Elem >= _gen_wiretype.TypeIDFirst {
-				wt.Elem += _gen_wiretype.TypeID(firstAdded)
-			}
-			d = wt
-		case _gen_wiretype.MapType:
-			if wt.Key >= _gen_wiretype.TypeIDFirst {
-				wt.Key += _gen_wiretype.TypeID(firstAdded)
-			}
-			if wt.Elem >= _gen_wiretype.TypeIDFirst {
-				wt.Elem += _gen_wiretype.TypeID(firstAdded)
-			}
-			d = wt
-		case _gen_wiretype.StructType:
-			for i, fld := range wt.Fields {
-				if fld.Type >= _gen_wiretype.TypeIDFirst {
-					wt.Fields[i].Type += _gen_wiretype.TypeID(firstAdded)
-				}
-			}
-			d = wt
-			// NOTE: other types are missing, but we are upgrading anyways.
-		}
-		result.TypeDefs = append(result.TypeDefs, d)
-	}
-
-	return result, nil
-}
-
-func (__gen_s *ServerStubProfile) UnresolveStep(call _gen_ipc.ServerCall) (reply []string, err error) {
-	if unresolver, ok := __gen_s.service.(_gen_ipc.Unresolver); ok {
-		return unresolver.UnresolveStep(call)
-	}
-	if call.Server() == nil {
-		return
-	}
-	var published []string
-	if published, err = call.Server().Published(); err != nil || published == nil {
-		return
-	}
-	reply = make([]string, len(published))
-	for i, p := range published {
-		reply[i] = _gen_naming.Join(p, call.Name())
-	}
-	return
-}
-
-func (__gen_s *ServerStubProfile) Specification(call _gen_ipc.ServerCall) (reply Specification, err error) {
-	reply, err = __gen_s.service.Specification(call)
-	return
-}
-
-func (__gen_s *ServerStubProfile) Put(call _gen_ipc.ServerCall, Specification Specification) (err error) {
-	err = __gen_s.service.Put(call, Specification)
-	return
-}
-
-func (__gen_s *ServerStubProfile) Remove(call _gen_ipc.ServerCall) (err error) {
-	err = __gen_s.service.Remove(call)
-	return
-}
diff --git a/services/mgmt/repository/repository.vdl b/services/mgmt/repository/repository.vdl
new file mode 100644
index 0000000..5ef30d9
--- /dev/null
+++ b/services/mgmt/repository/repository.vdl
@@ -0,0 +1,44 @@
+// Package repository contains implementation of the interface for
+// storing and serving various veyron management objects.
+package repository
+
+import (
+	"veyron/services/mgmt/profile"
+	"veyron2/security"
+	"veyron2/services/mgmt/application"
+	public "veyron2/services/mgmt/repository"
+)
+
+// Application describes an application repository internally. Besides
+// the public Application interface, it allows to add and remove
+// application envelopes.
+type Application interface {
+	public.Application
+	// Put adds the given tuple of application version (specified
+	// through the veyron name suffix) and application envelope to all
+	// of the given application profiles.
+	Put(Profiles []string, Envelope application.Envelope) error {security.WriteLabel}
+	// Remove removes the application envelope for the given profile
+	// name and application version (specified through the veyron name
+	// suffix). If no version is specified as part of the suffix, the
+	// method removes all versions for the given profile.
+	//
+	// TODO(jsimsa): Add support for using "*" to specify all profiles
+	// when Matt implements Globing (or Ken implements querying).
+	Remove(Profile string) error {security.WriteLabel}
+}
+
+// Profile describes a profile internally. Besides the public Profile
+// interface, it allows to add and remove profile specifications.
+type Profile interface {
+	public.Profile
+	// Specification returns the profile specification for the profile
+	// identified through the veyron name suffix.
+	Specification() (profile.Specification, error) {security.ReadLabel}
+	// Put sets the profile specification for the profile identified
+	// through the veyron name suffix.
+	Put(Specification profile.Specification) error {security.WriteLabel}
+	// Remove removes the profile specification for the profile
+	// identified through the veyron name suffix.
+	Remove() error {security.WriteLabel}
+}
diff --git a/services/mgmt/repository/repository.vdl.go b/services/mgmt/repository/repository.vdl.go
new file mode 100644
index 0000000..10a9336
--- /dev/null
+++ b/services/mgmt/repository/repository.vdl.go
@@ -0,0 +1,658 @@
+// This file was auto-generated by the veyron vdl tool.
+// Source: repository.vdl
+
+// Package repository contains implementation of the interface for
+// storing and serving various veyron management objects.
+package repository
+
+import (
+	"veyron/services/mgmt/profile"
+
+	"veyron2/security"
+
+	"veyron2/services/mgmt/application"
+
+	"veyron2/services/mgmt/repository"
+
+	// The non-user imports are prefixed with "_gen_" to prevent collisions.
+	_gen_veyron2 "veyron2"
+	_gen_context "veyron2/context"
+	_gen_ipc "veyron2/ipc"
+	_gen_naming "veyron2/naming"
+	_gen_rt "veyron2/rt"
+	_gen_vdl "veyron2/vdl"
+	_gen_wiretype "veyron2/wiretype"
+)
+
+// Application describes an application repository internally. Besides
+// the public Application interface, it allows to add and remove
+// application envelopes.
+// Application is the interface the client binds and uses.
+// Application_ExcludingUniversal is the interface without internal framework-added methods
+// to enable embedding without method collisions.  Not to be used directly by clients.
+type Application_ExcludingUniversal interface {
+	// Application provides access to application envelopes. An
+	// application envelope is identified by an application name and an
+	// application version, which are specified through the veyron name,
+	// and a profile name, which is specified using a method argument.
+	//
+	// Example:
+	// /apps/search/v1.Match([]string{"base", "media"})
+	//   returns an application envelope that can be used for downloading
+	//   and executing the "search" application, version "v1", runnable
+	//   on either the "base" or "media" profile.
+	repository.Application_ExcludingUniversal
+	// Put adds the given tuple of application version (specified
+	// through the veyron name suffix) and application envelope to all
+	// of the given application profiles.
+	Put(ctx _gen_context.T, Profiles []string, Envelope application.Envelope, opts ..._gen_ipc.CallOpt) (err error)
+	// Remove removes the application envelope for the given profile
+	// name and application version (specified through the veyron name
+	// suffix). If no version is specified as part of the suffix, the
+	// method removes all versions for the given profile.
+	//
+	// TODO(jsimsa): Add support for using "*" to specify all profiles
+	// when Matt implements Globing (or Ken implements querying).
+	Remove(ctx _gen_context.T, Profile string, opts ..._gen_ipc.CallOpt) (err error)
+}
+type Application interface {
+	_gen_ipc.UniversalServiceMethods
+	Application_ExcludingUniversal
+}
+
+// ApplicationService is the interface the server implements.
+type ApplicationService interface {
+
+	// Application provides access to application envelopes. An
+	// application envelope is identified by an application name and an
+	// application version, which are specified through the veyron name,
+	// and a profile name, which is specified using a method argument.
+	//
+	// Example:
+	// /apps/search/v1.Match([]string{"base", "media"})
+	//   returns an application envelope that can be used for downloading
+	//   and executing the "search" application, version "v1", runnable
+	//   on either the "base" or "media" profile.
+	repository.ApplicationService
+	// Put adds the given tuple of application version (specified
+	// through the veyron name suffix) and application envelope to all
+	// of the given application profiles.
+	Put(context _gen_ipc.ServerContext, Profiles []string, Envelope application.Envelope) (err error)
+	// Remove removes the application envelope for the given profile
+	// name and application version (specified through the veyron name
+	// suffix). If no version is specified as part of the suffix, the
+	// method removes all versions for the given profile.
+	//
+	// TODO(jsimsa): Add support for using "*" to specify all profiles
+	// when Matt implements Globing (or Ken implements querying).
+	Remove(context _gen_ipc.ServerContext, Profile string) (err error)
+}
+
+// BindApplication returns the client stub implementing the Application
+// interface.
+//
+// If no _gen_ipc.Client is specified, the default _gen_ipc.Client in the
+// global Runtime is used.
+func BindApplication(name string, opts ..._gen_ipc.BindOpt) (Application, error) {
+	var client _gen_ipc.Client
+	switch len(opts) {
+	case 0:
+		client = _gen_rt.R().Client()
+	case 1:
+		switch o := opts[0].(type) {
+		case _gen_veyron2.Runtime:
+			client = o.Client()
+		case _gen_ipc.Client:
+			client = o
+		default:
+			return nil, _gen_vdl.ErrUnrecognizedOption
+		}
+	default:
+		return nil, _gen_vdl.ErrTooManyOptionsToBind
+	}
+	stub := &clientStubApplication{client: client, name: name}
+	stub.Application_ExcludingUniversal, _ = repository.BindApplication(name, client)
+
+	return stub, nil
+}
+
+// NewServerApplication creates a new server stub.
+//
+// It takes a regular server implementing the ApplicationService
+// interface, and returns a new server stub.
+func NewServerApplication(server ApplicationService) interface{} {
+	return &ServerStubApplication{
+		ServerStubApplication: *repository.NewServerApplication(server).(*repository.ServerStubApplication),
+		service:               server,
+	}
+}
+
+// clientStubApplication implements Application.
+type clientStubApplication struct {
+	repository.Application_ExcludingUniversal
+
+	client _gen_ipc.Client
+	name   string
+}
+
+func (__gen_c *clientStubApplication) Put(ctx _gen_context.T, Profiles []string, Envelope application.Envelope, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Put", []interface{}{Profiles, Envelope}, opts...); err != nil {
+		return
+	}
+	if ierr := call.Finish(&err); ierr != nil {
+		err = ierr
+	}
+	return
+}
+
+func (__gen_c *clientStubApplication) Remove(ctx _gen_context.T, Profile string, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Remove", []interface{}{Profile}, opts...); err != nil {
+		return
+	}
+	if ierr := call.Finish(&err); ierr != nil {
+		err = ierr
+	}
+	return
+}
+
+func (__gen_c *clientStubApplication) UnresolveStep(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
+		return
+	}
+	if ierr := call.Finish(&reply, &err); ierr != nil {
+		err = ierr
+	}
+	return
+}
+
+func (__gen_c *clientStubApplication) Signature(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
+		return
+	}
+	if ierr := call.Finish(&reply, &err); ierr != nil {
+		err = ierr
+	}
+	return
+}
+
+func (__gen_c *clientStubApplication) GetMethodTags(ctx _gen_context.T, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
+		return
+	}
+	if ierr := call.Finish(&reply, &err); ierr != nil {
+		err = ierr
+	}
+	return
+}
+
+// ServerStubApplication wraps a server that implements
+// ApplicationService and provides an object that satisfies
+// the requirements of veyron2/ipc.ReflectInvoker.
+type ServerStubApplication struct {
+	repository.ServerStubApplication
+
+	service ApplicationService
+}
+
+func (__gen_s *ServerStubApplication) GetMethodTags(call _gen_ipc.ServerCall, method string) ([]interface{}, error) {
+	// TODO(bprosnitz) GetMethodTags() will be replaces with Signature().
+	// Note: This exhibits some weird behavior like returning a nil error if the method isn't found.
+	// This will change when it is replaced with Signature().
+	if resp, err := __gen_s.ServerStubApplication.GetMethodTags(call, method); resp != nil || err != nil {
+		return resp, err
+	}
+	switch method {
+	case "Put":
+		return []interface{}{security.Label(2)}, nil
+	case "Remove":
+		return []interface{}{security.Label(2)}, nil
+	default:
+		return nil, nil
+	}
+}
+
+func (__gen_s *ServerStubApplication) Signature(call _gen_ipc.ServerCall) (_gen_ipc.ServiceSignature, error) {
+	result := _gen_ipc.ServiceSignature{Methods: make(map[string]_gen_ipc.MethodSignature)}
+	result.Methods["Put"] = _gen_ipc.MethodSignature{
+		InArgs: []_gen_ipc.MethodArgument{
+			{Name: "Profiles", Type: 61},
+			{Name: "Envelope", Type: 65},
+		},
+		OutArgs: []_gen_ipc.MethodArgument{
+			{Name: "", Type: 66},
+		},
+	}
+	result.Methods["Remove"] = _gen_ipc.MethodSignature{
+		InArgs: []_gen_ipc.MethodArgument{
+			{Name: "Profile", Type: 3},
+		},
+		OutArgs: []_gen_ipc.MethodArgument{
+			{Name: "", Type: 66},
+		},
+	}
+
+	result.TypeDefs = []_gen_vdl.Any{
+		_gen_wiretype.StructType{
+			[]_gen_wiretype.FieldType{
+				_gen_wiretype.FieldType{Type: 0x3d, Name: "Args"},
+				_gen_wiretype.FieldType{Type: 0x3, Name: "Binary"},
+				_gen_wiretype.FieldType{Type: 0x3d, Name: "Env"},
+			},
+			"veyron2/services/mgmt/application.Envelope", []string(nil)},
+		_gen_wiretype.NamedPrimitiveType{Type: 0x1, Name: "error", Tags: []string(nil)}}
+	var ss _gen_ipc.ServiceSignature
+	var firstAdded int
+	ss, _ = __gen_s.ServerStubApplication.Signature(call)
+	firstAdded = len(result.TypeDefs)
+	for k, v := range ss.Methods {
+		for i, _ := range v.InArgs {
+			if v.InArgs[i].Type >= _gen_wiretype.TypeIDFirst {
+				v.InArgs[i].Type += _gen_wiretype.TypeID(firstAdded)
+			}
+		}
+		for i, _ := range v.OutArgs {
+			if v.OutArgs[i].Type >= _gen_wiretype.TypeIDFirst {
+				v.OutArgs[i].Type += _gen_wiretype.TypeID(firstAdded)
+			}
+		}
+		if v.InStream >= _gen_wiretype.TypeIDFirst {
+			v.InStream += _gen_wiretype.TypeID(firstAdded)
+		}
+		if v.OutStream >= _gen_wiretype.TypeIDFirst {
+			v.OutStream += _gen_wiretype.TypeID(firstAdded)
+		}
+		result.Methods[k] = v
+	}
+	//TODO(bprosnitz) combine type definitions from embeded interfaces in a way that doesn't cause duplication.
+	for _, d := range ss.TypeDefs {
+		switch wt := d.(type) {
+		case _gen_wiretype.SliceType:
+			if wt.Elem >= _gen_wiretype.TypeIDFirst {
+				wt.Elem += _gen_wiretype.TypeID(firstAdded)
+			}
+			d = wt
+		case _gen_wiretype.ArrayType:
+			if wt.Elem >= _gen_wiretype.TypeIDFirst {
+				wt.Elem += _gen_wiretype.TypeID(firstAdded)
+			}
+			d = wt
+		case _gen_wiretype.MapType:
+			if wt.Key >= _gen_wiretype.TypeIDFirst {
+				wt.Key += _gen_wiretype.TypeID(firstAdded)
+			}
+			if wt.Elem >= _gen_wiretype.TypeIDFirst {
+				wt.Elem += _gen_wiretype.TypeID(firstAdded)
+			}
+			d = wt
+		case _gen_wiretype.StructType:
+			for i, fld := range wt.Fields {
+				if fld.Type >= _gen_wiretype.TypeIDFirst {
+					wt.Fields[i].Type += _gen_wiretype.TypeID(firstAdded)
+				}
+			}
+			d = wt
+			// NOTE: other types are missing, but we are upgrading anyways.
+		}
+		result.TypeDefs = append(result.TypeDefs, d)
+	}
+
+	return result, nil
+}
+
+func (__gen_s *ServerStubApplication) UnresolveStep(call _gen_ipc.ServerCall) (reply []string, err error) {
+	if unresolver, ok := __gen_s.service.(_gen_ipc.Unresolver); ok {
+		return unresolver.UnresolveStep(call)
+	}
+	if call.Server() == nil {
+		return
+	}
+	var published []string
+	if published, err = call.Server().Published(); err != nil || published == nil {
+		return
+	}
+	reply = make([]string, len(published))
+	for i, p := range published {
+		reply[i] = _gen_naming.Join(p, call.Name())
+	}
+	return
+}
+
+func (__gen_s *ServerStubApplication) Put(call _gen_ipc.ServerCall, Profiles []string, Envelope application.Envelope) (err error) {
+	err = __gen_s.service.Put(call, Profiles, Envelope)
+	return
+}
+
+func (__gen_s *ServerStubApplication) Remove(call _gen_ipc.ServerCall, Profile string) (err error) {
+	err = __gen_s.service.Remove(call, Profile)
+	return
+}
+
+// Profile describes a profile internally. Besides the public Profile
+// interface, it allows to add and remove profile specifications.
+// Profile is the interface the client binds and uses.
+// Profile_ExcludingUniversal is the interface without internal framework-added methods
+// to enable embedding without method collisions.  Not to be used directly by clients.
+type Profile_ExcludingUniversal interface {
+	// Profile abstracts a device's ability to run binaries, and hides
+	// specifics such as the operating system, hardware architecture, and
+	// the set of installed libraries. Profiles describe binaries and
+	// devices, and are used to match them.
+	repository.Profile_ExcludingUniversal
+	// Specification returns the profile specification for the profile
+	// identified through the veyron name suffix.
+	Specification(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply profile.Specification, err error)
+	// Put sets the profile specification for the profile identified
+	// through the veyron name suffix.
+	Put(ctx _gen_context.T, Specification profile.Specification, opts ..._gen_ipc.CallOpt) (err error)
+	// Remove removes the profile specification for the profile
+	// identified through the veyron name suffix.
+	Remove(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (err error)
+}
+type Profile interface {
+	_gen_ipc.UniversalServiceMethods
+	Profile_ExcludingUniversal
+}
+
+// ProfileService is the interface the server implements.
+type ProfileService interface {
+
+	// Profile abstracts a device's ability to run binaries, and hides
+	// specifics such as the operating system, hardware architecture, and
+	// the set of installed libraries. Profiles describe binaries and
+	// devices, and are used to match them.
+	repository.ProfileService
+	// Specification returns the profile specification for the profile
+	// identified through the veyron name suffix.
+	Specification(context _gen_ipc.ServerContext) (reply profile.Specification, err error)
+	// Put sets the profile specification for the profile identified
+	// through the veyron name suffix.
+	Put(context _gen_ipc.ServerContext, Specification profile.Specification) (err error)
+	// Remove removes the profile specification for the profile
+	// identified through the veyron name suffix.
+	Remove(context _gen_ipc.ServerContext) (err error)
+}
+
+// BindProfile returns the client stub implementing the Profile
+// interface.
+//
+// If no _gen_ipc.Client is specified, the default _gen_ipc.Client in the
+// global Runtime is used.
+func BindProfile(name string, opts ..._gen_ipc.BindOpt) (Profile, error) {
+	var client _gen_ipc.Client
+	switch len(opts) {
+	case 0:
+		client = _gen_rt.R().Client()
+	case 1:
+		switch o := opts[0].(type) {
+		case _gen_veyron2.Runtime:
+			client = o.Client()
+		case _gen_ipc.Client:
+			client = o
+		default:
+			return nil, _gen_vdl.ErrUnrecognizedOption
+		}
+	default:
+		return nil, _gen_vdl.ErrTooManyOptionsToBind
+	}
+	stub := &clientStubProfile{client: client, name: name}
+	stub.Profile_ExcludingUniversal, _ = repository.BindProfile(name, client)
+
+	return stub, nil
+}
+
+// NewServerProfile creates a new server stub.
+//
+// It takes a regular server implementing the ProfileService
+// interface, and returns a new server stub.
+func NewServerProfile(server ProfileService) interface{} {
+	return &ServerStubProfile{
+		ServerStubProfile: *repository.NewServerProfile(server).(*repository.ServerStubProfile),
+		service:           server,
+	}
+}
+
+// clientStubProfile implements Profile.
+type clientStubProfile struct {
+	repository.Profile_ExcludingUniversal
+
+	client _gen_ipc.Client
+	name   string
+}
+
+func (__gen_c *clientStubProfile) Specification(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply profile.Specification, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Specification", nil, opts...); err != nil {
+		return
+	}
+	if ierr := call.Finish(&reply, &err); ierr != nil {
+		err = ierr
+	}
+	return
+}
+
+func (__gen_c *clientStubProfile) Put(ctx _gen_context.T, Specification profile.Specification, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Put", []interface{}{Specification}, opts...); err != nil {
+		return
+	}
+	if ierr := call.Finish(&err); ierr != nil {
+		err = ierr
+	}
+	return
+}
+
+func (__gen_c *clientStubProfile) Remove(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Remove", nil, opts...); err != nil {
+		return
+	}
+	if ierr := call.Finish(&err); ierr != nil {
+		err = ierr
+	}
+	return
+}
+
+func (__gen_c *clientStubProfile) UnresolveStep(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
+		return
+	}
+	if ierr := call.Finish(&reply, &err); ierr != nil {
+		err = ierr
+	}
+	return
+}
+
+func (__gen_c *clientStubProfile) Signature(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply _gen_ipc.ServiceSignature, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "Signature", nil, opts...); err != nil {
+		return
+	}
+	if ierr := call.Finish(&reply, &err); ierr != nil {
+		err = ierr
+	}
+	return
+}
+
+func (__gen_c *clientStubProfile) GetMethodTags(ctx _gen_context.T, method string, opts ..._gen_ipc.CallOpt) (reply []interface{}, err error) {
+	var call _gen_ipc.Call
+	if call, err = __gen_c.client.StartCall(ctx, __gen_c.name, "GetMethodTags", []interface{}{method}, opts...); err != nil {
+		return
+	}
+	if ierr := call.Finish(&reply, &err); ierr != nil {
+		err = ierr
+	}
+	return
+}
+
+// ServerStubProfile wraps a server that implements
+// ProfileService and provides an object that satisfies
+// the requirements of veyron2/ipc.ReflectInvoker.
+type ServerStubProfile struct {
+	repository.ServerStubProfile
+
+	service ProfileService
+}
+
+func (__gen_s *ServerStubProfile) GetMethodTags(call _gen_ipc.ServerCall, method string) ([]interface{}, error) {
+	// TODO(bprosnitz) GetMethodTags() will be replaces with Signature().
+	// Note: This exhibits some weird behavior like returning a nil error if the method isn't found.
+	// This will change when it is replaced with Signature().
+	if resp, err := __gen_s.ServerStubProfile.GetMethodTags(call, method); resp != nil || err != nil {
+		return resp, err
+	}
+	switch method {
+	case "Specification":
+		return []interface{}{security.Label(1)}, nil
+	case "Put":
+		return []interface{}{security.Label(2)}, nil
+	case "Remove":
+		return []interface{}{security.Label(2)}, nil
+	default:
+		return nil, nil
+	}
+}
+
+func (__gen_s *ServerStubProfile) Signature(call _gen_ipc.ServerCall) (_gen_ipc.ServiceSignature, error) {
+	result := _gen_ipc.ServiceSignature{Methods: make(map[string]_gen_ipc.MethodSignature)}
+	result.Methods["Put"] = _gen_ipc.MethodSignature{
+		InArgs: []_gen_ipc.MethodArgument{
+			{Name: "Specification", Type: 69},
+		},
+		OutArgs: []_gen_ipc.MethodArgument{
+			{Name: "", Type: 70},
+		},
+	}
+	result.Methods["Remove"] = _gen_ipc.MethodSignature{
+		InArgs: []_gen_ipc.MethodArgument{},
+		OutArgs: []_gen_ipc.MethodArgument{
+			{Name: "", Type: 70},
+		},
+	}
+	result.Methods["Specification"] = _gen_ipc.MethodSignature{
+		InArgs: []_gen_ipc.MethodArgument{},
+		OutArgs: []_gen_ipc.MethodArgument{
+			{Name: "", Type: 69},
+			{Name: "", Type: 70},
+		},
+	}
+
+	result.TypeDefs = []_gen_vdl.Any{
+		_gen_wiretype.MapType{Key: 0x3, Elem: 0x3, Name: "", Tags: []string(nil)}, _gen_wiretype.StructType{
+			[]_gen_wiretype.FieldType{
+				_gen_wiretype.FieldType{Type: 0x3, Name: "Name"},
+				_gen_wiretype.FieldType{Type: 0x41, Name: "Attributes"},
+			},
+			"veyron/services/mgmt/profile.Format", []string(nil)},
+		_gen_wiretype.StructType{
+			[]_gen_wiretype.FieldType{
+				_gen_wiretype.FieldType{Type: 0x3, Name: "Name"},
+				_gen_wiretype.FieldType{Type: 0x3, Name: "MajorVersion"},
+				_gen_wiretype.FieldType{Type: 0x3, Name: "MinorVersion"},
+			},
+			"veyron/services/mgmt/profile.Library", []string(nil)},
+		_gen_wiretype.MapType{Key: 0x43, Elem: 0x2, Name: "", Tags: []string(nil)}, _gen_wiretype.StructType{
+			[]_gen_wiretype.FieldType{
+				_gen_wiretype.FieldType{Type: 0x42, Name: "Format"},
+				_gen_wiretype.FieldType{Type: 0x44, Name: "Libraries"},
+				_gen_wiretype.FieldType{Type: 0x3, Name: "Label"},
+				_gen_wiretype.FieldType{Type: 0x3, Name: "Description"},
+			},
+			"veyron/services/mgmt/profile.Specification", []string(nil)},
+		_gen_wiretype.NamedPrimitiveType{Type: 0x1, Name: "error", Tags: []string(nil)}}
+	var ss _gen_ipc.ServiceSignature
+	var firstAdded int
+	ss, _ = __gen_s.ServerStubProfile.Signature(call)
+	firstAdded = len(result.TypeDefs)
+	for k, v := range ss.Methods {
+		for i, _ := range v.InArgs {
+			if v.InArgs[i].Type >= _gen_wiretype.TypeIDFirst {
+				v.InArgs[i].Type += _gen_wiretype.TypeID(firstAdded)
+			}
+		}
+		for i, _ := range v.OutArgs {
+			if v.OutArgs[i].Type >= _gen_wiretype.TypeIDFirst {
+				v.OutArgs[i].Type += _gen_wiretype.TypeID(firstAdded)
+			}
+		}
+		if v.InStream >= _gen_wiretype.TypeIDFirst {
+			v.InStream += _gen_wiretype.TypeID(firstAdded)
+		}
+		if v.OutStream >= _gen_wiretype.TypeIDFirst {
+			v.OutStream += _gen_wiretype.TypeID(firstAdded)
+		}
+		result.Methods[k] = v
+	}
+	//TODO(bprosnitz) combine type definitions from embeded interfaces in a way that doesn't cause duplication.
+	for _, d := range ss.TypeDefs {
+		switch wt := d.(type) {
+		case _gen_wiretype.SliceType:
+			if wt.Elem >= _gen_wiretype.TypeIDFirst {
+				wt.Elem += _gen_wiretype.TypeID(firstAdded)
+			}
+			d = wt
+		case _gen_wiretype.ArrayType:
+			if wt.Elem >= _gen_wiretype.TypeIDFirst {
+				wt.Elem += _gen_wiretype.TypeID(firstAdded)
+			}
+			d = wt
+		case _gen_wiretype.MapType:
+			if wt.Key >= _gen_wiretype.TypeIDFirst {
+				wt.Key += _gen_wiretype.TypeID(firstAdded)
+			}
+			if wt.Elem >= _gen_wiretype.TypeIDFirst {
+				wt.Elem += _gen_wiretype.TypeID(firstAdded)
+			}
+			d = wt
+		case _gen_wiretype.StructType:
+			for i, fld := range wt.Fields {
+				if fld.Type >= _gen_wiretype.TypeIDFirst {
+					wt.Fields[i].Type += _gen_wiretype.TypeID(firstAdded)
+				}
+			}
+			d = wt
+			// NOTE: other types are missing, but we are upgrading anyways.
+		}
+		result.TypeDefs = append(result.TypeDefs, d)
+	}
+
+	return result, nil
+}
+
+func (__gen_s *ServerStubProfile) UnresolveStep(call _gen_ipc.ServerCall) (reply []string, err error) {
+	if unresolver, ok := __gen_s.service.(_gen_ipc.Unresolver); ok {
+		return unresolver.UnresolveStep(call)
+	}
+	if call.Server() == nil {
+		return
+	}
+	var published []string
+	if published, err = call.Server().Published(); err != nil || published == nil {
+		return
+	}
+	reply = make([]string, len(published))
+	for i, p := range published {
+		reply[i] = _gen_naming.Join(p, call.Name())
+	}
+	return
+}
+
+func (__gen_s *ServerStubProfile) Specification(call _gen_ipc.ServerCall) (reply profile.Specification, err error) {
+	reply, err = __gen_s.service.Specification(call)
+	return
+}
+
+func (__gen_s *ServerStubProfile) Put(call _gen_ipc.ServerCall, Specification profile.Specification) (err error) {
+	err = __gen_s.service.Put(call, Specification)
+	return
+}
+
+func (__gen_s *ServerStubProfile) Remove(call _gen_ipc.ServerCall) (err error) {
+	err = __gen_s.service.Remove(call)
+	return
+}
diff --git a/tools/application/impl/impl.go b/tools/application/impl/impl.go
index b6248b0..81be26f 100644
--- a/tools/application/impl/impl.go
+++ b/tools/application/impl/impl.go
@@ -11,13 +11,13 @@
 	"strings"
 
 	"veyron/lib/cmdline"
-	iapp "veyron/services/mgmt/application"
+	"veyron/services/mgmt/repository"
 
 	"veyron2/rt"
 	"veyron2/services/mgmt/application"
 )
 
-func getEnvelopeJSON(app iapp.Repository, profiles string) ([]byte, error) {
+func getEnvelopeJSON(app repository.Application, profiles string) ([]byte, error) {
 	env, err := app.Match(rt.R().NewContext(), strings.Split(profiles, ","))
 	if err != nil {
 		env = application.Envelope{}
@@ -29,7 +29,7 @@
 	return j, nil
 }
 
-func putEnvelopeJSON(app iapp.Repository, profiles string, j []byte) error {
+func putEnvelopeJSON(app repository.Application, profiles string, j []byte) error {
 	var env application.Envelope
 	if err := json.Unmarshal(j, &env); err != nil {
 		return fmt.Errorf("json: %v", err)
@@ -64,7 +64,7 @@
 	if expected, got := 2, len(args); expected != got {
 		return cmd.Errorf("match: incorrect number of arguments, expected %d, got %d", expected, got)
 	}
-	app, err := iapp.BindRepository(args[0])
+	app, err := repository.BindApplication(args[0])
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
@@ -92,7 +92,7 @@
 	if expected, got := 3, len(args); expected != got {
 		return cmd.Errorf("put: incorrect number of arguments, expected %d, got %d", expected, got)
 	}
-	app, err := iapp.BindRepository(args[0])
+	app, err := repository.BindApplication(args[0])
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
@@ -122,7 +122,7 @@
 	if expected, got := 2, len(args); expected != got {
 		return cmd.Errorf("remove: incorrect number of arguments, expected %d, got %d", expected, got)
 	}
-	app, err := iapp.BindRepository(args[0])
+	app, err := repository.BindApplication(args[0])
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
@@ -148,7 +148,7 @@
 	if expected, got := 2, len(args); expected != got {
 		return cmd.Errorf("edit: incorrect number of arguments, expected %d, got %d", expected, got)
 	}
-	app, err := iapp.BindRepository(args[0])
+	app, err := repository.BindApplication(args[0])
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
@@ -207,8 +207,8 @@
 func Root() *cmdline.Command {
 	return &cmdline.Command{
 		Name:     "application",
-		Short:    "Command-line tool for interacting with the Veyron application manager",
-		Long:     "Command-line tool for interacting with the Veyron application manager",
+		Short:    "Command-line tool for interacting with the veyron application repository",
+		Long:     "Command-line tool for interacting with the veyron application repository",
 		Children: []*cmdline.Command{cmdMatch, cmdPut, cmdRemove, cmdEdit},
 	}
 }
diff --git a/tools/application/impl/impl_test.go b/tools/application/impl/impl_test.go
index 8829f13..64b3f91 100644
--- a/tools/application/impl/impl_test.go
+++ b/tools/application/impl/impl_test.go
@@ -7,7 +7,7 @@
 	"strings"
 	"testing"
 
-	iapp "veyron/services/mgmt/application"
+	"veyron/services/mgmt/repository"
 	"veyron/tools/application/impl"
 
 	"veyron2"
@@ -67,7 +67,7 @@
 }
 
 func (d *dispatcher) Lookup(suffix string) (ipc.Invoker, security.Authorizer, error) {
-	invoker := ipc.ReflectInvoker(iapp.NewServerRepository(&server{suffix: suffix}))
+	invoker := ipc.ReflectInvoker(repository.NewServerApplication(&server{suffix: suffix}))
 	return invoker, nil, nil
 }
 
diff --git a/tools/content/impl/impl.go b/tools/content/impl/impl.go
index f9fd170..970de79 100644
--- a/tools/content/impl/impl.go
+++ b/tools/content/impl/impl.go
@@ -8,14 +8,14 @@
 	"veyron/lib/cmdline"
 
 	"veyron2/rt"
-	"veyron2/services/mgmt/content"
+	"veyron2/services/mgmt/repository"
 )
 
 var cmdDelete = &cmdline.Command{
 	Run:      runDelete,
 	Name:     "delete",
 	Short:    "Delete content",
-	Long:     "Delete connects to the content server and deletes the specified content",
+	Long:     "Delete connects to the content repository and deletes the specified content",
 	ArgsName: "<content>",
 	ArgsLong: "<content> is the full name of the content to delete.",
 }
@@ -24,7 +24,7 @@
 	if expected, got := 1, len(args); expected != got {
 		return cmd.Errorf("delete: incorrect number of arguments, expected %d, got %d", expected, got)
 	}
-	c, err := content.BindRepository(args[0])
+	c, err := repository.BindContent(args[0])
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
@@ -40,7 +40,7 @@
 	Name:  "download",
 	Short: "Download content",
 	Long: `
-Download connects to the content server, downloads the specified content, and
+Download connects to the content repository, downloads the specified content, and
 writes it to a file.
 `,
 	ArgsName: "<content> <filename>",
@@ -61,7 +61,7 @@
 	}
 	defer f.Close()
 
-	c, err := content.BindRepository(args[0])
+	c, err := repository.BindContent(args[0])
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
@@ -98,12 +98,12 @@
 	Name:  "upload",
 	Short: "Upload content",
 	Long: `
-Upload connects to the content server and uploads the content of the specified
+Upload connects to the content repository and uploads the content of the specified
 file. When successful, it writes the name of the new content to stdout.
 `,
 	ArgsName: "<server> <filename>",
 	ArgsLong: `
-<server> is the veyron name or endpoint of the content server.
+<server> is the veyron name or endpoint of the content repository.
 <filename> is the name of the file to upload.
 `,
 }
@@ -119,7 +119,7 @@
 	}
 	defer f.Close()
 
-	c, err := content.BindRepository(args[0])
+	c, err := repository.BindContent(args[0])
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
@@ -158,8 +158,8 @@
 func Root() *cmdline.Command {
 	return &cmdline.Command{
 		Name:     "content",
-		Short:    "Command-line tool for interacting with the Veyron content server",
-		Long:     "Command-line tool for interacting with the Veyron content server",
+		Short:    "Command-line tool for interacting with the veyron content repository",
+		Long:     "Command-line tool for interacting with the veyron content repository",
 		Children: []*cmdline.Command{cmdDelete, cmdDownload, cmdUpload},
 	}
 }
diff --git a/tools/content/impl/impl_test.go b/tools/content/impl/impl_test.go
index efd7f0d..ed3f5a5 100644
--- a/tools/content/impl/impl_test.go
+++ b/tools/content/impl/impl_test.go
@@ -16,7 +16,7 @@
 	"veyron2/naming"
 	"veyron2/rt"
 	"veyron2/security"
-	"veyron2/services/mgmt/content"
+	"veyron2/services/mgmt/repository"
 	"veyron2/vlog"
 )
 
@@ -32,14 +32,14 @@
 	return nil
 }
 
-func (s *server) Download(_ ipc.ServerContext, stream content.RepositoryServiceDownloadStream) error {
+func (s *server) Download(_ ipc.ServerContext, stream repository.ContentServiceDownloadStream) error {
 	vlog.VI(2).Infof("Download() was called. suffix=%v", s.suffix)
 	stream.Send([]byte("Hello"))
 	stream.Send([]byte("World"))
 	return nil
 }
 
-func (s *server) Upload(_ ipc.ServerContext, stream content.RepositoryServiceUploadStream) (string, error) {
+func (s *server) Upload(_ ipc.ServerContext, stream repository.ContentServiceUploadStream) (string, error) {
 	vlog.VI(2).Infof("Upload() was called. suffix=%v", s.suffix)
 	for {
 		if _, err := stream.Recv(); err != nil {
@@ -57,7 +57,7 @@
 }
 
 func (d *dispatcher) Lookup(suffix string) (ipc.Invoker, security.Authorizer, error) {
-	invoker := ipc.ReflectInvoker(content.NewServerRepository(&server{suffix: suffix}))
+	invoker := ipc.ReflectInvoker(repository.NewServerContent(&server{suffix: suffix}))
 	return invoker, nil, nil
 }
 
diff --git a/tools/profile/impl/impl.go b/tools/profile/impl/impl.go
index 0d3b745..cef78c8 100644
--- a/tools/profile/impl/impl.go
+++ b/tools/profile/impl/impl.go
@@ -5,6 +5,7 @@
 
 	"veyron/lib/cmdline"
 	"veyron/services/mgmt/profile"
+	"veyron/services/mgmt/repository"
 
 	"veyron2/rt"
 )
@@ -22,7 +23,7 @@
 	if expected, got := 1, len(args); expected != got {
 		return cmd.Errorf("label: incorrect number of arguments, expected %d, got %d", expected, got)
 	}
-	p, err := profile.BindProfile(args[0])
+	p, err := repository.BindProfile(args[0])
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
@@ -47,7 +48,7 @@
 	if expected, got := 1, len(args); expected != got {
 		return cmd.Errorf("description: incorrect number of arguments, expected %d, got %d", expected, got)
 	}
-	p, err := profile.BindProfile(args[0])
+	p, err := repository.BindProfile(args[0])
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
@@ -72,7 +73,7 @@
 	if expected, got := 1, len(args); expected != got {
 		return cmd.Errorf("spec: incorrect number of arguments, expected %d, got %d", expected, got)
 	}
-	p, err := profile.BindProfile(args[0])
+	p, err := repository.BindProfile(args[0])
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
@@ -97,7 +98,7 @@
 	if expected, got := 1, len(args); expected != got {
 		return cmd.Errorf("put: incorrect number of arguments, expected %d, got %d", expected, got)
 	}
-	p, err := profile.BindProfile(args[0])
+	p, err := repository.BindProfile(args[0])
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
@@ -129,7 +130,7 @@
 	if expected, got := 1, len(args); expected != got {
 		return cmd.Errorf("remove: incorrect number of arguments, expected %d, got %d", expected, got)
 	}
-	p, err := profile.BindProfile(args[0])
+	p, err := repository.BindProfile(args[0])
 	if err != nil {
 		return fmt.Errorf("bind error: %v", err)
 	}
@@ -143,8 +144,8 @@
 func Root() *cmdline.Command {
 	return &cmdline.Command{
 		Name:     "profile",
-		Short:    "Command-line tool for interacting with the Veyron profile manager",
-		Long:     "Command-line tool for interacting with the Veyron profile manager",
+		Short:    "Command-line tool for interacting with the veyron profile repository",
+		Long:     "Command-line tool for interacting with the veyron profile repository",
 		Children: []*cmdline.Command{cmdLabel, cmdDescription, cmdSpec, cmdPut, cmdRemove},
 	}
 }
diff --git a/tools/profile/impl/impl_test.go b/tools/profile/impl/impl_test.go
index 8e6deba..e0d179a 100644
--- a/tools/profile/impl/impl_test.go
+++ b/tools/profile/impl/impl_test.go
@@ -7,6 +7,7 @@
 	"testing"
 
 	"veyron/services/mgmt/profile"
+	"veyron/services/mgmt/repository"
 	"veyron/tools/profile/impl"
 
 	"veyron2"
@@ -23,7 +24,7 @@
 		Format:      profile.Format{Name: "elf", Attributes: map[string]string{"os": "linux"}},
 		Libraries:   map[profile.Library]struct{}{profile.Library{Name: "foo", MajorVersion: "1", MinorVersion: "0"}: struct{}{}},
 		Label:       "example",
-		Description: "Example profile to test the profile manager implementation.",
+		Description: "Example profile to test the profile repository implementation.",
 	}
 )
 
@@ -76,7 +77,7 @@
 }
 
 func (d *dispatcher) Lookup(suffix string) (ipc.Invoker, security.Authorizer, error) {
-	invoker := ipc.ReflectInvoker(profile.NewServerProfile(&server{suffix: suffix}))
+	invoker := ipc.ReflectInvoker(repository.NewServerProfile(&server{suffix: suffix}))
 	return invoker, nil, nil
 }
 
