diff --git a/endpoint_search.go b/endpoint_search.go
index 5189431..9887947 100644
--- a/endpoint_search.go
+++ b/endpoint_search.go
@@ -1,21 +1,5 @@
 package gophercloud
 
-import "errors"
-
-var (
-	// ErrServiceNotFound is returned when no service in a service catalog matches
-	// the provided EndpointOpts. This is generally returned by provider service
-	// factory methods like "NewComputeV2()" and can mean that a service is not
-	// enabled for your account.
-	ErrServiceNotFound = errors.New("No suitable service could be found in the service catalog.")
-
-	// ErrEndpointNotFound is returned when no available endpoints match the
-	// provided EndpointOpts. This is also generally returned by provider service
-	// factory methods, and usually indicates that a region was specified
-	// incorrectly.
-	ErrEndpointNotFound = errors.New("No suitable endpoint could be found in the service catalog.")
-)
-
 // Availability indicates to whom a specific service endpoint is accessible:
 // the internet at large, internal networks only, or only to administrators.
 // Different identity services use different terminology for these. Identity v2
diff --git a/errors.go b/errors.go
new file mode 100644
index 0000000..e47aff1
--- /dev/null
+++ b/errors.go
@@ -0,0 +1,188 @@
+package gophercloud
+
+import "fmt"
+
+// BaseError is an error type that all other error types embed.
+type BaseError struct {
+	OriginalError string
+	Function      string
+}
+
+func (e *BaseError) Error() string {
+	return "An error occurred while executing a Gophercloud request."
+}
+
+// ErrInvalidInput is an error type used for most non-HTTP Gophercloud errors.
+type ErrInvalidInput struct {
+	BaseError
+	Argument string
+	Value    interface{}
+}
+
+func (e *ErrInvalidInput) Error() string {
+	return fmt.Sprintf("Invalid input provided for argument [%s]: [%+v]", e.Argument, e.Value)
+}
+
+// ErrUnexpectedResponseCode is returned by the Request method when a response code other than
+// those listed in OkCodes is encountered.
+type ErrUnexpectedResponseCode struct {
+	BaseError
+	URL      string
+	Method   string
+	Expected []int
+	Actual   int
+	Body     []byte
+}
+
+func (err *ErrUnexpectedResponseCode) Error() string {
+	return fmt.Sprintf(
+		"Expected HTTP response code %v when accessing [%s %s], but got %d instead\n%s",
+		err.Expected, err.Method, err.URL, err.Actual, err.Body,
+	)
+}
+
+type ErrDefault400 struct {
+	*ErrUnexpectedResponseCode
+}
+type ErrDefault401 struct {
+	*ErrUnexpectedResponseCode
+}
+type ErrDefault404 struct {
+	*ErrUnexpectedResponseCode
+}
+type ErrDefault405 struct {
+	*ErrUnexpectedResponseCode
+}
+type ErrDefault408 struct {
+	*ErrUnexpectedResponseCode
+}
+type ErrDefault429 struct {
+	*ErrUnexpectedResponseCode
+}
+type ErrDefault500 struct {
+	*ErrUnexpectedResponseCode
+}
+type ErrDefault503 struct {
+	*ErrUnexpectedResponseCode
+}
+
+func (e ErrDefault400) Error() string {
+	return "Invalid request due to incorrect syntax or missing required parameters."
+}
+func (e ErrDefault401) Error() string {
+	return "Authentication failed"
+}
+func (e ErrDefault404) Error() string {
+	return "Resource not found"
+}
+func (e ErrDefault405) Error() string {
+	return "Method not allowed"
+}
+func (e ErrDefault408) Error() string {
+	return "The server timed out waiting for the request"
+}
+func (e ErrDefault429) Error() string {
+	return "Too many requests have been sent in a given amount of time. Pause requests, wait up to one minute, and try again."
+}
+func (e ErrDefault500) Error() string {
+	return "Internal Server Error"
+}
+func (e ErrDefault503) Error() string {
+	return "The service is currently unable to handle the request due to a temporary overloading or maintenance. This is a temporary condition. Try again later."
+}
+
+// Err400er is the interface resource error types implement to override the error message
+// from a 400 error.
+type Err400er interface {
+	Error400(*ErrUnexpectedResponseCode) error
+}
+
+// Err401er is the interface resource error types implement to override the error message
+// from a 401 error.
+type Err401er interface {
+	Error401(*ErrUnexpectedResponseCode) error
+}
+
+// Err404er is the interface resource error types implement to override the error message
+// from a 404 error.
+type Err404er interface {
+	Error404(*ErrUnexpectedResponseCode) error
+}
+
+// Err405er is the interface resource error types implement to override the error message
+// from a 405 error.
+type Err405er interface {
+	Error405(*ErrUnexpectedResponseCode) error
+}
+
+// Err408er is the interface resource error types implement to override the error message
+// from a 408 error.
+type Err408er interface {
+	Error408(*ErrUnexpectedResponseCode) error
+}
+
+// Err429er is the interface resource error types implement to override the error message
+// from a 429 error.
+type Err429er interface {
+	Error429(*ErrUnexpectedResponseCode) error
+}
+
+// Err500er is the interface resource error types implement to override the error message
+// from a 500 error.
+type Err500er interface {
+	Error500(*ErrUnexpectedResponseCode) error
+}
+
+// Err503er is the interface resource error types implement to override the error message
+// from a 503 error.
+type Err503er interface {
+	Error503(*ErrUnexpectedResponseCode) error
+}
+
+type ErrTimeOut struct {
+	*BaseError
+}
+
+func (e *ErrTimeOut) Error() string {
+	return "A time out occurred"
+}
+
+type ErrUnableToReauthenticate struct {
+	*BaseError
+}
+
+func (e *ErrUnableToReauthenticate) Error() string {
+	return fmt.Sprintf("Unable to re-authenticate: %s", e.OriginalError)
+}
+
+type ErrErrorAfterReauthentication struct {
+	*BaseError
+}
+
+func (e *ErrErrorAfterReauthentication) Error() string {
+	return fmt.Sprintf("Successfully re-authenticated, but got error executing request: %s", e.OriginalError)
+}
+
+// ErrServiceNotFound is returned when no service in a service catalog matches
+// the provided EndpointOpts. This is generally returned by provider service
+// factory methods like "NewComputeV2()" and can mean that a service is not
+// enabled for your account.
+type ErrServiceNotFound struct {
+	*BaseError
+}
+
+func (e *ErrServiceNotFound) Error() string {
+	return "No suitable service could be found in the service catalog."
+}
+
+// ErrEndpointNotFound is returned when no available endpoints match the
+// provided EndpointOpts. This is also generally returned by provider service
+// factory methods, and usually indicates that a region was specified
+// incorrectly.
+type ErrEndpointNotFound struct {
+	*BaseError
+}
+
+func (e *ErrEndpointNotFound) Error() string {
+	return "No suitable endpoint could be found in the service catalog."
+}
diff --git a/openstack/compute/v2/servers/requests.go b/openstack/compute/v2/servers/requests.go
index 8e60daa..c938895 100644
--- a/openstack/compute/v2/servers/requests.go
+++ b/openstack/compute/v2/servers/requests.go
@@ -6,9 +6,9 @@
 	"errors"
 	"fmt"
 
+	"github.com/jrperritt/gophercloud/openstack/compute/v2/images"
 	"github.com/rackspace/gophercloud"
 	"github.com/rackspace/gophercloud/openstack/compute/v2/flavors"
-	"github.com/rackspace/gophercloud/openstack/compute/v2/images"
 	"github.com/rackspace/gophercloud/pagination"
 )
 
@@ -130,7 +130,7 @@
 // CreateOpts specifies server creation parameters.
 type CreateOpts struct {
 	// Name [required] is the name to assign to the newly launched server.
-	Name string
+	Name string `b:"name,required"`
 
 	// ImageRef [optional; required if ImageName is not provided] is the ID or full
 	// URL to the image that contains the server's OS and initial state.
@@ -247,6 +247,30 @@
 		server["personality"] = opts.Personality
 	}
 
+	// If ImageRef isn't provided, use ImageName to ascertain the image ID.
+	if opts.ImageRef == "" {
+		if opts.ImageName == "" {
+			return nil, errors.New("One and only one of ImageRef and ImageName must be provided.")
+		}
+		imageID, err := images.IDFromName(client, opts.ImageName)
+		if err != nil {
+			return nil, err
+		}
+		server["imageRef"] = imageID
+	}
+
+	// If FlavorRef isn't provided, use FlavorName to ascertain the flavor ID.
+	if opts.FlavorRef == "" {
+		if opts.FlavorName == "" {
+			return nil, errors.New("One and only one of FlavorRef and FlavorName must be provided.")
+		}
+		flavorID, err := flavors.IDFromName(client, opts.FlavorName)
+		if err != nil {
+			return nil, err
+		}
+		server["flavorRef"] = flavorID
+	}
+
 	return map[string]interface{}{"server": server}, nil
 }
 
@@ -260,38 +284,6 @@
 		return res
 	}
 
-	// If ImageRef isn't provided, use ImageName to ascertain the image ID.
-	if reqBody["server"].(map[string]interface{})["imageRef"].(string) == "" {
-		imageName := reqBody["server"].(map[string]interface{})["imageName"].(string)
-		if imageName == "" {
-			res.Err = errors.New("One and only one of ImageRef and ImageName must be provided.")
-			return res
-		}
-		imageID, err := images.IDFromName(client, imageName)
-		if err != nil {
-			res.Err = err
-			return res
-		}
-		reqBody["server"].(map[string]interface{})["imageRef"] = imageID
-	}
-	delete(reqBody["server"].(map[string]interface{}), "imageName")
-
-	// If FlavorRef isn't provided, use FlavorName to ascertain the flavor ID.
-	if reqBody["server"].(map[string]interface{})["flavorRef"].(string) == "" {
-		flavorName := reqBody["server"].(map[string]interface{})["flavorName"].(string)
-		if flavorName == "" {
-			res.Err = errors.New("One and only one of FlavorRef and FlavorName must be provided.")
-			return res
-		}
-		flavorID, err := flavors.IDFromName(client, flavorName)
-		if err != nil {
-			res.Err = err
-			return res
-		}
-		reqBody["server"].(map[string]interface{})["flavorRef"] = flavorID
-	}
-	delete(reqBody["server"].(map[string]interface{}), "flavorName")
-
 	_, res.Err = client.Post(listURL(client), reqBody, &res.Body, nil)
 	return res
 }
@@ -814,14 +806,14 @@
 }
 
 // CreateImage makes a request against the nova API to schedule an image to be created of the server
-func CreateImage(client *gophercloud.ServiceClient, serverId string, opts CreateImageOptsBuilder) CreateImageResult {
+func CreateImage(client *gophercloud.ServiceClient, serverID string, opts CreateImageOptsBuilder) CreateImageResult {
 	var res CreateImageResult
 	reqBody, err := opts.ToServerCreateImageMap()
 	if err != nil {
 		res.Err = err
 		return res
 	}
-	response, err := client.Post(actionURL(client, serverId), reqBody, nil, &gophercloud.RequestOpts{
+	response, err := client.Post(actionURL(client, serverID), reqBody, nil, &gophercloud.RequestOpts{
 		OkCodes: []int{202},
 	})
 	res.Err = err
diff --git a/params.go b/params.go
index 4d0f1e6..cd5bc65 100644
--- a/params.go
+++ b/params.go
@@ -9,6 +9,10 @@
 	"time"
 )
 
+type Opts struct {
+	ServiceClient *ServiceClient
+}
+
 // EnabledState is a convenience type, mostly used in Create and Update
 // operations. Because the zero value of a bool is FALSE, we need to use a
 // pointer instead to indicate zero-ness.
diff --git a/provider_client.go b/provider_client.go
index 53fce73..5f55442 100644
--- a/provider_client.go
+++ b/provider_client.go
@@ -11,7 +11,7 @@
 )
 
 // DefaultUserAgent is the default User-Agent string set in the request header.
-const DefaultUserAgent = "gophercloud/1.0.0"
+const DefaultUserAgent = "gophercloud/2.0.0"
 
 // UserAgent represents a User-Agent header.
 type UserAgent struct {
@@ -85,46 +85,27 @@
 	// content type of the request will default to "application/json" unless overridden by MoreHeaders.
 	// It's an error to specify both a JSONBody and a RawBody.
 	JSONBody interface{}
-	// RawBody contains an io.ReadSeeker that will be consumed by the request directly. No content-type
+	// RawBody contains an io.Reader that will be consumed by the request directly. No content-type
 	// will be set unless one is provided explicitly by MoreHeaders.
-	RawBody io.ReadSeeker
-
+	RawBody io.Reader
 	// JSONResponse, if provided, will be populated with the contents of the response body parsed as
 	// JSON.
 	JSONResponse interface{}
 	// OkCodes contains a list of numeric HTTP status codes that should be interpreted as success. If
 	// the response has a different code, an error will be returned.
 	OkCodes []int
-
 	// MoreHeaders specifies additional HTTP headers to be provide on the request. If a header is
 	// provided with a blank value (""), that header will be *omitted* instead: use this to suppress
 	// the default Accept header or an inferred Content-Type, for example.
 	MoreHeaders map[string]string
 }
 
-// UnexpectedResponseCodeError is returned by the Request method when a response code other than
-// those listed in OkCodes is encountered.
-type UnexpectedResponseCodeError struct {
-	URL      string
-	Method   string
-	Expected []int
-	Actual   int
-	Body     []byte
-}
-
-func (err *UnexpectedResponseCodeError) Error() string {
-	return fmt.Sprintf(
-		"Expected HTTP response code %v when accessing [%s %s], but got %d instead\n%s",
-		err.Expected, err.Method, err.URL, err.Actual, err.Body,
-	)
-}
-
 var applicationJSON = "application/json"
 
 // Request performs an HTTP request using the ProviderClient's current HTTPClient. An authentication
 // header will automatically be provided.
 func (client *ProviderClient) Request(method, url string, options RequestOpts) (*http.Response, error) {
-	var body io.ReadSeeker
+	var body io.Reader
 	var contentType *string
 
 	// Derive the content body by either encoding an arbitrary object as JSON, or by taking a provided
@@ -192,8 +173,8 @@
 			if err != nil {
 				return nil, fmt.Errorf("Error trying to re-authenticate: %s", err)
 			}
-			if options.RawBody != nil {
-				options.RawBody.Seek(0, 0)
+			if seeker, ok := options.RawBody.(io.ReadSeeker); ok && options.RawBody != nil {
+				seeker.Seek(0, 0)
 			}
 			resp.Body.Close()
 			resp, err = client.Request(method, url, options)
@@ -221,7 +202,7 @@
 	if !ok {
 		body, _ := ioutil.ReadAll(resp.Body)
 		resp.Body.Close()
-		return resp, &UnexpectedResponseCodeError{
+		return resp, &ErrUnexpectedResponseCode{
 			URL:      url,
 			Method:   method,
 			Expected: options.OkCodes,
diff --git a/rackspace/auth_env.go b/rackspace/auth_env.go
deleted file mode 100644
index 5852c3c..0000000
--- a/rackspace/auth_env.go
+++ /dev/null
@@ -1,57 +0,0 @@
-package rackspace
-
-import (
-	"fmt"
-	"os"
-
-	"github.com/rackspace/gophercloud"
-)
-
-var nilOptions = gophercloud.AuthOptions{}
-
-// ErrNoAuthUrl, ErrNoUsername, and ErrNoPassword errors indicate of the
-// required RS_AUTH_URL, RS_USERNAME, or RS_PASSWORD environment variables,
-// respectively, remain undefined.  See the AuthOptions() function for more details.
-var (
-	ErrNoAuthURL  = fmt.Errorf("Environment variable RS_AUTH_URL or OS_AUTH_URL need to be set.")
-	ErrNoUsername = fmt.Errorf("Environment variable RS_USERNAME or OS_USERNAME need to be set.")
-	ErrNoPassword = fmt.Errorf("Environment variable RS_API_KEY or RS_PASSWORD needs to be set.")
-)
-
-func prefixedEnv(base string) string {
-	value := os.Getenv("RS_" + base)
-	if value == "" {
-		value = os.Getenv("OS_" + base)
-	}
-	return value
-}
-
-// AuthOptionsFromEnv fills out an identity.AuthOptions structure with the
-// settings found on the various Rackspace RS_* environment variables.
-func AuthOptionsFromEnv() (gophercloud.AuthOptions, error) {
-	authURL := prefixedEnv("AUTH_URL")
-	username := prefixedEnv("USERNAME")
-	password := prefixedEnv("PASSWORD")
-	apiKey := prefixedEnv("API_KEY")
-
-	if authURL == "" {
-		return nilOptions, ErrNoAuthURL
-	}
-
-	if username == "" {
-		return nilOptions, ErrNoUsername
-	}
-
-	if password == "" && apiKey == "" {
-		return nilOptions, ErrNoPassword
-	}
-
-	ao := gophercloud.AuthOptions{
-		IdentityEndpoint: authURL,
-		Username:         username,
-		Password:         password,
-		APIKey:           apiKey,
-	}
-
-	return ao, nil
-}
diff --git a/rackspace/blockstorage/v1/snapshots/delegate.go b/rackspace/blockstorage/v1/snapshots/delegate.go
deleted file mode 100644
index 1cd1b6e..0000000
--- a/rackspace/blockstorage/v1/snapshots/delegate.go
+++ /dev/null
@@ -1,131 +0,0 @@
-package snapshots
-
-import (
-	"errors"
-
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-
-	os "github.com/rackspace/gophercloud/openstack/blockstorage/v1/snapshots"
-)
-
-func updateURL(c *gophercloud.ServiceClient, id string) string {
-	return c.ServiceURL("snapshots", id)
-}
-
-// CreateOptsBuilder allows extensions to add additional parameters to the
-// Create request.
-type CreateOptsBuilder interface {
-	ToSnapshotCreateMap() (map[string]interface{}, error)
-}
-
-// CreateOpts contains options for creating a Snapshot. This object is passed to
-// the snapshots.Create function. For more information about these parameters,
-// see the Snapshot object.
-type CreateOpts struct {
-	// REQUIRED
-	VolumeID string
-	// OPTIONAL
-	Description string
-	// OPTIONAL
-	Force bool
-	// OPTIONAL
-	Name string
-}
-
-// ToSnapshotCreateMap assembles a request body based on the contents of a
-// CreateOpts.
-func (opts CreateOpts) ToSnapshotCreateMap() (map[string]interface{}, error) {
-	s := make(map[string]interface{})
-
-	if opts.VolumeID == "" {
-		return nil, errors.New("Required CreateOpts field 'VolumeID' not set.")
-	}
-
-	s["volume_id"] = opts.VolumeID
-
-	if opts.Description != "" {
-		s["display_description"] = opts.Description
-	}
-	if opts.Name != "" {
-		s["display_name"] = opts.Name
-	}
-	if opts.Force {
-		s["force"] = opts.Force
-	}
-
-	return map[string]interface{}{"snapshot": s}, nil
-}
-
-// Create will create a new Snapshot based on the values in CreateOpts. To
-// extract the Snapshot object from the response, call the Extract method on the
-// CreateResult.
-func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateResult {
-	return CreateResult{os.Create(client, opts)}
-}
-
-// Delete will delete the existing Snapshot with the provided ID.
-func Delete(client *gophercloud.ServiceClient, id string) os.DeleteResult {
-	return os.Delete(client, id)
-}
-
-// Get retrieves the Snapshot with the provided ID. To extract the Snapshot
-// object from the response, call the Extract method on the GetResult.
-func Get(client *gophercloud.ServiceClient, id string) GetResult {
-	return GetResult{os.Get(client, id)}
-}
-
-// List returns Snapshots.
-func List(client *gophercloud.ServiceClient) pagination.Pager {
-	return os.List(client, os.ListOpts{})
-}
-
-// UpdateOptsBuilder is the interface options structs have to satisfy in order
-// to be used in the main Update operation in this package. Since many
-// extensions decorate or modify the common logic, it is useful for them to
-// satisfy a basic interface in order for them to be used.
-type UpdateOptsBuilder interface {
-	ToSnapshotUpdateMap() (map[string]interface{}, error)
-}
-
-// UpdateOpts is the common options struct used in this package's Update
-// operation.
-type UpdateOpts struct {
-	Name        string
-	Description string
-}
-
-// ToSnapshotUpdateMap casts a UpdateOpts struct to a map.
-func (opts UpdateOpts) ToSnapshotUpdateMap() (map[string]interface{}, error) {
-	s := make(map[string]interface{})
-
-	if opts.Name != "" {
-		s["display_name"] = opts.Name
-	}
-	if opts.Description != "" {
-		s["display_description"] = opts.Description
-	}
-
-	return map[string]interface{}{"snapshot": s}, nil
-}
-
-// Update accepts a UpdateOpts struct and updates an existing snapshot using the
-// values provided.
-func Update(c *gophercloud.ServiceClient, snapshotID string, opts UpdateOptsBuilder) UpdateResult {
-	var res UpdateResult
-
-	reqBody, err := opts.ToSnapshotUpdateMap()
-	if err != nil {
-		res.Err = err
-		return res
-	}
-
-	// Send request to API
-	_, res.Err = c.Request("PUT", updateURL(c, snapshotID), gophercloud.RequestOpts{
-		JSONBody:     &reqBody,
-		JSONResponse: &res.Body,
-		OkCodes:      []int{200, 201},
-	})
-
-	return res
-}
diff --git a/rackspace/blockstorage/v1/snapshots/delegate_test.go b/rackspace/blockstorage/v1/snapshots/delegate_test.go
deleted file mode 100644
index 1a02b46..0000000
--- a/rackspace/blockstorage/v1/snapshots/delegate_test.go
+++ /dev/null
@@ -1,97 +0,0 @@
-package snapshots
-
-import (
-	"testing"
-
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/blockstorage/v1/snapshots"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-const endpoint = "http://localhost:57909/v1/12345"
-
-func endpointClient() *gophercloud.ServiceClient {
-	return &gophercloud.ServiceClient{Endpoint: endpoint}
-}
-
-func TestUpdateURL(t *testing.T) {
-	actual := updateURL(endpointClient(), "foo")
-	expected := endpoint + "snapshots/foo"
-	th.AssertEquals(t, expected, actual)
-}
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	os.MockListResponse(t)
-
-	count := 0
-
-	err := List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractSnapshots(page)
-		if err != nil {
-			t.Errorf("Failed to extract snapshots: %v", err)
-			return false, err
-		}
-
-		expected := []Snapshot{
-			Snapshot{
-				ID:   "289da7f8-6440-407c-9fb4-7db01ec49164",
-				Name: "snapshot-001",
-			},
-			Snapshot{
-				ID:   "96c3bda7-c82a-4f50-be73-ca7621794835",
-				Name: "snapshot-002",
-			},
-		}
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-
-	th.AssertEquals(t, 1, count)
-	th.AssertNoErr(t, err)
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	os.MockGetResponse(t)
-
-	v, err := Get(fake.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22").Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertEquals(t, v.Name, "snapshot-001")
-	th.AssertEquals(t, v.ID, "d32019d3-bc6e-4319-9c1d-6722fc136a22")
-}
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	os.MockCreateResponse(t)
-
-	options := &CreateOpts{VolumeID: "1234", Name: "snapshot-001"}
-	n, err := Create(fake.ServiceClient(), options).Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertEquals(t, n.VolumeID, "1234")
-	th.AssertEquals(t, n.Name, "snapshot-001")
-	th.AssertEquals(t, n.ID, "d32019d3-bc6e-4319-9c1d-6722fc136a22")
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	os.MockDeleteResponse(t)
-
-	res := Delete(fake.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22")
-	th.AssertNoErr(t, res.Err)
-}
diff --git a/rackspace/blockstorage/v1/snapshots/doc.go b/rackspace/blockstorage/v1/snapshots/doc.go
deleted file mode 100644
index ad6064f..0000000
--- a/rackspace/blockstorage/v1/snapshots/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package snapshots provides information and interaction with the snapshot
-// API resource for the Rackspace Block Storage service.
-package snapshots
diff --git a/rackspace/blockstorage/v1/snapshots/results.go b/rackspace/blockstorage/v1/snapshots/results.go
deleted file mode 100644
index c81644c..0000000
--- a/rackspace/blockstorage/v1/snapshots/results.go
+++ /dev/null
@@ -1,147 +0,0 @@
-package snapshots
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/blockstorage/v1/snapshots"
-	"github.com/rackspace/gophercloud/pagination"
-
-	"github.com/mitchellh/mapstructure"
-)
-
-// Status is the type used to represent a snapshot's status
-type Status string
-
-// Constants to use for supported statuses
-const (
-	Creating    Status = "CREATING"
-	Available   Status = "AVAILABLE"
-	Deleting    Status = "DELETING"
-	Error       Status = "ERROR"
-	DeleteError Status = "ERROR_DELETING"
-)
-
-// Snapshot is the Rackspace representation of an external block storage device.
-type Snapshot struct {
-	// The timestamp when this snapshot was created.
-	CreatedAt string `mapstructure:"created_at"`
-
-	// The human-readable description for this snapshot.
-	Description string `mapstructure:"display_description"`
-
-	// The human-readable name for this snapshot.
-	Name string `mapstructure:"display_name"`
-
-	// The UUID for this snapshot.
-	ID string `mapstructure:"id"`
-
-	// The random metadata associated with this snapshot. Note: unlike standard
-	// OpenStack snapshots, this cannot actually be set.
-	Metadata map[string]string `mapstructure:"metadata"`
-
-	// Indicates the current progress of the snapshot's backup procedure.
-	Progress string `mapstructure:"os-extended-snapshot-attributes:progress"`
-
-	// The project ID.
-	ProjectID string `mapstructure:"os-extended-snapshot-attributes:project_id"`
-
-	// The size of the volume which this snapshot backs up.
-	Size int `mapstructure:"size"`
-
-	// The status of the snapshot.
-	Status Status `mapstructure:"status"`
-
-	// The ID of the volume which this snapshot seeks to back up.
-	VolumeID string `mapstructure:"volume_id"`
-}
-
-// CreateResult represents the result of a create operation
-type CreateResult struct {
-	os.CreateResult
-}
-
-// GetResult represents the result of a get operation
-type GetResult struct {
-	os.GetResult
-}
-
-// UpdateResult represents the result of an update operation
-type UpdateResult struct {
-	gophercloud.Result
-}
-
-func commonExtract(resp interface{}, err error) (*Snapshot, error) {
-	if err != nil {
-		return nil, err
-	}
-
-	var respStruct struct {
-		Snapshot *Snapshot `json:"snapshot"`
-	}
-
-	err = mapstructure.Decode(resp, &respStruct)
-
-	return respStruct.Snapshot, err
-}
-
-// Extract will get the Snapshot object out of the GetResult object.
-func (r GetResult) Extract() (*Snapshot, error) {
-	return commonExtract(r.Body, r.Err)
-}
-
-// Extract will get the Snapshot object out of the CreateResult object.
-func (r CreateResult) Extract() (*Snapshot, error) {
-	return commonExtract(r.Body, r.Err)
-}
-
-// Extract will get the Snapshot object out of the UpdateResult object.
-func (r UpdateResult) Extract() (*Snapshot, error) {
-	return commonExtract(r.Body, r.Err)
-}
-
-// ExtractSnapshots extracts and returns Snapshots. It is used while iterating over a snapshots.List call.
-func ExtractSnapshots(page pagination.Page) ([]Snapshot, error) {
-	var response struct {
-		Snapshots []Snapshot `json:"snapshots"`
-	}
-
-	err := mapstructure.Decode(page.(os.ListResult).Body, &response)
-	return response.Snapshots, err
-}
-
-// WaitUntilComplete will continually poll a snapshot until it successfully
-// transitions to a specified state. It will do this for at most the number of
-// seconds specified.
-func (snapshot Snapshot) WaitUntilComplete(c *gophercloud.ServiceClient, timeout int) error {
-	return gophercloud.WaitFor(timeout, func() (bool, error) {
-		// Poll resource
-		current, err := Get(c, snapshot.ID).Extract()
-		if err != nil {
-			return false, err
-		}
-
-		// Has it been built yet?
-		if current.Progress == "100%" {
-			return true, nil
-		}
-
-		return false, nil
-	})
-}
-
-// WaitUntilDeleted will continually poll a snapshot until it has been
-// successfully deleted, i.e. returns a 404 status.
-func (snapshot Snapshot) WaitUntilDeleted(c *gophercloud.ServiceClient, timeout int) error {
-	return gophercloud.WaitFor(timeout, func() (bool, error) {
-		// Poll resource
-		_, err := Get(c, snapshot.ID).Extract()
-
-		// Check for a 404
-		if casted, ok := err.(*gophercloud.UnexpectedResponseCodeError); ok && casted.Actual == 404 {
-			return true, nil
-		} else if err != nil {
-			return false, err
-		}
-
-		return false, nil
-	})
-}
diff --git a/rackspace/blockstorage/v1/volumes/delegate.go b/rackspace/blockstorage/v1/volumes/delegate.go
deleted file mode 100644
index 4383494..0000000
--- a/rackspace/blockstorage/v1/volumes/delegate.go
+++ /dev/null
@@ -1,75 +0,0 @@
-package volumes
-
-import (
-	"fmt"
-
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/blockstorage/v1/volumes"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-type CreateOpts struct {
-	os.CreateOpts
-}
-
-func (opts CreateOpts) ToVolumeCreateMap() (map[string]interface{}, error) {
-	if opts.Size < 75 || opts.Size > 1024 {
-		return nil, fmt.Errorf("Size field must be between 75 and 1024")
-	}
-
-	return opts.CreateOpts.ToVolumeCreateMap()
-}
-
-// Create will create a new Volume based on the values in CreateOpts. To extract
-// the Volume object from the response, call the Extract method on the
-// CreateResult.
-func Create(client *gophercloud.ServiceClient, opts os.CreateOptsBuilder) CreateResult {
-	return CreateResult{os.Create(client, opts)}
-}
-
-// Delete will delete the existing Volume with the provided ID.
-func Delete(client *gophercloud.ServiceClient, id string) os.DeleteResult {
-	return os.Delete(client, id)
-}
-
-// Get retrieves the Volume with the provided ID. To extract the Volume object
-// from the response, call the Extract method on the GetResult.
-func Get(client *gophercloud.ServiceClient, id string) GetResult {
-	return GetResult{os.Get(client, id)}
-}
-
-// List returns volumes optionally limited by the conditions provided in ListOpts.
-func List(client *gophercloud.ServiceClient) pagination.Pager {
-	return os.List(client, os.ListOpts{})
-}
-
-// UpdateOpts contain options for updating an existing Volume. This object is passed
-// to the volumes.Update function. For more information about the parameters, see
-// the Volume object.
-type UpdateOpts struct {
-	// OPTIONAL
-	Name string
-	// OPTIONAL
-	Description string
-}
-
-// ToVolumeUpdateMap assembles a request body based on the contents of an
-// UpdateOpts.
-func (opts UpdateOpts) ToVolumeUpdateMap() (map[string]interface{}, error) {
-	v := make(map[string]interface{})
-
-	if opts.Description != "" {
-		v["display_description"] = opts.Description
-	}
-	if opts.Name != "" {
-		v["display_name"] = opts.Name
-	}
-
-	return map[string]interface{}{"volume": v}, nil
-}
-
-// Update will update the Volume with provided information. To extract the updated
-// Volume from the response, call the Extract method on the UpdateResult.
-func Update(client *gophercloud.ServiceClient, id string, opts os.UpdateOptsBuilder) UpdateResult {
-	return UpdateResult{os.Update(client, id, opts)}
-}
diff --git a/rackspace/blockstorage/v1/volumes/delegate_test.go b/rackspace/blockstorage/v1/volumes/delegate_test.go
deleted file mode 100644
index b6831f2..0000000
--- a/rackspace/blockstorage/v1/volumes/delegate_test.go
+++ /dev/null
@@ -1,107 +0,0 @@
-package volumes
-
-import (
-	"testing"
-
-	"github.com/rackspace/gophercloud/openstack/blockstorage/v1/volumes"
-	os "github.com/rackspace/gophercloud/openstack/blockstorage/v1/volumes/testing"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	os.MockListResponse(t)
-
-	count := 0
-
-	err := List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractVolumes(page)
-		if err != nil {
-			t.Errorf("Failed to extract volumes: %v", err)
-			return false, err
-		}
-
-		expected := []Volume{
-			Volume{
-				ID:   "289da7f8-6440-407c-9fb4-7db01ec49164",
-				Name: "vol-001",
-			},
-			Volume{
-				ID:   "96c3bda7-c82a-4f50-be73-ca7621794835",
-				Name: "vol-002",
-			},
-		}
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-
-	th.AssertEquals(t, 1, count)
-	th.AssertNoErr(t, err)
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	os.MockGetResponse(t)
-
-	v, err := Get(fake.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22").Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertEquals(t, v.Name, "vol-001")
-	th.AssertEquals(t, v.ID, "d32019d3-bc6e-4319-9c1d-6722fc136a22")
-}
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	os.MockCreateResponse(t)
-
-	n, err := Create(fake.ServiceClient(), CreateOpts{volumes.CreateOpts{Size: 75}}).Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertEquals(t, n.Size, 4)
-	th.AssertEquals(t, n.ID, "d32019d3-bc6e-4319-9c1d-6722fc136a22")
-}
-
-func TestSizeRange(t *testing.T) {
-	_, err := Create(fake.ServiceClient(), CreateOpts{volumes.CreateOpts{Size: 1}}).Extract()
-	if err == nil {
-		t.Fatalf("Expected error, got none")
-	}
-
-	_, err = Create(fake.ServiceClient(), CreateOpts{volumes.CreateOpts{Size: 2000}}).Extract()
-	if err == nil {
-		t.Fatalf("Expected error, got none")
-	}
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	os.MockDeleteResponse(t)
-
-	res := Delete(fake.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22")
-	th.AssertNoErr(t, res.Err)
-}
-
-func TestUpdate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	os.MockUpdateResponse(t)
-
-	options := &UpdateOpts{Name: "vol-002"}
-	v, err := Update(fake.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22", options).Extract()
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, "vol-002", v.Name)
-}
diff --git a/rackspace/blockstorage/v1/volumes/doc.go b/rackspace/blockstorage/v1/volumes/doc.go
deleted file mode 100644
index b2be25c..0000000
--- a/rackspace/blockstorage/v1/volumes/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package volumes provides information and interaction with the volume
-// API resource for the Rackspace Block Storage service.
-package volumes
diff --git a/rackspace/blockstorage/v1/volumes/results.go b/rackspace/blockstorage/v1/volumes/results.go
deleted file mode 100644
index c7c2cc4..0000000
--- a/rackspace/blockstorage/v1/volumes/results.go
+++ /dev/null
@@ -1,66 +0,0 @@
-package volumes
-
-import (
-	os "github.com/rackspace/gophercloud/openstack/blockstorage/v1/volumes"
-	"github.com/rackspace/gophercloud/pagination"
-
-	"github.com/mitchellh/mapstructure"
-)
-
-// Volume wraps an Openstack volume
-type Volume os.Volume
-
-// CreateResult represents the result of a create operation
-type CreateResult struct {
-	os.CreateResult
-}
-
-// GetResult represents the result of a get operation
-type GetResult struct {
-	os.GetResult
-}
-
-// UpdateResult represents the result of an update operation
-type UpdateResult struct {
-	os.UpdateResult
-}
-
-func commonExtract(resp interface{}, err error) (*Volume, error) {
-	if err != nil {
-		return nil, err
-	}
-
-	var respStruct struct {
-		Volume *Volume `json:"volume"`
-	}
-
-	err = mapstructure.Decode(resp, &respStruct)
-
-	return respStruct.Volume, err
-}
-
-// Extract will get the Volume object out of the GetResult object.
-func (r GetResult) Extract() (*Volume, error) {
-	return commonExtract(r.Body, r.Err)
-}
-
-// Extract will get the Volume object out of the CreateResult object.
-func (r CreateResult) Extract() (*Volume, error) {
-	return commonExtract(r.Body, r.Err)
-}
-
-// Extract will get the Volume object out of the UpdateResult object.
-func (r UpdateResult) Extract() (*Volume, error) {
-	return commonExtract(r.Body, r.Err)
-}
-
-// ExtractVolumes extracts and returns Volumes. It is used while iterating over a volumes.List call.
-func ExtractVolumes(page pagination.Page) ([]Volume, error) {
-	var response struct {
-		Volumes []Volume `json:"volumes"`
-	}
-
-	err := mapstructure.Decode(page.(os.ListResult).Body, &response)
-
-	return response.Volumes, err
-}
diff --git a/rackspace/blockstorage/v1/volumetypes/delegate.go b/rackspace/blockstorage/v1/volumetypes/delegate.go
deleted file mode 100644
index c96b3e4..0000000
--- a/rackspace/blockstorage/v1/volumetypes/delegate.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package volumetypes
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/blockstorage/v1/volumetypes"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List returns all volume types.
-func List(client *gophercloud.ServiceClient) pagination.Pager {
-	return os.List(client)
-}
-
-// Get will retrieve the volume type with the provided ID. To extract the volume
-// type from the result, call the Extract method on the GetResult.
-func Get(client *gophercloud.ServiceClient, id string) GetResult {
-	return GetResult{os.Get(client, id)}
-}
diff --git a/rackspace/blockstorage/v1/volumetypes/delegate_test.go b/rackspace/blockstorage/v1/volumetypes/delegate_test.go
deleted file mode 100644
index 6e65c90..0000000
--- a/rackspace/blockstorage/v1/volumetypes/delegate_test.go
+++ /dev/null
@@ -1,64 +0,0 @@
-package volumetypes
-
-import (
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/blockstorage/v1/volumetypes"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	os.MockListResponse(t)
-
-	count := 0
-
-	err := List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractVolumeTypes(page)
-		if err != nil {
-			t.Errorf("Failed to extract volume types: %v", err)
-			return false, err
-		}
-
-		expected := []VolumeType{
-			VolumeType{
-				ID:   "289da7f8-6440-407c-9fb4-7db01ec49164",
-				Name: "vol-type-001",
-				ExtraSpecs: map[string]interface{}{
-					"capabilities": "gpu",
-				},
-			},
-			VolumeType{
-				ID:         "96c3bda7-c82a-4f50-be73-ca7621794835",
-				Name:       "vol-type-002",
-				ExtraSpecs: map[string]interface{}{},
-			},
-		}
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-
-	th.AssertEquals(t, 1, count)
-	th.AssertNoErr(t, err)
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	os.MockGetResponse(t)
-
-	vt, err := Get(fake.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22").Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertDeepEquals(t, vt.ExtraSpecs, map[string]interface{}{"serverNumber": "2"})
-	th.AssertEquals(t, vt.Name, "vol-type-001")
-	th.AssertEquals(t, vt.ID, "d32019d3-bc6e-4319-9c1d-6722fc136a22")
-}
diff --git a/rackspace/blockstorage/v1/volumetypes/doc.go b/rackspace/blockstorage/v1/volumetypes/doc.go
deleted file mode 100644
index 70122b7..0000000
--- a/rackspace/blockstorage/v1/volumetypes/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package volumetypes provides information and interaction with the volume type
-// API resource for the Rackspace Block Storage service.
-package volumetypes
diff --git a/rackspace/blockstorage/v1/volumetypes/results.go b/rackspace/blockstorage/v1/volumetypes/results.go
deleted file mode 100644
index 39c8d6f..0000000
--- a/rackspace/blockstorage/v1/volumetypes/results.go
+++ /dev/null
@@ -1,37 +0,0 @@
-package volumetypes
-
-import (
-	"github.com/mitchellh/mapstructure"
-	os "github.com/rackspace/gophercloud/openstack/blockstorage/v1/volumetypes"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-type VolumeType os.VolumeType
-
-type GetResult struct {
-	os.GetResult
-}
-
-// Extract will get the Volume Type struct out of the response.
-func (r GetResult) Extract() (*VolumeType, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-
-	var res struct {
-		VolumeType *VolumeType `json:"volume_type" mapstructure:"volume_type"`
-	}
-
-	err := mapstructure.Decode(r.Body, &res)
-
-	return res.VolumeType, err
-}
-
-func ExtractVolumeTypes(page pagination.Page) ([]VolumeType, error) {
-	var response struct {
-		VolumeTypes []VolumeType `mapstructure:"volume_types"`
-	}
-
-	err := mapstructure.Decode(page.(os.ListResult).Body, &response)
-	return response.VolumeTypes, err
-}
diff --git a/rackspace/cdn/v1/base/delegate.go b/rackspace/cdn/v1/base/delegate.go
deleted file mode 100644
index 5af7e07..0000000
--- a/rackspace/cdn/v1/base/delegate.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package base
-
-import (
-	"github.com/rackspace/gophercloud"
-
-	os "github.com/rackspace/gophercloud/openstack/cdn/v1/base"
-)
-
-// Get retrieves the home document, allowing the user to discover the
-// entire API.
-func Get(c *gophercloud.ServiceClient) os.GetResult {
-	return os.Get(c)
-}
-
-// Ping retrieves a ping to the server.
-func Ping(c *gophercloud.ServiceClient) os.PingResult {
-	return os.Ping(c)
-}
diff --git a/rackspace/cdn/v1/base/delegate_test.go b/rackspace/cdn/v1/base/delegate_test.go
deleted file mode 100644
index 731fc6d..0000000
--- a/rackspace/cdn/v1/base/delegate_test.go
+++ /dev/null
@@ -1,44 +0,0 @@
-package base
-
-import (
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/cdn/v1/base"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestGetHomeDocument(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleGetSuccessfully(t)
-
-	actual, err := Get(fake.ServiceClient()).Extract()
-	th.CheckNoErr(t, err)
-
-	expected := os.HomeDocument{
-		"rel/cdn": map[string]interface{}{
-			"href-template": "services{?marker,limit}",
-			"href-vars": map[string]interface{}{
-				"marker": "param/marker",
-				"limit":  "param/limit",
-			},
-			"hints": map[string]interface{}{
-				"allow": []string{"GET"},
-				"formats": map[string]interface{}{
-					"application/json": map[string]interface{}{},
-				},
-			},
-		},
-	}
-	th.CheckDeepEquals(t, expected, *actual)
-}
-
-func TestPing(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandlePingSuccessfully(t)
-
-	err := Ping(fake.ServiceClient()).ExtractErr()
-	th.CheckNoErr(t, err)
-}
diff --git a/rackspace/cdn/v1/base/doc.go b/rackspace/cdn/v1/base/doc.go
deleted file mode 100644
index 5582306..0000000
--- a/rackspace/cdn/v1/base/doc.go
+++ /dev/null
@@ -1,4 +0,0 @@
-// Package base provides information and interaction with the base API
-// resource in the Rackspace CDN service. This API resource allows for
-// retrieving the Home Document and pinging the root URL.
-package base
diff --git a/rackspace/cdn/v1/flavors/delegate.go b/rackspace/cdn/v1/flavors/delegate.go
deleted file mode 100644
index 7152fa2..0000000
--- a/rackspace/cdn/v1/flavors/delegate.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package flavors
-
-import (
-	"github.com/rackspace/gophercloud"
-
-	os "github.com/rackspace/gophercloud/openstack/cdn/v1/flavors"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List returns a single page of CDN flavors.
-func List(c *gophercloud.ServiceClient) pagination.Pager {
-	return os.List(c)
-}
-
-// Get retrieves a specific flavor based on its unique ID.
-func Get(c *gophercloud.ServiceClient, id string) os.GetResult {
-	return os.Get(c, id)
-}
diff --git a/rackspace/cdn/v1/flavors/delegate_test.go b/rackspace/cdn/v1/flavors/delegate_test.go
deleted file mode 100644
index d6d299d..0000000
--- a/rackspace/cdn/v1/flavors/delegate_test.go
+++ /dev/null
@@ -1,90 +0,0 @@
-package flavors
-
-import (
-	"testing"
-
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/cdn/v1/flavors"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	os.HandleListCDNFlavorsSuccessfully(t)
-
-	count := 0
-
-	err := List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := os.ExtractFlavors(page)
-		if err != nil {
-			t.Errorf("Failed to extract flavors: %v", err)
-			return false, err
-		}
-
-		expected := []os.Flavor{
-			os.Flavor{
-				ID: "europe",
-				Providers: []os.Provider{
-					os.Provider{
-						Provider: "Fastly",
-						Links: []gophercloud.Link{
-							gophercloud.Link{
-								Href: "http://www.fastly.com",
-								Rel:  "provider_url",
-							},
-						},
-					},
-				},
-				Links: []gophercloud.Link{
-					gophercloud.Link{
-						Href: "https://www.poppycdn.io/v1.0/flavors/europe",
-						Rel:  "self",
-					},
-				},
-			},
-		}
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, 1, count)
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	os.HandleGetCDNFlavorSuccessfully(t)
-
-	expected := &os.Flavor{
-		ID: "asia",
-		Providers: []os.Provider{
-			os.Provider{
-				Provider: "ChinaCache",
-				Links: []gophercloud.Link{
-					gophercloud.Link{
-						Href: "http://www.chinacache.com",
-						Rel:  "provider_url",
-					},
-				},
-			},
-		},
-		Links: []gophercloud.Link{
-			gophercloud.Link{
-				Href: "https://www.poppycdn.io/v1.0/flavors/asia",
-				Rel:  "self",
-			},
-		},
-	}
-
-	actual, err := Get(fake.ServiceClient(), "asia").Extract()
-	th.AssertNoErr(t, err)
-	th.AssertDeepEquals(t, expected, actual)
-}
diff --git a/rackspace/cdn/v1/flavors/doc.go b/rackspace/cdn/v1/flavors/doc.go
deleted file mode 100644
index 4ad966e..0000000
--- a/rackspace/cdn/v1/flavors/doc.go
+++ /dev/null
@@ -1,6 +0,0 @@
-// Package flavors provides information and interaction with the flavors API
-// resource in the Rackspace CDN service. This API resource allows for
-// listing flavors and retrieving a specific flavor.
-//
-// A flavor is a mapping configuration to a CDN provider.
-package flavors
diff --git a/rackspace/cdn/v1/serviceassets/delegate.go b/rackspace/cdn/v1/serviceassets/delegate.go
deleted file mode 100644
index 07c93a8..0000000
--- a/rackspace/cdn/v1/serviceassets/delegate.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package serviceassets
-
-import (
-	"github.com/rackspace/gophercloud"
-
-	os "github.com/rackspace/gophercloud/openstack/cdn/v1/serviceassets"
-)
-
-// Delete accepts a unique ID and deletes the CDN service asset associated with
-// it.
-func Delete(c *gophercloud.ServiceClient, id string, opts os.DeleteOptsBuilder) os.DeleteResult {
-	return os.Delete(c, id, opts)
-}
diff --git a/rackspace/cdn/v1/serviceassets/delegate_test.go b/rackspace/cdn/v1/serviceassets/delegate_test.go
deleted file mode 100644
index 328e168..0000000
--- a/rackspace/cdn/v1/serviceassets/delegate_test.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package serviceassets
-
-import (
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/cdn/v1/serviceassets"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	os.HandleDeleteCDNAssetSuccessfully(t)
-
-	err := Delete(fake.ServiceClient(), "96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0", nil).ExtractErr()
-	th.AssertNoErr(t, err)
-}
diff --git a/rackspace/cdn/v1/serviceassets/doc.go b/rackspace/cdn/v1/serviceassets/doc.go
deleted file mode 100644
index 46b3d50..0000000
--- a/rackspace/cdn/v1/serviceassets/doc.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// Package serviceassets provides information and interaction with the
-// serviceassets API resource in the Rackspace CDN service. This API resource
-// allows for deleting cached assets.
-//
-// A service distributes assets across the network. Service assets let you
-// interrogate properties about these assets and perform certain actions on them.
-package serviceassets
diff --git a/rackspace/cdn/v1/services/delegate.go b/rackspace/cdn/v1/services/delegate.go
deleted file mode 100644
index e3f1459..0000000
--- a/rackspace/cdn/v1/services/delegate.go
+++ /dev/null
@@ -1,37 +0,0 @@
-package services
-
-import (
-	"github.com/rackspace/gophercloud"
-
-	os "github.com/rackspace/gophercloud/openstack/cdn/v1/services"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List returns a Pager which allows you to iterate over a collection of
-// CDN services. It accepts a ListOpts struct, which allows for pagination via
-// marker and limit.
-func List(c *gophercloud.ServiceClient, opts os.ListOptsBuilder) pagination.Pager {
-	return os.List(c, opts)
-}
-
-// Create accepts a CreateOpts struct and creates a new CDN service using the
-// values provided.
-func Create(c *gophercloud.ServiceClient, opts os.CreateOptsBuilder) os.CreateResult {
-	return os.Create(c, opts)
-}
-
-// Get retrieves a specific service based on its unique ID.
-func Get(c *gophercloud.ServiceClient, id string) os.GetResult {
-	return os.Get(c, id)
-}
-
-// Update accepts a UpdateOpts struct and updates an existing CDN service using
-// the values provided.
-func Update(c *gophercloud.ServiceClient, id string, patches []os.Patch) os.UpdateResult {
-	return os.Update(c, id, patches)
-}
-
-// Delete accepts a unique ID and deletes the CDN service associated with it.
-func Delete(c *gophercloud.ServiceClient, id string) os.DeleteResult {
-	return os.Delete(c, id)
-}
diff --git a/rackspace/cdn/v1/services/delegate_test.go b/rackspace/cdn/v1/services/delegate_test.go
deleted file mode 100644
index 6c48365..0000000
--- a/rackspace/cdn/v1/services/delegate_test.go
+++ /dev/null
@@ -1,359 +0,0 @@
-package services
-
-import (
-	"testing"
-
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/cdn/v1/services"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	os.HandleListCDNServiceSuccessfully(t)
-
-	count := 0
-
-	err := List(fake.ServiceClient(), &os.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := os.ExtractServices(page)
-		if err != nil {
-			t.Errorf("Failed to extract services: %v", err)
-			return false, err
-		}
-
-		expected := []os.Service{
-			os.Service{
-				ID:   "96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0",
-				Name: "mywebsite.com",
-				Domains: []os.Domain{
-					os.Domain{
-						Domain: "www.mywebsite.com",
-					},
-				},
-				Origins: []os.Origin{
-					os.Origin{
-						Origin: "mywebsite.com",
-						Port:   80,
-						SSL:    false,
-					},
-				},
-				Caching: []os.CacheRule{
-					os.CacheRule{
-						Name: "default",
-						TTL:  3600,
-					},
-					os.CacheRule{
-						Name: "home",
-						TTL:  17200,
-						Rules: []os.TTLRule{
-							os.TTLRule{
-								Name:       "index",
-								RequestURL: "/index.htm",
-							},
-						},
-					},
-					os.CacheRule{
-						Name: "images",
-						TTL:  12800,
-						Rules: []os.TTLRule{
-							os.TTLRule{
-								Name:       "images",
-								RequestURL: "*.png",
-							},
-						},
-					},
-				},
-				Restrictions: []os.Restriction{
-					os.Restriction{
-						Name: "website only",
-						Rules: []os.RestrictionRule{
-							os.RestrictionRule{
-								Name:     "mywebsite.com",
-								Referrer: "www.mywebsite.com",
-							},
-						},
-					},
-				},
-				FlavorID: "asia",
-				Status:   "deployed",
-				Errors:   []os.Error{},
-				Links: []gophercloud.Link{
-					gophercloud.Link{
-						Href: "https://www.poppycdn.io/v1.0/services/96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0",
-						Rel:  "self",
-					},
-					gophercloud.Link{
-						Href: "mywebsite.com.cdn123.poppycdn.net",
-						Rel:  "access_url",
-					},
-					gophercloud.Link{
-						Href: "https://www.poppycdn.io/v1.0/flavors/asia",
-						Rel:  "flavor",
-					},
-				},
-			},
-			os.Service{
-				ID:   "96737ae3-cfc1-4c72-be88-5d0e7cc9a3f1",
-				Name: "myothersite.com",
-				Domains: []os.Domain{
-					os.Domain{
-						Domain: "www.myothersite.com",
-					},
-				},
-				Origins: []os.Origin{
-					os.Origin{
-						Origin: "44.33.22.11",
-						Port:   80,
-						SSL:    false,
-					},
-					os.Origin{
-						Origin: "77.66.55.44",
-						Port:   80,
-						SSL:    false,
-						Rules: []os.OriginRule{
-							os.OriginRule{
-								Name:       "videos",
-								RequestURL: "^/videos/*.m3u",
-							},
-						},
-					},
-				},
-				Caching: []os.CacheRule{
-					os.CacheRule{
-						Name: "default",
-						TTL:  3600,
-					},
-				},
-				Restrictions: []os.Restriction{},
-				FlavorID:     "europe",
-				Status:       "deployed",
-				Links: []gophercloud.Link{
-					gophercloud.Link{
-						Href: "https://www.poppycdn.io/v1.0/services/96737ae3-cfc1-4c72-be88-5d0e7cc9a3f1",
-						Rel:  "self",
-					},
-					gophercloud.Link{
-						Href: "myothersite.com.poppycdn.net",
-						Rel:  "access_url",
-					},
-					gophercloud.Link{
-						Href: "https://www.poppycdn.io/v1.0/flavors/europe",
-						Rel:  "flavor",
-					},
-				},
-			},
-		}
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-
-	if count != 1 {
-		t.Errorf("Expected 1 page, got %d", count)
-	}
-}
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	os.HandleCreateCDNServiceSuccessfully(t)
-
-	createOpts := os.CreateOpts{
-		Name: "mywebsite.com",
-		Domains: []os.Domain{
-			os.Domain{
-				Domain: "www.mywebsite.com",
-			},
-			os.Domain{
-				Domain: "blog.mywebsite.com",
-			},
-		},
-		Origins: []os.Origin{
-			os.Origin{
-				Origin: "mywebsite.com",
-				Port:   80,
-				SSL:    false,
-			},
-		},
-		Restrictions: []os.Restriction{
-			os.Restriction{
-				Name: "website only",
-				Rules: []os.RestrictionRule{
-					os.RestrictionRule{
-						Name:     "mywebsite.com",
-						Referrer: "www.mywebsite.com",
-					},
-				},
-			},
-		},
-		Caching: []os.CacheRule{
-			os.CacheRule{
-				Name: "default",
-				TTL:  3600,
-			},
-		},
-		FlavorID: "cdn",
-	}
-
-	expected := "https://global.cdn.api.rackspacecloud.com/v1.0/services/96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0"
-	actual, err := Create(fake.ServiceClient(), createOpts).Extract()
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, expected, actual)
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	os.HandleGetCDNServiceSuccessfully(t)
-
-	expected := &os.Service{
-		ID:   "96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0",
-		Name: "mywebsite.com",
-		Domains: []os.Domain{
-			os.Domain{
-				Domain:   "www.mywebsite.com",
-				Protocol: "http",
-			},
-		},
-		Origins: []os.Origin{
-			os.Origin{
-				Origin: "mywebsite.com",
-				Port:   80,
-				SSL:    false,
-			},
-		},
-		Caching: []os.CacheRule{
-			os.CacheRule{
-				Name: "default",
-				TTL:  3600,
-			},
-			os.CacheRule{
-				Name: "home",
-				TTL:  17200,
-				Rules: []os.TTLRule{
-					os.TTLRule{
-						Name:       "index",
-						RequestURL: "/index.htm",
-					},
-				},
-			},
-			os.CacheRule{
-				Name: "images",
-				TTL:  12800,
-				Rules: []os.TTLRule{
-					os.TTLRule{
-						Name:       "images",
-						RequestURL: "*.png",
-					},
-				},
-			},
-		},
-		Restrictions: []os.Restriction{
-			os.Restriction{
-				Name: "website only",
-				Rules: []os.RestrictionRule{
-					os.RestrictionRule{
-						Name:     "mywebsite.com",
-						Referrer: "www.mywebsite.com",
-					},
-				},
-			},
-		},
-		FlavorID: "cdn",
-		Status:   "deployed",
-		Errors:   []os.Error{},
-		Links: []gophercloud.Link{
-			gophercloud.Link{
-				Href: "https://global.cdn.api.rackspacecloud.com/v1.0/110011/services/96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0",
-				Rel:  "self",
-			},
-			gophercloud.Link{
-				Href: "blog.mywebsite.com.cdn1.raxcdn.com",
-				Rel:  "access_url",
-			},
-			gophercloud.Link{
-				Href: "https://global.cdn.api.rackspacecloud.com/v1.0/110011/flavors/cdn",
-				Rel:  "flavor",
-			},
-		},
-	}
-
-	actual, err := Get(fake.ServiceClient(), "96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0").Extract()
-	th.AssertNoErr(t, err)
-	th.AssertDeepEquals(t, expected, actual)
-}
-
-func TestSuccessfulUpdate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	os.HandleUpdateCDNServiceSuccessfully(t)
-
-	expected := "https://www.poppycdn.io/v1.0/services/96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0"
-	ops := []os.Patch{
-		// Append a single Domain
-		os.Append{Value: os.Domain{Domain: "appended.mocksite4.com"}},
-		// Insert a single Domain
-		os.Insertion{
-			Index: 4,
-			Value: os.Domain{Domain: "inserted.mocksite4.com"},
-		},
-		// Bulk addition
-		os.Append{
-			Value: os.DomainList{
-				os.Domain{Domain: "bulkadded1.mocksite4.com"},
-				os.Domain{Domain: "bulkadded2.mocksite4.com"},
-			},
-		},
-		// Replace a single Origin
-		os.Replacement{
-			Index: 2,
-			Value: os.Origin{Origin: "44.33.22.11", Port: 80, SSL: false},
-		},
-		// Bulk replace Origins
-		os.Replacement{
-			Index: 0, // Ignored
-			Value: os.OriginList{
-				os.Origin{Origin: "44.33.22.11", Port: 80, SSL: false},
-				os.Origin{Origin: "55.44.33.22", Port: 443, SSL: true},
-			},
-		},
-		// Remove a single CacheRule
-		os.Removal{
-			Index: 8,
-			Path:  os.PathCaching,
-		},
-		// Bulk removal
-		os.Removal{
-			All:  true,
-			Path: os.PathCaching,
-		},
-		// Service name replacement
-		os.NameReplacement{
-			NewName: "differentServiceName",
-		},
-	}
-
-	actual, err := Update(fake.ServiceClient(), "96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0", ops).Extract()
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, expected, actual)
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	os.HandleDeleteCDNServiceSuccessfully(t)
-
-	err := Delete(fake.ServiceClient(), "96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0").ExtractErr()
-	th.AssertNoErr(t, err)
-}
diff --git a/rackspace/cdn/v1/services/doc.go b/rackspace/cdn/v1/services/doc.go
deleted file mode 100644
index ee6e2a5..0000000
--- a/rackspace/cdn/v1/services/doc.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// Package services provides information and interaction with the services API
-// resource in the Rackspace CDN service. This API resource allows for
-// listing, creating, updating, retrieving, and deleting services.
-//
-// A service represents an application that has its content cached to the edge
-// nodes.
-package services
diff --git a/rackspace/client.go b/rackspace/client.go
deleted file mode 100644
index a8f413e..0000000
--- a/rackspace/client.go
+++ /dev/null
@@ -1,224 +0,0 @@
-package rackspace
-
-import (
-	"fmt"
-
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack"
-	"github.com/rackspace/gophercloud/openstack/utils"
-	tokens2 "github.com/rackspace/gophercloud/rackspace/identity/v2/tokens"
-)
-
-const (
-	// RackspaceUSIdentity is an identity endpoint located in the United States.
-	RackspaceUSIdentity = "https://identity.api.rackspacecloud.com/v2.0/"
-
-	// RackspaceUKIdentity is an identity endpoint located in the UK.
-	RackspaceUKIdentity = "https://lon.identity.api.rackspacecloud.com/v2.0/"
-)
-
-const (
-	v20 = "v2.0"
-)
-
-// NewClient creates a client that's prepared to communicate with the Rackspace API, but is not
-// yet authenticated. Most users will probably prefer using the AuthenticatedClient function
-// instead.
-//
-// Provide the base URL of the identity endpoint you wish to authenticate against as "endpoint".
-// Often, this will be either RackspaceUSIdentity or RackspaceUKIdentity.
-func NewClient(endpoint string) (*gophercloud.ProviderClient, error) {
-	if endpoint == "" {
-		return os.NewClient(RackspaceUSIdentity)
-	}
-	return os.NewClient(endpoint)
-}
-
-// AuthenticatedClient logs in to Rackspace with the provided credentials and constructs a
-// ProviderClient that's ready to operate.
-//
-// If the provided AuthOptions does not specify an explicit IdentityEndpoint, it will default to
-// the canonical, production Rackspace US identity endpoint.
-func AuthenticatedClient(options gophercloud.AuthOptions) (*gophercloud.ProviderClient, error) {
-	client, err := NewClient(options.IdentityEndpoint)
-	if err != nil {
-		return nil, err
-	}
-
-	err = Authenticate(client, options)
-	if err != nil {
-		return nil, err
-	}
-	return client, nil
-}
-
-// Authenticate or re-authenticate against the most recent identity service supported at the
-// provided endpoint.
-func Authenticate(client *gophercloud.ProviderClient, options gophercloud.AuthOptions) error {
-	versions := []*utils.Version{
-		&utils.Version{ID: v20, Priority: 20, Suffix: "/v2.0/"},
-	}
-
-	chosen, endpoint, err := utils.ChooseVersion(client, versions)
-	if err != nil {
-		return err
-	}
-
-	switch chosen.ID {
-	case v20:
-		return v2auth(client, endpoint, options)
-	default:
-		// The switch statement must be out of date from the versions list.
-		return fmt.Errorf("Unrecognized identity version: %s", chosen.ID)
-	}
-}
-
-// AuthenticateV2 explicitly authenticates with v2 of the identity service.
-func AuthenticateV2(client *gophercloud.ProviderClient, options gophercloud.AuthOptions) error {
-	return v2auth(client, "", options)
-}
-
-func v2auth(client *gophercloud.ProviderClient, endpoint string, options gophercloud.AuthOptions) error {
-	v2Client := NewIdentityV2(client)
-	if endpoint != "" {
-		v2Client.Endpoint = endpoint
-	}
-
-	result := tokens2.Create(v2Client, tokens2.WrapOptions(options))
-
-	token, err := result.ExtractToken()
-	if err != nil {
-		return err
-	}
-
-	catalog, err := result.ExtractServiceCatalog()
-	if err != nil {
-		return err
-	}
-
-	if options.AllowReauth {
-		client.ReauthFunc = func() error {
-			return AuthenticateV2(client, options)
-		}
-	}
-	client.TokenID = token.ID
-	client.EndpointLocator = func(opts gophercloud.EndpointOpts) (string, error) {
-		return os.V2EndpointURL(catalog, opts)
-	}
-
-	return nil
-}
-
-// NewIdentityV2 creates a ServiceClient that may be used to access the v2 identity service.
-func NewIdentityV2(client *gophercloud.ProviderClient) *gophercloud.ServiceClient {
-	v2Endpoint := client.IdentityBase + "v2.0/"
-
-	return &gophercloud.ServiceClient{
-		ProviderClient: client,
-		Endpoint:       v2Endpoint,
-	}
-}
-
-// NewComputeV2 creates a ServiceClient that may be used to access the v2 compute service.
-func NewComputeV2(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) {
-	eo.ApplyDefaults("compute")
-	url, err := client.EndpointLocator(eo)
-	if err != nil {
-		return nil, err
-	}
-
-	return &gophercloud.ServiceClient{
-		ProviderClient: client,
-		Endpoint:       url,
-	}, nil
-}
-
-// NewObjectCDNV1 creates a ServiceClient that may be used with the Rackspace v1 CDN.
-func NewObjectCDNV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) {
-	eo.ApplyDefaults("rax:object-cdn")
-	url, err := client.EndpointLocator(eo)
-	if err != nil {
-		return nil, err
-	}
-	return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil
-}
-
-// NewObjectStorageV1 creates a ServiceClient that may be used with the Rackspace v1 object storage package.
-func NewObjectStorageV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) {
-	return os.NewObjectStorageV1(client, eo)
-}
-
-// NewBlockStorageV1 creates a ServiceClient that can be used to access the
-// Rackspace Cloud Block Storage v1 API.
-func NewBlockStorageV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) {
-	eo.ApplyDefaults("volume")
-	url, err := client.EndpointLocator(eo)
-	if err != nil {
-		return nil, err
-	}
-
-	return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil
-}
-
-// NewLBV1 creates a ServiceClient that can be used to access the Rackspace
-// Cloud Load Balancer v1 API.
-func NewLBV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) {
-	eo.ApplyDefaults("rax:load-balancer")
-	url, err := client.EndpointLocator(eo)
-	if err != nil {
-		return nil, err
-	}
-	return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil
-}
-
-// NewNetworkV2 creates a ServiceClient that can be used to access the Rackspace
-// Networking v2 API.
-func NewNetworkV2(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) {
-	eo.ApplyDefaults("network")
-	url, err := client.EndpointLocator(eo)
-	if err != nil {
-		return nil, err
-	}
-	return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil
-}
-
-// NewCDNV1 creates a ServiceClient that may be used to access the Rackspace v1
-// CDN service.
-func NewCDNV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) {
-	eo.ApplyDefaults("rax:cdn")
-	url, err := client.EndpointLocator(eo)
-	if err != nil {
-		return nil, err
-	}
-	return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil
-}
-
-// NewOrchestrationV1 creates a ServiceClient that may be used to access the v1 orchestration service.
-func NewOrchestrationV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) {
-	eo.ApplyDefaults("orchestration")
-	url, err := client.EndpointLocator(eo)
-	if err != nil {
-		return nil, err
-	}
-	return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil
-}
-
-// NewRackConnectV3 creates a ServiceClient that may be used to access the v3 RackConnect service.
-func NewRackConnectV3(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) {
-	eo.ApplyDefaults("rax:rackconnect")
-	url, err := client.EndpointLocator(eo)
-	if err != nil {
-		return nil, err
-	}
-	return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil
-}
-
-// NewDBV1 creates a ServiceClient that may be used to access the v1 DB service.
-func NewDBV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) {
-	eo.ApplyDefaults("rax:database")
-	url, err := client.EndpointLocator(eo)
-	if err != nil {
-		return nil, err
-	}
-	return &gophercloud.ServiceClient{ProviderClient: client, Endpoint: url}, nil
-}
diff --git a/rackspace/client_test.go b/rackspace/client_test.go
deleted file mode 100644
index 73b1c88..0000000
--- a/rackspace/client_test.go
+++ /dev/null
@@ -1,38 +0,0 @@
-package rackspace
-
-import (
-	"fmt"
-	"net/http"
-	"testing"
-
-	"github.com/rackspace/gophercloud"
-	th "github.com/rackspace/gophercloud/testhelper"
-)
-
-func TestAuthenticatedClientV2(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/v2.0/tokens", func(w http.ResponseWriter, r *http.Request) {
-		fmt.Fprintf(w, `
-      {
-        "access": {
-          "token": {
-            "id": "01234567890",
-            "expires": "2014-10-01T10:00:00.000000Z"
-          },
-          "serviceCatalog": []
-        }
-      }
-    `)
-	})
-
-	options := gophercloud.AuthOptions{
-		Username:         "me",
-		APIKey:           "09876543210",
-		IdentityEndpoint: th.Endpoint() + "v2.0/",
-	}
-	client, err := AuthenticatedClient(options)
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, "01234567890", client.TokenID)
-}
diff --git a/rackspace/compute/v2/bootfromvolume/delegate.go b/rackspace/compute/v2/bootfromvolume/delegate.go
deleted file mode 100644
index 2580459..0000000
--- a/rackspace/compute/v2/bootfromvolume/delegate.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package bootfromvolume
-
-import (
-	"github.com/rackspace/gophercloud"
-	osBFV "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/bootfromvolume"
-	osServers "github.com/rackspace/gophercloud/openstack/compute/v2/servers"
-)
-
-// Create requests the creation of a server from the given block device mapping.
-func Create(client *gophercloud.ServiceClient, opts osServers.CreateOptsBuilder) osServers.CreateResult {
-	return osBFV.Create(client, opts)
-}
diff --git a/rackspace/compute/v2/bootfromvolume/delegate_test.go b/rackspace/compute/v2/bootfromvolume/delegate_test.go
deleted file mode 100644
index 571a1be..0000000
--- a/rackspace/compute/v2/bootfromvolume/delegate_test.go
+++ /dev/null
@@ -1,54 +0,0 @@
-package bootfromvolume
-
-import (
-	"testing"
-
-	osBFV "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/bootfromvolume"
-	"github.com/rackspace/gophercloud/openstack/compute/v2/servers"
-	th "github.com/rackspace/gophercloud/testhelper"
-)
-
-func TestCreateOpts(t *testing.T) {
-	base := servers.CreateOpts{
-		Name:      "createdserver",
-		ImageRef:  "asdfasdfasdf",
-		FlavorRef: "performance1-1",
-	}
-
-	ext := osBFV.CreateOptsExt{
-		CreateOptsBuilder: base,
-		BlockDevice: []osBFV.BlockDevice{
-			osBFV.BlockDevice{
-				UUID:            "123456",
-				SourceType:      osBFV.Image,
-				DestinationType: "volume",
-				VolumeSize:      10,
-			},
-		},
-	}
-
-	expected := `
-    {
-      "server": {
-        "name": "createdserver",
-        "imageRef": "asdfasdfasdf",
-        "flavorRef": "performance1-1",
-	"flavorName": "",
-	"imageName": "",
-        "block_device_mapping_v2":[
-          {
-            "uuid":"123456",
-            "source_type":"image",
-            "destination_type":"volume",
-            "boot_index": "0",
-            "delete_on_termination": "false",
-            "volume_size": "10"
-          }
-        ]
-      }
-    }
-  `
-	actual, err := ext.ToServerCreateMap()
-	th.AssertNoErr(t, err)
-	th.CheckJSONEquals(t, expected, actual)
-}
diff --git a/rackspace/compute/v2/flavors/delegate.go b/rackspace/compute/v2/flavors/delegate.go
deleted file mode 100644
index 081ea47..0000000
--- a/rackspace/compute/v2/flavors/delegate.go
+++ /dev/null
@@ -1,43 +0,0 @@
-package flavors
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/compute/v2/flavors"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// ListOpts helps control the results returned by the List() function. For example, a flavor with a
-// minDisk field of 10 will not be returned if you specify MinDisk set to 20.
-type ListOpts struct {
-
-	// MinDisk and MinRAM, if provided, elide flavors that do not meet your criteria.
-	MinDisk int `q:"minDisk"`
-	MinRAM  int `q:"minRam"`
-
-	// Marker specifies the ID of the last flavor in the previous page.
-	Marker string `q:"marker"`
-
-	// Limit instructs List to refrain from sending excessively large lists of flavors.
-	Limit int `q:"limit"`
-}
-
-// ToFlavorListQuery formats a ListOpts into a query string.
-func (opts ListOpts) ToFlavorListQuery() (string, error) {
-	q, err := gophercloud.BuildQueryString(opts)
-	if err != nil {
-		return "", err
-	}
-	return q.String(), nil
-}
-
-// ListDetail enumerates the server images available to your account.
-func ListDetail(client *gophercloud.ServiceClient, opts os.ListOptsBuilder) pagination.Pager {
-	return os.ListDetail(client, opts)
-}
-
-// Get returns details about a single flavor, identity by ID.
-func Get(client *gophercloud.ServiceClient, id string) GetResult {
-	var res GetResult
-	_, res.Err = client.Get(getURL(client, id), &res.Body, nil)
-	return res
-}
diff --git a/rackspace/compute/v2/flavors/delegate_test.go b/rackspace/compute/v2/flavors/delegate_test.go
deleted file mode 100644
index 204081d..0000000
--- a/rackspace/compute/v2/flavors/delegate_test.go
+++ /dev/null
@@ -1,62 +0,0 @@
-package flavors
-
-import (
-	"fmt"
-	"net/http"
-	"testing"
-
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	"github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestListFlavors(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/flavors/detail", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		r.ParseForm()
-		marker := r.Form.Get("marker")
-		switch marker {
-		case "":
-			fmt.Fprintf(w, ListOutput)
-		case "performance1-2":
-			fmt.Fprintf(w, `{ "flavors": [] }`)
-		default:
-			t.Fatalf("Unexpected marker: [%s]", marker)
-		}
-	})
-
-	count := 0
-	err := ListDetail(client.ServiceClient(), nil).EachPage(func(page pagination.Page) (bool, error) {
-		actual, err := ExtractFlavors(page)
-		th.AssertNoErr(t, err)
-		th.CheckDeepEquals(t, ExpectedFlavorSlice, actual)
-
-		count++
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, 1, count)
-}
-
-func TestGetFlavor(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/flavors/performance1-1", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		fmt.Fprintf(w, GetOutput)
-	})
-
-	actual, err := Get(client.ServiceClient(), "performance1-1").Extract()
-	th.AssertNoErr(t, err)
-	th.CheckDeepEquals(t, &Performance1Flavor, actual)
-}
diff --git a/rackspace/compute/v2/flavors/doc.go b/rackspace/compute/v2/flavors/doc.go
deleted file mode 100644
index 278229a..0000000
--- a/rackspace/compute/v2/flavors/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package flavors provides information and interaction with the flavor
-// API resource for the Rackspace Cloud Servers service.
-package flavors
diff --git a/rackspace/compute/v2/flavors/fixtures.go b/rackspace/compute/v2/flavors/fixtures.go
deleted file mode 100644
index 957dccf..0000000
--- a/rackspace/compute/v2/flavors/fixtures.go
+++ /dev/null
@@ -1,137 +0,0 @@
-// +build fixtures
-
-package flavors
-
-// ListOutput is a sample response of a flavor List request.
-const ListOutput = `
-{
-  "flavors": [
-    {
-      "OS-FLV-EXT-DATA:ephemeral": 0,
-      "OS-FLV-WITH-EXT-SPECS:extra_specs": {
-        "class": "performance1",
-        "disk_io_index": "40",
-        "number_of_data_disks": "0",
-        "policy_class": "performance_flavor",
-        "resize_policy_class": "performance_flavor"
-      },
-      "disk": 20,
-      "id": "performance1-1",
-      "links": [
-        {
-          "href": "https://iad.servers.api.rackspacecloud.com/v2/864477/flavors/performance1-1",
-          "rel": "self"
-        },
-        {
-          "href": "https://iad.servers.api.rackspacecloud.com/864477/flavors/performance1-1",
-          "rel": "bookmark"
-        }
-      ],
-      "name": "1 GB Performance",
-      "ram": 1024,
-      "rxtx_factor": 200,
-      "swap": "",
-      "vcpus": 1
-    },
-    {
-      "OS-FLV-EXT-DATA:ephemeral": 20,
-      "OS-FLV-WITH-EXT-SPECS:extra_specs": {
-        "class": "performance1",
-        "disk_io_index": "40",
-        "number_of_data_disks": "1",
-        "policy_class": "performance_flavor",
-        "resize_policy_class": "performance_flavor"
-      },
-      "disk": 40,
-      "id": "performance1-2",
-      "links": [
-        {
-          "href": "https://iad.servers.api.rackspacecloud.com/v2/864477/flavors/performance1-2",
-          "rel": "self"
-        },
-        {
-          "href": "https://iad.servers.api.rackspacecloud.com/864477/flavors/performance1-2",
-          "rel": "bookmark"
-        }
-      ],
-      "name": "2 GB Performance",
-      "ram": 2048,
-      "rxtx_factor": 400,
-      "swap": "",
-      "vcpus": 2
-    }
-  ]
-}`
-
-// GetOutput is a sample response from a flavor Get request. Its contents correspond to the
-// Performance1Flavor struct.
-const GetOutput = `
-{
-  "flavor": {
-    "OS-FLV-EXT-DATA:ephemeral": 0,
-    "OS-FLV-WITH-EXT-SPECS:extra_specs": {
-      "class": "performance1",
-      "disk_io_index": "40",
-      "number_of_data_disks": "0",
-      "policy_class": "performance_flavor",
-      "resize_policy_class": "performance_flavor"
-    },
-    "disk": 20,
-    "id": "performance1-1",
-    "links": [
-      {
-        "href": "https://iad.servers.api.rackspacecloud.com/v2/864477/flavors/performance1-1",
-        "rel": "self"
-      },
-      {
-        "href": "https://iad.servers.api.rackspacecloud.com/864477/flavors/performance1-1",
-        "rel": "bookmark"
-      }
-    ],
-    "name": "1 GB Performance",
-    "ram": 1024,
-    "rxtx_factor": 200,
-    "swap": "",
-    "vcpus": 1
-  }
-}
-`
-
-// Performance1Flavor is the expected result of parsing GetOutput, or the first element of
-// ListOutput.
-var Performance1Flavor = Flavor{
-	ID:         "performance1-1",
-	Disk:       20,
-	RAM:        1024,
-	Name:       "1 GB Performance",
-	RxTxFactor: 200.0,
-	Swap:       0,
-	VCPUs:      1,
-	ExtraSpecs: ExtraSpecs{
-		NumDataDisks: 0,
-		Class:        "performance1",
-		DiskIOIndex:  0,
-		PolicyClass:  "performance_flavor",
-	},
-}
-
-// Performance2Flavor is the second result expected from parsing ListOutput.
-var Performance2Flavor = Flavor{
-	ID:         "performance1-2",
-	Disk:       40,
-	RAM:        2048,
-	Name:       "2 GB Performance",
-	RxTxFactor: 400.0,
-	Swap:       0,
-	VCPUs:      2,
-	ExtraSpecs: ExtraSpecs{
-		NumDataDisks: 0,
-		Class:        "performance1",
-		DiskIOIndex:  0,
-		PolicyClass:  "performance_flavor",
-	},
-}
-
-// ExpectedFlavorSlice is the slice of Flavor structs that are expected to be parsed from
-// ListOutput.
-var ExpectedFlavorSlice = []Flavor{Performance1Flavor, Performance2Flavor}
diff --git a/rackspace/compute/v2/flavors/results.go b/rackspace/compute/v2/flavors/results.go
deleted file mode 100644
index af444a7..0000000
--- a/rackspace/compute/v2/flavors/results.go
+++ /dev/null
@@ -1,104 +0,0 @@
-package flavors
-
-import (
-	"reflect"
-
-	"github.com/rackspace/gophercloud"
-	"github.com/mitchellh/mapstructure"
-	os "github.com/rackspace/gophercloud/openstack/compute/v2/flavors"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// ExtraSpecs provide additional information about the flavor.
-type ExtraSpecs struct {
-	// The number of data disks
-	NumDataDisks int `mapstructure:"number_of_data_disks"`
-	// The flavor class
-	Class string `mapstructure:"class"`
-	// Relative measure of disk I/O performance from 0-99, where higher is faster
-	DiskIOIndex int    `mapstructure:"disk_io_index"`
-	PolicyClass string `mapstructure:"policy_class"`
-}
-
-// Flavor records represent (virtual) hardware configurations for server resources in a region.
-type Flavor struct {
-	// The Id field contains the flavor's unique identifier.
-	// For example, this identifier will be useful when specifying which hardware configuration to use for a new server instance.
-	ID string `mapstructure:"id"`
-
-	// The Disk and RA< fields provide a measure of storage space offered by the flavor, in GB and MB, respectively.
-	Disk int `mapstructure:"disk"`
-	RAM  int `mapstructure:"ram"`
-
-	// The Name field provides a human-readable moniker for the flavor.
-	Name string `mapstructure:"name"`
-
-	RxTxFactor float64 `mapstructure:"rxtx_factor"`
-
-	// Swap indicates how much space is reserved for swap.
-	// If not provided, this field will be set to 0.
-	Swap int `mapstructure:"swap"`
-
-	// VCPUs indicates how many (virtual) CPUs are available for this flavor.
-	VCPUs int `mapstructure:"vcpus"`
-
-	// ExtraSpecs provides extra information about the flavor
-	ExtraSpecs ExtraSpecs `mapstructure:"OS-FLV-WITH-EXT-SPECS:extra_specs"`
-}
-
-// GetResult temporarily holds the response from a Get call.
-type GetResult struct {
-	gophercloud.Result
-}
-
-// Extract provides access to the individual Flavor returned by the Get function.
-func (gr GetResult) Extract() (*Flavor, error) {
-	if gr.Err != nil {
-		return nil, gr.Err
-	}
-
-	var result struct {
-		Flavor Flavor `mapstructure:"flavor"`
-	}
-
-	cfg := &mapstructure.DecoderConfig{
-		DecodeHook: defaulter,
-		Result:     &result,
-	}
-	decoder, err := mapstructure.NewDecoder(cfg)
-	if err != nil {
-		return nil, err
-	}
-	err = decoder.Decode(gr.Body)
-	return &result.Flavor, err
-}
-
-func defaulter(from, to reflect.Kind, v interface{}) (interface{}, error) {
-	if (from == reflect.String) && (to == reflect.Int) {
-		return 0, nil
-	}
-	return v, nil
-}
-
-// ExtractFlavors provides access to the list of flavors in a page acquired from the List operation.
-func ExtractFlavors(page pagination.Page) ([]Flavor, error) {
-	casted := page.(os.FlavorPage).Body
-	var container struct {
-		Flavors []Flavor `mapstructure:"flavors"`
-	}
-
-	cfg := &mapstructure.DecoderConfig{
-		DecodeHook: defaulter,
-		Result:     &container,
-	}
-	decoder, err := mapstructure.NewDecoder(cfg)
-	if err != nil {
-		return container.Flavors, err
-	}
-	err = decoder.Decode(casted)
-	if err != nil {
-		return container.Flavors, err
-	}
-
-	return container.Flavors, nil
-}
diff --git a/rackspace/compute/v2/flavors/urls.go b/rackspace/compute/v2/flavors/urls.go
deleted file mode 100644
index f4e2c3d..0000000
--- a/rackspace/compute/v2/flavors/urls.go
+++ /dev/null
@@ -1,9 +0,0 @@
-package flavors
-
-import (
-	"github.com/rackspace/gophercloud"
-)
-
-func getURL(client *gophercloud.ServiceClient, id string) string {
-	return client.ServiceURL("flavors", id)
-}
diff --git a/rackspace/compute/v2/images/delegate.go b/rackspace/compute/v2/images/delegate.go
deleted file mode 100644
index 18e1f31..0000000
--- a/rackspace/compute/v2/images/delegate.go
+++ /dev/null
@@ -1,22 +0,0 @@
-package images
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/compute/v2/images"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// ListDetail enumerates the available server images.
-func ListDetail(client *gophercloud.ServiceClient, opts os.ListOptsBuilder) pagination.Pager {
-	return os.ListDetail(client, opts)
-}
-
-// Get acquires additional detail about a specific image by ID.
-func Get(client *gophercloud.ServiceClient, id string) os.GetResult {
-	return os.Get(client, id)
-}
-
-// ExtractImages interprets a page as a collection of server images.
-func ExtractImages(page pagination.Page) ([]os.Image, error) {
-	return os.ExtractImages(page)
-}
diff --git a/rackspace/compute/v2/images/delegate_test.go b/rackspace/compute/v2/images/delegate_test.go
deleted file mode 100644
index db0a6e3..0000000
--- a/rackspace/compute/v2/images/delegate_test.go
+++ /dev/null
@@ -1,62 +0,0 @@
-package images
-
-import (
-	"fmt"
-	"net/http"
-	"testing"
-
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	"github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestListImageDetails(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/images/detail", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		r.ParseForm()
-		marker := r.Form.Get("marker")
-		switch marker {
-		case "":
-			fmt.Fprintf(w, ListOutput)
-		case "e19a734c-c7e6-443a-830c-242209c4d65d":
-			fmt.Fprintf(w, `{ "images": [] }`)
-		default:
-			t.Fatalf("Unexpected marker: [%s]", marker)
-		}
-	})
-
-	count := 0
-	err := ListDetail(client.ServiceClient(), nil).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractImages(page)
-		th.AssertNoErr(t, err)
-		th.CheckDeepEquals(t, ExpectedImageSlice, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, 1, count)
-}
-
-func TestGetImageDetails(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/images/e19a734c-c7e6-443a-830c-242209c4d65d", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		fmt.Fprintf(w, GetOutput)
-	})
-
-	actual, err := Get(client.ServiceClient(), "e19a734c-c7e6-443a-830c-242209c4d65d").Extract()
-	th.AssertNoErr(t, err)
-	th.CheckDeepEquals(t, &UbuntuImage, actual)
-}
diff --git a/rackspace/compute/v2/images/doc.go b/rackspace/compute/v2/images/doc.go
deleted file mode 100644
index cfae806..0000000
--- a/rackspace/compute/v2/images/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package images provides information and interaction with the image
-// API resource for the Rackspace Cloud Servers service.
-package images
diff --git a/rackspace/compute/v2/images/fixtures.go b/rackspace/compute/v2/images/fixtures.go
deleted file mode 100644
index ccfbdc6..0000000
--- a/rackspace/compute/v2/images/fixtures.go
+++ /dev/null
@@ -1,200 +0,0 @@
-// +build fixtures
-
-package images
-
-import (
-	os "github.com/rackspace/gophercloud/openstack/compute/v2/images"
-)
-
-// ListOutput is an example response from an /images/detail request.
-const ListOutput = `
-{
-	"images": [
-		{
-			"OS-DCF:diskConfig": "MANUAL",
-			"OS-EXT-IMG-SIZE:size": 1.017415075e+09,
-			"created": "2014-10-01T15:49:02Z",
-			"id": "30aa010e-080e-4d4b-a7f9-09fc55b07d69",
-			"links": [
-				{
-					"href": "https://iad.servers.api.rackspacecloud.com/v2/111222/images/30aa010e-080e-4d4b-a7f9-09fc55b07d69",
-					"rel": "self"
-				},
-				{
-					"href": "https://iad.servers.api.rackspacecloud.com/111222/images/30aa010e-080e-4d4b-a7f9-09fc55b07d69",
-					"rel": "bookmark"
-				},
-				{
-					"href": "https://iad.servers.api.rackspacecloud.com/111222/images/30aa010e-080e-4d4b-a7f9-09fc55b07d69",
-					"rel": "alternate",
-					"type": "application/vnd.openstack.image"
-				}
-			],
-			"metadata": {
-				"auto_disk_config": "disabled",
-				"cache_in_nova": "True",
-				"com.rackspace__1__build_core": "1",
-				"com.rackspace__1__build_managed": "1",
-				"com.rackspace__1__build_rackconnect": "1",
-				"com.rackspace__1__options": "0",
-				"com.rackspace__1__platform_target": "PublicCloud",
-				"com.rackspace__1__release_build_date": "2014-10-01_15-46-08",
-				"com.rackspace__1__release_id": "100",
-				"com.rackspace__1__release_version": "10",
-				"com.rackspace__1__source": "kickstart",
-				"com.rackspace__1__visible_core": "1",
-				"com.rackspace__1__visible_managed": "0",
-				"com.rackspace__1__visible_rackconnect": "0",
-				"image_type": "base",
-				"org.openstack__1__architecture": "x64",
-				"org.openstack__1__os_distro": "org.archlinux",
-				"org.openstack__1__os_version": "2014.8",
-				"os_distro": "arch",
-				"os_type": "linux",
-				"vm_mode": "hvm"
-			},
-			"minDisk": 20,
-			"minRam": 512,
-			"name": "Arch 2014.10 (PVHVM)",
-			"progress": 100,
-			"status": "ACTIVE",
-			"updated": "2014-10-01T19:37:58Z"
-		},
-		{
-			"OS-DCF:diskConfig": "AUTO",
-			"OS-EXT-IMG-SIZE:size": 1.060306463e+09,
-			"created": "2014-10-01T12:58:11Z",
-			"id": "e19a734c-c7e6-443a-830c-242209c4d65d",
-			"links": [
-				{
-					"href": "https://iad.servers.api.rackspacecloud.com/v2/111222/images/e19a734c-c7e6-443a-830c-242209c4d65d",
-					"rel": "self"
-				},
-				{
-					"href": "https://iad.servers.api.rackspacecloud.com/111222/images/e19a734c-c7e6-443a-830c-242209c4d65d",
-					"rel": "bookmark"
-				},
-				{
-					"href": "https://iad.servers.api.rackspacecloud.com/111222/images/e19a734c-c7e6-443a-830c-242209c4d65d",
-					"rel": "alternate",
-					"type": "application/vnd.openstack.image"
-				}
-			],
-			"metadata": {
-				"auto_disk_config": "True",
-				"cache_in_nova": "True",
-				"com.rackspace__1__build_core": "1",
-				"com.rackspace__1__build_managed": "1",
-				"com.rackspace__1__build_rackconnect": "1",
-				"com.rackspace__1__options": "0",
-				"com.rackspace__1__platform_target": "PublicCloud",
-				"com.rackspace__1__release_build_date": "2014-10-01_12-31-03",
-				"com.rackspace__1__release_id": "1007",
-				"com.rackspace__1__release_version": "6",
-				"com.rackspace__1__source": "kickstart",
-				"com.rackspace__1__visible_core": "1",
-				"com.rackspace__1__visible_managed": "1",
-				"com.rackspace__1__visible_rackconnect": "1",
-				"image_type": "base",
-				"org.openstack__1__architecture": "x64",
-				"org.openstack__1__os_distro": "com.ubuntu",
-				"org.openstack__1__os_version": "14.04",
-				"os_distro": "ubuntu",
-				"os_type": "linux",
-				"vm_mode": "xen"
-			},
-			"minDisk": 20,
-			"minRam": 512,
-			"name": "Ubuntu 14.04 LTS (Trusty Tahr)",
-			"progress": 100,
-			"status": "ACTIVE",
-			"updated": "2014-10-01T15:51:44Z"
-		}
-	]
-}
-`
-
-// GetOutput is an example response from an /images request.
-const GetOutput = `
-{
-	"image": {
-		"OS-DCF:diskConfig": "AUTO",
-		"OS-EXT-IMG-SIZE:size": 1060306463,
-		"created": "2014-10-01T12:58:11Z",
-		"id": "e19a734c-c7e6-443a-830c-242209c4d65d",
-		"links": [
-			{
-				"href": "https://iad.servers.api.rackspacecloud.com/v2/111222/images/e19a734c-c7e6-443a-830c-242209c4d65d",
-				"rel": "self"
-			},
-			{
-				"href": "https://iad.servers.api.rackspacecloud.com/111222/images/e19a734c-c7e6-443a-830c-242209c4d65d",
-				"rel": "bookmark"
-			},
-			{
-				"href": "https://iad.servers.api.rackspacecloud.com/111222/images/e19a734c-c7e6-443a-830c-242209c4d65d",
-				"rel": "alternate",
-				"type": "application/vnd.openstack.image"
-			}
-		],
-		"metadata": {
-			"auto_disk_config": "True",
-			"cache_in_nova": "True",
-			"com.rackspace__1__build_core": "1",
-			"com.rackspace__1__build_managed": "1",
-			"com.rackspace__1__build_rackconnect": "1",
-			"com.rackspace__1__options": "0",
-			"com.rackspace__1__platform_target": "PublicCloud",
-			"com.rackspace__1__release_build_date": "2014-10-01_12-31-03",
-			"com.rackspace__1__release_id": "1007",
-			"com.rackspace__1__release_version": "6",
-			"com.rackspace__1__source": "kickstart",
-			"com.rackspace__1__visible_core": "1",
-			"com.rackspace__1__visible_managed": "1",
-			"com.rackspace__1__visible_rackconnect": "1",
-			"image_type": "base",
-			"org.openstack__1__architecture": "x64",
-			"org.openstack__1__os_distro": "com.ubuntu",
-			"org.openstack__1__os_version": "14.04",
-			"os_distro": "ubuntu",
-			"os_type": "linux",
-			"vm_mode": "xen"
-		},
-		"minDisk": 20,
-		"minRam": 512,
-		"name": "Ubuntu 14.04 LTS (Trusty Tahr)",
-		"progress": 100,
-		"status": "ACTIVE",
-		"updated": "2014-10-01T15:51:44Z"
-	}
-}
-`
-
-// ArchImage is the first Image structure that should be parsed from ListOutput.
-var ArchImage = os.Image{
-	ID:       "30aa010e-080e-4d4b-a7f9-09fc55b07d69",
-	Name:     "Arch 2014.10 (PVHVM)",
-	Created:  "2014-10-01T15:49:02Z",
-	Updated:  "2014-10-01T19:37:58Z",
-	MinDisk:  20,
-	MinRAM:   512,
-	Progress: 100,
-	Status:   "ACTIVE",
-}
-
-// UbuntuImage is the second Image structure that should be parsed from ListOutput and
-// the only image that should be extracted from GetOutput.
-var UbuntuImage = os.Image{
-	ID:       "e19a734c-c7e6-443a-830c-242209c4d65d",
-	Name:     "Ubuntu 14.04 LTS (Trusty Tahr)",
-	Created:  "2014-10-01T12:58:11Z",
-	Updated:  "2014-10-01T15:51:44Z",
-	MinDisk:  20,
-	MinRAM:   512,
-	Progress: 100,
-	Status:   "ACTIVE",
-}
-
-// ExpectedImageSlice is the collection of images that should be parsed from ListOutput,
-// in order.
-var ExpectedImageSlice = []os.Image{ArchImage, UbuntuImage}
diff --git a/rackspace/compute/v2/keypairs/delegate.go b/rackspace/compute/v2/keypairs/delegate.go
deleted file mode 100644
index 3e53525..0000000
--- a/rackspace/compute/v2/keypairs/delegate.go
+++ /dev/null
@@ -1,33 +0,0 @@
-package keypairs
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/keypairs"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List returns a Pager that allows you to iterate over a collection of KeyPairs.
-func List(client *gophercloud.ServiceClient) pagination.Pager {
-	return os.List(client)
-}
-
-// Create requests the creation of a new keypair on the server, or to import a pre-existing
-// keypair.
-func Create(client *gophercloud.ServiceClient, opts os.CreateOptsBuilder) os.CreateResult {
-	return os.Create(client, opts)
-}
-
-// Get returns public data about a previously uploaded KeyPair.
-func Get(client *gophercloud.ServiceClient, name string) os.GetResult {
-	return os.Get(client, name)
-}
-
-// Delete requests the deletion of a previous stored KeyPair from the server.
-func Delete(client *gophercloud.ServiceClient, name string) os.DeleteResult {
-	return os.Delete(client, name)
-}
-
-// ExtractKeyPairs interprets a page of results as a slice of KeyPairs.
-func ExtractKeyPairs(page pagination.Page) ([]os.KeyPair, error) {
-	return os.ExtractKeyPairs(page)
-}
diff --git a/rackspace/compute/v2/keypairs/delegate_test.go b/rackspace/compute/v2/keypairs/delegate_test.go
deleted file mode 100644
index 62e5df9..0000000
--- a/rackspace/compute/v2/keypairs/delegate_test.go
+++ /dev/null
@@ -1,72 +0,0 @@
-package keypairs
-
-import (
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/keypairs"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	"github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleListSuccessfully(t)
-
-	count := 0
-	err := List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractKeyPairs(page)
-		th.AssertNoErr(t, err)
-		th.CheckDeepEquals(t, os.ExpectedKeyPairSlice, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, 1, count)
-}
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleCreateSuccessfully(t)
-
-	actual, err := Create(client.ServiceClient(), os.CreateOpts{
-		Name: "createdkey",
-	}).Extract()
-	th.AssertNoErr(t, err)
-	th.CheckDeepEquals(t, &os.CreatedKeyPair, actual)
-}
-
-func TestImport(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleImportSuccessfully(t)
-
-	actual, err := Create(client.ServiceClient(), os.CreateOpts{
-		Name:      "importedkey",
-		PublicKey: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDx8nkQv/zgGgB4rMYmIf+6A4l6Rr+o/6lHBQdW5aYd44bd8JttDCE/F/pNRr0lRE+PiqSPO8nDPHw0010JeMH9gYgnnFlyY3/OcJ02RhIPyyxYpv9FhY+2YiUkpwFOcLImyrxEsYXpD/0d3ac30bNH6Sw9JD9UZHYcpSxsIbECHw== Generated by Nova",
-	}).Extract()
-	th.AssertNoErr(t, err)
-	th.CheckDeepEquals(t, &os.ImportedKeyPair, actual)
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleGetSuccessfully(t)
-
-	actual, err := Get(client.ServiceClient(), "firstkey").Extract()
-	th.AssertNoErr(t, err)
-	th.CheckDeepEquals(t, &os.FirstKeyPair, actual)
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleDeleteSuccessfully(t)
-
-	err := Delete(client.ServiceClient(), "deletedkey").ExtractErr()
-	th.AssertNoErr(t, err)
-}
diff --git a/rackspace/compute/v2/keypairs/doc.go b/rackspace/compute/v2/keypairs/doc.go
deleted file mode 100644
index 3171375..0000000
--- a/rackspace/compute/v2/keypairs/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package keypairs provides information and interaction with the keypair
-// API resource for the Rackspace Cloud Servers service.
-package keypairs
diff --git a/rackspace/compute/v2/networks/doc.go b/rackspace/compute/v2/networks/doc.go
deleted file mode 100644
index 8e5c773..0000000
--- a/rackspace/compute/v2/networks/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package networks provides information and interaction with the network
-// API resource for the Rackspace Cloud Servers service.
-package networks
diff --git a/rackspace/compute/v2/networks/requests.go b/rackspace/compute/v2/networks/requests.go
deleted file mode 100644
index cebbffd..0000000
--- a/rackspace/compute/v2/networks/requests.go
+++ /dev/null
@@ -1,89 +0,0 @@
-package networks
-
-import (
-	"errors"
-
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List returns a Pager which allows you to iterate over a collection of
-// networks. It accepts a ListOpts struct, which allows you to filter and sort
-// the returned collection for greater efficiency.
-func List(c *gophercloud.ServiceClient) pagination.Pager {
-	createPage := func(r pagination.PageResult) pagination.Page {
-		return NetworkPage{pagination.SinglePageBase(r)}
-	}
-
-	return pagination.NewPager(c, listURL(c), createPage)
-}
-
-// Get retrieves a specific network based on its unique ID.
-func Get(c *gophercloud.ServiceClient, id string) GetResult {
-	var res GetResult
-	_, res.Err = c.Get(getURL(c, id), &res.Body, nil)
-	return res
-}
-
-// CreateOptsBuilder is the interface options structs have to satisfy in order
-// to be used in the main Create operation in this package. Since many
-// extensions decorate or modify the common logic, it is useful for them to
-// satisfy a basic interface in order for them to be used.
-type CreateOptsBuilder interface {
-	ToNetworkCreateMap() (map[string]interface{}, error)
-}
-
-// CreateOpts is the common options struct used in this package's Create
-// operation.
-type CreateOpts struct {
-	// REQUIRED. See Network object for more info.
-	CIDR string
-	// REQUIRED. See Network object for more info.
-	Label string
-}
-
-// ToNetworkCreateMap casts a CreateOpts struct to a map.
-func (opts CreateOpts) ToNetworkCreateMap() (map[string]interface{}, error) {
-	n := make(map[string]interface{})
-
-	if opts.CIDR == "" {
-		return nil, errors.New("Required field CIDR not set.")
-	}
-	if opts.Label == "" {
-		return nil, errors.New("Required field Label not set.")
-	}
-
-	n["label"] = opts.Label
-	n["cidr"] = opts.CIDR
-	return map[string]interface{}{"network": n}, nil
-}
-
-// Create accepts a CreateOpts struct and creates a new network using the values
-// provided. This operation does not actually require a request body, i.e. the
-// CreateOpts struct argument can be empty.
-//
-// The tenant ID that is contained in the URI is the tenant that creates the
-// network. An admin user, however, has the option of specifying another tenant
-// ID in the CreateOpts struct.
-func Create(c *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateResult {
-	var res CreateResult
-
-	reqBody, err := opts.ToNetworkCreateMap()
-	if err != nil {
-		res.Err = err
-		return res
-	}
-
-	// Send request to API
-	_, res.Err = c.Post(createURL(c), reqBody, &res.Body, &gophercloud.RequestOpts{
-		OkCodes: []int{200, 201, 202},
-	})
-	return res
-}
-
-// Delete accepts a unique ID and deletes the network associated with it.
-func Delete(c *gophercloud.ServiceClient, networkID string) DeleteResult {
-	var res DeleteResult
-	_, res.Err = c.Delete(deleteURL(c, networkID), nil)
-	return res
-}
diff --git a/rackspace/compute/v2/networks/requests_test.go b/rackspace/compute/v2/networks/requests_test.go
deleted file mode 100644
index 6f44c1c..0000000
--- a/rackspace/compute/v2/networks/requests_test.go
+++ /dev/null
@@ -1,156 +0,0 @@
-package networks
-
-import (
-	"fmt"
-	"net/http"
-	"testing"
-
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/os-networksv2", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-    "networks": [
-        {
-            "label": "test-network-1",
-            "cidr": "192.168.100.0/24",
-            "id": "d32019d3-bc6e-4319-9c1d-6722fc136a22"
-        },
-        {
-            "label": "test-network-2",
-            "cidr": "192.30.250.00/18",
-            "id": "db193ab3-96e3-4cb3-8fc5-05f4296d0324"
-        }
-    ]
-}
-      `)
-	})
-
-	client := fake.ServiceClient()
-	count := 0
-
-	err := List(client).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractNetworks(page)
-		if err != nil {
-			t.Errorf("Failed to extract networks: %v", err)
-			return false, err
-		}
-
-		expected := []Network{
-			Network{
-				Label: "test-network-1",
-				CIDR:  "192.168.100.0/24",
-				ID:    "d32019d3-bc6e-4319-9c1d-6722fc136a22",
-			},
-			Network{
-				Label: "test-network-2",
-				CIDR:  "192.30.250.00/18",
-				ID:    "db193ab3-96e3-4cb3-8fc5-05f4296d0324",
-			},
-		}
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, 1, count)
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/os-networksv2/d32019d3-bc6e-4319-9c1d-6722fc136a22", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-    "network": {
-        "label": "test-network-1",
-        "cidr": "192.168.100.0/24",
-        "id": "d32019d3-bc6e-4319-9c1d-6722fc136a22"
-    }
-}
-      `)
-	})
-
-	n, err := Get(fake.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22").Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertEquals(t, n.CIDR, "192.168.100.0/24")
-	th.AssertEquals(t, n.Label, "test-network-1")
-	th.AssertEquals(t, n.ID, "d32019d3-bc6e-4319-9c1d-6722fc136a22")
-}
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/os-networksv2", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "POST")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Content-Type", "application/json")
-		th.TestHeader(t, r, "Accept", "application/json")
-		th.TestJSONRequest(t, r, `
-{
-    "network": {
-        "label": "test-network-1",
-        "cidr": "192.168.100.0/24"
-    }
-}
-      `)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusCreated)
-
-		fmt.Fprintf(w, `
-{
-    "network": {
-        "label": "test-network-1",
-        "cidr": "192.168.100.0/24",
-        "id": "4e8e5957-649f-477b-9e5b-f1f75b21c03c"
-    }
-}
-    `)
-	})
-
-	options := CreateOpts{Label: "test-network-1", CIDR: "192.168.100.0/24"}
-	n, err := Create(fake.ServiceClient(), options).Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertEquals(t, n.Label, "test-network-1")
-	th.AssertEquals(t, n.ID, "4e8e5957-649f-477b-9e5b-f1f75b21c03c")
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/os-networksv2/4e8e5957-649f-477b-9e5b-f1f75b21c03c", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		w.WriteHeader(http.StatusNoContent)
-	})
-
-	res := Delete(fake.ServiceClient(), "4e8e5957-649f-477b-9e5b-f1f75b21c03c")
-	th.AssertNoErr(t, res.Err)
-}
diff --git a/rackspace/compute/v2/networks/results.go b/rackspace/compute/v2/networks/results.go
deleted file mode 100644
index eb6a76c..0000000
--- a/rackspace/compute/v2/networks/results.go
+++ /dev/null
@@ -1,81 +0,0 @@
-package networks
-
-import (
-	"github.com/mitchellh/mapstructure"
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-type commonResult struct {
-	gophercloud.Result
-}
-
-// Extract is a function that accepts a result and extracts a network resource.
-func (r commonResult) Extract() (*Network, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-
-	var res struct {
-		Network *Network `json:"network"`
-	}
-
-	err := mapstructure.Decode(r.Body, &res)
-
-	return res.Network, err
-}
-
-// CreateResult represents the result of a create operation.
-type CreateResult struct {
-	commonResult
-}
-
-// GetResult represents the result of a get operation.
-type GetResult struct {
-	commonResult
-}
-
-// DeleteResult represents the result of a delete operation.
-type DeleteResult struct {
-	gophercloud.ErrResult
-}
-
-// Network represents, well, a network.
-type Network struct {
-	// UUID for the network
-	ID string `mapstructure:"id" json:"id"`
-
-	// Human-readable name for the network. Might not be unique.
-	Label string `mapstructure:"label" json:"label"`
-
-	// Classless Inter-Domain Routing
-	CIDR string `mapstructure:"cidr" json:"cidr"`
-}
-
-// NetworkPage is the page returned by a pager when traversing over a
-// collection of networks.
-type NetworkPage struct {
-	pagination.SinglePageBase
-}
-
-// IsEmpty returns true if the NetworkPage contains no Networks.
-func (r NetworkPage) IsEmpty() (bool, error) {
-	networks, err := ExtractNetworks(r)
-	if err != nil {
-		return true, err
-	}
-	return len(networks) == 0, nil
-}
-
-// ExtractNetworks accepts a Page struct, specifically a NetworkPage struct,
-// and extracts the elements into a slice of Network structs. In other words,
-// a generic collection is mapped into a relevant slice.
-func ExtractNetworks(page pagination.Page) ([]Network, error) {
-	var resp struct {
-		Networks []Network `mapstructure:"networks" json:"networks"`
-	}
-
-	err := mapstructure.Decode(page.(NetworkPage).Body, &resp)
-
-	return resp.Networks, err
-}
diff --git a/rackspace/compute/v2/networks/urls.go b/rackspace/compute/v2/networks/urls.go
deleted file mode 100644
index 19a21aa..0000000
--- a/rackspace/compute/v2/networks/urls.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package networks
-
-import "github.com/rackspace/gophercloud"
-
-func resourceURL(c *gophercloud.ServiceClient, id string) string {
-	return c.ServiceURL("os-networksv2", id)
-}
-
-func rootURL(c *gophercloud.ServiceClient) string {
-	return c.ServiceURL("os-networksv2")
-}
-
-func getURL(c *gophercloud.ServiceClient, id string) string {
-	return resourceURL(c, id)
-}
-
-func listURL(c *gophercloud.ServiceClient) string {
-	return rootURL(c)
-}
-
-func createURL(c *gophercloud.ServiceClient) string {
-	return rootURL(c)
-}
-
-func deleteURL(c *gophercloud.ServiceClient, id string) string {
-	return resourceURL(c, id)
-}
diff --git a/rackspace/compute/v2/networks/urls_test.go b/rackspace/compute/v2/networks/urls_test.go
deleted file mode 100644
index 983992e..0000000
--- a/rackspace/compute/v2/networks/urls_test.go
+++ /dev/null
@@ -1,38 +0,0 @@
-package networks
-
-import (
-	"testing"
-
-	"github.com/rackspace/gophercloud"
-	th "github.com/rackspace/gophercloud/testhelper"
-)
-
-const endpoint = "http://localhost:57909/"
-
-func endpointClient() *gophercloud.ServiceClient {
-	return &gophercloud.ServiceClient{Endpoint: endpoint}
-}
-
-func TestGetURL(t *testing.T) {
-	actual := getURL(endpointClient(), "foo")
-	expected := endpoint + "os-networksv2/foo"
-	th.AssertEquals(t, expected, actual)
-}
-
-func TestCreateURL(t *testing.T) {
-	actual := createURL(endpointClient())
-	expected := endpoint + "os-networksv2"
-	th.AssertEquals(t, expected, actual)
-}
-
-func TestListURL(t *testing.T) {
-	actual := createURL(endpointClient())
-	expected := endpoint + "os-networksv2"
-	th.AssertEquals(t, expected, actual)
-}
-
-func TestDeleteURL(t *testing.T) {
-	actual := deleteURL(endpointClient(), "foo")
-	expected := endpoint + "os-networksv2/foo"
-	th.AssertEquals(t, expected, actual)
-}
diff --git a/rackspace/compute/v2/servers/delegate.go b/rackspace/compute/v2/servers/delegate.go
deleted file mode 100644
index 7810d15..0000000
--- a/rackspace/compute/v2/servers/delegate.go
+++ /dev/null
@@ -1,116 +0,0 @@
-package servers
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/compute/v2/servers"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List makes a request against the API to list servers accessible to you.
-func List(client *gophercloud.ServiceClient, opts os.ListOptsBuilder) pagination.Pager {
-	return os.List(client, opts)
-}
-
-// Create requests a server to be provisioned to the user in the current tenant.
-func Create(client *gophercloud.ServiceClient, opts os.CreateOptsBuilder) os.CreateResult {
-	return os.Create(client, opts)
-}
-
-// Update requests an existing server to be updated with the supplied options.
-func Update(client *gophercloud.ServiceClient, id string, opts os.UpdateOptsBuilder) os.UpdateResult {
-	return os.Update(client, id, opts)
-}
-
-// Delete requests that a server previously provisioned be removed from your account.
-func Delete(client *gophercloud.ServiceClient, id string) os.DeleteResult {
-	return os.Delete(client, id)
-}
-
-// Get requests details on a single server, by ID.
-func Get(client *gophercloud.ServiceClient, id string) os.GetResult {
-	return os.Get(client, id)
-}
-
-// ChangeAdminPassword alters the administrator or root password for a specified server.
-func ChangeAdminPassword(client *gophercloud.ServiceClient, id, newPassword string) os.ActionResult {
-	return os.ChangeAdminPassword(client, id, newPassword)
-}
-
-// Reboot requests that a given server reboot. Two methods exist for rebooting a server:
-//
-// os.HardReboot (aka PowerCycle) restarts the server instance by physically cutting power to the
-// machine, or if a VM, terminating it at the hypervisor level. It's done. Caput. Full stop. Then,
-// after a brief wait, power is restored or the VM instance restarted.
-//
-// os.SoftReboot (aka OSReboot) simply tells the OS to restart under its own procedures. E.g., in
-// Linux, asking it to enter runlevel 6, or executing "sudo shutdown -r now", or by asking Windows to restart the machine.
-func Reboot(client *gophercloud.ServiceClient, id string, how os.RebootMethod) os.ActionResult {
-	return os.Reboot(client, id, how)
-}
-
-// Rebuild will reprovision the server according to the configuration options provided in the
-// RebuildOpts struct.
-func Rebuild(client *gophercloud.ServiceClient, id string, opts os.RebuildOptsBuilder) os.RebuildResult {
-	return os.Rebuild(client, id, opts)
-}
-
-// Resize instructs the provider to change the flavor of the server.
-// Note that this implies rebuilding it.
-// Unfortunately, one cannot pass rebuild parameters to the resize function.
-// When the resize completes, the server will be in RESIZE_VERIFY state.
-// While in this state, you can explore the use of the new server's configuration.
-// If you like it, call ConfirmResize() to commit the resize permanently.
-// Otherwise, call RevertResize() to restore the old configuration.
-func Resize(client *gophercloud.ServiceClient, id string, opts os.ResizeOptsBuilder) os.ActionResult {
-	return os.Resize(client, id, opts)
-}
-
-// ConfirmResize confirms a previous resize operation on a server.
-// See Resize() for more details.
-func ConfirmResize(client *gophercloud.ServiceClient, id string) os.ActionResult {
-	return os.ConfirmResize(client, id)
-}
-
-// WaitForStatus will continually poll a server until it successfully transitions to a specified
-// status. It will do this for at most the number of seconds specified.
-func WaitForStatus(c *gophercloud.ServiceClient, id, status string, secs int) error {
-	return os.WaitForStatus(c, id, status, secs)
-}
-
-// ExtractServers interprets the results of a single page from a List() call, producing a slice of Server entities.
-func ExtractServers(page pagination.Page) ([]os.Server, error) {
-	return os.ExtractServers(page)
-}
-
-// ListAddresses makes a request against the API to list the servers IP addresses.
-func ListAddresses(client *gophercloud.ServiceClient, id string) pagination.Pager {
-	return os.ListAddresses(client, id)
-}
-
-// ExtractAddresses interprets the results of a single page from a ListAddresses() call, producing a map of Address slices.
-func ExtractAddresses(page pagination.Page) (map[string][]os.Address, error) {
-	return os.ExtractAddresses(page)
-}
-
-// ListAddressesByNetwork makes a request against the API to list the servers IP addresses
-// for the given network.
-func ListAddressesByNetwork(client *gophercloud.ServiceClient, id, network string) pagination.Pager {
-	return os.ListAddressesByNetwork(client, id, network)
-}
-
-// ExtractNetworkAddresses interprets the results of a single page from a ListAddressesByNetwork() call, producing a map of Address slices.
-func ExtractNetworkAddresses(page pagination.Page) ([]os.Address, error) {
-	return os.ExtractNetworkAddresses(page)
-}
-
-// Metadata requests all the metadata for the given server ID.
-func Metadata(client *gophercloud.ServiceClient, id string) os.GetMetadataResult {
-	return os.Metadata(client, id)
-}
-
-// UpdateMetadata updates (or creates) all the metadata specified by opts for the given server ID.
-// This operation does not affect already-existing metadata that is not specified
-// by opts.
-func UpdateMetadata(client *gophercloud.ServiceClient, id string, opts os.UpdateMetadataOptsBuilder) os.UpdateMetadataResult {
-	return os.UpdateMetadata(client, id, opts)
-}
diff --git a/rackspace/compute/v2/servers/delegate_test.go b/rackspace/compute/v2/servers/delegate_test.go
deleted file mode 100644
index 03e7ace..0000000
--- a/rackspace/compute/v2/servers/delegate_test.go
+++ /dev/null
@@ -1,182 +0,0 @@
-package servers
-
-import (
-	"fmt"
-	"net/http"
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/compute/v2/servers"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	"github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestListServers(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/servers/detail", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		fmt.Fprintf(w, ListOutput)
-	})
-
-	count := 0
-	err := List(client.ServiceClient(), nil).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractServers(page)
-		th.AssertNoErr(t, err)
-		th.CheckDeepEquals(t, ExpectedServerSlice, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, 1, count)
-}
-
-func TestCreateServer(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleServerCreationSuccessfully(t, CreateOutput)
-
-	actual, err := Create(client.ServiceClient(), os.CreateOpts{
-		Name:      "derp",
-		ImageRef:  "f90f6034-2570-4974-8351-6b49732ef2eb",
-		FlavorRef: "1",
-	}).Extract()
-	th.AssertNoErr(t, err)
-
-	th.CheckDeepEquals(t, &CreatedServer, actual)
-}
-
-func TestDeleteServer(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleServerDeletionSuccessfully(t)
-
-	res := Delete(client.ServiceClient(), "asdfasdfasdf")
-	th.AssertNoErr(t, res.Err)
-}
-
-func TestGetServer(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/servers/8c65cb68-0681-4c30-bc88-6b83a8a26aee", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		fmt.Fprintf(w, GetOutput)
-	})
-
-	actual, err := Get(client.ServiceClient(), "8c65cb68-0681-4c30-bc88-6b83a8a26aee").Extract()
-	th.AssertNoErr(t, err)
-	th.CheckDeepEquals(t, &GophercloudServer, actual)
-}
-
-func TestUpdateServer(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/servers/8c65cb68-0681-4c30-bc88-6b83a8a26aee", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "PUT")
-		th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
-		th.TestJSONRequest(t, r, `{ "server": { "name": "test-server-updated" } }`)
-
-		w.Header().Add("Content-Type", "application/json")
-
-		fmt.Fprintf(w, UpdateOutput)
-	})
-
-	opts := os.UpdateOpts{
-		Name: "test-server-updated",
-	}
-	actual, err := Update(client.ServiceClient(), "8c65cb68-0681-4c30-bc88-6b83a8a26aee", opts).Extract()
-	th.AssertNoErr(t, err)
-	th.CheckDeepEquals(t, &GophercloudUpdatedServer, actual)
-}
-
-func TestChangeAdminPassword(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleAdminPasswordChangeSuccessfully(t)
-
-	res := ChangeAdminPassword(client.ServiceClient(), "1234asdf", "new-password")
-	th.AssertNoErr(t, res.Err)
-}
-
-func TestReboot(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleRebootSuccessfully(t)
-
-	res := Reboot(client.ServiceClient(), "1234asdf", os.SoftReboot)
-	th.AssertNoErr(t, res.Err)
-}
-
-func TestRebuildServer(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleRebuildSuccessfully(t, GetOutput)
-
-	opts := os.RebuildOpts{
-		Name:       "new-name",
-		AdminPass:  "swordfish",
-		ImageID:    "http://104.130.131.164:8774/fcad67a6189847c4aecfa3c81a05783b/images/f90f6034-2570-4974-8351-6b49732ef2eb",
-		AccessIPv4: "1.2.3.4",
-	}
-	actual, err := Rebuild(client.ServiceClient(), "1234asdf", opts).Extract()
-	th.AssertNoErr(t, err)
-	th.CheckDeepEquals(t, &GophercloudServer, actual)
-}
-
-func TestListAddresses(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleAddressListSuccessfully(t)
-
-	expected := os.ListAddressesExpected
-	pages := 0
-	err := ListAddresses(client.ServiceClient(), "asdfasdfasdf").EachPage(func(page pagination.Page) (bool, error) {
-		pages++
-
-		actual, err := ExtractAddresses(page)
-		th.AssertNoErr(t, err)
-
-		if len(actual) != 2 {
-			t.Fatalf("Expected 2 networks, got %d", len(actual))
-		}
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, 1, pages)
-}
-
-func TestListAddressesByNetwork(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleNetworkAddressListSuccessfully(t)
-
-	expected := os.ListNetworkAddressesExpected
-	pages := 0
-	err := ListAddressesByNetwork(client.ServiceClient(), "asdfasdfasdf", "public").EachPage(func(page pagination.Page) (bool, error) {
-		pages++
-
-		actual, err := ExtractNetworkAddresses(page)
-		th.AssertNoErr(t, err)
-
-		if len(actual) != 2 {
-			t.Fatalf("Expected 2 addresses, got %d", len(actual))
-		}
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, 1, pages)
-}
diff --git a/rackspace/compute/v2/servers/doc.go b/rackspace/compute/v2/servers/doc.go
deleted file mode 100644
index c9f77f6..0000000
--- a/rackspace/compute/v2/servers/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package servers provides information and interaction with the server
-// API resource for the Rackspace Cloud Servers service.
-package servers
diff --git a/rackspace/compute/v2/servers/fixtures.go b/rackspace/compute/v2/servers/fixtures.go
deleted file mode 100644
index 75cccd0..0000000
--- a/rackspace/compute/v2/servers/fixtures.go
+++ /dev/null
@@ -1,574 +0,0 @@
-// +build fixtures
-
-package servers
-
-import (
-	os "github.com/rackspace/gophercloud/openstack/compute/v2/servers"
-)
-
-// ListOutput is the recorded output of a Rackspace servers.List request.
-const ListOutput = `
-{
-	"servers": [
-		{
-			"OS-DCF:diskConfig": "MANUAL",
-			"OS-EXT-STS:power_state": 1,
-			"OS-EXT-STS:task_state": null,
-			"OS-EXT-STS:vm_state": "active",
-			"accessIPv4": "1.2.3.4",
-			"accessIPv6": "1111:4822:7818:121:2000:9b5e:7438:a2d0",
-			"addresses": {
-				"private": [
-					{
-						"addr": "10.208.230.113",
-						"version": 4
-					}
-				],
-				"public": [
-					{
-						"addr": "2001:4800:7818:101:2000:9b5e:7428:a2d0",
-						"version": 6
-					},
-					{
-						"addr": "104.130.131.164",
-						"version": 4
-					}
-				]
-			},
-			"created": "2014-09-23T12:34:58Z",
-			"flavor": {
-				"id": "performance1-8",
-				"links": [
-					{
-						"href": "https://dfw.servers.api.rackspacecloud.com/111111/flavors/performance1-8",
-						"rel": "bookmark"
-					}
-				]
-			},
-			"hostId": "e8951a524bc465b0898aeac7674da6fe1495e253ae1ea17ddb2c2475",
-			"id": "59818cee-bc8c-44eb-8073-673ee65105f7",
-			"image": {
-				"id": "255df5fb-e3d4-45a3-9a07-c976debf7c14",
-				"links": [
-					{
-						"href": "https://dfw.servers.api.rackspacecloud.com/111111/images/255df5fb-e3d4-45a3-9a07-c976debf7c14",
-						"rel": "bookmark"
-					}
-				]
-			},
-			"key_name": "mykey",
-			"links": [
-				{
-					"href": "https://dfw.servers.api.rackspacecloud.com/v2/111111/servers/59818cee-bc8c-44eb-8073-673ee65105f7",
-					"rel": "self"
-				},
-				{
-					"href": "https://dfw.servers.api.rackspacecloud.com/111111/servers/59818cee-bc8c-44eb-8073-673ee65105f7",
-					"rel": "bookmark"
-				}
-			],
-			"metadata": {},
-			"name": "devstack",
-			"progress": 100,
-			"status": "ACTIVE",
-			"tenant_id": "111111",
-			"updated": "2014-09-23T12:38:19Z",
-			"user_id": "14ae7bb21d81422694655f3cc30f2930"
-		},
-		{
-			"OS-DCF:diskConfig": "MANUAL",
-			"OS-EXT-STS:power_state": 1,
-			"OS-EXT-STS:task_state": null,
-			"OS-EXT-STS:vm_state": "active",
-			"accessIPv4": "1.1.2.3",
-			"accessIPv6": "2222:4444:7817:101:be76:4eff:f0e5:9e02",
-			"addresses": {
-				"private": [
-					{
-						"addr": "10.10.20.30",
-						"version": 4
-					}
-				],
-				"public": [
-					{
-						"addr": "1.1.2.3",
-						"version": 4
-					},
-					{
-						"addr": "2222:4444:7817:101:be76:4eff:f0e5:9e02",
-						"version": 6
-					}
-				]
-			},
-			"created": "2014-07-21T19:32:55Z",
-			"flavor": {
-				"id": "performance1-2",
-				"links": [
-					{
-						"href": "https://dfw.servers.api.rackspacecloud.com/111111/flavors/performance1-2",
-						"rel": "bookmark"
-					}
-				]
-			},
-			"hostId": "f859679906d6b1a38c1bd516b78f4dcc7d5fcf012578fa3ce460716c",
-			"id": "25f1c7f5-e00a-4715-b354-16e24b2f4630",
-			"image": {
-				"id": "bb02b1a3-bc77-4d17-ab5b-421d89850fca",
-				"links": [
-					{
-						"href": "https://dfw.servers.api.rackspacecloud.com/111111/images/bb02b1a3-bc77-4d17-ab5b-421d89850fca",
-						"rel": "bookmark"
-					}
-				]
-			},
-			"key_name": "otherkey",
-			"links": [
-				{
-					"href": "https://dfw.servers.api.rackspacecloud.com/v2/111111/servers/25f1c7f5-e00a-4715-b355-16e24b2f4630",
-					"rel": "self"
-				},
-				{
-					"href": "https://dfw.servers.api.rackspacecloud.com/111111/servers/25f1c7f5-e00a-4715-b355-16e24b2f4630",
-					"rel": "bookmark"
-				}
-			],
-			"metadata": {},
-			"name": "peril-dfw",
-			"progress": 100,
-			"status": "ACTIVE",
-			"tenant_id": "111111",
-			"updated": "2014-07-21T19:34:24Z",
-			"user_id": "14ae7bb21d81422694655f3cc30f2930"
-		}
-	]
-}
-`
-
-// GetOutput is the recorded output of a Rackspace servers.Get request.
-const GetOutput = `
-{
-	"server": {
-		"OS-DCF:diskConfig": "AUTO",
-		"OS-EXT-STS:power_state": 1,
-		"OS-EXT-STS:task_state": null,
-		"OS-EXT-STS:vm_state": "active",
-		"accessIPv4": "1.2.4.8",
-		"accessIPv6": "2001:4800:6666:105:2a0f:c056:f594:7777",
-		"addresses": {
-			"private": [
-				{
-					"addr": "10.20.40.80",
-					"version": 4
-				}
-			],
-			"public": [
-				{
-					"addr": "1.2.4.8",
-					"version": 4
-				},
-				{
-					"addr": "2001:4800:6666:105:2a0f:c056:f594:7777",
-					"version": 6
-				}
-			]
-		},
-		"created": "2014-10-21T14:42:16Z",
-		"flavor": {
-			"id": "performance1-1",
-			"links": [
-				{
-					"href": "https://dfw.servers.api.rackspacecloud.com/111111/flavors/performance1-1",
-					"rel": "bookmark"
-				}
-			]
-		},
-		"hostId": "430d2ae02de0a7af77012c94778145eccf67e75b1fac0528aa10d4a7",
-		"id": "8c65cb68-0681-4c30-bc88-6b83a8a26aee",
-		"image": {
-			"id": "e19a734c-c7e6-443a-830c-242209c4d65d",
-			"links": [
-				{
-					"href": "https://dfw.servers.api.rackspacecloud.com/111111/images/e19a734c-c7e6-443a-830c-242209c4d65d",
-					"rel": "bookmark"
-				}
-			]
-		},
-		"key_name": null,
-		"links": [
-			{
-				"href": "https://dfw.servers.api.rackspacecloud.com/v2/111111/servers/8c65cb68-0681-4c30-bc88-6b83a8a26aee",
-				"rel": "self"
-			},
-			{
-				"href": "https://dfw.servers.api.rackspacecloud.com/111111/servers/8c65cb68-0681-4c30-bc88-6b83a8a26aee",
-				"rel": "bookmark"
-			}
-		],
-		"metadata": {},
-		"name": "Gophercloud-pxpGGuey",
-		"progress": 100,
-		"status": "ACTIVE",
-		"tenant_id": "111111",
-		"updated": "2014-10-21T14:42:57Z",
-		"user_id": "14ae7bb21d81423694655f4dd30f2930"
-	}
-}
-`
-
-// UpdateOutput is the recorded output of a Rackspace servers.Update request.
-const UpdateOutput = `
-{
-	"server": {
-		"OS-DCF:diskConfig": "AUTO",
-		"OS-EXT-STS:power_state": 1,
-		"OS-EXT-STS:task_state": null,
-		"OS-EXT-STS:vm_state": "active",
-		"accessIPv4": "1.2.4.8",
-		"accessIPv6": "2001:4800:6666:105:2a0f:c056:f594:7777",
-		"addresses": {
-			"private": [
-			{
-				"addr": "10.20.40.80",
-				"version": 4
-			}
-			],
-			"public": [
-			{
-				"addr": "1.2.4.8",
-				"version": 4
-				},
-				{
-					"addr": "2001:4800:6666:105:2a0f:c056:f594:7777",
-					"version": 6
-				}
-			]
-		},
-		"created": "2014-10-21T14:42:16Z",
-		"flavor": {
-			"id": "performance1-1",
-			"links": [
-			{
-				"href": "https://dfw.servers.api.rackspacecloud.com/111111/flavors/performance1-1",
-				"rel": "bookmark"
-			}
-			]
-		},
-		"hostId": "430d2ae02de0a7af77012c94778145eccf67e75b1fac0528aa10d4a7",
-		"id": "8c65cb68-0681-4c30-bc88-6b83a8a26aee",
-		"image": {
-			"id": "e19a734c-c7e6-443a-830c-242209c4d65d",
-			"links": [
-			{
-				"href": "https://dfw.servers.api.rackspacecloud.com/111111/images/e19a734c-c7e6-443a-830c-242209c4d65d",
-				"rel": "bookmark"
-			}
-			]
-		},
-		"key_name": null,
-		"links": [
-		{
-			"href": "https://dfw.servers.api.rackspacecloud.com/v2/111111/servers/8c65cb68-0681-4c30-bc88-6b83a8a26aee",
-			"rel": "self"
-		},
-		{
-			"href": "https://dfw.servers.api.rackspacecloud.com/111111/servers/8c65cb68-0681-4c30-bc88-6b83a8a26aee",
-			"rel": "bookmark"
-		}
-		],
-		"metadata": {},
-		"name": "test-server-updated",
-		"progress": 100,
-		"status": "ACTIVE",
-		"tenant_id": "111111",
-		"updated": "2014-10-21T14:42:57Z",
-		"user_id": "14ae7bb21d81423694655f4dd30f2930"
-	}
-}
-`
-
-// CreateOutput contains a sample of Rackspace's response to a Create call.
-const CreateOutput = `
-{
-	"server": {
-		"OS-DCF:diskConfig": "AUTO",
-		"adminPass": "v7tADqbE5pr9",
-		"id": "bb63327b-6a2f-34bc-b0ef-4b6d97ea637e",
-		"links": [
-			{
-				"href": "https://dfw.servers.api.rackspacecloud.com/v2/111111/servers/bb63327b-6a2f-34bc-b0ef-4b6d97ea637e",
-				"rel": "self"
-			},
-			{
-				"href": "https://dfw.servers.api.rackspacecloud.com/111111/servers/bb63327b-6a2f-34bc-b0ef-4b6d97ea637e",
-				"rel": "bookmark"
-			}
-		]
-	}
-}
-`
-
-// DevstackServer is the expected first result from parsing ListOutput.
-var DevstackServer = os.Server{
-	ID:         "59818cee-bc8c-44eb-8073-673ee65105f7",
-	Name:       "devstack",
-	TenantID:   "111111",
-	UserID:     "14ae7bb21d81422694655f3cc30f2930",
-	HostID:     "e8951a524bc465b0898aeac7674da6fe1495e253ae1ea17ddb2c2475",
-	Updated:    "2014-09-23T12:38:19Z",
-	Created:    "2014-09-23T12:34:58Z",
-	AccessIPv4: "1.2.3.4",
-	AccessIPv6: "1111:4822:7818:121:2000:9b5e:7438:a2d0",
-	Progress:   100,
-	Status:     "ACTIVE",
-	Image: map[string]interface{}{
-		"id": "255df5fb-e3d4-45a3-9a07-c976debf7c14",
-		"links": []interface{}{
-			map[string]interface{}{
-				"href": "https://dfw.servers.api.rackspacecloud.com/111111/images/255df5fb-e3d4-45a3-9a07-c976debf7c14",
-				"rel":  "bookmark",
-			},
-		},
-	},
-	Flavor: map[string]interface{}{
-		"id": "performance1-8",
-		"links": []interface{}{
-			map[string]interface{}{
-				"href": "https://dfw.servers.api.rackspacecloud.com/111111/flavors/performance1-8",
-				"rel":  "bookmark",
-			},
-		},
-	},
-	Addresses: map[string]interface{}{
-		"private": []interface{}{
-			map[string]interface{}{
-				"addr":    "10.20.30.40",
-				"version": float64(4.0),
-			},
-		},
-		"public": []interface{}{
-			map[string]interface{}{
-				"addr":    "1111:4822:7818:121:2000:9b5e:7438:a2d0",
-				"version": float64(6.0),
-			},
-			map[string]interface{}{
-				"addr":    "1.2.3.4",
-				"version": float64(4.0),
-			},
-		},
-	},
-	Metadata: map[string]interface{}{},
-	Links: []interface{}{
-		map[string]interface{}{
-			"href": "https://dfw.servers.api.rackspacecloud.com/v2/111111/servers/59918cee-bd9d-44eb-8173-673ee75105f7",
-			"rel":  "self",
-		},
-		map[string]interface{}{
-			"href": "https://dfw.servers.api.rackspacecloud.com/v2/111111/servers/59818cee-bc8c-44eb-8073-673ee65105f7",
-			"rel":  "bookmark",
-		},
-	},
-	KeyName:   "mykey",
-	AdminPass: "",
-}
-
-// PerilServer is the expected second result from parsing ListOutput.
-var PerilServer = os.Server{
-	ID:         "25f1c7f5-e00a-4715-b354-16e24b2f4630",
-	Name:       "peril-dfw",
-	TenantID:   "111111",
-	UserID:     "14ae7bb21d81422694655f3cc30f2930",
-	HostID:     "f859679906d6b1a38c1bd516b78f4dcc7d5fcf012578fa3ce460716c",
-	Updated:    "2014-07-21T19:34:24Z",
-	Created:    "2014-07-21T19:32:55Z",
-	AccessIPv4: "1.1.2.3",
-	AccessIPv6: "2222:4444:7817:101:be76:4eff:f0e5:9e02",
-	Progress:   100,
-	Status:     "ACTIVE",
-	Image: map[string]interface{}{
-		"id": "bb02b1a3-bc77-4d17-ab5b-421d89850fca",
-		"links": []interface{}{
-			map[string]interface{}{
-				"href": "https://dfw.servers.api.rackspacecloud.com/111111/images/bb02b1a3-bc77-4d17-ab5b-421d89850fca",
-				"rel":  "bookmark",
-			},
-		},
-	},
-	Flavor: map[string]interface{}{
-		"id": "performance1-2",
-		"links": []interface{}{
-			map[string]interface{}{
-				"href": "https://dfw.servers.api.rackspacecloud.com/111111/flavors/performance1-2",
-				"rel":  "bookmark",
-			},
-		},
-	},
-	Addresses: map[string]interface{}{
-		"private": []interface{}{
-			map[string]interface{}{
-				"addr":    "10.10.20.30",
-				"version": float64(4.0),
-			},
-		},
-		"public": []interface{}{
-			map[string]interface{}{
-				"addr":    "2222:4444:7817:101:be76:4eff:f0e5:9e02",
-				"version": float64(6.0),
-			},
-			map[string]interface{}{
-				"addr":    "1.1.2.3",
-				"version": float64(4.0),
-			},
-		},
-	},
-	Metadata: map[string]interface{}{},
-	Links: []interface{}{
-		map[string]interface{}{
-			"href": "https://dfw.servers.api.rackspacecloud.com/v2/111111/servers/25f1c7f5-e00a-4715-b355-16e24b2f4630",
-			"rel":  "self",
-		},
-		map[string]interface{}{
-			"href": "https://dfw.servers.api.rackspacecloud.com/v2/111111/servers/25f1c7f5-e00a-4715-b355-16e24b2f4630",
-			"rel":  "bookmark",
-		},
-	},
-	KeyName:   "otherkey",
-	AdminPass: "",
-}
-
-// GophercloudServer is the expected result from parsing GetOutput.
-var GophercloudServer = os.Server{
-	ID:         "8c65cb68-0681-4c30-bc88-6b83a8a26aee",
-	Name:       "Gophercloud-pxpGGuey",
-	TenantID:   "111111",
-	UserID:     "14ae7bb21d81423694655f4dd30f2930",
-	HostID:     "430d2ae02de0a7af77012c94778145eccf67e75b1fac0528aa10d4a7",
-	Updated:    "2014-10-21T14:42:57Z",
-	Created:    "2014-10-21T14:42:16Z",
-	AccessIPv4: "1.2.4.8",
-	AccessIPv6: "2001:4800:6666:105:2a0f:c056:f594:7777",
-	Progress:   100,
-	Status:     "ACTIVE",
-	Image: map[string]interface{}{
-		"id": "e19a734c-c7e6-443a-830c-242209c4d65d",
-		"links": []interface{}{
-			map[string]interface{}{
-				"href": "https://dfw.servers.api.rackspacecloud.com/111111/images/e19a734c-c7e6-443a-830c-242209c4d65d",
-				"rel":  "bookmark",
-			},
-		},
-	},
-	Flavor: map[string]interface{}{
-		"id": "performance1-1",
-		"links": []interface{}{
-			map[string]interface{}{
-				"href": "https://dfw.servers.api.rackspacecloud.com/111111/flavors/performance1-1",
-				"rel":  "bookmark",
-			},
-		},
-	},
-	Addresses: map[string]interface{}{
-		"private": []interface{}{
-			map[string]interface{}{
-				"addr":    "10.20.40.80",
-				"version": float64(4.0),
-			},
-		},
-		"public": []interface{}{
-			map[string]interface{}{
-				"addr":    "2001:4800:6666:105:2a0f:c056:f594:7777",
-				"version": float64(6.0),
-			},
-			map[string]interface{}{
-				"addr":    "1.2.4.8",
-				"version": float64(4.0),
-			},
-		},
-	},
-	Metadata: map[string]interface{}{},
-	Links: []interface{}{
-		map[string]interface{}{
-			"href": "https://dfw.servers.api.rackspacecloud.com/v2/111111/servers/8c65cb68-0681-4c30-bc88-6b83a8a26aee",
-			"rel":  "self",
-		},
-		map[string]interface{}{
-			"href": "https://dfw.servers.api.rackspacecloud.com/111111/servers/8c65cb68-0681-4c30-bc88-6b83a8a26aee",
-			"rel":  "bookmark",
-		},
-	},
-	KeyName:   "",
-	AdminPass: "",
-}
-
-// GophercloudUpdatedServer is the expected result from parsing UpdateOutput.
-var GophercloudUpdatedServer = os.Server{
-	ID:         "8c65cb68-0681-4c30-bc88-6b83a8a26aee",
-	Name:       "test-server-updated",
-	TenantID:   "111111",
-	UserID:     "14ae7bb21d81423694655f4dd30f2930",
-	HostID:     "430d2ae02de0a7af77012c94778145eccf67e75b1fac0528aa10d4a7",
-	Updated:    "2014-10-21T14:42:57Z",
-	Created:    "2014-10-21T14:42:16Z",
-	AccessIPv4: "1.2.4.8",
-	AccessIPv6: "2001:4800:6666:105:2a0f:c056:f594:7777",
-	Progress:   100,
-	Status:     "ACTIVE",
-	Image: map[string]interface{}{
-		"id": "e19a734c-c7e6-443a-830c-242209c4d65d",
-		"links": []interface{}{
-			map[string]interface{}{
-				"href": "https://dfw.servers.api.rackspacecloud.com/111111/images/e19a734c-c7e6-443a-830c-242209c4d65d",
-				"rel":  "bookmark",
-			},
-		},
-	},
-	Flavor: map[string]interface{}{
-		"id": "performance1-1",
-		"links": []interface{}{
-			map[string]interface{}{
-				"href": "https://dfw.servers.api.rackspacecloud.com/111111/flavors/performance1-1",
-				"rel":  "bookmark",
-			},
-		},
-	},
-	Addresses: map[string]interface{}{
-		"private": []interface{}{
-			map[string]interface{}{
-				"addr":    "10.20.40.80",
-				"version": float64(4.0),
-			},
-		},
-		"public": []interface{}{
-			map[string]interface{}{
-				"addr":    "2001:4800:6666:105:2a0f:c056:f594:7777",
-				"version": float64(6.0),
-			},
-			map[string]interface{}{
-				"addr":    "1.2.4.8",
-				"version": float64(4.0),
-			},
-		},
-	},
-	Metadata: map[string]interface{}{},
-	Links: []interface{}{
-		map[string]interface{}{
-			"href": "https://dfw.servers.api.rackspacecloud.com/v2/111111/servers/8c65cb68-0681-4c30-bc88-6b83a8a26aee",
-			"rel":  "self",
-		},
-		map[string]interface{}{
-			"href": "https://dfw.servers.api.rackspacecloud.com/111111/servers/8c65cb68-0681-4c30-bc88-6b83a8a26aee",
-			"rel":  "bookmark",
-		},
-	},
-	KeyName:   "",
-	AdminPass: "",
-}
-
-// CreatedServer is the partial Server struct that can be parsed from CreateOutput.
-var CreatedServer = os.Server{
-	ID:        "bb63327b-6a2f-34bc-b0ef-4b6d97ea637e",
-	AdminPass: "v7tADqbE5pr9",
-	Links:     []interface{}{},
-}
-
-// ExpectedServerSlice is the collection of servers, in order, that should be parsed from ListOutput.
-var ExpectedServerSlice = []os.Server{DevstackServer, PerilServer}
diff --git a/rackspace/compute/v2/servers/requests.go b/rackspace/compute/v2/servers/requests.go
deleted file mode 100644
index d4472a0..0000000
--- a/rackspace/compute/v2/servers/requests.go
+++ /dev/null
@@ -1,178 +0,0 @@
-package servers
-
-import (
-	"github.com/rackspace/gophercloud/openstack/compute/v2/extensions/bootfromvolume"
-	"github.com/rackspace/gophercloud/openstack/compute/v2/extensions/diskconfig"
-	os "github.com/rackspace/gophercloud/openstack/compute/v2/servers"
-)
-
-// CreateOpts specifies all of the options that Rackspace accepts in its Create request, including
-// the union of all extensions that Rackspace supports.
-type CreateOpts struct {
-	// Name [required] is the name to assign to the newly launched server.
-	Name string
-
-	// ImageRef [optional; required if ImageName is not provided] is the ID or full
-	// URL to the image that contains the server's OS and initial state.
-	// Also optional if using the boot-from-volume extension.
-	ImageRef string
-
-	// ImageName [optional; required if ImageRef is not provided] is the name of the
-	// image that contains the server's OS and initial state.
-	// Also optional if using the boot-from-volume extension.
-	ImageName string
-
-	// FlavorRef [optional; required if FlavorName is not provided] is the ID or
-	// full URL to the flavor that describes the server's specs.
-	FlavorRef string
-
-	// FlavorName [optional; required if FlavorRef is not provided] is the name of
-	// the flavor that describes the server's specs.
-	FlavorName string
-
-	// SecurityGroups [optional] lists the names of the security groups to which this server should belong.
-	SecurityGroups []string
-
-	// UserData [optional] contains configuration information or scripts to use upon launch.
-	// Create will base64-encode it for you.
-	UserData []byte
-
-	// AvailabilityZone [optional] in which to launch the server.
-	AvailabilityZone string
-
-	// Networks [optional] dictates how this server will be attached to available networks.
-	// By default, the server will be attached to all isolated networks for the tenant.
-	Networks []os.Network
-
-	// Metadata [optional] contains key-value pairs (up to 255 bytes each) to attach to the server.
-	Metadata map[string]string
-
-	// Personality [optional] includes files to inject into the server at launch.
-	// Create will base64-encode file contents for you.
-	Personality os.Personality
-
-	// ConfigDrive [optional] enables metadata injection through a configuration drive.
-	ConfigDrive bool
-
-	// AdminPass [optional] sets the root user password. If not set, a randomly-generated
-	// password will be created and returned in the response.
-	AdminPass string
-
-	// Rackspace-specific extensions begin here.
-
-	// KeyPair [optional] specifies the name of the SSH KeyPair to be injected into the newly launched
-	// server. See the "keypairs" extension in OpenStack compute v2.
-	KeyPair string
-
-	// DiskConfig [optional] controls how the created server's disk is partitioned. See the "diskconfig"
-	// extension in OpenStack compute v2.
-	DiskConfig diskconfig.DiskConfig
-
-	// BlockDevice [optional] will create the server from a volume, which is created from an image,
-	// a snapshot, or another volume.
-	BlockDevice []bootfromvolume.BlockDevice
-}
-
-// ToServerCreateMap constructs a request body using all of the OpenStack extensions that are
-// active on Rackspace.
-func (opts CreateOpts) ToServerCreateMap() (map[string]interface{}, error) {
-	base := os.CreateOpts{
-		Name:             opts.Name,
-		ImageRef:         opts.ImageRef,
-		ImageName:        opts.ImageName,
-		FlavorRef:        opts.FlavorRef,
-		FlavorName:       opts.FlavorName,
-		SecurityGroups:   opts.SecurityGroups,
-		UserData:         opts.UserData,
-		AvailabilityZone: opts.AvailabilityZone,
-		Networks:         opts.Networks,
-		Metadata:         opts.Metadata,
-		Personality:      opts.Personality,
-		ConfigDrive:      opts.ConfigDrive,
-		AdminPass:        opts.AdminPass,
-	}
-
-	drive := diskconfig.CreateOptsExt{
-		CreateOptsBuilder: base,
-		DiskConfig:        opts.DiskConfig,
-	}
-
-	res, err := drive.ToServerCreateMap()
-	if err != nil {
-		return nil, err
-	}
-
-	if len(opts.BlockDevice) != 0 {
-		bfv := bootfromvolume.CreateOptsExt{
-			CreateOptsBuilder: drive,
-			BlockDevice:       opts.BlockDevice,
-		}
-
-		res, err = bfv.ToServerCreateMap()
-		if err != nil {
-			return nil, err
-		}
-	}
-
-	// key_name doesn't actually come from the extension (or at least isn't documented there) so
-	// we need to add it manually.
-	serverMap := res["server"].(map[string]interface{})
-	if opts.KeyPair != "" {
-		serverMap["key_name"] = opts.KeyPair
-	}
-
-	return res, nil
-}
-
-// RebuildOpts represents all of the configuration options used in a server rebuild operation that
-// are supported by Rackspace.
-type RebuildOpts struct {
-	// Required. The ID of the image you want your server to be provisioned on
-	ImageID string
-
-	// Name to set the server to
-	Name string
-
-	// Required. The server's admin password
-	AdminPass string
-
-	// AccessIPv4 [optional] provides a new IPv4 address for the instance.
-	AccessIPv4 string
-
-	// AccessIPv6 [optional] provides a new IPv6 address for the instance.
-	AccessIPv6 string
-
-	// Metadata [optional] contains key-value pairs (up to 255 bytes each) to attach to the server.
-	Metadata map[string]string
-
-	// Personality [optional] includes files to inject into the server at launch.
-	// Rebuild will base64-encode file contents for you.
-	Personality os.Personality
-
-	// Rackspace-specific stuff begins here.
-
-	// DiskConfig [optional] controls how the created server's disk is partitioned. See the "diskconfig"
-	// extension in OpenStack compute v2.
-	DiskConfig diskconfig.DiskConfig
-}
-
-// ToServerRebuildMap constructs a request body using all of the OpenStack extensions that are
-// active on Rackspace.
-func (opts RebuildOpts) ToServerRebuildMap() (map[string]interface{}, error) {
-	base := os.RebuildOpts{
-		ImageID:     opts.ImageID,
-		Name:        opts.Name,
-		AdminPass:   opts.AdminPass,
-		AccessIPv4:  opts.AccessIPv4,
-		AccessIPv6:  opts.AccessIPv6,
-		Metadata:    opts.Metadata,
-		Personality: opts.Personality,
-	}
-
-	drive := diskconfig.RebuildOptsExt{
-		RebuildOptsBuilder: base,
-		DiskConfig:         opts.DiskConfig,
-	}
-
-	return drive.ToServerRebuildMap()
-}
diff --git a/rackspace/compute/v2/servers/requests_test.go b/rackspace/compute/v2/servers/requests_test.go
deleted file mode 100644
index 828b5dc..0000000
--- a/rackspace/compute/v2/servers/requests_test.go
+++ /dev/null
@@ -1,59 +0,0 @@
-package servers
-
-import (
-	"testing"
-
-	"github.com/rackspace/gophercloud/openstack/compute/v2/extensions/diskconfig"
-	th "github.com/rackspace/gophercloud/testhelper"
-)
-
-func TestCreateOpts(t *testing.T) {
-	opts := CreateOpts{
-		Name:       "createdserver",
-		ImageRef:   "image-id",
-		FlavorRef:  "flavor-id",
-		KeyPair:    "mykey",
-		DiskConfig: diskconfig.Manual,
-	}
-
-	expected := `
-	{
-		"server": {
-			"name": "createdserver",
-			"imageRef": "image-id",
-			"flavorRef": "flavor-id",
-			"flavorName": "",
-			"imageName": "",
-			"key_name": "mykey",
-			"OS-DCF:diskConfig": "MANUAL"
-		}
-	}
-	`
-	actual, err := opts.ToServerCreateMap()
-	th.AssertNoErr(t, err)
-	th.CheckJSONEquals(t, expected, actual)
-}
-
-func TestRebuildOpts(t *testing.T) {
-	opts := RebuildOpts{
-		Name:       "rebuiltserver",
-		AdminPass:  "swordfish",
-		ImageID:    "asdfasdfasdf",
-		DiskConfig: diskconfig.Auto,
-	}
-
-	actual, err := opts.ToServerRebuildMap()
-	th.AssertNoErr(t, err)
-
-	expected := `
-	{
-		"rebuild": {
-			"name": "rebuiltserver",
-			"imageRef": "asdfasdfasdf",
-			"adminPass": "swordfish",
-			"OS-DCF:diskConfig": "AUTO"
-		}
-	}
-	`
-	th.CheckJSONEquals(t, expected, actual)
-}
diff --git a/rackspace/compute/v2/virtualinterfaces/requests.go b/rackspace/compute/v2/virtualinterfaces/requests.go
deleted file mode 100644
index 1ff7c5a..0000000
--- a/rackspace/compute/v2/virtualinterfaces/requests.go
+++ /dev/null
@@ -1,45 +0,0 @@
-package virtualinterfaces
-
-import (
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List returns a Pager which allows you to iterate over a collection of
-// networks. It accepts a ListOpts struct, which allows you to filter and sort
-// the returned collection for greater efficiency.
-func List(c *gophercloud.ServiceClient, instanceID string) pagination.Pager {
-	createPage := func(r pagination.PageResult) pagination.Page {
-		return VirtualInterfacePage{pagination.SinglePageBase(r)}
-	}
-
-	return pagination.NewPager(c, listURL(c, instanceID), createPage)
-}
-
-// Create creates a new virtual interface for a network and attaches the network
-// to the server instance.
-func Create(c *gophercloud.ServiceClient, instanceID, networkID string) CreateResult {
-	var res CreateResult
-
-	reqBody := map[string]map[string]string{
-		"virtual_interface": {
-			"network_id": networkID,
-		},
-	}
-
-	// Send request to API
-	_, res.Err = c.Post(createURL(c, instanceID), reqBody, &res.Body, &gophercloud.RequestOpts{
-		OkCodes: []int{200, 201, 202},
-	})
-	return res
-}
-
-// Delete deletes the interface with interfaceID attached to the instance with
-// instanceID.
-func Delete(c *gophercloud.ServiceClient, instanceID, interfaceID string) DeleteResult {
-	var res DeleteResult
-	_, res.Err = c.Delete(deleteURL(c, instanceID, interfaceID), &gophercloud.RequestOpts{
-		OkCodes: []int{200, 204},
-	})
-	return res
-}
diff --git a/rackspace/compute/v2/virtualinterfaces/requests_test.go b/rackspace/compute/v2/virtualinterfaces/requests_test.go
deleted file mode 100644
index d40af9c..0000000
--- a/rackspace/compute/v2/virtualinterfaces/requests_test.go
+++ /dev/null
@@ -1,165 +0,0 @@
-package virtualinterfaces
-
-import (
-	"fmt"
-	"net/http"
-	"testing"
-
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/servers/12345/os-virtual-interfacesv2", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-    "virtual_interfaces": [
-        {
-            "id": "de7c6d53-b895-4b4a-963c-517ccb0f0775",
-            "ip_addresses": [
-                {
-                    "address": "192.168.0.2",
-                    "network_id": "f212726e-6321-4210-9bae-a13f5a33f83f",
-                    "network_label": "superprivate_xml"
-                }
-            ],
-            "mac_address": "BC:76:4E:04:85:20"
-        },
-        {
-            "id": "e14e789d-3b98-44a6-9c2d-c23eb1d1465c",
-            "ip_addresses": [
-                {
-                    "address": "10.181.1.30",
-                    "network_id": "3b324a1b-31b8-4db5-9fe5-4a2067f60297",
-                    "network_label": "private"
-                }
-            ],
-            "mac_address": "BC:76:4E:04:81:55"
-        }
-    ]
-}
-      `)
-	})
-
-	client := fake.ServiceClient()
-	count := 0
-
-	err := List(client, "12345").EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractVirtualInterfaces(page)
-		if err != nil {
-			t.Errorf("Failed to extract networks: %v", err)
-			return false, err
-		}
-
-		expected := []VirtualInterface{
-			VirtualInterface{
-				MACAddress: "BC:76:4E:04:85:20",
-				IPAddresses: []IPAddress{
-					IPAddress{
-						Address:      "192.168.0.2",
-						NetworkID:    "f212726e-6321-4210-9bae-a13f5a33f83f",
-						NetworkLabel: "superprivate_xml",
-					},
-				},
-				ID: "de7c6d53-b895-4b4a-963c-517ccb0f0775",
-			},
-			VirtualInterface{
-				MACAddress: "BC:76:4E:04:81:55",
-				IPAddresses: []IPAddress{
-					IPAddress{
-						Address:      "10.181.1.30",
-						NetworkID:    "3b324a1b-31b8-4db5-9fe5-4a2067f60297",
-						NetworkLabel: "private",
-					},
-				},
-				ID: "e14e789d-3b98-44a6-9c2d-c23eb1d1465c",
-			},
-		}
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, 1, count)
-}
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/servers/12345/os-virtual-interfacesv2", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "POST")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Content-Type", "application/json")
-		th.TestHeader(t, r, "Accept", "application/json")
-		th.TestJSONRequest(t, r, `
-{
-    "virtual_interface": {
-        "network_id": "6789"
-    }
-}
-      `)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusCreated)
-
-		fmt.Fprintf(w, `{
-      "virtual_interfaces": [
-        {
-          "id": "de7c6d53-b895-4b4a-963c-517ccb0f0775",
-          "ip_addresses": [
-            {
-              "address": "192.168.0.2",
-              "network_id": "f212726e-6321-4210-9bae-a13f5a33f83f",
-              "network_label": "superprivate_xml"
-            }
-          ],
-          "mac_address": "BC:76:4E:04:85:20"
-        }
-      ]
-    }`)
-	})
-
-	expected := &VirtualInterface{
-		MACAddress: "BC:76:4E:04:85:20",
-		IPAddresses: []IPAddress{
-			IPAddress{
-				Address:      "192.168.0.2",
-				NetworkID:    "f212726e-6321-4210-9bae-a13f5a33f83f",
-				NetworkLabel: "superprivate_xml",
-			},
-		},
-		ID: "de7c6d53-b895-4b4a-963c-517ccb0f0775",
-	}
-
-	actual, err := Create(fake.ServiceClient(), "12345", "6789").Extract()
-	th.AssertNoErr(t, err)
-
-	th.CheckDeepEquals(t, expected, actual)
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/servers/12345/os-virtual-interfacesv2/6789", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		w.WriteHeader(http.StatusNoContent)
-	})
-
-	res := Delete(fake.ServiceClient(), "12345", "6789")
-	th.AssertNoErr(t, res.Err)
-}
diff --git a/rackspace/compute/v2/virtualinterfaces/results.go b/rackspace/compute/v2/virtualinterfaces/results.go
deleted file mode 100644
index 26fa7f3..0000000
--- a/rackspace/compute/v2/virtualinterfaces/results.go
+++ /dev/null
@@ -1,81 +0,0 @@
-package virtualinterfaces
-
-import (
-	"github.com/mitchellh/mapstructure"
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-type commonResult struct {
-	gophercloud.Result
-}
-
-// Extract is a function that accepts a result and extracts a network resource.
-func (r commonResult) Extract() (*VirtualInterface, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-
-	var res struct {
-		VirtualInterfaces []VirtualInterface `mapstructure:"virtual_interfaces" json:"virtual_interfaces"`
-	}
-
-	err := mapstructure.Decode(r.Body, &res)
-
-	return &res.VirtualInterfaces[0], err
-}
-
-// CreateResult represents the result of a create operation.
-type CreateResult struct {
-	commonResult
-}
-
-// DeleteResult represents the result of a delete operation.
-type DeleteResult struct {
-	gophercloud.ErrResult
-}
-
-// IPAddress represents a vitual address attached to a VirtualInterface.
-type IPAddress struct {
-	Address      string `mapstructure:"address" json:"address"`
-	NetworkID    string `mapstructure:"network_id" json:"network_id"`
-	NetworkLabel string `mapstructure:"network_label" json:"network_label"`
-}
-
-// VirtualInterface represents a virtual interface.
-type VirtualInterface struct {
-	// UUID for the virtual interface
-	ID string `mapstructure:"id" json:"id"`
-
-	MACAddress string `mapstructure:"mac_address" json:"mac_address"`
-
-	IPAddresses []IPAddress `mapstructure:"ip_addresses" json:"ip_addresses"`
-}
-
-// VirtualInterfacePage is the page returned by a pager when traversing over a
-// collection of virtual interfaces.
-type VirtualInterfacePage struct {
-	pagination.SinglePageBase
-}
-
-// IsEmpty returns true if the NetworkPage contains no Networks.
-func (r VirtualInterfacePage) IsEmpty() (bool, error) {
-	networks, err := ExtractVirtualInterfaces(r)
-	if err != nil {
-		return true, err
-	}
-	return len(networks) == 0, nil
-}
-
-// ExtractVirtualInterfaces accepts a Page struct, specifically a VirtualInterfacePage struct,
-// and extracts the elements into a slice of VirtualInterface structs. In other words,
-// a generic collection is mapped into a relevant slice.
-func ExtractVirtualInterfaces(page pagination.Page) ([]VirtualInterface, error) {
-	var resp struct {
-		VirtualInterfaces []VirtualInterface `mapstructure:"virtual_interfaces" json:"virtual_interfaces"`
-	}
-
-	err := mapstructure.Decode(page.(VirtualInterfacePage).Body, &resp)
-
-	return resp.VirtualInterfaces, err
-}
diff --git a/rackspace/compute/v2/virtualinterfaces/urls.go b/rackspace/compute/v2/virtualinterfaces/urls.go
deleted file mode 100644
index 9e5693e..0000000
--- a/rackspace/compute/v2/virtualinterfaces/urls.go
+++ /dev/null
@@ -1,15 +0,0 @@
-package virtualinterfaces
-
-import "github.com/rackspace/gophercloud"
-
-func listURL(c *gophercloud.ServiceClient, instanceID string) string {
-	return c.ServiceURL("servers", instanceID, "os-virtual-interfacesv2")
-}
-
-func createURL(c *gophercloud.ServiceClient, instanceID string) string {
-	return c.ServiceURL("servers", instanceID, "os-virtual-interfacesv2")
-}
-
-func deleteURL(c *gophercloud.ServiceClient, instanceID, interfaceID string) string {
-	return c.ServiceURL("servers", instanceID, "os-virtual-interfacesv2", interfaceID)
-}
diff --git a/rackspace/compute/v2/virtualinterfaces/urls_test.go b/rackspace/compute/v2/virtualinterfaces/urls_test.go
deleted file mode 100644
index 6732e4e..0000000
--- a/rackspace/compute/v2/virtualinterfaces/urls_test.go
+++ /dev/null
@@ -1,32 +0,0 @@
-package virtualinterfaces
-
-import (
-	"testing"
-
-	"github.com/rackspace/gophercloud"
-	th "github.com/rackspace/gophercloud/testhelper"
-)
-
-const endpoint = "http://localhost:57909/"
-
-func endpointClient() *gophercloud.ServiceClient {
-	return &gophercloud.ServiceClient{Endpoint: endpoint}
-}
-
-func TestCreateURL(t *testing.T) {
-	actual := createURL(endpointClient(), "12345")
-	expected := endpoint + "servers/12345/os-virtual-interfacesv2"
-	th.AssertEquals(t, expected, actual)
-}
-
-func TestListURL(t *testing.T) {
-	actual := createURL(endpointClient(), "12345")
-	expected := endpoint + "servers/12345/os-virtual-interfacesv2"
-	th.AssertEquals(t, expected, actual)
-}
-
-func TestDeleteURL(t *testing.T) {
-	actual := deleteURL(endpointClient(), "12345", "6789")
-	expected := endpoint + "servers/12345/os-virtual-interfacesv2/6789"
-	th.AssertEquals(t, expected, actual)
-}
diff --git a/rackspace/compute/v2/volumeattach/delegate.go b/rackspace/compute/v2/volumeattach/delegate.go
deleted file mode 100644
index c6003e0..0000000
--- a/rackspace/compute/v2/volumeattach/delegate.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package volumeattach
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List returns a Pager that allows you to iterate over a collection of VolumeAttachments.
-func List(client *gophercloud.ServiceClient, serverID string) pagination.Pager {
-	return os.List(client, serverID)
-}
-
-// Create requests the creation of a new volume attachment on the server
-func Create(client *gophercloud.ServiceClient, serverID string, opts os.CreateOptsBuilder) os.CreateResult {
-	return os.Create(client, serverID, opts)
-}
-
-// Get returns public data about a previously created VolumeAttachment.
-func Get(client *gophercloud.ServiceClient, serverID, aID string) os.GetResult {
-	return os.Get(client, serverID, aID)
-}
-
-// Delete requests the deletion of a previous stored VolumeAttachment from the server.
-func Delete(client *gophercloud.ServiceClient, serverID, aID string) os.DeleteResult {
-	return os.Delete(client, serverID, aID)
-}
diff --git a/rackspace/compute/v2/volumeattach/delegate_test.go b/rackspace/compute/v2/volumeattach/delegate_test.go
deleted file mode 100644
index f7ef45e..0000000
--- a/rackspace/compute/v2/volumeattach/delegate_test.go
+++ /dev/null
@@ -1,95 +0,0 @@
-package volumeattach
-
-import (
-	"testing"
-
-	"github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach"
-	fixtures "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach/testing"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	"github.com/rackspace/gophercloud/testhelper/client"
-)
-
-// FirstVolumeAttachment is the first result in ListOutput.
-var FirstVolumeAttachment = volumeattach.VolumeAttachment{
-	Device:   "/dev/vdd",
-	ID:       "a26887c6-c47b-4654-abb5-dfadf7d3f803",
-	ServerID: "4d8c3732-a248-40ed-bebc-539a6ffd25c0",
-	VolumeID: "a26887c6-c47b-4654-abb5-dfadf7d3f803",
-}
-
-// SecondVolumeAttachment is the first result in ListOutput.
-var SecondVolumeAttachment = volumeattach.VolumeAttachment{
-	Device:   "/dev/vdc",
-	ID:       "a26887c6-c47b-4654-abb5-dfadf7d3f804",
-	ServerID: "4d8c3732-a248-40ed-bebc-539a6ffd25c0",
-	VolumeID: "a26887c6-c47b-4654-abb5-dfadf7d3f804",
-}
-
-// ExpectedVolumeAttachmentSlide is the slice of results that should be parsed
-// from ListOutput, in the expected order.
-var ExpectedVolumeAttachmentSlice = []volumeattach.VolumeAttachment{FirstVolumeAttachment, SecondVolumeAttachment}
-
-//CreatedVolumeAttachment is the parsed result from CreatedOutput.
-var CreatedVolumeAttachment = volumeattach.VolumeAttachment{
-	Device:   "/dev/vdc",
-	ID:       "a26887c6-c47b-4654-abb5-dfadf7d3f804",
-	ServerID: "4d8c3732-a248-40ed-bebc-539a6ffd25c0",
-	VolumeID: "a26887c6-c47b-4654-abb5-dfadf7d3f804",
-}
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixtures.HandleListSuccessfully(t)
-	serverId := "4d8c3732-a248-40ed-bebc-539a6ffd25c0"
-
-	count := 0
-	err := List(client.ServiceClient(), serverId).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := volumeattach.ExtractVolumeAttachments(page)
-		th.AssertNoErr(t, err)
-		th.CheckDeepEquals(t, ExpectedVolumeAttachmentSlice, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, 1, count)
-}
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixtures.HandleCreateSuccessfully(t)
-	serverId := "4d8c3732-a248-40ed-bebc-539a6ffd25c0"
-
-	actual, err := Create(client.ServiceClient(), serverId, volumeattach.CreateOpts{
-		Device:   "/dev/vdc",
-		VolumeID: "a26887c6-c47b-4654-abb5-dfadf7d3f804",
-	}).Extract()
-	th.AssertNoErr(t, err)
-	th.CheckDeepEquals(t, &CreatedVolumeAttachment, actual)
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixtures.HandleGetSuccessfully(t)
-	aId := "a26887c6-c47b-4654-abb5-dfadf7d3f804"
-	serverId := "4d8c3732-a248-40ed-bebc-539a6ffd25c0"
-
-	actual, err := Get(client.ServiceClient(), serverId, aId).Extract()
-	th.AssertNoErr(t, err)
-	th.CheckDeepEquals(t, &SecondVolumeAttachment, actual)
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixtures.HandleDeleteSuccessfully(t)
-	aId := "a26887c6-c47b-4654-abb5-dfadf7d3f804"
-	serverId := "4d8c3732-a248-40ed-bebc-539a6ffd25c0"
-
-	err := Delete(client.ServiceClient(), serverId, aId).ExtractErr()
-	th.AssertNoErr(t, err)
-}
diff --git a/rackspace/compute/v2/volumeattach/doc.go b/rackspace/compute/v2/volumeattach/doc.go
deleted file mode 100644
index 2164908..0000000
--- a/rackspace/compute/v2/volumeattach/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package volumeattach provides the ability to attach and detach volume
-// to instances to Rackspace servers
-package volumeattach
diff --git a/rackspace/db/v1/backups/doc.go b/rackspace/db/v1/backups/doc.go
deleted file mode 100644
index 664eead..0000000
--- a/rackspace/db/v1/backups/doc.go
+++ /dev/null
@@ -1,6 +0,0 @@
-// Package backups provides information and interaction with the backup API
-// resource in the Rackspace Database service.
-//
-// A backup is a copy of a database instance that can be used to restore it to
-// some defined point in history.
-package backups
diff --git a/rackspace/db/v1/backups/fixtures.go b/rackspace/db/v1/backups/fixtures.go
deleted file mode 100644
index 45c2376..0000000
--- a/rackspace/db/v1/backups/fixtures.go
+++ /dev/null
@@ -1,66 +0,0 @@
-package backups
-
-import "time"
-
-var (
-	timestamp  = "2015-11-12T14:22:42Z"
-	timeVal, _ = time.Parse(time.RFC3339, timestamp)
-)
-
-var getResp = `
-{
-  "backup": {
-    "created": "` + timestamp + `",
-    "description": "My Backup",
-    "id": "61f12fef-edb1-4561-8122-e7c00ef26a82",
-    "instance_id": "d4603f69-ec7e-4e9b-803f-600b9205576f",
-    "locationRef": null,
-    "name": "snapshot",
-    "parent_id": null,
-    "size": 100,
-    "status": "NEW",
-		"datastore": {
-			"version": "5.1",
-			"type": "MySQL",
-			"version_id": "20000000-0000-0000-0000-000000000002"
-		},
-    "updated": "` + timestamp + `"
-  }
-}
-`
-
-var createReq = `
-{
-  "backup": {
-    "description": "My Backup",
-    "instance": "d4603f69-ec7e-4e9b-803f-600b9205576f",
-    "name": "snapshot"
-  }
-}
-`
-
-var createResp = getResp
-
-var listResp = `
-{
-  "backups": [
-    {
-      "status": "COMPLETED",
-      "updated": "` + timestamp + `",
-      "description": "Backup from Restored Instance",
-      "datastore": {
-        "version": "5.1",
-        "type": "MySQL",
-        "version_id": "20000000-0000-0000-0000-000000000002"
-      },
-      "id": "87972694-4be2-40f5-83f8-501656e0032a",
-      "size": 0.141026,
-      "name": "restored_backup",
-      "created": "` + timestamp + `",
-      "instance_id": "29af2cd9-0674-48ab-b87a-b160f00208e6",
-      "parent_id": null,
-      "locationRef": "http://localhost/path/to/backup"
-    }
-  ]
-}
-`
diff --git a/rackspace/db/v1/backups/requests.go b/rackspace/db/v1/backups/requests.go
deleted file mode 100644
index 9170d78..0000000
--- a/rackspace/db/v1/backups/requests.go
+++ /dev/null
@@ -1,138 +0,0 @@
-package backups
-
-import (
-	"errors"
-
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// CreateOptsBuilder is the top-level interface for creating JSON maps.
-type CreateOptsBuilder interface {
-	ToBackupCreateMap() (map[string]interface{}, error)
-}
-
-// CreateOpts is responsible for configuring newly provisioned backups.
-type CreateOpts struct {
-	// [REQUIRED] The name of the backup. The only restriction is the name must
-	// be less than 64 characters long.
-	Name string
-
-	// [REQUIRED] The ID of the instance being backed up.
-	InstanceID string
-
-	// [OPTIONAL] A human-readable explanation of the backup.
-	Description string
-}
-
-// ToBackupCreateMap will create a JSON map for the Create operation.
-func (opts CreateOpts) ToBackupCreateMap() (map[string]interface{}, error) {
-	if opts.Name == "" {
-		return nil, errors.New("Name is a required field")
-	}
-	if opts.InstanceID == "" {
-		return nil, errors.New("InstanceID is a required field")
-	}
-
-	backup := map[string]interface{}{
-		"name":     opts.Name,
-		"instance": opts.InstanceID,
-	}
-
-	if opts.Description != "" {
-		backup["description"] = opts.Description
-	}
-
-	return map[string]interface{}{"backup": backup}, nil
-}
-
-// Create asynchronously creates a new backup for a specified database instance.
-// During the backup process, write access on MyISAM databases will be
-// temporarily disabled; innoDB databases will be unaffected. During this time,
-// you will not be able to add or delete databases or users; nor delete, stop
-// or reboot the instance itself. Only one backup is permitted at once.
-//
-// Backups are not deleted when database instances are deleted; you must
-// manually delete any backups created using Delete(). Backups are saved to your
-// Cloud Files account in a new container called z_CLOUDDB_BACKUPS. It is
-// strongly recommended you do not alter this container or its contents; usual
-// storage costs apply.
-func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateResult {
-	var res CreateResult
-
-	reqBody, err := opts.ToBackupCreateMap()
-	if err != nil {
-		res.Err = err
-		return res
-	}
-
-	_, res.Err = client.Request("POST", baseURL(client), gophercloud.RequestOpts{
-		JSONBody:     &reqBody,
-		JSONResponse: &res.Body,
-		OkCodes:      []int{202},
-	})
-
-	return res
-}
-
-// ListOptsBuilder is the top-level interface for creating query strings.
-type ListOptsBuilder interface {
-	ToBackupListQuery() (string, error)
-}
-
-// ListOpts allows you to refine a list search by certain parameters.
-type ListOpts struct {
-	// The type of datastore by which to filter.
-	Datastore string `q:"datastore"`
-}
-
-// ToBackupListQuery converts a ListOpts struct into a query string.
-func (opts ListOpts) ToBackupListQuery() (string, error) {
-	q, err := gophercloud.BuildQueryString(opts)
-	if err != nil {
-		return "", err
-	}
-	return q.String(), nil
-}
-
-// List will list all the saved backups for all database instances.
-func List(client *gophercloud.ServiceClient, opts ListOptsBuilder) pagination.Pager {
-	url := baseURL(client)
-
-	if opts != nil {
-		query, err := opts.ToBackupListQuery()
-		if err != nil {
-			return pagination.Pager{Err: err}
-		}
-		url += query
-	}
-
-	pageFn := func(r pagination.PageResult) pagination.Page {
-		return BackupPage{pagination.SinglePageBase(r)}
-	}
-
-	return pagination.NewPager(client, url, pageFn)
-}
-
-// Get will retrieve details for a particular backup based on its unique ID.
-func Get(client *gophercloud.ServiceClient, id string) GetResult {
-	var res GetResult
-
-	_, res.Err = client.Request("GET", resourceURL(client, id), gophercloud.RequestOpts{
-		JSONResponse: &res.Body,
-		OkCodes:      []int{200},
-	})
-
-	return res
-}
-
-// Delete will permanently delete a backup.
-func Delete(client *gophercloud.ServiceClient, id string) DeleteResult {
-	var res DeleteResult
-
-	_, res.Err = client.Request("DELETE", resourceURL(client, id), gophercloud.RequestOpts{
-		OkCodes: []int{202},
-	})
-
-	return res
-}
diff --git a/rackspace/db/v1/backups/requests_test.go b/rackspace/db/v1/backups/requests_test.go
deleted file mode 100644
index d706733..0000000
--- a/rackspace/db/v1/backups/requests_test.go
+++ /dev/null
@@ -1,131 +0,0 @@
-package backups
-
-import (
-	"testing"
-
-	"github.com/rackspace/gophercloud/openstack/db/v1/datastores"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-	"github.com/rackspace/gophercloud/testhelper/fixture"
-)
-
-var (
-	backupID = "{backupID}"
-	_rootURL = "/backups"
-	resURL   = _rootURL + "/" + backupID
-)
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, _rootURL, "POST", createReq, createResp, 202)
-
-	opts := CreateOpts{
-		Name:        "snapshot",
-		Description: "My Backup",
-		InstanceID:  "d4603f69-ec7e-4e9b-803f-600b9205576f",
-	}
-
-	instance, err := Create(fake.ServiceClient(), opts).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := &Backup{
-		Created:     timeVal,
-		Description: "My Backup",
-		ID:          "61f12fef-edb1-4561-8122-e7c00ef26a82",
-		InstanceID:  "d4603f69-ec7e-4e9b-803f-600b9205576f",
-		LocationRef: "",
-		Name:        "snapshot",
-		ParentID:    "",
-		Size:        100,
-		Status:      "NEW",
-		Updated:     timeVal,
-		Datastore: datastores.DatastorePartial{
-			Version:   "5.1",
-			Type:      "MySQL",
-			VersionID: "20000000-0000-0000-0000-000000000002",
-		},
-	}
-
-	th.AssertDeepEquals(t, expected, instance)
-}
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, _rootURL, "GET", "", listResp, 200)
-
-	pages := 0
-
-	err := List(fake.ServiceClient(), nil).EachPage(func(page pagination.Page) (bool, error) {
-		pages++
-		actual, err := ExtractBackups(page)
-		th.AssertNoErr(t, err)
-
-		expected := []Backup{
-			Backup{
-				Created:     timeVal,
-				Description: "Backup from Restored Instance",
-				ID:          "87972694-4be2-40f5-83f8-501656e0032a",
-				InstanceID:  "29af2cd9-0674-48ab-b87a-b160f00208e6",
-				LocationRef: "http://localhost/path/to/backup",
-				Name:        "restored_backup",
-				ParentID:    "",
-				Size:        0.141026,
-				Status:      "COMPLETED",
-				Updated:     timeVal,
-				Datastore: datastores.DatastorePartial{
-					Version:   "5.1",
-					Type:      "MySQL",
-					VersionID: "20000000-0000-0000-0000-000000000002",
-				},
-			},
-		}
-
-		th.AssertDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, 1, pages)
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, resURL, "GET", "", getResp, 200)
-
-	instance, err := Get(fake.ServiceClient(), backupID).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := &Backup{
-		Created:     timeVal,
-		Description: "My Backup",
-		ID:          "61f12fef-edb1-4561-8122-e7c00ef26a82",
-		InstanceID:  "d4603f69-ec7e-4e9b-803f-600b9205576f",
-		LocationRef: "",
-		Name:        "snapshot",
-		ParentID:    "",
-		Size:        100,
-		Status:      "NEW",
-		Updated:     timeVal,
-		Datastore: datastores.DatastorePartial{
-			Version:   "5.1",
-			Type:      "MySQL",
-			VersionID: "20000000-0000-0000-0000-000000000002",
-		},
-	}
-
-	th.AssertDeepEquals(t, expected, instance)
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, resURL, "DELETE", "", "", 202)
-
-	err := Delete(fake.ServiceClient(), backupID).ExtractErr()
-	th.AssertNoErr(t, err)
-}
diff --git a/rackspace/db/v1/backups/results.go b/rackspace/db/v1/backups/results.go
deleted file mode 100644
index 04faf32..0000000
--- a/rackspace/db/v1/backups/results.go
+++ /dev/null
@@ -1,149 +0,0 @@
-package backups
-
-import (
-	"fmt"
-	"reflect"
-	"time"
-
-	"github.com/mitchellh/mapstructure"
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/openstack/db/v1/datastores"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// Status represents the various states a Backup can be in.
-type Status string
-
-// Enum types for the status.
-const (
-	StatusNew          Status = "NEW"
-	StatusBuilding     Status = "BUILDING"
-	StatusCompleted    Status = "COMPLETED"
-	StatusFailed       Status = "FAILED"
-	StatusDeleteFailed Status = "DELETE_FAILED"
-)
-
-// Backup represents a Backup API resource.
-type Backup struct {
-	Description string
-	ID          string
-	InstanceID  string `json:"instance_id" mapstructure:"instance_id"`
-	LocationRef string
-	Name        string
-	ParentID    string `json:"parent_id" mapstructure:"parent_id"`
-	Size        float64
-	Status      Status
-	Created     time.Time `mapstructure:"-"`
-	Updated     time.Time `mapstructure:"-"`
-	Datastore   datastores.DatastorePartial
-}
-
-// CreateResult represents the result of a create operation.
-type CreateResult struct {
-	commonResult
-}
-
-// GetResult represents the result of a get operation.
-type GetResult struct {
-	commonResult
-}
-
-// DeleteResult represents the result of a delete operation.
-type DeleteResult struct {
-	gophercloud.ErrResult
-}
-
-type commonResult struct {
-	gophercloud.Result
-}
-
-// Extract will retrieve a Backup struct from an operation's result.
-func (r commonResult) Extract() (*Backup, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-
-	var response struct {
-		Backup Backup `mapstructure:"backup"`
-	}
-
-	err := mapstructure.Decode(r.Body, &response)
-	val := r.Body.(map[string]interface{})["backup"].(map[string]interface{})
-
-	if t, ok := val["created"].(string); ok && t != "" {
-		creationTime, err := time.Parse(time.RFC3339, t)
-		if err != nil {
-			return &response.Backup, err
-		}
-		response.Backup.Created = creationTime
-	}
-
-	if t, ok := val["updated"].(string); ok && t != "" {
-		updatedTime, err := time.Parse(time.RFC3339, t)
-		if err != nil {
-			return &response.Backup, err
-		}
-		response.Backup.Updated = updatedTime
-	}
-
-	return &response.Backup, err
-}
-
-// BackupPage represents a page of backups.
-type BackupPage struct {
-	pagination.SinglePageBase
-}
-
-// IsEmpty checks whether an BackupPage struct is empty.
-func (r BackupPage) IsEmpty() (bool, error) {
-	is, err := ExtractBackups(r)
-	if err != nil {
-		return true, err
-	}
-	return len(is) == 0, nil
-}
-
-// ExtractBackups will retrieve a slice of Backup structs from a paginated collection.
-func ExtractBackups(page pagination.Page) ([]Backup, error) {
-	casted := page.(BackupPage).Body
-
-	var resp struct {
-		Backups []Backup `mapstructure:"backups" json:"backups"`
-	}
-
-	if err := mapstructure.Decode(casted, &resp); err != nil {
-		return nil, err
-	}
-
-	var vals []interface{}
-	switch casted.(type) {
-	case map[string]interface{}:
-		vals = casted.(map[string]interface{})["backups"].([]interface{})
-	case map[string][]interface{}:
-		vals = casted.(map[string][]interface{})["backups"]
-	default:
-		return resp.Backups, fmt.Errorf("Unknown type: %v", reflect.TypeOf(casted))
-	}
-
-	for i, v := range vals {
-		val := v.(map[string]interface{})
-
-		if t, ok := val["created"].(string); ok && t != "" {
-			creationTime, err := time.Parse(time.RFC3339, t)
-			if err != nil {
-				return resp.Backups, err
-			}
-			resp.Backups[i].Created = creationTime
-		}
-
-		if t, ok := val["updated"].(string); ok && t != "" {
-			updatedTime, err := time.Parse(time.RFC3339, t)
-			if err != nil {
-				return resp.Backups, err
-			}
-			resp.Backups[i].Updated = updatedTime
-		}
-	}
-
-	return resp.Backups, nil
-}
diff --git a/rackspace/db/v1/backups/urls.go b/rackspace/db/v1/backups/urls.go
deleted file mode 100644
index 553444e..0000000
--- a/rackspace/db/v1/backups/urls.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package backups
-
-import "github.com/rackspace/gophercloud"
-
-func baseURL(c *gophercloud.ServiceClient) string {
-	return c.ServiceURL("backups")
-}
-
-func resourceURL(c *gophercloud.ServiceClient, backupID string) string {
-	return c.ServiceURL("backups", backupID)
-}
diff --git a/rackspace/db/v1/configurations/delegate.go b/rackspace/db/v1/configurations/delegate.go
deleted file mode 100644
index d8cb48a..0000000
--- a/rackspace/db/v1/configurations/delegate.go
+++ /dev/null
@@ -1,79 +0,0 @@
-package configurations
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/db/v1/configurations"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List will list all of the available configurations.
-func List(client *gophercloud.ServiceClient) pagination.Pager {
-	return os.List(client)
-}
-
-// Create will create a new configuration group.
-func Create(client *gophercloud.ServiceClient, opts os.CreateOptsBuilder) os.CreateResult {
-	return os.Create(client, opts)
-}
-
-// Get will retrieve the details for a specified configuration group.
-func Get(client *gophercloud.ServiceClient, configID string) os.GetResult {
-	return os.Get(client, configID)
-}
-
-// Update will modify an existing configuration group by performing a merge
-// between new and existing values. If the key already exists, the new value
-// will overwrite. All other keys will remain unaffected.
-func Update(client *gophercloud.ServiceClient, configID string, opts os.UpdateOptsBuilder) os.UpdateResult {
-	return os.Update(client, configID, opts)
-}
-
-// Replace will modify an existing configuration group by overwriting the
-// entire parameter group with the new values provided. Any existing keys not
-// included in UpdateOptsBuilder will be deleted.
-func Replace(client *gophercloud.ServiceClient, configID string, opts os.UpdateOptsBuilder) os.ReplaceResult {
-	return os.Replace(client, configID, opts)
-}
-
-// Delete will permanently delete a configuration group. Please note that
-// config groups cannot be deleted whilst still attached to running instances -
-// you must detach and then delete them.
-func Delete(client *gophercloud.ServiceClient, configID string) os.DeleteResult {
-	return os.Delete(client, configID)
-}
-
-// ListInstances will list all the instances associated with a particular
-// configuration group.
-func ListInstances(client *gophercloud.ServiceClient, configID string) pagination.Pager {
-	return os.ListInstances(client, configID)
-}
-
-// ListDatastoreParams will list all the available and supported parameters
-// that can be used for a particular datastore ID and a particular version.
-// For example, if you are wondering how you can configure a MySQL 5.6 instance,
-// you can use this operation (you will need to retrieve the MySQL datastore ID
-// by using the datastores API).
-func ListDatastoreParams(client *gophercloud.ServiceClient, datastoreID, versionID string) pagination.Pager {
-	return os.ListDatastoreParams(client, datastoreID, versionID)
-}
-
-// GetDatastoreParam will retrieve information about a specific configuration
-// parameter. For example, you can use this operation to understand more about
-// "innodb_file_per_table" configuration param for MySQL datastores. You will
-// need the param's ID first, which can be attained by using the ListDatastoreParams
-// operation.
-func GetDatastoreParam(client *gophercloud.ServiceClient, datastoreID, versionID, paramID string) os.ParamResult {
-	return os.GetDatastoreParam(client, datastoreID, versionID, paramID)
-}
-
-// ListGlobalParams is similar to ListDatastoreParams but does not require a
-// DatastoreID.
-func ListGlobalParams(client *gophercloud.ServiceClient, versionID string) pagination.Pager {
-	return os.ListGlobalParams(client, versionID)
-}
-
-// GetGlobalParam is similar to GetDatastoreParam but does not require a
-// DatastoreID.
-func GetGlobalParam(client *gophercloud.ServiceClient, versionID, paramID string) os.ParamResult {
-	return os.GetGlobalParam(client, versionID, paramID)
-}
diff --git a/rackspace/db/v1/configurations/delegate_test.go b/rackspace/db/v1/configurations/delegate_test.go
deleted file mode 100644
index 580f02a..0000000
--- a/rackspace/db/v1/configurations/delegate_test.go
+++ /dev/null
@@ -1,237 +0,0 @@
-package configurations
-
-import (
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/db/v1/configurations"
-	"github.com/rackspace/gophercloud/pagination"
-	"github.com/rackspace/gophercloud/rackspace/db/v1/instances"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-	"github.com/rackspace/gophercloud/testhelper/fixture"
-)
-
-var (
-	configID = "{configID}"
-	_baseURL = "/configurations"
-	resURL   = _baseURL + "/" + configID
-
-	dsID               = "{datastoreID}"
-	versionID          = "{versionID}"
-	paramID            = "{paramID}"
-	dsParamListURL     = "/datastores/" + dsID + "/versions/" + versionID + "/parameters"
-	dsParamGetURL      = "/datastores/" + dsID + "/versions/" + versionID + "/parameters/" + paramID
-	globalParamListURL = "/datastores/versions/" + versionID + "/parameters"
-	globalParamGetURL  = "/datastores/versions/" + versionID + "/parameters/" + paramID
-)
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, _baseURL, "GET", "", listConfigsJSON, 200)
-
-	count := 0
-	err := List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := os.ExtractConfigs(page)
-		th.AssertNoErr(t, err)
-
-		expected := []os.Config{exampleConfig}
-		th.AssertDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-
-	th.AssertEquals(t, 1, count)
-	th.AssertNoErr(t, err)
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, resURL, "GET", "", getConfigJSON, 200)
-
-	config, err := Get(fake.ServiceClient(), configID).Extract()
-	th.AssertNoErr(t, err)
-	th.AssertDeepEquals(t, &exampleConfig, config)
-}
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, _baseURL, "POST", createReq, createConfigJSON, 200)
-
-	opts := os.CreateOpts{
-		Datastore: &os.DatastoreOpts{
-			Type:    "a00000a0-00a0-0a00-00a0-000a000000aa",
-			Version: "b00000b0-00b0-0b00-00b0-000b000000bb",
-		},
-		Description: "example description",
-		Name:        "example-configuration-name",
-		Values: map[string]interface{}{
-			"collation_server": "latin1_swedish_ci",
-			"connect_timeout":  120,
-		},
-	}
-
-	config, err := Create(fake.ServiceClient(), opts).Extract()
-	th.AssertNoErr(t, err)
-	th.AssertDeepEquals(t, &exampleConfigWithValues, config)
-}
-
-func TestUpdate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, resURL, "PATCH", updateReq, "", 200)
-
-	opts := os.UpdateOpts{
-		Values: map[string]interface{}{
-			"connect_timeout": 300,
-		},
-	}
-
-	err := Update(fake.ServiceClient(), configID, opts).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestReplace(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, resURL, "PUT", updateReq, "", 202)
-
-	opts := os.UpdateOpts{
-		Values: map[string]interface{}{
-			"connect_timeout": 300,
-		},
-	}
-
-	err := Replace(fake.ServiceClient(), configID, opts).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, resURL, "DELETE", "", "", 202)
-
-	err := Delete(fake.ServiceClient(), configID).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestListInstances(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, resURL+"/instances", "GET", "", listInstancesJSON, 200)
-
-	expectedInstance := instances.Instance{
-		ID:   "d4603f69-ec7e-4e9b-803f-600b9205576f",
-		Name: "json_rack_instance",
-	}
-
-	pages := 0
-	err := ListInstances(fake.ServiceClient(), configID).EachPage(func(page pagination.Page) (bool, error) {
-		pages++
-
-		actual, err := instances.ExtractInstances(page)
-		if err != nil {
-			return false, err
-		}
-
-		th.AssertDeepEquals(t, actual, []instances.Instance{expectedInstance})
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, 1, pages)
-}
-
-func TestListDSParams(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, dsParamListURL, "GET", "", listParamsJSON, 200)
-
-	pages := 0
-	err := ListDatastoreParams(fake.ServiceClient(), dsID, versionID).EachPage(func(page pagination.Page) (bool, error) {
-		pages++
-
-		actual, err := os.ExtractParams(page)
-		if err != nil {
-			return false, err
-		}
-
-		expected := []os.Param{
-			os.Param{Max: 1, Min: 0, Name: "innodb_file_per_table", RestartRequired: true, Type: "integer"},
-			os.Param{Max: 4294967296, Min: 0, Name: "key_buffer_size", RestartRequired: false, Type: "integer"},
-			os.Param{Max: 65535, Min: 2, Name: "connect_timeout", RestartRequired: false, Type: "integer"},
-			os.Param{Max: 4294967296, Min: 0, Name: "join_buffer_size", RestartRequired: false, Type: "integer"},
-		}
-
-		th.AssertDeepEquals(t, actual, expected)
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, 1, pages)
-}
-
-func TestGetDSParam(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, dsParamGetURL, "GET", "", getParamJSON, 200)
-
-	param, err := GetDatastoreParam(fake.ServiceClient(), dsID, versionID, paramID).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := &os.Param{
-		Max: 1, Min: 0, Name: "innodb_file_per_table", RestartRequired: true, Type: "integer",
-	}
-
-	th.AssertDeepEquals(t, expected, param)
-}
-
-func TestListGlobalParams(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, globalParamListURL, "GET", "", listParamsJSON, 200)
-
-	pages := 0
-	err := ListGlobalParams(fake.ServiceClient(), versionID).EachPage(func(page pagination.Page) (bool, error) {
-		pages++
-
-		actual, err := os.ExtractParams(page)
-		if err != nil {
-			return false, err
-		}
-
-		expected := []os.Param{
-			os.Param{Max: 1, Min: 0, Name: "innodb_file_per_table", RestartRequired: true, Type: "integer"},
-			os.Param{Max: 4294967296, Min: 0, Name: "key_buffer_size", RestartRequired: false, Type: "integer"},
-			os.Param{Max: 65535, Min: 2, Name: "connect_timeout", RestartRequired: false, Type: "integer"},
-			os.Param{Max: 4294967296, Min: 0, Name: "join_buffer_size", RestartRequired: false, Type: "integer"},
-		}
-
-		th.AssertDeepEquals(t, actual, expected)
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, 1, pages)
-}
-
-func TestGetGlobalParam(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, globalParamGetURL, "GET", "", getParamJSON, 200)
-
-	param, err := GetGlobalParam(fake.ServiceClient(), versionID, paramID).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := &os.Param{
-		Max: 1, Min: 0, Name: "innodb_file_per_table", RestartRequired: true, Type: "integer",
-	}
-
-	th.AssertDeepEquals(t, expected, param)
-}
diff --git a/rackspace/db/v1/configurations/doc.go b/rackspace/db/v1/configurations/doc.go
deleted file mode 100644
index 48c51d6..0000000
--- a/rackspace/db/v1/configurations/doc.go
+++ /dev/null
@@ -1 +0,0 @@
-package configurations
diff --git a/rackspace/db/v1/configurations/fixtures.go b/rackspace/db/v1/configurations/fixtures.go
deleted file mode 100644
index d8a2233..0000000
--- a/rackspace/db/v1/configurations/fixtures.go
+++ /dev/null
@@ -1,159 +0,0 @@
-package configurations
-
-import (
-	"fmt"
-	"time"
-
-	os "github.com/rackspace/gophercloud/openstack/db/v1/configurations"
-)
-
-var (
-	timestamp  = "2015-11-12T14:22:42Z"
-	timeVal, _ = time.Parse(time.RFC3339, timestamp)
-)
-
-var singleConfigJSON = `
-{
-  "created": "` + timestamp + `",
-  "datastore_name": "mysql",
-  "datastore_version_id": "b00000b0-00b0-0b00-00b0-000b000000bb",
-  "datastore_version_name": "5.6",
-  "description": "example_description",
-  "id": "005a8bb7-a8df-40ee-b0b7-fc144641abc2",
-  "name": "example-configuration-name",
-  "updated": "` + timestamp + `"
-}
-`
-
-var singleConfigWithValuesJSON = `
-{
-  "created": "` + timestamp + `",
-  "datastore_name": "mysql",
-  "datastore_version_id": "b00000b0-00b0-0b00-00b0-000b000000bb",
-  "datastore_version_name": "5.6",
-  "description": "example description",
-  "id": "005a8bb7-a8df-40ee-b0b7-fc144641abc2",
-  "instance_count": 0,
-  "name": "example-configuration-name",
-  "updated": "` + timestamp + `",
-  "values": {
-    "collation_server": "latin1_swedish_ci",
-    "connect_timeout": 120
-  }
-}
-`
-
-var (
-	listConfigsJSON  = fmt.Sprintf(`{"configurations": [%s]}`, singleConfigJSON)
-	getConfigJSON    = fmt.Sprintf(`{"configuration": %s}`, singleConfigJSON)
-	createConfigJSON = fmt.Sprintf(`{"configuration": %s}`, singleConfigWithValuesJSON)
-)
-
-var createReq = `
-{
-  "configuration": {
-    "datastore": {
-      "type": "a00000a0-00a0-0a00-00a0-000a000000aa",
-      "version": "b00000b0-00b0-0b00-00b0-000b000000bb"
-    },
-    "description": "example description",
-    "name": "example-configuration-name",
-    "values": {
-      "collation_server": "latin1_swedish_ci",
-      "connect_timeout": 120
-    }
-  }
-}
-`
-
-var updateReq = `
-{
-  "configuration": {
-    "values": {
-      "connect_timeout": 300
-    }
-  }
-}
-`
-
-var listInstancesJSON = `
-{
-  "instances": [
-    {
-      "id": "d4603f69-ec7e-4e9b-803f-600b9205576f",
-      "name": "json_rack_instance"
-    }
-  ]
-}
-`
-
-var listParamsJSON = `
-{
-  "configuration-parameters": [
-    {
-      "max": 1,
-      "min": 0,
-      "name": "innodb_file_per_table",
-      "restart_required": true,
-      "type": "integer"
-    },
-    {
-      "max": 4294967296,
-      "min": 0,
-      "name": "key_buffer_size",
-      "restart_required": false,
-      "type": "integer"
-    },
-    {
-      "max": 65535,
-      "min": 2,
-      "name": "connect_timeout",
-      "restart_required": false,
-      "type": "integer"
-    },
-    {
-      "max": 4294967296,
-      "min": 0,
-      "name": "join_buffer_size",
-      "restart_required": false,
-      "type": "integer"
-    }
-  ]
-}
-`
-
-var getParamJSON = `
-{
-  "max": 1,
-  "min": 0,
-  "name": "innodb_file_per_table",
-  "restart_required": true,
-  "type": "integer"
-}
-`
-
-var exampleConfig = os.Config{
-	Created:              timeVal,
-	DatastoreName:        "mysql",
-	DatastoreVersionID:   "b00000b0-00b0-0b00-00b0-000b000000bb",
-	DatastoreVersionName: "5.6",
-	Description:          "example_description",
-	ID:                   "005a8bb7-a8df-40ee-b0b7-fc144641abc2",
-	Name:                 "example-configuration-name",
-	Updated:              timeVal,
-}
-
-var exampleConfigWithValues = os.Config{
-	Created:              timeVal,
-	DatastoreName:        "mysql",
-	DatastoreVersionID:   "b00000b0-00b0-0b00-00b0-000b000000bb",
-	DatastoreVersionName: "5.6",
-	Description:          "example description",
-	ID:                   "005a8bb7-a8df-40ee-b0b7-fc144641abc2",
-	Name:                 "example-configuration-name",
-	Updated:              timeVal,
-	Values: map[string]interface{}{
-		"collation_server": "latin1_swedish_ci",
-		"connect_timeout":  120,
-	},
-}
diff --git a/rackspace/db/v1/databases/delegate.go b/rackspace/db/v1/databases/delegate.go
deleted file mode 100644
index 56552d1..0000000
--- a/rackspace/db/v1/databases/delegate.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package databases
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/db/v1/databases"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-func Create(client *gophercloud.ServiceClient, instanceID string, opts os.CreateOptsBuilder) os.CreateResult {
-	return os.Create(client, instanceID, opts)
-}
-
-func List(client *gophercloud.ServiceClient, instanceID string) pagination.Pager {
-	return os.List(client, instanceID)
-}
-
-func Delete(client *gophercloud.ServiceClient, instanceID, dbName string) os.DeleteResult {
-	return os.Delete(client, instanceID, dbName)
-}
diff --git a/rackspace/db/v1/databases/delegate_test.go b/rackspace/db/v1/databases/delegate_test.go
deleted file mode 100644
index b9e50a5..0000000
--- a/rackspace/db/v1/databases/delegate_test.go
+++ /dev/null
@@ -1,71 +0,0 @@
-package databases
-
-import (
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/db/v1/databases"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-var (
-	instanceID = "{instanceID}"
-	rootURL    = "/instances"
-	resURL     = rootURL + "/" + instanceID
-	uRootURL   = resURL + "/root"
-	aURL       = resURL + "/action"
-)
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleCreate(t)
-
-	opts := os.BatchCreateOpts{
-		os.CreateOpts{Name: "testingdb", CharSet: "utf8", Collate: "utf8_general_ci"},
-		os.CreateOpts{Name: "sampledb"},
-	}
-
-	res := Create(fake.ServiceClient(), instanceID, opts)
-	th.AssertNoErr(t, res.Err)
-}
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleList(t)
-
-	expectedDBs := []os.Database{
-		os.Database{Name: "anotherexampledb"},
-		os.Database{Name: "exampledb"},
-		os.Database{Name: "nextround"},
-		os.Database{Name: "sampledb"},
-		os.Database{Name: "testingdb"},
-	}
-
-	pages := 0
-	err := List(fake.ServiceClient(), instanceID).EachPage(func(page pagination.Page) (bool, error) {
-		pages++
-
-		actual, err := os.ExtractDBs(page)
-		if err != nil {
-			return false, err
-		}
-
-		th.CheckDeepEquals(t, expectedDBs, actual)
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, 1, pages)
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleDelete(t)
-
-	err := os.Delete(fake.ServiceClient(), instanceID, "{dbName}").ExtractErr()
-	th.AssertNoErr(t, err)
-}
diff --git a/rackspace/db/v1/databases/doc.go b/rackspace/db/v1/databases/doc.go
deleted file mode 100644
index 1a178b6..0000000
--- a/rackspace/db/v1/databases/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package databases provides information and interaction with the database API
-// resource in the Rackspace Database service.
-package databases
diff --git a/rackspace/db/v1/databases/urls.go b/rackspace/db/v1/databases/urls.go
deleted file mode 100644
index 18cbec7..0000000
--- a/rackspace/db/v1/databases/urls.go
+++ /dev/null
@@ -1 +0,0 @@
-package databases
diff --git a/rackspace/db/v1/datastores/delegate.go b/rackspace/db/v1/datastores/delegate.go
deleted file mode 100644
index 573496d..0000000
--- a/rackspace/db/v1/datastores/delegate.go
+++ /dev/null
@@ -1,28 +0,0 @@
-package datastores
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/db/v1/datastores"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List will list all available flavors.
-func List(client *gophercloud.ServiceClient) pagination.Pager {
-	return os.List(client)
-}
-
-// Get retrieves the details for a particular flavor.
-func Get(client *gophercloud.ServiceClient, flavorID string) os.GetResult {
-	return os.Get(client, flavorID)
-}
-
-// ListVersions will list all of the available versions for a specified
-// datastore type.
-func ListVersions(client *gophercloud.ServiceClient, datastoreID string) pagination.Pager {
-	return os.ListVersions(client, datastoreID)
-}
-
-// GetVersion will retrieve the details of a specified datastore version.
-func GetVersion(client *gophercloud.ServiceClient, datastoreID, versionID string) os.GetVersionResult {
-	return os.GetVersion(client, datastoreID, versionID)
-}
diff --git a/rackspace/db/v1/datastores/delegate_test.go b/rackspace/db/v1/datastores/delegate_test.go
deleted file mode 100644
index 71111b9..0000000
--- a/rackspace/db/v1/datastores/delegate_test.go
+++ /dev/null
@@ -1,79 +0,0 @@
-package datastores
-
-import (
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/db/v1/datastores"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-	"github.com/rackspace/gophercloud/testhelper/fixture"
-)
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, "/datastores", "GET", "", os.ListDSResp, 200)
-
-	pages := 0
-
-	err := List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		pages++
-
-		actual, err := os.ExtractDatastores(page)
-		if err != nil {
-			return false, err
-		}
-
-		th.CheckDeepEquals(t, []os.Datastore{os.ExampleDatastore}, actual)
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, 1, pages)
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, "/datastores/{dsID}", "GET", "", os.GetDSResp, 200)
-
-	ds, err := Get(fake.ServiceClient(), "{dsID}").Extract()
-	th.AssertNoErr(t, err)
-	th.AssertDeepEquals(t, &os.ExampleDatastore, ds)
-}
-
-func TestListVersions(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, "/datastores/{dsID}/versions", "GET", "", os.ListVersionsResp, 200)
-
-	pages := 0
-
-	err := ListVersions(fake.ServiceClient(), "{dsID}").EachPage(func(page pagination.Page) (bool, error) {
-		pages++
-
-		actual, err := os.ExtractVersions(page)
-		if err != nil {
-			return false, err
-		}
-
-		th.CheckDeepEquals(t, os.ExampleVersions, actual)
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, 1, pages)
-}
-
-func TestGetVersion(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, "/datastores/{dsID}/versions/{versionID}", "GET", "", os.GetVersionResp, 200)
-
-	ds, err := GetVersion(fake.ServiceClient(), "{dsID}", "{versionID}").Extract()
-	th.AssertNoErr(t, err)
-	th.AssertDeepEquals(t, &os.ExampleVersion1, ds)
-}
diff --git a/rackspace/db/v1/datastores/doc.go b/rackspace/db/v1/datastores/doc.go
deleted file mode 100644
index f36997a..0000000
--- a/rackspace/db/v1/datastores/doc.go
+++ /dev/null
@@ -1 +0,0 @@
-package datastores
diff --git a/rackspace/db/v1/flavors/delegate.go b/rackspace/db/v1/flavors/delegate.go
deleted file mode 100644
index 689b81e..0000000
--- a/rackspace/db/v1/flavors/delegate.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package flavors
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/db/v1/flavors"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List will list all available flavors.
-func List(client *gophercloud.ServiceClient) pagination.Pager {
-	return os.List(client)
-}
-
-// Get retrieves the details for a particular flavor.
-func Get(client *gophercloud.ServiceClient, flavorID string) os.GetResult {
-	return os.Get(client, flavorID)
-}
diff --git a/rackspace/db/v1/flavors/delegate_test.go b/rackspace/db/v1/flavors/delegate_test.go
deleted file mode 100644
index f5f6442..0000000
--- a/rackspace/db/v1/flavors/delegate_test.go
+++ /dev/null
@@ -1,95 +0,0 @@
-package flavors
-
-import (
-	"testing"
-
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/db/v1/flavors"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestListFlavors(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleList(t)
-
-	pages := 0
-	err := List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		pages++
-
-		actual, err := os.ExtractFlavors(page)
-		if err != nil {
-			return false, err
-		}
-
-		expected := []os.Flavor{
-			os.Flavor{
-				ID:   "1",
-				Name: "m1.tiny",
-				RAM:  512,
-				Links: []gophercloud.Link{
-					gophercloud.Link{Href: "https://openstack.example.com/v1.0/1234/flavors/1", Rel: "self"},
-					gophercloud.Link{Href: "https://openstack.example.com/flavors/1", Rel: "bookmark"},
-				},
-			},
-			os.Flavor{
-				ID:   "2",
-				Name: "m1.small",
-				RAM:  1024,
-				Links: []gophercloud.Link{
-					gophercloud.Link{Href: "https://openstack.example.com/v1.0/1234/flavors/2", Rel: "self"},
-					gophercloud.Link{Href: "https://openstack.example.com/flavors/2", Rel: "bookmark"},
-				},
-			},
-			os.Flavor{
-				ID:   "3",
-				Name: "m1.medium",
-				RAM:  2048,
-				Links: []gophercloud.Link{
-					gophercloud.Link{Href: "https://openstack.example.com/v1.0/1234/flavors/3", Rel: "self"},
-					gophercloud.Link{Href: "https://openstack.example.com/flavors/3", Rel: "bookmark"},
-				},
-			},
-			os.Flavor{
-				ID:   "4",
-				Name: "m1.large",
-				RAM:  4096,
-				Links: []gophercloud.Link{
-					gophercloud.Link{Href: "https://openstack.example.com/v1.0/1234/flavors/4", Rel: "self"},
-					gophercloud.Link{Href: "https://openstack.example.com/flavors/4", Rel: "bookmark"},
-				},
-			},
-		}
-
-		th.AssertDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	if pages != 1 {
-		t.Errorf("Expected one page, got %d", pages)
-	}
-}
-
-func TestGetFlavor(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleGet(t)
-
-	actual, err := Get(fake.ServiceClient(), "{flavorID}").Extract()
-	th.AssertNoErr(t, err)
-
-	expected := &os.Flavor{
-		ID:   "1",
-		Name: "m1.tiny",
-		RAM:  512,
-		Links: []gophercloud.Link{
-			gophercloud.Link{Href: "https://openstack.example.com/v1.0/1234/flavors/1", Rel: "self"},
-		},
-	}
-
-	th.AssertDeepEquals(t, expected, actual)
-}
diff --git a/rackspace/db/v1/flavors/doc.go b/rackspace/db/v1/flavors/doc.go
deleted file mode 100644
index 922a4e6..0000000
--- a/rackspace/db/v1/flavors/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package flavors provides information and interaction with the flavor API
-// resource in the Rackspace Database service.
-package flavors
diff --git a/rackspace/db/v1/instances/delegate.go b/rackspace/db/v1/instances/delegate.go
deleted file mode 100644
index f2656fe..0000000
--- a/rackspace/db/v1/instances/delegate.go
+++ /dev/null
@@ -1,49 +0,0 @@
-package instances
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/db/v1/instances"
-)
-
-// Get retrieves the status and information for a specified database instance.
-func Get(client *gophercloud.ServiceClient, id string) GetResult {
-	return GetResult{os.Get(client, id)}
-}
-
-// Delete permanently destroys the database instance.
-func Delete(client *gophercloud.ServiceClient, id string) os.DeleteResult {
-	return os.Delete(client, id)
-}
-
-// EnableRootUser enables the login from any host for the root user and
-// provides the user with a generated root password.
-func EnableRootUser(client *gophercloud.ServiceClient, id string) os.UserRootResult {
-	return os.EnableRootUser(client, id)
-}
-
-// IsRootEnabled checks an instance to see if root access is enabled. It returns
-// True if root user is enabled for the specified database instance or False
-// otherwise.
-func IsRootEnabled(client *gophercloud.ServiceClient, id string) (bool, error) {
-	return os.IsRootEnabled(client, id)
-}
-
-// Restart will restart only the MySQL Instance. Restarting MySQL will
-// erase any dynamic configuration settings that you have made within MySQL.
-// The MySQL service will be unavailable until the instance restarts.
-func Restart(client *gophercloud.ServiceClient, id string) os.ActionResult {
-	return os.Restart(client, id)
-}
-
-// Resize changes the memory size of the instance, assuming a valid
-// flavorRef is provided. It will also restart the MySQL service.
-func Resize(client *gophercloud.ServiceClient, id, flavorRef string) os.ActionResult {
-	return os.Resize(client, id, flavorRef)
-}
-
-// ResizeVolume will resize the attached volume for an instance. It supports
-// only increasing the volume size and does not support decreasing the size.
-// The volume size is in gigabytes (GB) and must be an integer.
-func ResizeVolume(client *gophercloud.ServiceClient, id string, size int) os.ActionResult {
-	return os.ResizeVolume(client, id, size)
-}
diff --git a/rackspace/db/v1/instances/delegate_test.go b/rackspace/db/v1/instances/delegate_test.go
deleted file mode 100644
index 716e0a4..0000000
--- a/rackspace/db/v1/instances/delegate_test.go
+++ /dev/null
@@ -1,107 +0,0 @@
-package instances
-
-import (
-	"testing"
-
-	osDBs "github.com/rackspace/gophercloud/openstack/db/v1/databases"
-	os "github.com/rackspace/gophercloud/openstack/db/v1/instances"
-	osUsers "github.com/rackspace/gophercloud/openstack/db/v1/users"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-	"github.com/rackspace/gophercloud/testhelper/fixture"
-)
-
-var (
-	_rootURL = "/instances"
-	resURL   = "/instances/" + instanceID
-)
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, _rootURL, "POST", createReq, createResp, 200)
-
-	opts := CreateOpts{
-		Name:      "json_rack_instance",
-		FlavorRef: "1",
-		Databases: osDBs.BatchCreateOpts{
-			osDBs.CreateOpts{CharSet: "utf8", Collate: "utf8_general_ci", Name: "sampledb"},
-			osDBs.CreateOpts{Name: "nextround"},
-		},
-		Users: osUsers.BatchCreateOpts{
-			osUsers.CreateOpts{
-				Name:     "demouser",
-				Password: "demopassword",
-				Databases: osDBs.BatchCreateOpts{
-					osDBs.CreateOpts{Name: "sampledb"},
-				},
-			},
-		},
-		Size:         2,
-		RestorePoint: "1234567890",
-	}
-
-	instance, err := Create(fake.ServiceClient(), opts).Extract()
-
-	th.AssertNoErr(t, err)
-	th.AssertDeepEquals(t, expectedInstance, instance)
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, resURL, "GET", "", getResp, 200)
-
-	instance, err := Get(fake.ServiceClient(), instanceID).Extract()
-
-	th.AssertNoErr(t, err)
-	th.AssertDeepEquals(t, expectedInstance, instance)
-}
-
-func TestDeleteInstance(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleDelete(t)
-
-	res := Delete(fake.ServiceClient(), instanceID)
-	th.AssertNoErr(t, res.Err)
-}
-
-func TestEnableRootUser(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleEnableRoot(t)
-
-	expected := &osUsers.User{Name: "root", Password: "secretsecret"}
-
-	user, err := EnableRootUser(fake.ServiceClient(), instanceID).Extract()
-	th.AssertNoErr(t, err)
-	th.AssertDeepEquals(t, expected, user)
-}
-
-func TestRestart(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleRestart(t)
-
-	res := Restart(fake.ServiceClient(), instanceID)
-	th.AssertNoErr(t, res.Err)
-}
-
-func TestResize(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleResize(t)
-
-	res := Resize(fake.ServiceClient(), instanceID, "2")
-	th.AssertNoErr(t, res.Err)
-}
-
-func TestResizeVolume(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleResizeVol(t)
-
-	res := ResizeVolume(fake.ServiceClient(), instanceID, 4)
-	th.AssertNoErr(t, res.Err)
-}
diff --git a/rackspace/db/v1/instances/doc.go b/rackspace/db/v1/instances/doc.go
deleted file mode 100644
index 0c8ad63..0000000
--- a/rackspace/db/v1/instances/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package instances provides information and interaction with the instance API
-// resource in the Rackspace Database service.
-package instances
diff --git a/rackspace/db/v1/instances/fixtures.go b/rackspace/db/v1/instances/fixtures.go
deleted file mode 100644
index c5ff37a..0000000
--- a/rackspace/db/v1/instances/fixtures.go
+++ /dev/null
@@ -1,340 +0,0 @@
-package instances
-
-import (
-	"fmt"
-	"time"
-
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/openstack/db/v1/datastores"
-	"github.com/rackspace/gophercloud/openstack/db/v1/flavors"
-	os "github.com/rackspace/gophercloud/openstack/db/v1/instances"
-)
-
-var (
-	timestamp  = "2015-11-12T14:22:42Z"
-	timeVal, _ = time.Parse(time.RFC3339, timestamp)
-)
-
-var instance = `
-{
-  "created": "` + timestamp + `",
-  "datastore": {
-    "type": "mysql",
-    "version": "5.6"
-  },
-  "flavor": {
-    "id": "1",
-    "links": [
-      {
-        "href": "https://ord.databases.api.rackspacecloud.com/v1.0/1234/flavors/1",
-        "rel": "self"
-      },
-      {
-        "href": "https://ord.databases.api.rackspacecloud.com/v1.0/1234/flavors/1",
-        "rel": "bookmark"
-      }
-    ]
-  },
-  "links": [
-    {
-      "href": "https://ord.databases.api.rackspacecloud.com/v1.0/1234/flavors/1",
-      "rel": "self"
-    }
-  ],
-  "hostname": "e09ad9a3f73309469cf1f43d11e79549caf9acf2.rackspaceclouddb.com",
-  "id": "{instanceID}",
-  "name": "json_rack_instance",
-  "status": "BUILD",
-  "updated": "` + timestamp + `",
-  "volume": {
-    "size": 2
-  }
-}
-`
-
-var createReq = `
-{
-  "instance": {
-    "databases": [
-      {
-        "character_set": "utf8",
-        "collate": "utf8_general_ci",
-        "name": "sampledb"
-      },
-      {
-        "name": "nextround"
-      }
-    ],
-    "flavorRef": "1",
-    "name": "json_rack_instance",
-    "users": [
-      {
-        "databases": [
-          {
-            "name": "sampledb"
-          }
-        ],
-        "name": "demouser",
-        "password": "demopassword"
-      }
-    ],
-    "volume": {
-      "size": 2
-    },
-    "restorePoint": {
-      "backupRef": "1234567890"
-    }
-  }
-}
-`
-
-var createReplicaReq = `
-{
-  "instance": {
-    "volume": {
-      "size": 1
-    },
-    "flavorRef": "9",
-    "name": "t2s1_ALT_GUEST",
-    "replica_of": "6bdca2fc-418e-40bd-a595-62abda61862d"
-  }
-}
-`
-
-var createReplicaResp = `
-{
-  "instance": {
-    "status": "BUILD",
-    "updated": "` + timestamp + `",
-    "name": "t2s1_ALT_GUEST",
-    "links": [
-      {
-        "href": "https://ord.databases.api.rackspacecloud.com/v1.0/5919009/instances/8367c312-7c40-4a66-aab1-5767478914fc",
-        "rel": "self"
-      },
-      {
-        "href": "https://ord.databases.api.rackspacecloud.com/instances/8367c312-7c40-4a66-aab1-5767478914fc",
-        "rel": "bookmark"
-      }
-    ],
-    "created": "` + timestamp + `",
-    "id": "8367c312-7c40-4a66-aab1-5767478914fc",
-    "volume": {
-      "size": 1
-    },
-    "flavor": {
-      "id": "9"
-    },
-    "datastore": {
-      "version": "5.6",
-      "type": "mysql"
-    },
-    "replica_of": {
-      "id": "6bdca2fc-418e-40bd-a595-62abda61862d"
-    }
-  }
-}
-`
-
-var listReplicasResp = `
-{
-  "instances": [
-    {
-      "status": "ACTIVE",
-      "name": "t1s1_ALT_GUEST",
-      "links": [
-        {
-          "href": "https://ord.databases.api.rackspacecloud.com/v1.0/1234/instances/3c691f06-bf9a-4618-b7ec-2817ce0cf254",
-          "rel": "self"
-        },
-        {
-          "href": "https://ord.databases.api.rackspacecloud.com/instances/3c691f06-bf9a-4618-b7ec-2817ce0cf254",
-          "rel": "bookmark"
-        }
-      ],
-      "ip": [
-        "10.0.0.3"
-      ],
-      "id": "3c691f06-bf9a-4618-b7ec-2817ce0cf254",
-      "volume": {
-        "size": 1
-      },
-      "flavor": {
-        "id": "9"
-      },
-      "datastore": {
-        "version": "5.6",
-        "type": "mysql"
-      },
-      "replica_of": {
-        "id": "8b499b45-52d6-402d-b398-f9d8f279c69a"
-      }
-    }
-  ]
-}
-`
-
-var getReplicaResp = `
-{
-  "instance": {
-    "status": "ACTIVE",
-    "updated": "` + timestamp + `",
-    "name": "t1_ALT_GUEST",
-    "created": "` + timestamp + `",
-    "ip": [
-      "10.0.0.2"
-    ],
-    "replicas": [
-      {
-        "id": "3c691f06-bf9a-4618-b7ec-2817ce0cf254"
-      }
-    ],
-    "id": "8b499b45-52d6-402d-b398-f9d8f279c69a",
-    "volume": {
-      "used": 0.54,
-      "size": 1
-    },
-    "flavor": {
-      "id": "9"
-    },
-    "datastore": {
-      "version": "5.6",
-      "type": "mysql"
-    }
-  }
-}
-`
-
-var detachReq = `
-{
-  "instance": {
-    "replica_of": "",
-    "slave_of": ""
-  }
-}
-`
-
-var getConfigResp = `
-{
-  "instance": {
-    "configuration": {
-      "basedir": "/usr",
-      "connect_timeout": "15",
-      "datadir": "/var/lib/mysql",
-      "default_storage_engine": "innodb",
-      "innodb_buffer_pool_instances": "1",
-      "innodb_buffer_pool_size": "175M",
-      "innodb_checksum_algorithm": "crc32",
-      "innodb_data_file_path": "ibdata1:10M:autoextend",
-      "innodb_file_per_table": "1",
-      "innodb_io_capacity": "200",
-      "innodb_log_file_size": "256M",
-      "innodb_log_files_in_group": "2",
-      "innodb_open_files": "8192",
-      "innodb_thread_concurrency": "0",
-      "join_buffer_size": "1M",
-      "key_buffer_size": "50M",
-      "local-infile": "0",
-      "log-error": "/var/log/mysql/mysqld.log",
-      "max_allowed_packet": "16M",
-      "max_connect_errors": "10000",
-      "max_connections": "40",
-      "max_heap_table_size": "16M",
-      "myisam-recover": "BACKUP",
-      "open_files_limit": "8192",
-      "performance_schema": "off",
-      "pid_file": "/var/run/mysqld/mysqld.pid",
-      "port": "3306",
-      "query_cache_limit": "1M",
-      "query_cache_size": "8M",
-      "query_cache_type": "1",
-      "read_buffer_size": "256K",
-      "read_rnd_buffer_size": "1M",
-      "server_id": "1",
-      "skip-external-locking": "1",
-      "skip_name_resolve": "1",
-      "sort_buffer_size": "256K",
-      "table_open_cache": "4096",
-      "thread_stack": "192K",
-      "tmp_table_size": "16M",
-      "tmpdir": "/var/tmp",
-      "user": "mysql",
-      "wait_timeout": "3600"
-    }
-  }
-}
-`
-
-var associateReq = `{"instance": {"configuration": "{configGroupID}"}}`
-
-var listBackupsResp = `
-{
-  "backups": [
-    {
-      "status": "COMPLETED",
-      "updated": "` + timestamp + `",
-      "description": "Backup from Restored Instance",
-      "datastore": {
-        "version": "5.1",
-        "type": "MySQL",
-        "version_id": "20000000-0000-0000-0000-000000000002"
-      },
-      "id": "87972694-4be2-40f5-83f8-501656e0032a",
-      "size": 0.141026,
-      "name": "restored_backup",
-      "created": "` + timestamp + `",
-      "instance_id": "29af2cd9-0674-48ab-b87a-b160f00208e6",
-      "parent_id": null,
-      "locationRef": "http://localhost/path/to/backup"
-    }
-  ]
-}
-`
-
-var (
-	createResp        = fmt.Sprintf(`{"instance":%s}`, instance)
-	getResp           = fmt.Sprintf(`{"instance":%s}`, instance)
-	associateResp     = fmt.Sprintf(`{"instance":%s}`, instance)
-	listInstancesResp = fmt.Sprintf(`{"instances":[%s]}`, instance)
-)
-
-var instanceID = "{instanceID}"
-
-var expectedInstance = &Instance{
-	Created:   timeVal,
-	Updated:   timeVal,
-	Datastore: datastores.DatastorePartial{Type: "mysql", Version: "5.6"},
-	Flavor: flavors.Flavor{
-		ID: "1",
-		Links: []gophercloud.Link{
-			gophercloud.Link{Href: "https://ord.databases.api.rackspacecloud.com/v1.0/1234/flavors/1", Rel: "self"},
-			gophercloud.Link{Href: "https://ord.databases.api.rackspacecloud.com/v1.0/1234/flavors/1", Rel: "bookmark"},
-		},
-	},
-	Hostname: "e09ad9a3f73309469cf1f43d11e79549caf9acf2.rackspaceclouddb.com",
-	ID:       instanceID,
-	Links: []gophercloud.Link{
-		gophercloud.Link{Href: "https://ord.databases.api.rackspacecloud.com/v1.0/1234/flavors/1", Rel: "self"},
-	},
-	Name:   "json_rack_instance",
-	Status: "BUILD",
-	Volume: os.Volume{Size: 2},
-}
-
-var expectedReplica = &Instance{
-	Status:  "BUILD",
-	Updated: timeVal,
-	Name:    "t2s1_ALT_GUEST",
-	Links: []gophercloud.Link{
-		gophercloud.Link{Rel: "self", Href: "https://ord.databases.api.rackspacecloud.com/v1.0/5919009/instances/8367c312-7c40-4a66-aab1-5767478914fc"},
-		gophercloud.Link{Rel: "bookmark", Href: "https://ord.databases.api.rackspacecloud.com/instances/8367c312-7c40-4a66-aab1-5767478914fc"},
-	},
-	Created:   timeVal,
-	ID:        "8367c312-7c40-4a66-aab1-5767478914fc",
-	Volume:    os.Volume{Size: 1},
-	Flavor:    flavors.Flavor{ID: "9"},
-	Datastore: datastores.DatastorePartial{Version: "5.6", Type: "mysql"},
-	ReplicaOf: &Instance{
-		ID: "6bdca2fc-418e-40bd-a595-62abda61862d",
-	},
-}
diff --git a/rackspace/db/v1/instances/requests.go b/rackspace/db/v1/instances/requests.go
deleted file mode 100644
index f4df692..0000000
--- a/rackspace/db/v1/instances/requests.go
+++ /dev/null
@@ -1,199 +0,0 @@
-package instances
-
-import (
-	"github.com/rackspace/gophercloud"
-	osDBs "github.com/rackspace/gophercloud/openstack/db/v1/databases"
-	os "github.com/rackspace/gophercloud/openstack/db/v1/instances"
-	osUsers "github.com/rackspace/gophercloud/openstack/db/v1/users"
-	"github.com/rackspace/gophercloud/pagination"
-	"github.com/rackspace/gophercloud/rackspace/db/v1/backups"
-)
-
-// CreateOpts is the struct responsible for configuring a new database instance.
-type CreateOpts struct {
-	// Either the integer UUID (in string form) of the flavor, or its URI
-	// reference as specified in the response from the List() call. Required.
-	FlavorRef string
-
-	// Specifies the volume size in gigabytes (GB). The value must be between 1
-	// and 300. Required.
-	Size int
-
-	// Name of the instance to create. The length of the name is limited to
-	// 255 characters and any characters are permitted. Optional.
-	Name string
-
-	// A slice of database information options.
-	Databases osDBs.CreateOptsBuilder
-
-	// A slice of user information options.
-	Users osUsers.CreateOptsBuilder
-
-	// ID of the configuration group to associate with the instance. Optional.
-	ConfigID string
-
-	// Options to configure the type of datastore the instance will use. This is
-	// optional, and if excluded will default to MySQL.
-	Datastore *os.DatastoreOpts
-
-	// Specifies the backup ID from which to restore the database instance. There
-	// are some things to be aware of before using this field.  When you execute
-	// the Restore Backup operation, a new database instance is created to store
-	// the backup whose ID is specified by the restorePoint attribute. This will
-	// mean that:
-	// - All users, passwords and access that were on the instance at the time of
-	// the backup will be restored along with the databases.
-	// - You can create new users or databases if you want, but they cannot be
-	// the same as the ones from the instance that was backed up.
-	RestorePoint string
-
-	ReplicaOf string
-}
-
-func (opts CreateOpts) ToInstanceCreateMap() (map[string]interface{}, error) {
-	instance, err := os.CreateOpts{
-		FlavorRef: opts.FlavorRef,
-		Size:      opts.Size,
-		Name:      opts.Name,
-		Databases: opts.Databases,
-		Users:     opts.Users,
-	}.ToInstanceCreateMap()
-
-	if err != nil {
-		return nil, err
-	}
-
-	instance = instance["instance"].(map[string]interface{})
-
-	if opts.ConfigID != "" {
-		instance["configuration"] = opts.ConfigID
-	}
-
-	if opts.Datastore != nil {
-		ds, err := opts.Datastore.ToMap()
-		if err != nil {
-			return nil, err
-		}
-		instance["datastore"] = ds
-	}
-
-	if opts.RestorePoint != "" {
-		instance["restorePoint"] = map[string]string{"backupRef": opts.RestorePoint}
-	}
-
-	if opts.ReplicaOf != "" {
-		instance["replica_of"] = opts.ReplicaOf
-	}
-
-	return map[string]interface{}{"instance": instance}, nil
-}
-
-// Create asynchronously provisions a new database instance. It requires the
-// user to specify a flavor and a volume size. The API service then provisions
-// the instance with the requested flavor and sets up a volume of the specified
-// size, which is the storage for the database instance.
-//
-// Although this call only allows the creation of 1 instance per request, you
-// can create an instance with multiple databases and users. The default
-// binding for a MySQL instance is port 3306.
-func Create(client *gophercloud.ServiceClient, opts os.CreateOptsBuilder) CreateResult {
-	return CreateResult{os.Create(client, opts)}
-}
-
-// ListOpts specifies all of the query options to be used when returning a list
-// of database instances.
-type ListOpts struct {
-	// IncludeHA includes or excludes High Availability instances from the result set
-	IncludeHA bool `q:"include_ha"`
-
-	// IncludeReplicas includes or excludes Replica instances from the result set
-	IncludeReplicas bool `q:"include_replicas"`
-}
-
-// ToInstanceListQuery formats a ListOpts into a query string.
-func (opts ListOpts) ToInstanceListQuery() (string, error) {
-	q, err := gophercloud.BuildQueryString(opts)
-	if err != nil {
-		return "", err
-	}
-	return q.String(), nil
-}
-
-// List retrieves the status and information for all database instances.
-func List(client *gophercloud.ServiceClient, opts *ListOpts) pagination.Pager {
-	url := baseURL(client)
-
-	if opts != nil {
-		query, err := opts.ToInstanceListQuery()
-		if err != nil {
-			return pagination.Pager{Err: err}
-		}
-		url += query
-	}
-
-	createPageFn := func(r pagination.PageResult) pagination.Page {
-		return os.InstancePage{pagination.LinkedPageBase{PageResult: r}}
-	}
-
-	return pagination.NewPager(client, url, createPageFn)
-}
-
-// GetDefaultConfig lists the default configuration settings from the template
-// that was applied to the specified instance. In a sense, this is the vanilla
-// configuration setting applied to an instance. Further configuration can be
-// applied by associating an instance with a configuration group.
-func GetDefaultConfig(client *gophercloud.ServiceClient, id string) ConfigResult {
-	var res ConfigResult
-
-	_, res.Err = client.Request("GET", configURL(client, id), gophercloud.RequestOpts{
-		JSONResponse: &res.Body,
-		OkCodes:      []int{200},
-	})
-
-	return res
-}
-
-// AssociateWithConfigGroup associates a specified instance to a specified
-// configuration group. If any of the parameters within a configuration group
-// require a restart, then the instance will transition into a restart.
-func AssociateWithConfigGroup(client *gophercloud.ServiceClient, instanceID, configGroupID string) UpdateResult {
-	reqBody := map[string]string{
-		"configuration": configGroupID,
-	}
-
-	var res UpdateResult
-
-	_, res.Err = client.Request("PUT", resourceURL(client, instanceID), gophercloud.RequestOpts{
-		JSONBody: map[string]map[string]string{"instance": reqBody},
-		OkCodes:  []int{202},
-	})
-
-	return res
-}
-
-// DetachFromConfigGroup will detach an instance from all config groups.
-func DetachFromConfigGroup(client *gophercloud.ServiceClient, instanceID string) UpdateResult {
-	return AssociateWithConfigGroup(client, instanceID, "")
-}
-
-// ListBackups will list all the backups for a specified database instance.
-func ListBackups(client *gophercloud.ServiceClient, instanceID string) pagination.Pager {
-	pageFn := func(r pagination.PageResult) pagination.Page {
-		return backups.BackupPage{pagination.SinglePageBase(r)}
-	}
-	return pagination.NewPager(client, backupsURL(client, instanceID), pageFn)
-}
-
-// DetachReplica will detach a specified replica instance from its source
-// instance, effectively allowing it to operate independently. Detaching a
-// replica will restart the MySQL service on the instance.
-func DetachReplica(client *gophercloud.ServiceClient, replicaID string) DetachResult {
-	var res DetachResult
-
-	_, res.Err = client.Request("PATCH", resourceURL(client, replicaID), gophercloud.RequestOpts{
-		JSONBody: map[string]interface{}{"instance": map[string]string{"replica_of": "", "slave_of": ""}},
-		OkCodes:  []int{202},
-	})
-
-	return res
-}
diff --git a/rackspace/db/v1/instances/requests_test.go b/rackspace/db/v1/instances/requests_test.go
deleted file mode 100644
index 7fa4601..0000000
--- a/rackspace/db/v1/instances/requests_test.go
+++ /dev/null
@@ -1,246 +0,0 @@
-package instances
-
-import (
-	"testing"
-
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/openstack/db/v1/datastores"
-	"github.com/rackspace/gophercloud/openstack/db/v1/flavors"
-	os "github.com/rackspace/gophercloud/openstack/db/v1/instances"
-	"github.com/rackspace/gophercloud/pagination"
-	"github.com/rackspace/gophercloud/rackspace/db/v1/backups"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-	"github.com/rackspace/gophercloud/testhelper/fixture"
-)
-
-func TestInstanceList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	fixture.SetupHandler(t, "/instances", "GET", "", listInstancesResp, 200)
-
-	opts := &ListOpts{
-		IncludeHA:       false,
-		IncludeReplicas: false,
-	}
-
-	pages := 0
-	err := List(fake.ServiceClient(), opts).EachPage(func(page pagination.Page) (bool, error) {
-		pages++
-
-		actual, err := ExtractInstances(page)
-		if err != nil {
-			return false, err
-		}
-
-		th.CheckDeepEquals(t, []Instance{*expectedInstance}, actual)
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, 1, pages)
-}
-
-func TestGetConfig(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, resURL+"/configuration", "GET", "", getConfigResp, 200)
-
-	config, err := GetDefaultConfig(fake.ServiceClient(), instanceID).Extract()
-
-	expected := map[string]string{
-		"basedir":                      "/usr",
-		"connect_timeout":              "15",
-		"datadir":                      "/var/lib/mysql",
-		"default_storage_engine":       "innodb",
-		"innodb_buffer_pool_instances": "1",
-		"innodb_buffer_pool_size":      "175M",
-		"innodb_checksum_algorithm":    "crc32",
-		"innodb_data_file_path":        "ibdata1:10M:autoextend",
-		"innodb_file_per_table":        "1",
-		"innodb_io_capacity":           "200",
-		"innodb_log_file_size":         "256M",
-		"innodb_log_files_in_group":    "2",
-		"innodb_open_files":            "8192",
-		"innodb_thread_concurrency":    "0",
-		"join_buffer_size":             "1M",
-		"key_buffer_size":              "50M",
-		"local-infile":                 "0",
-		"log-error":                    "/var/log/mysql/mysqld.log",
-		"max_allowed_packet":           "16M",
-		"max_connect_errors":           "10000",
-		"max_connections":              "40",
-		"max_heap_table_size":          "16M",
-		"myisam-recover":               "BACKUP",
-		"open_files_limit":             "8192",
-		"performance_schema":           "off",
-		"pid_file":                     "/var/run/mysqld/mysqld.pid",
-		"port":                         "3306",
-		"query_cache_limit":            "1M",
-		"query_cache_size":             "8M",
-		"query_cache_type":             "1",
-		"read_buffer_size":             "256K",
-		"read_rnd_buffer_size":         "1M",
-		"server_id":                    "1",
-		"skip-external-locking":        "1",
-		"skip_name_resolve":            "1",
-		"sort_buffer_size":             "256K",
-		"table_open_cache":             "4096",
-		"thread_stack":                 "192K",
-		"tmp_table_size":               "16M",
-		"tmpdir":                       "/var/tmp",
-		"user":                         "mysql",
-		"wait_timeout":                 "3600",
-	}
-
-	th.AssertNoErr(t, err)
-	th.AssertDeepEquals(t, expected, config)
-}
-
-func TestAssociateWithConfigGroup(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, resURL, "PUT", associateReq, associateResp, 202)
-
-	res := AssociateWithConfigGroup(fake.ServiceClient(), instanceID, "{configGroupID}")
-	th.AssertNoErr(t, res.Err)
-}
-
-func TestListBackups(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, resURL+"/backups", "GET", "", listBackupsResp, 200)
-
-	pages := 0
-
-	err := ListBackups(fake.ServiceClient(), instanceID).EachPage(func(page pagination.Page) (bool, error) {
-		pages++
-		actual, err := backups.ExtractBackups(page)
-		th.AssertNoErr(t, err)
-
-		expected := []backups.Backup{
-			backups.Backup{
-				Created:     timeVal,
-				Description: "Backup from Restored Instance",
-				ID:          "87972694-4be2-40f5-83f8-501656e0032a",
-				InstanceID:  "29af2cd9-0674-48ab-b87a-b160f00208e6",
-				LocationRef: "http://localhost/path/to/backup",
-				Name:        "restored_backup",
-				ParentID:    "",
-				Size:        0.141026,
-				Status:      "COMPLETED",
-				Updated:     timeVal,
-				Datastore:   datastores.DatastorePartial{Version: "5.1", Type: "MySQL", VersionID: "20000000-0000-0000-0000-000000000002"},
-			},
-		}
-
-		th.AssertDeepEquals(t, expected, actual)
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, 1, pages)
-}
-
-func TestCreateReplica(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, _rootURL, "POST", createReplicaReq, createReplicaResp, 200)
-
-	opts := CreateOpts{
-		Name:      "t2s1_ALT_GUEST",
-		FlavorRef: "9",
-		Size:      1,
-		ReplicaOf: "6bdca2fc-418e-40bd-a595-62abda61862d",
-	}
-
-	replica, err := Create(fake.ServiceClient(), opts).Extract()
-	th.AssertNoErr(t, err)
-	th.AssertDeepEquals(t, expectedReplica, replica)
-}
-
-func TestListReplicas(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, _rootURL, "GET", "", listReplicasResp, 200)
-
-	pages := 0
-	err := List(fake.ServiceClient(), nil).EachPage(func(page pagination.Page) (bool, error) {
-		pages++
-
-		actual, err := ExtractInstances(page)
-		if err != nil {
-			return false, err
-		}
-
-		expected := []Instance{
-			Instance{
-				Status: "ACTIVE",
-				Name:   "t1s1_ALT_GUEST",
-				Links: []gophercloud.Link{
-					gophercloud.Link{Rel: "self", Href: "https://ord.databases.api.rackspacecloud.com/v1.0/1234/instances/3c691f06-bf9a-4618-b7ec-2817ce0cf254"},
-					gophercloud.Link{Rel: "bookmark", Href: "https://ord.databases.api.rackspacecloud.com/instances/3c691f06-bf9a-4618-b7ec-2817ce0cf254"},
-				},
-				ID:        "3c691f06-bf9a-4618-b7ec-2817ce0cf254",
-				IP:        []string{"10.0.0.3"},
-				Volume:    os.Volume{Size: 1},
-				Flavor:    flavors.Flavor{ID: "9"},
-				Datastore: datastores.DatastorePartial{Version: "5.6", Type: "mysql"},
-				ReplicaOf: &Instance{
-					ID: "8b499b45-52d6-402d-b398-f9d8f279c69a",
-				},
-			},
-		}
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, 1, pages)
-}
-
-func TestGetReplica(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, resURL, "GET", "", getReplicaResp, 200)
-
-	replica, err := Get(fake.ServiceClient(), instanceID).Extract()
-	th.AssertNoErr(t, err)
-
-	expectedReplica := &Instance{
-		Status:  "ACTIVE",
-		Updated: timeVal,
-		Name:    "t1_ALT_GUEST",
-		Created: timeVal,
-		IP: []string{
-			"10.0.0.2",
-		},
-		Replicas: []Instance{
-			Instance{ID: "3c691f06-bf9a-4618-b7ec-2817ce0cf254"},
-		},
-		ID: "8b499b45-52d6-402d-b398-f9d8f279c69a",
-		Volume: os.Volume{
-			Used: 0.54,
-			Size: 1,
-		},
-		Flavor: flavors.Flavor{ID: "9"},
-		Datastore: datastores.DatastorePartial{
-			Version: "5.6",
-			Type:    "mysql",
-		},
-	}
-
-	th.AssertDeepEquals(t, replica, expectedReplica)
-}
-
-func TestDetachReplica(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, resURL, "PATCH", detachReq, "", 202)
-
-	err := DetachReplica(fake.ServiceClient(), instanceID).ExtractErr()
-	th.AssertNoErr(t, err)
-}
diff --git a/rackspace/db/v1/instances/results.go b/rackspace/db/v1/instances/results.go
deleted file mode 100644
index cdcc9c7..0000000
--- a/rackspace/db/v1/instances/results.go
+++ /dev/null
@@ -1,191 +0,0 @@
-package instances
-
-import (
-	"fmt"
-	"reflect"
-	"time"
-
-	"github.com/mitchellh/mapstructure"
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/openstack/db/v1/datastores"
-	"github.com/rackspace/gophercloud/openstack/db/v1/flavors"
-	os "github.com/rackspace/gophercloud/openstack/db/v1/instances"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// Instance represents a remote MySQL instance.
-type Instance struct {
-	// Indicates the datetime that the instance was created
-	Created time.Time `mapstructure:"-"`
-
-	// Indicates the most recent datetime that the instance was updated.
-	Updated time.Time `mapstructure:"-"`
-
-	// Indicates how the instance stores data.
-	Datastore datastores.DatastorePartial
-
-	// Indicates the hardware flavor the instance uses.
-	Flavor flavors.Flavor
-
-	// A DNS-resolvable hostname associated with the database instance (rather
-	// than an IPv4 address). Since the hostname always resolves to the correct
-	// IP address of the database instance, this relieves the user from the task
-	// of maintaining the mapping. Note that although the IP address may likely
-	// change on resizing, migrating, and so forth, the hostname always resolves
-	// to the correct database instance.
-	Hostname string
-
-	// Indicates the unique identifier for the instance resource.
-	ID string
-
-	// Exposes various links that reference the instance resource.
-	Links []gophercloud.Link
-
-	// The human-readable name of the instance.
-	Name string
-
-	// The build status of the instance.
-	Status string
-
-	// Information about the attached volume of the instance.
-	Volume os.Volume
-
-	// IP indicates the various IP addresses which allow access.
-	IP []string
-
-	// Indicates whether this instance is a replica of another source instance.
-	ReplicaOf *Instance `mapstructure:"replica_of" json:"replica_of"`
-
-	// Indicates whether this instance is the source of other replica instances.
-	Replicas []Instance
-}
-
-func commonExtract(err error, body interface{}) (*Instance, error) {
-	if err != nil {
-		return nil, err
-	}
-
-	var response struct {
-		Instance Instance `mapstructure:"instance"`
-	}
-
-	err = mapstructure.Decode(body, &response)
-
-	val := body.(map[string]interface{})["instance"].(map[string]interface{})
-
-	if t, ok := val["created"].(string); ok && t != "" {
-		creationTime, err := time.Parse(time.RFC3339, t)
-		if err != nil {
-			return &response.Instance, err
-		}
-		response.Instance.Created = creationTime
-	}
-
-	if t, ok := val["updated"].(string); ok && t != "" {
-		updatedTime, err := time.Parse(time.RFC3339, t)
-		if err != nil {
-			return &response.Instance, err
-		}
-		response.Instance.Updated = updatedTime
-	}
-
-	return &response.Instance, err
-}
-
-// CreateResult represents the result of a Create operation.
-type CreateResult struct {
-	os.CreateResult
-}
-
-// Extract will retrieve an instance from a create result.
-func (r CreateResult) Extract() (*Instance, error) {
-	return commonExtract(r.Err, r.Body)
-}
-
-// GetResult represents the result of a Get operation.
-type GetResult struct {
-	os.GetResult
-}
-
-// Extract will extract an Instance from a GetResult.
-func (r GetResult) Extract() (*Instance, error) {
-	return commonExtract(r.Err, r.Body)
-}
-
-// ConfigResult represents the result of getting default configuration for an
-// instance.
-type ConfigResult struct {
-	gophercloud.Result
-}
-
-// DetachResult represents the result of detaching a replica from its source.
-type DetachResult struct {
-	gophercloud.ErrResult
-}
-
-// Extract will extract the configuration information (in the form of a map)
-// about a particular instance.
-func (r ConfigResult) Extract() (map[string]string, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-
-	var response struct {
-		Instance struct {
-			Config map[string]string `mapstructure:"configuration"`
-		} `mapstructure:"instance"`
-	}
-
-	err := mapstructure.Decode(r.Body, &response)
-	return response.Instance.Config, err
-}
-
-// UpdateResult represents the result of an Update operation.
-type UpdateResult struct {
-	gophercloud.ErrResult
-}
-
-// ExtractInstances retrieves a slice of instances from a paginated collection.
-func ExtractInstances(page pagination.Page) ([]Instance, error) {
-	casted := page.(os.InstancePage).Body
-
-	var resp struct {
-		Instances []Instance `mapstructure:"instances"`
-	}
-
-	if err := mapstructure.Decode(casted, &resp); err != nil {
-		return nil, err
-	}
-
-	var vals []interface{}
-	switch casted.(type) {
-	case map[string]interface{}:
-		vals = casted.(map[string]interface{})["instances"].([]interface{})
-	case map[string][]interface{}:
-		vals = casted.(map[string][]interface{})["instances"]
-	default:
-		return resp.Instances, fmt.Errorf("Unknown type: %v", reflect.TypeOf(casted))
-	}
-
-	for i, v := range vals {
-		val := v.(map[string]interface{})
-
-		if t, ok := val["created"].(string); ok && t != "" {
-			creationTime, err := time.Parse(time.RFC3339, t)
-			if err != nil {
-				return resp.Instances, err
-			}
-			resp.Instances[i].Created = creationTime
-		}
-
-		if t, ok := val["updated"].(string); ok && t != "" {
-			updatedTime, err := time.Parse(time.RFC3339, t)
-			if err != nil {
-				return resp.Instances, err
-			}
-			resp.Instances[i].Updated = updatedTime
-		}
-	}
-
-	return resp.Instances, nil
-}
diff --git a/rackspace/db/v1/instances/urls.go b/rackspace/db/v1/instances/urls.go
deleted file mode 100644
index 5955f4c..0000000
--- a/rackspace/db/v1/instances/urls.go
+++ /dev/null
@@ -1,23 +0,0 @@
-package instances
-
-import "github.com/rackspace/gophercloud"
-
-func baseURL(c *gophercloud.ServiceClient) string {
-	return c.ServiceURL("instances")
-}
-
-func createURL(c *gophercloud.ServiceClient) string {
-	return baseURL(c)
-}
-
-func resourceURL(c *gophercloud.ServiceClient, id string) string {
-	return c.ServiceURL("instances", id)
-}
-
-func configURL(c *gophercloud.ServiceClient, id string) string {
-	return c.ServiceURL("instances", id, "configuration")
-}
-
-func backupsURL(c *gophercloud.ServiceClient, id string) string {
-	return c.ServiceURL("instances", id, "backups")
-}
diff --git a/rackspace/db/v1/users/delegate.go b/rackspace/db/v1/users/delegate.go
deleted file mode 100644
index 8298c46..0000000
--- a/rackspace/db/v1/users/delegate.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package users
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/db/v1/users"
-)
-
-// Create will create a new database user for the specified database instance.
-func Create(client *gophercloud.ServiceClient, instanceID string, opts os.CreateOptsBuilder) os.CreateResult {
-	return os.Create(client, instanceID, opts)
-}
-
-// Delete will permanently remove a user from a specified database instance.
-func Delete(client *gophercloud.ServiceClient, instanceID, userName string) os.DeleteResult {
-	return os.Delete(client, instanceID, userName)
-}
diff --git a/rackspace/db/v1/users/delegate_test.go b/rackspace/db/v1/users/delegate_test.go
deleted file mode 100644
index 7a1b773..0000000
--- a/rackspace/db/v1/users/delegate_test.go
+++ /dev/null
@@ -1,48 +0,0 @@
-package users
-
-import (
-	"testing"
-
-	db "github.com/rackspace/gophercloud/openstack/db/v1/databases"
-	os "github.com/rackspace/gophercloud/openstack/db/v1/users"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-const instanceID = "{instanceID}"
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleCreate(t)
-
-	opts := os.BatchCreateOpts{
-		os.CreateOpts{
-			Databases: db.BatchCreateOpts{
-				db.CreateOpts{Name: "databaseA"},
-			},
-			Name:     "dbuser3",
-			Password: "secretsecret",
-		},
-		os.CreateOpts{
-			Databases: db.BatchCreateOpts{
-				db.CreateOpts{Name: "databaseB"},
-				db.CreateOpts{Name: "databaseC"},
-			},
-			Name:     "dbuser4",
-			Password: "secretsecret",
-		},
-	}
-
-	res := Create(fake.ServiceClient(), instanceID, opts)
-	th.AssertNoErr(t, res.Err)
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleDelete(t)
-
-	res := Delete(fake.ServiceClient(), instanceID, "{userName}")
-	th.AssertNoErr(t, res.Err)
-}
diff --git a/rackspace/db/v1/users/doc.go b/rackspace/db/v1/users/doc.go
deleted file mode 100644
index 84f2eb3..0000000
--- a/rackspace/db/v1/users/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package users provides information and interaction with the user API
-// resource in the Rackspace Database service.
-package users
diff --git a/rackspace/db/v1/users/fixtures.go b/rackspace/db/v1/users/fixtures.go
deleted file mode 100644
index 5314e85..0000000
--- a/rackspace/db/v1/users/fixtures.go
+++ /dev/null
@@ -1,77 +0,0 @@
-package users
-
-const singleDB = `{"databases": [{"name": "databaseE"}]}`
-
-var changePwdReq = `
-{
-  "users": [
-    {
-      "name": "dbuser1",
-      "password": "newpassword"
-    },
-    {
-      "name": "dbuser2",
-      "password": "anotherpassword"
-    }
-  ]
-}
-`
-
-var updateReq = `
-{
-	"user": {
-		"name": "new_username",
-		"password": "new_password"
-	}
-}
-`
-
-var getResp = `
-{
-	"user": {
-		"name": "exampleuser",
-		"host": "foo",
-		"databases": [
-			{
-				"name": "databaseA"
-			},
-			{
-				"name": "databaseB"
-			}
-		]
-	}
-}
-`
-
-var listResp = `
-{
-"users": [
-  {
-    "name": "dbuser1",
-    "host": "localhost",
-    "databases": [
-      {
-        "name": "databaseA"
-      }
-    ]
-  },
-  {
-    "name": "dbuser2",
-    "host": "localhost",
-    "databases": [
-      {
-        "name": "databaseB"
-      },
-      {
-        "name": "databaseC"
-      }
-    ]
-  }
-]
-}
-`
-
-var (
-	listUserAccessResp = singleDB
-	grantUserAccessReq = singleDB
-)
diff --git a/rackspace/db/v1/users/requests.go b/rackspace/db/v1/users/requests.go
deleted file mode 100644
index 74e47ab..0000000
--- a/rackspace/db/v1/users/requests.go
+++ /dev/null
@@ -1,176 +0,0 @@
-package users
-
-import (
-	"errors"
-
-	"github.com/rackspace/gophercloud"
-	db "github.com/rackspace/gophercloud/openstack/db/v1/databases"
-	os "github.com/rackspace/gophercloud/openstack/db/v1/users"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List will list all available users for a specified database instance.
-func List(client *gophercloud.ServiceClient, instanceID string) pagination.Pager {
-	createPageFn := func(r pagination.PageResult) pagination.Page {
-		return UserPage{pagination.LinkedPageBase{PageResult: r}}
-	}
-
-	return pagination.NewPager(client, baseURL(client, instanceID), createPageFn)
-}
-
-/*
-ChangePassword changes the password for one or more users. For example, to
-change the respective passwords for two users:
-
-	opts := os.BatchCreateOpts{
-		os.CreateOpts{Name: "db_user_1", Password: "new_password_1"},
-		os.CreateOpts{Name: "db_user_2", Password: "new_password_2"},
-	}
-
-	ChangePassword(client, "instance_id", opts)
-*/
-func ChangePassword(client *gophercloud.ServiceClient, instanceID string, opts os.CreateOptsBuilder) UpdatePasswordsResult {
-	var res UpdatePasswordsResult
-
-	reqBody, err := opts.ToUserCreateMap()
-	if err != nil {
-		res.Err = err
-		return res
-	}
-
-	_, res.Err = client.Request("PUT", baseURL(client, instanceID), gophercloud.RequestOpts{
-		JSONBody: &reqBody,
-		OkCodes:  []int{202},
-	})
-
-	return res
-}
-
-// UpdateOpts is the struct responsible for updating an existing user.
-type UpdateOpts struct {
-	// [OPTIONAL] Specifies a name for the user. Valid names can be composed
-	// of the following characters: letters (either case); numbers; these
-	// characters '@', '?', '#', ' ' but NEVER beginning a name string; '_' is
-	// permitted anywhere. Prohibited characters that are forbidden include:
-	// single quotes, double quotes, back quotes, semicolons, commas, backslashes,
-	// and forward slashes. Spaces at the front or end of a user name are also
-	// not permitted.
-	Name string
-
-	// [OPTIONAL] Specifies a password for the user.
-	Password string
-
-	// [OPTIONAL] Specifies the host from which a user is allowed to connect to
-	// the database. Possible values are a string containing an IPv4 address or
-	// "%" to allow connecting from any host. Optional; the default is "%".
-	Host string
-}
-
-// ToMap is a convenience function for creating sub-maps for individual users.
-func (opts UpdateOpts) ToMap() (map[string]interface{}, error) {
-	if opts.Name == "root" {
-		return nil, errors.New("root is a reserved user name and cannot be used")
-	}
-
-	user := map[string]interface{}{}
-
-	if opts.Name != "" {
-		user["name"] = opts.Name
-	}
-
-	if opts.Password != "" {
-		user["password"] = opts.Password
-	}
-
-	if opts.Host != "" {
-		user["host"] = opts.Host
-	}
-
-	return user, nil
-}
-
-// Update will modify the attributes of a specified user. Attributes that can
-// be updated are: user name, password, and host.
-func Update(client *gophercloud.ServiceClient, instanceID, userName string, opts UpdateOpts) UpdateResult {
-	var res UpdateResult
-
-	reqBody, err := opts.ToMap()
-	if err != nil {
-		res.Err = err
-		return res
-	}
-	reqBody = map[string]interface{}{"user": reqBody}
-
-	_, res.Err = client.Request("PUT", userURL(client, instanceID, userName), gophercloud.RequestOpts{
-		JSONBody: &reqBody,
-		OkCodes:  []int{202},
-	})
-
-	return res
-}
-
-// Get will retrieve the details for a particular user.
-func Get(client *gophercloud.ServiceClient, instanceID, userName string) GetResult {
-	var res GetResult
-
-	_, res.Err = client.Request("GET", userURL(client, instanceID, userName), gophercloud.RequestOpts{
-		JSONResponse: &res.Body,
-		OkCodes:      []int{200},
-	})
-
-	return res
-}
-
-// ListAccess will list all of the databases a user has access to.
-func ListAccess(client *gophercloud.ServiceClient, instanceID, userName string) pagination.Pager {
-	pageFn := func(r pagination.PageResult) pagination.Page {
-		return AccessPage{pagination.LinkedPageBase{PageResult: r}}
-	}
-
-	return pagination.NewPager(client, dbsURL(client, instanceID, userName), pageFn)
-}
-
-/*
-GrantAccess for the specified user to one or more databases on a specified
-instance. For example, to add a user to multiple databases:
-
-	opts := db.BatchCreateOpts{
-		db.CreateOpts{Name: "database_1"},
-		db.CreateOpts{Name: "database_3"},
-		db.CreateOpts{Name: "database_19"},
-	}
-
-	GrantAccess(client, "instance_id", "user_name", opts)
-*/
-func GrantAccess(client *gophercloud.ServiceClient, instanceID, userName string, opts db.CreateOptsBuilder) GrantAccessResult {
-	var res GrantAccessResult
-
-	reqBody, err := opts.ToDBCreateMap()
-	if err != nil {
-		res.Err = err
-		return res
-	}
-
-	_, res.Err = client.Request("PUT", dbsURL(client, instanceID, userName), gophercloud.RequestOpts{
-		JSONBody: &reqBody,
-		OkCodes:  []int{202},
-	})
-
-	return res
-}
-
-/*
-RevokeAccess will revoke access for the specified user to one or more databases
-on a specified instance. For example:
-
-	RevokeAccess(client, "instance_id", "user_name", "db_name")
-*/
-func RevokeAccess(client *gophercloud.ServiceClient, instanceID, userName, dbName string) RevokeAccessResult {
-	var res RevokeAccessResult
-
-	_, res.Err = client.Request("DELETE", dbURL(client, instanceID, userName, dbName), gophercloud.RequestOpts{
-		OkCodes: []int{202},
-	})
-
-	return res
-}
diff --git a/rackspace/db/v1/users/requests_test.go b/rackspace/db/v1/users/requests_test.go
deleted file mode 100644
index 2f2dca7..0000000
--- a/rackspace/db/v1/users/requests_test.go
+++ /dev/null
@@ -1,156 +0,0 @@
-package users
-
-import (
-	"testing"
-
-	db "github.com/rackspace/gophercloud/openstack/db/v1/databases"
-	os "github.com/rackspace/gophercloud/openstack/db/v1/users"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-	"github.com/rackspace/gophercloud/testhelper/fixture"
-)
-
-var (
-	userName = "{userName}"
-	_rootURL = "/instances/" + instanceID + "/users"
-	_userURL = _rootURL + "/" + userName
-	_dbURL   = _userURL + "/databases"
-)
-
-func TestChangeUserPassword(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, _rootURL, "PUT", changePwdReq, "", 202)
-
-	opts := os.BatchCreateOpts{
-		os.CreateOpts{Name: "dbuser1", Password: "newpassword"},
-		os.CreateOpts{Name: "dbuser2", Password: "anotherpassword"},
-	}
-
-	err := ChangePassword(fake.ServiceClient(), instanceID, opts).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestUpdateUser(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, _userURL, "PUT", updateReq, "", 202)
-
-	opts := UpdateOpts{
-		Name:     "new_username",
-		Password: "new_password",
-	}
-
-	err := Update(fake.ServiceClient(), instanceID, userName, opts).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestGetUser(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, _userURL, "GET", "", getResp, 200)
-
-	user, err := Get(fake.ServiceClient(), instanceID, userName).Extract()
-
-	th.AssertNoErr(t, err)
-
-	expected := &User{
-		Name: "exampleuser",
-		Host: "foo",
-		Databases: []db.Database{
-			db.Database{Name: "databaseA"},
-			db.Database{Name: "databaseB"},
-		},
-	}
-
-	th.AssertDeepEquals(t, expected, user)
-}
-
-func TestUserAccessList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, _userURL+"/databases", "GET", "", listUserAccessResp, 200)
-
-	expectedDBs := []db.Database{
-		db.Database{Name: "databaseE"},
-	}
-
-	pages := 0
-	err := ListAccess(fake.ServiceClient(), instanceID, userName).EachPage(func(page pagination.Page) (bool, error) {
-		pages++
-
-		actual, err := ExtractDBs(page)
-		if err != nil {
-			return false, err
-		}
-
-		th.CheckDeepEquals(t, expectedDBs, actual)
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, 1, pages)
-}
-
-func TestUserList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	fixture.SetupHandler(t, "/instances/"+instanceID+"/users", "GET", "", listResp, 200)
-
-	expectedUsers := []User{
-		User{
-			Databases: []db.Database{
-				db.Database{Name: "databaseA"},
-			},
-			Name: "dbuser1",
-			Host: "localhost",
-		},
-		User{
-			Databases: []db.Database{
-				db.Database{Name: "databaseB"},
-				db.Database{Name: "databaseC"},
-			},
-			Name: "dbuser2",
-			Host: "localhost",
-		},
-	}
-
-	pages := 0
-	err := List(fake.ServiceClient(), instanceID).EachPage(func(page pagination.Page) (bool, error) {
-		pages++
-
-		actual, err := ExtractUsers(page)
-		if err != nil {
-			return false, err
-		}
-
-		th.CheckDeepEquals(t, expectedUsers, actual)
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, 1, pages)
-}
-
-func TestGrantAccess(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, _dbURL, "PUT", grantUserAccessReq, "", 202)
-
-	opts := db.BatchCreateOpts{db.CreateOpts{Name: "databaseE"}}
-	err := GrantAccess(fake.ServiceClient(), instanceID, userName, opts).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestRevokeAccess(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	fixture.SetupHandler(t, _dbURL+"/{dbName}", "DELETE", "", "", 202)
-
-	err := RevokeAccess(fake.ServiceClient(), instanceID, userName, "{dbName}").ExtractErr()
-	th.AssertNoErr(t, err)
-}
diff --git a/rackspace/db/v1/users/results.go b/rackspace/db/v1/users/results.go
deleted file mode 100644
index 85b3a7a..0000000
--- a/rackspace/db/v1/users/results.go
+++ /dev/null
@@ -1,149 +0,0 @@
-package users
-
-import (
-	"github.com/mitchellh/mapstructure"
-	"github.com/rackspace/gophercloud"
-	db "github.com/rackspace/gophercloud/openstack/db/v1/databases"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// User represents a database user
-type User struct {
-	// The user name
-	Name string
-
-	// The user password
-	Password string
-
-	// Specifies the host from which a user is allowed to connect to the database.
-	// Possible values are a string containing an IPv4 address or "%" to allow
-	// connecting from any host.
-	Host string
-
-	// The databases associated with this user
-	Databases []db.Database
-}
-
-// UpdatePasswordsResult represents the result of changing a user password.
-type UpdatePasswordsResult struct {
-	gophercloud.ErrResult
-}
-
-// UpdateResult represents the result of updating a user.
-type UpdateResult struct {
-	gophercloud.ErrResult
-}
-
-// GetResult represents the result of getting a user.
-type GetResult struct {
-	gophercloud.Result
-}
-
-// Extract will retrieve a User struct from a getresult.
-func (r GetResult) Extract() (*User, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-
-	var response struct {
-		User User `mapstructure:"user"`
-	}
-
-	err := mapstructure.Decode(r.Body, &response)
-	return &response.User, err
-}
-
-// AccessPage represents a single page of a paginated user collection.
-type AccessPage struct {
-	pagination.LinkedPageBase
-}
-
-// IsEmpty checks to see whether the collection is empty.
-func (page AccessPage) IsEmpty() (bool, error) {
-	users, err := ExtractDBs(page)
-	if err != nil {
-		return true, err
-	}
-	return len(users) == 0, nil
-}
-
-// NextPageURL will retrieve the next page URL.
-func (page AccessPage) NextPageURL() (string, error) {
-	type resp struct {
-		Links []gophercloud.Link `mapstructure:"databases_links"`
-	}
-
-	var r resp
-	err := mapstructure.Decode(page.Body, &r)
-	if err != nil {
-		return "", err
-	}
-
-	return gophercloud.ExtractNextURL(r.Links)
-}
-
-// ExtractDBs will convert a generic pagination struct into a more
-// relevant slice of DB structs.
-func ExtractDBs(page pagination.Page) ([]db.Database, error) {
-	casted := page.(AccessPage).Body
-
-	var response struct {
-		DBs []db.Database `mapstructure:"databases"`
-	}
-
-	err := mapstructure.Decode(casted, &response)
-	return response.DBs, err
-}
-
-// UserPage represents a single page of a paginated user collection.
-type UserPage struct {
-	pagination.LinkedPageBase
-}
-
-// IsEmpty checks to see whether the collection is empty.
-func (page UserPage) IsEmpty() (bool, error) {
-	users, err := ExtractUsers(page)
-	if err != nil {
-		return true, err
-	}
-	return len(users) == 0, nil
-}
-
-// NextPageURL will retrieve the next page URL.
-func (page UserPage) NextPageURL() (string, error) {
-	type resp struct {
-		Links []gophercloud.Link `mapstructure:"users_links"`
-	}
-
-	var r resp
-	err := mapstructure.Decode(page.Body, &r)
-	if err != nil {
-		return "", err
-	}
-
-	return gophercloud.ExtractNextURL(r.Links)
-}
-
-// ExtractUsers will convert a generic pagination struct into a more
-// relevant slice of User structs.
-func ExtractUsers(page pagination.Page) ([]User, error) {
-	casted := page.(UserPage).Body
-
-	var response struct {
-		Users []User `mapstructure:"users"`
-	}
-
-	err := mapstructure.Decode(casted, &response)
-
-	return response.Users, err
-}
-
-// GrantAccessResult represents the result of granting access to a user.
-type GrantAccessResult struct {
-	gophercloud.ErrResult
-}
-
-// RevokeAccessResult represents the result of revoking access to a user.
-type RevokeAccessResult struct {
-	gophercloud.ErrResult
-}
diff --git a/rackspace/db/v1/users/urls.go b/rackspace/db/v1/users/urls.go
deleted file mode 100644
index bac8788..0000000
--- a/rackspace/db/v1/users/urls.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package users
-
-import "github.com/rackspace/gophercloud"
-
-func baseURL(c *gophercloud.ServiceClient, instanceID string) string {
-	return c.ServiceURL("instances", instanceID, "users")
-}
-
-func userURL(c *gophercloud.ServiceClient, instanceID, userName string) string {
-	return c.ServiceURL("instances", instanceID, "users", userName)
-}
-
-func dbsURL(c *gophercloud.ServiceClient, instanceID, userName string) string {
-	return c.ServiceURL("instances", instanceID, "users", userName, "databases")
-}
-
-func dbURL(c *gophercloud.ServiceClient, instanceID, userName, dbName string) string {
-	return c.ServiceURL("instances", instanceID, "users", userName, "databases", dbName)
-}
diff --git a/rackspace/identity/v2/extensions/delegate.go b/rackspace/identity/v2/extensions/delegate.go
deleted file mode 100644
index fc547cd..0000000
--- a/rackspace/identity/v2/extensions/delegate.go
+++ /dev/null
@@ -1,24 +0,0 @@
-package extensions
-
-import (
-	"github.com/rackspace/gophercloud"
-	common "github.com/rackspace/gophercloud/openstack/common/extensions"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// ExtractExtensions accepts a Page struct, specifically an ExtensionPage struct, and extracts the
-// elements into a slice of os.Extension structs.
-func ExtractExtensions(page pagination.Page) ([]common.Extension, error) {
-	return common.ExtractExtensions(page)
-}
-
-// Get retrieves information for a specific extension using its alias.
-func Get(c *gophercloud.ServiceClient, alias string) common.GetResult {
-	return common.Get(c, alias)
-}
-
-// List returns a Pager which allows you to iterate over the full collection of extensions.
-// It does not accept query parameters.
-func List(c *gophercloud.ServiceClient) pagination.Pager {
-	return common.List(c)
-}
diff --git a/rackspace/identity/v2/extensions/delegate_test.go b/rackspace/identity/v2/extensions/delegate_test.go
deleted file mode 100644
index e30f794..0000000
--- a/rackspace/identity/v2/extensions/delegate_test.go
+++ /dev/null
@@ -1,39 +0,0 @@
-package extensions
-
-import (
-	"testing"
-
-	common "github.com/rackspace/gophercloud/openstack/common/extensions"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	common.HandleListExtensionsSuccessfully(t)
-
-	count := 0
-
-	err := List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractExtensions(page)
-		th.AssertNoErr(t, err)
-		th.AssertDeepEquals(t, common.ExpectedExtensions, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, 1, count)
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	common.HandleGetExtensionSuccessfully(t)
-
-	actual, err := Get(fake.ServiceClient(), "agent").Extract()
-	th.AssertNoErr(t, err)
-	th.CheckDeepEquals(t, common.SingleExtension, actual)
-}
diff --git a/rackspace/identity/v2/extensions/doc.go b/rackspace/identity/v2/extensions/doc.go
deleted file mode 100644
index b02a95b..0000000
--- a/rackspace/identity/v2/extensions/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package extensions provides information and interaction with the all the
-// extensions available for the Rackspace Identity service.
-package extensions
diff --git a/rackspace/identity/v2/roles/delegate.go b/rackspace/identity/v2/roles/delegate.go
deleted file mode 100644
index a6ee851..0000000
--- a/rackspace/identity/v2/roles/delegate.go
+++ /dev/null
@@ -1,50 +0,0 @@
-package roles
-
-import (
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-
-	os "github.com/rackspace/gophercloud/openstack/identity/v2/extensions/admin/roles"
-)
-
-// List is the operation responsible for listing all available global roles
-// that a user can adopt.
-func List(client *gophercloud.ServiceClient) pagination.Pager {
-	return os.List(client)
-}
-
-// AddUserRole is the operation responsible for assigning a particular role to
-// a user. This is confined to the scope of the user's tenant - so the tenant
-// ID is a required argument.
-func AddUserRole(client *gophercloud.ServiceClient, userID, roleID string) UserRoleResult {
-	var result UserRoleResult
-
-	_, result.Err = client.Request("PUT", userRoleURL(client, userID, roleID), gophercloud.RequestOpts{
-		OkCodes: []int{200, 201},
-	})
-
-	return result
-}
-
-// DeleteUserRole is the operation responsible for deleting a particular role
-// from a user. This is confined to the scope of the user's tenant - so the
-// tenant ID is a required argument.
-func DeleteUserRole(client *gophercloud.ServiceClient, userID, roleID string) UserRoleResult {
-	var result UserRoleResult
-
-	_, result.Err = client.Request("DELETE", userRoleURL(client, userID, roleID), gophercloud.RequestOpts{
-		OkCodes: []int{204},
-	})
-
-	return result
-}
-
-// UserRoleResult represents the result of either an AddUserRole or
-// a DeleteUserRole operation.
-type UserRoleResult struct {
-	gophercloud.ErrResult
-}
-
-func userRoleURL(c *gophercloud.ServiceClient, userID, roleID string) string {
-	return c.ServiceURL(os.UserPath, userID, os.RolePath, os.ExtPath, roleID)
-}
diff --git a/rackspace/identity/v2/roles/delegate_test.go b/rackspace/identity/v2/roles/delegate_test.go
deleted file mode 100644
index fcee97d..0000000
--- a/rackspace/identity/v2/roles/delegate_test.go
+++ /dev/null
@@ -1,66 +0,0 @@
-package roles
-
-import (
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/identity/v2/extensions/admin/roles"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	"github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestRole(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	MockListRoleResponse(t)
-
-	count := 0
-
-	err := List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := os.ExtractRoles(page)
-		if err != nil {
-			t.Errorf("Failed to extract users: %v", err)
-			return false, err
-		}
-
-		expected := []os.Role{
-			os.Role{
-				ID:          "123",
-				Name:        "compute:admin",
-				Description: "Nova Administrator",
-				ServiceID:   "cke5372ebabeeabb70a0e702a4626977x4406e5",
-			},
-		}
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, 1, count)
-}
-
-func TestAddUserRole(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	MockAddUserRoleResponse(t)
-
-	err := AddUserRole(client.ServiceClient(), "{user_id}", "{role_id}").ExtractErr()
-
-	th.AssertNoErr(t, err)
-}
-
-func TestDeleteUserRole(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	MockDeleteUserRoleResponse(t)
-
-	err := DeleteUserRole(client.ServiceClient(), "{user_id}", "{role_id}").ExtractErr()
-
-	th.AssertNoErr(t, err)
-}
diff --git a/rackspace/identity/v2/roles/fixtures.go b/rackspace/identity/v2/roles/fixtures.go
deleted file mode 100644
index 5f22d0f..0000000
--- a/rackspace/identity/v2/roles/fixtures.go
+++ /dev/null
@@ -1,49 +0,0 @@
-package roles
-
-import (
-	"fmt"
-	"net/http"
-	"testing"
-
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func MockListRoleResponse(t *testing.T) {
-	th.Mux.HandleFunc("/OS-KSADM/roles", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-    "roles": [
-        {
-            "id": "123",
-            "name": "compute:admin",
-            "description": "Nova Administrator",
-            "serviceId": "cke5372ebabeeabb70a0e702a4626977x4406e5"
-        }
-    ]
-}
-  `)
-	})
-}
-
-func MockAddUserRoleResponse(t *testing.T) {
-	th.Mux.HandleFunc("/users/{user_id}/roles/OS-KSADM/{role_id}", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "PUT")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		w.WriteHeader(http.StatusCreated)
-	})
-}
-
-func MockDeleteUserRoleResponse(t *testing.T) {
-	th.Mux.HandleFunc("/users/{user_id}/roles/OS-KSADM/{role_id}", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		w.WriteHeader(http.StatusNoContent)
-	})
-}
diff --git a/rackspace/identity/v2/tenants/delegate.go b/rackspace/identity/v2/tenants/delegate.go
deleted file mode 100644
index 6cdd0cf..0000000
--- a/rackspace/identity/v2/tenants/delegate.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package tenants
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/identity/v2/tenants"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// ExtractTenants interprets a page of List results as a more usable slice of Tenant structs.
-func ExtractTenants(page pagination.Page) ([]os.Tenant, error) {
-	return os.ExtractTenants(page)
-}
-
-// List enumerates the tenants to which the current token grants access.
-func List(client *gophercloud.ServiceClient, opts *os.ListOpts) pagination.Pager {
-	return os.List(client, opts)
-}
diff --git a/rackspace/identity/v2/tenants/delegate_test.go b/rackspace/identity/v2/tenants/delegate_test.go
deleted file mode 100644
index eccbfe2..0000000
--- a/rackspace/identity/v2/tenants/delegate_test.go
+++ /dev/null
@@ -1,28 +0,0 @@
-package tenants
-
-import (
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/identity/v2/tenants"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestListTenants(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleListTenantsSuccessfully(t)
-
-	count := 0
-	err := List(fake.ServiceClient(), nil).EachPage(func(page pagination.Page) (bool, error) {
-		actual, err := ExtractTenants(page)
-		th.AssertNoErr(t, err)
-		th.CheckDeepEquals(t, os.ExpectedTenantSlice, actual)
-
-		count++
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, 1, count)
-}
diff --git a/rackspace/identity/v2/tenants/doc.go b/rackspace/identity/v2/tenants/doc.go
deleted file mode 100644
index c1825c2..0000000
--- a/rackspace/identity/v2/tenants/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package tenants provides information and interaction with the tenant
-// API resource for the Rackspace Identity service.
-package tenants
diff --git a/rackspace/identity/v2/tokens/delegate.go b/rackspace/identity/v2/tokens/delegate.go
deleted file mode 100644
index 4f9885a..0000000
--- a/rackspace/identity/v2/tokens/delegate.go
+++ /dev/null
@@ -1,60 +0,0 @@
-package tokens
-
-import (
-	"errors"
-
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/identity/v2/tokens"
-)
-
-var (
-	// ErrPasswordProvided is returned if both a password and an API key are provided to Create.
-	ErrPasswordProvided = errors.New("Please provide either a password or an API key.")
-)
-
-// AuthOptions wraps the OpenStack AuthOptions struct to be able to customize the request body
-// when API key authentication is used.
-type AuthOptions struct {
-	os.AuthOptions
-}
-
-// WrapOptions embeds a root AuthOptions struct in a package-specific one.
-func WrapOptions(original gophercloud.AuthOptions) AuthOptions {
-	return AuthOptions{AuthOptions: os.WrapOptions(original)}
-}
-
-// ToTokenCreateMap serializes an AuthOptions into a request body. If an API key is provided, it
-// will be used, otherwise
-func (auth AuthOptions) ToTokenCreateMap() (map[string]interface{}, error) {
-	if auth.APIKey == "" {
-		return auth.AuthOptions.ToTokenCreateMap()
-	}
-
-	// Verify that other required attributes are present.
-	if auth.Username == "" {
-		return nil, os.ErrUsernameRequired
-	}
-
-	authMap := make(map[string]interface{})
-
-	authMap["RAX-KSKEY:apiKeyCredentials"] = map[string]interface{}{
-		"username": auth.Username,
-		"apiKey":   auth.APIKey,
-	}
-
-	if auth.TenantID != "" {
-		authMap["tenantId"] = auth.TenantID
-	}
-	if auth.TenantName != "" {
-		authMap["tenantName"] = auth.TenantName
-	}
-
-	return map[string]interface{}{"auth": authMap}, nil
-}
-
-// Create authenticates to Rackspace's identity service and attempts to acquire a Token. Rather
-// than interact with this service directly, users should generally call
-// rackspace.AuthenticatedClient().
-func Create(client *gophercloud.ServiceClient, auth AuthOptions) os.CreateResult {
-	return os.Create(client, auth)
-}
diff --git a/rackspace/identity/v2/tokens/delegate_test.go b/rackspace/identity/v2/tokens/delegate_test.go
deleted file mode 100644
index 6678ff4..0000000
--- a/rackspace/identity/v2/tokens/delegate_test.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package tokens
-
-import (
-	"testing"
-
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/identity/v2/tokens"
-	th "github.com/rackspace/gophercloud/testhelper"
-	"github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func tokenPost(t *testing.T, options gophercloud.AuthOptions, requestJSON string) os.CreateResult {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleTokenPost(t, requestJSON)
-
-	return Create(client.ServiceClient(), WrapOptions(options))
-}
-
-func TestCreateTokenWithAPIKey(t *testing.T) {
-	options := gophercloud.AuthOptions{
-		Username: "me",
-		APIKey:   "1234567890abcdef",
-	}
-
-	os.IsSuccessful(t, tokenPost(t, options, `
-    {
-      "auth": {
-        "RAX-KSKEY:apiKeyCredentials": {
-          "username": "me",
-          "apiKey": "1234567890abcdef"
-        }
-      }
-    }
-  `))
-}
diff --git a/rackspace/identity/v2/tokens/doc.go b/rackspace/identity/v2/tokens/doc.go
deleted file mode 100644
index 44043e5..0000000
--- a/rackspace/identity/v2/tokens/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package tokens provides information and interaction with the token
-// API resource for the Rackspace Identity service.
-package tokens
diff --git a/rackspace/identity/v2/users/delegate.go b/rackspace/identity/v2/users/delegate.go
deleted file mode 100644
index 6135bec..0000000
--- a/rackspace/identity/v2/users/delegate.go
+++ /dev/null
@@ -1,142 +0,0 @@
-package users
-
-import (
-	"errors"
-
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/identity/v2/users"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List returns a pager that allows traversal over a collection of users.
-func List(client *gophercloud.ServiceClient) pagination.Pager {
-	return os.List(client)
-}
-
-// CommonOpts are the options which are shared between CreateOpts and
-// UpdateOpts
-type CommonOpts struct {
-	// Required. The username to assign to the user. When provided, the username
-	// must:
-	// - start with an alphabetical (A-Za-z) character
-	// - have a minimum length of 1 character
-	//
-	// The username may contain upper and lowercase characters, as well as any of
-	// the following special character: . - @ _
-	Username string
-
-	// Required. Email address for the user account.
-	Email string
-
-	// Required. Indicates whether the user can authenticate after the user
-	// account is created. If no value is specified, the default value is true.
-	Enabled os.EnabledState
-
-	// Optional. The password to assign to the user. If provided, the password
-	// must:
-	// - start with an alphabetical (A-Za-z) character
-	// - have a minimum length of 8 characters
-	// - contain at least one uppercase character, one lowercase character, and
-	//   one numeric character.
-	//
-	// The password may contain any of the following special characters: . - @ _
-	Password string
-}
-
-// CreateOpts represents the options needed when creating new users.
-type CreateOpts CommonOpts
-
-// ToUserCreateMap assembles a request body based on the contents of a CreateOpts.
-func (opts CreateOpts) ToUserCreateMap() (map[string]interface{}, error) {
-	m := make(map[string]interface{})
-
-	if opts.Username == "" {
-		return m, errors.New("Username is a required field")
-	}
-	if opts.Enabled == nil {
-		return m, errors.New("Enabled is a required field")
-	}
-	if opts.Email == "" {
-		return m, errors.New("Email is a required field")
-	}
-
-	if opts.Username != "" {
-		m["username"] = opts.Username
-	}
-	if opts.Email != "" {
-		m["email"] = opts.Email
-	}
-	if opts.Enabled != nil {
-		m["enabled"] = opts.Enabled
-	}
-	if opts.Password != "" {
-		m["OS-KSADM:password"] = opts.Password
-	}
-
-	return map[string]interface{}{"user": m}, nil
-}
-
-// Create is the operation responsible for creating new users.
-func Create(client *gophercloud.ServiceClient, opts os.CreateOptsBuilder) CreateResult {
-	return CreateResult{os.Create(client, opts)}
-}
-
-// Get requests details on a single user, either by ID.
-func Get(client *gophercloud.ServiceClient, id string) GetResult {
-	return GetResult{os.Get(client, id)}
-}
-
-// UpdateOptsBuilder allows extensions to add additional attributes to the Update request.
-type UpdateOptsBuilder interface {
-	ToUserUpdateMap() map[string]interface{}
-}
-
-// UpdateOpts specifies the base attributes that may be updated on an existing server.
-type UpdateOpts CommonOpts
-
-// ToUserUpdateMap formats an UpdateOpts structure into a request body.
-func (opts UpdateOpts) ToUserUpdateMap() map[string]interface{} {
-	m := make(map[string]interface{})
-
-	if opts.Username != "" {
-		m["username"] = opts.Username
-	}
-	if opts.Enabled != nil {
-		m["enabled"] = &opts.Enabled
-	}
-	if opts.Email != "" {
-		m["email"] = opts.Email
-	}
-
-	return map[string]interface{}{"user": m}
-}
-
-// Update is the operation responsible for updating exist users by their UUID.
-func Update(client *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder) UpdateResult {
-	var result UpdateResult
-
-	_, result.Err = client.Request("POST", os.ResourceURL(client, id), gophercloud.RequestOpts{
-		JSONResponse: &result.Body,
-		JSONBody:     opts.ToUserUpdateMap(),
-		OkCodes:      []int{200},
-	})
-
-	return result
-}
-
-// Delete is the operation responsible for permanently deleting an API user.
-func Delete(client *gophercloud.ServiceClient, id string) os.DeleteResult {
-	return os.Delete(client, id)
-}
-
-// ResetAPIKey resets the User's API key.
-func ResetAPIKey(client *gophercloud.ServiceClient, id string) ResetAPIKeyResult {
-	var result ResetAPIKeyResult
-
-	_, result.Err = client.Request("POST", resetAPIKeyURL(client, id), gophercloud.RequestOpts{
-		JSONResponse: &result.Body,
-		OkCodes:      []int{200},
-	})
-
-	return result
-}
diff --git a/rackspace/identity/v2/users/delegate_test.go b/rackspace/identity/v2/users/delegate_test.go
deleted file mode 100644
index 62faf0c..0000000
--- a/rackspace/identity/v2/users/delegate_test.go
+++ /dev/null
@@ -1,111 +0,0 @@
-package users
-
-import (
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/identity/v2/users"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	"github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockListResponse(t)
-
-	count := 0
-
-	err := List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		users, err := os.ExtractUsers(page)
-
-		th.AssertNoErr(t, err)
-		th.AssertEquals(t, "u1000", users[0].ID)
-		th.AssertEquals(t, "u1001", users[1].ID)
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, 1, count)
-}
-
-func TestCreateUser(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockCreateUser(t)
-
-	opts := CreateOpts{
-		Username: "new_user",
-		Enabled:  os.Disabled,
-		Email:    "new_user@foo.com",
-		Password: "foo",
-	}
-
-	user, err := Create(client.ServiceClient(), opts).Extract()
-
-	th.AssertNoErr(t, err)
-
-	th.AssertEquals(t, "123456", user.ID)
-	th.AssertEquals(t, "5830280", user.DomainID)
-	th.AssertEquals(t, "DFW", user.DefaultRegion)
-}
-
-func TestGetUser(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockGetUser(t)
-
-	user, err := Get(client.ServiceClient(), "new_user").Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertEquals(t, true, user.Enabled)
-	th.AssertEquals(t, true, user.MultiFactorEnabled)
-}
-
-func TestUpdateUser(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockUpdateUser(t)
-
-	id := "c39e3de9be2d4c779f1dfd6abacc176d"
-
-	opts := UpdateOpts{
-		Enabled: os.Enabled,
-		Email:   "new_email@foo.com",
-	}
-
-	user, err := Update(client.ServiceClient(), id, opts).Extract()
-
-	th.AssertNoErr(t, err)
-
-	th.AssertEquals(t, true, user.Enabled)
-	th.AssertEquals(t, "new_email@foo.com", user.Email)
-}
-
-func TestDeleteServer(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockDeleteUser(t)
-
-	res := Delete(client.ServiceClient(), "c39e3de9be2d4c779f1dfd6abacc176d")
-	th.AssertNoErr(t, res.Err)
-}
-
-func TestResetAPIKey(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockResetAPIKey(t)
-
-	apiKey, err := ResetAPIKey(client.ServiceClient(), "99").Extract()
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, "joesmith", apiKey.Username)
-	th.AssertEquals(t, "mooH1eiLahd5ahYood7r", apiKey.APIKey)
-}
diff --git a/rackspace/identity/v2/users/fixtures.go b/rackspace/identity/v2/users/fixtures.go
deleted file mode 100644
index 973f39e..0000000
--- a/rackspace/identity/v2/users/fixtures.go
+++ /dev/null
@@ -1,154 +0,0 @@
-package users
-
-import (
-	"fmt"
-	"net/http"
-	"testing"
-
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func mockListResponse(t *testing.T) {
-	th.Mux.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-		"users":[
-				{
-						"id": "u1000",
-						"username": "jqsmith",
-						"email": "john.smith@example.org",
-						"enabled": true
-				},
-				{
-						"id": "u1001",
-						"username": "jqsmith",
-						"email": "jane.smith@example.org",
-						"enabled": true
-				}
-		]
-}
-	`)
-	})
-}
-
-func mockCreateUser(t *testing.T) {
-	th.Mux.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "POST")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		th.TestJSONRequest(t, r, `
-{
-    "user": {
-        "username": "new_user",
-        "enabled": false,
-        "email": "new_user@foo.com",
-				"OS-KSADM:password": "foo"
-    }
-}
-  `)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-  "user": {
-    "RAX-AUTH:defaultRegion": "DFW",
-    "RAX-AUTH:domainId": "5830280",
-    "id": "123456",
-    "username": "new_user",
-    "email": "new_user@foo.com",
-    "enabled": false
-  }
-}
-`)
-	})
-}
-
-func mockGetUser(t *testing.T) {
-	th.Mux.HandleFunc("/users/new_user", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-	"user": {
-		"RAX-AUTH:defaultRegion": "DFW",
-		"RAX-AUTH:domainId": "5830280",
-		"RAX-AUTH:multiFactorEnabled": "true",
-		"id": "c39e3de9be2d4c779f1dfd6abacc176d",
-		"username": "jqsmith",
-		"email": "john.smith@example.org",
-		"enabled": true
-	}
-}
-`)
-	})
-}
-
-func mockUpdateUser(t *testing.T) {
-	th.Mux.HandleFunc("/users/c39e3de9be2d4c779f1dfd6abacc176d", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "POST")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		th.TestJSONRequest(t, r, `
-{
-	"user": {
-		"email": "new_email@foo.com",
-		"enabled": true
-	}
-}
-`)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-	"user": {
-		"RAX-AUTH:defaultRegion": "DFW",
-		"RAX-AUTH:domainId": "5830280",
-		"RAX-AUTH:multiFactorEnabled": "true",
-		"id": "123456",
-		"username": "jqsmith",
-		"email": "new_email@foo.com",
-		"enabled": true
-	}
-}
-`)
-	})
-}
-
-func mockDeleteUser(t *testing.T) {
-	th.Mux.HandleFunc("/users/c39e3de9be2d4c779f1dfd6abacc176d", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		w.WriteHeader(http.StatusNoContent)
-	})
-}
-
-func mockResetAPIKey(t *testing.T) {
-	th.Mux.HandleFunc("/users/99/OS-KSADM/credentials/RAX-KSKEY:apiKeyCredentials/RAX-AUTH/reset", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "POST")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-		fmt.Fprintf(w, `
-{
-    "RAX-KSKEY:apiKeyCredentials": {
-        "username": "joesmith",
-        "apiKey": "mooH1eiLahd5ahYood7r"
-    }
-}`)
-	})
-}
diff --git a/rackspace/identity/v2/users/results.go b/rackspace/identity/v2/users/results.go
deleted file mode 100644
index 6936ecb..0000000
--- a/rackspace/identity/v2/users/results.go
+++ /dev/null
@@ -1,129 +0,0 @@
-package users
-
-import (
-	"strconv"
-
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/identity/v2/users"
-
-	"github.com/mitchellh/mapstructure"
-)
-
-// User represents a user resource that exists on the API.
-type User struct {
-	// The UUID for this user.
-	ID string
-
-	// The human name for this user.
-	Name string
-
-	// The username for this user.
-	Username string
-
-	// Indicates whether the user is enabled (true) or disabled (false).
-	Enabled bool
-
-	// The email address for this user.
-	Email string
-
-	// The ID of the tenant to which this user belongs.
-	TenantID string `mapstructure:"tenant_id"`
-
-	// Specifies the default region for the user account. This value is inherited
-	// from the user administrator when the account is created.
-	DefaultRegion string `mapstructure:"RAX-AUTH:defaultRegion"`
-
-	// Identifies the domain that contains the user account. This value is
-	// inherited from the user administrator when the account is created.
-	DomainID string `mapstructure:"RAX-AUTH:domainId"`
-
-	// The password value that the user needs for authentication. If the Add user
-	// request included a password value, this attribute is not included in the
-	// response.
-	Password string `mapstructure:"OS-KSADM:password"`
-
-	// Indicates whether the user has enabled multi-factor authentication.
-	MultiFactorEnabled bool `mapstructure:"RAX-AUTH:multiFactorEnabled"`
-}
-
-// CreateResult represents the result of a Create operation
-type CreateResult struct {
-	os.CreateResult
-}
-
-// GetResult represents the result of a Get operation
-type GetResult struct {
-	os.GetResult
-}
-
-// UpdateResult represents the result of an Update operation
-type UpdateResult struct {
-	os.UpdateResult
-}
-
-func commonExtract(resp interface{}, err error) (*User, error) {
-	if err != nil {
-		return nil, err
-	}
-
-	var respStruct struct {
-		User *User `json:"user"`
-	}
-
-	// Since the API returns a string instead of a bool, we need to hack the JSON
-	json := resp.(map[string]interface{})
-	user := json["user"].(map[string]interface{})
-	if s, ok := user["RAX-AUTH:multiFactorEnabled"].(string); ok && s != "" {
-		if b, err := strconv.ParseBool(s); err == nil {
-			user["RAX-AUTH:multiFactorEnabled"] = b
-		}
-	}
-
-	err = mapstructure.Decode(json, &respStruct)
-
-	return respStruct.User, err
-}
-
-// Extract will get the Snapshot object out of the GetResult object.
-func (r GetResult) Extract() (*User, error) {
-	return commonExtract(r.Body, r.Err)
-}
-
-// Extract will get the Snapshot object out of the CreateResult object.
-func (r CreateResult) Extract() (*User, error) {
-	return commonExtract(r.Body, r.Err)
-}
-
-// Extract will get the Snapshot object out of the UpdateResult object.
-func (r UpdateResult) Extract() (*User, error) {
-	return commonExtract(r.Body, r.Err)
-}
-
-// ResetAPIKeyResult represents the server response to the ResetAPIKey method.
-type ResetAPIKeyResult struct {
-	gophercloud.Result
-}
-
-// ResetAPIKeyValue represents an API Key that has been reset.
-type ResetAPIKeyValue struct {
-	// The Username for this API Key reset.
-	Username string `mapstructure:"username"`
-
-	// The new API Key for this user.
-	APIKey string `mapstructure:"apiKey"`
-}
-
-// Extract will get the Error or ResetAPIKeyValue object out of the ResetAPIKeyResult object.
-func (r ResetAPIKeyResult) Extract() (*ResetAPIKeyValue, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-
-	var response struct {
-		ResetAPIKeyValue ResetAPIKeyValue `mapstructure:"RAX-KSKEY:apiKeyCredentials"`
-	}
-
-	err := mapstructure.Decode(r.Body, &response)
-
-	return &response.ResetAPIKeyValue, err
-}
diff --git a/rackspace/identity/v2/users/urls.go b/rackspace/identity/v2/users/urls.go
deleted file mode 100644
index bc1aaef..0000000
--- a/rackspace/identity/v2/users/urls.go
+++ /dev/null
@@ -1,7 +0,0 @@
-package users
-
-import "github.com/rackspace/gophercloud"
-
-func resetAPIKeyURL(client *gophercloud.ServiceClient, id string) string {
-	return client.ServiceURL("users", id, "OS-KSADM", "credentials", "RAX-KSKEY:apiKeyCredentials", "RAX-AUTH", "reset")
-}
diff --git a/rackspace/lb/v1/acl/doc.go b/rackspace/lb/v1/acl/doc.go
deleted file mode 100644
index 42325fe..0000000
--- a/rackspace/lb/v1/acl/doc.go
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
-Package acl provides information and interaction with the access lists feature
-of the Rackspace Cloud Load Balancer service.
-
-The access list management feature allows fine-grained network access controls
-to be applied to the load balancer's virtual IP address. A single IP address,
-multiple IP addresses, or entire network subnets can be added. Items that are
-configured with the ALLOW type always takes precedence over items with the DENY
-type. To reject traffic from all items except for those with the ALLOW type,
-add a networkItem with an address of "0.0.0.0/0" and a DENY type.
-*/
-package acl
diff --git a/rackspace/lb/v1/acl/fixtures.go b/rackspace/lb/v1/acl/fixtures.go
deleted file mode 100644
index e3c941c..0000000
--- a/rackspace/lb/v1/acl/fixtures.go
+++ /dev/null
@@ -1,109 +0,0 @@
-package acl
-
-import (
-	"fmt"
-	"net/http"
-	"strconv"
-	"testing"
-
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func _rootURL(lbID int) string {
-	return "/loadbalancers/" + strconv.Itoa(lbID) + "/accesslist"
-}
-
-func mockListResponse(t *testing.T, id int) {
-	th.Mux.HandleFunc(_rootURL(id), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-  "accessList": [
-    {
-      "address": "206.160.163.21",
-      "id": 21,
-      "type": "DENY"
-    },
-    {
-      "address": "206.160.163.22",
-      "id": 22,
-      "type": "DENY"
-    },
-    {
-      "address": "206.160.163.23",
-      "id": 23,
-      "type": "DENY"
-    },
-    {
-      "address": "206.160.163.24",
-      "id": 24,
-      "type": "DENY"
-    }
-  ]
-}
-  `)
-	})
-}
-
-func mockCreateResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "POST")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		th.TestJSONRequest(t, r, `
-{
-  "accessList": [
-    {
-      "address": "206.160.163.21",
-      "type": "DENY"
-    },
-    {
-      "address": "206.160.165.11",
-      "type": "DENY"
-    }
-  ]
-}
-    `)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusAccepted)
-	})
-}
-
-func mockDeleteAllResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		w.WriteHeader(http.StatusAccepted)
-	})
-}
-
-func mockBatchDeleteResponse(t *testing.T, lbID int, ids []int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		r.ParseForm()
-
-		for k, v := range ids {
-			fids := r.Form["id"]
-			th.AssertEquals(t, strconv.Itoa(v), fids[k])
-		}
-
-		w.WriteHeader(http.StatusAccepted)
-	})
-}
-
-func mockDeleteResponse(t *testing.T, lbID, networkID int) {
-	th.Mux.HandleFunc(_rootURL(lbID)+"/"+strconv.Itoa(networkID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		w.WriteHeader(http.StatusAccepted)
-	})
-}
diff --git a/rackspace/lb/v1/acl/requests.go b/rackspace/lb/v1/acl/requests.go
deleted file mode 100644
index d4ce7c0..0000000
--- a/rackspace/lb/v1/acl/requests.go
+++ /dev/null
@@ -1,111 +0,0 @@
-package acl
-
-import (
-	"errors"
-	"fmt"
-
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List is the operation responsible for returning a paginated collection of
-// network items that define a load balancer's access list.
-func List(client *gophercloud.ServiceClient, lbID int) pagination.Pager {
-	url := rootURL(client, lbID)
-
-	return pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page {
-		return AccessListPage{pagination.SinglePageBase(r)}
-	})
-}
-
-// CreateOptsBuilder is the interface responsible for generating the JSON
-// for a Create operation.
-type CreateOptsBuilder interface {
-	ToAccessListCreateMap() (map[string]interface{}, error)
-}
-
-// CreateOpts is a slice of CreateOpt structs, that allow the user to create
-// multiple nodes in a single operation (one node per CreateOpt).
-type CreateOpts []CreateOpt
-
-// CreateOpt represents the options to create a single node.
-type CreateOpt struct {
-	// Required - the IP address or CIDR for item to add to access list.
-	Address string
-
-	// Required - the type of the node. Either ALLOW or DENY.
-	Type Type
-}
-
-// ToAccessListCreateMap converts a slice of options into a map that can be
-// used for the JSON.
-func (opts CreateOpts) ToAccessListCreateMap() (map[string]interface{}, error) {
-	type itemMap map[string]interface{}
-	items := []itemMap{}
-
-	for k, v := range opts {
-		if v.Address == "" {
-			return itemMap{}, fmt.Errorf("Address is a required attribute, none provided for %d CreateOpt element", k)
-		}
-		if v.Type != ALLOW && v.Type != DENY {
-			return itemMap{}, fmt.Errorf("Type must be ALLOW or DENY")
-		}
-
-		item := make(itemMap)
-		item["address"] = v.Address
-		item["type"] = v.Type
-
-		items = append(items, item)
-	}
-
-	return itemMap{"accessList": items}, nil
-}
-
-// Create is the operation responsible for adding network items to the access
-// rules for a particular load balancer. If network items already exist, the
-// new item will be appended. A single IP address or subnet range is considered
-// unique and cannot be duplicated.
-func Create(client *gophercloud.ServiceClient, loadBalancerID int, opts CreateOptsBuilder) CreateResult {
-	var res CreateResult
-
-	reqBody, err := opts.ToAccessListCreateMap()
-	if err != nil {
-		res.Err = err
-		return res
-	}
-
-	_, res.Err = client.Post(rootURL(client, loadBalancerID), reqBody, nil, nil)
-	return res
-}
-
-// BulkDelete will delete multiple network items from a load balancer's access
-// list in a single operation.
-func BulkDelete(c *gophercloud.ServiceClient, loadBalancerID int, itemIDs []int) DeleteResult {
-	var res DeleteResult
-
-	if len(itemIDs) > 10 || len(itemIDs) == 0 {
-		res.Err = errors.New("You must provide a minimum of 1 and a maximum of 10 item IDs")
-		return res
-	}
-
-	url := rootURL(c, loadBalancerID)
-	url += gophercloud.IDSliceToQueryString("id", itemIDs)
-
-	_, res.Err = c.Delete(url, nil)
-	return res
-}
-
-// Delete will remove a single network item from a load balancer's access list.
-func Delete(c *gophercloud.ServiceClient, lbID, itemID int) DeleteResult {
-	var res DeleteResult
-	_, res.Err = c.Delete(resourceURL(c, lbID, itemID), nil)
-	return res
-}
-
-// DeleteAll will delete the entire contents of a load balancer's access list,
-// effectively resetting it and allowing all traffic.
-func DeleteAll(c *gophercloud.ServiceClient, lbID int) DeleteResult {
-	var res DeleteResult
-	_, res.Err = c.Delete(rootURL(c, lbID), nil)
-	return res
-}
diff --git a/rackspace/lb/v1/acl/requests_test.go b/rackspace/lb/v1/acl/requests_test.go
deleted file mode 100644
index c4961a3..0000000
--- a/rackspace/lb/v1/acl/requests_test.go
+++ /dev/null
@@ -1,91 +0,0 @@
-package acl
-
-import (
-	"testing"
-
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	"github.com/rackspace/gophercloud/testhelper/client"
-)
-
-const (
-	lbID    = 12345
-	itemID1 = 67890
-	itemID2 = 67891
-)
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockListResponse(t, lbID)
-
-	count := 0
-
-	err := List(client.ServiceClient(), lbID).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractAccessList(page)
-		th.AssertNoErr(t, err)
-
-		expected := AccessList{
-			NetworkItem{Address: "206.160.163.21", ID: 21, Type: DENY},
-			NetworkItem{Address: "206.160.163.22", ID: 22, Type: DENY},
-			NetworkItem{Address: "206.160.163.23", ID: 23, Type: DENY},
-			NetworkItem{Address: "206.160.163.24", ID: 24, Type: DENY},
-		}
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, 1, count)
-}
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockCreateResponse(t, lbID)
-
-	opts := CreateOpts{
-		CreateOpt{Address: "206.160.163.21", Type: DENY},
-		CreateOpt{Address: "206.160.165.11", Type: DENY},
-	}
-
-	err := Create(client.ServiceClient(), lbID, opts).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestBulkDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	ids := []int{itemID1, itemID2}
-
-	mockBatchDeleteResponse(t, lbID, ids)
-
-	err := BulkDelete(client.ServiceClient(), lbID, ids).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockDeleteResponse(t, lbID, itemID1)
-
-	err := Delete(client.ServiceClient(), lbID, itemID1).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestDeleteAll(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockDeleteAllResponse(t, lbID)
-
-	err := DeleteAll(client.ServiceClient(), lbID).ExtractErr()
-	th.AssertNoErr(t, err)
-}
diff --git a/rackspace/lb/v1/acl/results.go b/rackspace/lb/v1/acl/results.go
deleted file mode 100644
index 9ea5ea2..0000000
--- a/rackspace/lb/v1/acl/results.go
+++ /dev/null
@@ -1,72 +0,0 @@
-package acl
-
-import (
-	"github.com/mitchellh/mapstructure"
-
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// AccessList represents the rules of network access to a particular load
-// balancer.
-type AccessList []NetworkItem
-
-// NetworkItem describes how an IP address or entire subnet may interact with a
-// load balancer.
-type NetworkItem struct {
-	// The IP address or subnet (CIDR) that defines the network item.
-	Address string
-
-	// The numeric unique ID for this item.
-	ID int
-
-	// Either ALLOW or DENY.
-	Type Type
-}
-
-// Type defines how an item may connect to the load balancer.
-type Type string
-
-// Convenience consts.
-const (
-	ALLOW Type = "ALLOW"
-	DENY  Type = "DENY"
-)
-
-// AccessListPage is the page returned by a pager for traversing over a
-// collection of network items in an access list.
-type AccessListPage struct {
-	pagination.SinglePageBase
-}
-
-// IsEmpty checks whether an AccessListPage struct is empty.
-func (p AccessListPage) IsEmpty() (bool, error) {
-	is, err := ExtractAccessList(p)
-	if err != nil {
-		return true, nil
-	}
-	return len(is) == 0, nil
-}
-
-// ExtractAccessList accepts a Page struct, specifically an AccessListPage
-// struct, and extracts the elements into a slice of NetworkItem structs. In
-// other words, a generic collection is mapped into a relevant slice.
-func ExtractAccessList(page pagination.Page) (AccessList, error) {
-	var resp struct {
-		List AccessList `mapstructure:"accessList" json:"accessList"`
-	}
-
-	err := mapstructure.Decode(page.(AccessListPage).Body, &resp)
-
-	return resp.List, err
-}
-
-// CreateResult represents the result of a create operation.
-type CreateResult struct {
-	gophercloud.ErrResult
-}
-
-// DeleteResult represents the result of a delete operation.
-type DeleteResult struct {
-	gophercloud.ErrResult
-}
diff --git a/rackspace/lb/v1/acl/urls.go b/rackspace/lb/v1/acl/urls.go
deleted file mode 100644
index e373fa1..0000000
--- a/rackspace/lb/v1/acl/urls.go
+++ /dev/null
@@ -1,20 +0,0 @@
-package acl
-
-import (
-	"strconv"
-
-	"github.com/rackspace/gophercloud"
-)
-
-const (
-	path    = "loadbalancers"
-	aclPath = "accesslist"
-)
-
-func resourceURL(c *gophercloud.ServiceClient, lbID, networkID int) string {
-	return c.ServiceURL(path, strconv.Itoa(lbID), aclPath, strconv.Itoa(networkID))
-}
-
-func rootURL(c *gophercloud.ServiceClient, lbID int) string {
-	return c.ServiceURL(path, strconv.Itoa(lbID), aclPath)
-}
diff --git a/rackspace/lb/v1/lbs/doc.go b/rackspace/lb/v1/lbs/doc.go
deleted file mode 100644
index 05f0032..0000000
--- a/rackspace/lb/v1/lbs/doc.go
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
-Package lbs provides information and interaction with the Load Balancer API
-resource for the Rackspace Cloud Load Balancer service.
-
-A load balancer is a logical device which belongs to a cloud account. It is
-used to distribute workloads between multiple back-end systems or services,
-based on the criteria defined as part of its configuration. This configuration
-is defined using the Create operation, and can be updated with Update.
-
-To conserve IPv4 address space, it is highly recommended that you share Virtual
-IPs between load balancers. If you have at least one load balancer, you may
-create subsequent ones that share a single virtual IPv4 and/or a single IPv6 by
-passing in a virtual IP ID to the Update operation (instead of a type). This
-feature is also highly desirable if you wish to load balance both an insecure
-and secure protocol using one IP or DNS name. In order to share a virtual IP,
-each Load Balancer must utilize a unique port.
-
-All load balancers have a Status attribute that shows the current configuration
-status of the device. This status is immutable by the caller and is updated
-automatically based on state changes within the service. When a load balancer
-is first created, it is placed into a BUILD state while the configuration is
-being generated and applied based on the request. Once the configuration is
-applied and finalized, it is in an ACTIVE status. In the event of a
-configuration change or update, the status of the load balancer changes to
-PENDING_UPDATE to signify configuration changes are in progress but have not yet
-been finalized. Load balancers in a SUSPENDED status are configured to reject
-traffic and do not forward requests to back-end nodes.
-
-An HTTP load balancer has the X-Forwarded-For (XFF) HTTP header set by default.
-This header contains the originating IP address of a client connecting to a web
-server through an HTTP proxy or load balancer, which many web applications are
-already designed to use when determining the source address for a request.
-
-It also includes the X-Forwarded-Proto (XFP) HTTP header, which has been added
-for identifying the originating protocol of an HTTP request as "http" or
-"https" depending on which protocol the client requested. This is useful when
-using SSL termination.
-
-Finally, it also includes the X-Forwarded-Port HTTP header, which has been
-added for being able to generate secure URLs containing the specified port.
-This header, along with the X-Forwarded-For header, provides the needed
-information to the underlying application servers.
-*/
-package lbs
diff --git a/rackspace/lb/v1/lbs/fixtures.go b/rackspace/lb/v1/lbs/fixtures.go
deleted file mode 100644
index 6325310..0000000
--- a/rackspace/lb/v1/lbs/fixtures.go
+++ /dev/null
@@ -1,584 +0,0 @@
-package lbs
-
-import (
-	"fmt"
-	"net/http"
-	"strconv"
-	"testing"
-
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func mockListLBResponse(t *testing.T) {
-	th.Mux.HandleFunc("/loadbalancers", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-   "loadBalancers":[
-      {
-         "name":"lb-site1",
-         "id":71,
-         "protocol":"HTTP",
-         "port":80,
-         "algorithm":"RANDOM",
-         "status":"ACTIVE",
-         "nodeCount":3,
-         "virtualIps":[
-            {
-               "id":403,
-               "address":"206.55.130.1",
-               "type":"PUBLIC",
-               "ipVersion":"IPV4"
-            }
-         ],
-         "created":{
-            "time":"2010-11-30T03:23:42Z"
-         },
-         "updated":{
-            "time":"2010-11-30T03:23:44Z"
-         }
-      },
-      {
-         "name":"lb-site2",
-         "id":72,
-         "created":{
-            "time":"2011-11-30T03:23:42Z"
-         },
-         "updated":{
-            "time":"2011-11-30T03:23:44Z"
-         }
-      },
-      {
-         "name":"lb-site3",
-         "id":73,
-         "created":{
-            "time":"2012-11-30T03:23:42Z"
-         },
-         "updated":{
-            "time":"2012-11-30T03:23:44Z"
-         }
-      }
-   ]
-}
-			`)
-	})
-}
-
-func mockCreateLBResponse(t *testing.T) {
-	th.Mux.HandleFunc("/loadbalancers", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "POST")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		th.TestJSONRequest(t, r, `
-{
-  "loadBalancer": {
-    "name": "a-new-loadbalancer",
-    "port": 80,
-    "protocol": "HTTP",
-    "virtualIps": [
-      {
-        "id": 2341
-      },
-      {
-        "id": 900001
-      }
-    ],
-    "nodes": [
-      {
-        "address": "10.1.1.1",
-        "port": 80,
-        "condition": "ENABLED"
-      }
-    ]
-  }
-}
-		`)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusAccepted)
-
-		fmt.Fprintf(w, `
-{
-  "loadBalancer": {
-    "name": "a-new-loadbalancer",
-    "id": 144,
-    "protocol": "HTTP",
-    "halfClosed": false,
-    "port": 83,
-    "algorithm": "RANDOM",
-    "status": "BUILD",
-    "timeout": 30,
-    "cluster": {
-      "name": "ztm-n01.staging1.lbaas.rackspace.net"
-    },
-    "nodes": [
-      {
-        "address": "10.1.1.1",
-        "id": 653,
-        "port": 80,
-        "status": "ONLINE",
-        "condition": "ENABLED",
-        "weight": 1
-      }
-    ],
-    "virtualIps": [
-      {
-        "address": "206.10.10.210",
-        "id": 39,
-        "type": "PUBLIC",
-        "ipVersion": "IPV4"
-      },
-      {
-        "address": "2001:4801:79f1:0002:711b:be4c:0000:0021",
-        "id": 900001,
-        "type": "PUBLIC",
-        "ipVersion": "IPV6"
-      }
-    ],
-    "created": {
-      "time": "2010-11-30T03:23:42Z"
-    },
-    "updated": {
-      "time": "2010-11-30T03:23:44Z"
-    },
-    "connectionLogging": {
-      "enabled": false
-    }
-  }
-}
-	`)
-	})
-}
-
-func mockBatchDeleteLBResponse(t *testing.T, ids []int) {
-	th.Mux.HandleFunc("/loadbalancers", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		r.ParseForm()
-
-		for k, v := range ids {
-			fids := r.Form["id"]
-			th.AssertEquals(t, strconv.Itoa(v), fids[k])
-		}
-
-		w.WriteHeader(http.StatusAccepted)
-	})
-}
-
-func mockDeleteLBResponse(t *testing.T, id int) {
-	th.Mux.HandleFunc("/loadbalancers/"+strconv.Itoa(id), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		w.WriteHeader(http.StatusAccepted)
-	})
-}
-
-func mockGetLBResponse(t *testing.T, id int) {
-	th.Mux.HandleFunc("/loadbalancers/"+strconv.Itoa(id), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-  "loadBalancer": {
-    "id": 2000,
-    "name": "sample-loadbalancer",
-    "protocol": "HTTP",
-    "port": 80,
-    "algorithm": "RANDOM",
-    "status": "ACTIVE",
-    "timeout": 30,
-    "connectionLogging": {
-      "enabled": true
-    },
-    "virtualIps": [
-      {
-        "id": 1000,
-        "address": "206.10.10.210",
-        "type": "PUBLIC",
-        "ipVersion": "IPV4"
-      }
-    ],
-    "nodes": [
-      {
-        "id": 1041,
-        "address": "10.1.1.1",
-        "port": 80,
-        "condition": "ENABLED",
-        "status": "ONLINE"
-      },
-      {
-        "id": 1411,
-        "address": "10.1.1.2",
-        "port": 80,
-        "condition": "ENABLED",
-        "status": "ONLINE"
-      }
-    ],
-    "sessionPersistence": {
-      "persistenceType": "HTTP_COOKIE"
-    },
-    "connectionThrottle": {
-      "maxConnections": 100
-    },
-    "cluster": {
-      "name": "c1.dfw1"
-    },
-    "created": {
-      "time": "2010-11-30T03:23:42Z"
-    },
-    "updated": {
-      "time": "2010-11-30T03:23:44Z"
-    },
-    "sourceAddresses": {
-      "ipv6Public": "2001:4801:79f1:1::1/64",
-      "ipv4Servicenet": "10.0.0.0",
-      "ipv4Public": "10.12.99.28"
-    }
-  }
-}
-	`)
-	})
-}
-
-func mockUpdateLBResponse(t *testing.T, id int) {
-	th.Mux.HandleFunc("/loadbalancers/"+strconv.Itoa(id), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "PUT")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		th.TestJSONRequest(t, r, `
-{
-	"loadBalancer": {
-		"name": "a-new-loadbalancer",
-		"protocol": "TCP",
-		"halfClosed": true,
-		"algorithm": "RANDOM",
-		"port": 8080,
-		"timeout": 100,
-		"httpsRedirect": false
-	}
-}
-		`)
-
-		w.WriteHeader(http.StatusAccepted)
-	})
-}
-
-func mockListProtocolsResponse(t *testing.T) {
-	th.Mux.HandleFunc("/loadbalancers/protocols", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-  "protocols": [
-    {
-      "name": "DNS_TCP",
-      "port": 53
-    },
-    {
-      "name": "DNS_UDP",
-      "port": 53
-    },
-    {
-      "name": "FTP",
-      "port": 21
-    },
-    {
-      "name": "HTTP",
-      "port": 80
-    },
-    {
-      "name": "HTTPS",
-      "port": 443
-    },
-    {
-      "name": "IMAPS",
-      "port": 993
-    },
-    {
-      "name": "IMAPv4",
-      "port": 143
-    },
-    {
-      "name": "LDAP",
-      "port": 389
-    },
-    {
-      "name": "LDAPS",
-      "port": 636
-    },
-    {
-      "name": "MYSQL",
-      "port": 3306
-    },
-    {
-      "name": "POP3",
-      "port": 110
-    },
-    {
-      "name": "POP3S",
-      "port": 995
-    },
-    {
-      "name": "SMTP",
-      "port": 25
-    },
-    {
-      "name": "TCP",
-      "port": 0
-    },
-    {
-      "name": "TCP_CLIENT_FIRST",
-      "port": 0
-    },
-    {
-      "name": "UDP",
-      "port": 0
-    },
-    {
-      "name": "UDP_STREAM",
-      "port": 0
-    },
-    {
-      "name": "SFTP",
-      "port": 22
-    },
-    {
-      "name": "TCP_STREAM",
-      "port": 0
-    }
-  ]
-}
-	`)
-	})
-}
-
-func mockListAlgorithmsResponse(t *testing.T) {
-	th.Mux.HandleFunc("/loadbalancers/algorithms", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-  "algorithms": [
-    {
-      "name": "LEAST_CONNECTIONS"
-    },
-    {
-      "name": "RANDOM"
-    },
-    {
-      "name": "ROUND_ROBIN"
-    },
-    {
-      "name": "WEIGHTED_LEAST_CONNECTIONS"
-    },
-    {
-      "name": "WEIGHTED_ROUND_ROBIN"
-    }
-  ]
-}
-			`)
-	})
-}
-
-func mockGetLoggingResponse(t *testing.T, id int) {
-	th.Mux.HandleFunc("/loadbalancers/"+strconv.Itoa(id)+"/connectionlogging", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-  "connectionLogging": {
-    "enabled": true
-  }
-}
-			`)
-	})
-}
-
-func mockEnableLoggingResponse(t *testing.T, id int) {
-	th.Mux.HandleFunc("/loadbalancers/"+strconv.Itoa(id)+"/connectionlogging", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "PUT")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		th.TestJSONRequest(t, r, `
-{
-   "connectionLogging":{
-      "enabled":true
-   }
-}
-		`)
-
-		w.WriteHeader(http.StatusAccepted)
-	})
-}
-
-func mockDisableLoggingResponse(t *testing.T, id int) {
-	th.Mux.HandleFunc("/loadbalancers/"+strconv.Itoa(id)+"/connectionlogging", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "PUT")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		th.TestJSONRequest(t, r, `
-{
-	"connectionLogging":{
-			"enabled":false
-	}
-}
-		`)
-
-		w.WriteHeader(http.StatusAccepted)
-	})
-}
-
-func mockGetErrorPageResponse(t *testing.T, id int) {
-	th.Mux.HandleFunc("/loadbalancers/"+strconv.Itoa(id)+"/errorpage", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-  "errorpage": {
-    "content": "<html>DEFAULT ERROR PAGE</html>"
-  }
-}
-			`)
-	})
-}
-
-func mockSetErrorPageResponse(t *testing.T, id int) {
-	th.Mux.HandleFunc("/loadbalancers/"+strconv.Itoa(id)+"/errorpage", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "PUT")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		th.TestJSONRequest(t, r, `
-{
-	"errorpage": {
-		"content": "<html>New error page</html>"
-	}
-}
-		`)
-
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-	"errorpage": {
-		"content": "<html>New error page</html>"
-	}
-}
-			`)
-	})
-}
-
-func mockDeleteErrorPageResponse(t *testing.T, id int) {
-	th.Mux.HandleFunc("/loadbalancers/"+strconv.Itoa(id)+"/errorpage", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		w.WriteHeader(http.StatusOK)
-	})
-}
-
-func mockGetStatsResponse(t *testing.T, id int) {
-	th.Mux.HandleFunc("/loadbalancers/"+strconv.Itoa(id)+"/stats", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-  "connectTimeOut": 10,
-  "connectError": 20,
-  "connectFailure": 30,
-  "dataTimedOut": 40,
-  "keepAliveTimedOut": 50,
-  "maxConn": 60,
-  "currentConn": 40,
-  "connectTimeOutSsl": 10,
-  "connectErrorSsl": 20,
-  "connectFailureSsl": 30,
-  "dataTimedOutSsl": 40,
-  "keepAliveTimedOutSsl": 50,
-  "maxConnSsl": 60,
-  "currentConnSsl": 40
-}
-			`)
-	})
-}
-
-func mockGetCachingResponse(t *testing.T, id int) {
-	th.Mux.HandleFunc("/loadbalancers/"+strconv.Itoa(id)+"/contentcaching", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-   "contentCaching": {
-      "enabled": true
-   }
-}
-			`)
-	})
-}
-
-func mockEnableCachingResponse(t *testing.T, id int) {
-	th.Mux.HandleFunc("/loadbalancers/"+strconv.Itoa(id)+"/contentcaching", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "PUT")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		th.TestJSONRequest(t, r, `
-{
-   "contentCaching":{
-      "enabled":true
-   }
-}
-		`)
-
-		w.WriteHeader(http.StatusAccepted)
-	})
-}
-
-func mockDisableCachingResponse(t *testing.T, id int) {
-	th.Mux.HandleFunc("/loadbalancers/"+strconv.Itoa(id)+"/contentcaching", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "PUT")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		th.TestJSONRequest(t, r, `
-{
-	"contentCaching":{
-			"enabled":false
-	}
-}
-		`)
-
-		w.WriteHeader(http.StatusAccepted)
-	})
-}
diff --git a/rackspace/lb/v1/lbs/requests.go b/rackspace/lb/v1/lbs/requests.go
deleted file mode 100644
index 46f5f02..0000000
--- a/rackspace/lb/v1/lbs/requests.go
+++ /dev/null
@@ -1,497 +0,0 @@
-package lbs
-
-import (
-	"errors"
-
-	"github.com/mitchellh/mapstructure"
-
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-	"github.com/rackspace/gophercloud/rackspace/lb/v1/acl"
-	"github.com/rackspace/gophercloud/rackspace/lb/v1/monitors"
-	"github.com/rackspace/gophercloud/rackspace/lb/v1/nodes"
-	"github.com/rackspace/gophercloud/rackspace/lb/v1/sessions"
-	"github.com/rackspace/gophercloud/rackspace/lb/v1/throttle"
-	"github.com/rackspace/gophercloud/rackspace/lb/v1/vips"
-)
-
-var (
-	errNameRequired    = errors.New("Name is a required attribute")
-	errTimeoutExceeded = errors.New("Timeout must be less than 120")
-)
-
-// ListOptsBuilder allows extensions to add additional parameters to the
-// List request.
-type ListOptsBuilder interface {
-	ToLBListQuery() (string, error)
-}
-
-// ListOpts allows the filtering and sorting of paginated collections through
-// the API.
-type ListOpts struct {
-	ChangesSince string `q:"changes-since"`
-	Status       Status `q:"status"`
-	NodeAddr     string `q:"nodeaddress"`
-	Marker       string `q:"marker"`
-	Limit        int    `q:"limit"`
-}
-
-// ToLBListQuery formats a ListOpts into a query string.
-func (opts ListOpts) ToLBListQuery() (string, error) {
-	q, err := gophercloud.BuildQueryString(opts)
-	if err != nil {
-		return "", err
-	}
-	return q.String(), nil
-}
-
-// List is the operation responsible for returning a paginated collection of
-// load balancers. You may pass in a ListOpts struct to filter results.
-func List(client *gophercloud.ServiceClient, opts ListOptsBuilder) pagination.Pager {
-	url := rootURL(client)
-	if opts != nil {
-		query, err := opts.ToLBListQuery()
-		if err != nil {
-			return pagination.Pager{Err: err}
-		}
-		url += query
-	}
-
-	return pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page {
-		return LBPage{pagination.LinkedPageBase{PageResult: r}}
-	})
-}
-
-// CreateOptsBuilder is the interface options structs have to satisfy in order
-// to be used in the main Create operation in this package. Since many
-// extensions decorate or modify the common logic, it is useful for them to
-// satisfy a basic interface in order for them to be used.
-type CreateOptsBuilder interface {
-	ToLBCreateMap() (map[string]interface{}, error)
-}
-
-// CreateOpts is the common options struct used in this package's Create
-// operation.
-type CreateOpts struct {
-	// Required - name of the load balancer to create. The name must be 128
-	// characters or fewer in length, and all UTF-8 characters are valid.
-	Name string
-
-	// Optional - nodes to be added.
-	Nodes []nodes.Node
-
-	// Required - protocol of the service that is being load balanced.
-	// See http://docs.rackspace.com/loadbalancers/api/v1.0/clb-devguide/content/protocols.html
-	// for a full list of supported protocols.
-	Protocol string
-
-	// Optional - enables or disables Half-Closed support for the load balancer.
-	// Half-Closed support provides the ability for one end of the connection to
-	// terminate its output, while still receiving data from the other end. Only
-	// available for TCP/TCP_CLIENT_FIRST protocols.
-	HalfClosed gophercloud.EnabledState
-
-	// Optional - the type of virtual IPs you want associated with the load
-	// balancer.
-	VIPs []vips.VIP
-
-	// Optional - the access list management feature allows fine-grained network
-	// access controls to be applied to the load balancer virtual IP address.
-	AccessList *acl.AccessList
-
-	// Optional - algorithm that defines how traffic should be directed between
-	// back-end nodes.
-	Algorithm string
-
-	// Optional - current connection logging configuration.
-	ConnectionLogging *ConnectionLogging
-
-	// Optional - specifies a limit on the number of connections per IP address
-	// to help mitigate malicious or abusive traffic to your applications.
-	ConnThrottle *throttle.ConnectionThrottle
-
-	// Optional - the type of health monitor check to perform to ensure that the
-	// service is performing properly.
-	HealthMonitor *monitors.Monitor
-
-	// Optional - arbitrary information that can be associated with each LB.
-	Metadata map[string]interface{}
-
-	// Optional - port number for the service you are load balancing.
-	Port int
-
-	// Optional - the timeout value for the load balancer and communications with
-	// its nodes. Defaults to 30 seconds with a maximum of 120 seconds.
-	Timeout int
-
-	// Optional - specifies whether multiple requests from clients are directed
-	// to the same node.
-	SessionPersistence *sessions.SessionPersistence
-
-	// Optional - enables or disables HTTP to HTTPS redirection for the load
-	// balancer. When enabled, any HTTP request returns status code 301 (Moved
-	// Permanently), and the requester is redirected to the requested URL via the
-	// HTTPS protocol on port 443. For example, http://example.com/page.html
-	// would be redirected to https://example.com/page.html. Only available for
-	// HTTPS protocol (port=443), or HTTP protocol with a properly configured SSL
-	// termination (secureTrafficOnly=true, securePort=443).
-	HTTPSRedirect gophercloud.EnabledState
-}
-
-// ToLBCreateMap casts a CreateOpts struct to a map.
-func (opts CreateOpts) ToLBCreateMap() (map[string]interface{}, error) {
-	lb := make(map[string]interface{})
-
-	if opts.Name == "" {
-		return lb, errNameRequired
-	}
-	if opts.Timeout > 120 {
-		return lb, errTimeoutExceeded
-	}
-
-	lb["name"] = opts.Name
-
-	if len(opts.Nodes) > 0 {
-		nodes := []map[string]interface{}{}
-		for _, n := range opts.Nodes {
-			nodes = append(nodes, map[string]interface{}{
-				"address":   n.Address,
-				"port":      n.Port,
-				"condition": n.Condition,
-			})
-		}
-		lb["nodes"] = nodes
-	}
-
-	if opts.Protocol != "" {
-		lb["protocol"] = opts.Protocol
-	}
-	if opts.HalfClosed != nil {
-		lb["halfClosed"] = opts.HalfClosed
-	}
-	if len(opts.VIPs) > 0 {
-		lb["virtualIps"] = opts.VIPs
-	}
-	if opts.AccessList != nil {
-		lb["accessList"] = &opts.AccessList
-	}
-	if opts.Algorithm != "" {
-		lb["algorithm"] = opts.Algorithm
-	}
-	if opts.ConnectionLogging != nil {
-		lb["connectionLogging"] = &opts.ConnectionLogging
-	}
-	if opts.ConnThrottle != nil {
-		lb["connectionThrottle"] = &opts.ConnThrottle
-	}
-	if opts.HealthMonitor != nil {
-		lb["healthMonitor"] = &opts.HealthMonitor
-	}
-	if len(opts.Metadata) != 0 {
-		lb["metadata"] = opts.Metadata
-	}
-	if opts.Port > 0 {
-		lb["port"] = opts.Port
-	}
-	if opts.Timeout > 0 {
-		lb["timeout"] = opts.Timeout
-	}
-	if opts.SessionPersistence != nil {
-		lb["sessionPersistence"] = &opts.SessionPersistence
-	}
-	if opts.HTTPSRedirect != nil {
-		lb["httpsRedirect"] = &opts.HTTPSRedirect
-	}
-
-	return map[string]interface{}{"loadBalancer": lb}, nil
-}
-
-// Create is the operation responsible for asynchronously provisioning a new
-// load balancer based on the configuration defined in CreateOpts. Once the
-// request is validated and progress has started on the provisioning process, a
-// response struct is returned. When extracted (with Extract()), you have
-// to the load balancer's unique ID and status.
-//
-// Once an ID is attained, you can check on the progress of the operation by
-// calling Get and passing in the ID. If the corresponding request cannot be
-// fulfilled due to insufficient or invalid data, an HTTP 400 (Bad Request)
-// error response is returned with information regarding the nature of the
-// failure in the body of the response. Failures in the validation process are
-// non-recoverable and require the caller to correct the cause of the failure.
-func Create(c *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateResult {
-	var res CreateResult
-
-	reqBody, err := opts.ToLBCreateMap()
-	if err != nil {
-		res.Err = err
-		return res
-	}
-
-	_, res.Err = c.Post(rootURL(c), reqBody, &res.Body, nil)
-	return res
-}
-
-// Get is the operation responsible for providing detailed information
-// regarding a specific load balancer which is configured and associated with
-// your account. This operation is not capable of returning details for a load
-// balancer which has been deleted.
-func Get(c *gophercloud.ServiceClient, id int) GetResult {
-	var res GetResult
-
-	_, res.Err = c.Get(resourceURL(c, id), &res.Body, &gophercloud.RequestOpts{
-		OkCodes: []int{200},
-	})
-
-	return res
-}
-
-// BulkDelete removes all the load balancers referenced in the slice of IDs.
-// Any and all configuration data associated with these load balancers is
-// immediately purged and is not recoverable.
-//
-// If one of the items in the list cannot be removed due to its current status,
-// a 400 Bad Request error is returned along with the IDs of the ones the
-// system identified as potential failures for this request.
-func BulkDelete(c *gophercloud.ServiceClient, ids []int) DeleteResult {
-	var res DeleteResult
-
-	if len(ids) > 10 || len(ids) == 0 {
-		res.Err = errors.New("You must provide a minimum of 1 and a maximum of 10 LB IDs")
-		return res
-	}
-
-	url := rootURL(c)
-	url += gophercloud.IDSliceToQueryString("id", ids)
-
-	_, res.Err = c.Delete(url, nil)
-	return res
-}
-
-// Delete removes a single load balancer.
-func Delete(c *gophercloud.ServiceClient, id int) DeleteResult {
-	var res DeleteResult
-	_, res.Err = c.Delete(resourceURL(c, id), nil)
-	return res
-}
-
-// UpdateOptsBuilder represents a type that can be converted into a JSON-like
-// map structure.
-type UpdateOptsBuilder interface {
-	ToLBUpdateMap() (map[string]interface{}, error)
-}
-
-// UpdateOpts represents the options for updating an existing load balancer.
-type UpdateOpts struct {
-	// Optional - new name of the load balancer.
-	Name string
-
-	// Optional - the new protocol you want your load balancer to have.
-	// See http://docs.rackspace.com/loadbalancers/api/v1.0/clb-devguide/content/protocols.html
-	// for a full list of supported protocols.
-	Protocol string
-
-	// Optional - see the HalfClosed field in CreateOpts for more information.
-	HalfClosed gophercloud.EnabledState
-
-	// Optional - see the Algorithm field in CreateOpts for more information.
-	Algorithm string
-
-	// Optional - see the Port field in CreateOpts for more information.
-	Port int
-
-	// Optional - see the Timeout field in CreateOpts for more information.
-	Timeout int
-
-	// Optional - see the HTTPSRedirect field in CreateOpts for more information.
-	HTTPSRedirect gophercloud.EnabledState
-}
-
-// ToLBUpdateMap casts an UpdateOpts struct to a map.
-func (opts UpdateOpts) ToLBUpdateMap() (map[string]interface{}, error) {
-	lb := make(map[string]interface{})
-
-	if opts.Name != "" {
-		lb["name"] = opts.Name
-	}
-	if opts.Protocol != "" {
-		lb["protocol"] = opts.Protocol
-	}
-	if opts.HalfClosed != nil {
-		lb["halfClosed"] = opts.HalfClosed
-	}
-	if opts.Algorithm != "" {
-		lb["algorithm"] = opts.Algorithm
-	}
-	if opts.Port > 0 {
-		lb["port"] = opts.Port
-	}
-	if opts.Timeout > 0 {
-		lb["timeout"] = opts.Timeout
-	}
-	if opts.HTTPSRedirect != nil {
-		lb["httpsRedirect"] = &opts.HTTPSRedirect
-	}
-
-	return map[string]interface{}{"loadBalancer": lb}, nil
-}
-
-// Update is the operation responsible for asynchronously updating the
-// attributes of a specific load balancer. Upon successful validation of the
-// request, the service returns a 202 Accepted response, and the load balancer
-// enters a PENDING_UPDATE state. A user can poll the load balancer with Get to
-// wait for the changes to be applied. When this happens, the load balancer will
-// return to an ACTIVE state.
-func Update(c *gophercloud.ServiceClient, id int, opts UpdateOptsBuilder) UpdateResult {
-	var res UpdateResult
-
-	reqBody, err := opts.ToLBUpdateMap()
-	if err != nil {
-		res.Err = err
-		return res
-	}
-
-	_, res.Err = c.Put(resourceURL(c, id), reqBody, nil, nil)
-	return res
-}
-
-// ListProtocols is the operation responsible for returning a paginated
-// collection of load balancer protocols.
-func ListProtocols(client *gophercloud.ServiceClient) pagination.Pager {
-	url := protocolsURL(client)
-	return pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page {
-		return ProtocolPage{pagination.SinglePageBase(r)}
-	})
-}
-
-// ListAlgorithms is the operation responsible for returning a paginated
-// collection of load balancer algorithms.
-func ListAlgorithms(client *gophercloud.ServiceClient) pagination.Pager {
-	url := algorithmsURL(client)
-	return pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page {
-		return AlgorithmPage{pagination.SinglePageBase(r)}
-	})
-}
-
-// IsLoggingEnabled returns true if the load balancer has connection logging
-// enabled and false if not.
-func IsLoggingEnabled(client *gophercloud.ServiceClient, id int) (bool, error) {
-	var body interface{}
-
-	_, err := client.Get(loggingURL(client, id), &body, nil)
-	if err != nil {
-		return false, err
-	}
-
-	var resp struct {
-		CL struct {
-			Enabled bool `mapstructure:"enabled"`
-		} `mapstructure:"connectionLogging"`
-	}
-
-	err = mapstructure.Decode(body, &resp)
-	return resp.CL.Enabled, err
-}
-
-func toConnLoggingMap(state bool) map[string]map[string]bool {
-	return map[string]map[string]bool{
-		"connectionLogging": map[string]bool{"enabled": state},
-	}
-}
-
-// EnableLogging will enable connection logging for a specified load balancer.
-func EnableLogging(client *gophercloud.ServiceClient, id int) gophercloud.ErrResult {
-	var res gophercloud.ErrResult
-	_, res.Err = client.Put(loggingURL(client, id), toConnLoggingMap(true), nil, nil)
-	return res
-}
-
-// DisableLogging will disable connection logging for a specified load balancer.
-func DisableLogging(client *gophercloud.ServiceClient, id int) gophercloud.ErrResult {
-	var res gophercloud.ErrResult
-	_, res.Err = client.Put(loggingURL(client, id), toConnLoggingMap(false), nil, nil)
-	return res
-}
-
-// GetErrorPage will retrieve the current error page for the load balancer.
-func GetErrorPage(client *gophercloud.ServiceClient, id int) ErrorPageResult {
-	var res ErrorPageResult
-	_, res.Err = client.Get(errorPageURL(client, id), &res.Body, nil)
-	return res
-}
-
-// SetErrorPage will set the HTML of the load balancer's error page to a
-// specific value.
-func SetErrorPage(client *gophercloud.ServiceClient, id int, html string) ErrorPageResult {
-	var res ErrorPageResult
-
-	type stringMap map[string]string
-	reqBody := map[string]stringMap{"errorpage": stringMap{"content": html}}
-
-	_, res.Err = client.Put(errorPageURL(client, id), reqBody, &res.Body, &gophercloud.RequestOpts{
-		OkCodes: []int{200},
-	})
-
-	return res
-}
-
-// DeleteErrorPage will delete the current error page for the load balancer.
-func DeleteErrorPage(client *gophercloud.ServiceClient, id int) gophercloud.ErrResult {
-	var res gophercloud.ErrResult
-	_, res.Err = client.Delete(errorPageURL(client, id), &gophercloud.RequestOpts{
-		OkCodes: []int{200},
-	})
-	return res
-}
-
-// GetStats will retrieve detailed stats related to the load balancer's usage.
-func GetStats(client *gophercloud.ServiceClient, id int) StatsResult {
-	var res StatsResult
-	_, res.Err = client.Get(statsURL(client, id), &res.Body, nil)
-	return res
-}
-
-// IsContentCached will check to see whether the specified load balancer caches
-// content. When content caching is enabled, recently-accessed files are stored
-// on the load balancer for easy retrieval by web clients. Content caching
-// improves the performance of high traffic web sites by temporarily storing
-// data that was recently accessed. While it's cached, requests for that data
-// are served by the load balancer, which in turn reduces load off the back-end
-// nodes. The result is improved response times for those requests and less
-// load on the web server.
-func IsContentCached(client *gophercloud.ServiceClient, id int) (bool, error) {
-	var body interface{}
-
-	_, err := client.Get(cacheURL(client, id), &body, nil)
-	if err != nil {
-		return false, err
-	}
-
-	var resp struct {
-		CC struct {
-			Enabled bool `mapstructure:"enabled"`
-		} `mapstructure:"contentCaching"`
-	}
-
-	err = mapstructure.Decode(body, &resp)
-	return resp.CC.Enabled, err
-}
-
-func toCachingMap(state bool) map[string]map[string]bool {
-	return map[string]map[string]bool{
-		"contentCaching": map[string]bool{"enabled": state},
-	}
-}
-
-// EnableCaching will enable content-caching for the specified load balancer.
-func EnableCaching(client *gophercloud.ServiceClient, id int) gophercloud.ErrResult {
-	var res gophercloud.ErrResult
-	_, res.Err = client.Put(cacheURL(client, id), toCachingMap(true), nil, nil)
-	return res
-}
-
-// DisableCaching will disable content-caching for the specified load balancer.
-func DisableCaching(client *gophercloud.ServiceClient, id int) gophercloud.ErrResult {
-	var res gophercloud.ErrResult
-	_, res.Err = client.Put(cacheURL(client, id), toCachingMap(false), nil, nil)
-	return res
-}
diff --git a/rackspace/lb/v1/lbs/requests_test.go b/rackspace/lb/v1/lbs/requests_test.go
deleted file mode 100644
index a8ec19e..0000000
--- a/rackspace/lb/v1/lbs/requests_test.go
+++ /dev/null
@@ -1,438 +0,0 @@
-package lbs
-
-import (
-	"testing"
-	"time"
-
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-	"github.com/rackspace/gophercloud/rackspace/lb/v1/nodes"
-	"github.com/rackspace/gophercloud/rackspace/lb/v1/sessions"
-	"github.com/rackspace/gophercloud/rackspace/lb/v1/throttle"
-	"github.com/rackspace/gophercloud/rackspace/lb/v1/vips"
-	th "github.com/rackspace/gophercloud/testhelper"
-	"github.com/rackspace/gophercloud/testhelper/client"
-)
-
-const (
-	id1 = 12345
-	id2 = 67890
-	ts1 = "2010-11-30T03:23:42Z"
-	ts2 = "2010-11-30T03:23:44Z"
-)
-
-func toTime(t *testing.T, str string) time.Time {
-	ts, err := time.Parse(time.RFC3339, str)
-	if err != nil {
-		t.Fatalf("Could not parse time: %s", err.Error())
-	}
-	return ts
-}
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockListLBResponse(t)
-
-	count := 0
-
-	err := List(client.ServiceClient(), ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractLBs(page)
-		th.AssertNoErr(t, err)
-
-		expected := []LoadBalancer{
-			LoadBalancer{
-				Name:      "lb-site1",
-				ID:        71,
-				Protocol:  "HTTP",
-				Port:      80,
-				Algorithm: "RANDOM",
-				Status:    ACTIVE,
-				NodeCount: 3,
-				VIPs: []vips.VIP{
-					vips.VIP{
-						ID:      403,
-						Address: "206.55.130.1",
-						Type:    "PUBLIC",
-						Version: "IPV4",
-					},
-				},
-				Created: Datetime{Time: toTime(t, ts1)},
-				Updated: Datetime{Time: toTime(t, ts2)},
-			},
-			LoadBalancer{
-				ID:      72,
-				Name:    "lb-site2",
-				Created: Datetime{Time: toTime(t, "2011-11-30T03:23:42Z")},
-				Updated: Datetime{Time: toTime(t, "2011-11-30T03:23:44Z")},
-			},
-			LoadBalancer{
-				ID:      73,
-				Name:    "lb-site3",
-				Created: Datetime{Time: toTime(t, "2012-11-30T03:23:42Z")},
-				Updated: Datetime{Time: toTime(t, "2012-11-30T03:23:44Z")},
-			},
-		}
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, 1, count)
-}
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockCreateLBResponse(t)
-
-	opts := CreateOpts{
-		Name:     "a-new-loadbalancer",
-		Port:     80,
-		Protocol: "HTTP",
-		VIPs: []vips.VIP{
-			vips.VIP{ID: 2341},
-			vips.VIP{ID: 900001},
-		},
-		Nodes: []nodes.Node{
-			nodes.Node{Address: "10.1.1.1", Port: 80, Condition: "ENABLED"},
-		},
-	}
-
-	lb, err := Create(client.ServiceClient(), opts).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := &LoadBalancer{
-		Name:       "a-new-loadbalancer",
-		ID:         144,
-		Protocol:   "HTTP",
-		HalfClosed: false,
-		Port:       83,
-		Algorithm:  "RANDOM",
-		Status:     BUILD,
-		Timeout:    30,
-		Cluster:    Cluster{Name: "ztm-n01.staging1.lbaas.rackspace.net"},
-		Nodes: []nodes.Node{
-			nodes.Node{
-				Address:   "10.1.1.1",
-				ID:        653,
-				Port:      80,
-				Status:    "ONLINE",
-				Condition: "ENABLED",
-				Weight:    1,
-			},
-		},
-		VIPs: []vips.VIP{
-			vips.VIP{
-				ID:      39,
-				Address: "206.10.10.210",
-				Type:    vips.PUBLIC,
-				Version: vips.IPV4,
-			},
-			vips.VIP{
-				ID:      900001,
-				Address: "2001:4801:79f1:0002:711b:be4c:0000:0021",
-				Type:    vips.PUBLIC,
-				Version: vips.IPV6,
-			},
-		},
-		Created:           Datetime{Time: toTime(t, ts1)},
-		Updated:           Datetime{Time: toTime(t, ts2)},
-		ConnectionLogging: ConnectionLogging{Enabled: false},
-	}
-
-	th.AssertDeepEquals(t, expected, lb)
-}
-
-func TestBulkDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	ids := []int{id1, id2}
-
-	mockBatchDeleteLBResponse(t, ids)
-
-	err := BulkDelete(client.ServiceClient(), ids).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockDeleteLBResponse(t, id1)
-
-	err := Delete(client.ServiceClient(), id1).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockGetLBResponse(t, id1)
-
-	lb, err := Get(client.ServiceClient(), id1).Extract()
-
-	expected := &LoadBalancer{
-		Name:              "sample-loadbalancer",
-		ID:                2000,
-		Protocol:          "HTTP",
-		Port:              80,
-		Algorithm:         "RANDOM",
-		Status:            ACTIVE,
-		Timeout:           30,
-		ConnectionLogging: ConnectionLogging{Enabled: true},
-		VIPs: []vips.VIP{
-			vips.VIP{
-				ID:      1000,
-				Address: "206.10.10.210",
-				Type:    "PUBLIC",
-				Version: "IPV4",
-			},
-		},
-		Nodes: []nodes.Node{
-			nodes.Node{
-				Address:   "10.1.1.1",
-				ID:        1041,
-				Port:      80,
-				Status:    "ONLINE",
-				Condition: "ENABLED",
-			},
-			nodes.Node{
-				Address:   "10.1.1.2",
-				ID:        1411,
-				Port:      80,
-				Status:    "ONLINE",
-				Condition: "ENABLED",
-			},
-		},
-		SessionPersistence: sessions.SessionPersistence{Type: "HTTP_COOKIE"},
-		ConnectionThrottle: throttle.ConnectionThrottle{MaxConnections: 100},
-		Cluster:            Cluster{Name: "c1.dfw1"},
-		Created:            Datetime{Time: toTime(t, ts1)},
-		Updated:            Datetime{Time: toTime(t, ts2)},
-		SourceAddrs: SourceAddrs{
-			IPv4Public:  "10.12.99.28",
-			IPv4Private: "10.0.0.0",
-			IPv6Public:  "2001:4801:79f1:1::1/64",
-		},
-	}
-
-	th.AssertDeepEquals(t, expected, lb)
-	th.AssertNoErr(t, err)
-}
-
-func TestUpdate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockUpdateLBResponse(t, id1)
-
-	opts := UpdateOpts{
-		Name:          "a-new-loadbalancer",
-		Protocol:      "TCP",
-		HalfClosed:    gophercloud.Enabled,
-		Algorithm:     "RANDOM",
-		Port:          8080,
-		Timeout:       100,
-		HTTPSRedirect: gophercloud.Disabled,
-	}
-
-	err := Update(client.ServiceClient(), id1, opts).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestListProtocols(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockListProtocolsResponse(t)
-
-	count := 0
-
-	err := ListProtocols(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractProtocols(page)
-		th.AssertNoErr(t, err)
-
-		expected := []Protocol{
-			Protocol{Name: "DNS_TCP", Port: 53},
-			Protocol{Name: "DNS_UDP", Port: 53},
-			Protocol{Name: "FTP", Port: 21},
-			Protocol{Name: "HTTP", Port: 80},
-			Protocol{Name: "HTTPS", Port: 443},
-			Protocol{Name: "IMAPS", Port: 993},
-			Protocol{Name: "IMAPv4", Port: 143},
-		}
-
-		th.CheckDeepEquals(t, expected[0:7], actual)
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, 1, count)
-}
-
-func TestListAlgorithms(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockListAlgorithmsResponse(t)
-
-	count := 0
-
-	err := ListAlgorithms(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractAlgorithms(page)
-		th.AssertNoErr(t, err)
-
-		expected := []Algorithm{
-			Algorithm{Name: "LEAST_CONNECTIONS"},
-			Algorithm{Name: "RANDOM"},
-			Algorithm{Name: "ROUND_ROBIN"},
-			Algorithm{Name: "WEIGHTED_LEAST_CONNECTIONS"},
-			Algorithm{Name: "WEIGHTED_ROUND_ROBIN"},
-		}
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, 1, count)
-}
-
-func TestIsLoggingEnabled(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockGetLoggingResponse(t, id1)
-
-	res, err := IsLoggingEnabled(client.ServiceClient(), id1)
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, true, res)
-}
-
-func TestEnablingLogging(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockEnableLoggingResponse(t, id1)
-
-	err := EnableLogging(client.ServiceClient(), id1).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestDisablingLogging(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockDisableLoggingResponse(t, id1)
-
-	err := DisableLogging(client.ServiceClient(), id1).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestGetErrorPage(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockGetErrorPageResponse(t, id1)
-
-	content, err := GetErrorPage(client.ServiceClient(), id1).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := &ErrorPage{Content: "<html>DEFAULT ERROR PAGE</html>"}
-	th.AssertDeepEquals(t, expected, content)
-}
-
-func TestSetErrorPage(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockSetErrorPageResponse(t, id1)
-
-	html := "<html>New error page</html>"
-	content, err := SetErrorPage(client.ServiceClient(), id1, html).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := &ErrorPage{Content: html}
-	th.AssertDeepEquals(t, expected, content)
-}
-
-func TestDeleteErrorPage(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockDeleteErrorPageResponse(t, id1)
-
-	err := DeleteErrorPage(client.ServiceClient(), id1).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestGetStats(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockGetStatsResponse(t, id1)
-
-	content, err := GetStats(client.ServiceClient(), id1).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := &Stats{
-		ConnectTimeout:        10,
-		ConnectError:          20,
-		ConnectFailure:        30,
-		DataTimedOut:          40,
-		KeepAliveTimedOut:     50,
-		MaxConnections:        60,
-		CurrentConnections:    40,
-		SSLConnectTimeout:     10,
-		SSLConnectError:       20,
-		SSLConnectFailure:     30,
-		SSLDataTimedOut:       40,
-		SSLKeepAliveTimedOut:  50,
-		SSLMaxConnections:     60,
-		SSLCurrentConnections: 40,
-	}
-	th.AssertDeepEquals(t, expected, content)
-}
-
-func TestIsCached(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockGetCachingResponse(t, id1)
-
-	res, err := IsContentCached(client.ServiceClient(), id1)
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, true, res)
-}
-
-func TestEnablingCaching(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockEnableCachingResponse(t, id1)
-
-	err := EnableCaching(client.ServiceClient(), id1).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestDisablingCaching(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockDisableCachingResponse(t, id1)
-
-	err := DisableCaching(client.ServiceClient(), id1).ExtractErr()
-	th.AssertNoErr(t, err)
-}
diff --git a/rackspace/lb/v1/lbs/results.go b/rackspace/lb/v1/lbs/results.go
deleted file mode 100644
index 98f3962..0000000
--- a/rackspace/lb/v1/lbs/results.go
+++ /dev/null
@@ -1,420 +0,0 @@
-package lbs
-
-import (
-	"reflect"
-	"time"
-
-	"github.com/mitchellh/mapstructure"
-
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-	"github.com/rackspace/gophercloud/rackspace/lb/v1/acl"
-	"github.com/rackspace/gophercloud/rackspace/lb/v1/nodes"
-	"github.com/rackspace/gophercloud/rackspace/lb/v1/sessions"
-	"github.com/rackspace/gophercloud/rackspace/lb/v1/throttle"
-	"github.com/rackspace/gophercloud/rackspace/lb/v1/vips"
-)
-
-// Protocol represents the network protocol which the load balancer accepts.
-type Protocol struct {
-	// The name of the protocol, e.g. HTTP, LDAP, FTP, etc.
-	Name string
-
-	// The port number for the protocol.
-	Port int
-}
-
-// Algorithm defines how traffic should be directed between back-end nodes.
-type Algorithm struct {
-	// The name of the algorithm, e.g RANDOM, ROUND_ROBIN, etc.
-	Name string
-}
-
-// Status represents the potential state of a load balancer resource.
-type Status string
-
-const (
-	// ACTIVE indicates that the LB is configured properly and ready to serve
-	// traffic to incoming requests via the configured virtual IPs.
-	ACTIVE Status = "ACTIVE"
-
-	// BUILD indicates that the LB is being provisioned for the first time and
-	// configuration is being applied to bring the service online. The service
-	// cannot yet serve incoming requests.
-	BUILD Status = "BUILD"
-
-	// PENDINGUPDATE indicates that the LB is online but configuration changes
-	// are being applied to update the service based on a previous request.
-	PENDINGUPDATE Status = "PENDING_UPDATE"
-
-	// PENDINGDELETE indicates that the LB is online but configuration changes
-	// are being applied to begin deletion of the service based on a previous
-	// request.
-	PENDINGDELETE Status = "PENDING_DELETE"
-
-	// SUSPENDED indicates that the LB has been taken offline and disabled.
-	SUSPENDED Status = "SUSPENDED"
-
-	// ERROR indicates that the system encountered an error when attempting to
-	// configure the load balancer.
-	ERROR Status = "ERROR"
-
-	// DELETED indicates that the LB has been deleted.
-	DELETED Status = "DELETED"
-)
-
-// Datetime represents the structure of a Created or Updated field.
-type Datetime struct {
-	Time time.Time `mapstructure:"-"`
-}
-
-// LoadBalancer represents a load balancer API resource.
-type LoadBalancer struct {
-	// Human-readable name for the load balancer.
-	Name string
-
-	// The unique ID for the load balancer.
-	ID int
-
-	// Represents the service protocol being load balanced. See Protocol type for
-	// a list of accepted values.
-	// See http://docs.rackspace.com/loadbalancers/api/v1.0/clb-devguide/content/protocols.html
-	// for a full list of supported protocols.
-	Protocol string
-
-	// Defines how traffic should be directed between back-end nodes. The default
-	// algorithm is RANDOM. See Algorithm type for a list of accepted values.
-	Algorithm string
-
-	// The current status of the load balancer.
-	Status Status
-
-	// The number of load balancer nodes.
-	NodeCount int `mapstructure:"nodeCount"`
-
-	// Slice of virtual IPs associated with this load balancer.
-	VIPs []vips.VIP `mapstructure:"virtualIps"`
-
-	// Datetime when the LB was created.
-	Created Datetime
-
-	// Datetime when the LB was created.
-	Updated Datetime
-
-	// Port number for the service you are load balancing.
-	Port int
-
-	// HalfClosed provides the ability for one end of the connection to
-	// terminate its output while still receiving data from the other end. This
-	// is only available on TCP/TCP_CLIENT_FIRST protocols.
-	HalfClosed bool
-
-	// Timeout represents the timeout value between a load balancer and its
-	// nodes. Defaults to 30 seconds with a maximum of 120 seconds.
-	Timeout int
-
-	// The cluster name.
-	Cluster Cluster
-
-	// Nodes shows all the back-end nodes which are associated with the load
-	// balancer. These are the devices which are delivered traffic.
-	Nodes []nodes.Node
-
-	// Current connection logging configuration.
-	ConnectionLogging ConnectionLogging
-
-	// SessionPersistence specifies whether multiple requests from clients are
-	// directed to the same node.
-	SessionPersistence sessions.SessionPersistence
-
-	// ConnectionThrottle specifies a limit on the number of connections per IP
-	// address to help mitigate malicious or abusive traffic to your applications.
-	ConnectionThrottle throttle.ConnectionThrottle
-
-	// The source public and private IP addresses.
-	SourceAddrs SourceAddrs `mapstructure:"sourceAddresses"`
-
-	// Represents the access rules for this particular load balancer. IP addresses
-	// or subnet ranges, depending on their type (ALLOW or DENY), can be permitted
-	// or blocked.
-	AccessList acl.AccessList
-}
-
-// SourceAddrs represents the source public and private IP addresses.
-type SourceAddrs struct {
-	IPv4Public  string `json:"ipv4Public" mapstructure:"ipv4Public"`
-	IPv4Private string `json:"ipv4Servicenet" mapstructure:"ipv4Servicenet"`
-	IPv6Public  string `json:"ipv6Public" mapstructure:"ipv6Public"`
-	IPv6Private string `json:"ipv6Servicenet" mapstructure:"ipv6Servicenet"`
-}
-
-// ConnectionLogging - temp
-type ConnectionLogging struct {
-	Enabled bool
-}
-
-// Cluster - temp
-type Cluster struct {
-	Name string
-}
-
-// LBPage is the page returned by a pager when traversing over a collection of
-// LBs.
-type LBPage struct {
-	pagination.LinkedPageBase
-}
-
-// IsEmpty checks whether a NetworkPage struct is empty.
-func (p LBPage) IsEmpty() (bool, error) {
-	is, err := ExtractLBs(p)
-	if err != nil {
-		return true, nil
-	}
-	return len(is) == 0, nil
-}
-
-// ExtractLBs accepts a Page struct, specifically a LBPage struct, and extracts
-// the elements into a slice of LoadBalancer structs. In other words, a generic
-// collection is mapped into a relevant slice.
-func ExtractLBs(page pagination.Page) ([]LoadBalancer, error) {
-	var resp struct {
-		LBs []LoadBalancer `mapstructure:"loadBalancers" json:"loadBalancers"`
-	}
-
-	coll := page.(LBPage).Body
-	err := mapstructure.Decode(coll, &resp)
-
-	s := reflect.ValueOf(coll.(map[string]interface{})["loadBalancers"])
-
-	for i := 0; i < s.Len(); i++ {
-		val := (s.Index(i).Interface()).(map[string]interface{})
-
-		ts, err := extractTS(val, "created")
-		if err != nil {
-			return resp.LBs, err
-		}
-		resp.LBs[i].Created.Time = ts
-
-		ts, err = extractTS(val, "updated")
-		if err != nil {
-			return resp.LBs, err
-		}
-		resp.LBs[i].Updated.Time = ts
-	}
-
-	return resp.LBs, err
-}
-
-func extractTS(body map[string]interface{}, key string) (time.Time, error) {
-	val := body[key].(map[string]interface{})
-	return time.Parse(time.RFC3339, val["time"].(string))
-}
-
-type commonResult struct {
-	gophercloud.Result
-}
-
-// Extract interprets any commonResult as a LB, if possible.
-func (r commonResult) Extract() (*LoadBalancer, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-
-	var response struct {
-		LB LoadBalancer `mapstructure:"loadBalancer"`
-	}
-
-	err := mapstructure.Decode(r.Body, &response)
-
-	json := r.Body.(map[string]interface{})
-	lb := json["loadBalancer"].(map[string]interface{})
-
-	ts, err := extractTS(lb, "created")
-	if err != nil {
-		return nil, err
-	}
-	response.LB.Created.Time = ts
-
-	ts, err = extractTS(lb, "updated")
-	if err != nil {
-		return nil, err
-	}
-	response.LB.Updated.Time = ts
-
-	return &response.LB, err
-}
-
-// CreateResult represents the result of a create operation.
-type CreateResult struct {
-	commonResult
-}
-
-// DeleteResult represents the result of a delete operation.
-type DeleteResult struct {
-	gophercloud.ErrResult
-}
-
-// UpdateResult represents the result of an update operation.
-type UpdateResult struct {
-	gophercloud.ErrResult
-}
-
-// GetResult represents the result of a get operation.
-type GetResult struct {
-	commonResult
-}
-
-// ProtocolPage is the page returned by a pager when traversing over a
-// collection of LB protocols.
-type ProtocolPage struct {
-	pagination.SinglePageBase
-}
-
-// IsEmpty checks whether a ProtocolPage struct is empty.
-func (p ProtocolPage) IsEmpty() (bool, error) {
-	is, err := ExtractProtocols(p)
-	if err != nil {
-		return true, nil
-	}
-	return len(is) == 0, nil
-}
-
-// ExtractProtocols accepts a Page struct, specifically a ProtocolPage struct,
-// and extracts the elements into a slice of Protocol structs. In other
-// words, a generic collection is mapped into a relevant slice.
-func ExtractProtocols(page pagination.Page) ([]Protocol, error) {
-	var resp struct {
-		Protocols []Protocol `mapstructure:"protocols" json:"protocols"`
-	}
-	err := mapstructure.Decode(page.(ProtocolPage).Body, &resp)
-	return resp.Protocols, err
-}
-
-// AlgorithmPage is the page returned by a pager when traversing over a
-// collection of LB algorithms.
-type AlgorithmPage struct {
-	pagination.SinglePageBase
-}
-
-// IsEmpty checks whether an AlgorithmPage struct is empty.
-func (p AlgorithmPage) IsEmpty() (bool, error) {
-	is, err := ExtractAlgorithms(p)
-	if err != nil {
-		return true, nil
-	}
-	return len(is) == 0, nil
-}
-
-// ExtractAlgorithms accepts a Page struct, specifically an AlgorithmPage struct,
-// and extracts the elements into a slice of Algorithm structs. In other
-// words, a generic collection is mapped into a relevant slice.
-func ExtractAlgorithms(page pagination.Page) ([]Algorithm, error) {
-	var resp struct {
-		Algorithms []Algorithm `mapstructure:"algorithms" json:"algorithms"`
-	}
-	err := mapstructure.Decode(page.(AlgorithmPage).Body, &resp)
-	return resp.Algorithms, err
-}
-
-// ErrorPage represents the HTML file that is shown to an end user who is
-// attempting to access a load balancer node that is offline/unavailable.
-//
-// During provisioning, every load balancer is configured with a default error
-// page that gets displayed when traffic is requested for an offline node.
-//
-// You can add a single custom error page with an HTTP-based protocol to a load
-// balancer. Page updates override existing content. If a custom error page is
-// deleted, or the load balancer is changed to a non-HTTP protocol, the default
-// error page is restored.
-type ErrorPage struct {
-	Content string
-}
-
-// ErrorPageResult represents the result of an error page operation -
-// specifically getting or creating one.
-type ErrorPageResult struct {
-	gophercloud.Result
-}
-
-// Extract interprets any commonResult as an ErrorPage, if possible.
-func (r ErrorPageResult) Extract() (*ErrorPage, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-
-	var response struct {
-		ErrorPage ErrorPage `mapstructure:"errorpage"`
-	}
-
-	err := mapstructure.Decode(r.Body, &response)
-
-	return &response.ErrorPage, err
-}
-
-// Stats represents all the key information about a load balancer's usage.
-type Stats struct {
-	// The number of connections closed by this load balancer because its
-	// ConnectTimeout interval was exceeded.
-	ConnectTimeout int `mapstructure:"connectTimeOut"`
-
-	// The number of transaction or protocol errors for this load balancer.
-	ConnectError int
-
-	// Number of connection failures for this load balancer.
-	ConnectFailure int
-
-	// Number of connections closed by this load balancer because its Timeout
-	// interval was exceeded.
-	DataTimedOut int
-
-	// Number of connections closed by this load balancer because the
-	// 'keepalive_timeout' interval was exceeded.
-	KeepAliveTimedOut int
-
-	// The maximum number of simultaneous TCP connections this load balancer has
-	// processed at any one time.
-	MaxConnections int `mapstructure:"maxConn"`
-
-	// Number of simultaneous connections active at the time of the request.
-	CurrentConnections int `mapstructure:"currentConn"`
-
-	// Number of SSL connections closed by this load balancer because the
-	// ConnectTimeout interval was exceeded.
-	SSLConnectTimeout int `mapstructure:"connectTimeOutSsl"`
-
-	// Number of SSL transaction or protocol erros in this load balancer.
-	SSLConnectError int `mapstructure:"connectErrorSsl"`
-
-	// Number of SSL connection failures in this load balancer.
-	SSLConnectFailure int `mapstructure:"connectFailureSsl"`
-
-	// Number of SSL connections closed by this load balancer because the
-	// Timeout interval was exceeded.
-	SSLDataTimedOut int `mapstructure:"dataTimedOutSsl"`
-
-	// Number of SSL connections closed by this load balancer because the
-	// 'keepalive_timeout' interval was exceeded.
-	SSLKeepAliveTimedOut int `mapstructure:"keepAliveTimedOutSsl"`
-
-	// Maximum number of simultaneous SSL connections this load balancer has
-	// processed at any one time.
-	SSLMaxConnections int `mapstructure:"maxConnSsl"`
-
-	// Number of simultaneous SSL connections active at the time of the request.
-	SSLCurrentConnections int `mapstructure:"currentConnSsl"`
-}
-
-// StatsResult represents the result of a Stats operation.
-type StatsResult struct {
-	gophercloud.Result
-}
-
-// Extract interprets any commonResult as a Stats struct, if possible.
-func (r StatsResult) Extract() (*Stats, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-	res := &Stats{}
-	err := mapstructure.Decode(r.Body, res)
-	return res, err
-}
diff --git a/rackspace/lb/v1/lbs/urls.go b/rackspace/lb/v1/lbs/urls.go
deleted file mode 100644
index 471a86b..0000000
--- a/rackspace/lb/v1/lbs/urls.go
+++ /dev/null
@@ -1,49 +0,0 @@
-package lbs
-
-import (
-	"strconv"
-
-	"github.com/rackspace/gophercloud"
-)
-
-const (
-	path           = "loadbalancers"
-	protocolsPath  = "protocols"
-	algorithmsPath = "algorithms"
-	logPath        = "connectionlogging"
-	epPath         = "errorpage"
-	stPath         = "stats"
-	cachePath      = "contentcaching"
-)
-
-func resourceURL(c *gophercloud.ServiceClient, id int) string {
-	return c.ServiceURL(path, strconv.Itoa(id))
-}
-
-func rootURL(c *gophercloud.ServiceClient) string {
-	return c.ServiceURL(path)
-}
-
-func protocolsURL(c *gophercloud.ServiceClient) string {
-	return c.ServiceURL(path, protocolsPath)
-}
-
-func algorithmsURL(c *gophercloud.ServiceClient) string {
-	return c.ServiceURL(path, algorithmsPath)
-}
-
-func loggingURL(c *gophercloud.ServiceClient, id int) string {
-	return c.ServiceURL(path, strconv.Itoa(id), logPath)
-}
-
-func errorPageURL(c *gophercloud.ServiceClient, id int) string {
-	return c.ServiceURL(path, strconv.Itoa(id), epPath)
-}
-
-func statsURL(c *gophercloud.ServiceClient, id int) string {
-	return c.ServiceURL(path, strconv.Itoa(id), stPath)
-}
-
-func cacheURL(c *gophercloud.ServiceClient, id int) string {
-	return c.ServiceURL(path, strconv.Itoa(id), cachePath)
-}
diff --git a/rackspace/lb/v1/monitors/doc.go b/rackspace/lb/v1/monitors/doc.go
deleted file mode 100644
index 2c5be75..0000000
--- a/rackspace/lb/v1/monitors/doc.go
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
-Package monitors provides information and interaction with the Health Monitor
-API resource for the Rackspace Cloud Load Balancer service.
-
-The load balancing service includes a health monitoring resource that
-periodically checks your back-end nodes to ensure they are responding correctly.
-If a node does not respond, it is removed from rotation until the health monitor
-determines that the node is functional. In addition to being performed
-periodically, a health check also executes against every new node that is
-added, to ensure that the node is operating properly before allowing it to
-service traffic. Only one health monitor is allowed to be enabled on a load
-balancer at a time.
-
-As part of a good strategy for monitoring connections, secondary nodes should
-also be created which provide failover for effectively routing traffic in case
-the primary node fails. This is an additional feature that ensures that you
-remain up in case your primary node fails.
-
-There are three types of health monitor: CONNECT, HTTP and HTTPS.
-*/
-package monitors
diff --git a/rackspace/lb/v1/monitors/fixtures.go b/rackspace/lb/v1/monitors/fixtures.go
deleted file mode 100644
index a565abc..0000000
--- a/rackspace/lb/v1/monitors/fixtures.go
+++ /dev/null
@@ -1,87 +0,0 @@
-package monitors
-
-import (
-	"fmt"
-	"net/http"
-	"strconv"
-	"testing"
-
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func _rootURL(lbID int) string {
-	return "/loadbalancers/" + strconv.Itoa(lbID) + "/healthmonitor"
-}
-
-func mockGetResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-  "healthMonitor": {
-    "type": "CONNECT",
-    "delay": 10,
-    "timeout": 10,
-    "attemptsBeforeDeactivation": 3
-  }
-}
-  `)
-	})
-}
-
-func mockUpdateConnectResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "PUT")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		th.TestJSONRequest(t, r, `
-{
-  "healthMonitor": {
-    "type": "CONNECT",
-    "delay": 10,
-    "timeout": 10,
-    "attemptsBeforeDeactivation": 3
-  }
-}
-    `)
-
-		w.WriteHeader(http.StatusAccepted)
-	})
-}
-
-func mockUpdateHTTPResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "PUT")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		th.TestJSONRequest(t, r, `
-{
-  "healthMonitor": {
-    "attemptsBeforeDeactivation": 3,
-    "bodyRegex": "{regex}",
-    "delay": 10,
-    "path": "/foo",
-    "statusRegex": "200",
-    "timeout": 10,
-    "type": "HTTPS"
-  }
-}
-		`)
-
-		w.WriteHeader(http.StatusAccepted)
-	})
-}
-
-func mockDeleteResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		w.WriteHeader(http.StatusAccepted)
-	})
-}
diff --git a/rackspace/lb/v1/monitors/requests.go b/rackspace/lb/v1/monitors/requests.go
deleted file mode 100644
index d4ba276..0000000
--- a/rackspace/lb/v1/monitors/requests.go
+++ /dev/null
@@ -1,160 +0,0 @@
-package monitors
-
-import (
-	"errors"
-
-	"github.com/rackspace/gophercloud"
-)
-
-var (
-	errAttemptLimit = errors.New("AttemptLimit field must be an int greater than 1 and less than 10")
-	errDelay        = errors.New("Delay field must be an int greater than 1 and less than 10")
-	errTimeout      = errors.New("Timeout field must be an int greater than 1 and less than 10")
-)
-
-// UpdateOptsBuilder is the interface options structs have to satisfy in order
-// to be used in the main Update operation in this package.
-type UpdateOptsBuilder interface {
-	ToMonitorUpdateMap() (map[string]interface{}, error)
-}
-
-// UpdateConnectMonitorOpts represents the options needed to update a CONNECT
-// monitor.
-type UpdateConnectMonitorOpts struct {
-	// Required - number of permissible monitor failures before removing a node
-	// from rotation. Must be a number between 1 and 10.
-	AttemptLimit int
-
-	// Required - the minimum number of seconds to wait before executing the
-	// health monitor. Must be a number between 1 and 3600.
-	Delay int
-
-	// Required - maximum number of seconds to wait for a connection to be
-	// established before timing out. Must be a number between 1 and 300.
-	Timeout int
-}
-
-// ToMonitorUpdateMap produces a map for updating CONNECT monitors.
-func (opts UpdateConnectMonitorOpts) ToMonitorUpdateMap() (map[string]interface{}, error) {
-	type m map[string]interface{}
-
-	if !gophercloud.IntWithinRange(opts.AttemptLimit, 1, 10) {
-		return m{}, errAttemptLimit
-	}
-	if !gophercloud.IntWithinRange(opts.Delay, 1, 3600) {
-		return m{}, errDelay
-	}
-	if !gophercloud.IntWithinRange(opts.Timeout, 1, 300) {
-		return m{}, errTimeout
-	}
-
-	return m{"healthMonitor": m{
-		"attemptsBeforeDeactivation": opts.AttemptLimit,
-		"delay":   opts.Delay,
-		"timeout": opts.Timeout,
-		"type":    CONNECT,
-	}}, nil
-}
-
-// UpdateHTTPMonitorOpts represents the options needed to update a HTTP monitor.
-type UpdateHTTPMonitorOpts struct {
-	// Required - number of permissible monitor failures before removing a node
-	// from rotation. Must be a number between 1 and 10.
-	AttemptLimit int `mapstructure:"attemptsBeforeDeactivation"`
-
-	// Required - the minimum number of seconds to wait before executing the
-	// health monitor. Must be a number between 1 and 3600.
-	Delay int
-
-	// Required - maximum number of seconds to wait for a connection to be
-	// established before timing out. Must be a number between 1 and 300.
-	Timeout int
-
-	// Required - a regular expression that will be used to evaluate the contents
-	// of the body of the response.
-	BodyRegex string
-
-	// Required - the HTTP path that will be used in the sample request.
-	Path string
-
-	// Required - a regular expression that will be used to evaluate the HTTP
-	// status code returned in the response.
-	StatusRegex string
-
-	// Optional - the name of a host for which the health monitors will check.
-	HostHeader string
-
-	// Required - either HTTP or HTTPS
-	Type Type
-}
-
-// ToMonitorUpdateMap produces a map for updating HTTP(S) monitors.
-func (opts UpdateHTTPMonitorOpts) ToMonitorUpdateMap() (map[string]interface{}, error) {
-	type m map[string]interface{}
-
-	if !gophercloud.IntWithinRange(opts.AttemptLimit, 1, 10) {
-		return m{}, errAttemptLimit
-	}
-	if !gophercloud.IntWithinRange(opts.Delay, 1, 3600) {
-		return m{}, errDelay
-	}
-	if !gophercloud.IntWithinRange(opts.Timeout, 1, 300) {
-		return m{}, errTimeout
-	}
-	if opts.Type != HTTP && opts.Type != HTTPS {
-		return m{}, errors.New("Type must either by HTTP or HTTPS")
-	}
-	if opts.BodyRegex == "" {
-		return m{}, errors.New("BodyRegex is a required field")
-	}
-	if opts.Path == "" {
-		return m{}, errors.New("Path is a required field")
-	}
-	if opts.StatusRegex == "" {
-		return m{}, errors.New("StatusRegex is a required field")
-	}
-
-	json := m{
-		"attemptsBeforeDeactivation": opts.AttemptLimit,
-		"delay":       opts.Delay,
-		"timeout":     opts.Timeout,
-		"type":        opts.Type,
-		"bodyRegex":   opts.BodyRegex,
-		"path":        opts.Path,
-		"statusRegex": opts.StatusRegex,
-	}
-
-	if opts.HostHeader != "" {
-		json["hostHeader"] = opts.HostHeader
-	}
-
-	return m{"healthMonitor": json}, nil
-}
-
-// Update is the operation responsible for updating a health monitor.
-func Update(c *gophercloud.ServiceClient, id int, opts UpdateOptsBuilder) UpdateResult {
-	var res UpdateResult
-
-	reqBody, err := opts.ToMonitorUpdateMap()
-	if err != nil {
-		res.Err = err
-		return res
-	}
-
-	_, res.Err = c.Put(rootURL(c, id), reqBody, nil, nil)
-	return res
-}
-
-// Get is the operation responsible for showing details of a health monitor.
-func Get(c *gophercloud.ServiceClient, id int) GetResult {
-	var res GetResult
-	_, res.Err = c.Get(rootURL(c, id), &res.Body, nil)
-	return res
-}
-
-// Delete is the operation responsible for deleting a health monitor.
-func Delete(c *gophercloud.ServiceClient, id int) DeleteResult {
-	var res DeleteResult
-	_, res.Err = c.Delete(rootURL(c, id), nil)
-	return res
-}
diff --git a/rackspace/lb/v1/monitors/requests_test.go b/rackspace/lb/v1/monitors/requests_test.go
deleted file mode 100644
index 76a60db..0000000
--- a/rackspace/lb/v1/monitors/requests_test.go
+++ /dev/null
@@ -1,75 +0,0 @@
-package monitors
-
-import (
-	"testing"
-
-	th "github.com/rackspace/gophercloud/testhelper"
-	"github.com/rackspace/gophercloud/testhelper/client"
-)
-
-const lbID = 12345
-
-func TestUpdateCONNECT(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockUpdateConnectResponse(t, lbID)
-
-	opts := UpdateConnectMonitorOpts{
-		AttemptLimit: 3,
-		Delay:        10,
-		Timeout:      10,
-	}
-
-	err := Update(client.ServiceClient(), lbID, opts).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestUpdateHTTP(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockUpdateHTTPResponse(t, lbID)
-
-	opts := UpdateHTTPMonitorOpts{
-		AttemptLimit: 3,
-		Delay:        10,
-		Timeout:      10,
-		BodyRegex:    "{regex}",
-		Path:         "/foo",
-		StatusRegex:  "200",
-		Type:         HTTPS,
-	}
-
-	err := Update(client.ServiceClient(), lbID, opts).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockGetResponse(t, lbID)
-
-	m, err := Get(client.ServiceClient(), lbID).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := &Monitor{
-		Type:         CONNECT,
-		Delay:        10,
-		Timeout:      10,
-		AttemptLimit: 3,
-	}
-
-	th.AssertDeepEquals(t, expected, m)
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockDeleteResponse(t, lbID)
-
-	err := Delete(client.ServiceClient(), lbID).ExtractErr()
-	th.AssertNoErr(t, err)
-}
diff --git a/rackspace/lb/v1/monitors/results.go b/rackspace/lb/v1/monitors/results.go
deleted file mode 100644
index eec556f..0000000
--- a/rackspace/lb/v1/monitors/results.go
+++ /dev/null
@@ -1,90 +0,0 @@
-package monitors
-
-import (
-	"github.com/mitchellh/mapstructure"
-
-	"github.com/rackspace/gophercloud"
-)
-
-// Type represents the type of Monitor.
-type Type string
-
-// Useful constants.
-const (
-	CONNECT Type = "CONNECT"
-	HTTP    Type = "HTTP"
-	HTTPS   Type = "HTTPS"
-)
-
-// Monitor represents a health monitor API resource. A monitor comes in three
-// forms: CONNECT, HTTP or HTTPS.
-//
-// A CONNECT monitor establishes a basic connection to each node on its defined
-// port to ensure that the service is listening properly. The connect monitor
-// is the most basic type of health check and does no post-processing or
-// protocol-specific health checks.
-//
-// HTTP and HTTPS health monitors are generally considered more intelligent and
-// powerful than CONNECT. It is capable of processing an HTTP or HTTPS response
-// to determine the condition of a node. It supports the same basic properties
-// as CONNECT and includes additional attributes that are used to evaluate the
-// HTTP response.
-type Monitor struct {
-	// Number of permissible monitor failures before removing a node from
-	// rotation.
-	AttemptLimit int `mapstructure:"attemptsBeforeDeactivation"`
-
-	// The minimum number of seconds to wait before executing the health monitor.
-	Delay int
-
-	// Maximum number of seconds to wait for a connection to be established
-	// before timing out.
-	Timeout int
-
-	// Type of the health monitor.
-	Type Type
-
-	// A regular expression that will be used to evaluate the contents of the
-	// body of the response.
-	BodyRegex string
-
-	// The name of a host for which the health monitors will check.
-	HostHeader string
-
-	// The HTTP path that will be used in the sample request.
-	Path string
-
-	// A regular expression that will be used to evaluate the HTTP status code
-	// returned in the response.
-	StatusRegex string
-}
-
-// UpdateResult represents the result of an Update operation.
-type UpdateResult struct {
-	gophercloud.ErrResult
-}
-
-// GetResult represents the result of a Get operation.
-type GetResult struct {
-	gophercloud.Result
-}
-
-// DeleteResult represents the result of an Delete operation.
-type DeleteResult struct {
-	gophercloud.ErrResult
-}
-
-// Extract interprets any GetResult as a Monitor.
-func (r GetResult) Extract() (*Monitor, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-
-	var response struct {
-		M Monitor `mapstructure:"healthMonitor"`
-	}
-
-	err := mapstructure.Decode(r.Body, &response)
-
-	return &response.M, err
-}
diff --git a/rackspace/lb/v1/monitors/urls.go b/rackspace/lb/v1/monitors/urls.go
deleted file mode 100644
index 0a1e6df..0000000
--- a/rackspace/lb/v1/monitors/urls.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package monitors
-
-import (
-	"strconv"
-
-	"github.com/rackspace/gophercloud"
-)
-
-const (
-	path        = "loadbalancers"
-	monitorPath = "healthmonitor"
-)
-
-func rootURL(c *gophercloud.ServiceClient, lbID int) string {
-	return c.ServiceURL(path, strconv.Itoa(lbID), monitorPath)
-}
diff --git a/rackspace/lb/v1/nodes/doc.go b/rackspace/lb/v1/nodes/doc.go
deleted file mode 100644
index 49c4318..0000000
--- a/rackspace/lb/v1/nodes/doc.go
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
-Package nodes provides information and interaction with the Node API resource
-for the Rackspace Cloud Load Balancer service.
-
-Nodes are responsible for servicing the requests received through the load
-balancer's virtual IP. A node is usually a virtual machine. By default, the
-load balancer employs a basic health check that ensures the node is listening
-on its defined port. The node is checked at the time of addition and at regular
-intervals as defined by the load balancer's health check configuration. If a
-back-end node is not listening on its port, or does not meet the conditions of
-the defined check, then connections will not be forwarded to the node, and its
-status is changed to OFFLINE. Only nodes that are in an ONLINE status receive
-and can service traffic from the load balancer.
-
-All nodes have an associated status that indicates whether the node is
-ONLINE, OFFLINE, or DRAINING. Only nodes that are in ONLINE status can receive
-and service traffic from the load balancer. The OFFLINE status represents a
-node that cannot accept or service traffic. A node in DRAINING status
-represents a node that stops the traffic manager from sending any additional
-new connections to the node, but honors established sessions. If the traffic
-manager receives a request and session persistence requires that the node is
-used, the traffic manager uses it. The status is determined by the passive or
-active health monitors.
-
-If the WEIGHTED_ROUND_ROBIN load balancer algorithm mode is selected, then the
-caller should assign the relevant weights to the node as part of the weight
-attribute of the node element. When the algorithm of the load balancer is
-changed to WEIGHTED_ROUND_ROBIN and the nodes do not already have an assigned
-weight, the service automatically sets the weight to 1 for all nodes.
-
-One or more secondary nodes can be added to a specified load balancer so that
-if all the primary nodes fail, traffic can be redirected to secondary nodes.
-The type attribute allows configuring the node as either PRIMARY or SECONDARY.
-*/
-package nodes
diff --git a/rackspace/lb/v1/nodes/fixtures.go b/rackspace/lb/v1/nodes/fixtures.go
deleted file mode 100644
index 8899fc5..0000000
--- a/rackspace/lb/v1/nodes/fixtures.go
+++ /dev/null
@@ -1,243 +0,0 @@
-package nodes
-
-import (
-	"fmt"
-	"net/http"
-	"strconv"
-	"testing"
-
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func _rootURL(lbID int) string {
-	return "/loadbalancers/" + strconv.Itoa(lbID) + "/nodes"
-}
-
-func _nodeURL(lbID, nodeID int) string {
-	return _rootURL(lbID) + "/" + strconv.Itoa(nodeID)
-}
-
-func mockListResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-  "nodes": [
-    {
-      "id": 410,
-      "address": "10.1.1.1",
-      "port": 80,
-      "condition": "ENABLED",
-      "status": "ONLINE",
-      "weight": 3,
-      "type": "PRIMARY"
-    },
-    {
-      "id": 411,
-      "address": "10.1.1.2",
-      "port": 80,
-      "condition": "ENABLED",
-      "status": "ONLINE",
-      "weight": 8,
-      "type": "SECONDARY"
-    }
-  ]
-}
-  `)
-	})
-}
-
-func mockCreateResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "POST")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		th.TestJSONRequest(t, r, `
-{
-  "nodes": [
-    {
-      "address": "10.2.2.3",
-      "port": 80,
-      "condition": "ENABLED",
-      "type": "PRIMARY"
-    },
-    {
-      "address": "10.2.2.4",
-      "port": 81,
-      "condition": "ENABLED",
-      "type": "SECONDARY"
-    }
-  ]
-}
-    `)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusAccepted)
-
-		fmt.Fprintf(w, `
-{
-  "nodes": [
-    {
-      "address": "10.2.2.3",
-      "id": 185,
-      "port": 80,
-      "status": "ONLINE",
-      "condition": "ENABLED",
-      "weight": 1,
-      "type": "PRIMARY"
-    },
-    {
-      "address": "10.2.2.4",
-      "id": 186,
-      "port": 81,
-      "status": "ONLINE",
-      "condition": "ENABLED",
-      "weight": 1,
-      "type": "SECONDARY"
-    }
-  ]
-}
-  `)
-	})
-}
-
-func mockCreateErrResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "POST")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		th.TestJSONRequest(t, r, `
-{
-  "nodes": [
-    {
-      "address": "10.2.2.3",
-      "port": 80,
-      "condition": "ENABLED",
-      "type": "PRIMARY"
-    },
-    {
-      "address": "10.2.2.4",
-      "port": 81,
-      "condition": "ENABLED",
-      "type": "SECONDARY"
-    }
-  ]
-}
-    `)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(422) // Unprocessable Entity
-
-		fmt.Fprintf(w, `
-{
-  "code": 422,
-  "message": "Load Balancer '%d' has a status of 'PENDING_UPDATE' and is considered immutable."
-}
-  `, lbID)
-	})
-}
-
-func mockBatchDeleteResponse(t *testing.T, lbID int, ids []int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		r.ParseForm()
-
-		for k, v := range ids {
-			fids := r.Form["id"]
-			th.AssertEquals(t, strconv.Itoa(v), fids[k])
-		}
-
-		w.WriteHeader(http.StatusAccepted)
-	})
-}
-
-func mockDeleteResponse(t *testing.T, lbID, nodeID int) {
-	th.Mux.HandleFunc(_nodeURL(lbID, nodeID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		w.WriteHeader(http.StatusAccepted)
-	})
-}
-
-func mockGetResponse(t *testing.T, lbID, nodeID int) {
-	th.Mux.HandleFunc(_nodeURL(lbID, nodeID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-  "node": {
-    "id": 410,
-    "address": "10.1.1.1",
-    "port": 80,
-    "condition": "ENABLED",
-    "status": "ONLINE",
-    "weight": 12,
-    "type": "PRIMARY"
-  }
-}
-  `)
-	})
-}
-
-func mockUpdateResponse(t *testing.T, lbID, nodeID int) {
-	th.Mux.HandleFunc(_nodeURL(lbID, nodeID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "PUT")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		th.TestJSONRequest(t, r, `
-{
-  "node": {
-    "condition": "DRAINING",
-    "weight": 10,
-		"type": "SECONDARY"
-  }
-}
-    `)
-
-		w.WriteHeader(http.StatusAccepted)
-	})
-}
-
-func mockListEventsResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_rootURL(lbID)+"/events", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-  "nodeServiceEvents": [
-    {
-      "detailedMessage": "Node is ok",
-      "nodeId": 373,
-      "id": 7,
-      "type": "UPDATE_NODE",
-      "description": "Node '373' status changed to 'ONLINE' for load balancer '323'",
-      "category": "UPDATE",
-      "severity": "INFO",
-      "relativeUri": "/406271/loadbalancers/323/nodes/373/events",
-      "accountId": 406271,
-      "loadbalancerId": 323,
-      "title": "Node Status Updated",
-      "author": "Rackspace Cloud",
-      "created": "10-30-2012 10:18:23"
-    }
-  ]
-}
-`)
-	})
-}
diff --git a/rackspace/lb/v1/nodes/requests.go b/rackspace/lb/v1/nodes/requests.go
deleted file mode 100644
index 9da376f..0000000
--- a/rackspace/lb/v1/nodes/requests.go
+++ /dev/null
@@ -1,286 +0,0 @@
-package nodes
-
-import (
-	"errors"
-	"fmt"
-
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List is the operation responsible for returning a paginated collection of
-// load balancer nodes. It requires the node ID, its parent load balancer ID,
-// and optional limit integer (passed in either as a pointer or a nil poitner).
-func List(client *gophercloud.ServiceClient, loadBalancerID int, limit *int) pagination.Pager {
-	url := rootURL(client, loadBalancerID)
-	if limit != nil {
-		url += fmt.Sprintf("?limit=%d", limit)
-	}
-
-	return pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page {
-		return NodePage{pagination.SinglePageBase(r)}
-	})
-}
-
-// CreateOptsBuilder is the interface responsible for generating the JSON
-// for a Create operation.
-type CreateOptsBuilder interface {
-	ToNodeCreateMap() (map[string]interface{}, error)
-}
-
-// CreateOpts is a slice of CreateOpt structs, that allow the user to create
-// multiple nodes in a single operation (one node per CreateOpt).
-type CreateOpts []CreateOpt
-
-// CreateOpt represents the options to create a single node.
-type CreateOpt struct {
-	// Required - the IP address or CIDR for this back-end node. It can either be
-	// a private IP (ServiceNet) or a public IP.
-	Address string
-
-	// Optional - the port on which traffic is sent and received.
-	Port int
-
-	// Optional - the condition of the node. See the consts in Results.go.
-	Condition Condition
-
-	// Optional - the type of the node. See the consts in Results.go.
-	Type Type
-
-	// Optional - a pointer to an integer between 0 and 100.
-	Weight *int
-}
-
-func validateWeight(weight *int) error {
-	if weight != nil && (*weight > 100 || *weight < 0) {
-		return errors.New("Weight must be a valid int between 0 and 100")
-	}
-	return nil
-}
-
-// ToNodeCreateMap converts a slice of options into a map that can be used for
-// the JSON.
-func (opts CreateOpts) ToNodeCreateMap() (map[string]interface{}, error) {
-	type nodeMap map[string]interface{}
-	nodes := []nodeMap{}
-
-	for k, v := range opts {
-		if v.Address == "" {
-			return nodeMap{}, fmt.Errorf("ID is a required attribute, none provided for %d CreateOpt element", k)
-		}
-		if weightErr := validateWeight(v.Weight); weightErr != nil {
-			return nodeMap{}, weightErr
-		}
-
-		node := make(map[string]interface{})
-		node["address"] = v.Address
-
-		if v.Port > 0 {
-			node["port"] = v.Port
-		}
-		if v.Condition != "" {
-			node["condition"] = v.Condition
-		}
-		if v.Type != "" {
-			node["type"] = v.Type
-		}
-		if v.Weight != nil {
-			node["weight"] = &v.Weight
-		}
-
-		nodes = append(nodes, node)
-	}
-
-	return nodeMap{"nodes": nodes}, nil
-}
-
-// Create is the operation responsible for creating a new node on a load
-// balancer. Since every load balancer exists in both ServiceNet and the public
-// Internet, both private and public IP addresses can be used for nodes.
-//
-// If nodes need time to boot up services before they become operational, you
-// can temporarily prevent traffic from being sent to that node by setting the
-// Condition field to DRAINING. Health checks will still be performed; but once
-// your node is ready, you can update its condition to ENABLED and have it
-// handle traffic.
-func Create(client *gophercloud.ServiceClient, loadBalancerID int, opts CreateOptsBuilder) CreateResult {
-	var res CreateResult
-
-	reqBody, err := opts.ToNodeCreateMap()
-	if err != nil {
-		res.Err = err
-		return res
-	}
-
-	resp, err := client.Post(rootURL(client, loadBalancerID), reqBody, &res.Body, nil)
-
-	if err != nil {
-		res.Err = err
-		return res
-	}
-
-	pr := pagination.PageResultFromParsed(resp, res.Body)
-	return CreateResult{pagination.SinglePageBase(pr)}
-}
-
-// BulkDelete is the operation responsible for batch deleting multiple nodes in
-// a single operation. It accepts a slice of integer IDs and will remove them
-// from the load balancer. The maximum limit is 10 node removals at once.
-func BulkDelete(c *gophercloud.ServiceClient, loadBalancerID int, nodeIDs []int) DeleteResult {
-	var res DeleteResult
-
-	if len(nodeIDs) > 10 || len(nodeIDs) == 0 {
-		res.Err = errors.New("You must provide a minimum of 1 and a maximum of 10 node IDs")
-		return res
-	}
-
-	url := rootURL(c, loadBalancerID)
-	url += gophercloud.IDSliceToQueryString("id", nodeIDs)
-
-	_, res.Err = c.Delete(url, nil)
-	return res
-}
-
-// Get is the operation responsible for showing details for a single node.
-func Get(c *gophercloud.ServiceClient, lbID, nodeID int) GetResult {
-	var res GetResult
-	_, res.Err = c.Get(resourceURL(c, lbID, nodeID), &res.Body, nil)
-	return res
-}
-
-// UpdateOptsBuilder represents a type that can be converted into a JSON-like
-// map structure.
-type UpdateOptsBuilder interface {
-	ToNodeUpdateMap() (map[string]interface{}, error)
-}
-
-// UpdateOpts represent the options for updating an existing node.
-type UpdateOpts struct {
-	// Optional - the condition of the node. See the consts in Results.go.
-	Condition Condition
-
-	// Optional - the type of the node. See the consts in Results.go.
-	Type Type
-
-	// Optional - a pointer to an integer between 0 and 100.
-	Weight *int
-}
-
-// ToNodeUpdateMap converts an options struct into a JSON-like map.
-func (opts UpdateOpts) ToNodeUpdateMap() (map[string]interface{}, error) {
-	node := make(map[string]interface{})
-
-	if opts.Condition != "" {
-		node["condition"] = opts.Condition
-	}
-	if opts.Weight != nil {
-		if weightErr := validateWeight(opts.Weight); weightErr != nil {
-			return node, weightErr
-		}
-		node["weight"] = &opts.Weight
-	}
-	if opts.Type != "" {
-		node["type"] = opts.Type
-	}
-
-	return map[string]interface{}{"node": node}, nil
-}
-
-// Update is the operation responsible for updating an existing node. A node's
-// IP, port, and status are immutable attributes and cannot be modified.
-func Update(c *gophercloud.ServiceClient, lbID, nodeID int, opts UpdateOptsBuilder) UpdateResult {
-	var res UpdateResult
-
-	reqBody, err := opts.ToNodeUpdateMap()
-	if err != nil {
-		res.Err = err
-		return res
-	}
-
-	_, res.Err = c.Put(resourceURL(c, lbID, nodeID), reqBody, nil, nil)
-	return res
-}
-
-// Delete is the operation responsible for permanently deleting a node.
-func Delete(c *gophercloud.ServiceClient, lbID, nodeID int) DeleteResult {
-	var res DeleteResult
-	_, res.Err = c.Delete(resourceURL(c, lbID, nodeID), nil)
-	return res
-}
-
-// ListEventsOptsBuilder allows extensions to add additional parameters to the
-// List request.
-type ListEventsOptsBuilder interface {
-	ToEventsListQuery() (string, error)
-}
-
-// ListEventsOpts allows the filtering and sorting of paginated collections through
-// the API.
-type ListEventsOpts struct {
-	Marker string `q:"marker"`
-	Limit  int    `q:"limit"`
-}
-
-// ToEventsListQuery formats a ListOpts into a query string.
-func (opts ListEventsOpts) ToEventsListQuery() (string, error) {
-	q, err := gophercloud.BuildQueryString(opts)
-	if err != nil {
-		return "", err
-	}
-	return q.String(), nil
-}
-
-// ListEvents is the operation responsible for listing all the events
-// associated with the activity between the node and the load balancer. The
-// events report errors found with the node. The detailedMessage provides the
-// detailed reason for the error.
-func ListEvents(client *gophercloud.ServiceClient, loadBalancerID int, opts ListEventsOptsBuilder) pagination.Pager {
-	url := eventsURL(client, loadBalancerID)
-
-	if opts != nil {
-		query, err := opts.ToEventsListQuery()
-		if err != nil {
-			return pagination.Pager{Err: err}
-		}
-		url += query
-	}
-
-	return pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page {
-		return NodeEventPage{pagination.SinglePageBase(r)}
-	})
-}
-
-// GetByIPPort locates a load balancer node by IP and port.
-func GetByIPPort(
-	client *gophercloud.ServiceClient,
-	loadBalancerID int,
-	address string,
-	port int,
-) (*Node, error) {
-
-	// nil until found
-	var found *Node
-
-	List(client, loadBalancerID, nil).EachPage(func(page pagination.Page) (bool, error) {
-		lbNodes, err := ExtractNodes(page)
-		if err != nil {
-			return false, err
-		}
-
-		for _, trialNode := range lbNodes {
-			if trialNode.Address == address && trialNode.Port == port {
-				found = &trialNode
-				return false, nil
-			}
-
-		}
-
-		return true, nil
-	})
-
-	if found == nil {
-		return nil, errors.New("Unable to get node by IP and Port")
-	}
-
-	return found, nil
-}
diff --git a/rackspace/lb/v1/nodes/requests_test.go b/rackspace/lb/v1/nodes/requests_test.go
deleted file mode 100644
index a964af8..0000000
--- a/rackspace/lb/v1/nodes/requests_test.go
+++ /dev/null
@@ -1,243 +0,0 @@
-package nodes
-
-import (
-	"testing"
-
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	"github.com/rackspace/gophercloud/testhelper/client"
-)
-
-const (
-	lbID    = 12345
-	nodeID  = 67890
-	nodeID2 = 67891
-)
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockListResponse(t, lbID)
-
-	count := 0
-
-	err := List(client.ServiceClient(), lbID, nil).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractNodes(page)
-		th.AssertNoErr(t, err)
-
-		expected := []Node{
-			Node{
-				ID:        410,
-				Address:   "10.1.1.1",
-				Port:      80,
-				Condition: ENABLED,
-				Status:    ONLINE,
-				Weight:    3,
-				Type:      PRIMARY,
-			},
-			Node{
-				ID:        411,
-				Address:   "10.1.1.2",
-				Port:      80,
-				Condition: ENABLED,
-				Status:    ONLINE,
-				Weight:    8,
-				Type:      SECONDARY,
-			},
-		}
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, 1, count)
-}
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockCreateResponse(t, lbID)
-
-	opts := CreateOpts{
-		CreateOpt{
-			Address:   "10.2.2.3",
-			Port:      80,
-			Condition: ENABLED,
-			Type:      PRIMARY,
-		},
-		CreateOpt{
-			Address:   "10.2.2.4",
-			Port:      81,
-			Condition: ENABLED,
-			Type:      SECONDARY,
-		},
-	}
-
-	page := Create(client.ServiceClient(), lbID, opts)
-
-	actual, err := page.ExtractNodes()
-	th.AssertNoErr(t, err)
-
-	expected := []Node{
-		Node{
-			ID:        185,
-			Address:   "10.2.2.3",
-			Port:      80,
-			Condition: ENABLED,
-			Status:    ONLINE,
-			Weight:    1,
-			Type:      PRIMARY,
-		},
-		Node{
-			ID:        186,
-			Address:   "10.2.2.4",
-			Port:      81,
-			Condition: ENABLED,
-			Status:    ONLINE,
-			Weight:    1,
-			Type:      SECONDARY,
-		},
-	}
-
-	th.CheckDeepEquals(t, expected, actual)
-}
-
-func TestCreateErr(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockCreateErrResponse(t, lbID)
-
-	opts := CreateOpts{
-		CreateOpt{
-			Address:   "10.2.2.3",
-			Port:      80,
-			Condition: ENABLED,
-			Type:      PRIMARY,
-		},
-		CreateOpt{
-			Address:   "10.2.2.4",
-			Port:      81,
-			Condition: ENABLED,
-			Type:      SECONDARY,
-		},
-	}
-
-	page := Create(client.ServiceClient(), lbID, opts)
-
-	actual, err := page.ExtractNodes()
-	if err == nil {
-		t.Fatal("Did not receive expected error from ExtractNodes")
-	}
-	if actual != nil {
-		t.Fatalf("Received non-nil result from failed ExtractNodes: %#v", actual)
-	}
-}
-
-func TestBulkDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	ids := []int{nodeID, nodeID2}
-
-	mockBatchDeleteResponse(t, lbID, ids)
-
-	err := BulkDelete(client.ServiceClient(), lbID, ids).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockGetResponse(t, lbID, nodeID)
-
-	node, err := Get(client.ServiceClient(), lbID, nodeID).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := &Node{
-		ID:        410,
-		Address:   "10.1.1.1",
-		Port:      80,
-		Condition: ENABLED,
-		Status:    ONLINE,
-		Weight:    12,
-		Type:      PRIMARY,
-	}
-
-	th.AssertDeepEquals(t, expected, node)
-}
-
-func TestUpdate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockUpdateResponse(t, lbID, nodeID)
-
-	opts := UpdateOpts{
-		Weight:    gophercloud.IntToPointer(10),
-		Condition: DRAINING,
-		Type:      SECONDARY,
-	}
-
-	err := Update(client.ServiceClient(), lbID, nodeID, opts).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockDeleteResponse(t, lbID, nodeID)
-
-	err := Delete(client.ServiceClient(), lbID, nodeID).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestListEvents(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockListEventsResponse(t, lbID)
-
-	count := 0
-
-	pager := ListEvents(client.ServiceClient(), lbID, ListEventsOpts{})
-
-	err := pager.EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractNodeEvents(page)
-		th.AssertNoErr(t, err)
-
-		expected := []NodeEvent{
-			NodeEvent{
-				DetailedMessage: "Node is ok",
-				NodeID:          373,
-				ID:              7,
-				Type:            "UPDATE_NODE",
-				Description:     "Node '373' status changed to 'ONLINE' for load balancer '323'",
-				Category:        "UPDATE",
-				Severity:        "INFO",
-				RelativeURI:     "/406271/loadbalancers/323/nodes/373/events",
-				AccountID:       406271,
-				LoadBalancerID:  323,
-				Title:           "Node Status Updated",
-				Author:          "Rackspace Cloud",
-				Created:         "10-30-2012 10:18:23",
-			},
-		}
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, 1, count)
-}
diff --git a/rackspace/lb/v1/nodes/results.go b/rackspace/lb/v1/nodes/results.go
deleted file mode 100644
index 57835dc..0000000
--- a/rackspace/lb/v1/nodes/results.go
+++ /dev/null
@@ -1,213 +0,0 @@
-package nodes
-
-import (
-	"github.com/mitchellh/mapstructure"
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// Node represents a back-end device, usually a virtual machine, that can
-// handle traffic. It is assigned traffic based on its parent load balancer.
-type Node struct {
-	// The IP address or CIDR for this back-end node.
-	Address string
-
-	// The unique ID for this node.
-	ID int
-
-	// The port on which traffic is sent and received.
-	Port int
-
-	// The node's status.
-	Status Status
-
-	// The node's condition.
-	Condition Condition
-
-	// The priority at which this node will receive traffic if a weighted
-	// algorithm is used by its parent load balancer. Ranges from 1 to 100.
-	Weight int
-
-	// Type of node.
-	Type Type
-}
-
-// Type indicates whether the node is of a PRIMARY or SECONDARY nature.
-type Type string
-
-const (
-	// PRIMARY nodes are in the normal rotation to receive traffic from the load
-	// balancer.
-	PRIMARY Type = "PRIMARY"
-
-	// SECONDARY nodes are only in the rotation to receive traffic from the load
-	// balancer when all the primary nodes fail. This provides a failover feature
-	// that automatically routes traffic to the secondary node in the event that
-	// the primary node is disabled or in a failing state. Note that active
-	// health monitoring must be enabled on the load balancer to enable the
-	// failover feature to the secondary node.
-	SECONDARY Type = "SECONDARY"
-)
-
-// Condition represents the condition of a node.
-type Condition string
-
-const (
-	// ENABLED indicates that the node is permitted to accept new connections.
-	ENABLED Condition = "ENABLED"
-
-	// DISABLED indicates that the node is not permitted to accept any new
-	// connections regardless of session persistence configuration. Existing
-	// connections are forcibly terminated.
-	DISABLED Condition = "DISABLED"
-
-	// DRAINING indicates that the node is allowed to service existing
-	// established connections and connections that are being directed to it as a
-	// result of the session persistence configuration.
-	DRAINING Condition = "DRAINING"
-)
-
-// Status indicates whether the node can accept service traffic. If a node is
-// not listening on its port or does not meet the conditions of the defined
-// active health check for the load balancer, then the load balancer does not
-// forward connections, and its status is listed as OFFLINE.
-type Status string
-
-const (
-	// ONLINE indicates that the node is healthy and capable of receiving traffic
-	// from the load balancer.
-	ONLINE Status = "ONLINE"
-
-	// OFFLINE indicates that the node is not in a position to receive service
-	// traffic. It is usually switched into this state when a health check is not
-	// satisfied with the node's response time.
-	OFFLINE Status = "OFFLINE"
-)
-
-// NodePage is the page returned by a pager when traversing over a collection
-// of nodes.
-type NodePage struct {
-	pagination.SinglePageBase
-}
-
-// IsEmpty checks whether a NodePage struct is empty.
-func (p NodePage) IsEmpty() (bool, error) {
-	is, err := ExtractNodes(p)
-	if err != nil {
-		return true, nil
-	}
-	return len(is) == 0, nil
-}
-
-func commonExtractNodes(body interface{}) ([]Node, error) {
-	var resp struct {
-		Nodes []Node `mapstructure:"nodes" json:"nodes"`
-	}
-
-	err := mapstructure.Decode(body, &resp)
-
-	return resp.Nodes, err
-}
-
-// ExtractNodes accepts a Page struct, specifically a NodePage struct, and
-// extracts the elements into a slice of Node structs. In other words, a
-// generic collection is mapped into a relevant slice.
-func ExtractNodes(page pagination.Page) ([]Node, error) {
-	return commonExtractNodes(page.(NodePage).Body)
-}
-
-// CreateResult represents the result of a create operation. Since multiple
-// nodes can be added in one operation, this result represents multiple nodes
-// and should be treated as a typical pagination Page. Use its ExtractNodes
-// method to get out a slice of Node structs.
-type CreateResult struct {
-	pagination.SinglePageBase
-}
-
-// ExtractNodes extracts a slice of Node structs from a CreateResult.
-func (res CreateResult) ExtractNodes() ([]Node, error) {
-	if res.Err != nil {
-		return nil, res.Err
-	}
-	return commonExtractNodes(res.Body)
-}
-
-// DeleteResult represents the result of a delete operation.
-type DeleteResult struct {
-	gophercloud.ErrResult
-}
-
-type commonResult struct {
-	gophercloud.Result
-}
-
-// GetResult represents the result of a get operation.
-type GetResult struct {
-	commonResult
-}
-
-// UpdateResult represents the result of an update operation.
-type UpdateResult struct {
-	gophercloud.ErrResult
-}
-
-func (r commonResult) Extract() (*Node, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-
-	var response struct {
-		Node Node `mapstructure:"node"`
-	}
-
-	err := mapstructure.Decode(r.Body, &response)
-
-	return &response.Node, err
-}
-
-// NodeEvent represents a service event that occurred between a node and a
-// load balancer.
-type NodeEvent struct {
-	ID              int
-	DetailedMessage string
-	NodeID          int
-	Type            string
-	Description     string
-	Category        string
-	Severity        string
-	RelativeURI     string
-	AccountID       int
-	LoadBalancerID  int
-	Title           string
-	Author          string
-	Created         string
-}
-
-// NodeEventPage is a concrete type which embeds the common SinglePageBase
-// struct, and is used when traversing node event collections.
-type NodeEventPage struct {
-	pagination.SinglePageBase
-}
-
-// IsEmpty is a concrete function which indicates whether an NodeEventPage is
-// empty or not.
-func (r NodeEventPage) IsEmpty() (bool, error) {
-	is, err := ExtractNodeEvents(r)
-	if err != nil {
-		return true, err
-	}
-	return len(is) == 0, nil
-}
-
-// ExtractNodeEvents accepts a Page struct, specifically a NodeEventPage
-// struct, and extracts the elements into a slice of NodeEvent structs. In
-// other words, the collection is mapped into a relevant slice.
-func ExtractNodeEvents(page pagination.Page) ([]NodeEvent, error) {
-	var resp struct {
-		Events []NodeEvent `mapstructure:"nodeServiceEvents" json:"nodeServiceEvents"`
-	}
-
-	err := mapstructure.Decode(page.(NodeEventPage).Body, &resp)
-
-	return resp.Events, err
-}
diff --git a/rackspace/lb/v1/nodes/urls.go b/rackspace/lb/v1/nodes/urls.go
deleted file mode 100644
index 2cefee2..0000000
--- a/rackspace/lb/v1/nodes/urls.go
+++ /dev/null
@@ -1,25 +0,0 @@
-package nodes
-
-import (
-	"strconv"
-
-	"github.com/rackspace/gophercloud"
-)
-
-const (
-	lbPath    = "loadbalancers"
-	nodePath  = "nodes"
-	eventPath = "events"
-)
-
-func resourceURL(c *gophercloud.ServiceClient, lbID, nodeID int) string {
-	return c.ServiceURL(lbPath, strconv.Itoa(lbID), nodePath, strconv.Itoa(nodeID))
-}
-
-func rootURL(c *gophercloud.ServiceClient, lbID int) string {
-	return c.ServiceURL(lbPath, strconv.Itoa(lbID), nodePath)
-}
-
-func eventsURL(c *gophercloud.ServiceClient, lbID int) string {
-	return c.ServiceURL(lbPath, strconv.Itoa(lbID), nodePath, eventPath)
-}
diff --git a/rackspace/lb/v1/sessions/doc.go b/rackspace/lb/v1/sessions/doc.go
deleted file mode 100644
index dcec0a8..0000000
--- a/rackspace/lb/v1/sessions/doc.go
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
-Package sessions provides information and interaction with the Session
-Persistence feature of the Rackspace Cloud Load Balancer service.
-
-Session persistence is a feature of the load balancing service that forces
-multiple requests from clients (of the same protocol) to be directed to the
-same node. This is common with many web applications that do not inherently
-share application state between back-end servers.
-
-There are two modes to choose from: HTTP_COOKIE and SOURCE_IP. You can only set
-one of the session persistence modes on a load balancer, and it can only
-support one protocol. If you set HTTP_COOKIE mode for an HTTP load balancer, it
-supports session persistence for HTTP requests only. Likewise, if you set
-SOURCE_IP mode for an HTTPS load balancer, it supports session persistence for
-only HTTPS requests.
-
-To support session persistence for both HTTP and HTTPS requests concurrently,
-choose one of the following options:
-
-- Use two load balancers, one configured for session persistence for HTTP
-requests and the other configured for session persistence for HTTPS requests.
-That way, the load balancers support session persistence for both HTTP and
-HTTPS requests concurrently, with each load balancer supporting one of the
-protocols.
-
-- Use one load balancer, configure it for session persistence for HTTP requests,
-and then enable SSL termination for that load balancer. The load balancer
-supports session persistence for both HTTP and HTTPS requests concurrently.
-*/
-package sessions
diff --git a/rackspace/lb/v1/sessions/fixtures.go b/rackspace/lb/v1/sessions/fixtures.go
deleted file mode 100644
index 077ef04..0000000
--- a/rackspace/lb/v1/sessions/fixtures.go
+++ /dev/null
@@ -1,59 +0,0 @@
-package sessions
-
-import (
-	"fmt"
-	"net/http"
-	"strconv"
-	"testing"
-
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func _rootURL(id int) string {
-	return "/loadbalancers/" + strconv.Itoa(id) + "/sessionpersistence"
-}
-
-func mockGetResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-  "sessionPersistence": {
-    "persistenceType": "HTTP_COOKIE"
-  }
-}
-`)
-	})
-}
-
-func mockEnableResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "PUT")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		th.TestJSONRequest(t, r, `
-{
-  "sessionPersistence": {
-    "persistenceType": "HTTP_COOKIE"
-  }
-}
-    `)
-
-		w.WriteHeader(http.StatusAccepted)
-		fmt.Fprintf(w, `{}`)
-	})
-}
-
-func mockDisableResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		w.WriteHeader(http.StatusAccepted)
-	})
-}
diff --git a/rackspace/lb/v1/sessions/requests.go b/rackspace/lb/v1/sessions/requests.go
deleted file mode 100644
index a93d766..0000000
--- a/rackspace/lb/v1/sessions/requests.go
+++ /dev/null
@@ -1,63 +0,0 @@
-package sessions
-
-import (
-	"errors"
-
-	"github.com/rackspace/gophercloud"
-)
-
-// CreateOptsBuilder is the interface options structs have to satisfy in order
-// to be used in the main Create operation in this package.
-type CreateOptsBuilder interface {
-	ToSPCreateMap() (map[string]interface{}, error)
-}
-
-// CreateOpts is the common options struct used in this package's Create
-// operation.
-type CreateOpts struct {
-	// Required - can either be HTTPCOOKIE or SOURCEIP
-	Type Type
-}
-
-// ToSPCreateMap casts a CreateOpts struct to a map.
-func (opts CreateOpts) ToSPCreateMap() (map[string]interface{}, error) {
-	sp := make(map[string]interface{})
-
-	if opts.Type == "" {
-		return sp, errors.New("Type is a required field")
-	}
-
-	sp["persistenceType"] = opts.Type
-	return map[string]interface{}{"sessionPersistence": sp}, nil
-}
-
-// Enable is the operation responsible for enabling session persistence for a
-// particular load balancer.
-func Enable(c *gophercloud.ServiceClient, lbID int, opts CreateOptsBuilder) EnableResult {
-	var res EnableResult
-
-	reqBody, err := opts.ToSPCreateMap()
-	if err != nil {
-		res.Err = err
-		return res
-	}
-
-	_, res.Err = c.Put(rootURL(c, lbID), reqBody, &res.Body, nil)
-	return res
-}
-
-// Get is the operation responsible for showing details of the session
-// persistence configuration for a particular load balancer.
-func Get(c *gophercloud.ServiceClient, lbID int) GetResult {
-	var res GetResult
-	_, res.Err = c.Get(rootURL(c, lbID), &res.Body, nil)
-	return res
-}
-
-// Disable is the operation responsible for disabling session persistence for a
-// particular load balancer.
-func Disable(c *gophercloud.ServiceClient, lbID int) DisableResult {
-	var res DisableResult
-	_, res.Err = c.Delete(rootURL(c, lbID), nil)
-	return res
-}
diff --git a/rackspace/lb/v1/sessions/requests_test.go b/rackspace/lb/v1/sessions/requests_test.go
deleted file mode 100644
index f319e54..0000000
--- a/rackspace/lb/v1/sessions/requests_test.go
+++ /dev/null
@@ -1,44 +0,0 @@
-package sessions
-
-import (
-	"testing"
-
-	th "github.com/rackspace/gophercloud/testhelper"
-	"github.com/rackspace/gophercloud/testhelper/client"
-)
-
-const lbID = 12345
-
-func TestEnable(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockEnableResponse(t, lbID)
-
-	opts := CreateOpts{Type: HTTPCOOKIE}
-	err := Enable(client.ServiceClient(), lbID, opts).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockGetResponse(t, lbID)
-
-	sp, err := Get(client.ServiceClient(), lbID).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := &SessionPersistence{Type: HTTPCOOKIE}
-	th.AssertDeepEquals(t, expected, sp)
-}
-
-func TestDisable(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockDisableResponse(t, lbID)
-
-	err := Disable(client.ServiceClient(), lbID).ExtractErr()
-	th.AssertNoErr(t, err)
-}
diff --git a/rackspace/lb/v1/sessions/results.go b/rackspace/lb/v1/sessions/results.go
deleted file mode 100644
index fe90e72..0000000
--- a/rackspace/lb/v1/sessions/results.go
+++ /dev/null
@@ -1,58 +0,0 @@
-package sessions
-
-import (
-	"github.com/mitchellh/mapstructure"
-
-	"github.com/rackspace/gophercloud"
-)
-
-// Type represents the type of session persistence being used.
-type Type string
-
-const (
-	// HTTPCOOKIE is a session persistence mechanism that inserts an HTTP cookie
-	// and is used to determine the destination back-end node. This is supported
-	// for HTTP load balancing only.
-	HTTPCOOKIE Type = "HTTP_COOKIE"
-
-	// SOURCEIP is a session persistence mechanism that keeps track of the source
-	// IP address that is mapped and is able to determine the destination
-	// back-end node. This is supported for HTTPS pass-through and non-HTTP load
-	// balancing only.
-	SOURCEIP Type = "SOURCE_IP"
-)
-
-// SessionPersistence indicates how a load balancer is using session persistence
-type SessionPersistence struct {
-	Type Type `mapstructure:"persistenceType"`
-}
-
-// EnableResult represents the result of an enable operation.
-type EnableResult struct {
-	gophercloud.ErrResult
-}
-
-// DisableResult represents the result of a disable operation.
-type DisableResult struct {
-	gophercloud.ErrResult
-}
-
-// GetResult represents the result of a get operation.
-type GetResult struct {
-	gophercloud.Result
-}
-
-// Extract interprets a GetResult as an SP, if possible.
-func (r GetResult) Extract() (*SessionPersistence, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-
-	var response struct {
-		SP SessionPersistence `mapstructure:"sessionPersistence"`
-	}
-
-	err := mapstructure.Decode(r.Body, &response)
-
-	return &response.SP, err
-}
diff --git a/rackspace/lb/v1/sessions/urls.go b/rackspace/lb/v1/sessions/urls.go
deleted file mode 100644
index c4a896d..0000000
--- a/rackspace/lb/v1/sessions/urls.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package sessions
-
-import (
-	"strconv"
-
-	"github.com/rackspace/gophercloud"
-)
-
-const (
-	path   = "loadbalancers"
-	spPath = "sessionpersistence"
-)
-
-func rootURL(c *gophercloud.ServiceClient, id int) string {
-	return c.ServiceURL(path, strconv.Itoa(id), spPath)
-}
diff --git a/rackspace/lb/v1/ssl/doc.go b/rackspace/lb/v1/ssl/doc.go
deleted file mode 100644
index 6a2c174..0000000
--- a/rackspace/lb/v1/ssl/doc.go
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
-Package ssl provides information and interaction with the SSL Termination
-feature of the Rackspace Cloud Load Balancer service.
-
-You may only enable and configure SSL termination on load balancers with
-non-secure protocols, such as HTTP, but not HTTPS.
-
-SSL-terminated load balancers decrypt the traffic at the traffic manager and
-pass unencrypted traffic to the back-end node. Because of this, the customer's
-back-end nodes don't know what protocol the client requested. For this reason,
-the X-Forwarded-Proto (XFP) header has been added for identifying the
-originating protocol of an HTTP request as "http" or "https" depending on what
-protocol the client requested.
-
-Not every service returns certificates in the proper order. Please verify that
-your chain of certificates matches that of walking up the chain from the domain
-to the CA root.
-
-If used for HTTP to HTTPS redirection, the LoadBalancer's securePort attribute
-must be set to 443, and its secureTrafficOnly attribute must be true.
-*/
-package ssl
diff --git a/rackspace/lb/v1/ssl/fixtures.go b/rackspace/lb/v1/ssl/fixtures.go
deleted file mode 100644
index 5a52962..0000000
--- a/rackspace/lb/v1/ssl/fixtures.go
+++ /dev/null
@@ -1,196 +0,0 @@
-package ssl
-
-import (
-	"fmt"
-	"net/http"
-	"strconv"
-	"testing"
-
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func _rootURL(id int) string {
-	return "/loadbalancers/" + strconv.Itoa(id) + "/ssltermination"
-}
-
-func _certURL(id, certID int) string {
-	url := _rootURL(id) + "/certificatemappings"
-	if certID > 0 {
-		url += "/" + strconv.Itoa(certID)
-	}
-	return url
-}
-
-func mockGetResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-  "sslTermination": {
-    "certificate": "-----BEGIN CERTIFICATE-----\nMIIEXTCCA0WgAwIBAgIGATTEAjK3MA0GCSqGSIb3DQEBBQUAMIGDMRkwFwYDVQQD\nExBUZXN0IENBIFNUdWIgS2V5MRcwFQYDVQQLEw5QbGF0Zm9ybSBMYmFhczEaMBgG\nA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFDASBgNVBAcTC1NhbiBBbnRvbmlvMQ4w\nDAYDVQQIEwVUZXhhczELMAkGA1UEBhMCVVMwHhcNMTIwMTA5MTk0NjQ1WhcNMTQw\nMTA4MTk0NjQ1WjCBgjELMAkGA1UEBhMCVVMxDjAMBgNVBAgTBVRleGFzMRQwEgYD\nVQQHEwtTYW4gQW50b25pbzEaMBgGA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFzAV\nBgNVBAsTDlBsYXRmb3JtIExiYWFzMRgwFgYDVQQDEw9UZXN0IENsaWVudCBLZXkw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAi51IylFnHtNLT8C0NVfc\nOBfAsP2D5es1qhrOWHCGlgAuDMksBsCc7FPo5PSBOmQ+6z8HtCFbrLoC5/Zx0F5b\nfVegjA+xKjI2HGASsYHHM0BFEH2UjUcJrWiMWtxQuW6Phbqulo7JwjmygMEmIkeK\nf+FtkE9mrq+E8K40/thrjxl3/ZcJD1+3dcp+ZuzVJ2t1E4iGKCx79IZFsysKiuf+\n+E0i6iGvvI6UcbcZxVxQj2TplJkFuoX5kDgClIX9Dr9y6aJ4SCh+GRhvHl+DTaz0\nnCvghachHZtIeztRDqxWApjOOzs93dSelrviMXDr8fqyEAGg7YIhgui0aZBsWCen\nAgMBAAGjgdUwgdIwgbAGA1UdIwSBqDCBpYAUNpx1Pc6cGA7KqEwHMmHBTZMA7lSh\ngYmkgYYwgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVU4IBATAd\nBgNVHQ4EFgQULueOfsjZZOHwJHZwBy6u0swnpccwDQYJKoZIhvcNAQEFBQADggEB\nAFNuqSVUaotUJoWDv4z7Kbi6JFpTjDht5ORw4BdVYlRD4h9DACAFzPrPV2ym/Osp\nhNMdZq6msZku7MdOSQVhdeGWrSNk3M8O9Hg7cVzPNXOF3iNoo3irQ5tURut44xs4\nWw5YWQqS9WyUY5snD8tm7Y1rQTPfhg+678xIq/zWCv/u+FSnfVv1nlhLVQkEeG/Y\ngh1uMaTIpUKTGEjIAGtpGP7wwIcXptR/HyfzhTUSTaWc1Ef7zoKT9LL5z3IV1hC2\njVWz+RwYs98LjMuksJFoHqRfWyYhCIym0jb6GTwaEmpxAjc+d7OLNQdnoEGoUYGP\nYjtfkRYg265ESMA+Kww4Xy8=\n-----END CERTIFICATE-----\n",
-    "enabled": true,
-    "secureTrafficOnly": false,
-    "intermediateCertificate": "-----BEGIN CERTIFICATE-----\nMIIDtTCCAp2gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzEZMBcGA1UEAxMQVGVz\ndCBDQSBTVHViIEtleTEXMBUGA1UECxMOUGxhdGZvcm0gTGJhYXMxGjAYBgNVBAoT\nEVJhY2tzcGFjZSBIb3N0aW5nMRQwEgYDVQQHEwtTYW4gQW50b25pbzEOMAwGA1UE\nCBMFVGV4YXMxCzAJBgNVBAYTAlVTMB4XDTEyMDEwOTE5NDU0OVoXDTE0MDEwODE5\nNDU0OVowgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVUzCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANNh55lwTVwQvNoEZjq1zGdYz9jA\nXXdjizn8AJhjHLOAallfPtvCfTEgKanhdoyz5FnhQE8HbDAop/KNS1lN2UMvdl5f\nZNLTSjJrNtedqxQwxN/i3bpyBxNVejUH2NjV1mmyj+5CJYwCzWalvI/gLPq/A3as\nO2EQqtf3U8unRgn0zXLRdYxV9MrUzNAmdipPNvNrsVdrCgA42rgF/8KsyRVQfJCX\nfN7PGCfrsC3YaUvhymraWxNnXIzMYTNa9wEeBZLUw8SlEtpa1Zsvui+TPXu3USNZ\nVnWH8Lb6ENlnoX0VBwo62fjOG3JzhNKoJawi3bRqyDdINOvafr7iPrrs/T8CAwEA\nAaMyMDAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUNpx1Pc6cGA7KqEwHMmHB\nTZMA7lQwDQYJKoZIhvcNAQEFBQADggEBAMoRgH3iTG3t317viLKoY+lNMHUgHuR7\nb3mn9MidJKyYVewe6hCDIN6WY4fUojmMW9wFJWJIo0hRMNHL3n3tq8HP2j20Mxy8\nacPdfGZJa+jiBw72CrIGdobKaFduIlIEDBA1pNdZIJ+EulrtqrMesnIt92WaypIS\n8JycbIgDMCiyC0ENHEk8UWlC6429c7OZAsplMTbHME/1R4btxjkdfrYZJjdJ2yL2\n8cjZDUDMCPTdW/ycP07Gkq30RB5tACB5aZdaCn2YaKC8FsEdhff4X7xEOfOEHWEq\nSRxADDj8Lx1MT6QpR07hCiDyHfTCtbqzI0iGjX63Oh7xXSa0f+JVTa8=\n-----END CERTIFICATE-----\n",
-    "securePort": 443
-  }
-}
-`)
-	})
-}
-
-func mockUpdateResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "PUT")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		th.TestJSONRequest(t, r, `
-{
-  "sslTermination": {
-    "enabled": true,
-    "securePort": 443,
-    "secureTrafficOnly": false,
-		"privateKey": "foo",
-		"certificate": "-----BEGIN CERTIFICATE-----\nMIIEXTCCA0WgAwIBAgIGATTEAjK3MA0GCSqGSIb3DQEBBQUAMIGDMRkwFwYDVQQD\nExBUZXN0IENBIFNUdWIgS2V5MRcwFQYDVQQLEw5QbGF0Zm9ybSBMYmFhczEaMBgG\nA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFDASBgNVBAcTC1NhbiBBbnRvbmlvMQ4w\nDAYDVQQIEwVUZXhhczELMAkGA1UEBhMCVVMwHhcNMTIwMTA5MTk0NjQ1WhcNMTQw\nMTA4MTk0NjQ1WjCBgjELMAkGA1UEBhMCVVMxDjAMBgNVBAgTBVRleGFzMRQwEgYD\nVQQHEwtTYW4gQW50b25pbzEaMBgGA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFzAV\nBgNVBAsTDlBsYXRmb3JtIExiYWFzMRgwFgYDVQQDEw9UZXN0IENsaWVudCBLZXkw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAi51IylFnHtNLT8C0NVfc\nOBfAsP2D5es1qhrOWHCGlgAuDMksBsCc7FPo5PSBOmQ+6z8HtCFbrLoC5/Zx0F5b\nfVegjA+xKjI2HGASsYHHM0BFEH2UjUcJrWiMWtxQuW6Phbqulo7JwjmygMEmIkeK\nf+FtkE9mrq+E8K40/thrjxl3/ZcJD1+3dcp+ZuzVJ2t1E4iGKCx79IZFsysKiuf+\n+E0i6iGvvI6UcbcZxVxQj2TplJkFuoX5kDgClIX9Dr9y6aJ4SCh+GRhvHl+DTaz0\nnCvghachHZtIeztRDqxWApjOOzs93dSelrviMXDr8fqyEAGg7YIhgui0aZBsWCen\nAgMBAAGjgdUwgdIwgbAGA1UdIwSBqDCBpYAUNpx1Pc6cGA7KqEwHMmHBTZMA7lSh\ngYmkgYYwgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVU4IBATAd\nBgNVHQ4EFgQULueOfsjZZOHwJHZwBy6u0swnpccwDQYJKoZIhvcNAQEFBQADggEB\nAFNuqSVUaotUJoWDv4z7Kbi6JFpTjDht5ORw4BdVYlRD4h9DACAFzPrPV2ym/Osp\nhNMdZq6msZku7MdOSQVhdeGWrSNk3M8O9Hg7cVzPNXOF3iNoo3irQ5tURut44xs4\nWw5YWQqS9WyUY5snD8tm7Y1rQTPfhg+678xIq/zWCv/u+FSnfVv1nlhLVQkEeG/Y\ngh1uMaTIpUKTGEjIAGtpGP7wwIcXptR/HyfzhTUSTaWc1Ef7zoKT9LL5z3IV1hC2\njVWz+RwYs98LjMuksJFoHqRfWyYhCIym0jb6GTwaEmpxAjc+d7OLNQdnoEGoUYGP\nYjtfkRYg265ESMA+Kww4Xy8=\n-----END CERTIFICATE-----\n",
-  	"intermediateCertificate": "-----BEGIN CERTIFICATE-----\nMIIDtTCCAp2gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzEZMBcGA1UEAxMQVGVz\ndCBDQSBTVHViIEtleTEXMBUGA1UECxMOUGxhdGZvcm0gTGJhYXMxGjAYBgNVBAoT\nEVJhY2tzcGFjZSBIb3N0aW5nMRQwEgYDVQQHEwtTYW4gQW50b25pbzEOMAwGA1UE\nCBMFVGV4YXMxCzAJBgNVBAYTAlVTMB4XDTEyMDEwOTE5NDU0OVoXDTE0MDEwODE5\nNDU0OVowgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVUzCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANNh55lwTVwQvNoEZjq1zGdYz9jA\nXXdjizn8AJhjHLOAallfPtvCfTEgKanhdoyz5FnhQE8HbDAop/KNS1lN2UMvdl5f\nZNLTSjJrNtedqxQwxN/i3bpyBxNVejUH2NjV1mmyj+5CJYwCzWalvI/gLPq/A3as\nO2EQqtf3U8unRgn0zXLRdYxV9MrUzNAmdipPNvNrsVdrCgA42rgF/8KsyRVQfJCX\nfN7PGCfrsC3YaUvhymraWxNnXIzMYTNa9wEeBZLUw8SlEtpa1Zsvui+TPXu3USNZ\nVnWH8Lb6ENlnoX0VBwo62fjOG3JzhNKoJawi3bRqyDdINOvafr7iPrrs/T8CAwEA\nAaMyMDAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUNpx1Pc6cGA7KqEwHMmHB\nTZMA7lQwDQYJKoZIhvcNAQEFBQADggEBAMoRgH3iTG3t317viLKoY+lNMHUgHuR7\nb3mn9MidJKyYVewe6hCDIN6WY4fUojmMW9wFJWJIo0hRMNHL3n3tq8HP2j20Mxy8\nacPdfGZJa+jiBw72CrIGdobKaFduIlIEDBA1pNdZIJ+EulrtqrMesnIt92WaypIS\n8JycbIgDMCiyC0ENHEk8UWlC6429c7OZAsplMTbHME/1R4btxjkdfrYZJjdJ2yL2\n8cjZDUDMCPTdW/ycP07Gkq30RB5tACB5aZdaCn2YaKC8FsEdhff4X7xEOfOEHWEq\nSRxADDj8Lx1MT6QpR07hCiDyHfTCtbqzI0iGjX63Oh7xXSa0f+JVTa8=\n-----END CERTIFICATE-----\n"
-	}
-}
-    `)
-
-		w.WriteHeader(http.StatusOK)
-		fmt.Fprintf(w, `{}`)
-	})
-}
-
-func mockDeleteResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		w.WriteHeader(http.StatusOK)
-	})
-}
-
-func mockListCertsResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_certURL(lbID, 0), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-  "certificateMappings": [
-    {
-      "certificateMapping": {
-        "id": 123,
-        "hostName": "rackspace.com"
-      }
-    },
-    {
-      "certificateMapping": {
-        "id": 124,
-        "hostName": "*.rackspace.com"
-      }
-    }
-  ]
-}
-`)
-	})
-}
-
-func mockAddCertResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_certURL(lbID, 0), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "POST")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		th.TestJSONRequest(t, r, `
-{
-  "certificateMapping": {
-    "hostName": "rackspace.com",
-    "privateKey":"-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAwIudSMpRZx7TS0/AtDVX3DgXwLD9g+XrNaoazlhwhpYALgzJ\nLAbAnOxT6OT0gTpkPus/B7QhW6y6Auf2cdBeW31XoIwPsSoyNhxgErGBxzNARRB9\nlI1HCa1ojFrcULluj4W6rpaOycI5soDBJiJHin/hbZBPZq6vhPCuNP7Ya48Zd/2X\nCQ9ft3XKfmbs1SdrdROIhigse/SGRbMrCorn/vhNIuohr7yOlHG3GcVcUI9k6ZSZ\nBbqF+ZA4ApSF/Q6/cumieEgofhkYbx5fg02s9Jwr4IWnIR2bSHs7UQ6sVgKYzjs7\nPd3Unpa74jFw6/H6shABoO2CIYLotGmQbFgnpwIDAQABAoIBAQCBCQ+PCIclJHNV\ntUzfeCA5ZR4F9JbxHdRTUnxEbOB8UWotckQfTScoAvj4yvdQ42DrCZxj/UOdvFOs\nPufZvlp91bIz1alugWjE+p8n5+2hIaegoTyHoWZKBfxak0myj5KYfHZvKlbmv1ML\nXV4TwEVRfAIG+v87QTY/UUxuF5vR+BpKIbgUJLfPUFFvJUdl84qsJ44pToxaYUd/\nh5YAGC00U4ay1KVSAUnTkkPNZ0lPG/rWU6w6WcTvNRLMd8DzFLTKLOgQfHhbExAF\n+sXPWjWSzbBRP1O7fHqq96QQh4VFiY/7w9W+sDKQyV6Ul17OSXs6aZ4f+lq4rJTI\n1FG96YiBAoGBAO1tiH0h1oWDBYfJB3KJJ6CQQsDGwtHo/DEgznFVP4XwEVbZ98Ha\nBfBCn3sAybbaikyCV1Hwj7kfHMZPDHbrcUSFX7quu/2zPK+wO3lZKXSyu4YsguSa\nRedInN33PpdnlPhLyQdWSuD5sVHJDF6xn22vlyxeILH3ooLg2WOFMPmVAoGBAM+b\nUG/a7iyfpAQKYyuFAsXz6SeFaDY+ZYeX45L112H8Pu+Ie/qzon+bzLB9FIH8GP6+\nQpQgmm/p37U2gD1zChUv7iW6OfQBKk9rWvMpfRF6d7YHquElejhizfTZ+ntBV/VY\ndOYEczxhrdW7keLpatYaaWUy/VboRZmlz/9JGqVLAoGAHfqNmFc0cgk4IowEj7a3\ntTNh6ltub/i+FynwRykfazcDyXaeLPDtfQe8gVh5H8h6W+y9P9BjJVnDVVrX1RAn\nbiJ1EupLPF5sVDapW8ohTOXgfbGTGXBNUUW+4Nv+IDno+mz/RhjkPYHpnM0I7c/5\ntGzOZsC/2hjNgT8I0+MWav0CgYEAuULdJeQVlKalI6HtW2Gn1uRRVJ49H+LQkY6e\nW3+cw2jo9LI0CMWSphNvNrN3wIMp/vHj0fHCP0pSApDvIWbuQXfzKaGko7UCf7rK\nf6GvZRCHkV4IREBAb97j8bMvThxClMNqFfU0rFZyXP+0MOyhFQyertswrgQ6T+Fi\n2mnvKD8CgYAmJHP3NTDRMoMRyAzonJ6nEaGUbAgNmivTaUWMe0+leCvAdwD89gzC\nTKbm3eDUg/6Va3X6ANh3wsfIOe4RXXxcbcFDk9R4zO2M5gfLSjYm5Q87EBZ2hrdj\nM2gLI7dt6thx0J8lR8xRHBEMrVBdgwp0g1gQzo5dAV88/kpkZVps8Q==\n-----END RSA PRIVATE KEY-----\n",
-    "certificate":"-----BEGIN CERTIFICATE-----\nMIIEXTCCA0WgAwIBAgIGATTEAjK3MA0GCSqGSIb3DQEBBQUAMIGDMRkwFwYDVQQD\nExBUZXN0IENBIFNUdWIgS2V5MRcwFQYDVQQLEw5QbGF0Zm9ybSBMYmFhczEaMBgG\nA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFDASBgNVBAcTC1NhbiBBbnRvbmlvMQ4w\nDAYDVQQIEwVUZXhhczELMAkGA1UEBhMCVVMwHhcNMTIwMTA5MTk0NjQ1WhcNMTQw\nMTA4MTk0NjQ1WjCBgjELMAkGA1UEBhMCVVMxDjAMBgNVBAgTBVRleGFzMRQwEgYD\nVQQHEwtTYW4gQW50b25pbzEaMBgGA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFzAV\nBgNVBAsTDlBsYXRmb3JtIExiYWFzMRgwFgYDVQQDEw9UZXN0IENsaWVudCBLZXkw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAi51IylFnHtNLT8C0NVfc\nOBfAsP2D5es1qhrOWHCGlgAuDMksBsCc7FPo5PSBOmQ+6z8HtCFbrLoC5/Zx0F5b\nfVegjA+xKjI2HGASsYHHM0BFEH2UjUcJrWiMWtxQuW6Phbqulo7JwjmygMEmIkeK\nf+FtkE9mrq+E8K40/thrjxl3/ZcJD1+3dcp+ZuzVJ2t1E4iGKCx79IZFsysKiuf+\n+E0i6iGvvI6UcbcZxVxQj2TplJkFuoX5kDgClIX9Dr9y6aJ4SCh+GRhvHl+DTaz0\nnCvghachHZtIeztRDqxWApjOOzs93dSelrviMXDr8fqyEAGg7YIhgui0aZBsWCen\nAgMBAAGjgdUwgdIwgbAGA1UdIwSBqDCBpYAUNpx1Pc6cGA7KqEwHMmHBTZMA7lSh\ngYmkgYYwgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVU4IBATAd\nBgNVHQ4EFgQULueOfsjZZOHwJHZwBy6u0swnpccwDQYJKoZIhvcNAQEFBQADggEB\nAFNuqSVUaotUJoWDv4z7Kbi6JFpTjDht5ORw4BdVYlRD4h9DACAFzPrPV2ym/Osp\nhNMdZq6msZku7MdOSQVhdeGWrSNk3M8O9Hg7cVzPNXOF3iNoo3irQ5tURut44xs4\nWw5YWQqS9WyUY5snD8tm7Y1rQTPfhg+678xIq/zWCv/u+FSnfVv1nlhLVQkEeG/Y\ngh1uMaTIpUKTGEjIAGtpGP7wwIcXptR/HyfzhTUSTaWc1Ef7zoKT9LL5z3IV1hC2\njVWz+RwYs98LjMuksJFoHqRfWyYhCIym0jb6GTwaEmpxAjc+d7OLNQdnoEGoUYGP\nYjtfkRYg265ESMA+Kww4Xy8=\n-----END CERTIFICATE-----\n",
-    "intermediateCertificate":"-----BEGIN CERTIFICATE-----\nMIIDtTCCAp2gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzEZMBcGA1UEAxMQVGVz\ndCBDQSBTVHViIEtleTEXMBUGA1UECxMOUGxhdGZvcm0gTGJhYXMxGjAYBgNVBAoT\nEVJhY2tzcGFjZSBIb3N0aW5nMRQwEgYDVQQHEwtTYW4gQW50b25pbzEOMAwGA1UE\nCBMFVGV4YXMxCzAJBgNVBAYTAlVTMB4XDTEyMDEwOTE5NDU0OVoXDTE0MDEwODE5\nNDU0OVowgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVUzCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANNh55lwTVwQvNoEZjq1zGdYz9jA\nXXdjizn8AJhjHLOAallfPtvCfTEgKanhdoyz5FnhQE8HbDAop/KNS1lN2UMvdl5f\nZNLTSjJrNtedqxQwxN/i3bpyBxNVejUH2NjV1mmyj+5CJYwCzWalvI/gLPq/A3as\nO2EQqtf3U8unRgn0zXLRdYxV9MrUzNAmdipPNvNrsVdrCgA42rgF/8KsyRVQfJCX\nfN7PGCfrsC3YaUvhymraWxNnXIzMYTNa9wEeBZLUw8SlEtpa1Zsvui+TPXu3USNZ\nVnWH8Lb6ENlnoX0VBwo62fjOG3JzhNKoJawi3bRqyDdINOvafr7iPrrs/T8CAwEA\nAaMyMDAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUNpx1Pc6cGA7KqEwHMmHB\nTZMA7lQwDQYJKoZIhvcNAQEFBQADggEBAMoRgH3iTG3t317viLKoY+lNMHUgHuR7\nb3mn9MidJKyYVewe6hCDIN6WY4fUojmMW9wFJWJIo0hRMNHL3n3tq8HP2j20Mxy8\nacPdfGZJa+jiBw72CrIGdobKaFduIlIEDBA1pNdZIJ+EulrtqrMesnIt92WaypIS\n8JycbIgDMCiyC0ENHEk8UWlC6429c7OZAsplMTbHME/1R4btxjkdfrYZJjdJ2yL2\n8cjZDUDMCPTdW/ycP07Gkq30RB5tACB5aZdaCn2YaKC8FsEdhff4X7xEOfOEHWEq\nSRxADDj8Lx1MT6QpR07hCiDyHfTCtbqzI0iGjX63Oh7xXSa0f+JVTa8=\n-----END CERTIFICATE-----\n"
-  }
-}
-		`)
-
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-	"certificateMapping": {
-		"id": 123,
-		"hostName": "rackspace.com",
-		"certificate":"-----BEGIN CERTIFICATE-----\nMIIEXTCCA0WgAwIBAgIGATTEAjK3MA0GCSqGSIb3DQEBBQUAMIGDMRkwFwYDVQQD\nExBUZXN0IENBIFNUdWIgS2V5MRcwFQYDVQQLEw5QbGF0Zm9ybSBMYmFhczEaMBgG\nA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFDASBgNVBAcTC1NhbiBBbnRvbmlvMQ4w\nDAYDVQQIEwVUZXhhczELMAkGA1UEBhMCVVMwHhcNMTIwMTA5MTk0NjQ1WhcNMTQw\nMTA4MTk0NjQ1WjCBgjELMAkGA1UEBhMCVVMxDjAMBgNVBAgTBVRleGFzMRQwEgYD\nVQQHEwtTYW4gQW50b25pbzEaMBgGA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFzAV\nBgNVBAsTDlBsYXRmb3JtIExiYWFzMRgwFgYDVQQDEw9UZXN0IENsaWVudCBLZXkw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAi51IylFnHtNLT8C0NVfc\nOBfAsP2D5es1qhrOWHCGlgAuDMksBsCc7FPo5PSBOmQ+6z8HtCFbrLoC5/Zx0F5b\nfVegjA+xKjI2HGASsYHHM0BFEH2UjUcJrWiMWtxQuW6Phbqulo7JwjmygMEmIkeK\nf+FtkE9mrq+E8K40/thrjxl3/ZcJD1+3dcp+ZuzVJ2t1E4iGKCx79IZFsysKiuf+\n+E0i6iGvvI6UcbcZxVxQj2TplJkFuoX5kDgClIX9Dr9y6aJ4SCh+GRhvHl+DTaz0\nnCvghachHZtIeztRDqxWApjOOzs93dSelrviMXDr8fqyEAGg7YIhgui0aZBsWCen\nAgMBAAGjgdUwgdIwgbAGA1UdIwSBqDCBpYAUNpx1Pc6cGA7KqEwHMmHBTZMA7lSh\ngYmkgYYwgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVU4IBATAd\nBgNVHQ4EFgQULueOfsjZZOHwJHZwBy6u0swnpccwDQYJKoZIhvcNAQEFBQADggEB\nAFNuqSVUaotUJoWDv4z7Kbi6JFpTjDht5ORw4BdVYlRD4h9DACAFzPrPV2ym/Osp\nhNMdZq6msZku7MdOSQVhdeGWrSNk3M8O9Hg7cVzPNXOF3iNoo3irQ5tURut44xs4\nWw5YWQqS9WyUY5snD8tm7Y1rQTPfhg+678xIq/zWCv/u+FSnfVv1nlhLVQkEeG/Y\ngh1uMaTIpUKTGEjIAGtpGP7wwIcXptR/HyfzhTUSTaWc1Ef7zoKT9LL5z3IV1hC2\njVWz+RwYs98LjMuksJFoHqRfWyYhCIym0jb6GTwaEmpxAjc+d7OLNQdnoEGoUYGP\nYjtfkRYg265ESMA+Kww4Xy8=\n-----END CERTIFICATE-----\n",
-		"intermediateCertificate":"-----BEGIN CERTIFICATE-----\nMIIDtTCCAp2gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzEZMBcGA1UEAxMQVGVz\ndCBDQSBTVHViIEtleTEXMBUGA1UECxMOUGxhdGZvcm0gTGJhYXMxGjAYBgNVBAoT\nEVJhY2tzcGFjZSBIb3N0aW5nMRQwEgYDVQQHEwtTYW4gQW50b25pbzEOMAwGA1UE\nCBMFVGV4YXMxCzAJBgNVBAYTAlVTMB4XDTEyMDEwOTE5NDU0OVoXDTE0MDEwODE5\nNDU0OVowgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVUzCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANNh55lwTVwQvNoEZjq1zGdYz9jA\nXXdjizn8AJhjHLOAallfPtvCfTEgKanhdoyz5FnhQE8HbDAop/KNS1lN2UMvdl5f\nZNLTSjJrNtedqxQwxN/i3bpyBxNVejUH2NjV1mmyj+5CJYwCzWalvI/gLPq/A3as\nO2EQqtf3U8unRgn0zXLRdYxV9MrUzNAmdipPNvNrsVdrCgA42rgF/8KsyRVQfJCX\nfN7PGCfrsC3YaUvhymraWxNnXIzMYTNa9wEeBZLUw8SlEtpa1Zsvui+TPXu3USNZ\nVnWH8Lb6ENlnoX0VBwo62fjOG3JzhNKoJawi3bRqyDdINOvafr7iPrrs/T8CAwEA\nAaMyMDAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUNpx1Pc6cGA7KqEwHMmHB\nTZMA7lQwDQYJKoZIhvcNAQEFBQADggEBAMoRgH3iTG3t317viLKoY+lNMHUgHuR7\nb3mn9MidJKyYVewe6hCDIN6WY4fUojmMW9wFJWJIo0hRMNHL3n3tq8HP2j20Mxy8\nacPdfGZJa+jiBw72CrIGdobKaFduIlIEDBA1pNdZIJ+EulrtqrMesnIt92WaypIS\n8JycbIgDMCiyC0ENHEk8UWlC6429c7OZAsplMTbHME/1R4btxjkdfrYZJjdJ2yL2\n8cjZDUDMCPTdW/ycP07Gkq30RB5tACB5aZdaCn2YaKC8FsEdhff4X7xEOfOEHWEq\nSRxADDj8Lx1MT6QpR07hCiDyHfTCtbqzI0iGjX63Oh7xXSa0f+JVTa8=\n-----END CERTIFICATE-----\n"
-	}
-}
-			`)
-	})
-}
-
-func mockGetCertResponse(t *testing.T, lbID, certID int) {
-	th.Mux.HandleFunc(_certURL(lbID, certID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-  "certificateMapping": {
-    "id": 123,
-    "hostName": "rackspace.com",
-    "certificate":"-----BEGIN CERTIFICATE-----\nMIIEXTCCA0WgAwIBAgIGATTEAjK3MA0GCSqGSIb3DQEBBQUAMIGDMRkwFwYDVQQD\nExBUZXN0IENBIFNUdWIgS2V5MRcwFQYDVQQLEw5QbGF0Zm9ybSBMYmFhczEaMBgG\nA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFDASBgNVBAcTC1NhbiBBbnRvbmlvMQ4w\nDAYDVQQIEwVUZXhhczELMAkGA1UEBhMCVVMwHhcNMTIwMTA5MTk0NjQ1WhcNMTQw\nMTA4MTk0NjQ1WjCBgjELMAkGA1UEBhMCVVMxDjAMBgNVBAgTBVRleGFzMRQwEgYD\nVQQHEwtTYW4gQW50b25pbzEaMBgGA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFzAV\nBgNVBAsTDlBsYXRmb3JtIExiYWFzMRgwFgYDVQQDEw9UZXN0IENsaWVudCBLZXkw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAi51IylFnHtNLT8C0NVfc\nOBfAsP2D5es1qhrOWHCGlgAuDMksBsCc7FPo5PSBOmQ+6z8HtCFbrLoC5/Zx0F5b\nfVegjA+xKjI2HGASsYHHM0BFEH2UjUcJrWiMWtxQuW6Phbqulo7JwjmygMEmIkeK\nf+FtkE9mrq+E8K40/thrjxl3/ZcJD1+3dcp+ZuzVJ2t1E4iGKCx79IZFsysKiuf+\n+E0i6iGvvI6UcbcZxVxQj2TplJkFuoX5kDgClIX9Dr9y6aJ4SCh+GRhvHl+DTaz0\nnCvghachHZtIeztRDqxWApjOOzs93dSelrviMXDr8fqyEAGg7YIhgui0aZBsWCen\nAgMBAAGjgdUwgdIwgbAGA1UdIwSBqDCBpYAUNpx1Pc6cGA7KqEwHMmHBTZMA7lSh\ngYmkgYYwgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVU4IBATAd\nBgNVHQ4EFgQULueOfsjZZOHwJHZwBy6u0swnpccwDQYJKoZIhvcNAQEFBQADggEB\nAFNuqSVUaotUJoWDv4z7Kbi6JFpTjDht5ORw4BdVYlRD4h9DACAFzPrPV2ym/Osp\nhNMdZq6msZku7MdOSQVhdeGWrSNk3M8O9Hg7cVzPNXOF3iNoo3irQ5tURut44xs4\nWw5YWQqS9WyUY5snD8tm7Y1rQTPfhg+678xIq/zWCv/u+FSnfVv1nlhLVQkEeG/Y\ngh1uMaTIpUKTGEjIAGtpGP7wwIcXptR/HyfzhTUSTaWc1Ef7zoKT9LL5z3IV1hC2\njVWz+RwYs98LjMuksJFoHqRfWyYhCIym0jb6GTwaEmpxAjc+d7OLNQdnoEGoUYGP\nYjtfkRYg265ESMA+Kww4Xy8=\n-----END CERTIFICATE-----\n",
-    "intermediateCertificate":"-----BEGIN CERTIFICATE-----\nMIIDtTCCAp2gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzEZMBcGA1UEAxMQVGVz\ndCBDQSBTVHViIEtleTEXMBUGA1UECxMOUGxhdGZvcm0gTGJhYXMxGjAYBgNVBAoT\nEVJhY2tzcGFjZSBIb3N0aW5nMRQwEgYDVQQHEwtTYW4gQW50b25pbzEOMAwGA1UE\nCBMFVGV4YXMxCzAJBgNVBAYTAlVTMB4XDTEyMDEwOTE5NDU0OVoXDTE0MDEwODE5\nNDU0OVowgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVUzCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANNh55lwTVwQvNoEZjq1zGdYz9jA\nXXdjizn8AJhjHLOAallfPtvCfTEgKanhdoyz5FnhQE8HbDAop/KNS1lN2UMvdl5f\nZNLTSjJrNtedqxQwxN/i3bpyBxNVejUH2NjV1mmyj+5CJYwCzWalvI/gLPq/A3as\nO2EQqtf3U8unRgn0zXLRdYxV9MrUzNAmdipPNvNrsVdrCgA42rgF/8KsyRVQfJCX\nfN7PGCfrsC3YaUvhymraWxNnXIzMYTNa9wEeBZLUw8SlEtpa1Zsvui+TPXu3USNZ\nVnWH8Lb6ENlnoX0VBwo62fjOG3JzhNKoJawi3bRqyDdINOvafr7iPrrs/T8CAwEA\nAaMyMDAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUNpx1Pc6cGA7KqEwHMmHB\nTZMA7lQwDQYJKoZIhvcNAQEFBQADggEBAMoRgH3iTG3t317viLKoY+lNMHUgHuR7\nb3mn9MidJKyYVewe6hCDIN6WY4fUojmMW9wFJWJIo0hRMNHL3n3tq8HP2j20Mxy8\nacPdfGZJa+jiBw72CrIGdobKaFduIlIEDBA1pNdZIJ+EulrtqrMesnIt92WaypIS\n8JycbIgDMCiyC0ENHEk8UWlC6429c7OZAsplMTbHME/1R4btxjkdfrYZJjdJ2yL2\n8cjZDUDMCPTdW/ycP07Gkq30RB5tACB5aZdaCn2YaKC8FsEdhff4X7xEOfOEHWEq\nSRxADDj8Lx1MT6QpR07hCiDyHfTCtbqzI0iGjX63Oh7xXSa0f+JVTa8=\n-----END CERTIFICATE-----\n"
-  }
-}
-`)
-	})
-}
-
-func mockUpdateCertResponse(t *testing.T, lbID, certID int) {
-	th.Mux.HandleFunc(_certURL(lbID, certID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "PUT")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		th.TestJSONRequest(t, r, `
-{
-  "certificateMapping": {
-    "hostName": "rackspace.com",
-    "privateKey":"-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAwIudSMpRZx7TS0/AtDVX3DgXwLD9g+XrNaoazlhwhpYALgzJ\nLAbAnOxT6OT0gTpkPus/B7QhW6y6Auf2cdBeW31XoIwPsSoyNhxgErGBxzNARRB9\nlI1HCa1ojFrcULluj4W6rpaOycI5soDBJiJHin/hbZBPZq6vhPCuNP7Ya48Zd/2X\nCQ9ft3XKfmbs1SdrdROIhigse/SGRbMrCorn/vhNIuohr7yOlHG3GcVcUI9k6ZSZ\nBbqF+ZA4ApSF/Q6/cumieEgofhkYbx5fg02s9Jwr4IWnIR2bSHs7UQ6sVgKYzjs7\nPd3Unpa74jFw6/H6shABoO2CIYLotGmQbFgnpwIDAQABAoIBAQCBCQ+PCIclJHNV\ntUzfeCA5ZR4F9JbxHdRTUnxEbOB8UWotckQfTScoAvj4yvdQ42DrCZxj/UOdvFOs\nPufZvlp91bIz1alugWjE+p8n5+2hIaegoTyHoWZKBfxak0myj5KYfHZvKlbmv1ML\nXV4TwEVRfAIG+v87QTY/UUxuF5vR+BpKIbgUJLfPUFFvJUdl84qsJ44pToxaYUd/\nh5YAGC00U4ay1KVSAUnTkkPNZ0lPG/rWU6w6WcTvNRLMd8DzFLTKLOgQfHhbExAF\n+sXPWjWSzbBRP1O7fHqq96QQh4VFiY/7w9W+sDKQyV6Ul17OSXs6aZ4f+lq4rJTI\n1FG96YiBAoGBAO1tiH0h1oWDBYfJB3KJJ6CQQsDGwtHo/DEgznFVP4XwEVbZ98Ha\nBfBCn3sAybbaikyCV1Hwj7kfHMZPDHbrcUSFX7quu/2zPK+wO3lZKXSyu4YsguSa\nRedInN33PpdnlPhLyQdWSuD5sVHJDF6xn22vlyxeILH3ooLg2WOFMPmVAoGBAM+b\nUG/a7iyfpAQKYyuFAsXz6SeFaDY+ZYeX45L112H8Pu+Ie/qzon+bzLB9FIH8GP6+\nQpQgmm/p37U2gD1zChUv7iW6OfQBKk9rWvMpfRF6d7YHquElejhizfTZ+ntBV/VY\ndOYEczxhrdW7keLpatYaaWUy/VboRZmlz/9JGqVLAoGAHfqNmFc0cgk4IowEj7a3\ntTNh6ltub/i+FynwRykfazcDyXaeLPDtfQe8gVh5H8h6W+y9P9BjJVnDVVrX1RAn\nbiJ1EupLPF5sVDapW8ohTOXgfbGTGXBNUUW+4Nv+IDno+mz/RhjkPYHpnM0I7c/5\ntGzOZsC/2hjNgT8I0+MWav0CgYEAuULdJeQVlKalI6HtW2Gn1uRRVJ49H+LQkY6e\nW3+cw2jo9LI0CMWSphNvNrN3wIMp/vHj0fHCP0pSApDvIWbuQXfzKaGko7UCf7rK\nf6GvZRCHkV4IREBAb97j8bMvThxClMNqFfU0rFZyXP+0MOyhFQyertswrgQ6T+Fi\n2mnvKD8CgYAmJHP3NTDRMoMRyAzonJ6nEaGUbAgNmivTaUWMe0+leCvAdwD89gzC\nTKbm3eDUg/6Va3X6ANh3wsfIOe4RXXxcbcFDk9R4zO2M5gfLSjYm5Q87EBZ2hrdj\nM2gLI7dt6thx0J8lR8xRHBEMrVBdgwp0g1gQzo5dAV88/kpkZVps8Q==\n-----END RSA PRIVATE KEY-----\n",
-    "certificate":"-----BEGIN CERTIFICATE-----\nMIIEXTCCA0WgAwIBAgIGATTEAjK3MA0GCSqGSIb3DQEBBQUAMIGDMRkwFwYDVQQD\nExBUZXN0IENBIFNUdWIgS2V5MRcwFQYDVQQLEw5QbGF0Zm9ybSBMYmFhczEaMBgG\nA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFDASBgNVBAcTC1NhbiBBbnRvbmlvMQ4w\nDAYDVQQIEwVUZXhhczELMAkGA1UEBhMCVVMwHhcNMTIwMTA5MTk0NjQ1WhcNMTQw\nMTA4MTk0NjQ1WjCBgjELMAkGA1UEBhMCVVMxDjAMBgNVBAgTBVRleGFzMRQwEgYD\nVQQHEwtTYW4gQW50b25pbzEaMBgGA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFzAV\nBgNVBAsTDlBsYXRmb3JtIExiYWFzMRgwFgYDVQQDEw9UZXN0IENsaWVudCBLZXkw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAi51IylFnHtNLT8C0NVfc\nOBfAsP2D5es1qhrOWHCGlgAuDMksBsCc7FPo5PSBOmQ+6z8HtCFbrLoC5/Zx0F5b\nfVegjA+xKjI2HGASsYHHM0BFEH2UjUcJrWiMWtxQuW6Phbqulo7JwjmygMEmIkeK\nf+FtkE9mrq+E8K40/thrjxl3/ZcJD1+3dcp+ZuzVJ2t1E4iGKCx79IZFsysKiuf+\n+E0i6iGvvI6UcbcZxVxQj2TplJkFuoX5kDgClIX9Dr9y6aJ4SCh+GRhvHl+DTaz0\nnCvghachHZtIeztRDqxWApjOOzs93dSelrviMXDr8fqyEAGg7YIhgui0aZBsWCen\nAgMBAAGjgdUwgdIwgbAGA1UdIwSBqDCBpYAUNpx1Pc6cGA7KqEwHMmHBTZMA7lSh\ngYmkgYYwgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVU4IBATAd\nBgNVHQ4EFgQULueOfsjZZOHwJHZwBy6u0swnpccwDQYJKoZIhvcNAQEFBQADggEB\nAFNuqSVUaotUJoWDv4z7Kbi6JFpTjDht5ORw4BdVYlRD4h9DACAFzPrPV2ym/Osp\nhNMdZq6msZku7MdOSQVhdeGWrSNk3M8O9Hg7cVzPNXOF3iNoo3irQ5tURut44xs4\nWw5YWQqS9WyUY5snD8tm7Y1rQTPfhg+678xIq/zWCv/u+FSnfVv1nlhLVQkEeG/Y\ngh1uMaTIpUKTGEjIAGtpGP7wwIcXptR/HyfzhTUSTaWc1Ef7zoKT9LL5z3IV1hC2\njVWz+RwYs98LjMuksJFoHqRfWyYhCIym0jb6GTwaEmpxAjc+d7OLNQdnoEGoUYGP\nYjtfkRYg265ESMA+Kww4Xy8=\n-----END CERTIFICATE-----\n",
-    "intermediateCertificate":"-----BEGIN CERTIFICATE-----\nMIIDtTCCAp2gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzEZMBcGA1UEAxMQVGVz\ndCBDQSBTVHViIEtleTEXMBUGA1UECxMOUGxhdGZvcm0gTGJhYXMxGjAYBgNVBAoT\nEVJhY2tzcGFjZSBIb3N0aW5nMRQwEgYDVQQHEwtTYW4gQW50b25pbzEOMAwGA1UE\nCBMFVGV4YXMxCzAJBgNVBAYTAlVTMB4XDTEyMDEwOTE5NDU0OVoXDTE0MDEwODE5\nNDU0OVowgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVUzCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANNh55lwTVwQvNoEZjq1zGdYz9jA\nXXdjizn8AJhjHLOAallfPtvCfTEgKanhdoyz5FnhQE8HbDAop/KNS1lN2UMvdl5f\nZNLTSjJrNtedqxQwxN/i3bpyBxNVejUH2NjV1mmyj+5CJYwCzWalvI/gLPq/A3as\nO2EQqtf3U8unRgn0zXLRdYxV9MrUzNAmdipPNvNrsVdrCgA42rgF/8KsyRVQfJCX\nfN7PGCfrsC3YaUvhymraWxNnXIzMYTNa9wEeBZLUw8SlEtpa1Zsvui+TPXu3USNZ\nVnWH8Lb6ENlnoX0VBwo62fjOG3JzhNKoJawi3bRqyDdINOvafr7iPrrs/T8CAwEA\nAaMyMDAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUNpx1Pc6cGA7KqEwHMmHB\nTZMA7lQwDQYJKoZIhvcNAQEFBQADggEBAMoRgH3iTG3t317viLKoY+lNMHUgHuR7\nb3mn9MidJKyYVewe6hCDIN6WY4fUojmMW9wFJWJIo0hRMNHL3n3tq8HP2j20Mxy8\nacPdfGZJa+jiBw72CrIGdobKaFduIlIEDBA1pNdZIJ+EulrtqrMesnIt92WaypIS\n8JycbIgDMCiyC0ENHEk8UWlC6429c7OZAsplMTbHME/1R4btxjkdfrYZJjdJ2yL2\n8cjZDUDMCPTdW/ycP07Gkq30RB5tACB5aZdaCn2YaKC8FsEdhff4X7xEOfOEHWEq\nSRxADDj8Lx1MT6QpR07hCiDyHfTCtbqzI0iGjX63Oh7xXSa0f+JVTa8=\n-----END CERTIFICATE-----\n"
-  }
-}
-		`)
-
-		w.WriteHeader(http.StatusAccepted)
-
-		fmt.Fprintf(w, `
-{
-	"certificateMapping": {
-		"id": 123,
-		"hostName": "rackspace.com",
-		"certificate":"-----BEGIN CERTIFICATE-----\nMIIEXTCCA0WgAwIBAgIGATTEAjK3MA0GCSqGSIb3DQEBBQUAMIGDMRkwFwYDVQQD\nExBUZXN0IENBIFNUdWIgS2V5MRcwFQYDVQQLEw5QbGF0Zm9ybSBMYmFhczEaMBgG\nA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFDASBgNVBAcTC1NhbiBBbnRvbmlvMQ4w\nDAYDVQQIEwVUZXhhczELMAkGA1UEBhMCVVMwHhcNMTIwMTA5MTk0NjQ1WhcNMTQw\nMTA4MTk0NjQ1WjCBgjELMAkGA1UEBhMCVVMxDjAMBgNVBAgTBVRleGFzMRQwEgYD\nVQQHEwtTYW4gQW50b25pbzEaMBgGA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFzAV\nBgNVBAsTDlBsYXRmb3JtIExiYWFzMRgwFgYDVQQDEw9UZXN0IENsaWVudCBLZXkw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAi51IylFnHtNLT8C0NVfc\nOBfAsP2D5es1qhrOWHCGlgAuDMksBsCc7FPo5PSBOmQ+6z8HtCFbrLoC5/Zx0F5b\nfVegjA+xKjI2HGASsYHHM0BFEH2UjUcJrWiMWtxQuW6Phbqulo7JwjmygMEmIkeK\nf+FtkE9mrq+E8K40/thrjxl3/ZcJD1+3dcp+ZuzVJ2t1E4iGKCx79IZFsysKiuf+\n+E0i6iGvvI6UcbcZxVxQj2TplJkFuoX5kDgClIX9Dr9y6aJ4SCh+GRhvHl+DTaz0\nnCvghachHZtIeztRDqxWApjOOzs93dSelrviMXDr8fqyEAGg7YIhgui0aZBsWCen\nAgMBAAGjgdUwgdIwgbAGA1UdIwSBqDCBpYAUNpx1Pc6cGA7KqEwHMmHBTZMA7lSh\ngYmkgYYwgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVU4IBATAd\nBgNVHQ4EFgQULueOfsjZZOHwJHZwBy6u0swnpccwDQYJKoZIhvcNAQEFBQADggEB\nAFNuqSVUaotUJoWDv4z7Kbi6JFpTjDht5ORw4BdVYlRD4h9DACAFzPrPV2ym/Osp\nhNMdZq6msZku7MdOSQVhdeGWrSNk3M8O9Hg7cVzPNXOF3iNoo3irQ5tURut44xs4\nWw5YWQqS9WyUY5snD8tm7Y1rQTPfhg+678xIq/zWCv/u+FSnfVv1nlhLVQkEeG/Y\ngh1uMaTIpUKTGEjIAGtpGP7wwIcXptR/HyfzhTUSTaWc1Ef7zoKT9LL5z3IV1hC2\njVWz+RwYs98LjMuksJFoHqRfWyYhCIym0jb6GTwaEmpxAjc+d7OLNQdnoEGoUYGP\nYjtfkRYg265ESMA+Kww4Xy8=\n-----END CERTIFICATE-----\n",
-		"intermediateCertificate":"-----BEGIN CERTIFICATE-----\nMIIDtTCCAp2gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzEZMBcGA1UEAxMQVGVz\ndCBDQSBTVHViIEtleTEXMBUGA1UECxMOUGxhdGZvcm0gTGJhYXMxGjAYBgNVBAoT\nEVJhY2tzcGFjZSBIb3N0aW5nMRQwEgYDVQQHEwtTYW4gQW50b25pbzEOMAwGA1UE\nCBMFVGV4YXMxCzAJBgNVBAYTAlVTMB4XDTEyMDEwOTE5NDU0OVoXDTE0MDEwODE5\nNDU0OVowgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVUzCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANNh55lwTVwQvNoEZjq1zGdYz9jA\nXXdjizn8AJhjHLOAallfPtvCfTEgKanhdoyz5FnhQE8HbDAop/KNS1lN2UMvdl5f\nZNLTSjJrNtedqxQwxN/i3bpyBxNVejUH2NjV1mmyj+5CJYwCzWalvI/gLPq/A3as\nO2EQqtf3U8unRgn0zXLRdYxV9MrUzNAmdipPNvNrsVdrCgA42rgF/8KsyRVQfJCX\nfN7PGCfrsC3YaUvhymraWxNnXIzMYTNa9wEeBZLUw8SlEtpa1Zsvui+TPXu3USNZ\nVnWH8Lb6ENlnoX0VBwo62fjOG3JzhNKoJawi3bRqyDdINOvafr7iPrrs/T8CAwEA\nAaMyMDAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUNpx1Pc6cGA7KqEwHMmHB\nTZMA7lQwDQYJKoZIhvcNAQEFBQADggEBAMoRgH3iTG3t317viLKoY+lNMHUgHuR7\nb3mn9MidJKyYVewe6hCDIN6WY4fUojmMW9wFJWJIo0hRMNHL3n3tq8HP2j20Mxy8\nacPdfGZJa+jiBw72CrIGdobKaFduIlIEDBA1pNdZIJ+EulrtqrMesnIt92WaypIS\n8JycbIgDMCiyC0ENHEk8UWlC6429c7OZAsplMTbHME/1R4btxjkdfrYZJjdJ2yL2\n8cjZDUDMCPTdW/ycP07Gkq30RB5tACB5aZdaCn2YaKC8FsEdhff4X7xEOfOEHWEq\nSRxADDj8Lx1MT6QpR07hCiDyHfTCtbqzI0iGjX63Oh7xXSa0f+JVTa8=\n-----END CERTIFICATE-----\n"
-	}
-}
-			`)
-	})
-}
-
-func mockDeleteCertResponse(t *testing.T, lbID, certID int) {
-	th.Mux.HandleFunc(_certURL(lbID, certID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		w.WriteHeader(http.StatusOK)
-	})
-}
diff --git a/rackspace/lb/v1/ssl/requests.go b/rackspace/lb/v1/ssl/requests.go
deleted file mode 100644
index bb53ef8..0000000
--- a/rackspace/lb/v1/ssl/requests.go
+++ /dev/null
@@ -1,247 +0,0 @@
-package ssl
-
-import (
-	"errors"
-
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-var (
-	errPrivateKey     = errors.New("PrivateKey is a required field")
-	errCertificate    = errors.New("Certificate is a required field")
-	errIntCertificate = errors.New("IntCertificate is a required field")
-)
-
-// UpdateOptsBuilder is the interface options structs have to satisfy in order
-// to be used in the main Update operation in this package.
-type UpdateOptsBuilder interface {
-	ToSSLUpdateMap() (map[string]interface{}, error)
-}
-
-// UpdateOpts is the common options struct used in this package's Update
-// operation.
-type UpdateOpts struct {
-	// Required - consult the SSLTermConfig struct for more info.
-	SecurePort int
-
-	// Required - consult the SSLTermConfig struct for more info.
-	PrivateKey string
-
-	// Required - consult the SSLTermConfig struct for more info.
-	Certificate string
-
-	// Required - consult the SSLTermConfig struct for more info.
-	IntCertificate string
-
-	// Optional - consult the SSLTermConfig struct for more info.
-	Enabled *bool
-
-	// Optional - consult the SSLTermConfig struct for more info.
-	SecureTrafficOnly *bool
-}
-
-// ToSSLUpdateMap casts a CreateOpts struct to a map.
-func (opts UpdateOpts) ToSSLUpdateMap() (map[string]interface{}, error) {
-	ssl := make(map[string]interface{})
-
-	if opts.SecurePort == 0 {
-		return ssl, errors.New("SecurePort needs to be an integer greater than 0")
-	}
-	if opts.PrivateKey == "" {
-		return ssl, errPrivateKey
-	}
-	if opts.Certificate == "" {
-		return ssl, errCertificate
-	}
-	if opts.IntCertificate == "" {
-		return ssl, errIntCertificate
-	}
-
-	ssl["securePort"] = opts.SecurePort
-	ssl["privateKey"] = opts.PrivateKey
-	ssl["certificate"] = opts.Certificate
-	ssl["intermediateCertificate"] = opts.IntCertificate
-
-	if opts.Enabled != nil {
-		ssl["enabled"] = &opts.Enabled
-	}
-
-	if opts.SecureTrafficOnly != nil {
-		ssl["secureTrafficOnly"] = &opts.SecureTrafficOnly
-	}
-
-	return map[string]interface{}{"sslTermination": ssl}, nil
-}
-
-// Update is the operation responsible for updating the SSL Termination
-// configuration for a load balancer.
-func Update(c *gophercloud.ServiceClient, lbID int, opts UpdateOptsBuilder) UpdateResult {
-	var res UpdateResult
-
-	reqBody, err := opts.ToSSLUpdateMap()
-	if err != nil {
-		res.Err = err
-		return res
-	}
-
-	_, res.Err = c.Put(rootURL(c, lbID), reqBody, &res.Body, &gophercloud.RequestOpts{
-		OkCodes: []int{200},
-	})
-	return res
-}
-
-// Get is the operation responsible for showing the details of the SSL
-// Termination configuration for a load balancer.
-func Get(c *gophercloud.ServiceClient, lbID int) GetResult {
-	var res GetResult
-	_, res.Err = c.Get(rootURL(c, lbID), &res.Body, nil)
-	return res
-}
-
-// Delete is the operation responsible for deleting the SSL Termination
-// configuration for a load balancer.
-func Delete(c *gophercloud.ServiceClient, lbID int) DeleteResult {
-	var res DeleteResult
-	_, res.Err = c.Delete(rootURL(c, lbID), &gophercloud.RequestOpts{
-		OkCodes: []int{200},
-	})
-	return res
-}
-
-// ListCerts will list all of the certificate mappings associated with a
-// SSL-terminated HTTP load balancer.
-func ListCerts(c *gophercloud.ServiceClient, lbID int) pagination.Pager {
-	url := certURL(c, lbID)
-	return pagination.NewPager(c, url, func(r pagination.PageResult) pagination.Page {
-		return CertPage{pagination.LinkedPageBase{PageResult: r}}
-	})
-}
-
-// CreateCertOptsBuilder is the interface options structs have to satisfy in
-// order to be used in the AddCert operation in this package.
-type CreateCertOptsBuilder interface {
-	ToCertCreateMap() (map[string]interface{}, error)
-}
-
-// CreateCertOpts represents the options used when adding a new certificate mapping.
-type CreateCertOpts struct {
-	HostName       string
-	PrivateKey     string
-	Certificate    string
-	IntCertificate string
-}
-
-// ToCertCreateMap will cast an CreateCertOpts struct to a map for JSON serialization.
-func (opts CreateCertOpts) ToCertCreateMap() (map[string]interface{}, error) {
-	cm := make(map[string]interface{})
-
-	if opts.HostName == "" {
-		return cm, errors.New("HostName is a required option")
-	}
-	if opts.PrivateKey == "" {
-		return cm, errPrivateKey
-	}
-	if opts.Certificate == "" {
-		return cm, errCertificate
-	}
-
-	cm["hostName"] = opts.HostName
-	cm["privateKey"] = opts.PrivateKey
-	cm["certificate"] = opts.Certificate
-
-	if opts.IntCertificate != "" {
-		cm["intermediateCertificate"] = opts.IntCertificate
-	}
-
-	return map[string]interface{}{"certificateMapping": cm}, nil
-}
-
-// CreateCert will add a new SSL certificate and allow an SSL-terminated HTTP
-// load balancer to use it. This feature is useful because it allows multiple
-// certificates to be used. The maximum number of certificates that can be
-// stored per LB is 20.
-func CreateCert(c *gophercloud.ServiceClient, lbID int, opts CreateCertOptsBuilder) CreateCertResult {
-	var res CreateCertResult
-
-	reqBody, err := opts.ToCertCreateMap()
-	if err != nil {
-		res.Err = err
-		return res
-	}
-
-	_, res.Err = c.Post(certURL(c, lbID), reqBody, &res.Body, &gophercloud.RequestOpts{
-		OkCodes: []int{200},
-	})
-
-	return res
-}
-
-// GetCert will show the details of an existing SSL certificate.
-func GetCert(c *gophercloud.ServiceClient, lbID, certID int) GetCertResult {
-	var res GetCertResult
-	_, res.Err = c.Get(certResourceURL(c, lbID, certID), &res.Body, nil)
-	return res
-}
-
-// UpdateCertOptsBuilder is the interface options structs have to satisfy in
-// order to be used in the UpdateCert operation in this package.
-type UpdateCertOptsBuilder interface {
-	ToCertUpdateMap() (map[string]interface{}, error)
-}
-
-// UpdateCertOpts represents the options needed to update a SSL certificate.
-type UpdateCertOpts struct {
-	HostName       string
-	PrivateKey     string
-	Certificate    string
-	IntCertificate string
-}
-
-// ToCertUpdateMap will cast an UpdateCertOpts struct into a map for JSON
-// seralization.
-func (opts UpdateCertOpts) ToCertUpdateMap() (map[string]interface{}, error) {
-	cm := make(map[string]interface{})
-
-	if opts.HostName != "" {
-		cm["hostName"] = opts.HostName
-	}
-	if opts.PrivateKey != "" {
-		cm["privateKey"] = opts.PrivateKey
-	}
-	if opts.Certificate != "" {
-		cm["certificate"] = opts.Certificate
-	}
-	if opts.IntCertificate != "" {
-		cm["intermediateCertificate"] = opts.IntCertificate
-	}
-
-	return map[string]interface{}{"certificateMapping": cm}, nil
-}
-
-// UpdateCert is the operation responsible for updating the details of an
-// existing SSL certificate.
-func UpdateCert(c *gophercloud.ServiceClient, lbID, certID int, opts UpdateCertOptsBuilder) UpdateCertResult {
-	var res UpdateCertResult
-
-	reqBody, err := opts.ToCertUpdateMap()
-	if err != nil {
-		res.Err = err
-		return res
-	}
-
-	_, res.Err = c.Put(certResourceURL(c, lbID, certID), reqBody, &res.Body, nil)
-	return res
-}
-
-// DeleteCert is the operation responsible for permanently removing a SSL
-// certificate.
-func DeleteCert(c *gophercloud.ServiceClient, lbID, certID int) DeleteResult {
-	var res DeleteResult
-
-	_, res.Err = c.Delete(certResourceURL(c, lbID, certID), &gophercloud.RequestOpts{
-		OkCodes: []int{200},
-	})
-
-	return res
-}
diff --git a/rackspace/lb/v1/ssl/requests_test.go b/rackspace/lb/v1/ssl/requests_test.go
deleted file mode 100644
index fb14c4a..0000000
--- a/rackspace/lb/v1/ssl/requests_test.go
+++ /dev/null
@@ -1,167 +0,0 @@
-package ssl
-
-import (
-	"testing"
-
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	"github.com/rackspace/gophercloud/testhelper/client"
-)
-
-const (
-	lbID   = 12345
-	certID = 67890
-)
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockGetResponse(t, lbID)
-
-	sp, err := Get(client.ServiceClient(), lbID).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := &SSLTermConfig{
-		Certificate:       "-----BEGIN CERTIFICATE-----\nMIIEXTCCA0WgAwIBAgIGATTEAjK3MA0GCSqGSIb3DQEBBQUAMIGDMRkwFwYDVQQD\nExBUZXN0IENBIFNUdWIgS2V5MRcwFQYDVQQLEw5QbGF0Zm9ybSBMYmFhczEaMBgG\nA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFDASBgNVBAcTC1NhbiBBbnRvbmlvMQ4w\nDAYDVQQIEwVUZXhhczELMAkGA1UEBhMCVVMwHhcNMTIwMTA5MTk0NjQ1WhcNMTQw\nMTA4MTk0NjQ1WjCBgjELMAkGA1UEBhMCVVMxDjAMBgNVBAgTBVRleGFzMRQwEgYD\nVQQHEwtTYW4gQW50b25pbzEaMBgGA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFzAV\nBgNVBAsTDlBsYXRmb3JtIExiYWFzMRgwFgYDVQQDEw9UZXN0IENsaWVudCBLZXkw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAi51IylFnHtNLT8C0NVfc\nOBfAsP2D5es1qhrOWHCGlgAuDMksBsCc7FPo5PSBOmQ+6z8HtCFbrLoC5/Zx0F5b\nfVegjA+xKjI2HGASsYHHM0BFEH2UjUcJrWiMWtxQuW6Phbqulo7JwjmygMEmIkeK\nf+FtkE9mrq+E8K40/thrjxl3/ZcJD1+3dcp+ZuzVJ2t1E4iGKCx79IZFsysKiuf+\n+E0i6iGvvI6UcbcZxVxQj2TplJkFuoX5kDgClIX9Dr9y6aJ4SCh+GRhvHl+DTaz0\nnCvghachHZtIeztRDqxWApjOOzs93dSelrviMXDr8fqyEAGg7YIhgui0aZBsWCen\nAgMBAAGjgdUwgdIwgbAGA1UdIwSBqDCBpYAUNpx1Pc6cGA7KqEwHMmHBTZMA7lSh\ngYmkgYYwgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVU4IBATAd\nBgNVHQ4EFgQULueOfsjZZOHwJHZwBy6u0swnpccwDQYJKoZIhvcNAQEFBQADggEB\nAFNuqSVUaotUJoWDv4z7Kbi6JFpTjDht5ORw4BdVYlRD4h9DACAFzPrPV2ym/Osp\nhNMdZq6msZku7MdOSQVhdeGWrSNk3M8O9Hg7cVzPNXOF3iNoo3irQ5tURut44xs4\nWw5YWQqS9WyUY5snD8tm7Y1rQTPfhg+678xIq/zWCv/u+FSnfVv1nlhLVQkEeG/Y\ngh1uMaTIpUKTGEjIAGtpGP7wwIcXptR/HyfzhTUSTaWc1Ef7zoKT9LL5z3IV1hC2\njVWz+RwYs98LjMuksJFoHqRfWyYhCIym0jb6GTwaEmpxAjc+d7OLNQdnoEGoUYGP\nYjtfkRYg265ESMA+Kww4Xy8=\n-----END CERTIFICATE-----\n",
-		Enabled:           true,
-		SecureTrafficOnly: false,
-		IntCertificate:    "-----BEGIN CERTIFICATE-----\nMIIDtTCCAp2gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzEZMBcGA1UEAxMQVGVz\ndCBDQSBTVHViIEtleTEXMBUGA1UECxMOUGxhdGZvcm0gTGJhYXMxGjAYBgNVBAoT\nEVJhY2tzcGFjZSBIb3N0aW5nMRQwEgYDVQQHEwtTYW4gQW50b25pbzEOMAwGA1UE\nCBMFVGV4YXMxCzAJBgNVBAYTAlVTMB4XDTEyMDEwOTE5NDU0OVoXDTE0MDEwODE5\nNDU0OVowgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVUzCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANNh55lwTVwQvNoEZjq1zGdYz9jA\nXXdjizn8AJhjHLOAallfPtvCfTEgKanhdoyz5FnhQE8HbDAop/KNS1lN2UMvdl5f\nZNLTSjJrNtedqxQwxN/i3bpyBxNVejUH2NjV1mmyj+5CJYwCzWalvI/gLPq/A3as\nO2EQqtf3U8unRgn0zXLRdYxV9MrUzNAmdipPNvNrsVdrCgA42rgF/8KsyRVQfJCX\nfN7PGCfrsC3YaUvhymraWxNnXIzMYTNa9wEeBZLUw8SlEtpa1Zsvui+TPXu3USNZ\nVnWH8Lb6ENlnoX0VBwo62fjOG3JzhNKoJawi3bRqyDdINOvafr7iPrrs/T8CAwEA\nAaMyMDAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUNpx1Pc6cGA7KqEwHMmHB\nTZMA7lQwDQYJKoZIhvcNAQEFBQADggEBAMoRgH3iTG3t317viLKoY+lNMHUgHuR7\nb3mn9MidJKyYVewe6hCDIN6WY4fUojmMW9wFJWJIo0hRMNHL3n3tq8HP2j20Mxy8\nacPdfGZJa+jiBw72CrIGdobKaFduIlIEDBA1pNdZIJ+EulrtqrMesnIt92WaypIS\n8JycbIgDMCiyC0ENHEk8UWlC6429c7OZAsplMTbHME/1R4btxjkdfrYZJjdJ2yL2\n8cjZDUDMCPTdW/ycP07Gkq30RB5tACB5aZdaCn2YaKC8FsEdhff4X7xEOfOEHWEq\nSRxADDj8Lx1MT6QpR07hCiDyHfTCtbqzI0iGjX63Oh7xXSa0f+JVTa8=\n-----END CERTIFICATE-----\n",
-		SecurePort:        443,
-	}
-	th.AssertDeepEquals(t, expected, sp)
-}
-
-func TestUpdate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockUpdateResponse(t, lbID)
-
-	opts := UpdateOpts{
-		Enabled:           gophercloud.Enabled,
-		SecurePort:        443,
-		SecureTrafficOnly: gophercloud.Disabled,
-		PrivateKey:        "foo",
-		Certificate:       "-----BEGIN CERTIFICATE-----\nMIIEXTCCA0WgAwIBAgIGATTEAjK3MA0GCSqGSIb3DQEBBQUAMIGDMRkwFwYDVQQD\nExBUZXN0IENBIFNUdWIgS2V5MRcwFQYDVQQLEw5QbGF0Zm9ybSBMYmFhczEaMBgG\nA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFDASBgNVBAcTC1NhbiBBbnRvbmlvMQ4w\nDAYDVQQIEwVUZXhhczELMAkGA1UEBhMCVVMwHhcNMTIwMTA5MTk0NjQ1WhcNMTQw\nMTA4MTk0NjQ1WjCBgjELMAkGA1UEBhMCVVMxDjAMBgNVBAgTBVRleGFzMRQwEgYD\nVQQHEwtTYW4gQW50b25pbzEaMBgGA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFzAV\nBgNVBAsTDlBsYXRmb3JtIExiYWFzMRgwFgYDVQQDEw9UZXN0IENsaWVudCBLZXkw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAi51IylFnHtNLT8C0NVfc\nOBfAsP2D5es1qhrOWHCGlgAuDMksBsCc7FPo5PSBOmQ+6z8HtCFbrLoC5/Zx0F5b\nfVegjA+xKjI2HGASsYHHM0BFEH2UjUcJrWiMWtxQuW6Phbqulo7JwjmygMEmIkeK\nf+FtkE9mrq+E8K40/thrjxl3/ZcJD1+3dcp+ZuzVJ2t1E4iGKCx79IZFsysKiuf+\n+E0i6iGvvI6UcbcZxVxQj2TplJkFuoX5kDgClIX9Dr9y6aJ4SCh+GRhvHl+DTaz0\nnCvghachHZtIeztRDqxWApjOOzs93dSelrviMXDr8fqyEAGg7YIhgui0aZBsWCen\nAgMBAAGjgdUwgdIwgbAGA1UdIwSBqDCBpYAUNpx1Pc6cGA7KqEwHMmHBTZMA7lSh\ngYmkgYYwgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVU4IBATAd\nBgNVHQ4EFgQULueOfsjZZOHwJHZwBy6u0swnpccwDQYJKoZIhvcNAQEFBQADggEB\nAFNuqSVUaotUJoWDv4z7Kbi6JFpTjDht5ORw4BdVYlRD4h9DACAFzPrPV2ym/Osp\nhNMdZq6msZku7MdOSQVhdeGWrSNk3M8O9Hg7cVzPNXOF3iNoo3irQ5tURut44xs4\nWw5YWQqS9WyUY5snD8tm7Y1rQTPfhg+678xIq/zWCv/u+FSnfVv1nlhLVQkEeG/Y\ngh1uMaTIpUKTGEjIAGtpGP7wwIcXptR/HyfzhTUSTaWc1Ef7zoKT9LL5z3IV1hC2\njVWz+RwYs98LjMuksJFoHqRfWyYhCIym0jb6GTwaEmpxAjc+d7OLNQdnoEGoUYGP\nYjtfkRYg265ESMA+Kww4Xy8=\n-----END CERTIFICATE-----\n",
-		IntCertificate:    "-----BEGIN CERTIFICATE-----\nMIIDtTCCAp2gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzEZMBcGA1UEAxMQVGVz\ndCBDQSBTVHViIEtleTEXMBUGA1UECxMOUGxhdGZvcm0gTGJhYXMxGjAYBgNVBAoT\nEVJhY2tzcGFjZSBIb3N0aW5nMRQwEgYDVQQHEwtTYW4gQW50b25pbzEOMAwGA1UE\nCBMFVGV4YXMxCzAJBgNVBAYTAlVTMB4XDTEyMDEwOTE5NDU0OVoXDTE0MDEwODE5\nNDU0OVowgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVUzCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANNh55lwTVwQvNoEZjq1zGdYz9jA\nXXdjizn8AJhjHLOAallfPtvCfTEgKanhdoyz5FnhQE8HbDAop/KNS1lN2UMvdl5f\nZNLTSjJrNtedqxQwxN/i3bpyBxNVejUH2NjV1mmyj+5CJYwCzWalvI/gLPq/A3as\nO2EQqtf3U8unRgn0zXLRdYxV9MrUzNAmdipPNvNrsVdrCgA42rgF/8KsyRVQfJCX\nfN7PGCfrsC3YaUvhymraWxNnXIzMYTNa9wEeBZLUw8SlEtpa1Zsvui+TPXu3USNZ\nVnWH8Lb6ENlnoX0VBwo62fjOG3JzhNKoJawi3bRqyDdINOvafr7iPrrs/T8CAwEA\nAaMyMDAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUNpx1Pc6cGA7KqEwHMmHB\nTZMA7lQwDQYJKoZIhvcNAQEFBQADggEBAMoRgH3iTG3t317viLKoY+lNMHUgHuR7\nb3mn9MidJKyYVewe6hCDIN6WY4fUojmMW9wFJWJIo0hRMNHL3n3tq8HP2j20Mxy8\nacPdfGZJa+jiBw72CrIGdobKaFduIlIEDBA1pNdZIJ+EulrtqrMesnIt92WaypIS\n8JycbIgDMCiyC0ENHEk8UWlC6429c7OZAsplMTbHME/1R4btxjkdfrYZJjdJ2yL2\n8cjZDUDMCPTdW/ycP07Gkq30RB5tACB5aZdaCn2YaKC8FsEdhff4X7xEOfOEHWEq\nSRxADDj8Lx1MT6QpR07hCiDyHfTCtbqzI0iGjX63Oh7xXSa0f+JVTa8=\n-----END CERTIFICATE-----\n",
-	}
-	err := Update(client.ServiceClient(), lbID, opts).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockDeleteResponse(t, lbID)
-
-	err := Delete(client.ServiceClient(), lbID).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestListCerts(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockListCertsResponse(t, lbID)
-
-	count := 0
-
-	err := ListCerts(client.ServiceClient(), lbID).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractCerts(page)
-		th.AssertNoErr(t, err)
-
-		expected := []Certificate{
-			Certificate{ID: 123, HostName: "rackspace.com"},
-			Certificate{ID: 124, HostName: "*.rackspace.com"},
-		}
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, 1, count)
-}
-
-func TestCreateCert(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockAddCertResponse(t, lbID)
-
-	opts := CreateCertOpts{
-		HostName:       "rackspace.com",
-		PrivateKey:     "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAwIudSMpRZx7TS0/AtDVX3DgXwLD9g+XrNaoazlhwhpYALgzJ\nLAbAnOxT6OT0gTpkPus/B7QhW6y6Auf2cdBeW31XoIwPsSoyNhxgErGBxzNARRB9\nlI1HCa1ojFrcULluj4W6rpaOycI5soDBJiJHin/hbZBPZq6vhPCuNP7Ya48Zd/2X\nCQ9ft3XKfmbs1SdrdROIhigse/SGRbMrCorn/vhNIuohr7yOlHG3GcVcUI9k6ZSZ\nBbqF+ZA4ApSF/Q6/cumieEgofhkYbx5fg02s9Jwr4IWnIR2bSHs7UQ6sVgKYzjs7\nPd3Unpa74jFw6/H6shABoO2CIYLotGmQbFgnpwIDAQABAoIBAQCBCQ+PCIclJHNV\ntUzfeCA5ZR4F9JbxHdRTUnxEbOB8UWotckQfTScoAvj4yvdQ42DrCZxj/UOdvFOs\nPufZvlp91bIz1alugWjE+p8n5+2hIaegoTyHoWZKBfxak0myj5KYfHZvKlbmv1ML\nXV4TwEVRfAIG+v87QTY/UUxuF5vR+BpKIbgUJLfPUFFvJUdl84qsJ44pToxaYUd/\nh5YAGC00U4ay1KVSAUnTkkPNZ0lPG/rWU6w6WcTvNRLMd8DzFLTKLOgQfHhbExAF\n+sXPWjWSzbBRP1O7fHqq96QQh4VFiY/7w9W+sDKQyV6Ul17OSXs6aZ4f+lq4rJTI\n1FG96YiBAoGBAO1tiH0h1oWDBYfJB3KJJ6CQQsDGwtHo/DEgznFVP4XwEVbZ98Ha\nBfBCn3sAybbaikyCV1Hwj7kfHMZPDHbrcUSFX7quu/2zPK+wO3lZKXSyu4YsguSa\nRedInN33PpdnlPhLyQdWSuD5sVHJDF6xn22vlyxeILH3ooLg2WOFMPmVAoGBAM+b\nUG/a7iyfpAQKYyuFAsXz6SeFaDY+ZYeX45L112H8Pu+Ie/qzon+bzLB9FIH8GP6+\nQpQgmm/p37U2gD1zChUv7iW6OfQBKk9rWvMpfRF6d7YHquElejhizfTZ+ntBV/VY\ndOYEczxhrdW7keLpatYaaWUy/VboRZmlz/9JGqVLAoGAHfqNmFc0cgk4IowEj7a3\ntTNh6ltub/i+FynwRykfazcDyXaeLPDtfQe8gVh5H8h6W+y9P9BjJVnDVVrX1RAn\nbiJ1EupLPF5sVDapW8ohTOXgfbGTGXBNUUW+4Nv+IDno+mz/RhjkPYHpnM0I7c/5\ntGzOZsC/2hjNgT8I0+MWav0CgYEAuULdJeQVlKalI6HtW2Gn1uRRVJ49H+LQkY6e\nW3+cw2jo9LI0CMWSphNvNrN3wIMp/vHj0fHCP0pSApDvIWbuQXfzKaGko7UCf7rK\nf6GvZRCHkV4IREBAb97j8bMvThxClMNqFfU0rFZyXP+0MOyhFQyertswrgQ6T+Fi\n2mnvKD8CgYAmJHP3NTDRMoMRyAzonJ6nEaGUbAgNmivTaUWMe0+leCvAdwD89gzC\nTKbm3eDUg/6Va3X6ANh3wsfIOe4RXXxcbcFDk9R4zO2M5gfLSjYm5Q87EBZ2hrdj\nM2gLI7dt6thx0J8lR8xRHBEMrVBdgwp0g1gQzo5dAV88/kpkZVps8Q==\n-----END RSA PRIVATE KEY-----\n",
-		Certificate:    "-----BEGIN CERTIFICATE-----\nMIIEXTCCA0WgAwIBAgIGATTEAjK3MA0GCSqGSIb3DQEBBQUAMIGDMRkwFwYDVQQD\nExBUZXN0IENBIFNUdWIgS2V5MRcwFQYDVQQLEw5QbGF0Zm9ybSBMYmFhczEaMBgG\nA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFDASBgNVBAcTC1NhbiBBbnRvbmlvMQ4w\nDAYDVQQIEwVUZXhhczELMAkGA1UEBhMCVVMwHhcNMTIwMTA5MTk0NjQ1WhcNMTQw\nMTA4MTk0NjQ1WjCBgjELMAkGA1UEBhMCVVMxDjAMBgNVBAgTBVRleGFzMRQwEgYD\nVQQHEwtTYW4gQW50b25pbzEaMBgGA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFzAV\nBgNVBAsTDlBsYXRmb3JtIExiYWFzMRgwFgYDVQQDEw9UZXN0IENsaWVudCBLZXkw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAi51IylFnHtNLT8C0NVfc\nOBfAsP2D5es1qhrOWHCGlgAuDMksBsCc7FPo5PSBOmQ+6z8HtCFbrLoC5/Zx0F5b\nfVegjA+xKjI2HGASsYHHM0BFEH2UjUcJrWiMWtxQuW6Phbqulo7JwjmygMEmIkeK\nf+FtkE9mrq+E8K40/thrjxl3/ZcJD1+3dcp+ZuzVJ2t1E4iGKCx79IZFsysKiuf+\n+E0i6iGvvI6UcbcZxVxQj2TplJkFuoX5kDgClIX9Dr9y6aJ4SCh+GRhvHl+DTaz0\nnCvghachHZtIeztRDqxWApjOOzs93dSelrviMXDr8fqyEAGg7YIhgui0aZBsWCen\nAgMBAAGjgdUwgdIwgbAGA1UdIwSBqDCBpYAUNpx1Pc6cGA7KqEwHMmHBTZMA7lSh\ngYmkgYYwgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVU4IBATAd\nBgNVHQ4EFgQULueOfsjZZOHwJHZwBy6u0swnpccwDQYJKoZIhvcNAQEFBQADggEB\nAFNuqSVUaotUJoWDv4z7Kbi6JFpTjDht5ORw4BdVYlRD4h9DACAFzPrPV2ym/Osp\nhNMdZq6msZku7MdOSQVhdeGWrSNk3M8O9Hg7cVzPNXOF3iNoo3irQ5tURut44xs4\nWw5YWQqS9WyUY5snD8tm7Y1rQTPfhg+678xIq/zWCv/u+FSnfVv1nlhLVQkEeG/Y\ngh1uMaTIpUKTGEjIAGtpGP7wwIcXptR/HyfzhTUSTaWc1Ef7zoKT9LL5z3IV1hC2\njVWz+RwYs98LjMuksJFoHqRfWyYhCIym0jb6GTwaEmpxAjc+d7OLNQdnoEGoUYGP\nYjtfkRYg265ESMA+Kww4Xy8=\n-----END CERTIFICATE-----\n",
-		IntCertificate: "-----BEGIN CERTIFICATE-----\nMIIDtTCCAp2gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzEZMBcGA1UEAxMQVGVz\ndCBDQSBTVHViIEtleTEXMBUGA1UECxMOUGxhdGZvcm0gTGJhYXMxGjAYBgNVBAoT\nEVJhY2tzcGFjZSBIb3N0aW5nMRQwEgYDVQQHEwtTYW4gQW50b25pbzEOMAwGA1UE\nCBMFVGV4YXMxCzAJBgNVBAYTAlVTMB4XDTEyMDEwOTE5NDU0OVoXDTE0MDEwODE5\nNDU0OVowgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVUzCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANNh55lwTVwQvNoEZjq1zGdYz9jA\nXXdjizn8AJhjHLOAallfPtvCfTEgKanhdoyz5FnhQE8HbDAop/KNS1lN2UMvdl5f\nZNLTSjJrNtedqxQwxN/i3bpyBxNVejUH2NjV1mmyj+5CJYwCzWalvI/gLPq/A3as\nO2EQqtf3U8unRgn0zXLRdYxV9MrUzNAmdipPNvNrsVdrCgA42rgF/8KsyRVQfJCX\nfN7PGCfrsC3YaUvhymraWxNnXIzMYTNa9wEeBZLUw8SlEtpa1Zsvui+TPXu3USNZ\nVnWH8Lb6ENlnoX0VBwo62fjOG3JzhNKoJawi3bRqyDdINOvafr7iPrrs/T8CAwEA\nAaMyMDAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUNpx1Pc6cGA7KqEwHMmHB\nTZMA7lQwDQYJKoZIhvcNAQEFBQADggEBAMoRgH3iTG3t317viLKoY+lNMHUgHuR7\nb3mn9MidJKyYVewe6hCDIN6WY4fUojmMW9wFJWJIo0hRMNHL3n3tq8HP2j20Mxy8\nacPdfGZJa+jiBw72CrIGdobKaFduIlIEDBA1pNdZIJ+EulrtqrMesnIt92WaypIS\n8JycbIgDMCiyC0ENHEk8UWlC6429c7OZAsplMTbHME/1R4btxjkdfrYZJjdJ2yL2\n8cjZDUDMCPTdW/ycP07Gkq30RB5tACB5aZdaCn2YaKC8FsEdhff4X7xEOfOEHWEq\nSRxADDj8Lx1MT6QpR07hCiDyHfTCtbqzI0iGjX63Oh7xXSa0f+JVTa8=\n-----END CERTIFICATE-----\n",
-	}
-
-	cm, err := CreateCert(client.ServiceClient(), lbID, opts).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := &Certificate{
-		ID:             123,
-		HostName:       "rackspace.com",
-		Certificate:    "-----BEGIN CERTIFICATE-----\nMIIEXTCCA0WgAwIBAgIGATTEAjK3MA0GCSqGSIb3DQEBBQUAMIGDMRkwFwYDVQQD\nExBUZXN0IENBIFNUdWIgS2V5MRcwFQYDVQQLEw5QbGF0Zm9ybSBMYmFhczEaMBgG\nA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFDASBgNVBAcTC1NhbiBBbnRvbmlvMQ4w\nDAYDVQQIEwVUZXhhczELMAkGA1UEBhMCVVMwHhcNMTIwMTA5MTk0NjQ1WhcNMTQw\nMTA4MTk0NjQ1WjCBgjELMAkGA1UEBhMCVVMxDjAMBgNVBAgTBVRleGFzMRQwEgYD\nVQQHEwtTYW4gQW50b25pbzEaMBgGA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFzAV\nBgNVBAsTDlBsYXRmb3JtIExiYWFzMRgwFgYDVQQDEw9UZXN0IENsaWVudCBLZXkw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAi51IylFnHtNLT8C0NVfc\nOBfAsP2D5es1qhrOWHCGlgAuDMksBsCc7FPo5PSBOmQ+6z8HtCFbrLoC5/Zx0F5b\nfVegjA+xKjI2HGASsYHHM0BFEH2UjUcJrWiMWtxQuW6Phbqulo7JwjmygMEmIkeK\nf+FtkE9mrq+E8K40/thrjxl3/ZcJD1+3dcp+ZuzVJ2t1E4iGKCx79IZFsysKiuf+\n+E0i6iGvvI6UcbcZxVxQj2TplJkFuoX5kDgClIX9Dr9y6aJ4SCh+GRhvHl+DTaz0\nnCvghachHZtIeztRDqxWApjOOzs93dSelrviMXDr8fqyEAGg7YIhgui0aZBsWCen\nAgMBAAGjgdUwgdIwgbAGA1UdIwSBqDCBpYAUNpx1Pc6cGA7KqEwHMmHBTZMA7lSh\ngYmkgYYwgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVU4IBATAd\nBgNVHQ4EFgQULueOfsjZZOHwJHZwBy6u0swnpccwDQYJKoZIhvcNAQEFBQADggEB\nAFNuqSVUaotUJoWDv4z7Kbi6JFpTjDht5ORw4BdVYlRD4h9DACAFzPrPV2ym/Osp\nhNMdZq6msZku7MdOSQVhdeGWrSNk3M8O9Hg7cVzPNXOF3iNoo3irQ5tURut44xs4\nWw5YWQqS9WyUY5snD8tm7Y1rQTPfhg+678xIq/zWCv/u+FSnfVv1nlhLVQkEeG/Y\ngh1uMaTIpUKTGEjIAGtpGP7wwIcXptR/HyfzhTUSTaWc1Ef7zoKT9LL5z3IV1hC2\njVWz+RwYs98LjMuksJFoHqRfWyYhCIym0jb6GTwaEmpxAjc+d7OLNQdnoEGoUYGP\nYjtfkRYg265ESMA+Kww4Xy8=\n-----END CERTIFICATE-----\n",
-		IntCertificate: "-----BEGIN CERTIFICATE-----\nMIIDtTCCAp2gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzEZMBcGA1UEAxMQVGVz\ndCBDQSBTVHViIEtleTEXMBUGA1UECxMOUGxhdGZvcm0gTGJhYXMxGjAYBgNVBAoT\nEVJhY2tzcGFjZSBIb3N0aW5nMRQwEgYDVQQHEwtTYW4gQW50b25pbzEOMAwGA1UE\nCBMFVGV4YXMxCzAJBgNVBAYTAlVTMB4XDTEyMDEwOTE5NDU0OVoXDTE0MDEwODE5\nNDU0OVowgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVUzCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANNh55lwTVwQvNoEZjq1zGdYz9jA\nXXdjizn8AJhjHLOAallfPtvCfTEgKanhdoyz5FnhQE8HbDAop/KNS1lN2UMvdl5f\nZNLTSjJrNtedqxQwxN/i3bpyBxNVejUH2NjV1mmyj+5CJYwCzWalvI/gLPq/A3as\nO2EQqtf3U8unRgn0zXLRdYxV9MrUzNAmdipPNvNrsVdrCgA42rgF/8KsyRVQfJCX\nfN7PGCfrsC3YaUvhymraWxNnXIzMYTNa9wEeBZLUw8SlEtpa1Zsvui+TPXu3USNZ\nVnWH8Lb6ENlnoX0VBwo62fjOG3JzhNKoJawi3bRqyDdINOvafr7iPrrs/T8CAwEA\nAaMyMDAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUNpx1Pc6cGA7KqEwHMmHB\nTZMA7lQwDQYJKoZIhvcNAQEFBQADggEBAMoRgH3iTG3t317viLKoY+lNMHUgHuR7\nb3mn9MidJKyYVewe6hCDIN6WY4fUojmMW9wFJWJIo0hRMNHL3n3tq8HP2j20Mxy8\nacPdfGZJa+jiBw72CrIGdobKaFduIlIEDBA1pNdZIJ+EulrtqrMesnIt92WaypIS\n8JycbIgDMCiyC0ENHEk8UWlC6429c7OZAsplMTbHME/1R4btxjkdfrYZJjdJ2yL2\n8cjZDUDMCPTdW/ycP07Gkq30RB5tACB5aZdaCn2YaKC8FsEdhff4X7xEOfOEHWEq\nSRxADDj8Lx1MT6QpR07hCiDyHfTCtbqzI0iGjX63Oh7xXSa0f+JVTa8=\n-----END CERTIFICATE-----\n",
-	}
-	th.AssertDeepEquals(t, expected, cm)
-}
-
-func TestGetCertMapping(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockGetCertResponse(t, lbID, certID)
-
-	sp, err := GetCert(client.ServiceClient(), lbID, certID).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := &Certificate{
-		ID:             123,
-		HostName:       "rackspace.com",
-		Certificate:    "-----BEGIN CERTIFICATE-----\nMIIEXTCCA0WgAwIBAgIGATTEAjK3MA0GCSqGSIb3DQEBBQUAMIGDMRkwFwYDVQQD\nExBUZXN0IENBIFNUdWIgS2V5MRcwFQYDVQQLEw5QbGF0Zm9ybSBMYmFhczEaMBgG\nA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFDASBgNVBAcTC1NhbiBBbnRvbmlvMQ4w\nDAYDVQQIEwVUZXhhczELMAkGA1UEBhMCVVMwHhcNMTIwMTA5MTk0NjQ1WhcNMTQw\nMTA4MTk0NjQ1WjCBgjELMAkGA1UEBhMCVVMxDjAMBgNVBAgTBVRleGFzMRQwEgYD\nVQQHEwtTYW4gQW50b25pbzEaMBgGA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFzAV\nBgNVBAsTDlBsYXRmb3JtIExiYWFzMRgwFgYDVQQDEw9UZXN0IENsaWVudCBLZXkw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAi51IylFnHtNLT8C0NVfc\nOBfAsP2D5es1qhrOWHCGlgAuDMksBsCc7FPo5PSBOmQ+6z8HtCFbrLoC5/Zx0F5b\nfVegjA+xKjI2HGASsYHHM0BFEH2UjUcJrWiMWtxQuW6Phbqulo7JwjmygMEmIkeK\nf+FtkE9mrq+E8K40/thrjxl3/ZcJD1+3dcp+ZuzVJ2t1E4iGKCx79IZFsysKiuf+\n+E0i6iGvvI6UcbcZxVxQj2TplJkFuoX5kDgClIX9Dr9y6aJ4SCh+GRhvHl+DTaz0\nnCvghachHZtIeztRDqxWApjOOzs93dSelrviMXDr8fqyEAGg7YIhgui0aZBsWCen\nAgMBAAGjgdUwgdIwgbAGA1UdIwSBqDCBpYAUNpx1Pc6cGA7KqEwHMmHBTZMA7lSh\ngYmkgYYwgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVU4IBATAd\nBgNVHQ4EFgQULueOfsjZZOHwJHZwBy6u0swnpccwDQYJKoZIhvcNAQEFBQADggEB\nAFNuqSVUaotUJoWDv4z7Kbi6JFpTjDht5ORw4BdVYlRD4h9DACAFzPrPV2ym/Osp\nhNMdZq6msZku7MdOSQVhdeGWrSNk3M8O9Hg7cVzPNXOF3iNoo3irQ5tURut44xs4\nWw5YWQqS9WyUY5snD8tm7Y1rQTPfhg+678xIq/zWCv/u+FSnfVv1nlhLVQkEeG/Y\ngh1uMaTIpUKTGEjIAGtpGP7wwIcXptR/HyfzhTUSTaWc1Ef7zoKT9LL5z3IV1hC2\njVWz+RwYs98LjMuksJFoHqRfWyYhCIym0jb6GTwaEmpxAjc+d7OLNQdnoEGoUYGP\nYjtfkRYg265ESMA+Kww4Xy8=\n-----END CERTIFICATE-----\n",
-		IntCertificate: "-----BEGIN CERTIFICATE-----\nMIIDtTCCAp2gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzEZMBcGA1UEAxMQVGVz\ndCBDQSBTVHViIEtleTEXMBUGA1UECxMOUGxhdGZvcm0gTGJhYXMxGjAYBgNVBAoT\nEVJhY2tzcGFjZSBIb3N0aW5nMRQwEgYDVQQHEwtTYW4gQW50b25pbzEOMAwGA1UE\nCBMFVGV4YXMxCzAJBgNVBAYTAlVTMB4XDTEyMDEwOTE5NDU0OVoXDTE0MDEwODE5\nNDU0OVowgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVUzCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANNh55lwTVwQvNoEZjq1zGdYz9jA\nXXdjizn8AJhjHLOAallfPtvCfTEgKanhdoyz5FnhQE8HbDAop/KNS1lN2UMvdl5f\nZNLTSjJrNtedqxQwxN/i3bpyBxNVejUH2NjV1mmyj+5CJYwCzWalvI/gLPq/A3as\nO2EQqtf3U8unRgn0zXLRdYxV9MrUzNAmdipPNvNrsVdrCgA42rgF/8KsyRVQfJCX\nfN7PGCfrsC3YaUvhymraWxNnXIzMYTNa9wEeBZLUw8SlEtpa1Zsvui+TPXu3USNZ\nVnWH8Lb6ENlnoX0VBwo62fjOG3JzhNKoJawi3bRqyDdINOvafr7iPrrs/T8CAwEA\nAaMyMDAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUNpx1Pc6cGA7KqEwHMmHB\nTZMA7lQwDQYJKoZIhvcNAQEFBQADggEBAMoRgH3iTG3t317viLKoY+lNMHUgHuR7\nb3mn9MidJKyYVewe6hCDIN6WY4fUojmMW9wFJWJIo0hRMNHL3n3tq8HP2j20Mxy8\nacPdfGZJa+jiBw72CrIGdobKaFduIlIEDBA1pNdZIJ+EulrtqrMesnIt92WaypIS\n8JycbIgDMCiyC0ENHEk8UWlC6429c7OZAsplMTbHME/1R4btxjkdfrYZJjdJ2yL2\n8cjZDUDMCPTdW/ycP07Gkq30RB5tACB5aZdaCn2YaKC8FsEdhff4X7xEOfOEHWEq\nSRxADDj8Lx1MT6QpR07hCiDyHfTCtbqzI0iGjX63Oh7xXSa0f+JVTa8=\n-----END CERTIFICATE-----\n",
-	}
-	th.AssertDeepEquals(t, expected, sp)
-}
-
-func TestUpdateCert(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockUpdateCertResponse(t, lbID, certID)
-
-	opts := UpdateCertOpts{
-		HostName:       "rackspace.com",
-		PrivateKey:     "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAwIudSMpRZx7TS0/AtDVX3DgXwLD9g+XrNaoazlhwhpYALgzJ\nLAbAnOxT6OT0gTpkPus/B7QhW6y6Auf2cdBeW31XoIwPsSoyNhxgErGBxzNARRB9\nlI1HCa1ojFrcULluj4W6rpaOycI5soDBJiJHin/hbZBPZq6vhPCuNP7Ya48Zd/2X\nCQ9ft3XKfmbs1SdrdROIhigse/SGRbMrCorn/vhNIuohr7yOlHG3GcVcUI9k6ZSZ\nBbqF+ZA4ApSF/Q6/cumieEgofhkYbx5fg02s9Jwr4IWnIR2bSHs7UQ6sVgKYzjs7\nPd3Unpa74jFw6/H6shABoO2CIYLotGmQbFgnpwIDAQABAoIBAQCBCQ+PCIclJHNV\ntUzfeCA5ZR4F9JbxHdRTUnxEbOB8UWotckQfTScoAvj4yvdQ42DrCZxj/UOdvFOs\nPufZvlp91bIz1alugWjE+p8n5+2hIaegoTyHoWZKBfxak0myj5KYfHZvKlbmv1ML\nXV4TwEVRfAIG+v87QTY/UUxuF5vR+BpKIbgUJLfPUFFvJUdl84qsJ44pToxaYUd/\nh5YAGC00U4ay1KVSAUnTkkPNZ0lPG/rWU6w6WcTvNRLMd8DzFLTKLOgQfHhbExAF\n+sXPWjWSzbBRP1O7fHqq96QQh4VFiY/7w9W+sDKQyV6Ul17OSXs6aZ4f+lq4rJTI\n1FG96YiBAoGBAO1tiH0h1oWDBYfJB3KJJ6CQQsDGwtHo/DEgznFVP4XwEVbZ98Ha\nBfBCn3sAybbaikyCV1Hwj7kfHMZPDHbrcUSFX7quu/2zPK+wO3lZKXSyu4YsguSa\nRedInN33PpdnlPhLyQdWSuD5sVHJDF6xn22vlyxeILH3ooLg2WOFMPmVAoGBAM+b\nUG/a7iyfpAQKYyuFAsXz6SeFaDY+ZYeX45L112H8Pu+Ie/qzon+bzLB9FIH8GP6+\nQpQgmm/p37U2gD1zChUv7iW6OfQBKk9rWvMpfRF6d7YHquElejhizfTZ+ntBV/VY\ndOYEczxhrdW7keLpatYaaWUy/VboRZmlz/9JGqVLAoGAHfqNmFc0cgk4IowEj7a3\ntTNh6ltub/i+FynwRykfazcDyXaeLPDtfQe8gVh5H8h6W+y9P9BjJVnDVVrX1RAn\nbiJ1EupLPF5sVDapW8ohTOXgfbGTGXBNUUW+4Nv+IDno+mz/RhjkPYHpnM0I7c/5\ntGzOZsC/2hjNgT8I0+MWav0CgYEAuULdJeQVlKalI6HtW2Gn1uRRVJ49H+LQkY6e\nW3+cw2jo9LI0CMWSphNvNrN3wIMp/vHj0fHCP0pSApDvIWbuQXfzKaGko7UCf7rK\nf6GvZRCHkV4IREBAb97j8bMvThxClMNqFfU0rFZyXP+0MOyhFQyertswrgQ6T+Fi\n2mnvKD8CgYAmJHP3NTDRMoMRyAzonJ6nEaGUbAgNmivTaUWMe0+leCvAdwD89gzC\nTKbm3eDUg/6Va3X6ANh3wsfIOe4RXXxcbcFDk9R4zO2M5gfLSjYm5Q87EBZ2hrdj\nM2gLI7dt6thx0J8lR8xRHBEMrVBdgwp0g1gQzo5dAV88/kpkZVps8Q==\n-----END RSA PRIVATE KEY-----\n",
-		Certificate:    "-----BEGIN CERTIFICATE-----\nMIIEXTCCA0WgAwIBAgIGATTEAjK3MA0GCSqGSIb3DQEBBQUAMIGDMRkwFwYDVQQD\nExBUZXN0IENBIFNUdWIgS2V5MRcwFQYDVQQLEw5QbGF0Zm9ybSBMYmFhczEaMBgG\nA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFDASBgNVBAcTC1NhbiBBbnRvbmlvMQ4w\nDAYDVQQIEwVUZXhhczELMAkGA1UEBhMCVVMwHhcNMTIwMTA5MTk0NjQ1WhcNMTQw\nMTA4MTk0NjQ1WjCBgjELMAkGA1UEBhMCVVMxDjAMBgNVBAgTBVRleGFzMRQwEgYD\nVQQHEwtTYW4gQW50b25pbzEaMBgGA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFzAV\nBgNVBAsTDlBsYXRmb3JtIExiYWFzMRgwFgYDVQQDEw9UZXN0IENsaWVudCBLZXkw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAi51IylFnHtNLT8C0NVfc\nOBfAsP2D5es1qhrOWHCGlgAuDMksBsCc7FPo5PSBOmQ+6z8HtCFbrLoC5/Zx0F5b\nfVegjA+xKjI2HGASsYHHM0BFEH2UjUcJrWiMWtxQuW6Phbqulo7JwjmygMEmIkeK\nf+FtkE9mrq+E8K40/thrjxl3/ZcJD1+3dcp+ZuzVJ2t1E4iGKCx79IZFsysKiuf+\n+E0i6iGvvI6UcbcZxVxQj2TplJkFuoX5kDgClIX9Dr9y6aJ4SCh+GRhvHl+DTaz0\nnCvghachHZtIeztRDqxWApjOOzs93dSelrviMXDr8fqyEAGg7YIhgui0aZBsWCen\nAgMBAAGjgdUwgdIwgbAGA1UdIwSBqDCBpYAUNpx1Pc6cGA7KqEwHMmHBTZMA7lSh\ngYmkgYYwgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVU4IBATAd\nBgNVHQ4EFgQULueOfsjZZOHwJHZwBy6u0swnpccwDQYJKoZIhvcNAQEFBQADggEB\nAFNuqSVUaotUJoWDv4z7Kbi6JFpTjDht5ORw4BdVYlRD4h9DACAFzPrPV2ym/Osp\nhNMdZq6msZku7MdOSQVhdeGWrSNk3M8O9Hg7cVzPNXOF3iNoo3irQ5tURut44xs4\nWw5YWQqS9WyUY5snD8tm7Y1rQTPfhg+678xIq/zWCv/u+FSnfVv1nlhLVQkEeG/Y\ngh1uMaTIpUKTGEjIAGtpGP7wwIcXptR/HyfzhTUSTaWc1Ef7zoKT9LL5z3IV1hC2\njVWz+RwYs98LjMuksJFoHqRfWyYhCIym0jb6GTwaEmpxAjc+d7OLNQdnoEGoUYGP\nYjtfkRYg265ESMA+Kww4Xy8=\n-----END CERTIFICATE-----\n",
-		IntCertificate: "-----BEGIN CERTIFICATE-----\nMIIDtTCCAp2gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzEZMBcGA1UEAxMQVGVz\ndCBDQSBTVHViIEtleTEXMBUGA1UECxMOUGxhdGZvcm0gTGJhYXMxGjAYBgNVBAoT\nEVJhY2tzcGFjZSBIb3N0aW5nMRQwEgYDVQQHEwtTYW4gQW50b25pbzEOMAwGA1UE\nCBMFVGV4YXMxCzAJBgNVBAYTAlVTMB4XDTEyMDEwOTE5NDU0OVoXDTE0MDEwODE5\nNDU0OVowgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVUzCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANNh55lwTVwQvNoEZjq1zGdYz9jA\nXXdjizn8AJhjHLOAallfPtvCfTEgKanhdoyz5FnhQE8HbDAop/KNS1lN2UMvdl5f\nZNLTSjJrNtedqxQwxN/i3bpyBxNVejUH2NjV1mmyj+5CJYwCzWalvI/gLPq/A3as\nO2EQqtf3U8unRgn0zXLRdYxV9MrUzNAmdipPNvNrsVdrCgA42rgF/8KsyRVQfJCX\nfN7PGCfrsC3YaUvhymraWxNnXIzMYTNa9wEeBZLUw8SlEtpa1Zsvui+TPXu3USNZ\nVnWH8Lb6ENlnoX0VBwo62fjOG3JzhNKoJawi3bRqyDdINOvafr7iPrrs/T8CAwEA\nAaMyMDAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUNpx1Pc6cGA7KqEwHMmHB\nTZMA7lQwDQYJKoZIhvcNAQEFBQADggEBAMoRgH3iTG3t317viLKoY+lNMHUgHuR7\nb3mn9MidJKyYVewe6hCDIN6WY4fUojmMW9wFJWJIo0hRMNHL3n3tq8HP2j20Mxy8\nacPdfGZJa+jiBw72CrIGdobKaFduIlIEDBA1pNdZIJ+EulrtqrMesnIt92WaypIS\n8JycbIgDMCiyC0ENHEk8UWlC6429c7OZAsplMTbHME/1R4btxjkdfrYZJjdJ2yL2\n8cjZDUDMCPTdW/ycP07Gkq30RB5tACB5aZdaCn2YaKC8FsEdhff4X7xEOfOEHWEq\nSRxADDj8Lx1MT6QpR07hCiDyHfTCtbqzI0iGjX63Oh7xXSa0f+JVTa8=\n-----END CERTIFICATE-----\n",
-	}
-
-	cm, err := UpdateCert(client.ServiceClient(), lbID, certID, opts).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := &Certificate{
-		ID:             123,
-		HostName:       "rackspace.com",
-		Certificate:    "-----BEGIN CERTIFICATE-----\nMIIEXTCCA0WgAwIBAgIGATTEAjK3MA0GCSqGSIb3DQEBBQUAMIGDMRkwFwYDVQQD\nExBUZXN0IENBIFNUdWIgS2V5MRcwFQYDVQQLEw5QbGF0Zm9ybSBMYmFhczEaMBgG\nA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFDASBgNVBAcTC1NhbiBBbnRvbmlvMQ4w\nDAYDVQQIEwVUZXhhczELMAkGA1UEBhMCVVMwHhcNMTIwMTA5MTk0NjQ1WhcNMTQw\nMTA4MTk0NjQ1WjCBgjELMAkGA1UEBhMCVVMxDjAMBgNVBAgTBVRleGFzMRQwEgYD\nVQQHEwtTYW4gQW50b25pbzEaMBgGA1UEChMRUmFja3NwYWNlIEhvc3RpbmcxFzAV\nBgNVBAsTDlBsYXRmb3JtIExiYWFzMRgwFgYDVQQDEw9UZXN0IENsaWVudCBLZXkw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAi51IylFnHtNLT8C0NVfc\nOBfAsP2D5es1qhrOWHCGlgAuDMksBsCc7FPo5PSBOmQ+6z8HtCFbrLoC5/Zx0F5b\nfVegjA+xKjI2HGASsYHHM0BFEH2UjUcJrWiMWtxQuW6Phbqulo7JwjmygMEmIkeK\nf+FtkE9mrq+E8K40/thrjxl3/ZcJD1+3dcp+ZuzVJ2t1E4iGKCx79IZFsysKiuf+\n+E0i6iGvvI6UcbcZxVxQj2TplJkFuoX5kDgClIX9Dr9y6aJ4SCh+GRhvHl+DTaz0\nnCvghachHZtIeztRDqxWApjOOzs93dSelrviMXDr8fqyEAGg7YIhgui0aZBsWCen\nAgMBAAGjgdUwgdIwgbAGA1UdIwSBqDCBpYAUNpx1Pc6cGA7KqEwHMmHBTZMA7lSh\ngYmkgYYwgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVU4IBATAd\nBgNVHQ4EFgQULueOfsjZZOHwJHZwBy6u0swnpccwDQYJKoZIhvcNAQEFBQADggEB\nAFNuqSVUaotUJoWDv4z7Kbi6JFpTjDht5ORw4BdVYlRD4h9DACAFzPrPV2ym/Osp\nhNMdZq6msZku7MdOSQVhdeGWrSNk3M8O9Hg7cVzPNXOF3iNoo3irQ5tURut44xs4\nWw5YWQqS9WyUY5snD8tm7Y1rQTPfhg+678xIq/zWCv/u+FSnfVv1nlhLVQkEeG/Y\ngh1uMaTIpUKTGEjIAGtpGP7wwIcXptR/HyfzhTUSTaWc1Ef7zoKT9LL5z3IV1hC2\njVWz+RwYs98LjMuksJFoHqRfWyYhCIym0jb6GTwaEmpxAjc+d7OLNQdnoEGoUYGP\nYjtfkRYg265ESMA+Kww4Xy8=\n-----END CERTIFICATE-----\n",
-		IntCertificate: "-----BEGIN CERTIFICATE-----\nMIIDtTCCAp2gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzEZMBcGA1UEAxMQVGVz\ndCBDQSBTVHViIEtleTEXMBUGA1UECxMOUGxhdGZvcm0gTGJhYXMxGjAYBgNVBAoT\nEVJhY2tzcGFjZSBIb3N0aW5nMRQwEgYDVQQHEwtTYW4gQW50b25pbzEOMAwGA1UE\nCBMFVGV4YXMxCzAJBgNVBAYTAlVTMB4XDTEyMDEwOTE5NDU0OVoXDTE0MDEwODE5\nNDU0OVowgYMxGTAXBgNVBAMTEFRlc3QgQ0EgU1R1YiBLZXkxFzAVBgNVBAsTDlBs\nYXRmb3JtIExiYWFzMRowGAYDVQQKExFSYWNrc3BhY2UgSG9zdGluZzEUMBIGA1UE\nBxMLU2FuIEFudG9uaW8xDjAMBgNVBAgTBVRleGFzMQswCQYDVQQGEwJVUzCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANNh55lwTVwQvNoEZjq1zGdYz9jA\nXXdjizn8AJhjHLOAallfPtvCfTEgKanhdoyz5FnhQE8HbDAop/KNS1lN2UMvdl5f\nZNLTSjJrNtedqxQwxN/i3bpyBxNVejUH2NjV1mmyj+5CJYwCzWalvI/gLPq/A3as\nO2EQqtf3U8unRgn0zXLRdYxV9MrUzNAmdipPNvNrsVdrCgA42rgF/8KsyRVQfJCX\nfN7PGCfrsC3YaUvhymraWxNnXIzMYTNa9wEeBZLUw8SlEtpa1Zsvui+TPXu3USNZ\nVnWH8Lb6ENlnoX0VBwo62fjOG3JzhNKoJawi3bRqyDdINOvafr7iPrrs/T8CAwEA\nAaMyMDAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUNpx1Pc6cGA7KqEwHMmHB\nTZMA7lQwDQYJKoZIhvcNAQEFBQADggEBAMoRgH3iTG3t317viLKoY+lNMHUgHuR7\nb3mn9MidJKyYVewe6hCDIN6WY4fUojmMW9wFJWJIo0hRMNHL3n3tq8HP2j20Mxy8\nacPdfGZJa+jiBw72CrIGdobKaFduIlIEDBA1pNdZIJ+EulrtqrMesnIt92WaypIS\n8JycbIgDMCiyC0ENHEk8UWlC6429c7OZAsplMTbHME/1R4btxjkdfrYZJjdJ2yL2\n8cjZDUDMCPTdW/ycP07Gkq30RB5tACB5aZdaCn2YaKC8FsEdhff4X7xEOfOEHWEq\nSRxADDj8Lx1MT6QpR07hCiDyHfTCtbqzI0iGjX63Oh7xXSa0f+JVTa8=\n-----END CERTIFICATE-----\n",
-	}
-	th.AssertDeepEquals(t, expected, cm)
-}
-
-func TestDeleteCert(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockDeleteCertResponse(t, lbID, certID)
-
-	err := DeleteCert(client.ServiceClient(), lbID, certID).ExtractErr()
-	th.AssertNoErr(t, err)
-}
diff --git a/rackspace/lb/v1/ssl/results.go b/rackspace/lb/v1/ssl/results.go
deleted file mode 100644
index ead9fcd..0000000
--- a/rackspace/lb/v1/ssl/results.go
+++ /dev/null
@@ -1,148 +0,0 @@
-package ssl
-
-import (
-	"github.com/mitchellh/mapstructure"
-
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// SSLTermConfig represents the SSL configuration for a particular load balancer.
-type SSLTermConfig struct {
-	// The port on which the SSL termination load balancer listens for secure
-	// traffic. The value must be unique to the existing LB protocol/port
-	// combination
-	SecurePort int `mapstructure:"securePort"`
-
-	// The private key for the SSL certificate which is validated and verified
-	// against the provided certificates.
-	PrivateKey string `mapstructure:"privatekey"`
-
-	// The certificate used for SSL termination, which is validated and verified
-	// against the key and intermediate certificate if provided.
-	Certificate string
-
-	// The intermediate certificate (for the user). The intermediate certificate
-	// is validated and verified against the key and certificate credentials
-	// provided. A user may only provide this value when accompanied by a
-	// Certificate, PrivateKey, and SecurePort. It may not be added or updated as
-	// a single attribute in a future operation.
-	IntCertificate string `mapstructure:"intermediatecertificate"`
-
-	// Determines if the load balancer is enabled to terminate SSL traffic or not.
-	// If this is set to false, the load balancer retains its specified SSL
-	// attributes but does not terminate SSL traffic.
-	Enabled bool
-
-	// Determines if the load balancer can only accept secure traffic. If set to
-	// true, the load balancer will not accept non-secure traffic.
-	SecureTrafficOnly bool
-}
-
-// DeleteResult represents the result of a delete operation.
-type DeleteResult struct {
-	gophercloud.ErrResult
-}
-
-// UpdateResult represents the result of an update operation.
-type UpdateResult struct {
-	gophercloud.ErrResult
-}
-
-// GetResult represents the result of a get operation.
-type GetResult struct {
-	gophercloud.Result
-}
-
-// Extract interprets a GetResult as a SSLTermConfig struct, if possible.
-func (r GetResult) Extract() (*SSLTermConfig, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-
-	var response struct {
-		SSL SSLTermConfig `mapstructure:"sslTermination"`
-	}
-
-	err := mapstructure.Decode(r.Body, &response)
-
-	return &response.SSL, err
-}
-
-// Certificate represents an SSL certificate associated with an SSL-terminated
-// HTTP load balancer.
-type Certificate struct {
-	ID             int
-	HostName       string
-	Certificate    string
-	IntCertificate string `mapstructure:"intermediateCertificate"`
-}
-
-// CertPage represents a page of certificates.
-type CertPage struct {
-	pagination.LinkedPageBase
-}
-
-// IsEmpty checks whether a CertMappingPage struct is empty.
-func (p CertPage) IsEmpty() (bool, error) {
-	is, err := ExtractCerts(p)
-	if err != nil {
-		return true, nil
-	}
-	return len(is) == 0, nil
-}
-
-// ExtractCerts accepts a Page struct, specifically a CertPage struct, and
-// extracts the elements into a slice of Cert structs. In other words, a generic
-// collection is mapped into a relevant slice.
-func ExtractCerts(page pagination.Page) ([]Certificate, error) {
-	type NestedMap struct {
-		Cert Certificate `mapstructure:"certificateMapping" json:"certificateMapping"`
-	}
-	var resp struct {
-		Certs []NestedMap `mapstructure:"certificateMappings" json:"certificateMappings"`
-	}
-
-	err := mapstructure.Decode(page.(CertPage).Body, &resp)
-
-	slice := []Certificate{}
-	for _, cert := range resp.Certs {
-		slice = append(slice, cert.Cert)
-	}
-
-	return slice, err
-}
-
-type certResult struct {
-	gophercloud.Result
-}
-
-// Extract interprets a result as a CertMapping struct, if possible.
-func (r certResult) Extract() (*Certificate, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-
-	var response struct {
-		Cert Certificate `mapstructure:"certificateMapping"`
-	}
-
-	err := mapstructure.Decode(r.Body, &response)
-
-	return &response.Cert, err
-}
-
-// CreateCertResult represents the result of an CreateCert operation.
-type CreateCertResult struct {
-	certResult
-}
-
-// GetCertResult represents the result of a GetCert operation.
-type GetCertResult struct {
-	certResult
-}
-
-// UpdateCertResult represents the result of an UpdateCert operation.
-type UpdateCertResult struct {
-	certResult
-}
diff --git a/rackspace/lb/v1/ssl/urls.go b/rackspace/lb/v1/ssl/urls.go
deleted file mode 100644
index aa814b3..0000000
--- a/rackspace/lb/v1/ssl/urls.go
+++ /dev/null
@@ -1,25 +0,0 @@
-package ssl
-
-import (
-	"strconv"
-
-	"github.com/rackspace/gophercloud"
-)
-
-const (
-	path     = "loadbalancers"
-	sslPath  = "ssltermination"
-	certPath = "certificatemappings"
-)
-
-func rootURL(c *gophercloud.ServiceClient, id int) string {
-	return c.ServiceURL(path, strconv.Itoa(id), sslPath)
-}
-
-func certURL(c *gophercloud.ServiceClient, id int) string {
-	return c.ServiceURL(path, strconv.Itoa(id), sslPath, certPath)
-}
-
-func certResourceURL(c *gophercloud.ServiceClient, id, certID int) string {
-	return c.ServiceURL(path, strconv.Itoa(id), sslPath, certPath, strconv.Itoa(certID))
-}
diff --git a/rackspace/lb/v1/throttle/doc.go b/rackspace/lb/v1/throttle/doc.go
deleted file mode 100644
index 1ed605d..0000000
--- a/rackspace/lb/v1/throttle/doc.go
+++ /dev/null
@@ -1,5 +0,0 @@
-/*
-Package throttle provides information and interaction with the Connection
-Throttling feature of the Rackspace Cloud Load Balancer service.
-*/
-package throttle
diff --git a/rackspace/lb/v1/throttle/fixtures.go b/rackspace/lb/v1/throttle/fixtures.go
deleted file mode 100644
index f3e49fa..0000000
--- a/rackspace/lb/v1/throttle/fixtures.go
+++ /dev/null
@@ -1,62 +0,0 @@
-package throttle
-
-import (
-	"fmt"
-	"net/http"
-	"strconv"
-	"testing"
-
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func _rootURL(id int) string {
-	return "/loadbalancers/" + strconv.Itoa(id) + "/connectionthrottle"
-}
-
-func mockGetResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-  "connectionThrottle": {
-    "maxConnections": 100
-  }
-}
-`)
-	})
-}
-
-func mockCreateResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "PUT")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		th.TestJSONRequest(t, r, `
-{
-  "connectionThrottle": {
-    "maxConnectionRate": 0,
-    "maxConnections": 200,
-    "minConnections": 0,
-    "rateInterval": 0
-  }
-}
-    `)
-
-		w.WriteHeader(http.StatusAccepted)
-		fmt.Fprintf(w, `{}`)
-	})
-}
-
-func mockDeleteResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		w.WriteHeader(http.StatusAccepted)
-	})
-}
diff --git a/rackspace/lb/v1/throttle/requests.go b/rackspace/lb/v1/throttle/requests.go
deleted file mode 100644
index 0446b97..0000000
--- a/rackspace/lb/v1/throttle/requests.go
+++ /dev/null
@@ -1,76 +0,0 @@
-package throttle
-
-import (
-	"errors"
-
-	"github.com/rackspace/gophercloud"
-)
-
-// CreateOptsBuilder is the interface options structs have to satisfy in order
-// to be used in the main Create operation in this package.
-type CreateOptsBuilder interface {
-	ToCTCreateMap() (map[string]interface{}, error)
-}
-
-// CreateOpts is the common options struct used in this package's Create
-// operation.
-type CreateOpts struct {
-	// Required - the maximum amount of connections per IP address to allow per LB.
-	MaxConnections int
-
-	// Deprecated as of v1.22.
-	MaxConnectionRate int
-
-	// Deprecated as of v1.22.
-	MinConnections int
-
-	// Deprecated as of v1.22.
-	RateInterval int
-}
-
-// ToCTCreateMap casts a CreateOpts struct to a map.
-func (opts CreateOpts) ToCTCreateMap() (map[string]interface{}, error) {
-	ct := make(map[string]interface{})
-
-	if opts.MaxConnections < 0 || opts.MaxConnections > 100000 {
-		return ct, errors.New("MaxConnections must be an int between 0 and 100000")
-	}
-
-	ct["maxConnections"] = opts.MaxConnections
-	ct["maxConnectionRate"] = opts.MaxConnectionRate
-	ct["minConnections"] = opts.MinConnections
-	ct["rateInterval"] = opts.RateInterval
-
-	return map[string]interface{}{"connectionThrottle": ct}, nil
-}
-
-// Create is the operation responsible for creating or updating the connection
-// throttling configuration for a load balancer.
-func Create(c *gophercloud.ServiceClient, lbID int, opts CreateOptsBuilder) CreateResult {
-	var res CreateResult
-
-	reqBody, err := opts.ToCTCreateMap()
-	if err != nil {
-		res.Err = err
-		return res
-	}
-
-	_, res.Err = c.Put(rootURL(c, lbID), reqBody, &res.Body, nil)
-	return res
-}
-
-// Get is the operation responsible for showing the details of the connection
-// throttling configuration for a load balancer.
-func Get(c *gophercloud.ServiceClient, lbID int) GetResult {
-	var res GetResult
-	_, res.Err = c.Get(rootURL(c, lbID), &res.Body, nil)
-	return res
-}
-
-// Delete is the operation responsible for deleting the connection throttling
-// configuration for a load balancer.
-func Delete(c *gophercloud.ServiceClient, lbID int) DeleteResult {
-	var res DeleteResult
-	_, res.Err = c.Delete(rootURL(c, lbID), nil)
-	return res
-}
diff --git a/rackspace/lb/v1/throttle/requests_test.go b/rackspace/lb/v1/throttle/requests_test.go
deleted file mode 100644
index 6e9703f..0000000
--- a/rackspace/lb/v1/throttle/requests_test.go
+++ /dev/null
@@ -1,44 +0,0 @@
-package throttle
-
-import (
-	"testing"
-
-	th "github.com/rackspace/gophercloud/testhelper"
-	"github.com/rackspace/gophercloud/testhelper/client"
-)
-
-const lbID = 12345
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockCreateResponse(t, lbID)
-
-	opts := CreateOpts{MaxConnections: 200}
-	err := Create(client.ServiceClient(), lbID, opts).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockGetResponse(t, lbID)
-
-	sp, err := Get(client.ServiceClient(), lbID).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := &ConnectionThrottle{MaxConnections: 100}
-	th.AssertDeepEquals(t, expected, sp)
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockDeleteResponse(t, lbID)
-
-	err := Delete(client.ServiceClient(), lbID).ExtractErr()
-	th.AssertNoErr(t, err)
-}
diff --git a/rackspace/lb/v1/throttle/results.go b/rackspace/lb/v1/throttle/results.go
deleted file mode 100644
index db93c6f..0000000
--- a/rackspace/lb/v1/throttle/results.go
+++ /dev/null
@@ -1,43 +0,0 @@
-package throttle
-
-import (
-	"github.com/mitchellh/mapstructure"
-
-	"github.com/rackspace/gophercloud"
-)
-
-// ConnectionThrottle represents the connection throttle configuration for a
-// particular load balancer.
-type ConnectionThrottle struct {
-	MaxConnections int
-}
-
-// CreateResult represents the result of a create operation.
-type CreateResult struct {
-	gophercloud.ErrResult
-}
-
-// DeleteResult represents the result of a delete operation.
-type DeleteResult struct {
-	gophercloud.ErrResult
-}
-
-// GetResult represents the result of a get operation.
-type GetResult struct {
-	gophercloud.Result
-}
-
-// Extract interprets a GetResult as a SP, if possible.
-func (r GetResult) Extract() (*ConnectionThrottle, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-
-	var response struct {
-		CT ConnectionThrottle `mapstructure:"connectionThrottle"`
-	}
-
-	err := mapstructure.Decode(r.Body, &response)
-
-	return &response.CT, err
-}
diff --git a/rackspace/lb/v1/throttle/urls.go b/rackspace/lb/v1/throttle/urls.go
deleted file mode 100644
index b77f0ac..0000000
--- a/rackspace/lb/v1/throttle/urls.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package throttle
-
-import (
-	"strconv"
-
-	"github.com/rackspace/gophercloud"
-)
-
-const (
-	path   = "loadbalancers"
-	ctPath = "connectionthrottle"
-)
-
-func rootURL(c *gophercloud.ServiceClient, id int) string {
-	return c.ServiceURL(path, strconv.Itoa(id), ctPath)
-}
diff --git a/rackspace/lb/v1/vips/doc.go b/rackspace/lb/v1/vips/doc.go
deleted file mode 100644
index 5c3846d..0000000
--- a/rackspace/lb/v1/vips/doc.go
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
-Package vips provides information and interaction with the Virtual IP API
-resource for the Rackspace Cloud Load Balancer service.
-
-A virtual IP (VIP) makes a load balancer accessible by clients. The load
-balancing service supports either a public VIP, routable on the public Internet,
-or a ServiceNet address, routable only within the region in which the load
-balancer resides.
-
-All load balancers must have at least one virtual IP associated with them at
-all times.
-*/
-package vips
diff --git a/rackspace/lb/v1/vips/fixtures.go b/rackspace/lb/v1/vips/fixtures.go
deleted file mode 100644
index 158759f..0000000
--- a/rackspace/lb/v1/vips/fixtures.go
+++ /dev/null
@@ -1,88 +0,0 @@
-package vips
-
-import (
-	"fmt"
-	"net/http"
-	"strconv"
-	"testing"
-
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func _rootURL(lbID int) string {
-	return "/loadbalancers/" + strconv.Itoa(lbID) + "/virtualips"
-}
-
-func mockListResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-  "virtualIps": [
-    {
-      "id": 1000,
-      "address": "206.10.10.210",
-      "type": "PUBLIC"
-    }
-  ]
-}
-  `)
-	})
-}
-
-func mockCreateResponse(t *testing.T, lbID int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "POST")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		th.TestJSONRequest(t, r, `
-{
-    "type":"PUBLIC",
-    "ipVersion":"IPV6"
-}
-    `)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusAccepted)
-
-		fmt.Fprintf(w, `
-{
-    "address":"fd24:f480:ce44:91bc:1af2:15ff:0000:0002",
-    "id":9000134,
-    "type":"PUBLIC",
-    "ipVersion":"IPV6"
-}
-  `)
-	})
-}
-
-func mockBatchDeleteResponse(t *testing.T, lbID int, ids []int) {
-	th.Mux.HandleFunc(_rootURL(lbID), func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		r.ParseForm()
-
-		for k, v := range ids {
-			fids := r.Form["id"]
-			th.AssertEquals(t, strconv.Itoa(v), fids[k])
-		}
-
-		w.WriteHeader(http.StatusAccepted)
-	})
-}
-
-func mockDeleteResponse(t *testing.T, lbID, vipID int) {
-	url := _rootURL(lbID) + "/" + strconv.Itoa(vipID)
-	th.Mux.HandleFunc(url, func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		w.WriteHeader(http.StatusAccepted)
-	})
-}
diff --git a/rackspace/lb/v1/vips/requests.go b/rackspace/lb/v1/vips/requests.go
deleted file mode 100644
index 2bc924f..0000000
--- a/rackspace/lb/v1/vips/requests.go
+++ /dev/null
@@ -1,97 +0,0 @@
-package vips
-
-import (
-	"errors"
-
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List is the operation responsible for returning a paginated collection of
-// load balancer virtual IP addresses.
-func List(client *gophercloud.ServiceClient, loadBalancerID int) pagination.Pager {
-	url := rootURL(client, loadBalancerID)
-	return pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page {
-		return VIPPage{pagination.SinglePageBase(r)}
-	})
-}
-
-// CreateOptsBuilder is the interface options structs have to satisfy in order
-// to be used in the main Create operation in this package. Since many
-// extensions decorate or modify the common logic, it is useful for them to
-// satisfy a basic interface in order for them to be used.
-type CreateOptsBuilder interface {
-	ToVIPCreateMap() (map[string]interface{}, error)
-}
-
-// CreateOpts is the common options struct used in this package's Create
-// operation.
-type CreateOpts struct {
-	// Optional - the ID of an existing virtual IP. By doing this, you are
-	// allowing load balancers to share IPV6 addresses.
-	ID string
-
-	// Optional - the type of address.
-	Type Type
-
-	// Optional - the version of address.
-	Version Version
-}
-
-// ToVIPCreateMap casts a CreateOpts struct to a map.
-func (opts CreateOpts) ToVIPCreateMap() (map[string]interface{}, error) {
-	lb := make(map[string]interface{})
-
-	if opts.ID != "" {
-		lb["id"] = opts.ID
-	}
-	if opts.Type != "" {
-		lb["type"] = opts.Type
-	}
-	if opts.Version != "" {
-		lb["ipVersion"] = opts.Version
-	}
-
-	return lb, nil
-}
-
-// Create is the operation responsible for assigning a new Virtual IP to an
-// existing load balancer resource. Currently, only version 6 IP addresses may
-// be added.
-func Create(c *gophercloud.ServiceClient, lbID int, opts CreateOptsBuilder) CreateResult {
-	var res CreateResult
-
-	reqBody, err := opts.ToVIPCreateMap()
-	if err != nil {
-		res.Err = err
-		return res
-	}
-
-	_, res.Err = c.Post(rootURL(c, lbID), reqBody, &res.Body, nil)
-	return res
-}
-
-// BulkDelete is the operation responsible for batch deleting multiple VIPs in
-// a single operation. It accepts a slice of integer IDs and will remove them
-// from the load balancer. The maximum limit is 10 VIP removals at once.
-func BulkDelete(c *gophercloud.ServiceClient, loadBalancerID int, vipIDs []int) DeleteResult {
-	var res DeleteResult
-
-	if len(vipIDs) > 10 || len(vipIDs) == 0 {
-		res.Err = errors.New("You must provide a minimum of 1 and a maximum of 10 VIP IDs")
-		return res
-	}
-
-	url := rootURL(c, loadBalancerID)
-	url += gophercloud.IDSliceToQueryString("id", vipIDs)
-
-	_, res.Err = c.Delete(url, nil)
-	return res
-}
-
-// Delete is the operation responsible for permanently deleting a VIP.
-func Delete(c *gophercloud.ServiceClient, lbID, vipID int) DeleteResult {
-	var res DeleteResult
-	_, res.Err = c.Delete(resourceURL(c, lbID, vipID), nil)
-	return res
-}
diff --git a/rackspace/lb/v1/vips/requests_test.go b/rackspace/lb/v1/vips/requests_test.go
deleted file mode 100644
index 74ac461..0000000
--- a/rackspace/lb/v1/vips/requests_test.go
+++ /dev/null
@@ -1,87 +0,0 @@
-package vips
-
-import (
-	"testing"
-
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	"github.com/rackspace/gophercloud/testhelper/client"
-)
-
-const (
-	lbID   = 12345
-	vipID  = 67890
-	vipID2 = 67891
-)
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockListResponse(t, lbID)
-
-	count := 0
-
-	err := List(client.ServiceClient(), lbID).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractVIPs(page)
-		th.AssertNoErr(t, err)
-
-		expected := []VIP{
-			VIP{ID: 1000, Address: "206.10.10.210", Type: "PUBLIC"},
-		}
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, 1, count)
-}
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockCreateResponse(t, lbID)
-
-	opts := CreateOpts{
-		Type:    "PUBLIC",
-		Version: "IPV6",
-	}
-
-	vip, err := Create(client.ServiceClient(), lbID, opts).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := &VIP{
-		Address: "fd24:f480:ce44:91bc:1af2:15ff:0000:0002",
-		ID:      9000134,
-		Type:    "PUBLIC",
-		Version: "IPV6",
-	}
-
-	th.CheckDeepEquals(t, expected, vip)
-}
-
-func TestBulkDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	ids := []int{vipID, vipID2}
-
-	mockBatchDeleteResponse(t, lbID, ids)
-
-	err := BulkDelete(client.ServiceClient(), lbID, ids).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	mockDeleteResponse(t, lbID, vipID)
-
-	err := Delete(client.ServiceClient(), lbID, vipID).ExtractErr()
-	th.AssertNoErr(t, err)
-}
diff --git a/rackspace/lb/v1/vips/results.go b/rackspace/lb/v1/vips/results.go
deleted file mode 100644
index 678b2af..0000000
--- a/rackspace/lb/v1/vips/results.go
+++ /dev/null
@@ -1,89 +0,0 @@
-package vips
-
-import (
-	"github.com/mitchellh/mapstructure"
-
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// VIP represents a Virtual IP API resource.
-type VIP struct {
-	Address string  `json:"address,omitempty"`
-	ID      int     `json:"id,omitempty"`
-	Type    Type    `json:"type,omitempty"`
-	Version Version `json:"ipVersion,omitempty" mapstructure:"ipVersion"`
-}
-
-// Version represents the version of a VIP.
-type Version string
-
-// Convenient constants to use for type
-const (
-	IPV4 Version = "IPV4"
-	IPV6 Version = "IPV6"
-)
-
-// Type represents the type of a VIP.
-type Type string
-
-const (
-	// PUBLIC indicates a VIP type that is routable on the public Internet.
-	PUBLIC Type = "PUBLIC"
-
-	// PRIVATE indicates a VIP type that is routable only on ServiceNet.
-	PRIVATE Type = "SERVICENET"
-)
-
-// VIPPage is the page returned by a pager when traversing over a collection
-// of VIPs.
-type VIPPage struct {
-	pagination.SinglePageBase
-}
-
-// IsEmpty checks whether a VIPPage struct is empty.
-func (p VIPPage) IsEmpty() (bool, error) {
-	is, err := ExtractVIPs(p)
-	if err != nil {
-		return true, nil
-	}
-	return len(is) == 0, nil
-}
-
-// ExtractVIPs accepts a Page struct, specifically a VIPPage struct, and
-// extracts the elements into a slice of VIP structs. In other words, a
-// generic collection is mapped into a relevant slice.
-func ExtractVIPs(page pagination.Page) ([]VIP, error) {
-	var resp struct {
-		VIPs []VIP `mapstructure:"virtualIps" json:"virtualIps"`
-	}
-
-	err := mapstructure.Decode(page.(VIPPage).Body, &resp)
-
-	return resp.VIPs, err
-}
-
-type commonResult struct {
-	gophercloud.Result
-}
-
-func (r commonResult) Extract() (*VIP, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-
-	resp := &VIP{}
-	err := mapstructure.Decode(r.Body, resp)
-
-	return resp, err
-}
-
-// CreateResult represents the result of a create operation.
-type CreateResult struct {
-	commonResult
-}
-
-// DeleteResult represents the result of a delete operation.
-type DeleteResult struct {
-	gophercloud.ErrResult
-}
diff --git a/rackspace/lb/v1/vips/urls.go b/rackspace/lb/v1/vips/urls.go
deleted file mode 100644
index 28f063a..0000000
--- a/rackspace/lb/v1/vips/urls.go
+++ /dev/null
@@ -1,20 +0,0 @@
-package vips
-
-import (
-	"strconv"
-
-	"github.com/rackspace/gophercloud"
-)
-
-const (
-	lbPath  = "loadbalancers"
-	vipPath = "virtualips"
-)
-
-func resourceURL(c *gophercloud.ServiceClient, lbID, nodeID int) string {
-	return c.ServiceURL(lbPath, strconv.Itoa(lbID), vipPath, strconv.Itoa(nodeID))
-}
-
-func rootURL(c *gophercloud.ServiceClient, lbID int) string {
-	return c.ServiceURL(lbPath, strconv.Itoa(lbID), vipPath)
-}
diff --git a/rackspace/networking/v2/common/common_tests.go b/rackspace/networking/v2/common/common_tests.go
deleted file mode 100644
index 129cd63..0000000
--- a/rackspace/networking/v2/common/common_tests.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package common
-
-import (
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/testhelper/client"
-)
-
-const TokenID = client.TokenID
-
-func ServiceClient() *gophercloud.ServiceClient {
-	return client.ServiceClient()
-}
diff --git a/rackspace/networking/v2/networks/delegate.go b/rackspace/networking/v2/networks/delegate.go
deleted file mode 100644
index dcb0855..0000000
--- a/rackspace/networking/v2/networks/delegate.go
+++ /dev/null
@@ -1,41 +0,0 @@
-package networks
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/networking/v2/networks"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List returns a Pager which allows you to iterate over a collection of
-// networks. It accepts a ListOpts struct, which allows you to filter and sort
-// the returned collection for greater efficiency.
-func List(c *gophercloud.ServiceClient, opts os.ListOptsBuilder) pagination.Pager {
-	return os.List(c, opts)
-}
-
-// Get retrieves a specific network based on its unique ID.
-func Get(c *gophercloud.ServiceClient, networkID string) os.GetResult {
-	return os.Get(c, networkID)
-}
-
-// Create accepts a CreateOpts struct and creates a new network using the values
-// provided. This operation does not actually require a request body, i.e. the
-// CreateOpts struct argument can be empty.
-//
-// The tenant ID that is contained in the URI is the tenant that creates the
-// network. An admin user, however, has the option of specifying another tenant
-// ID in the CreateOpts struct.
-func Create(c *gophercloud.ServiceClient, opts os.CreateOptsBuilder) os.CreateResult {
-	return os.Create(c, opts)
-}
-
-// Update accepts a UpdateOpts struct and updates an existing network using the
-// values provided. For more information, see the Create function.
-func Update(c *gophercloud.ServiceClient, networkID string, opts os.UpdateOptsBuilder) os.UpdateResult {
-	return os.Update(c, networkID, opts)
-}
-
-// Delete accepts a unique ID and deletes the network associated with it.
-func Delete(c *gophercloud.ServiceClient, networkID string) os.DeleteResult {
-	return os.Delete(c, networkID)
-}
diff --git a/rackspace/networking/v2/networks/delegate_test.go b/rackspace/networking/v2/networks/delegate_test.go
deleted file mode 100644
index 0b3a6b1..0000000
--- a/rackspace/networking/v2/networks/delegate_test.go
+++ /dev/null
@@ -1,285 +0,0 @@
-package networks
-
-import (
-	"fmt"
-	"net/http"
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/networking/v2/networks"
-	"github.com/rackspace/gophercloud/pagination"
-	fake "github.com/rackspace/gophercloud/rackspace/networking/v2/common"
-	th "github.com/rackspace/gophercloud/testhelper"
-)
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/networks", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-    "networks": [
-        {
-            "status": "ACTIVE",
-            "subnets": [
-                "54d6f61d-db07-451c-9ab3-b9609b6b6f0b"
-            ],
-            "name": "private-network",
-            "admin_state_up": true,
-            "tenant_id": "4fd44f30292945e481c7b8a0c8908869",
-            "shared": true,
-            "id": "d32019d3-bc6e-4319-9c1d-6722fc136a22"
-        },
-        {
-            "status": "ACTIVE",
-            "subnets": [
-                "08eae331-0402-425a-923c-34f7cfe39c1b"
-            ],
-            "name": "private",
-            "admin_state_up": true,
-            "tenant_id": "26a7980765d0414dbc1fc1f88cdb7e6e",
-            "shared": true,
-            "id": "db193ab3-96e3-4cb3-8fc5-05f4296d0324"
-        }
-    ]
-}
-      `)
-	})
-
-	client := fake.ServiceClient()
-	count := 0
-
-	List(client, os.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := os.ExtractNetworks(page)
-		if err != nil {
-			t.Errorf("Failed to extract networks: %v", err)
-			return false, err
-		}
-
-		expected := []os.Network{
-			os.Network{
-				Status:       "ACTIVE",
-				Subnets:      []string{"54d6f61d-db07-451c-9ab3-b9609b6b6f0b"},
-				Name:         "private-network",
-				AdminStateUp: true,
-				TenantID:     "4fd44f30292945e481c7b8a0c8908869",
-				Shared:       true,
-				ID:           "d32019d3-bc6e-4319-9c1d-6722fc136a22",
-			},
-			os.Network{
-				Status:       "ACTIVE",
-				Subnets:      []string{"08eae331-0402-425a-923c-34f7cfe39c1b"},
-				Name:         "private",
-				AdminStateUp: true,
-				TenantID:     "26a7980765d0414dbc1fc1f88cdb7e6e",
-				Shared:       true,
-				ID:           "db193ab3-96e3-4cb3-8fc5-05f4296d0324",
-			},
-		}
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-
-	if count != 1 {
-		t.Errorf("Expected 1 page, got %d", count)
-	}
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/networks/d32019d3-bc6e-4319-9c1d-6722fc136a22", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-		"network": {
-				"status": "ACTIVE",
-				"subnets": [
-						"54d6f61d-db07-451c-9ab3-b9609b6b6f0b"
-				],
-				"name": "private-network",
-				"admin_state_up": true,
-				"tenant_id": "4fd44f30292945e481c7b8a0c8908869",
-				"shared": true,
-				"id": "d32019d3-bc6e-4319-9c1d-6722fc136a22"
-		}
-}
-			`)
-	})
-
-	n, err := Get(fake.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22").Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertEquals(t, n.Status, "ACTIVE")
-	th.AssertDeepEquals(t, n.Subnets, []string{"54d6f61d-db07-451c-9ab3-b9609b6b6f0b"})
-	th.AssertEquals(t, n.Name, "private-network")
-	th.AssertEquals(t, n.AdminStateUp, true)
-	th.AssertEquals(t, n.TenantID, "4fd44f30292945e481c7b8a0c8908869")
-	th.AssertEquals(t, n.Shared, true)
-	th.AssertEquals(t, n.ID, "d32019d3-bc6e-4319-9c1d-6722fc136a22")
-}
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/networks", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "POST")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Content-Type", "application/json")
-		th.TestHeader(t, r, "Accept", "application/json")
-		th.TestJSONRequest(t, r, `
-{
-		"network": {
-				"name": "sample_network",
-				"admin_state_up": true
-		}
-}
-			`)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusCreated)
-
-		fmt.Fprintf(w, `
-{
-		"network": {
-				"status": "ACTIVE",
-				"subnets": [],
-				"name": "net1",
-				"admin_state_up": true,
-				"tenant_id": "9bacb3c5d39d41a79512987f338cf177",
-				"shared": false,
-				"id": "4e8e5957-649f-477b-9e5b-f1f75b21c03c"
-		}
-}
-		`)
-	})
-
-	iTrue := true
-	options := os.CreateOpts{Name: "sample_network", AdminStateUp: &iTrue}
-	n, err := Create(fake.ServiceClient(), options).Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertEquals(t, n.Status, "ACTIVE")
-	th.AssertDeepEquals(t, n.Subnets, []string{})
-	th.AssertEquals(t, n.Name, "net1")
-	th.AssertEquals(t, n.AdminStateUp, true)
-	th.AssertEquals(t, n.TenantID, "9bacb3c5d39d41a79512987f338cf177")
-	th.AssertEquals(t, n.Shared, false)
-	th.AssertEquals(t, n.ID, "4e8e5957-649f-477b-9e5b-f1f75b21c03c")
-}
-
-func TestCreateWithOptionalFields(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/networks", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "POST")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Content-Type", "application/json")
-		th.TestHeader(t, r, "Accept", "application/json")
-		th.TestJSONRequest(t, r, `
-{
-	"network": {
-			"name": "sample_network",
-			"admin_state_up": true,
-			"shared": true,
-			"tenant_id": "12345"
-	}
-}
-		`)
-		w.WriteHeader(http.StatusCreated)
-		fmt.Fprintf(w, `
-{
-	"network": {
-			"name": "sample_network",
-			"admin_state_up": true,
-			"shared": true,
-			"tenant_id": "12345"
-	}
-}
-		`)
-	})
-
-	iTrue := true
-	options := os.CreateOpts{Name: "sample_network", AdminStateUp: &iTrue, Shared: &iTrue, TenantID: "12345"}
-	_, err := Create(fake.ServiceClient(), options).Extract()
-	th.AssertNoErr(t, err)
-}
-
-func TestUpdate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/networks/4e8e5957-649f-477b-9e5b-f1f75b21c03c", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "PUT")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Content-Type", "application/json")
-		th.TestHeader(t, r, "Accept", "application/json")
-		th.TestJSONRequest(t, r, `
-{
-		"network": {
-				"name": "new_network_name",
-				"admin_state_up": false,
-				"shared": true
-		}
-}
-			`)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-		"network": {
-				"status": "ACTIVE",
-				"subnets": [],
-				"name": "new_network_name",
-				"admin_state_up": false,
-				"tenant_id": "4fd44f30292945e481c7b8a0c8908869",
-				"shared": true,
-				"id": "4e8e5957-649f-477b-9e5b-f1f75b21c03c"
-		}
-}
-		`)
-	})
-
-	iTrue := true
-	options := os.UpdateOpts{Name: "new_network_name", AdminStateUp: os.Down, Shared: &iTrue}
-	n, err := Update(fake.ServiceClient(), "4e8e5957-649f-477b-9e5b-f1f75b21c03c", options).Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertEquals(t, n.Name, "new_network_name")
-	th.AssertEquals(t, n.AdminStateUp, false)
-	th.AssertEquals(t, n.Shared, true)
-	th.AssertEquals(t, n.ID, "4e8e5957-649f-477b-9e5b-f1f75b21c03c")
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/networks/4e8e5957-649f-477b-9e5b-f1f75b21c03c", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		w.WriteHeader(http.StatusNoContent)
-	})
-
-	res := Delete(fake.ServiceClient(), "4e8e5957-649f-477b-9e5b-f1f75b21c03c")
-	th.AssertNoErr(t, res.Err)
-}
diff --git a/rackspace/networking/v2/ports/delegate.go b/rackspace/networking/v2/ports/delegate.go
deleted file mode 100644
index 95728d1..0000000
--- a/rackspace/networking/v2/ports/delegate.go
+++ /dev/null
@@ -1,43 +0,0 @@
-package ports
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/networking/v2/ports"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List returns a Pager which allows you to iterate over a collection of
-// ports. It accepts a ListOpts struct, which allows you to filter and sort
-// the returned collection for greater efficiency.
-//
-// Default policy settings return only those ports that are owned by the tenant
-// who submits the request, unless the request is submitted by a user with
-// administrative rights.
-func List(c *gophercloud.ServiceClient, opts os.ListOptsBuilder) pagination.Pager {
-	return os.List(c, opts)
-}
-
-// Get retrieves a specific port based on its unique ID.
-func Get(c *gophercloud.ServiceClient, networkID string) os.GetResult {
-	return os.Get(c, networkID)
-}
-
-// Create accepts a CreateOpts struct and creates a new network using the values
-// provided. You must remember to provide a NetworkID value.
-//
-// NOTE: Currently the SecurityGroup option is not implemented to work with
-// Rackspace.
-func Create(c *gophercloud.ServiceClient, opts os.CreateOptsBuilder) os.CreateResult {
-	return os.Create(c, opts)
-}
-
-// Update accepts a UpdateOpts struct and updates an existing port using the
-// values provided.
-func Update(c *gophercloud.ServiceClient, networkID string, opts os.UpdateOptsBuilder) os.UpdateResult {
-	return os.Update(c, networkID, opts)
-}
-
-// Delete accepts a unique ID and deletes the port associated with it.
-func Delete(c *gophercloud.ServiceClient, networkID string) os.DeleteResult {
-	return os.Delete(c, networkID)
-}
diff --git a/rackspace/networking/v2/ports/delegate_test.go b/rackspace/networking/v2/ports/delegate_test.go
deleted file mode 100644
index f53ff59..0000000
--- a/rackspace/networking/v2/ports/delegate_test.go
+++ /dev/null
@@ -1,322 +0,0 @@
-package ports
-
-import (
-	"fmt"
-	"net/http"
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/networking/v2/ports"
-	"github.com/rackspace/gophercloud/pagination"
-	fake "github.com/rackspace/gophercloud/rackspace/networking/v2/common"
-	th "github.com/rackspace/gophercloud/testhelper"
-)
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/ports", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-    "ports": [
-        {
-            "status": "ACTIVE",
-            "binding:host_id": "devstack",
-            "name": "",
-            "admin_state_up": true,
-            "network_id": "70c1db1f-b701-45bd-96e0-a313ee3430b3",
-            "tenant_id": "",
-            "device_owner": "network:router_gateway",
-            "mac_address": "fa:16:3e:58:42:ed",
-            "fixed_ips": [
-                {
-                    "subnet_id": "008ba151-0b8c-4a67-98b5-0d2b87666062",
-                    "ip_address": "172.24.4.2"
-                }
-            ],
-            "id": "d80b1a3b-4fc1-49f3-952e-1e2ab7081d8b",
-            "security_groups": [],
-            "device_id": "9ae135f4-b6e0-4dad-9e91-3c223e385824"
-        }
-    ]
-}
-      `)
-	})
-
-	count := 0
-
-	List(fake.ServiceClient(), os.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := os.ExtractPorts(page)
-		if err != nil {
-			t.Errorf("Failed to extract subnets: %v", err)
-			return false, nil
-		}
-
-		expected := []os.Port{
-			os.Port{
-				Status:       "ACTIVE",
-				Name:         "",
-				AdminStateUp: true,
-				NetworkID:    "70c1db1f-b701-45bd-96e0-a313ee3430b3",
-				TenantID:     "",
-				DeviceOwner:  "network:router_gateway",
-				MACAddress:   "fa:16:3e:58:42:ed",
-				FixedIPs: []os.IP{
-					os.IP{
-						SubnetID:  "008ba151-0b8c-4a67-98b5-0d2b87666062",
-						IPAddress: "172.24.4.2",
-					},
-				},
-				ID:             "d80b1a3b-4fc1-49f3-952e-1e2ab7081d8b",
-				SecurityGroups: []string{},
-				DeviceID:       "9ae135f4-b6e0-4dad-9e91-3c223e385824",
-			},
-		}
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-
-	if count != 1 {
-		t.Errorf("Expected 1 page, got %d", count)
-	}
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/ports/46d4bfb9-b26e-41f3-bd2e-e6dcc1ccedb2", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-    "port": {
-        "status": "ACTIVE",
-        "name": "",
-        "admin_state_up": true,
-        "network_id": "a87cc70a-3e15-4acf-8205-9b711a3531b7",
-        "tenant_id": "7e02058126cc4950b75f9970368ba177",
-        "device_owner": "network:router_interface",
-        "mac_address": "fa:16:3e:23:fd:d7",
-        "fixed_ips": [
-            {
-                "subnet_id": "a0304c3a-4f08-4c43-88af-d796509c97d2",
-                "ip_address": "10.0.0.1"
-            }
-        ],
-        "id": "46d4bfb9-b26e-41f3-bd2e-e6dcc1ccedb2",
-        "security_groups": [],
-        "device_id": "5e3898d7-11be-483e-9732-b2f5eccd2b2e"
-    }
-}
-      `)
-	})
-
-	n, err := Get(fake.ServiceClient(), "46d4bfb9-b26e-41f3-bd2e-e6dcc1ccedb2").Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertEquals(t, n.Status, "ACTIVE")
-	th.AssertEquals(t, n.Name, "")
-	th.AssertEquals(t, n.AdminStateUp, true)
-	th.AssertEquals(t, n.NetworkID, "a87cc70a-3e15-4acf-8205-9b711a3531b7")
-	th.AssertEquals(t, n.TenantID, "7e02058126cc4950b75f9970368ba177")
-	th.AssertEquals(t, n.DeviceOwner, "network:router_interface")
-	th.AssertEquals(t, n.MACAddress, "fa:16:3e:23:fd:d7")
-	th.AssertDeepEquals(t, n.FixedIPs, []os.IP{
-		os.IP{SubnetID: "a0304c3a-4f08-4c43-88af-d796509c97d2", IPAddress: "10.0.0.1"},
-	})
-	th.AssertEquals(t, n.ID, "46d4bfb9-b26e-41f3-bd2e-e6dcc1ccedb2")
-	th.AssertDeepEquals(t, n.SecurityGroups, []string{})
-	th.AssertEquals(t, n.Status, "ACTIVE")
-	th.AssertEquals(t, n.DeviceID, "5e3898d7-11be-483e-9732-b2f5eccd2b2e")
-}
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/ports", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "POST")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Content-Type", "application/json")
-		th.TestHeader(t, r, "Accept", "application/json")
-		th.TestJSONRequest(t, r, `
-{
-    "port": {
-        "network_id": "a87cc70a-3e15-4acf-8205-9b711a3531b7",
-        "name": "private-port",
-        "admin_state_up": true,
-        "fixed_ips": [
-            {
-                "subnet_id": "a0304c3a-4f08-4c43-88af-d796509c97d2",
-                "ip_address": "10.0.0.2"
-            }
-        ],
-        "security_groups": ["foo"]
-    }
-}
-      `)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusCreated)
-
-		fmt.Fprintf(w, `
-{
-    "port": {
-        "status": "DOWN",
-        "name": "private-port",
-        "allowed_address_pairs": [],
-        "admin_state_up": true,
-        "network_id": "a87cc70a-3e15-4acf-8205-9b711a3531b7",
-        "tenant_id": "d6700c0c9ffa4f1cb322cd4a1f3906fa",
-        "device_owner": "",
-        "mac_address": "fa:16:3e:c9:cb:f0",
-        "fixed_ips": [
-            {
-                "subnet_id": "a0304c3a-4f08-4c43-88af-d796509c97d2",
-                "ip_address": "10.0.0.2"
-            }
-        ],
-        "id": "65c0ee9f-d634-4522-8954-51021b570b0d",
-        "security_groups": [
-            "f0ac4394-7e4a-4409-9701-ba8be283dbc3"
-        ],
-        "device_id": ""
-    }
-}
-    `)
-	})
-
-	asu := true
-	options := os.CreateOpts{
-		Name:         "private-port",
-		AdminStateUp: &asu,
-		NetworkID:    "a87cc70a-3e15-4acf-8205-9b711a3531b7",
-		FixedIPs: []os.IP{
-			os.IP{SubnetID: "a0304c3a-4f08-4c43-88af-d796509c97d2", IPAddress: "10.0.0.2"},
-		},
-		SecurityGroups: []string{"foo"},
-	}
-	n, err := Create(fake.ServiceClient(), options).Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertEquals(t, n.Status, "DOWN")
-	th.AssertEquals(t, n.Name, "private-port")
-	th.AssertEquals(t, n.AdminStateUp, true)
-	th.AssertEquals(t, n.NetworkID, "a87cc70a-3e15-4acf-8205-9b711a3531b7")
-	th.AssertEquals(t, n.TenantID, "d6700c0c9ffa4f1cb322cd4a1f3906fa")
-	th.AssertEquals(t, n.DeviceOwner, "")
-	th.AssertEquals(t, n.MACAddress, "fa:16:3e:c9:cb:f0")
-	th.AssertDeepEquals(t, n.FixedIPs, []os.IP{
-		os.IP{SubnetID: "a0304c3a-4f08-4c43-88af-d796509c97d2", IPAddress: "10.0.0.2"},
-	})
-	th.AssertEquals(t, n.ID, "65c0ee9f-d634-4522-8954-51021b570b0d")
-	th.AssertDeepEquals(t, n.SecurityGroups, []string{"f0ac4394-7e4a-4409-9701-ba8be283dbc3"})
-}
-
-func TestRequiredCreateOpts(t *testing.T) {
-	res := Create(fake.ServiceClient(), os.CreateOpts{})
-	if res.Err == nil {
-		t.Fatalf("Expected error, got none")
-	}
-}
-
-func TestUpdate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/ports/65c0ee9f-d634-4522-8954-51021b570b0d", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "PUT")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Content-Type", "application/json")
-		th.TestHeader(t, r, "Accept", "application/json")
-		th.TestJSONRequest(t, r, `
-{
-    "port": {
-        "name": "new_port_name",
-        "fixed_ips": [
-            {
-                "subnet_id": "a0304c3a-4f08-4c43-88af-d796509c97d2",
-                "ip_address": "10.0.0.3"
-            }
-        ],
-        "security_groups": [
-            "f0ac4394-7e4a-4409-9701-ba8be283dbc3"
-        ]
-    }
-}
-      `)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-    "port": {
-        "status": "DOWN",
-        "name": "new_port_name",
-        "admin_state_up": true,
-        "network_id": "a87cc70a-3e15-4acf-8205-9b711a3531b7",
-        "tenant_id": "d6700c0c9ffa4f1cb322cd4a1f3906fa",
-        "device_owner": "",
-        "mac_address": "fa:16:3e:c9:cb:f0",
-        "fixed_ips": [
-            {
-                "subnet_id": "a0304c3a-4f08-4c43-88af-d796509c97d2",
-                "ip_address": "10.0.0.3"
-            }
-        ],
-        "id": "65c0ee9f-d634-4522-8954-51021b570b0d",
-        "security_groups": [
-            "f0ac4394-7e4a-4409-9701-ba8be283dbc3"
-        ],
-        "device_id": ""
-    }
-}
-    `)
-	})
-
-	options := os.UpdateOpts{
-		Name: "new_port_name",
-		FixedIPs: []os.IP{
-			os.IP{SubnetID: "a0304c3a-4f08-4c43-88af-d796509c97d2", IPAddress: "10.0.0.3"},
-		},
-		SecurityGroups: []string{"f0ac4394-7e4a-4409-9701-ba8be283dbc3"},
-	}
-
-	s, err := Update(fake.ServiceClient(), "65c0ee9f-d634-4522-8954-51021b570b0d", options).Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertEquals(t, s.Name, "new_port_name")
-	th.AssertDeepEquals(t, s.FixedIPs, []os.IP{
-		os.IP{SubnetID: "a0304c3a-4f08-4c43-88af-d796509c97d2", IPAddress: "10.0.0.3"},
-	})
-	th.AssertDeepEquals(t, s.SecurityGroups, []string{"f0ac4394-7e4a-4409-9701-ba8be283dbc3"})
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/ports/65c0ee9f-d634-4522-8954-51021b570b0d", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		w.WriteHeader(http.StatusNoContent)
-	})
-
-	res := Delete(fake.ServiceClient(), "65c0ee9f-d634-4522-8954-51021b570b0d")
-	th.AssertNoErr(t, res.Err)
-}
diff --git a/rackspace/networking/v2/security/doc.go b/rackspace/networking/v2/security/doc.go
deleted file mode 100644
index 31f744c..0000000
--- a/rackspace/networking/v2/security/doc.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// Package security contains functionality to work with security group and
-// security group rules Neutron resources.
-//
-// Security groups and security group rules allows administrators and tenants
-// the ability to specify the type of traffic and direction (ingress/egress)
-// that is allowed to pass through a port. A security group is a container for
-// security group rules.
-//
-// When a port is created in Networking it is associated with a security group.
-// If a security group is not specified the port is associated with a 'default'
-// security group. By default, this group drops all ingress traffic and allows
-// all egress. Rules can be added to this group in order to change the behaviour.
-//
-// The basic characteristics of Neutron Security Groups are:
-//
-// For ingress traffic (to an instance)
-//  - Only traffic matched with security group rules are allowed.
-//  - When there is no rule defined, all traffic is dropped.
-//
-// For egress traffic (from an instance)
-//  - Only traffic matched with security group rules are allowed.
-//  - When there is no rule defined, all egress traffic are dropped.
-//  - When a new security group is created, rules to allow all egress traffic
-//    is automatically added.
-//
-// "default security group" is defined for each tenant.
-//  - For the default security group a rule which allows intercommunication
-//    among hosts associated with the default security group is defined by default.
-//  - As a result, all egress traffic and intercommunication in the default
-//    group are allowed and all ingress from outside of the default group is
-//    dropped by default (in the default security group).
-package security
diff --git a/rackspace/networking/v2/security/groups/delegate.go b/rackspace/networking/v2/security/groups/delegate.go
deleted file mode 100644
index 1e9a23a..0000000
--- a/rackspace/networking/v2/security/groups/delegate.go
+++ /dev/null
@@ -1,30 +0,0 @@
-package groups
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/networking/v2/extensions/security/groups"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List returns a Pager which allows you to iterate over a collection of
-// security groups. It accepts a ListOpts struct, which allows you to filter
-// and sort the returned collection for greater efficiency.
-func List(c *gophercloud.ServiceClient, opts os.ListOpts) pagination.Pager {
-	return os.List(c, opts)
-}
-
-// Create is an operation which provisions a new security group with default
-// security group rules for the IPv4 and IPv6 ether types.
-func Create(c *gophercloud.ServiceClient, opts os.CreateOpts) os.CreateResult {
-	return os.Create(c, opts)
-}
-
-// Get retrieves a particular security group based on its unique ID.
-func Get(c *gophercloud.ServiceClient, id string) os.GetResult {
-	return os.Get(c, id)
-}
-
-// Delete will permanently delete a particular security group based on its unique ID.
-func Delete(c *gophercloud.ServiceClient, id string) os.DeleteResult {
-	return os.Delete(c, id)
-}
diff --git a/rackspace/networking/v2/security/groups/delegate_test.go b/rackspace/networking/v2/security/groups/delegate_test.go
deleted file mode 100644
index 45cd3ba..0000000
--- a/rackspace/networking/v2/security/groups/delegate_test.go
+++ /dev/null
@@ -1,206 +0,0 @@
-package groups
-
-import (
-	"fmt"
-	"net/http"
-	"testing"
-
-	fake "github.com/rackspace/gophercloud/openstack/networking/v2/common"
-	osGroups "github.com/rackspace/gophercloud/openstack/networking/v2/extensions/security/groups"
-	osRules "github.com/rackspace/gophercloud/openstack/networking/v2/extensions/security/rules"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-)
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/v2.0/security-groups", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-        {
-          "security_groups": [
-          {
-            "description": "default",
-            "id": "85cc3048-abc3-43cc-89b3-377341426ac5",
-            "name": "default",
-            "security_group_rules": [],
-            "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
-          }
-          ]
-        }
-        `)
-	})
-
-	count := 0
-
-	List(fake.ServiceClient(), osGroups.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := osGroups.ExtractGroups(page)
-		if err != nil {
-			t.Errorf("Failed to extract secgroups: %v", err)
-			return false, err
-		}
-
-		expected := []osGroups.SecGroup{
-			osGroups.SecGroup{
-				Description: "default",
-				ID:          "85cc3048-abc3-43cc-89b3-377341426ac5",
-				Name:        "default",
-				Rules:       []osRules.SecGroupRule{},
-				TenantID:    "e4f50856753b4dc6afee5fa6b9b6c550",
-			},
-		}
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-
-	if count != 1 {
-		t.Errorf("Expected 1 page, got %d", count)
-	}
-}
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/v2.0/security-groups", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "POST")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Content-Type", "application/json")
-		th.TestHeader(t, r, "Accept", "application/json")
-		th.TestJSONRequest(t, r, `
-      {
-        "security_group": {
-          "name": "new-webservers",
-          "description": "security group for webservers"
-        }
-      }
-    `)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusCreated)
-
-		fmt.Fprintf(w, `
-    {
-      "security_group": {
-        "description": "security group for webservers",
-        "id": "2076db17-a522-4506-91de-c6dd8e837028",
-        "name": "new-webservers",
-        "security_group_rules": [
-        {
-          "direction": "egress",
-          "ethertype": "IPv4",
-          "id": "38ce2d8e-e8f1-48bd-83c2-d33cb9f50c3d",
-          "port_range_max": null,
-          "port_range_min": null,
-          "protocol": null,
-          "remote_group_id": null,
-          "remote_ip_prefix": null,
-          "security_group_id": "2076db17-a522-4506-91de-c6dd8e837028",
-          "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
-        },
-        {
-          "direction": "egress",
-          "ethertype": "IPv6",
-          "id": "565b9502-12de-4ffd-91e9-68885cff6ae1",
-          "port_range_max": null,
-          "port_range_min": null,
-          "protocol": null,
-          "remote_group_id": null,
-          "remote_ip_prefix": null,
-          "security_group_id": "2076db17-a522-4506-91de-c6dd8e837028",
-          "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
-        }
-        ],
-        "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
-      }
-    }
-    `)
-	})
-
-	opts := osGroups.CreateOpts{Name: "new-webservers", Description: "security group for webservers"}
-	_, err := Create(fake.ServiceClient(), opts).Extract()
-	th.AssertNoErr(t, err)
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/v2.0/security-groups/85cc3048-abc3-43cc-89b3-377341426ac5", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-    {
-      "security_group": {
-        "description": "default",
-        "id": "85cc3048-abc3-43cc-89b3-377341426ac5",
-        "name": "default",
-        "security_group_rules": [
-        {
-          "direction": "egress",
-          "ethertype": "IPv6",
-          "id": "3c0e45ff-adaf-4124-b083-bf390e5482ff",
-          "port_range_max": null,
-          "port_range_min": null,
-          "protocol": null,
-          "remote_group_id": null,
-          "remote_ip_prefix": null,
-          "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
-          "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
-          },
-        {
-          "direction": "egress",
-          "ethertype": "IPv4",
-          "id": "93aa42e5-80db-4581-9391-3a608bd0e448",
-          "port_range_max": null,
-          "port_range_min": null,
-          "protocol": null,
-          "remote_group_id": null,
-          "remote_ip_prefix": null,
-          "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
-          "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
-        }
-        ],
-        "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
-      }
-    }
-  `)
-	})
-
-	sg, err := Get(fake.ServiceClient(), "85cc3048-abc3-43cc-89b3-377341426ac5").Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertEquals(t, "default", sg.Description)
-	th.AssertEquals(t, "85cc3048-abc3-43cc-89b3-377341426ac5", sg.ID)
-	th.AssertEquals(t, "default", sg.Name)
-	th.AssertEquals(t, 2, len(sg.Rules))
-	th.AssertEquals(t, "e4f50856753b4dc6afee5fa6b9b6c550", sg.TenantID)
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/v2.0/security-groups/4ec89087-d057-4e2c-911f-60a3b47ee304", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		w.WriteHeader(http.StatusNoContent)
-	})
-
-	res := Delete(fake.ServiceClient(), "4ec89087-d057-4e2c-911f-60a3b47ee304")
-	th.AssertNoErr(t, res.Err)
-}
diff --git a/rackspace/networking/v2/security/rules/delegate.go b/rackspace/networking/v2/security/rules/delegate.go
deleted file mode 100644
index 23b4b31..0000000
--- a/rackspace/networking/v2/security/rules/delegate.go
+++ /dev/null
@@ -1,30 +0,0 @@
-package rules
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/networking/v2/extensions/security/rules"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List returns a Pager which allows you to iterate over a collection of
-// security group rules. It accepts a ListOpts struct, which allows you to filter
-// and sort the returned collection for greater efficiency.
-func List(c *gophercloud.ServiceClient, opts os.ListOpts) pagination.Pager {
-	return os.List(c, opts)
-}
-
-// Create is an operation which provisions a new security group with default
-// security group rules for the IPv4 and IPv6 ether types.
-func Create(c *gophercloud.ServiceClient, opts os.CreateOpts) os.CreateResult {
-	return os.Create(c, opts)
-}
-
-// Get retrieves a particular security group based on its unique ID.
-func Get(c *gophercloud.ServiceClient, id string) os.GetResult {
-	return os.Get(c, id)
-}
-
-// Delete will permanently delete a particular security group based on its unique ID.
-func Delete(c *gophercloud.ServiceClient, id string) os.DeleteResult {
-	return os.Delete(c, id)
-}
diff --git a/rackspace/networking/v2/security/rules/delegate_test.go b/rackspace/networking/v2/security/rules/delegate_test.go
deleted file mode 100644
index 3563fbe..0000000
--- a/rackspace/networking/v2/security/rules/delegate_test.go
+++ /dev/null
@@ -1,236 +0,0 @@
-package rules
-
-import (
-	"fmt"
-	"net/http"
-	"testing"
-
-	fake "github.com/rackspace/gophercloud/openstack/networking/v2/common"
-	osRules "github.com/rackspace/gophercloud/openstack/networking/v2/extensions/security/rules"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-)
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/v2.0/security-group-rules", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-        {
-          "security_group_rules": [
-          {
-            "direction": "egress",
-            "ethertype": "IPv6",
-            "id": "3c0e45ff-adaf-4124-b083-bf390e5482ff",
-            "port_range_max": null,
-            "port_range_min": null,
-            "protocol": null,
-            "remote_group_id": null,
-            "remote_ip_prefix": null,
-            "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
-            "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
-            },
-            {
-              "direction": "egress",
-              "ethertype": "IPv4",
-              "id": "93aa42e5-80db-4581-9391-3a608bd0e448",
-              "port_range_max": null,
-              "port_range_min": null,
-              "protocol": null,
-              "remote_group_id": null,
-              "remote_ip_prefix": null,
-              "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
-              "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
-            }
-            ]
-          }
-          `)
-	})
-
-	count := 0
-
-	List(fake.ServiceClient(), osRules.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := osRules.ExtractRules(page)
-		if err != nil {
-			t.Errorf("Failed to extract secrules: %v", err)
-			return false, err
-		}
-
-		expected := []osRules.SecGroupRule{
-			osRules.SecGroupRule{
-				Direction:      "egress",
-				EtherType:      "IPv6",
-				ID:             "3c0e45ff-adaf-4124-b083-bf390e5482ff",
-				PortRangeMax:   0,
-				PortRangeMin:   0,
-				Protocol:       "",
-				RemoteGroupID:  "",
-				RemoteIPPrefix: "",
-				SecGroupID:     "85cc3048-abc3-43cc-89b3-377341426ac5",
-				TenantID:       "e4f50856753b4dc6afee5fa6b9b6c550",
-			},
-			osRules.SecGroupRule{
-				Direction:      "egress",
-				EtherType:      "IPv4",
-				ID:             "93aa42e5-80db-4581-9391-3a608bd0e448",
-				PortRangeMax:   0,
-				PortRangeMin:   0,
-				Protocol:       "",
-				RemoteGroupID:  "",
-				RemoteIPPrefix: "",
-				SecGroupID:     "85cc3048-abc3-43cc-89b3-377341426ac5",
-				TenantID:       "e4f50856753b4dc6afee5fa6b9b6c550",
-			},
-		}
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-
-	if count != 1 {
-		t.Errorf("Expected 1 page, got %d", count)
-	}
-}
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/v2.0/security-group-rules", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "POST")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Content-Type", "application/json")
-		th.TestHeader(t, r, "Accept", "application/json")
-		th.TestJSONRequest(t, r, `
-                    {
-                      "security_group_rule": {
-                        "direction": "ingress",
-                        "port_range_min": 80,
-                        "ethertype": "IPv4",
-                        "port_range_max": 80,
-                        "protocol": "tcp",
-                        "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
-                        "security_group_id": "a7734e61-b545-452d-a3cd-0189cbd9747a"
-                      }
-                    }
-                    `)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusCreated)
-
-		fmt.Fprintf(w, `
-                      {
-                        "security_group_rule": {
-                          "direction": "ingress",
-                          "ethertype": "IPv4",
-                          "id": "2bc0accf-312e-429a-956e-e4407625eb62",
-                          "port_range_max": 80,
-                          "port_range_min": 80,
-                          "protocol": "tcp",
-                          "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
-                          "remote_ip_prefix": null,
-                          "security_group_id": "a7734e61-b545-452d-a3cd-0189cbd9747a",
-                          "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
-                        }
-                      }
-                      `)
-	})
-
-	opts := osRules.CreateOpts{
-		Direction:     "ingress",
-		PortRangeMin:  80,
-		EtherType:     "IPv4",
-		PortRangeMax:  80,
-		Protocol:      "tcp",
-		RemoteGroupID: "85cc3048-abc3-43cc-89b3-377341426ac5",
-		SecGroupID:    "a7734e61-b545-452d-a3cd-0189cbd9747a",
-	}
-	_, err := Create(fake.ServiceClient(), opts).Extract()
-	th.AssertNoErr(t, err)
-}
-
-func TestRequiredCreateOpts(t *testing.T) {
-	res := Create(fake.ServiceClient(), osRules.CreateOpts{Direction: "something"})
-	if res.Err == nil {
-		t.Fatalf("Expected error, got none")
-	}
-	res = Create(fake.ServiceClient(), osRules.CreateOpts{Direction: osRules.DirIngress, EtherType: "something"})
-	if res.Err == nil {
-		t.Fatalf("Expected error, got none")
-	}
-	res = Create(fake.ServiceClient(), osRules.CreateOpts{Direction: osRules.DirIngress, EtherType: osRules.Ether4})
-	if res.Err == nil {
-		t.Fatalf("Expected error, got none")
-	}
-	res = Create(fake.ServiceClient(), osRules.CreateOpts{Direction: osRules.DirIngress, EtherType: osRules.Ether4, SecGroupID: "something", Protocol: "foo"})
-	if res.Err == nil {
-		t.Fatalf("Expected error, got none")
-	}
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/v2.0/security-group-rules/3c0e45ff-adaf-4124-b083-bf390e5482ff", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-                          {
-                            "security_group_rule": {
-                              "direction": "egress",
-                              "ethertype": "IPv6",
-                              "id": "3c0e45ff-adaf-4124-b083-bf390e5482ff",
-                              "port_range_max": null,
-                              "port_range_min": null,
-                              "protocol": null,
-                              "remote_group_id": null,
-                              "remote_ip_prefix": null,
-                              "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
-                              "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
-                            }
-                          }
-                          `)
-	})
-
-	sr, err := Get(fake.ServiceClient(), "3c0e45ff-adaf-4124-b083-bf390e5482ff").Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertEquals(t, "egress", sr.Direction)
-	th.AssertEquals(t, "IPv6", sr.EtherType)
-	th.AssertEquals(t, "3c0e45ff-adaf-4124-b083-bf390e5482ff", sr.ID)
-	th.AssertEquals(t, 0, sr.PortRangeMax)
-	th.AssertEquals(t, 0, sr.PortRangeMin)
-	th.AssertEquals(t, "", sr.Protocol)
-	th.AssertEquals(t, "", sr.RemoteGroupID)
-	th.AssertEquals(t, "", sr.RemoteIPPrefix)
-	th.AssertEquals(t, "85cc3048-abc3-43cc-89b3-377341426ac5", sr.SecGroupID)
-	th.AssertEquals(t, "e4f50856753b4dc6afee5fa6b9b6c550", sr.TenantID)
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/v2.0/security-group-rules/4ec89087-d057-4e2c-911f-60a3b47ee304", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		w.WriteHeader(http.StatusNoContent)
-	})
-
-	res := Delete(fake.ServiceClient(), "4ec89087-d057-4e2c-911f-60a3b47ee304")
-	th.AssertNoErr(t, res.Err)
-}
diff --git a/rackspace/networking/v2/subnets/delegate.go b/rackspace/networking/v2/subnets/delegate.go
deleted file mode 100644
index a7fb7bb..0000000
--- a/rackspace/networking/v2/subnets/delegate.go
+++ /dev/null
@@ -1,40 +0,0 @@
-package subnets
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/networking/v2/subnets"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List returns a Pager which allows you to iterate over a collection of
-// subnets. It accepts a ListOpts struct, which allows you to filter and sort
-// the returned collection for greater efficiency.
-//
-// Default policy settings return only those subnets that are owned by the tenant
-// who submits the request, unless the request is submitted by a user with
-// administrative rights.
-func List(c *gophercloud.ServiceClient, opts os.ListOptsBuilder) pagination.Pager {
-	return os.List(c, opts)
-}
-
-// Get retrieves a specific subnet based on its unique ID.
-func Get(c *gophercloud.ServiceClient, networkID string) os.GetResult {
-	return os.Get(c, networkID)
-}
-
-// Create accepts a CreateOpts struct and creates a new subnet using the values
-// provided. You must remember to provide a valid NetworkID, CIDR and IP version.
-func Create(c *gophercloud.ServiceClient, opts os.CreateOptsBuilder) os.CreateResult {
-	return os.Create(c, opts)
-}
-
-// Update accepts a UpdateOpts struct and updates an existing subnet using the
-// values provided.
-func Update(c *gophercloud.ServiceClient, networkID string, opts os.UpdateOptsBuilder) os.UpdateResult {
-	return os.Update(c, networkID, opts)
-}
-
-// Delete accepts a unique ID and deletes the subnet associated with it.
-func Delete(c *gophercloud.ServiceClient, networkID string) os.DeleteResult {
-	return os.Delete(c, networkID)
-}
diff --git a/rackspace/networking/v2/subnets/delegate_test.go b/rackspace/networking/v2/subnets/delegate_test.go
deleted file mode 100644
index fafc6fb..0000000
--- a/rackspace/networking/v2/subnets/delegate_test.go
+++ /dev/null
@@ -1,363 +0,0 @@
-package subnets
-
-import (
-	"fmt"
-	"net/http"
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/networking/v2/subnets"
-	"github.com/rackspace/gophercloud/pagination"
-	fake "github.com/rackspace/gophercloud/rackspace/networking/v2/common"
-	th "github.com/rackspace/gophercloud/testhelper"
-)
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/subnets", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-    "subnets": [
-        {
-            "name": "private-subnet",
-            "enable_dhcp": true,
-            "network_id": "db193ab3-96e3-4cb3-8fc5-05f4296d0324",
-            "tenant_id": "26a7980765d0414dbc1fc1f88cdb7e6e",
-            "dns_nameservers": [],
-            "allocation_pools": [
-                {
-                    "start": "10.0.0.2",
-                    "end": "10.0.0.254"
-                }
-            ],
-            "host_routes": [],
-            "ip_version": 4,
-            "gateway_ip": "10.0.0.1",
-            "cidr": "10.0.0.0/24",
-            "id": "08eae331-0402-425a-923c-34f7cfe39c1b"
-        },
-        {
-            "name": "my_subnet",
-            "enable_dhcp": true,
-            "network_id": "d32019d3-bc6e-4319-9c1d-6722fc136a22",
-            "tenant_id": "4fd44f30292945e481c7b8a0c8908869",
-            "dns_nameservers": [],
-            "allocation_pools": [
-                {
-                    "start": "192.0.0.2",
-                    "end": "192.255.255.254"
-                }
-            ],
-            "host_routes": [],
-            "ip_version": 4,
-            "gateway_ip": "192.0.0.1",
-            "cidr": "192.0.0.0/8",
-            "id": "54d6f61d-db07-451c-9ab3-b9609b6b6f0b"
-        }
-    ]
-}
-      `)
-	})
-
-	count := 0
-
-	List(fake.ServiceClient(), os.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := os.ExtractSubnets(page)
-		if err != nil {
-			t.Errorf("Failed to extract subnets: %v", err)
-			return false, nil
-		}
-
-		expected := []os.Subnet{
-			os.Subnet{
-				Name:           "private-subnet",
-				EnableDHCP:     true,
-				NetworkID:      "db193ab3-96e3-4cb3-8fc5-05f4296d0324",
-				TenantID:       "26a7980765d0414dbc1fc1f88cdb7e6e",
-				DNSNameservers: []string{},
-				AllocationPools: []os.AllocationPool{
-					os.AllocationPool{
-						Start: "10.0.0.2",
-						End:   "10.0.0.254",
-					},
-				},
-				HostRoutes: []os.HostRoute{},
-				IPVersion:  4,
-				GatewayIP:  "10.0.0.1",
-				CIDR:       "10.0.0.0/24",
-				ID:         "08eae331-0402-425a-923c-34f7cfe39c1b",
-			},
-			os.Subnet{
-				Name:           "my_subnet",
-				EnableDHCP:     true,
-				NetworkID:      "d32019d3-bc6e-4319-9c1d-6722fc136a22",
-				TenantID:       "4fd44f30292945e481c7b8a0c8908869",
-				DNSNameservers: []string{},
-				AllocationPools: []os.AllocationPool{
-					os.AllocationPool{
-						Start: "192.0.0.2",
-						End:   "192.255.255.254",
-					},
-				},
-				HostRoutes: []os.HostRoute{},
-				IPVersion:  4,
-				GatewayIP:  "192.0.0.1",
-				CIDR:       "192.0.0.0/8",
-				ID:         "54d6f61d-db07-451c-9ab3-b9609b6b6f0b",
-			},
-		}
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-
-	if count != 1 {
-		t.Errorf("Expected 1 page, got %d", count)
-	}
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/subnets/54d6f61d-db07-451c-9ab3-b9609b6b6f0b", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-    "subnet": {
-        "name": "my_subnet",
-        "enable_dhcp": true,
-        "network_id": "d32019d3-bc6e-4319-9c1d-6722fc136a22",
-        "tenant_id": "4fd44f30292945e481c7b8a0c8908869",
-        "dns_nameservers": [],
-        "allocation_pools": [
-            {
-                "start": "192.0.0.2",
-                "end": "192.255.255.254"
-            }
-        ],
-        "host_routes": [],
-        "ip_version": 4,
-        "gateway_ip": "192.0.0.1",
-        "cidr": "192.0.0.0/8",
-        "id": "54d6f61d-db07-451c-9ab3-b9609b6b6f0b"
-    }
-}
-      `)
-	})
-
-	s, err := Get(fake.ServiceClient(), "54d6f61d-db07-451c-9ab3-b9609b6b6f0b").Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertEquals(t, s.Name, "my_subnet")
-	th.AssertEquals(t, s.EnableDHCP, true)
-	th.AssertEquals(t, s.NetworkID, "d32019d3-bc6e-4319-9c1d-6722fc136a22")
-	th.AssertEquals(t, s.TenantID, "4fd44f30292945e481c7b8a0c8908869")
-	th.AssertDeepEquals(t, s.DNSNameservers, []string{})
-	th.AssertDeepEquals(t, s.AllocationPools, []os.AllocationPool{
-		os.AllocationPool{
-			Start: "192.0.0.2",
-			End:   "192.255.255.254",
-		},
-	})
-	th.AssertDeepEquals(t, s.HostRoutes, []os.HostRoute{})
-	th.AssertEquals(t, s.IPVersion, 4)
-	th.AssertEquals(t, s.GatewayIP, "192.0.0.1")
-	th.AssertEquals(t, s.CIDR, "192.0.0.0/8")
-	th.AssertEquals(t, s.ID, "54d6f61d-db07-451c-9ab3-b9609b6b6f0b")
-}
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/subnets", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "POST")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Content-Type", "application/json")
-		th.TestHeader(t, r, "Accept", "application/json")
-		th.TestJSONRequest(t, r, `
-{
-    "subnet": {
-        "network_id": "d32019d3-bc6e-4319-9c1d-6722fc136a22",
-        "ip_version": 4,
-        "cidr": "192.168.199.0/24",
-        "dns_nameservers": ["foo"],
-        "allocation_pools": [
-            {
-                "start": "192.168.199.2",
-                "end": "192.168.199.254"
-            }
-        ],
-        "host_routes": [{"destination":"","nexthop": "bar"}]
-    }
-}
-      `)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusCreated)
-
-		fmt.Fprintf(w, `
-{
-    "subnet": {
-        "name": "",
-        "enable_dhcp": true,
-        "network_id": "d32019d3-bc6e-4319-9c1d-6722fc136a22",
-        "tenant_id": "4fd44f30292945e481c7b8a0c8908869",
-        "dns_nameservers": [],
-        "allocation_pools": [
-            {
-                "start": "192.168.199.2",
-                "end": "192.168.199.254"
-            }
-        ],
-        "host_routes": [],
-        "ip_version": 4,
-        "gateway_ip": "192.168.199.1",
-        "cidr": "192.168.199.0/24",
-        "id": "3b80198d-4f7b-4f77-9ef5-774d54e17126"
-    }
-}
-    `)
-	})
-
-	opts := os.CreateOpts{
-		NetworkID: "d32019d3-bc6e-4319-9c1d-6722fc136a22",
-		IPVersion: 4,
-		CIDR:      "192.168.199.0/24",
-		AllocationPools: []os.AllocationPool{
-			os.AllocationPool{
-				Start: "192.168.199.2",
-				End:   "192.168.199.254",
-			},
-		},
-		DNSNameservers: []string{"foo"},
-		HostRoutes: []os.HostRoute{
-			os.HostRoute{NextHop: "bar"},
-		},
-	}
-	s, err := Create(fake.ServiceClient(), opts).Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertEquals(t, s.Name, "")
-	th.AssertEquals(t, s.EnableDHCP, true)
-	th.AssertEquals(t, s.NetworkID, "d32019d3-bc6e-4319-9c1d-6722fc136a22")
-	th.AssertEquals(t, s.TenantID, "4fd44f30292945e481c7b8a0c8908869")
-	th.AssertDeepEquals(t, s.DNSNameservers, []string{})
-	th.AssertDeepEquals(t, s.AllocationPools, []os.AllocationPool{
-		os.AllocationPool{
-			Start: "192.168.199.2",
-			End:   "192.168.199.254",
-		},
-	})
-	th.AssertDeepEquals(t, s.HostRoutes, []os.HostRoute{})
-	th.AssertEquals(t, s.IPVersion, 4)
-	th.AssertEquals(t, s.GatewayIP, "192.168.199.1")
-	th.AssertEquals(t, s.CIDR, "192.168.199.0/24")
-	th.AssertEquals(t, s.ID, "3b80198d-4f7b-4f77-9ef5-774d54e17126")
-}
-
-func TestRequiredCreateOpts(t *testing.T) {
-	res := Create(fake.ServiceClient(), os.CreateOpts{})
-	if res.Err == nil {
-		t.Fatalf("Expected error, got none")
-	}
-
-	res = Create(fake.ServiceClient(), os.CreateOpts{NetworkID: "foo"})
-	if res.Err == nil {
-		t.Fatalf("Expected error, got none")
-	}
-
-	res = Create(fake.ServiceClient(), os.CreateOpts{NetworkID: "foo", CIDR: "bar", IPVersion: 40})
-	if res.Err == nil {
-		t.Fatalf("Expected error, got none")
-	}
-}
-
-func TestUpdate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/subnets/08eae331-0402-425a-923c-34f7cfe39c1b", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "PUT")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Content-Type", "application/json")
-		th.TestHeader(t, r, "Accept", "application/json")
-		th.TestJSONRequest(t, r, `
-{
-    "subnet": {
-        "name": "my_new_subnet",
-        "dns_nameservers": ["foo"],
-        "host_routes": [{"destination":"","nexthop": "bar"}]
-    }
-}
-    `)
-
-		w.Header().Add("Content-Type", "application/json")
-		w.WriteHeader(http.StatusCreated)
-
-		fmt.Fprintf(w, `
-{
-    "subnet": {
-        "name": "my_new_subnet",
-        "enable_dhcp": true,
-        "network_id": "db193ab3-96e3-4cb3-8fc5-05f4296d0324",
-        "tenant_id": "26a7980765d0414dbc1fc1f88cdb7e6e",
-        "dns_nameservers": [],
-        "allocation_pools": [
-            {
-                "start": "10.0.0.2",
-                "end": "10.0.0.254"
-            }
-        ],
-        "host_routes": [],
-        "ip_version": 4,
-        "gateway_ip": "10.0.0.1",
-        "cidr": "10.0.0.0/24",
-        "id": "08eae331-0402-425a-923c-34f7cfe39c1b"
-    }
-}
-  `)
-	})
-
-	opts := os.UpdateOpts{
-		Name:           "my_new_subnet",
-		DNSNameservers: []string{"foo"},
-		HostRoutes: []os.HostRoute{
-			os.HostRoute{NextHop: "bar"},
-		},
-	}
-	s, err := Update(fake.ServiceClient(), "08eae331-0402-425a-923c-34f7cfe39c1b", opts).Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertEquals(t, s.Name, "my_new_subnet")
-	th.AssertEquals(t, s.ID, "08eae331-0402-425a-923c-34f7cfe39c1b")
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/subnets/08eae331-0402-425a-923c-34f7cfe39c1b", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		w.WriteHeader(http.StatusNoContent)
-	})
-
-	res := Delete(fake.ServiceClient(), "08eae331-0402-425a-923c-34f7cfe39c1b")
-	th.AssertNoErr(t, res.Err)
-}
diff --git a/rackspace/objectstorage/v1/accounts/delegate.go b/rackspace/objectstorage/v1/accounts/delegate.go
deleted file mode 100644
index 9473930..0000000
--- a/rackspace/objectstorage/v1/accounts/delegate.go
+++ /dev/null
@@ -1,39 +0,0 @@
-package accounts
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/objectstorage/v1/accounts"
-)
-
-// Get is a function that retrieves an account's metadata. To extract just the
-// custom metadata, call the ExtractMetadata method on the GetResult. To extract
-// all the headers that are returned (including the metadata), call the
-// ExtractHeader method on the GetResult.
-func Get(c *gophercloud.ServiceClient) os.GetResult {
-	return os.Get(c, nil)
-}
-
-// UpdateOpts is a structure that contains parameters for updating, creating, or
-// deleting an account's metadata.
-type UpdateOpts struct {
-	Metadata    map[string]string
-	TempURLKey  string `h:"X-Account-Meta-Temp-URL-Key"`
-	TempURLKey2 string `h:"X-Account-Meta-Temp-URL-Key-2"`
-}
-
-// ToAccountUpdateMap formats an UpdateOpts into a map[string]string of headers.
-func (opts UpdateOpts) ToAccountUpdateMap() (map[string]string, error) {
-	headers, err := gophercloud.BuildHeaders(opts)
-	if err != nil {
-		return nil, err
-	}
-	for k, v := range opts.Metadata {
-		headers["X-Account-Meta-"+k] = v
-	}
-	return headers, err
-}
-
-// Update will update an account's metadata with the Metadata in the UpdateOptsBuilder.
-func Update(c *gophercloud.ServiceClient, opts os.UpdateOptsBuilder) os.UpdateResult {
-	return os.Update(c, opts)
-}
diff --git a/rackspace/objectstorage/v1/accounts/delegate_test.go b/rackspace/objectstorage/v1/accounts/delegate_test.go
deleted file mode 100644
index a1ea98b..0000000
--- a/rackspace/objectstorage/v1/accounts/delegate_test.go
+++ /dev/null
@@ -1,32 +0,0 @@
-package accounts
-
-import (
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/objectstorage/v1/accounts"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestUpdateAccounts(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	os.HandleUpdateAccountSuccessfully(t)
-
-	options := &UpdateOpts{Metadata: map[string]string{"gophercloud-test": "accounts"}}
-	res := Update(fake.ServiceClient(), options)
-	th.CheckNoErr(t, res.Err)
-}
-
-func TestGetAccounts(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	os.HandleGetAccountSuccessfully(t)
-
-	expected := map[string]string{"Foo": "bar"}
-	actual, err := Get(fake.ServiceClient()).ExtractMetadata()
-	th.CheckNoErr(t, err)
-	th.CheckDeepEquals(t, expected, actual)
-}
diff --git a/rackspace/objectstorage/v1/accounts/doc.go b/rackspace/objectstorage/v1/accounts/doc.go
deleted file mode 100644
index 293a930..0000000
--- a/rackspace/objectstorage/v1/accounts/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package accounts provides information and interaction with the account
-// API resource for the Rackspace Cloud Files service.
-package accounts
diff --git a/rackspace/objectstorage/v1/bulk/doc.go b/rackspace/objectstorage/v1/bulk/doc.go
deleted file mode 100644
index 9c89e22..0000000
--- a/rackspace/objectstorage/v1/bulk/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package bulk provides functionality for working with bulk operations in the
-// Rackspace Cloud Files service.
-package bulk
diff --git a/rackspace/objectstorage/v1/bulk/requests.go b/rackspace/objectstorage/v1/bulk/requests.go
deleted file mode 100644
index 0aeec15..0000000
--- a/rackspace/objectstorage/v1/bulk/requests.go
+++ /dev/null
@@ -1,51 +0,0 @@
-package bulk
-
-import (
-	"net/url"
-	"strings"
-
-	"github.com/rackspace/gophercloud"
-)
-
-// DeleteOptsBuilder allows extensions to add additional parameters to the
-// Delete request.
-type DeleteOptsBuilder interface {
-	ToBulkDeleteBody() (string, error)
-}
-
-// DeleteOpts is a structure that holds parameters for deleting an object.
-type DeleteOpts []string
-
-// ToBulkDeleteBody formats a DeleteOpts into a request body.
-func (opts DeleteOpts) ToBulkDeleteBody() (string, error) {
-	return url.QueryEscape(strings.Join(opts, "\n")), nil
-}
-
-// Delete will delete objects or containers in bulk.
-func Delete(c *gophercloud.ServiceClient, opts DeleteOptsBuilder) DeleteResult {
-	var res DeleteResult
-
-	if opts == nil {
-		return res
-	}
-
-	reqString, err := opts.ToBulkDeleteBody()
-	if err != nil {
-		res.Err = err
-		return res
-	}
-
-	reqBody := strings.NewReader(reqString)
-
-	resp, err := c.Request("DELETE", deleteURL(c), gophercloud.RequestOpts{
-		MoreHeaders:  map[string]string{"Content-Type": "text/plain"},
-		OkCodes:      []int{200},
-		JSONBody:     reqBody,
-		JSONResponse: &res.Body,
-	})
-	if resp != nil {
-		res.Header = resp.Header
-	}
-	res.Err = err
-	return res
-}
diff --git a/rackspace/objectstorage/v1/bulk/requests_test.go b/rackspace/objectstorage/v1/bulk/requests_test.go
deleted file mode 100644
index 8b5578e..0000000
--- a/rackspace/objectstorage/v1/bulk/requests_test.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package bulk
-
-import (
-	"fmt"
-	"net/http"
-	"testing"
-
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestBulkDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	th.Mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.AssertEquals(t, r.URL.RawQuery, "bulk-delete")
-
-		w.WriteHeader(http.StatusOK)
-		fmt.Fprintf(w, `
-      {
-        "Number Not Found": 1,
-        "Response Status": "200 OK",
-        "Errors": [],
-        "Number Deleted": 1,
-        "Response Body": ""
-      }
-    `)
-	})
-
-	options := DeleteOpts{"gophercloud-testcontainer1", "gophercloud-testcontainer2"}
-	actual, err := Delete(fake.ServiceClient(), options).ExtractBody()
-	th.AssertNoErr(t, err)
-	th.AssertEquals(t, actual.NumberDeleted, 1)
-}
diff --git a/rackspace/objectstorage/v1/bulk/results.go b/rackspace/objectstorage/v1/bulk/results.go
deleted file mode 100644
index fddc125..0000000
--- a/rackspace/objectstorage/v1/bulk/results.go
+++ /dev/null
@@ -1,28 +0,0 @@
-package bulk
-
-import (
-	"github.com/rackspace/gophercloud"
-
-	"github.com/mitchellh/mapstructure"
-)
-
-// DeleteResult represents the result of a bulk delete operation.
-type DeleteResult struct {
-	gophercloud.Result
-}
-
-// DeleteRespBody is the form of the response body returned by a bulk delete request.
-type DeleteRespBody struct {
-	NumberNotFound int      `mapstructure:"Number Not Found"`
-	ResponseStatus string   `mapstructure:"Response Status"`
-	Errors         []string `mapstructure:"Errors"`
-	NumberDeleted  int      `mapstructure:"Number Deleted"`
-	ResponseBody   string   `mapstructure:"Response Body"`
-}
-
-// ExtractBody will extract the body returned by the bulk extract request.
-func (dr DeleteResult) ExtractBody() (DeleteRespBody, error) {
-	var resp DeleteRespBody
-	err := mapstructure.Decode(dr.Body, &resp)
-	return resp, err
-}
diff --git a/rackspace/objectstorage/v1/bulk/urls.go b/rackspace/objectstorage/v1/bulk/urls.go
deleted file mode 100644
index 2e11203..0000000
--- a/rackspace/objectstorage/v1/bulk/urls.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package bulk
-
-import "github.com/rackspace/gophercloud"
-
-func deleteURL(c *gophercloud.ServiceClient) string {
-	return c.Endpoint + "?bulk-delete"
-}
-
-func extractURL(c *gophercloud.ServiceClient, ext string) string {
-	return c.Endpoint + "?extract-archive=" + ext
-}
diff --git a/rackspace/objectstorage/v1/bulk/urls_test.go b/rackspace/objectstorage/v1/bulk/urls_test.go
deleted file mode 100644
index 9169e52..0000000
--- a/rackspace/objectstorage/v1/bulk/urls_test.go
+++ /dev/null
@@ -1,26 +0,0 @@
-package bulk
-
-import (
-	"testing"
-
-	"github.com/rackspace/gophercloud"
-	th "github.com/rackspace/gophercloud/testhelper"
-)
-
-const endpoint = "http://localhost:57909/"
-
-func endpointClient() *gophercloud.ServiceClient {
-	return &gophercloud.ServiceClient{Endpoint: endpoint}
-}
-
-func TestDeleteURL(t *testing.T) {
-	actual := deleteURL(endpointClient())
-	expected := endpoint + "?bulk-delete"
-	th.CheckEquals(t, expected, actual)
-}
-
-func TestExtractURL(t *testing.T) {
-	actual := extractURL(endpointClient(), "tar")
-	expected := endpoint + "?extract-archive=tar"
-	th.CheckEquals(t, expected, actual)
-}
diff --git a/rackspace/objectstorage/v1/cdncontainers/delegate.go b/rackspace/objectstorage/v1/cdncontainers/delegate.go
deleted file mode 100644
index 89adb83..0000000
--- a/rackspace/objectstorage/v1/cdncontainers/delegate.go
+++ /dev/null
@@ -1,38 +0,0 @@
-package cdncontainers
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/objectstorage/v1/containers"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// ExtractNames interprets a page of List results when just the container
-// names are requested.
-func ExtractNames(page pagination.Page) ([]string, error) {
-	return os.ExtractNames(page)
-}
-
-// ListOpts are options for listing Rackspace CDN containers.
-type ListOpts struct {
-	EndMarker string `q:"end_marker"`
-	Format    string `q:"format"`
-	Limit     int    `q:"limit"`
-	Marker    string `q:"marker"`
-}
-
-// ToContainerListParams formats a ListOpts into a query string and boolean
-// representing whether to list complete information for each container.
-func (opts ListOpts) ToContainerListParams() (bool, string, error) {
-	q, err := gophercloud.BuildQueryString(opts)
-	if err != nil {
-		return false, "", err
-	}
-	return false, q.String(), nil
-}
-
-// List is a function that retrieves containers associated with the account as
-// well as account metadata. It returns a pager which can be iterated with the
-// EachPage function.
-func List(c *gophercloud.ServiceClient, opts os.ListOptsBuilder) pagination.Pager {
-	return os.List(c, opts)
-}
diff --git a/rackspace/objectstorage/v1/cdncontainers/delegate_test.go b/rackspace/objectstorage/v1/cdncontainers/delegate_test.go
deleted file mode 100644
index 02c3c5e..0000000
--- a/rackspace/objectstorage/v1/cdncontainers/delegate_test.go
+++ /dev/null
@@ -1,50 +0,0 @@
-package cdncontainers
-
-import (
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/objectstorage/v1/containers"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestListCDNContainers(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleListContainerNamesSuccessfully(t)
-
-	count := 0
-	err := List(fake.ServiceClient(), nil).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractNames(page)
-		th.AssertNoErr(t, err)
-
-		th.CheckDeepEquals(t, os.ExpectedListNames, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, count, 1)
-}
-
-func TestGetCDNContainer(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleGetContainerSuccessfully(t)
-
-	_, err := Get(fake.ServiceClient(), "testContainer").ExtractMetadata()
-	th.CheckNoErr(t, err)
-
-}
-
-func TestUpdateCDNContainer(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleUpdateContainerSuccessfully(t)
-
-	options := &UpdateOpts{TTL: 3600}
-	res := Update(fake.ServiceClient(), "testContainer", options)
-	th.CheckNoErr(t, res.Err)
-
-}
diff --git a/rackspace/objectstorage/v1/cdncontainers/doc.go b/rackspace/objectstorage/v1/cdncontainers/doc.go
deleted file mode 100644
index 7b0930e..0000000
--- a/rackspace/objectstorage/v1/cdncontainers/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package cdncontainers provides information and interaction with the CDN
-// Container API resource for the Rackspace Cloud Files service.
-package cdncontainers
diff --git a/rackspace/objectstorage/v1/cdncontainers/requests.go b/rackspace/objectstorage/v1/cdncontainers/requests.go
deleted file mode 100644
index 6acebb0..0000000
--- a/rackspace/objectstorage/v1/cdncontainers/requests.go
+++ /dev/null
@@ -1,161 +0,0 @@
-package cdncontainers
-
-import (
-	"strconv"
-
-	"github.com/rackspace/gophercloud"
-)
-
-// EnableOptsBuilder allows extensions to add additional parameters to the Enable
-// request.
-type EnableOptsBuilder interface {
-	ToCDNContainerEnableMap() (map[string]string, error)
-}
-
-// EnableOpts is a structure that holds options for enabling a CDN container.
-type EnableOpts struct {
-	// CDNEnabled indicates whether or not the container is CDN enabled. Set to
-	// `true` to enable the container. Note that changing this setting from true
-	// to false will disable the container in the CDN but only after the TTL has
-	// expired.
-	CDNEnabled bool `h:"X-Cdn-Enabled"`
-	// TTL is the time-to-live for the container (in seconds).
-	TTL int `h:"X-Ttl"`
-}
-
-// ToCDNContainerEnableMap formats an EnableOpts into a map of headers.
-func (opts EnableOpts) ToCDNContainerEnableMap() (map[string]string, error) {
-	h, err := gophercloud.BuildHeaders(opts)
-	if err != nil {
-		return nil, err
-	}
-	return h, nil
-}
-
-// Enable is a function that enables/disables a CDN container.
-func Enable(c *gophercloud.ServiceClient, containerName string, opts EnableOptsBuilder) EnableResult {
-	var res EnableResult
-	h := c.AuthenticatedHeaders()
-
-	if opts != nil {
-		headers, err := opts.ToCDNContainerEnableMap()
-		if err != nil {
-			res.Err = err
-			return res
-		}
-
-		for k, v := range headers {
-			h[k] = v
-		}
-	}
-
-	resp, err := c.Request("PUT", enableURL(c, containerName), gophercloud.RequestOpts{
-		MoreHeaders: h,
-		OkCodes:     []int{201, 202, 204},
-	})
-	if resp != nil {
-		res.Header = resp.Header
-	}
-	res.Err = err
-	return res
-}
-
-// Get is a function that retrieves the metadata of a container. To extract just
-// the custom metadata, pass the GetResult response to the ExtractMetadata
-// function.
-func Get(c *gophercloud.ServiceClient, containerName string) GetResult {
-	var res GetResult
-	resp, err := c.Request("HEAD", getURL(c, containerName), gophercloud.RequestOpts{
-		OkCodes: []int{200, 204},
-	})
-	if resp != nil {
-		res.Header = resp.Header
-	}
-	res.Err = err
-	return res
-}
-
-// State is the state of an option. It is a pointer to a boolean to enable checking for
-// a zero-value of nil instead of false, which is a valid option.
-type State *bool
-
-var (
-	iTrue  = true
-	iFalse = false
-
-	// Enabled is used for a true value for options in request bodies.
-	Enabled State = &iTrue
-	// Disabled is used for a false value for options in request bodies.
-	Disabled State = &iFalse
-)
-
-// UpdateOptsBuilder allows extensions to add additional parameters to the
-// Update request.
-type UpdateOptsBuilder interface {
-	ToContainerUpdateMap() (map[string]string, error)
-}
-
-// UpdateOpts is a structure that holds parameters for updating, creating, or
-// deleting a container's metadata.
-type UpdateOpts struct {
-	// Whether or not to CDN-enable a container. Prefer using XCDNEnabled, which
-	// is of type *bool underneath.
-	// TODO v2.0: change type to Enabled/Disabled (*bool)
-	CDNEnabled bool `h:"X-Cdn-Enabled"`
-	// Whether or not to enable log retention. Prefer using XLogRetention, which
-	// is of type *bool underneath.
-	// TODO v2.0: change type to Enabled/Disabled (*bool)
-	LogRetention  bool `h:"X-Log-Retention"`
-	XCDNEnabled   *bool
-	XLogRetention *bool
-	TTL           int `h:"X-Ttl"`
-}
-
-// ToContainerUpdateMap formats a CreateOpts into a map of headers.
-func (opts UpdateOpts) ToContainerUpdateMap() (map[string]string, error) {
-	h, err := gophercloud.BuildHeaders(opts)
-	if err != nil {
-		return nil, err
-	}
-	h["X-Cdn-Enabled"] = strconv.FormatBool(opts.CDNEnabled)
-	h["X-Log-Retention"] = strconv.FormatBool(opts.LogRetention)
-
-	if opts.XCDNEnabled != nil {
-		h["X-Cdn-Enabled"] = strconv.FormatBool(*opts.XCDNEnabled)
-	}
-
-	if opts.XLogRetention != nil {
-		h["X-Log-Retention"] = strconv.FormatBool(*opts.XLogRetention)
-	}
-
-	return h, nil
-}
-
-// Update is a function that creates, updates, or deletes a container's
-// metadata.
-func Update(c *gophercloud.ServiceClient, containerName string, opts UpdateOptsBuilder) UpdateResult {
-	var res UpdateResult
-	h := c.AuthenticatedHeaders()
-
-	if opts != nil {
-		headers, err := opts.ToContainerUpdateMap()
-		if err != nil {
-			res.Err = err
-			return res
-		}
-
-		for k, v := range headers {
-			h[k] = v
-		}
-	}
-
-	resp, err := c.Request("POST", updateURL(c, containerName), gophercloud.RequestOpts{
-		MoreHeaders: h,
-		OkCodes:     []int{202, 204},
-	})
-	if resp != nil {
-		res.Header = resp.Header
-	}
-	res.Err = err
-	return res
-}
diff --git a/rackspace/objectstorage/v1/cdncontainers/requests_test.go b/rackspace/objectstorage/v1/cdncontainers/requests_test.go
deleted file mode 100644
index 28b963d..0000000
--- a/rackspace/objectstorage/v1/cdncontainers/requests_test.go
+++ /dev/null
@@ -1,29 +0,0 @@
-package cdncontainers
-
-import (
-	"net/http"
-	"testing"
-
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestEnableCDNContainer(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	th.Mux.HandleFunc("/testContainer", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "PUT")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Accept", "application/json")
-
-		w.Header().Add("X-Ttl", "259200")
-		w.Header().Add("X-Cdn-Enabled", "True")
-		w.WriteHeader(http.StatusNoContent)
-	})
-
-	options := &EnableOpts{CDNEnabled: true, TTL: 259200}
-	actual := Enable(fake.ServiceClient(), "testContainer", options)
-	th.AssertNoErr(t, actual.Err)
-	th.CheckEquals(t, actual.Header["X-Ttl"][0], "259200")
-	th.CheckEquals(t, actual.Header["X-Cdn-Enabled"][0], "True")
-}
diff --git a/rackspace/objectstorage/v1/cdncontainers/results.go b/rackspace/objectstorage/v1/cdncontainers/results.go
deleted file mode 100644
index cb0ad30..0000000
--- a/rackspace/objectstorage/v1/cdncontainers/results.go
+++ /dev/null
@@ -1,149 +0,0 @@
-package cdncontainers
-
-import (
-	"strings"
-	"time"
-
-	"github.com/rackspace/gophercloud"
-)
-
-// EnableHeader represents the headers returned in the response from an Enable request.
-type EnableHeader struct {
-	CDNIosURI       string    `mapstructure:"X-Cdn-Ios-Uri"`
-	CDNSslURI       string    `mapstructure:"X-Cdn-Ssl-Uri"`
-	CDNStreamingURI string    `mapstructure:"X-Cdn-Streaming-Uri"`
-	CDNUri          string    `mapstructure:"X-Cdn-Uri"`
-	ContentLength   int       `mapstructure:"Content-Length"`
-	ContentType     string    `mapstructure:"Content-Type"`
-	Date            time.Time `mapstructure:"-"`
-	TransID         string    `mapstructure:"X-Trans-Id"`
-}
-
-// EnableResult represents the result of an Enable operation.
-type EnableResult struct {
-	gophercloud.HeaderResult
-}
-
-// Extract will return extract an EnableHeader from the response to an Enable
-// request. To obtain a map of headers, call the ExtractHeader method on the EnableResult.
-func (er EnableResult) Extract() (EnableHeader, error) {
-	var eh EnableHeader
-	if er.Err != nil {
-		return eh, er.Err
-	}
-
-	if err := gophercloud.DecodeHeader(er.Header, &eh); err != nil {
-		return eh, err
-	}
-
-	if date, ok := er.Header["Date"]; ok && len(date) > 0 {
-		t, err := time.Parse(time.RFC1123, er.Header["Date"][0])
-		if err != nil {
-			return eh, err
-		}
-		eh.Date = t
-	}
-
-	return eh, nil
-}
-
-// GetHeader represents the headers returned in the response from a Get request.
-type GetHeader struct {
-	CDNEnabled      bool      `mapstructure:"X-Cdn-Enabled"`
-	CDNIosURI       string    `mapstructure:"X-Cdn-Ios-Uri"`
-	CDNSslURI       string    `mapstructure:"X-Cdn-Ssl-Uri"`
-	CDNStreamingURI string    `mapstructure:"X-Cdn-Streaming-Uri"`
-	CDNUri          string    `mapstructure:"X-Cdn-Uri"`
-	ContentLength   int       `mapstructure:"Content-Length"`
-	ContentType     string    `mapstructure:"Content-Type"`
-	Date            time.Time `mapstructure:"-"`
-	LogRetention    bool      `mapstructure:"X-Log-Retention"`
-	TransID         string    `mapstructure:"X-Trans-Id"`
-	TTL             int       `mapstructure:"X-Ttl"`
-}
-
-// GetResult represents the result of a Get operation.
-type GetResult struct {
-	gophercloud.HeaderResult
-}
-
-// Extract will return a struct of headers returned from a call to Get. To obtain
-// a map of headers, call the ExtractHeader method on the GetResult.
-func (gr GetResult) Extract() (GetHeader, error) {
-	var gh GetHeader
-	if gr.Err != nil {
-		return gh, gr.Err
-	}
-
-	if err := gophercloud.DecodeHeader(gr.Header, &gh); err != nil {
-		return gh, err
-	}
-
-	if date, ok := gr.Header["Date"]; ok && len(date) > 0 {
-		t, err := time.Parse(time.RFC1123, gr.Header["Date"][0])
-		if err != nil {
-			return gh, err
-		}
-		gh.Date = t
-	}
-
-	return gh, nil
-}
-
-// ExtractMetadata is a function that takes a GetResult (of type *http.Response)
-// and returns the custom metadata associated with the container.
-func (gr GetResult) ExtractMetadata() (map[string]string, error) {
-	if gr.Err != nil {
-		return nil, gr.Err
-	}
-	metadata := make(map[string]string)
-	for k, v := range gr.Header {
-		if strings.HasPrefix(k, "X-Container-Meta-") {
-			key := strings.TrimPrefix(k, "X-Container-Meta-")
-			metadata[key] = v[0]
-		}
-	}
-	return metadata, nil
-}
-
-// UpdateHeader represents the headers returned in the response from a Update request.
-type UpdateHeader struct {
-	CDNIosURI       string    `mapstructure:"X-Cdn-Ios-Uri"`
-	CDNSslURI       string    `mapstructure:"X-Cdn-Ssl-Uri"`
-	CDNStreamingURI string    `mapstructure:"X-Cdn-Streaming-Uri"`
-	CDNUri          string    `mapstructure:"X-Cdn-Uri"`
-	ContentLength   int       `mapstructure:"Content-Length"`
-	ContentType     string    `mapstructure:"Content-Type"`
-	Date            time.Time `mapstructure:"-"`
-	TransID         string    `mapstructure:"X-Trans-Id"`
-}
-
-// UpdateResult represents the result of an update operation. To extract the
-// the headers from the HTTP response, you can invoke the 'ExtractHeader'
-// method on the result struct.
-type UpdateResult struct {
-	gophercloud.HeaderResult
-}
-
-// Extract will return a struct of headers returned from a call to Update. To obtain
-// a map of headers, call the ExtractHeader method on the UpdateResult.
-func (ur UpdateResult) Extract() (UpdateHeader, error) {
-	var uh UpdateHeader
-	if ur.Err != nil {
-		return uh, ur.Err
-	}
-
-	if err := gophercloud.DecodeHeader(ur.Header, &uh); err != nil {
-		return uh, err
-	}
-
-	if date, ok := ur.Header["Date"]; ok && len(date) > 0 {
-		t, err := time.Parse(time.RFC1123, ur.Header["Date"][0])
-		if err != nil {
-			return uh, err
-		}
-		uh.Date = t
-	}
-
-	return uh, nil
-}
diff --git a/rackspace/objectstorage/v1/cdncontainers/urls.go b/rackspace/objectstorage/v1/cdncontainers/urls.go
deleted file mode 100644
index 541249a..0000000
--- a/rackspace/objectstorage/v1/cdncontainers/urls.go
+++ /dev/null
@@ -1,15 +0,0 @@
-package cdncontainers
-
-import "github.com/rackspace/gophercloud"
-
-func enableURL(c *gophercloud.ServiceClient, containerName string) string {
-	return c.ServiceURL(containerName)
-}
-
-func getURL(c *gophercloud.ServiceClient, container string) string {
-	return c.ServiceURL(container)
-}
-
-func updateURL(c *gophercloud.ServiceClient, container string) string {
-	return getURL(c, container)
-}
diff --git a/rackspace/objectstorage/v1/cdncontainers/urls_test.go b/rackspace/objectstorage/v1/cdncontainers/urls_test.go
deleted file mode 100644
index aa5bfe6..0000000
--- a/rackspace/objectstorage/v1/cdncontainers/urls_test.go
+++ /dev/null
@@ -1,20 +0,0 @@
-package cdncontainers
-
-import (
-	"testing"
-
-	"github.com/rackspace/gophercloud"
-	th "github.com/rackspace/gophercloud/testhelper"
-)
-
-const endpoint = "http://localhost:57909/"
-
-func endpointClient() *gophercloud.ServiceClient {
-	return &gophercloud.ServiceClient{Endpoint: endpoint}
-}
-
-func TestEnableURL(t *testing.T) {
-	actual := enableURL(endpointClient(), "foo")
-	expected := endpoint + "foo"
-	th.CheckEquals(t, expected, actual)
-}
diff --git a/rackspace/objectstorage/v1/cdnobjects/delegate.go b/rackspace/objectstorage/v1/cdnobjects/delegate.go
deleted file mode 100644
index e9d2ff1..0000000
--- a/rackspace/objectstorage/v1/cdnobjects/delegate.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package cdnobjects
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/objectstorage/v1/objects"
-)
-
-// Delete is a function that deletes an object from the CDN.
-func Delete(c *gophercloud.ServiceClient, containerName, objectName string, opts os.DeleteOptsBuilder) os.DeleteResult {
-	return os.Delete(c, containerName, objectName, nil)
-}
diff --git a/rackspace/objectstorage/v1/cdnobjects/delegate_test.go b/rackspace/objectstorage/v1/cdnobjects/delegate_test.go
deleted file mode 100644
index b5e04a9..0000000
--- a/rackspace/objectstorage/v1/cdnobjects/delegate_test.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package cdnobjects
-
-import (
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/objectstorage/v1/objects"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestDeleteCDNObject(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleDeleteObjectSuccessfully(t)
-
-	res := Delete(fake.ServiceClient(), "testContainer", "testObject", nil)
-	th.AssertNoErr(t, res.Err)
-
-}
diff --git a/rackspace/objectstorage/v1/cdnobjects/doc.go b/rackspace/objectstorage/v1/cdnobjects/doc.go
deleted file mode 100644
index 90cd5c9..0000000
--- a/rackspace/objectstorage/v1/cdnobjects/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package cdnobjects provides information and interaction with the CDN
-// Object API resource for the Rackspace Cloud Files service.
-package cdnobjects
diff --git a/rackspace/objectstorage/v1/cdnobjects/request.go b/rackspace/objectstorage/v1/cdnobjects/request.go
deleted file mode 100644
index 540e0cd..0000000
--- a/rackspace/objectstorage/v1/cdnobjects/request.go
+++ /dev/null
@@ -1,15 +0,0 @@
-package cdnobjects
-
-import (
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/rackspace/objectstorage/v1/cdncontainers"
-)
-
-// CDNURL returns the unique CDN URI for the given container and object.
-func CDNURL(c *gophercloud.ServiceClient, containerName, objectName string) (string, error) {
-	h, err := cdncontainers.Get(c, containerName).Extract()
-	if err != nil {
-		return "", err
-	}
-	return h.CDNUri + "/" + objectName, nil
-}
diff --git a/rackspace/objectstorage/v1/containers/delegate.go b/rackspace/objectstorage/v1/containers/delegate.go
deleted file mode 100644
index 77ed002..0000000
--- a/rackspace/objectstorage/v1/containers/delegate.go
+++ /dev/null
@@ -1,93 +0,0 @@
-package containers
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/objectstorage/v1/containers"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// ExtractInfo interprets a page of List results when full container info
-// is requested.
-func ExtractInfo(page pagination.Page) ([]os.Container, error) {
-	return os.ExtractInfo(page)
-}
-
-// ExtractNames interprets a page of List results when just the container
-// names are requested.
-func ExtractNames(page pagination.Page) ([]string, error) {
-	return os.ExtractNames(page)
-}
-
-// List is a function that retrieves containers associated with the account as
-// well as account metadata. It returns a pager which can be iterated with the
-// EachPage function.
-func List(c *gophercloud.ServiceClient, opts os.ListOptsBuilder) pagination.Pager {
-	return os.List(c, opts)
-}
-
-// CreateOpts is a structure that holds parameters for creating a container.
-type CreateOpts struct {
-	Metadata         map[string]string
-	ContainerRead    string `h:"X-Container-Read"`
-	ContainerWrite   string `h:"X-Container-Write"`
-	VersionsLocation string `h:"X-Versions-Location"`
-}
-
-// ToContainerCreateMap formats a CreateOpts into a map of headers.
-func (opts CreateOpts) ToContainerCreateMap() (map[string]string, error) {
-	h, err := gophercloud.BuildHeaders(opts)
-	if err != nil {
-		return nil, err
-	}
-	for k, v := range opts.Metadata {
-		h["X-Container-Meta-"+k] = v
-	}
-	return h, nil
-}
-
-// Create is a function that creates a new container.
-func Create(c *gophercloud.ServiceClient, containerName string, opts os.CreateOptsBuilder) os.CreateResult {
-	return os.Create(c, containerName, opts)
-}
-
-// Delete is a function that deletes a container.
-func Delete(c *gophercloud.ServiceClient, containerName string) os.DeleteResult {
-	return os.Delete(c, containerName)
-}
-
-// UpdateOpts is a structure that holds parameters for updating or creating a
-// container's metadata.
-type UpdateOpts struct {
-	Metadata               map[string]string
-	ContainerRead          string `h:"X-Container-Read"`
-	ContainerWrite         string `h:"X-Container-Write"`
-	ContentType            string `h:"Content-Type"`
-	DetectContentType      bool   `h:"X-Detect-Content-Type"`
-	RemoveVersionsLocation string `h:"X-Remove-Versions-Location"`
-	VersionsLocation       string `h:"X-Versions-Location"`
-}
-
-// ToContainerUpdateMap formats a CreateOpts into a map of headers.
-func (opts UpdateOpts) ToContainerUpdateMap() (map[string]string, error) {
-	h, err := gophercloud.BuildHeaders(opts)
-	if err != nil {
-		return nil, err
-	}
-	for k, v := range opts.Metadata {
-		h["X-Container-Meta-"+k] = v
-	}
-	return h, nil
-}
-
-// Update is a function that creates, updates, or deletes a container's
-// metadata.
-func Update(c *gophercloud.ServiceClient, containerName string, opts os.UpdateOptsBuilder) os.UpdateResult {
-	return os.Update(c, containerName, opts)
-}
-
-// Get is a function that retrieves the metadata of a container. To extract just
-// the custom metadata, pass the GetResult response to the ExtractMetadata
-// function.
-func Get(c *gophercloud.ServiceClient, containerName string) os.GetResult {
-	return os.Get(c, containerName)
-}
diff --git a/rackspace/objectstorage/v1/containers/delegate_test.go b/rackspace/objectstorage/v1/containers/delegate_test.go
deleted file mode 100644
index 7ba4eb2..0000000
--- a/rackspace/objectstorage/v1/containers/delegate_test.go
+++ /dev/null
@@ -1,91 +0,0 @@
-package containers
-
-import (
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/objectstorage/v1/containers"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestListContainerInfo(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleListContainerInfoSuccessfully(t)
-
-	count := 0
-	err := List(fake.ServiceClient(), &os.ListOpts{Full: true}).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractInfo(page)
-		th.AssertNoErr(t, err)
-
-		th.CheckDeepEquals(t, os.ExpectedListInfo, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, count, 1)
-}
-
-func TestListContainerNames(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleListContainerNamesSuccessfully(t)
-
-	count := 0
-	err := List(fake.ServiceClient(), &os.ListOpts{Full: false}).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractNames(page)
-		if err != nil {
-			t.Errorf("Failed to extract container names: %v", err)
-			return false, err
-		}
-
-		th.CheckDeepEquals(t, os.ExpectedListNames, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, count, 1)
-}
-
-func TestCreateContainers(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleCreateContainerSuccessfully(t)
-
-	options := os.CreateOpts{ContentType: "application/json", Metadata: map[string]string{"foo": "bar"}}
-	res := Create(fake.ServiceClient(), "testContainer", options)
-	th.CheckNoErr(t, res.Err)
-	th.CheckEquals(t, "bar", res.Header["X-Container-Meta-Foo"][0])
-
-}
-
-func TestDeleteContainers(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleDeleteContainerSuccessfully(t)
-
-	res := Delete(fake.ServiceClient(), "testContainer")
-	th.CheckNoErr(t, res.Err)
-}
-
-func TestUpdateContainers(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleUpdateContainerSuccessfully(t)
-
-	options := &os.UpdateOpts{Metadata: map[string]string{"foo": "bar"}}
-	res := Update(fake.ServiceClient(), "testContainer", options)
-	th.CheckNoErr(t, res.Err)
-}
-
-func TestGetContainers(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleGetContainerSuccessfully(t)
-
-	_, err := Get(fake.ServiceClient(), "testContainer").ExtractMetadata()
-	th.CheckNoErr(t, err)
-}
diff --git a/rackspace/objectstorage/v1/containers/doc.go b/rackspace/objectstorage/v1/containers/doc.go
deleted file mode 100644
index d132a07..0000000
--- a/rackspace/objectstorage/v1/containers/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package containers provides information and interaction with the Container
-// API resource for the Rackspace Cloud Files service.
-package containers
diff --git a/rackspace/objectstorage/v1/objects/delegate.go b/rackspace/objectstorage/v1/objects/delegate.go
deleted file mode 100644
index 94c820b..0000000
--- a/rackspace/objectstorage/v1/objects/delegate.go
+++ /dev/null
@@ -1,94 +0,0 @@
-package objects
-
-import (
-	"io"
-
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/objectstorage/v1/objects"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// ExtractInfo is a function that takes a page of objects and returns their full information.
-func ExtractInfo(page pagination.Page) ([]os.Object, error) {
-	return os.ExtractInfo(page)
-}
-
-// ExtractNames is a function that takes a page of objects and returns only their names.
-func ExtractNames(page pagination.Page) ([]string, error) {
-	return os.ExtractNames(page)
-}
-
-// List is a function that retrieves objects in the container as
-// well as container metadata. It returns a pager which can be iterated with the
-// EachPage function.
-func List(c *gophercloud.ServiceClient, containerName string, opts os.ListOptsBuilder) pagination.Pager {
-	return os.List(c, containerName, opts)
-}
-
-// Download is a function that retrieves the content and metadata for an object.
-// To extract just the content, pass the DownloadResult response to the
-// ExtractContent function.
-func Download(c *gophercloud.ServiceClient, containerName, objectName string, opts os.DownloadOptsBuilder) os.DownloadResult {
-	return os.Download(c, containerName, objectName, opts)
-}
-
-// Create is a function that creates a new object or replaces an existing object.
-func Create(c *gophercloud.ServiceClient, containerName, objectName string, content io.ReadSeeker, opts os.CreateOptsBuilder) os.CreateResult {
-	return os.Create(c, containerName, objectName, content, opts)
-}
-
-// CopyOpts is a structure that holds parameters for copying one object to
-// another.
-type CopyOpts struct {
-	Metadata           map[string]string
-	ContentDisposition string `h:"Content-Disposition"`
-	ContentEncoding    string `h:"Content-Encoding"`
-	ContentLength      int    `h:"Content-Length"`
-	ContentType        string `h:"Content-Type"`
-	CopyFrom           string `h:"X-Copy_From"`
-	Destination        string `h:"Destination"`
-	DetectContentType  bool   `h:"X-Detect-Content-Type"`
-}
-
-// ToObjectCopyMap formats a CopyOpts into a map of headers.
-func (opts CopyOpts) ToObjectCopyMap() (map[string]string, error) {
-	h, err := gophercloud.BuildHeaders(opts)
-	if err != nil {
-		return nil, err
-	}
-	for k, v := range opts.Metadata {
-		h["X-Object-Meta-"+k] = v
-	}
-	// `Content-Length` is required and a value of "0" is acceptable, but calling `gophercloud.BuildHeaders`
-	// will remove the `Content-Length` header if it's set to 0 (or equivalently not set). This will add
-	// the header if it's not already set.
-	if _, ok := h["Content-Length"]; !ok {
-		h["Content-Length"] = "0"
-	}
-	return h, nil
-}
-
-// Copy is a function that copies one object to another.
-func Copy(c *gophercloud.ServiceClient, containerName, objectName string, opts os.CopyOptsBuilder) os.CopyResult {
-	return os.Copy(c, containerName, objectName, opts)
-}
-
-// Delete is a function that deletes an object.
-func Delete(c *gophercloud.ServiceClient, containerName, objectName string, opts os.DeleteOptsBuilder) os.DeleteResult {
-	return os.Delete(c, containerName, objectName, opts)
-}
-
-// Get is a function that retrieves the metadata of an object. To extract just the custom
-// metadata, pass the GetResult response to the ExtractMetadata function.
-func Get(c *gophercloud.ServiceClient, containerName, objectName string, opts os.GetOptsBuilder) os.GetResult {
-	return os.Get(c, containerName, objectName, opts)
-}
-
-// Update is a function that creates, updates, or deletes an object's metadata.
-func Update(c *gophercloud.ServiceClient, containerName, objectName string, opts os.UpdateOptsBuilder) os.UpdateResult {
-	return os.Update(c, containerName, objectName, opts)
-}
-
-func CreateTempURL(c *gophercloud.ServiceClient, containerName, objectName string, opts os.CreateTempURLOpts) (string, error) {
-	return os.CreateTempURL(c, containerName, objectName, opts)
-}
diff --git a/rackspace/objectstorage/v1/objects/delegate_test.go b/rackspace/objectstorage/v1/objects/delegate_test.go
deleted file mode 100644
index 21cd417..0000000
--- a/rackspace/objectstorage/v1/objects/delegate_test.go
+++ /dev/null
@@ -1,127 +0,0 @@
-package objects
-
-import (
-	"strings"
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/objectstorage/v1/objects"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestDownloadObject(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleDownloadObjectSuccessfully(t)
-
-	content, err := Download(fake.ServiceClient(), "testContainer", "testObject", nil).ExtractContent()
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, string(content), "Successful download with Gophercloud")
-}
-
-func TestListObjectsInfo(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleListObjectsInfoSuccessfully(t)
-
-	count := 0
-	options := &os.ListOpts{Full: true}
-	err := List(fake.ServiceClient(), "testContainer", options).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractInfo(page)
-		th.AssertNoErr(t, err)
-
-		th.CheckDeepEquals(t, os.ExpectedListInfo, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, count, 1)
-}
-
-func TestListObjectNames(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleListObjectNamesSuccessfully(t)
-
-	count := 0
-	options := &os.ListOpts{Full: false}
-	err := List(fake.ServiceClient(), "testContainer", options).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractNames(page)
-		if err != nil {
-			t.Errorf("Failed to extract container names: %v", err)
-			return false, err
-		}
-
-		th.CheckDeepEquals(t, os.ExpectedListNames, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, count, 1)
-}
-
-func TestCreateObject(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	
-        content := "Did gyre and gimble in the wabe"
-        os.HandleCreateTextObjectSuccessfully(t, content)
-
-	options := &os.CreateOpts{ContentType: "text/plain"}
-	res := Create(fake.ServiceClient(), "testContainer", "testObject", strings.NewReader(content), options)
-	th.AssertNoErr(t, res.Err)
-}
-
-func TestCreateObjectWithoutContentType(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-        content := "The sky was the color of television, tuned to a dead channel."
-	os.HandleCreateTypelessObjectSuccessfully(t, content)
-
-	res := Create(fake.ServiceClient(), "testContainer", "testObject", strings.NewReader(content), &os.CreateOpts{})
-	th.AssertNoErr(t, res.Err)
-}
-
-func TestCopyObject(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleCopyObjectSuccessfully(t)
-
-	options := &CopyOpts{Destination: "/newTestContainer/newTestObject"}
-	res := Copy(fake.ServiceClient(), "testContainer", "testObject", options)
-	th.AssertNoErr(t, res.Err)
-}
-
-func TestDeleteObject(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleDeleteObjectSuccessfully(t)
-
-	res := Delete(fake.ServiceClient(), "testContainer", "testObject", nil)
-	th.AssertNoErr(t, res.Err)
-}
-
-func TestUpdateObject(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleUpdateObjectSuccessfully(t)
-
-	options := &os.UpdateOpts{Metadata: map[string]string{"Gophercloud-Test": "objects"}}
-	res := Update(fake.ServiceClient(), "testContainer", "testObject", options)
-	th.AssertNoErr(t, res.Err)
-}
-
-func TestGetObject(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleGetObjectSuccessfully(t)
-
-	expected := map[string]string{"Gophercloud-Test": "objects"}
-	actual, err := Get(fake.ServiceClient(), "testContainer", "testObject", nil).ExtractMetadata()
-	th.AssertNoErr(t, err)
-	th.CheckDeepEquals(t, expected, actual)
-}
diff --git a/rackspace/objectstorage/v1/objects/doc.go b/rackspace/objectstorage/v1/objects/doc.go
deleted file mode 100644
index 781984b..0000000
--- a/rackspace/objectstorage/v1/objects/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package objects provides information and interaction with the Object
-// API resource for the Rackspace Cloud Files service.
-package objects
diff --git a/rackspace/orchestration/v1/buildinfo/delegate.go b/rackspace/orchestration/v1/buildinfo/delegate.go
deleted file mode 100644
index c834e5c..0000000
--- a/rackspace/orchestration/v1/buildinfo/delegate.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package buildinfo
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/orchestration/v1/buildinfo"
-)
-
-// Get retreives build info data for the Heat deployment.
-func Get(c *gophercloud.ServiceClient) os.GetResult {
-	return os.Get(c)
-}
diff --git a/rackspace/orchestration/v1/buildinfo/delegate_test.go b/rackspace/orchestration/v1/buildinfo/delegate_test.go
deleted file mode 100644
index b25a690..0000000
--- a/rackspace/orchestration/v1/buildinfo/delegate_test.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package buildinfo
-
-import (
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/orchestration/v1/buildinfo"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestGetTemplate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleGetSuccessfully(t, os.GetOutput)
-
-	actual, err := Get(fake.ServiceClient()).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := os.GetExpected
-	th.AssertDeepEquals(t, expected, actual)
-}
diff --git a/rackspace/orchestration/v1/buildinfo/doc.go b/rackspace/orchestration/v1/buildinfo/doc.go
deleted file mode 100644
index 183e8df..0000000
--- a/rackspace/orchestration/v1/buildinfo/doc.go
+++ /dev/null
@@ -1,2 +0,0 @@
-// Package buildinfo provides build information about heat deployments.
-package buildinfo
diff --git a/rackspace/orchestration/v1/stackevents/delegate.go b/rackspace/orchestration/v1/stackevents/delegate.go
deleted file mode 100644
index 08675de..0000000
--- a/rackspace/orchestration/v1/stackevents/delegate.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package stackevents
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/orchestration/v1/stackevents"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// Find retreives stack events for the given stack name.
-func Find(c *gophercloud.ServiceClient, stackName string) os.FindResult {
-	return os.Find(c, stackName)
-}
-
-// List makes a request against the API to list resources for the given stack.
-func List(c *gophercloud.ServiceClient, stackName, stackID string, opts os.ListOptsBuilder) pagination.Pager {
-	return os.List(c, stackName, stackID, opts)
-}
-
-// ListResourceEvents makes a request against the API to list resources for the given stack.
-func ListResourceEvents(c *gophercloud.ServiceClient, stackName, stackID, resourceName string, opts os.ListResourceEventsOptsBuilder) pagination.Pager {
-	return os.ListResourceEvents(c, stackName, stackID, resourceName, opts)
-}
-
-// Get retreives data for the given stack resource.
-func Get(c *gophercloud.ServiceClient, stackName, stackID, resourceName, eventID string) os.GetResult {
-	return os.Get(c, stackName, stackID, resourceName, eventID)
-}
diff --git a/rackspace/orchestration/v1/stackevents/delegate_test.go b/rackspace/orchestration/v1/stackevents/delegate_test.go
deleted file mode 100644
index e1c0bc8..0000000
--- a/rackspace/orchestration/v1/stackevents/delegate_test.go
+++ /dev/null
@@ -1,72 +0,0 @@
-package stackevents
-
-import (
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/orchestration/v1/stackevents"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestFindEvents(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleFindSuccessfully(t, os.FindOutput)
-
-	actual, err := Find(fake.ServiceClient(), "postman_stack").Extract()
-	th.AssertNoErr(t, err)
-
-	expected := os.FindExpected
-	th.AssertDeepEquals(t, expected, actual)
-}
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleListSuccessfully(t, os.ListOutput)
-
-	count := 0
-	err := List(fake.ServiceClient(), "hello_world", "49181cd6-169a-4130-9455-31185bbfc5bf", nil).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := os.ExtractEvents(page)
-		th.AssertNoErr(t, err)
-
-		th.CheckDeepEquals(t, os.ListExpected, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, count, 1)
-}
-
-func TestListResourceEvents(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleListResourceEventsSuccessfully(t, os.ListResourceEventsOutput)
-
-	count := 0
-	err := ListResourceEvents(fake.ServiceClient(), "hello_world", "49181cd6-169a-4130-9455-31185bbfc5bf", "my_resource", nil).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := os.ExtractEvents(page)
-		th.AssertNoErr(t, err)
-
-		th.CheckDeepEquals(t, os.ListResourceEventsExpected, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, count, 1)
-}
-
-func TestGetEvent(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleGetSuccessfully(t, os.GetOutput)
-
-	actual, err := Get(fake.ServiceClient(), "hello_world", "49181cd6-169a-4130-9455-31185bbfc5bf", "my_resource", "93940999-7d40-44ae-8de4-19624e7b8d18").Extract()
-	th.AssertNoErr(t, err)
-
-	expected := os.GetExpected
-	th.AssertDeepEquals(t, expected, actual)
-}
diff --git a/rackspace/orchestration/v1/stackevents/doc.go b/rackspace/orchestration/v1/stackevents/doc.go
deleted file mode 100644
index dfd6ef6..0000000
--- a/rackspace/orchestration/v1/stackevents/doc.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// Package stackevents provides operations for finding, listing, and retrieving
-// stack events.
-package stackevents
diff --git a/rackspace/orchestration/v1/stackresources/delegate.go b/rackspace/orchestration/v1/stackresources/delegate.go
deleted file mode 100644
index cb7be28..0000000
--- a/rackspace/orchestration/v1/stackresources/delegate.go
+++ /dev/null
@@ -1,42 +0,0 @@
-package stackresources
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/orchestration/v1/stackresources"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// Find retreives stack resources for the given stack name.
-func Find(c *gophercloud.ServiceClient, stackName string) os.FindResult {
-	return os.Find(c, stackName)
-}
-
-// List makes a request against the API to list resources for the given stack.
-func List(c *gophercloud.ServiceClient, stackName, stackID string, opts os.ListOptsBuilder) pagination.Pager {
-	return os.List(c, stackName, stackID, opts)
-}
-
-// Get retreives data for the given stack resource.
-func Get(c *gophercloud.ServiceClient, stackName, stackID, resourceName string) os.GetResult {
-	return os.Get(c, stackName, stackID, resourceName)
-}
-
-// Metadata retreives the metadata for the given stack resource.
-func Metadata(c *gophercloud.ServiceClient, stackName, stackID, resourceName string) os.MetadataResult {
-	return os.Metadata(c, stackName, stackID, resourceName)
-}
-
-// ListTypes makes a request against the API to list resource types.
-func ListTypes(c *gophercloud.ServiceClient) pagination.Pager {
-	return os.ListTypes(c)
-}
-
-// Schema retreives the schema for the given resource type.
-func Schema(c *gophercloud.ServiceClient, resourceType string) os.SchemaResult {
-	return os.Schema(c, resourceType)
-}
-
-// Template retreives the template representation for the given resource type.
-func Template(c *gophercloud.ServiceClient, resourceType string) os.TemplateResult {
-	return os.Template(c, resourceType)
-}
diff --git a/rackspace/orchestration/v1/stackresources/delegate_test.go b/rackspace/orchestration/v1/stackresources/delegate_test.go
deleted file mode 100644
index 116e44c..0000000
--- a/rackspace/orchestration/v1/stackresources/delegate_test.go
+++ /dev/null
@@ -1,108 +0,0 @@
-package stackresources
-
-import (
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/orchestration/v1/stackresources"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestFindResources(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleFindSuccessfully(t, os.FindOutput)
-
-	actual, err := Find(fake.ServiceClient(), "hello_world").Extract()
-	th.AssertNoErr(t, err)
-
-	expected := os.FindExpected
-	th.AssertDeepEquals(t, expected, actual)
-}
-
-func TestListResources(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleListSuccessfully(t, os.ListOutput)
-
-	count := 0
-	err := List(fake.ServiceClient(), "hello_world", "49181cd6-169a-4130-9455-31185bbfc5bf", nil).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := os.ExtractResources(page)
-		th.AssertNoErr(t, err)
-
-		th.CheckDeepEquals(t, os.ListExpected, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, count, 1)
-}
-
-func TestGetResource(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleGetSuccessfully(t, os.GetOutput)
-
-	actual, err := Get(fake.ServiceClient(), "teststack", "0b1771bd-9336-4f2b-ae86-a80f971faf1e", "wordpress_instance").Extract()
-	th.AssertNoErr(t, err)
-
-	expected := os.GetExpected
-	th.AssertDeepEquals(t, expected, actual)
-}
-
-func TestResourceMetadata(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleMetadataSuccessfully(t, os.MetadataOutput)
-
-	actual, err := Metadata(fake.ServiceClient(), "teststack", "0b1771bd-9336-4f2b-ae86-a80f971faf1e", "wordpress_instance").Extract()
-	th.AssertNoErr(t, err)
-
-	expected := os.MetadataExpected
-	th.AssertDeepEquals(t, expected, actual)
-}
-
-func TestListResourceTypes(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleListTypesSuccessfully(t, os.ListTypesOutput)
-
-	count := 0
-	err := ListTypes(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := os.ExtractResourceTypes(page)
-		th.AssertNoErr(t, err)
-
-		th.CheckDeepEquals(t, os.ListTypesExpected, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, 1, count)
-}
-
-func TestGetResourceSchema(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleGetSchemaSuccessfully(t, os.GetSchemaOutput)
-
-	actual, err := Schema(fake.ServiceClient(), "OS::Heat::AResourceName").Extract()
-	th.AssertNoErr(t, err)
-
-	expected := os.GetSchemaExpected
-	th.AssertDeepEquals(t, expected, actual)
-}
-
-func TestGetResourceTemplate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleGetTemplateSuccessfully(t, os.GetTemplateOutput)
-
-	actual, err := Template(fake.ServiceClient(), "OS::Heat::AResourceName").Extract()
-	th.AssertNoErr(t, err)
-
-	expected := os.GetTemplateExpected
-	th.AssertDeepEquals(t, expected, string(actual))
-}
diff --git a/rackspace/orchestration/v1/stackresources/doc.go b/rackspace/orchestration/v1/stackresources/doc.go
deleted file mode 100644
index e4f8b08..0000000
--- a/rackspace/orchestration/v1/stackresources/doc.go
+++ /dev/null
@@ -1,5 +0,0 @@
-// Package stackresources provides operations for working with stack resources.
-// A resource is a template artifact that represents some component of your
-// desired architecture (a Cloud Server, a group of scaled Cloud Servers, a load
-// balancer, some configuration management system, and so forth).
-package stackresources
diff --git a/rackspace/orchestration/v1/stacks/delegate.go b/rackspace/orchestration/v1/stacks/delegate.go
deleted file mode 100644
index f7e387f..0000000
--- a/rackspace/orchestration/v1/stacks/delegate.go
+++ /dev/null
@@ -1,49 +0,0 @@
-package stacks
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/orchestration/v1/stacks"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// Create accepts an os.CreateOpts struct and creates a new stack using the values
-// provided.
-func Create(c *gophercloud.ServiceClient, opts os.CreateOptsBuilder) os.CreateResult {
-	return os.Create(c, opts)
-}
-
-// Adopt accepts an os.AdoptOpts struct and creates a new stack from existing stack
-// resources using the values provided.
-func Adopt(c *gophercloud.ServiceClient, opts os.AdoptOptsBuilder) os.AdoptResult {
-	return os.Adopt(c, opts)
-}
-
-// List accepts an os.ListOpts struct and lists stacks based on the options provided.
-func List(c *gophercloud.ServiceClient, opts os.ListOptsBuilder) pagination.Pager {
-	return os.List(c, opts)
-}
-
-// Get retreives a stack based on the stack name and stack ID.
-func Get(c *gophercloud.ServiceClient, stackName, stackID string) os.GetResult {
-	return os.Get(c, stackName, stackID)
-}
-
-// Update accepts an os.UpdateOpts struct and updates a stack based on the options provided.
-func Update(c *gophercloud.ServiceClient, stackName, stackID string, opts os.UpdateOptsBuilder) os.UpdateResult {
-	return os.Update(c, stackName, stackID, opts)
-}
-
-// Delete deletes a stack based on the stack name and stack ID provided.
-func Delete(c *gophercloud.ServiceClient, stackName, stackID string) os.DeleteResult {
-	return os.Delete(c, stackName, stackID)
-}
-
-// Preview provides a preview of a stack based on the options provided.
-func Preview(c *gophercloud.ServiceClient, opts os.PreviewOptsBuilder) os.PreviewResult {
-	return os.Preview(c, opts)
-}
-
-// Abandon abandons a stack, keeping the resources available.
-func Abandon(c *gophercloud.ServiceClient, stackName, stackID string) os.AbandonResult {
-	return os.Abandon(c, stackName, stackID)
-}
diff --git a/rackspace/orchestration/v1/stacks/delegate_test.go b/rackspace/orchestration/v1/stacks/delegate_test.go
deleted file mode 100644
index 553ae94..0000000
--- a/rackspace/orchestration/v1/stacks/delegate_test.go
+++ /dev/null
@@ -1,870 +0,0 @@
-package stacks
-
-import (
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/orchestration/v1/stacks"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestCreateStack(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleCreateSuccessfully(t, CreateOutput)
-
-	createOpts := os.CreateOpts{
-		Name:    "stackcreated",
-		Timeout: 60,
-		Template: `{
-      "outputs": {
-        "db_host": {
-          "value": {
-            "get_attr": [
-            "db",
-            "hostname"
-            ]
-          }
-        }
-      },
-      "heat_template_version": "2014-10-16",
-      "description": "HEAT template for creating a Cloud Database.\n",
-      "parameters": {
-        "db_name": {
-          "default": "wordpress",
-          "type": "string",
-          "description": "the name for the database",
-          "constraints": [
-          {
-            "length": {
-              "max": 64,
-              "min": 1
-            },
-            "description": "must be between 1 and 64 characters"
-          },
-          {
-            "allowed_pattern": "[a-zA-Z][a-zA-Z0-9]*",
-            "description": "must begin with a letter and contain only alphanumeric characters."
-          }
-          ]
-        },
-        "db_instance_name": {
-          "default": "Cloud_DB",
-          "type": "string",
-          "description": "the database instance name"
-        },
-        "db_username": {
-          "default": "admin",
-          "hidden": true,
-          "type": "string",
-          "description": "database admin account username",
-          "constraints": [
-          {
-            "length": {
-              "max": 16,
-              "min": 1
-                },
-              "description": "must be between 1 and 16 characters"
-            },
-            {
-              "allowed_pattern": "[a-zA-Z][a-zA-Z0-9]*",
-              "description": "must begin with a letter and contain only alphanumeric characters."
-            }
-          ]
-          },
-          "db_volume_size": {
-            "default": 30,
-            "type": "number",
-            "description": "database volume size (in GB)",
-            "constraints": [
-            {
-              "range": {
-                "max": 1024,
-                "min": 1
-              },
-              "description": "must be between 1 and 1024 GB"
-            }
-            ]
-          },
-          "db_flavor": {
-            "default": "1GB Instance",
-            "type": "string",
-            "description": "database instance size",
-            "constraints": [
-            {
-              "description": "must be a valid cloud database flavor",
-              "allowed_values": [
-              "1GB Instance",
-              "2GB Instance",
-              "4GB Instance",
-              "8GB Instance",
-              "16GB Instance"
-              ]
-            }
-            ]
-          },
-        "db_password": {
-          "default": "admin",
-          "hidden": true,
-          "type": "string",
-          "description": "database admin account password",
-          "constraints": [
-          {
-            "length": {
-              "max": 41,
-              "min": 1
-            },
-            "description": "must be between 1 and 14 characters"
-          },
-          {
-            "allowed_pattern": "[a-zA-Z0-9]*",
-            "description": "must contain only alphanumeric characters."
-          }
-          ]
-        }
-      },
-      "resources": {
-        "db": {
-          "type": "OS::Trove::Instance",
-          "properties": {
-            "flavor": {
-              "get_param": "db_flavor"
-            },
-            "size": {
-              "get_param": "db_volume_size"
-            },
-            "users": [
-            {
-              "password": {
-                "get_param": "db_password"
-              },
-              "name": {
-                "get_param": "db_username"
-              },
-              "databases": [
-              {
-                "get_param": "db_name"
-              }
-              ]
-            }
-            ],
-            "name": {
-              "get_param": "db_instance_name"
-            },
-            "databases": [
-            {
-              "name": {
-                "get_param": "db_name"
-              }
-            }
-            ]
-          }
-        }
-      }
-    }`,
-		DisableRollback: os.Disable,
-	}
-	actual, err := Create(fake.ServiceClient(), createOpts).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := CreateExpected
-	th.AssertDeepEquals(t, expected, actual)
-}
-
-func TestCreateStackNewTemplateFormat(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleCreateSuccessfully(t, CreateOutput)
-
-	createOpts := os.CreateOpts{
-		Name:            "stackcreated",
-		Timeout:         60,
-		TemplateOpts:    new(os.Template),
-		DisableRollback: os.Disable,
-	}
-	createOpts.TemplateOpts.Bin = []byte(`{
-		    "outputs": {
-		        "db_host": {
-		            "value": {
-		                "get_attr": [
-		                    "db",
-		                    "hostname"
-		                ]
-		            }
-		        }
-		    },
-		    "heat_template_version": "2014-10-16",
-		    "description": "HEAT template for creating a Cloud Database.\n",
-		    "parameters": {
-		        "db_name": {
-		            "default": "wordpress",
-		            "type": "string",
-		            "description": "the name for the database",
-		            "constraints": [
-		                {
-		                    "length": {
-		                        "max": 64,
-		                        "min": 1
-		                    },
-		                    "description": "must be between 1 and 64 characters"
-		                },
-		                {
-		                    "allowed_pattern": "[a-zA-Z][a-zA-Z0-9]*",
-		                    "description": "must begin with a letter and contain only alphanumeric characters."
-		                }
-		            ]
-		        },
-		        "db_instance_name": {
-		            "default": "Cloud_DB",
-		            "type": "string",
-		            "description": "the database instance name"
-		        },
-		        "db_username": {
-		            "default": "admin",
-		            "hidden": true,
-		            "type": "string",
-		            "description": "database admin account username",
-		            "constraints": [
-		                {
-		                    "length": {
-		                        "max": 16,
-		                        "min": 1
-		                    },
-		                    "description": "must be between 1 and 16 characters"
-		                },
-		                {
-		                    "allowed_pattern": "[a-zA-Z][a-zA-Z0-9]*",
-		                    "description": "must begin with a letter and contain only alphanumeric characters."
-		                }
-		            ]
-		        },
-		        "db_volume_size": {
-		            "default": 30,
-		            "type": "number",
-		            "description": "database volume size (in GB)",
-		            "constraints": [
-		                {
-		                    "range": {
-		                        "max": 1024,
-		                        "min": 1
-		                    },
-		                    "description": "must be between 1 and 1024 GB"
-		                }
-		            ]
-		        },
-		        "db_flavor": {
-		            "default": "1GB Instance",
-		            "type": "string",
-		            "description": "database instance size",
-		            "constraints": [
-		                {
-		                    "description": "must be a valid cloud database flavor",
-		                    "allowed_values": [
-		                        "1GB Instance",
-		                        "2GB Instance",
-		                        "4GB Instance",
-		                        "8GB Instance",
-		                        "16GB Instance"
-		                    ]
-		                }
-		            ]
-		        },
-		        "db_password": {
-		            "default": "admin",
-		            "hidden": true,
-		            "type": "string",
-		            "description": "database admin account password",
-		            "constraints": [
-		                {
-		                    "length": {
-		                        "max": 41,
-		                        "min": 1
-		                    },
-		                    "description": "must be between 1 and 14 characters"
-		                },
-		                {
-		                    "allowed_pattern": "[a-zA-Z0-9]*",
-		                    "description": "must contain only alphanumeric characters."
-		                }
-		            ]
-		        }
-		    },
-		    "resources": {
-		        "db": {
-		            "type": "OS::Trove::Instance",
-		            "properties": {
-		                "flavor": {
-		                    "get_param": "db_flavor"
-		                },
-		                "size": {
-		                    "get_param": "db_volume_size"
-		                },
-		                "users": [
-		                    {
-		                        "password": {
-		                            "get_param": "db_password"
-		                        },
-		                        "name": {
-		                            "get_param": "db_username"
-		                        },
-		                        "databases": [
-		                            {
-		                                "get_param": "db_name"
-		                            }
-		                        ]
-		                    }
-		                ],
-		                "name": {
-		                    "get_param": "db_instance_name"
-		                },
-		                "databases": [
-		                    {
-		                        "name": {
-		                            "get_param": "db_name"
-		                        }
-		                    }
-		                ]
-		            }
-		        }
-		    }
-		}`)
-	actual, err := Create(fake.ServiceClient(), createOpts).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := CreateExpected
-	th.AssertDeepEquals(t, expected, actual)
-}
-
-func TestAdoptStack(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleCreateSuccessfully(t, CreateOutput)
-
-	adoptOpts := os.AdoptOpts{
-		AdoptStackData: `{\"environment\":{\"parameters\":{}},    \"status\":\"COMPLETE\",\"name\": \"trovestack\",\n  \"template\": {\n    \"outputs\": {\n      \"db_host\": {\n        \"value\": {\n          \"get_attr\": [\n            \"db\",\n            \"hostname\"\n          ]\n        }\n      }\n    },\n    \"heat_template_version\": \"2014-10-16\",\n    \"description\": \"HEAT template for creating a Cloud Database.\\n\",\n    \"parameters\": {\n      \"db_instance_name\": {\n        \"default\": \"Cloud_DB\",\n        \"type\": \"string\",\n        \"description\": \"the database instance name\"\n      },\n      \"db_flavor\": {\n        \"default\": \"1GB Instance\",\n        \"type\": \"string\",\n        \"description\": \"database instance size\",\n        \"constraints\": [\n          {\n            \"description\": \"must be a valid cloud database flavor\",\n            \"allowed_values\": [\n              \"1GB Instance\",\n              \"2GB Instance\",\n              \"4GB Instance\",\n              \"8GB Instance\",\n              \"16GB Instance\"\n            ]\n          }\n        ]\n      },\n      \"db_password\": {\n        \"default\": \"admin\",\n        \"hidden\": true,\n        \"type\": \"string\",\n        \"description\": \"database admin account password\",\n        \"constraints\": [\n          {\n            \"length\": {\n              \"max\": 41,\n              \"min\": 1\n            },\n            \"description\": \"must be between 1 and 14 characters\"\n          },\n          {\n            \"allowed_pattern\": \"[a-zA-Z0-9]*\",\n            \"description\": \"must contain only alphanumeric characters.\"\n          }\n        ]\n      },\n      \"db_name\": {\n        \"default\": \"wordpress\",\n        \"type\": \"string\",\n        \"description\": \"the name for the database\",\n        \"constraints\": [\n          {\n            \"length\": {\n              \"max\": 64,\n              \"min\": 1\n            },\n            \"description\": \"must be between 1 and 64 characters\"\n          },\n          {\n            \"allowed_pattern\": \"[a-zA-Z][a-zA-Z0-9]*\",\n            \"description\": \"must begin with a letter and contain only alphanumeric characters.\"\n          }\n        ]\n      },\n      \"db_username\": {\n        \"default\": \"admin\",\n        \"hidden\": true,\n        \"type\": \"string\",\n        \"description\": \"database admin account username\",\n        \"constraints\": [\n          {\n            \"length\": {\n              \"max\": 16,\n              \"min\": 1\n            },\n            \"description\": \"must be between 1 and 16 characters\"\n          },\n          {\n            \"allowed_pattern\": \"[a-zA-Z][a-zA-Z0-9]*\",\n            \"description\": \"must begin with a letter and contain only alphanumeric characters.\"\n          }\n        ]\n      },\n      \"db_volume_size\": {\n        \"default\": 30,\n        \"type\": \"number\",\n        \"description\": \"database volume size (in GB)\",\n        \"constraints\": [\n          {\n            \"range\": {\n              \"max\": 1024,\n              \"min\": 1\n            },\n            \"description\": \"must be between 1 and 1024 GB\"\n          }\n        ]\n      }\n    },\n    \"resources\": {\n      \"db\": {\n        \"type\": \"OS::Trove::Instance\",\n        \"properties\": {\n          \"flavor\": {\n            \"get_param\": \"db_flavor\"\n          },\n          \"databases\": [\n            {\n              \"name\": {\n                \"get_param\": \"db_name\"\n              }\n            }\n          ],\n          \"users\": [\n            {\n              \"password\": {\n                \"get_param\": \"db_password\"\n              },\n              \"name\": {\n                \"get_param\": \"db_username\"\n              },\n              \"databases\": [\n                {\n                  \"get_param\": \"db_name\"\n                }\n              ]\n            }\n          ],\n          \"name\": {\n            \"get_param\": \"db_instance_name\"\n          },\n          \"size\": {\n            \"get_param\": \"db_volume_size\"\n          }\n        }\n      }\n    }\n  },\n  \"action\": \"CREATE\",\n  \"id\": \"exxxxd-7xx5-4xxb-bxx2-cxxxxxx5\",\n  \"resources\": {\n    \"db\": {\n      \"status\": \"COMPLETE\",\n      \"name\": \"db\",\n      \"resource_data\": {},\n      \"resource_id\": \"exxxx2-9xx0-4xxxb-bxx2-dxxxxxx4\",\n      \"action\": \"CREATE\",\n      \"type\": \"OS::Trove::Instance\",\n      \"metadata\": {}\n    }\n  }\n},`,
-		Name:           "stackadopted",
-		Timeout:        60,
-		Template: `{
-      "outputs": {
-        "db_host": {
-          "value": {
-            "get_attr": [
-            "db",
-            "hostname"
-            ]
-          }
-        }
-      },
-      "heat_template_version": "2014-10-16",
-      "description": "HEAT template for creating a Cloud Database.\n",
-      "parameters": {
-        "db_name": {
-          "default": "wordpress",
-          "type": "string",
-          "description": "the name for the database",
-          "constraints": [
-          {
-            "length": {
-              "max": 64,
-              "min": 1
-            },
-            "description": "must be between 1 and 64 characters"
-          },
-          {
-            "allowed_pattern": "[a-zA-Z][a-zA-Z0-9]*",
-            "description": "must begin with a letter and contain only alphanumeric characters."
-          }
-          ]
-        },
-        "db_instance_name": {
-          "default": "Cloud_DB",
-          "type": "string",
-          "description": "the database instance name"
-        },
-        "db_username": {
-          "default": "admin",
-          "hidden": true,
-          "type": "string",
-          "description": "database admin account username",
-          "constraints": [
-          {
-            "length": {
-              "max": 16,
-              "min": 1
-            },
-            "description": "must be between 1 and 16 characters"
-          },
-          {
-            "allowed_pattern": "[a-zA-Z][a-zA-Z0-9]*",
-            "description": "must begin with a letter and contain only alphanumeric characters."
-          }
-          ]
-        },
-        "db_volume_size": {
-          "default": 30,
-          "type": "number",
-          "description": "database volume size (in GB)",
-          "constraints": [
-          {
-            "range": {
-              "max": 1024,
-              "min": 1
-            },
-            "description": "must be between 1 and 1024 GB"
-          }
-          ]
-        },
-        "db_flavor": {
-          "default": "1GB Instance",
-          "type": "string",
-          "description": "database instance size",
-          "constraints": [
-          {
-            "description": "must be a valid cloud database flavor",
-            "allowed_values": [
-            "1GB Instance",
-            "2GB Instance",
-            "4GB Instance",
-            "8GB Instance",
-            "16GB Instance"
-            ]
-          }
-          ]
-        },
-        "db_password": {
-          "default": "admin",
-          "hidden": true,
-          "type": "string",
-          "description": "database admin account password",
-          "constraints": [
-          {
-            "length": {
-              "max": 41,
-              "min": 1
-            },
-            "description": "must be between 1 and 14 characters"
-          },
-          {
-            "allowed_pattern": "[a-zA-Z0-9]*",
-            "description": "must contain only alphanumeric characters."
-          }
-          ]
-        }
-      },
-      "resources": {
-        "db": {
-          "type": "OS::Trove::Instance",
-          "properties": {
-            "flavor": {
-              "get_param": "db_flavor"
-            },
-            "size": {
-              "get_param": "db_volume_size"
-            },
-            "users": [
-            {
-              "password": {
-                "get_param": "db_password"
-              },
-              "name": {
-                "get_param": "db_username"
-              },
-              "databases": [
-              {
-                "get_param": "db_name"
-              }
-              ]
-            }
-            ],
-            "name": {
-              "get_param": "db_instance_name"
-            },
-            "databases": [
-            {
-              "name": {
-                "get_param": "db_name"
-              }
-            }
-            ]
-          }
-        }
-      }
-    }`,
-		DisableRollback: os.Disable,
-	}
-	actual, err := Adopt(fake.ServiceClient(), adoptOpts).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := CreateExpected
-	th.AssertDeepEquals(t, expected, actual)
-}
-
-func TestAdoptStackNewTemplateFormat(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleCreateSuccessfully(t, CreateOutput)
-	template := new(os.Template)
-	template.Bin = []byte(`{
-  "outputs": {
-	"db_host": {
-	  "value": {
-		"get_attr": [
-		"db",
-		"hostname"
-		]
-	  }
-	}
-  },
-  "heat_template_version": "2014-10-16",
-  "description": "HEAT template for creating a Cloud Database.\n",
-  "parameters": {
-	"db_name": {
-	  "default": "wordpress",
-	  "type": "string",
-	  "description": "the name for the database",
-	  "constraints": [
-	  {
-		"length": {
-		  "max": 64,
-		  "min": 1
-		},
-		"description": "must be between 1 and 64 characters"
-	  },
-	  {
-		"allowed_pattern": "[a-zA-Z][a-zA-Z0-9]*",
-		"description": "must begin with a letter and contain only alphanumeric characters."
-	  }
-	  ]
-	},
-	"db_instance_name": {
-	  "default": "Cloud_DB",
-	  "type": "string",
-	  "description": "the database instance name"
-	},
-	"db_username": {
-	  "default": "admin",
-	  "hidden": true,
-	  "type": "string",
-	  "description": "database admin account username",
-	  "constraints": [
-	  {
-		"length": {
-		  "max": 16,
-		  "min": 1
-		},
-		"description": "must be between 1 and 16 characters"
-	  },
-	  {
-		"allowed_pattern": "[a-zA-Z][a-zA-Z0-9]*",
-		"description": "must begin with a letter and contain only alphanumeric characters."
-	  }
-	  ]
-	},
-	"db_volume_size": {
-	  "default": 30,
-	  "type": "number",
-	  "description": "database volume size (in GB)",
-	  "constraints": [
-	  {
-		"range": {
-		  "max": 1024,
-		  "min": 1
-		},
-		"description": "must be between 1 and 1024 GB"
-	  }
-	  ]
-	},
-	"db_flavor": {
-	  "default": "1GB Instance",
-	  "type": "string",
-	  "description": "database instance size",
-	  "constraints": [
-	  {
-		"description": "must be a valid cloud database flavor",
-		"allowed_values": [
-		"1GB Instance",
-		"2GB Instance",
-		"4GB Instance",
-		"8GB Instance",
-		"16GB Instance"
-		]
-	  }
-	  ]
-	},
-	"db_password": {
-	  "default": "admin",
-	  "hidden": true,
-	  "type": "string",
-	  "description": "database admin account password",
-	  "constraints": [
-	  {
-		"length": {
-		  "max": 41,
-		  "min": 1
-		},
-		"description": "must be between 1 and 14 characters"
-	  },
-	  {
-		"allowed_pattern": "[a-zA-Z0-9]*",
-		"description": "must contain only alphanumeric characters."
-	  }
-	  ]
-	}
-  },
-  "resources": {
-	"db": {
-	  "type": "OS::Trove::Instance",
-	  "properties": {
-		"flavor": {
-		  "get_param": "db_flavor"
-		},
-		"size": {
-		  "get_param": "db_volume_size"
-		},
-		"users": [
-		{
-		  "password": {
-			"get_param": "db_password"
-		  },
-		  "name": {
-			"get_param": "db_username"
-		  },
-		  "databases": [
-		  {
-			"get_param": "db_name"
-		  }
-		  ]
-		}
-		],
-		"name": {
-		  "get_param": "db_instance_name"
-		},
-		"databases": [
-		{
-		  "name": {
-			"get_param": "db_name"
-		  }
-		}
-		]
-	  }
-	}
-  }
-}`)
-
-	adoptOpts := os.AdoptOpts{
-		AdoptStackData:  `{\"environment\":{\"parameters\":{}},    \"status\":\"COMPLETE\",\"name\": \"trovestack\",\n  \"template\": {\n    \"outputs\": {\n      \"db_host\": {\n        \"value\": {\n          \"get_attr\": [\n            \"db\",\n            \"hostname\"\n          ]\n        }\n      }\n    },\n    \"heat_template_version\": \"2014-10-16\",\n    \"description\": \"HEAT template for creating a Cloud Database.\\n\",\n    \"parameters\": {\n      \"db_instance_name\": {\n        \"default\": \"Cloud_DB\",\n        \"type\": \"string\",\n        \"description\": \"the database instance name\"\n      },\n      \"db_flavor\": {\n        \"default\": \"1GB Instance\",\n        \"type\": \"string\",\n        \"description\": \"database instance size\",\n        \"constraints\": [\n          {\n            \"description\": \"must be a valid cloud database flavor\",\n            \"allowed_values\": [\n              \"1GB Instance\",\n              \"2GB Instance\",\n              \"4GB Instance\",\n              \"8GB Instance\",\n              \"16GB Instance\"\n            ]\n          }\n        ]\n      },\n      \"db_password\": {\n        \"default\": \"admin\",\n        \"hidden\": true,\n        \"type\": \"string\",\n        \"description\": \"database admin account password\",\n        \"constraints\": [\n          {\n            \"length\": {\n              \"max\": 41,\n              \"min\": 1\n            },\n            \"description\": \"must be between 1 and 14 characters\"\n          },\n          {\n            \"allowed_pattern\": \"[a-zA-Z0-9]*\",\n            \"description\": \"must contain only alphanumeric characters.\"\n          }\n        ]\n      },\n      \"db_name\": {\n        \"default\": \"wordpress\",\n        \"type\": \"string\",\n        \"description\": \"the name for the database\",\n        \"constraints\": [\n          {\n            \"length\": {\n              \"max\": 64,\n              \"min\": 1\n            },\n            \"description\": \"must be between 1 and 64 characters\"\n          },\n          {\n            \"allowed_pattern\": \"[a-zA-Z][a-zA-Z0-9]*\",\n            \"description\": \"must begin with a letter and contain only alphanumeric characters.\"\n          }\n        ]\n      },\n      \"db_username\": {\n        \"default\": \"admin\",\n        \"hidden\": true,\n        \"type\": \"string\",\n        \"description\": \"database admin account username\",\n        \"constraints\": [\n          {\n            \"length\": {\n              \"max\": 16,\n              \"min\": 1\n            },\n            \"description\": \"must be between 1 and 16 characters\"\n          },\n          {\n            \"allowed_pattern\": \"[a-zA-Z][a-zA-Z0-9]*\",\n            \"description\": \"must begin with a letter and contain only alphanumeric characters.\"\n          }\n        ]\n      },\n      \"db_volume_size\": {\n        \"default\": 30,\n        \"type\": \"number\",\n        \"description\": \"database volume size (in GB)\",\n        \"constraints\": [\n          {\n            \"range\": {\n              \"max\": 1024,\n              \"min\": 1\n            },\n            \"description\": \"must be between 1 and 1024 GB\"\n          }\n        ]\n      }\n    },\n    \"resources\": {\n      \"db\": {\n        \"type\": \"OS::Trove::Instance\",\n        \"properties\": {\n          \"flavor\": {\n            \"get_param\": \"db_flavor\"\n          },\n          \"databases\": [\n            {\n              \"name\": {\n                \"get_param\": \"db_name\"\n              }\n            }\n          ],\n          \"users\": [\n            {\n              \"password\": {\n                \"get_param\": \"db_password\"\n              },\n              \"name\": {\n                \"get_param\": \"db_username\"\n              },\n              \"databases\": [\n                {\n                  \"get_param\": \"db_name\"\n                }\n              ]\n            }\n          ],\n          \"name\": {\n            \"get_param\": \"db_instance_name\"\n          },\n          \"size\": {\n            \"get_param\": \"db_volume_size\"\n          }\n        }\n      }\n    }\n  },\n  \"action\": \"CREATE\",\n  \"id\": \"exxxxd-7xx5-4xxb-bxx2-cxxxxxx5\",\n  \"resources\": {\n    \"db\": {\n      \"status\": \"COMPLETE\",\n      \"name\": \"db\",\n      \"resource_data\": {},\n      \"resource_id\": \"exxxx2-9xx0-4xxxb-bxx2-dxxxxxx4\",\n      \"action\": \"CREATE\",\n      \"type\": \"OS::Trove::Instance\",\n      \"metadata\": {}\n    }\n  }\n},`,
-		Name:            "stackadopted",
-		Timeout:         60,
-		TemplateOpts:    template,
-		DisableRollback: os.Disable,
-	}
-	actual, err := Adopt(fake.ServiceClient(), adoptOpts).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := CreateExpected
-	th.AssertDeepEquals(t, expected, actual)
-}
-
-func TestListStack(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleListSuccessfully(t, os.FullListOutput)
-
-	count := 0
-	err := List(fake.ServiceClient(), nil).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := os.ExtractStacks(page)
-		th.AssertNoErr(t, err)
-
-		th.CheckDeepEquals(t, os.ListExpected, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, count, 1)
-}
-
-func TestUpdateStack(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleUpdateSuccessfully(t)
-
-	updateOpts := os.UpdateOpts{
-		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"
-          }
-        }
-      }
-    }`,
-	}
-	err := Update(fake.ServiceClient(), "gophercloud-test-stack-2", "db6977b2-27aa-4775-9ae7-6213212d4ada", updateOpts).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestUpdateStackNewTemplateFormat(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleUpdateSuccessfully(t)
-
-	updateOpts := os.UpdateOpts{
-		TemplateOpts: new(os.Template),
-	}
-	updateOpts.TemplateOpts.Bin = []byte(`
-		{
-			"stack_name": "postman_stack",
-			"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"
-						}
-					}
-				}
-			}
-		}`)
-	err := Update(fake.ServiceClient(), "gophercloud-test-stack-2", "db6977b2-27aa-4775-9ae7-6213212d4ada", updateOpts).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestDeleteStack(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleDeleteSuccessfully(t)
-
-	err := Delete(fake.ServiceClient(), "gophercloud-test-stack-2", "db6977b2-27aa-4775-9ae7-6213212d4ada").ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestPreviewStack(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandlePreviewSuccessfully(t, os.GetOutput)
-
-	previewOpts := os.PreviewOpts{
-		Name:    "stackcreated",
-		Timeout: 60,
-		Template: `
-    {
-      "stack_name": "postman_stack",
-      "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"
-            }
-          }
-        }
-      }
-    }`,
-		DisableRollback: os.Disable,
-	}
-	actual, err := Preview(fake.ServiceClient(), previewOpts).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := os.PreviewExpected
-	th.AssertDeepEquals(t, expected, actual)
-}
-
-func TestPreviewStackNewTemplateFormat(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandlePreviewSuccessfully(t, os.GetOutput)
-
-	previewOpts := os.PreviewOpts{
-		Name:            "stackcreated",
-		Timeout:         60,
-		TemplateOpts:    new(os.Template),
-		DisableRollback: os.Disable,
-	}
-	previewOpts.TemplateOpts.Bin = []byte(`
-		{
-		    "stack_name": "postman_stack",
-		    "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"
-		                }
-		            }
-		        }
-		    }
-		}`)
-	actual, err := Preview(fake.ServiceClient(), previewOpts).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := os.PreviewExpected
-	th.AssertDeepEquals(t, expected, actual)
-}
-
-func TestAbandonStack(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleAbandonSuccessfully(t, os.AbandonOutput)
-
-	actual, err := Abandon(fake.ServiceClient(), "postman_stack", "16ef0584-4458-41eb-87c8-0dc8d5f66c8").Extract()
-	th.AssertNoErr(t, err)
-
-	expected := os.AbandonExpected
-	th.AssertDeepEquals(t, expected, actual)
-}
diff --git a/rackspace/orchestration/v1/stacks/doc.go b/rackspace/orchestration/v1/stacks/doc.go
deleted file mode 100644
index 19231b5..0000000
--- a/rackspace/orchestration/v1/stacks/doc.go
+++ /dev/null
@@ -1,8 +0,0 @@
-// Package stacks provides operation for working with Heat stacks. A stack is a
-// group of resources (servers, load balancers, databases, and so forth)
-// combined to fulfill a useful purpose. Based on a template, Heat orchestration
-// engine creates an instantiated set of resources (a stack) to run the
-// application framework or component specified (in the template). A stack is a
-// running instance of a template. The result of creating a stack is a deployment
-// of the application framework or component.
-package stacks
diff --git a/rackspace/orchestration/v1/stacks/fixtures.go b/rackspace/orchestration/v1/stacks/fixtures.go
deleted file mode 100644
index c9afeb1..0000000
--- a/rackspace/orchestration/v1/stacks/fixtures.go
+++ /dev/null
@@ -1,32 +0,0 @@
-package stacks
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/orchestration/v1/stacks"
-)
-
-// CreateExpected represents the expected object from a Create request.
-var CreateExpected = &os.CreatedStack{
-	ID: "b663e18a-4767-4cdf-9db5-9c8cc13cc38a",
-	Links: []gophercloud.Link{
-		gophercloud.Link{
-			Href: "https://ord.orchestration.api.rackspacecloud.com/v1/864477/stacks/stackcreated/b663e18a-4767-4cdf-9db5-9c8cc13cc38a",
-			Rel:  "self",
-		},
-	},
-}
-
-// CreateOutput represents the response body from a Create request.
-const CreateOutput = `
-{
-  "stack": {
-    "id": "b663e18a-4767-4cdf-9db5-9c8cc13cc38a",
-    "links": [
-    {
-      "href": "https://ord.orchestration.api.rackspacecloud.com/v1/864477/stacks/stackcreated/b663e18a-4767-4cdf-9db5-9c8cc13cc38a",
-      "rel": "self"
-    }
-    ]
-  }
-}
-`
diff --git a/rackspace/orchestration/v1/stacktemplates/delegate.go b/rackspace/orchestration/v1/stacktemplates/delegate.go
deleted file mode 100644
index 3b5d46e..0000000
--- a/rackspace/orchestration/v1/stacktemplates/delegate.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package stacktemplates
-
-import (
-	"github.com/rackspace/gophercloud"
-	os "github.com/rackspace/gophercloud/openstack/orchestration/v1/stacktemplates"
-)
-
-// Get retreives data for the given stack template.
-func Get(c *gophercloud.ServiceClient, stackName, stackID string) os.GetResult {
-	return os.Get(c, stackName, stackID)
-}
-
-// Validate validates the given stack template.
-func Validate(c *gophercloud.ServiceClient, opts os.ValidateOptsBuilder) os.ValidateResult {
-	return os.Validate(c, opts)
-}
diff --git a/rackspace/orchestration/v1/stacktemplates/delegate_test.go b/rackspace/orchestration/v1/stacktemplates/delegate_test.go
deleted file mode 100644
index d4d0f8f..0000000
--- a/rackspace/orchestration/v1/stacktemplates/delegate_test.go
+++ /dev/null
@@ -1,47 +0,0 @@
-package stacktemplates
-
-import (
-	"testing"
-
-	os "github.com/rackspace/gophercloud/openstack/orchestration/v1/stacktemplates"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestGetTemplate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleGetSuccessfully(t, os.GetOutput)
-
-	actual, err := Get(fake.ServiceClient(), "postman_stack", "16ef0584-4458-41eb-87c8-0dc8d5f66c87").Extract()
-	th.AssertNoErr(t, err)
-
-	expected := os.GetExpected
-	th.AssertDeepEquals(t, expected, string(actual))
-}
-
-func TestValidateTemplate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	os.HandleValidateSuccessfully(t, os.ValidateOutput)
-
-	opts := os.ValidateOpts{
-		Template: `{
-			"Description": "Simple template to test heat commands",
-			"Parameters": {
-				"flavor": {
-					"Default": "m1.tiny",
-					"Type": "String",
-					"NoEcho": "false",
-					"Description": "",
-					"Label": "flavor"
-				}
-			}
-		}`,
-	}
-	actual, err := Validate(fake.ServiceClient(), opts).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := os.ValidateExpected
-	th.AssertDeepEquals(t, expected, actual)
-}
diff --git a/rackspace/orchestration/v1/stacktemplates/doc.go b/rackspace/orchestration/v1/stacktemplates/doc.go
deleted file mode 100644
index 5af0bd6..0000000
--- a/rackspace/orchestration/v1/stacktemplates/doc.go
+++ /dev/null
@@ -1,8 +0,0 @@
-// Package stacktemplates provides operations for working with Heat templates.
-// A Cloud Orchestration template is a portable file, written in a user-readable
-// language, that describes how a set of resources should be assembled and what
-// software should be installed in order to produce a working stack. The template
-// specifies what resources should be used, what attributes can be set, and other
-// parameters that are critical to the successful, repeatable automation of a
-// specific application stack.
-package stacktemplates
diff --git a/rackspace/rackconnect/v3/cloudnetworks/requests.go b/rackspace/rackconnect/v3/cloudnetworks/requests.go
deleted file mode 100644
index 5884303..0000000
--- a/rackspace/rackconnect/v3/cloudnetworks/requests.go
+++ /dev/null
@@ -1,24 +0,0 @@
-package cloudnetworks
-
-import (
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List returns all cloud networks that are associated with RackConnect. The ID
-// returned for each network is the same as the ID returned by the networks package.
-func List(c *gophercloud.ServiceClient) pagination.Pager {
-	url := listURL(c)
-	createPage := func(r pagination.PageResult) pagination.Page {
-		return CloudNetworkPage{pagination.SinglePageBase(r)}
-	}
-	return pagination.NewPager(c, url, createPage)
-}
-
-// Get retrieves a specific cloud network (that is associated with RackConnect)
-// based on its unique ID.
-func Get(c *gophercloud.ServiceClient, id string) GetResult {
-	var res GetResult
-	_, res.Err = c.Get(getURL(c, id), &res.Body, nil)
-	return res
-}
diff --git a/rackspace/rackconnect/v3/cloudnetworks/requests_test.go b/rackspace/rackconnect/v3/cloudnetworks/requests_test.go
deleted file mode 100644
index 10d15dd..0000000
--- a/rackspace/rackconnect/v3/cloudnetworks/requests_test.go
+++ /dev/null
@@ -1,87 +0,0 @@
-package cloudnetworks
-
-import (
-	"fmt"
-	"net/http"
-	"testing"
-	"time"
-
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestListCloudNetworks(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	th.Mux.HandleFunc("/cloud_networks", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Accept", "application/json")
-
-		w.Header().Set("Content-Type", "application/json")
-		fmt.Fprintf(w, `[{
-      "cidr": "192.168.100.0/24",
-      "created": "2014-05-25T01:23:42Z",
-      "id": "07426958-1ebf-4c38-b032-d456820ca21a",
-      "name": "RC-CLOUD",
-      "updated": "2014-05-25T02:28:44Z"
-    }]`)
-	})
-
-	expected := []CloudNetwork{
-		CloudNetwork{
-			CIDR:      "192.168.100.0/24",
-			CreatedAt: time.Date(2014, 5, 25, 1, 23, 42, 0, time.UTC),
-			ID:        "07426958-1ebf-4c38-b032-d456820ca21a",
-			Name:      "RC-CLOUD",
-			UpdatedAt: time.Date(2014, 5, 25, 2, 28, 44, 0, time.UTC),
-		},
-	}
-
-	count := 0
-	err := List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractCloudNetworks(page)
-		th.AssertNoErr(t, err)
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, count, 1)
-}
-
-func TestGetCloudNetwork(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	th.Mux.HandleFunc("/cloud_networks/07426958-1ebf-4c38-b032-d456820ca21a", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Accept", "application/json")
-
-		w.Header().Set("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-		fmt.Fprintf(w, `{
-      "cidr": "192.168.100.0/24",
-      "created": "2014-05-25T01:23:42Z",
-      "id": "07426958-1ebf-4c38-b032-d456820ca21a",
-      "name": "RC-CLOUD",
-      "updated": "2014-05-25T02:28:44Z"
-    }`)
-	})
-
-	expected := &CloudNetwork{
-		CIDR:      "192.168.100.0/24",
-		CreatedAt: time.Date(2014, 5, 25, 1, 23, 42, 0, time.UTC),
-		ID:        "07426958-1ebf-4c38-b032-d456820ca21a",
-		Name:      "RC-CLOUD",
-		UpdatedAt: time.Date(2014, 5, 25, 2, 28, 44, 0, time.UTC),
-	}
-
-	actual, err := Get(fake.ServiceClient(), "07426958-1ebf-4c38-b032-d456820ca21a").Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertDeepEquals(t, expected, actual)
-}
diff --git a/rackspace/rackconnect/v3/cloudnetworks/results.go b/rackspace/rackconnect/v3/cloudnetworks/results.go
deleted file mode 100644
index f554a0d..0000000
--- a/rackspace/rackconnect/v3/cloudnetworks/results.go
+++ /dev/null
@@ -1,113 +0,0 @@
-package cloudnetworks
-
-import (
-	"fmt"
-	"reflect"
-	"time"
-
-	"github.com/mitchellh/mapstructure"
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// CloudNetwork represents a network associated with a RackConnect configuration.
-type CloudNetwork struct {
-	// Specifies the ID of the newtork.
-	ID string `mapstructure:"id"`
-	// Specifies the user-provided name of the network.
-	Name string `mapstructure:"name"`
-	// Specifies the IP range for this network.
-	CIDR string `mapstructure:"cidr"`
-	// Specifies the time the network was created.
-	CreatedAt time.Time `mapstructure:"-"`
-	// Specifies the time the network was last updated.
-	UpdatedAt time.Time `mapstructure:"-"`
-}
-
-// CloudNetworkPage is the page returned by a pager when traversing over a
-// collection of CloudNetworks.
-type CloudNetworkPage struct {
-	pagination.SinglePageBase
-}
-
-// IsEmpty returns true if a CloudNetworkPage contains no CloudNetworks.
-func (r CloudNetworkPage) IsEmpty() (bool, error) {
-	cns, err := ExtractCloudNetworks(r)
-	if err != nil {
-		return true, err
-	}
-	return len(cns) == 0, nil
-}
-
-// ExtractCloudNetworks extracts and returns CloudNetworks. It is used while iterating over
-// a cloudnetworks.List call.
-func ExtractCloudNetworks(page pagination.Page) ([]CloudNetwork, error) {
-	var res []CloudNetwork
-	casted := page.(CloudNetworkPage).Body
-	err := mapstructure.Decode(casted, &res)
-
-	var rawNets []interface{}
-	switch casted.(type) {
-	case interface{}:
-		rawNets = casted.([]interface{})
-	default:
-		return res, fmt.Errorf("Unknown type: %v", reflect.TypeOf(casted))
-	}
-
-	for i := range rawNets {
-		thisNet := (rawNets[i]).(map[string]interface{})
-
-		if t, ok := thisNet["created"].(string); ok && t != "" {
-			creationTime, err := time.Parse(time.RFC3339, t)
-			if err != nil {
-				return res, err
-			}
-			res[i].CreatedAt = creationTime
-		}
-
-		if t, ok := thisNet["updated"].(string); ok && t != "" {
-			updatedTime, err := time.Parse(time.RFC3339, t)
-			if err != nil {
-				return res, err
-			}
-			res[i].UpdatedAt = updatedTime
-		}
-	}
-
-	return res, err
-}
-
-// GetResult represents the result of a Get operation.
-type GetResult struct {
-	gophercloud.Result
-}
-
-// Extract is a function that extracts a CloudNetwork from a GetResult.
-func (r GetResult) Extract() (*CloudNetwork, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-	var res CloudNetwork
-
-	err := mapstructure.Decode(r.Body, &res)
-
-	b := r.Body.(map[string]interface{})
-
-	if date, ok := b["created"]; ok && date != nil {
-		t, err := time.Parse(time.RFC3339, date.(string))
-		if err != nil {
-			return nil, err
-		}
-		res.CreatedAt = t
-	}
-
-	if date, ok := b["updated"]; ok && date != nil {
-		t, err := time.Parse(time.RFC3339, date.(string))
-		if err != nil {
-			return nil, err
-		}
-		res.UpdatedAt = t
-	}
-
-	return &res, err
-}
diff --git a/rackspace/rackconnect/v3/cloudnetworks/urls.go b/rackspace/rackconnect/v3/cloudnetworks/urls.go
deleted file mode 100644
index bd6b098..0000000
--- a/rackspace/rackconnect/v3/cloudnetworks/urls.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package cloudnetworks
-
-import "github.com/rackspace/gophercloud"
-
-func listURL(c *gophercloud.ServiceClient) string {
-	return c.ServiceURL("cloud_networks")
-}
-
-func getURL(c *gophercloud.ServiceClient, id string) string {
-	return c.ServiceURL("cloud_networks", id)
-}
diff --git a/rackspace/rackconnect/v3/doc.go b/rackspace/rackconnect/v3/doc.go
deleted file mode 100644
index 3a8279e..0000000
--- a/rackspace/rackconnect/v3/doc.go
+++ /dev/null
@@ -1,4 +0,0 @@
-// Package rackconnect allows Rackspace cloud accounts to leverage version 3 of
-// RackConnect, Rackspace's hybrid connectivity solution connecting dedicated
-// and cloud servers.
-package rackconnect
diff --git a/rackspace/rackconnect/v3/lbpools/doc.go b/rackspace/rackconnect/v3/lbpools/doc.go
deleted file mode 100644
index f4319b8..0000000
--- a/rackspace/rackconnect/v3/lbpools/doc.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Package lbpools provides access to load balancer pools associated with a
-// RackConnect configuration. Load Balancer Pools must be configured in advance
-// by your Network Security team to be eligible for use with RackConnect.
-// If you do not see a pool that you expect to see, contact your Support team
-// for further assistance. The Load Balancer Pool id returned by these calls is
-// automatically generated by the RackConnect automation and will remain constant
-// unless the Load Balancer Pool is renamed on your hardware load balancer.
-// All Load Balancer Pools will currently return a status of ACTIVE. Future
-// features may introduce additional statuses.
-// Node status values are ADDING, ACTIVE, REMOVING, ADD_FAILED, and REMOVE_FAILED.
-// The cloud_servers node count will only include Cloud Servers from the specified
-// cloud account. Any dedicated servers or cloud servers from another cloud account
-// on the same RackConnect Configuration will be counted as external nodes.
-package lbpools
diff --git a/rackspace/rackconnect/v3/lbpools/requests.go b/rackspace/rackconnect/v3/lbpools/requests.go
deleted file mode 100644
index c300c56..0000000
--- a/rackspace/rackconnect/v3/lbpools/requests.go
+++ /dev/null
@@ -1,146 +0,0 @@
-package lbpools
-
-import (
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List returns all load balancer pools that are associated with RackConnect.
-func List(c *gophercloud.ServiceClient) pagination.Pager {
-	url := listURL(c)
-	createPage := func(r pagination.PageResult) pagination.Page {
-		return PoolPage{pagination.SinglePageBase(r)}
-	}
-	return pagination.NewPager(c, url, createPage)
-}
-
-// Get retrieves a specific load balancer pool (that is associated with RackConnect)
-// based on its unique ID.
-func Get(c *gophercloud.ServiceClient, id string) GetResult {
-	var res GetResult
-	_, res.Err = c.Get(getURL(c, id), &res.Body, nil)
-	return res
-}
-
-// ListNodes returns all load balancer pool nodes that are associated with RackConnect
-// for the given LB pool ID.
-func ListNodes(c *gophercloud.ServiceClient, id string) pagination.Pager {
-	url := listNodesURL(c, id)
-	createPage := func(r pagination.PageResult) pagination.Page {
-		return NodePage{pagination.SinglePageBase(r)}
-	}
-	return pagination.NewPager(c, url, createPage)
-}
-
-// CreateNode adds the cloud server with the given serverID to the load balancer
-// pool with the given poolID.
-func CreateNode(c *gophercloud.ServiceClient, poolID, serverID string) CreateNodeResult {
-	var res CreateNodeResult
-	reqBody := map[string]interface{}{
-		"cloud_server": map[string]string{
-			"id": serverID,
-		},
-	}
-	_, res.Err = c.Post(createNodeURL(c, poolID), reqBody, &res.Body, nil)
-	return res
-}
-
-// ListNodesDetails returns all load balancer pool nodes that are associated with RackConnect
-// for the given LB pool ID with all their details.
-func ListNodesDetails(c *gophercloud.ServiceClient, id string) pagination.Pager {
-	url := listNodesDetailsURL(c, id)
-	createPage := func(r pagination.PageResult) pagination.Page {
-		return NodeDetailsPage{pagination.SinglePageBase(r)}
-	}
-	return pagination.NewPager(c, url, createPage)
-}
-
-// GetNode retrieves a specific LB pool node (that is associated with RackConnect)
-// based on its unique ID and the LB pool's unique ID.
-func GetNode(c *gophercloud.ServiceClient, poolID, nodeID string) GetNodeResult {
-	var res GetNodeResult
-	_, res.Err = c.Get(nodeURL(c, poolID, nodeID), &res.Body, nil)
-	return res
-}
-
-// DeleteNode removes the node with the given nodeID from the LB pool with the
-// given poolID.
-func DeleteNode(c *gophercloud.ServiceClient, poolID, nodeID string) DeleteNodeResult {
-	var res DeleteNodeResult
-	_, res.Err = c.Delete(deleteNodeURL(c, poolID, nodeID), nil)
-	return res
-}
-
-// GetNodeDetails retrieves a specific LB pool node's details based on its unique
-// ID and the LB pool's unique ID.
-func GetNodeDetails(c *gophercloud.ServiceClient, poolID, nodeID string) GetNodeDetailsResult {
-	var res GetNodeDetailsResult
-	_, res.Err = c.Get(nodeDetailsURL(c, poolID, nodeID), &res.Body, nil)
-	return res
-}
-
-// NodeOpts are options for bulk adding/deleting nodes to LB pools.
-type NodeOpts struct {
-	ServerID string
-	PoolID   string
-}
-
-// NodesOpts are a slice of NodeOpts, passed as options for bulk operations.
-type NodesOpts []NodeOpts
-
-// ToLBPoolCreateNodesMap serializes a NodesOpts into a map to send in the request.
-func (o NodesOpts) ToLBPoolCreateNodesMap() ([]map[string]interface{}, error) {
-	m := make([]map[string]interface{}, len(o))
-	for i := range o {
-		m[i] = map[string]interface{}{
-			"cloud_server": map[string]string{
-				"id": o[i].ServerID,
-			},
-			"load_balancer_pool": map[string]string{
-				"id": o[i].PoolID,
-			},
-		}
-	}
-	return m, nil
-}
-
-// CreateNodes adds the cloud servers with the given serverIDs to the corresponding
-// load balancer pools with the given poolIDs.
-func CreateNodes(c *gophercloud.ServiceClient, opts NodesOpts) CreateNodesResult {
-	var res CreateNodesResult
-	reqBody, err := opts.ToLBPoolCreateNodesMap()
-	if err != nil {
-		res.Err = err
-		return res
-	}
-
-	_, res.Err = c.Post(createNodesURL(c), reqBody, &res.Body, nil)
-	return res
-}
-
-// DeleteNodes removes the cloud servers with the given serverIDs to the corresponding
-// load balancer pools with the given poolIDs.
-func DeleteNodes(c *gophercloud.ServiceClient, opts NodesOpts) DeleteNodesResult {
-	var res DeleteNodesResult
-	reqBody, err := opts.ToLBPoolCreateNodesMap()
-	if err != nil {
-		res.Err = err
-		return res
-	}
-
-	_, res.Err = c.Request("DELETE", createNodesURL(c), gophercloud.RequestOpts{
-		JSONBody: &reqBody,
-		OkCodes:  []int{204},
-	})
-	return res
-}
-
-// ListNodesDetailsForServer is similar to ListNodesDetails but only returns nodes
-// for the given serverID.
-func ListNodesDetailsForServer(c *gophercloud.ServiceClient, serverID string) pagination.Pager {
-	url := listNodesForServerURL(c, serverID)
-	createPage := func(r pagination.PageResult) pagination.Page {
-		return NodeDetailsForServerPage{pagination.SinglePageBase(r)}
-	}
-	return pagination.NewPager(c, url, createPage)
-}
diff --git a/rackspace/rackconnect/v3/lbpools/requests_test.go b/rackspace/rackconnect/v3/lbpools/requests_test.go
deleted file mode 100644
index 48ebcec..0000000
--- a/rackspace/rackconnect/v3/lbpools/requests_test.go
+++ /dev/null
@@ -1,876 +0,0 @@
-package lbpools
-
-import (
-	"fmt"
-	"net/http"
-	"testing"
-	"time"
-
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	"github.com/rackspace/gophercloud/testhelper/client"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestListPools(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	th.Mux.HandleFunc("/load_balancer_pools", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Accept", "application/json")
-
-		w.Header().Set("Content-Type", "application/json")
-		fmt.Fprintf(w, `[
-      {
-        "id": "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2",
-        "name": "RCv3Test",
-        "node_counts": {
-          "cloud_servers": 3,
-          "external": 4,
-          "total": 7
-        },
-        "port": 80,
-        "status": "ACTIVE",
-        "status_detail": null,
-        "virtual_ip": "203.0.113.5"
-      },
-      {
-        "id": "33021100-4abf-4836-9080-465a6d87ab68",
-        "name": "RCv3Test2",
-        "node_counts": {
-          "cloud_servers": 1,
-          "external": 0,
-          "total": 1
-        },
-        "port": 80,
-        "status": "ACTIVE",
-        "status_detail": null,
-        "virtual_ip": "203.0.113.7"
-      },
-      {
-        "id": "b644350a-301b-47b5-a411-c6e0f933c347",
-        "name": "RCv3Test3",
-        "node_counts": {
-          "cloud_servers": 2,
-          "external": 3,
-          "total": 5
-        },
-        "port": 443,
-        "status": "ACTIVE",
-        "status_detail": null,
-        "virtual_ip": "203.0.113.15"
-      }
-    ]`)
-	})
-
-	expected := []Pool{
-		Pool{
-			ID:   "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2",
-			Name: "RCv3Test",
-			NodeCounts: struct {
-				CloudServers int `mapstructure:"cloud_servers"`
-				External     int `mapstructure:"external"`
-				Total        int `mapstructure:"total"`
-			}{
-				CloudServers: 3,
-				External:     4,
-				Total:        7,
-			},
-			Port:      80,
-			Status:    "ACTIVE",
-			VirtualIP: "203.0.113.5",
-		},
-		Pool{
-			ID:   "33021100-4abf-4836-9080-465a6d87ab68",
-			Name: "RCv3Test2",
-			NodeCounts: struct {
-				CloudServers int `mapstructure:"cloud_servers"`
-				External     int `mapstructure:"external"`
-				Total        int `mapstructure:"total"`
-			}{
-				CloudServers: 1,
-				External:     0,
-				Total:        1,
-			},
-			Port:      80,
-			Status:    "ACTIVE",
-			VirtualIP: "203.0.113.7",
-		},
-		Pool{
-			ID:   "b644350a-301b-47b5-a411-c6e0f933c347",
-			Name: "RCv3Test3",
-			NodeCounts: struct {
-				CloudServers int `mapstructure:"cloud_servers"`
-				External     int `mapstructure:"external"`
-				Total        int `mapstructure:"total"`
-			}{
-				CloudServers: 2,
-				External:     3,
-				Total:        5,
-			},
-			Port:      443,
-			Status:    "ACTIVE",
-			VirtualIP: "203.0.113.15",
-		},
-	}
-
-	count := 0
-	err := List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractPools(page)
-		th.AssertNoErr(t, err)
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, count, 1)
-}
-
-func TestGetLBPool(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	th.Mux.HandleFunc("/load_balancer_pools/d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Accept", "application/json")
-
-		w.Header().Set("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-		fmt.Fprintf(w, `{
-      "id": "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2",
-      "name": "RCv3Test",
-      "node_counts": {
-        "cloud_servers": 3,
-        "external": 4,
-        "total": 7
-      },
-      "port": 80,
-      "status": "ACTIVE",
-      "status_detail": null,
-      "virtual_ip": "203.0.113.5"
-    }`)
-	})
-
-	expected := &Pool{
-		ID:   "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2",
-		Name: "RCv3Test",
-		NodeCounts: struct {
-			CloudServers int `mapstructure:"cloud_servers"`
-			External     int `mapstructure:"external"`
-			Total        int `mapstructure:"total"`
-		}{
-			CloudServers: 3,
-			External:     4,
-			Total:        7,
-		},
-		Port:      80,
-		Status:    "ACTIVE",
-		VirtualIP: "203.0.113.5",
-	}
-
-	actual, err := Get(fake.ServiceClient(), "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2").Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertDeepEquals(t, expected, actual)
-}
-
-func TestListNodes(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	th.Mux.HandleFunc("/load_balancer_pools/d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2/nodes", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Accept", "application/json")
-
-		w.Header().Set("Content-Type", "application/json")
-		fmt.Fprintf(w, `[
-      {
-        "created": "2014-05-30T03:23:42Z",
-        "cloud_server": {
-          "id": "d95ae0c4-6ab8-4873-b82f-f8433840cff2"
-        },
-        "id": "1860451d-fb89-45b8-b54e-151afceb50e5",
-        "load_balancer_pool": {
-          "id": "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2"
-        },
-        "status": "ACTIVE",
-        "updated": "2014-05-30T03:24:18Z"
-      },
-      {
-        "created": "2014-05-31T08:23:12Z",
-        "cloud_server": {
-          "id": "f28b870f-a063-498a-8b12-7025e5b1caa6"
-        },
-        "id": "b70481dd-7edf-4dbb-a44b-41cc7679d4fb",
-        "load_balancer_pool": {
-          "id": "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2"
-        },
-        "status": "ADDING",
-        "updated": "2014-05-31T08:23:26Z"
-      },
-      {
-        "created": "2014-05-31T08:23:18Z",
-        "cloud_server": {
-          "id": "a3d3a6b3-e4e4-496f-9a3d-5c987163e458"
-        },
-        "id": "ced9ddc8-6fae-4e72-9457-16ead52b5515",
-        "load_balancer_pool": {
-          "id": "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2"
-        },
-        "status": "ADD_FAILED",
-        "status_detail": "Unable to communicate with network device",
-        "updated": "2014-05-31T08:24:36Z"
-      }
-    ]`)
-	})
-
-	expected := []Node{
-		Node{
-			CreatedAt: time.Date(2014, 5, 30, 3, 23, 42, 0, time.UTC),
-			CloudServer: struct {
-				ID string `mapstructure:"id"`
-			}{
-				ID: "d95ae0c4-6ab8-4873-b82f-f8433840cff2",
-			},
-			ID: "1860451d-fb89-45b8-b54e-151afceb50e5",
-			LoadBalancerPool: struct {
-				ID string `mapstructure:"id"`
-			}{
-				ID: "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2",
-			},
-			Status:    "ACTIVE",
-			UpdatedAt: time.Date(2014, 5, 30, 3, 24, 18, 0, time.UTC),
-		},
-		Node{
-			CreatedAt: time.Date(2014, 5, 31, 8, 23, 12, 0, time.UTC),
-			CloudServer: struct {
-				ID string `mapstructure:"id"`
-			}{
-				ID: "f28b870f-a063-498a-8b12-7025e5b1caa6",
-			},
-			ID: "b70481dd-7edf-4dbb-a44b-41cc7679d4fb",
-			LoadBalancerPool: struct {
-				ID string `mapstructure:"id"`
-			}{
-				ID: "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2",
-			},
-			Status:    "ADDING",
-			UpdatedAt: time.Date(2014, 5, 31, 8, 23, 26, 0, time.UTC),
-		},
-		Node{
-			CreatedAt: time.Date(2014, 5, 31, 8, 23, 18, 0, time.UTC),
-			CloudServer: struct {
-				ID string `mapstructure:"id"`
-			}{
-				ID: "a3d3a6b3-e4e4-496f-9a3d-5c987163e458",
-			},
-			ID: "ced9ddc8-6fae-4e72-9457-16ead52b5515",
-			LoadBalancerPool: struct {
-				ID string `mapstructure:"id"`
-			}{
-				ID: "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2",
-			},
-			Status:       "ADD_FAILED",
-			StatusDetail: "Unable to communicate with network device",
-			UpdatedAt:    time.Date(2014, 5, 31, 8, 24, 36, 0, time.UTC),
-		},
-	}
-
-	count := 0
-	err := ListNodes(fake.ServiceClient(), "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2").EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractNodes(page)
-		th.AssertNoErr(t, err)
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, count, 1)
-}
-
-func TestCreateNode(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	th.Mux.HandleFunc("/load_balancer_pools/d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2/nodes", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "POST")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Accept", "application/json")
-		th.TestJSONRequest(t, r, `
-      {
-        "cloud_server": {
-          "id": "d95ae0c4-6ab8-4873-b82f-f8433840cff2"
-        }
-      }
-    `)
-
-		w.Header().Set("Content-Type", "application/json")
-		w.WriteHeader(http.StatusCreated)
-		fmt.Fprintf(w, `
-      {
-        "created": "2014-05-30T03:23:42Z",
-        "cloud_server": {
-          "id": "d95ae0c4-6ab8-4873-b82f-f8433840cff2"
-        },
-        "id": "1860451d-fb89-45b8-b54e-151afceb50e5",
-        "load_balancer_pool": {
-          "id": "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2"
-        },
-        "status": "ACTIVE",
-        "status_detail": null,
-        "updated": "2014-05-30T03:24:18Z"
-      }
-    `)
-	})
-
-	expected := &Node{
-		CreatedAt: time.Date(2014, 5, 30, 3, 23, 42, 0, time.UTC),
-		CloudServer: struct {
-			ID string `mapstructure:"id"`
-		}{
-			ID: "d95ae0c4-6ab8-4873-b82f-f8433840cff2",
-		},
-		ID: "1860451d-fb89-45b8-b54e-151afceb50e5",
-		LoadBalancerPool: struct {
-			ID string `mapstructure:"id"`
-		}{
-			ID: "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2",
-		},
-		Status:    "ACTIVE",
-		UpdatedAt: time.Date(2014, 5, 30, 3, 24, 18, 0, time.UTC),
-	}
-
-	actual, err := CreateNode(fake.ServiceClient(), "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2", "d95ae0c4-6ab8-4873-b82f-f8433840cff2").Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertDeepEquals(t, expected, actual)
-}
-
-func TestListNodesDetails(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	th.Mux.HandleFunc("/load_balancer_pools/d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2/nodes/details", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Accept", "application/json")
-
-		w.Header().Set("Content-Type", "application/json")
-		fmt.Fprintf(w, `
-      [
-      {
-        "created": "2014-05-30T03:23:42Z",
-        "cloud_server": {
-          "cloud_network": {
-            "cidr": "192.168.100.0/24",
-            "created": "2014-05-25T01:23:42Z",
-            "id": "07426958-1ebf-4c38-b032-d456820ca21a",
-            "name": "RC-CLOUD",
-            "private_ip_v4": "192.168.100.5",
-            "updated": "2014-05-25T02:28:44Z"
-          },
-          "created": "2014-05-30T02:18:42Z",
-          "id": "d95ae0c4-6ab8-4873-b82f-f8433840cff2",
-          "name": "RCv3TestServer1",
-          "updated": "2014-05-30T02:19:18Z"
-        },
-        "id": "1860451d-fb89-45b8-b54e-151afceb50e5",
-        "load_balancer_pool": {
-          "id": "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2",
-          "name": "RCv3Test",
-          "node_counts": {
-            "cloud_servers": 3,
-            "external": 4,
-            "total": 7
-          },
-          "port": 80,
-          "status": "ACTIVE",
-          "status_detail": null,
-          "virtual_ip": "203.0.113.5"
-        },
-        "status": "ACTIVE",
-        "status_detail": null,
-        "updated": "2014-05-30T03:24:18Z"
-      }
-      ]
-    `)
-	})
-
-	expected := []NodeDetails{
-		NodeDetails{
-			CreatedAt: time.Date(2014, 5, 30, 3, 23, 42, 0, time.UTC),
-			CloudServer: struct {
-				ID           string `mapstructure:"id"`
-				Name         string `mapstructure:"name"`
-				CloudNetwork struct {
-					ID          string    `mapstructure:"id"`
-					Name        string    `mapstructure:"name"`
-					PrivateIPv4 string    `mapstructure:"private_ip_v4"`
-					CIDR        string    `mapstructure:"cidr"`
-					CreatedAt   time.Time `mapstructure:"-"`
-					UpdatedAt   time.Time `mapstructure:"-"`
-				} `mapstructure:"cloud_network"`
-				CreatedAt time.Time `mapstructure:"-"`
-				UpdatedAt time.Time `mapstructure:"-"`
-			}{
-				ID: "d95ae0c4-6ab8-4873-b82f-f8433840cff2",
-				CloudNetwork: struct {
-					ID          string    `mapstructure:"id"`
-					Name        string    `mapstructure:"name"`
-					PrivateIPv4 string    `mapstructure:"private_ip_v4"`
-					CIDR        string    `mapstructure:"cidr"`
-					CreatedAt   time.Time `mapstructure:"-"`
-					UpdatedAt   time.Time `mapstructure:"-"`
-				}{
-					ID:          "07426958-1ebf-4c38-b032-d456820ca21a",
-					CIDR:        "192.168.100.0/24",
-					CreatedAt:   time.Date(2014, 5, 25, 1, 23, 42, 0, time.UTC),
-					Name:        "RC-CLOUD",
-					PrivateIPv4: "192.168.100.5",
-					UpdatedAt:   time.Date(2014, 5, 25, 2, 28, 44, 0, time.UTC),
-				},
-				CreatedAt: time.Date(2014, 5, 30, 2, 18, 42, 0, time.UTC),
-				Name:      "RCv3TestServer1",
-				UpdatedAt: time.Date(2014, 5, 30, 2, 19, 18, 0, time.UTC),
-			},
-			ID: "1860451d-fb89-45b8-b54e-151afceb50e5",
-			LoadBalancerPool: Pool{
-				ID:   "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2",
-				Name: "RCv3Test",
-				NodeCounts: struct {
-					CloudServers int `mapstructure:"cloud_servers"`
-					External     int `mapstructure:"external"`
-					Total        int `mapstructure:"total"`
-				}{
-					CloudServers: 3,
-					External:     4,
-					Total:        7,
-				},
-				Port:      80,
-				Status:    "ACTIVE",
-				VirtualIP: "203.0.113.5",
-			},
-			Status:    "ACTIVE",
-			UpdatedAt: time.Date(2014, 5, 30, 3, 24, 18, 0, time.UTC),
-		},
-	}
-	count := 0
-	err := ListNodesDetails(fake.ServiceClient(), "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2").EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractNodesDetails(page)
-		th.AssertNoErr(t, err)
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, count, 1)
-}
-
-func TestGetNode(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	th.Mux.HandleFunc("/load_balancer_pools/d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2/nodes/1860451d-fb89-45b8-b54e-151afceb50e5", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Accept", "application/json")
-
-		w.Header().Set("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-		fmt.Fprintf(w, `
-      {
-        "created": "2014-05-30T03:23:42Z",
-        "cloud_server": {
-          "id": "d95ae0c4-6ab8-4873-b82f-f8433840cff2"
-        },
-        "id": "1860451d-fb89-45b8-b54e-151afceb50e5",
-        "load_balancer_pool": {
-          "id": "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2"
-        },
-        "status": "ACTIVE",
-        "status_detail": null,
-        "updated": "2014-05-30T03:24:18Z"
-      }
-    `)
-	})
-
-	expected := &Node{
-		CreatedAt: time.Date(2014, 5, 30, 3, 23, 42, 0, time.UTC),
-		CloudServer: struct {
-			ID string `mapstructure:"id"`
-		}{
-			ID: "d95ae0c4-6ab8-4873-b82f-f8433840cff2",
-		},
-		ID: "1860451d-fb89-45b8-b54e-151afceb50e5",
-		LoadBalancerPool: struct {
-			ID string `mapstructure:"id"`
-		}{
-			ID: "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2",
-		},
-		Status:    "ACTIVE",
-		UpdatedAt: time.Date(2014, 5, 30, 3, 24, 18, 0, time.UTC),
-	}
-
-	actual, err := GetNode(fake.ServiceClient(), "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2", "1860451d-fb89-45b8-b54e-151afceb50e5").Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertDeepEquals(t, expected, actual)
-}
-
-func TestDeleteNode(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	th.Mux.HandleFunc("/load_balancer_pools/d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2/nodes/1860451d-fb89-45b8-b54e-151afceb50e5", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Accept", "application/json")
-
-		w.Header().Set("Content-Type", "application/json")
-		w.WriteHeader(http.StatusNoContent)
-	})
-
-	err := DeleteNode(client.ServiceClient(), "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2", "1860451d-fb89-45b8-b54e-151afceb50e5").ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestGetNodeDetails(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	th.Mux.HandleFunc("/load_balancer_pools/d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2/nodes/d95ae0c4-6ab8-4873-b82f-f8433840cff2/details", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Accept", "application/json")
-
-		w.Header().Set("Content-Type", "application/json")
-		fmt.Fprintf(w, `
-      {
-        "created": "2014-05-30T03:23:42Z",
-        "cloud_server": {
-          "cloud_network": {
-            "cidr": "192.168.100.0/24",
-            "created": "2014-05-25T01:23:42Z",
-            "id": "07426958-1ebf-4c38-b032-d456820ca21a",
-            "name": "RC-CLOUD",
-            "private_ip_v4": "192.168.100.5",
-            "updated": "2014-05-25T02:28:44Z"
-          },
-          "created": "2014-05-30T02:18:42Z",
-          "id": "d95ae0c4-6ab8-4873-b82f-f8433840cff2",
-          "name": "RCv3TestServer1",
-          "updated": "2014-05-30T02:19:18Z"
-        },
-        "id": "1860451d-fb89-45b8-b54e-151afceb50e5",
-        "load_balancer_pool": {
-          "id": "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2",
-          "name": "RCv3Test",
-          "node_counts": {
-            "cloud_servers": 3,
-            "external": 4,
-            "total": 7
-          },
-          "port": 80,
-          "status": "ACTIVE",
-          "status_detail": null,
-          "virtual_ip": "203.0.113.5"
-        },
-        "status": "ACTIVE",
-        "status_detail": null,
-        "updated": "2014-05-30T03:24:18Z"
-      }
-    `)
-	})
-
-	expected := &NodeDetails{
-		CreatedAt: time.Date(2014, 5, 30, 3, 23, 42, 0, time.UTC),
-		CloudServer: struct {
-			ID           string `mapstructure:"id"`
-			Name         string `mapstructure:"name"`
-			CloudNetwork struct {
-				ID          string    `mapstructure:"id"`
-				Name        string    `mapstructure:"name"`
-				PrivateIPv4 string    `mapstructure:"private_ip_v4"`
-				CIDR        string    `mapstructure:"cidr"`
-				CreatedAt   time.Time `mapstructure:"-"`
-				UpdatedAt   time.Time `mapstructure:"-"`
-			} `mapstructure:"cloud_network"`
-			CreatedAt time.Time `mapstructure:"-"`
-			UpdatedAt time.Time `mapstructure:"-"`
-		}{
-			ID: "d95ae0c4-6ab8-4873-b82f-f8433840cff2",
-			CloudNetwork: struct {
-				ID          string    `mapstructure:"id"`
-				Name        string    `mapstructure:"name"`
-				PrivateIPv4 string    `mapstructure:"private_ip_v4"`
-				CIDR        string    `mapstructure:"cidr"`
-				CreatedAt   time.Time `mapstructure:"-"`
-				UpdatedAt   time.Time `mapstructure:"-"`
-			}{
-				ID:          "07426958-1ebf-4c38-b032-d456820ca21a",
-				CIDR:        "192.168.100.0/24",
-				CreatedAt:   time.Date(2014, 5, 25, 1, 23, 42, 0, time.UTC),
-				Name:        "RC-CLOUD",
-				PrivateIPv4: "192.168.100.5",
-				UpdatedAt:   time.Date(2014, 5, 25, 2, 28, 44, 0, time.UTC),
-			},
-			CreatedAt: time.Date(2014, 5, 30, 2, 18, 42, 0, time.UTC),
-			Name:      "RCv3TestServer1",
-			UpdatedAt: time.Date(2014, 5, 30, 2, 19, 18, 0, time.UTC),
-		},
-		ID: "1860451d-fb89-45b8-b54e-151afceb50e5",
-		LoadBalancerPool: Pool{
-			ID:   "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2",
-			Name: "RCv3Test",
-			NodeCounts: struct {
-				CloudServers int `mapstructure:"cloud_servers"`
-				External     int `mapstructure:"external"`
-				Total        int `mapstructure:"total"`
-			}{
-				CloudServers: 3,
-				External:     4,
-				Total:        7,
-			},
-			Port:      80,
-			Status:    "ACTIVE",
-			VirtualIP: "203.0.113.5",
-		},
-		Status:    "ACTIVE",
-		UpdatedAt: time.Date(2014, 5, 30, 3, 24, 18, 0, time.UTC),
-	}
-
-	actual, err := GetNodeDetails(fake.ServiceClient(), "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2", "d95ae0c4-6ab8-4873-b82f-f8433840cff2").Extract()
-	th.AssertNoErr(t, err)
-	th.CheckDeepEquals(t, expected, actual)
-}
-
-func TestCreateNodes(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	th.Mux.HandleFunc("/load_balancer_pools/nodes", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "POST")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Accept", "application/json")
-		th.TestJSONRequest(t, r, `
-      [
-      {
-        "cloud_server": {
-          "id": "d95ae0c4-6ab8-4873-b82f-f8433840cff2"
-        },
-        "load_balancer_pool": {
-          "id": "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2"
-        }
-      },
-      {
-        "cloud_server": {
-          "id": "d95ae0c4-6ab8-4873-b82f-f8433840cff2"
-        },
-        "load_balancer_pool": {
-          "id": "33021100-4abf-4836-9080-465a6d87ab68"
-      }
-    }
-    ]
-  `)
-
-		w.Header().Set("Content-Type", "application/json")
-		w.WriteHeader(http.StatusCreated)
-		fmt.Fprintf(w, `
-      [
-      {
-        "created": "2014-05-30T03:23:42Z",
-        "cloud_server": {
-          "id": "d95ae0c4-6ab8-4873-b82f-f8433840cff2"
-        },
-        "id": "1860451d-fb89-45b8-b54e-151afceb50e5",
-        "load_balancer_pool": {
-          "id": "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2"
-        },
-        "status": "ADDING",
-        "status_detail": null,
-        "updated": null
-      },
-      {
-        "created": "2014-05-31T08:23:12Z",
-        "cloud_server": {
-          "id": "d95ae0c4-6ab8-4873-b82f-f8433840cff2"
-        },
-        "id": "b70481dd-7edf-4dbb-a44b-41cc7679d4fb",
-        "load_balancer_pool": {
-          "id": "33021100-4abf-4836-9080-465a6d87ab68"
-        },
-        "status": "ADDING",
-        "status_detail": null,
-        "updated": null
-      }
-      ]
-    `)
-	})
-
-	expected := []Node{
-		Node{
-			CreatedAt: time.Date(2014, 5, 30, 3, 23, 42, 0, time.UTC),
-			CloudServer: struct {
-				ID string `mapstructure:"id"`
-			}{
-				ID: "d95ae0c4-6ab8-4873-b82f-f8433840cff2",
-			},
-			ID: "1860451d-fb89-45b8-b54e-151afceb50e5",
-			LoadBalancerPool: struct {
-				ID string `mapstructure:"id"`
-			}{
-				ID: "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2",
-			},
-			Status: "ADDING",
-		},
-		Node{
-			CreatedAt: time.Date(2014, 5, 31, 8, 23, 12, 0, time.UTC),
-			CloudServer: struct {
-				ID string `mapstructure:"id"`
-			}{
-				ID: "d95ae0c4-6ab8-4873-b82f-f8433840cff2",
-			},
-			ID: "b70481dd-7edf-4dbb-a44b-41cc7679d4fb",
-			LoadBalancerPool: struct {
-				ID string `mapstructure:"id"`
-			}{
-				ID: "33021100-4abf-4836-9080-465a6d87ab68",
-			},
-			Status: "ADDING",
-		},
-	}
-
-	opts := NodesOpts{
-		NodeOpts{
-			ServerID: "d95ae0c4-6ab8-4873-b82f-f8433840cff2",
-			PoolID:   "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2",
-		},
-		NodeOpts{
-			ServerID: "d95ae0c4-6ab8-4873-b82f-f8433840cff2",
-			PoolID:   "33021100-4abf-4836-9080-465a6d87ab68",
-		},
-	}
-	actual, err := CreateNodes(fake.ServiceClient(), opts).Extract()
-	th.AssertNoErr(t, err)
-	th.AssertDeepEquals(t, expected, actual)
-}
-
-func TestDeleteNodes(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	th.Mux.HandleFunc("/load_balancer_pools/nodes", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Accept", "application/json")
-		th.TestJSONRequest(t, r, `
-      [
-      {
-        "cloud_server": {
-          "id": "d95ae0c4-6ab8-4873-b82f-f8433840cff2"
-        },
-        "load_balancer_pool": {
-          "id": "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2"
-        }
-      },
-      {
-        "cloud_server": {
-          "id": "d95ae0c4-6ab8-4873-b82f-f8433840cff2"
-        },
-        "load_balancer_pool": {
-          "id": "33021100-4abf-4836-9080-465a6d87ab68"
-        }
-      }
-      ]
-    `)
-
-		w.Header().Set("Content-Type", "application/json")
-		w.WriteHeader(http.StatusNoContent)
-	})
-
-	opts := NodesOpts{
-		NodeOpts{
-			ServerID: "d95ae0c4-6ab8-4873-b82f-f8433840cff2",
-			PoolID:   "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2",
-		},
-		NodeOpts{
-			ServerID: "d95ae0c4-6ab8-4873-b82f-f8433840cff2",
-			PoolID:   "33021100-4abf-4836-9080-465a6d87ab68",
-		},
-	}
-	err := DeleteNodes(client.ServiceClient(), opts).ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestListNodesForServerDetails(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	th.Mux.HandleFunc("/load_balancer_pools/nodes/details", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Accept", "application/json")
-
-		w.Header().Set("Content-Type", "application/json")
-		fmt.Fprintf(w, `
-      [
-      {
-        "created": "2014-05-30T03:23:42Z",
-        "id": "1860451d-fb89-45b8-b54e-151afceb50e5",
-        "load_balancer_pool": {
-          "id": "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2",
-          "name": "RCv3Test",
-          "node_counts": {
-            "cloud_servers": 3,
-            "external": 4,
-            "total": 7
-          },
-          "port": 80,
-          "status": "ACTIVE",
-          "status_detail": null,
-          "virtual_ip": "203.0.113.5"
-        },
-        "status": "ACTIVE",
-        "status_detail": null,
-        "updated": "2014-05-30T03:24:18Z"
-      }
-      ]
-    `)
-	})
-
-	expected := []NodeDetailsForServer{
-		NodeDetailsForServer{
-			CreatedAt: time.Date(2014, 5, 30, 3, 23, 42, 0, time.UTC),
-			ID:        "1860451d-fb89-45b8-b54e-151afceb50e5",
-			LoadBalancerPool: Pool{
-				ID:   "d6d3aa7c-dfa5-4e61-96ee-1d54ac1075d2",
-				Name: "RCv3Test",
-				NodeCounts: struct {
-					CloudServers int `mapstructure:"cloud_servers"`
-					External     int `mapstructure:"external"`
-					Total        int `mapstructure:"total"`
-				}{
-					CloudServers: 3,
-					External:     4,
-					Total:        7,
-				},
-				Port:      80,
-				Status:    "ACTIVE",
-				VirtualIP: "203.0.113.5",
-			},
-			Status:    "ACTIVE",
-			UpdatedAt: time.Date(2014, 5, 30, 3, 24, 18, 0, time.UTC),
-		},
-	}
-	count := 0
-	err := ListNodesDetailsForServer(fake.ServiceClient(), "07426958-1ebf-4c38-b032-d456820ca21a").EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractNodesDetailsForServer(page)
-		th.AssertNoErr(t, err)
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, count, 1)
-}
diff --git a/rackspace/rackconnect/v3/lbpools/results.go b/rackspace/rackconnect/v3/lbpools/results.go
deleted file mode 100644
index e5e914b..0000000
--- a/rackspace/rackconnect/v3/lbpools/results.go
+++ /dev/null
@@ -1,505 +0,0 @@
-package lbpools
-
-import (
-	"fmt"
-	"reflect"
-	"time"
-
-	"github.com/mitchellh/mapstructure"
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// Pool represents a load balancer pool associated with a RackConnect configuration.
-type Pool struct {
-	// The unique ID of the load balancer pool.
-	ID string `mapstructure:"id"`
-	// The name of the load balancer pool.
-	Name string `mapstructure:"name"`
-	// The node counts associated witht the load balancer pool.
-	NodeCounts struct {
-		// The number of nodes associated with this LB pool for this account.
-		CloudServers int `mapstructure:"cloud_servers"`
-		// The number of nodes associated with this LB pool from other accounts.
-		External int `mapstructure:"external"`
-		// The total number of nodes associated with this LB pool.
-		Total int `mapstructure:"total"`
-	} `mapstructure:"node_counts"`
-	// The port of the LB pool
-	Port int `mapstructure:"port"`
-	// The status of the LB pool
-	Status string `mapstructure:"status"`
-	// The details of the status of the LB pool
-	StatusDetail string `mapstructure:"status_detail"`
-	// The virtual IP of the LB pool
-	VirtualIP string `mapstructure:"virtual_ip"`
-}
-
-// PoolPage is the page returned by a pager when traversing over a
-// collection of Pools.
-type PoolPage struct {
-	pagination.SinglePageBase
-}
-
-// IsEmpty returns true if a PoolPage contains no Pools.
-func (r PoolPage) IsEmpty() (bool, error) {
-	cns, err := ExtractPools(r)
-	if err != nil {
-		return true, err
-	}
-	return len(cns) == 0, nil
-}
-
-// ExtractPools extracts and returns Pools. It is used while iterating over
-// an lbpools.List call.
-func ExtractPools(page pagination.Page) ([]Pool, error) {
-	var res []Pool
-	err := mapstructure.Decode(page.(PoolPage).Body, &res)
-	return res, err
-}
-
-// GetResult represents the result of a Get operation.
-type GetResult struct {
-	gophercloud.Result
-}
-
-// Extract is a function that extracts an LBPool from a GetResult.
-func (r GetResult) Extract() (*Pool, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-	var res Pool
-	err := mapstructure.Decode(r.Body, &res)
-	return &res, err
-}
-
-// Node represents a load balancer pool node associated with a RackConnect configuration.
-type Node struct {
-	// The unique ID of the LB node.
-	ID string `mapstructure:"id"`
-	// The cloud server (node) of the load balancer pool.
-	CloudServer struct {
-		// The cloud server ID.
-		ID string `mapstructure:"id"`
-	} `mapstructure:"cloud_server"`
-	// The load balancer pool.
-	LoadBalancerPool struct {
-		// The LB pool ID.
-		ID string `mapstructure:"id"`
-	} `mapstructure:"load_balancer_pool"`
-	// The status of the LB pool.
-	Status string `mapstructure:"status"`
-	// The details of the status of the LB pool.
-	StatusDetail string `mapstructure:"status_detail"`
-	// The time the LB node was created.
-	CreatedAt time.Time `mapstructure:"-"`
-	// The time the LB node was last updated.
-	UpdatedAt time.Time `mapstructure:"-"`
-}
-
-// NodePage is the page returned by a pager when traversing over a
-// collection of Nodes.
-type NodePage struct {
-	pagination.SinglePageBase
-}
-
-// IsEmpty returns true if a NodePage contains no Nodes.
-func (r NodePage) IsEmpty() (bool, error) {
-	n, err := ExtractNodes(r)
-	if err != nil {
-		return true, err
-	}
-	return len(n) == 0, nil
-}
-
-// ExtractNodes extracts and returns a slice of Nodes. It is used while iterating over
-// an lbpools.ListNodes call.
-func ExtractNodes(page pagination.Page) ([]Node, error) {
-	var res []Node
-	casted := page.(NodePage).Body
-	err := mapstructure.Decode(casted, &res)
-
-	var rawNodes []interface{}
-	switch casted.(type) {
-	case interface{}:
-		rawNodes = casted.([]interface{})
-	default:
-		return res, fmt.Errorf("Unknown type: %v", reflect.TypeOf(casted))
-	}
-
-	for i := range rawNodes {
-		thisNode := (rawNodes[i]).(map[string]interface{})
-
-		if t, ok := thisNode["created"].(string); ok && t != "" {
-			creationTime, err := time.Parse(time.RFC3339, t)
-			if err != nil {
-				return res, err
-			}
-			res[i].CreatedAt = creationTime
-		}
-
-		if t, ok := thisNode["updated"].(string); ok && t != "" {
-			updatedTime, err := time.Parse(time.RFC3339, t)
-			if err != nil {
-				return res, err
-			}
-			res[i].UpdatedAt = updatedTime
-		}
-	}
-
-	return res, err
-}
-
-// NodeResult represents a result that can be extracted as a Node.
-type NodeResult struct {
-	gophercloud.Result
-}
-
-// CreateNodeResult represents the result of an CreateNode operation.
-type CreateNodeResult struct {
-	NodeResult
-}
-
-// GetNodeResult represents the result of an GetNode operation.
-type GetNodeResult struct {
-	NodeResult
-}
-
-// Extract is a function that extracts a Node from a NodeResult.
-func (r NodeResult) Extract() (*Node, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-	var res Node
-	err := mapstructure.Decode(r.Body, &res)
-
-	b := r.Body.(map[string]interface{})
-
-	if date, ok := b["created"]; ok && date != nil {
-		t, err := time.Parse(time.RFC3339, date.(string))
-		if err != nil {
-			return nil, err
-		}
-		res.CreatedAt = t
-	}
-
-	if date, ok := b["updated"]; ok && date != nil {
-		t, err := time.Parse(time.RFC3339, date.(string))
-		if err != nil {
-			return nil, err
-		}
-		res.UpdatedAt = t
-	}
-
-	return &res, err
-}
-
-// NodeDetails represents a load balancer pool node associated with a RackConnect configuration
-// with all its details.
-type NodeDetails struct {
-	// The unique ID of the LB node.
-	ID string `mapstructure:"id"`
-	// The cloud server (node) of the load balancer pool.
-	CloudServer struct {
-		// The cloud server ID.
-		ID string `mapstructure:"id"`
-		// The name of the server.
-		Name string `mapstructure:"name"`
-		// The cloud network for the cloud server.
-		CloudNetwork struct {
-			// The network ID.
-			ID string `mapstructure:"id"`
-			// The network name.
-			Name string `mapstructure:"name"`
-			// The network's private IPv4 address.
-			PrivateIPv4 string `mapstructure:"private_ip_v4"`
-			// The IP range for the network.
-			CIDR string `mapstructure:"cidr"`
-			// The datetime the network was created.
-			CreatedAt time.Time `mapstructure:"-"`
-			// The last datetime the network was updated.
-			UpdatedAt time.Time `mapstructure:"-"`
-		} `mapstructure:"cloud_network"`
-		// The datetime the server was created.
-		CreatedAt time.Time `mapstructure:"-"`
-		// The datetime the server was last updated.
-		UpdatedAt time.Time `mapstructure:"-"`
-	} `mapstructure:"cloud_server"`
-	// The load balancer pool.
-	LoadBalancerPool Pool `mapstructure:"load_balancer_pool"`
-	// The status of the LB pool.
-	Status string `mapstructure:"status"`
-	// The details of the status of the LB pool.
-	StatusDetail string `mapstructure:"status_detail"`
-	// The time the LB node was created.
-	CreatedAt time.Time `mapstructure:"-"`
-	// The time the LB node was last updated.
-	UpdatedAt time.Time `mapstructure:"-"`
-}
-
-// NodeDetailsPage is the page returned by a pager when traversing over a
-// collection of NodeDetails.
-type NodeDetailsPage struct {
-	pagination.SinglePageBase
-}
-
-// IsEmpty returns true if a NodeDetailsPage contains no NodeDetails.
-func (r NodeDetailsPage) IsEmpty() (bool, error) {
-	n, err := ExtractNodesDetails(r)
-	if err != nil {
-		return true, err
-	}
-	return len(n) == 0, nil
-}
-
-// ExtractNodesDetails extracts and returns a slice of NodeDetails. It is used while iterating over
-// an lbpools.ListNodesDetails call.
-func ExtractNodesDetails(page pagination.Page) ([]NodeDetails, error) {
-	var res []NodeDetails
-	casted := page.(NodeDetailsPage).Body
-	err := mapstructure.Decode(casted, &res)
-
-	var rawNodesDetails []interface{}
-	switch casted.(type) {
-	case interface{}:
-		rawNodesDetails = casted.([]interface{})
-	default:
-		return res, fmt.Errorf("Unknown type: %v", reflect.TypeOf(casted))
-	}
-
-	for i := range rawNodesDetails {
-		thisNodeDetails := (rawNodesDetails[i]).(map[string]interface{})
-
-		if t, ok := thisNodeDetails["created"].(string); ok && t != "" {
-			creationTime, err := time.Parse(time.RFC3339, t)
-			if err != nil {
-				return res, err
-			}
-			res[i].CreatedAt = creationTime
-		}
-
-		if t, ok := thisNodeDetails["updated"].(string); ok && t != "" {
-			updatedTime, err := time.Parse(time.RFC3339, t)
-			if err != nil {
-				return res, err
-			}
-			res[i].UpdatedAt = updatedTime
-		}
-
-		if cs, ok := thisNodeDetails["cloud_server"].(map[string]interface{}); ok {
-			if t, ok := cs["created"].(string); ok && t != "" {
-				creationTime, err := time.Parse(time.RFC3339, t)
-				if err != nil {
-					return res, err
-				}
-				res[i].CloudServer.CreatedAt = creationTime
-			}
-			if t, ok := cs["updated"].(string); ok && t != "" {
-				updatedTime, err := time.Parse(time.RFC3339, t)
-				if err != nil {
-					return res, err
-				}
-				res[i].CloudServer.UpdatedAt = updatedTime
-			}
-			if cn, ok := cs["cloud_network"].(map[string]interface{}); ok {
-				if t, ok := cn["created"].(string); ok && t != "" {
-					creationTime, err := time.Parse(time.RFC3339, t)
-					if err != nil {
-						return res, err
-					}
-					res[i].CloudServer.CloudNetwork.CreatedAt = creationTime
-				}
-				if t, ok := cn["updated"].(string); ok && t != "" {
-					updatedTime, err := time.Parse(time.RFC3339, t)
-					if err != nil {
-						return res, err
-					}
-					res[i].CloudServer.CloudNetwork.UpdatedAt = updatedTime
-				}
-			}
-		}
-	}
-
-	return res, err
-}
-
-// GetNodeDetailsResult represents the result of an NodeDetails operation.
-type GetNodeDetailsResult struct {
-	gophercloud.Result
-}
-
-// Extract is a function that extracts a NodeDetails from a NodeDetailsResult.
-func (r GetNodeDetailsResult) Extract() (*NodeDetails, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-	var res NodeDetails
-	err := mapstructure.Decode(r.Body, &res)
-
-	b := r.Body.(map[string]interface{})
-
-	if date, ok := b["created"]; ok && date != nil {
-		t, err := time.Parse(time.RFC3339, date.(string))
-		if err != nil {
-			return nil, err
-		}
-		res.CreatedAt = t
-	}
-
-	if date, ok := b["updated"]; ok && date != nil {
-		t, err := time.Parse(time.RFC3339, date.(string))
-		if err != nil {
-			return nil, err
-		}
-		res.UpdatedAt = t
-	}
-
-	if cs, ok := b["cloud_server"].(map[string]interface{}); ok {
-		if t, ok := cs["created"].(string); ok && t != "" {
-			creationTime, err := time.Parse(time.RFC3339, t)
-			if err != nil {
-				return &res, err
-			}
-			res.CloudServer.CreatedAt = creationTime
-		}
-		if t, ok := cs["updated"].(string); ok && t != "" {
-			updatedTime, err := time.Parse(time.RFC3339, t)
-			if err != nil {
-				return &res, err
-			}
-			res.CloudServer.UpdatedAt = updatedTime
-		}
-		if cn, ok := cs["cloud_network"].(map[string]interface{}); ok {
-			if t, ok := cn["created"].(string); ok && t != "" {
-				creationTime, err := time.Parse(time.RFC3339, t)
-				if err != nil {
-					return &res, err
-				}
-				res.CloudServer.CloudNetwork.CreatedAt = creationTime
-			}
-			if t, ok := cn["updated"].(string); ok && t != "" {
-				updatedTime, err := time.Parse(time.RFC3339, t)
-				if err != nil {
-					return &res, err
-				}
-				res.CloudServer.CloudNetwork.UpdatedAt = updatedTime
-			}
-		}
-	}
-
-	return &res, err
-}
-
-// DeleteNodeResult represents the result of a DeleteNode operation.
-type DeleteNodeResult struct {
-	gophercloud.ErrResult
-}
-
-// CreateNodesResult represents the result of a CreateNodes operation.
-type CreateNodesResult struct {
-	gophercloud.Result
-}
-
-// Extract is a function that extracts a slice of Nodes from a CreateNodesResult.
-func (r CreateNodesResult) Extract() ([]Node, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-	var res []Node
-	err := mapstructure.Decode(r.Body, &res)
-
-	b := r.Body.([]interface{})
-	for i := range b {
-		if date, ok := b[i].(map[string]interface{})["created"]; ok && date != nil {
-			t, err := time.Parse(time.RFC3339, date.(string))
-			if err != nil {
-				return nil, err
-			}
-			res[i].CreatedAt = t
-		}
-		if date, ok := b[i].(map[string]interface{})["updated"]; ok && date != nil {
-			t, err := time.Parse(time.RFC3339, date.(string))
-			if err != nil {
-				return nil, err
-			}
-			res[i].UpdatedAt = t
-		}
-	}
-
-	return res, err
-}
-
-// DeleteNodesResult represents the result of a DeleteNodes operation.
-type DeleteNodesResult struct {
-	gophercloud.ErrResult
-}
-
-// NodeDetailsForServer represents a load balancer pool node associated with a RackConnect configuration
-// with all its details for a particular server.
-type NodeDetailsForServer struct {
-	// The unique ID of the LB node.
-	ID string `mapstructure:"id"`
-	// The load balancer pool.
-	LoadBalancerPool Pool `mapstructure:"load_balancer_pool"`
-	// The status of the LB pool.
-	Status string `mapstructure:"status"`
-	// The details of the status of the LB pool.
-	StatusDetail string `mapstructure:"status_detail"`
-	// The time the LB node was created.
-	CreatedAt time.Time `mapstructure:"-"`
-	// The time the LB node was last updated.
-	UpdatedAt time.Time `mapstructure:"-"`
-}
-
-// NodeDetailsForServerPage is the page returned by a pager when traversing over a
-// collection of NodeDetailsForServer.
-type NodeDetailsForServerPage struct {
-	pagination.SinglePageBase
-}
-
-// IsEmpty returns true if a NodeDetailsForServerPage contains no NodeDetailsForServer.
-func (r NodeDetailsForServerPage) IsEmpty() (bool, error) {
-	n, err := ExtractNodesDetailsForServer(r)
-	if err != nil {
-		return true, err
-	}
-	return len(n) == 0, nil
-}
-
-// ExtractNodesDetailsForServer extracts and returns a slice of NodeDetailsForServer. It is used while iterating over
-// an lbpools.ListNodesDetailsForServer call.
-func ExtractNodesDetailsForServer(page pagination.Page) ([]NodeDetailsForServer, error) {
-	var res []NodeDetailsForServer
-	casted := page.(NodeDetailsForServerPage).Body
-	err := mapstructure.Decode(casted, &res)
-
-	var rawNodesDetails []interface{}
-	switch casted.(type) {
-	case interface{}:
-		rawNodesDetails = casted.([]interface{})
-	default:
-		return res, fmt.Errorf("Unknown type: %v", reflect.TypeOf(casted))
-	}
-
-	for i := range rawNodesDetails {
-		thisNodeDetails := (rawNodesDetails[i]).(map[string]interface{})
-
-		if t, ok := thisNodeDetails["created"].(string); ok && t != "" {
-			creationTime, err := time.Parse(time.RFC3339, t)
-			if err != nil {
-				return res, err
-			}
-			res[i].CreatedAt = creationTime
-		}
-
-		if t, ok := thisNodeDetails["updated"].(string); ok && t != "" {
-			updatedTime, err := time.Parse(time.RFC3339, t)
-			if err != nil {
-				return res, err
-			}
-			res[i].UpdatedAt = updatedTime
-		}
-	}
-
-	return res, err
-}
diff --git a/rackspace/rackconnect/v3/lbpools/urls.go b/rackspace/rackconnect/v3/lbpools/urls.go
deleted file mode 100644
index c238239..0000000
--- a/rackspace/rackconnect/v3/lbpools/urls.go
+++ /dev/null
@@ -1,49 +0,0 @@
-package lbpools
-
-import "github.com/rackspace/gophercloud"
-
-var root = "load_balancer_pools"
-
-func listURL(c *gophercloud.ServiceClient) string {
-	return c.ServiceURL(root)
-}
-
-func getURL(c *gophercloud.ServiceClient, id string) string {
-	return c.ServiceURL(root, id)
-}
-
-func listNodesURL(c *gophercloud.ServiceClient, id string) string {
-	return c.ServiceURL(root, id, "nodes")
-}
-
-func createNodeURL(c *gophercloud.ServiceClient, id string) string {
-	return listNodesURL(c, id)
-}
-
-func listNodesDetailsURL(c *gophercloud.ServiceClient, id string) string {
-	return c.ServiceURL(root, id, "nodes", "details")
-}
-
-func nodeURL(c *gophercloud.ServiceClient, poolID, nodeID string) string {
-	return c.ServiceURL(root, poolID, "nodes", nodeID)
-}
-
-func deleteNodeURL(c *gophercloud.ServiceClient, poolID, nodeID string) string {
-	return nodeURL(c, poolID, nodeID)
-}
-
-func nodeDetailsURL(c *gophercloud.ServiceClient, poolID, nodeID string) string {
-	return c.ServiceURL(root, poolID, "nodes", nodeID, "details")
-}
-
-func createNodesURL(c *gophercloud.ServiceClient) string {
-	return c.ServiceURL(root, "nodes")
-}
-
-func deleteNodesURL(c *gophercloud.ServiceClient) string {
-	return createNodesURL(c)
-}
-
-func listNodesForServerURL(c *gophercloud.ServiceClient, serverID string) string {
-	return c.ServiceURL(root, "nodes", "details?cloud_server_id="+serverID)
-}
diff --git a/rackspace/rackconnect/v3/publicips/requests.go b/rackspace/rackconnect/v3/publicips/requests.go
deleted file mode 100644
index 1164260..0000000
--- a/rackspace/rackconnect/v3/publicips/requests.go
+++ /dev/null
@@ -1,50 +0,0 @@
-package publicips
-
-import (
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// List returns all public IPs.
-func List(c *gophercloud.ServiceClient) pagination.Pager {
-	url := listURL(c)
-	createPage := func(r pagination.PageResult) pagination.Page {
-		return PublicIPPage{pagination.SinglePageBase(r)}
-	}
-	return pagination.NewPager(c, url, createPage)
-}
-
-// Create adds a public IP to the server with the given serverID.
-func Create(c *gophercloud.ServiceClient, serverID string) CreateResult {
-	var res CreateResult
-	reqBody := map[string]interface{}{
-		"cloud_server": map[string]string{
-			"id": serverID,
-		},
-	}
-	_, res.Err = c.Post(createURL(c), reqBody, &res.Body, nil)
-	return res
-}
-
-// ListForServer returns all public IPs for the server with the given serverID.
-func ListForServer(c *gophercloud.ServiceClient, serverID string) pagination.Pager {
-	url := listForServerURL(c, serverID)
-	createPage := func(r pagination.PageResult) pagination.Page {
-		return PublicIPPage{pagination.SinglePageBase(r)}
-	}
-	return pagination.NewPager(c, url, createPage)
-}
-
-// Get retrieves the public IP with the given id.
-func Get(c *gophercloud.ServiceClient, id string) GetResult {
-	var res GetResult
-	_, res.Err = c.Get(getURL(c, id), &res.Body, nil)
-	return res
-}
-
-// Delete removes the public IP with the given id.
-func Delete(c *gophercloud.ServiceClient, id string) DeleteResult {
-	var res DeleteResult
-	_, res.Err = c.Delete(deleteURL(c, id), nil)
-	return res
-}
diff --git a/rackspace/rackconnect/v3/publicips/requests_test.go b/rackspace/rackconnect/v3/publicips/requests_test.go
deleted file mode 100644
index 61da2b0..0000000
--- a/rackspace/rackconnect/v3/publicips/requests_test.go
+++ /dev/null
@@ -1,378 +0,0 @@
-package publicips
-
-import (
-	"fmt"
-	"net/http"
-	"testing"
-	"time"
-
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
-	"github.com/rackspace/gophercloud/testhelper/client"
-	fake "github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestListIPs(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	th.Mux.HandleFunc("/public_ips", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Accept", "application/json")
-
-		w.Header().Set("Content-Type", "application/json")
-		fmt.Fprintf(w, `[
-      {
-        "created": "2014-05-30T03:23:42Z",
-        "cloud_server": {
-          "cloud_network": {
-            "cidr": "192.168.100.0/24",
-            "created": "2014-05-25T01:23:42Z",
-            "id": "07426958-1ebf-4c38-b032-d456820ca21a",
-            "name": "RC-CLOUD",
-            "private_ip_v4": "192.168.100.5",
-            "updated": "2014-05-25T02:28:44Z"
-          },
-          "created": "2014-05-30T02:18:42Z",
-          "id": "d95ae0c4-6ab8-4873-b82f-f8433840cff2",
-          "name": "RCv3TestServer1",
-          "updated": "2014-05-30T02:19:18Z"
-        },
-        "id": "2d0f586b-37a7-4ae0-adac-2743d5feb450",
-        "public_ip_v4": "203.0.113.110",
-        "status": "ACTIVE",
-        "status_detail": null,
-        "updated": "2014-05-30T03:24:18Z"
-      }
-    ]`)
-	})
-
-	expected := []PublicIP{
-		PublicIP{
-			ID:         "2d0f586b-37a7-4ae0-adac-2743d5feb450",
-			PublicIPv4: "203.0.113.110",
-			CreatedAt:  time.Date(2014, 5, 30, 3, 23, 42, 0, time.UTC),
-			CloudServer: struct {
-				ID           string `mapstructure:"id"`
-				Name         string `mapstructure:"name"`
-				CloudNetwork struct {
-					ID          string    `mapstructure:"id"`
-					Name        string    `mapstructure:"name"`
-					PrivateIPv4 string    `mapstructure:"private_ip_v4"`
-					CIDR        string    `mapstructure:"cidr"`
-					CreatedAt   time.Time `mapstructure:"-"`
-					UpdatedAt   time.Time `mapstructure:"-"`
-				} `mapstructure:"cloud_network"`
-				CreatedAt time.Time `mapstructure:"-"`
-				UpdatedAt time.Time `mapstructure:"-"`
-			}{
-				ID: "d95ae0c4-6ab8-4873-b82f-f8433840cff2",
-				CloudNetwork: struct {
-					ID          string    `mapstructure:"id"`
-					Name        string    `mapstructure:"name"`
-					PrivateIPv4 string    `mapstructure:"private_ip_v4"`
-					CIDR        string    `mapstructure:"cidr"`
-					CreatedAt   time.Time `mapstructure:"-"`
-					UpdatedAt   time.Time `mapstructure:"-"`
-				}{
-					ID:          "07426958-1ebf-4c38-b032-d456820ca21a",
-					CIDR:        "192.168.100.0/24",
-					CreatedAt:   time.Date(2014, 5, 25, 1, 23, 42, 0, time.UTC),
-					Name:        "RC-CLOUD",
-					PrivateIPv4: "192.168.100.5",
-					UpdatedAt:   time.Date(2014, 5, 25, 2, 28, 44, 0, time.UTC),
-				},
-				CreatedAt: time.Date(2014, 5, 30, 2, 18, 42, 0, time.UTC),
-				Name:      "RCv3TestServer1",
-				UpdatedAt: time.Date(2014, 5, 30, 2, 19, 18, 0, time.UTC),
-			},
-			Status:    "ACTIVE",
-			UpdatedAt: time.Date(2014, 5, 30, 3, 24, 18, 0, time.UTC),
-		},
-	}
-
-	count := 0
-	err := List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractPublicIPs(page)
-		th.AssertNoErr(t, err)
-
-		th.CheckDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, count, 1)
-}
-
-func TestCreateIP(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	th.Mux.HandleFunc("/public_ips", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "POST")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Accept", "application/json")
-		th.TestJSONRequest(t, r, `
-      {
-        "cloud_server": {
-          "id": "d95ae0c4-6ab8-4873-b82f-f8433840cff2"
-        }
-      }
-    `)
-
-		w.Header().Set("Content-Type", "application/json")
-		w.WriteHeader(http.StatusCreated)
-		fmt.Fprintf(w, `
-      {
-        "created": "2014-05-30T03:23:42Z",
-        "cloud_server": {
-          "cloud_network": {
-            "cidr": "192.168.100.0/24",
-            "created": "2014-05-25T01:23:42Z",
-            "id": "07426958-1ebf-4c38-b032-d456820ca21a",
-            "name": "RC-CLOUD",
-            "private_ip_v4": "192.168.100.5",
-            "updated": "2014-05-25T02:28:44Z"
-          },
-          "created": "2014-05-30T02:18:42Z",
-          "id": "d95ae0c4-6ab8-4873-b82f-f8433840cff2",
-          "name": "RCv3TestServer1",
-          "updated": "2014-05-30T02:19:18Z"
-        },
-        "id": "2d0f586b-37a7-4ae0-adac-2743d5feb450",
-        "status": "ADDING"
-      }`)
-	})
-
-	expected := &PublicIP{
-		CreatedAt: time.Date(2014, 5, 30, 3, 23, 42, 0, time.UTC),
-		CloudServer: struct {
-			ID           string `mapstructure:"id"`
-			Name         string `mapstructure:"name"`
-			CloudNetwork struct {
-				ID          string    `mapstructure:"id"`
-				Name        string    `mapstructure:"name"`
-				PrivateIPv4 string    `mapstructure:"private_ip_v4"`
-				CIDR        string    `mapstructure:"cidr"`
-				CreatedAt   time.Time `mapstructure:"-"`
-				UpdatedAt   time.Time `mapstructure:"-"`
-			} `mapstructure:"cloud_network"`
-			CreatedAt time.Time `mapstructure:"-"`
-			UpdatedAt time.Time `mapstructure:"-"`
-		}{
-			ID: "d95ae0c4-6ab8-4873-b82f-f8433840cff2",
-			CloudNetwork: struct {
-				ID          string    `mapstructure:"id"`
-				Name        string    `mapstructure:"name"`
-				PrivateIPv4 string    `mapstructure:"private_ip_v4"`
-				CIDR        string    `mapstructure:"cidr"`
-				CreatedAt   time.Time `mapstructure:"-"`
-				UpdatedAt   time.Time `mapstructure:"-"`
-			}{
-				ID:          "07426958-1ebf-4c38-b032-d456820ca21a",
-				CIDR:        "192.168.100.0/24",
-				CreatedAt:   time.Date(2014, 5, 25, 1, 23, 42, 0, time.UTC),
-				Name:        "RC-CLOUD",
-				PrivateIPv4: "192.168.100.5",
-				UpdatedAt:   time.Date(2014, 5, 25, 2, 28, 44, 0, time.UTC),
-			},
-			CreatedAt: time.Date(2014, 5, 30, 2, 18, 42, 0, time.UTC),
-			Name:      "RCv3TestServer1",
-			UpdatedAt: time.Date(2014, 5, 30, 2, 19, 18, 0, time.UTC),
-		},
-		ID:     "2d0f586b-37a7-4ae0-adac-2743d5feb450",
-		Status: "ADDING",
-	}
-
-	actual, err := Create(fake.ServiceClient(), "d95ae0c4-6ab8-4873-b82f-f8433840cff2").Extract()
-	th.AssertNoErr(t, err)
-	th.AssertDeepEquals(t, expected, actual)
-}
-
-func TestGetIP(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	th.Mux.HandleFunc("/public_ips/2d0f586b-37a7-4ae0-adac-2743d5feb450", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Accept", "application/json")
-
-		w.Header().Set("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-		fmt.Fprintf(w, `
-      {
-        "created": "2014-05-30T03:23:42Z",
-        "cloud_server": {
-          "cloud_network": {
-            "cidr": "192.168.100.0/24",
-            "created": "2014-05-25T01:23:42Z",
-            "id": "07426958-1ebf-4c38-b032-d456820ca21a",
-            "name": "RC-CLOUD",
-            "private_ip_v4": "192.168.100.5",
-            "updated": "2014-05-25T02:28:44Z"
-          },
-          "created": "2014-05-30T02:18:42Z",
-          "id": "d95ae0c4-6ab8-4873-b82f-f8433840cff2",
-          "name": "RCv3TestServer1",
-          "updated": "2014-05-30T02:19:18Z"
-        },
-        "id": "2d0f586b-37a7-4ae0-adac-2743d5feb450",
-        "public_ip_v4": "203.0.113.110",
-        "status": "ACTIVE",
-        "status_detail": null,
-        "updated": "2014-05-30T03:24:18Z"
-      }`)
-	})
-
-	expected := &PublicIP{
-		CreatedAt: time.Date(2014, 5, 30, 3, 23, 42, 0, time.UTC),
-		CloudServer: struct {
-			ID           string `mapstructure:"id"`
-			Name         string `mapstructure:"name"`
-			CloudNetwork struct {
-				ID          string    `mapstructure:"id"`
-				Name        string    `mapstructure:"name"`
-				PrivateIPv4 string    `mapstructure:"private_ip_v4"`
-				CIDR        string    `mapstructure:"cidr"`
-				CreatedAt   time.Time `mapstructure:"-"`
-				UpdatedAt   time.Time `mapstructure:"-"`
-			} `mapstructure:"cloud_network"`
-			CreatedAt time.Time `mapstructure:"-"`
-			UpdatedAt time.Time `mapstructure:"-"`
-		}{
-			ID: "d95ae0c4-6ab8-4873-b82f-f8433840cff2",
-			CloudNetwork: struct {
-				ID          string    `mapstructure:"id"`
-				Name        string    `mapstructure:"name"`
-				PrivateIPv4 string    `mapstructure:"private_ip_v4"`
-				CIDR        string    `mapstructure:"cidr"`
-				CreatedAt   time.Time `mapstructure:"-"`
-				UpdatedAt   time.Time `mapstructure:"-"`
-			}{
-				ID:          "07426958-1ebf-4c38-b032-d456820ca21a",
-				CIDR:        "192.168.100.0/24",
-				CreatedAt:   time.Date(2014, 5, 25, 1, 23, 42, 0, time.UTC),
-				Name:        "RC-CLOUD",
-				PrivateIPv4: "192.168.100.5",
-				UpdatedAt:   time.Date(2014, 5, 25, 2, 28, 44, 0, time.UTC),
-			},
-			CreatedAt: time.Date(2014, 5, 30, 2, 18, 42, 0, time.UTC),
-			Name:      "RCv3TestServer1",
-			UpdatedAt: time.Date(2014, 5, 30, 2, 19, 18, 0, time.UTC),
-		},
-		ID:         "2d0f586b-37a7-4ae0-adac-2743d5feb450",
-		Status:     "ACTIVE",
-		PublicIPv4: "203.0.113.110",
-		UpdatedAt:  time.Date(2014, 5, 30, 3, 24, 18, 0, time.UTC),
-	}
-
-	actual, err := Get(fake.ServiceClient(), "2d0f586b-37a7-4ae0-adac-2743d5feb450").Extract()
-	th.AssertNoErr(t, err)
-	th.AssertDeepEquals(t, expected, actual)
-}
-
-func TestDeleteIP(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	th.Mux.HandleFunc("/public_ips/2d0f586b-37a7-4ae0-adac-2743d5feb450", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "DELETE")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Accept", "application/json")
-
-		w.Header().Set("Content-Type", "application/json")
-		w.WriteHeader(http.StatusNoContent)
-	})
-
-	err := Delete(client.ServiceClient(), "2d0f586b-37a7-4ae0-adac-2743d5feb450").ExtractErr()
-	th.AssertNoErr(t, err)
-}
-
-func TestListForServer(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	th.Mux.HandleFunc("/public_ips", func(w http.ResponseWriter, r *http.Request) {
-		th.TestMethod(t, r, "GET")
-		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
-		th.TestHeader(t, r, "Accept", "application/json")
-
-		w.Header().Set("Content-Type", "application/json")
-		fmt.Fprintf(w, `
-    [
-    {
-      "created": "2014-05-30T03:23:42Z",
-      "cloud_server": {
-        "cloud_network": {
-          "cidr": "192.168.100.0/24",
-          "created": "2014-05-25T01:23:42Z",
-          "id": "07426958-1ebf-4c38-b032-d456820ca21a",
-          "name": "RC-CLOUD",
-          "private_ip_v4": "192.168.100.5",
-          "updated": "2014-05-25T02:28:44Z"
-        },
-        "created": "2014-05-30T02:18:42Z",
-        "id": "d95ae0c4-6ab8-4873-b82f-f8433840cff2",
-        "name": "RCv3TestServer1",
-        "updated": "2014-05-30T02:19:18Z"
-      },
-      "id": "2d0f586b-37a7-4ae0-adac-2743d5feb450",
-      "public_ip_v4": "203.0.113.110",
-      "status": "ACTIVE",
-      "updated": "2014-05-30T03:24:18Z"
-    }
-    ]`)
-	})
-
-	expected := []PublicIP{
-		PublicIP{
-			CreatedAt: time.Date(2014, 5, 30, 3, 23, 42, 0, time.UTC),
-			CloudServer: struct {
-				ID           string `mapstructure:"id"`
-				Name         string `mapstructure:"name"`
-				CloudNetwork struct {
-					ID          string    `mapstructure:"id"`
-					Name        string    `mapstructure:"name"`
-					PrivateIPv4 string    `mapstructure:"private_ip_v4"`
-					CIDR        string    `mapstructure:"cidr"`
-					CreatedAt   time.Time `mapstructure:"-"`
-					UpdatedAt   time.Time `mapstructure:"-"`
-				} `mapstructure:"cloud_network"`
-				CreatedAt time.Time `mapstructure:"-"`
-				UpdatedAt time.Time `mapstructure:"-"`
-			}{
-				ID: "d95ae0c4-6ab8-4873-b82f-f8433840cff2",
-				CloudNetwork: struct {
-					ID          string    `mapstructure:"id"`
-					Name        string    `mapstructure:"name"`
-					PrivateIPv4 string    `mapstructure:"private_ip_v4"`
-					CIDR        string    `mapstructure:"cidr"`
-					CreatedAt   time.Time `mapstructure:"-"`
-					UpdatedAt   time.Time `mapstructure:"-"`
-				}{
-					ID:          "07426958-1ebf-4c38-b032-d456820ca21a",
-					CIDR:        "192.168.100.0/24",
-					CreatedAt:   time.Date(2014, 5, 25, 1, 23, 42, 0, time.UTC),
-					Name:        "RC-CLOUD",
-					PrivateIPv4: "192.168.100.5",
-					UpdatedAt:   time.Date(2014, 5, 25, 2, 28, 44, 0, time.UTC),
-				},
-				CreatedAt: time.Date(2014, 5, 30, 2, 18, 42, 0, time.UTC),
-				Name:      "RCv3TestServer1",
-				UpdatedAt: time.Date(2014, 5, 30, 2, 19, 18, 0, time.UTC),
-			},
-			ID:         "2d0f586b-37a7-4ae0-adac-2743d5feb450",
-			Status:     "ACTIVE",
-			PublicIPv4: "203.0.113.110",
-			UpdatedAt:  time.Date(2014, 5, 30, 3, 24, 18, 0, time.UTC),
-		},
-	}
-	count := 0
-	err := ListForServer(fake.ServiceClient(), "d95ae0c4-6ab8-4873-b82f-f8433840cff2").EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractPublicIPs(page)
-		th.AssertNoErr(t, err)
-		th.CheckDeepEquals(t, expected, actual)
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, count, 1)
-}
diff --git a/rackspace/rackconnect/v3/publicips/results.go b/rackspace/rackconnect/v3/publicips/results.go
deleted file mode 100644
index 132cf77..0000000
--- a/rackspace/rackconnect/v3/publicips/results.go
+++ /dev/null
@@ -1,221 +0,0 @@
-package publicips
-
-import (
-	"fmt"
-	"reflect"
-	"time"
-
-	"github.com/mitchellh/mapstructure"
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
-)
-
-// PublicIP represents a public IP address.
-type PublicIP struct {
-	// The unique ID of the public IP.
-	ID string `mapstructure:"id"`
-	// The IPv4 address of the public IP.
-	PublicIPv4 string `mapstructure:"public_ip_v4"`
-	// The cloud server (node) of the public IP.
-	CloudServer struct {
-		// The cloud server ID.
-		ID string `mapstructure:"id"`
-		// The name of the server.
-		Name string `mapstructure:"name"`
-		// The cloud network for the cloud server.
-		CloudNetwork struct {
-			// The network ID.
-			ID string `mapstructure:"id"`
-			// The network name.
-			Name string `mapstructure:"name"`
-			// The network's private IPv4 address.
-			PrivateIPv4 string `mapstructure:"private_ip_v4"`
-			// The IP range for the network.
-			CIDR string `mapstructure:"cidr"`
-			// The datetime the network was created.
-			CreatedAt time.Time `mapstructure:"-"`
-			// The last datetime the network was updated.
-			UpdatedAt time.Time `mapstructure:"-"`
-		} `mapstructure:"cloud_network"`
-		// The datetime the server was created.
-		CreatedAt time.Time `mapstructure:"-"`
-		// The datetime the server was last updated.
-		UpdatedAt time.Time `mapstructure:"-"`
-	} `mapstructure:"cloud_server"`
-	// The status of the public IP.
-	Status string `mapstructure:"status"`
-	// The details of the status of the public IP.
-	StatusDetail string `mapstructure:"status_detail"`
-	// The time the public IP was created.
-	CreatedAt time.Time `mapstructure:"-"`
-	// The time the public IP was last updated.
-	UpdatedAt time.Time `mapstructure:"-"`
-}
-
-// PublicIPPage is the page returned by a pager when traversing over a
-// collection of PublicIPs.
-type PublicIPPage struct {
-	pagination.SinglePageBase
-}
-
-// IsEmpty returns true if a PublicIPPage contains no PublicIPs.
-func (r PublicIPPage) IsEmpty() (bool, error) {
-	n, err := ExtractPublicIPs(r)
-	if err != nil {
-		return true, err
-	}
-	return len(n) == 0, nil
-}
-
-// ExtractPublicIPs extracts and returns a slice of PublicIPs. It is used while iterating over
-// a publicips.List call.
-func ExtractPublicIPs(page pagination.Page) ([]PublicIP, error) {
-	var res []PublicIP
-	casted := page.(PublicIPPage).Body
-	err := mapstructure.Decode(casted, &res)
-
-	var rawNodesDetails []interface{}
-	switch casted.(type) {
-	case interface{}:
-		rawNodesDetails = casted.([]interface{})
-	default:
-		return res, fmt.Errorf("Unknown type: %v", reflect.TypeOf(casted))
-	}
-
-	for i := range rawNodesDetails {
-		thisNodeDetails := (rawNodesDetails[i]).(map[string]interface{})
-
-		if t, ok := thisNodeDetails["created"].(string); ok && t != "" {
-			creationTime, err := time.Parse(time.RFC3339, t)
-			if err != nil {
-				return res, err
-			}
-			res[i].CreatedAt = creationTime
-		}
-
-		if t, ok := thisNodeDetails["updated"].(string); ok && t != "" {
-			updatedTime, err := time.Parse(time.RFC3339, t)
-			if err != nil {
-				return res, err
-			}
-			res[i].UpdatedAt = updatedTime
-		}
-
-		if cs, ok := thisNodeDetails["cloud_server"].(map[string]interface{}); ok {
-			if t, ok := cs["created"].(string); ok && t != "" {
-				creationTime, err := time.Parse(time.RFC3339, t)
-				if err != nil {
-					return res, err
-				}
-				res[i].CloudServer.CreatedAt = creationTime
-			}
-			if t, ok := cs["updated"].(string); ok && t != "" {
-				updatedTime, err := time.Parse(time.RFC3339, t)
-				if err != nil {
-					return res, err
-				}
-				res[i].CloudServer.UpdatedAt = updatedTime
-			}
-			if cn, ok := cs["cloud_network"].(map[string]interface{}); ok {
-				if t, ok := cn["created"].(string); ok && t != "" {
-					creationTime, err := time.Parse(time.RFC3339, t)
-					if err != nil {
-						return res, err
-					}
-					res[i].CloudServer.CloudNetwork.CreatedAt = creationTime
-				}
-				if t, ok := cn["updated"].(string); ok && t != "" {
-					updatedTime, err := time.Parse(time.RFC3339, t)
-					if err != nil {
-						return res, err
-					}
-					res[i].CloudServer.CloudNetwork.UpdatedAt = updatedTime
-				}
-			}
-		}
-	}
-
-	return res, err
-}
-
-// PublicIPResult represents a result that can be extracted into a PublicIP.
-type PublicIPResult struct {
-	gophercloud.Result
-}
-
-// CreateResult represents the result of a Create operation.
-type CreateResult struct {
-	PublicIPResult
-}
-
-// GetResult represents the result of a Get operation.
-type GetResult struct {
-	PublicIPResult
-}
-
-// Extract is a function that extracts a PublicIP from a PublicIPResult.
-func (r PublicIPResult) Extract() (*PublicIP, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-	var res PublicIP
-	err := mapstructure.Decode(r.Body, &res)
-
-	b := r.Body.(map[string]interface{})
-
-	if date, ok := b["created"]; ok && date != nil {
-		t, err := time.Parse(time.RFC3339, date.(string))
-		if err != nil {
-			return nil, err
-		}
-		res.CreatedAt = t
-	}
-
-	if date, ok := b["updated"]; ok && date != nil {
-		t, err := time.Parse(time.RFC3339, date.(string))
-		if err != nil {
-			return nil, err
-		}
-		res.UpdatedAt = t
-	}
-
-	if cs, ok := b["cloud_server"].(map[string]interface{}); ok {
-		if t, ok := cs["created"].(string); ok && t != "" {
-			creationTime, err := time.Parse(time.RFC3339, t)
-			if err != nil {
-				return &res, err
-			}
-			res.CloudServer.CreatedAt = creationTime
-		}
-		if t, ok := cs["updated"].(string); ok && t != "" {
-			updatedTime, err := time.Parse(time.RFC3339, t)
-			if err != nil {
-				return &res, err
-			}
-			res.CloudServer.UpdatedAt = updatedTime
-		}
-		if cn, ok := cs["cloud_network"].(map[string]interface{}); ok {
-			if t, ok := cn["created"].(string); ok && t != "" {
-				creationTime, err := time.Parse(time.RFC3339, t)
-				if err != nil {
-					return &res, err
-				}
-				res.CloudServer.CloudNetwork.CreatedAt = creationTime
-			}
-			if t, ok := cn["updated"].(string); ok && t != "" {
-				updatedTime, err := time.Parse(time.RFC3339, t)
-				if err != nil {
-					return &res, err
-				}
-				res.CloudServer.CloudNetwork.UpdatedAt = updatedTime
-			}
-		}
-	}
-
-	return &res, err
-}
-
-// DeleteResult represents the result of a Delete operation.
-type DeleteResult struct {
-	gophercloud.ErrResult
-}
diff --git a/rackspace/rackconnect/v3/publicips/urls.go b/rackspace/rackconnect/v3/publicips/urls.go
deleted file mode 100644
index 6f310be..0000000
--- a/rackspace/rackconnect/v3/publicips/urls.go
+++ /dev/null
@@ -1,25 +0,0 @@
-package publicips
-
-import "github.com/rackspace/gophercloud"
-
-var root = "public_ips"
-
-func listURL(c *gophercloud.ServiceClient) string {
-	return c.ServiceURL(root)
-}
-
-func createURL(c *gophercloud.ServiceClient) string {
-	return c.ServiceURL(root)
-}
-
-func listForServerURL(c *gophercloud.ServiceClient, serverID string) string {
-	return c.ServiceURL(root + "?cloud_server_id=" + serverID)
-}
-
-func getURL(c *gophercloud.ServiceClient, id string) string {
-	return c.ServiceURL(root, id)
-}
-
-func deleteURL(c *gophercloud.ServiceClient, id string) string {
-	return getURL(c, id)
-}
diff --git a/results.go b/results.go
index 27fd1b6..8161a89 100644
--- a/results.go
+++ b/results.go
@@ -113,8 +113,8 @@
 // RFC3339Milli describes a common time format used by some API responses.
 const RFC3339Milli = "2006-01-02T15:04:05.999999Z"
 
-// Time format used in cloud orchestration
-const STACK_TIME_FMT = "2006-01-02T15:04:05"
+// StackFmtTime is the time format used in Heat (Orchestration).
+const StackFmtTime = "2006-01-02T15:04:05"
 
 /*
 Link is an internal type to be used in packages of collection resources that are
@@ -133,7 +133,7 @@
 ExtractNextURL is an internal function useful for packages of collection
 resources that are paginated in a certain way.
 
-It attempts attempts to extract the "next" URL from slice of Link structs, or
+It attempts to extract the "next" URL from slice of Link structs, or
 "" if no such URL is present.
 */
 func ExtractNextURL(links []Link) (string, error) {
