diff --git a/acceptance/openstack/blockstorage/v1/snapshots_test.go b/acceptance/openstack/blockstorage/v1/snapshots_test.go
index 0d9d5c7..5835048 100644
--- a/acceptance/openstack/blockstorage/v1/snapshots_test.go
+++ b/acceptance/openstack/blockstorage/v1/snapshots_test.go
@@ -3,65 +3,85 @@
 package v1
 
 import (
-	"fmt"
-	"os"
 	"testing"
-	"time"
 
 	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/openstack/blockStorage/v1/snapshots"
+	"github.com/rackspace/gophercloud/openstack/blockstorage/v1/snapshots"
+	"github.com/rackspace/gophercloud/openstack/blockstorage/v1/volumes"
 )
 
-func waitForSnapshot(client *gophercloud.ServiceClient, id string) error {
-	for secondsSlept := 0; secondsSlept < 240; secondsSlept++ {
-		fmt.Printf("Seconds slept waiting for snapshot: %d\n", secondsSlept)
-		gss, err := snapshots.Get(client, id).ExtractSnapshot()
-		if err != nil {
-			return err
-		}
-		if gss.Status == "available" {
-			return nil
-		}
-		if gss.Status == "error" {
-			return fmt.Errorf("Error waiting for snapshot to create. Snapshot status is 'error'.")
-		}
-		time.Sleep(1 * time.Second)
-	}
-	gss, err := snapshots.Get(client, id).ExtractSnapshot()
-	if err != nil {
-		return err
-	}
-	return fmt.Errorf("Time out waiting for snapshot to become available: %+v", gss)
-}
-
 func TestSnapshots(t *testing.T) {
 
-	volumeID := os.Getenv("OS_VOLUME_ID")
-	if volumeID == "" {
-		t.Errorf("Expect OS_VOLUME_ID environment variable. Skipping create and delete snapshot functions.")
-		return
-	}
-
 	client, err := newClient()
 	if err != nil {
 		t.Fatalf("Failed to create Block Storage v1 client: %v", err)
 	}
 
-	css, err := snapshots.Create(client, snapshots.CreateOpts{
+	v, err := volumes.Create(client, &volumes.CreateOpts{
+		Name: "gophercloud-test-volume",
+		Size: 1,
+	}).Extract()
+	if err != nil {
+		t.Fatalf("Failed to create volume: %v\n", err)
+	}
+
+	err = volumes.WaitForStatus(client, v.ID, "available", 120)
+	if err != nil {
+		t.Fatalf("Failed to create volume: %v\n", err)
+	}
+
+	t.Logf("Created volume: %v\n", v)
+
+	ss, err := snapshots.Create(client, &snapshots.CreateOpts{
 		Name:     "gophercloud-test-snapshot",
-		VolumeID: volumeID,
+		VolumeID: v.ID,
+	}).Extract()
+	if err != nil {
+		t.Fatalf("Failed to create snapshot: %v\n", err)
+	}
+
+	err = snapshots.WaitForStatus(client, ss.ID, "available", 120)
+	if err != nil {
+		t.Fatalf("Failed to create snapshot: %v\n", err)
+	}
+
+	t.Logf("Created snapshot: %+v\n", ss)
+
+	err = snapshots.Delete(client, ss.ID)
+	if err != nil {
+		t.Fatalf("Failed to delete snapshot: %v", err)
+	}
+
+	err = gophercloud.WaitFor(120, func() (bool, error) {
+		_, err := snapshots.Get(client, ss.ID).Extract()
+		if err != nil {
+			return true, nil
+		}
+
+		return false, nil
 	})
 	if err != nil {
-		t.Errorf("Failed to create snapshot: %v\n", err)
+		t.Fatalf("Failed to delete snapshot: %v", err)
 	}
 
-	err = waitForSnapshot(client, css.ID)
+	t.Log("Deleted snapshot\n")
+
+	err = volumes.Delete(client, v.ID)
 	if err != nil {
-		t.Errorf("Failed to create snapshot: %v\n", err)
+		t.Errorf("Failed to delete volume: %v", err)
 	}
 
-	err = waitForSnapshot(client, css.ID)
+	err = gophercloud.WaitFor(120, func() (bool, error) {
+		_, err := volumes.Get(client, v.ID).Extract()
+		if err != nil {
+			return true, nil
+		}
 
-	t.Logf("Created snapshots: %+v\n", *css)
+		return false, nil
+	})
+	if err != nil {
+		t.Errorf("Failed to delete volume: %v", err)
+	}
 
+	t.Log("Deleted volume\n")
 }
diff --git a/acceptance/openstack/blockstorage/v1/volumes_test.go b/acceptance/openstack/blockstorage/v1/volumes_test.go
index 22d9653..21a47ac 100644
--- a/acceptance/openstack/blockstorage/v1/volumes_test.go
+++ b/acceptance/openstack/blockstorage/v1/volumes_test.go
@@ -5,19 +5,15 @@
 import (
 	"fmt"
 	"os"
-	"strconv"
 	"testing"
-	"time"
 
 	"github.com/rackspace/gophercloud"
 	"github.com/rackspace/gophercloud/openstack"
-	"github.com/rackspace/gophercloud/openstack/blockStorage/v1/volumes"
+	"github.com/rackspace/gophercloud/openstack/blockstorage/v1/volumes"
 	"github.com/rackspace/gophercloud/openstack/utils"
 	"github.com/rackspace/gophercloud/pagination"
 )
 
-var numVols = 1
-
 func newClient() (*gophercloud.ServiceClient, error) {
 	ao, err := utils.AuthOptions()
 	if err != nil {
@@ -40,36 +36,35 @@
 		t.Fatalf("Failed to create Block Storage v1 client: %v", err)
 	}
 
-	var cv *volumes.Volume
-	for i := 0; i < numVols; i++ {
-		cv, err = volumes.Create(client, volumes.CreateOpts{
-			Size: 1,
-			Name: "gophercloud-test-volume-" + strconv.Itoa(i),
-		})
+	cv, err := volumes.Create(client, &volumes.CreateOpts{
+		Size: 1,
+		Name: "gophercloud-test-volume",
+	}).Extract()
+	if err != nil {
+		t.Error(err)
+		return
+	}
+	defer func() {
+		err = volumes.WaitForStatus(client, cv.ID, "available", 60)
+		if err != nil {
+			t.Error(err)
+		}
+		err = volumes.Delete(client, cv.ID)
 		if err != nil {
 			t.Error(err)
 			return
 		}
-		defer func() {
-			time.Sleep(10000 * time.Millisecond)
-			err = volumes.Delete(client, cv.ID)
-			if err != nil {
-				t.Error(err)
-				return
-			}
-		}()
+	}()
 
-	}
-
-	_, err = volumes.Update(client, cv.ID, volumes.UpdateOpts{
+	_, err = volumes.Update(client, cv.ID, &volumes.UpdateOpts{
 		Name: "gophercloud-updated-volume",
-	})
+	}).Extract()
 	if err != nil {
 		t.Error(err)
 		return
 	}
 
-	v, err := volumes.Get(client, cv.ID).ExtractVolume()
+	v, err := volumes.Get(client, cv.ID).Extract()
 	if err != nil {
 		t.Error(err)
 		return
@@ -80,16 +75,14 @@
 		t.Errorf("Unable to update volume: Expected name: gophercloud-updated-volume\nActual name: %s", v.Name)
 	}
 
-	pager := volumes.List(client, volumes.ListOpts{})
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	err = pager.EachPage(func(page pagination.Page) (bool, error) {
+	err = volumes.List(client, &volumes.ListOpts{Name: "gophercloud-updated-volume"}).EachPage(func(page pagination.Page) (bool, error) {
 		vols, err := volumes.ExtractVolumes(page)
-		if len(vols) != numVols {
-			t.Errorf("Expected %d volumes, got %d", numVols, len(vols))
+		if len(vols) != 1 {
+			t.Errorf("Expected 1 volume, got %d", len(vols))
 		}
 		return true, err
 	})
+	if err != nil {
+		t.Errorf("Error listing volumes: %v", err)
+	}
 }
diff --git a/acceptance/openstack/blockstorage/v1/volumetypes_test.go b/acceptance/openstack/blockstorage/v1/volumetypes_test.go
index be0d2d8..416e341 100644
--- a/acceptance/openstack/blockstorage/v1/volumetypes_test.go
+++ b/acceptance/openstack/blockstorage/v1/volumetypes_test.go
@@ -16,20 +16,20 @@
 		t.Fatalf("Failed to create Block Storage v1 client: %v", err)
 	}
 
-	vt, err := volumeTypes.Create(client, volumeTypes.CreateOpts{
+	vt, err := volumetypes.Create(client, &volumetypes.CreateOpts{
 		ExtraSpecs: map[string]interface{}{
 			"capabilities": "gpu",
 			"priority":     3,
 		},
 		Name: "gophercloud-test-volumeType",
-	})
+	}).Extract()
 	if err != nil {
 		t.Error(err)
 		return
 	}
 	defer func() {
 		time.Sleep(10000 * time.Millisecond)
-		err = volumeTypes.Delete(client, vt.ID)
+		err = volumetypes.Delete(client, vt.ID)
 		if err != nil {
 			t.Error(err)
 			return
@@ -37,15 +37,15 @@
 	}()
 	t.Logf("Created volume type: %+v\n", vt)
 
-	vt, err = volumeTypes.Get(client, vt.ID).ExtractVolumeType()
+	vt, err = volumetypes.Get(client, vt.ID).Extract()
 	if err != nil {
 		t.Error(err)
 		return
 	}
 	t.Logf("Got volume type: %+v\n", vt)
 
-	err = volumeTypes.List(client, volumeTypes.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
-		volTypes, err := volumeTypes.ExtractVolumeTypes(page)
+	err = volumetypes.List(client).EachPage(func(page pagination.Page) (bool, error) {
+		volTypes, err := volumetypes.ExtractVolumeTypes(page)
 		if len(volTypes) != 1 {
 			t.Errorf("Expected 1 volume type, got %d", len(volTypes))
 		}
