diff --git a/openstack/storage/v1/objects/requests.go b/openstack/storage/v1/objects/requests.go
index 4e6f23a..bb9c4ac 100644
--- a/openstack/storage/v1/objects/requests.go
+++ b/openstack/storage/v1/objects/requests.go
@@ -2,10 +2,11 @@
 
 import (
 	"fmt"
-	"github.com/racker/perigee"
-	storage "github.com/rackspace/gophercloud/openstack/storage/v1"
-	"github.com/rackspace/gophercloud/openstack/utils"
 	"net/http"
+
+	"github.com/racker/perigee"
+	"github.com/rackspace/gophercloud"
+	"github.com/rackspace/gophercloud/openstack/utils"
 )
 
 // ListResult is a *http.Response that is returned from a call to the List function.
@@ -20,13 +21,10 @@
 // List is a function that retrieves all objects in a container. It also returns the details
 // for the container. To extract only the object information or names, pass the ListResult
 // response to the ExtractInfo or ExtractNames function, respectively.
-func List(c *storage.Client, opts ListOpts) (ListResult, error) {
+func List(c *gophercloud.ServiceClient, opts ListOpts) (ListResult, error) {
 	contentType := ""
 
-	h, err := c.GetHeaders()
-	if err != nil {
-		return nil, err
-	}
+	h := c.Provider.AuthenticatedHeaders()
 
 	query := utils.BuildQuery(opts.Params)
 
@@ -45,11 +43,8 @@
 // Download is a function that retrieves the content and metadata for an object.
 // To extract just the content, pass the DownloadResult response to the ExtractContent
 // function.
-func Download(c *storage.Client, opts DownloadOpts) (DownloadResult, error) {
-	h, err := c.GetHeaders()
-	if err != nil {
-		return nil, err
-	}
+func Download(c *gophercloud.ServiceClient, opts DownloadOpts) (DownloadResult, error) {
+	h := c.Provider.AuthenticatedHeaders()
 
 	for k, v := range opts.Headers {
 		h[k] = v
@@ -65,13 +60,10 @@
 }
 
 // Create is a function that creates a new object or replaces an existing object.
-func Create(c *storage.Client, opts CreateOpts) error {
+func Create(c *gophercloud.ServiceClient, opts CreateOpts) error {
 	var reqBody []byte
 
-	h, err := c.GetHeaders()
-	if err != nil {
-		return err
-	}
+	h := c.Provider.AuthenticatedHeaders()
 
 	for k, v := range opts.Headers {
 		h[k] = v
@@ -86,7 +78,7 @@
 	content := opts.Content
 	if content != nil {
 		reqBody = make([]byte, 0)
-		_, err = content.Read(reqBody)
+		_, err := content.Read(reqBody)
 		if err != nil {
 			return err
 		}
@@ -101,11 +93,8 @@
 }
 
 // Copy is a function that copies one object to another.
-func Copy(c *storage.Client, opts CopyOpts) error {
-	h, err := c.GetHeaders()
-	if err != nil {
-		return err
-	}
+func Copy(c *gophercloud.ServiceClient, opts CopyOpts) error {
+	h := c.Provider.AuthenticatedHeaders()
 
 	for k, v := range opts.Metadata {
 		h["X-Object-Meta-"+k] = v
@@ -121,11 +110,8 @@
 }
 
 // Delete is a function that deletes an object.
-func Delete(c *storage.Client, opts DeleteOpts) error {
-	h, err := c.GetHeaders()
-	if err != nil {
-		return err
-	}
+func Delete(c *gophercloud.ServiceClient, opts DeleteOpts) error {
+	h := c.Provider.AuthenticatedHeaders()
 
 	query := utils.BuildQuery(opts.Params)
 
@@ -138,29 +124,24 @@
 
 // Get is a function that retrieves the metadata of an object. To extract just the custom
 // metadata, pass the GetResult response to the ExtractMetadata function.
-func Get(c *storage.Client, opts GetOpts) (GetResult, error) {
-	h, err := c.GetHeaders()
-	if err != nil {
-		return nil, err
-	}
+func Get(c *gophercloud.ServiceClient, opts GetOpts) (GetResult, error) {
+	h := c.Provider.AuthenticatedHeaders()
 
 	for k, v := range opts.Headers {
 		h[k] = v
 	}
 
-	url := c.GetObjectURL(opts.Container, opts.Name)
+	url := getObjectURL(c, opts.Container, opts.Name)
 	resp, err := perigee.Request("HEAD", url, perigee.Options{
 		MoreHeaders: h,
+		OkCodes:     []int{204},
 	})
 	return &resp.HttpResponse, err
 }
 
 // Update is a function that creates, updates, or deletes an object's metadata.
-func Update(c *storage.Client, opts UpdateOpts) error {
-	h, err := c.GetHeaders()
-	if err != nil {
-		return err
-	}
+func Update(c *gophercloud.ServiceClient, opts UpdateOpts) error {
+	h := c.Provider.AuthenticatedHeaders()
 
 	for k, v := range opts.Headers {
 		h[k] = v
