diff --git a/registry/storage/layer.go b/layer.go
similarity index 89%
rename from registry/storage/layer.go
rename to layer.go
index 5e12f43e72..dedc0538ae 100644
--- a/registry/storage/layer.go
+++ b/layer.go
@@ -1,4 +1,4 @@
-package storage
+package distribution
 
 import (
 	"fmt"
@@ -17,9 +17,6 @@ type Layer interface {
 	io.ReadSeeker
 	io.Closer
 
-	// Name returns the repository under which this layer is linked.
-	Name() string // TODO(stevvooe): struggling with nomenclature: should this be "repo" or "name"?
-
 	// Digest returns the unique digest of the blob, which is the tarsum for
 	// layers.
 	Digest() digest.Digest
@@ -36,9 +33,6 @@ type LayerUpload interface {
 	io.ReaderFrom
 	io.Closer
 
-	// Name of the repository under which the layer will be linked.
-	Name() string
-
 	// UUID returns the identifier for this upload.
 	UUID() string
 
diff --git a/registry/storage/notifications/bridge.go b/notifications/bridge.go
similarity index 76%
rename from registry/storage/notifications/bridge.go
rename to notifications/bridge.go
index 217ee5bd3b..9954e7c73b 100644
--- a/registry/storage/notifications/bridge.go
+++ b/notifications/bridge.go
@@ -4,11 +4,10 @@ import (
 	"net/http"
 	"time"
 
-	"github.com/docker/distribution/manifest"
-
 	"code.google.com/p/go-uuid/uuid"
+	"github.com/docker/distribution"
 	"github.com/docker/distribution/digest"
-	"github.com/docker/distribution/registry/storage"
+	"github.com/docker/distribution/manifest"
 )
 
 type bridge struct {
@@ -53,31 +52,31 @@ func NewRequestRecord(id string, r *http.Request) RequestRecord {
 	}
 }
 
-func (b *bridge) ManifestPushed(repo storage.Repository, sm *manifest.SignedManifest) error {
+func (b *bridge) ManifestPushed(repo distribution.Repository, sm *manifest.SignedManifest) error {
 	return b.createManifestEventAndWrite(EventActionPush, repo, sm)
 }
 
-func (b *bridge) ManifestPulled(repo storage.Repository, sm *manifest.SignedManifest) error {
+func (b *bridge) ManifestPulled(repo distribution.Repository, sm *manifest.SignedManifest) error {
 	return b.createManifestEventAndWrite(EventActionPull, repo, sm)
 }
 
-func (b *bridge) ManifestDeleted(repo storage.Repository, sm *manifest.SignedManifest) error {
+func (b *bridge) ManifestDeleted(repo distribution.Repository, sm *manifest.SignedManifest) error {
 	return b.createManifestEventAndWrite(EventActionDelete, repo, sm)
 }
 
-func (b *bridge) LayerPushed(repo storage.Repository, layer storage.Layer) error {
+func (b *bridge) LayerPushed(repo distribution.Repository, layer distribution.Layer) error {
 	return b.createLayerEventAndWrite(EventActionPush, repo, layer.Digest())
 }
 
-func (b *bridge) LayerPulled(repo storage.Repository, layer storage.Layer) error {
+func (b *bridge) LayerPulled(repo distribution.Repository, layer distribution.Layer) error {
 	return b.createLayerEventAndWrite(EventActionPull, repo, layer.Digest())
 }
 
-func (b *bridge) LayerDeleted(repo storage.Repository, layer storage.Layer) error {
+func (b *bridge) LayerDeleted(repo distribution.Repository, layer distribution.Layer) error {
 	return b.createLayerEventAndWrite(EventActionDelete, repo, layer.Digest())
 }
 
-func (b *bridge) createManifestEventAndWrite(action string, repo storage.Repository, sm *manifest.SignedManifest) error {
+func (b *bridge) createManifestEventAndWrite(action string, repo distribution.Repository, sm *manifest.SignedManifest) error {
 	event, err := b.createManifestEvent(action, repo, sm)
 	if err != nil {
 		return err
@@ -86,7 +85,7 @@ func (b *bridge) createManifestEventAndWrite(action string, repo storage.Reposit
 	return b.sink.Write(*event)
 }
 
-func (b *bridge) createManifestEvent(action string, repo storage.Repository, sm *manifest.SignedManifest) (*Event, error) {
+func (b *bridge) createManifestEvent(action string, repo distribution.Repository, sm *manifest.SignedManifest) (*Event, error) {
 	event := b.createEvent(action)
 	event.Target.Type = EventTargetTypeManifest
 	event.Target.Name = repo.Name()
@@ -112,7 +111,7 @@ func (b *bridge) createManifestEvent(action string, repo storage.Repository, sm
 	return event, nil
 }
 
-func (b *bridge) createLayerEventAndWrite(action string, repo storage.Repository, dgst digest.Digest) error {
+func (b *bridge) createLayerEventAndWrite(action string, repo distribution.Repository, dgst digest.Digest) error {
 	event, err := b.createLayerEvent(action, repo, dgst)
 	if err != nil {
 		return err
@@ -121,7 +120,7 @@ func (b *bridge) createLayerEventAndWrite(action string, repo storage.Repository
 	return b.sink.Write(*event)
 }
 
-func (b *bridge) createLayerEvent(action string, repo storage.Repository, dgst digest.Digest) (*Event, error) {
+func (b *bridge) createLayerEvent(action string, repo distribution.Repository, dgst digest.Digest) (*Event, error) {
 	event := b.createEvent(action)
 	event.Target.Type = EventTargetTypeBlob
 	event.Target.Name = repo.Name()
diff --git a/registry/storage/notifications/endpoint.go b/notifications/endpoint.go
similarity index 100%
rename from registry/storage/notifications/endpoint.go
rename to notifications/endpoint.go
diff --git a/registry/storage/notifications/event.go b/notifications/event.go
similarity index 100%
rename from registry/storage/notifications/event.go
rename to notifications/event.go
diff --git a/registry/storage/notifications/event_test.go b/notifications/event_test.go
similarity index 100%
rename from registry/storage/notifications/event_test.go
rename to notifications/event_test.go
diff --git a/registry/storage/notifications/http.go b/notifications/http.go
similarity index 100%
rename from registry/storage/notifications/http.go
rename to notifications/http.go
diff --git a/registry/storage/notifications/http_test.go b/notifications/http_test.go
similarity index 100%
rename from registry/storage/notifications/http_test.go
rename to notifications/http_test.go
diff --git a/registry/storage/notifications/listener.go b/notifications/listener.go
similarity index 68%
rename from registry/storage/notifications/listener.go
rename to notifications/listener.go
index 99a06f021d..b55fe3261b 100644
--- a/registry/storage/notifications/listener.go
+++ b/notifications/listener.go
@@ -2,31 +2,31 @@ package notifications
 
 import (
 	"github.com/Sirupsen/logrus"
+	"github.com/docker/distribution"
 	"github.com/docker/distribution/digest"
 	"github.com/docker/distribution/manifest"
-	"github.com/docker/distribution/registry/storage"
 )
 
 // ManifestListener describes a set of methods for listening to events related to manifests.
 type ManifestListener interface {
-	ManifestPushed(repo storage.Repository, sm *manifest.SignedManifest) error
-	ManifestPulled(repo storage.Repository, sm *manifest.SignedManifest) error
+	ManifestPushed(repo distribution.Repository, sm *manifest.SignedManifest) error
+	ManifestPulled(repo distribution.Repository, sm *manifest.SignedManifest) error
 
 	// TODO(stevvooe): Please note that delete support is still a little shaky
 	// and we'll need to propagate these in the future.
 
-	ManifestDeleted(repo storage.Repository, sm *manifest.SignedManifest) error
+	ManifestDeleted(repo distribution.Repository, sm *manifest.SignedManifest) error
 }
 
 // LayerListener describes a listener that can respond to layer related events.
 type LayerListener interface {
-	LayerPushed(repo storage.Repository, layer storage.Layer) error
-	LayerPulled(repo storage.Repository, layer storage.Layer) error
+	LayerPushed(repo distribution.Repository, layer distribution.Layer) error
+	LayerPulled(repo distribution.Repository, layer distribution.Layer) error
 
 	// TODO(stevvooe): Please note that delete support is still a little shaky
 	// and we'll need to propagate these in the future.
 
-	LayerDeleted(repo storage.Repository, layer storage.Layer) error
+	LayerDeleted(repo distribution.Repository, layer distribution.Layer) error
 }
 
 // Listener combines all repository events into a single interface.
@@ -36,26 +36,26 @@ type Listener interface {
 }
 
 type repositoryListener struct {
-	storage.Repository
+	distribution.Repository
 	listener Listener
 }
 
 // Listen dispatches events on the repository to the listener.
-func Listen(repo storage.Repository, listener Listener) storage.Repository {
+func Listen(repo distribution.Repository, listener Listener) distribution.Repository {
 	return &repositoryListener{
 		Repository: repo,
 		listener:   listener,
 	}
 }
 
-func (rl *repositoryListener) Manifests() storage.ManifestService {
+func (rl *repositoryListener) Manifests() distribution.ManifestService {
 	return &manifestServiceListener{
 		ManifestService: rl.Repository.Manifests(),
 		parent:          rl,
 	}
 }
 
-func (rl *repositoryListener) Layers() storage.LayerService {
+func (rl *repositoryListener) Layers() distribution.LayerService {
 	return &layerServiceListener{
 		LayerService: rl.Repository.Layers(),
 		parent:       rl,
@@ -63,7 +63,7 @@ func (rl *repositoryListener) Layers() storage.LayerService {
 }
 
 type manifestServiceListener struct {
-	storage.ManifestService
+	distribution.ManifestService
 	parent *repositoryListener
 }
 
@@ -91,11 +91,11 @@ func (msl *manifestServiceListener) Put(tag string, sm *manifest.SignedManifest)
 }
 
 type layerServiceListener struct {
-	storage.LayerService
+	distribution.LayerService
 	parent *repositoryListener
 }
 
-func (lsl *layerServiceListener) Fetch(dgst digest.Digest) (storage.Layer, error) {
+func (lsl *layerServiceListener) Fetch(dgst digest.Digest) (distribution.Layer, error) {
 	layer, err := lsl.LayerService.Fetch(dgst)
 	if err == nil {
 		if err := lsl.parent.listener.LayerPulled(lsl.parent.Repository, layer); err != nil {
@@ -106,17 +106,17 @@ func (lsl *layerServiceListener) Fetch(dgst digest.Digest) (storage.Layer, error
 	return layer, err
 }
 
-func (lsl *layerServiceListener) Upload() (storage.LayerUpload, error) {
+func (lsl *layerServiceListener) Upload() (distribution.LayerUpload, error) {
 	lu, err := lsl.LayerService.Upload()
 	return lsl.decorateUpload(lu), err
 }
 
-func (lsl *layerServiceListener) Resume(uuid string) (storage.LayerUpload, error) {
+func (lsl *layerServiceListener) Resume(uuid string) (distribution.LayerUpload, error) {
 	lu, err := lsl.LayerService.Resume(uuid)
 	return lsl.decorateUpload(lu), err
 }
 
-func (lsl *layerServiceListener) decorateUpload(lu storage.LayerUpload) storage.LayerUpload {
+func (lsl *layerServiceListener) decorateUpload(lu distribution.LayerUpload) distribution.LayerUpload {
 	return &layerUploadListener{
 		LayerUpload: lu,
 		parent:      lsl,
@@ -124,11 +124,11 @@ func (lsl *layerServiceListener) decorateUpload(lu storage.LayerUpload) storage.
 }
 
 type layerUploadListener struct {
-	storage.LayerUpload
+	distribution.LayerUpload
 	parent *layerServiceListener
 }
 
-func (lul *layerUploadListener) Finish(dgst digest.Digest) (storage.Layer, error) {
+func (lul *layerUploadListener) Finish(dgst digest.Digest) (distribution.Layer, error) {
 	layer, err := lul.LayerUpload.Finish(dgst)
 	if err == nil {
 		if err := lul.parent.parent.listener.LayerPushed(lul.parent.parent.Repository, layer); err != nil {
diff --git a/registry/storage/notifications/listener_test.go b/notifications/listener_test.go
similarity index 81%
rename from registry/storage/notifications/listener_test.go
rename to notifications/listener_test.go
index b8d6a31e54..0f91a6a3f8 100644
--- a/registry/storage/notifications/listener_test.go
+++ b/notifications/listener_test.go
@@ -5,6 +5,7 @@ import (
 	"reflect"
 	"testing"
 
+	"github.com/docker/distribution"
 	"github.com/docker/distribution/digest"
 	"github.com/docker/distribution/manifest"
 	"github.com/docker/distribution/registry/storage"
@@ -44,40 +45,40 @@ type testListener struct {
 	ops map[string]int
 }
 
-func (tl *testListener) ManifestPushed(repo storage.Repository, sm *manifest.SignedManifest) error {
+func (tl *testListener) ManifestPushed(repo distribution.Repository, sm *manifest.SignedManifest) error {
 	tl.ops["manifest:push"]++
 
 	return nil
 }
 
-func (tl *testListener) ManifestPulled(repo storage.Repository, sm *manifest.SignedManifest) error {
+func (tl *testListener) ManifestPulled(repo distribution.Repository, sm *manifest.SignedManifest) error {
 	tl.ops["manifest:pull"]++
 	return nil
 }
 
-func (tl *testListener) ManifestDeleted(repo storage.Repository, sm *manifest.SignedManifest) error {
+func (tl *testListener) ManifestDeleted(repo distribution.Repository, sm *manifest.SignedManifest) error {
 	tl.ops["manifest:delete"]++
 	return nil
 }
 
-func (tl *testListener) LayerPushed(repo storage.Repository, layer storage.Layer) error {
+func (tl *testListener) LayerPushed(repo distribution.Repository, layer distribution.Layer) error {
 	tl.ops["layer:push"]++
 	return nil
 }
 
-func (tl *testListener) LayerPulled(repo storage.Repository, layer storage.Layer) error {
+func (tl *testListener) LayerPulled(repo distribution.Repository, layer distribution.Layer) error {
 	tl.ops["layer:pull"]++
 	return nil
 }
 
-func (tl *testListener) LayerDeleted(repo storage.Repository, layer storage.Layer) error {
+func (tl *testListener) LayerDeleted(repo distribution.Repository, layer distribution.Layer) error {
 	tl.ops["layer:delete"]++
 	return nil
 }
 
 // checkExerciseRegistry takes the registry through all of its operations,
 // carrying out generic checks.
-func checkExerciseRepository(t *testing.T, repository storage.Repository) {
+func checkExerciseRepository(t *testing.T, repository distribution.Repository) {
 	// TODO(stevvooe): This would be a nice testutil function. Basically, it
 	// takes the registry through a common set of operations. This could be
 	// used to make cross-cutting updates by changing internals that affect
diff --git a/registry/storage/notifications/metrics.go b/notifications/metrics.go
similarity index 100%
rename from registry/storage/notifications/metrics.go
rename to notifications/metrics.go
diff --git a/registry/storage/notifications/sinks.go b/notifications/sinks.go
similarity index 100%
rename from registry/storage/notifications/sinks.go
rename to notifications/sinks.go
diff --git a/registry/storage/notifications/sinks_test.go b/notifications/sinks_test.go
similarity index 100%
rename from registry/storage/notifications/sinks_test.go
rename to notifications/sinks_test.go
diff --git a/registry/storage/services.go b/registry.go
similarity index 99%
rename from registry/storage/services.go
rename to registry.go
index 7e6ac4766c..1bb3b6299d 100644
--- a/registry/storage/services.go
+++ b/registry.go
@@ -1,4 +1,4 @@
-package storage
+package distribution
 
 import (
 	"github.com/docker/distribution/digest"
diff --git a/registry/handlers/app.go b/registry/handlers/app.go
index 7a36309bb2..3a9f46a71c 100644
--- a/registry/handlers/app.go
+++ b/registry/handlers/app.go
@@ -7,14 +7,15 @@ import (
 	"os"
 
 	"code.google.com/p/go-uuid/uuid"
+	"github.com/docker/distribution"
 	"github.com/docker/distribution/configuration"
 	ctxu "github.com/docker/distribution/context"
+	"github.com/docker/distribution/notifications"
 	"github.com/docker/distribution/registry/api/v2"
 	"github.com/docker/distribution/registry/auth"
 	"github.com/docker/distribution/registry/storage"
 	storagedriver "github.com/docker/distribution/registry/storage/driver"
 	"github.com/docker/distribution/registry/storage/driver/factory"
-	"github.com/docker/distribution/registry/storage/notifications"
 	"github.com/gorilla/mux"
 	"golang.org/x/net/context"
 )
@@ -32,7 +33,7 @@ type App struct {
 
 	router           *mux.Router                 // main application router, configured with dispatchers
 	driver           storagedriver.StorageDriver // driver maintains the app global storage driver instance.
-	registry         storage.Registry            // registry is the primary registry backend for the app instance.
+	registry         distribution.Registry       // registry is the primary registry backend for the app instance.
 	accessController auth.AccessController       // main access controller for application
 
 	// events contains notification related configuration.
diff --git a/registry/handlers/context.go b/registry/handlers/context.go
index 0d3f44cc0b..ee02a53afe 100644
--- a/registry/handlers/context.go
+++ b/registry/handlers/context.go
@@ -4,10 +4,10 @@ import (
 	"fmt"
 	"net/http"
 
+	"github.com/docker/distribution"
 	ctxu "github.com/docker/distribution/context"
 	"github.com/docker/distribution/digest"
 	"github.com/docker/distribution/registry/api/v2"
-	"github.com/docker/distribution/registry/storage"
 	"golang.org/x/net/context"
 )
 
@@ -21,7 +21,7 @@ type Context struct {
 
 	// Repository is the repository for the current request. All requests
 	// should be scoped to a single repository. This field may be nil.
-	Repository storage.Repository
+	Repository distribution.Repository
 
 	// Errors is a collection of errors encountered during the request to be
 	// returned to the client API. If errors are added to the collection, the
diff --git a/registry/handlers/images.go b/registry/handlers/images.go
index e41f368224..0e58984b05 100644
--- a/registry/handlers/images.go
+++ b/registry/handlers/images.go
@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"net/http"
 
+	"github.com/docker/distribution"
 	ctxu "github.com/docker/distribution/context"
 	"github.com/docker/distribution/digest"
 	"github.com/docker/distribution/manifest"
@@ -72,7 +73,7 @@ func (imh *imageManifestHandler) PutImageManifest(w http.ResponseWriter, r *http
 		case storage.ErrManifestVerification:
 			for _, verificationError := range err {
 				switch verificationError := verificationError.(type) {
-				case storage.ErrUnknownLayer:
+				case distribution.ErrUnknownLayer:
 					imh.Errors.Push(v2.ErrorCodeBlobUnknown, verificationError.FSLayer)
 				case storage.ErrManifestUnverified:
 					imh.Errors.Push(v2.ErrorCodeManifestUnverified)
diff --git a/registry/handlers/layer.go b/registry/handlers/layer.go
index 105c296403..69c3df7cd2 100644
--- a/registry/handlers/layer.go
+++ b/registry/handlers/layer.go
@@ -3,10 +3,10 @@ package handlers
 import (
 	"net/http"
 
+	"github.com/docker/distribution"
 	ctxu "github.com/docker/distribution/context"
 	"github.com/docker/distribution/digest"
 	"github.com/docker/distribution/registry/api/v2"
-	"github.com/docker/distribution/registry/storage"
 	"github.com/gorilla/handlers"
 )
 
@@ -54,7 +54,7 @@ func (lh *layerHandler) GetLayer(w http.ResponseWriter, r *http.Request) {
 
 	if err != nil {
 		switch err := err.(type) {
-		case storage.ErrUnknownLayer:
+		case distribution.ErrUnknownLayer:
 			w.WriteHeader(http.StatusNotFound)
 			lh.Errors.Push(v2.ErrorCodeBlobUnknown, err.FSLayer)
 		default:
diff --git a/registry/handlers/layerupload.go b/registry/handlers/layerupload.go
index 237644ea84..63a9e776b4 100644
--- a/registry/handlers/layerupload.go
+++ b/registry/handlers/layerupload.go
@@ -7,10 +7,10 @@ import (
 	"net/url"
 	"os"
 
+	"github.com/docker/distribution"
 	ctxu "github.com/docker/distribution/context"
 	"github.com/docker/distribution/digest"
 	"github.com/docker/distribution/registry/api/v2"
-	"github.com/docker/distribution/registry/storage"
 	"github.com/gorilla/handlers"
 )
 
@@ -63,7 +63,7 @@ func layerUploadDispatcher(ctx *Context, r *http.Request) http.Handler {
 		upload, err := layers.Resume(luh.UUID)
 		if err != nil {
 			ctxu.GetLogger(ctx).Errorf("error resolving upload: %v", err)
-			if err == storage.ErrLayerUploadUnknown {
+			if err == distribution.ErrLayerUploadUnknown {
 				return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 					w.WriteHeader(http.StatusNotFound)
 					luh.Errors.Push(v2.ErrorCodeBlobUploadUnknown, err)
@@ -114,7 +114,7 @@ type layerUploadHandler struct {
 	// UUID identifies the upload instance for the current request.
 	UUID string
 
-	Upload storage.LayerUpload
+	Upload distribution.LayerUpload
 
 	State layerUploadState
 }
@@ -196,7 +196,7 @@ func (luh *layerUploadHandler) PutLayerUploadComplete(w http.ResponseWriter, r *
 	layer, err := luh.Upload.Finish(dgst)
 	if err != nil {
 		switch err := err.(type) {
-		case storage.ErrLayerInvalidDigest:
+		case distribution.ErrLayerInvalidDigest:
 			w.WriteHeader(http.StatusBadRequest)
 			luh.Errors.Push(v2.ErrorCodeDigestInvalid, err)
 		default:
@@ -215,7 +215,7 @@ func (luh *layerUploadHandler) PutLayerUploadComplete(w http.ResponseWriter, r *
 	}
 
 	// Build our canonical layer url
-	layerURL, err := luh.urlBuilder.BuildBlobURL(layer.Name(), layer.Digest())
+	layerURL, err := luh.urlBuilder.BuildBlobURL(luh.Repository.Name(), layer.Digest())
 	if err != nil {
 		luh.Errors.Push(v2.ErrorCodeUnknown, err)
 		w.WriteHeader(http.StatusInternalServerError)
@@ -268,7 +268,7 @@ func (luh *layerUploadHandler) layerUploadResponse(w http.ResponseWriter, r *htt
 	}
 
 	uploadURL, err := luh.urlBuilder.BuildBlobUploadChunkURL(
-		luh.Upload.Name(), luh.Upload.UUID(),
+		luh.Repository.Name(), luh.Upload.UUID(),
 		url.Values{
 			"_state": []string{token},
 		})
diff --git a/registry/storage/cloudfrontlayerhandler.go b/registry/storage/cloudfrontlayerhandler.go
index f887895c63..82bc313de6 100644
--- a/registry/storage/cloudfrontlayerhandler.go
+++ b/registry/storage/cloudfrontlayerhandler.go
@@ -10,6 +10,7 @@ import (
 	"time"
 
 	"github.com/AdRoll/goamz/cloudfront"
+	"github.com/docker/distribution"
 	storagedriver "github.com/docker/distribution/registry/storage/driver"
 )
 
@@ -95,7 +96,7 @@ func newCloudFrontLayerHandler(storageDriver storagedriver.StorageDriver, option
 
 // Resolve returns an http.Handler which can serve the contents of the given
 // Layer, or an error if not supported by the storagedriver.
-func (lh *cloudFrontLayerHandler) Resolve(layer Layer) (http.Handler, error) {
+func (lh *cloudFrontLayerHandler) Resolve(layer distribution.Layer) (http.Handler, error) {
 	layerURLStr, err := lh.delegateLayerHandler.urlFor(layer, nil)
 	if err != nil {
 		return nil, err
diff --git a/registry/storage/delegatelayerhandler.go b/registry/storage/delegatelayerhandler.go
index 0135402385..62b08b227e 100644
--- a/registry/storage/delegatelayerhandler.go
+++ b/registry/storage/delegatelayerhandler.go
@@ -5,6 +5,7 @@ import (
 	"net/http"
 	"time"
 
+	"github.com/docker/distribution"
 	storagedriver "github.com/docker/distribution/registry/storage/driver"
 )
 
@@ -40,7 +41,7 @@ func newDelegateLayerHandler(storageDriver storagedriver.StorageDriver, options
 
 // Resolve returns an http.Handler which can serve the contents of the given
 // Layer, or an error if not supported by the storagedriver.
-func (lh *delegateLayerHandler) Resolve(layer Layer) (http.Handler, error) {
+func (lh *delegateLayerHandler) Resolve(layer distribution.Layer) (http.Handler, error) {
 	// TODO(bbland): This is just a sanity check to ensure that the
 	// storagedriver supports url generation. It would be nice if we didn't have
 	// to do this twice for non-GET requests.
@@ -64,7 +65,7 @@ func (lh *delegateLayerHandler) Resolve(layer Layer) (http.Handler, error) {
 
 // urlFor returns a download URL for the given layer, or the empty string if
 // unsupported.
-func (lh *delegateLayerHandler) urlFor(layer Layer, options map[string]interface{}) (string, error) {
+func (lh *delegateLayerHandler) urlFor(layer distribution.Layer, options map[string]interface{}) (string, error) {
 	// Crack open the layer to get at the layerStore
 	layerRd, ok := layer.(*layerReader)
 	if !ok {
diff --git a/registry/storage/filereader.go b/registry/storage/filereader.go
index 4cb2b3313c..b70b1fb204 100644
--- a/registry/storage/filereader.go
+++ b/registry/storage/filereader.go
@@ -125,23 +125,8 @@ func (fr *fileReader) Seek(offset int64, whence int) (int64, error) {
 	return fr.offset, err
 }
 
-// Close the layer. Should be called when the resource is no longer needed.
 func (fr *fileReader) Close() error {
-	if fr.err != nil {
-		return fr.err
-	}
-
-	fr.err = ErrLayerClosed
-
-	// close and release reader chain
-	if fr.rc != nil {
-		fr.rc.Close()
-	}
-
-	fr.rc = nil
-	fr.brd = nil
-
-	return fr.err
+	return fr.closeWithErr(fmt.Errorf("fileReader: closed"))
 }
 
 // reader prepares the current reader at the lrs offset, ensuring its buffered
@@ -199,3 +184,21 @@ func (fr *fileReader) reset() {
 		fr.rc = nil
 	}
 }
+
+func (fr *fileReader) closeWithErr(err error) error {
+	if fr.err != nil {
+		return fr.err
+	}
+
+	fr.err = err
+
+	// close and release reader chain
+	if fr.rc != nil {
+		fr.rc.Close()
+	}
+
+	fr.rc = nil
+	fr.brd = nil
+
+	return fr.err
+}
diff --git a/registry/storage/layer_test.go b/registry/storage/layer_test.go
index 4898299319..ec0186db5e 100644
--- a/registry/storage/layer_test.go
+++ b/registry/storage/layer_test.go
@@ -9,6 +9,7 @@ import (
 	"os"
 	"testing"
 
+	"github.com/docker/distribution"
 	"github.com/docker/distribution/digest"
 	storagedriver "github.com/docker/distribution/registry/storage/driver"
 	"github.com/docker/distribution/registry/storage/driver/inmemory"
@@ -53,7 +54,7 @@ func TestSimpleLayerUpload(t *testing.T) {
 
 	// Do a resume, get unknown upload
 	layerUpload, err = ls.Resume(layerUpload.UUID())
-	if err != ErrLayerUploadUnknown {
+	if err != distribution.ErrLayerUploadUnknown {
 		t.Fatalf("unexpected error resuming upload, should be unkown: %v", err)
 	}
 
@@ -102,7 +103,7 @@ func TestSimpleLayerUpload(t *testing.T) {
 	}
 
 	// After finishing an upload, it should no longer exist.
-	if _, err := ls.Resume(layerUpload.UUID()); err != ErrLayerUploadUnknown {
+	if _, err := ls.Resume(layerUpload.UUID()); err != distribution.ErrLayerUploadUnknown {
 		t.Fatalf("expected layer upload to be unknown, got %v", err)
 	}
 
@@ -165,7 +166,7 @@ func TestSimpleLayerRead(t *testing.T) {
 	}
 
 	switch err.(type) {
-	case ErrUnknownLayer:
+	case distribution.ErrUnknownLayer:
 		err = nil
 	default:
 		t.Fatalf("unexpected error fetching non-existent layer: %v", err)
diff --git a/registry/storage/layerhandler.go b/registry/storage/layerhandler.go
index 5bcfedddfa..b03bc25079 100644
--- a/registry/storage/layerhandler.go
+++ b/registry/storage/layerhandler.go
@@ -4,6 +4,7 @@ import (
 	"fmt"
 	"net/http"
 
+	"github.com/docker/distribution"
 	storagedriver "github.com/docker/distribution/registry/storage/driver"
 )
 
@@ -13,7 +14,7 @@ type LayerHandler interface {
 	// Layer if possible, or nil and an error when unsupported. This may
 	// directly serve the contents of the layer or issue a redirect to another
 	// URL hosting the content.
-	Resolve(layer Layer) (http.Handler, error)
+	Resolve(layer distribution.Layer) (http.Handler, error)
 }
 
 // LayerHandlerInitFunc is the type of a LayerHandler factory function and is
diff --git a/registry/storage/layerreader.go b/registry/storage/layerreader.go
index 4510dd7d05..2d8e588d41 100644
--- a/registry/storage/layerreader.go
+++ b/registry/storage/layerreader.go
@@ -3,6 +3,7 @@ package storage
 import (
 	"time"
 
+	"github.com/docker/distribution"
 	"github.com/docker/distribution/digest"
 )
 
@@ -11,15 +12,10 @@ import (
 type layerReader struct {
 	fileReader
 
-	name   string // repo name of this layer
 	digest digest.Digest
 }
 
-var _ Layer = &layerReader{}
-
-func (lrs *layerReader) Name() string {
-	return lrs.name
-}
+var _ distribution.Layer = &layerReader{}
 
 func (lrs *layerReader) Digest() digest.Digest {
 	return lrs.digest
@@ -28,3 +24,8 @@ func (lrs *layerReader) Digest() digest.Digest {
 func (lrs *layerReader) CreatedAt() time.Time {
 	return lrs.modtime
 }
+
+// Close the layer. Should be called when the resource is no longer needed.
+func (lrs *layerReader) Close() error {
+	return lrs.closeWithErr(distribution.ErrLayerClosed)
+}
diff --git a/registry/storage/layerstore.go b/registry/storage/layerstore.go
index e4760b4ea4..153e42a897 100644
--- a/registry/storage/layerstore.go
+++ b/registry/storage/layerstore.go
@@ -4,6 +4,7 @@ import (
 	"time"
 
 	"code.google.com/p/go-uuid/uuid"
+	"github.com/docker/distribution"
 	ctxu "github.com/docker/distribution/context"
 	"github.com/docker/distribution/digest"
 	"github.com/docker/distribution/manifest"
@@ -23,7 +24,7 @@ func (ls *layerStore) Exists(digest digest.Digest) (bool, error) {
 
 	if err != nil {
 		switch err.(type) {
-		case ErrUnknownLayer:
+		case distribution.ErrUnknownLayer:
 			return false, nil
 		}
 
@@ -33,7 +34,7 @@ func (ls *layerStore) Exists(digest digest.Digest) (bool, error) {
 	return true, nil
 }
 
-func (ls *layerStore) Fetch(dgst digest.Digest) (Layer, error) {
+func (ls *layerStore) Fetch(dgst digest.Digest) (distribution.Layer, error) {
 	ctxu.GetLogger(ls.repository.ctx).Debug("(*layerStore).Fetch")
 	bp, err := ls.path(dgst)
 	if err != nil {
@@ -47,7 +48,6 @@ func (ls *layerStore) Fetch(dgst digest.Digest) (Layer, error) {
 
 	return &layerReader{
 		fileReader: *fr,
-		name:       ls.repository.Name(),
 		digest:     dgst,
 	}, nil
 }
@@ -55,7 +55,7 @@ func (ls *layerStore) Fetch(dgst digest.Digest) (Layer, error) {
 // Upload begins a layer upload, returning a handle. If the layer upload
 // is already in progress or the layer has already been uploaded, this
 // will return an error.
-func (ls *layerStore) Upload() (LayerUpload, error) {
+func (ls *layerStore) Upload() (distribution.LayerUpload, error) {
 	ctxu.GetLogger(ls.repository.ctx).Debug("(*layerStore).Upload")
 
 	// NOTE(stevvooe): Consider the issues with allowing concurrent upload of
@@ -93,7 +93,7 @@ func (ls *layerStore) Upload() (LayerUpload, error) {
 
 // Resume continues an in progress layer upload, returning the current
 // state of the upload.
-func (ls *layerStore) Resume(uuid string) (LayerUpload, error) {
+func (ls *layerStore) Resume(uuid string) (distribution.LayerUpload, error) {
 	ctxu.GetLogger(ls.repository.ctx).Debug("(*layerStore).Resume")
 	startedAtPath, err := ls.repository.registry.pm.path(uploadStartedAtPathSpec{
 		name: ls.repository.Name(),
@@ -108,7 +108,7 @@ func (ls *layerStore) Resume(uuid string) (LayerUpload, error) {
 	if err != nil {
 		switch err := err.(type) {
 		case storagedriver.PathNotFoundError:
-			return nil, ErrLayerUploadUnknown
+			return nil, distribution.ErrLayerUploadUnknown
 		default:
 			return nil, err
 		}
@@ -132,7 +132,7 @@ func (ls *layerStore) Resume(uuid string) (LayerUpload, error) {
 }
 
 // newLayerUpload allocates a new upload controller with the given state.
-func (ls *layerStore) newLayerUpload(uuid, path string, startedAt time.Time) (LayerUpload, error) {
+func (ls *layerStore) newLayerUpload(uuid, path string, startedAt time.Time) (distribution.LayerUpload, error) {
 	fw, err := newFileWriter(ls.repository.driver, path)
 	if err != nil {
 		return nil, err
@@ -158,7 +158,9 @@ func (ls *layerStore) path(dgst digest.Digest) (string, error) {
 	if err != nil {
 		switch err := err.(type) {
 		case storagedriver.PathNotFoundError:
-			return "", ErrUnknownLayer{manifest.FSLayer{BlobSum: dgst}}
+			return "", distribution.ErrUnknownLayer{
+				FSLayer: manifest.FSLayer{BlobSum: dgst},
+			}
 		default:
 			return "", err
 		}
diff --git a/registry/storage/layerupload.go b/registry/storage/layerupload.go
index e6cf21a9c7..369a9bd5ec 100644
--- a/registry/storage/layerupload.go
+++ b/registry/storage/layerupload.go
@@ -7,6 +7,7 @@ import (
 	"time"
 
 	"github.com/Sirupsen/logrus"
+	"github.com/docker/distribution"
 	ctxu "github.com/docker/distribution/context"
 	"github.com/docker/distribution/digest"
 	storagedriver "github.com/docker/distribution/registry/storage/driver"
@@ -24,12 +25,7 @@ type layerUploadController struct {
 	fileWriter
 }
 
-var _ LayerUpload = &layerUploadController{}
-
-// Name of the repository under which the layer will be linked.
-func (luc *layerUploadController) Name() string {
-	return luc.layerStore.repository.Name()
-}
+var _ distribution.LayerUpload = &layerUploadController{}
 
 // UUID returns the identifier for this upload.
 func (luc *layerUploadController) UUID() string {
@@ -44,7 +40,7 @@ func (luc *layerUploadController) StartedAt() time.Time {
 // uploaded layer. The final size and checksum are validated against the
 // contents of the uploaded layer. The checksum should be provided in the
 // format <algorithm>:<hex digest>.
-func (luc *layerUploadController) Finish(digest digest.Digest) (Layer, error) {
+func (luc *layerUploadController) Finish(digest digest.Digest) (distribution.Layer, error) {
 	ctxu.GetLogger(luc.layerStore.repository.ctx).Debug("(*layerUploadController).Finish")
 	canonical, err := luc.validateLayer(digest)
 	if err != nil {
@@ -93,9 +89,9 @@ func (luc *layerUploadController) validateLayer(dgst digest.Digest) (digest.Dige
 	case tarsum.Version1:
 	default:
 		// version 0 and dev, for now.
-		return "", ErrLayerInvalidDigest{
+		return "", distribution.ErrLayerInvalidDigest{
 			Digest: dgst,
-			Reason: ErrLayerTarSumVersionUnsupported,
+			Reason: distribution.ErrLayerTarSumVersionUnsupported,
 		}
 	}
 
@@ -124,7 +120,7 @@ func (luc *layerUploadController) validateLayer(dgst digest.Digest) (digest.Dige
 	}
 
 	if !digestVerifier.Verified() {
-		return "", ErrLayerInvalidDigest{
+		return "", distribution.ErrLayerInvalidDigest{
 			Digest: dgst,
 			Reason: fmt.Errorf("content does not match digest"),
 		}
@@ -193,7 +189,7 @@ func (luc *layerUploadController) moveLayer(dgst digest.Digest) error {
 // named repository for the upload controller.
 func (luc *layerUploadController) linkLayer(digest digest.Digest) error {
 	layerLinkPath, err := luc.layerStore.repository.registry.pm.path(layerLinkPathSpec{
-		name:   luc.Name(),
+		name:   luc.layerStore.repository.Name(),
 		digest: digest,
 	})
 
@@ -209,7 +205,7 @@ func (luc *layerUploadController) linkLayer(digest digest.Digest) error {
 // resources are already not present, no error will be returned.
 func (luc *layerUploadController) removeResources() error {
 	dataPath, err := luc.layerStore.repository.registry.pm.path(uploadDataPathSpec{
-		name: luc.Name(),
+		name: luc.layerStore.repository.Name(),
 		uuid: luc.uuid,
 	})
 
diff --git a/registry/storage/manifeststore.go b/registry/storage/manifeststore.go
index 1f798dde80..998029058a 100644
--- a/registry/storage/manifeststore.go
+++ b/registry/storage/manifeststore.go
@@ -4,6 +4,7 @@ import (
 	"fmt"
 	"strings"
 
+	"github.com/docker/distribution"
 	ctxu "github.com/docker/distribution/context"
 	"github.com/docker/distribution/digest"
 	"github.com/docker/distribution/manifest"
@@ -71,7 +72,7 @@ type manifestStore struct {
 	tagStore      *tagStore
 }
 
-var _ ManifestService = &manifestStore{}
+var _ distribution.ManifestService = &manifestStore{}
 
 // func (ms *manifestStore) Repository() Repository {
 // 	return ms.repository
@@ -177,7 +178,7 @@ func (ms *manifestStore) verifyManifest(tag string, mnfst *manifest.SignedManife
 		}
 
 		if !exists {
-			errs = append(errs, ErrUnknownLayer{FSLayer: fsLayer})
+			errs = append(errs, distribution.ErrUnknownLayer{FSLayer: fsLayer})
 		}
 	}
 
diff --git a/registry/storage/registry.go b/registry/storage/registry.go
index c4ca2f8004..2983751a43 100644
--- a/registry/storage/registry.go
+++ b/registry/storage/registry.go
@@ -1,6 +1,7 @@
 package storage
 
 import (
+	"github.com/docker/distribution"
 	storagedriver "github.com/docker/distribution/registry/storage/driver"
 	"golang.org/x/net/context"
 )
@@ -16,7 +17,7 @@ type registry struct {
 // NewRegistryWithDriver creates a new registry instance from the provided
 // driver. The resulting registry may be shared by multiple goroutines but is
 // cheap to allocate.
-func NewRegistryWithDriver(driver storagedriver.StorageDriver) Registry {
+func NewRegistryWithDriver(driver storagedriver.StorageDriver) distribution.Registry {
 	bs := &blobStore{}
 
 	reg := &registry{
@@ -35,7 +36,7 @@ func NewRegistryWithDriver(driver storagedriver.StorageDriver) Registry {
 // Repository returns an instance of the repository tied to the registry.
 // Instances should not be shared between goroutines but are cheap to
 // allocate. In general, they should be request scoped.
-func (reg *registry) Repository(ctx context.Context, name string) Repository {
+func (reg *registry) Repository(ctx context.Context, name string) distribution.Repository {
 	return &repository{
 		ctx:      ctx,
 		registry: reg,
@@ -58,7 +59,7 @@ func (repo *repository) Name() string {
 // Manifests returns an instance of ManifestService. Instantiation is cheap and
 // may be context sensitive in the future. The instance should be used similar
 // to a request local.
-func (repo *repository) Manifests() ManifestService {
+func (repo *repository) Manifests() distribution.ManifestService {
 	return &manifestStore{
 		repository: repo,
 		revisionStore: &revisionStore{
@@ -73,7 +74,7 @@ func (repo *repository) Manifests() ManifestService {
 // Layers returns an instance of the LayerService. Instantiation is cheap and
 // may be context sensitive in the future. The instance should be used similar
 // to a request local.
-func (repo *repository) Layers() LayerService {
+func (repo *repository) Layers() distribution.LayerService {
 	return &layerStore{
 		repository: repo,
 	}