diff --git a/acceptance/openstack/storage/v1/containers_test.go b/acceptance/openstack/storage/v1/containers_test.go
index 29f6312..3cc367b 100644
--- a/acceptance/openstack/storage/v1/containers_test.go
+++ b/acceptance/openstack/storage/v1/containers_test.go
@@ -8,6 +8,7 @@
 
 	"github.com/rackspace/gophercloud/acceptance/tools"
 	"github.com/rackspace/gophercloud/openstack/storage/v1/containers"
+	"github.com/rackspace/gophercloud/pagination"
 )
 
 // numContainers is the number of containers to create for testing.
@@ -18,7 +19,6 @@
 	client, err := newClient()
 	if err != nil {
 		t.Error(err)
-		return
 	}
 
 	// Create a slice of random container names.
@@ -29,80 +29,65 @@
 
 	// Create numContainers containers.
 	for i := 0; i < len(cNames); i++ {
-		_, err := containers.Create(client, containers.CreateOpts{
-			Name: cNames[i],
-		})
+		_, err := containers.Create(client, cNames[i], containers.CreateOpts{})
 		if err != nil {
 			t.Error(err)
-			return
 		}
 	}
 	// Delete the numContainers containers after function completion.
 	defer func() {
 		for i := 0; i < len(cNames); i++ {
-			err = containers.Delete(client, containers.DeleteOpts{
-				Name: cNames[i],
-			})
+			err = containers.Delete(client, cNames[i])
 			if err != nil {
 				t.Error(err)
-				return
 			}
 		}
 	}()
 
 	// List the numContainer names that were just created. To just list those,
 	// the 'prefix' parameter is used.
-	lr, err := containers.List(client, containers.ListOpts{
-		Full: false,
-		Params: map[string]string{
-			"prefix": "gophercloud-test-container-",
-		},
+	pager := containers.List(client, containers.ListOpts{Full: true, Prefix: "gophercloud-test-container-"})
+	if pager.Err != nil {
+		t.Error(err)
+		return
+	}
+	err = pager.EachPage(func(page pagination.Page) (bool, error) {
+		containerList, err := containers.ExtractInfo(page)
+		if err != nil {
+			t.Error(err)
+		}
+		for _, n := range containerList {
+			t.Logf("Container: Name [%s] Count [%d] Bytes [%d]",
+				n["name"], int(n["count"].(float64)), int(n["bytes"].(float64)))
+		}
+
+		return true, nil
 	})
 	if err != nil {
 		t.Error(err)
-		return
-	}
-	// Extract the names from the 'List' response.
-	cns, err := containers.ExtractNames(lr)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	if len(cns) != len(cNames) {
-		t.Errorf("Expected %d names and got %d:\nExpected:%v\nActual:%v", len(cNames), len(cns), cNames, cns)
-		return
 	}
 
 	// List the info for the numContainer containers that were created.
-	lr, err = containers.List(client, containers.ListOpts{
-		Full: true,
-		Params: map[string]string{
-			"prefix": "gophercloud-test-container-",
-		},
+	pager = containers.List(client, containers.ListOpts{Full: false, Prefix: "gophercloud-test-container-"})
+	err = pager.EachPage(func(page pagination.Page) (bool, error) {
+		containerList, err := containers.ExtractNames(page)
+		if err != nil {
+			return false, err
+		}
+		for _, n := range containerList {
+			t.Logf("Container: Name [%s]", n)
+		}
+
+		return true, nil
 	})
 	if err != nil {
 		t.Error(err)
-		return
-	}
-	// Extract the info from the 'List' response.
-	cis, err := containers.ExtractInfo(lr)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	if len(cis) != len(cNames) {
-		t.Errorf("Expected %d containers and got %d", len(cNames), len(cis))
-		return
 	}
 
 	// Update one of the numContainer container metadata.
-	err = containers.Update(client, containers.UpdateOpts{
-		Name:     cNames[0],
-		Metadata: metadata,
-	})
+	err = containers.Update(client, cNames[0], containers.UpdateOpts{Metadata: metadata})
 	if err != nil {
 		t.Error(err)
-		return
 	}
 	// After the tests are done, delete the metadata that was set.
 	defer func() {
@@ -110,30 +95,20 @@
 		for k := range metadata {
 			tempMap[k] = ""
 		}
-		err = containers.Update(client, containers.UpdateOpts{
-			Name:     cNames[0],
-			Metadata: tempMap,
-		})
+		err = containers.Update(client, cNames[0], containers.UpdateOpts{Metadata: tempMap})
 		if err != nil {
 			t.Error(err)
-			return
 		}
 	}()
 
 	// Retrieve a container's metadata.
-	gr, err := containers.Get(client, containers.GetOpts{
-		Name: cNames[0],
-	})
+	cm, err := containers.Get(client, cNames[0]).ExtractMetadata()
 	if err != nil {
 		t.Error(err)
-		return
 	}
-	// Extract the metadata from the 'Get' response.
-	cm := containers.ExtractMetadata(gr)
 	for k := range metadata {
 		if cm[k] != metadata[strings.Title(k)] {
 			t.Errorf("Expected custom metadata with key: %s", k)
-			return
 		}
 	}
 }
diff --git a/acceptance/openstack/storage/v1/objects_test.go b/acceptance/openstack/storage/v1/objects_test.go
index 066a223..239b4d5 100644
--- a/acceptance/openstack/storage/v1/objects_test.go
+++ b/acceptance/openstack/storage/v1/objects_test.go
@@ -33,18 +33,14 @@
 
 	// Create a container to hold the test objects.
 	cName := tools.RandomString("test-container-", 8)
-	_, err = containers.Create(client, containers.CreateOpts{
-		Name: cName,
-	})
+	_, err = containers.Create(client, cName, containers.CreateOpts{})
 	if err != nil {
 		t.Error(err)
 		return
 	}
 	// Defer deletion of the container until after testing.
 	defer func() {
-		err = containers.Delete(client, containers.DeleteOpts{
-			Name: cName,
-		})
+		err = containers.Delete(client, cName)
 		if err != nil {
 			t.Error(err)
 			return
@@ -55,11 +51,7 @@
 	oContents := make([]*bytes.Buffer, numObjects)
 	for i := 0; i < numObjects; i++ {
 		oContents[i] = bytes.NewBuffer([]byte(tools.RandomString("", 10)))
-		err = objects.Create(client, objects.CreateOpts{
-			Container: cName,
-			Name:      oNames[i],
-			Content:   oContents[i],
-		})
+		err = objects.Create(client, cName, oNames[i], oContents[i], objects.CreateOpts{})
 		if err != nil {
 			t.Error(err)
 			return
@@ -68,14 +60,11 @@
 	// Delete the objects after testing.
 	defer func() {
 		for i := 0; i < numObjects; i++ {
-			err = objects.Delete(client, objects.DeleteOpts{
-				Container: cName,
-				Name:      oNames[i],
-			})
+			err = objects.Delete(client, cName, oNames[i], objects.DeleteOpts{})
 		}
 	}()
 
-	pager := objects.List(client, objects.ListOpts{Full: false, Container: cName})
+	pager := objects.List(client, cName, objects.ListOpts{Full: false})
 	ons := make([]string, 0, len(oNames))
 	err = pager.EachPage(func(page pagination.Page) (bool, error) {
 		names, err := objects.ExtractNames(page)
@@ -95,7 +84,7 @@
 		return
 	}
 
-	pager = objects.List(client, objects.ListOpts{Full: true, Container: cName})
+	pager = objects.List(client, cName, objects.ListOpts{Full: true})
 	ois := make([]objects.Object, 0, len(oNames))
 	err = pager.EachPage(func(page pagination.Page) (bool, error) {
 		info, err := objects.ExtractInfo(page)
@@ -117,42 +106,20 @@
 	}
 
 	// Copy the contents of one object to another.
-	err = objects.Copy(client, objects.CopyOpts{
-		Container:    cName,
-		Name:         oNames[0],
-		NewContainer: cName,
-		NewName:      oNames[1],
-	})
+	err = objects.Copy(client, cName, oNames[0], objects.CopyOpts{Destination: cName + "/" + oNames[1]})
 	if err != nil {
 		t.Error(err)
 		return
 	}
 
 	// Download one of the objects that was created above.
-	dr, err := objects.Download(client, objects.DownloadOpts{
-		Container: cName,
-		Name:      oNames[1],
-	})
+	o1Content, err := objects.Download(client, cName, oNames[0], objects.DownloadOpts{}).ExtractContent()
 	if err != nil {
 		t.Error(err)
 		return
 	}
-	// Extract the content from the 'Download' response of object.
-	o2Content, err := objects.ExtractContent(dr)
-	if err != nil {
-		t.Error(err)
-	}
 	// Download the another object that was create above.
-	dr, err = objects.Download(client, objects.DownloadOpts{
-		Container: cName,
-		Name:      oNames[0],
-	})
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	// Extract the content from the 'Download' response of other object.
-	o1Content, err := objects.ExtractContent(dr)
+	o2Content, err := objects.Download(client, cName, oNames[1], objects.DownloadOpts{}).ExtractContent()
 	if err != nil {
 		t.Error(err)
 		return
@@ -164,11 +131,7 @@
 	}
 
 	// Update an object's metadata.
-	err = objects.Update(client, objects.UpdateOpts{
-		Container: cName,
-		Name:      oNames[0],
-		Metadata:  metadata,
-	})
+	err = objects.Update(client, cName, oNames[0], objects.UpdateOpts{Metadata: metadata})
 	if err != nil {
 		t.Error(err)
 		return
@@ -179,11 +142,7 @@
 		for k := range metadata {
 			tempMap[k] = ""
 		}
-		err = objects.Update(client, objects.UpdateOpts{
-			Container: cName,
-			Name:      oNames[0],
-			Metadata:  tempMap,
-		})
+		err = objects.Update(client, cName, oNames[0], objects.UpdateOpts{Metadata: tempMap})
 		if err != nil {
 			t.Error(err)
 			return
@@ -191,13 +150,11 @@
 	}()
 
 	// Retrieve an object's metadata.
-	gr, err := objects.Get(client, objects.GetOpts{})
+	om, err := objects.Get(client, cName, oNames[0], objects.GetOpts{}).ExtractMetadata()
 	if err != nil {
 		t.Error(err)
 		return
 	}
-	// Extract the custom metadata from the 'Get' response.
-	om := objects.ExtractMetadata(gr)
 	for k := range metadata {
 		if om[k] != metadata[strings.Title(k)] {
 			t.Errorf("Expected custom metadata with key: %s", k)
