diff --git a/acceptance/openstack/blockStorage/v1/blockstorage_test.go.bak b/acceptance/openstack/blockStorage/v1/blockstorage_test.go.bak
new file mode 100644
index 0000000..aaabac1
--- /dev/null
+++ b/acceptance/openstack/blockStorage/v1/blockstorage_test.go.bak
@@ -0,0 +1,213 @@
+// +build acceptance
+
+package openstack
+
+import (
+	"fmt"
+	blockstorage "github.com/rackspace/gophercloud/openstack/blockstorage/v1"
+	"github.com/rackspace/gophercloud/openstack/blockstorage/v1/snapshots"
+	"github.com/rackspace/gophercloud/openstack/blockstorage/v1/volumes"
+	identity "github.com/rackspace/gophercloud/openstack/identity/v2"
+	"github.com/rackspace/gophercloud/openstack/utils"
+	"os"
+	"strconv"
+	"testing"
+	"time"
+)
+
+var numVols = 2
+
+func getClient() (*blockstorage.Client, error) {
+	ao, err := utils.AuthOptions()
+	if err != nil {
+		return nil, err
+	}
+
+	r, err := identity.Authenticate(ao)
+	if err != nil {
+		return nil, err
+	}
+
+	sc, err := identity.GetServiceCatalog(r)
+	if err != nil {
+		return nil, err
+	}
+
+	ces, err := sc.CatalogEntries()
+	if err != nil {
+		return nil, err
+	}
+
+	var eps []identity.Endpoint
+	for _, ce := range ces {
+		if ce.Type == "volume" {
+			eps = ce.Endpoints
+		}
+	}
+
+	region := os.Getenv("OS_REGION_NAME")
+	rep := ""
+	for _, ep := range eps {
+		if ep.Region == region {
+			rep = ep.PublicURL
+		}
+	}
+
+	client := blockstorage.NewClient(rep, r, ao)
+
+	return client, nil
+
+}
+
+func TestVolumes(t *testing.T) {
+	client, err := getClient()
+	if err != nil {
+		t.Error(err)
+		return
+	}
+
+	var cv volumes.Volume
+	for i := 0; i < numVols; i++ {
+		cv, err := volumes.Create(client, volumes.CreateOpts{
+			"size":         1,
+			"display_name": "test-volume" + strconv.Itoa(i),
+		})
+		if err != nil {
+			t.Error(err)
+			return
+		}
+		defer func() {
+			time.Sleep(10000 * time.Millisecond)
+			err = volumes.Delete(client, volumes.DeleteOpts{
+				"id": cv.Id,
+			})
+			if err != nil {
+				t.Error(err)
+				return
+			}
+		}()
+	}
+
+	vols, err := volumes.List(client, volumes.ListOpts{
+		"full": true,
+	})
+	if err != nil {
+		t.Error(err)
+		return
+	}
+	if len(vols) != numVols {
+		t.Errorf("Expected %d volumes, got %d", numVols, len(vols))
+		return
+	}
+
+	vols, err = volumes.List(client, volumes.ListOpts{
+		"full": false,
+	})
+	if err != nil {
+		t.Error(err)
+		return
+	}
+	if len(vols) != numVols {
+		t.Errorf("Expected %d volumes, got %d", numVols, len(vols))
+		return
+	}
+
+	_, err = volumes.Get(client, volumes.GetOpts{
+		"id": cv.Id,
+	})
+	if err != nil {
+		t.Error(err)
+		return
+	}
+
+}
+
+func TestSnapshots(t *testing.T) {
+	client, err := getClient()
+	if err != nil {
+		t.Error(err)
+		return
+	}
+
+	var css snapshots.Snapshot
+
+	cv, err := volumes.Create(client, volumes.CreateOpts{
+		"size":         1,
+		"display_name": "test-volume",
+	})
+	if err != nil {
+		t.Error(err)
+		return
+	}
+	defer func() {
+		for i := 0; i < 60; i++ {
+			gss, _ := snapshots.Get(client, snapshots.GetOpts{
+				"id": css.Id,
+			})
+			if gss.Status == "" {
+				err = volumes.Delete(client, volumes.DeleteOpts{
+					"id": cv.Id,
+				})
+				if err != nil {
+					t.Error(err)
+					return
+				}
+				break
+			}
+			time.Sleep(5000 * time.Millisecond)
+		}
+	}()
+
+	for i := 0; i < 60; i++ {
+		gv, err := volumes.Get(client, volumes.GetOpts{
+			"id": cv.Id,
+		})
+		if err != nil {
+			t.Error(err)
+			return
+		}
+		if gv.Status == "available" {
+			break
+		}
+		time.Sleep(2000 * time.Millisecond)
+	}
+
+	css, err = snapshots.Create(client, snapshots.CreateOpts{
+		"volume_id":    cv.Id,
+		"display_name": "test-snapshot",
+	})
+	if err != nil {
+		t.Error(err)
+		return
+	}
+	defer func() {
+		for i := 0; i < 60; i++ {
+			gss, err := snapshots.Get(client, snapshots.GetOpts{
+				"id": css.Id,
+			})
+			if err != nil {
+				t.Error(err)
+				return
+			}
+			if gss.Status == "available" {
+				err = snapshots.Delete(client, snapshots.DeleteOpts{
+					"id": css.Id,
+				})
+				if err != nil {
+					t.Error(err)
+					return
+				}
+				break
+			}
+			time.Sleep(2000 * time.Millisecond)
+		}
+	}()
+
+	lss, err := snapshots.List(client, snapshots.ListOpts{
+		Full: true,
+	})
+	if err != nil {
+		t.Error(err)
+		return
+	}
+}
diff --git a/acceptance/openstack/blockStorage/v1/snapshots_test.go b/acceptance/openstack/blockStorage/v1/snapshots_test.go
new file mode 100644
index 0000000..0d9d5c7
--- /dev/null
+++ b/acceptance/openstack/blockStorage/v1/snapshots_test.go
@@ -0,0 +1,67 @@
+// +build acceptance
+
+package v1
+
+import (
+	"fmt"
+	"os"
+	"testing"
+	"time"
+
+	"github.com/rackspace/gophercloud"
+	"github.com/rackspace/gophercloud/openstack/blockStorage/v1/snapshots"
+)
+
+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{
+		Name:     "gophercloud-test-snapshot",
+		VolumeID: volumeID,
+	})
+	if err != nil {
+		t.Errorf("Failed to create snapshot: %v\n", err)
+	}
+
+	err = waitForSnapshot(client, css.ID)
+	if err != nil {
+		t.Errorf("Failed to create snapshot: %v\n", err)
+	}
+
+	err = waitForSnapshot(client, css.ID)
+
+	t.Logf("Created snapshots: %+v\n", *css)
+
+}
diff --git a/acceptance/openstack/blockStorage/v1/volumeTypes_test.go b/acceptance/openstack/blockStorage/v1/volumeTypes_test.go
new file mode 100644
index 0000000..ad6526a
--- /dev/null
+++ b/acceptance/openstack/blockStorage/v1/volumeTypes_test.go
@@ -0,0 +1,72 @@
+// +build acceptance
+
+package v1
+
+import (
+	"strconv"
+	"testing"
+	"time"
+
+	"github.com/rackspace/gophercloud/openstack/blockStorage/v1/volumeTypes"
+	"github.com/rackspace/gophercloud/pagination"
+)
+
+var numVolTypes = 1
+
+func TestVolumeTypes(t *testing.T) {
+	client, err := newClient()
+	if err != nil {
+		t.Fatalf("Failed to create Block Storage v1 client: %v", err)
+	}
+
+	var cvt *volumeTypes.VolumeType
+	for i := 0; i < numVolTypes; i++ {
+		cvt, err = volumeTypes.Create(client, volumeTypes.CreateOpts{
+			ExtraSpecs: map[string]interface{}{
+				"capabilities": "gpu",
+				"priority":     3,
+			},
+			Name: "gophercloud-test-volumeType-" + strconv.Itoa(i),
+		})
+		if err != nil {
+			t.Error(err)
+			return
+		}
+		defer func() {
+			time.Sleep(10000 * time.Millisecond)
+			err = volumeTypes.Delete(client, cvt.ID)
+			if err != nil {
+				t.Error(err)
+				return
+			}
+		}()
+		t.Logf("Created volume type: %+v\n", cvt)
+	}
+
+	gr, err := volumeTypes.Get(client, cvt.ID)
+	if err != nil {
+		t.Error(err)
+		return
+	}
+	v, err := volumeTypes.ExtractVolumeType(gr)
+	if err != nil {
+		t.Error(err)
+		return
+	}
+	t.Logf("Got volume type: %+v\n", v)
+
+	pager := volumeTypes.List(client, volumeTypes.ListOpts{})
+	if err != nil {
+		t.Error(err)
+		return
+	}
+	err = pager.EachPage(func(page pagination.Page) (bool, error) {
+		volTypes, err := volumeTypes.ExtractVolumeTypes(page)
+		if len(volTypes) != numVolTypes {
+			t.Errorf("Expected %d volume types, got %d", numVolTypes, len(volTypes))
+		}
+		t.Logf("Listing volume types: %+v\n", volTypes)
+		return true, err
+	})
+
+}
diff --git a/acceptance/openstack/blockStorage/v1/volumes_test.go b/acceptance/openstack/blockStorage/v1/volumes_test.go
new file mode 100644
index 0000000..22d9653
--- /dev/null
+++ b/acceptance/openstack/blockStorage/v1/volumes_test.go
@@ -0,0 +1,95 @@
+// +build acceptance blockstorage
+
+package v1
+
+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/utils"
+	"github.com/rackspace/gophercloud/pagination"
+)
+
+var numVols = 1
+
+func newClient() (*gophercloud.ServiceClient, error) {
+	ao, err := utils.AuthOptions()
+	if err != nil {
+		return nil, err
+	}
+
+	client, err := openstack.AuthenticatedClient(ao)
+	if err != nil {
+		return nil, err
+	}
+
+	return openstack.NewBlockStorageV1(client, gophercloud.EndpointOpts{
+		Region: os.Getenv("OS_REGION_NAME"),
+	})
+}
+
+func TestVolumes(t *testing.T) {
+	client, err := newClient()
+	if err != nil {
+		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),
+		})
+		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{
+		Name: "gophercloud-updated-volume",
+	})
+	if err != nil {
+		t.Error(err)
+		return
+	}
+
+	v, err := volumes.Get(client, cv.ID).ExtractVolume()
+	if err != nil {
+		t.Error(err)
+		return
+	}
+	fmt.Printf("Got volume: %+v\n", v)
+
+	if v.Name != "gophercloud-updated-volume" {
+		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) {
+		vols, err := volumes.ExtractVolumes(page)
+		if len(vols) != numVols {
+			t.Errorf("Expected %d volumes, got %d", numVols, len(vols))
+		}
+		return true, err
+	})
+}
