use generic parameter building functions; pagination in unit tests
diff --git a/openstack/storage/v1/containers/requests.go b/openstack/storage/v1/containers/requests.go
index a5435a2..3a6a265 100644
--- a/openstack/storage/v1/containers/requests.go
+++ b/openstack/storage/v1/containers/requests.go
@@ -1,57 +1,39 @@
 package containers
 
 import (
-	"net/http"
-
 	"github.com/racker/perigee"
 	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/openstack/utils"
 	"github.com/rackspace/gophercloud/pagination"
 )
 
-// ListResult is a *http.Response that is returned from a call to the List function.
-type ListResult struct {
-	pagination.MarkerPageBase
+// ListOpts is a structure that holds options for listing containers.
+type ListOpts struct {
+	Full      bool
+	Limit     int    `q:"limit"`
+	Marker    string `q:"marker"`
+	EndMarker string `q:"end_marker"`
+	Format    string `q:"format"`
+	Prefix    string `q:"prefix"`
+	Delimiter []byte `q:"delimiter"`
 }
 
-// IsEmpty returns true if a ListResult contains no container names.
-func (r ListResult) IsEmpty() (bool, error) {
-	names, err := ExtractNames(r)
-	if err != nil {
-		return true, err
-	}
-	return len(names) == 0, nil
-}
-
-// LastMarker returns the last container name in a ListResult.
-func (r ListResult) LastMarker() (string, error) {
-	names, err := ExtractNames(r)
-	if err != nil {
-		return "", err
-	}
-	if len(names) == 0 {
-		return "", nil
-	}
-	return names[len(names)-1], nil
-}
-
-// GetResult is a *http.Response that is returned from a call to the Get function.
-type GetResult *http.Response
-
 // List is a function that retrieves all objects in a container. It also returns the details
 // for the account. To extract just the container information or names, pass the ListResult
 // response to the ExtractInfo or ExtractNames function, respectively.
 func List(c *gophercloud.ServiceClient, opts ListOpts) pagination.Pager {
 	var headers map[string]string
 
-	query := utils.BuildQuery(opts.Params)
+	query, err := gophercloud.BuildQueryString(opts)
+	if err != nil {
+		return pagination.Pager{Err: err}
+	}
 
 	if !opts.Full {
-		headers = map[string]string{"Content-Type": "text/plain"}
+		headers = map[string]string{"Accept": "text/plain"}
 	}
 
 	createPage := func(r pagination.LastHTTPResponse) pagination.Page {
-		p := ListResult{pagination.MarkerPageBase{LastHTTPResponse: r}}
+		p := ContainerPage{pagination.MarkerPageBase{LastHTTPResponse: r}}
 		p.MarkerPageBase.Owner = p
 		return p
 	}
@@ -62,13 +44,30 @@
 	return pager
 }
 
-// Create is a function that creates a new container.
-func Create(c *gophercloud.ServiceClient, opts CreateOpts) (Container, error) {
-	var ci Container
+// CreateOpts is a structure that holds parameters for creating a container.
+type CreateOpts struct {
+	Metadata          map[string]string
+	ContainerRead     string `h:"X-Container-Read"`
+	ContainerSyncTo   string `h:"X-Container-Sync-To"`
+	ContainerSyncKey  string `h:"X-Container-Sync-Key"`
+	ContainerWrite    string `h:"X-Container-Write"`
+	ContentType       string `h:"Content-Type"`
+	DetectContentType bool   `h:"X-Detect-Content-Type"`
+	IfNoneMatch       string `h:"If-None-Match"`
+	VersionsLocation  string `h:"X-Versions-Location"`
+}
 
+// Create is a function that creates a new container.
+func Create(c *gophercloud.ServiceClient, containerName string, opts CreateOpts) (Container, error) {
+	var container Container
 	h := c.Provider.AuthenticatedHeaders()
 
-	for k, v := range opts.Headers {
+	headers, err := gophercloud.BuildHeaders(opts)
+	if err != nil {
+		return container, err
+	}
+
+	for k, v := range headers {
 		h[k] = v
 	}
 
@@ -76,38 +75,49 @@
 		h["X-Container-Meta-"+k] = v
 	}
 
-	url := containerURL(c, opts.Name)
-	_, err := perigee.Request("PUT", url, perigee.Options{
+	_, err = perigee.Request("PUT", containerURL(c, containerName), perigee.Options{
 		MoreHeaders: h,
 		OkCodes:     []int{201, 204},
 	})
 	if err == nil {
-		ci = Container{
-			"name": opts.Name,
-		}
+		container = Container{"name": containerName}
 	}
-	return ci, err
+	return container, err
 }
 
 // Delete is a function that deletes a container.
-func Delete(c *gophercloud.ServiceClient, opts DeleteOpts) error {
-	h := c.Provider.AuthenticatedHeaders()
-
-	query := utils.BuildQuery(opts.Params)
-
-	url := containerURL(c, opts.Name) + query
-	_, err := perigee.Request("DELETE", url, perigee.Options{
-		MoreHeaders: h,
+func Delete(c *gophercloud.ServiceClient, containerName string) error {
+	_, err := perigee.Request("DELETE", containerURL(c, containerName), perigee.Options{
+		MoreHeaders: c.Provider.AuthenticatedHeaders(),
 		OkCodes:     []int{204},
 	})
 	return err
 }
 
+// UpdateOpts is a structure that holds parameters for updating, creating, or deleting a
+// container's metadata.
+type UpdateOpts struct {
+	Metadata               map[string]string
+	ContainerRead          string `h:"X-Container-Read"`
+	ContainerSyncTo        string `h:"X-Container-Sync-To"`
+	ContainerSyncKey       string `h:"X-Container-Sync-Key"`
+	ContainerWrite         string `h:"X-Container-Write"`
+	ContentType            string `h:"Content-Type"`
+	DetectContentType      bool   `h:"X-Detect-Content-Type"`
+	RemoveVersionsLocation string `h:"X-Remove-Versions-Location"`
+	VersionsLocation       string `h:"X-Versions-Location"`
+}
+
 // Update is a function that creates, updates, or deletes a container's metadata.
-func Update(c *gophercloud.ServiceClient, opts UpdateOpts) error {
+func Update(c *gophercloud.ServiceClient, containerName string, opts UpdateOpts) error {
 	h := c.Provider.AuthenticatedHeaders()
 
-	for k, v := range opts.Headers {
+	headers, err := gophercloud.BuildHeaders(opts)
+	if err != nil {
+		return err
+	}
+
+	for k, v := range headers {
 		h[k] = v
 	}
 
@@ -115,8 +125,8 @@
 		h["X-Container-Meta-"+k] = v
 	}
 
-	url := containerURL(c, opts.Name)
-	_, err := perigee.Request("POST", url, perigee.Options{
+	url := containerURL(c, containerName)
+	_, err = perigee.Request("POST", url, perigee.Options{
 		MoreHeaders: h,
 		OkCodes:     []int{204},
 	})
@@ -125,13 +135,13 @@
 
 // Get is a function that retrieves the metadata of a container. To extract just the custom
 // metadata, pass the GetResult response to the ExtractMetadata function.
-func Get(c *gophercloud.ServiceClient, opts GetOpts) (GetResult, error) {
-	h := c.Provider.AuthenticatedHeaders()
-
-	url := containerURL(c, opts.Name)
-	resp, err := perigee.Request("HEAD", url, perigee.Options{
-		MoreHeaders: h,
+func Get(c *gophercloud.ServiceClient, containerName string) GetResult {
+	var gr GetResult
+	resp, err := perigee.Request("HEAD", containerURL(c, containerName), perigee.Options{
+		MoreHeaders: c.Provider.AuthenticatedHeaders(),
 		OkCodes:     []int{204},
 	})
-	return &resp.HttpResponse, err
+	gr.Err = err
+	gr.Resp = &resp.HttpResponse
+	return gr
 }