diff --git a/acceptance/rackspace/blockstorage/v1/common.go b/acceptance/rackspace/blockstorage/v1/common.go
deleted file mode 100644
index 23727c4..0000000
--- a/acceptance/rackspace/blockstorage/v1/common.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// +build acceptance
-
-package v1
-
-import (
-	"os"
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/acceptance/tools"
-	"github.com/gophercloud/gophercloud/rackspace"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func newClient() (*gophercloud.ServiceClient, error) {
-	opts, err := rackspace.AuthOptionsFromEnv()
-	if err != nil {
-		return nil, err
-	}
-	opts = tools.OnlyRS(opts)
-	region := os.Getenv("RS_REGION")
-
-	provider, err := rackspace.AuthenticatedClient(opts)
-	if err != nil {
-		return nil, err
-	}
-
-	return rackspace.NewBlockStorageV1(provider, gophercloud.EndpointOpts{
-		Region: region,
-	})
-}
-
-func setup(t *testing.T) *gophercloud.ServiceClient {
-	client, err := newClient()
-	th.AssertNoErr(t, err)
-
-	return client
-}
diff --git a/acceptance/rackspace/blockstorage/v1/snapshot_test.go b/acceptance/rackspace/blockstorage/v1/snapshot_test.go
deleted file mode 100644
index 79bce86..0000000
--- a/acceptance/rackspace/blockstorage/v1/snapshot_test.go
+++ /dev/null
@@ -1,82 +0,0 @@
-// +build acceptance blockstorage snapshots
-
-package v1
-
-import (
-	"testing"
-	"time"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/blockstorage/v1/snapshots"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestSnapshots(t *testing.T) {
-	client := setup(t)
-	volID := testVolumeCreate(t, client)
-
-	t.Log("Creating snapshots")
-	s := testSnapshotCreate(t, client, volID)
-	id := s.ID
-
-	t.Log("Listing snapshots")
-	testSnapshotList(t, client)
-
-	t.Logf("Getting snapshot %s", id)
-	testSnapshotGet(t, client, id)
-
-	t.Logf("Updating snapshot %s", id)
-	testSnapshotUpdate(t, client, id)
-
-	t.Logf("Deleting snapshot %s", id)
-	testSnapshotDelete(t, client, id)
-	s.WaitUntilDeleted(client, -1)
-
-	t.Logf("Deleting volume %s", volID)
-	testVolumeDelete(t, client, volID)
-}
-
-func testSnapshotCreate(t *testing.T, client *gophercloud.ServiceClient, volID string) *snapshots.Snapshot {
-	opts := snapshots.CreateOpts{VolumeID: volID, Name: "snapshot-001"}
-	s, err := snapshots.Create(client, opts).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Created snapshot %s", s.ID)
-
-	t.Logf("Waiting for new snapshot to become available...")
-	start := time.Now().Second()
-	s.WaitUntilComplete(client, -1)
-	t.Logf("Snapshot completed after %ds", time.Now().Second()-start)
-
-	return s
-}
-
-func testSnapshotList(t *testing.T, client *gophercloud.ServiceClient) {
-	snapshots.List(client).EachPage(func(page pagination.Page) (bool, error) {
-		sList, err := snapshots.ExtractSnapshots(page)
-		th.AssertNoErr(t, err)
-
-		for _, s := range sList {
-			t.Logf("Snapshot: ID [%s] Name [%s] Volume ID [%s] Progress [%s] Created [%s]",
-				s.ID, s.Name, s.VolumeID, s.Progress, s.CreatedAt)
-		}
-
-		return true, nil
-	})
-}
-
-func testSnapshotGet(t *testing.T, client *gophercloud.ServiceClient, id string) {
-	_, err := snapshots.Get(client, id).Extract()
-	th.AssertNoErr(t, err)
-}
-
-func testSnapshotUpdate(t *testing.T, client *gophercloud.ServiceClient, id string) {
-	_, err := snapshots.Update(client, id, snapshots.UpdateOpts{Name: "new_name"}).Extract()
-	th.AssertNoErr(t, err)
-}
-
-func testSnapshotDelete(t *testing.T, client *gophercloud.ServiceClient, id string) {
-	res := snapshots.Delete(client, id)
-	th.AssertNoErr(t, res.Err)
-	t.Logf("Deleted snapshot %s", id)
-}
diff --git a/acceptance/rackspace/blockstorage/v1/volume_test.go b/acceptance/rackspace/blockstorage/v1/volume_test.go
deleted file mode 100644
index 78cf66e..0000000
--- a/acceptance/rackspace/blockstorage/v1/volume_test.go
+++ /dev/null
@@ -1,71 +0,0 @@
-// +build acceptance blockstorage volumes
-
-package v1
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	os "github.com/gophercloud/gophercloud/openstack/blockstorage/v1/volumes"
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/blockstorage/v1/volumes"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestVolumes(t *testing.T) {
-	client := setup(t)
-
-	t.Logf("Listing volumes")
-	testVolumeList(t, client)
-
-	t.Logf("Creating volume")
-	volumeID := testVolumeCreate(t, client)
-
-	t.Logf("Getting volume %s", volumeID)
-	testVolumeGet(t, client, volumeID)
-
-	t.Logf("Updating volume %s", volumeID)
-	testVolumeUpdate(t, client, volumeID)
-
-	t.Logf("Deleting volume %s", volumeID)
-	testVolumeDelete(t, client, volumeID)
-}
-
-func testVolumeList(t *testing.T, client *gophercloud.ServiceClient) {
-	volumes.List(client).EachPage(func(page pagination.Page) (bool, error) {
-		vList, err := volumes.ExtractVolumes(page)
-		th.AssertNoErr(t, err)
-
-		for _, v := range vList {
-			t.Logf("Volume: ID [%s] Name [%s] Type [%s] Created [%s]", v.ID, v.Name,
-				v.VolumeType, v.CreatedAt)
-		}
-
-		return true, nil
-	})
-}
-
-func testVolumeCreate(t *testing.T, client *gophercloud.ServiceClient) string {
-	vol, err := volumes.Create(client, os.CreateOpts{Size: 75}).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Created volume: ID [%s] Size [%s]", vol.ID, vol.Size)
-	return vol.ID
-}
-
-func testVolumeGet(t *testing.T, client *gophercloud.ServiceClient, id string) {
-	vol, err := volumes.Get(client, id).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Created volume: ID [%s] Size [%s]", vol.ID, vol.Size)
-}
-
-func testVolumeUpdate(t *testing.T, client *gophercloud.ServiceClient, id string) {
-	vol, err := volumes.Update(client, id, volumes.UpdateOpts{Name: "new_name"}).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Created volume: ID [%s] Name [%s]", vol.ID, vol.Name)
-}
-
-func testVolumeDelete(t *testing.T, client *gophercloud.ServiceClient, id string) {
-	res := volumes.Delete(client, id)
-	th.AssertNoErr(t, res.Err)
-	t.Logf("Deleted volume %s", id)
-}
diff --git a/acceptance/rackspace/blockstorage/v1/volume_type_test.go b/acceptance/rackspace/blockstorage/v1/volume_type_test.go
deleted file mode 100644
index c175e02..0000000
--- a/acceptance/rackspace/blockstorage/v1/volume_type_test.go
+++ /dev/null
@@ -1,46 +0,0 @@
-// +build acceptance blockstorage volumetypes
-
-package v1
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/blockstorage/v1/volumetypes"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestAll(t *testing.T) {
-	client := setup(t)
-
-	t.Logf("Listing volume types")
-	id := testList(t, client)
-
-	t.Logf("Getting volume type %s", id)
-	testGet(t, client, id)
-}
-
-func testList(t *testing.T, client *gophercloud.ServiceClient) string {
-	var lastID string
-
-	volumetypes.List(client).EachPage(func(page pagination.Page) (bool, error) {
-		typeList, err := volumetypes.ExtractVolumeTypes(page)
-		th.AssertNoErr(t, err)
-
-		for _, vt := range typeList {
-			t.Logf("Volume type: ID [%s] Name [%s]", vt.ID, vt.Name)
-			lastID = vt.ID
-		}
-
-		return true, nil
-	})
-
-	return lastID
-}
-
-func testGet(t *testing.T, client *gophercloud.ServiceClient, id string) {
-	vt, err := volumetypes.Get(client, id).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Volume: ID [%s] Name [%s]", vt.ID, vt.Name)
-}
diff --git a/acceptance/rackspace/cdn/v1/base_test.go b/acceptance/rackspace/cdn/v1/base_test.go
deleted file mode 100644
index 7b1ebe0..0000000
--- a/acceptance/rackspace/cdn/v1/base_test.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// +build acceptance
-
-package v1
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/rackspace/cdn/v1/base"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestBaseOps(t *testing.T) {
-	client := newClient(t)
-	t.Log("Retrieving Home Document")
-	testHomeDocumentGet(t, client)
-
-	t.Log("Pinging root URL")
-	testPing(t, client)
-}
-
-func testHomeDocumentGet(t *testing.T, client *gophercloud.ServiceClient) {
-	hd, err := base.Get(client).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Retrieved home document: %+v", *hd)
-}
-
-func testPing(t *testing.T, client *gophercloud.ServiceClient) {
-	err := base.Ping(client).ExtractErr()
-	th.AssertNoErr(t, err)
-	t.Logf("Successfully pinged root URL")
-}
diff --git a/acceptance/rackspace/cdn/v1/common.go b/acceptance/rackspace/cdn/v1/common.go
deleted file mode 100644
index 54d0107..0000000
--- a/acceptance/rackspace/cdn/v1/common.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// +build acceptance
-
-package v1
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/rackspace"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func newClient(t *testing.T) *gophercloud.ServiceClient {
-	ao, err := rackspace.AuthOptionsFromEnv()
-	th.AssertNoErr(t, err)
-
-	client, err := rackspace.AuthenticatedClient(ao)
-	th.AssertNoErr(t, err)
-
-	c, err := rackspace.NewCDNV1(client, gophercloud.EndpointOpts{})
-	th.AssertNoErr(t, err)
-	return c
-}
diff --git a/acceptance/rackspace/cdn/v1/flavor_test.go b/acceptance/rackspace/cdn/v1/flavor_test.go
deleted file mode 100644
index 3e3b19d..0000000
--- a/acceptance/rackspace/cdn/v1/flavor_test.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// +build acceptance
-
-package v1
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	os "github.com/gophercloud/gophercloud/openstack/cdn/v1/flavors"
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/cdn/v1/flavors"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestFlavor(t *testing.T) {
-	client := newClient(t)
-
-	t.Log("Listing Flavors")
-	id := testFlavorsList(t, client)
-
-	t.Log("Retrieving Flavor")
-	testFlavorGet(t, client, id)
-}
-
-func testFlavorsList(t *testing.T, client *gophercloud.ServiceClient) string {
-	var id string
-	err := flavors.List(client).EachPage(func(page pagination.Page) (bool, error) {
-		flavorList, err := os.ExtractFlavors(page)
-		th.AssertNoErr(t, err)
-
-		for _, flavor := range flavorList {
-			t.Logf("Listing flavor: ID [%s] Providers [%+v]", flavor.ID, flavor.Providers)
-			id = flavor.ID
-		}
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	return id
-}
-
-func testFlavorGet(t *testing.T, client *gophercloud.ServiceClient, id string) {
-	flavor, err := flavors.Get(client, id).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Retrieved Flavor: %+v", *flavor)
-}
diff --git a/acceptance/rackspace/cdn/v1/service_test.go b/acceptance/rackspace/cdn/v1/service_test.go
deleted file mode 100644
index 0cc888d..0000000
--- a/acceptance/rackspace/cdn/v1/service_test.go
+++ /dev/null
@@ -1,93 +0,0 @@
-// +build acceptance
-
-package v1
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	os "github.com/gophercloud/gophercloud/openstack/cdn/v1/services"
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/cdn/v1/services"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestService(t *testing.T) {
-	client := newClient(t)
-
-	t.Log("Creating Service")
-	loc := testServiceCreate(t, client, "test-site-1")
-	t.Logf("Created service at location: %s", loc)
-
-	defer testServiceDelete(t, client, loc)
-
-	t.Log("Updating Service")
-	testServiceUpdate(t, client, loc)
-
-	t.Log("Retrieving Service")
-	testServiceGet(t, client, loc)
-
-	t.Log("Listing Services")
-	testServiceList(t, client)
-}
-
-func testServiceCreate(t *testing.T, client *gophercloud.ServiceClient, name string) string {
-	createOpts := os.CreateOpts{
-		Name: name,
-		Domains: []os.Domain{
-			os.Domain{
-				Domain: "www." + name + ".com",
-			},
-		},
-		Origins: []os.Origin{
-			os.Origin{
-				Origin: name + ".com",
-				Port:   80,
-				SSL:    false,
-			},
-		},
-		FlavorID: "cdn",
-	}
-	l, err := services.Create(client, createOpts).Extract()
-	th.AssertNoErr(t, err)
-	return l
-}
-
-func testServiceGet(t *testing.T, client *gophercloud.ServiceClient, id string) {
-	s, err := services.Get(client, id).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Retrieved service: %+v", *s)
-}
-
-func testServiceUpdate(t *testing.T, client *gophercloud.ServiceClient, id string) {
-	opts := os.UpdateOpts{
-		os.Append{
-			Value: os.Domain{Domain: "newDomain.com", Protocol: "http"},
-		},
-	}
-
-	loc, err := services.Update(client, id, opts).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Successfully updated service at location: %s", loc)
-}
-
-func testServiceList(t *testing.T, client *gophercloud.ServiceClient) {
-	err := services.List(client, nil).EachPage(func(page pagination.Page) (bool, error) {
-		serviceList, err := os.ExtractServices(page)
-		th.AssertNoErr(t, err)
-
-		for _, service := range serviceList {
-			t.Logf("Listing service: %+v", service)
-		}
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-}
-
-func testServiceDelete(t *testing.T, client *gophercloud.ServiceClient, id string) {
-	err := services.Delete(client, id).ExtractErr()
-	th.AssertNoErr(t, err)
-	t.Logf("Successfully deleted service (%s)", id)
-}
diff --git a/acceptance/rackspace/cdn/v1/serviceasset_test.go b/acceptance/rackspace/cdn/v1/serviceasset_test.go
deleted file mode 100644
index 854d2fd..0000000
--- a/acceptance/rackspace/cdn/v1/serviceasset_test.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// +build acceptance
-
-package v1
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	osServiceAssets "github.com/gophercloud/gophercloud/openstack/cdn/v1/serviceassets"
-	"github.com/gophercloud/gophercloud/rackspace/cdn/v1/serviceassets"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestServiceAsset(t *testing.T) {
-	client := newClient(t)
-
-	t.Log("Creating Service")
-	loc := testServiceCreate(t, client, "test-site-2")
-	t.Logf("Created service at location: %s", loc)
-
-	t.Log("Deleting Service Assets")
-	testServiceAssetDelete(t, client, loc)
-}
-
-func testServiceAssetDelete(t *testing.T, client *gophercloud.ServiceClient, url string) {
-	deleteOpts := osServiceAssets.DeleteOpts{
-		All: true,
-	}
-	err := serviceassets.Delete(client, url, deleteOpts).ExtractErr()
-	th.AssertNoErr(t, err)
-	t.Log("Successfully deleted all Service Assets")
-}
diff --git a/acceptance/rackspace/client_test.go b/acceptance/rackspace/client_test.go
deleted file mode 100644
index 27d50a8..0000000
--- a/acceptance/rackspace/client_test.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// +build acceptance
-
-package rackspace
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud/acceptance/tools"
-	"github.com/gophercloud/gophercloud/rackspace"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestAuthenticatedClient(t *testing.T) {
-	// Obtain credentials from the environment.
-	ao, err := rackspace.AuthOptionsFromEnv()
-	th.AssertNoErr(t, err)
-
-	client, err := rackspace.AuthenticatedClient(tools.OnlyRS(ao))
-	if err != nil {
-		t.Fatalf("Unable to authenticate: %v", err)
-	}
-
-	if client.TokenID == "" {
-		t.Errorf("No token ID assigned to the client")
-	}
-
-	t.Logf("Client successfully acquired a token: %v", client.TokenID)
-}
diff --git a/acceptance/rackspace/compute/v2/bootfromvolume_test.go b/acceptance/rackspace/compute/v2/bootfromvolume_test.go
deleted file mode 100644
index 2c89a00..0000000
--- a/acceptance/rackspace/compute/v2/bootfromvolume_test.go
+++ /dev/null
@@ -1,49 +0,0 @@
-// +build acceptance
-
-package v2
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud/acceptance/tools"
-	osBFV "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/bootfromvolume"
-	"github.com/gophercloud/gophercloud/rackspace/compute/v2/bootfromvolume"
-	"github.com/gophercloud/gophercloud/rackspace/compute/v2/servers"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestBootFromVolume(t *testing.T) {
-	client, err := newClient()
-	th.AssertNoErr(t, err)
-
-	if testing.Short() {
-		t.Skip("Skipping test that requires server creation in short mode.")
-	}
-
-	options, err := optionsFromEnv()
-	th.AssertNoErr(t, err)
-
-	name := tools.RandomString("Gophercloud-", 8)
-	t.Logf("Creating server [%s].", name)
-
-	bd := []osBFV.BlockDevice{
-		osBFV.BlockDevice{
-			UUID:       options.imageID,
-			SourceType: osBFV.Image,
-			VolumeSize: 10,
-		},
-	}
-
-	server, err := bootfromvolume.Create(client, servers.CreateOpts{
-		Name:        name,
-		FlavorRef:   "performance1-1",
-		BlockDevice: bd,
-	}).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Created server: %+v\n", server)
-	defer deleteServer(t, client, server)
-
-	getServer(t, client, server)
-
-	listServers(t, client)
-}
diff --git a/acceptance/rackspace/compute/v2/compute_test.go b/acceptance/rackspace/compute/v2/compute_test.go
deleted file mode 100644
index 5e50676..0000000
--- a/acceptance/rackspace/compute/v2/compute_test.go
+++ /dev/null
@@ -1,60 +0,0 @@
-// +build acceptance
-
-package v2
-
-import (
-	"errors"
-	"os"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/acceptance/tools"
-	"github.com/gophercloud/gophercloud/rackspace"
-)
-
-func newClient() (*gophercloud.ServiceClient, error) {
-	// Obtain credentials from the environment.
-	options, err := rackspace.AuthOptionsFromEnv()
-	if err != nil {
-		return nil, err
-	}
-	options = tools.OnlyRS(options)
-	region := os.Getenv("RS_REGION")
-
-	if options.Username == "" {
-		return nil, errors.New("Please provide a Rackspace username as RS_USERNAME.")
-	}
-	if options.APIKey == "" {
-		return nil, errors.New("Please provide a Rackspace API key as RS_API_KEY.")
-	}
-	if region == "" {
-		return nil, errors.New("Please provide a Rackspace region as RS_REGION.")
-	}
-
-	client, err := rackspace.AuthenticatedClient(options)
-	if err != nil {
-		return nil, err
-	}
-
-	return rackspace.NewComputeV2(client, gophercloud.EndpointOpts{
-		Region: region,
-	})
-}
-
-type serverOpts struct {
-	imageID  string
-	flavorID string
-}
-
-func optionsFromEnv() (*serverOpts, error) {
-	options := &serverOpts{
-		imageID:  os.Getenv("RS_IMAGE_ID"),
-		flavorID: os.Getenv("RS_FLAVOR_ID"),
-	}
-	if options.imageID == "" {
-		return nil, errors.New("Please provide a valid Rackspace image ID as RS_IMAGE_ID")
-	}
-	if options.flavorID == "" {
-		return nil, errors.New("Please provide a valid Rackspace flavor ID as RS_FLAVOR_ID")
-	}
-	return options, nil
-}
diff --git a/acceptance/rackspace/compute/v2/flavors_test.go b/acceptance/rackspace/compute/v2/flavors_test.go
deleted file mode 100644
index c29983d..0000000
--- a/acceptance/rackspace/compute/v2/flavors_test.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// +build acceptance
-
-package v2
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/compute/v2/flavors"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestListFlavors(t *testing.T) {
-	client, err := newClient()
-	th.AssertNoErr(t, err)
-
-	count := 0
-	err = flavors.ListDetail(client, nil).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		t.Logf("-- Page %0d --", count)
-
-		fs, err := flavors.ExtractFlavors(page)
-		th.AssertNoErr(t, err)
-
-		for i, flavor := range fs {
-			t.Logf("[%02d]      id=[%s]", i, flavor.ID)
-			t.Logf("        name=[%s]", flavor.Name)
-			t.Logf("        disk=[%d]", flavor.Disk)
-			t.Logf("         RAM=[%d]", flavor.RAM)
-			t.Logf(" rxtx_factor=[%f]", flavor.RxTxFactor)
-			t.Logf("        swap=[%d]", flavor.Swap)
-			t.Logf("       VCPUs=[%d]", flavor.VCPUs)
-		}
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	if count == 0 {
-		t.Errorf("No flavors listed!")
-	}
-}
-
-func TestGetFlavor(t *testing.T) {
-	client, err := newClient()
-	th.AssertNoErr(t, err)
-
-	options, err := optionsFromEnv()
-	th.AssertNoErr(t, err)
-
-	flavor, err := flavors.Get(client, options.flavorID).Extract()
-	th.AssertNoErr(t, err)
-
-	t.Logf("Requested flavor:")
-	t.Logf("          id=[%s]", flavor.ID)
-	t.Logf("        name=[%s]", flavor.Name)
-	t.Logf("        disk=[%d]", flavor.Disk)
-	t.Logf("         RAM=[%d]", flavor.RAM)
-	t.Logf(" rxtx_factor=[%f]", flavor.RxTxFactor)
-	t.Logf("        swap=[%d]", flavor.Swap)
-	t.Logf("       VCPUs=[%d]", flavor.VCPUs)
-}
diff --git a/acceptance/rackspace/compute/v2/images_test.go b/acceptance/rackspace/compute/v2/images_test.go
deleted file mode 100644
index 058b1ff..0000000
--- a/acceptance/rackspace/compute/v2/images_test.go
+++ /dev/null
@@ -1,63 +0,0 @@
-// +build acceptance
-
-package v2
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/compute/v2/images"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestListImages(t *testing.T) {
-	client, err := newClient()
-	th.AssertNoErr(t, err)
-
-	count := 0
-	err = images.ListDetail(client, nil).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		t.Logf("-- Page %02d --", count)
-
-		is, err := images.ExtractImages(page)
-		th.AssertNoErr(t, err)
-
-		for i, image := range is {
-			t.Logf("[%02d]   id=[%s]", i, image.ID)
-			t.Logf("     name=[%s]", image.Name)
-			t.Logf("  created=[%s]", image.Created)
-			t.Logf("  updated=[%s]", image.Updated)
-			t.Logf(" min disk=[%d]", image.MinDisk)
-			t.Logf("  min RAM=[%d]", image.MinRAM)
-			t.Logf(" progress=[%d]", image.Progress)
-			t.Logf("   status=[%s]", image.Status)
-		}
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	if count < 1 {
-		t.Errorf("Expected at least one page of images.")
-	}
-}
-
-func TestGetImage(t *testing.T) {
-	client, err := newClient()
-	th.AssertNoErr(t, err)
-
-	options, err := optionsFromEnv()
-	th.AssertNoErr(t, err)
-
-	image, err := images.Get(client, options.imageID).Extract()
-	th.AssertNoErr(t, err)
-
-	t.Logf("Requested image:")
-	t.Logf("       id=[%s]", image.ID)
-	t.Logf("     name=[%s]", image.Name)
-	t.Logf("  created=[%s]", image.Created)
-	t.Logf("  updated=[%s]", image.Updated)
-	t.Logf(" min disk=[%d]", image.MinDisk)
-	t.Logf("  min RAM=[%d]", image.MinRAM)
-	t.Logf(" progress=[%d]", image.Progress)
-	t.Logf("   status=[%s]", image.Status)
-}
diff --git a/acceptance/rackspace/compute/v2/keypairs_test.go b/acceptance/rackspace/compute/v2/keypairs_test.go
deleted file mode 100644
index 9bf597e..0000000
--- a/acceptance/rackspace/compute/v2/keypairs_test.go
+++ /dev/null
@@ -1,87 +0,0 @@
-// +build acceptance rackspace
-
-package v2
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/acceptance/tools"
-	os "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs"
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/compute/v2/keypairs"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func deleteKeyPair(t *testing.T, client *gophercloud.ServiceClient, name string) {
-	err := keypairs.Delete(client, name).ExtractErr()
-	th.AssertNoErr(t, err)
-	t.Logf("Successfully deleted key [%s].", name)
-}
-
-func TestCreateKeyPair(t *testing.T) {
-	client, err := newClient()
-	th.AssertNoErr(t, err)
-
-	name := tools.RandomString("createdkey-", 8)
-	k, err := keypairs.Create(client, os.CreateOpts{Name: name}).Extract()
-	th.AssertNoErr(t, err)
-	defer deleteKeyPair(t, client, name)
-
-	t.Logf("Created a new keypair:")
-	t.Logf("        name=[%s]", k.Name)
-	t.Logf(" fingerprint=[%s]", k.Fingerprint)
-	t.Logf("   publickey=[%s]", tools.Elide(k.PublicKey))
-	t.Logf("  privatekey=[%s]", tools.Elide(k.PrivateKey))
-	t.Logf("      userid=[%s]", k.UserID)
-}
-
-func TestImportKeyPair(t *testing.T) {
-	client, err := newClient()
-	th.AssertNoErr(t, err)
-
-	name := tools.RandomString("importedkey-", 8)
-	pubkey := "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDlIQ3r+zd97kb9Hzmujd3V6pbO53eb3Go4q2E8iqVGWQfZTrFdL9KACJnqJIm9HmncfRkUTxE37hqeGCCv8uD+ZPmPiZG2E60OX1mGDjbbzAyReRwYWXgXHopggZTLak5k4mwZYaxwaufbVBDRn847e01lZnaXaszEToLM37NLw+uz29sl3TwYy2R0RGHPwPc160aWmdLjSyd1Nd4c9pvvOP/EoEuBjIC6NJJwg2Rvg9sjjx9jYj0QUgc8CqKLN25oMZ69kNJzlFylKRUoeeVr89txlR59yehJWk6Uw6lYFTdJmcmQOFVAJ12RMmS1hLWCM8UzAgtw+EDa0eqBxBDl smash@winter"
-
-	k, err := keypairs.Create(client, os.CreateOpts{
-		Name:      name,
-		PublicKey: pubkey,
-	}).Extract()
-	th.AssertNoErr(t, err)
-	defer deleteKeyPair(t, client, name)
-
-	th.CheckEquals(t, pubkey, k.PublicKey)
-	th.CheckEquals(t, "", k.PrivateKey)
-
-	t.Logf("Imported an existing keypair:")
-	t.Logf("        name=[%s]", k.Name)
-	t.Logf(" fingerprint=[%s]", k.Fingerprint)
-	t.Logf("   publickey=[%s]", tools.Elide(k.PublicKey))
-	t.Logf("  privatekey=[%s]", tools.Elide(k.PrivateKey))
-	t.Logf("      userid=[%s]", k.UserID)
-}
-
-func TestListKeyPairs(t *testing.T) {
-	client, err := newClient()
-	th.AssertNoErr(t, err)
-
-	count := 0
-	err = keypairs.List(client).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		t.Logf("--- %02d ---", count)
-
-		ks, err := keypairs.ExtractKeyPairs(page)
-		th.AssertNoErr(t, err)
-
-		for i, keypair := range ks {
-			t.Logf("[%02d]    name=[%s]", i, keypair.Name)
-			t.Logf(" fingerprint=[%s]", keypair.Fingerprint)
-			t.Logf("   publickey=[%s]", tools.Elide(keypair.PublicKey))
-			t.Logf("  privatekey=[%s]", tools.Elide(keypair.PrivateKey))
-			t.Logf("      userid=[%s]", keypair.UserID)
-		}
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-}
diff --git a/acceptance/rackspace/compute/v2/networks_test.go b/acceptance/rackspace/compute/v2/networks_test.go
deleted file mode 100644
index 5fb62d2..0000000
--- a/acceptance/rackspace/compute/v2/networks_test.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// +build acceptance rackspace
-
-package v2
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/compute/v2/networks"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestNetworks(t *testing.T) {
-	client, err := newClient()
-	th.AssertNoErr(t, err)
-
-	// Create a network
-	n, err := networks.Create(client, networks.CreateOpts{Label: "sample_network", CIDR: "172.20.0.0/24"}).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Created network: %+v\n", n)
-	defer networks.Delete(client, n.ID)
-	th.AssertEquals(t, n.Label, "sample_network")
-	th.AssertEquals(t, n.CIDR, "172.20.0.0/24")
-	networkID := n.ID
-
-	// List networks
-	pager := networks.List(client)
-	err = pager.EachPage(func(page pagination.Page) (bool, error) {
-		t.Logf("--- Page ---")
-
-		networkList, err := networks.ExtractNetworks(page)
-		th.AssertNoErr(t, err)
-
-		for _, n := range networkList {
-			t.Logf("Network: ID [%s] Label [%s] CIDR [%s]",
-				n.ID, n.Label, n.CIDR)
-		}
-
-		return true, nil
-	})
-	th.CheckNoErr(t, err)
-
-	// Get a network
-	if networkID == "" {
-		t.Fatalf("In order to retrieve a network, the NetworkID must be set")
-	}
-	n, err = networks.Get(client, networkID).Extract()
-	t.Logf("Retrieved Network: %+v\n", n)
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, n.CIDR, "172.20.0.0/24")
-	th.AssertEquals(t, n.Label, "sample_network")
-	th.AssertEquals(t, n.ID, networkID)
-}
diff --git a/acceptance/rackspace/compute/v2/pkg.go b/acceptance/rackspace/compute/v2/pkg.go
deleted file mode 100644
index 5ec3cc8..0000000
--- a/acceptance/rackspace/compute/v2/pkg.go
+++ /dev/null
@@ -1 +0,0 @@
-package v2
diff --git a/acceptance/rackspace/compute/v2/servers_test.go b/acceptance/rackspace/compute/v2/servers_test.go
deleted file mode 100644
index 69631d6..0000000
--- a/acceptance/rackspace/compute/v2/servers_test.go
+++ /dev/null
@@ -1,217 +0,0 @@
-// +build acceptance
-
-package v2
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/acceptance/tools"
-	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/diskconfig"
-	oskey "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs"
-	os "github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/compute/v2/keypairs"
-	"github.com/gophercloud/gophercloud/rackspace/compute/v2/servers"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func createServerKeyPair(t *testing.T, client *gophercloud.ServiceClient) *oskey.KeyPair {
-	name := tools.RandomString("importedkey-", 8)
-	pubkey := "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDlIQ3r+zd97kb9Hzmujd3V6pbO53eb3Go4q2E8iqVGWQfZTrFdL9KACJnqJIm9HmncfRkUTxE37hqeGCCv8uD+ZPmPiZG2E60OX1mGDjbbzAyReRwYWXgXHopggZTLak5k4mwZYaxwaufbVBDRn847e01lZnaXaszEToLM37NLw+uz29sl3TwYy2R0RGHPwPc160aWmdLjSyd1Nd4c9pvvOP/EoEuBjIC6NJJwg2Rvg9sjjx9jYj0QUgc8CqKLN25oMZ69kNJzlFylKRUoeeVr89txlR59yehJWk6Uw6lYFTdJmcmQOFVAJ12RMmS1hLWCM8UzAgtw+EDa0eqBxBDl smash@winter"
-
-	k, err := keypairs.Create(client, oskey.CreateOpts{
-		Name:      name,
-		PublicKey: pubkey,
-	}).Extract()
-	th.AssertNoErr(t, err)
-
-	return k
-}
-
-func createServer(t *testing.T, client *gophercloud.ServiceClient, keyName string) *os.Server {
-	if testing.Short() {
-		t.Skip("Skipping test that requires server creation in short mode.")
-	}
-
-	options, err := optionsFromEnv()
-	th.AssertNoErr(t, err)
-
-	name := tools.RandomString("Gophercloud-", 8)
-
-	pwd := tools.MakeNewPassword("")
-
-	opts := &servers.CreateOpts{
-		Name:       name,
-		ImageRef:   options.imageID,
-		FlavorRef:  options.flavorID,
-		DiskConfig: diskconfig.Manual,
-		AdminPass:  pwd,
-	}
-
-	if keyName != "" {
-		opts.KeyPair = keyName
-	}
-
-	t.Logf("Creating server [%s].", name)
-	s, err := servers.Create(client, opts).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Creating server.")
-
-	err = servers.WaitForStatus(client, s.ID, "ACTIVE", 300)
-	th.AssertNoErr(t, err)
-	t.Logf("Server created successfully.")
-
-	th.CheckEquals(t, pwd, s.AdminPass)
-
-	return s
-}
-
-func logServer(t *testing.T, server *os.Server, index int) {
-	if index == -1 {
-		t.Logf("             id=[%s]", server.ID)
-	} else {
-		t.Logf("[%02d]             id=[%s]", index, server.ID)
-	}
-	t.Logf("           name=[%s]", server.Name)
-	t.Logf("      tenant ID=[%s]", server.TenantID)
-	t.Logf("        user ID=[%s]", server.UserID)
-	t.Logf("        updated=[%s]", server.Updated)
-	t.Logf("        created=[%s]", server.Created)
-	t.Logf("        host ID=[%s]", server.HostID)
-	t.Logf("    access IPv4=[%s]", server.AccessIPv4)
-	t.Logf("    access IPv6=[%s]", server.AccessIPv6)
-	t.Logf("          image=[%v]", server.Image)
-	t.Logf("         flavor=[%v]", server.Flavor)
-	t.Logf("      addresses=[%v]", server.Addresses)
-	t.Logf("       metadata=[%v]", server.Metadata)
-	t.Logf("          links=[%v]", server.Links)
-	t.Logf("        keyname=[%s]", server.KeyName)
-	t.Logf(" admin password=[%s]", server.AdminPass)
-	t.Logf("         status=[%s]", server.Status)
-	t.Logf("       progress=[%d]", server.Progress)
-}
-
-func getServer(t *testing.T, client *gophercloud.ServiceClient, server *os.Server) {
-	t.Logf("> servers.Get")
-
-	details, err := servers.Get(client, server.ID).Extract()
-	th.AssertNoErr(t, err)
-	logServer(t, details, -1)
-}
-
-func updateServer(t *testing.T, client *gophercloud.ServiceClient, server *os.Server) {
-	t.Logf("> servers.Get")
-
-	opts := os.UpdateOpts{
-		Name: "updated-server",
-	}
-	updatedServer, err := servers.Update(client, server.ID, opts).Extract()
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, "updated-server", updatedServer.Name)
-	logServer(t, updatedServer, -1)
-}
-
-func listServers(t *testing.T, client *gophercloud.ServiceClient) {
-	t.Logf("> servers.List")
-
-	count := 0
-	err := servers.List(client, nil).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		t.Logf("--- Page %02d ---", count)
-
-		s, err := servers.ExtractServers(page)
-		th.AssertNoErr(t, err)
-		for index, server := range s {
-			logServer(t, &server, index)
-		}
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-}
-
-func changeAdminPassword(t *testing.T, client *gophercloud.ServiceClient, server *os.Server) {
-	t.Logf("> servers.ChangeAdminPassword")
-
-	original := server.AdminPass
-
-	t.Logf("Changing server password.")
-	err := servers.ChangeAdminPassword(client, server.ID, tools.MakeNewPassword(original)).ExtractErr()
-	th.AssertNoErr(t, err)
-
-	err = servers.WaitForStatus(client, server.ID, "ACTIVE", 300)
-	th.AssertNoErr(t, err)
-	t.Logf("Password changed successfully.")
-}
-
-func rebootServer(t *testing.T, client *gophercloud.ServiceClient, server *os.Server) {
-	t.Logf("> servers.Reboot")
-
-	err := servers.Reboot(client, server.ID, os.HardReboot).ExtractErr()
-	th.AssertNoErr(t, err)
-
-	err = servers.WaitForStatus(client, server.ID, "ACTIVE", 300)
-	th.AssertNoErr(t, err)
-
-	t.Logf("Server successfully rebooted.")
-}
-
-func rebuildServer(t *testing.T, client *gophercloud.ServiceClient, server *os.Server) {
-	t.Logf("> servers.Rebuild")
-
-	options, err := optionsFromEnv()
-	th.AssertNoErr(t, err)
-
-	opts := servers.RebuildOpts{
-		Name:       tools.RandomString("RenamedGopher", 16),
-		AdminPass:  tools.MakeNewPassword(server.AdminPass),
-		ImageID:    options.imageID,
-		DiskConfig: diskconfig.Manual,
-	}
-	after, err := servers.Rebuild(client, server.ID, opts).Extract()
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, after.ID, server.ID)
-
-	err = servers.WaitForStatus(client, after.ID, "ACTIVE", 300)
-	th.AssertNoErr(t, err)
-
-	t.Logf("Server successfully rebuilt.")
-	logServer(t, after, -1)
-}
-
-func deleteServer(t *testing.T, client *gophercloud.ServiceClient, server *os.Server) {
-	t.Logf("> servers.Delete")
-
-	res := servers.Delete(client, server.ID)
-	th.AssertNoErr(t, res.Err)
-
-	t.Logf("Server deleted successfully.")
-}
-
-func deleteServerKeyPair(t *testing.T, client *gophercloud.ServiceClient, k *oskey.KeyPair) {
-	t.Logf("> keypairs.Delete")
-
-	err := keypairs.Delete(client, k.Name).ExtractErr()
-	th.AssertNoErr(t, err)
-
-	t.Logf("Keypair deleted successfully.")
-}
-
-func TestServerOperations(t *testing.T) {
-	client, err := newClient()
-	th.AssertNoErr(t, err)
-
-	kp := createServerKeyPair(t, client)
-	defer deleteServerKeyPair(t, client, kp)
-
-	server := createServer(t, client, kp.Name)
-	defer deleteServer(t, client, server)
-
-	getServer(t, client, server)
-	updateServer(t, client, server)
-	listServers(t, client)
-	changeAdminPassword(t, client, server)
-	rebootServer(t, client, server)
-	rebuildServer(t, client, server)
-}
diff --git a/acceptance/rackspace/compute/v2/virtualinterfaces_test.go b/acceptance/rackspace/compute/v2/virtualinterfaces_test.go
deleted file mode 100644
index 5deb8f3..0000000
--- a/acceptance/rackspace/compute/v2/virtualinterfaces_test.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// +build acceptance rackspace
-
-package v2
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/compute/v2/networks"
-	"github.com/gophercloud/gophercloud/rackspace/compute/v2/virtualinterfaces"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestVirtualInterfaces(t *testing.T) {
-	client, err := newClient()
-	th.AssertNoErr(t, err)
-
-	// Create a server
-	server := createServer(t, client, "")
-	t.Logf("Created Server: %v\n", server)
-	defer deleteServer(t, client, server)
-	serverID := server.ID
-
-	// Create a network
-	n, err := networks.Create(client, networks.CreateOpts{Label: "sample_network", CIDR: "172.20.0.0/24"}).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Created Network: %v\n", n)
-	defer networks.Delete(client, n.ID)
-	networkID := n.ID
-
-	// Create a virtual interface
-	vi, err := virtualinterfaces.Create(client, serverID, networkID).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Created virtual interface: %+v\n", vi)
-	defer virtualinterfaces.Delete(client, serverID, vi.ID)
-
-	// List virtual interfaces
-	pager := virtualinterfaces.List(client, serverID)
-	err = pager.EachPage(func(page pagination.Page) (bool, error) {
-		t.Logf("--- Page ---")
-
-		virtualinterfacesList, err := virtualinterfaces.ExtractVirtualInterfaces(page)
-		th.AssertNoErr(t, err)
-
-		for _, vi := range virtualinterfacesList {
-			t.Logf("Virtual Interface: ID [%s] MAC Address [%s] IP Addresses [%v]",
-				vi.ID, vi.MACAddress, vi.IPAddresses)
-		}
-
-		return true, nil
-	})
-	th.CheckNoErr(t, err)
-}
diff --git a/acceptance/rackspace/compute/v2/volumeattach_test.go b/acceptance/rackspace/compute/v2/volumeattach_test.go
deleted file mode 100644
index e95faf1..0000000
--- a/acceptance/rackspace/compute/v2/volumeattach_test.go
+++ /dev/null
@@ -1,130 +0,0 @@
-// +build acceptance compute servers
-
-package v2
-
-import (
-	"os"
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/acceptance/tools"
-	"github.com/gophercloud/gophercloud/openstack"
-	osVolumes "github.com/gophercloud/gophercloud/openstack/blockstorage/v1/volumes"
-	osVolumeAttach "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/volumeattach"
-	osServers "github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
-	"github.com/gophercloud/gophercloud/rackspace"
-	"github.com/gophercloud/gophercloud/rackspace/blockstorage/v1/volumes"
-	"github.com/gophercloud/gophercloud/rackspace/compute/v2/servers"
-	"github.com/gophercloud/gophercloud/rackspace/compute/v2/volumeattach"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func newBlockClient(t *testing.T) (*gophercloud.ServiceClient, error) {
-	ao, err := rackspace.AuthOptionsFromEnv()
-	th.AssertNoErr(t, err)
-
-	client, err := rackspace.AuthenticatedClient(ao)
-	th.AssertNoErr(t, err)
-
-	return openstack.NewBlockStorageV1(client, gophercloud.EndpointOpts{
-		Region: os.Getenv("RS_REGION_NAME"),
-	})
-}
-
-func createVAServer(t *testing.T, computeClient *gophercloud.ServiceClient, choices *serverOpts) (*osServers.Server, error) {
-	if testing.Short() {
-		t.Skip("Skipping test that requires server creation in short mode.")
-	}
-
-	name := tools.RandomString("ACPTTEST", 16)
-	t.Logf("Attempting to create server: %s\n", name)
-
-	pwd := tools.MakeNewPassword("")
-
-	server, err := servers.Create(computeClient, osServers.CreateOpts{
-		Name:      name,
-		FlavorRef: choices.flavorID,
-		ImageRef:  choices.imageID,
-		AdminPass: pwd,
-	}).Extract()
-	if err != nil {
-		t.Fatalf("Unable to create server: %v", err)
-	}
-
-	th.AssertEquals(t, pwd, server.AdminPass)
-
-	return server, err
-}
-
-func createVAVolume(t *testing.T, blockClient *gophercloud.ServiceClient) (*volumes.Volume, error) {
-	volume, err := volumes.Create(blockClient, &osVolumes.CreateOpts{
-		Size: 80,
-		Name: "gophercloud-test-volume",
-	}).Extract()
-	th.AssertNoErr(t, err)
-	defer func() {
-		err = osVolumes.WaitForStatus(blockClient, volume.ID, "available", 60)
-		th.AssertNoErr(t, err)
-	}()
-
-	return volume, err
-}
-
-func createVolumeAttachment(t *testing.T, computeClient *gophercloud.ServiceClient, blockClient *gophercloud.ServiceClient, serverID string, volumeID string) {
-	va, err := volumeattach.Create(computeClient, serverID, &osVolumeAttach.CreateOpts{
-		VolumeID: volumeID,
-	}).Extract()
-	th.AssertNoErr(t, err)
-	defer func() {
-		err = osVolumes.WaitForStatus(blockClient, volumeID, "in-use", 60)
-		th.AssertNoErr(t, err)
-		err = volumeattach.Delete(computeClient, serverID, va.ID).ExtractErr()
-		th.AssertNoErr(t, err)
-		err = osVolumes.WaitForStatus(blockClient, volumeID, "available", 60)
-		th.AssertNoErr(t, err)
-	}()
-	t.Logf("Attached volume to server: %+v", va)
-}
-
-func TestAttachVolume(t *testing.T) {
-	choices, err := optionsFromEnv()
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	computeClient, err := newClient()
-	if err != nil {
-		t.Fatalf("Unable to create a compute client: %v", err)
-	}
-
-	blockClient, err := newBlockClient(t)
-	if err != nil {
-		t.Fatalf("Unable to create a blockstorage client: %v", err)
-	}
-
-	server, err := createVAServer(t, computeClient, choices)
-	if err != nil {
-		t.Fatalf("Unable to create server: %v", err)
-	}
-	defer func() {
-		servers.Delete(computeClient, server.ID)
-		t.Logf("Server deleted.")
-	}()
-
-	if err = osServers.WaitForStatus(computeClient, server.ID, "ACTIVE", 300); err != nil {
-		t.Fatalf("Unable to wait for server: %v", err)
-	}
-
-	volume, err := createVAVolume(t, blockClient)
-	if err != nil {
-		t.Fatalf("Unable to create volume: %v", err)
-	}
-	defer func() {
-		err = volumes.Delete(blockClient, volume.ID).ExtractErr()
-		th.AssertNoErr(t, err)
-		t.Logf("Volume deleted.")
-	}()
-
-	createVolumeAttachment(t, computeClient, blockClient, server.ID, volume.ID)
-
-}
diff --git a/acceptance/rackspace/db/v1/backup_test.go b/acceptance/rackspace/db/v1/backup_test.go
deleted file mode 100644
index 767ece6..0000000
--- a/acceptance/rackspace/db/v1/backup_test.go
+++ /dev/null
@@ -1,84 +0,0 @@
-// +build acceptance db rackspace
-
-package v1
-
-import (
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/acceptance/tools"
-	"github.com/gophercloud/gophercloud/pagination"
-
-	"github.com/gophercloud/gophercloud/rackspace/db/v1/backups"
-	"github.com/gophercloud/gophercloud/rackspace/db/v1/instances"
-)
-
-func (c *context) createBackup() {
-	opts := backups.CreateOpts{
-		Name:       tools.RandomString("backup_", 5),
-		InstanceID: c.instanceID,
-	}
-
-	backup, err := backups.Create(c.client, opts).Extract()
-
-	c.Logf("Created backup %#v", backup)
-	c.AssertNoErr(err)
-
-	err = gophercloud.WaitFor(60, func() (bool, error) {
-		b, err := backups.Get(c.client, backup.ID).Extract()
-		if err != nil {
-			return false, err
-		}
-		if b.Status == "COMPLETED" {
-			return true, nil
-		}
-		return false, nil
-	})
-	c.AssertNoErr(err)
-
-	c.backupID = backup.ID
-}
-
-func (c *context) getBackup() {
-	backup, err := backups.Get(c.client, c.backupID).Extract()
-	c.AssertNoErr(err)
-	c.Logf("Getting backup %s", backup.ID)
-}
-
-func (c *context) listAllBackups() {
-	c.Logf("Listing backups")
-
-	err := backups.List(c.client, nil).EachPage(func(page pagination.Page) (bool, error) {
-		backupList, err := backups.ExtractBackups(page)
-		c.AssertNoErr(err)
-
-		for _, b := range backupList {
-			c.Logf("Backup: %#v", b)
-		}
-
-		return true, nil
-	})
-
-	c.AssertNoErr(err)
-}
-
-func (c *context) listInstanceBackups() {
-	c.Logf("Listing backups for instance %s", c.instanceID)
-
-	err := instances.ListBackups(c.client, c.instanceID).EachPage(func(page pagination.Page) (bool, error) {
-		backupList, err := backups.ExtractBackups(page)
-		c.AssertNoErr(err)
-
-		for _, b := range backupList {
-			c.Logf("Backup: %#v", b)
-		}
-
-		return true, nil
-	})
-
-	c.AssertNoErr(err)
-}
-
-func (c *context) deleteBackup() {
-	err := backups.Delete(c.client, c.backupID).ExtractErr()
-	c.AssertNoErr(err)
-	c.Logf("Deleted backup %s", c.backupID)
-}
diff --git a/acceptance/rackspace/db/v1/common.go b/acceptance/rackspace/db/v1/common.go
deleted file mode 100644
index fd6e3bb..0000000
--- a/acceptance/rackspace/db/v1/common.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// +build acceptance db rackspace
-
-package v1
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/acceptance/tools"
-	"github.com/gophercloud/gophercloud/rackspace"
-	"github.com/gophercloud/gophercloud/rackspace/db/v1/instances"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func newClient(t *testing.T) *gophercloud.ServiceClient {
-	opts, err := rackspace.AuthOptionsFromEnv()
-	th.AssertNoErr(t, err)
-	opts = tools.OnlyRS(opts)
-
-	client, err := rackspace.AuthenticatedClient(opts)
-	th.AssertNoErr(t, err)
-
-	c, err := rackspace.NewDBV1(client, gophercloud.EndpointOpts{
-		Region: "IAD",
-	})
-	th.AssertNoErr(t, err)
-
-	return c
-}
-
-type context struct {
-	test          *testing.T
-	client        *gophercloud.ServiceClient
-	instanceID    string
-	DBIDs         []string
-	replicaID     string
-	backupID      string
-	configGroupID string
-	users         []string
-}
-
-func newContext(t *testing.T) context {
-	return context{
-		test:   t,
-		client: newClient(t),
-	}
-}
-
-func (c context) Logf(msg string, args ...interface{}) {
-	if len(args) > 0 {
-		c.test.Logf(msg, args...)
-	} else {
-		c.test.Log(msg)
-	}
-}
-
-func (c context) AssertNoErr(err error) {
-	th.AssertNoErr(c.test, err)
-}
-
-func (c context) WaitUntilActive(id string) {
-	err := gophercloud.WaitFor(60, func() (bool, error) {
-		inst, err := instances.Get(c.client, id).Extract()
-		if err != nil {
-			return false, err
-		}
-		if inst.Status == "ACTIVE" {
-			return true, nil
-		}
-		return false, nil
-	})
-	c.AssertNoErr(err)
-}
diff --git a/acceptance/rackspace/db/v1/config_group_test.go b/acceptance/rackspace/db/v1/config_group_test.go
deleted file mode 100644
index 172afcd..0000000
--- a/acceptance/rackspace/db/v1/config_group_test.go
+++ /dev/null
@@ -1,93 +0,0 @@
-// +build acceptance db rackspace
-
-package v1
-
-import (
-	"github.com/gophercloud/gophercloud/acceptance/tools"
-	os "github.com/gophercloud/gophercloud/openstack/db/v1/configurations"
-	"github.com/gophercloud/gophercloud/pagination"
-	config "github.com/gophercloud/gophercloud/rackspace/db/v1/configurations"
-	"github.com/gophercloud/gophercloud/rackspace/db/v1/instances"
-)
-
-func (c *context) createConfigGrp() {
-	opts := os.CreateOpts{
-		Name: tools.RandomString("config_", 5),
-		Values: map[string]interface{}{
-			"connect_timeout":  300,
-			"join_buffer_size": 900000,
-		},
-	}
-
-	cg, err := config.Create(c.client, opts).Extract()
-
-	c.AssertNoErr(err)
-	c.Logf("Created config group %#v", cg)
-
-	c.configGroupID = cg.ID
-}
-
-func (c *context) getConfigGrp() {
-	cg, err := config.Get(c.client, c.configGroupID).Extract()
-	c.Logf("Getting config group: %#v", cg)
-	c.AssertNoErr(err)
-}
-
-func (c *context) updateConfigGrp() {
-	opts := os.UpdateOpts{
-		Name: tools.RandomString("new_name_", 5),
-		Values: map[string]interface{}{
-			"connect_timeout": 250,
-		},
-	}
-	err := config.Update(c.client, c.configGroupID, opts).ExtractErr()
-	c.Logf("Updated config group %s", c.configGroupID)
-	c.AssertNoErr(err)
-}
-
-func (c *context) replaceConfigGrp() {
-	opts := os.UpdateOpts{
-		Values: map[string]interface{}{
-			"big_tables": 1,
-		},
-	}
-
-	err := config.Replace(c.client, c.configGroupID, opts).ExtractErr()
-	c.Logf("Replaced values for config group %s", c.configGroupID)
-	c.AssertNoErr(err)
-}
-
-func (c *context) associateInstanceWithConfigGrp() {
-	err := instances.AssociateWithConfigGroup(c.client, c.instanceID, c.configGroupID).ExtractErr()
-	c.Logf("Associated instance %s with config group %s", c.instanceID, c.configGroupID)
-	c.AssertNoErr(err)
-}
-
-func (c *context) listConfigGrpInstances() {
-	c.Logf("Listing all instances associated with config group %s", c.configGroupID)
-
-	err := config.ListInstances(c.client, c.configGroupID).EachPage(func(page pagination.Page) (bool, error) {
-		instanceList, err := instances.ExtractInstances(page)
-		c.AssertNoErr(err)
-
-		for _, instance := range instanceList {
-			c.Logf("Instance: %#v", instance)
-		}
-
-		return true, nil
-	})
-
-	c.AssertNoErr(err)
-}
-
-func (c *context) deleteConfigGrp() {
-	err := config.Delete(c.client, c.configGroupID).ExtractErr()
-	c.Logf("Deleted config group %s", c.configGroupID)
-	c.AssertNoErr(err)
-}
-
-func (c *context) detachInstanceFromGrp() {
-	err := instances.DetachFromConfigGroup(c.client, c.instanceID).ExtractErr()
-	c.Logf("Detached instance %s from config groups", c.instanceID)
-	c.AssertNoErr(err)
-}
diff --git a/acceptance/rackspace/db/v1/database_test.go b/acceptance/rackspace/db/v1/database_test.go
deleted file mode 100644
index 08e15bf..0000000
--- a/acceptance/rackspace/db/v1/database_test.go
+++ /dev/null
@@ -1,54 +0,0 @@
-// +build acceptance db rackspace
-
-package v1
-
-import (
-	"github.com/gophercloud/gophercloud/acceptance/tools"
-	db "github.com/gophercloud/gophercloud/openstack/db/v1/databases"
-	"github.com/gophercloud/gophercloud/pagination"
-)
-
-func (c *context) createDBs() {
-	dbs := []string{
-		tools.RandomString("db_", 5),
-		tools.RandomString("db_", 5),
-		tools.RandomString("db_", 5),
-	}
-
-	opts := db.BatchCreateOpts{
-		db.CreateOpts{Name: dbs[0]},
-		db.CreateOpts{Name: dbs[1]},
-		db.CreateOpts{Name: dbs[2]},
-	}
-
-	err := db.Create(c.client, c.instanceID, opts).ExtractErr()
-	c.Logf("Created three databases on instance %s: %s, %s, %s", c.instanceID, dbs[0], dbs[1], dbs[2])
-	c.AssertNoErr(err)
-
-	c.DBIDs = dbs
-}
-
-func (c *context) listDBs() {
-	c.Logf("Listing databases on instance %s", c.instanceID)
-
-	err := db.List(c.client, c.instanceID).EachPage(func(page pagination.Page) (bool, error) {
-		dbList, err := db.ExtractDBs(page)
-		c.AssertNoErr(err)
-
-		for _, db := range dbList {
-			c.Logf("DB: %#v", db)
-		}
-
-		return true, nil
-	})
-
-	c.AssertNoErr(err)
-}
-
-func (c *context) deleteDBs() {
-	for _, id := range c.DBIDs {
-		err := db.Delete(c.client, c.instanceID, id).ExtractErr()
-		c.AssertNoErr(err)
-		c.Logf("Deleted DB %s", id)
-	}
-}
diff --git a/acceptance/rackspace/db/v1/flavor_test.go b/acceptance/rackspace/db/v1/flavor_test.go
deleted file mode 100644
index 33d68ab..0000000
--- a/acceptance/rackspace/db/v1/flavor_test.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// +build acceptance db rackspace
-
-package v1
-
-import (
-	os "github.com/gophercloud/gophercloud/openstack/db/v1/flavors"
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/db/v1/flavors"
-)
-
-func (c context) listFlavors() {
-	c.Logf("Listing flavors")
-
-	err := flavors.List(c.client).EachPage(func(page pagination.Page) (bool, error) {
-		flavorList, err := os.ExtractFlavors(page)
-		c.AssertNoErr(err)
-
-		for _, f := range flavorList {
-			c.Logf("Flavor: ID [%s] Name [%s] RAM [%d]", f.ID, f.Name, f.RAM)
-		}
-
-		return true, nil
-	})
-
-	c.AssertNoErr(err)
-}
-
-func (c context) getFlavor() {
-	flavor, err := flavors.Get(c.client, "1").Extract()
-	c.Logf("Getting flavor %s", flavor.ID)
-	c.AssertNoErr(err)
-}
diff --git a/acceptance/rackspace/db/v1/instance_test.go b/acceptance/rackspace/db/v1/instance_test.go
deleted file mode 100644
index b394c4a..0000000
--- a/acceptance/rackspace/db/v1/instance_test.go
+++ /dev/null
@@ -1,169 +0,0 @@
-// +build acceptance db rackspace
-
-package v1
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud/acceptance/tools"
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/db/v1/instances"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestRunner(t *testing.T) {
-	c := newContext(t)
-
-	// FLAVOR tests
-	c.listFlavors()
-	c.getFlavor()
-
-	// INSTANCE tests
-	c.createInstance()
-	c.listInstances()
-	c.getInstance()
-	c.isRootEnabled()
-	c.enableRootUser()
-	c.isRootEnabled()
-	c.restartInstance()
-	c.resizeInstance()
-	c.resizeVol()
-	c.getDefaultConfig()
-
-	// REPLICA tests
-	c.createReplica()
-	c.detachReplica()
-
-	// BACKUP tests
-	c.createBackup()
-	c.getBackup()
-	c.listAllBackups()
-	c.listInstanceBackups()
-	c.deleteBackup()
-
-	// CONFIG GROUP tests
-	c.createConfigGrp()
-	c.getConfigGrp()
-	c.updateConfigGrp()
-	c.replaceConfigGrp()
-	c.associateInstanceWithConfigGrp()
-	c.listConfigGrpInstances()
-	c.detachInstanceFromGrp()
-	c.deleteConfigGrp()
-
-	// DATABASE tests
-	c.createDBs()
-	c.listDBs()
-
-	// USER tests
-	c.createUsers()
-	c.listUsers()
-	c.changeUserPwd()
-	c.getUser()
-	c.updateUser()
-	c.listUserAccess()
-	c.revokeUserAccess()
-	c.grantUserAccess()
-
-	// TEARDOWN
-	c.deleteUsers()
-	c.deleteDBs()
-
-	c.restartInstance()
-	c.WaitUntilActive(c.instanceID)
-
-	c.deleteInstance(c.replicaID)
-	c.deleteInstance(c.instanceID)
-}
-
-func (c *context) createInstance() {
-	opts := instances.CreateOpts{
-		FlavorRef: "1",
-		Size:      1,
-		Name:      tools.RandomString("gopher_db", 5),
-	}
-
-	instance, err := instances.Create(c.client, opts).Extract()
-	th.AssertNoErr(c.test, err)
-
-	c.Logf("Creating %s. Waiting...", instance.ID)
-	c.WaitUntilActive(instance.ID)
-	c.Logf("Created instance %s", instance.ID)
-
-	c.instanceID = instance.ID
-}
-
-func (c *context) listInstances() {
-	c.Logf("Listing instances")
-
-	err := instances.List(c.client, nil).EachPage(func(page pagination.Page) (bool, error) {
-		instanceList, err := instances.ExtractInstances(page)
-		c.AssertNoErr(err)
-
-		for _, i := range instanceList {
-			c.Logf("Instance: ID [%s] Name [%s] Status [%s] VolSize [%d] Datastore Type [%s]",
-				i.ID, i.Name, i.Status, i.Volume.Size, i.Datastore.Type)
-		}
-
-		return true, nil
-	})
-
-	c.AssertNoErr(err)
-}
-
-func (c *context) getInstance() {
-	instance, err := instances.Get(c.client, c.instanceID).Extract()
-	c.AssertNoErr(err)
-	c.Logf("Getting instance: %#v", instance)
-}
-
-func (c *context) deleteInstance(id string) {
-	err := instances.Delete(c.client, id).ExtractErr()
-	c.AssertNoErr(err)
-	c.Logf("Deleted instance %s", id)
-}
-
-func (c *context) enableRootUser() {
-	_, err := instances.EnableRootUser(c.client, c.instanceID).Extract()
-	c.AssertNoErr(err)
-	c.Logf("Enabled root user on %s", c.instanceID)
-}
-
-func (c *context) isRootEnabled() {
-	enabled, err := instances.IsRootEnabled(c.client, c.instanceID)
-	c.AssertNoErr(err)
-	c.Logf("Is root enabled? %s", enabled)
-}
-
-func (c *context) restartInstance() {
-	id := c.instanceID
-	err := instances.Restart(c.client, id).ExtractErr()
-	c.AssertNoErr(err)
-	c.Logf("Restarting %s. Waiting...", id)
-	c.WaitUntilActive(id)
-	c.Logf("Restarted %s", id)
-}
-
-func (c *context) resizeInstance() {
-	id := c.instanceID
-	err := instances.Resize(c.client, id, "2").ExtractErr()
-	c.AssertNoErr(err)
-	c.Logf("Resizing %s. Waiting...", id)
-	c.WaitUntilActive(id)
-	c.Logf("Resized %s with flavorRef %s", id, "2")
-}
-
-func (c *context) resizeVol() {
-	id := c.instanceID
-	err := instances.ResizeVolume(c.client, id, 2).ExtractErr()
-	c.AssertNoErr(err)
-	c.Logf("Resizing volume of %s. Waiting...", id)
-	c.WaitUntilActive(id)
-	c.Logf("Resized the volume of %s to %d GB", id, 2)
-}
-
-func (c *context) getDefaultConfig() {
-	config, err := instances.GetDefaultConfig(c.client, c.instanceID).Extract()
-	c.Logf("Default config group for instance %s: %#v", c.instanceID, config)
-	c.AssertNoErr(err)
-}
diff --git a/acceptance/rackspace/db/v1/pkg.go b/acceptance/rackspace/db/v1/pkg.go
deleted file mode 100644
index b7b1f99..0000000
--- a/acceptance/rackspace/db/v1/pkg.go
+++ /dev/null
@@ -1 +0,0 @@
-package v1
diff --git a/acceptance/rackspace/db/v1/replica_test.go b/acceptance/rackspace/db/v1/replica_test.go
deleted file mode 100644
index af97241..0000000
--- a/acceptance/rackspace/db/v1/replica_test.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// +build acceptance db rackspace
-
-package v1
-
-import (
-	"github.com/gophercloud/gophercloud/acceptance/tools"
-	"github.com/gophercloud/gophercloud/rackspace/db/v1/instances"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func (c *context) createReplica() {
-	opts := instances.CreateOpts{
-		FlavorRef: "2",
-		Size:      1,
-		Name:      tools.RandomString("gopher_db", 5),
-		ReplicaOf: c.instanceID,
-	}
-
-	repl, err := instances.Create(c.client, opts).Extract()
-	th.AssertNoErr(c.test, err)
-
-	c.Logf("Creating replica of %s. Waiting...", c.instanceID)
-	c.WaitUntilActive(repl.ID)
-	c.Logf("Created replica %#v", repl)
-
-	c.replicaID = repl.ID
-}
-
-func (c *context) detachReplica() {
-	err := instances.DetachReplica(c.client, c.replicaID).ExtractErr()
-	c.Logf("Detached replica %s", c.replicaID)
-	c.AssertNoErr(err)
-}
diff --git a/acceptance/rackspace/db/v1/user_test.go b/acceptance/rackspace/db/v1/user_test.go
deleted file mode 100644
index 4b23007..0000000
--- a/acceptance/rackspace/db/v1/user_test.go
+++ /dev/null
@@ -1,125 +0,0 @@
-// +build acceptance db rackspace
-
-package v1
-
-import (
-	"github.com/gophercloud/gophercloud/acceptance/tools"
-	db "github.com/gophercloud/gophercloud/openstack/db/v1/databases"
-	os "github.com/gophercloud/gophercloud/openstack/db/v1/users"
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/db/v1/users"
-)
-
-func (c *context) createUsers() {
-	c.users = []string{
-		tools.RandomString("user_", 5),
-		tools.RandomString("user_", 5),
-		tools.RandomString("user_", 5),
-	}
-
-	db1 := db.CreateOpts{Name: c.DBIDs[0]}
-	db2 := db.CreateOpts{Name: c.DBIDs[1]}
-	db3 := db.CreateOpts{Name: c.DBIDs[2]}
-
-	opts := os.BatchCreateOpts{
-		os.CreateOpts{
-			Name:      c.users[0],
-			Password:  tools.RandomString("db_", 5),
-			Databases: db.BatchCreateOpts{db1, db2, db3},
-		},
-		os.CreateOpts{
-			Name:      c.users[1],
-			Password:  tools.RandomString("db_", 5),
-			Databases: db.BatchCreateOpts{db1, db2},
-		},
-		os.CreateOpts{
-			Name:      c.users[2],
-			Password:  tools.RandomString("db_", 5),
-			Databases: db.BatchCreateOpts{db3},
-		},
-	}
-
-	err := users.Create(c.client, c.instanceID, opts).ExtractErr()
-	c.Logf("Created three users on instance %s: %s, %s, %s", c.instanceID, c.users[0], c.users[1], c.users[2])
-	c.AssertNoErr(err)
-}
-
-func (c *context) listUsers() {
-	c.Logf("Listing users on instance %s", c.instanceID)
-
-	err := os.List(c.client, c.instanceID).EachPage(func(page pagination.Page) (bool, error) {
-		uList, err := os.ExtractUsers(page)
-		c.AssertNoErr(err)
-
-		for _, u := range uList {
-			c.Logf("User: %#v", u)
-		}
-
-		return true, nil
-	})
-
-	c.AssertNoErr(err)
-}
-
-func (c *context) deleteUsers() {
-	for _, id := range c.users {
-		err := users.Delete(c.client, c.instanceID, id).ExtractErr()
-		c.AssertNoErr(err)
-		c.Logf("Deleted user %s", id)
-	}
-}
-
-func (c *context) changeUserPwd() {
-	opts := os.BatchCreateOpts{}
-
-	for _, name := range c.users[:1] {
-		opts = append(opts, os.CreateOpts{Name: name, Password: tools.RandomString("", 5)})
-	}
-
-	err := users.ChangePassword(c.client, c.instanceID, opts).ExtractErr()
-	c.Logf("Updated 2 users' passwords")
-	c.AssertNoErr(err)
-}
-
-func (c *context) getUser() {
-	user, err := users.Get(c.client, c.instanceID, c.users[0]).Extract()
-	c.Logf("Getting user %s", user)
-	c.AssertNoErr(err)
-}
-
-func (c *context) updateUser() {
-	opts := users.UpdateOpts{Name: tools.RandomString("new_name_", 5)}
-	err := users.Update(c.client, c.instanceID, c.users[0], opts).ExtractErr()
-	c.Logf("Updated user %s", c.users[0])
-	c.AssertNoErr(err)
-	c.users[0] = opts.Name
-}
-
-func (c *context) listUserAccess() {
-	err := users.ListAccess(c.client, c.instanceID, c.users[0]).EachPage(func(page pagination.Page) (bool, error) {
-		dbList, err := users.ExtractDBs(page)
-		c.AssertNoErr(err)
-
-		for _, db := range dbList {
-			c.Logf("User %s has access to DB: %#v", db)
-		}
-
-		return true, nil
-	})
-
-	c.AssertNoErr(err)
-}
-
-func (c *context) grantUserAccess() {
-	opts := db.BatchCreateOpts{db.CreateOpts{Name: c.DBIDs[0]}}
-	err := users.GrantAccess(c.client, c.instanceID, c.users[0], opts).ExtractErr()
-	c.Logf("Granted access for user %s to DB %s", c.users[0], c.DBIDs[0])
-	c.AssertNoErr(err)
-}
-
-func (c *context) revokeUserAccess() {
-	dbName, userName := c.DBIDs[0], c.users[0]
-	err := users.RevokeAccess(c.client, c.instanceID, userName, dbName).ExtractErr()
-	c.Logf("Revoked access for user %s to DB %s", userName, dbName)
-	c.AssertNoErr(err)
-}
diff --git a/acceptance/rackspace/identity/v2/extension_test.go b/acceptance/rackspace/identity/v2/extension_test.go
deleted file mode 100644
index 1ba770b..0000000
--- a/acceptance/rackspace/identity/v2/extension_test.go
+++ /dev/null
@@ -1,54 +0,0 @@
-// +build acceptance
-
-package v2
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud/pagination"
-	extensions2 "github.com/gophercloud/gophercloud/rackspace/identity/v2/extensions"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestExtensions(t *testing.T) {
-	service := authenticatedClient(t)
-
-	t.Logf("Extensions available on this identity endpoint:")
-	count := 0
-	var chosen string
-	err := extensions2.List(service).EachPage(func(page pagination.Page) (bool, error) {
-		t.Logf("--- Page %02d ---", count)
-
-		extensions, err := extensions2.ExtractExtensions(page)
-		th.AssertNoErr(t, err)
-
-		for i, ext := range extensions {
-			if chosen == "" {
-				chosen = ext.Alias
-			}
-
-			t.Logf("[%02d] name=[%s] namespace=[%s]", i, ext.Name, ext.Namespace)
-			t.Logf("     alias=[%s] updated=[%s]", ext.Alias, ext.Updated)
-			t.Logf("     description=[%s]", ext.Description)
-		}
-
-		count++
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-
-	if chosen == "" {
-		t.Logf("No extensions found.")
-		return
-	}
-
-	ext, err := extensions2.Get(service, chosen).Extract()
-	th.AssertNoErr(t, err)
-
-	t.Logf("Detail for extension [%s]:", chosen)
-	t.Logf("        name=[%s]", ext.Name)
-	t.Logf("   namespace=[%s]", ext.Namespace)
-	t.Logf("       alias=[%s]", ext.Alias)
-	t.Logf("     updated=[%s]", ext.Updated)
-	t.Logf(" description=[%s]", ext.Description)
-}
diff --git a/acceptance/rackspace/identity/v2/identity_test.go b/acceptance/rackspace/identity/v2/identity_test.go
deleted file mode 100644
index 03ca49a..0000000
--- a/acceptance/rackspace/identity/v2/identity_test.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// +build acceptance
-
-package v2
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/acceptance/tools"
-	"github.com/gophercloud/gophercloud/rackspace"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func rackspaceAuthOptions(t *testing.T) gophercloud.AuthOptions {
-	// Obtain credentials from the environment.
-	options, err := rackspace.AuthOptionsFromEnv()
-	th.AssertNoErr(t, err)
-	options = tools.OnlyRS(options)
-
-	if options.Username == "" {
-		t.Fatal("Please provide a Rackspace username as RS_USERNAME.")
-	}
-	if options.APIKey == "" {
-		t.Fatal("Please provide a Rackspace API key as RS_API_KEY.")
-	}
-
-	return options
-}
-
-func createClient(t *testing.T, auth bool) *gophercloud.ServiceClient {
-	ao := rackspaceAuthOptions(t)
-
-	provider, err := rackspace.NewClient(ao.IdentityEndpoint)
-	th.AssertNoErr(t, err)
-
-	if auth {
-		err = rackspace.Authenticate(provider, ao)
-		th.AssertNoErr(t, err)
-	}
-
-	return rackspace.NewIdentityV2(provider)
-}
-
-func unauthenticatedClient(t *testing.T) *gophercloud.ServiceClient {
-	return createClient(t, false)
-}
-
-func authenticatedClient(t *testing.T) *gophercloud.ServiceClient {
-	return createClient(t, true)
-}
diff --git a/acceptance/rackspace/identity/v2/pkg.go b/acceptance/rackspace/identity/v2/pkg.go
deleted file mode 100644
index 5ec3cc8..0000000
--- a/acceptance/rackspace/identity/v2/pkg.go
+++ /dev/null
@@ -1 +0,0 @@
-package v2
diff --git a/acceptance/rackspace/identity/v2/role_test.go b/acceptance/rackspace/identity/v2/role_test.go
deleted file mode 100644
index 1629765..0000000
--- a/acceptance/rackspace/identity/v2/role_test.go
+++ /dev/null
@@ -1,59 +0,0 @@
-// +build acceptance identity roles
-
-package v2
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	os "github.com/gophercloud/gophercloud/openstack/identity/v2/extensions/admin/roles"
-
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/identity/v2/roles"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestRoles(t *testing.T) {
-	client := authenticatedClient(t)
-
-	userID := createUser(t, client)
-	roleID := listRoles(t, client)
-
-	addUserRole(t, client, userID, roleID)
-
-	deleteUserRole(t, client, userID, roleID)
-
-	deleteUser(t, client, userID)
-}
-
-func listRoles(t *testing.T, client *gophercloud.ServiceClient) string {
-	var roleID string
-
-	err := roles.List(client).EachPage(func(page pagination.Page) (bool, error) {
-		roleList, err := os.ExtractRoles(page)
-		th.AssertNoErr(t, err)
-
-		for _, role := range roleList {
-			t.Logf("Listing role: ID [%s] Name [%s]", role.ID, role.Name)
-			roleID = role.ID
-		}
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-
-	return roleID
-}
-
-func addUserRole(t *testing.T, client *gophercloud.ServiceClient, userID, roleID string) {
-	err := roles.AddUserRole(client, userID, roleID).ExtractErr()
-	th.AssertNoErr(t, err)
-	t.Logf("Added role %s to user %s", roleID, userID)
-}
-
-func deleteUserRole(t *testing.T, client *gophercloud.ServiceClient, userID, roleID string) {
-	err := roles.DeleteUserRole(client, userID, roleID).ExtractErr()
-	th.AssertNoErr(t, err)
-	t.Logf("Removed role %s from user %s", roleID, userID)
-}
diff --git a/acceptance/rackspace/identity/v2/tenant_test.go b/acceptance/rackspace/identity/v2/tenant_test.go
deleted file mode 100644
index a62d149..0000000
--- a/acceptance/rackspace/identity/v2/tenant_test.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// +build acceptance
-
-package v2
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud/pagination"
-	rstenants "github.com/gophercloud/gophercloud/rackspace/identity/v2/tenants"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestTenants(t *testing.T) {
-	service := authenticatedClient(t)
-
-	t.Logf("Tenants available to the currently issued token:")
-	count := 0
-	err := rstenants.List(service, nil).EachPage(func(page pagination.Page) (bool, error) {
-		t.Logf("--- Page %02d ---", count)
-
-		tenants, err := rstenants.ExtractTenants(page)
-		th.AssertNoErr(t, err)
-
-		for i, tenant := range tenants {
-			t.Logf("[%02d]      id=[%s]", i, tenant.ID)
-			t.Logf("        name=[%s] enabled=[%v]", i, tenant.Name, tenant.Enabled)
-			t.Logf(" description=[%s]", tenant.Description)
-		}
-
-		count++
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	if count == 0 {
-		t.Errorf("No tenants listed for your current token.")
-	}
-}
diff --git a/acceptance/rackspace/identity/v2/tokens_test.go b/acceptance/rackspace/identity/v2/tokens_test.go
deleted file mode 100644
index 1ea8808..0000000
--- a/acceptance/rackspace/identity/v2/tokens_test.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// +build acceptance
-
-package v2
-
-import (
-	"os"
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/acceptance/tools"
-	"github.com/gophercloud/gophercloud/rackspace"
-	"github.com/gophercloud/gophercloud/rackspace/identity/v2/tokens"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func rackspaceAuthOptions(t *testing.T) gophercloud.AuthOptions {
-	// Obtain credentials from the environment.
-	options, err := rackspace.AuthOptionsFromEnv()
-	th.AssertNoErr(t, err)
-	options = tools.OnlyRS(options)
-
-	if options.Username == "" {
-		t.Fatal("Please provide a Rackspace username as RS_USERNAME.")
-	}
-	if options.APIKey == "" {
-		t.Fatal("Please provide a Rackspace API key as RS_API_KEY.")
-	}
-
-	return options
-}
-
-func createClient(t *testing.T, auth bool) *gophercloud.ServiceClient {
-	ao := rackspaceAuthOptions(t)
-
-	provider, err := rackspace.NewClient(ao.IdentityEndpoint)
-	th.AssertNoErr(t, err)
-
-	if auth {
-		err = rackspace.Authenticate(provider, ao)
-		th.AssertNoErr(t, err)
-	}
-
-	return rackspace.NewIdentityV2(provider)
-}
-
-func TestTokenAuth(t *testing.T) {
-	authedClient := createClient(t, true)
-	token := authedClient.TokenID
-
-	tenantID := os.Getenv("RS_TENANT_ID")
-	if tenantID == "" {
-		t.Skip("You must set RS_TENANT_ID environment variable to run this test")
-	}
-
-	authOpts := tokens.AuthOptions{}
-	authOpts.TenantID = tenantID
-	authOpts.Token = token
-
-	_, err := tokens.Create(authedClient, authOpts).ExtractToken()
-	th.AssertNoErr(t, err)
-}
diff --git a/acceptance/rackspace/identity/v2/user_test.go b/acceptance/rackspace/identity/v2/user_test.go
deleted file mode 100644
index d4c888b..0000000
--- a/acceptance/rackspace/identity/v2/user_test.go
+++ /dev/null
@@ -1,93 +0,0 @@
-// +build acceptance identity
-
-package v2
-
-import (
-	"strconv"
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/acceptance/tools"
-	os "github.com/gophercloud/gophercloud/openstack/identity/v2/users"
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/identity/v2/users"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestUsers(t *testing.T) {
-	client := authenticatedClient(t)
-
-	userID := createUser(t, client)
-
-	listUsers(t, client)
-
-	getUser(t, client, userID)
-
-	updateUser(t, client, userID)
-
-	resetApiKey(t, client, userID)
-
-	deleteUser(t, client, userID)
-}
-
-func createUser(t *testing.T, client *gophercloud.ServiceClient) string {
-	t.Log("Creating user")
-
-	opts := users.CreateOpts{
-		Username: tools.RandomString("user_", 5),
-		Enabled:  os.Disabled,
-		Email:    "new_user@foo.com",
-	}
-
-	user, err := users.Create(client, opts).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Created user %s", user.ID)
-
-	return user.ID
-}
-
-func listUsers(t *testing.T, client *gophercloud.ServiceClient) {
-	err := users.List(client).EachPage(func(page pagination.Page) (bool, error) {
-		userList, err := os.ExtractUsers(page)
-		th.AssertNoErr(t, err)
-
-		for _, user := range userList {
-			t.Logf("Listing user: ID [%s] Username [%s] Email [%s] Enabled? [%s]",
-				user.ID, user.Username, user.Email, strconv.FormatBool(user.Enabled))
-		}
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-}
-
-func getUser(t *testing.T, client *gophercloud.ServiceClient, userID string) {
-	_, err := users.Get(client, userID).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Getting user %s", userID)
-}
-
-func updateUser(t *testing.T, client *gophercloud.ServiceClient, userID string) {
-	opts := users.UpdateOpts{Username: tools.RandomString("new_name", 5), Email: "new@foo.com"}
-	user, err := users.Update(client, userID, opts).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Updated user %s: Username [%s] Email [%s]", userID, user.Username, user.Email)
-}
-
-func deleteUser(t *testing.T, client *gophercloud.ServiceClient, userID string) {
-	res := users.Delete(client, userID)
-	th.AssertNoErr(t, res.Err)
-	t.Logf("Deleted user %s", userID)
-}
-
-func resetApiKey(t *testing.T, client *gophercloud.ServiceClient, userID string) {
-	key, err := users.ResetAPIKey(client, userID).Extract()
-	th.AssertNoErr(t, err)
-
-	if key.APIKey == "" {
-		t.Fatal("failed to reset API key for user")
-	}
-
-	t.Logf("Reset API key for user %s to %s", key.Username, key.APIKey)
-}
diff --git a/acceptance/rackspace/lb/v1/acl_test.go b/acceptance/rackspace/lb/v1/acl_test.go
deleted file mode 100644
index 437b11f..0000000
--- a/acceptance/rackspace/lb/v1/acl_test.go
+++ /dev/null
@@ -1,94 +0,0 @@
-// +build acceptance lbs
-
-package v1
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/lb/v1/acl"
-	"github.com/gophercloud/gophercloud/rackspace/lb/v1/lbs"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestACL(t *testing.T) {
-	client := setup(t)
-
-	ids := createLB(t, client, 1)
-	lbID := ids[0]
-
-	createACL(t, client, lbID)
-
-	waitForLB(client, lbID, lbs.ACTIVE)
-
-	networkIDs := showACL(t, client, lbID)
-
-	deleteNetworkItem(t, client, lbID, networkIDs[0])
-	waitForLB(client, lbID, lbs.ACTIVE)
-
-	bulkDeleteACL(t, client, lbID, networkIDs[1:2])
-	waitForLB(client, lbID, lbs.ACTIVE)
-
-	deleteACL(t, client, lbID)
-	waitForLB(client, lbID, lbs.ACTIVE)
-
-	deleteLB(t, client, lbID)
-}
-
-func createACL(t *testing.T, client *gophercloud.ServiceClient, lbID int) {
-	opts := acl.CreateOpts{
-		acl.CreateOpt{Address: "206.160.163.21", Type: acl.DENY},
-		acl.CreateOpt{Address: "206.160.165.11", Type: acl.DENY},
-		acl.CreateOpt{Address: "206.160.165.12", Type: acl.DENY},
-		acl.CreateOpt{Address: "206.160.165.13", Type: acl.ALLOW},
-	}
-
-	err := acl.Create(client, lbID, opts).ExtractErr()
-	th.AssertNoErr(t, err)
-
-	t.Logf("Created ACL items for LB %d", lbID)
-}
-
-func showACL(t *testing.T, client *gophercloud.ServiceClient, lbID int) []int {
-	ids := []int{}
-
-	err := acl.List(client, lbID).EachPage(func(page pagination.Page) (bool, error) {
-		accessList, err := acl.ExtractAccessList(page)
-		th.AssertNoErr(t, err)
-
-		for _, i := range accessList {
-			t.Logf("Listing network item: ID [%s] Address [%s] Type [%s]", i.ID, i.Address, i.Type)
-			ids = append(ids, i.ID)
-		}
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-
-	return ids
-}
-
-func deleteNetworkItem(t *testing.T, client *gophercloud.ServiceClient, lbID, itemID int) {
-	err := acl.Delete(client, lbID, itemID).ExtractErr()
-
-	th.AssertNoErr(t, err)
-
-	t.Logf("Deleted network item %d", itemID)
-}
-
-func bulkDeleteACL(t *testing.T, client *gophercloud.ServiceClient, lbID int, items []int) {
-	err := acl.BulkDelete(client, lbID, items).ExtractErr()
-
-	th.AssertNoErr(t, err)
-
-	t.Logf("Deleted network items %s", intsToStr(items))
-}
-
-func deleteACL(t *testing.T, client *gophercloud.ServiceClient, lbID int) {
-	err := acl.DeleteAll(client, lbID).ExtractErr()
-
-	th.AssertNoErr(t, err)
-
-	t.Logf("Deleted ACL from LB %d", lbID)
-}
diff --git a/acceptance/rackspace/lb/v1/common.go b/acceptance/rackspace/lb/v1/common.go
deleted file mode 100644
index 1905ce8..0000000
--- a/acceptance/rackspace/lb/v1/common.go
+++ /dev/null
@@ -1,62 +0,0 @@
-// +build acceptance lbs
-
-package v1
-
-import (
-	"os"
-	"strconv"
-	"strings"
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/acceptance/tools"
-	"github.com/gophercloud/gophercloud/rackspace"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func newProvider() (*gophercloud.ProviderClient, error) {
-	opts, err := rackspace.AuthOptionsFromEnv()
-	if err != nil {
-		return nil, err
-	}
-	opts = tools.OnlyRS(opts)
-
-	return rackspace.AuthenticatedClient(opts)
-}
-
-func newClient() (*gophercloud.ServiceClient, error) {
-	provider, err := newProvider()
-	if err != nil {
-		return nil, err
-	}
-
-	return rackspace.NewLBV1(provider, gophercloud.EndpointOpts{
-		Region: os.Getenv("RS_REGION"),
-	})
-}
-
-func newComputeClient() (*gophercloud.ServiceClient, error) {
-	provider, err := newProvider()
-	if err != nil {
-		return nil, err
-	}
-
-	return rackspace.NewComputeV2(provider, gophercloud.EndpointOpts{
-		Region: os.Getenv("RS_REGION"),
-	})
-}
-
-func setup(t *testing.T) *gophercloud.ServiceClient {
-	client, err := newClient()
-	th.AssertNoErr(t, err)
-
-	return client
-}
-
-func intsToStr(ids []int) string {
-	strIDs := []string{}
-	for _, id := range ids {
-		strIDs = append(strIDs, strconv.Itoa(id))
-	}
-	return strings.Join(strIDs, ", ")
-}
diff --git a/acceptance/rackspace/lb/v1/lb_test.go b/acceptance/rackspace/lb/v1/lb_test.go
deleted file mode 100644
index be1cca5..0000000
--- a/acceptance/rackspace/lb/v1/lb_test.go
+++ /dev/null
@@ -1,214 +0,0 @@
-// +build acceptance lbs
-
-package v1
-
-import (
-	"strconv"
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/acceptance/tools"
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/lb/v1/lbs"
-	"github.com/gophercloud/gophercloud/rackspace/lb/v1/vips"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestLBs(t *testing.T) {
-	client := setup(t)
-
-	ids := createLB(t, client, 3)
-	id := ids[0]
-
-	listLBProtocols(t, client)
-
-	listLBAlgorithms(t, client)
-
-	listLBs(t, client)
-
-	getLB(t, client, id)
-
-	checkLBLogging(t, client, id)
-
-	checkErrorPage(t, client, id)
-
-	getStats(t, client, id)
-
-	updateLB(t, client, id)
-
-	deleteLB(t, client, id)
-
-	batchDeleteLBs(t, client, ids[1:])
-}
-
-func createLB(t *testing.T, client *gophercloud.ServiceClient, count int) []int {
-	ids := []int{}
-
-	for i := 0; i < count; i++ {
-		opts := lbs.CreateOpts{
-			Name:     tools.RandomString("test_", 5),
-			Port:     80,
-			Protocol: "HTTP",
-			VIPs: []vips.VIP{
-				vips.VIP{Type: vips.PUBLIC},
-			},
-		}
-
-		lb, err := lbs.Create(client, opts).Extract()
-		th.AssertNoErr(t, err)
-
-		t.Logf("Created LB %d - waiting for it to build...", lb.ID)
-		waitForLB(client, lb.ID, lbs.ACTIVE)
-		t.Logf("LB %d has reached ACTIVE state", lb.ID)
-
-		ids = append(ids, lb.ID)
-	}
-
-	return ids
-}
-
-func waitForLB(client *gophercloud.ServiceClient, id int, state lbs.Status) {
-	gophercloud.WaitFor(60, func() (bool, error) {
-		lb, err := lbs.Get(client, id).Extract()
-		if err != nil {
-			return false, err
-		}
-		if lb.Status != state {
-			return false, nil
-		}
-		return true, nil
-	})
-}
-
-func listLBProtocols(t *testing.T, client *gophercloud.ServiceClient) {
-	err := lbs.ListProtocols(client).EachPage(func(page pagination.Page) (bool, error) {
-		pList, err := lbs.ExtractProtocols(page)
-		th.AssertNoErr(t, err)
-
-		for _, p := range pList {
-			t.Logf("Listing protocol: Name [%s]", p.Name)
-		}
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-}
-
-func listLBAlgorithms(t *testing.T, client *gophercloud.ServiceClient) {
-	err := lbs.ListAlgorithms(client).EachPage(func(page pagination.Page) (bool, error) {
-		aList, err := lbs.ExtractAlgorithms(page)
-		th.AssertNoErr(t, err)
-
-		for _, a := range aList {
-			t.Logf("Listing algorithm: Name [%s]", a.Name)
-		}
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-}
-
-func listLBs(t *testing.T, client *gophercloud.ServiceClient) {
-	err := lbs.List(client, lbs.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
-		lbList, err := lbs.ExtractLBs(page)
-		th.AssertNoErr(t, err)
-
-		for _, lb := range lbList {
-			t.Logf("Listing LB: ID [%d] Name [%s] Protocol [%s] Status [%s] Node count [%d] Port [%d]",
-				lb.ID, lb.Name, lb.Protocol, lb.Status, lb.NodeCount, lb.Port)
-		}
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-}
-
-func getLB(t *testing.T, client *gophercloud.ServiceClient, id int) {
-	lb, err := lbs.Get(client, id).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Getting LB %d: Created [%s] VIPs [%#v] Logging [%#v] Persistence [%#v] SourceAddrs [%#v]",
-		lb.ID, lb.Created, lb.VIPs, lb.ConnectionLogging, lb.SessionPersistence, lb.SourceAddrs)
-}
-
-func updateLB(t *testing.T, client *gophercloud.ServiceClient, id int) {
-	opts := lbs.UpdateOpts{
-		Name:          tools.RandomString("new_", 5),
-		Protocol:      "TCP",
-		HalfClosed:    gophercloud.Enabled,
-		Algorithm:     "RANDOM",
-		Port:          8080,
-		Timeout:       100,
-		HTTPSRedirect: gophercloud.Disabled,
-	}
-
-	err := lbs.Update(client, id, opts).ExtractErr()
-	th.AssertNoErr(t, err)
-
-	t.Logf("Updating LB %d - waiting for it to finish", id)
-	waitForLB(client, id, lbs.ACTIVE)
-	t.Logf("LB %d has reached ACTIVE state", id)
-}
-
-func deleteLB(t *testing.T, client *gophercloud.ServiceClient, id int) {
-	err := lbs.Delete(client, id).ExtractErr()
-	th.AssertNoErr(t, err)
-	t.Logf("Deleted LB %d", id)
-}
-
-func batchDeleteLBs(t *testing.T, client *gophercloud.ServiceClient, ids []int) {
-	err := lbs.BulkDelete(client, ids).ExtractErr()
-	th.AssertNoErr(t, err)
-	t.Logf("Deleted LB %s", intsToStr(ids))
-}
-
-func checkLBLogging(t *testing.T, client *gophercloud.ServiceClient, id int) {
-	err := lbs.EnableLogging(client, id).ExtractErr()
-	th.AssertNoErr(t, err)
-	t.Logf("Enabled logging for LB %d", id)
-
-	res, err := lbs.IsLoggingEnabled(client, id)
-	th.AssertNoErr(t, err)
-	t.Logf("LB %d log enabled? %s", id, strconv.FormatBool(res))
-
-	waitForLB(client, id, lbs.ACTIVE)
-
-	err = lbs.DisableLogging(client, id).ExtractErr()
-	th.AssertNoErr(t, err)
-	t.Logf("Disabled logging for LB %d", id)
-}
-
-func checkErrorPage(t *testing.T, client *gophercloud.ServiceClient, id int) {
-	content, err := lbs.SetErrorPage(client, id, "<html>New content!</html>").Extract()
-	t.Logf("Set error page for LB %d", id)
-
-	content, err = lbs.GetErrorPage(client, id).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Error page for LB %d: %s", id, content)
-
-	err = lbs.DeleteErrorPage(client, id).ExtractErr()
-	t.Logf("Deleted error page for LB %d", id)
-}
-
-func getStats(t *testing.T, client *gophercloud.ServiceClient, id int) {
-	waitForLB(client, id, lbs.ACTIVE)
-
-	stats, err := lbs.GetStats(client, id).Extract()
-	th.AssertNoErr(t, err)
-
-	t.Logf("Stats for LB %d: %#v", id, stats)
-}
-
-func checkCaching(t *testing.T, client *gophercloud.ServiceClient, id int) {
-	err := lbs.EnableCaching(client, id).ExtractErr()
-	th.AssertNoErr(t, err)
-	t.Logf("Enabled caching for LB %d", id)
-
-	res, err := lbs.IsContentCached(client, id)
-	th.AssertNoErr(t, err)
-	t.Logf("Is caching enabled for LB? %s", strconv.FormatBool(res))
-
-	err = lbs.DisableCaching(client, id).ExtractErr()
-	th.AssertNoErr(t, err)
-	t.Logf("Disabled caching for LB %d", id)
-}
diff --git a/acceptance/rackspace/lb/v1/monitor_test.go b/acceptance/rackspace/lb/v1/monitor_test.go
deleted file mode 100644
index 40a670b..0000000
--- a/acceptance/rackspace/lb/v1/monitor_test.go
+++ /dev/null
@@ -1,60 +0,0 @@
-// +build acceptance lbs
-
-package v1
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/rackspace/lb/v1/lbs"
-	"github.com/gophercloud/gophercloud/rackspace/lb/v1/monitors"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestMonitors(t *testing.T) {
-	client := setup(t)
-
-	ids := createLB(t, client, 1)
-	lbID := ids[0]
-
-	getMonitor(t, client, lbID)
-
-	updateMonitor(t, client, lbID)
-
-	deleteMonitor(t, client, lbID)
-
-	deleteLB(t, client, lbID)
-}
-
-func getMonitor(t *testing.T, client *gophercloud.ServiceClient, lbID int) {
-	hm, err := monitors.Get(client, lbID).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Health monitor for LB %d: Type [%s] Delay [%d] Timeout [%d] AttemptLimit [%d]",
-		lbID, hm.Type, hm.Delay, hm.Timeout, hm.AttemptLimit)
-}
-
-func updateMonitor(t *testing.T, client *gophercloud.ServiceClient, lbID int) {
-	opts := monitors.UpdateHTTPMonitorOpts{
-		AttemptLimit: 3,
-		Delay:        10,
-		Timeout:      10,
-		BodyRegex:    "hello is it me you're looking for",
-		Path:         "/foo",
-		StatusRegex:  "200",
-		Type:         monitors.HTTP,
-	}
-
-	err := monitors.Update(client, lbID, opts).ExtractErr()
-	th.AssertNoErr(t, err)
-
-	waitForLB(client, lbID, lbs.ACTIVE)
-	t.Logf("Updated monitor for LB %d", lbID)
-}
-
-func deleteMonitor(t *testing.T, client *gophercloud.ServiceClient, lbID int) {
-	err := monitors.Delete(client, lbID).ExtractErr()
-	th.AssertNoErr(t, err)
-
-	waitForLB(client, lbID, lbs.ACTIVE)
-	t.Logf("Deleted monitor for LB %d", lbID)
-}
diff --git a/acceptance/rackspace/lb/v1/node_test.go b/acceptance/rackspace/lb/v1/node_test.go
deleted file mode 100644
index ceb242b..0000000
--- a/acceptance/rackspace/lb/v1/node_test.go
+++ /dev/null
@@ -1,175 +0,0 @@
-// +build acceptance lbs
-
-package v1
-
-import (
-	"os"
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/acceptance/tools"
-	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/diskconfig"
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/compute/v2/servers"
-	"github.com/gophercloud/gophercloud/rackspace/lb/v1/lbs"
-	"github.com/gophercloud/gophercloud/rackspace/lb/v1/nodes"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestNodes(t *testing.T) {
-	client := setup(t)
-
-	serverIP := findServer(t)
-	ids := createLB(t, client, 1)
-	lbID := ids[0]
-
-	nodeID := addNodes(t, client, lbID, serverIP)
-
-	listNodes(t, client, lbID)
-
-	getNode(t, client, lbID, nodeID)
-
-	updateNode(t, client, lbID, nodeID)
-
-	listEvents(t, client, lbID)
-
-	deleteNode(t, client, lbID, nodeID)
-
-	waitForLB(client, lbID, lbs.ACTIVE)
-	deleteLB(t, client, lbID)
-}
-
-func findServer(t *testing.T) string {
-	var serverIP string
-
-	client, err := newComputeClient()
-	th.AssertNoErr(t, err)
-
-	err = servers.List(client, nil).EachPage(func(page pagination.Page) (bool, error) {
-		sList, err := servers.ExtractServers(page)
-		th.AssertNoErr(t, err)
-
-		for _, s := range sList {
-			serverIP = s.AccessIPv4
-			t.Logf("Found an existing server: ID [%s] Public IP [%s]", s.ID, serverIP)
-			break
-		}
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-
-	if serverIP == "" {
-		t.Log("No server found, creating one")
-
-		imageRef := os.Getenv("RS_IMAGE_ID")
-		if imageRef == "" {
-			t.Fatalf("OS var RS_IMAGE_ID undefined")
-		}
-		flavorRef := os.Getenv("RS_FLAVOR_ID")
-		if flavorRef == "" {
-			t.Fatalf("OS var RS_FLAVOR_ID undefined")
-		}
-
-		opts := &servers.CreateOpts{
-			Name:       tools.RandomString("lb_test_", 5),
-			ImageRef:   imageRef,
-			FlavorRef:  flavorRef,
-			DiskConfig: diskconfig.Manual,
-		}
-
-		s, err := servers.Create(client, opts).Extract()
-		th.AssertNoErr(t, err)
-		serverIP = s.AccessIPv4
-
-		t.Logf("Created server %s, waiting for it to build", s.ID)
-		err = servers.WaitForStatus(client, s.ID, "ACTIVE", 300)
-		th.AssertNoErr(t, err)
-		t.Logf("Server created successfully.")
-	}
-
-	return serverIP
-}
-
-func addNodes(t *testing.T, client *gophercloud.ServiceClient, lbID int, serverIP string) int {
-	opts := nodes.CreateOpts{
-		nodes.CreateOpt{
-			Address:   serverIP,
-			Port:      80,
-			Condition: nodes.ENABLED,
-			Type:      nodes.PRIMARY,
-		},
-	}
-
-	page := nodes.Create(client, lbID, opts)
-
-	nodeList, err := page.ExtractNodes()
-	th.AssertNoErr(t, err)
-
-	var nodeID int
-	for _, n := range nodeList {
-		nodeID = n.ID
-	}
-	if nodeID == 0 {
-		t.Fatalf("nodeID could not be extracted from create response")
-	}
-
-	t.Logf("Added node %d to LB %d", nodeID, lbID)
-	waitForLB(client, lbID, lbs.ACTIVE)
-
-	return nodeID
-}
-
-func listNodes(t *testing.T, client *gophercloud.ServiceClient, lbID int) {
-	err := nodes.List(client, lbID, nil).EachPage(func(page pagination.Page) (bool, error) {
-		nodeList, err := nodes.ExtractNodes(page)
-		th.AssertNoErr(t, err)
-
-		for _, n := range nodeList {
-			t.Logf("Listing node: ID [%d] Address [%s:%d] Status [%s]", n.ID, n.Address, n.Port, n.Status)
-		}
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-}
-
-func getNode(t *testing.T, client *gophercloud.ServiceClient, lbID int, nodeID int) {
-	node, err := nodes.Get(client, lbID, nodeID).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Getting node %d: Type [%s] Weight [%d]", nodeID, node.Type, node.Weight)
-}
-
-func updateNode(t *testing.T, client *gophercloud.ServiceClient, lbID int, nodeID int) {
-	opts := nodes.UpdateOpts{
-		Weight:    gophercloud.IntToPointer(10),
-		Condition: nodes.DRAINING,
-		Type:      nodes.SECONDARY,
-	}
-	err := nodes.Update(client, lbID, nodeID, opts).ExtractErr()
-	th.AssertNoErr(t, err)
-	t.Logf("Updated node %d", nodeID)
-	waitForLB(client, lbID, lbs.ACTIVE)
-}
-
-func listEvents(t *testing.T, client *gophercloud.ServiceClient, lbID int) {
-	pager := nodes.ListEvents(client, lbID, nodes.ListEventsOpts{})
-	err := pager.EachPage(func(page pagination.Page) (bool, error) {
-		eventList, err := nodes.ExtractNodeEvents(page)
-		th.AssertNoErr(t, err)
-
-		for _, e := range eventList {
-			t.Logf("Listing events for node %d: Type [%s] Msg [%s] Severity [%s] Date [%s]",
-				e.NodeID, e.Type, e.DetailedMessage, e.Severity, e.Created)
-		}
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-}
-
-func deleteNode(t *testing.T, client *gophercloud.ServiceClient, lbID int, nodeID int) {
-	err := nodes.Delete(client, lbID, nodeID).ExtractErr()
-	th.AssertNoErr(t, err)
-	t.Logf("Deleted node %d", nodeID)
-}
diff --git a/acceptance/rackspace/lb/v1/session_test.go b/acceptance/rackspace/lb/v1/session_test.go
deleted file mode 100644
index 92e9ead..0000000
--- a/acceptance/rackspace/lb/v1/session_test.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// +build acceptance lbs
-
-package v1
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/rackspace/lb/v1/sessions"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestSession(t *testing.T) {
-	client := setup(t)
-
-	ids := createLB(t, client, 1)
-	lbID := ids[0]
-
-	getSession(t, client, lbID)
-
-	enableSession(t, client, lbID)
-	waitForLB(client, lbID, "ACTIVE")
-
-	disableSession(t, client, lbID)
-	waitForLB(client, lbID, "ACTIVE")
-
-	deleteLB(t, client, lbID)
-}
-
-func getSession(t *testing.T, client *gophercloud.ServiceClient, lbID int) {
-	sp, err := sessions.Get(client, lbID).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Session config: Type [%s]", sp.Type)
-}
-
-func enableSession(t *testing.T, client *gophercloud.ServiceClient, lbID int) {
-	opts := sessions.CreateOpts{Type: sessions.HTTPCOOKIE}
-	err := sessions.Enable(client, lbID, opts).ExtractErr()
-	th.AssertNoErr(t, err)
-	t.Logf("Enable %s sessions for %d", opts.Type, lbID)
-}
-
-func disableSession(t *testing.T, client *gophercloud.ServiceClient, lbID int) {
-	err := sessions.Disable(client, lbID).ExtractErr()
-	th.AssertNoErr(t, err)
-	t.Logf("Disable sessions for %d", lbID)
-}
diff --git a/acceptance/rackspace/lb/v1/throttle_test.go b/acceptance/rackspace/lb/v1/throttle_test.go
deleted file mode 100644
index 24726b8..0000000
--- a/acceptance/rackspace/lb/v1/throttle_test.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// +build acceptance lbs
-
-package v1
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/rackspace/lb/v1/throttle"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestThrottle(t *testing.T) {
-	client := setup(t)
-
-	ids := createLB(t, client, 1)
-	lbID := ids[0]
-
-	getThrottleConfig(t, client, lbID)
-
-	createThrottleConfig(t, client, lbID)
-	waitForLB(client, lbID, "ACTIVE")
-
-	deleteThrottleConfig(t, client, lbID)
-	waitForLB(client, lbID, "ACTIVE")
-
-	deleteLB(t, client, lbID)
-}
-
-func getThrottleConfig(t *testing.T, client *gophercloud.ServiceClient, lbID int) {
-	sp, err := throttle.Get(client, lbID).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Throttle config: MaxConns [%s]", sp.MaxConnections)
-}
-
-func createThrottleConfig(t *testing.T, client *gophercloud.ServiceClient, lbID int) {
-	opts := throttle.CreateOpts{
-		MaxConnections:    200,
-		MaxConnectionRate: 100,
-		MinConnections:    0,
-		RateInterval:      10,
-	}
-
-	err := throttle.Create(client, lbID, opts).ExtractErr()
-	th.AssertNoErr(t, err)
-	t.Logf("Enable throttling for %d", lbID)
-}
-
-func deleteThrottleConfig(t *testing.T, client *gophercloud.ServiceClient, lbID int) {
-	err := throttle.Delete(client, lbID).ExtractErr()
-	th.AssertNoErr(t, err)
-	t.Logf("Disable throttling for %d", lbID)
-}
diff --git a/acceptance/rackspace/lb/v1/vip_test.go b/acceptance/rackspace/lb/v1/vip_test.go
deleted file mode 100644
index edd85b8..0000000
--- a/acceptance/rackspace/lb/v1/vip_test.go
+++ /dev/null
@@ -1,83 +0,0 @@
-// +build acceptance lbs
-
-package v1
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/lb/v1/lbs"
-	"github.com/gophercloud/gophercloud/rackspace/lb/v1/vips"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestVIPs(t *testing.T) {
-	client := setup(t)
-
-	ids := createLB(t, client, 1)
-	lbID := ids[0]
-
-	listVIPs(t, client, lbID)
-
-	vipIDs := addVIPs(t, client, lbID, 3)
-
-	deleteVIP(t, client, lbID, vipIDs[0])
-
-	bulkDeleteVIPs(t, client, lbID, vipIDs[1:])
-
-	waitForLB(client, lbID, lbs.ACTIVE)
-	deleteLB(t, client, lbID)
-}
-
-func listVIPs(t *testing.T, client *gophercloud.ServiceClient, lbID int) {
-	err := vips.List(client, lbID).EachPage(func(page pagination.Page) (bool, error) {
-		vipList, err := vips.ExtractVIPs(page)
-		th.AssertNoErr(t, err)
-
-		for _, vip := range vipList {
-			t.Logf("Listing VIP: ID [%s] Address [%s] Type [%s] Version [%s]",
-				vip.ID, vip.Address, vip.Type, vip.Version)
-		}
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-}
-
-func addVIPs(t *testing.T, client *gophercloud.ServiceClient, lbID, count int) []int {
-	ids := []int{}
-
-	for i := 0; i < count; i++ {
-		opts := vips.CreateOpts{
-			Type:    vips.PUBLIC,
-			Version: vips.IPV6,
-		}
-
-		vip, err := vips.Create(client, lbID, opts).Extract()
-		th.AssertNoErr(t, err)
-
-		t.Logf("Created VIP %d", vip.ID)
-
-		waitForLB(client, lbID, lbs.ACTIVE)
-
-		ids = append(ids, vip.ID)
-	}
-
-	return ids
-}
-
-func deleteVIP(t *testing.T, client *gophercloud.ServiceClient, lbID, vipID int) {
-	err := vips.Delete(client, lbID, vipID).ExtractErr()
-	th.AssertNoErr(t, err)
-
-	t.Logf("Deleted VIP %d", vipID)
-
-	waitForLB(client, lbID, lbs.ACTIVE)
-}
-
-func bulkDeleteVIPs(t *testing.T, client *gophercloud.ServiceClient, lbID int, ids []int) {
-	err := vips.BulkDelete(client, lbID, ids).ExtractErr()
-	th.AssertNoErr(t, err)
-	t.Logf("Deleted VIPs %s", intsToStr(ids))
-}
diff --git a/acceptance/rackspace/networking/v2/common.go b/acceptance/rackspace/networking/v2/common.go
deleted file mode 100644
index 672f837..0000000
--- a/acceptance/rackspace/networking/v2/common.go
+++ /dev/null
@@ -1,39 +0,0 @@
-package v2
-
-import (
-	"os"
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/rackspace"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-var Client *gophercloud.ServiceClient
-
-func NewClient() (*gophercloud.ServiceClient, error) {
-	opts, err := rackspace.AuthOptionsFromEnv()
-	if err != nil {
-		return nil, err
-	}
-
-	provider, err := rackspace.AuthenticatedClient(opts)
-	if err != nil {
-		return nil, err
-	}
-
-	return rackspace.NewNetworkV2(provider, gophercloud.EndpointOpts{
-		Name:   "cloudNetworks",
-		Region: os.Getenv("RS_REGION"),
-	})
-}
-
-func Setup(t *testing.T) {
-	client, err := NewClient()
-	th.AssertNoErr(t, err)
-	Client = client
-}
-
-func Teardown() {
-	Client = nil
-}
diff --git a/acceptance/rackspace/networking/v2/network_test.go b/acceptance/rackspace/networking/v2/network_test.go
deleted file mode 100644
index 041a88c..0000000
--- a/acceptance/rackspace/networking/v2/network_test.go
+++ /dev/null
@@ -1,65 +0,0 @@
-// +build acceptance networking
-
-package v2
-
-import (
-	"strconv"
-	"testing"
-
-	os "github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/networking/v2/networks"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestNetworkCRUDOperations(t *testing.T) {
-	Setup(t)
-	defer Teardown()
-
-	// Create a network
-	n, err := networks.Create(Client, os.CreateOpts{Name: "sample_network", AdminStateUp: os.Up}).Extract()
-	th.AssertNoErr(t, err)
-	defer networks.Delete(Client, n.ID)
-	th.AssertEquals(t, "sample_network", n.Name)
-	th.AssertEquals(t, true, n.AdminStateUp)
-	networkID := n.ID
-
-	// List networks
-	pager := networks.List(Client, os.ListOpts{Limit: 2})
-	err = pager.EachPage(func(page pagination.Page) (bool, error) {
-		t.Logf("--- Page ---")
-
-		networkList, err := os.ExtractNetworks(page)
-		th.AssertNoErr(t, err)
-
-		for _, n := range networkList {
-			t.Logf("Network: ID [%s] Name [%s] Status [%s] Is shared? [%s]",
-				n.ID, n.Name, n.Status, strconv.FormatBool(n.Shared))
-		}
-
-		return true, nil
-	})
-	th.CheckNoErr(t, err)
-
-	// Get a network
-	if networkID == "" {
-		t.Fatalf("In order to retrieve a network, the NetworkID must be set")
-	}
-	n, err = networks.Get(Client, networkID).Extract()
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, "ACTIVE", n.Status)
-	th.AssertDeepEquals(t, []string{}, n.Subnets)
-	th.AssertEquals(t, "sample_network", n.Name)
-	th.AssertEquals(t, true, n.AdminStateUp)
-	th.AssertEquals(t, false, n.Shared)
-	th.AssertEquals(t, networkID, n.ID)
-
-	// Update network
-	n, err = networks.Update(Client, networkID, os.UpdateOpts{Name: "new_network_name"}).Extract()
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, "new_network_name", n.Name)
-
-	// Delete network
-	res := networks.Delete(Client, networkID)
-	th.AssertNoErr(t, res.Err)
-}
diff --git a/acceptance/rackspace/networking/v2/port_test.go b/acceptance/rackspace/networking/v2/port_test.go
deleted file mode 100644
index d99b797..0000000
--- a/acceptance/rackspace/networking/v2/port_test.go
+++ /dev/null
@@ -1,116 +0,0 @@
-// +build acceptance networking
-
-package v2
-
-import (
-	"testing"
-
-	osNetworks "github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
-	osPorts "github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
-	osSubnets "github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/networking/v2/networks"
-	"github.com/gophercloud/gophercloud/rackspace/networking/v2/ports"
-	"github.com/gophercloud/gophercloud/rackspace/networking/v2/subnets"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestPortCRUD(t *testing.T) {
-	Setup(t)
-	defer Teardown()
-
-	// Setup network
-	t.Log("Setting up network")
-	networkID, err := createNetwork()
-	th.AssertNoErr(t, err)
-	defer networks.Delete(Client, networkID)
-
-	// Setup subnet
-	t.Logf("Setting up subnet on network %s", networkID)
-	subnetID, err := createSubnet(networkID)
-	th.AssertNoErr(t, err)
-	defer subnets.Delete(Client, subnetID)
-
-	// Create port
-	t.Logf("Create port based on subnet %s", subnetID)
-	portID := createPort(t, networkID, subnetID)
-
-	// List ports
-	t.Logf("Listing all ports")
-	listPorts(t)
-
-	// Get port
-	if portID == "" {
-		t.Fatalf("In order to retrieve a port, the portID must be set")
-	}
-	p, err := ports.Get(Client, portID).Extract()
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, portID, p.ID)
-
-	// Update port
-	p, err = ports.Update(Client, portID, osPorts.UpdateOpts{Name: "new_port_name"}).Extract()
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, "new_port_name", p.Name)
-
-	// Delete port
-	res := ports.Delete(Client, portID)
-	th.AssertNoErr(t, res.Err)
-}
-
-func createPort(t *testing.T, networkID, subnetID string) string {
-	enable := true
-	opts := osPorts.CreateOpts{
-		NetworkID:    networkID,
-		Name:         "my_port",
-		AdminStateUp: &enable,
-		FixedIPs:     []osPorts.IP{osPorts.IP{SubnetID: subnetID}},
-	}
-	p, err := ports.Create(Client, opts).Extract()
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, networkID, p.NetworkID)
-	th.AssertEquals(t, "my_port", p.Name)
-	th.AssertEquals(t, true, p.AdminStateUp)
-
-	return p.ID
-}
-
-func listPorts(t *testing.T) {
-	count := 0
-	pager := ports.List(Client, osPorts.ListOpts{})
-	err := pager.EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		t.Logf("--- Page ---")
-
-		portList, err := osPorts.ExtractPorts(page)
-		th.AssertNoErr(t, err)
-
-		for _, p := range portList {
-			t.Logf("Port: ID [%s] Name [%s] Status [%s] MAC addr [%s] Fixed IPs [%#v] Security groups [%#v]",
-				p.ID, p.Name, p.Status, p.MACAddress, p.FixedIPs, p.SecurityGroups)
-		}
-
-		return true, nil
-	})
-
-	th.CheckNoErr(t, err)
-
-	if count == 0 {
-		t.Logf("No pages were iterated over when listing ports")
-	}
-}
-
-func createNetwork() (string, error) {
-	res, err := networks.Create(Client, osNetworks.CreateOpts{Name: "tmp_network", AdminStateUp: osNetworks.Up}).Extract()
-	return res.ID, err
-}
-
-func createSubnet(networkID string) (string, error) {
-	s, err := subnets.Create(Client, osSubnets.CreateOpts{
-		NetworkID:  networkID,
-		CIDR:       "192.168.199.0/24",
-		IPVersion:  osSubnets.IPv4,
-		Name:       "my_subnet",
-		EnableDHCP: osSubnets.Down,
-	}).Extract()
-	return s.ID, err
-}
diff --git a/acceptance/rackspace/networking/v2/security_test.go b/acceptance/rackspace/networking/v2/security_test.go
deleted file mode 100644
index a7c3e59..0000000
--- a/acceptance/rackspace/networking/v2/security_test.go
+++ /dev/null
@@ -1,165 +0,0 @@
-// +build acceptance networking security
-
-package v2
-
-import (
-	"testing"
-
-	osGroups "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups"
-	osRules "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules"
-	osNetworks "github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
-	osPorts "github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
-	"github.com/gophercloud/gophercloud/pagination"
-	rsNetworks "github.com/gophercloud/gophercloud/rackspace/networking/v2/networks"
-	rsPorts "github.com/gophercloud/gophercloud/rackspace/networking/v2/ports"
-	rsGroups "github.com/gophercloud/gophercloud/rackspace/networking/v2/security/groups"
-	rsRules "github.com/gophercloud/gophercloud/rackspace/networking/v2/security/rules"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestSecurityGroups(t *testing.T) {
-	Setup(t)
-	defer Teardown()
-
-	// create security group
-	groupID := createSecGroup(t)
-
-	// delete security group
-	defer deleteSecGroup(t, groupID)
-
-	// list security group
-	listSecGroups(t)
-
-	// get security group
-	getSecGroup(t, groupID)
-}
-
-func TestSecurityGroupRules(t *testing.T) {
-	Setup(t)
-	defer Teardown()
-
-	// create security group
-	groupID := createSecGroup(t)
-
-	defer deleteSecGroup(t, groupID)
-
-	// create security group rule
-	ruleID := createSecRule(t, groupID)
-
-	// delete security group rule
-	defer deleteSecRule(t, ruleID)
-
-	// list security group rule
-	listSecRules(t)
-
-	// get security group rule
-	getSecRule(t, ruleID)
-}
-
-func createSecGroup(t *testing.T) string {
-	sg, err := rsGroups.Create(Client, osGroups.CreateOpts{
-		Name:        "new-webservers",
-		Description: "security group for webservers",
-	}).Extract()
-
-	th.AssertNoErr(t, err)
-
-	t.Logf("Created security group %s", sg.ID)
-
-	return sg.ID
-}
-
-func listSecGroups(t *testing.T) {
-	err := rsGroups.List(Client, osGroups.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
-		list, err := osGroups.ExtractGroups(page)
-		if err != nil {
-			t.Errorf("Failed to extract secgroups: %v", err)
-			return false, err
-		}
-
-		for _, sg := range list {
-			t.Logf("Listing security group: ID [%s] Name [%s]", sg.ID, sg.Name)
-		}
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-}
-
-func getSecGroup(t *testing.T, id string) {
-	sg, err := rsGroups.Get(Client, id).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Getting security group: ID [%s] Name [%s] Description [%s]", sg.ID, sg.Name, sg.Description)
-}
-
-func createSecGroupPort(t *testing.T, groupID string) (string, string) {
-	n, err := rsNetworks.Create(Client, osNetworks.CreateOpts{Name: "tmp_network"}).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Created network %s", n.ID)
-
-	opts := osPorts.CreateOpts{
-		NetworkID:      n.ID,
-		Name:           "my_port",
-		SecurityGroups: []string{groupID},
-	}
-	p, err := rsPorts.Create(Client, opts).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Created port %s with security group %s", p.ID, groupID)
-
-	return n.ID, p.ID
-}
-
-func deleteSecGroup(t *testing.T, groupID string) {
-	res := rsGroups.Delete(Client, groupID)
-	th.AssertNoErr(t, res.Err)
-	t.Logf("Deleted security group %s", groupID)
-}
-
-func createSecRule(t *testing.T, groupID string) string {
-	r, err := rsRules.Create(Client, osRules.CreateOpts{
-		Direction:    "ingress",
-		PortRangeMin: 80,
-		EtherType:    "IPv4",
-		PortRangeMax: 80,
-		Protocol:     "tcp",
-		SecGroupID:   groupID,
-	}).Extract()
-
-	th.AssertNoErr(t, err)
-
-	t.Logf("Created security group rule %s", r.ID)
-
-	return r.ID
-}
-
-func listSecRules(t *testing.T) {
-	err := rsRules.List(Client, osRules.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
-		list, err := osRules.ExtractRules(page)
-		if err != nil {
-			t.Errorf("Failed to extract sec rules: %v", err)
-			return false, err
-		}
-
-		for _, r := range list {
-			t.Logf("Listing security rule: ID [%s]", r.ID)
-		}
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-}
-
-func getSecRule(t *testing.T, id string) {
-	r, err := rsRules.Get(Client, id).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Getting security rule: ID [%s] Direction [%s] EtherType [%s] Protocol [%s]",
-		r.ID, r.Direction, r.EtherType, r.Protocol)
-}
-
-func deleteSecRule(t *testing.T, id string) {
-	res := rsRules.Delete(Client, id)
-	th.AssertNoErr(t, res.Err)
-	t.Logf("Deleted security rule %s", id)
-}
diff --git a/acceptance/rackspace/networking/v2/subnet_test.go b/acceptance/rackspace/networking/v2/subnet_test.go
deleted file mode 100644
index 615c2fc..0000000
--- a/acceptance/rackspace/networking/v2/subnet_test.go
+++ /dev/null
@@ -1,84 +0,0 @@
-// +build acceptance networking
-
-package v2
-
-import (
-	"testing"
-
-	osNetworks "github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
-	osSubnets "github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/networking/v2/networks"
-	"github.com/gophercloud/gophercloud/rackspace/networking/v2/subnets"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestListSubnets(t *testing.T) {
-	Setup(t)
-	defer Teardown()
-
-	pager := subnets.List(Client, osSubnets.ListOpts{Limit: 2})
-	err := pager.EachPage(func(page pagination.Page) (bool, error) {
-		t.Logf("--- Page ---")
-
-		subnetList, err := osSubnets.ExtractSubnets(page)
-		th.AssertNoErr(t, err)
-
-		for _, s := range subnetList {
-			t.Logf("Subnet: ID [%s] Name [%s] IP Version [%d] CIDR [%s] GatewayIP [%s]",
-				s.ID, s.Name, s.IPVersion, s.CIDR, s.GatewayIP)
-		}
-
-		return true, nil
-	})
-	th.CheckNoErr(t, err)
-}
-
-func TestSubnetCRUD(t *testing.T) {
-	Setup(t)
-	defer Teardown()
-
-	// Setup network
-	t.Log("Setting up network")
-	n, err := networks.Create(Client, osNetworks.CreateOpts{Name: "tmp_network", AdminStateUp: osNetworks.Up}).Extract()
-	th.AssertNoErr(t, err)
-	networkID := n.ID
-	defer networks.Delete(Client, networkID)
-
-	// Create subnet
-	t.Log("Create subnet")
-	enable := false
-	opts := osSubnets.CreateOpts{
-		NetworkID:  networkID,
-		CIDR:       "192.168.199.0/24",
-		IPVersion:  osSubnets.IPv4,
-		Name:       "my_subnet",
-		EnableDHCP: &enable,
-	}
-	s, err := subnets.Create(Client, opts).Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertEquals(t, networkID, s.NetworkID)
-	th.AssertEquals(t, "192.168.199.0/24", s.CIDR)
-	th.AssertEquals(t, 4, s.IPVersion)
-	th.AssertEquals(t, "my_subnet", s.Name)
-	th.AssertEquals(t, false, s.EnableDHCP)
-	subnetID := s.ID
-
-	// Get subnet
-	t.Log("Getting subnet")
-	s, err = subnets.Get(Client, subnetID).Extract()
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, subnetID, s.ID)
-
-	// Update subnet
-	t.Log("Update subnet")
-	s, err = subnets.Update(Client, subnetID, osSubnets.UpdateOpts{Name: "new_subnet_name"}).Extract()
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, "new_subnet_name", s.Name)
-
-	// Delete subnet
-	t.Log("Delete subnet")
-	res := subnets.Delete(Client, subnetID)
-	th.AssertNoErr(t, res.Err)
-}
diff --git a/acceptance/rackspace/objectstorage/v1/accounts_test.go b/acceptance/rackspace/objectstorage/v1/accounts_test.go
deleted file mode 100644
index 2d7b8f0..0000000
--- a/acceptance/rackspace/objectstorage/v1/accounts_test.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// +build acceptance rackspace
-
-package v1
-
-import (
-	"testing"
-
-	raxAccounts "github.com/gophercloud/gophercloud/rackspace/objectstorage/v1/accounts"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestAccounts(t *testing.T) {
-	c, err := createClient(t, false)
-	th.AssertNoErr(t, err)
-
-	updateHeaders, err := raxAccounts.Update(c, raxAccounts.UpdateOpts{Metadata: map[string]string{"white": "mountains"}}).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Update Account Response Headers: %+v\n", updateHeaders)
-	defer func() {
-		updateres := raxAccounts.Update(c, raxAccounts.UpdateOpts{Metadata: map[string]string{"white": ""}})
-		th.AssertNoErr(t, updateres.Err)
-		metadata, err := raxAccounts.Get(c).ExtractMetadata()
-		th.AssertNoErr(t, err)
-		t.Logf("Metadata from Get Account request (after update reverted): %+v\n", metadata)
-		th.CheckEquals(t, metadata["White"], "")
-	}()
-
-	getResp := raxAccounts.Get(c)
-	th.AssertNoErr(t, getResp.Err)
-
-	getHeaders, _ := getResp.Extract()
-	t.Logf("Get Account Response Headers: %+v\n", getHeaders)
-
-	metadata, _ := getResp.ExtractMetadata()
-	t.Logf("Metadata from Get Account request (after update): %+v\n", metadata)
-
-	th.CheckEquals(t, metadata["White"], "mountains")
-}
diff --git a/acceptance/rackspace/objectstorage/v1/bulk_test.go b/acceptance/rackspace/objectstorage/v1/bulk_test.go
deleted file mode 100644
index 42662c1..0000000
--- a/acceptance/rackspace/objectstorage/v1/bulk_test.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// +build acceptance rackspace objectstorage v1
-
-package v1
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud/rackspace/objectstorage/v1/bulk"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestBulk(t *testing.T) {
-	c, err := createClient(t, false)
-	th.AssertNoErr(t, err)
-
-	var options bulk.DeleteOpts
-	options = append(options, "container/object1")
-	res := bulk.Delete(c, options)
-	th.AssertNoErr(t, res.Err)
-	body, err := res.ExtractBody()
-	th.AssertNoErr(t, err)
-	t.Logf("Response body from Bulk Delete Request: %+v\n", body)
-}
diff --git a/acceptance/rackspace/objectstorage/v1/cdncontainers_test.go b/acceptance/rackspace/objectstorage/v1/cdncontainers_test.go
deleted file mode 100644
index 5282db1..0000000
--- a/acceptance/rackspace/objectstorage/v1/cdncontainers_test.go
+++ /dev/null
@@ -1,66 +0,0 @@
-// +build acceptance rackspace objectstorage v1
-
-package v1
-
-import (
-	"testing"
-
-	osContainers "github.com/gophercloud/gophercloud/openstack/objectstorage/v1/containers"
-	"github.com/gophercloud/gophercloud/pagination"
-	raxCDNContainers "github.com/gophercloud/gophercloud/rackspace/objectstorage/v1/cdncontainers"
-	raxContainers "github.com/gophercloud/gophercloud/rackspace/objectstorage/v1/containers"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestCDNContainers(t *testing.T) {
-	raxClient, err := createClient(t, false)
-	th.AssertNoErr(t, err)
-
-	createres := raxContainers.Create(raxClient, "gophercloud-test", nil)
-	th.AssertNoErr(t, createres.Err)
-	t.Logf("Headers from Create Container request: %+v\n", createres.Header)
-	defer func() {
-		res := raxContainers.Delete(raxClient, "gophercloud-test")
-		th.AssertNoErr(t, res.Err)
-	}()
-
-	raxCDNClient, err := createClient(t, true)
-	th.AssertNoErr(t, err)
-	enableRes := raxCDNContainers.Enable(raxCDNClient, "gophercloud-test", raxCDNContainers.EnableOpts{CDNEnabled: true, TTL: 900})
-	t.Logf("Header map from Enable CDN Container request: %+v\n", enableRes.Header)
-	enableHeader, err := enableRes.Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Headers from Enable CDN Container request: %+v\n", enableHeader)
-
-	t.Logf("Container Names available to the currently issued token:")
-	count := 0
-	err = raxCDNContainers.List(raxCDNClient, &osContainers.ListOpts{Full: false}).EachPage(func(page pagination.Page) (bool, error) {
-		t.Logf("--- Page %02d ---", count)
-
-		names, err := raxCDNContainers.ExtractNames(page)
-		th.AssertNoErr(t, err)
-
-		for i, name := range names {
-			t.Logf("[%02d] %s", i, name)
-		}
-
-		count++
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	if count == 0 {
-		t.Errorf("No CDN containers listed for your current token.")
-	}
-
-	updateOpts := raxCDNContainers.UpdateOpts{XCDNEnabled: raxCDNContainers.Disabled, XLogRetention: raxCDNContainers.Enabled}
-	updateHeader, err := raxCDNContainers.Update(raxCDNClient, "gophercloud-test", updateOpts).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Headers from Update CDN Container request: %+v\n", updateHeader)
-
-	getRes := raxCDNContainers.Get(raxCDNClient, "gophercloud-test")
-	getHeader, err := getRes.Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Headers from Get CDN Container request (after update): %+v\n", getHeader)
-	metadata, err := getRes.ExtractMetadata()
-	t.Logf("Metadata from Get CDN Container request (after update): %+v\n", metadata)
-}
diff --git a/acceptance/rackspace/objectstorage/v1/cdnobjects_test.go b/acceptance/rackspace/objectstorage/v1/cdnobjects_test.go
deleted file mode 100644
index 6c13140..0000000
--- a/acceptance/rackspace/objectstorage/v1/cdnobjects_test.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// +build acceptance rackspace objectstorage v1
-
-package v1
-
-import (
-	"bytes"
-	"testing"
-
-	raxCDNContainers "github.com/gophercloud/gophercloud/rackspace/objectstorage/v1/cdncontainers"
-	raxCDNObjects "github.com/gophercloud/gophercloud/rackspace/objectstorage/v1/cdnobjects"
-	raxContainers "github.com/gophercloud/gophercloud/rackspace/objectstorage/v1/containers"
-	raxObjects "github.com/gophercloud/gophercloud/rackspace/objectstorage/v1/objects"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestCDNObjects(t *testing.T) {
-	raxClient, err := createClient(t, false)
-	th.AssertNoErr(t, err)
-
-	createContResult := raxContainers.Create(raxClient, "gophercloud-test", nil)
-	th.AssertNoErr(t, createContResult.Err)
-	t.Logf("Headers from Create Container request: %+v\n", createContResult.Header)
-	defer func() {
-		deleteResult := raxContainers.Delete(raxClient, "gophercloud-test")
-		th.AssertNoErr(t, deleteResult.Err)
-	}()
-
-	header, err := raxObjects.Create(raxClient, "gophercloud-test", "test-object", bytes.NewBufferString("gophercloud cdn test"), nil).ExtractHeader()
-	th.AssertNoErr(t, err)
-	t.Logf("Headers from Create Object request: %+v\n", header)
-	defer func() {
-		deleteResult := raxObjects.Delete(raxClient, "gophercloud-test", "test-object", nil)
-		th.AssertNoErr(t, deleteResult.Err)
-	}()
-
-	raxCDNClient, err := createClient(t, true)
-	th.AssertNoErr(t, err)
-
-	enableHeader, err := raxCDNContainers.Enable(raxCDNClient, "gophercloud-test", raxCDNContainers.EnableOpts{CDNEnabled: true, TTL: 900}).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Headers from Enable CDN Container request: %+v\n", enableHeader)
-
-	objCDNURL, err := raxCDNObjects.CDNURL(raxCDNClient, "gophercloud-test", "test-object")
-	th.AssertNoErr(t, err)
-	t.Logf("%s CDN URL: %s\n", "test_object", objCDNURL)
-
-	deleteHeader, err := raxCDNObjects.Delete(raxCDNClient, "gophercloud-test", "test-object", nil).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Headers from Delete CDN Object request: %+v\n", deleteHeader)
-}
diff --git a/acceptance/rackspace/objectstorage/v1/common.go b/acceptance/rackspace/objectstorage/v1/common.go
deleted file mode 100644
index 7d46713..0000000
--- a/acceptance/rackspace/objectstorage/v1/common.go
+++ /dev/null
@@ -1,54 +0,0 @@
-// +build acceptance rackspace objectstorage v1
-
-package v1
-
-import (
-	"os"
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/acceptance/tools"
-	"github.com/gophercloud/gophercloud/rackspace"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func rackspaceAuthOptions(t *testing.T) gophercloud.AuthOptions {
-	// Obtain credentials from the environment.
-	options, err := rackspace.AuthOptionsFromEnv()
-	th.AssertNoErr(t, err)
-	options = tools.OnlyRS(options)
-
-	if options.Username == "" {
-		t.Fatal("Please provide a Rackspace username as RS_USERNAME.")
-	}
-	if options.APIKey == "" {
-		t.Fatal("Please provide a Rackspace API key as RS_API_KEY.")
-	}
-
-	return options
-}
-
-func createClient(t *testing.T, cdn bool) (*gophercloud.ServiceClient, error) {
-	region := os.Getenv("RS_REGION")
-	if region == "" {
-		t.Fatal("Please provide a Rackspace region as RS_REGION")
-	}
-
-	ao := rackspaceAuthOptions(t)
-
-	provider, err := rackspace.NewClient(ao.IdentityEndpoint)
-	th.AssertNoErr(t, err)
-
-	err = rackspace.Authenticate(provider, ao)
-	th.AssertNoErr(t, err)
-
-	if cdn {
-		return rackspace.NewObjectCDNV1(provider, gophercloud.EndpointOpts{
-			Region: region,
-		})
-	}
-
-	return rackspace.NewObjectStorageV1(provider, gophercloud.EndpointOpts{
-		Region: region,
-	})
-}
diff --git a/acceptance/rackspace/objectstorage/v1/containers_test.go b/acceptance/rackspace/objectstorage/v1/containers_test.go
deleted file mode 100644
index bc6105f..0000000
--- a/acceptance/rackspace/objectstorage/v1/containers_test.go
+++ /dev/null
@@ -1,90 +0,0 @@
-// +build acceptance rackspace objectstorage v1
-
-package v1
-
-import (
-	"testing"
-
-	osContainers "github.com/gophercloud/gophercloud/openstack/objectstorage/v1/containers"
-	"github.com/gophercloud/gophercloud/pagination"
-	raxContainers "github.com/gophercloud/gophercloud/rackspace/objectstorage/v1/containers"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestContainers(t *testing.T) {
-	c, err := createClient(t, false)
-	th.AssertNoErr(t, err)
-
-	t.Logf("Containers Info available to the currently issued token:")
-	count := 0
-	err = raxContainers.List(c, &osContainers.ListOpts{Full: true}).EachPage(func(page pagination.Page) (bool, error) {
-		t.Logf("--- Page %02d ---", count)
-
-		containers, err := raxContainers.ExtractInfo(page)
-		th.AssertNoErr(t, err)
-
-		for i, container := range containers {
-			t.Logf("[%02d]      name=[%s]", i, container.Name)
-			t.Logf("            count=[%d]", container.Count)
-			t.Logf("            bytes=[%d]", container.Bytes)
-		}
-
-		count++
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	if count == 0 {
-		t.Errorf("No containers listed for your current token.")
-	}
-
-	t.Logf("Container Names available to the currently issued token:")
-	count = 0
-	err = raxContainers.List(c, &osContainers.ListOpts{Full: false}).EachPage(func(page pagination.Page) (bool, error) {
-		t.Logf("--- Page %02d ---", count)
-
-		names, err := raxContainers.ExtractNames(page)
-		th.AssertNoErr(t, err)
-
-		for i, name := range names {
-			t.Logf("[%02d] %s", i, name)
-		}
-
-		count++
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	if count == 0 {
-		t.Errorf("No containers listed for your current token.")
-	}
-
-	createHeader, err := raxContainers.Create(c, "gophercloud-test", nil).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Headers from Create Container request: %+v\n", createHeader)
-	defer func() {
-		deleteres := raxContainers.Delete(c, "gophercloud-test")
-		deleteHeader, err := deleteres.Extract()
-		th.AssertNoErr(t, err)
-		t.Logf("Headers from Delete Container request: %+v\n", deleteres.Header)
-		t.Logf("Headers from Delete Container request: %+v\n", deleteHeader)
-	}()
-
-	updateHeader, err := raxContainers.Update(c, "gophercloud-test", raxContainers.UpdateOpts{Metadata: map[string]string{"white": "mountains"}}).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Headers from Update Container request: %+v\n", updateHeader)
-	defer func() {
-		res := raxContainers.Update(c, "gophercloud-test", raxContainers.UpdateOpts{Metadata: map[string]string{"white": ""}})
-		th.AssertNoErr(t, res.Err)
-		metadata, err := raxContainers.Get(c, "gophercloud-test").ExtractMetadata()
-		th.AssertNoErr(t, err)
-		t.Logf("Metadata from Get Container request (after update reverted): %+v\n", metadata)
-		th.CheckEquals(t, metadata["White"], "")
-	}()
-
-	getres := raxContainers.Get(c, "gophercloud-test")
-	getHeader, err := getres.Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Headers from Get Container request (after update): %+v\n", getHeader)
-	metadata, err := getres.ExtractMetadata()
-	t.Logf("Metadata from Get Container request (after update): %+v\n", metadata)
-	th.CheckEquals(t, metadata["White"], "mountains")
-}
diff --git a/acceptance/rackspace/objectstorage/v1/objects_test.go b/acceptance/rackspace/objectstorage/v1/objects_test.go
deleted file mode 100644
index fc92c66..0000000
--- a/acceptance/rackspace/objectstorage/v1/objects_test.go
+++ /dev/null
@@ -1,124 +0,0 @@
-// +build acceptance rackspace objectstorage v1
-
-package v1
-
-import (
-	"bytes"
-	"testing"
-
-	osObjects "github.com/gophercloud/gophercloud/openstack/objectstorage/v1/objects"
-	"github.com/gophercloud/gophercloud/pagination"
-	raxContainers "github.com/gophercloud/gophercloud/rackspace/objectstorage/v1/containers"
-	raxObjects "github.com/gophercloud/gophercloud/rackspace/objectstorage/v1/objects"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestObjects(t *testing.T) {
-	c, err := createClient(t, false)
-	th.AssertNoErr(t, err)
-
-	res := raxContainers.Create(c, "gophercloud-test", nil)
-	th.AssertNoErr(t, res.Err)
-
-	defer func() {
-		t.Logf("Deleting container...")
-		res := raxContainers.Delete(c, "gophercloud-test")
-		th.AssertNoErr(t, res.Err)
-	}()
-
-	content := bytes.NewBufferString("Lewis Carroll")
-	options := &osObjects.CreateOpts{ContentType: "text/plain"}
-	createres := raxObjects.Create(c, "gophercloud-test", "o1", content, options)
-	th.AssertNoErr(t, createres.Err)
-
-	defer func() {
-		t.Logf("Deleting object o1...")
-		res := raxObjects.Delete(c, "gophercloud-test", "o1", nil)
-		th.AssertNoErr(t, res.Err)
-	}()
-
-	t.Logf("Objects Info available to the currently issued token:")
-	count := 0
-	err = raxObjects.List(c, "gophercloud-test", &osObjects.ListOpts{Full: true}).EachPage(func(page pagination.Page) (bool, error) {
-		t.Logf("--- Page %02d ---", count)
-
-		objects, err := raxObjects.ExtractInfo(page)
-		th.AssertNoErr(t, err)
-
-		for i, object := range objects {
-			t.Logf("[%02d]      name=[%s]", i, object.Name)
-			t.Logf("            content-type=[%s]", object.ContentType)
-			t.Logf("            bytes=[%d]", object.Bytes)
-			t.Logf("            last-modified=[%s]", object.LastModified)
-			t.Logf("            hash=[%s]", object.Hash)
-		}
-
-		count++
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	if count == 0 {
-		t.Errorf("No objects listed for your current token.")
-	}
-	t.Logf("Container Names available to the currently issued token:")
-	count = 0
-	err = raxObjects.List(c, "gophercloud-test", &osObjects.ListOpts{Full: false}).EachPage(func(page pagination.Page) (bool, error) {
-		t.Logf("--- Page %02d ---", count)
-
-		names, err := raxObjects.ExtractNames(page)
-		th.AssertNoErr(t, err)
-
-		for i, name := range names {
-			t.Logf("[%02d] %s", i, name)
-		}
-
-		count++
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	if count == 0 {
-		t.Errorf("No objects listed for your current token.")
-	}
-
-	copyres := raxObjects.Copy(c, "gophercloud-test", "o1", &raxObjects.CopyOpts{Destination: "gophercloud-test/o2"})
-	th.AssertNoErr(t, copyres.Err)
-	defer func() {
-		t.Logf("Deleting object o2...")
-		res := raxObjects.Delete(c, "gophercloud-test", "o2", nil)
-		th.AssertNoErr(t, res.Err)
-	}()
-
-	o1Content, err := raxObjects.Download(c, "gophercloud-test", "o1", nil).ExtractContent()
-	th.AssertNoErr(t, err)
-	o2Content, err := raxObjects.Download(c, "gophercloud-test", "o2", nil).ExtractContent()
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, string(o2Content), string(o1Content))
-
-	updateres := raxObjects.Update(c, "gophercloud-test", "o2", osObjects.UpdateOpts{Metadata: map[string]string{"white": "mountains"}})
-	th.AssertNoErr(t, updateres.Err)
-	t.Logf("Headers from Update Account request: %+v\n", updateres.Header)
-	defer func() {
-		res := raxObjects.Update(c, "gophercloud-test", "o2", osObjects.UpdateOpts{Metadata: map[string]string{"white": ""}})
-		th.AssertNoErr(t, res.Err)
-		metadata, err := raxObjects.Get(c, "gophercloud-test", "o2", nil).ExtractMetadata()
-		th.AssertNoErr(t, err)
-		t.Logf("Metadata from Get Account request (after update reverted): %+v\n", metadata)
-		th.CheckEquals(t, "", metadata["White"])
-	}()
-
-	getres := raxObjects.Get(c, "gophercloud-test", "o2", nil)
-	th.AssertNoErr(t, getres.Err)
-	t.Logf("Headers from Get Account request (after update): %+v\n", getres.Header)
-	metadata, err := getres.ExtractMetadata()
-	th.AssertNoErr(t, err)
-	t.Logf("Metadata from Get Account request (after update): %+v\n", metadata)
-	th.CheckEquals(t, "mountains", metadata["White"])
-
-	createTempURLOpts := osObjects.CreateTempURLOpts{
-		Method: osObjects.GET,
-		TTL:    600,
-	}
-	tempURL, err := raxObjects.CreateTempURL(c, "gophercloud-test", "o1", createTempURLOpts)
-	th.AssertNoErr(t, err)
-	t.Logf("TempURL for object (%s): %s", "o1", tempURL)
-}
diff --git a/acceptance/rackspace/orchestration/v1/buildinfo_test.go b/acceptance/rackspace/orchestration/v1/buildinfo_test.go
deleted file mode 100644
index 81e19ea..0000000
--- a/acceptance/rackspace/orchestration/v1/buildinfo_test.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// +build acceptance
-
-package v1
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud/rackspace/orchestration/v1/buildinfo"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestBuildInfo(t *testing.T) {
-	// Create a provider client for making the HTTP requests.
-	// See common.go in this directory for more information.
-	client := newClient(t)
-
-	bi, err := buildinfo.Get(client).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("retrieved build info: %+v\n", bi)
-}
diff --git a/acceptance/rackspace/orchestration/v1/common.go b/acceptance/rackspace/orchestration/v1/common.go
deleted file mode 100644
index a8a8045..0000000
--- a/acceptance/rackspace/orchestration/v1/common.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// +build acceptance
-
-package v1
-
-import (
-	"fmt"
-	"os"
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/rackspace"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-var template = fmt.Sprintf(`
-{
-		"heat_template_version": "2013-05-23",
-		"description": "Simple template to test heat commands",
-		"parameters": {},
-		"resources": {
-				"hello_world": {
-						"type":"OS::Nova::Server",
-						"properties": {
-								"flavor": "%s",
-								"image": "%s",
-								"user_data": "#!/bin/bash -xv\necho \"hello world\" &gt; /root/hello-world.txt\n"
-						}
-				}
-		}
-}
-`, os.Getenv("RS_FLAVOR_ID"), os.Getenv("RS_IMAGE_ID"))
-
-func newClient(t *testing.T) *gophercloud.ServiceClient {
-	ao, err := rackspace.AuthOptionsFromEnv()
-	th.AssertNoErr(t, err)
-
-	client, err := rackspace.AuthenticatedClient(ao)
-	th.AssertNoErr(t, err)
-
-	c, err := rackspace.NewOrchestrationV1(client, gophercloud.EndpointOpts{
-		Region: os.Getenv("RS_REGION_NAME"),
-	})
-	th.AssertNoErr(t, err)
-	return c
-}
diff --git a/acceptance/rackspace/orchestration/v1/stackevents_test.go b/acceptance/rackspace/orchestration/v1/stackevents_test.go
deleted file mode 100644
index b3e3bb9..0000000
--- a/acceptance/rackspace/orchestration/v1/stackevents_test.go
+++ /dev/null
@@ -1,70 +0,0 @@
-// +build acceptance
-
-package v1
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	osStackEvents "github.com/gophercloud/gophercloud/openstack/orchestration/v1/stackevents"
-	osStacks "github.com/gophercloud/gophercloud/openstack/orchestration/v1/stacks"
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/orchestration/v1/stackevents"
-	"github.com/gophercloud/gophercloud/rackspace/orchestration/v1/stacks"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestStackEvents(t *testing.T) {
-	// Create a provider client for making the HTTP requests.
-	// See common.go in this directory for more information.
-	client := newClient(t)
-
-	stackName := "postman_stack_2"
-	resourceName := "hello_world"
-	var eventID string
-
-	createOpts := osStacks.CreateOpts{
-		Name:     stackName,
-		Template: template,
-		Timeout:  5,
-	}
-	stack, err := stacks.Create(client, createOpts).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Created stack: %+v\n", stack)
-	defer func() {
-		err := stacks.Delete(client, stackName, stack.ID).ExtractErr()
-		th.AssertNoErr(t, err)
-		t.Logf("Deleted stack (%s)", stackName)
-	}()
-	err = gophercloud.WaitFor(60, func() (bool, error) {
-		getStack, err := stacks.Get(client, stackName, stack.ID).Extract()
-		if err != nil {
-			return false, err
-		}
-		if getStack.Status == "CREATE_COMPLETE" {
-			return true, nil
-		}
-		return false, nil
-	})
-
-	err = stackevents.List(client, stackName, stack.ID, nil).EachPage(func(page pagination.Page) (bool, error) {
-		events, err := osStackEvents.ExtractEvents(page)
-		th.AssertNoErr(t, err)
-		t.Logf("listed events: %+v\n", events)
-		eventID = events[0].ID
-		return false, nil
-	})
-	th.AssertNoErr(t, err)
-
-	err = stackevents.ListResourceEvents(client, stackName, stack.ID, resourceName, nil).EachPage(func(page pagination.Page) (bool, error) {
-		resourceEvents, err := osStackEvents.ExtractResourceEvents(page)
-		th.AssertNoErr(t, err)
-		t.Logf("listed resource events: %+v\n", resourceEvents)
-		return false, nil
-	})
-	th.AssertNoErr(t, err)
-
-	event, err := stackevents.Get(client, stackName, stack.ID, resourceName, eventID).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("retrieved event: %+v\n", event)
-}
diff --git a/acceptance/rackspace/orchestration/v1/stackresources_test.go b/acceptance/rackspace/orchestration/v1/stackresources_test.go
deleted file mode 100644
index 64c379c..0000000
--- a/acceptance/rackspace/orchestration/v1/stackresources_test.go
+++ /dev/null
@@ -1,64 +0,0 @@
-// +build acceptance
-
-package v1
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	osStackResources "github.com/gophercloud/gophercloud/openstack/orchestration/v1/stackresources"
-	osStacks "github.com/gophercloud/gophercloud/openstack/orchestration/v1/stacks"
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/orchestration/v1/stackresources"
-	"github.com/gophercloud/gophercloud/rackspace/orchestration/v1/stacks"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestStackResources(t *testing.T) {
-	// Create a provider client for making the HTTP requests.
-	// See common.go in this directory for more information.
-	client := newClient(t)
-
-	stackName := "postman_stack_2"
-
-	createOpts := osStacks.CreateOpts{
-		Name:     stackName,
-		Template: template,
-		Timeout:  5,
-	}
-	stack, err := stacks.Create(client, createOpts).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Created stack: %+v\n", stack)
-	defer func() {
-		err := stacks.Delete(client, stackName, stack.ID).ExtractErr()
-		th.AssertNoErr(t, err)
-		t.Logf("Deleted stack (%s)", stackName)
-	}()
-	err = gophercloud.WaitFor(60, func() (bool, error) {
-		getStack, err := stacks.Get(client, stackName, stack.ID).Extract()
-		if err != nil {
-			return false, err
-		}
-		if getStack.Status == "CREATE_COMPLETE" {
-			return true, nil
-		}
-		return false, nil
-	})
-
-	resourceName := "hello_world"
-	resource, err := stackresources.Get(client, stackName, stack.ID, resourceName).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Got stack resource: %+v\n", resource)
-
-	metadata, err := stackresources.Metadata(client, stackName, stack.ID, resourceName).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Got stack resource metadata: %+v\n", metadata)
-
-	err = stackresources.List(client, stackName, stack.ID, nil).EachPage(func(page pagination.Page) (bool, error) {
-		resources, err := osStackResources.ExtractResources(page)
-		th.AssertNoErr(t, err)
-		t.Logf("resources: %+v\n", resources)
-		return false, nil
-	})
-	th.AssertNoErr(t, err)
-}
diff --git a/acceptance/rackspace/orchestration/v1/stacks_test.go b/acceptance/rackspace/orchestration/v1/stacks_test.go
deleted file mode 100644
index 57afb3a..0000000
--- a/acceptance/rackspace/orchestration/v1/stacks_test.go
+++ /dev/null
@@ -1,154 +0,0 @@
-// +build acceptance
-
-package v1
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	osStacks "github.com/gophercloud/gophercloud/openstack/orchestration/v1/stacks"
-	"github.com/gophercloud/gophercloud/pagination"
-	"github.com/gophercloud/gophercloud/rackspace/orchestration/v1/stacks"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestStacks(t *testing.T) {
-	// Create a provider client for making the HTTP requests.
-	// See common.go in this directory for more information.
-	client := newClient(t)
-
-	stackName1 := "gophercloud-test-stack-2"
-	createOpts := osStacks.CreateOpts{
-		Name:     stackName1,
-		Template: template,
-		Timeout:  5,
-	}
-	stack, err := stacks.Create(client, createOpts).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Created stack: %+v\n", stack)
-	defer func() {
-		err := stacks.Delete(client, stackName1, stack.ID).ExtractErr()
-		th.AssertNoErr(t, err)
-		t.Logf("Deleted stack (%s)", stackName1)
-	}()
-	err = gophercloud.WaitFor(60, func() (bool, error) {
-		getStack, err := stacks.Get(client, stackName1, stack.ID).Extract()
-		if err != nil {
-			return false, err
-		}
-		if getStack.Status == "CREATE_COMPLETE" {
-			return true, nil
-		}
-		return false, nil
-	})
-
-	updateOpts := osStacks.UpdateOpts{
-		Template: template,
-		Timeout:  20,
-	}
-	err = stacks.Update(client, stackName1, stack.ID, updateOpts).ExtractErr()
-	th.AssertNoErr(t, err)
-	err = gophercloud.WaitFor(60, func() (bool, error) {
-		getStack, err := stacks.Get(client, stackName1, stack.ID).Extract()
-		if err != nil {
-			return false, err
-		}
-		if getStack.Status == "UPDATE_COMPLETE" {
-			return true, nil
-		}
-		return false, nil
-	})
-
-	t.Logf("Updated stack")
-
-	err = stacks.List(client, nil).EachPage(func(page pagination.Page) (bool, error) {
-		stackList, err := osStacks.ExtractStacks(page)
-		th.AssertNoErr(t, err)
-
-		t.Logf("Got stack list: %+v\n", stackList)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-
-	getStack, err := stacks.Get(client, stackName1, stack.ID).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Got stack: %+v\n", getStack)
-
-	abandonedStack, err := stacks.Abandon(client, stackName1, stack.ID).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Abandonded stack %+v\n", abandonedStack)
-	th.AssertNoErr(t, err)
-}
-
-// Test using the updated interface
-func TestStacksNewTemplateFormat(t *testing.T) {
-	// Create a provider client for making the HTTP requests.
-	// See common.go in this directory for more information.
-	client := newClient(t)
-
-	stackName1 := "gophercloud-test-stack-2"
-	templateOpts := new(osStacks.Template)
-	templateOpts.Bin = []byte(template)
-	createOpts := osStacks.CreateOpts{
-		Name:         stackName1,
-		TemplateOpts: templateOpts,
-		Timeout:      5,
-	}
-	stack, err := stacks.Create(client, createOpts).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Created stack: %+v\n", stack)
-	defer func() {
-		err := stacks.Delete(client, stackName1, stack.ID).ExtractErr()
-		th.AssertNoErr(t, err)
-		t.Logf("Deleted stack (%s)", stackName1)
-	}()
-	err = gophercloud.WaitFor(60, func() (bool, error) {
-		getStack, err := stacks.Get(client, stackName1, stack.ID).Extract()
-		if err != nil {
-			return false, err
-		}
-		if getStack.Status == "CREATE_COMPLETE" {
-			return true, nil
-		}
-		return false, nil
-	})
-
-	updateOpts := osStacks.UpdateOpts{
-		TemplateOpts: templateOpts,
-		Timeout:      20,
-	}
-	err = stacks.Update(client, stackName1, stack.ID, updateOpts).ExtractErr()
-	th.AssertNoErr(t, err)
-	err = gophercloud.WaitFor(60, func() (bool, error) {
-		getStack, err := stacks.Get(client, stackName1, stack.ID).Extract()
-		if err != nil {
-			return false, err
-		}
-		if getStack.Status == "UPDATE_COMPLETE" {
-			return true, nil
-		}
-		return false, nil
-	})
-
-	t.Logf("Updated stack")
-
-	err = stacks.List(client, nil).EachPage(func(page pagination.Page) (bool, error) {
-		stackList, err := osStacks.ExtractStacks(page)
-		th.AssertNoErr(t, err)
-
-		t.Logf("Got stack list: %+v\n", stackList)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-
-	getStack, err := stacks.Get(client, stackName1, stack.ID).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Got stack: %+v\n", getStack)
-
-	abandonedStack, err := stacks.Abandon(client, stackName1, stack.ID).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Abandonded stack %+v\n", abandonedStack)
-	th.AssertNoErr(t, err)
-}
diff --git a/acceptance/rackspace/orchestration/v1/stacktemplates_test.go b/acceptance/rackspace/orchestration/v1/stacktemplates_test.go
deleted file mode 100644
index 4f8dee2..0000000
--- a/acceptance/rackspace/orchestration/v1/stacktemplates_test.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// +build acceptance
-
-package v1
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	osStacks "github.com/gophercloud/gophercloud/openstack/orchestration/v1/stacks"
-	osStacktemplates "github.com/gophercloud/gophercloud/openstack/orchestration/v1/stacktemplates"
-	"github.com/gophercloud/gophercloud/rackspace/orchestration/v1/stacks"
-	"github.com/gophercloud/gophercloud/rackspace/orchestration/v1/stacktemplates"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestStackTemplates(t *testing.T) {
-	// Create a provider client for making the HTTP requests.
-	// See common.go in this directory for more information.
-	client := newClient(t)
-
-	stackName := "postman_stack_2"
-
-	createOpts := osStacks.CreateOpts{
-		Name:     stackName,
-		Template: template,
-		Timeout:  5,
-	}
-	stack, err := stacks.Create(client, createOpts).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("Created stack: %+v\n", stack)
-	defer func() {
-		err := stacks.Delete(client, stackName, stack.ID).ExtractErr()
-		th.AssertNoErr(t, err)
-		t.Logf("Deleted stack (%s)", stackName)
-	}()
-	err = gophercloud.WaitFor(60, func() (bool, error) {
-		getStack, err := stacks.Get(client, stackName, stack.ID).Extract()
-		if err != nil {
-			return false, err
-		}
-		if getStack.Status == "CREATE_COMPLETE" {
-			return true, nil
-		}
-		return false, nil
-	})
-
-	tmpl, err := stacktemplates.Get(client, stackName, stack.ID).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("retrieved template: %+v\n", tmpl)
-
-	validateOpts := osStacktemplates.ValidateOpts{
-		Template: `{"heat_template_version": "2013-05-23",
-			"description":           "Simple template to test heat commands",
-			"parameters": {
-				"flavor": {
-					"default": "m1.tiny",
-					"type":    "string",
-				},
-			},
-			"resources": {
-				"hello_world": {
-					"type": "OS::Nova::Server",
-					"properties": {
-						"key_name": "heat_key",
-						"flavor": {
-							"get_param": "flavor",
-						},
-						"image":     "ad091b52-742f-469e-8f3c-fd81cadf0743",
-						"user_data": "#!/bin/bash -xv\necho \"hello world\" &gt; /root/hello-world.txt\n",
-					},
-				},
-			},
-		}`}
-	validatedTemplate, err := stacktemplates.Validate(client, validateOpts).Extract()
-	th.AssertNoErr(t, err)
-	t.Logf("validated template: %+v\n", validatedTemplate)
-}
diff --git a/acceptance/rackspace/pkg.go b/acceptance/rackspace/pkg.go
deleted file mode 100644
index 5d17b32..0000000
--- a/acceptance/rackspace/pkg.go
+++ /dev/null
@@ -1 +0,0 @@
-package rackspace
diff --git a/acceptance/rackspace/rackconnect/v3/cloudnetworks_test.go b/acceptance/rackspace/rackconnect/v3/cloudnetworks_test.go
deleted file mode 100644
index 2574406..0000000
--- a/acceptance/rackspace/rackconnect/v3/cloudnetworks_test.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// +build acceptance
-
-package v3
-
-import (
-	"fmt"
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/rackspace/rackconnect/v3/cloudnetworks"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestCloudNetworks(t *testing.T) {
-	c := newClient(t)
-	cnID := testListNetworks(t, c)
-	testGetNetworks(t, c, cnID)
-}
-
-func testListNetworks(t *testing.T, c *gophercloud.ServiceClient) string {
-	allPages, err := cloudnetworks.List(c).AllPages()
-	th.AssertNoErr(t, err)
-	allcn, err := cloudnetworks.ExtractCloudNetworks(allPages)
-	fmt.Printf("Listing all cloud networks: %+v\n\n", allcn)
-	var cnID string
-	if len(allcn) > 0 {
-		cnID = allcn[0].ID
-	}
-	return cnID
-}
-
-func testGetNetworks(t *testing.T, c *gophercloud.ServiceClient, id string) {
-	cn, err := cloudnetworks.Get(c, id).Extract()
-	th.AssertNoErr(t, err)
-	fmt.Printf("Retrieved cloud network: %+v\n\n", cn)
-}
diff --git a/acceptance/rackspace/rackconnect/v3/common.go b/acceptance/rackspace/rackconnect/v3/common.go
deleted file mode 100644
index 35ba379..0000000
--- a/acceptance/rackspace/rackconnect/v3/common.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// +build acceptance
-
-package v3
-
-import (
-	"os"
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/rackspace"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func newClient(t *testing.T) *gophercloud.ServiceClient {
-	ao, err := rackspace.AuthOptionsFromEnv()
-	th.AssertNoErr(t, err)
-
-	client, err := rackspace.AuthenticatedClient(ao)
-	th.AssertNoErr(t, err)
-
-	c, err := rackspace.NewRackConnectV3(client, gophercloud.EndpointOpts{
-		Region: os.Getenv("RS_REGION_NAME"),
-	})
-	th.AssertNoErr(t, err)
-	return c
-}
diff --git a/acceptance/rackspace/rackconnect/v3/lbpools_test.go b/acceptance/rackspace/rackconnect/v3/lbpools_test.go
deleted file mode 100644
index c110b64..0000000
--- a/acceptance/rackspace/rackconnect/v3/lbpools_test.go
+++ /dev/null
@@ -1,71 +0,0 @@
-// +build acceptance
-
-package v3
-
-import (
-	"fmt"
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/rackspace/rackconnect/v3/lbpools"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestLBPools(t *testing.T) {
-	c := newClient(t)
-	pID := testListPools(t, c)
-	testGetPools(t, c, pID)
-	nID := testListNodes(t, c, pID)
-	testListNodeDetails(t, c, pID)
-	testGetNode(t, c, pID, nID)
-	testGetNodeDetails(t, c, pID, nID)
-}
-
-func testListPools(t *testing.T, c *gophercloud.ServiceClient) string {
-	allPages, err := lbpools.List(c).AllPages()
-	th.AssertNoErr(t, err)
-	allp, err := lbpools.ExtractPools(allPages)
-	fmt.Printf("Listing all LB pools: %+v\n\n", allp)
-	var pID string
-	if len(allp) > 0 {
-		pID = allp[0].ID
-	}
-	return pID
-}
-
-func testGetPools(t *testing.T, c *gophercloud.ServiceClient, pID string) {
-	p, err := lbpools.Get(c, pID).Extract()
-	th.AssertNoErr(t, err)
-	fmt.Printf("Retrieved LB pool: %+v\n\n", p)
-}
-
-func testListNodes(t *testing.T, c *gophercloud.ServiceClient, pID string) string {
-	allPages, err := lbpools.ListNodes(c, pID).AllPages()
-	th.AssertNoErr(t, err)
-	alln, err := lbpools.ExtractNodes(allPages)
-	fmt.Printf("Listing all LB pool nodes for pool (%s): %+v\n\n", pID, alln)
-	var nID string
-	if len(alln) > 0 {
-		nID = alln[0].ID
-	}
-	return nID
-}
-
-func testListNodeDetails(t *testing.T, c *gophercloud.ServiceClient, pID string) {
-	allPages, err := lbpools.ListNodesDetails(c, pID).AllPages()
-	th.AssertNoErr(t, err)
-	alln, err := lbpools.ExtractNodesDetails(allPages)
-	fmt.Printf("Listing all LB pool nodes details for pool (%s): %+v\n\n", pID, alln)
-}
-
-func testGetNode(t *testing.T, c *gophercloud.ServiceClient, pID, nID string) {
-	n, err := lbpools.GetNode(c, pID, nID).Extract()
-	th.AssertNoErr(t, err)
-	fmt.Printf("Retrieved LB node: %+v\n\n", n)
-}
-
-func testGetNodeDetails(t *testing.T, c *gophercloud.ServiceClient, pID, nID string) {
-	n, err := lbpools.GetNodeDetails(c, pID, nID).Extract()
-	th.AssertNoErr(t, err)
-	fmt.Printf("Retrieved LB node details: %+v\n\n", n)
-}
diff --git a/acceptance/rackspace/rackconnect/v3/publicips_test.go b/acceptance/rackspace/rackconnect/v3/publicips_test.go
deleted file mode 100644
index cdaa3be..0000000
--- a/acceptance/rackspace/rackconnect/v3/publicips_test.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// +build acceptance
-
-package v3
-
-import (
-	"fmt"
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/rackspace/rackconnect/v3/publicips"
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestPublicIPs(t *testing.T) {
-	c := newClient(t)
-	ipID := testListIPs(t, c)
-	sID := testGetIP(t, c, ipID)
-	testListIPsForServer(t, c, sID)
-}
-
-func testListIPs(t *testing.T, c *gophercloud.ServiceClient) string {
-	allPages, err := publicips.List(c).AllPages()
-	th.AssertNoErr(t, err)
-	allip, err := publicips.ExtractPublicIPs(allPages)
-	fmt.Printf("Listing all public IPs: %+v\n\n", allip)
-	var ipID string
-	if len(allip) > 0 {
-		ipID = allip[0].ID
-	}
-	return ipID
-}
-
-func testGetIP(t *testing.T, c *gophercloud.ServiceClient, ipID string) string {
-	ip, err := publicips.Get(c, ipID).Extract()
-	th.AssertNoErr(t, err)
-	fmt.Printf("Retrieved public IP (%s): %+v\n\n", ipID, ip)
-	return ip.CloudServer.ID
-}
-
-func testListIPsForServer(t *testing.T, c *gophercloud.ServiceClient, sID string) {
-	allPages, err := publicips.ListForServer(c, sID).AllPages()
-	th.AssertNoErr(t, err)
-	allip, err := publicips.ExtractPublicIPs(allPages)
-	fmt.Printf("Listing all public IPs for server (%s): %+v\n\n", sID, allip)
-}
