move unit tests into 'testing' directories
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..c1dc23e
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1 @@
+ExtractJSON method on gophercloud.Result
diff --git a/acceptance/openstack/compute/v2/quotaset_test.go b/acceptance/openstack/compute/v2/quotaset_test.go
index 3851edf..d7883df 100644
--- a/acceptance/openstack/compute/v2/quotaset_test.go
+++ b/acceptance/openstack/compute/v2/quotaset_test.go
@@ -5,12 +5,12 @@
 import (
 	"testing"
 
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/openstack"
-	"github.com/rackspace/gophercloud/openstack/compute/v2/extensions/quotasets"
-	"github.com/rackspace/gophercloud/openstack/identity/v2/tenants"
-	"github.com/rackspace/gophercloud/pagination"
-	th "github.com/rackspace/gophercloud/testhelper"
+	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/openstack"
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/quotasets"
+	"github.com/gophercloud/gophercloud/openstack/identity/v2/tenants"
+	"github.com/gophercloud/gophercloud/pagination"
+	th "github.com/gophercloud/gophercloud/testhelper"
 )
 
 func TestGetQuotaset(t *testing.T) {
diff --git a/endpoint_search_test.go b/endpoint_search_test.go
deleted file mode 100644
index 462316c..0000000
--- a/endpoint_search_test.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package gophercloud
-
-import (
-	"testing"
-
-	th "github.com/gophercloud/gophercloud/testhelper"
-)
-
-func TestApplyDefaultsToEndpointOpts(t *testing.T) {
-	eo := EndpointOpts{Availability: AvailabilityPublic}
-	eo.ApplyDefaults("compute")
-	expected := EndpointOpts{Availability: AvailabilityPublic, Type: "compute"}
-	th.CheckDeepEquals(t, expected, eo)
-
-	eo = EndpointOpts{Type: "compute"}
-	eo.ApplyDefaults("object-store")
-	expected = EndpointOpts{Availability: AvailabilityPublic, Type: "compute"}
-	th.CheckDeepEquals(t, expected, eo)
-}
diff --git a/openstack/blockstorage/v1/apiversions/testing/doc.go b/openstack/blockstorage/v1/apiversions/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/blockstorage/v1/apiversions/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/blockstorage/v1/apiversions/requests_test.go b/openstack/blockstorage/v1/apiversions/testing/fixtures.go
similarity index 63%
rename from openstack/blockstorage/v1/apiversions/requests_test.go
rename to openstack/blockstorage/v1/apiversions/testing/fixtures.go
index 3a14c99..885fdf6 100644
--- a/openstack/blockstorage/v1/apiversions/requests_test.go
+++ b/openstack/blockstorage/v1/apiversions/testing/fixtures.go
@@ -1,19 +1,15 @@
-package apiversions
+package testing
 
 import (
 	"fmt"
 	"net/http"
 	"testing"
 
-	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
 )
 
-func TestListVersions(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
+func MockListResponse(t *testing.T) {
 	th.Mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
 		th.TestMethod(t, r, "GET")
 		th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
@@ -48,39 +44,9 @@
 			]
 		}`)
 	})
-
-	count := 0
-
-	List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractAPIVersions(page)
-		th.AssertNoErr(t, err)
-
-		expected := []APIVersion{
-			APIVersion{
-				ID:      "v1.0",
-				Status:  "CURRENT",
-				Updated: "2012-01-04T11:33:21Z",
-			},
-			APIVersion{
-				ID:      "v2.0",
-				Status:  "CURRENT",
-				Updated: "2012-11-21T11:33:21Z",
-			},
-		}
-
-		th.AssertDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-
-	th.AssertEquals(t, 1, count)
 }
 
-func TestAPIInfo(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
+func MockGetResponse(t *testing.T) {
 	th.Mux.HandleFunc("/v1/", func(w http.ResponseWriter, r *http.Request) {
 		th.TestMethod(t, r, "GET")
 		th.TestHeader(t, r, "X-Auth-Token", client.TokenID)
@@ -122,17 +88,4 @@
 			}
 		}`)
 	})
-
-	actual, err := Get(client.ServiceClient(), "v1").Extract()
-	th.AssertNoErr(t, err)
-
-	expected := APIVersion{
-		ID:      "v1.0",
-		Status:  "CURRENT",
-		Updated: "2012-01-04T11:33:21Z",
-	}
-
-	th.AssertEquals(t, actual.ID, expected.ID)
-	th.AssertEquals(t, actual.Status, expected.Status)
-	th.AssertEquals(t, actual.Updated, expected.Updated)
 }
diff --git a/openstack/blockstorage/v1/apiversions/testing/requests_test.go b/openstack/blockstorage/v1/apiversions/testing/requests_test.go
new file mode 100644
index 0000000..3103497
--- /dev/null
+++ b/openstack/blockstorage/v1/apiversions/testing/requests_test.go
@@ -0,0 +1,64 @@
+package testing
+
+import (
+	"testing"
+
+	"github.com/gophercloud/gophercloud/openstack/blockstorage/v1/apiversions"
+	"github.com/gophercloud/gophercloud/pagination"
+	th "github.com/gophercloud/gophercloud/testhelper"
+	"github.com/gophercloud/gophercloud/testhelper/client"
+)
+
+func TestListVersions(t *testing.T) {
+	th.SetupHTTP()
+	defer th.TeardownHTTP()
+
+	MockListResponse(t)
+
+	count := 0
+
+	apiversions.List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+		count++
+		actual, err := apiversions.ExtractAPIVersions(page)
+		th.AssertNoErr(t, err)
+
+		expected := []apiversions.APIVersion{
+			{
+				ID:      "v1.0",
+				Status:  "CURRENT",
+				Updated: "2012-01-04T11:33:21Z",
+			},
+			{
+				ID:      "v2.0",
+				Status:  "CURRENT",
+				Updated: "2012-11-21T11:33:21Z",
+			},
+		}
+
+		th.AssertDeepEquals(t, expected, actual)
+
+		return true, nil
+	})
+
+	th.AssertEquals(t, 1, count)
+}
+
+func TestAPIInfo(t *testing.T) {
+	th.SetupHTTP()
+	defer th.TeardownHTTP()
+
+	MockGetResponse(t)
+
+	actual, err := apiversions.Get(client.ServiceClient(), "v1").Extract()
+	th.AssertNoErr(t, err)
+
+	expected := apiversions.APIVersion{
+		ID:      "v1.0",
+		Status:  "CURRENT",
+		Updated: "2012-01-04T11:33:21Z",
+	}
+
+	th.AssertEquals(t, actual.ID, expected.ID)
+	th.AssertEquals(t, actual.Status, expected.Status)
+	th.AssertEquals(t, actual.Updated, expected.Updated)
+}
diff --git a/openstack/blockstorage/v1/snapshots/testing/doc.go b/openstack/blockstorage/v1/snapshots/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/blockstorage/v1/snapshots/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/blockstorage/v1/snapshots/fixtures.go b/openstack/blockstorage/v1/snapshots/testing/fixtures.go
similarity index 98%
rename from openstack/blockstorage/v1/snapshots/fixtures.go
rename to openstack/blockstorage/v1/snapshots/testing/fixtures.go
index 1dcdfca..7bdc782 100644
--- a/openstack/blockstorage/v1/snapshots/fixtures.go
+++ b/openstack/blockstorage/v1/snapshots/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package snapshots
+package testing
 
 import (
 	"fmt"
diff --git a/openstack/blockstorage/v1/snapshots/requests_test.go b/openstack/blockstorage/v1/snapshots/testing/requests_test.go
similarity index 67%
rename from openstack/blockstorage/v1/snapshots/requests_test.go
rename to openstack/blockstorage/v1/snapshots/testing/requests_test.go
index 410b753..cfb206b 100644
--- a/openstack/blockstorage/v1/snapshots/requests_test.go
+++ b/openstack/blockstorage/v1/snapshots/testing/requests_test.go
@@ -1,8 +1,9 @@
-package snapshots
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/blockstorage/v1/snapshots"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
@@ -16,20 +17,20 @@
 
 	count := 0
 
-	List(client.ServiceClient(), &ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
+	snapshots.List(client.ServiceClient(), &snapshots.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractSnapshots(page)
+		actual, err := snapshots.ExtractSnapshots(page)
 		if err != nil {
 			t.Errorf("Failed to extract snapshots: %v", err)
 			return false, err
 		}
 
-		expected := []Snapshot{
-			Snapshot{
+		expected := []snapshots.Snapshot{
+			{
 				ID:   "289da7f8-6440-407c-9fb4-7db01ec49164",
 				Name: "snapshot-001",
 			},
-			Snapshot{
+			{
 				ID:   "96c3bda7-c82a-4f50-be73-ca7621794835",
 				Name: "snapshot-002",
 			},
@@ -51,7 +52,7 @@
 
 	MockGetResponse(t)
 
-	v, err := Get(client.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22").Extract()
+	v, err := snapshots.Get(client.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22").Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, v.Name, "snapshot-001")
@@ -64,8 +65,8 @@
 
 	MockCreateResponse(t)
 
-	options := CreateOpts{VolumeID: "1234", Name: "snapshot-001"}
-	n, err := Create(client.ServiceClient(), options).Extract()
+	options := snapshots.CreateOpts{VolumeID: "1234", Name: "snapshot-001"}
+	n, err := snapshots.Create(client.ServiceClient(), options).Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, n.VolumeID, "1234")
@@ -81,13 +82,13 @@
 
 	expected := map[string]interface{}{"key": "v1"}
 
-	options := &UpdateMetadataOpts{
+	options := &snapshots.UpdateMetadataOpts{
 		Metadata: map[string]interface{}{
 			"key": "v1",
 		},
 	}
 
-	actual, err := UpdateMetadata(client.ServiceClient(), "123", options).ExtractMetadata()
+	actual, err := snapshots.UpdateMetadata(client.ServiceClient(), "123", options).ExtractMetadata()
 
 	th.AssertNoErr(t, err)
 	th.AssertDeepEquals(t, actual, expected)
@@ -99,6 +100,6 @@
 
 	MockDeleteResponse(t)
 
-	res := Delete(client.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22")
+	res := snapshots.Delete(client.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22")
 	th.AssertNoErr(t, res.Err)
 }
diff --git a/openstack/blockstorage/v1/volumes/testing/doc.go b/openstack/blockstorage/v1/volumes/testing/doc.go
index 60fc22a..2f66ba5 100644
--- a/openstack/blockstorage/v1/volumes/testing/doc.go
+++ b/openstack/blockstorage/v1/volumes/testing/doc.go
@@ -2,6 +2,6 @@
 This is package created is to hold fixtures (which imports testing),
 so that importing volumes package does not inadvertently import testing into production code
 More information here:
-https://github.com/gophercloud/gophercloud/issues/473
+https://github.com/rackspace/gophercloud/issues/473
 */
 package testing
diff --git a/openstack/blockstorage/v1/volumes/testing/fixtures.go b/openstack/blockstorage/v1/volumes/testing/fixtures.go
index 0d34d5e..421cbf4 100644
--- a/openstack/blockstorage/v1/volumes/testing/fixtures.go
+++ b/openstack/blockstorage/v1/volumes/testing/fixtures.go
@@ -1,5 +1,3 @@
-// +build fixtures
-
 package testing
 
 import (
diff --git a/openstack/blockstorage/v1/volumes/requests_test.go b/openstack/blockstorage/v1/volumes/testing/requests_test.go
similarity index 69%
rename from openstack/blockstorage/v1/volumes/requests_test.go
rename to openstack/blockstorage/v1/volumes/testing/requests_test.go
index 436cfdc..85a6cd8 100644
--- a/openstack/blockstorage/v1/volumes/requests_test.go
+++ b/openstack/blockstorage/v1/volumes/testing/requests_test.go
@@ -1,11 +1,11 @@
-package volumes
+package testing
 
 import (
 	"testing"
 	"time"
 
 	"github.com/gophercloud/gophercloud"
-	fixtures "github.com/gophercloud/gophercloud/openstack/blockstorage/v1/volumes/testing"
+	"github.com/gophercloud/gophercloud/openstack/blockstorage/v1/volumes"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
@@ -15,24 +15,24 @@
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
 
-	fixtures.MockListResponse(t)
+	MockListResponse(t)
 
 	count := 0
 
-	List(client.ServiceClient(), &ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
+	volumes.List(client.ServiceClient(), &volumes.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractVolumes(page)
+		actual, err := volumes.ExtractVolumes(page)
 		if err != nil {
 			t.Errorf("Failed to extract volumes: %v", err)
 			return false, err
 		}
 
-		expected := []Volume{
-			Volume{
+		expected := []volumes.Volume{
+			{
 				ID:   "289da7f8-6440-407c-9fb4-7db01ec49164",
 				Name: "vol-001",
 			},
-			Volume{
+			{
 				ID:   "96c3bda7-c82a-4f50-be73-ca7621794835",
 				Name: "vol-002",
 			},
@@ -52,19 +52,19 @@
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
 
-	fixtures.MockListResponse(t)
+	MockListResponse(t)
 
-	allPages, err := List(client.ServiceClient(), &ListOpts{}).AllPages()
+	allPages, err := volumes.List(client.ServiceClient(), &volumes.ListOpts{}).AllPages()
 	th.AssertNoErr(t, err)
-	actual, err := ExtractVolumes(allPages)
+	actual, err := volumes.ExtractVolumes(allPages)
 	th.AssertNoErr(t, err)
 
-	expected := []Volume{
-		Volume{
+	expected := []volumes.Volume{
+		{
 			ID:   "289da7f8-6440-407c-9fb4-7db01ec49164",
 			Name: "vol-001",
 		},
-		Volume{
+		{
 			ID:   "96c3bda7-c82a-4f50-be73-ca7621794835",
 			Name: "vol-002",
 		},
@@ -78,12 +78,12 @@
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
 
-	fixtures.MockGetResponse(t)
+	MockGetResponse(t)
 
-	actual, err := Get(client.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22").Extract()
+	actual, err := volumes.Get(client.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22").Extract()
 	th.AssertNoErr(t, err)
 
-	expected := &Volume{
+	expected := &volumes.Volume{
 		Status: "active",
 		Name:   "vol-001",
 		Attachments: []map[string]interface{}{
@@ -117,10 +117,10 @@
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
 
-	fixtures.MockCreateResponse(t)
+	MockCreateResponse(t)
 
-	options := &CreateOpts{Size: 75}
-	n, err := Create(client.ServiceClient(), options).Extract()
+	options := &volumes.CreateOpts{Size: 75}
+	n, err := volumes.Create(client.ServiceClient(), options).Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, n.Size, 4)
@@ -131,9 +131,9 @@
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
 
-	fixtures.MockDeleteResponse(t)
+	MockDeleteResponse(t)
 
-	res := Delete(client.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22")
+	res := volumes.Delete(client.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22")
 	th.AssertNoErr(t, res.Err)
 }
 
@@ -141,10 +141,10 @@
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
 
-	fixtures.MockUpdateResponse(t)
+	MockUpdateResponse(t)
 
-	options := UpdateOpts{Name: "vol-002"}
-	v, err := Update(client.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22", options).Extract()
+	options := volumes.UpdateOpts{Name: "vol-002"}
+	v, err := volumes.Update(client.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22", options).Extract()
 	th.AssertNoErr(t, err)
 	th.CheckEquals(t, "vol-002", v.Name)
 }
diff --git a/openstack/blockstorage/v1/volumetypes/testing/doc.go b/openstack/blockstorage/v1/volumetypes/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/blockstorage/v1/volumetypes/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/blockstorage/v1/volumetypes/fixtures.go b/openstack/blockstorage/v1/volumetypes/testing/fixtures.go
similarity index 96%
rename from openstack/blockstorage/v1/volumetypes/fixtures.go
rename to openstack/blockstorage/v1/volumetypes/testing/fixtures.go
index cb6fadf..0e2715a 100644
--- a/openstack/blockstorage/v1/volumetypes/fixtures.go
+++ b/openstack/blockstorage/v1/volumetypes/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package volumetypes
+package testing
 
 import (
 	"fmt"
diff --git a/openstack/blockstorage/v1/volumetypes/requests_test.go b/openstack/blockstorage/v1/volumetypes/testing/requests_test.go
similarity index 78%
rename from openstack/blockstorage/v1/volumetypes/requests_test.go
rename to openstack/blockstorage/v1/volumetypes/testing/requests_test.go
index 72113ec..4244615 100644
--- a/openstack/blockstorage/v1/volumetypes/requests_test.go
+++ b/openstack/blockstorage/v1/volumetypes/testing/requests_test.go
@@ -1,10 +1,11 @@
-package volumetypes
+package testing
 
 import (
 	"fmt"
 	"net/http"
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/blockstorage/v1/volumetypes"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
@@ -18,23 +19,23 @@
 
 	count := 0
 
-	List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+	volumetypes.List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractVolumeTypes(page)
+		actual, err := volumetypes.ExtractVolumeTypes(page)
 		if err != nil {
 			t.Errorf("Failed to extract volume types: %v", err)
 			return false, err
 		}
 
-		expected := []VolumeType{
-			VolumeType{
+		expected := []volumetypes.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{}{},
@@ -57,7 +58,7 @@
 
 	MockGetResponse(t)
 
-	vt, err := Get(client.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22").Extract()
+	vt, err := volumetypes.Get(client.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22").Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertDeepEquals(t, vt.ExtraSpecs, map[string]interface{}{"serverNumber": "2"})
@@ -95,8 +96,8 @@
 		`)
 	})
 
-	options := &CreateOpts{Name: "vol-type-001"}
-	n, err := Create(client.ServiceClient(), options).Extract()
+	options := &volumetypes.CreateOpts{Name: "vol-type-001"}
+	n, err := volumetypes.Create(client.ServiceClient(), options).Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, n.Name, "vol-type-001")
@@ -113,6 +114,6 @@
 		w.WriteHeader(http.StatusAccepted)
 	})
 
-	err := Delete(client.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22").ExtractErr()
+	err := volumetypes.Delete(client.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22").ExtractErr()
 	th.AssertNoErr(t, err)
 }
diff --git a/openstack/cdn/v1/base/testing/doc.go b/openstack/cdn/v1/base/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/cdn/v1/base/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/cdn/v1/base/fixtures.go b/openstack/cdn/v1/base/testing/fixtures.go
similarity index 97%
rename from openstack/cdn/v1/base/fixtures.go
rename to openstack/cdn/v1/base/testing/fixtures.go
index 226edae..f1f4ac0 100644
--- a/openstack/cdn/v1/base/fixtures.go
+++ b/openstack/cdn/v1/base/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package base
+package testing
 
 import (
 	"fmt"
diff --git a/openstack/cdn/v1/base/requests_test.go b/openstack/cdn/v1/base/testing/requests_test.go
similarity index 78%
rename from openstack/cdn/v1/base/requests_test.go
rename to openstack/cdn/v1/base/testing/requests_test.go
index a0559e3..cd1209b 100644
--- a/openstack/cdn/v1/base/requests_test.go
+++ b/openstack/cdn/v1/base/testing/requests_test.go
@@ -1,8 +1,9 @@
-package base
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/cdn/v1/base"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
 )
@@ -12,10 +13,10 @@
 	defer th.TeardownHTTP()
 	HandleGetSuccessfully(t)
 
-	actual, err := Get(fake.ServiceClient()).Extract()
+	actual, err := base.Get(fake.ServiceClient()).Extract()
 	th.CheckNoErr(t, err)
 
-	expected := HomeDocument{
+	expected := base.HomeDocument{
 		"rel/cdn": map[string]interface{}{
 			"href-template": "services{?marker,limit}",
 			"href-vars": map[string]interface{}{
@@ -38,6 +39,6 @@
 	defer th.TeardownHTTP()
 	HandlePingSuccessfully(t)
 
-	err := Ping(fake.ServiceClient()).ExtractErr()
+	err := base.Ping(fake.ServiceClient()).ExtractErr()
 	th.CheckNoErr(t, err)
 }
diff --git a/openstack/cdn/v1/flavors/testing/doc.go b/openstack/cdn/v1/flavors/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/cdn/v1/flavors/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/cdn/v1/flavors/fixtures.go b/openstack/cdn/v1/flavors/testing/fixtures.go
similarity index 98%
rename from openstack/cdn/v1/flavors/fixtures.go
rename to openstack/cdn/v1/flavors/testing/fixtures.go
index 5d07491..ed97247 100644
--- a/openstack/cdn/v1/flavors/fixtures.go
+++ b/openstack/cdn/v1/flavors/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package flavors
+package testing
 
 import (
 	"fmt"
diff --git a/openstack/cdn/v1/flavors/requests_test.go b/openstack/cdn/v1/flavors/testing/requests_test.go
similarity index 76%
rename from openstack/cdn/v1/flavors/requests_test.go
rename to openstack/cdn/v1/flavors/testing/requests_test.go
index 0aeda00..bc4b1a5 100644
--- a/openstack/cdn/v1/flavors/requests_test.go
+++ b/openstack/cdn/v1/flavors/testing/requests_test.go
@@ -1,9 +1,10 @@
-package flavors
+package testing
 
 import (
 	"testing"
 
 	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/openstack/cdn/v1/flavors"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
@@ -17,19 +18,19 @@
 
 	count := 0
 
-	err := List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+	err := flavors.List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractFlavors(page)
+		actual, err := flavors.ExtractFlavors(page)
 		if err != nil {
 			t.Errorf("Failed to extract flavors: %v", err)
 			return false, err
 		}
 
-		expected := []Flavor{
-			Flavor{
+		expected := []flavors.Flavor{
+			{
 				ID: "europe",
-				Providers: []Provider{
-					Provider{
+				Providers: []flavors.Provider{
+					{
 						Provider: "Fastly",
 						Links: []gophercloud.Link{
 							gophercloud.Link{
@@ -62,10 +63,10 @@
 
 	HandleGetCDNFlavorSuccessfully(t)
 
-	expected := &Flavor{
+	expected := &flavors.Flavor{
 		ID: "asia",
-		Providers: []Provider{
-			Provider{
+		Providers: []flavors.Provider{
+			{
 				Provider: "ChinaCache",
 				Links: []gophercloud.Link{
 					gophercloud.Link{
@@ -83,7 +84,7 @@
 		},
 	}
 
-	actual, err := Get(fake.ServiceClient(), "asia").Extract()
+	actual, err := flavors.Get(fake.ServiceClient(), "asia").Extract()
 	th.AssertNoErr(t, err)
 	th.AssertDeepEquals(t, expected, actual)
 }
diff --git a/openstack/cdn/v1/serviceassets/requests_test.go b/openstack/cdn/v1/serviceassets/requests_test.go
deleted file mode 100644
index 1204943..0000000
--- a/openstack/cdn/v1/serviceassets/requests_test.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package serviceassets
-
-import (
-	"testing"
-
-	th "github.com/gophercloud/gophercloud/testhelper"
-	fake "github.com/gophercloud/gophercloud/testhelper/client"
-)
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	HandleDeleteCDNAssetSuccessfully(t)
-
-	err := Delete(fake.ServiceClient(), "96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0", nil).ExtractErr()
-	th.AssertNoErr(t, err)
-}
diff --git a/openstack/cdn/v1/serviceassets/testing/doc.go b/openstack/cdn/v1/serviceassets/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/cdn/v1/serviceassets/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/cdn/v1/serviceassets/fixtures.go b/openstack/cdn/v1/serviceassets/testing/fixtures.go
similarity index 93%
rename from openstack/cdn/v1/serviceassets/fixtures.go
rename to openstack/cdn/v1/serviceassets/testing/fixtures.go
index a66c503..3172d30 100644
--- a/openstack/cdn/v1/serviceassets/fixtures.go
+++ b/openstack/cdn/v1/serviceassets/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package serviceassets
+package testing
 
 import (
 	"net/http"
diff --git a/openstack/cdn/v1/serviceassets/testing/requests_test.go b/openstack/cdn/v1/serviceassets/testing/requests_test.go
new file mode 100644
index 0000000..ff2073b
--- /dev/null
+++ b/openstack/cdn/v1/serviceassets/testing/requests_test.go
@@ -0,0 +1,19 @@
+package testing
+
+import (
+	"testing"
+
+	"github.com/gophercloud/gophercloud/openstack/cdn/v1/serviceassets"
+	th "github.com/gophercloud/gophercloud/testhelper"
+	fake "github.com/gophercloud/gophercloud/testhelper/client"
+)
+
+func TestDelete(t *testing.T) {
+	th.SetupHTTP()
+	defer th.TeardownHTTP()
+
+	HandleDeleteCDNAssetSuccessfully(t)
+
+	err := serviceassets.Delete(fake.ServiceClient(), "96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0", nil).ExtractErr()
+	th.AssertNoErr(t, err)
+}
diff --git a/openstack/cdn/v1/services/testing/doc.go b/openstack/cdn/v1/services/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/cdn/v1/services/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/cdn/v1/services/fixtures.go b/openstack/cdn/v1/services/testing/fixtures.go
similarity index 99%
rename from openstack/cdn/v1/services/fixtures.go
rename to openstack/cdn/v1/services/testing/fixtures.go
index 12d260e..d4093e0 100644
--- a/openstack/cdn/v1/services/fixtures.go
+++ b/openstack/cdn/v1/services/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package services
+package testing
 
 import (
 	"fmt"
diff --git a/openstack/cdn/v1/services/requests_test.go b/openstack/cdn/v1/services/testing/requests_test.go
similarity index 66%
rename from openstack/cdn/v1/services/requests_test.go
rename to openstack/cdn/v1/services/testing/requests_test.go
index 1f27b59..0abc98e 100644
--- a/openstack/cdn/v1/services/requests_test.go
+++ b/openstack/cdn/v1/services/testing/requests_test.go
@@ -1,9 +1,10 @@
-package services
+package testing
 
 import (
 	"testing"
 
 	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/openstack/cdn/v1/services"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
@@ -17,61 +18,61 @@
 
 	count := 0
 
-	err := List(fake.ServiceClient(), &ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
+	err := services.List(fake.ServiceClient(), &services.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractServices(page)
+		actual, err := services.ExtractServices(page)
 		if err != nil {
 			t.Errorf("Failed to extract services: %v", err)
 			return false, err
 		}
 
-		expected := []Service{
-			Service{
+		expected := []services.Service{
+			{
 				ID:   "96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0",
 				Name: "mywebsite.com",
-				Domains: []Domain{
-					Domain{
+				Domains: []services.Domain{
+					{
 						Domain: "www.mywebsite.com",
 					},
 				},
-				Origins: []Origin{
-					Origin{
+				Origins: []services.Origin{
+					{
 						Origin: "mywebsite.com",
 						Port:   80,
 						SSL:    false,
 					},
 				},
-				Caching: []CacheRule{
-					CacheRule{
+				Caching: []services.CacheRule{
+					{
 						Name: "default",
 						TTL:  3600,
 					},
-					CacheRule{
+					{
 						Name: "home",
 						TTL:  17200,
-						Rules: []TTLRule{
-							TTLRule{
+						Rules: []services.TTLRule{
+							{
 								Name:       "index",
 								RequestURL: "/index.htm",
 							},
 						},
 					},
-					CacheRule{
+					{
 						Name: "images",
 						TTL:  12800,
-						Rules: []TTLRule{
-							TTLRule{
+						Rules: []services.TTLRule{
+							{
 								Name:       "images",
 								RequestURL: "*.png",
 							},
 						},
 					},
 				},
-				Restrictions: []Restriction{
-					Restriction{
+				Restrictions: []services.Restriction{
+					{
 						Name: "website only",
-						Rules: []RestrictionRule{
-							RestrictionRule{
+						Rules: []services.RestrictionRule{
+							{
 								Name:     "mywebsite.com",
 								Referrer: "www.mywebsite.com",
 							},
@@ -80,55 +81,55 @@
 				},
 				FlavorID: "asia",
 				Status:   "deployed",
-				Errors:   []Error{},
+				Errors:   []services.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",
 					},
 				},
 			},
-			Service{
+			{
 				ID:   "96737ae3-cfc1-4c72-be88-5d0e7cc9a3f1",
 				Name: "myothersite.com",
-				Domains: []Domain{
-					Domain{
+				Domains: []services.Domain{
+					{
 						Domain: "www.myothersite.com",
 					},
 				},
-				Origins: []Origin{
-					Origin{
+				Origins: []services.Origin{
+					{
 						Origin: "44.33.22.11",
 						Port:   80,
 						SSL:    false,
 					},
-					Origin{
+					{
 						Origin: "77.66.55.44",
 						Port:   80,
 						SSL:    false,
-						Rules: []OriginRule{
-							OriginRule{
+						Rules: []services.OriginRule{
+							{
 								Name:       "videos",
 								RequestURL: "^/videos/*.m3u",
 							},
 						},
 					},
 				},
-				Caching: []CacheRule{
-					CacheRule{
+				Caching: []services.CacheRule{
+					{
 						Name: "default",
 						TTL:  3600,
 					},
 				},
-				Restrictions: []Restriction{},
+				Restrictions: []services.Restriction{},
 				FlavorID:     "europe",
 				Status:       "deployed",
 				Links: []gophercloud.Link{
@@ -165,36 +166,36 @@
 
 	HandleCreateCDNServiceSuccessfully(t)
 
-	createOpts := CreateOpts{
+	createOpts := services.CreateOpts{
 		Name: "mywebsite.com",
-		Domains: []Domain{
-			Domain{
+		Domains: []services.Domain{
+			{
 				Domain: "www.mywebsite.com",
 			},
-			Domain{
+			{
 				Domain: "blog.mywebsite.com",
 			},
 		},
-		Origins: []Origin{
-			Origin{
+		Origins: []services.Origin{
+			{
 				Origin: "mywebsite.com",
 				Port:   80,
 				SSL:    false,
 			},
 		},
-		Restrictions: []Restriction{
-			Restriction{
+		Restrictions: []services.Restriction{
+			{
 				Name: "website only",
-				Rules: []RestrictionRule{
-					RestrictionRule{
+				Rules: []services.RestrictionRule{
+					{
 						Name:     "mywebsite.com",
 						Referrer: "www.mywebsite.com",
 					},
 				},
 			},
 		},
-		Caching: []CacheRule{
-			CacheRule{
+		Caching: []services.CacheRule{
+			{
 				Name: "default",
 				TTL:  3600,
 			},
@@ -203,7 +204,7 @@
 	}
 
 	expected := "https://global.cdn.api.rackspacecloud.com/v1.0/services/96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0"
-	actual, err := Create(fake.ServiceClient(), createOpts).Extract()
+	actual, err := services.Create(fake.ServiceClient(), createOpts).Extract()
 	th.AssertNoErr(t, err)
 	th.AssertEquals(t, expected, actual)
 }
@@ -214,53 +215,53 @@
 
 	HandleGetCDNServiceSuccessfully(t)
 
-	expected := &Service{
+	expected := &services.Service{
 		ID:   "96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0",
 		Name: "mywebsite.com",
-		Domains: []Domain{
-			Domain{
+		Domains: []services.Domain{
+			{
 				Domain:   "www.mywebsite.com",
 				Protocol: "http",
 			},
 		},
-		Origins: []Origin{
-			Origin{
+		Origins: []services.Origin{
+			{
 				Origin: "mywebsite.com",
 				Port:   80,
 				SSL:    false,
 			},
 		},
-		Caching: []CacheRule{
-			CacheRule{
+		Caching: []services.CacheRule{
+			{
 				Name: "default",
 				TTL:  3600,
 			},
-			CacheRule{
+			{
 				Name: "home",
 				TTL:  17200,
-				Rules: []TTLRule{
-					TTLRule{
+				Rules: []services.TTLRule{
+					{
 						Name:       "index",
 						RequestURL: "/index.htm",
 					},
 				},
 			},
-			CacheRule{
+			{
 				Name: "images",
 				TTL:  12800,
-				Rules: []TTLRule{
-					TTLRule{
+				Rules: []services.TTLRule{
+					{
 						Name:       "images",
 						RequestURL: "*.png",
 					},
 				},
 			},
 		},
-		Restrictions: []Restriction{
-			Restriction{
+		Restrictions: []services.Restriction{
+			{
 				Name: "website only",
-				Rules: []RestrictionRule{
-					RestrictionRule{
+				Rules: []services.RestrictionRule{
+					{
 						Name:     "mywebsite.com",
 						Referrer: "www.mywebsite.com",
 					},
@@ -269,24 +270,24 @@
 		},
 		FlavorID: "cdn",
 		Status:   "deployed",
-		Errors:   []Error{},
+		Errors:   []services.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()
+	actual, err := services.Get(fake.ServiceClient(), "96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0").Extract()
 	th.AssertNoErr(t, err)
 	th.AssertDeepEquals(t, expected, actual)
 }
@@ -298,51 +299,51 @@
 	HandleUpdateCDNServiceSuccessfully(t)
 
 	expected := "https://www.poppycdn.io/v1.0/services/96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0"
-	ops := UpdateOpts{
+	ops := services.UpdateOpts{
 		// Append a single Domain
-		Append{Value: Domain{Domain: "appended.mocksite4.com"}},
+		services.Append{Value: services.Domain{Domain: "appended.mocksite4.com"}},
 		// Insert a single Domain
-		Insertion{
+		services.Insertion{
 			Index: 4,
-			Value: Domain{Domain: "inserted.mocksite4.com"},
+			Value: services.Domain{Domain: "inserted.mocksite4.com"},
 		},
 		// Bulk addition
-		Append{
-			Value: DomainList{
-				Domain{Domain: "bulkadded1.mocksite4.com"},
-				Domain{Domain: "bulkadded2.mocksite4.com"},
+		services.Append{
+			Value: services.DomainList{
+				{Domain: "bulkadded1.mocksite4.com"},
+				{Domain: "bulkadded2.mocksite4.com"},
 			},
 		},
 		// Replace a single Origin
-		Replacement{
+		services.Replacement{
 			Index: 2,
-			Value: Origin{Origin: "44.33.22.11", Port: 80, SSL: false},
+			Value: services.Origin{Origin: "44.33.22.11", Port: 80, SSL: false},
 		},
 		// Bulk replace Origins
-		Replacement{
+		services.Replacement{
 			Index: 0, // Ignored
-			Value: OriginList{
-				Origin{Origin: "44.33.22.11", Port: 80, SSL: false},
-				Origin{Origin: "55.44.33.22", Port: 443, SSL: true},
+			Value: services.OriginList{
+				{Origin: "44.33.22.11", Port: 80, SSL: false},
+				{Origin: "55.44.33.22", Port: 443, SSL: true},
 			},
 		},
 		// Remove a single CacheRule
-		Removal{
+		services.Removal{
 			Index: 8,
-			Path:  PathCaching,
+			Path:  services.PathCaching,
 		},
 		// Bulk removal
-		Removal{
+		services.Removal{
 			All:  true,
-			Path: PathCaching,
+			Path: services.PathCaching,
 		},
 		// Service name replacement
-		NameReplacement{
+		services.NameReplacement{
 			NewName: "differentServiceName",
 		},
 	}
 
-	actual, err := Update(fake.ServiceClient(), "96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0", ops).Extract()
+	actual, err := services.Update(fake.ServiceClient(), "96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0", ops).Extract()
 	th.AssertNoErr(t, err)
 	th.AssertEquals(t, expected, actual)
 }
@@ -353,6 +354,6 @@
 
 	HandleDeleteCDNServiceSuccessfully(t)
 
-	err := Delete(fake.ServiceClient(), "96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0").ExtractErr()
+	err := services.Delete(fake.ServiceClient(), "96737ae3-cfc1-4c72-be88-5d0e7cc9a3f0").ExtractErr()
 	th.AssertNoErr(t, err)
 }
diff --git a/openstack/common/extensions/testing/doc.go b/openstack/common/extensions/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/common/extensions/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/common/extensions/fixtures.go b/openstack/common/extensions/testing/fixtures.go
similarity index 91%
rename from openstack/common/extensions/fixtures.go
rename to openstack/common/extensions/testing/fixtures.go
index 00d3db4..a986c95 100644
--- a/openstack/common/extensions/fixtures.go
+++ b/openstack/common/extensions/testing/fixtures.go
@@ -1,12 +1,11 @@
-// +build fixtures
-
-package extensions
+package testing
 
 import (
 	"fmt"
 	"net/http"
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/common/extensions"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
 )
@@ -41,7 +40,7 @@
 `
 
 // ListedExtension is the Extension that should be parsed from ListOutput.
-var ListedExtension = Extension{
+var ListedExtension = extensions.Extension{
 	Updated:     "2013-01-20T00:00:00-00:00",
 	Name:        "Neutron Service Type Management",
 	Links:       []interface{}{},
@@ -51,10 +50,10 @@
 }
 
 // ExpectedExtensions is a slice containing the Extension that should be parsed from ListOutput.
-var ExpectedExtensions = []Extension{ListedExtension}
+var ExpectedExtensions = []extensions.Extension{ListedExtension}
 
 // SingleExtension is the Extension that should be parsed from GetOutput.
-var SingleExtension = &Extension{
+var SingleExtension = &extensions.Extension{
 	Updated:     "2013-02-03T10:00:00-00:00",
 	Name:        "agent",
 	Links:       []interface{}{},
diff --git a/openstack/common/extensions/requests_test.go b/openstack/common/extensions/testing/requests_test.go
similarity index 67%
rename from openstack/common/extensions/requests_test.go
rename to openstack/common/extensions/testing/requests_test.go
index 5caf407..fbaedfa 100644
--- a/openstack/common/extensions/requests_test.go
+++ b/openstack/common/extensions/testing/requests_test.go
@@ -1,8 +1,9 @@
-package extensions
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/common/extensions"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
@@ -15,9 +16,9 @@
 
 	count := 0
 
-	List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+	extensions.List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractExtensions(page)
+		actual, err := extensions.ExtractExtensions(page)
 		th.AssertNoErr(t, err)
 		th.AssertDeepEquals(t, ExpectedExtensions, actual)
 
@@ -32,7 +33,7 @@
 	defer th.TeardownHTTP()
 	HandleGetExtensionSuccessfully(t)
 
-	actual, err := Get(client.ServiceClient(), "agent").Extract()
+	actual, err := extensions.Get(client.ServiceClient(), "agent").Extract()
 	th.AssertNoErr(t, err)
 	th.CheckDeepEquals(t, SingleExtension, actual)
 }
diff --git a/openstack/compute/v2/extensions/bootfromvolume/testing/doc.go b/openstack/compute/v2/extensions/bootfromvolume/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/compute/v2/extensions/bootfromvolume/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/compute/v2/extensions/bootfromvolume/requests_test.go b/openstack/compute/v2/extensions/bootfromvolume/testing/requests_test.go
similarity index 84%
rename from openstack/compute/v2/extensions/bootfromvolume/requests_test.go
rename to openstack/compute/v2/extensions/bootfromvolume/testing/requests_test.go
index d85070d..dca1105 100644
--- a/openstack/compute/v2/extensions/bootfromvolume/requests_test.go
+++ b/openstack/compute/v2/extensions/bootfromvolume/testing/requests_test.go
@@ -1,8 +1,9 @@
-package bootfromvolume
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/bootfromvolume"
 	"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
@@ -14,12 +15,12 @@
 		FlavorRef: "performance1-1",
 	}
 
-	ext := CreateOptsExt{
+	ext := bootfromvolume.CreateOptsExt{
 		CreateOptsBuilder: base,
-		BlockDevice: []BlockDevice{
-			BlockDevice{
+		BlockDevice: []bootfromvolume.BlockDevice{
+			{
 				UUID:                "123456",
-				SourceType:          Image,
+				SourceType:          bootfromvolume.Image,
 				DestinationType:     "volume",
 				VolumeSize:          10,
 				DeleteOnTermination: false,
@@ -58,30 +59,30 @@
 		FlavorRef: "performance1-1",
 	}
 
-	ext := CreateOptsExt{
+	ext := bootfromvolume.CreateOptsExt{
 		CreateOptsBuilder: base,
-		BlockDevice: []BlockDevice{
-			BlockDevice{
+		BlockDevice: []bootfromvolume.BlockDevice{
+			{
 				BootIndex:           0,
 				DeleteOnTermination: true,
 				DestinationType:     "local",
-				SourceType:          Image,
+				SourceType:          bootfromvolume.Image,
 				UUID:                "123456",
 			},
-			BlockDevice{
+			{
 				BootIndex:           -1,
 				DeleteOnTermination: true,
 				DestinationType:     "local",
 				GuestFormat:         "ext4",
-				SourceType:          Blank,
+				SourceType:          bootfromvolume.Blank,
 				VolumeSize:          1,
 			},
-			BlockDevice{
+			{
 				BootIndex:           -1,
 				DeleteOnTermination: true,
 				DestinationType:     "local",
 				GuestFormat:         "ext4",
-				SourceType:          Blank,
+				SourceType:          bootfromvolume.Blank,
 				VolumeSize:          1,
 			},
 		},
diff --git a/openstack/compute/v2/extensions/defsecrules/testing/doc.go b/openstack/compute/v2/extensions/defsecrules/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/compute/v2/extensions/defsecrules/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/compute/v2/extensions/defsecrules/fixtures.go b/openstack/compute/v2/extensions/defsecrules/testing/fixtures.go
similarity index 98%
rename from openstack/compute/v2/extensions/defsecrules/fixtures.go
rename to openstack/compute/v2/extensions/defsecrules/testing/fixtures.go
index 4fee896..e4a62d4 100644
--- a/openstack/compute/v2/extensions/defsecrules/fixtures.go
+++ b/openstack/compute/v2/extensions/defsecrules/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package defsecrules
+package testing
 
 import (
 	"fmt"
diff --git a/openstack/compute/v2/extensions/defsecrules/requests_test.go b/openstack/compute/v2/extensions/defsecrules/testing/requests_test.go
similarity index 71%
rename from openstack/compute/v2/extensions/defsecrules/requests_test.go
rename to openstack/compute/v2/extensions/defsecrules/testing/requests_test.go
index df568fe..1f2fb86 100644
--- a/openstack/compute/v2/extensions/defsecrules/requests_test.go
+++ b/openstack/compute/v2/extensions/defsecrules/testing/requests_test.go
@@ -1,8 +1,9 @@
-package defsecrules
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/defsecrules"
 	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/secgroups"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
@@ -19,13 +20,13 @@
 
 	count := 0
 
-	err := List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+	err := defsecrules.List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractDefaultRules(page)
+		actual, err := defsecrules.ExtractDefaultRules(page)
 		th.AssertNoErr(t, err)
 
-		expected := []DefaultRule{
-			DefaultRule{
+		expected := []defsecrules.DefaultRule{
+			{
 				FromPort:   80,
 				ID:         ruleID,
 				IPProtocol: "TCP",
@@ -49,17 +50,17 @@
 
 	mockCreateRuleResponse(t)
 
-	opts := CreateOpts{
+	opts := defsecrules.CreateOpts{
 		IPProtocol: "TCP",
 		FromPort:   80,
 		ToPort:     80,
 		CIDR:       "10.10.12.0/24",
 	}
 
-	group, err := Create(client.ServiceClient(), opts).Extract()
+	group, err := defsecrules.Create(client.ServiceClient(), opts).Extract()
 	th.AssertNoErr(t, err)
 
-	expected := &DefaultRule{
+	expected := &defsecrules.DefaultRule{
 		ID:         ruleID,
 		FromPort:   80,
 		ToPort:     80,
@@ -75,17 +76,17 @@
 
 	mockCreateRuleResponseICMPZero(t)
 
-	opts := CreateOpts{
+	opts := defsecrules.CreateOpts{
 		IPProtocol: "ICMP",
 		FromPort:   0,
 		ToPort:     0,
 		CIDR:       "10.10.12.0/24",
 	}
 
-	group, err := Create(client.ServiceClient(), opts).Extract()
+	group, err := defsecrules.Create(client.ServiceClient(), opts).Extract()
 	th.AssertNoErr(t, err)
 
-	expected := &DefaultRule{
+	expected := &defsecrules.DefaultRule{
 		ID:         ruleID,
 		FromPort:   0,
 		ToPort:     0,
@@ -101,10 +102,10 @@
 
 	mockGetRuleResponse(t, ruleID)
 
-	group, err := Get(client.ServiceClient(), ruleID).Extract()
+	group, err := defsecrules.Get(client.ServiceClient(), ruleID).Extract()
 	th.AssertNoErr(t, err)
 
-	expected := &DefaultRule{
+	expected := &defsecrules.DefaultRule{
 		ID:         ruleID,
 		FromPort:   80,
 		ToPort:     80,
@@ -121,6 +122,6 @@
 
 	mockDeleteRuleResponse(t, ruleID)
 
-	err := Delete(client.ServiceClient(), ruleID).ExtractErr()
+	err := defsecrules.Delete(client.ServiceClient(), ruleID).ExtractErr()
 	th.AssertNoErr(t, err)
 }
diff --git a/openstack/compute/v2/extensions/delegate_test.go b/openstack/compute/v2/extensions/delegate_test.go
deleted file mode 100644
index 4c602ce..0000000
--- a/openstack/compute/v2/extensions/delegate_test.go
+++ /dev/null
@@ -1,96 +0,0 @@
-package extensions
-
-import (
-	"fmt"
-	"net/http"
-	"testing"
-
-	common "github.com/gophercloud/gophercloud/openstack/common/extensions"
-	"github.com/gophercloud/gophercloud/pagination"
-	th "github.com/gophercloud/gophercloud/testhelper"
-	"github.com/gophercloud/gophercloud/testhelper/client"
-)
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/extensions", 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, `
-{
-		"extensions": [
-				{
-						"updated": "2013-01-20T00:00:00-00:00",
-						"name": "Neutron Service Type Management",
-						"links": [],
-						"namespace": "http://docs.openstack.org/ext/neutron/service-type/api/v1.0",
-						"alias": "service-type",
-						"description": "API for retrieving service providers for Neutron advanced services"
-				}
-		]
-}
-			`)
-	})
-
-	count := 0
-	List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractExtensions(page)
-		th.AssertNoErr(t, err)
-
-		expected := []common.Extension{
-			common.Extension{
-				Updated:     "2013-01-20T00:00:00-00:00",
-				Name:        "Neutron Service Type Management",
-				Links:       []interface{}{},
-				Namespace:   "http://docs.openstack.org/ext/neutron/service-type/api/v1.0",
-				Alias:       "service-type",
-				Description: "API for retrieving service providers for Neutron advanced services",
-			},
-		}
-		th.AssertDeepEquals(t, expected, actual)
-
-		return true, nil
-	})
-	th.CheckEquals(t, 1, count)
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.Mux.HandleFunc("/extensions/agent", 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")
-		w.WriteHeader(http.StatusOK)
-
-		fmt.Fprintf(w, `
-{
-		"extension": {
-				"updated": "2013-02-03T10:00:00-00:00",
-				"name": "agent",
-				"links": [],
-				"namespace": "http://docs.openstack.org/ext/agent/api/v2.0",
-				"alias": "agent",
-				"description": "The agent management extension."
-		}
-}
-		`)
-	})
-
-	ext, err := Get(client.ServiceClient(), "agent").Extract()
-	th.AssertNoErr(t, err)
-
-	th.AssertEquals(t, ext.Updated, "2013-02-03T10:00:00-00:00")
-	th.AssertEquals(t, ext.Name, "agent")
-	th.AssertEquals(t, ext.Namespace, "http://docs.openstack.org/ext/agent/api/v2.0")
-	th.AssertEquals(t, ext.Alias, "agent")
-	th.AssertEquals(t, ext.Description, "The agent management extension.")
-}
diff --git a/openstack/compute/v2/extensions/diskconfig/testing/doc.go b/openstack/compute/v2/extensions/diskconfig/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/compute/v2/extensions/diskconfig/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/compute/v2/extensions/diskconfig/requests_test.go b/openstack/compute/v2/extensions/diskconfig/testing/requests_test.go
similarity index 81%
rename from openstack/compute/v2/extensions/diskconfig/requests_test.go
rename to openstack/compute/v2/extensions/diskconfig/testing/requests_test.go
index 2e3ae18..6ce560a 100644
--- a/openstack/compute/v2/extensions/diskconfig/requests_test.go
+++ b/openstack/compute/v2/extensions/diskconfig/testing/requests_test.go
@@ -1,8 +1,9 @@
-package diskconfig
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/diskconfig"
 	"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
@@ -14,9 +15,9 @@
 		FlavorRef: "performance1-1",
 	}
 
-	ext := CreateOptsExt{
+	ext := diskconfig.CreateOptsExt{
 		CreateOptsBuilder: base,
-		DiskConfig:        Manual,
+		DiskConfig:        diskconfig.Manual,
 	}
 
 	expected := `
@@ -41,9 +42,9 @@
 		ImageID:   "asdfasdfasdf",
 	}
 
-	ext := RebuildOptsExt{
+	ext := diskconfig.RebuildOptsExt{
 		RebuildOptsBuilder: base,
-		DiskConfig:         Auto,
+		DiskConfig:         diskconfig.Auto,
 	}
 
 	actual, err := ext.ToServerRebuildMap()
@@ -67,9 +68,9 @@
 		FlavorRef: "performance1-8",
 	}
 
-	ext := ResizeOptsExt{
+	ext := diskconfig.ResizeOptsExt{
 		ResizeOptsBuilder: base,
-		DiskConfig:        Auto,
+		DiskConfig:        diskconfig.Auto,
 	}
 
 	actual, err := ext.ToServerResizeMap()
diff --git a/openstack/compute/v2/extensions/floatingips/testing/doc.go b/openstack/compute/v2/extensions/floatingips/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/compute/v2/extensions/floatingips/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/compute/v2/extensions/floatingips/fixtures.go b/openstack/compute/v2/extensions/floatingips/testing/fixtures.go
similarity index 93%
rename from openstack/compute/v2/extensions/floatingips/fixtures.go
rename to openstack/compute/v2/extensions/floatingips/testing/fixtures.go
index b369ea2..e372606 100644
--- a/openstack/compute/v2/extensions/floatingips/fixtures.go
+++ b/openstack/compute/v2/extensions/floatingips/testing/fixtures.go
@@ -1,12 +1,11 @@
-// +build fixtures
-
-package floatingips
+package testing
 
 import (
 	"fmt"
 	"net/http"
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/floatingips"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
 )
@@ -60,14 +59,14 @@
 `
 
 // FirstFloatingIP is the first result in ListOutput.
-var FirstFloatingIP = FloatingIP{
+var FirstFloatingIP = floatingips.FloatingIP{
 	ID:   "1",
 	IP:   "10.10.10.1",
 	Pool: "nova",
 }
 
 // SecondFloatingIP is the first result in ListOutput.
-var SecondFloatingIP = FloatingIP{
+var SecondFloatingIP = floatingips.FloatingIP{
 	FixedIP:    "166.78.185.201",
 	ID:         "2",
 	InstanceID: "4d8c3732-a248-40ed-bebc-539a6ffd25c0",
@@ -77,10 +76,10 @@
 
 // ExpectedFloatingIPsSlice is the slice of results that should be parsed
 // from ListOutput, in the expected order.
-var ExpectedFloatingIPsSlice = []FloatingIP{FirstFloatingIP, SecondFloatingIP}
+var ExpectedFloatingIPsSlice = []floatingips.FloatingIP{FirstFloatingIP, SecondFloatingIP}
 
 // CreatedFloatingIP is the parsed result from CreateOutput.
-var CreatedFloatingIP = FloatingIP{
+var CreatedFloatingIP = floatingips.FloatingIP{
 	ID:   "1",
 	IP:   "10.10.10.1",
 	Pool: "nova",
diff --git a/openstack/compute/v2/extensions/floatingips/requests_test.go b/openstack/compute/v2/extensions/floatingips/testing/requests_test.go
similarity index 60%
rename from openstack/compute/v2/extensions/floatingips/requests_test.go
rename to openstack/compute/v2/extensions/floatingips/testing/requests_test.go
index f0e9560..e53da91 100644
--- a/openstack/compute/v2/extensions/floatingips/requests_test.go
+++ b/openstack/compute/v2/extensions/floatingips/testing/requests_test.go
@@ -1,8 +1,9 @@
-package floatingips
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/floatingips"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
@@ -14,9 +15,9 @@
 	HandleListSuccessfully(t)
 
 	count := 0
-	err := List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+	err := floatingips.List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractFloatingIPs(page)
+		actual, err := floatingips.ExtractFloatingIPs(page)
 		th.AssertNoErr(t, err)
 		th.CheckDeepEquals(t, ExpectedFloatingIPsSlice, actual)
 
@@ -31,7 +32,7 @@
 	defer th.TeardownHTTP()
 	HandleCreateSuccessfully(t)
 
-	actual, err := Create(client.ServiceClient(), CreateOpts{
+	actual, err := floatingips.Create(client.ServiceClient(), floatingips.CreateOpts{
 		Pool: "nova",
 	}).Extract()
 	th.AssertNoErr(t, err)
@@ -43,7 +44,7 @@
 	defer th.TeardownHTTP()
 	HandleGetSuccessfully(t)
 
-	actual, err := Get(client.ServiceClient(), "2").Extract()
+	actual, err := floatingips.Get(client.ServiceClient(), "2").Extract()
 	th.AssertNoErr(t, err)
 	th.CheckDeepEquals(t, &SecondFloatingIP, actual)
 }
@@ -53,7 +54,7 @@
 	defer th.TeardownHTTP()
 	HandleDeleteSuccessfully(t)
 
-	err := Delete(client.ServiceClient(), "1").ExtractErr()
+	err := floatingips.Delete(client.ServiceClient(), "1").ExtractErr()
 	th.AssertNoErr(t, err)
 }
 
@@ -62,11 +63,11 @@
 	defer th.TeardownHTTP()
 	HandleAssociateSuccessfully(t)
 
-	associateOpts := AssociateOpts{
+	associateOpts := floatingips.AssociateOpts{
 		FloatingIP: "10.10.10.2",
 	}
 
-	err := AssociateInstance(client.ServiceClient(), "4d8c3732-a248-40ed-bebc-539a6ffd25c0", associateOpts).ExtractErr()
+	err := floatingips.AssociateInstance(client.ServiceClient(), "4d8c3732-a248-40ed-bebc-539a6ffd25c0", associateOpts).ExtractErr()
 	th.AssertNoErr(t, err)
 }
 
@@ -75,12 +76,12 @@
 	defer th.TeardownHTTP()
 	HandleAssociateFixedSuccessfully(t)
 
-	associateOpts := AssociateOpts{
+	associateOpts := floatingips.AssociateOpts{
 		FloatingIP: "10.10.10.2",
 		FixedIP:    "166.78.185.201",
 	}
 
-	err := AssociateInstance(client.ServiceClient(), "4d8c3732-a248-40ed-bebc-539a6ffd25c0", associateOpts).ExtractErr()
+	err := floatingips.AssociateInstance(client.ServiceClient(), "4d8c3732-a248-40ed-bebc-539a6ffd25c0", associateOpts).ExtractErr()
 	th.AssertNoErr(t, err)
 }
 
@@ -89,10 +90,10 @@
 	defer th.TeardownHTTP()
 	HandleDisassociateSuccessfully(t)
 
-	disassociateOpts := DisassociateOpts{
+	disassociateOpts := floatingips.DisassociateOpts{
 		FloatingIP: "10.10.10.2",
 	}
 
-	err := DisassociateInstance(client.ServiceClient(), "4d8c3732-a248-40ed-bebc-539a6ffd25c0", disassociateOpts).ExtractErr()
+	err := floatingips.DisassociateInstance(client.ServiceClient(), "4d8c3732-a248-40ed-bebc-539a6ffd25c0", disassociateOpts).ExtractErr()
 	th.AssertNoErr(t, err)
 }
diff --git a/openstack/compute/v2/extensions/keypairs/testing/doc.go b/openstack/compute/v2/extensions/keypairs/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/compute/v2/extensions/keypairs/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/compute/v2/extensions/keypairs/fixtures.go b/openstack/compute/v2/extensions/keypairs/testing/fixtures.go
similarity index 96%
rename from openstack/compute/v2/extensions/keypairs/fixtures.go
rename to openstack/compute/v2/extensions/keypairs/testing/fixtures.go
index 62c5db2..dc716d8 100644
--- a/openstack/compute/v2/extensions/keypairs/fixtures.go
+++ b/openstack/compute/v2/extensions/keypairs/testing/fixtures.go
@@ -1,12 +1,11 @@
-// +build fixtures
-
-package keypairs
+package testing
 
 import (
 	"fmt"
 	"net/http"
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
 )
@@ -70,14 +69,14 @@
 `
 
 // FirstKeyPair is the first result in ListOutput.
-var FirstKeyPair = KeyPair{
+var FirstKeyPair = keypairs.KeyPair{
 	Name:        "firstkey",
 	Fingerprint: "15:b0:f8:b3:f9:48:63:71:cf:7b:5b:38:6d:44:2d:4a",
 	PublicKey:   "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC+Eo/RZRngaGTkFs7I62ZjsIlO79KklKbMXi8F+KITD4bVQHHn+kV+4gRgkgCRbdoDqoGfpaDFs877DYX9n4z6FrAIZ4PES8TNKhatifpn9NdQYWA+IkU8CuvlEKGuFpKRi/k7JLos/gHi2hy7QUwgtRvcefvD/vgQZOVw/mGR9Q== Generated by Nova\n",
 }
 
 // SecondKeyPair is the second result in ListOutput.
-var SecondKeyPair = KeyPair{
+var SecondKeyPair = keypairs.KeyPair{
 	Name:        "secondkey",
 	Fingerprint: "35:9d:d0:c3:4a:80:d3:d8:86:f1:ca:f7:df:c4:f9:d8",
 	PublicKey:   "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC9mC3WZN9UGLxgPBpP7H5jZMc6pKwOoSgre8yun6REFktn/Kz7DUt9jaR1UJyRzHxITfCfAIgSxPdGqB/oF1suMyWgu5i0625vavLB5z5kC8Hq3qZJ9zJO1poE1kyD+htiTtPWJ88e12xuH2XB/CZN9OpEiF98hAagiOE0EnOS5Q== Generated by Nova\n",
@@ -85,10 +84,10 @@
 
 // ExpectedKeyPairSlice is the slice of results that should be parsed from ListOutput, in the expected
 // order.
-var ExpectedKeyPairSlice = []KeyPair{FirstKeyPair, SecondKeyPair}
+var ExpectedKeyPairSlice = []keypairs.KeyPair{FirstKeyPair, SecondKeyPair}
 
 // CreatedKeyPair is the parsed result from CreatedOutput.
-var CreatedKeyPair = KeyPair{
+var CreatedKeyPair = keypairs.KeyPair{
 	Name:        "createdkey",
 	Fingerprint: "35:9d:d0:c3:4a:80:d3:d8:86:f1:ca:f7:df:c4:f9:d8",
 	PublicKey:   "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC9mC3WZN9UGLxgPBpP7H5jZMc6pKwOoSgre8yun6REFktn/Kz7DUt9jaR1UJyRzHxITfCfAIgSxPdGqB/oF1suMyWgu5i0625vavLB5z5kC8Hq3qZJ9zJO1poE1kyD+htiTtPWJ88e12xuH2XB/CZN9OpEiF98hAagiOE0EnOS5Q== Generated by Nova\n",
@@ -97,7 +96,7 @@
 }
 
 // ImportedKeyPair is the parsed result from ImportOutput.
-var ImportedKeyPair = KeyPair{
+var ImportedKeyPair = keypairs.KeyPair{
 	Name:        "importedkey",
 	Fingerprint: "1e:2c:9b:56:79:4b:45:77:f9:ca:7a:98:2c:b0:d5:3c",
 	PublicKey:   "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDx8nkQv/zgGgB4rMYmIf+6A4l6Rr+o/6lHBQdW5aYd44bd8JttDCE/F/pNRr0lRE+PiqSPO8nDPHw0010JeMH9gYgnnFlyY3/OcJ02RhIPyyxYpv9FhY+2YiUkpwFOcLImyrxEsYXpD/0d3ac30bNH6Sw9JD9UZHYcpSxsIbECHw== Generated by Nova",
diff --git a/openstack/compute/v2/extensions/keypairs/requests_test.go b/openstack/compute/v2/extensions/keypairs/testing/requests_test.go
similarity index 72%
rename from openstack/compute/v2/extensions/keypairs/requests_test.go
rename to openstack/compute/v2/extensions/keypairs/testing/requests_test.go
index 468e5ea..1e05e66 100644
--- a/openstack/compute/v2/extensions/keypairs/requests_test.go
+++ b/openstack/compute/v2/extensions/keypairs/testing/requests_test.go
@@ -1,8 +1,9 @@
-package keypairs
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
@@ -14,9 +15,9 @@
 	HandleListSuccessfully(t)
 
 	count := 0
-	err := List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+	err := keypairs.List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractKeyPairs(page)
+		actual, err := keypairs.ExtractKeyPairs(page)
 		th.AssertNoErr(t, err)
 		th.CheckDeepEquals(t, ExpectedKeyPairSlice, actual)
 
@@ -31,7 +32,7 @@
 	defer th.TeardownHTTP()
 	HandleCreateSuccessfully(t)
 
-	actual, err := Create(client.ServiceClient(), CreateOpts{
+	actual, err := keypairs.Create(client.ServiceClient(), keypairs.CreateOpts{
 		Name: "createdkey",
 	}).Extract()
 	th.AssertNoErr(t, err)
@@ -43,7 +44,7 @@
 	defer th.TeardownHTTP()
 	HandleImportSuccessfully(t)
 
-	actual, err := Create(client.ServiceClient(), CreateOpts{
+	actual, err := keypairs.Create(client.ServiceClient(), keypairs.CreateOpts{
 		Name:      "importedkey",
 		PublicKey: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDx8nkQv/zgGgB4rMYmIf+6A4l6Rr+o/6lHBQdW5aYd44bd8JttDCE/F/pNRr0lRE+PiqSPO8nDPHw0010JeMH9gYgnnFlyY3/OcJ02RhIPyyxYpv9FhY+2YiUkpwFOcLImyrxEsYXpD/0d3ac30bNH6Sw9JD9UZHYcpSxsIbECHw== Generated by Nova",
 	}).Extract()
@@ -56,7 +57,7 @@
 	defer th.TeardownHTTP()
 	HandleGetSuccessfully(t)
 
-	actual, err := Get(client.ServiceClient(), "firstkey").Extract()
+	actual, err := keypairs.Get(client.ServiceClient(), "firstkey").Extract()
 	th.AssertNoErr(t, err)
 	th.CheckDeepEquals(t, &FirstKeyPair, actual)
 }
@@ -66,6 +67,6 @@
 	defer th.TeardownHTTP()
 	HandleDeleteSuccessfully(t)
 
-	err := Delete(client.ServiceClient(), "deletedkey").ExtractErr()
+	err := keypairs.Delete(client.ServiceClient(), "deletedkey").ExtractErr()
 	th.AssertNoErr(t, err)
 }
diff --git a/openstack/compute/v2/extensions/networks/requests_test.go b/openstack/compute/v2/extensions/networks/requests_test.go
deleted file mode 100644
index 3afc5d5..0000000
--- a/openstack/compute/v2/extensions/networks/requests_test.go
+++ /dev/null
@@ -1,37 +0,0 @@
-package networks
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud/pagination"
-	th "github.com/gophercloud/gophercloud/testhelper"
-	"github.com/gophercloud/gophercloud/testhelper/client"
-)
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	HandleListSuccessfully(t)
-
-	count := 0
-	err := List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		count++
-		actual, err := ExtractNetworks(page)
-		th.AssertNoErr(t, err)
-		th.CheckDeepEquals(t, ExpectedNetworkSlice, actual)
-
-		return true, nil
-	})
-	th.AssertNoErr(t, err)
-	th.CheckEquals(t, 1, count)
-}
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	HandleGetSuccessfully(t)
-
-	actual, err := Get(client.ServiceClient(), "20c8acc0-f747-4d71-a389-46d078ebf000").Extract()
-	th.AssertNoErr(t, err)
-	th.CheckDeepEquals(t, &SecondNetwork, actual)
-}
diff --git a/openstack/compute/v2/extensions/networks/testing/doc.go b/openstack/compute/v2/extensions/networks/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/compute/v2/extensions/networks/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/compute/v2/extensions/networks/fixtures.go b/openstack/compute/v2/extensions/networks/testing/fixtures.go
similarity index 95%
rename from openstack/compute/v2/extensions/networks/fixtures.go
rename to openstack/compute/v2/extensions/networks/testing/fixtures.go
index ffa4282..e2fa49b 100644
--- a/openstack/compute/v2/extensions/networks/fixtures.go
+++ b/openstack/compute/v2/extensions/networks/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package networks
+package testing
 
 import (
 	"fmt"
@@ -9,6 +7,7 @@
 	"time"
 
 	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/networks"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
 )
@@ -114,7 +113,7 @@
 
 // FirstNetwork is the first result in ListOutput.
 var nilTime time.Time
-var FirstNetwork = Network{
+var FirstNetwork = networks.Network{
 	Bridge:            "br100",
 	BridgeInterface:   "eth0",
 	Broadcast:         "10.0.0.7",
@@ -146,7 +145,7 @@
 }
 
 // SecondNetwork is the second result in ListOutput.
-var SecondNetwork = Network{
+var SecondNetwork = networks.Network{
 	Bridge:            "br101",
 	BridgeInterface:   "eth0",
 	Broadcast:         "10.0.0.15",
@@ -179,7 +178,7 @@
 
 // ExpectedNetworkSlice is the slice of results that should be parsed
 // from ListOutput, in the expected order.
-var ExpectedNetworkSlice = []Network{FirstNetwork, SecondNetwork}
+var ExpectedNetworkSlice = []networks.Network{FirstNetwork, SecondNetwork}
 
 // HandleListSuccessfully configures the test server to respond to a List request.
 func HandleListSuccessfully(t *testing.T) {
diff --git a/openstack/compute/v2/extensions/tenantnetworks/requests_test.go b/openstack/compute/v2/extensions/networks/testing/requests_test.go
similarity index 64%
rename from openstack/compute/v2/extensions/tenantnetworks/requests_test.go
rename to openstack/compute/v2/extensions/networks/testing/requests_test.go
index e8726c4..36b5463 100644
--- a/openstack/compute/v2/extensions/tenantnetworks/requests_test.go
+++ b/openstack/compute/v2/extensions/networks/testing/requests_test.go
@@ -1,8 +1,9 @@
-package tenantnetworks
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/networks"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
@@ -14,9 +15,9 @@
 	HandleListSuccessfully(t)
 
 	count := 0
-	err := List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+	err := networks.List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractNetworks(page)
+		actual, err := networks.ExtractNetworks(page)
 		th.AssertNoErr(t, err)
 		th.CheckDeepEquals(t, ExpectedNetworkSlice, actual)
 
@@ -31,7 +32,7 @@
 	defer th.TeardownHTTP()
 	HandleGetSuccessfully(t)
 
-	actual, err := Get(client.ServiceClient(), "20c8acc0-f747-4d71-a389-46d078ebf000").Extract()
+	actual, err := networks.Get(client.ServiceClient(), "20c8acc0-f747-4d71-a389-46d078ebf000").Extract()
 	th.AssertNoErr(t, err)
 	th.CheckDeepEquals(t, &SecondNetwork, actual)
 }
diff --git a/openstack/compute/v2/extensions/quotasets/requests.go b/openstack/compute/v2/extensions/quotasets/requests.go
index 52f0839..76beb17 100644
--- a/openstack/compute/v2/extensions/quotasets/requests.go
+++ b/openstack/compute/v2/extensions/quotasets/requests.go
@@ -1,7 +1,7 @@
 package quotasets
 
 import (
-	"github.com/rackspace/gophercloud"
+	"github.com/gophercloud/gophercloud"
 )
 
 // Get returns public data about a previously created QuotaSet.
diff --git a/openstack/compute/v2/extensions/quotasets/requests_test.go b/openstack/compute/v2/extensions/quotasets/requests_test.go
deleted file mode 100644
index 5d766fa..0000000
--- a/openstack/compute/v2/extensions/quotasets/requests_test.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package quotasets
-
-import (
-	th "github.com/rackspace/gophercloud/testhelper"
-	"github.com/rackspace/gophercloud/testhelper/client"
-	"testing"
-)
-
-func TestGet(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	HandleGetSuccessfully(t)
-	actual, err := Get(client.ServiceClient(), FirstTenantID).Extract()
-	th.AssertNoErr(t, err)
-	th.CheckDeepEquals(t, &FirstQuotaSet, actual)
-}
diff --git a/openstack/compute/v2/extensions/quotasets/results.go b/openstack/compute/v2/extensions/quotasets/results.go
index cbf4d6b..f6c4e5a 100644
--- a/openstack/compute/v2/extensions/quotasets/results.go
+++ b/openstack/compute/v2/extensions/quotasets/results.go
@@ -1,39 +1,38 @@
 package quotasets
 
 import (
-	"github.com/mitchellh/mapstructure"
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/pagination"
+	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/pagination"
 )
 
 // QuotaSet is a set of operational limits that allow for control of compute usage.
 type QuotaSet struct {
 	//ID is tenant associated with this quota_set
-	ID string `mapstructure:"id"`
+	ID string `json:"id"`
 	//FixedIps is number of fixed ips alloted this quota_set
-	FixedIps int `mapstructure:"fixed_ips"`
+	FixedIps int `json:"fixed_ips"`
 	// FloatingIps is number of floating ips alloted this quota_set
-	FloatingIps int `mapstructure:"floating_ips"`
+	FloatingIps int `json:"floating_ips"`
 	// InjectedFileContentBytes is content bytes allowed for each injected file
-	InjectedFileContentBytes int `mapstructure:"injected_file_content_bytes"`
+	InjectedFileContentBytes int `json:"injected_file_content_bytes"`
 	// InjectedFilePathBytes is allowed bytes for each injected file path
-	InjectedFilePathBytes int `mapstructure:"injected_file_path_bytes"`
+	InjectedFilePathBytes int `json:"injected_file_path_bytes"`
 	// InjectedFiles is injected files allowed for each project
-	InjectedFiles int `mapstructure:"injected_files"`
+	InjectedFiles int `json:"injected_files"`
 	// KeyPairs is number of ssh keypairs
-	KeyPairs int `mapstructure:"keypairs"`
+	KeyPairs int `json:"keypairs"`
 	// MetadataItems is number of metadata items allowed for each instance
-	MetadataItems int `mapstructure:"metadata_items"`
+	MetadataItems int `json:"metadata_items"`
 	// Ram is megabytes allowed for each instance
-	Ram int `mapstructure:"ram"`
+	Ram int `json:"ram"`
 	// SecurityGroupRules is rules allowed for each security group
-	SecurityGroupRules int `mapstructure:"security_group_rules"`
+	SecurityGroupRules int `json:"security_group_rules"`
 	// SecurityGroups security groups allowed for each project
-	SecurityGroups int `mapstructure:"security_groups"`
+	SecurityGroups int `json:"security_groups"`
 	// Cores is number of instance cores allowed for each project
-	Cores int `mapstructure:"cores"`
+	Cores int `json:"cores"`
 	// Instances is number of instances allowed for each project
-	Instances int `mapstructure:"instances"`
+	Instances int `json:"instances"`
 }
 
 // QuotaSetPage stores a single, only page of QuotaSet results from a List call.
@@ -48,17 +47,12 @@
 }
 
 // ExtractQuotaSets interprets a page of results as a slice of QuotaSets.
-func ExtractQuotaSets(page pagination.Page) ([]QuotaSet, error) {
-	var resp struct {
-		QuotaSets []QuotaSet `mapstructure:"quotas"`
+func ExtractQuotaSets(r pagination.Page) ([]QuotaSet, error) {
+	var s struct {
+		QuotaSets []QuotaSet `json:"quotas"`
 	}
-
-	err := mapstructure.Decode(page.(QuotaSetPage).Body, &resp)
-	results := make([]QuotaSet, len(resp.QuotaSets))
-	for i, q := range resp.QuotaSets {
-		results[i] = q
-	}
-	return results, err
+	err := (r.(QuotaSetPage)).ExtractInto(&s)
+	return s.QuotaSets, err
 }
 
 type quotaResult struct {
@@ -67,16 +61,11 @@
 
 // Extract is a method that attempts to interpret any QuotaSet resource response as a QuotaSet struct.
 func (r quotaResult) Extract() (*QuotaSet, error) {
-	if r.Err != nil {
-		return nil, r.Err
+	var s struct {
+		QuotaSet *QuotaSet `json:"quota_set"`
 	}
-
-	var res struct {
-		QuotaSet *QuotaSet `json:"quota_set" mapstructure:"quota_set"`
-	}
-
-	err := mapstructure.Decode(r.Body, &res)
-	return res.QuotaSet, err
+	err := r.ExtractInto(&s)
+	return s.QuotaSet, err
 }
 
 // GetResult is the response from a Get operation. Call its Extract method to interpret it
diff --git a/openstack/compute/v2/extensions/quotasets/testing/doc.go b/openstack/compute/v2/extensions/quotasets/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/compute/v2/extensions/quotasets/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/compute/v2/extensions/quotasets/fixtures.go b/openstack/compute/v2/extensions/quotasets/testing/fixtures.go
similarity index 84%
rename from openstack/compute/v2/extensions/quotasets/fixtures.go
rename to openstack/compute/v2/extensions/quotasets/testing/fixtures.go
index c1bb4ea..3fef872 100644
--- a/openstack/compute/v2/extensions/quotasets/fixtures.go
+++ b/openstack/compute/v2/extensions/quotasets/testing/fixtures.go
@@ -1,14 +1,13 @@
-// +build fixtures
-
-package quotasets
+package testing
 
 import (
 	"fmt"
 	"net/http"
 	"testing"
 
-	th "github.com/rackspace/gophercloud/testhelper"
-	"github.com/rackspace/gophercloud/testhelper/client"
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/quotasets"
+	th "github.com/gophercloud/gophercloud/testhelper"
+	"github.com/gophercloud/gophercloud/testhelper/client"
 )
 
 // GetOutput is a sample response to a Get call.
@@ -32,7 +31,7 @@
 const FirstTenantID = "555544443333222211110000ffffeeee"
 
 // FirstQuotaSet is the first result in ListOutput.
-var FirstQuotaSet = QuotaSet{
+var FirstQuotaSet = quotasets.QuotaSet{
 	FixedIps:                 0,
 	FloatingIps:              0,
 	InjectedFileContentBytes: 10240,
diff --git a/openstack/compute/v2/extensions/quotasets/testing/requests_test.go b/openstack/compute/v2/extensions/quotasets/testing/requests_test.go
new file mode 100644
index 0000000..8fc1fd4
--- /dev/null
+++ b/openstack/compute/v2/extensions/quotasets/testing/requests_test.go
@@ -0,0 +1,18 @@
+package testing
+
+import (
+	"testing"
+
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/quotasets"
+	th "github.com/gophercloud/gophercloud/testhelper"
+	"github.com/gophercloud/gophercloud/testhelper/client"
+)
+
+func TestGet(t *testing.T) {
+	th.SetupHTTP()
+	defer th.TeardownHTTP()
+	HandleGetSuccessfully(t)
+	actual, err := quotasets.Get(client.ServiceClient(), FirstTenantID).Extract()
+	th.AssertNoErr(t, err)
+	th.CheckDeepEquals(t, &FirstQuotaSet, actual)
+}
diff --git a/openstack/compute/v2/extensions/quotasets/urls.go b/openstack/compute/v2/extensions/quotasets/urls.go
index c04d941..e910376 100644
--- a/openstack/compute/v2/extensions/quotasets/urls.go
+++ b/openstack/compute/v2/extensions/quotasets/urls.go
@@ -1,6 +1,6 @@
 package quotasets
 
-import "github.com/rackspace/gophercloud"
+import "github.com/gophercloud/gophercloud"
 
 const resourcePath = "os-quota-sets"
 
diff --git a/openstack/compute/v2/extensions/quotasets/urls_test.go b/openstack/compute/v2/extensions/quotasets/urls_test.go
deleted file mode 100644
index f19a6ad..0000000
--- a/openstack/compute/v2/extensions/quotasets/urls_test.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package quotasets
-
-import (
-	"testing"
-
-	th "github.com/rackspace/gophercloud/testhelper"
-	"github.com/rackspace/gophercloud/testhelper/client"
-)
-
-func TestGetURL(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	c := client.ServiceClient()
-
-	th.CheckEquals(t, c.Endpoint+"os-quota-sets/wat", getURL(c, "wat"))
-}
diff --git a/openstack/compute/v2/extensions/schedulerhints/testing/doc.go b/openstack/compute/v2/extensions/schedulerhints/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/compute/v2/extensions/schedulerhints/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/compute/v2/extensions/schedulerhints/requests_test.go b/openstack/compute/v2/extensions/schedulerhints/testing/requests_test.go
similarity index 91%
rename from openstack/compute/v2/extensions/schedulerhints/requests_test.go
rename to openstack/compute/v2/extensions/schedulerhints/testing/requests_test.go
index 605b72b..cf21c4e 100644
--- a/openstack/compute/v2/extensions/schedulerhints/requests_test.go
+++ b/openstack/compute/v2/extensions/schedulerhints/testing/requests_test.go
@@ -1,8 +1,9 @@
-package schedulerhints
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/schedulerhints"
 	"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
@@ -14,7 +15,7 @@
 		FlavorRef: "performance1-1",
 	}
 
-	schedulerHints := SchedulerHints{
+	schedulerHints := schedulerhints.SchedulerHints{
 		Group: "101aed42-22d9-4a3e-9ba1-21103b0d1aba",
 		DifferentHost: []string{
 			"a0cf03a5-d921-4877-bb5c-86d26cf818e1",
@@ -29,7 +30,7 @@
 		BuildNearHostIP: "192.168.1.1/24",
 	}
 
-	ext := CreateOptsExt{
+	ext := schedulerhints.CreateOptsExt{
 		CreateOptsBuilder: base,
 		SchedulerHints:    schedulerHints,
 	}
@@ -72,7 +73,7 @@
 		FlavorRef: "performance1-1",
 	}
 
-	schedulerHints := SchedulerHints{
+	schedulerHints := schedulerhints.SchedulerHints{
 		Group: "101aed42-22d9-4a3e-9ba1-21103b0d1aba",
 		DifferentHost: []string{
 			"a0cf03a5-d921-4877-bb5c-86d26cf818e1",
@@ -87,7 +88,7 @@
 		BuildNearHostIP: "192.168.1.1/24",
 	}
 
-	ext := CreateOptsExt{
+	ext := schedulerhints.CreateOptsExt{
 		CreateOptsBuilder: base,
 		SchedulerHints:    schedulerHints,
 	}
diff --git a/openstack/compute/v2/extensions/secgroups/testing/doc.go b/openstack/compute/v2/extensions/secgroups/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/compute/v2/extensions/secgroups/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/compute/v2/extensions/secgroups/fixtures.go b/openstack/compute/v2/extensions/secgroups/testing/fixtures.go
similarity index 99%
rename from openstack/compute/v2/extensions/secgroups/fixtures.go
rename to openstack/compute/v2/extensions/secgroups/testing/fixtures.go
index e4ca587..8a83ca8 100644
--- a/openstack/compute/v2/extensions/secgroups/fixtures.go
+++ b/openstack/compute/v2/extensions/secgroups/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package secgroups
+package testing
 
 import (
 	"fmt"
diff --git a/openstack/compute/v2/extensions/secgroups/requests_test.go b/openstack/compute/v2/extensions/secgroups/testing/requests_test.go
similarity index 65%
rename from openstack/compute/v2/extensions/secgroups/requests_test.go
rename to openstack/compute/v2/extensions/secgroups/testing/requests_test.go
index bdbedcd..b7ffa20 100644
--- a/openstack/compute/v2/extensions/secgroups/requests_test.go
+++ b/openstack/compute/v2/extensions/secgroups/testing/requests_test.go
@@ -1,8 +1,9 @@
-package secgroups
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/secgroups"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
@@ -22,20 +23,20 @@
 
 	count := 0
 
-	err := List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+	err := secgroups.List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractSecurityGroups(page)
+		actual, err := secgroups.ExtractSecurityGroups(page)
 		if err != nil {
 			t.Errorf("Failed to extract users: %v", err)
 			return false, err
 		}
 
-		expected := []SecurityGroup{
-			SecurityGroup{
+		expected := []secgroups.SecurityGroup{
+			{
 				ID:          groupID,
 				Description: "default",
 				Name:        "default",
-				Rules:       []Rule{},
+				Rules:       []secgroups.Rule{},
 				TenantID:    "openstack",
 			},
 		}
@@ -57,20 +58,20 @@
 
 	count := 0
 
-	err := ListByServer(client.ServiceClient(), serverID).EachPage(func(page pagination.Page) (bool, error) {
+	err := secgroups.ListByServer(client.ServiceClient(), serverID).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractSecurityGroups(page)
+		actual, err := secgroups.ExtractSecurityGroups(page)
 		if err != nil {
 			t.Errorf("Failed to extract users: %v", err)
 			return false, err
 		}
 
-		expected := []SecurityGroup{
-			SecurityGroup{
+		expected := []secgroups.SecurityGroup{
+			{
 				ID:          groupID,
 				Description: "default",
 				Name:        "default",
-				Rules:       []Rule{},
+				Rules:       []secgroups.Rule{},
 				TenantID:    "openstack",
 			},
 		}
@@ -90,20 +91,20 @@
 
 	mockCreateGroupResponse(t)
 
-	opts := CreateOpts{
+	opts := secgroups.CreateOpts{
 		Name:        "test",
 		Description: "something",
 	}
 
-	group, err := Create(client.ServiceClient(), opts).Extract()
+	group, err := secgroups.Create(client.ServiceClient(), opts).Extract()
 	th.AssertNoErr(t, err)
 
-	expected := &SecurityGroup{
+	expected := &secgroups.SecurityGroup{
 		ID:          groupID,
 		Name:        "test",
 		Description: "something",
 		TenantID:    "openstack",
-		Rules:       []Rule{},
+		Rules:       []secgroups.Rule{},
 	}
 	th.AssertDeepEquals(t, expected, group)
 }
@@ -114,20 +115,20 @@
 
 	mockUpdateGroupResponse(t, groupID)
 
-	opts := UpdateOpts{
+	opts := secgroups.UpdateOpts{
 		Name:        "new_name",
 		Description: "new_desc",
 	}
 
-	group, err := Update(client.ServiceClient(), groupID, opts).Extract()
+	group, err := secgroups.Update(client.ServiceClient(), groupID, opts).Extract()
 	th.AssertNoErr(t, err)
 
-	expected := &SecurityGroup{
+	expected := &secgroups.SecurityGroup{
 		ID:          groupID,
 		Name:        "new_name",
 		Description: "something",
 		TenantID:    "openstack",
-		Rules:       []Rule{},
+		Rules:       []secgroups.Rule{},
 	}
 	th.AssertDeepEquals(t, expected, group)
 }
@@ -138,21 +139,21 @@
 
 	mockGetGroupsResponse(t, groupID)
 
-	group, err := Get(client.ServiceClient(), groupID).Extract()
+	group, err := secgroups.Get(client.ServiceClient(), groupID).Extract()
 	th.AssertNoErr(t, err)
 
-	expected := &SecurityGroup{
+	expected := &secgroups.SecurityGroup{
 		ID:          groupID,
 		Description: "default",
 		Name:        "default",
 		TenantID:    "openstack",
-		Rules: []Rule{
-			Rule{
+		Rules: []secgroups.Rule{
+			{
 				FromPort:      80,
 				ToPort:        85,
 				IPProtocol:    "TCP",
-				IPRange:       IPRange{CIDR: "0.0.0.0"},
-				Group:         Group{TenantID: "openstack", Name: "default"},
+				IPRange:       secgroups.IPRange{CIDR: "0.0.0.0"},
+				Group:         secgroups.Group{TenantID: "openstack", Name: "default"},
 				ParentGroupID: groupID,
 				ID:            ruleID,
 			},
@@ -170,10 +171,10 @@
 
 	mockGetNumericIDGroupResponse(t, numericGroupID)
 
-	group, err := Get(client.ServiceClient(), "12345").Extract()
+	group, err := secgroups.Get(client.ServiceClient(), "12345").Extract()
 	th.AssertNoErr(t, err)
 
-	expected := &SecurityGroup{ID: "12345"}
+	expected := &secgroups.SecurityGroup{ID: "12345"}
 	th.AssertDeepEquals(t, expected, group)
 }
 
@@ -183,7 +184,7 @@
 
 	mockDeleteGroupResponse(t, groupID)
 
-	err := Delete(client.ServiceClient(), groupID).ExtractErr()
+	err := secgroups.Delete(client.ServiceClient(), groupID).ExtractErr()
 	th.AssertNoErr(t, err)
 }
 
@@ -193,7 +194,7 @@
 
 	mockAddRuleResponse(t)
 
-	opts := CreateRuleOpts{
+	opts := secgroups.CreateRuleOpts{
 		ParentGroupID: groupID,
 		FromPort:      22,
 		ToPort:        22,
@@ -201,16 +202,16 @@
 		CIDR:          "0.0.0.0/0",
 	}
 
-	rule, err := CreateRule(client.ServiceClient(), opts).Extract()
+	rule, err := secgroups.CreateRule(client.ServiceClient(), opts).Extract()
 	th.AssertNoErr(t, err)
 
-	expected := &Rule{
+	expected := &secgroups.Rule{
 		FromPort:      22,
 		ToPort:        22,
-		Group:         Group{},
+		Group:         secgroups.Group{},
 		IPProtocol:    "TCP",
 		ParentGroupID: groupID,
-		IPRange:       IPRange{CIDR: "0.0.0.0/0"},
+		IPRange:       secgroups.IPRange{CIDR: "0.0.0.0/0"},
 		ID:            ruleID,
 	}
 
@@ -223,7 +224,7 @@
 
 	mockAddRuleResponseICMPZero(t)
 
-	opts := CreateRuleOpts{
+	opts := secgroups.CreateRuleOpts{
 		ParentGroupID: groupID,
 		FromPort:      0,
 		ToPort:        0,
@@ -231,16 +232,16 @@
 		CIDR:          "0.0.0.0/0",
 	}
 
-	rule, err := CreateRule(client.ServiceClient(), opts).Extract()
+	rule, err := secgroups.CreateRule(client.ServiceClient(), opts).Extract()
 	th.AssertNoErr(t, err)
 
-	expected := &Rule{
+	expected := &secgroups.Rule{
 		FromPort:      0,
 		ToPort:        0,
-		Group:         Group{},
+		Group:         secgroups.Group{},
 		IPProtocol:    "ICMP",
 		ParentGroupID: groupID,
-		IPRange:       IPRange{CIDR: "0.0.0.0/0"},
+		IPRange:       secgroups.IPRange{CIDR: "0.0.0.0/0"},
 		ID:            ruleID,
 	}
 
@@ -253,7 +254,7 @@
 
 	mockDeleteRuleResponse(t, ruleID)
 
-	err := DeleteRule(client.ServiceClient(), ruleID).ExtractErr()
+	err := secgroups.DeleteRule(client.ServiceClient(), ruleID).ExtractErr()
 	th.AssertNoErr(t, err)
 }
 
@@ -263,7 +264,7 @@
 
 	mockAddServerToGroupResponse(t, serverID)
 
-	err := AddServer(client.ServiceClient(), serverID, "test").ExtractErr()
+	err := secgroups.AddServer(client.ServiceClient(), serverID, "test").ExtractErr()
 	th.AssertNoErr(t, err)
 }
 
@@ -273,6 +274,6 @@
 
 	mockRemoveServerFromGroupResponse(t, serverID)
 
-	err := RemoveServer(client.ServiceClient(), serverID, "test").ExtractErr()
+	err := secgroups.RemoveServer(client.ServiceClient(), serverID, "test").ExtractErr()
 	th.AssertNoErr(t, err)
 }
diff --git a/openstack/compute/v2/extensions/servergroups/testing/doc.go b/openstack/compute/v2/extensions/servergroups/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/compute/v2/extensions/servergroups/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/compute/v2/extensions/servergroups/fixtures.go b/openstack/compute/v2/extensions/servergroups/testing/fixtures.go
similarity index 91%
rename from openstack/compute/v2/extensions/servergroups/fixtures.go
rename to openstack/compute/v2/extensions/servergroups/testing/fixtures.go
index 003e9aa..b53757a 100644
--- a/openstack/compute/v2/extensions/servergroups/fixtures.go
+++ b/openstack/compute/v2/extensions/servergroups/testing/fixtures.go
@@ -1,12 +1,11 @@
-// +build fixtures
-
-package servergroups
+package testing
 
 import (
 	"fmt"
 	"net/http"
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/servergroups"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
 )
@@ -68,7 +67,7 @@
 `
 
 // FirstServerGroup is the first result in ListOutput.
-var FirstServerGroup = ServerGroup{
+var FirstServerGroup = servergroups.ServerGroup{
 	ID:   "616fb98f-46ca-475e-917e-2563e5a8cd19",
 	Name: "test",
 	Policies: []string{
@@ -79,7 +78,7 @@
 }
 
 // SecondServerGroup is the second result in ListOutput.
-var SecondServerGroup = ServerGroup{
+var SecondServerGroup = servergroups.ServerGroup{
 	ID:   "4d8c3732-a248-40ed-bebc-539a6ffd25c0",
 	Name: "test2",
 	Policies: []string{
@@ -91,10 +90,10 @@
 
 // ExpectedServerGroupSlice is the slice of results that should be parsed
 // from ListOutput, in the expected order.
-var ExpectedServerGroupSlice = []ServerGroup{FirstServerGroup, SecondServerGroup}
+var ExpectedServerGroupSlice = []servergroups.ServerGroup{FirstServerGroup, SecondServerGroup}
 
 // CreatedServerGroup is the parsed result from CreateOutput.
-var CreatedServerGroup = ServerGroup{
+var CreatedServerGroup = servergroups.ServerGroup{
 	ID:   "616fb98f-46ca-475e-917e-2563e5a8cd19",
 	Name: "test",
 	Policies: []string{
diff --git a/openstack/compute/v2/extensions/servergroups/requests_test.go b/openstack/compute/v2/extensions/servergroups/testing/requests_test.go
similarity index 64%
rename from openstack/compute/v2/extensions/servergroups/requests_test.go
rename to openstack/compute/v2/extensions/servergroups/testing/requests_test.go
index 458526a..d86fa56 100644
--- a/openstack/compute/v2/extensions/servergroups/requests_test.go
+++ b/openstack/compute/v2/extensions/servergroups/testing/requests_test.go
@@ -1,8 +1,9 @@
-package servergroups
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/servergroups"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
@@ -14,9 +15,9 @@
 	HandleListSuccessfully(t)
 
 	count := 0
-	err := List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+	err := servergroups.List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractServerGroups(page)
+		actual, err := servergroups.ExtractServerGroups(page)
 		th.AssertNoErr(t, err)
 		th.CheckDeepEquals(t, ExpectedServerGroupSlice, actual)
 
@@ -31,7 +32,7 @@
 	defer th.TeardownHTTP()
 	HandleCreateSuccessfully(t)
 
-	actual, err := Create(client.ServiceClient(), CreateOpts{
+	actual, err := servergroups.Create(client.ServiceClient(), servergroups.CreateOpts{
 		Name:     "test",
 		Policies: []string{"anti-affinity"},
 	}).Extract()
@@ -44,7 +45,7 @@
 	defer th.TeardownHTTP()
 	HandleGetSuccessfully(t)
 
-	actual, err := Get(client.ServiceClient(), "4d8c3732-a248-40ed-bebc-539a6ffd25c0").Extract()
+	actual, err := servergroups.Get(client.ServiceClient(), "4d8c3732-a248-40ed-bebc-539a6ffd25c0").Extract()
 	th.AssertNoErr(t, err)
 	th.CheckDeepEquals(t, &FirstServerGroup, actual)
 }
@@ -54,6 +55,6 @@
 	defer th.TeardownHTTP()
 	HandleDeleteSuccessfully(t)
 
-	err := Delete(client.ServiceClient(), "616fb98f-46ca-475e-917e-2563e5a8cd19").ExtractErr()
+	err := servergroups.Delete(client.ServiceClient(), "616fb98f-46ca-475e-917e-2563e5a8cd19").ExtractErr()
 	th.AssertNoErr(t, err)
 }
diff --git a/openstack/compute/v2/extensions/startstop/testing/doc.go b/openstack/compute/v2/extensions/startstop/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/compute/v2/extensions/startstop/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/compute/v2/extensions/startstop/fixtures.go b/openstack/compute/v2/extensions/startstop/testing/fixtures.go
similarity index 95%
rename from openstack/compute/v2/extensions/startstop/fixtures.go
rename to openstack/compute/v2/extensions/startstop/testing/fixtures.go
index c5b4290..1086b0e 100644
--- a/openstack/compute/v2/extensions/startstop/fixtures.go
+++ b/openstack/compute/v2/extensions/startstop/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package startstop
+package testing
 
 import (
 	"net/http"
diff --git a/openstack/compute/v2/extensions/startstop/requests_test.go b/openstack/compute/v2/extensions/startstop/testing/requests_test.go
similarity index 65%
rename from openstack/compute/v2/extensions/startstop/requests_test.go
rename to openstack/compute/v2/extensions/startstop/testing/requests_test.go
index c7e26ae..be45bf5 100644
--- a/openstack/compute/v2/extensions/startstop/requests_test.go
+++ b/openstack/compute/v2/extensions/startstop/testing/requests_test.go
@@ -1,8 +1,9 @@
-package startstop
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/startstop"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
 )
@@ -15,7 +16,7 @@
 
 	mockStartServerResponse(t, serverID)
 
-	err := Start(client.ServiceClient(), serverID).ExtractErr()
+	err := startstop.Start(client.ServiceClient(), serverID).ExtractErr()
 	th.AssertNoErr(t, err)
 }
 
@@ -25,6 +26,6 @@
 
 	mockStopServerResponse(t, serverID)
 
-	err := Stop(client.ServiceClient(), serverID).ExtractErr()
+	err := startstop.Stop(client.ServiceClient(), serverID).ExtractErr()
 	th.AssertNoErr(t, err)
 }
diff --git a/openstack/compute/v2/extensions/tenantnetworks/testing/doc.go b/openstack/compute/v2/extensions/tenantnetworks/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/compute/v2/extensions/tenantnetworks/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/compute/v2/extensions/tenantnetworks/fixtures.go b/openstack/compute/v2/extensions/tenantnetworks/testing/fixtures.go
similarity index 87%
rename from openstack/compute/v2/extensions/tenantnetworks/fixtures.go
rename to openstack/compute/v2/extensions/tenantnetworks/testing/fixtures.go
index 52fa013..ae679b4 100644
--- a/openstack/compute/v2/extensions/tenantnetworks/fixtures.go
+++ b/openstack/compute/v2/extensions/tenantnetworks/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package tenantnetworks
+package testing
 
 import (
 	"fmt"
@@ -8,6 +6,7 @@
 	"testing"
 	"time"
 
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/tenantnetworks"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
 )
@@ -43,14 +42,14 @@
 
 // FirstNetwork is the first result in ListOutput.
 var nilTime time.Time
-var FirstNetwork = Network{
+var FirstNetwork = tenantnetworks.Network{
 	CIDR: "10.0.0.0/29",
 	ID:   "20c8acc0-f747-4d71-a389-46d078ebf047",
 	Name: "mynet_0",
 }
 
 // SecondNetwork is the second result in ListOutput.
-var SecondNetwork = Network{
+var SecondNetwork = tenantnetworks.Network{
 	CIDR: "10.0.0.10/29",
 	ID:   "20c8acc0-f747-4d71-a389-46d078ebf000",
 	Name: "mynet_1",
@@ -58,7 +57,7 @@
 
 // ExpectedNetworkSlice is the slice of results that should be parsed
 // from ListOutput, in the expected order.
-var ExpectedNetworkSlice = []Network{FirstNetwork, SecondNetwork}
+var ExpectedNetworkSlice = []tenantnetworks.Network{FirstNetwork, SecondNetwork}
 
 // HandleListSuccessfully configures the test server to respond to a List request.
 func HandleListSuccessfully(t *testing.T) {
diff --git a/openstack/compute/v2/extensions/tenantnetworks/requests_test.go b/openstack/compute/v2/extensions/tenantnetworks/testing/requests_test.go
similarity index 63%
copy from openstack/compute/v2/extensions/tenantnetworks/requests_test.go
copy to openstack/compute/v2/extensions/tenantnetworks/testing/requests_test.go
index e8726c4..703c846 100644
--- a/openstack/compute/v2/extensions/tenantnetworks/requests_test.go
+++ b/openstack/compute/v2/extensions/tenantnetworks/testing/requests_test.go
@@ -1,8 +1,9 @@
-package tenantnetworks
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/tenantnetworks"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
@@ -14,9 +15,9 @@
 	HandleListSuccessfully(t)
 
 	count := 0
-	err := List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+	err := tenantnetworks.List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractNetworks(page)
+		actual, err := tenantnetworks.ExtractNetworks(page)
 		th.AssertNoErr(t, err)
 		th.CheckDeepEquals(t, ExpectedNetworkSlice, actual)
 
@@ -31,7 +32,7 @@
 	defer th.TeardownHTTP()
 	HandleGetSuccessfully(t)
 
-	actual, err := Get(client.ServiceClient(), "20c8acc0-f747-4d71-a389-46d078ebf000").Extract()
+	actual, err := tenantnetworks.Get(client.ServiceClient(), "20c8acc0-f747-4d71-a389-46d078ebf000").Extract()
 	th.AssertNoErr(t, err)
 	th.CheckDeepEquals(t, &SecondNetwork, actual)
 }
diff --git a/openstack/compute/v2/extensions/testing/delegate_test.go b/openstack/compute/v2/extensions/testing/delegate_test.go
new file mode 100644
index 0000000..822093f
--- /dev/null
+++ b/openstack/compute/v2/extensions/testing/delegate_test.go
@@ -0,0 +1,56 @@
+package testing
+
+import (
+	"testing"
+
+	common "github.com/gophercloud/gophercloud/openstack/common/extensions"
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions"
+	"github.com/gophercloud/gophercloud/pagination"
+	th "github.com/gophercloud/gophercloud/testhelper"
+	"github.com/gophercloud/gophercloud/testhelper/client"
+)
+
+func TestList(t *testing.T) {
+	th.SetupHTTP()
+	defer th.TeardownHTTP()
+
+	HandleListExtensionsSuccessfully(t)
+
+	count := 0
+	extensions.List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+		count++
+		actual, err := extensions.ExtractExtensions(page)
+		th.AssertNoErr(t, err)
+
+		expected := []common.Extension{
+			common.Extension{
+				Updated:     "2013-01-20T00:00:00-00:00",
+				Name:        "Neutron Service Type Management",
+				Links:       []interface{}{},
+				Namespace:   "http://docs.openstack.org/ext/neutron/service-type/api/v1.0",
+				Alias:       "service-type",
+				Description: "API for retrieving service providers for Neutron advanced services",
+			},
+		}
+		th.AssertDeepEquals(t, expected, actual)
+
+		return true, nil
+	})
+	th.CheckEquals(t, 1, count)
+}
+
+func TestGet(t *testing.T) {
+	th.SetupHTTP()
+	defer th.TeardownHTTP()
+
+	HandleGetExtensionsSuccessfully(t)
+
+	ext, err := extensions.Get(client.ServiceClient(), "agent").Extract()
+	th.AssertNoErr(t, err)
+
+	th.AssertEquals(t, ext.Updated, "2013-02-03T10:00:00-00:00")
+	th.AssertEquals(t, ext.Name, "agent")
+	th.AssertEquals(t, ext.Namespace, "http://docs.openstack.org/ext/agent/api/v2.0")
+	th.AssertEquals(t, ext.Alias, "agent")
+	th.AssertEquals(t, ext.Description, "The agent management extension.")
+}
diff --git a/openstack/compute/v2/extensions/testing/doc.go b/openstack/compute/v2/extensions/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/compute/v2/extensions/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/compute/v2/extensions/testing/fixtures.go b/openstack/compute/v2/extensions/testing/fixtures.go
new file mode 100644
index 0000000..2a3fb69
--- /dev/null
+++ b/openstack/compute/v2/extensions/testing/fixtures.go
@@ -0,0 +1,57 @@
+package testing
+
+import (
+	"fmt"
+	"net/http"
+	"testing"
+
+	th "github.com/gophercloud/gophercloud/testhelper"
+	"github.com/gophercloud/gophercloud/testhelper/client"
+)
+
+func HandleListExtensionsSuccessfully(t *testing.T) {
+	th.Mux.HandleFunc("/extensions", 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, `
+{
+		"extensions": [
+				{
+						"updated": "2013-01-20T00:00:00-00:00",
+						"name": "Neutron Service Type Management",
+						"links": [],
+						"namespace": "http://docs.openstack.org/ext/neutron/service-type/api/v1.0",
+						"alias": "service-type",
+						"description": "API for retrieving service providers for Neutron advanced services"
+				}
+		]
+}
+			`)
+	})
+}
+
+func HandleGetExtensionsSuccessfully(t *testing.T) {
+	th.Mux.HandleFunc("/extensions/agent", 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")
+		w.WriteHeader(http.StatusOK)
+
+		fmt.Fprintf(w, `
+{
+		"extension": {
+				"updated": "2013-02-03T10:00:00-00:00",
+				"name": "agent",
+				"links": [],
+				"namespace": "http://docs.openstack.org/ext/agent/api/v2.0",
+				"alias": "agent",
+				"description": "The agent management extension."
+		}
+}
+		`)
+	})
+}
diff --git a/openstack/compute/v2/extensions/volumeattach/testing/fixtures.go b/openstack/compute/v2/extensions/volumeattach/testing/fixtures.go
index f662852..4f99610 100644
--- a/openstack/compute/v2/extensions/volumeattach/testing/fixtures.go
+++ b/openstack/compute/v2/extensions/volumeattach/testing/fixtures.go
@@ -1,5 +1,3 @@
-// +build fixtures
-
 package testing
 
 import (
diff --git a/openstack/compute/v2/extensions/volumeattach/requests_test.go b/openstack/compute/v2/extensions/volumeattach/testing/requests_test.go
similarity index 68%
rename from openstack/compute/v2/extensions/volumeattach/requests_test.go
rename to openstack/compute/v2/extensions/volumeattach/testing/requests_test.go
index 3257f39..9486f9b 100644
--- a/openstack/compute/v2/extensions/volumeattach/requests_test.go
+++ b/openstack/compute/v2/extensions/volumeattach/testing/requests_test.go
@@ -1,16 +1,16 @@
-package volumeattach
+package testing
 
 import (
 	"testing"
 
-	fixtures "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/volumeattach/testing"
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/volumeattach"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
 )
 
 // FirstVolumeAttachment is the first result in ListOutput.
-var FirstVolumeAttachment = VolumeAttachment{
+var FirstVolumeAttachment = volumeattach.VolumeAttachment{
 	Device:   "/dev/vdd",
 	ID:       "a26887c6-c47b-4654-abb5-dfadf7d3f803",
 	ServerID: "4d8c3732-a248-40ed-bebc-539a6ffd25c0",
@@ -18,7 +18,7 @@
 }
 
 // SecondVolumeAttachment is the first result in ListOutput.
-var SecondVolumeAttachment = VolumeAttachment{
+var SecondVolumeAttachment = volumeattach.VolumeAttachment{
 	Device:   "/dev/vdc",
 	ID:       "a26887c6-c47b-4654-abb5-dfadf7d3f804",
 	ServerID: "4d8c3732-a248-40ed-bebc-539a6ffd25c0",
@@ -27,10 +27,10 @@
 
 // ExpectedVolumeAttachmentSlide is the slice of results that should be parsed
 // from ListOutput, in the expected order.
-var ExpectedVolumeAttachmentSlice = []VolumeAttachment{FirstVolumeAttachment, SecondVolumeAttachment}
+var ExpectedVolumeAttachmentSlice = []volumeattach.VolumeAttachment{FirstVolumeAttachment, SecondVolumeAttachment}
 
 //CreatedVolumeAttachment is the parsed result from CreatedOutput.
-var CreatedVolumeAttachment = VolumeAttachment{
+var CreatedVolumeAttachment = volumeattach.VolumeAttachment{
 	Device:   "/dev/vdc",
 	ID:       "a26887c6-c47b-4654-abb5-dfadf7d3f804",
 	ServerID: "4d8c3732-a248-40ed-bebc-539a6ffd25c0",
@@ -40,13 +40,15 @@
 func TestList(t *testing.T) {
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
-	fixtures.HandleListSuccessfully(t)
+
+	HandleListSuccessfully(t)
+
 	serverID := "4d8c3732-a248-40ed-bebc-539a6ffd25c0"
 
 	count := 0
-	err := List(client.ServiceClient(), serverID).EachPage(func(page pagination.Page) (bool, error) {
+	err := volumeattach.List(client.ServiceClient(), serverID).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractVolumeAttachments(page)
+		actual, err := volumeattach.ExtractVolumeAttachments(page)
 		th.AssertNoErr(t, err)
 		th.CheckDeepEquals(t, ExpectedVolumeAttachmentSlice, actual)
 
@@ -59,10 +61,12 @@
 func TestCreate(t *testing.T) {
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
-	fixtures.HandleCreateSuccessfully(t)
+
+	HandleCreateSuccessfully(t)
+
 	serverID := "4d8c3732-a248-40ed-bebc-539a6ffd25c0"
 
-	actual, err := Create(client.ServiceClient(), serverID, CreateOpts{
+	actual, err := volumeattach.Create(client.ServiceClient(), serverID, volumeattach.CreateOpts{
 		Device:   "/dev/vdc",
 		VolumeID: "a26887c6-c47b-4654-abb5-dfadf7d3f804",
 	}).Extract()
@@ -73,11 +77,13 @@
 func TestGet(t *testing.T) {
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
-	fixtures.HandleGetSuccessfully(t)
+
+	HandleGetSuccessfully(t)
+
 	aID := "a26887c6-c47b-4654-abb5-dfadf7d3f804"
 	serverID := "4d8c3732-a248-40ed-bebc-539a6ffd25c0"
 
-	actual, err := Get(client.ServiceClient(), serverID, aID).Extract()
+	actual, err := volumeattach.Get(client.ServiceClient(), serverID, aID).Extract()
 	th.AssertNoErr(t, err)
 	th.CheckDeepEquals(t, &SecondVolumeAttachment, actual)
 }
@@ -85,10 +91,12 @@
 func TestDelete(t *testing.T) {
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
-	fixtures.HandleDeleteSuccessfully(t)
+
+	HandleDeleteSuccessfully(t)
+
 	aID := "a26887c6-c47b-4654-abb5-dfadf7d3f804"
 	serverID := "4d8c3732-a248-40ed-bebc-539a6ffd25c0"
 
-	err := Delete(client.ServiceClient(), serverID, aID).ExtractErr()
+	err := volumeattach.Delete(client.ServiceClient(), serverID, aID).ExtractErr()
 	th.AssertNoErr(t, err)
 }
diff --git a/openstack/compute/v2/flavors/testing/doc.go b/openstack/compute/v2/flavors/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/compute/v2/flavors/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/compute/v2/flavors/requests_test.go b/openstack/compute/v2/flavors/testing/requests_test.go
similarity index 82%
rename from openstack/compute/v2/flavors/requests_test.go
rename to openstack/compute/v2/flavors/testing/requests_test.go
index 311dbf0..e86512a 100644
--- a/openstack/compute/v2/flavors/requests_test.go
+++ b/openstack/compute/v2/flavors/testing/requests_test.go
@@ -1,4 +1,4 @@
-package flavors
+package testing
 
 import (
 	"fmt"
@@ -6,6 +6,7 @@
 	"reflect"
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/flavors"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
@@ -60,17 +61,17 @@
 	})
 
 	pages := 0
-	err := ListDetail(fake.ServiceClient(), nil).EachPage(func(page pagination.Page) (bool, error) {
+	err := flavors.ListDetail(fake.ServiceClient(), nil).EachPage(func(page pagination.Page) (bool, error) {
 		pages++
 
-		actual, err := ExtractFlavors(page)
+		actual, err := flavors.ExtractFlavors(page)
 		if err != nil {
 			return false, err
 		}
 
-		expected := []Flavor{
-			Flavor{ID: "1", Name: "m1.tiny", Disk: 1, RAM: 512, VCPUs: 1},
-			Flavor{ID: "2", Name: "m2.small", Disk: 10, RAM: 1024, VCPUs: 2},
+		expected := []flavors.Flavor{
+			{ID: "1", Name: "m1.tiny", Disk: 1, RAM: 512, VCPUs: 1},
+			{ID: "2", Name: "m2.small", Disk: 10, RAM: 1024, VCPUs: 2},
 		}
 
 		if !reflect.DeepEqual(expected, actual) {
@@ -110,12 +111,12 @@
 		`)
 	})
 
-	actual, err := Get(fake.ServiceClient(), "12345").Extract()
+	actual, err := flavors.Get(fake.ServiceClient(), "12345").Extract()
 	if err != nil {
 		t.Fatalf("Unable to get flavor: %v", err)
 	}
 
-	expected := &Flavor{
+	expected := &flavors.Flavor{
 		ID:         "1",
 		Name:       "m1.tiny",
 		Disk:       1,
diff --git a/openstack/compute/v2/images/testing/doc.go b/openstack/compute/v2/images/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/compute/v2/images/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/compute/v2/images/requests_test.go b/openstack/compute/v2/images/testing/requests_test.go
similarity index 89%
rename from openstack/compute/v2/images/requests_test.go
rename to openstack/compute/v2/images/testing/requests_test.go
index 4b94ba1..a13b086 100644
--- a/openstack/compute/v2/images/requests_test.go
+++ b/openstack/compute/v2/images/testing/requests_test.go
@@ -1,4 +1,4 @@
-package images
+package testing
 
 import (
 	"encoding/json"
@@ -7,6 +7,7 @@
 	"reflect"
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/images"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
@@ -63,17 +64,17 @@
 	})
 
 	pages := 0
-	options := &ListOpts{Limit: 2}
-	err := ListDetail(fake.ServiceClient(), options).EachPage(func(page pagination.Page) (bool, error) {
+	options := &images.ListOpts{Limit: 2}
+	err := images.ListDetail(fake.ServiceClient(), options).EachPage(func(page pagination.Page) (bool, error) {
 		pages++
 
-		actual, err := ExtractImages(page)
+		actual, err := images.ExtractImages(page)
 		if err != nil {
 			return false, err
 		}
 
-		expected := []Image{
-			Image{
+		expected := []images.Image{
+			{
 				ID:       "f3e4a95d-1f4f-4989-97ce-f3a1fb8c04d7",
 				Name:     "F17-x86_64-cfntools",
 				Created:  "2014-09-23T12:54:52Z",
@@ -83,7 +84,7 @@
 				Progress: 100,
 				Status:   "ACTIVE",
 			},
-			Image{
+			{
 				ID:       "f90f6034-2570-4974-8351-6b49732ef2eb",
 				Name:     "cirros-0.3.2-x86_64-disk",
 				Created:  "2014-09-23T12:51:42Z",
@@ -137,12 +138,12 @@
 		`)
 	})
 
-	actual, err := Get(fake.ServiceClient(), "12345678").Extract()
+	actual, err := images.Get(fake.ServiceClient(), "12345678").Extract()
 	if err != nil {
 		t.Fatalf("Unexpected error from Get: %v", err)
 	}
 
-	expected := &Image{
+	expected := &images.Image{
 		Status:   "ACTIVE",
 		Updated:  "2014-09-23T12:54:56Z",
 		ID:       "f3e4a95d-1f4f-4989-97ce-f3a1fb8c04d7",
@@ -159,7 +160,7 @@
 }
 
 func TestNextPageURL(t *testing.T) {
-	var page ImagePage
+	var page images.ImagePage
 	var body map[string]interface{}
 	bodyString := []byte(`{"images":{"links":[{"href":"http://192.154.23.87/12345/images/image3","rel":"bookmark"}]}, "images_links":[{"href":"http://192.154.23.87/12345/images/image4","rel":"next"}]}`)
 	err := json.Unmarshal(bodyString, &body)
@@ -186,6 +187,6 @@
 		w.WriteHeader(http.StatusNoContent)
 	})
 
-	res := Delete(fake.ServiceClient(), "12345678")
+	res := images.Delete(fake.ServiceClient(), "12345678")
 	th.AssertNoErr(t, res.Err)
 }
diff --git a/openstack/compute/v2/servers/testing/doc.go b/openstack/compute/v2/servers/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/compute/v2/servers/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/compute/v2/servers/fixtures.go b/openstack/compute/v2/servers/testing/fixtures.go
similarity index 98%
rename from openstack/compute/v2/servers/fixtures.go
rename to openstack/compute/v2/servers/testing/fixtures.go
index 8b2c94d..b4fb7ff 100644
--- a/openstack/compute/v2/servers/fixtures.go
+++ b/openstack/compute/v2/servers/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package servers
+package testing
 
 import (
 	"fmt"
@@ -8,6 +6,7 @@
 	"testing"
 
 	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
 )
@@ -244,7 +243,7 @@
 
 var (
 	// ServerHerp is a Server struct that should correspond to the first result in ServerListBody.
-	ServerHerp = Server{
+	ServerHerp = servers.Server{
 		Status:  "ACTIVE",
 		Updated: "2014-09-25T13:10:10Z",
 		HostID:  "29d3c8c896a45aa4c34e52247875d7fefc3d94bbcc9f622b5d204362",
@@ -300,7 +299,7 @@
 	}
 
 	// ServerDerp is a Server struct that should correspond to the second server in ServerListBody.
-	ServerDerp = Server{
+	ServerDerp = servers.Server{
 		Status:  "ACTIVE",
 		Updated: "2014-09-25T13:04:49Z",
 		HostID:  "29d3c8c896a45aa4c34e52247875d7fefc3d94bbcc9f622b5d204362",
@@ -357,7 +356,7 @@
 )
 
 type CreateOptsWithCustomField struct {
-	CreateOpts
+	servers.CreateOpts
 	Foo string `json:"foo,omitempty"`
 }
 
@@ -618,19 +617,19 @@
 }
 
 // ListAddressesExpected represents an expected repsonse from a ListAddresses request.
-var ListAddressesExpected = map[string][]Address{
-	"public": []Address{
-		Address{
+var ListAddressesExpected = map[string][]servers.Address{
+	"public": []servers.Address{
+		{
 			Version: 4,
 			Address: "80.56.136.39",
 		},
-		Address{
+		{
 			Version: 6,
 			Address: "2001:4800:790e:510:be76:4eff:fe04:82a8",
 		},
 	},
-	"private": []Address{
-		Address{
+	"private": []servers.Address{
+		{
 			Version: 4,
 			Address: "10.880.3.154",
 		},
@@ -668,12 +667,12 @@
 }
 
 // ListNetworkAddressesExpected represents an expected repsonse from a ListAddressesByNetwork request.
-var ListNetworkAddressesExpected = []Address{
-	Address{
+var ListNetworkAddressesExpected = []servers.Address{
+	{
 		Version: 4,
 		Address: "50.56.176.35",
 	},
-	Address{
+	{
 		Version: 6,
 		Address: "2001:4800:780e:510:be76:4eff:fe04:84a8",
 	},
diff --git a/openstack/compute/v2/servers/requests_test.go b/openstack/compute/v2/servers/testing/requests_test.go
similarity index 74%
rename from openstack/compute/v2/servers/requests_test.go
rename to openstack/compute/v2/servers/testing/requests_test.go
index 9a5d701..7db6b93 100644
--- a/openstack/compute/v2/servers/requests_test.go
+++ b/openstack/compute/v2/servers/testing/requests_test.go
@@ -1,4 +1,4 @@
-package servers
+package testing
 
 import (
 	"encoding/base64"
@@ -6,6 +6,7 @@
 	"net/http"
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
@@ -17,10 +18,10 @@
 	HandleServerListSuccessfully(t)
 
 	pages := 0
-	err := List(client.ServiceClient(), ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
+	err := servers.List(client.ServiceClient(), servers.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		pages++
 
-		actual, err := ExtractServers(page)
+		actual, err := servers.ExtractServers(page)
 		if err != nil {
 			return false, err
 		}
@@ -46,9 +47,9 @@
 	defer th.TeardownHTTP()
 	HandleServerListSuccessfully(t)
 
-	allPages, err := List(client.ServiceClient(), ListOpts{}).AllPages()
+	allPages, err := servers.List(client.ServiceClient(), servers.ListOpts{}).AllPages()
 	th.AssertNoErr(t, err)
-	actual, err := ExtractServers(allPages)
+	actual, err := servers.ExtractServers(allPages)
 	th.AssertNoErr(t, err)
 	th.CheckDeepEquals(t, ServerHerp, actual[0])
 	th.CheckDeepEquals(t, ServerDerp, actual[1])
@@ -59,7 +60,7 @@
 	defer th.TeardownHTTP()
 	HandleServerCreationSuccessfully(t, SingleServerBody)
 
-	actual, err := Create(client.ServiceClient(), CreateOpts{
+	actual, err := servers.Create(client.ServiceClient(), servers.CreateOpts{
 		Name:      "derp",
 		ImageRef:  "f90f6034-2570-4974-8351-6b49732ef2eb",
 		FlavorRef: "1",
@@ -74,8 +75,8 @@
 	defer th.TeardownHTTP()
 	HandleServerCreationWithCustomFieldSuccessfully(t, SingleServerBody)
 
-	actual, err := Create(client.ServiceClient(), CreateOptsWithCustomField{
-		CreateOpts: CreateOpts{
+	actual, err := servers.Create(client.ServiceClient(), CreateOptsWithCustomField{
+		CreateOpts: servers.CreateOpts{
 			Name:      "derp",
 			ImageRef:  "f90f6034-2570-4974-8351-6b49732ef2eb",
 			FlavorRef: "1",
@@ -92,7 +93,7 @@
 	defer th.TeardownHTTP()
 	HandleServerDeletionSuccessfully(t)
 
-	res := Delete(client.ServiceClient(), "asdfasdfasdf")
+	res := servers.Delete(client.ServiceClient(), "asdfasdfasdf")
 	th.AssertNoErr(t, res.Err)
 }
 
@@ -101,7 +102,7 @@
 	defer th.TeardownHTTP()
 	HandleServerForceDeletionSuccessfully(t)
 
-	res := ForceDelete(client.ServiceClient(), "asdfasdfasdf")
+	res := servers.ForceDelete(client.ServiceClient(), "asdfasdfasdf")
 	th.AssertNoErr(t, res.Err)
 }
 
@@ -111,7 +112,7 @@
 	HandleServerGetSuccessfully(t)
 
 	client := client.ServiceClient()
-	actual, err := Get(client, "1234asdf").Extract()
+	actual, err := servers.Get(client, "1234asdf").Extract()
 	if err != nil {
 		t.Fatalf("Unexpected Get error: %v", err)
 	}
@@ -125,7 +126,7 @@
 	HandleServerUpdateSuccessfully(t)
 
 	client := client.ServiceClient()
-	actual, err := Update(client, "1234asdf", UpdateOpts{Name: "new-name"}).Extract()
+	actual, err := servers.Update(client, "1234asdf", servers.UpdateOpts{Name: "new-name"}).Extract()
 	if err != nil {
 		t.Fatalf("Unexpected Update error: %v", err)
 	}
@@ -138,7 +139,7 @@
 	defer th.TeardownHTTP()
 	HandleAdminPasswordChangeSuccessfully(t)
 
-	res := ChangeAdminPassword(client.ServiceClient(), "1234asdf", "new-password")
+	res := servers.ChangeAdminPassword(client.ServiceClient(), "1234asdf", "new-password")
 	th.AssertNoErr(t, res.Err)
 }
 
@@ -147,7 +148,7 @@
 	defer th.TeardownHTTP()
 	HandlePasswordGetSuccessfully(t)
 
-	res := GetPassword(client.ServiceClient(), "1234asdf")
+	res := servers.GetPassword(client.ServiceClient(), "1234asdf")
 	th.AssertNoErr(t, res.Err)
 }
 
@@ -156,8 +157,8 @@
 	defer th.TeardownHTTP()
 	HandleRebootSuccessfully(t)
 
-	res := Reboot(client.ServiceClient(), "1234asdf", &RebootOpts{
-		Type: SoftReboot,
+	res := servers.Reboot(client.ServiceClient(), "1234asdf", &servers.RebootOpts{
+		Type: servers.SoftReboot,
 	})
 	th.AssertNoErr(t, res.Err)
 }
@@ -167,14 +168,14 @@
 	defer th.TeardownHTTP()
 	HandleRebuildSuccessfully(t, SingleServerBody)
 
-	opts := RebuildOpts{
+	opts := servers.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()
+	actual, err := servers.Rebuild(client.ServiceClient(), "1234asdf", opts).Extract()
 	th.AssertNoErr(t, err)
 
 	th.CheckDeepEquals(t, ServerDerp, *actual)
@@ -192,7 +193,7 @@
 		w.WriteHeader(http.StatusAccepted)
 	})
 
-	res := Resize(client.ServiceClient(), "1234asdf", ResizeOpts{FlavorRef: "2"})
+	res := servers.Resize(client.ServiceClient(), "1234asdf", servers.ResizeOpts{FlavorRef: "2"})
 	th.AssertNoErr(t, res.Err)
 }
 
@@ -208,7 +209,7 @@
 		w.WriteHeader(http.StatusNoContent)
 	})
 
-	res := ConfirmResize(client.ServiceClient(), "1234asdf")
+	res := servers.ConfirmResize(client.ServiceClient(), "1234asdf")
 	th.AssertNoErr(t, res.Err)
 }
 
@@ -224,7 +225,7 @@
 		w.WriteHeader(http.StatusAccepted)
 	})
 
-	res := RevertResize(client.ServiceClient(), "1234asdf")
+	res := servers.RevertResize(client.ServiceClient(), "1234asdf")
 	th.AssertNoErr(t, res.Err)
 }
 
@@ -234,7 +235,7 @@
 
 	HandleServerRescueSuccessfully(t)
 
-	res := Rescue(client.ServiceClient(), "1234asdf", RescueOpts{
+	res := servers.Rescue(client.ServiceClient(), "1234asdf", servers.RescueOpts{
 		AdminPass: "1234567890",
 	})
 	th.AssertNoErr(t, res.Err)
@@ -249,7 +250,7 @@
 	HandleMetadatumGetSuccessfully(t)
 
 	expected := map[string]string{"foo": "bar"}
-	actual, err := Metadatum(client.ServiceClient(), "1234asdf", "foo").Extract()
+	actual, err := servers.Metadatum(client.ServiceClient(), "1234asdf", "foo").Extract()
 	th.AssertNoErr(t, err)
 	th.AssertDeepEquals(t, expected, actual)
 }
@@ -261,7 +262,7 @@
 	HandleMetadatumCreateSuccessfully(t)
 
 	expected := map[string]string{"foo": "bar"}
-	actual, err := CreateMetadatum(client.ServiceClient(), "1234asdf", MetadatumOpts{"foo": "bar"}).Extract()
+	actual, err := servers.CreateMetadatum(client.ServiceClient(), "1234asdf", servers.MetadatumOpts{"foo": "bar"}).Extract()
 	th.AssertNoErr(t, err)
 	th.AssertDeepEquals(t, expected, actual)
 }
@@ -272,7 +273,7 @@
 
 	HandleMetadatumDeleteSuccessfully(t)
 
-	err := DeleteMetadatum(client.ServiceClient(), "1234asdf", "foo").ExtractErr()
+	err := servers.DeleteMetadatum(client.ServiceClient(), "1234asdf", "foo").ExtractErr()
 	th.AssertNoErr(t, err)
 }
 
@@ -283,7 +284,7 @@
 	HandleMetadataGetSuccessfully(t)
 
 	expected := map[string]string{"foo": "bar", "this": "that"}
-	actual, err := Metadata(client.ServiceClient(), "1234asdf").Extract()
+	actual, err := servers.Metadata(client.ServiceClient(), "1234asdf").Extract()
 	th.AssertNoErr(t, err)
 	th.AssertDeepEquals(t, expected, actual)
 }
@@ -295,7 +296,7 @@
 	HandleMetadataResetSuccessfully(t)
 
 	expected := map[string]string{"foo": "bar", "this": "that"}
-	actual, err := ResetMetadata(client.ServiceClient(), "1234asdf", MetadataOpts{
+	actual, err := servers.ResetMetadata(client.ServiceClient(), "1234asdf", servers.MetadataOpts{
 		"foo":  "bar",
 		"this": "that",
 	}).Extract()
@@ -310,7 +311,7 @@
 	HandleMetadataUpdateSuccessfully(t)
 
 	expected := map[string]string{"foo": "baz", "this": "those"}
-	actual, err := UpdateMetadata(client.ServiceClient(), "1234asdf", MetadataOpts{
+	actual, err := servers.UpdateMetadata(client.ServiceClient(), "1234asdf", servers.MetadataOpts{
 		"foo":  "baz",
 		"this": "those",
 	}).Extract()
@@ -325,10 +326,10 @@
 
 	expected := ListAddressesExpected
 	pages := 0
-	err := ListAddresses(client.ServiceClient(), "asdfasdfasdf").EachPage(func(page pagination.Page) (bool, error) {
+	err := servers.ListAddresses(client.ServiceClient(), "asdfasdfasdf").EachPage(func(page pagination.Page) (bool, error) {
 		pages++
 
-		actual, err := ExtractAddresses(page)
+		actual, err := servers.ExtractAddresses(page)
 		th.AssertNoErr(t, err)
 
 		if len(actual) != 2 {
@@ -349,10 +350,10 @@
 
 	expected := ListNetworkAddressesExpected
 	pages := 0
-	err := ListAddressesByNetwork(client.ServiceClient(), "asdfasdfasdf", "public").EachPage(func(page pagination.Page) (bool, error) {
+	err := servers.ListAddressesByNetwork(client.ServiceClient(), "asdfasdfasdf", "public").EachPage(func(page pagination.Page) (bool, error) {
 		pages++
 
-		actual, err := ExtractNetworkAddresses(page)
+		actual, err := servers.ExtractNetworkAddresses(page)
 		th.AssertNoErr(t, err)
 
 		if len(actual) != 2 {
@@ -371,7 +372,7 @@
 	defer th.TeardownHTTP()
 	HandleCreateServerImageSuccessfully(t)
 
-	_, err := CreateImage(client.ServiceClient(), "serverimage", CreateImageOpts{Name: "test"}).ExtractImageID()
+	_, err := servers.CreateImage(client.ServiceClient(), "serverimage", servers.CreateImageOpts{Name: "test"}).ExtractImageID()
 	th.AssertNoErr(t, err)
 }
 
@@ -379,8 +380,8 @@
 	name := "/etc/test"
 	contents := []byte("asdfasdf")
 
-	personality := Personality{
-		&File{
+	personality := servers.Personality{
+		&servers.File{
 			Path:     name,
 			Contents: contents,
 		},
diff --git a/openstack/compute/v2/servers/results_test.go b/openstack/compute/v2/servers/testing/results_test.go
similarity index 93%
rename from openstack/compute/v2/servers/results_test.go
rename to openstack/compute/v2/servers/testing/results_test.go
index 5b56055..e5334f0 100644
--- a/openstack/compute/v2/servers/results_test.go
+++ b/openstack/compute/v2/servers/testing/results_test.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package servers
+package testing
 
 import (
 	"crypto/rsa"
@@ -9,6 +7,7 @@
 	"testing"
 
 	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"golang.org/x/crypto/ssh"
 )
@@ -21,7 +20,7 @@
 	if err != nil {
 		t.Fatalf("%s", err)
 	}
-	resp := GetPasswordResult{gophercloud.Result{Body: dejson}}
+	resp := servers.GetPasswordResult{gophercloud.Result{Body: dejson}}
 
 	pwd, err := resp.ExtractPassword(nil)
 	th.AssertEquals(t, pwd, "")
@@ -38,7 +37,7 @@
 	if err != nil {
 		t.Fatalf("%s", err)
 	}
-	resp := GetPasswordResult{gophercloud.Result{Body: dejson}}
+	resp := servers.GetPasswordResult{gophercloud.Result{Body: dejson}}
 
 	pwd, err := resp.ExtractPassword(nil)
 	th.AssertNoErr(t, err)
@@ -91,7 +90,7 @@
 	if err != nil {
 		t.Fatalf("%s", err)
 	}
-	resp := GetPasswordResult{gophercloud.Result{Body: dejson}}
+	resp := servers.GetPasswordResult{gophercloud.Result{Body: dejson}}
 
 	pwd, err := resp.ExtractPassword(privateKey.(*rsa.PrivateKey))
 	th.AssertNoErr(t, err)
diff --git a/openstack/db/v1/configurations/testing/doc.go b/openstack/db/v1/configurations/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/db/v1/configurations/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/db/v1/configurations/fixtures.go b/openstack/db/v1/configurations/testing/fixtures.go
similarity index 94%
rename from openstack/db/v1/configurations/fixtures.go
rename to openstack/db/v1/configurations/testing/fixtures.go
index 9064c6c..56e10f4 100644
--- a/openstack/db/v1/configurations/fixtures.go
+++ b/openstack/db/v1/configurations/testing/fixtures.go
@@ -1,10 +1,10 @@
-// +build fixtures
-
-package configurations
+package testing
 
 import (
 	"fmt"
 	"time"
+
+	"github.com/gophercloud/gophercloud/openstack/db/v1/configurations"
 )
 
 var (
@@ -132,7 +132,7 @@
 }
 `
 
-var ExampleConfig = Config{
+var ExampleConfig = configurations.Config{
 	Created:              timeVal,
 	DatastoreName:        "mysql",
 	DatastoreVersionID:   "b00000b0-00b0-0b00-00b0-000b000000bb",
@@ -143,7 +143,7 @@
 	Updated:              timeVal,
 }
 
-var ExampleConfigWithValues = Config{
+var ExampleConfigWithValues = configurations.Config{
 	Created:              timeVal,
 	DatastoreName:        "mysql",
 	DatastoreVersionID:   "b00000b0-00b0-0b00-00b0-000b000000bb",
diff --git a/openstack/db/v1/configurations/requests_test.go b/openstack/db/v1/configurations/testing/requests_test.go
similarity index 65%
rename from openstack/db/v1/configurations/requests_test.go
rename to openstack/db/v1/configurations/testing/requests_test.go
index 575cf4f..643f363 100644
--- a/openstack/db/v1/configurations/requests_test.go
+++ b/openstack/db/v1/configurations/testing/requests_test.go
@@ -1,8 +1,9 @@
-package configurations
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/db/v1/configurations"
 	"github.com/gophercloud/gophercloud/openstack/db/v1/instances"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
@@ -30,12 +31,12 @@
 	fixture.SetupHandler(t, _baseURL, "GET", "", ListConfigsJSON, 200)
 
 	count := 0
-	err := List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+	err := configurations.List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractConfigs(page)
+		actual, err := configurations.ExtractConfigs(page)
 		th.AssertNoErr(t, err)
 
-		expected := []Config{ExampleConfig}
+		expected := []configurations.Config{ExampleConfig}
 		th.AssertDeepEquals(t, expected, actual)
 
 		return true, nil
@@ -50,7 +51,7 @@
 	defer th.TeardownHTTP()
 	fixture.SetupHandler(t, resURL, "GET", "", GetConfigJSON, 200)
 
-	config, err := Get(fake.ServiceClient(), configID).Extract()
+	config, err := configurations.Get(fake.ServiceClient(), configID).Extract()
 	th.AssertNoErr(t, err)
 	th.AssertDeepEquals(t, &ExampleConfig, config)
 }
@@ -60,8 +61,8 @@
 	defer th.TeardownHTTP()
 	fixture.SetupHandler(t, _baseURL, "POST", CreateReq, CreateConfigJSON, 200)
 
-	opts := CreateOpts{
-		Datastore: &DatastoreOpts{
+	opts := configurations.CreateOpts{
+		Datastore: &configurations.DatastoreOpts{
 			Type:    "a00000a0-00a0-0a00-00a0-000a000000aa",
 			Version: "b00000b0-00b0-0b00-00b0-000b000000bb",
 		},
@@ -73,7 +74,7 @@
 		},
 	}
 
-	config, err := Create(fake.ServiceClient(), opts).Extract()
+	config, err := configurations.Create(fake.ServiceClient(), opts).Extract()
 	th.AssertNoErr(t, err)
 	th.AssertDeepEquals(t, &ExampleConfigWithValues, config)
 }
@@ -83,13 +84,13 @@
 	defer th.TeardownHTTP()
 	fixture.SetupHandler(t, resURL, "PATCH", UpdateReq, "", 200)
 
-	opts := UpdateOpts{
+	opts := configurations.UpdateOpts{
 		Values: map[string]interface{}{
 			"connect_timeout": 300,
 		},
 	}
 
-	err := Update(fake.ServiceClient(), configID, opts).ExtractErr()
+	err := configurations.Update(fake.ServiceClient(), configID, opts).ExtractErr()
 	th.AssertNoErr(t, err)
 }
 
@@ -98,13 +99,13 @@
 	defer th.TeardownHTTP()
 	fixture.SetupHandler(t, resURL, "PUT", UpdateReq, "", 202)
 
-	opts := UpdateOpts{
+	opts := configurations.UpdateOpts{
 		Values: map[string]interface{}{
 			"connect_timeout": 300,
 		},
 	}
 
-	err := Replace(fake.ServiceClient(), configID, opts).ExtractErr()
+	err := configurations.Replace(fake.ServiceClient(), configID, opts).ExtractErr()
 	th.AssertNoErr(t, err)
 }
 
@@ -113,7 +114,7 @@
 	defer th.TeardownHTTP()
 	fixture.SetupHandler(t, resURL, "DELETE", "", "", 202)
 
-	err := Delete(fake.ServiceClient(), configID).ExtractErr()
+	err := configurations.Delete(fake.ServiceClient(), configID).ExtractErr()
 	th.AssertNoErr(t, err)
 }
 
@@ -128,7 +129,7 @@
 	}
 
 	pages := 0
-	err := ListInstances(fake.ServiceClient(), configID).EachPage(func(page pagination.Page) (bool, error) {
+	err := configurations.ListInstances(fake.ServiceClient(), configID).EachPage(func(page pagination.Page) (bool, error) {
 		pages++
 
 		actual, err := instances.ExtractInstances(page)
@@ -151,19 +152,19 @@
 	fixture.SetupHandler(t, dsParamListURL, "GET", "", ListParamsJSON, 200)
 
 	pages := 0
-	err := ListDatastoreParams(fake.ServiceClient(), dsID, versionID).EachPage(func(page pagination.Page) (bool, error) {
+	err := configurations.ListDatastoreParams(fake.ServiceClient(), dsID, versionID).EachPage(func(page pagination.Page) (bool, error) {
 		pages++
 
-		actual, err := ExtractParams(page)
+		actual, err := configurations.ExtractParams(page)
 		if err != nil {
 			return false, err
 		}
 
-		expected := []Param{
-			Param{Max: 1, Min: 0, Name: "innodb_file_per_table", RestartRequired: true, Type: "integer"},
-			Param{Max: 4294967296, Min: 0, Name: "key_buffer_size", RestartRequired: false, Type: "integer"},
-			Param{Max: 65535, Min: 2, Name: "connect_timeout", RestartRequired: false, Type: "integer"},
-			Param{Max: 4294967296, Min: 0, Name: "join_buffer_size", RestartRequired: false, Type: "integer"},
+		expected := []configurations.Param{
+			{Max: 1, Min: 0, Name: "innodb_file_per_table", RestartRequired: true, Type: "integer"},
+			{Max: 4294967296, Min: 0, Name: "key_buffer_size", RestartRequired: false, Type: "integer"},
+			{Max: 65535, Min: 2, Name: "connect_timeout", RestartRequired: false, Type: "integer"},
+			{Max: 4294967296, Min: 0, Name: "join_buffer_size", RestartRequired: false, Type: "integer"},
 		}
 
 		th.AssertDeepEquals(t, actual, expected)
@@ -180,10 +181,10 @@
 	defer th.TeardownHTTP()
 	fixture.SetupHandler(t, dsParamGetURL, "GET", "", GetParamJSON, 200)
 
-	param, err := GetDatastoreParam(fake.ServiceClient(), dsID, versionID, paramID).Extract()
+	param, err := configurations.GetDatastoreParam(fake.ServiceClient(), dsID, versionID, paramID).Extract()
 	th.AssertNoErr(t, err)
 
-	expected := &Param{
+	expected := &configurations.Param{
 		Max: 1, Min: 0, Name: "innodb_file_per_table", RestartRequired: true, Type: "integer",
 	}
 
@@ -196,19 +197,19 @@
 	fixture.SetupHandler(t, globalParamListURL, "GET", "", ListParamsJSON, 200)
 
 	pages := 0
-	err := ListGlobalParams(fake.ServiceClient(), versionID).EachPage(func(page pagination.Page) (bool, error) {
+	err := configurations.ListGlobalParams(fake.ServiceClient(), versionID).EachPage(func(page pagination.Page) (bool, error) {
 		pages++
 
-		actual, err := ExtractParams(page)
+		actual, err := configurations.ExtractParams(page)
 		if err != nil {
 			return false, err
 		}
 
-		expected := []Param{
-			Param{Max: 1, Min: 0, Name: "innodb_file_per_table", RestartRequired: true, Type: "integer"},
-			Param{Max: 4294967296, Min: 0, Name: "key_buffer_size", RestartRequired: false, Type: "integer"},
-			Param{Max: 65535, Min: 2, Name: "connect_timeout", RestartRequired: false, Type: "integer"},
-			Param{Max: 4294967296, Min: 0, Name: "join_buffer_size", RestartRequired: false, Type: "integer"},
+		expected := []configurations.Param{
+			{Max: 1, Min: 0, Name: "innodb_file_per_table", RestartRequired: true, Type: "integer"},
+			{Max: 4294967296, Min: 0, Name: "key_buffer_size", RestartRequired: false, Type: "integer"},
+			{Max: 65535, Min: 2, Name: "connect_timeout", RestartRequired: false, Type: "integer"},
+			{Max: 4294967296, Min: 0, Name: "join_buffer_size", RestartRequired: false, Type: "integer"},
 		}
 
 		th.AssertDeepEquals(t, actual, expected)
@@ -225,10 +226,10 @@
 	defer th.TeardownHTTP()
 	fixture.SetupHandler(t, globalParamGetURL, "GET", "", GetParamJSON, 200)
 
-	param, err := GetGlobalParam(fake.ServiceClient(), versionID, paramID).Extract()
+	param, err := configurations.GetGlobalParam(fake.ServiceClient(), versionID, paramID).Extract()
 	th.AssertNoErr(t, err)
 
-	expected := &Param{
+	expected := &configurations.Param{
 		Max: 1, Min: 0, Name: "innodb_file_per_table", RestartRequired: true, Type: "integer",
 	}
 
diff --git a/openstack/db/v1/databases/requests_test.go b/openstack/db/v1/databases/requests_test.go
deleted file mode 100644
index 5ec45e1..0000000
--- a/openstack/db/v1/databases/requests_test.go
+++ /dev/null
@@ -1,66 +0,0 @@
-package databases
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud/pagination"
-	th "github.com/gophercloud/gophercloud/testhelper"
-	fake "github.com/gophercloud/gophercloud/testhelper/client"
-)
-
-func TestCreate(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	HandleCreate(t)
-
-	opts := BatchCreateOpts{
-		CreateOpts{Name: "testingdb", CharSet: "utf8", Collate: "utf8_general_ci"},
-		CreateOpts{Name: "sampledb"},
-	}
-
-	res := Create(fake.ServiceClient(), instanceID, opts)
-	th.AssertNoErr(t, res.Err)
-}
-
-func TestList(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	HandleList(t)
-
-	expectedDBs := []Database{
-		Database{Name: "anotherexampledb"},
-		Database{Name: "exampledb"},
-		Database{Name: "nextround"},
-		Database{Name: "sampledb"},
-		Database{Name: "testingdb"},
-	}
-
-	pages := 0
-	err := List(fake.ServiceClient(), instanceID).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)
-
-	if pages != 1 {
-		t.Errorf("Expected 1 page, saw %d", pages)
-	}
-}
-
-func TestDelete(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	HandleDelete(t)
-
-	err := Delete(fake.ServiceClient(), instanceID, "{dbName}").ExtractErr()
-	th.AssertNoErr(t, err)
-}
diff --git a/openstack/db/v1/databases/testing/doc.go b/openstack/db/v1/databases/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/db/v1/databases/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/db/v1/databases/fixtures.go b/openstack/db/v1/databases/testing/fixtures.go
similarity index 95%
rename from openstack/db/v1/databases/fixtures.go
rename to openstack/db/v1/databases/testing/fixtures.go
index c99f990..02b9ecc 100644
--- a/openstack/db/v1/databases/fixtures.go
+++ b/openstack/db/v1/databases/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package databases
+package testing
 
 import (
 	"testing"
diff --git a/openstack/db/v1/databases/testing/requests_test.go b/openstack/db/v1/databases/testing/requests_test.go
new file mode 100644
index 0000000..a470ffa
--- /dev/null
+++ b/openstack/db/v1/databases/testing/requests_test.go
@@ -0,0 +1,67 @@
+package testing
+
+import (
+	"testing"
+
+	"github.com/gophercloud/gophercloud/openstack/db/v1/databases"
+	"github.com/gophercloud/gophercloud/pagination"
+	th "github.com/gophercloud/gophercloud/testhelper"
+	fake "github.com/gophercloud/gophercloud/testhelper/client"
+)
+
+func TestCreate(t *testing.T) {
+	th.SetupHTTP()
+	defer th.TeardownHTTP()
+	HandleCreate(t)
+
+	opts := databases.BatchCreateOpts{
+		databases.CreateOpts{Name: "testingdb", CharSet: "utf8", Collate: "utf8_general_ci"},
+		databases.CreateOpts{Name: "sampledb"},
+	}
+
+	res := databases.Create(fake.ServiceClient(), instanceID, opts)
+	th.AssertNoErr(t, res.Err)
+}
+
+func TestList(t *testing.T) {
+	th.SetupHTTP()
+	defer th.TeardownHTTP()
+	HandleList(t)
+
+	expectedDBs := []databases.Database{
+		{Name: "anotherexampledb"},
+		{Name: "exampledb"},
+		{Name: "nextround"},
+		{Name: "sampledb"},
+		{Name: "testingdb"},
+	}
+
+	pages := 0
+	err := databases.List(fake.ServiceClient(), instanceID).EachPage(func(page pagination.Page) (bool, error) {
+		pages++
+
+		actual, err := databases.ExtractDBs(page)
+		if err != nil {
+			return false, err
+		}
+
+		th.CheckDeepEquals(t, expectedDBs, actual)
+
+		return true, nil
+	})
+
+	th.AssertNoErr(t, err)
+
+	if pages != 1 {
+		t.Errorf("Expected 1 page, saw %d", pages)
+	}
+}
+
+func TestDelete(t *testing.T) {
+	th.SetupHTTP()
+	defer th.TeardownHTTP()
+	HandleDelete(t)
+
+	err := databases.Delete(fake.ServiceClient(), instanceID, "{dbName}").ExtractErr()
+	th.AssertNoErr(t, err)
+}
diff --git a/openstack/db/v1/datastores/testing/doc.go b/openstack/db/v1/datastores/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/db/v1/datastores/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/db/v1/datastores/fixtures.go b/openstack/db/v1/datastores/testing/fixtures.go
similarity index 67%
rename from openstack/db/v1/datastores/fixtures.go
rename to openstack/db/v1/datastores/testing/fixtures.go
index 8caa586..3b82646 100644
--- a/openstack/db/v1/datastores/fixtures.go
+++ b/openstack/db/v1/datastores/testing/fixtures.go
@@ -1,11 +1,10 @@
-// +build fixtures
-
-package datastores
+package testing
 
 import (
 	"fmt"
 
 	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/openstack/db/v1/datastores"
 )
 
 const version1JSON = `
@@ -70,32 +69,32 @@
 	GetVersionResp   = fmt.Sprintf(`{"version":%s}`, version1JSON)
 )
 
-var ExampleVersion1 = Version{
+var ExampleVersion1 = datastores.Version{
 	ID: "b00000b0-00b0-0b00-00b0-000b000000bb",
 	Links: []gophercloud.Link{
-		gophercloud.Link{Rel: "self", Href: "https://10.240.28.38:8779/v1.0/1234/datastores/versions/b00000b0-00b0-0b00-00b0-000b000000bb"},
-		gophercloud.Link{Rel: "bookmark", Href: "https://10.240.28.38:8779/datastores/versions/b00000b0-00b0-0b00-00b0-000b000000bb"},
+		{Rel: "self", Href: "https://10.240.28.38:8779/v1.0/1234/datastores/versions/b00000b0-00b0-0b00-00b0-000b000000bb"},
+		{Rel: "bookmark", Href: "https://10.240.28.38:8779/datastores/versions/b00000b0-00b0-0b00-00b0-000b000000bb"},
 	},
 	Name: "5.1",
 }
 
-var exampleVersion2 = Version{
+var exampleVersion2 = datastores.Version{
 	ID: "c00000b0-00c0-0c00-00c0-000b000000cc",
 	Links: []gophercloud.Link{
-		gophercloud.Link{Rel: "self", Href: "https://10.240.28.38:8779/v1.0/1234/datastores/versions/c00000b0-00c0-0c00-00c0-000b000000cc"},
-		gophercloud.Link{Rel: "bookmark", Href: "https://10.240.28.38:8779/datastores/versions/c00000b0-00c0-0c00-00c0-000b000000cc"},
+		{Rel: "self", Href: "https://10.240.28.38:8779/v1.0/1234/datastores/versions/c00000b0-00c0-0c00-00c0-000b000000cc"},
+		{Rel: "bookmark", Href: "https://10.240.28.38:8779/datastores/versions/c00000b0-00c0-0c00-00c0-000b000000cc"},
 	},
 	Name: "5.2",
 }
 
-var ExampleVersions = []Version{ExampleVersion1, exampleVersion2}
+var ExampleVersions = []datastores.Version{ExampleVersion1, exampleVersion2}
 
-var ExampleDatastore = Datastore{
+var ExampleDatastore = datastores.Datastore{
 	DefaultVersion: "c00000b0-00c0-0c00-00c0-000b000000cc",
 	ID:             "10000000-0000-0000-0000-000000000001",
 	Links: []gophercloud.Link{
-		gophercloud.Link{Rel: "self", Href: "https://10.240.28.38:8779/v1.0/1234/datastores/10000000-0000-0000-0000-000000000001"},
-		gophercloud.Link{Rel: "bookmark", Href: "https://10.240.28.38:8779/datastores/10000000-0000-0000-0000-000000000001"},
+		{Rel: "self", Href: "https://10.240.28.38:8779/v1.0/1234/datastores/10000000-0000-0000-0000-000000000001"},
+		{Rel: "bookmark", Href: "https://10.240.28.38:8779/datastores/10000000-0000-0000-0000-000000000001"},
 	},
 	Name:     "mysql",
 	Versions: ExampleVersions,
diff --git a/openstack/db/v1/datastores/requests_test.go b/openstack/db/v1/datastores/testing/requests_test.go
similarity index 68%
rename from openstack/db/v1/datastores/requests_test.go
rename to openstack/db/v1/datastores/testing/requests_test.go
index 07faf2c..b505726 100644
--- a/openstack/db/v1/datastores/requests_test.go
+++ b/openstack/db/v1/datastores/testing/requests_test.go
@@ -1,8 +1,9 @@
-package datastores
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/db/v1/datastores"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
@@ -16,15 +17,15 @@
 
 	pages := 0
 
-	err := List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+	err := datastores.List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
 		pages++
 
-		actual, err := ExtractDatastores(page)
+		actual, err := datastores.ExtractDatastores(page)
 		if err != nil {
 			return false, err
 		}
 
-		th.CheckDeepEquals(t, []Datastore{ExampleDatastore}, actual)
+		th.CheckDeepEquals(t, []datastores.Datastore{ExampleDatastore}, actual)
 
 		return true, nil
 	})
@@ -38,7 +39,7 @@
 	defer th.TeardownHTTP()
 	fixture.SetupHandler(t, "/datastores/{dsID}", "GET", "", GetDSResp, 200)
 
-	ds, err := Get(fake.ServiceClient(), "{dsID}").Extract()
+	ds, err := datastores.Get(fake.ServiceClient(), "{dsID}").Extract()
 	th.AssertNoErr(t, err)
 	th.AssertDeepEquals(t, &ExampleDatastore, ds)
 }
@@ -50,10 +51,10 @@
 
 	pages := 0
 
-	err := ListVersions(fake.ServiceClient(), "{dsID}").EachPage(func(page pagination.Page) (bool, error) {
+	err := datastores.ListVersions(fake.ServiceClient(), "{dsID}").EachPage(func(page pagination.Page) (bool, error) {
 		pages++
 
-		actual, err := ExtractVersions(page)
+		actual, err := datastores.ExtractVersions(page)
 		if err != nil {
 			return false, err
 		}
@@ -72,7 +73,7 @@
 	defer th.TeardownHTTP()
 	fixture.SetupHandler(t, "/datastores/{dsID}/versions/{versionID}", "GET", "", GetVersionResp, 200)
 
-	ds, err := GetVersion(fake.ServiceClient(), "{dsID}", "{versionID}").Extract()
+	ds, err := datastores.GetVersion(fake.ServiceClient(), "{dsID}", "{versionID}").Extract()
 	th.AssertNoErr(t, err)
 	th.AssertDeepEquals(t, &ExampleVersion1, ds)
 }
diff --git a/openstack/db/v1/flavors/requests_test.go b/openstack/db/v1/flavors/requests_test.go
deleted file mode 100644
index ce01759..0000000
--- a/openstack/db/v1/flavors/requests_test.go
+++ /dev/null
@@ -1,91 +0,0 @@
-package flavors
-
-import (
-	"testing"
-
-	"github.com/gophercloud/gophercloud"
-	"github.com/gophercloud/gophercloud/pagination"
-	th "github.com/gophercloud/gophercloud/testhelper"
-	fake "github.com/gophercloud/gophercloud/testhelper/client"
-)
-
-func TestListFlavors(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	HandleList(t)
-
-	pages := 0
-	err := List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		pages++
-
-		actual, err := ExtractFlavors(page)
-		if err != nil {
-			return false, err
-		}
-
-		expected := []Flavor{
-			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"},
-				},
-			},
-			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"},
-				},
-			},
-			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"},
-				},
-			},
-			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)
-	th.AssertEquals(t, 1, pages)
-}
-
-func TestGetFlavor(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	HandleGet(t)
-
-	actual, err := Get(fake.ServiceClient(), flavorID).Extract()
-	th.AssertNoErr(t, err)
-
-	expected := &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/openstack/db/v1/flavors/testing/doc.go b/openstack/db/v1/flavors/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/db/v1/flavors/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/db/v1/flavors/fixtures.go b/openstack/db/v1/flavors/testing/fixtures.go
similarity index 96%
rename from openstack/db/v1/flavors/fixtures.go
rename to openstack/db/v1/flavors/testing/fixtures.go
index 257b214..b2b2d5f 100644
--- a/openstack/db/v1/flavors/fixtures.go
+++ b/openstack/db/v1/flavors/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package flavors
+package testing
 
 import (
 	"fmt"
diff --git a/openstack/db/v1/flavors/testing/requests_test.go b/openstack/db/v1/flavors/testing/requests_test.go
new file mode 100644
index 0000000..cbc0edd
--- /dev/null
+++ b/openstack/db/v1/flavors/testing/requests_test.go
@@ -0,0 +1,92 @@
+package testing
+
+import (
+	"testing"
+
+	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/openstack/db/v1/flavors"
+	"github.com/gophercloud/gophercloud/pagination"
+	th "github.com/gophercloud/gophercloud/testhelper"
+	fake "github.com/gophercloud/gophercloud/testhelper/client"
+)
+
+func TestListFlavors(t *testing.T) {
+	th.SetupHTTP()
+	defer th.TeardownHTTP()
+	HandleList(t)
+
+	pages := 0
+	err := flavors.List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+		pages++
+
+		actual, err := flavors.ExtractFlavors(page)
+		if err != nil {
+			return false, err
+		}
+
+		expected := []flavors.Flavor{
+			{
+				ID:   1,
+				Name: "m1.tiny",
+				RAM:  512,
+				Links: []gophercloud.Link{
+					{Href: "https://openstack.example.com/v1.0/1234/flavors/1", Rel: "self"},
+					{Href: "https://openstack.example.com/flavors/1", Rel: "bookmark"},
+				},
+			},
+			{
+				ID:   2,
+				Name: "m1.small",
+				RAM:  1024,
+				Links: []gophercloud.Link{
+					{Href: "https://openstack.example.com/v1.0/1234/flavors/2", Rel: "self"},
+					{Href: "https://openstack.example.com/flavors/2", Rel: "bookmark"},
+				},
+			},
+			{
+				ID:   3,
+				Name: "m1.medium",
+				RAM:  2048,
+				Links: []gophercloud.Link{
+					{Href: "https://openstack.example.com/v1.0/1234/flavors/3", Rel: "self"},
+					{Href: "https://openstack.example.com/flavors/3", Rel: "bookmark"},
+				},
+			},
+			{
+				ID:   4,
+				Name: "m1.large",
+				RAM:  4096,
+				Links: []gophercloud.Link{
+					{Href: "https://openstack.example.com/v1.0/1234/flavors/4", Rel: "self"},
+					{Href: "https://openstack.example.com/flavors/4", Rel: "bookmark"},
+				},
+			},
+		}
+
+		th.AssertDeepEquals(t, expected, actual)
+		return true, nil
+	})
+
+	th.AssertNoErr(t, err)
+	th.AssertEquals(t, 1, pages)
+}
+
+func TestGetFlavor(t *testing.T) {
+	th.SetupHTTP()
+	defer th.TeardownHTTP()
+	HandleGet(t)
+
+	actual, err := flavors.Get(fake.ServiceClient(), flavorID).Extract()
+	th.AssertNoErr(t, err)
+
+	expected := &flavors.Flavor{
+		ID:   1,
+		Name: "m1.tiny",
+		RAM:  512,
+		Links: []gophercloud.Link{
+			{Href: "https://openstack.example.com/v1.0/1234/flavors/1", Rel: "self"},
+		},
+	}
+
+	th.AssertDeepEquals(t, expected, actual)
+}
diff --git a/openstack/db/v1/instances/testing/doc.go b/openstack/db/v1/instances/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/db/v1/instances/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/db/v1/instances/fixtures.go b/openstack/db/v1/instances/testing/fixtures.go
similarity index 89%
rename from openstack/db/v1/instances/fixtures.go
rename to openstack/db/v1/instances/testing/fixtures.go
index 6be384c..e0a0d28 100644
--- a/openstack/db/v1/instances/fixtures.go
+++ b/openstack/db/v1/instances/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package instances
+package testing
 
 import (
 	"fmt"
@@ -10,6 +8,7 @@
 	"github.com/gophercloud/gophercloud"
 	"github.com/gophercloud/gophercloud/openstack/db/v1/datastores"
 	"github.com/gophercloud/gophercloud/openstack/db/v1/flavors"
+	"github.com/gophercloud/gophercloud/openstack/db/v1/instances"
 	"github.com/gophercloud/gophercloud/testhelper/fixture"
 )
 
@@ -110,24 +109,24 @@
 	isUserEnabledResp = `{"rootEnabled":true}`
 )
 
-var expectedInstance = Instance{
+var expectedInstance = instances.Instance{
 	Created: timeVal,
 	Updated: timeVal,
 	Flavor: flavors.Flavor{
 		ID: 1,
 		Links: []gophercloud.Link{
-			gophercloud.Link{Href: "https://my-openstack.com/v1.0/1234/flavors/1", Rel: "self"},
-			gophercloud.Link{Href: "https://my-openstack.com/v1.0/1234/flavors/1", Rel: "bookmark"},
+			{Href: "https://my-openstack.com/v1.0/1234/flavors/1", Rel: "self"},
+			{Href: "https://my-openstack.com/v1.0/1234/flavors/1", Rel: "bookmark"},
 		},
 	},
 	Hostname: "e09ad9a3f73309469cf1f43d11e79549caf9acf2.my-openstack.com",
 	ID:       instanceID,
 	Links: []gophercloud.Link{
-		gophercloud.Link{Href: "https://my-openstack.com/v1.0/1234/instances/1", Rel: "self"},
+		{Href: "https://my-openstack.com/v1.0/1234/instances/1", Rel: "self"},
 	},
 	Name:   "json_rack_instance",
 	Status: "BUILD",
-	Volume: Volume{Size: 2},
+	Volume: instances.Volume{Size: 2},
 	Datastore: datastores.DatastorePartial{
 		Type:    "mysql",
 		Version: "5.6",
diff --git a/openstack/db/v1/instances/requests_test.go b/openstack/db/v1/instances/testing/requests_test.go
similarity index 67%
rename from openstack/db/v1/instances/requests_test.go
rename to openstack/db/v1/instances/testing/requests_test.go
index 3caac23..e3c81e3 100644
--- a/openstack/db/v1/instances/requests_test.go
+++ b/openstack/db/v1/instances/testing/requests_test.go
@@ -1,9 +1,10 @@
-package instances
+package testing
 
 import (
 	"testing"
 
 	db "github.com/gophercloud/gophercloud/openstack/db/v1/databases"
+	"github.com/gophercloud/gophercloud/openstack/db/v1/instances"
 	"github.com/gophercloud/gophercloud/openstack/db/v1/users"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
@@ -15,26 +16,26 @@
 	defer th.TeardownHTTP()
 	HandleCreate(t)
 
-	opts := CreateOpts{
+	opts := instances.CreateOpts{
 		Name:      "json_rack_instance",
 		FlavorRef: "1",
 		Databases: db.BatchCreateOpts{
-			db.CreateOpts{CharSet: "utf8", Collate: "utf8_general_ci", Name: "sampledb"},
-			db.CreateOpts{Name: "nextround"},
+			{CharSet: "utf8", Collate: "utf8_general_ci", Name: "sampledb"},
+			{Name: "nextround"},
 		},
 		Users: users.BatchCreateOpts{
-			users.CreateOpts{
+			{
 				Name:     "demouser",
 				Password: "demopassword",
 				Databases: db.BatchCreateOpts{
-					db.CreateOpts{Name: "sampledb"},
+					{Name: "sampledb"},
 				},
 			},
 		},
 		Size: 2,
 	}
 
-	instance, err := Create(fake.ServiceClient(), opts).Extract()
+	instance, err := instances.Create(fake.ServiceClient(), opts).Extract()
 
 	th.AssertNoErr(t, err)
 	th.AssertDeepEquals(t, &expectedInstance, instance)
@@ -46,15 +47,15 @@
 	HandleList(t)
 
 	pages := 0
-	err := List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+	err := instances.List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
 		pages++
 
-		actual, err := ExtractInstances(page)
+		actual, err := instances.ExtractInstances(page)
 		if err != nil {
 			return false, err
 		}
 
-		th.CheckDeepEquals(t, []Instance{expectedInstance}, actual)
+		th.CheckDeepEquals(t, []instances.Instance{expectedInstance}, actual)
 		return true, nil
 	})
 
@@ -67,7 +68,7 @@
 	defer th.TeardownHTTP()
 	HandleGet(t)
 
-	instance, err := Get(fake.ServiceClient(), instanceID).Extract()
+	instance, err := instances.Get(fake.ServiceClient(), instanceID).Extract()
 
 	th.AssertNoErr(t, err)
 	th.AssertDeepEquals(t, &expectedInstance, instance)
@@ -78,7 +79,7 @@
 	defer th.TeardownHTTP()
 	HandleDelete(t)
 
-	res := Delete(fake.ServiceClient(), instanceID)
+	res := instances.Delete(fake.ServiceClient(), instanceID)
 	th.AssertNoErr(t, res.Err)
 }
 
@@ -88,7 +89,7 @@
 	HandleEnableRoot(t)
 
 	expected := &users.User{Name: "root", Password: "secretsecret"}
-	user, err := EnableRootUser(fake.ServiceClient(), instanceID).Extract()
+	user, err := instances.EnableRootUser(fake.ServiceClient(), instanceID).Extract()
 
 	th.AssertNoErr(t, err)
 	th.AssertDeepEquals(t, expected, user)
@@ -99,7 +100,7 @@
 	defer th.TeardownHTTP()
 	HandleIsRootEnabled(t)
 
-	isEnabled, err := IsRootEnabled(fake.ServiceClient(), instanceID).Extract()
+	isEnabled, err := instances.IsRootEnabled(fake.ServiceClient(), instanceID).Extract()
 
 	th.AssertNoErr(t, err)
 	th.AssertEquals(t, true, isEnabled)
@@ -110,7 +111,7 @@
 	defer th.TeardownHTTP()
 	HandleRestart(t)
 
-	res := Restart(fake.ServiceClient(), instanceID)
+	res := instances.Restart(fake.ServiceClient(), instanceID)
 	th.AssertNoErr(t, res.Err)
 }
 
@@ -119,7 +120,7 @@
 	defer th.TeardownHTTP()
 	HandleResize(t)
 
-	res := Resize(fake.ServiceClient(), instanceID, "2")
+	res := instances.Resize(fake.ServiceClient(), instanceID, "2")
 	th.AssertNoErr(t, res.Err)
 }
 
@@ -128,6 +129,6 @@
 	defer th.TeardownHTTP()
 	HandleResizeVol(t)
 
-	res := ResizeVolume(fake.ServiceClient(), instanceID, 4)
+	res := instances.ResizeVolume(fake.ServiceClient(), instanceID, 4)
 	th.AssertNoErr(t, res.Err)
 }
diff --git a/openstack/db/v1/users/testing/doc.go b/openstack/db/v1/users/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/db/v1/users/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/db/v1/users/fixtures.go b/openstack/db/v1/users/testing/fixtures.go
similarity index 96%
rename from openstack/db/v1/users/fixtures.go
rename to openstack/db/v1/users/testing/fixtures.go
index 3661154..f49f46f 100644
--- a/openstack/db/v1/users/fixtures.go
+++ b/openstack/db/v1/users/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package users
+package testing
 
 import (
 	"fmt"
diff --git a/openstack/db/v1/users/requests_test.go b/openstack/db/v1/users/testing/requests_test.go
similarity index 68%
rename from openstack/db/v1/users/requests_test.go
rename to openstack/db/v1/users/testing/requests_test.go
index 1eefb33..952f245 100644
--- a/openstack/db/v1/users/requests_test.go
+++ b/openstack/db/v1/users/testing/requests_test.go
@@ -1,9 +1,10 @@
-package users
+package testing
 
 import (
 	"testing"
 
 	db "github.com/gophercloud/gophercloud/openstack/db/v1/databases"
+	"github.com/gophercloud/gophercloud/openstack/db/v1/users"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
@@ -14,25 +15,25 @@
 	defer th.TeardownHTTP()
 	HandleCreate(t)
 
-	opts := BatchCreateOpts{
-		CreateOpts{
+	opts := users.BatchCreateOpts{
+		{
 			Databases: db.BatchCreateOpts{
 				db.CreateOpts{Name: "databaseA"},
 			},
 			Name:     "dbuser3",
 			Password: "secretsecret",
 		},
-		CreateOpts{
+		{
 			Databases: db.BatchCreateOpts{
-				db.CreateOpts{Name: "databaseB"},
-				db.CreateOpts{Name: "databaseC"},
+				{Name: "databaseB"},
+				{Name: "databaseC"},
 			},
 			Name:     "dbuser4",
 			Password: "secretsecret",
 		},
 	}
 
-	res := Create(fake.ServiceClient(), instanceID, opts)
+	res := users.Create(fake.ServiceClient(), instanceID, opts)
 	th.AssertNoErr(t, res.Err)
 }
 
@@ -41,27 +42,27 @@
 	defer th.TeardownHTTP()
 	HandleList(t)
 
-	expectedUsers := []User{
-		User{
+	expectedUsers := []users.User{
+		{
 			Databases: []db.Database{
 				db.Database{Name: "databaseA"},
 			},
 			Name: "dbuser3",
 		},
-		User{
+		{
 			Databases: []db.Database{
-				db.Database{Name: "databaseB"},
-				db.Database{Name: "databaseC"},
+				{Name: "databaseB"},
+				{Name: "databaseC"},
 			},
 			Name: "dbuser4",
 		},
 	}
 
 	pages := 0
-	err := List(fake.ServiceClient(), instanceID).EachPage(func(page pagination.Page) (bool, error) {
+	err := users.List(fake.ServiceClient(), instanceID).EachPage(func(page pagination.Page) (bool, error) {
 		pages++
 
-		actual, err := ExtractUsers(page)
+		actual, err := users.ExtractUsers(page)
 		if err != nil {
 			return false, err
 		}
@@ -79,6 +80,6 @@
 	defer th.TeardownHTTP()
 	HandleDelete(t)
 
-	res := Delete(fake.ServiceClient(), instanceID, "{userName}")
+	res := users.Delete(fake.ServiceClient(), instanceID, "{userName}")
 	th.AssertNoErr(t, res.Err)
 }
diff --git a/openstack/identity/v2/extensions/admin/roles/testing/doc.go b/openstack/identity/v2/extensions/admin/roles/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/identity/v2/extensions/admin/roles/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/identity/v2/extensions/admin/roles/fixtures.go b/openstack/identity/v2/extensions/admin/roles/testing/fixtures.go
similarity index 97%
rename from openstack/identity/v2/extensions/admin/roles/fixtures.go
rename to openstack/identity/v2/extensions/admin/roles/testing/fixtures.go
index 6b11f5c..498c161 100644
--- a/openstack/identity/v2/extensions/admin/roles/fixtures.go
+++ b/openstack/identity/v2/extensions/admin/roles/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package roles
+package testing
 
 import (
 	"fmt"
diff --git a/openstack/identity/v2/extensions/admin/roles/requests_test.go b/openstack/identity/v2/extensions/admin/roles/testing/requests_test.go
similarity index 65%
rename from openstack/identity/v2/extensions/admin/roles/requests_test.go
rename to openstack/identity/v2/extensions/admin/roles/testing/requests_test.go
index cf3402d..8cf5395 100644
--- a/openstack/identity/v2/extensions/admin/roles/requests_test.go
+++ b/openstack/identity/v2/extensions/admin/roles/testing/requests_test.go
@@ -1,8 +1,9 @@
-package roles
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/identity/v2/extensions/admin/roles"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
@@ -16,16 +17,16 @@
 
 	count := 0
 
-	err := List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+	err := roles.List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractRoles(page)
+		actual, err := roles.ExtractRoles(page)
 		if err != nil {
 			t.Errorf("Failed to extract users: %v", err)
 			return false, err
 		}
 
-		expected := []Role{
-			Role{
+		expected := []roles.Role{
+			{
 				ID:          "123",
 				Name:        "compute:admin",
 				Description: "Nova Administrator",
@@ -47,7 +48,7 @@
 
 	MockAddUserRoleResponse(t)
 
-	err := AddUser(client.ServiceClient(), "{tenant_id}", "{user_id}", "{role_id}").ExtractErr()
+	err := roles.AddUser(client.ServiceClient(), "{tenant_id}", "{user_id}", "{role_id}").ExtractErr()
 
 	th.AssertNoErr(t, err)
 }
@@ -58,7 +59,7 @@
 
 	MockDeleteUserRoleResponse(t)
 
-	err := DeleteUser(client.ServiceClient(), "{tenant_id}", "{user_id}", "{role_id}").ExtractErr()
+	err := roles.DeleteUser(client.ServiceClient(), "{tenant_id}", "{user_id}", "{role_id}").ExtractErr()
 
 	th.AssertNoErr(t, err)
 }
diff --git a/openstack/identity/v2/extensions/delegate_test.go b/openstack/identity/v2/extensions/testing/delegate_test.go
similarity index 69%
rename from openstack/identity/v2/extensions/delegate_test.go
rename to openstack/identity/v2/extensions/testing/delegate_test.go
index b425130..e7869d8 100644
--- a/openstack/identity/v2/extensions/delegate_test.go
+++ b/openstack/identity/v2/extensions/testing/delegate_test.go
@@ -1,9 +1,10 @@
-package extensions
+package testing
 
 import (
 	"testing"
 
-	common "github.com/gophercloud/gophercloud/openstack/common/extensions"
+	common "github.com/gophercloud/gophercloud/openstack/common/extensions/testing"
+	"github.com/gophercloud/gophercloud/openstack/identity/v2/extensions"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
@@ -15,9 +16,9 @@
 	HandleListExtensionsSuccessfully(t)
 
 	count := 0
-	err := List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+	err := extensions.List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractExtensions(page)
+		actual, err := extensions.ExtractExtensions(page)
 		th.AssertNoErr(t, err)
 		th.CheckDeepEquals(t, common.ExpectedExtensions, actual)
 
@@ -32,7 +33,7 @@
 	defer th.TeardownHTTP()
 	common.HandleGetExtensionSuccessfully(t)
 
-	actual, err := Get(client.ServiceClient(), "agent").Extract()
+	actual, err := extensions.Get(client.ServiceClient(), "agent").Extract()
 	th.AssertNoErr(t, err)
 	th.CheckDeepEquals(t, common.SingleExtension, actual)
 }
diff --git a/openstack/identity/v2/extensions/testing/doc.go b/openstack/identity/v2/extensions/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/identity/v2/extensions/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/identity/v2/extensions/fixtures.go b/openstack/identity/v2/extensions/testing/fixtures.go
similarity index 97%
rename from openstack/identity/v2/extensions/fixtures.go
rename to openstack/identity/v2/extensions/testing/fixtures.go
index 3fd5ad9..60afb74 100644
--- a/openstack/identity/v2/extensions/fixtures.go
+++ b/openstack/identity/v2/extensions/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package extensions
+package testing
 
 import (
 	"fmt"
diff --git a/openstack/identity/v2/tenants/testing/doc.go b/openstack/identity/v2/tenants/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/identity/v2/tenants/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/identity/v2/tenants/fixtures.go b/openstack/identity/v2/tenants/testing/fixtures.go
similarity index 86%
rename from openstack/identity/v2/tenants/fixtures.go
rename to openstack/identity/v2/tenants/testing/fixtures.go
index 3ccc791..7ddba45 100644
--- a/openstack/identity/v2/tenants/fixtures.go
+++ b/openstack/identity/v2/tenants/testing/fixtures.go
@@ -1,12 +1,11 @@
-// +build fixtures
-
-package tenants
+package testing
 
 import (
 	"fmt"
 	"net/http"
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/identity/v2/tenants"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
 )
@@ -32,7 +31,7 @@
 `
 
 // RedTeam is a Tenant fixture.
-var RedTeam = Tenant{
+var RedTeam = tenants.Tenant{
 	ID:          "1234",
 	Name:        "Red Team",
 	Description: "The team that is red",
@@ -40,7 +39,7 @@
 }
 
 // BlueTeam is a Tenant fixture.
-var BlueTeam = Tenant{
+var BlueTeam = tenants.Tenant{
 	ID:          "9876",
 	Name:        "Blue Team",
 	Description: "The team that is blue",
@@ -48,7 +47,7 @@
 }
 
 // ExpectedTenantSlice is the slice of tenants expected to be returned from ListOutput.
-var ExpectedTenantSlice = []Tenant{RedTeam, BlueTeam}
+var ExpectedTenantSlice = []tenants.Tenant{RedTeam, BlueTeam}
 
 // HandleListTenantsSuccessfully creates an HTTP handler at `/tenants` on the test handler mux that
 // responds with a list of two tenants.
diff --git a/openstack/identity/v2/tenants/requests_test.go b/openstack/identity/v2/tenants/testing/requests_test.go
similarity index 67%
rename from openstack/identity/v2/tenants/requests_test.go
rename to openstack/identity/v2/tenants/testing/requests_test.go
index d7a4db0..2a9b71c 100644
--- a/openstack/identity/v2/tenants/requests_test.go
+++ b/openstack/identity/v2/tenants/testing/requests_test.go
@@ -1,8 +1,9 @@
-package tenants
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/identity/v2/tenants"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
@@ -14,10 +15,10 @@
 	HandleListTenantsSuccessfully(t)
 
 	count := 0
-	err := List(client.ServiceClient(), nil).EachPage(func(page pagination.Page) (bool, error) {
+	err := tenants.List(client.ServiceClient(), nil).EachPage(func(page pagination.Page) (bool, error) {
 		count++
 
-		actual, err := ExtractTenants(page)
+		actual, err := tenants.ExtractTenants(page)
 		th.AssertNoErr(t, err)
 
 		th.CheckDeepEquals(t, ExpectedTenantSlice, actual)
diff --git a/openstack/identity/v2/tokens/testing/doc.go b/openstack/identity/v2/tokens/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/identity/v2/tokens/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/identity/v2/tokens/fixtures.go b/openstack/identity/v2/tokens/testing/fixtures.go
similarity index 86%
rename from openstack/identity/v2/tokens/fixtures.go
rename to openstack/identity/v2/tokens/testing/fixtures.go
index 85a9571..d3a8f24 100644
--- a/openstack/identity/v2/tokens/fixtures.go
+++ b/openstack/identity/v2/tokens/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package tokens
+package testing
 
 import (
 	"fmt"
@@ -9,12 +7,13 @@
 	"time"
 
 	"github.com/gophercloud/gophercloud/openstack/identity/v2/tenants"
+	"github.com/gophercloud/gophercloud/openstack/identity/v2/tokens"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	thclient "github.com/gophercloud/gophercloud/testhelper/client"
 )
 
 // ExpectedToken is the token that should be parsed from TokenCreationResponse.
-var ExpectedToken = &Token{
+var ExpectedToken = &tokens.Token{
 	ID:        "aaaabbbbccccdddd",
 	ExpiresAt: time.Date(2014, time.January, 31, 15, 30, 58, 0, time.UTC),
 	Tenant: tenants.Tenant{
@@ -26,27 +25,27 @@
 }
 
 // ExpectedServiceCatalog is the service catalog that should be parsed from TokenCreationResponse.
-var ExpectedServiceCatalog = &ServiceCatalog{
-	Entries: []CatalogEntry{
-		CatalogEntry{
+var ExpectedServiceCatalog = &tokens.ServiceCatalog{
+	Entries: []tokens.CatalogEntry{
+		{
 			Name: "inscrutablewalrus",
 			Type: "something",
-			Endpoints: []Endpoint{
-				Endpoint{
+			Endpoints: []tokens.Endpoint{
+				{
 					PublicURL: "http://something0:1234/v2/",
 					Region:    "region0",
 				},
-				Endpoint{
+				{
 					PublicURL: "http://something1:1234/v2/",
 					Region:    "region1",
 				},
 			},
 		},
-		CatalogEntry{
+		{
 			Name: "arbitrarypenguin",
 			Type: "else",
-			Endpoints: []Endpoint{
-				Endpoint{
+			Endpoints: []tokens.Endpoint{
+				{
 					PublicURL: "http://else0:4321/v3/",
 					Region:    "region0",
 				},
@@ -56,10 +55,10 @@
 }
 
 // ExpectedUser is the token that should be parsed from TokenGetResponse.
-var ExpectedUser = &User{
+var ExpectedUser = &tokens.User{
 	ID:       "a530fefc3d594c4ba2693a4ecd6be74e",
 	Name:     "apiserver",
-	Roles:    []Role{{"member"}, {"service"}},
+	Roles:    []tokens.Role{{"member"}, {"service"}},
 	UserName: "apiserver",
 }
 
@@ -123,19 +122,19 @@
 				"name": "test"
 			}
 		},
-        "serviceCatalog": [], 
+        "serviceCatalog": [],
 		"user": {
-            "id": "a530fefc3d594c4ba2693a4ecd6be74e", 
-            "name": "apiserver", 
+            "id": "a530fefc3d594c4ba2693a4ecd6be74e",
+            "name": "apiserver",
             "roles": [
                 {
                     "name": "member"
-                }, 
+                },
                 {
                     "name": "service"
                 }
-            ], 
-            "roles_links": [], 
+            ],
+            "roles_links": [],
             "username": "apiserver"
         }
     }
@@ -172,7 +171,7 @@
 
 // IsSuccessful ensures that a CreateResult was successful and contains the correct token and
 // service catalog.
-func IsSuccessful(t *testing.T, result CreateResult) {
+func IsSuccessful(t *testing.T, result tokens.CreateResult) {
 	token, err := result.ExtractToken()
 	th.AssertNoErr(t, err)
 	th.CheckDeepEquals(t, ExpectedToken, token)
@@ -184,7 +183,7 @@
 
 // GetIsSuccessful ensures that a GetResult was successful and contains the correct token and
 // User Info.
-func GetIsSuccessful(t *testing.T, result GetResult) {
+func GetIsSuccessful(t *testing.T, result tokens.GetResult) {
 	token, err := result.ExtractToken()
 	th.AssertNoErr(t, err)
 	th.CheckDeepEquals(t, ExpectedToken, token)
diff --git a/openstack/identity/v2/tokens/requests_test.go b/openstack/identity/v2/tokens/testing/requests_test.go
similarity index 84%
rename from openstack/identity/v2/tokens/requests_test.go
rename to openstack/identity/v2/tokens/testing/requests_test.go
index a6d16f3..b687a92 100644
--- a/openstack/identity/v2/tokens/requests_test.go
+++ b/openstack/identity/v2/tokens/testing/requests_test.go
@@ -1,19 +1,20 @@
-package tokens
+package testing
 
 import (
 	"testing"
 
 	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/openstack/identity/v2/tokens"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
 )
 
-func tokenPost(t *testing.T, options gophercloud.AuthOptions, requestJSON string) CreateResult {
+func tokenPost(t *testing.T, options gophercloud.AuthOptions, requestJSON string) tokens.CreateResult {
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
 	HandleTokenPost(t, requestJSON)
 
-	return Create(client.ServiceClient(), options)
+	return tokens.Create(client.ServiceClient(), options)
 }
 
 func tokenPostErr(t *testing.T, options gophercloud.AuthOptions, expectedErr error) {
@@ -21,7 +22,7 @@
 	defer th.TeardownHTTP()
 	HandleTokenPost(t, "")
 
-	actualErr := Create(client.ServiceClient(), options).Err
+	actualErr := tokens.Create(client.ServiceClient(), options).Err
 	th.CheckDeepEquals(t, expectedErr, actualErr)
 }
 
@@ -91,11 +92,11 @@
 	tokenPostErr(t, options, gophercloud.ErrMissingInput{Argument: "Username"})
 }
 
-func tokenGet(t *testing.T, tokenId string) GetResult {
+func tokenGet(t *testing.T, tokenId string) tokens.GetResult {
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
 	HandleTokenGet(t, tokenId)
-	return Get(client.ServiceClient(), tokenId)
+	return tokens.Get(client.ServiceClient(), tokenId)
 }
 
 func TestGetWithToken(t *testing.T) {
diff --git a/openstack/identity/v2/users/testing/doc.go b/openstack/identity/v2/users/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/identity/v2/users/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/identity/v2/users/fixtures.go b/openstack/identity/v2/users/testing/fixtures.go
similarity index 98%
rename from openstack/identity/v2/users/fixtures.go
rename to openstack/identity/v2/users/testing/fixtures.go
index 7b0bc4c..c1c3b89 100644
--- a/openstack/identity/v2/users/fixtures.go
+++ b/openstack/identity/v2/users/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package users
+package testing
 
 import (
 	"fmt"
diff --git a/openstack/identity/v2/users/requests_test.go b/openstack/identity/v2/users/testing/requests_test.go
similarity index 71%
rename from openstack/identity/v2/users/requests_test.go
rename to openstack/identity/v2/users/testing/requests_test.go
index 0e6da37..3cb047e 100644
--- a/openstack/identity/v2/users/requests_test.go
+++ b/openstack/identity/v2/users/testing/requests_test.go
@@ -1,9 +1,10 @@
-package users
+package testing
 
 import (
 	"testing"
 
 	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/openstack/identity/v2/users"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
@@ -17,13 +18,13 @@
 
 	count := 0
 
-	err := List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+	err := users.List(client.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractUsers(page)
+		actual, err := users.ExtractUsers(page)
 		th.AssertNoErr(t, err)
 
-		expected := []User{
-			User{
+		expected := []users.User{
+			{
 				ID:       "u1000",
 				Name:     "John Smith",
 				Username: "jqsmith",
@@ -31,7 +32,7 @@
 				Enabled:  true,
 				TenantID: "12345",
 			},
-			User{
+			{
 				ID:       "u1001",
 				Name:     "Jane Smith",
 				Username: "jqsmith",
@@ -53,18 +54,18 @@
 
 	mockCreateUserResponse(t)
 
-	opts := CreateOpts{
+	opts := users.CreateOpts{
 		Name:     "new_user",
 		TenantID: "12345",
 		Enabled:  gophercloud.Disabled,
 		Email:    "new_user@foo.com",
 	}
 
-	user, err := Create(client.ServiceClient(), opts).Extract()
+	user, err := users.Create(client.ServiceClient(), opts).Extract()
 
 	th.AssertNoErr(t, err)
 
-	expected := &User{
+	expected := &users.User{
 		Name:     "new_user",
 		ID:       "c39e3de9be2d4c779f1dfd6abacc176d",
 		Email:    "new_user@foo.com",
@@ -81,10 +82,10 @@
 
 	mockGetUserResponse(t)
 
-	user, err := Get(client.ServiceClient(), "new_user").Extract()
+	user, err := users.Get(client.ServiceClient(), "new_user").Extract()
 	th.AssertNoErr(t, err)
 
-	expected := &User{
+	expected := &users.User{
 		Name:     "new_user",
 		ID:       "c39e3de9be2d4c779f1dfd6abacc176d",
 		Email:    "new_user@foo.com",
@@ -102,17 +103,17 @@
 	mockUpdateUserResponse(t)
 
 	id := "c39e3de9be2d4c779f1dfd6abacc176d"
-	opts := UpdateOpts{
+	opts := users.UpdateOpts{
 		Name:    "new_name",
 		Enabled: gophercloud.Enabled,
 		Email:   "new_email@foo.com",
 	}
 
-	user, err := Update(client.ServiceClient(), id, opts).Extract()
+	user, err := users.Update(client.ServiceClient(), id, opts).Extract()
 
 	th.AssertNoErr(t, err)
 
-	expected := &User{
+	expected := &users.User{
 		Name:     "new_name",
 		ID:       id,
 		Email:    "new_email@foo.com",
@@ -129,7 +130,7 @@
 
 	mockDeleteUserResponse(t)
 
-	res := Delete(client.ServiceClient(), "c39e3de9be2d4c779f1dfd6abacc176d")
+	res := users.Delete(client.ServiceClient(), "c39e3de9be2d4c779f1dfd6abacc176d")
 	th.AssertNoErr(t, res.Err)
 }
 
@@ -142,13 +143,13 @@
 	tenantID := "1d8b6120dcc640fda4fc9194ffc80273"
 	userID := "c39e3de9be2d4c779f1dfd6abacc176d"
 
-	err := ListRoles(client.ServiceClient(), tenantID, userID).EachPage(func(page pagination.Page) (bool, error) {
-		actual, err := ExtractRoles(page)
+	err := users.ListRoles(client.ServiceClient(), tenantID, userID).EachPage(func(page pagination.Page) (bool, error) {
+		actual, err := users.ExtractRoles(page)
 		th.AssertNoErr(t, err)
 
-		expected := []Role{
-			Role{ID: "9fe2ff9ee4384b1894a90878d3e92bab", Name: "foo_role"},
-			Role{ID: "1ea3d56793574b668e85960fbf651e13", Name: "admin"},
+		expected := []users.Role{
+			{ID: "9fe2ff9ee4384b1894a90878d3e92bab", Name: "foo_role"},
+			{ID: "1ea3d56793574b668e85960fbf651e13", Name: "admin"},
 		}
 
 		th.CheckDeepEquals(t, expected, actual)
diff --git a/openstack/identity/v3/endpoints/testing/doc.go b/openstack/identity/v3/endpoints/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/identity/v3/endpoints/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/identity/v3/endpoints/requests_test.go b/openstack/identity/v3/endpoints/testing/requests_test.go
similarity index 88%
rename from openstack/identity/v3/endpoints/requests_test.go
rename to openstack/identity/v3/endpoints/testing/requests_test.go
index 14bbe6a..53d8488 100644
--- a/openstack/identity/v3/endpoints/requests_test.go
+++ b/openstack/identity/v3/endpoints/testing/requests_test.go
@@ -1,4 +1,4 @@
-package endpoints
+package testing
 
 import (
 	"fmt"
@@ -6,6 +6,7 @@
 	"testing"
 
 	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/openstack/identity/v3/endpoints"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
@@ -48,7 +49,7 @@
     `)
 	})
 
-	actual, err := Create(client.ServiceClient(), CreateOpts{
+	actual, err := endpoints.Create(client.ServiceClient(), endpoints.CreateOpts{
 		Availability: gophercloud.AvailabilityPublic,
 		Name:         "the-endiest-of-points",
 		Region:       "underground",
@@ -57,7 +58,7 @@
 	}).Extract()
 	th.AssertNoErr(t, err)
 
-	expected := &Endpoint{
+	expected := &endpoints.Endpoint{
 		ID:           "12",
 		Availability: gophercloud.AvailabilityPublic,
 		Name:         "the-endiest-of-points",
@@ -113,16 +114,16 @@
 	})
 
 	count := 0
-	List(client.ServiceClient(), ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
+	endpoints.List(client.ServiceClient(), endpoints.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractEndpoints(page)
+		actual, err := endpoints.ExtractEndpoints(page)
 		if err != nil {
 			t.Errorf("Failed to extract endpoints: %v", err)
 			return false, err
 		}
 
-		expected := []Endpoint{
-			Endpoint{
+		expected := []endpoints.Endpoint{
+			{
 				ID:           "12",
 				Availability: gophercloud.AvailabilityPublic,
 				Name:         "the-endiest-of-points",
@@ -130,7 +131,7 @@
 				ServiceID:    "asdfasdfasdfasdf",
 				URL:          "https://1.2.3.4:9000/",
 			},
-			Endpoint{
+			{
 				ID:           "13",
 				Availability: gophercloud.AvailabilityInternal,
 				Name:         "shhhh",
@@ -178,7 +179,7 @@
 	`)
 	})
 
-	actual, err := Update(client.ServiceClient(), "12", UpdateOpts{
+	actual, err := endpoints.Update(client.ServiceClient(), "12", endpoints.UpdateOpts{
 		Name:   "renamed",
 		Region: "somewhere-else",
 	}).Extract()
@@ -186,7 +187,7 @@
 		t.Fatalf("Unexpected error from Update: %v", err)
 	}
 
-	expected := &Endpoint{
+	expected := &endpoints.Endpoint{
 		ID:           "12",
 		Availability: gophercloud.AvailabilityPublic,
 		Name:         "renamed",
@@ -208,6 +209,6 @@
 		w.WriteHeader(http.StatusNoContent)
 	})
 
-	res := Delete(client.ServiceClient(), "34")
+	res := endpoints.Delete(client.ServiceClient(), "34")
 	th.AssertNoErr(t, res.Err)
 }
diff --git a/openstack/identity/v3/roles/testing/doc.go b/openstack/identity/v3/roles/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/identity/v3/roles/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/identity/v3/roles/requests_test.go b/openstack/identity/v3/roles/testing/requests_test.go
similarity index 79%
rename from openstack/identity/v3/roles/requests_test.go
rename to openstack/identity/v3/roles/testing/requests_test.go
index ec6531c..dd9b704 100644
--- a/openstack/identity/v3/roles/requests_test.go
+++ b/openstack/identity/v3/roles/testing/requests_test.go
@@ -1,4 +1,4 @@
-package roles
+package testing
 
 import (
 	"fmt"
@@ -6,6 +6,7 @@
 	"reflect"
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/identity/v3/roles"
 	"github.com/gophercloud/gophercloud/pagination"
 	"github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
@@ -67,25 +68,25 @@
 	})
 
 	count := 0
-	err := ListAssignments(client.ServiceClient(), ListAssignmentsOpts{}).EachPage(func(page pagination.Page) (bool, error) {
+	err := roles.ListAssignments(client.ServiceClient(), roles.ListAssignmentsOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractRoleAssignments(page)
+		actual, err := roles.ExtractRoleAssignments(page)
 		if err != nil {
 			return false, err
 		}
 
-		expected := []RoleAssignment{
-			RoleAssignment{
-				Role:  Role{ID: "123456"},
-				Scope: Scope{Domain: Domain{ID: "161718"}},
-				User:  User{ID: "313233"},
-				Group: Group{},
+		expected := []roles.RoleAssignment{
+			{
+				Role:  roles.Role{ID: "123456"},
+				Scope: roles.Scope{Domain: roles.Domain{ID: "161718"}},
+				User:  roles.User{ID: "313233"},
+				Group: roles.Group{},
 			},
-			RoleAssignment{
-				Role:  Role{ID: "123456"},
-				Scope: Scope{Project: Project{ID: "456789"}},
-				User:  User{ID: "313233"},
-				Group: Group{},
+			{
+				Role:  roles.Role{ID: "123456"},
+				Scope: roles.Scope{Project: roles.Project{ID: "456789"}},
+				User:  roles.User{ID: "313233"},
+				Group: roles.Group{},
 			},
 		}
 
diff --git a/openstack/identity/v3/services/testing/doc.go b/openstack/identity/v3/services/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/identity/v3/services/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/identity/v3/services/requests_test.go b/openstack/identity/v3/services/testing/requests_test.go
similarity index 84%
rename from openstack/identity/v3/services/requests_test.go
rename to openstack/identity/v3/services/testing/requests_test.go
index aa19bcc..0a065a2 100644
--- a/openstack/identity/v3/services/requests_test.go
+++ b/openstack/identity/v3/services/testing/requests_test.go
@@ -1,10 +1,11 @@
-package services
+package testing
 
 import (
 	"fmt"
 	"net/http"
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/identity/v3/services"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	"github.com/gophercloud/gophercloud/testhelper/client"
@@ -31,14 +32,14 @@
     }`)
 	})
 
-	expected := &Service{
+	expected := &services.Service{
 		Description: "Here's your service",
 		ID:          "1234",
 		Name:        "InscrutableOpenStackProjectName",
 		Type:        "compute",
 	}
 
-	actual, err := Create(client.ServiceClient(), "compute").Extract()
+	actual, err := services.Create(client.ServiceClient(), "compute").Extract()
 	if err != nil {
 		t.Fatalf("Unexpected error from Create: %v", err)
 	}
@@ -79,21 +80,21 @@
 	})
 
 	count := 0
-	err := List(client.ServiceClient(), ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
+	err := services.List(client.ServiceClient(), services.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractServices(page)
+		actual, err := services.ExtractServices(page)
 		if err != nil {
 			return false, err
 		}
 
-		expected := []Service{
-			Service{
+		expected := []services.Service{
+			{
 				Description: "Service One",
 				ID:          "1234",
 				Name:        "service-one",
 				Type:        "identity",
 			},
-			Service{
+			{
 				Description: "Service Two",
 				ID:          "9876",
 				Name:        "service-two",
@@ -128,10 +129,10 @@
 		`)
 	})
 
-	actual, err := Get(client.ServiceClient(), "12345").Extract()
+	actual, err := services.Get(client.ServiceClient(), "12345").Extract()
 	th.AssertNoErr(t, err)
 
-	expected := &Service{
+	expected := &services.Service{
 		ID:          "12345",
 		Description: "Service One",
 		Name:        "service-one",
@@ -161,12 +162,12 @@
 		`)
 	})
 
-	expected := &Service{
+	expected := &services.Service{
 		ID:   "12345",
 		Type: "lasermagic",
 	}
 
-	actual, err := Update(client.ServiceClient(), "12345", "lasermagic").Extract()
+	actual, err := services.Update(client.ServiceClient(), "12345", "lasermagic").Extract()
 	th.AssertNoErr(t, err)
 	th.AssertDeepEquals(t, expected, actual)
 }
@@ -181,6 +182,6 @@
 		w.WriteHeader(http.StatusNoContent)
 	})
 
-	res := Delete(client.ServiceClient(), "12345")
+	res := services.Delete(client.ServiceClient(), "12345")
 	th.AssertNoErr(t, res.Err)
 }
diff --git a/openstack/identity/v3/tokens/testing/doc.go b/openstack/identity/v3/tokens/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/identity/v3/tokens/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/identity/v3/tokens/requests_test.go b/openstack/identity/v3/tokens/testing/requests_test.go
similarity index 66%
rename from openstack/identity/v3/tokens/requests_test.go
rename to openstack/identity/v3/tokens/testing/requests_test.go
index faa79e0..cbb675f 100644
--- a/openstack/identity/v3/tokens/requests_test.go
+++ b/openstack/identity/v3/tokens/testing/requests_test.go
@@ -1,4 +1,4 @@
-package tokens
+package testing
 
 import (
 	"fmt"
@@ -7,11 +7,12 @@
 	"time"
 
 	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/openstack/identity/v3/tokens"
 	"github.com/gophercloud/gophercloud/testhelper"
 )
 
 // authTokenPost verifies that providing certain AuthOptions and Scope results in an expected JSON structure.
-func authTokenPost(t *testing.T, options AuthOptions, scope *Scope, requestJSON string) {
+func authTokenPost(t *testing.T, options tokens.AuthOptions, scope *tokens.Scope, requestJSON string) {
 	testhelper.SetupHTTP()
 	defer testhelper.TeardownHTTP()
 
@@ -34,13 +35,13 @@
 		}`)
 	})
 
-	_, err := Create(&client, options, scope).Extract()
+	_, err := tokens.Create(&client, options, scope).Extract()
 	if err != nil {
 		t.Errorf("Create returned an error: %v", err)
 	}
 }
 
-func authTokenPostErr(t *testing.T, options AuthOptions, scope *Scope, includeToken bool, expectedErr error) {
+func authTokenPostErr(t *testing.T, options tokens.AuthOptions, scope *tokens.Scope, includeToken bool, expectedErr error) {
 	testhelper.SetupHTTP()
 	defer testhelper.TeardownHTTP()
 
@@ -52,7 +53,7 @@
 		client.TokenID = "abcdef123456"
 	}
 
-	_, err := Create(&client, options, scope).Extract()
+	_, err := tokens.Create(&client, options, scope).Extract()
 	if err == nil {
 		t.Errorf("Create did NOT return an error")
 	}
@@ -62,7 +63,7 @@
 }
 
 func TestCreateUserIDAndPassword(t *testing.T) {
-	authTokenPost(t, AuthOptions{UserID: "me", Password: "squirrel!"}, nil, `
+	authTokenPost(t, tokens.AuthOptions{UserID: "me", Password: "squirrel!"}, nil, `
 		{
 			"auth": {
 				"identity": {
@@ -77,7 +78,7 @@
 }
 
 func TestCreateUsernameDomainIDPassword(t *testing.T) {
-	authTokenPost(t, AuthOptions{Username: "fakey", Password: "notpassword", DomainID: "abc123"}, nil, `
+	authTokenPost(t, tokens.AuthOptions{Username: "fakey", Password: "notpassword", DomainID: "abc123"}, nil, `
 		{
 			"auth": {
 				"identity": {
@@ -98,7 +99,7 @@
 }
 
 func TestCreateUsernameDomainNamePassword(t *testing.T) {
-	authTokenPost(t, AuthOptions{Username: "frank", Password: "swordfish", DomainName: "spork.net"}, nil, `
+	authTokenPost(t, tokens.AuthOptions{Username: "frank", Password: "swordfish", DomainName: "spork.net"}, nil, `
 		{
 			"auth": {
 				"identity": {
@@ -119,7 +120,7 @@
 }
 
 func TestCreateTokenID(t *testing.T) {
-	authTokenPost(t, AuthOptions{TokenID: "12345abcdef"}, nil, `
+	authTokenPost(t, tokens.AuthOptions{TokenID: "12345abcdef"}, nil, `
 		{
 			"auth": {
 				"identity": {
@@ -134,8 +135,8 @@
 }
 
 func TestCreateProjectIDScope(t *testing.T) {
-	options := AuthOptions{UserID: "fenris", Password: "g0t0h311"}
-	scope := &Scope{ProjectID: "123456"}
+	options := tokens.AuthOptions{UserID: "fenris", Password: "g0t0h311"}
+	scope := &tokens.Scope{ProjectID: "123456"}
 	authTokenPost(t, options, scope, `
 		{
 			"auth": {
@@ -159,8 +160,8 @@
 }
 
 func TestCreateDomainIDScope(t *testing.T) {
-	options := AuthOptions{UserID: "fenris", Password: "g0t0h311"}
-	scope := &Scope{DomainID: "1000"}
+	options := tokens.AuthOptions{UserID: "fenris", Password: "g0t0h311"}
+	scope := &tokens.Scope{DomainID: "1000"}
 	authTokenPost(t, options, scope, `
 		{
 			"auth": {
@@ -184,8 +185,8 @@
 }
 
 func TestCreateProjectNameAndDomainIDScope(t *testing.T) {
-	options := AuthOptions{UserID: "fenris", Password: "g0t0h311"}
-	scope := &Scope{ProjectName: "world-domination", DomainID: "1000"}
+	options := tokens.AuthOptions{UserID: "fenris", Password: "g0t0h311"}
+	scope := &tokens.Scope{ProjectName: "world-domination", DomainID: "1000"}
 	authTokenPost(t, options, scope, `
 		{
 			"auth": {
@@ -212,8 +213,8 @@
 }
 
 func TestCreateProjectNameAndDomainNameScope(t *testing.T) {
-	options := AuthOptions{UserID: "fenris", Password: "g0t0h311"}
-	scope := &Scope{ProjectName: "world-domination", DomainName: "evil-plans"}
+	options := tokens.AuthOptions{UserID: "fenris", Password: "g0t0h311"}
+	scope := &tokens.Scope{ProjectName: "world-domination", DomainName: "evil-plans"}
 	authTokenPost(t, options, scope, `
 		{
 			"auth": {
@@ -259,8 +260,8 @@
 		}`)
 	})
 
-	options := AuthOptions{UserID: "me", Password: "shhh"}
-	token, err := Create(&client, options, nil).Extract()
+	options := tokens.AuthOptions{UserID: "me", Password: "shhh"}
+	token, err := tokens.Create(&client, options, nil).Extract()
 	if err != nil {
 		t.Fatalf("Create returned an error: %v", err)
 	}
@@ -271,123 +272,123 @@
 }
 
 func TestCreateFailureEmptyAuth(t *testing.T) {
-	authTokenPostErr(t, AuthOptions{}, nil, false, ErrMissingPassword{})
+	authTokenPostErr(t, tokens.AuthOptions{}, nil, false, tokens.ErrMissingPassword{})
 }
 
 func TestCreateFailureTenantID(t *testing.T) {
-	authTokenPostErr(t, AuthOptions{TenantID: "something"}, nil, false, ErrTenantIDProvided{})
+	authTokenPostErr(t, tokens.AuthOptions{TenantID: "something"}, nil, false, tokens.ErrTenantIDProvided{})
 }
 
 func TestCreateFailureTenantName(t *testing.T) {
-	authTokenPostErr(t, AuthOptions{TenantName: "something"}, nil, false, ErrTenantNameProvided{})
+	authTokenPostErr(t, tokens.AuthOptions{TenantName: "something"}, nil, false, tokens.ErrTenantNameProvided{})
 }
 
 func TestCreateFailureTokenIDUsername(t *testing.T) {
-	authTokenPostErr(t, AuthOptions{Username: "something", TokenID: "12345"}, nil, true, ErrUsernameWithToken{})
+	authTokenPostErr(t, tokens.AuthOptions{Username: "something", TokenID: "12345"}, nil, true, tokens.ErrUsernameWithToken{})
 }
 
 func TestCreateFailureTokenIDUserID(t *testing.T) {
-	authTokenPostErr(t, AuthOptions{UserID: "something", TokenID: "12345"}, nil, true, ErrUserIDWithToken{})
+	authTokenPostErr(t, tokens.AuthOptions{UserID: "something", TokenID: "12345"}, nil, true, tokens.ErrUserIDWithToken{})
 }
 
 func TestCreateFailureTokenIDDomainID(t *testing.T) {
-	authTokenPostErr(t, AuthOptions{DomainID: "something", TokenID: "12345"}, nil, true, ErrDomainIDWithToken{})
+	authTokenPostErr(t, tokens.AuthOptions{DomainID: "something", TokenID: "12345"}, nil, true, tokens.ErrDomainIDWithToken{})
 }
 
 func TestCreateFailureTokenIDDomainName(t *testing.T) {
-	authTokenPostErr(t, AuthOptions{DomainName: "something", TokenID: "12345"}, nil, true, ErrDomainNameWithToken{})
+	authTokenPostErr(t, tokens.AuthOptions{DomainName: "something", TokenID: "12345"}, nil, true, tokens.ErrDomainNameWithToken{})
 }
 
 func TestCreateFailureMissingUser(t *testing.T) {
-	options := AuthOptions{Password: "supersecure"}
-	authTokenPostErr(t, options, nil, false, ErrUsernameOrUserID{})
+	options := tokens.AuthOptions{Password: "supersecure"}
+	authTokenPostErr(t, options, nil, false, tokens.ErrUsernameOrUserID{})
 }
 
 func TestCreateFailureBothUser(t *testing.T) {
-	options := AuthOptions{
+	options := tokens.AuthOptions{
 		Password: "supersecure",
 		Username: "oops",
 		UserID:   "redundancy",
 	}
-	authTokenPostErr(t, options, nil, false, ErrUsernameOrUserID{})
+	authTokenPostErr(t, options, nil, false, tokens.ErrUsernameOrUserID{})
 }
 
 func TestCreateFailureMissingDomain(t *testing.T) {
-	options := AuthOptions{
+	options := tokens.AuthOptions{
 		Password: "supersecure",
 		Username: "notuniqueenough",
 	}
-	authTokenPostErr(t, options, nil, false, ErrDomainIDOrDomainName{})
+	authTokenPostErr(t, options, nil, false, tokens.ErrDomainIDOrDomainName{})
 }
 
 func TestCreateFailureBothDomain(t *testing.T) {
-	options := AuthOptions{
+	options := tokens.AuthOptions{
 		Password:   "supersecure",
 		Username:   "someone",
 		DomainID:   "hurf",
 		DomainName: "durf",
 	}
-	authTokenPostErr(t, options, nil, false, ErrDomainIDOrDomainName{})
+	authTokenPostErr(t, options, nil, false, tokens.ErrDomainIDOrDomainName{})
 }
 
 func TestCreateFailureUserIDDomainID(t *testing.T) {
-	options := AuthOptions{
+	options := tokens.AuthOptions{
 		UserID:   "100",
 		Password: "stuff",
 		DomainID: "oops",
 	}
-	authTokenPostErr(t, options, nil, false, ErrDomainIDWithUserID{})
+	authTokenPostErr(t, options, nil, false, tokens.ErrDomainIDWithUserID{})
 }
 
 func TestCreateFailureUserIDDomainName(t *testing.T) {
-	options := AuthOptions{
+	options := tokens.AuthOptions{
 		UserID:     "100",
 		Password:   "sssh",
 		DomainName: "oops",
 	}
-	authTokenPostErr(t, options, nil, false, ErrDomainNameWithUserID{})
+	authTokenPostErr(t, options, nil, false, tokens.ErrDomainNameWithUserID{})
 }
 
 func TestCreateFailureScopeProjectNameAlone(t *testing.T) {
-	options := AuthOptions{UserID: "myself", Password: "swordfish"}
-	scope := &Scope{ProjectName: "notenough"}
-	authTokenPostErr(t, options, scope, false, ErrScopeDomainIDOrDomainName{})
+	options := tokens.AuthOptions{UserID: "myself", Password: "swordfish"}
+	scope := &tokens.Scope{ProjectName: "notenough"}
+	authTokenPostErr(t, options, scope, false, tokens.ErrScopeDomainIDOrDomainName{})
 }
 
 func TestCreateFailureScopeProjectNameAndID(t *testing.T) {
-	options := AuthOptions{UserID: "myself", Password: "swordfish"}
-	scope := &Scope{ProjectName: "whoops", ProjectID: "toomuch", DomainID: "1234"}
-	authTokenPostErr(t, options, scope, false, ErrScopeProjectIDOrProjectName{})
+	options := tokens.AuthOptions{UserID: "myself", Password: "swordfish"}
+	scope := &tokens.Scope{ProjectName: "whoops", ProjectID: "toomuch", DomainID: "1234"}
+	authTokenPostErr(t, options, scope, false, tokens.ErrScopeProjectIDOrProjectName{})
 }
 
 func TestCreateFailureScopeProjectIDAndDomainID(t *testing.T) {
-	options := AuthOptions{UserID: "myself", Password: "swordfish"}
-	scope := &Scope{ProjectID: "toomuch", DomainID: "notneeded"}
-	authTokenPostErr(t, options, scope, false, ErrScopeProjectIDAlone{})
+	options := tokens.AuthOptions{UserID: "myself", Password: "swordfish"}
+	scope := &tokens.Scope{ProjectID: "toomuch", DomainID: "notneeded"}
+	authTokenPostErr(t, options, scope, false, tokens.ErrScopeProjectIDAlone{})
 }
 
 func TestCreateFailureScopeProjectIDAndDomainNAme(t *testing.T) {
-	options := AuthOptions{UserID: "myself", Password: "swordfish"}
-	scope := &Scope{ProjectID: "toomuch", DomainName: "notneeded"}
-	authTokenPostErr(t, options, scope, false, ErrScopeProjectIDAlone{})
+	options := tokens.AuthOptions{UserID: "myself", Password: "swordfish"}
+	scope := &tokens.Scope{ProjectID: "toomuch", DomainName: "notneeded"}
+	authTokenPostErr(t, options, scope, false, tokens.ErrScopeProjectIDAlone{})
 }
 
 func TestCreateFailureScopeDomainIDAndDomainName(t *testing.T) {
-	options := AuthOptions{UserID: "myself", Password: "swordfish"}
-	scope := &Scope{DomainID: "toomuch", DomainName: "notneeded"}
-	authTokenPostErr(t, options, scope, false, ErrScopeDomainIDOrDomainName{})
+	options := tokens.AuthOptions{UserID: "myself", Password: "swordfish"}
+	scope := &tokens.Scope{DomainID: "toomuch", DomainName: "notneeded"}
+	authTokenPostErr(t, options, scope, false, tokens.ErrScopeDomainIDOrDomainName{})
 }
 
 func TestCreateFailureScopeDomainNameAlone(t *testing.T) {
-	options := AuthOptions{UserID: "myself", Password: "swordfish"}
-	scope := &Scope{DomainName: "notenough"}
-	authTokenPostErr(t, options, scope, false, ErrScopeDomainName{})
+	options := tokens.AuthOptions{UserID: "myself", Password: "swordfish"}
+	scope := &tokens.Scope{DomainName: "notenough"}
+	authTokenPostErr(t, options, scope, false, tokens.ErrScopeDomainName{})
 }
 
 func TestCreateFailureEmptyScope(t *testing.T) {
-	options := AuthOptions{UserID: "myself", Password: "swordfish"}
-	scope := &Scope{}
-	authTokenPostErr(t, options, scope, false, ErrScopeEmpty{})
+	options := tokens.AuthOptions{UserID: "myself", Password: "swordfish"}
+	scope := &tokens.Scope{}
+	authTokenPostErr(t, options, scope, false, tokens.ErrScopeEmpty{})
 }
 
 func TestGetRequest(t *testing.T) {
@@ -414,7 +415,7 @@
 		`)
 	})
 
-	token, err := Get(&client, "abcdef12345").Extract()
+	token, err := tokens.Get(&client, "abcdef12345").Extract()
 	if err != nil {
 		t.Errorf("Info returned an error: %v", err)
 	}
@@ -451,7 +452,7 @@
 	defer testhelper.TeardownHTTP()
 	client := prepareAuthTokenHandler(t, "HEAD", http.StatusNoContent)
 
-	ok, err := Validate(&client, "abcdef12345")
+	ok, err := tokens.Validate(&client, "abcdef12345")
 	if err != nil {
 		t.Errorf("Unexpected error from Validate: %v", err)
 	}
@@ -466,7 +467,7 @@
 	defer testhelper.TeardownHTTP()
 	client := prepareAuthTokenHandler(t, "HEAD", http.StatusNotFound)
 
-	ok, err := Validate(&client, "abcdef12345")
+	ok, err := tokens.Validate(&client, "abcdef12345")
 	if err != nil {
 		t.Errorf("Unexpected error from Validate: %v", err)
 	}
@@ -481,7 +482,7 @@
 	defer testhelper.TeardownHTTP()
 	client := prepareAuthTokenHandler(t, "HEAD", http.StatusUnauthorized)
 
-	_, err := Validate(&client, "abcdef12345")
+	_, err := tokens.Validate(&client, "abcdef12345")
 	if err == nil {
 		t.Errorf("Missing expected error from Validate")
 	}
@@ -492,7 +493,7 @@
 	defer testhelper.TeardownHTTP()
 	client := prepareAuthTokenHandler(t, "DELETE", http.StatusNoContent)
 
-	res := Revoke(&client, "abcdef12345")
+	res := tokens.Revoke(&client, "abcdef12345")
 	testhelper.AssertNoErr(t, res.Err)
 }
 
@@ -501,7 +502,7 @@
 	defer testhelper.TeardownHTTP()
 	client := prepareAuthTokenHandler(t, "DELETE", http.StatusNotFound)
 
-	res := Revoke(&client, "abcdef12345")
+	res := tokens.Revoke(&client, "abcdef12345")
 	if res.Err == nil {
 		t.Errorf("Missing expected error from Revoke")
 	}
diff --git a/openstack/networking/v2/apiversions/errors.go b/openstack/networking/v2/apiversions/errors.go
deleted file mode 100644
index 76bdb14..0000000
--- a/openstack/networking/v2/apiversions/errors.go
+++ /dev/null
@@ -1 +0,0 @@
-package apiversions
diff --git a/openstack/networking/v2/apiversions/testing/doc.go b/openstack/networking/v2/apiversions/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/networking/v2/apiversions/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/networking/v2/apiversions/requests_test.go b/openstack/networking/v2/apiversions/testing/requests_test.go
similarity index 78%
rename from openstack/networking/v2/apiversions/requests_test.go
rename to openstack/networking/v2/apiversions/testing/requests_test.go
index 375bfa6..5a66a2a 100644
--- a/openstack/networking/v2/apiversions/requests_test.go
+++ b/openstack/networking/v2/apiversions/testing/requests_test.go
@@ -1,10 +1,11 @@
-package apiversions
+package testing
 
 import (
 	"fmt"
 	"net/http"
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/apiversions"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
@@ -40,16 +41,16 @@
 
 	count := 0
 
-	ListVersions(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+	apiversions.ListVersions(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractAPIVersions(page)
+		actual, err := apiversions.ExtractAPIVersions(page)
 		if err != nil {
 			t.Errorf("Failed to extract API versions: %v", err)
 			return false, err
 		}
 
-		expected := []APIVersion{
-			APIVersion{
+		expected := []apiversions.APIVersion{
+			{
 				Status: "CURRENT",
 				ID:     "v2.0",
 			},
@@ -73,8 +74,8 @@
 		w.WriteHeader(http.StatusOK)
 	})
 
-	ListVersions(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		if _, err := ExtractAPIVersions(page); err == nil {
+	apiversions.ListVersions(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+		if _, err := apiversions.ExtractAPIVersions(page); err == nil {
 			t.Fatalf("Expected error, got nil")
 		}
 		return true, nil
@@ -132,24 +133,24 @@
 
 	count := 0
 
-	ListVersionResources(fake.ServiceClient(), "v2.0").EachPage(func(page pagination.Page) (bool, error) {
+	apiversions.ListVersionResources(fake.ServiceClient(), "v2.0").EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractVersionResources(page)
+		actual, err := apiversions.ExtractVersionResources(page)
 		if err != nil {
 			t.Errorf("Failed to extract version resources: %v", err)
 			return false, err
 		}
 
-		expected := []APIVersionResource{
-			APIVersionResource{
+		expected := []apiversions.APIVersionResource{
+			{
 				Name:       "subnet",
 				Collection: "subnets",
 			},
-			APIVersionResource{
+			{
 				Name:       "network",
 				Collection: "networks",
 			},
-			APIVersionResource{
+			{
 				Name:       "port",
 				Collection: "ports",
 			},
@@ -173,8 +174,8 @@
 		w.WriteHeader(http.StatusOK)
 	})
 
-	ListVersionResources(fake.ServiceClient(), "v2.0").EachPage(func(page pagination.Page) (bool, error) {
-		if _, err := ExtractVersionResources(page); err == nil {
+	apiversions.ListVersionResources(fake.ServiceClient(), "v2.0").EachPage(func(page pagination.Page) (bool, error) {
+		if _, err := apiversions.ExtractVersionResources(page); err == nil {
 			t.Fatalf("Expected error, got nil")
 		}
 		return true, nil
diff --git a/openstack/networking/v2/extensions/external/testing/doc.go b/openstack/networking/v2/extensions/external/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/networking/v2/extensions/external/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/networking/v2/extensions/external/results_test.go b/openstack/networking/v2/extensions/external/testing/results_test.go
similarity index 89%
rename from openstack/networking/v2/extensions/external/results_test.go
rename to openstack/networking/v2/extensions/external/testing/results_test.go
index c5d72e9..2ddc3ac 100644
--- a/openstack/networking/v2/extensions/external/results_test.go
+++ b/openstack/networking/v2/extensions/external/testing/results_test.go
@@ -1,4 +1,4 @@
-package external
+package testing
 
 import (
 	"errors"
@@ -7,6 +7,7 @@
 	"testing"
 
 	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/external"
 	"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
@@ -60,14 +61,14 @@
 
 	networks.List(fake.ServiceClient(), networks.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractList(page)
+		actual, err := external.ExtractList(page)
 		if err != nil {
 			t.Errorf("Failed to extract networks: %v", err)
 			return false, err
 		}
 
-		expected := []NetworkExternal{
-			NetworkExternal{
+		expected := []external.NetworkExternal{
+			{
 				Status:       "ACTIVE",
 				Subnets:      []string{"25778974-48a8-46e7-8998-9dc8c70d2f06"},
 				Name:         "net1",
@@ -77,7 +78,7 @@
 				ID:           "0f38d5ad-10a6-428f-a5fc-825cfe0f1970",
 				External:     false,
 			},
-			NetworkExternal{
+			{
 				Status:       "ACTIVE",
 				Subnets:      []string{"2f1fb918-9b0e-4bf9-9a50-6cebbb4db2c5"},
 				Name:         "ext_net",
@@ -129,7 +130,7 @@
 	})
 
 	res := networks.Get(fake.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22")
-	n, err := ExtractGet(res)
+	n, err := external.ExtractGet(res)
 
 	th.AssertNoErr(t, err)
 	th.AssertEquals(t, true, n.External)
@@ -175,10 +176,10 @@
 		`)
 	})
 
-	options := CreateOpts{networks.CreateOpts{Name: "ext_net", AdminStateUp: gophercloud.Enabled}, gophercloud.Enabled}
+	options := external.CreateOpts{networks.CreateOpts{Name: "ext_net", AdminStateUp: gophercloud.Enabled}, gophercloud.Enabled}
 	res := networks.Create(fake.ServiceClient(), options)
 
-	n, err := ExtractCreate(res)
+	n, err := external.ExtractCreate(res)
 
 	th.AssertNoErr(t, err)
 	th.AssertEquals(t, true, n.External)
@@ -223,9 +224,9 @@
 		`)
 	})
 
-	options := UpdateOpts{networks.UpdateOpts{Name: "new_name"}, gophercloud.Enabled}
+	options := external.UpdateOpts{networks.UpdateOpts{Name: "new_name"}, gophercloud.Enabled}
 	res := networks.Update(fake.ServiceClient(), "4e8e5957-649f-477b-9e5b-f1f75b21c03c", options)
-	n, err := ExtractUpdate(res)
+	n, err := external.ExtractUpdate(res)
 
 	th.AssertNoErr(t, err)
 	th.AssertEquals(t, true, n.External)
@@ -235,21 +236,21 @@
 	gr := networks.GetResult{}
 	gr.Err = errors.New("")
 
-	if _, err := ExtractGet(gr); err == nil {
+	if _, err := external.ExtractGet(gr); err == nil {
 		t.Fatalf("Expected error, got one")
 	}
 
 	ur := networks.UpdateResult{}
 	ur.Err = errors.New("")
 
-	if _, err := ExtractUpdate(ur); err == nil {
+	if _, err := external.ExtractUpdate(ur); err == nil {
 		t.Fatalf("Expected error, got one")
 	}
 
 	cr := networks.CreateResult{}
 	cr.Err = errors.New("")
 
-	if _, err := ExtractCreate(cr); err == nil {
+	if _, err := external.ExtractCreate(cr); err == nil {
 		t.Fatalf("Expected error, got one")
 	}
 }
diff --git a/openstack/networking/v2/extensions/fwaas/firewalls/testing/doc.go b/openstack/networking/v2/extensions/fwaas/firewalls/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/networking/v2/extensions/fwaas/firewalls/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/networking/v2/extensions/fwaas/firewalls/requests_test.go b/openstack/networking/v2/extensions/fwaas/firewalls/testing/requests_test.go
similarity index 89%
rename from openstack/networking/v2/extensions/fwaas/firewalls/requests_test.go
rename to openstack/networking/v2/extensions/fwaas/firewalls/testing/requests_test.go
index 29a7832..01ab732 100644
--- a/openstack/networking/v2/extensions/fwaas/firewalls/requests_test.go
+++ b/openstack/networking/v2/extensions/fwaas/firewalls/testing/requests_test.go
@@ -1,4 +1,4 @@
-package firewalls
+package testing
 
 import (
 	"fmt"
@@ -7,17 +7,11 @@
 
 	"github.com/gophercloud/gophercloud"
 	fake "github.com/gophercloud/gophercloud/openstack/networking/v2/common"
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/fwaas/firewalls"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
 
-func TestURLs(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.AssertEquals(t, th.Endpoint()+"v2.0/fw/firewalls", rootURL(fake.ServiceClient()))
-}
-
 func TestList(t *testing.T) {
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
@@ -57,16 +51,16 @@
 
 	count := 0
 
-	List(fake.ServiceClient(), ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
+	firewalls.List(fake.ServiceClient(), firewalls.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractFirewalls(page)
+		actual, err := firewalls.ExtractFirewalls(page)
 		if err != nil {
 			t.Errorf("Failed to extract members: %v", err)
 			return false, err
 		}
 
-		expected := []Firewall{
-			Firewall{
+		expected := []firewalls.Firewall{
+			{
 				Status:       "ACTIVE",
 				Name:         "fw1",
 				AdminStateUp: false,
@@ -75,7 +69,7 @@
 				ID:           "fb5b5315-64f6-4ea3-8e58-981cc37c6f61",
 				Description:  "OpenStack firewall 1",
 			},
-			Firewall{
+			{
 				Status:       "PENDING_UPDATE",
 				Name:         "fw2",
 				AdminStateUp: true,
@@ -134,14 +128,14 @@
     `)
 	})
 
-	options := CreateOpts{
+	options := firewalls.CreateOpts{
 		TenantID:     "b4eedccc6fb74fa8a7ad6b08382b852b",
 		Name:         "fw",
 		Description:  "OpenStack firewall",
 		AdminStateUp: gophercloud.Enabled,
 		PolicyID:     "19ab8c87-4a32-4e6a-a74e-b77fffb89a0c",
 	}
-	_, err := Create(fake.ServiceClient(), options).Extract()
+	_, err := firewalls.Create(fake.ServiceClient(), options).Extract()
 	th.AssertNoErr(t, err)
 }
 
@@ -171,7 +165,7 @@
         `)
 	})
 
-	fw, err := Get(fake.ServiceClient(), "fb5b5315-64f6-4ea3-8e58-981cc37c6f61").Extract()
+	fw, err := firewalls.Get(fake.ServiceClient(), "fb5b5315-64f6-4ea3-8e58-981cc37c6f61").Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, "ACTIVE", fw.Status)
@@ -221,14 +215,14 @@
     `)
 	})
 
-	options := UpdateOpts{
+	options := firewalls.UpdateOpts{
 		Name:         "fw",
 		Description:  "updated fw",
 		AdminStateUp: gophercloud.Disabled,
 		PolicyID:     "19ab8c87-4a32-4e6a-a74e-b77fffb89a0c",
 	}
 
-	_, err := Update(fake.ServiceClient(), "ea5b5315-64f6-4ea3-8e58-981cc37c6576", options).Extract()
+	_, err := firewalls.Update(fake.ServiceClient(), "ea5b5315-64f6-4ea3-8e58-981cc37c6576", options).Extract()
 	th.AssertNoErr(t, err)
 }
 
@@ -242,6 +236,6 @@
 		w.WriteHeader(http.StatusNoContent)
 	})
 
-	res := Delete(fake.ServiceClient(), "4ec89087-d057-4e2c-911f-60a3b47ee304")
+	res := firewalls.Delete(fake.ServiceClient(), "4ec89087-d057-4e2c-911f-60a3b47ee304")
 	th.AssertNoErr(t, res.Err)
 }
diff --git a/openstack/networking/v2/extensions/fwaas/policies/testing/doc.go b/openstack/networking/v2/extensions/fwaas/policies/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/networking/v2/extensions/fwaas/policies/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/networking/v2/extensions/fwaas/policies/requests_test.go b/openstack/networking/v2/extensions/fwaas/policies/testing/requests_test.go
similarity index 90%
rename from openstack/networking/v2/extensions/fwaas/policies/requests_test.go
rename to openstack/networking/v2/extensions/fwaas/policies/testing/requests_test.go
index 23d6a66..11b9848 100644
--- a/openstack/networking/v2/extensions/fwaas/policies/requests_test.go
+++ b/openstack/networking/v2/extensions/fwaas/policies/testing/requests_test.go
@@ -1,4 +1,4 @@
-package policies
+package testing
 
 import (
 	"fmt"
@@ -7,17 +7,11 @@
 
 	"github.com/gophercloud/gophercloud"
 	fake "github.com/gophercloud/gophercloud/openstack/networking/v2/common"
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/fwaas/policies"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
 
-func TestURLs(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.AssertEquals(t, th.Endpoint()+"v2.0/fw/firewall_policies", rootURL(fake.ServiceClient()))
-}
-
 func TestList(t *testing.T) {
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
@@ -62,16 +56,16 @@
 
 	count := 0
 
-	List(fake.ServiceClient(), ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
+	policies.List(fake.ServiceClient(), policies.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractPolicies(page)
+		actual, err := policies.ExtractPolicies(page)
 		if err != nil {
 			t.Errorf("Failed to extract members: %v", err)
 			return false, err
 		}
 
-		expected := []Policy{
-			Policy{
+		expected := []policies.Policy{
+			{
 				Name: "policy1",
 				Rules: []string{
 					"75452b36-268e-4e75-aaf4-f0e7ed50bc97",
@@ -83,7 +77,7 @@
 				ID:          "f2b08c1e-aa81-4668-8ae1-1401bcb0576c",
 				Description: "Firewall policy 1",
 			},
-			Policy{
+			{
 				Name: "policy2",
 				Rules: []string{
 					"03d2a6ad-633f-431a-8463-4370d06a22c8",
@@ -151,7 +145,7 @@
         `)
 	})
 
-	options := CreateOpts{
+	options := policies.CreateOpts{
 		TenantID:    "9145d91459d248b1b02fdaca97c6a75d",
 		Name:        "policy",
 		Description: "Firewall policy",
@@ -163,7 +157,7 @@
 		},
 	}
 
-	_, err := Create(fake.ServiceClient(), options).Extract()
+	_, err := policies.Create(fake.ServiceClient(), options).Extract()
 	th.AssertNoErr(t, err)
 }
 
@@ -196,7 +190,7 @@
         `)
 	})
 
-	policy, err := Get(fake.ServiceClient(), "bcab5315-64f6-4ea3-8e58-981cc37c6f61").Extract()
+	policy, err := policies.Get(fake.ServiceClient(), "bcab5315-64f6-4ea3-8e58-981cc37c6f61").Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, "www", policy.Name)
@@ -252,7 +246,7 @@
     `)
 	})
 
-	options := UpdateOpts{
+	options := policies.UpdateOpts{
 		Name:        "policy",
 		Description: "Firewall policy",
 		Rules: []string{
@@ -261,7 +255,7 @@
 		},
 	}
 
-	_, err := Update(fake.ServiceClient(), "f2b08c1e-aa81-4668-8ae1-1401bcb0576c", options).Extract()
+	_, err := policies.Update(fake.ServiceClient(), "f2b08c1e-aa81-4668-8ae1-1401bcb0576c", options).Extract()
 	th.AssertNoErr(t, err)
 }
 
@@ -275,6 +269,6 @@
 		w.WriteHeader(http.StatusNoContent)
 	})
 
-	res := Delete(fake.ServiceClient(), "4ec89077-d057-4a2b-911f-60a3b47ee304")
+	res := policies.Delete(fake.ServiceClient(), "4ec89077-d057-4a2b-911f-60a3b47ee304")
 	th.AssertNoErr(t, res.Err)
 }
diff --git a/openstack/networking/v2/extensions/fwaas/rules/testing/doc.go b/openstack/networking/v2/extensions/fwaas/rules/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/networking/v2/extensions/fwaas/rules/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/networking/v2/extensions/fwaas/rules/requests_test.go b/openstack/networking/v2/extensions/fwaas/rules/testing/requests_test.go
similarity index 91%
rename from openstack/networking/v2/extensions/fwaas/rules/requests_test.go
rename to openstack/networking/v2/extensions/fwaas/rules/testing/requests_test.go
index 4ca73e7..dbf377a 100644
--- a/openstack/networking/v2/extensions/fwaas/rules/requests_test.go
+++ b/openstack/networking/v2/extensions/fwaas/rules/testing/requests_test.go
@@ -1,4 +1,4 @@
-package rules
+package testing
 
 import (
 	"fmt"
@@ -7,17 +7,11 @@
 
 	"github.com/gophercloud/gophercloud"
 	fake "github.com/gophercloud/gophercloud/openstack/networking/v2/common"
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/fwaas/rules"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
 
-func TestURLs(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.AssertEquals(t, th.Endpoint()+"v2.0/fw/firewall_rules", rootURL(fake.ServiceClient()))
-}
-
 func TestList(t *testing.T) {
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
@@ -73,16 +67,16 @@
 
 	count := 0
 
-	List(fake.ServiceClient(), ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
+	rules.List(fake.ServiceClient(), rules.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractRules(page)
+		actual, err := rules.ExtractRules(page)
 		if err != nil {
 			t.Errorf("Failed to extract members: %v", err)
 			return false, err
 		}
 
-		expected := []Rule{
-			Rule{
+		expected := []rules.Rule{
+			{
 				Protocol:             "tcp",
 				Description:          "ssh rule",
 				SourcePort:           "",
@@ -99,7 +93,7 @@
 				IPVersion:            4,
 				Shared:               false,
 			},
-			Rule{
+			{
 				Protocol:             "udp",
 				Description:          "udp rule",
 				SourcePort:           "",
@@ -177,7 +171,7 @@
         `)
 	})
 
-	options := CreateOpts{
+	options := rules.CreateOpts{
 		TenantID:             "80cf934d6ffb4ef5b244f1c512ad1e61",
 		Protocol:             "tcp",
 		Description:          "ssh rule",
@@ -187,7 +181,7 @@
 		Action:               "allow",
 	}
 
-	_, err := Create(fake.ServiceClient(), options).Extract()
+	_, err := rules.Create(fake.ServiceClient(), options).Extract()
 	th.AssertNoErr(t, err)
 }
 
@@ -225,7 +219,7 @@
         `)
 	})
 
-	rule, err := Get(fake.ServiceClient(), "f03bd950-6c56-4f5e-a307-45967078f507").Extract()
+	rule, err := rules.Get(fake.ServiceClient(), "f03bd950-6c56-4f5e-a307-45967078f507").Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, "tcp", rule.Protocol)
@@ -297,7 +291,7 @@
 	newName := "ssh_form_any"
 	newAction := "allow"
 
-	options := UpdateOpts{
+	options := rules.UpdateOpts{
 		Protocol:             &newProtocol,
 		Description:          &newDescription,
 		DestinationIPAddress: &newDestinationIP,
@@ -307,7 +301,7 @@
 		Enabled:              gophercloud.Disabled,
 	}
 
-	_, err := Update(fake.ServiceClient(), "f03bd950-6c56-4f5e-a307-45967078f507", options).Extract()
+	_, err := rules.Update(fake.ServiceClient(), "f03bd950-6c56-4f5e-a307-45967078f507", options).Extract()
 	th.AssertNoErr(t, err)
 }
 
@@ -321,6 +315,6 @@
 		w.WriteHeader(http.StatusNoContent)
 	})
 
-	res := Delete(fake.ServiceClient(), "4ec89077-d057-4a2b-911f-60a3b47ee304")
+	res := rules.Delete(fake.ServiceClient(), "4ec89077-d057-4a2b-911f-60a3b47ee304")
 	th.AssertNoErr(t, res.Err)
 }
diff --git a/openstack/networking/v2/extensions/layer3/floatingips/testing/doc.go b/openstack/networking/v2/extensions/layer3/floatingips/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/networking/v2/extensions/layer3/floatingips/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/networking/v2/extensions/layer3/floatingips/requests_test.go b/openstack/networking/v2/extensions/layer3/floatingips/testing/requests_test.go
similarity index 87%
rename from openstack/networking/v2/extensions/layer3/floatingips/requests_test.go
rename to openstack/networking/v2/extensions/layer3/floatingips/testing/requests_test.go
index 3e9a91f..45f27eb 100644
--- a/openstack/networking/v2/extensions/layer3/floatingips/requests_test.go
+++ b/openstack/networking/v2/extensions/layer3/floatingips/testing/requests_test.go
@@ -1,4 +1,4 @@
-package floatingips
+package testing
 
 import (
 	"fmt"
@@ -6,6 +6,7 @@
 	"testing"
 
 	fake "github.com/gophercloud/gophercloud/openstack/networking/v2/common"
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
@@ -51,16 +52,16 @@
 
 	count := 0
 
-	List(fake.ServiceClient(), ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
+	floatingips.List(fake.ServiceClient(), floatingips.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractFloatingIPs(page)
+		actual, err := floatingips.ExtractFloatingIPs(page)
 		if err != nil {
 			t.Errorf("Failed to extract floating IPs: %v", err)
 			return false, err
 		}
 
-		expected := []FloatingIP{
-			FloatingIP{
+		expected := []floatingips.FloatingIP{
+			{
 				FloatingNetworkID: "6d67c30a-ddb4-49a1-bec3-a65b286b4170",
 				FixedIP:           "",
 				FloatingIP:        "192.0.0.4",
@@ -69,7 +70,7 @@
 				PortID:            "",
 				ID:                "2f95fd2b-9f6a-4e8e-9e9a-2cbe286cbf9e",
 			},
-			FloatingIP{
+			{
 				FloatingNetworkID: "90f742b1-6d17-487b-ba95-71881dbc0b64",
 				FixedIP:           "192.0.0.2",
 				FloatingIP:        "10.0.0.3",
@@ -100,19 +101,19 @@
 		fmt.Fprintf(w, `{"floatingips": [{}], "floatingips_links": {}}`)
 	})
 
-	List(fake.ServiceClient(), ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
-		ExtractFloatingIPs(page)
+	floatingips.List(fake.ServiceClient(), floatingips.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
+		floatingips.ExtractFloatingIPs(page)
 		return true, nil
 	})
 }
 
 func TestRequiredFieldsForCreate(t *testing.T) {
-	res1 := Create(fake.ServiceClient(), CreateOpts{FloatingNetworkID: ""})
+	res1 := floatingips.Create(fake.ServiceClient(), floatingips.CreateOpts{FloatingNetworkID: ""})
 	if res1.Err == nil {
 		t.Fatalf("Expected error, got none")
 	}
 
-	res2 := Create(fake.ServiceClient(), CreateOpts{FloatingNetworkID: "foo", PortID: ""})
+	res2 := floatingips.Create(fake.ServiceClient(), floatingips.CreateOpts{FloatingNetworkID: "foo", PortID: ""})
 	if res2.Err == nil {
 		t.Fatalf("Expected error, got none")
 	}
@@ -154,12 +155,12 @@
 		`)
 	})
 
-	options := CreateOpts{
+	options := floatingips.CreateOpts{
 		FloatingNetworkID: "376da547-b977-4cfe-9cba-275c80debf57",
 		PortID:            "ce705c24-c1ef-408a-bda3-7bbd946164ab",
 	}
 
-	ip, err := Create(fake.ServiceClient(), options).Extract()
+	ip, err := floatingips.Create(fake.ServiceClient(), options).Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, "2f245a7b-796b-4f26-9cf9-9e82d248fda7", ip.ID)
@@ -204,11 +205,11 @@
 				`)
 	})
 
-	options := CreateOpts{
+	options := floatingips.CreateOpts{
 		FloatingNetworkID: "376da547-b977-4cfe-9cba-275c80debf57",
 	}
 
-	ip, err := Create(fake.ServiceClient(), options).Extract()
+	ip, err := floatingips.Create(fake.ServiceClient(), options).Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, "2f245a7b-796b-4f26-9cf9-9e82d248fda7", ip.ID)
@@ -245,7 +246,7 @@
       `)
 	})
 
-	ip, err := Get(fake.ServiceClient(), "2f245a7b-796b-4f26-9cf9-9e82d248fda7").Extract()
+	ip, err := floatingips.Get(fake.ServiceClient(), "2f245a7b-796b-4f26-9cf9-9e82d248fda7").Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, "90f742b1-6d17-487b-ba95-71881dbc0b64", ip.FloatingNetworkID)
@@ -292,7 +293,7 @@
 	`)
 	})
 
-	ip, err := Update(fake.ServiceClient(), "2f245a7b-796b-4f26-9cf9-9e82d248fda7", UpdateOpts{PortID: "423abc8d-2991-4a55-ba98-2aaea84cc72e"}).Extract()
+	ip, err := floatingips.Update(fake.ServiceClient(), "2f245a7b-796b-4f26-9cf9-9e82d248fda7", floatingips.UpdateOpts{PortID: "423abc8d-2991-4a55-ba98-2aaea84cc72e"}).Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertDeepEquals(t, "423abc8d-2991-4a55-ba98-2aaea84cc72e", ip.PortID)
@@ -333,7 +334,7 @@
     `)
 	})
 
-	ip, err := Update(fake.ServiceClient(), "2f245a7b-796b-4f26-9cf9-9e82d248fda7", UpdateOpts{}).Extract()
+	ip, err := floatingips.Update(fake.ServiceClient(), "2f245a7b-796b-4f26-9cf9-9e82d248fda7", floatingips.UpdateOpts{}).Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertDeepEquals(t, "", ip.FixedIP)
@@ -350,6 +351,6 @@
 		w.WriteHeader(http.StatusNoContent)
 	})
 
-	res := Delete(fake.ServiceClient(), "2f245a7b-796b-4f26-9cf9-9e82d248fda7")
+	res := floatingips.Delete(fake.ServiceClient(), "2f245a7b-796b-4f26-9cf9-9e82d248fda7")
 	th.AssertNoErr(t, res.Err)
 }
diff --git a/openstack/networking/v2/extensions/layer3/routers/testing/doc.go b/openstack/networking/v2/extensions/layer3/routers/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/networking/v2/extensions/layer3/routers/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/networking/v2/extensions/layer3/routers/requests_test.go b/openstack/networking/v2/extensions/layer3/routers/testing/requests_test.go
similarity index 79%
rename from openstack/networking/v2/extensions/layer3/routers/requests_test.go
rename to openstack/networking/v2/extensions/layer3/routers/testing/requests_test.go
index c6cd7b3..bf7f35e 100644
--- a/openstack/networking/v2/extensions/layer3/routers/requests_test.go
+++ b/openstack/networking/v2/extensions/layer3/routers/testing/requests_test.go
@@ -1,4 +1,4 @@
-package routers
+package testing
 
 import (
 	"fmt"
@@ -6,17 +6,11 @@
 	"testing"
 
 	fake "github.com/gophercloud/gophercloud/openstack/networking/v2/common"
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
 
-func TestURLs(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.AssertEquals(t, th.Endpoint()+"v2.0/routers", rootURL(fake.ServiceClient()))
-}
-
 func TestList(t *testing.T) {
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
@@ -58,27 +52,27 @@
 
 	count := 0
 
-	List(fake.ServiceClient(), ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
+	routers.List(fake.ServiceClient(), routers.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractRouters(page)
+		actual, err := routers.ExtractRouters(page)
 		if err != nil {
 			t.Errorf("Failed to extract routers: %v", err)
 			return false, err
 		}
 
-		expected := []Router{
-			Router{
+		expected := []routers.Router{
+			{
 				Status:       "ACTIVE",
-				GatewayInfo:  GatewayInfo{NetworkID: ""},
+				GatewayInfo:  routers.GatewayInfo{NetworkID: ""},
 				AdminStateUp: true,
 				Distributed:  false,
 				Name:         "second_routers",
 				ID:           "7177abc4-5ae9-4bb7-b0d4-89e94a4abf3b",
 				TenantID:     "6b96ff0cb17a4b859e1e575d221683d3",
 			},
-			Router{
+			{
 				Status:       "ACTIVE",
-				GatewayInfo:  GatewayInfo{NetworkID: "3c5bcddd-6af9-4e6b-9c3e-c153e521cab8"},
+				GatewayInfo:  routers.GatewayInfo{NetworkID: "3c5bcddd-6af9-4e6b-9c3e-c153e521cab8"},
 				AdminStateUp: true,
 				Distributed:  false,
 				Name:         "router1",
@@ -139,19 +133,19 @@
 	})
 
 	asu := false
-	gwi := GatewayInfo{NetworkID: "8ca37218-28ff-41cb-9b10-039601ea7e6b"}
+	gwi := routers.GatewayInfo{NetworkID: "8ca37218-28ff-41cb-9b10-039601ea7e6b"}
 
-	options := CreateOpts{
+	options := routers.CreateOpts{
 		Name:         "foo_router",
 		AdminStateUp: &asu,
 		GatewayInfo:  &gwi,
 	}
-	r, err := Create(fake.ServiceClient(), options).Extract()
+	r, err := routers.Create(fake.ServiceClient(), options).Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, "foo_router", r.Name)
 	th.AssertEquals(t, false, r.AdminStateUp)
-	th.AssertDeepEquals(t, GatewayInfo{NetworkID: "8ca37218-28ff-41cb-9b10-039601ea7e6b"}, r.GatewayInfo)
+	th.AssertDeepEquals(t, routers.GatewayInfo{NetworkID: "8ca37218-28ff-41cb-9b10-039601ea7e6b"}, r.GatewayInfo)
 }
 
 func TestGet(t *testing.T) {
@@ -188,16 +182,16 @@
 			`)
 	})
 
-	n, err := Get(fake.ServiceClient(), "a07eea83-7710-4860-931b-5fe220fae533").Extract()
+	n, err := routers.Get(fake.ServiceClient(), "a07eea83-7710-4860-931b-5fe220fae533").Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, n.Status, "ACTIVE")
-	th.AssertDeepEquals(t, n.GatewayInfo, GatewayInfo{NetworkID: "85d76829-6415-48ff-9c63-5c5ca8c61ac6"})
+	th.AssertDeepEquals(t, n.GatewayInfo, routers.GatewayInfo{NetworkID: "85d76829-6415-48ff-9c63-5c5ca8c61ac6"})
 	th.AssertEquals(t, n.Name, "router1")
 	th.AssertEquals(t, n.AdminStateUp, true)
 	th.AssertEquals(t, n.TenantID, "d6554fe62e2f41efbb6e026fad5c1542")
 	th.AssertEquals(t, n.ID, "a07eea83-7710-4860-931b-5fe220fae533")
-	th.AssertDeepEquals(t, n.Routes, []Route{Route{DestinationCIDR: "40.0.1.0/24", NextHop: "10.1.0.10"}})
+	th.AssertDeepEquals(t, n.Routes, []routers.Route{{DestinationCIDR: "40.0.1.0/24", NextHop: "10.1.0.10"}})
 }
 
 func TestUpdate(t *testing.T) {
@@ -252,16 +246,16 @@
 		`)
 	})
 
-	gwi := GatewayInfo{NetworkID: "8ca37218-28ff-41cb-9b10-039601ea7e6b"}
-	r := []Route{Route{DestinationCIDR: "40.0.1.0/24", NextHop: "10.1.0.10"}}
-	options := UpdateOpts{Name: "new_name", GatewayInfo: &gwi, Routes: r}
+	gwi := routers.GatewayInfo{NetworkID: "8ca37218-28ff-41cb-9b10-039601ea7e6b"}
+	r := []routers.Route{{DestinationCIDR: "40.0.1.0/24", NextHop: "10.1.0.10"}}
+	options := routers.UpdateOpts{Name: "new_name", GatewayInfo: &gwi, Routes: r}
 
-	n, err := Update(fake.ServiceClient(), "4e8e5957-649f-477b-9e5b-f1f75b21c03c", options).Extract()
+	n, err := routers.Update(fake.ServiceClient(), "4e8e5957-649f-477b-9e5b-f1f75b21c03c", options).Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, n.Name, "new_name")
-	th.AssertDeepEquals(t, n.GatewayInfo, GatewayInfo{NetworkID: "8ca37218-28ff-41cb-9b10-039601ea7e6b"})
-	th.AssertDeepEquals(t, n.Routes, []Route{Route{DestinationCIDR: "40.0.1.0/24", NextHop: "10.1.0.10"}})
+	th.AssertDeepEquals(t, n.GatewayInfo, routers.GatewayInfo{NetworkID: "8ca37218-28ff-41cb-9b10-039601ea7e6b"})
+	th.AssertDeepEquals(t, n.Routes, []routers.Route{{DestinationCIDR: "40.0.1.0/24", NextHop: "10.1.0.10"}})
 }
 
 func TestAllRoutesRemoved(t *testing.T) {
@@ -302,13 +296,13 @@
 		`)
 	})
 
-	r := []Route{}
-	options := UpdateOpts{Routes: r}
+	r := []routers.Route{}
+	options := routers.UpdateOpts{Routes: r}
 
-	n, err := Update(fake.ServiceClient(), "4e8e5957-649f-477b-9e5b-f1f75b21c03c", options).Extract()
+	n, err := routers.Update(fake.ServiceClient(), "4e8e5957-649f-477b-9e5b-f1f75b21c03c", options).Extract()
 	th.AssertNoErr(t, err)
 
-	th.AssertDeepEquals(t, n.Routes, []Route{})
+	th.AssertDeepEquals(t, n.Routes, []routers.Route{})
 }
 
 func TestDelete(t *testing.T) {
@@ -321,7 +315,7 @@
 		w.WriteHeader(http.StatusNoContent)
 	})
 
-	res := Delete(fake.ServiceClient(), "4e8e5957-649f-477b-9e5b-f1f75b21c03c")
+	res := routers.Delete(fake.ServiceClient(), "4e8e5957-649f-477b-9e5b-f1f75b21c03c")
 	th.AssertNoErr(t, res.Err)
 }
 
@@ -353,8 +347,8 @@
 `)
 	})
 
-	opts := AddInterfaceOpts{SubnetID: "a2f1f29d-571b-4533-907f-5803ab96ead1"}
-	res, err := AddInterface(fake.ServiceClient(), "4e8e5957-649f-477b-9e5b-f1f75b21c03c", opts).Extract()
+	opts := routers.AddInterfaceOpts{SubnetID: "a2f1f29d-571b-4533-907f-5803ab96ead1"}
+	res, err := routers.AddInterface(fake.ServiceClient(), "4e8e5957-649f-477b-9e5b-f1f75b21c03c", opts).Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, "0d32a837-8069-4ec3-84c4-3eef3e10b188", res.SubnetID)
@@ -364,11 +358,11 @@
 }
 
 func TestAddInterfaceRequiredOpts(t *testing.T) {
-	_, err := AddInterface(fake.ServiceClient(), "foo", AddInterfaceOpts{}).Extract()
+	_, err := routers.AddInterface(fake.ServiceClient(), "foo", routers.AddInterfaceOpts{}).Extract()
 	if err == nil {
 		t.Fatalf("Expected error, got none")
 	}
-	_, err = AddInterface(fake.ServiceClient(), "foo", AddInterfaceOpts{SubnetID: "bar", PortID: "baz"}).Extract()
+	_, err = routers.AddInterface(fake.ServiceClient(), "foo", routers.AddInterfaceOpts{SubnetID: "bar", PortID: "baz"}).Extract()
 	if err == nil {
 		t.Fatalf("Expected error, got none")
 	}
@@ -402,8 +396,8 @@
 `)
 	})
 
-	opts := RemoveInterfaceOpts{SubnetID: "a2f1f29d-571b-4533-907f-5803ab96ead1"}
-	res, err := RemoveInterface(fake.ServiceClient(), "4e8e5957-649f-477b-9e5b-f1f75b21c03c", opts).Extract()
+	opts := routers.RemoveInterfaceOpts{SubnetID: "a2f1f29d-571b-4533-907f-5803ab96ead1"}
+	res, err := routers.RemoveInterface(fake.ServiceClient(), "4e8e5957-649f-477b-9e5b-f1f75b21c03c", opts).Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, "0d32a837-8069-4ec3-84c4-3eef3e10b188", res.SubnetID)
diff --git a/openstack/networking/v2/extensions/lbaas/members/testing/doc.go b/openstack/networking/v2/extensions/lbaas/members/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/networking/v2/extensions/lbaas/members/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/networking/v2/extensions/lbaas/members/requests_test.go b/openstack/networking/v2/extensions/lbaas/members/testing/requests_test.go
similarity index 87%
rename from openstack/networking/v2/extensions/lbaas/members/requests_test.go
rename to openstack/networking/v2/extensions/lbaas/members/testing/requests_test.go
index 27593e7..3e4f1d4 100644
--- a/openstack/networking/v2/extensions/lbaas/members/requests_test.go
+++ b/openstack/networking/v2/extensions/lbaas/members/testing/requests_test.go
@@ -1,4 +1,4 @@
-package members
+package testing
 
 import (
 	"fmt"
@@ -7,17 +7,11 @@
 
 	"github.com/gophercloud/gophercloud"
 	fake "github.com/gophercloud/gophercloud/openstack/networking/v2/common"
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/members"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
 
-func TestURLs(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.AssertEquals(t, th.Endpoint()+"v2.0/lb/members", rootURL(fake.ServiceClient()))
-}
-
 func TestList(t *testing.T) {
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
@@ -59,16 +53,16 @@
 
 	count := 0
 
-	List(fake.ServiceClient(), ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
+	members.List(fake.ServiceClient(), members.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractMembers(page)
+		actual, err := members.ExtractMembers(page)
 		if err != nil {
 			t.Errorf("Failed to extract members: %v", err)
 			return false, err
 		}
 
-		expected := []Member{
-			Member{
+		expected := []members.Member{
+			{
 				Status:       "ACTIVE",
 				Weight:       1,
 				AdminStateUp: true,
@@ -78,7 +72,7 @@
 				ProtocolPort: 80,
 				ID:           "701b531b-111a-4f21-ad85-4795b7b12af6",
 			},
-			Member{
+			{
 				Status:       "ACTIVE",
 				Weight:       1,
 				AdminStateUp: true,
@@ -138,13 +132,13 @@
     `)
 	})
 
-	options := CreateOpts{
+	options := members.CreateOpts{
 		TenantID:     "453105b9-1754-413f-aab1-55f1af620750",
 		Address:      "192.0.2.14",
 		ProtocolPort: 8080,
 		PoolID:       "foo",
 	}
-	_, err := Create(fake.ServiceClient(), options).Extract()
+	_, err := members.Create(fake.ServiceClient(), options).Extract()
 	th.AssertNoErr(t, err)
 }
 
@@ -174,7 +168,7 @@
       `)
 	})
 
-	m, err := Get(fake.ServiceClient(), "975592ca-e308-48ad-8298-731935ee9f45").Extract()
+	m, err := members.Get(fake.ServiceClient(), "975592ca-e308-48ad-8298-731935ee9f45").Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, "975592ca-e308-48ad-8298-731935ee9f45", m.ID)
@@ -223,9 +217,9 @@
     `)
 	})
 
-	options := UpdateOpts{AdminStateUp: gophercloud.Disabled}
+	options := members.UpdateOpts{AdminStateUp: gophercloud.Disabled}
 
-	_, err := Update(fake.ServiceClient(), "332abe93-f488-41ba-870b-2ac66be7f853", options).Extract()
+	_, err := members.Update(fake.ServiceClient(), "332abe93-f488-41ba-870b-2ac66be7f853", options).Extract()
 	th.AssertNoErr(t, err)
 }
 
@@ -239,6 +233,6 @@
 		w.WriteHeader(http.StatusNoContent)
 	})
 
-	res := Delete(fake.ServiceClient(), "332abe93-f488-41ba-870b-2ac66be7f853")
+	res := members.Delete(fake.ServiceClient(), "332abe93-f488-41ba-870b-2ac66be7f853")
 	th.AssertNoErr(t, res.Err)
 }
diff --git a/openstack/networking/v2/extensions/lbaas/monitors/testing/doc.go b/openstack/networking/v2/extensions/lbaas/monitors/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/networking/v2/extensions/lbaas/monitors/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/networking/v2/extensions/lbaas/monitors/requests_test.go b/openstack/networking/v2/extensions/lbaas/monitors/testing/requests_test.go
similarity index 87%
rename from openstack/networking/v2/extensions/lbaas/monitors/requests_test.go
rename to openstack/networking/v2/extensions/lbaas/monitors/testing/requests_test.go
index bd22ae1..f736074 100644
--- a/openstack/networking/v2/extensions/lbaas/monitors/requests_test.go
+++ b/openstack/networking/v2/extensions/lbaas/monitors/testing/requests_test.go
@@ -1,4 +1,4 @@
-package monitors
+package testing
 
 import (
 	"fmt"
@@ -7,16 +7,11 @@
 
 	"github.com/gophercloud/gophercloud"
 	fake "github.com/gophercloud/gophercloud/openstack/networking/v2/common"
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/monitors"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
 
-func TestURLs(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-	th.AssertEquals(t, th.Endpoint()+"v2.0/lb/health_monitors", rootURL(fake.ServiceClient()))
-}
-
 func TestList(t *testing.T) {
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
@@ -59,16 +54,16 @@
 
 	count := 0
 
-	List(fake.ServiceClient(), ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
+	monitors.List(fake.ServiceClient(), monitors.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractMonitors(page)
+		actual, err := monitors.ExtractMonitors(page)
 		if err != nil {
 			t.Errorf("Failed to extract monitors: %v", err)
 			return false, err
 		}
 
-		expected := []Monitor{
-			Monitor{
+		expected := []monitors.Monitor{
+			{
 				AdminStateUp: true,
 				TenantID:     "83657cfcdfe44cd5920adaf26c48ceea",
 				Delay:        10,
@@ -77,7 +72,7 @@
 				Type:         "PING",
 				ID:           "466c8345-28d8-4f84-a246-e04380b0461d",
 			},
-			Monitor{
+			{
 				AdminStateUp:  true,
 				TenantID:      "83657cfcdfe44cd5920adaf26c48ceea",
 				Delay:         5,
@@ -102,7 +97,7 @@
 }
 
 func TestDelayMustBeGreaterOrEqualThanTimeout(t *testing.T) {
-	_, err := Create(fake.ServiceClient(), CreateOpts{
+	_, err := monitors.Create(fake.ServiceClient(), monitors.CreateOpts{
 		Type:          "HTTP",
 		Delay:         1,
 		Timeout:       10,
@@ -115,7 +110,7 @@
 		t.Fatalf("Expected error, got none")
 	}
 
-	_, err = Update(fake.ServiceClient(), "453105b9-1754-413f-aab1-55f1af620750", UpdateOpts{
+	_, err = monitors.Update(fake.ServiceClient(), "453105b9-1754-413f-aab1-55f1af620750", monitors.UpdateOpts{
 		Delay:   1,
 		Timeout: 10,
 	}).Extract()
@@ -170,7 +165,7 @@
 		`)
 	})
 
-	_, err := Create(fake.ServiceClient(), CreateOpts{
+	_, err := monitors.Create(fake.ServiceClient(), monitors.CreateOpts{
 		Type:          "HTTP",
 		TenantID:      "453105b9-1754-413f-aab1-55f1af620750",
 		Delay:         20,
@@ -184,11 +179,11 @@
 }
 
 func TestRequiredCreateOpts(t *testing.T) {
-	res := Create(fake.ServiceClient(), CreateOpts{})
+	res := monitors.Create(fake.ServiceClient(), monitors.CreateOpts{})
 	if res.Err == nil {
 		t.Fatalf("Expected error, got none")
 	}
-	res = Create(fake.ServiceClient(), CreateOpts{Type: TypeHTTP})
+	res = monitors.Create(fake.ServiceClient(), monitors.CreateOpts{Type: monitors.TypeHTTP})
 	if res.Err == nil {
 		t.Fatalf("Expected error, got none")
 	}
@@ -224,7 +219,7 @@
 			`)
 	})
 
-	hm, err := Get(fake.ServiceClient(), "f3eeab00-8367-4524-b662-55e64d4cacb5").Extract()
+	hm, err := monitors.Get(fake.ServiceClient(), "f3eeab00-8367-4524-b662-55e64d4cacb5").Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, "f3eeab00-8367-4524-b662-55e64d4cacb5", hm.ID)
@@ -288,7 +283,7 @@
 		`)
 	})
 
-	_, err := Update(fake.ServiceClient(), "b05e44b5-81f9-4551-b474-711a722698f7", UpdateOpts{
+	_, err := monitors.Update(fake.ServiceClient(), "b05e44b5-81f9-4551-b474-711a722698f7", monitors.UpdateOpts{
 		Delay:         30,
 		Timeout:       20,
 		MaxRetries:    10,
@@ -310,6 +305,6 @@
 		w.WriteHeader(http.StatusNoContent)
 	})
 
-	res := Delete(fake.ServiceClient(), "b05e44b5-81f9-4551-b474-711a722698f7")
+	res := monitors.Delete(fake.ServiceClient(), "b05e44b5-81f9-4551-b474-711a722698f7")
 	th.AssertNoErr(t, res.Err)
 }
diff --git a/openstack/networking/v2/extensions/lbaas/pools/testing/doc.go b/openstack/networking/v2/extensions/lbaas/pools/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/networking/v2/extensions/lbaas/pools/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/networking/v2/extensions/lbaas/pools/requests_test.go b/openstack/networking/v2/extensions/lbaas/pools/testing/requests_test.go
similarity index 87%
rename from openstack/networking/v2/extensions/lbaas/pools/requests_test.go
rename to openstack/networking/v2/extensions/lbaas/pools/testing/requests_test.go
index 5ef0a3b..a42d1aa 100644
--- a/openstack/networking/v2/extensions/lbaas/pools/requests_test.go
+++ b/openstack/networking/v2/extensions/lbaas/pools/testing/requests_test.go
@@ -1,4 +1,4 @@
-package pools
+package testing
 
 import (
 	"fmt"
@@ -6,17 +6,11 @@
 	"testing"
 
 	fake "github.com/gophercloud/gophercloud/openstack/networking/v2/common"
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/pools"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
 
-func TestURLs(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.AssertEquals(t, th.Endpoint()+"v2.0/lb/pools", rootURL(fake.ServiceClient()))
-}
-
 func TestList(t *testing.T) {
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
@@ -61,16 +55,16 @@
 
 	count := 0
 
-	List(fake.ServiceClient(), ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
+	pools.List(fake.ServiceClient(), pools.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractPools(page)
+		actual, err := pools.ExtractPools(page)
 		if err != nil {
 			t.Errorf("Failed to extract pools: %v", err)
 			return false, err
 		}
 
-		expected := []Pool{
-			Pool{
+		expected := []pools.Pool{
+			{
 				Status:      "ACTIVE",
 				LBMethod:    "ROUND_ROBIN",
 				Protocol:    "HTTP",
@@ -149,14 +143,14 @@
 		`)
 	})
 
-	options := CreateOpts{
-		LBMethod: LBMethodRoundRobin,
+	options := pools.CreateOpts{
+		LBMethod: pools.LBMethodRoundRobin,
 		Protocol: "HTTP",
 		Name:     "Example pool",
 		SubnetID: "1981f108-3c48-48d2-b908-30f7d28532c9",
 		TenantID: "2ffc6e22aae24e4795f87155d24c896f",
 	}
-	p, err := Create(fake.ServiceClient(), options).Extract()
+	p, err := pools.Create(fake.ServiceClient(), options).Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, "PENDING_CREATE", p.Status)
@@ -203,7 +197,7 @@
 			`)
 	})
 
-	n, err := Get(fake.ServiceClient(), "332abe93-f488-41ba-870b-2ac66be7f853").Extract()
+	n, err := pools.Get(fake.ServiceClient(), "332abe93-f488-41ba-870b-2ac66be7f853").Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, n.ID, "332abe93-f488-41ba-870b-2ac66be7f853")
@@ -254,9 +248,9 @@
 		`)
 	})
 
-	options := UpdateOpts{Name: "SuperPool", LBMethod: LBMethodLeastConnections}
+	options := pools.UpdateOpts{Name: "SuperPool", LBMethod: pools.LBMethodLeastConnections}
 
-	n, err := Update(fake.ServiceClient(), "332abe93-f488-41ba-870b-2ac66be7f853", options).Extract()
+	n, err := pools.Update(fake.ServiceClient(), "332abe93-f488-41ba-870b-2ac66be7f853", options).Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, "SuperPool", n.Name)
@@ -273,7 +267,7 @@
 		w.WriteHeader(http.StatusNoContent)
 	})
 
-	res := Delete(fake.ServiceClient(), "332abe93-f488-41ba-870b-2ac66be7f853")
+	res := pools.Delete(fake.ServiceClient(), "332abe93-f488-41ba-870b-2ac66be7f853")
 	th.AssertNoErr(t, res.Err)
 }
 
@@ -299,7 +293,7 @@
 		fmt.Fprintf(w, `{}`)
 	})
 
-	_, err := AssociateMonitor(fake.ServiceClient(), "332abe93-f488-41ba-870b-2ac66be7f853", "b624decf-d5d3-4c66-9a3d-f047e7786181").Extract()
+	_, err := pools.AssociateMonitor(fake.ServiceClient(), "332abe93-f488-41ba-870b-2ac66be7f853", "b624decf-d5d3-4c66-9a3d-f047e7786181").Extract()
 	th.AssertNoErr(t, err)
 }
 
@@ -313,6 +307,6 @@
 		w.WriteHeader(http.StatusNoContent)
 	})
 
-	res := DisassociateMonitor(fake.ServiceClient(), "332abe93-f488-41ba-870b-2ac66be7f853", "b624decf-d5d3-4c66-9a3d-f047e7786181")
+	res := pools.DisassociateMonitor(fake.ServiceClient(), "332abe93-f488-41ba-870b-2ac66be7f853", "b624decf-d5d3-4c66-9a3d-f047e7786181")
 	th.AssertNoErr(t, res.Err)
 }
diff --git a/openstack/networking/v2/extensions/lbaas/vips/testing/doc.go b/openstack/networking/v2/extensions/lbaas/vips/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/networking/v2/extensions/lbaas/vips/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/networking/v2/extensions/lbaas/vips/requests_test.go b/openstack/networking/v2/extensions/lbaas/vips/testing/requests_test.go
similarity index 85%
rename from openstack/networking/v2/extensions/lbaas/vips/requests_test.go
rename to openstack/networking/v2/extensions/lbaas/vips/testing/requests_test.go
index a7612da..7f9b6dd 100644
--- a/openstack/networking/v2/extensions/lbaas/vips/requests_test.go
+++ b/openstack/networking/v2/extensions/lbaas/vips/testing/requests_test.go
@@ -1,4 +1,4 @@
-package vips
+package testing
 
 import (
 	"fmt"
@@ -7,18 +7,11 @@
 
 	"github.com/gophercloud/gophercloud"
 	fake "github.com/gophercloud/gophercloud/openstack/networking/v2/common"
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/lbaas/vips"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
 
-func TestURLs(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.AssertEquals(t, th.Endpoint()+"v2.0/lb/vips", rootURL(fake.ServiceClient()))
-	th.AssertEquals(t, th.Endpoint()+"v2.0/lb/vips/foo", resourceURL(fake.ServiceClient(), "foo"))
-}
-
 func TestList(t *testing.T) {
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
@@ -70,16 +63,16 @@
 
 	count := 0
 
-	List(fake.ServiceClient(), ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
+	vips.List(fake.ServiceClient(), vips.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractVIPs(page)
+		actual, err := vips.ExtractVIPs(page)
 		if err != nil {
 			t.Errorf("Failed to extract LBs: %v", err)
 			return false, err
 		}
 
-		expected := []VirtualIP{
-			VirtualIP{
+		expected := []vips.VirtualIP{
+			{
 				ID:           "db902c0c-d5ff-4753-b465-668ad9656918",
 				TenantID:     "310df60f-2a10-4ee5-9554-98393092194c",
 				Name:         "web_vip",
@@ -90,12 +83,12 @@
 				Protocol:     "HTTP",
 				ProtocolPort: 80,
 				PoolID:       "cfc6589d-f949-4c66-99d2-c2da56ef3764",
-				Persistence:  SessionPersistence{},
+				Persistence:  vips.SessionPersistence{},
 				ConnLimit:    0,
 				AdminStateUp: true,
 				Status:       "ACTIVE",
 			},
-			VirtualIP{
+			{
 				ID:           "36e08a3e-a78f-4b40-a229-1e7e23eee1ab",
 				TenantID:     "310df60f-2a10-4ee5-9554-98393092194c",
 				Name:         "db_vip",
@@ -106,7 +99,7 @@
 				Protocol:     "TCP",
 				ProtocolPort: 3306,
 				PoolID:       "41efe233-7591-43c5-9cf7-923964759f9e",
-				Persistence:  SessionPersistence{Type: "SOURCE_IP"},
+				Persistence:  vips.SessionPersistence{Type: "SOURCE_IP"},
 				ConnLimit:    2000,
 				AdminStateUp: true,
 				Status:       "INACTIVE",
@@ -170,17 +163,17 @@
 		`)
 	})
 
-	opts := CreateOpts{
+	opts := vips.CreateOpts{
 		Protocol:     "HTTP",
 		Name:         "NewVip",
 		AdminStateUp: gophercloud.Enabled,
 		SubnetID:     "8032909d-47a1-4715-90af-5153ffe39861",
 		PoolID:       "61b1f87a-7a21-4ad3-9dda-7f81d249944f",
 		ProtocolPort: 80,
-		Persistence:  &SessionPersistence{Type: "SOURCE_IP"},
+		Persistence:  &vips.SessionPersistence{Type: "SOURCE_IP"},
 	}
 
-	r, err := Create(fake.ServiceClient(), opts).Extract()
+	r, err := vips.Create(fake.ServiceClient(), opts).Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, "PENDING_CREATE", r.Status)
@@ -199,23 +192,23 @@
 }
 
 func TestRequiredCreateOpts(t *testing.T) {
-	res := Create(fake.ServiceClient(), CreateOpts{})
+	res := vips.Create(fake.ServiceClient(), vips.CreateOpts{})
 	if res.Err == nil {
 		t.Fatalf("Expected error, got none")
 	}
-	res = Create(fake.ServiceClient(), CreateOpts{Name: "foo"})
+	res = vips.Create(fake.ServiceClient(), vips.CreateOpts{Name: "foo"})
 	if res.Err == nil {
 		t.Fatalf("Expected error, got none")
 	}
-	res = Create(fake.ServiceClient(), CreateOpts{Name: "foo", SubnetID: "bar"})
+	res = vips.Create(fake.ServiceClient(), vips.CreateOpts{Name: "foo", SubnetID: "bar"})
 	if res.Err == nil {
 		t.Fatalf("Expected error, got none")
 	}
-	res = Create(fake.ServiceClient(), CreateOpts{Name: "foo", SubnetID: "bar", Protocol: "bar"})
+	res = vips.Create(fake.ServiceClient(), vips.CreateOpts{Name: "foo", SubnetID: "bar", Protocol: "bar"})
 	if res.Err == nil {
 		t.Fatalf("Expected error, got none")
 	}
-	res = Create(fake.ServiceClient(), CreateOpts{Name: "foo", SubnetID: "bar", Protocol: "bar", ProtocolPort: 80})
+	res = vips.Create(fake.ServiceClient(), vips.CreateOpts{Name: "foo", SubnetID: "bar", Protocol: "bar", ProtocolPort: 80})
 	if res.Err == nil {
 		t.Fatalf("Expected error, got none")
 	}
@@ -257,7 +250,7 @@
 			`)
 	})
 
-	vip, err := Get(fake.ServiceClient(), "4ec89087-d057-4e2c-911f-60a3b47ee304").Extract()
+	vip, err := vips.Get(fake.ServiceClient(), "4ec89087-d057-4e2c-911f-60a3b47ee304").Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, "ACTIVE", vip.Status)
@@ -265,7 +258,7 @@
 	th.AssertEquals(t, "", vip.Description)
 	th.AssertEquals(t, true, vip.AdminStateUp)
 	th.AssertEquals(t, 1000, vip.ConnLimit)
-	th.AssertEquals(t, SessionPersistence{Type: "APP_COOKIE", CookieName: "MyAppCookie"}, vip.Persistence)
+	th.AssertEquals(t, vips.SessionPersistence{Type: "APP_COOKIE", CookieName: "MyAppCookie"}, vip.Persistence)
 }
 
 func TestUpdate(t *testing.T) {
@@ -311,11 +304,11 @@
 	})
 
 	i1000 := 1000
-	options := UpdateOpts{
+	options := vips.UpdateOpts{
 		ConnLimit:   &i1000,
-		Persistence: &SessionPersistence{Type: "SOURCE_IP"},
+		Persistence: &vips.SessionPersistence{Type: "SOURCE_IP"},
 	}
-	vip, err := Update(fake.ServiceClient(), "4ec89087-d057-4e2c-911f-60a3b47ee304", options).Extract()
+	vip, err := vips.Update(fake.ServiceClient(), "4ec89087-d057-4e2c-911f-60a3b47ee304", options).Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, "PENDING_UPDATE", vip.Status)
@@ -332,6 +325,6 @@
 		w.WriteHeader(http.StatusNoContent)
 	})
 
-	res := Delete(fake.ServiceClient(), "4ec89087-d057-4e2c-911f-60a3b47ee304")
+	res := vips.Delete(fake.ServiceClient(), "4ec89087-d057-4e2c-911f-60a3b47ee304")
 	th.AssertNoErr(t, res.Err)
 }
diff --git a/openstack/networking/v2/extensions/provider/testing/doc.go b/openstack/networking/v2/extensions/provider/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/networking/v2/extensions/provider/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/networking/v2/extensions/provider/results_test.go b/openstack/networking/v2/extensions/provider/testing/results_test.go
similarity index 95%
rename from openstack/networking/v2/extensions/provider/results_test.go
rename to openstack/networking/v2/extensions/provider/testing/results_test.go
index d41e39e..3b6a6fd 100644
--- a/openstack/networking/v2/extensions/provider/results_test.go
+++ b/openstack/networking/v2/extensions/provider/testing/results_test.go
@@ -1,4 +1,4 @@
-package provider
+package testing
 
 import (
 	"fmt"
@@ -7,6 +7,7 @@
 
 	"github.com/gophercloud/gophercloud"
 	fake "github.com/gophercloud/gophercloud/openstack/networking/v2/common"
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/provider"
 	"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
@@ -63,14 +64,14 @@
 
 	networks.List(fake.ServiceClient(), networks.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractList(page)
+		actual, err := provider.ExtractList(page)
 		if err != nil {
 			t.Errorf("Failed to extract networks: %v", err)
 			return false, err
 		}
 
-		expected := []NetworkExtAttrs{
-			NetworkExtAttrs{
+		expected := []provider.NetworkExtAttrs{
+			{
 				Status:          "ACTIVE",
 				Subnets:         []string{"54d6f61d-db07-451c-9ab3-b9609b6b6f0b"},
 				Name:            "private-network",
@@ -82,7 +83,7 @@
 				PhysicalNetwork: "",
 				SegmentationID:  "",
 			},
-			NetworkExtAttrs{
+			{
 				Status:          "ACTIVE",
 				Subnets:         []string{"08eae331-0402-425a-923c-34f7cfe39c1b"},
 				Name:            "private",
@@ -138,7 +139,7 @@
 	})
 
 	res := networks.Get(fake.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22")
-	n, err := ExtractGet(res)
+	n, err := provider.ExtractGet(res)
 
 	th.AssertNoErr(t, err)
 
@@ -190,7 +191,7 @@
 
 	options := networks.CreateOpts{Name: "sample_network", AdminStateUp: gophercloud.Enabled}
 	res := networks.Create(fake.ServiceClient(), options)
-	n, err := ExtractCreate(res)
+	n, err := provider.ExtractCreate(res)
 
 	th.AssertNoErr(t, err)
 
@@ -244,7 +245,7 @@
 	iTrue := true
 	options := networks.UpdateOpts{Name: "new_network_name", AdminStateUp: gophercloud.Disabled, Shared: &iTrue}
 	res := networks.Update(fake.ServiceClient(), "4e8e5957-649f-477b-9e5b-f1f75b21c03c", options)
-	n, err := ExtractUpdate(res)
+	n, err := provider.ExtractUpdate(res)
 
 	th.AssertNoErr(t, err)
 
diff --git a/openstack/networking/v2/extensions/security/groups/testing/doc.go b/openstack/networking/v2/extensions/security/groups/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/networking/v2/extensions/security/groups/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/networking/v2/extensions/security/groups/requests_test.go b/openstack/networking/v2/extensions/security/groups/testing/requests_test.go
similarity index 88%
rename from openstack/networking/v2/extensions/security/groups/requests_test.go
rename to openstack/networking/v2/extensions/security/groups/testing/requests_test.go
index 4519e6c..acd3230 100644
--- a/openstack/networking/v2/extensions/security/groups/requests_test.go
+++ b/openstack/networking/v2/extensions/security/groups/testing/requests_test.go
@@ -1,4 +1,4 @@
-package groups
+package testing
 
 import (
 	"fmt"
@@ -6,19 +6,12 @@
 	"testing"
 
 	fake "github.com/gophercloud/gophercloud/openstack/networking/v2/common"
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups"
 	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
 
-func TestURLs(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.AssertEquals(t, th.Endpoint()+"v2.0/security-groups", rootURL(fake.ServiceClient()))
-	th.AssertEquals(t, th.Endpoint()+"v2.0/security-groups/foo", resourceURL(fake.ServiceClient(), "foo"))
-}
-
 func TestList(t *testing.T) {
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
@@ -47,16 +40,16 @@
 
 	count := 0
 
-	List(fake.ServiceClient(), ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
+	groups.List(fake.ServiceClient(), groups.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractGroups(page)
+		actual, err := groups.ExtractGroups(page)
 		if err != nil {
 			t.Errorf("Failed to extract secgroups: %v", err)
 			return false, err
 		}
 
-		expected := []SecGroup{
-			SecGroup{
+		expected := []groups.SecGroup{
+			{
 				Description: "default",
 				ID:          "85cc3048-abc3-43cc-89b3-377341426ac5",
 				Name:        "default",
@@ -134,8 +127,8 @@
     `)
 	})
 
-	opts := CreateOpts{Name: "new-webservers", Description: "security group for webservers"}
-	_, err := Create(fake.ServiceClient(), opts).Extract()
+	opts := groups.CreateOpts{Name: "new-webservers", Description: "security group for webservers"}
+	_, err := groups.Create(fake.ServiceClient(), opts).Extract()
 	th.AssertNoErr(t, err)
 }
 
@@ -188,7 +181,7 @@
       `)
 	})
 
-	sg, err := Get(fake.ServiceClient(), "85cc3048-abc3-43cc-89b3-377341426ac5").Extract()
+	sg, err := groups.Get(fake.ServiceClient(), "85cc3048-abc3-43cc-89b3-377341426ac5").Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, "default", sg.Description)
@@ -208,6 +201,6 @@
 		w.WriteHeader(http.StatusNoContent)
 	})
 
-	res := Delete(fake.ServiceClient(), "4ec89087-d057-4e2c-911f-60a3b47ee304")
+	res := groups.Delete(fake.ServiceClient(), "4ec89087-d057-4e2c-911f-60a3b47ee304")
 	th.AssertNoErr(t, res.Err)
 }
diff --git a/openstack/networking/v2/extensions/security/rules/testing/doc.go b/openstack/networking/v2/extensions/security/rules/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/networking/v2/extensions/security/rules/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/networking/v2/extensions/security/rules/requests_test.go b/openstack/networking/v2/extensions/security/rules/testing/requests_test.go
similarity index 83%
rename from openstack/networking/v2/extensions/security/rules/requests_test.go
rename to openstack/networking/v2/extensions/security/rules/testing/requests_test.go
index 974b3ce..968fd04 100644
--- a/openstack/networking/v2/extensions/security/rules/requests_test.go
+++ b/openstack/networking/v2/extensions/security/rules/testing/requests_test.go
@@ -1,4 +1,4 @@
-package rules
+package testing
 
 import (
 	"fmt"
@@ -6,18 +6,11 @@
 	"testing"
 
 	fake "github.com/gophercloud/gophercloud/openstack/networking/v2/common"
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/rules"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
 
-func TestURLs(t *testing.T) {
-	th.SetupHTTP()
-	defer th.TeardownHTTP()
-
-	th.AssertEquals(t, th.Endpoint()+"v2.0/security-group-rules", rootURL(fake.ServiceClient()))
-	th.AssertEquals(t, th.Endpoint()+"v2.0/security-group-rules/foo", resourceURL(fake.ServiceClient(), "foo"))
-}
-
 func TestList(t *testing.T) {
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
@@ -63,16 +56,16 @@
 
 	count := 0
 
-	List(fake.ServiceClient(), ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
+	rules.List(fake.ServiceClient(), rules.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractRules(page)
+		actual, err := rules.ExtractRules(page)
 		if err != nil {
 			t.Errorf("Failed to extract secrules: %v", err)
 			return false, err
 		}
 
-		expected := []SecGroupRule{
-			SecGroupRule{
+		expected := []rules.SecGroupRule{
+			{
 				Direction:      "egress",
 				EtherType:      "IPv6",
 				ID:             "3c0e45ff-adaf-4124-b083-bf390e5482ff",
@@ -84,7 +77,7 @@
 				SecGroupID:     "85cc3048-abc3-43cc-89b3-377341426ac5",
 				TenantID:       "e4f50856753b4dc6afee5fa6b9b6c550",
 			},
-			SecGroupRule{
+			{
 				Direction:      "egress",
 				EtherType:      "IPv4",
 				ID:             "93aa42e5-80db-4581-9391-3a608bd0e448",
@@ -152,33 +145,33 @@
     `)
 	})
 
-	opts := CreateOpts{
+	opts := rules.CreateOpts{
 		Direction:     "ingress",
 		PortRangeMin:  80,
-		EtherType:     EtherType4,
+		EtherType:     rules.EtherType4,
 		PortRangeMax:  80,
 		Protocol:      "tcp",
 		RemoteGroupID: "85cc3048-abc3-43cc-89b3-377341426ac5",
 		SecGroupID:    "a7734e61-b545-452d-a3cd-0189cbd9747a",
 	}
-	_, err := Create(fake.ServiceClient(), opts).Extract()
+	_, err := rules.Create(fake.ServiceClient(), opts).Extract()
 	th.AssertNoErr(t, err)
 }
 
 func TestRequiredCreateOpts(t *testing.T) {
-	res := Create(fake.ServiceClient(), CreateOpts{Direction: DirIngress})
+	res := rules.Create(fake.ServiceClient(), rules.CreateOpts{Direction: rules.DirIngress})
 	if res.Err == nil {
 		t.Fatalf("Expected error, got none")
 	}
-	res = Create(fake.ServiceClient(), CreateOpts{Direction: DirIngress, EtherType: EtherType4})
+	res = rules.Create(fake.ServiceClient(), rules.CreateOpts{Direction: rules.DirIngress, EtherType: rules.EtherType4})
 	if res.Err == nil {
 		t.Fatalf("Expected error, got none")
 	}
-	res = Create(fake.ServiceClient(), CreateOpts{Direction: DirIngress, EtherType: EtherType4})
+	res = rules.Create(fake.ServiceClient(), rules.CreateOpts{Direction: rules.DirIngress, EtherType: rules.EtherType4})
 	if res.Err == nil {
 		t.Fatalf("Expected error, got none")
 	}
-	res = Create(fake.ServiceClient(), CreateOpts{Direction: DirIngress, EtherType: EtherType4, SecGroupID: "something", Protocol: "foo"})
+	res = rules.Create(fake.ServiceClient(), rules.CreateOpts{Direction: rules.DirIngress, EtherType: rules.EtherType4, SecGroupID: "something", Protocol: "foo"})
 	if res.Err == nil {
 		t.Fatalf("Expected error, got none")
 	}
@@ -213,7 +206,7 @@
       `)
 	})
 
-	sr, err := Get(fake.ServiceClient(), "3c0e45ff-adaf-4124-b083-bf390e5482ff").Extract()
+	sr, err := rules.Get(fake.ServiceClient(), "3c0e45ff-adaf-4124-b083-bf390e5482ff").Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, "egress", sr.Direction)
@@ -238,6 +231,6 @@
 		w.WriteHeader(http.StatusNoContent)
 	})
 
-	res := Delete(fake.ServiceClient(), "4ec89087-d057-4e2c-911f-60a3b47ee304")
+	res := rules.Delete(fake.ServiceClient(), "4ec89087-d057-4e2c-911f-60a3b47ee304")
 	th.AssertNoErr(t, res.Err)
 }
diff --git a/openstack/networking/v2/extensions/delegate_test.go b/openstack/networking/v2/extensions/testing/delegate_test.go
similarity index 88%
rename from openstack/networking/v2/extensions/delegate_test.go
rename to openstack/networking/v2/extensions/testing/delegate_test.go
index 26ab0ef..618d052 100755
--- a/openstack/networking/v2/extensions/delegate_test.go
+++ b/openstack/networking/v2/extensions/testing/delegate_test.go
@@ -1,4 +1,4 @@
-package extensions
+package testing
 
 import (
 	"fmt"
@@ -7,6 +7,7 @@
 
 	common "github.com/gophercloud/gophercloud/openstack/common/extensions"
 	fake "github.com/gophercloud/gophercloud/openstack/networking/v2/common"
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
@@ -39,15 +40,15 @@
 
 	count := 0
 
-	List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+	extensions.List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractExtensions(page)
+		actual, err := extensions.ExtractExtensions(page)
 		if err != nil {
 			t.Errorf("Failed to extract extensions: %v", err)
 		}
 
-		expected := []Extension{
-			Extension{
+		expected := []extensions.Extension{
+			{
 				common.Extension{
 					Updated:     "2013-01-20T00:00:00-00:00",
 					Name:        "Neutron Service Type Management",
@@ -94,7 +95,7 @@
     `)
 	})
 
-	ext, err := Get(fake.ServiceClient(), "agent").Extract()
+	ext, err := extensions.Get(fake.ServiceClient(), "agent").Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, ext.Updated, "2013-02-03T10:00:00-00:00")
diff --git a/openstack/networking/v2/extensions/testing/doc.go b/openstack/networking/v2/extensions/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/networking/v2/extensions/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/networking/v2/networks/errors.go b/openstack/networking/v2/networks/errors.go
deleted file mode 100644
index 83c4a6a..0000000
--- a/openstack/networking/v2/networks/errors.go
+++ /dev/null
@@ -1 +0,0 @@
-package networks
diff --git a/openstack/networking/v2/networks/testing/doc.go b/openstack/networking/v2/networks/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/networking/v2/networks/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/networking/v2/networks/requests_test.go b/openstack/networking/v2/networks/testing/requests_test.go
similarity index 87%
rename from openstack/networking/v2/networks/requests_test.go
rename to openstack/networking/v2/networks/testing/requests_test.go
index c5660ac..5b9f03d 100644
--- a/openstack/networking/v2/networks/requests_test.go
+++ b/openstack/networking/v2/networks/testing/requests_test.go
@@ -1,4 +1,4 @@
-package networks
+package testing
 
 import (
 	"fmt"
@@ -6,6 +6,7 @@
 	"testing"
 
 	fake "github.com/gophercloud/gophercloud/openstack/networking/v2/common"
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
@@ -54,16 +55,16 @@
 	client := fake.ServiceClient()
 	count := 0
 
-	List(client, ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
+	networks.List(client, networks.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractNetworks(page)
+		actual, err := networks.ExtractNetworks(page)
 		if err != nil {
 			t.Errorf("Failed to extract networks: %v", err)
 			return false, err
 		}
 
-		expected := []Network{
-			Network{
+		expected := []networks.Network{
+			{
 				Status:       "ACTIVE",
 				Subnets:      []string{"54d6f61d-db07-451c-9ab3-b9609b6b6f0b"},
 				Name:         "private-network",
@@ -72,7 +73,7 @@
 				Shared:       true,
 				ID:           "d32019d3-bc6e-4319-9c1d-6722fc136a22",
 			},
-			Network{
+			{
 				Status:       "ACTIVE",
 				Subnets:      []string{"08eae331-0402-425a-923c-34f7cfe39c1b"},
 				Name:         "private",
@@ -121,7 +122,7 @@
 			`)
 	})
 
-	n, err := Get(fake.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22").Extract()
+	n, err := networks.Get(fake.ServiceClient(), "d32019d3-bc6e-4319-9c1d-6722fc136a22").Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, n.Status, "ACTIVE")
@@ -170,8 +171,8 @@
 	})
 
 	iTrue := true
-	options := CreateOpts{Name: "sample_network", AdminStateUp: &iTrue}
-	n, err := Create(fake.ServiceClient(), options).Extract()
+	options := networks.CreateOpts{Name: "sample_network", AdminStateUp: &iTrue}
+	n, err := networks.Create(fake.ServiceClient(), options).Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, n.Status, "ACTIVE")
@@ -208,8 +209,8 @@
 	})
 
 	iTrue := true
-	options := CreateOpts{Name: "sample_network", AdminStateUp: &iTrue, Shared: &iTrue, TenantID: "12345"}
-	_, err := Create(fake.ServiceClient(), options).Extract()
+	options := networks.CreateOpts{Name: "sample_network", AdminStateUp: &iTrue, Shared: &iTrue, TenantID: "12345"}
+	_, err := networks.Create(fake.ServiceClient(), options).Extract()
 	th.AssertNoErr(t, err)
 }
 
@@ -251,8 +252,8 @@
 	})
 
 	iTrue, iFalse := true, false
-	options := UpdateOpts{Name: "new_network_name", AdminStateUp: &iFalse, Shared: &iTrue}
-	n, err := Update(fake.ServiceClient(), "4e8e5957-649f-477b-9e5b-f1f75b21c03c", options).Extract()
+	options := networks.UpdateOpts{Name: "new_network_name", AdminStateUp: &iFalse, Shared: &iTrue}
+	n, err := networks.Update(fake.ServiceClient(), "4e8e5957-649f-477b-9e5b-f1f75b21c03c", options).Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, n.Name, "new_network_name")
@@ -271,6 +272,6 @@
 		w.WriteHeader(http.StatusNoContent)
 	})
 
-	res := Delete(fake.ServiceClient(), "4e8e5957-649f-477b-9e5b-f1f75b21c03c")
+	res := networks.Delete(fake.ServiceClient(), "4e8e5957-649f-477b-9e5b-f1f75b21c03c")
 	th.AssertNoErr(t, res.Err)
 }
diff --git a/openstack/networking/v2/ports/testing/doc.go b/openstack/networking/v2/ports/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/networking/v2/ports/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/networking/v2/ports/requests_test.go b/openstack/networking/v2/ports/testing/requests_test.go
similarity index 82%
rename from openstack/networking/v2/ports/requests_test.go
rename to openstack/networking/v2/ports/testing/requests_test.go
index bcd69d4..007dc5a 100644
--- a/openstack/networking/v2/ports/requests_test.go
+++ b/openstack/networking/v2/ports/testing/requests_test.go
@@ -1,4 +1,4 @@
-package ports
+package testing
 
 import (
 	"fmt"
@@ -6,6 +6,7 @@
 	"testing"
 
 	fake "github.com/gophercloud/gophercloud/openstack/networking/v2/common"
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
@@ -50,16 +51,16 @@
 
 	count := 0
 
-	List(fake.ServiceClient(), ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
+	ports.List(fake.ServiceClient(), ports.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractPorts(page)
+		actual, err := ports.ExtractPorts(page)
 		if err != nil {
 			t.Errorf("Failed to extract subnets: %v", err)
 			return false, nil
 		}
 
-		expected := []Port{
-			Port{
+		expected := []ports.Port{
+			{
 				Status:       "ACTIVE",
 				Name:         "",
 				AdminStateUp: true,
@@ -67,8 +68,8 @@
 				TenantID:     "",
 				DeviceOwner:  "network:router_gateway",
 				MACAddress:   "fa:16:3e:58:42:ed",
-				FixedIPs: []IP{
-					IP{
+				FixedIPs: []ports.IP{
+					{
 						SubnetID:  "008ba151-0b8c-4a67-98b5-0d2b87666062",
 						IPAddress: "172.24.4.2",
 					},
@@ -124,7 +125,7 @@
 			`)
 	})
 
-	n, err := Get(fake.ServiceClient(), "46d4bfb9-b26e-41f3-bd2e-e6dcc1ccedb2").Extract()
+	n, err := ports.Get(fake.ServiceClient(), "46d4bfb9-b26e-41f3-bd2e-e6dcc1ccedb2").Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, n.Status, "ACTIVE")
@@ -134,8 +135,8 @@
 	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, []IP{
-		IP{SubnetID: "a0304c3a-4f08-4c43-88af-d796509c97d2", IPAddress: "10.0.0.1"},
+	th.AssertDeepEquals(t, n.FixedIPs, []ports.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{})
@@ -211,19 +212,19 @@
 	})
 
 	asu := true
-	options := CreateOpts{
+	options := ports.CreateOpts{
 		Name:         "private-port",
 		AdminStateUp: &asu,
 		NetworkID:    "a87cc70a-3e15-4acf-8205-9b711a3531b7",
-		FixedIPs: []IP{
-			IP{SubnetID: "a0304c3a-4f08-4c43-88af-d796509c97d2", IPAddress: "10.0.0.2"},
+		FixedIPs: []ports.IP{
+			{SubnetID: "a0304c3a-4f08-4c43-88af-d796509c97d2", IPAddress: "10.0.0.2"},
 		},
 		SecurityGroups: []string{"foo"},
-		AllowedAddressPairs: []AddressPair{
-			AddressPair{IPAddress: "10.0.0.4", MACAddress: "fa:16:3e:c9:cb:f0"},
+		AllowedAddressPairs: []ports.AddressPair{
+			{IPAddress: "10.0.0.4", MACAddress: "fa:16:3e:c9:cb:f0"},
 		},
 	}
-	n, err := Create(fake.ServiceClient(), options).Extract()
+	n, err := ports.Create(fake.ServiceClient(), options).Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, n.Status, "DOWN")
@@ -233,18 +234,18 @@
 	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, []IP{
-		IP{SubnetID: "a0304c3a-4f08-4c43-88af-d796509c97d2", IPAddress: "10.0.0.2"},
+	th.AssertDeepEquals(t, n.FixedIPs, []ports.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"})
-	th.AssertDeepEquals(t, n.AllowedAddressPairs, []AddressPair{
-		AddressPair{IPAddress: "10.0.0.4", MACAddress: "fa:16:3e:c9:cb:f0"},
+	th.AssertDeepEquals(t, n.AllowedAddressPairs, []ports.AddressPair{
+		{IPAddress: "10.0.0.4", MACAddress: "fa:16:3e:c9:cb:f0"},
 	})
 }
 
 func TestRequiredCreateOpts(t *testing.T) {
-	res := Create(fake.ServiceClient(), CreateOpts{})
+	res := ports.Create(fake.ServiceClient(), ports.CreateOpts{})
 	if res.Err == nil {
 		t.Fatalf("Expected error, got none")
 	}
@@ -317,26 +318,26 @@
 		`)
 	})
 
-	options := UpdateOpts{
+	options := ports.UpdateOpts{
 		Name: "new_port_name",
-		FixedIPs: []IP{
-			IP{SubnetID: "a0304c3a-4f08-4c43-88af-d796509c97d2", IPAddress: "10.0.0.3"},
+		FixedIPs: []ports.IP{
+			{SubnetID: "a0304c3a-4f08-4c43-88af-d796509c97d2", IPAddress: "10.0.0.3"},
 		},
 		SecurityGroups: []string{"f0ac4394-7e4a-4409-9701-ba8be283dbc3"},
-		AllowedAddressPairs: []AddressPair{
-			AddressPair{IPAddress: "10.0.0.4", MACAddress: "fa:16:3e:c9:cb:f0"},
+		AllowedAddressPairs: []ports.AddressPair{
+			{IPAddress: "10.0.0.4", MACAddress: "fa:16:3e:c9:cb:f0"},
 		},
 	}
 
-	s, err := Update(fake.ServiceClient(), "65c0ee9f-d634-4522-8954-51021b570b0d", options).Extract()
+	s, err := ports.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, []IP{
-		IP{SubnetID: "a0304c3a-4f08-4c43-88af-d796509c97d2", IPAddress: "10.0.0.3"},
+	th.AssertDeepEquals(t, s.FixedIPs, []ports.IP{
+		{SubnetID: "a0304c3a-4f08-4c43-88af-d796509c97d2", IPAddress: "10.0.0.3"},
 	})
-	th.AssertDeepEquals(t, s.AllowedAddressPairs, []AddressPair{
-		AddressPair{IPAddress: "10.0.0.4", MACAddress: "fa:16:3e:c9:cb:f0"},
+	th.AssertDeepEquals(t, s.AllowedAddressPairs, []ports.AddressPair{
+		{IPAddress: "10.0.0.4", MACAddress: "fa:16:3e:c9:cb:f0"},
 	})
 	th.AssertDeepEquals(t, s.SecurityGroups, []string{"f0ac4394-7e4a-4409-9701-ba8be283dbc3"})
 }
@@ -351,6 +352,6 @@
 		w.WriteHeader(http.StatusNoContent)
 	})
 
-	res := Delete(fake.ServiceClient(), "65c0ee9f-d634-4522-8954-51021b570b0d")
+	res := ports.Delete(fake.ServiceClient(), "65c0ee9f-d634-4522-8954-51021b570b0d")
 	th.AssertNoErr(t, res.Err)
 }
diff --git a/openstack/networking/v2/subnets/errors.go b/openstack/networking/v2/subnets/errors.go
deleted file mode 100644
index d2f7b46..0000000
--- a/openstack/networking/v2/subnets/errors.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package subnets
-
-import "fmt"
-
-func err(str string) error {
-	return fmt.Errorf("%s", str)
-}
-
-var (
-	errNetworkIDRequired    = err("A network ID is required")
-	errCIDRRequired         = err("A valid CIDR is required")
-	errInvalidIPType        = err("An IP type must either be 4 or 6")
-	errInvalidGatewayConfig = err("Both disabling the gateway and specifying a gateway is not allowed")
-)
diff --git a/openstack/networking/v2/subnets/testing/doc.go b/openstack/networking/v2/subnets/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/networking/v2/subnets/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/networking/v2/subnets/requests_test.go b/openstack/networking/v2/subnets/testing/requests_test.go
similarity index 85%
rename from openstack/networking/v2/subnets/requests_test.go
rename to openstack/networking/v2/subnets/testing/requests_test.go
index 4241c63..13fa9df 100644
--- a/openstack/networking/v2/subnets/requests_test.go
+++ b/openstack/networking/v2/subnets/testing/requests_test.go
@@ -1,4 +1,4 @@
-package subnets
+package testing
 
 import (
 	"fmt"
@@ -6,6 +6,7 @@
 	"testing"
 
 	fake "github.com/gophercloud/gophercloud/openstack/networking/v2/common"
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
@@ -85,64 +86,64 @@
 
 	count := 0
 
-	List(fake.ServiceClient(), ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
+	subnets.List(fake.ServiceClient(), subnets.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractSubnets(page)
+		actual, err := subnets.ExtractSubnets(page)
 		if err != nil {
 			t.Errorf("Failed to extract subnets: %v", err)
 			return false, nil
 		}
 
-		expected := []Subnet{
-			Subnet{
+		expected := []subnets.Subnet{
+			{
 				Name:           "private-subnet",
 				EnableDHCP:     true,
 				NetworkID:      "db193ab3-96e3-4cb3-8fc5-05f4296d0324",
 				TenantID:       "26a7980765d0414dbc1fc1f88cdb7e6e",
 				DNSNameservers: []string{},
-				AllocationPools: []AllocationPool{
-					AllocationPool{
+				AllocationPools: []subnets.AllocationPool{
+					{
 						Start: "10.0.0.2",
 						End:   "10.0.0.254",
 					},
 				},
-				HostRoutes: []HostRoute{},
+				HostRoutes: []subnets.HostRoute{},
 				IPVersion:  4,
 				GatewayIP:  "10.0.0.1",
 				CIDR:       "10.0.0.0/24",
 				ID:         "08eae331-0402-425a-923c-34f7cfe39c1b",
 			},
-			Subnet{
+			{
 				Name:           "my_subnet",
 				EnableDHCP:     true,
 				NetworkID:      "d32019d3-bc6e-4319-9c1d-6722fc136a22",
 				TenantID:       "4fd44f30292945e481c7b8a0c8908869",
 				DNSNameservers: []string{},
-				AllocationPools: []AllocationPool{
-					AllocationPool{
+				AllocationPools: []subnets.AllocationPool{
+					{
 						Start: "192.0.0.2",
 						End:   "192.255.255.254",
 					},
 				},
-				HostRoutes: []HostRoute{},
+				HostRoutes: []subnets.HostRoute{},
 				IPVersion:  4,
 				GatewayIP:  "192.0.0.1",
 				CIDR:       "192.0.0.0/8",
 				ID:         "54d6f61d-db07-451c-9ab3-b9609b6b6f0b",
 			},
-			Subnet{
+			subnets.Subnet{
 				Name:           "my_gatewayless_subnet",
 				EnableDHCP:     true,
 				NetworkID:      "d32019d3-bc6e-4319-9c1d-6722fc136a23",
 				TenantID:       "4fd44f30292945e481c7b8a0c8908869",
 				DNSNameservers: []string{},
-				AllocationPools: []AllocationPool{
-					AllocationPool{
+				AllocationPools: []subnets.AllocationPool{
+					{
 						Start: "192.168.1.2",
 						End:   "192.168.1.254",
 					},
 				},
-				HostRoutes: []HostRoute{},
+				HostRoutes: []subnets.HostRoute{},
 				IPVersion:  4,
 				GatewayIP:  "",
 				CIDR:       "192.168.1.0/24",
@@ -195,7 +196,7 @@
 			`)
 	})
 
-	s, err := Get(fake.ServiceClient(), "54d6f61d-db07-451c-9ab3-b9609b6b6f0b").Extract()
+	s, err := subnets.Get(fake.ServiceClient(), "54d6f61d-db07-451c-9ab3-b9609b6b6f0b").Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, s.Name, "my_subnet")
@@ -203,13 +204,13 @@
 	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, []AllocationPool{
-		AllocationPool{
+	th.AssertDeepEquals(t, s.AllocationPools, []subnets.AllocationPool{
+		{
 			Start: "192.0.0.2",
 			End:   "192.255.255.254",
 		},
 	})
-	th.AssertDeepEquals(t, s.HostRoutes, []HostRoute{})
+	th.AssertDeepEquals(t, s.HostRoutes, []subnets.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")
@@ -271,22 +272,22 @@
 		`)
 	})
 
-	opts := CreateOpts{
+	opts := subnets.CreateOpts{
 		NetworkID: "d32019d3-bc6e-4319-9c1d-6722fc136a22",
 		IPVersion: 4,
 		CIDR:      "192.168.199.0/24",
-		AllocationPools: []AllocationPool{
-			AllocationPool{
+		AllocationPools: []subnets.AllocationPool{
+			{
 				Start: "192.168.199.2",
 				End:   "192.168.199.254",
 			},
 		},
 		DNSNameservers: []string{"foo"},
-		HostRoutes: []HostRoute{
-			HostRoute{NextHop: "bar"},
+		HostRoutes: []subnets.HostRoute{
+			{NextHop: "bar"},
 		},
 	}
-	s, err := Create(fake.ServiceClient(), opts).Extract()
+	s, err := subnets.Create(fake.ServiceClient(), opts).Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, s.Name, "")
@@ -294,13 +295,13 @@
 	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, []AllocationPool{
-		AllocationPool{
+	th.AssertDeepEquals(t, s.AllocationPools, []subnets.AllocationPool{
+		{
 			Start: "192.168.199.2",
 			End:   "192.168.199.254",
 		},
 	})
-	th.AssertDeepEquals(t, s.HostRoutes, []HostRoute{})
+	th.AssertDeepEquals(t, s.HostRoutes, []subnets.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")
@@ -359,32 +360,32 @@
 		`)
 	})
 
-	opts := CreateOpts{
+	opts := subnets.CreateOpts{
 		NetworkID: "d32019d3-bc6e-4319-9c1d-6722fc136a23",
 		IPVersion: 4,
 		CIDR:      "192.168.1.0/24",
-		AllocationPools: []AllocationPool{
-			AllocationPool{
+		AllocationPools: []subnets.AllocationPool{
+			{
 				Start: "192.168.1.2",
 				End:   "192.168.1.254",
 			},
 		},
 		DNSNameservers: []string{},
 	}
-	s, err := Create(fake.ServiceClient(), opts).Extract()
+	s, err := subnets.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-6722fc136a23")
 	th.AssertEquals(t, s.TenantID, "4fd44f30292945e481c7b8a0c8908869")
-	th.AssertDeepEquals(t, s.AllocationPools, []AllocationPool{
-		AllocationPool{
+	th.AssertDeepEquals(t, s.AllocationPools, []subnets.AllocationPool{
+		{
 			Start: "192.168.1.2",
 			End:   "192.168.1.254",
 		},
 	})
-	th.AssertDeepEquals(t, s.HostRoutes, []HostRoute{})
+	th.AssertDeepEquals(t, s.HostRoutes, []subnets.HostRoute{})
 	th.AssertEquals(t, s.IPVersion, 4)
 	th.AssertEquals(t, s.GatewayIP, "")
 	th.AssertEquals(t, s.CIDR, "192.168.1.0/24")
@@ -392,17 +393,17 @@
 }
 
 func TestRequiredCreateOpts(t *testing.T) {
-	res := Create(fake.ServiceClient(), CreateOpts{})
+	res := subnets.Create(fake.ServiceClient(), subnets.CreateOpts{})
 	if res.Err == nil {
 		t.Fatalf("Expected error, got none")
 	}
 
-	res = Create(fake.ServiceClient(), CreateOpts{NetworkID: "foo"})
+	res = subnets.Create(fake.ServiceClient(), subnets.CreateOpts{NetworkID: "foo"})
 	if res.Err == nil {
 		t.Fatalf("Expected error, got none")
 	}
 
-	res = Create(fake.ServiceClient(), CreateOpts{NetworkID: "foo", CIDR: "bar", IPVersion: 40})
+	res = subnets.Create(fake.ServiceClient(), subnets.CreateOpts{NetworkID: "foo", CIDR: "bar", IPVersion: 40})
 	if res.Err == nil {
 		t.Fatalf("Expected error, got none")
 	}
@@ -454,14 +455,14 @@
 	`)
 	})
 
-	opts := UpdateOpts{
+	opts := subnets.UpdateOpts{
 		Name:           "my_new_subnet",
 		DNSNameservers: []string{"foo"},
-		HostRoutes: []HostRoute{
-			HostRoute{NextHop: "bar"},
+		HostRoutes: []subnets.HostRoute{
+			{NextHop: "bar"},
 		},
 	}
-	s, err := Update(fake.ServiceClient(), "08eae331-0402-425a-923c-34f7cfe39c1b", opts).Extract()
+	s, err := subnets.Update(fake.ServiceClient(), "08eae331-0402-425a-923c-34f7cfe39c1b", opts).Extract()
 	th.AssertNoErr(t, err)
 
 	th.AssertEquals(t, s.Name, "my_new_subnet")
@@ -478,6 +479,6 @@
 		w.WriteHeader(http.StatusNoContent)
 	})
 
-	res := Delete(fake.ServiceClient(), "08eae331-0402-425a-923c-34f7cfe39c1b")
+	res := subnets.Delete(fake.ServiceClient(), "08eae331-0402-425a-923c-34f7cfe39c1b")
 	th.AssertNoErr(t, res.Err)
 }
diff --git a/openstack/networking/v2/subnets/results_test.go b/openstack/networking/v2/subnets/testing/results_test.go
similarity index 77%
rename from openstack/networking/v2/subnets/results_test.go
rename to openstack/networking/v2/subnets/testing/results_test.go
index ce71a46..a227ccd 100644
--- a/openstack/networking/v2/subnets/results_test.go
+++ b/openstack/networking/v2/subnets/testing/results_test.go
@@ -1,10 +1,12 @@
-package subnets
+package testing
 
 import (
 	"encoding/json"
-	"github.com/gophercloud/gophercloud"
-	th "github.com/gophercloud/gophercloud/testhelper"
 	"testing"
+
+	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
+	th "github.com/gophercloud/gophercloud/testhelper"
 )
 
 func TestHostRoute(t *testing.T) {
@@ -26,7 +28,7 @@
       "host_routes": [
         {
           "destination": "172.20.1.0/24",
-		  "nexthop": "172.16.0.2"
+		  		"nexthop": "172.16.0.2"
         }
       ],
       "ip_version": 4,
@@ -43,12 +45,15 @@
 		t.Fatalf("%s", err)
 	}
 
-	resp := commonResult{gophercloud.Result{Body: dejson}}
-	subnet, err := resp.Extract()
+	resp := gophercloud.Result{Body: dejson}
+	var subnetWrapper struct {
+		Subnet subnets.Subnet `json:"subnet"`
+	}
+	err = resp.ExtractInto(&subnetWrapper)
 	if err != nil {
 		t.Fatalf("%s", err)
 	}
-	route := subnet.HostRoutes[0]
+	route := subnetWrapper.Subnet.HostRoutes[0]
 	th.AssertEquals(t, route.NextHop, "172.16.0.2")
 	th.AssertEquals(t, route.DestinationCIDR, "172.20.1.0/24")
 }
diff --git a/openstack/objectstorage/v1/accounts/testing/doc.go b/openstack/objectstorage/v1/accounts/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/objectstorage/v1/accounts/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/objectstorage/v1/accounts/fixtures.go b/openstack/objectstorage/v1/accounts/testing/fixtures.go
similarity index 96%
rename from openstack/objectstorage/v1/accounts/fixtures.go
rename to openstack/objectstorage/v1/accounts/testing/fixtures.go
index 16327e8..a265199 100644
--- a/openstack/objectstorage/v1/accounts/fixtures.go
+++ b/openstack/objectstorage/v1/accounts/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package accounts
+package testing
 
 import (
 	"net/http"
diff --git a/openstack/objectstorage/v1/accounts/requests_test.go b/openstack/objectstorage/v1/accounts/testing/requests_test.go
similarity index 66%
rename from openstack/objectstorage/v1/accounts/requests_test.go
rename to openstack/objectstorage/v1/accounts/testing/requests_test.go
index 8aba591..cf3fe05 100644
--- a/openstack/objectstorage/v1/accounts/requests_test.go
+++ b/openstack/objectstorage/v1/accounts/testing/requests_test.go
@@ -1,8 +1,9 @@
-package accounts
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/objectstorage/v1/accounts"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
 )
@@ -12,8 +13,8 @@
 	defer th.TeardownHTTP()
 	HandleUpdateAccountSuccessfully(t)
 
-	options := &UpdateOpts{Metadata: map[string]string{"gophercloud-test": "accounts"}}
-	_, err := Update(fake.ServiceClient(), options).Extract()
+	options := &accounts.UpdateOpts{Metadata: map[string]string{"gophercloud-test": "accounts"}}
+	_, err := accounts.Update(fake.ServiceClient(), options).Extract()
 	th.AssertNoErr(t, err)
 }
 
@@ -23,7 +24,7 @@
 	HandleGetAccountSuccessfully(t)
 
 	expectedMetadata := map[string]string{"Subject": "books"}
-	res := Get(fake.ServiceClient(), &GetOpts{})
+	res := accounts.Get(fake.ServiceClient(), &accounts.GetOpts{})
 	th.AssertNoErr(t, res.Err)
 	actualMetadata, _ := res.ExtractMetadata()
 	th.CheckDeepEquals(t, expectedMetadata, actualMetadata)
diff --git a/openstack/objectstorage/v1/containers/testing/doc.go b/openstack/objectstorage/v1/containers/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/objectstorage/v1/containers/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/objectstorage/v1/containers/fixtures.go b/openstack/objectstorage/v1/containers/testing/fixtures.go
similarity index 96%
rename from openstack/objectstorage/v1/containers/fixtures.go
rename to openstack/objectstorage/v1/containers/testing/fixtures.go
index fde8815..fe579d8 100644
--- a/openstack/objectstorage/v1/containers/fixtures.go
+++ b/openstack/objectstorage/v1/containers/testing/fixtures.go
@@ -1,25 +1,24 @@
-// +build fixtures
-
-package containers
+package testing
 
 import (
 	"fmt"
 	"net/http"
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/objectstorage/v1/containers"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
 )
 
 // ExpectedListInfo is the result expected from a call to `List` when full
 // info is requested.
-var ExpectedListInfo = []Container{
-	Container{
+var ExpectedListInfo = []containers.Container{
+	{
 		Count: 0,
 		Bytes: 0,
 		Name:  "janeausten",
 	},
-	Container{
+	{
 		Count: 1,
 		Bytes: 14,
 		Name:  "marktwain",
diff --git a/openstack/objectstorage/v1/containers/requests_test.go b/openstack/objectstorage/v1/containers/testing/requests_test.go
similarity index 63%
rename from openstack/objectstorage/v1/containers/requests_test.go
rename to openstack/objectstorage/v1/containers/testing/requests_test.go
index 5066ab2..0d32882 100644
--- a/openstack/objectstorage/v1/containers/requests_test.go
+++ b/openstack/objectstorage/v1/containers/testing/requests_test.go
@@ -1,8 +1,9 @@
-package containers
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/objectstorage/v1/containers"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
@@ -16,9 +17,9 @@
 	HandleListContainerInfoSuccessfully(t)
 
 	count := 0
-	err := List(fake.ServiceClient(), &ListOpts{Full: true}).EachPage(func(page pagination.Page) (bool, error) {
+	err := containers.List(fake.ServiceClient(), &containers.ListOpts{Full: true}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractInfo(page)
+		actual, err := containers.ExtractInfo(page)
 		th.AssertNoErr(t, err)
 
 		th.CheckDeepEquals(t, ExpectedListInfo, actual)
@@ -34,9 +35,9 @@
 	defer th.TeardownHTTP()
 	HandleListContainerInfoSuccessfully(t)
 
-	allPages, err := List(fake.ServiceClient(), &ListOpts{Full: true}).AllPages()
+	allPages, err := containers.List(fake.ServiceClient(), &containers.ListOpts{Full: true}).AllPages()
 	th.AssertNoErr(t, err)
-	actual, err := ExtractInfo(allPages)
+	actual, err := containers.ExtractInfo(allPages)
 	th.AssertNoErr(t, err)
 	th.CheckDeepEquals(t, ExpectedListInfo, actual)
 }
@@ -47,9 +48,9 @@
 	HandleListContainerNamesSuccessfully(t)
 
 	count := 0
-	err := List(fake.ServiceClient(), &ListOpts{Full: false}).EachPage(func(page pagination.Page) (bool, error) {
+	err := containers.List(fake.ServiceClient(), &containers.ListOpts{Full: false}).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractNames(page)
+		actual, err := containers.ExtractNames(page)
 		if err != nil {
 			t.Errorf("Failed to extract container names: %v", err)
 			return false, err
@@ -68,9 +69,9 @@
 	defer th.TeardownHTTP()
 	HandleListContainerNamesSuccessfully(t)
 
-	allPages, err := List(fake.ServiceClient(), &ListOpts{Full: false}).AllPages()
+	allPages, err := containers.List(fake.ServiceClient(), &containers.ListOpts{Full: false}).AllPages()
 	th.AssertNoErr(t, err)
-	actual, err := ExtractNames(allPages)
+	actual, err := containers.ExtractNames(allPages)
 	th.AssertNoErr(t, err)
 	th.CheckDeepEquals(t, ExpectedListNames, actual)
 }
@@ -80,8 +81,8 @@
 	defer th.TeardownHTTP()
 	HandleCreateContainerSuccessfully(t)
 
-	options := CreateOpts{ContentType: "application/json", Metadata: map[string]string{"foo": "bar"}}
-	res := Create(fake.ServiceClient(), "testContainer", options)
+	options := containers.CreateOpts{ContentType: "application/json", Metadata: map[string]string{"foo": "bar"}}
+	res := containers.Create(fake.ServiceClient(), "testContainer", options)
 	c, err := res.Extract()
 	th.CheckNoErr(t, err)
 	th.CheckEquals(t, "bar", res.Header["X-Container-Meta-Foo"][0])
@@ -93,7 +94,7 @@
 	defer th.TeardownHTTP()
 	HandleDeleteContainerSuccessfully(t)
 
-	res := Delete(fake.ServiceClient(), "testContainer")
+	res := containers.Delete(fake.ServiceClient(), "testContainer")
 	th.CheckNoErr(t, res.Err)
 }
 
@@ -102,8 +103,8 @@
 	defer th.TeardownHTTP()
 	HandleUpdateContainerSuccessfully(t)
 
-	options := &UpdateOpts{Metadata: map[string]string{"foo": "bar"}}
-	res := Update(fake.ServiceClient(), "testContainer", options)
+	options := &containers.UpdateOpts{Metadata: map[string]string{"foo": "bar"}}
+	res := containers.Update(fake.ServiceClient(), "testContainer", options)
 	th.CheckNoErr(t, res.Err)
 }
 
@@ -112,6 +113,6 @@
 	defer th.TeardownHTTP()
 	HandleGetContainerSuccessfully(t)
 
-	_, err := Get(fake.ServiceClient(), "testContainer").ExtractMetadata()
+	_, err := containers.Get(fake.ServiceClient(), "testContainer").ExtractMetadata()
 	th.CheckNoErr(t, err)
 }
diff --git a/openstack/objectstorage/v1/objects/testing/doc.go b/openstack/objectstorage/v1/objects/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/objectstorage/v1/objects/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/objectstorage/v1/objects/fixtures.go b/openstack/objectstorage/v1/objects/testing/fixtures.go
similarity index 97%
rename from openstack/objectstorage/v1/objects/fixtures.go
rename to openstack/objectstorage/v1/objects/testing/fixtures.go
index 999b305..5077c3f 100644
--- a/openstack/objectstorage/v1/objects/fixtures.go
+++ b/openstack/objectstorage/v1/objects/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package objects
+package testing
 
 import (
 	"crypto/md5"
@@ -9,6 +7,7 @@
 	"net/http"
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/objectstorage/v1/objects"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
 )
@@ -27,15 +26,15 @@
 
 // ExpectedListInfo is the result expected from a call to `List` when full
 // info is requested.
-var ExpectedListInfo = []Object{
-	Object{
+var ExpectedListInfo = []objects.Object{
+	{
 		Hash:         "451e372e48e0f6b1114fa0724aa79fa1",
 		LastModified: "2009-11-10 23:00:00 +0000 UTC",
 		Bytes:        14,
 		Name:         "goodbye",
 		ContentType:  "application/octet-stream",
 	},
-	Object{
+	{
 		Hash:         "451e372e48e0f6b1114fa0724aa79fa1",
 		LastModified: "2009-11-10 23:00:00 +0000 UTC",
 		Bytes:        14,
diff --git a/openstack/objectstorage/v1/objects/requests_test.go b/openstack/objectstorage/v1/objects/testing/requests_test.go
similarity index 68%
rename from openstack/objectstorage/v1/objects/requests_test.go
rename to openstack/objectstorage/v1/objects/testing/requests_test.go
index e612319..332028e 100644
--- a/openstack/objectstorage/v1/objects/requests_test.go
+++ b/openstack/objectstorage/v1/objects/testing/requests_test.go
@@ -1,4 +1,4 @@
-package objects
+package testing
 
 import (
 	"bytes"
@@ -6,6 +6,7 @@
 	"strings"
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/objectstorage/v1/objects"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
@@ -16,7 +17,7 @@
 	defer th.TeardownHTTP()
 	HandleDownloadObjectSuccessfully(t)
 
-	response := Download(fake.ServiceClient(), "testContainer", "testObject", nil)
+	response := objects.Download(fake.ServiceClient(), "testContainer", "testObject", nil)
 	defer response.Body.Close()
 
 	// Check reader
@@ -30,7 +31,7 @@
 	defer th.TeardownHTTP()
 	HandleDownloadObjectSuccessfully(t)
 
-	response := Download(fake.ServiceClient(), "testContainer", "testObject", nil)
+	response := objects.Download(fake.ServiceClient(), "testContainer", "testObject", nil)
 
 	// Check []byte extraction
 	bytes, err := response.ExtractContent()
@@ -44,10 +45,10 @@
 	HandleListObjectsInfoSuccessfully(t)
 
 	count := 0
-	options := &ListOpts{Full: true}
-	err := List(fake.ServiceClient(), "testContainer", options).EachPage(func(page pagination.Page) (bool, error) {
+	options := &objects.ListOpts{Full: true}
+	err := objects.List(fake.ServiceClient(), "testContainer", options).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractInfo(page)
+		actual, err := objects.ExtractInfo(page)
 		th.AssertNoErr(t, err)
 
 		th.CheckDeepEquals(t, ExpectedListInfo, actual)
@@ -64,10 +65,10 @@
 	HandleListObjectNamesSuccessfully(t)
 
 	count := 0
-	options := &ListOpts{Full: false}
-	err := List(fake.ServiceClient(), "testContainer", options).EachPage(func(page pagination.Page) (bool, error) {
+	options := &objects.ListOpts{Full: false}
+	err := objects.List(fake.ServiceClient(), "testContainer", options).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractNames(page)
+		actual, err := objects.ExtractNames(page)
 		if err != nil {
 			t.Errorf("Failed to extract container names: %v", err)
 			return false, err
@@ -89,8 +90,8 @@
 
 	HandleCreateTextObjectSuccessfully(t, content)
 
-	options := &CreateOpts{ContentType: "text/plain", Content: strings.NewReader(content)}
-	res := Create(fake.ServiceClient(), "testContainer", "testObject", options)
+	options := &objects.CreateOpts{ContentType: "text/plain", Content: strings.NewReader(content)}
+	res := objects.Create(fake.ServiceClient(), "testContainer", "testObject", options)
 	th.AssertNoErr(t, res.Err)
 }
 
@@ -102,7 +103,7 @@
 
 	HandleCreateTypelessObjectSuccessfully(t, content)
 
-	res := Create(fake.ServiceClient(), "testContainer", "testObject", &CreateOpts{Content: strings.NewReader(content)})
+	res := objects.Create(fake.ServiceClient(), "testContainer", "testObject", &objects.CreateOpts{Content: strings.NewReader(content)})
 	th.AssertNoErr(t, res.Err)
 }
 
@@ -129,8 +130,8 @@
 	defer th.TeardownHTTP()
 	HandleCopyObjectSuccessfully(t)
 
-	options := &CopyOpts{Destination: "/newTestContainer/newTestObject"}
-	res := Copy(fake.ServiceClient(), "testContainer", "testObject", options)
+	options := &objects.CopyOpts{Destination: "/newTestContainer/newTestObject"}
+	res := objects.Copy(fake.ServiceClient(), "testContainer", "testObject", options)
 	th.AssertNoErr(t, res.Err)
 }
 
@@ -139,7 +140,7 @@
 	defer th.TeardownHTTP()
 	HandleDeleteObjectSuccessfully(t)
 
-	res := Delete(fake.ServiceClient(), "testContainer", "testObject", nil)
+	res := objects.Delete(fake.ServiceClient(), "testContainer", "testObject", nil)
 	th.AssertNoErr(t, res.Err)
 }
 
@@ -148,8 +149,8 @@
 	defer th.TeardownHTTP()
 	HandleUpdateObjectSuccessfully(t)
 
-	options := &UpdateOpts{Metadata: map[string]string{"Gophercloud-Test": "objects"}}
-	res := Update(fake.ServiceClient(), "testContainer", "testObject", options)
+	options := &objects.UpdateOpts{Metadata: map[string]string{"Gophercloud-Test": "objects"}}
+	res := objects.Update(fake.ServiceClient(), "testContainer", "testObject", options)
 	th.AssertNoErr(t, res.Err)
 }
 
@@ -159,7 +160,7 @@
 	HandleGetObjectSuccessfully(t)
 
 	expected := map[string]string{"Gophercloud-Test": "objects"}
-	actual, err := Get(fake.ServiceClient(), "testContainer", "testObject", nil).ExtractMetadata()
+	actual, err := objects.Get(fake.ServiceClient(), "testContainer", "testObject", nil).ExtractMetadata()
 	th.AssertNoErr(t, err)
 	th.CheckDeepEquals(t, expected, actual)
 }
diff --git a/openstack/orchestration/v1/apiversions/testing/doc.go b/openstack/orchestration/v1/apiversions/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/orchestration/v1/apiversions/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/orchestration/v1/apiversions/requests_test.go b/openstack/orchestration/v1/apiversions/testing/requests_test.go
similarity index 77%
rename from openstack/orchestration/v1/apiversions/requests_test.go
rename to openstack/orchestration/v1/apiversions/testing/requests_test.go
index 477b804..ac59b6c 100644
--- a/openstack/orchestration/v1/apiversions/requests_test.go
+++ b/openstack/orchestration/v1/apiversions/testing/requests_test.go
@@ -1,4 +1,4 @@
-package apiversions
+package testing
 
 import (
 	"fmt"
@@ -6,6 +6,7 @@
 	"testing"
 
 	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/openstack/orchestration/v1/apiversions"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
@@ -41,16 +42,16 @@
 
 	count := 0
 
-	ListVersions(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+	apiversions.ListVersions(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractAPIVersions(page)
+		actual, err := apiversions.ExtractAPIVersions(page)
 		if err != nil {
 			t.Errorf("Failed to extract API versions: %v", err)
 			return false, err
 		}
 
-		expected := []APIVersion{
-			APIVersion{
+		expected := []apiversions.APIVersion{
+			{
 				Status: "CURRENT",
 				ID:     "v1.0",
 				Links: []gophercloud.Link{
@@ -80,8 +81,8 @@
 		w.WriteHeader(http.StatusOK)
 	})
 
-	ListVersions(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
-		if _, err := ExtractAPIVersions(page); err == nil {
+	apiversions.ListVersions(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+		if _, err := apiversions.ExtractAPIVersions(page); err == nil {
 			t.Fatalf("Expected error, got nil")
 		}
 		return true, nil
diff --git a/openstack/orchestration/v1/buildinfo/testing/doc.go b/openstack/orchestration/v1/buildinfo/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/orchestration/v1/buildinfo/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/orchestration/v1/buildinfo/fixtures.go b/openstack/orchestration/v1/buildinfo/testing/fixtures.go
similarity index 83%
rename from openstack/orchestration/v1/buildinfo/fixtures.go
rename to openstack/orchestration/v1/buildinfo/testing/fixtures.go
index 87bc3ec..c240d5f 100644
--- a/openstack/orchestration/v1/buildinfo/fixtures.go
+++ b/openstack/orchestration/v1/buildinfo/testing/fixtures.go
@@ -1,22 +1,21 @@
-// +build fixtures
-
-package buildinfo
+package testing
 
 import (
 	"fmt"
 	"net/http"
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/orchestration/v1/buildinfo"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
 )
 
 // GetExpected represents the expected object from a Get request.
-var GetExpected = &BuildInfo{
-	API: Revision{
+var GetExpected = &buildinfo.BuildInfo{
+	API: buildinfo.Revision{
 		Revision: "2.4.5",
 	},
-	Engine: Revision{
+	Engine: buildinfo.Revision{
 		Revision: "1.2.1",
 	},
 }
diff --git a/openstack/orchestration/v1/buildinfo/requests_test.go b/openstack/orchestration/v1/buildinfo/testing/requests_test.go
similarity index 69%
rename from openstack/orchestration/v1/buildinfo/requests_test.go
rename to openstack/orchestration/v1/buildinfo/testing/requests_test.go
index 18d15b3..bd2e164 100644
--- a/openstack/orchestration/v1/buildinfo/requests_test.go
+++ b/openstack/orchestration/v1/buildinfo/testing/requests_test.go
@@ -1,8 +1,9 @@
-package buildinfo
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/orchestration/v1/buildinfo"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
 )
@@ -12,7 +13,7 @@
 	defer th.TeardownHTTP()
 	HandleGetSuccessfully(t, GetOutput)
 
-	actual, err := Get(fake.ServiceClient()).Extract()
+	actual, err := buildinfo.Get(fake.ServiceClient()).Extract()
 	th.AssertNoErr(t, err)
 
 	expected := GetExpected
diff --git a/openstack/orchestration/v1/stackevents/testing/doc.go b/openstack/orchestration/v1/stackevents/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/orchestration/v1/stackevents/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/orchestration/v1/stackevents/fixtures.go b/openstack/orchestration/v1/stackevents/testing/fixtures.go
similarity index 96%
rename from openstack/orchestration/v1/stackevents/fixtures.go
rename to openstack/orchestration/v1/stackevents/testing/fixtures.go
index e4af1bb..a7af025 100644
--- a/openstack/orchestration/v1/stackevents/fixtures.go
+++ b/openstack/orchestration/v1/stackevents/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package stackevents
+package testing
 
 import (
 	"fmt"
@@ -9,25 +7,26 @@
 	"time"
 
 	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/openstack/orchestration/v1/stackevents"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
 )
 
 // FindExpected represents the expected object from a Find request.
-var FindExpected = []Event{
-	Event{
+var FindExpected = []stackevents.Event{
+	{
 		ResourceName: "hello_world",
 		Time:         gophercloud.JSONRFC3339NoZ(time.Date(2015, 2, 5, 21, 33, 11, 0, time.UTC)),
 		Links: []gophercloud.Link{
-			gophercloud.Link{
+			{
 				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b/resources/hello_world/events/06feb26f-9298-4a9b-8749-9d770e5d577a",
 				Rel:  "self",
 			},
-			gophercloud.Link{
+			{
 				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b/resources/hello_world",
 				Rel:  "resource",
 			},
-			gophercloud.Link{
+			{
 				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b",
 				Rel:  "stack",
 			},
@@ -38,19 +37,19 @@
 		PhysicalResourceID:   "",
 		ID:                   "06feb26f-9298-4a9b-8749-9d770e5d577a",
 	},
-	Event{
+	{
 		ResourceName: "hello_world",
 		Time:         gophercloud.JSONRFC3339NoZ(time.Date(2015, 2, 5, 21, 33, 27, 0, time.UTC)),
 		Links: []gophercloud.Link{
-			gophercloud.Link{
+			{
 				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b/resources/hello_world/events/93940999-7d40-44ae-8de4-19624e7b8d18",
 				Rel:  "self",
 			},
-			gophercloud.Link{
+			{
 				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b/resources/hello_world",
 				Rel:  "resource",
 			},
-			gophercloud.Link{
+			{
 				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b",
 				Rel:  "stack",
 			},
@@ -131,20 +130,20 @@
 }
 
 // ListExpected represents the expected object from a List request.
-var ListExpected = []Event{
-	Event{
+var ListExpected = []stackevents.Event{
+	{
 		ResourceName: "hello_world",
 		Time:         gophercloud.JSONRFC3339NoZ(time.Date(2015, 2, 5, 21, 33, 11, 0, time.UTC)),
 		Links: []gophercloud.Link{
-			gophercloud.Link{
+			{
 				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b/resources/hello_world/events/06feb26f-9298-4a9b-8749-9d770e5d577a",
 				Rel:  "self",
 			},
-			gophercloud.Link{
+			{
 				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b/resources/hello_world",
 				Rel:  "resource",
 			},
-			gophercloud.Link{
+			{
 				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b",
 				Rel:  "stack",
 			},
@@ -155,19 +154,19 @@
 		PhysicalResourceID:   "",
 		ID:                   "06feb26f-9298-4a9b-8749-9d770e5d577a",
 	},
-	Event{
+	{
 		ResourceName: "hello_world",
 		Time:         gophercloud.JSONRFC3339NoZ(time.Date(2015, 2, 5, 21, 33, 27, 0, time.UTC)),
 		Links: []gophercloud.Link{
-			gophercloud.Link{
+			{
 				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b/resources/hello_world/events/93940999-7d40-44ae-8de4-19624e7b8d18",
 				Rel:  "self",
 			},
-			gophercloud.Link{
+			{
 				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b/resources/hello_world",
 				Rel:  "resource",
 			},
-			gophercloud.Link{
+			{
 				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b",
 				Rel:  "stack",
 			},
@@ -256,20 +255,20 @@
 }
 
 // ListResourceEventsExpected represents the expected object from a ListResourceEvents request.
-var ListResourceEventsExpected = []Event{
-	Event{
+var ListResourceEventsExpected = []stackevents.Event{
+	{
 		ResourceName: "hello_world",
 		Time:         gophercloud.JSONRFC3339NoZ(time.Date(2015, 2, 5, 21, 33, 11, 0, time.UTC)),
 		Links: []gophercloud.Link{
-			gophercloud.Link{
+			{
 				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b/resources/hello_world/events/06feb26f-9298-4a9b-8749-9d770e5d577a",
 				Rel:  "self",
 			},
-			gophercloud.Link{
+			{
 				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b/resources/hello_world",
 				Rel:  "resource",
 			},
-			gophercloud.Link{
+			{
 				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b",
 				Rel:  "stack",
 			},
@@ -280,19 +279,19 @@
 		PhysicalResourceID:   "",
 		ID:                   "06feb26f-9298-4a9b-8749-9d770e5d577a",
 	},
-	Event{
+	{
 		ResourceName: "hello_world",
 		Time:         gophercloud.JSONRFC3339NoZ(time.Date(2015, 2, 5, 21, 33, 27, 0, time.UTC)),
 		Links: []gophercloud.Link{
-			gophercloud.Link{
+			{
 				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b/resources/hello_world/events/93940999-7d40-44ae-8de4-19624e7b8d18",
 				Rel:  "self",
 			},
-			gophercloud.Link{
+			{
 				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b/resources/hello_world",
 				Rel:  "resource",
 			},
-			gophercloud.Link{
+			{
 				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b",
 				Rel:  "stack",
 			},
@@ -381,19 +380,19 @@
 }
 
 // GetExpected represents the expected object from a Get request.
-var GetExpected = &Event{
+var GetExpected = &stackevents.Event{
 	ResourceName: "hello_world",
 	Time:         gophercloud.JSONRFC3339NoZ(time.Date(2015, 2, 5, 21, 33, 27, 0, time.UTC)),
 	Links: []gophercloud.Link{
-		gophercloud.Link{
+		{
 			Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b/resources/hello_world/events/93940999-7d40-44ae-8de4-19624e7b8d18",
 			Rel:  "self",
 		},
-		gophercloud.Link{
+		{
 			Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b/resources/hello_world",
 			Rel:  "resource",
 		},
-		gophercloud.Link{
+		{
 			Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b",
 			Rel:  "stack",
 		},
diff --git a/openstack/orchestration/v1/stackevents/requests_test.go b/openstack/orchestration/v1/stackevents/testing/requests_test.go
similarity index 60%
rename from openstack/orchestration/v1/stackevents/requests_test.go
rename to openstack/orchestration/v1/stackevents/testing/requests_test.go
index cead1f3..0ad3fc3 100644
--- a/openstack/orchestration/v1/stackevents/requests_test.go
+++ b/openstack/orchestration/v1/stackevents/testing/requests_test.go
@@ -1,8 +1,9 @@
-package stackevents
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/orchestration/v1/stackevents"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
@@ -13,7 +14,7 @@
 	defer th.TeardownHTTP()
 	HandleFindSuccessfully(t, FindOutput)
 
-	actual, err := Find(fake.ServiceClient(), "postman_stack").Extract()
+	actual, err := stackevents.Find(fake.ServiceClient(), "postman_stack").Extract()
 	th.AssertNoErr(t, err)
 
 	expected := FindExpected
@@ -26,9 +27,9 @@
 	HandleListSuccessfully(t, ListOutput)
 
 	count := 0
-	err := List(fake.ServiceClient(), "hello_world", "49181cd6-169a-4130-9455-31185bbfc5bf", nil).EachPage(func(page pagination.Page) (bool, error) {
+	err := stackevents.List(fake.ServiceClient(), "hello_world", "49181cd6-169a-4130-9455-31185bbfc5bf", nil).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractEvents(page)
+		actual, err := stackevents.ExtractEvents(page)
 		th.AssertNoErr(t, err)
 
 		th.CheckDeepEquals(t, ListExpected, actual)
@@ -45,9 +46,9 @@
 	HandleListResourceEventsSuccessfully(t, ListResourceEventsOutput)
 
 	count := 0
-	err := ListResourceEvents(fake.ServiceClient(), "hello_world", "49181cd6-169a-4130-9455-31185bbfc5bf", "my_resource", nil).EachPage(func(page pagination.Page) (bool, error) {
+	err := stackevents.ListResourceEvents(fake.ServiceClient(), "hello_world", "49181cd6-169a-4130-9455-31185bbfc5bf", "my_resource", nil).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractEvents(page)
+		actual, err := stackevents.ExtractEvents(page)
 		th.AssertNoErr(t, err)
 
 		th.CheckDeepEquals(t, ListResourceEventsExpected, actual)
@@ -63,7 +64,7 @@
 	defer th.TeardownHTTP()
 	HandleGetSuccessfully(t, GetOutput)
 
-	actual, err := Get(fake.ServiceClient(), "hello_world", "49181cd6-169a-4130-9455-31185bbfc5bf", "my_resource", "93940999-7d40-44ae-8de4-19624e7b8d18").Extract()
+	actual, err := stackevents.Get(fake.ServiceClient(), "hello_world", "49181cd6-169a-4130-9455-31185bbfc5bf", "my_resource", "93940999-7d40-44ae-8de4-19624e7b8d18").Extract()
 	th.AssertNoErr(t, err)
 
 	expected := GetExpected
diff --git a/openstack/orchestration/v1/stackresources/testing/doc.go b/openstack/orchestration/v1/stackresources/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/orchestration/v1/stackresources/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/orchestration/v1/stackresources/fixtures.go b/openstack/orchestration/v1/stackresources/testing/fixtures.go
similarity index 97%
rename from openstack/orchestration/v1/stackresources/fixtures.go
rename to openstack/orchestration/v1/stackresources/testing/fixtures.go
index beec637..adcd4c6 100644
--- a/openstack/orchestration/v1/stackresources/fixtures.go
+++ b/openstack/orchestration/v1/stackresources/testing/fixtures.go
@@ -1,6 +1,4 @@
-// +build fixtures
-
-package stackresources
+package testing
 
 import (
 	"fmt"
@@ -9,20 +7,21 @@
 	"time"
 
 	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/openstack/orchestration/v1/stackresources"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
 )
 
 // FindExpected represents the expected object from a Find request.
-var FindExpected = []Resource{
-	Resource{
+var FindExpected = []stackresources.Resource{
+	{
 		Name: "hello_world",
 		Links: []gophercloud.Link{
-			gophercloud.Link{
+			{
 				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b/resources/hello_world",
 				Rel:  "self",
 			},
-			gophercloud.Link{
+			{
 				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b",
 				Rel:  "stack",
 			},
@@ -85,15 +84,15 @@
 }
 
 // ListExpected represents the expected object from a List request.
-var ListExpected = []Resource{
-	Resource{
+var ListExpected = []stackresources.Resource{
+	{
 		Name: "hello_world",
 		Links: []gophercloud.Link{
-			gophercloud.Link{
+			{
 				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b/resources/hello_world",
 				Rel:  "self",
 			},
-			gophercloud.Link{
+			{
 				Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/5f57cff9-93fc-424e-9f78-df0515e7f48b",
 				Rel:  "stack",
 			},
@@ -163,14 +162,14 @@
 }
 
 // GetExpected represents the expected object from a Get request.
-var GetExpected = &Resource{
+var GetExpected = &stackresources.Resource{
 	Name: "wordpress_instance",
 	Links: []gophercloud.Link{
-		gophercloud.Link{
+		{
 			Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/teststack/0b1771bd-9336-4f2b-ae86-a80f971faf1e/resources/wordpress_instance",
 			Rel:  "self",
 		},
-		gophercloud.Link{
+		{
 			Href: "http://166.78.160.107:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/teststack/0b1771bd-9336-4f2b-ae86-a80f971faf1e",
 			Rel:  "stack",
 		},
@@ -257,7 +256,7 @@
 }
 
 // ListTypesExpected represents the expected object from a ListTypes request.
-var ListTypesExpected = ResourceTypes{
+var ListTypesExpected = stackresources.ResourceTypes{
 	"OS::Nova::Server",
 	"OS::Heat::RandomString",
 	"OS::Swift::Container",
@@ -269,7 +268,7 @@
 }
 
 // same as above, but sorted
-var SortedListTypesExpected = ResourceTypes{
+var SortedListTypesExpected = stackresources.ResourceTypes{
 	"OS::Cinder::VolumeAttachment",
 	"OS::Heat::RandomString",
 	"OS::Nova::FloatingIP",
@@ -310,7 +309,7 @@
 }
 
 // GetSchemaExpected represents the expected object from a Schema request.
-var GetSchemaExpected = &TypeSchema{
+var GetSchemaExpected = &stackresources.TypeSchema{
 	Attributes: map[string]interface{}{
 		"an_attribute": map[string]interface{}{
 			"description": "An attribute description .",
diff --git a/openstack/orchestration/v1/stackresources/requests_test.go b/openstack/orchestration/v1/stackresources/testing/requests_test.go
similarity index 66%
rename from openstack/orchestration/v1/stackresources/requests_test.go
rename to openstack/orchestration/v1/stackresources/testing/requests_test.go
index 7932873..c714047 100644
--- a/openstack/orchestration/v1/stackresources/requests_test.go
+++ b/openstack/orchestration/v1/stackresources/testing/requests_test.go
@@ -1,9 +1,10 @@
-package stackresources
+package testing
 
 import (
 	"sort"
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/orchestration/v1/stackresources"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
@@ -14,7 +15,7 @@
 	defer th.TeardownHTTP()
 	HandleFindSuccessfully(t, FindOutput)
 
-	actual, err := Find(fake.ServiceClient(), "hello_world").Extract()
+	actual, err := stackresources.Find(fake.ServiceClient(), "hello_world").Extract()
 	th.AssertNoErr(t, err)
 
 	expected := FindExpected
@@ -27,9 +28,9 @@
 	HandleListSuccessfully(t, ListOutput)
 
 	count := 0
-	err := List(fake.ServiceClient(), "hello_world", "49181cd6-169a-4130-9455-31185bbfc5bf", nil).EachPage(func(page pagination.Page) (bool, error) {
+	err := stackresources.List(fake.ServiceClient(), "hello_world", "49181cd6-169a-4130-9455-31185bbfc5bf", nil).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractResources(page)
+		actual, err := stackresources.ExtractResources(page)
 		th.AssertNoErr(t, err)
 
 		th.CheckDeepEquals(t, ListExpected, actual)
@@ -45,7 +46,7 @@
 	defer th.TeardownHTTP()
 	HandleGetSuccessfully(t, GetOutput)
 
-	actual, err := Get(fake.ServiceClient(), "teststack", "0b1771bd-9336-4f2b-ae86-a80f971faf1e", "wordpress_instance").Extract()
+	actual, err := stackresources.Get(fake.ServiceClient(), "teststack", "0b1771bd-9336-4f2b-ae86-a80f971faf1e", "wordpress_instance").Extract()
 	th.AssertNoErr(t, err)
 
 	expected := GetExpected
@@ -57,7 +58,7 @@
 	defer th.TeardownHTTP()
 	HandleMetadataSuccessfully(t, MetadataOutput)
 
-	actual, err := Metadata(fake.ServiceClient(), "teststack", "0b1771bd-9336-4f2b-ae86-a80f971faf1e", "wordpress_instance").Extract()
+	actual, err := stackresources.Metadata(fake.ServiceClient(), "teststack", "0b1771bd-9336-4f2b-ae86-a80f971faf1e", "wordpress_instance").Extract()
 	th.AssertNoErr(t, err)
 
 	expected := MetadataExpected
@@ -70,9 +71,9 @@
 	HandleListTypesSuccessfully(t, ListTypesOutput)
 
 	count := 0
-	err := ListTypes(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
+	err := stackresources.ListTypes(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractResourceTypes(page)
+		actual, err := stackresources.ExtractResourceTypes(page)
 		th.AssertNoErr(t, err)
 
 		th.CheckDeepEquals(t, ListTypesExpected, actual)
@@ -91,7 +92,7 @@
 	defer th.TeardownHTTP()
 	HandleGetSchemaSuccessfully(t, GetSchemaOutput)
 
-	actual, err := Schema(fake.ServiceClient(), "OS::Heat::AResourceName").Extract()
+	actual, err := stackresources.Schema(fake.ServiceClient(), "OS::Heat::AResourceName").Extract()
 	th.AssertNoErr(t, err)
 
 	expected := GetSchemaExpected
@@ -103,7 +104,7 @@
 	defer th.TeardownHTTP()
 	HandleGetTemplateSuccessfully(t, GetTemplateOutput)
 
-	actual, err := Template(fake.ServiceClient(), "OS::Heat::AResourceName").Extract()
+	actual, err := stackresources.Template(fake.ServiceClient(), "OS::Heat::AResourceName").Extract()
 	th.AssertNoErr(t, err)
 
 	expected := GetTemplateExpected
diff --git a/openstack/orchestration/v1/stacks/environment_test.go b/openstack/orchestration/v1/stacks/environment_test.go
index 5f8a430..a7e3aae 100644
--- a/openstack/orchestration/v1/stacks/environment_test.go
+++ b/openstack/orchestration/v1/stacks/environment_test.go
@@ -11,6 +11,7 @@
 )
 
 func TestEnvironmentValidation(t *testing.T) {
+
 	environmentJSON := new(Environment)
 	environmentJSON.Bin = []byte(ValidJSONEnvironment)
 	err := environmentJSON.Validate()
diff --git a/openstack/orchestration/v1/stacks/fixtures.go b/openstack/orchestration/v1/stacks/fixtures.go
index 4126cf6..d6fd075 100644
--- a/openstack/orchestration/v1/stacks/fixtures.go
+++ b/openstack/orchestration/v1/stacks/fixtures.go
@@ -1,412 +1,5 @@
-// +build fixtures
-
 package stacks
 
-import (
-	"fmt"
-	"net/http"
-	"testing"
-	"time"
-
-	"github.com/gophercloud/gophercloud"
-	th "github.com/gophercloud/gophercloud/testhelper"
-	fake "github.com/gophercloud/gophercloud/testhelper/client"
-)
-
-// CreateExpected represents the expected object from a Create request.
-var CreateExpected = &CreatedStack{
-	ID: "16ef0584-4458-41eb-87c8-0dc8d5f66c87",
-	Links: []gophercloud.Link{
-		gophercloud.Link{
-			Href: "http://168.28.170.117:8004/v1/98606384f58drad0bhdb7d02779549ac/stacks/stackcreated/16ef0584-4458-41eb-87c8-0dc8d5f66c87",
-			Rel:  "self",
-		},
-	},
-}
-
-// CreateOutput represents the response body from a Create request.
-const CreateOutput = `
-{
-  "stack": {
-    "id": "16ef0584-4458-41eb-87c8-0dc8d5f66c87",
-    "links": [
-    {
-      "href": "http://168.28.170.117:8004/v1/98606384f58drad0bhdb7d02779549ac/stacks/stackcreated/16ef0584-4458-41eb-87c8-0dc8d5f66c87",
-      "rel": "self"
-    }
-    ]
-  }
-}`
-
-// HandleCreateSuccessfully creates an HTTP handler at `/stacks` on the test handler mux
-// that responds with a `Create` response.
-func HandleCreateSuccessfully(t *testing.T, output string) {
-	th.Mux.HandleFunc("/stacks", 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")
-		w.WriteHeader(http.StatusCreated)
-		fmt.Fprintf(w, output)
-	})
-}
-
-// ListExpected represents the expected object from a List request.
-var ListExpected = []ListedStack{
-	ListedStack{
-		Description: "Simple template to test heat commands",
-		Links: []gophercloud.Link{
-			gophercloud.Link{
-				Href: "http://166.76.160.117:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/16ef0584-4458-41eb-87c8-0dc8d5f66c87",
-				Rel:  "self",
-			},
-		},
-		StatusReason: "Stack CREATE completed successfully",
-		Name:         "postman_stack",
-		CreationTime: gophercloud.JSONRFC3339NoZ(time.Date(2015, 2, 3, 20, 7, 39, 0, time.UTC)),
-		Status:       "CREATE_COMPLETE",
-		ID:           "16ef0584-4458-41eb-87c8-0dc8d5f66c87",
-		Tags:         []string{"rackspace", "atx"},
-	},
-	ListedStack{
-		Description: "Simple template to test heat commands",
-		Links: []gophercloud.Link{
-			gophercloud.Link{
-				Href: "http://166.76.160.117:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/gophercloud-test-stack-2/db6977b2-27aa-4775-9ae7-6213212d4ada",
-				Rel:  "self",
-			},
-		},
-		StatusReason: "Stack successfully updated",
-		Name:         "gophercloud-test-stack-2",
-		CreationTime: gophercloud.JSONRFC3339NoZ(time.Date(2014, 12, 11, 17, 39, 16, 0, time.UTC)),
-		UpdatedTime:  gophercloud.JSONRFC3339NoZ(time.Date(2014, 12, 11, 17, 40, 37, 0, time.UTC)),
-		Status:       "UPDATE_COMPLETE",
-		ID:           "db6977b2-27aa-4775-9ae7-6213212d4ada",
-		Tags:         []string{"sfo", "satx"},
-	},
-}
-
-// FullListOutput represents the response body from a List request without a marker.
-const FullListOutput = `
-{
-  "stacks": [
-  {
-    "description": "Simple template to test heat commands",
-    "links": [
-    {
-      "href": "http://166.76.160.117:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/16ef0584-4458-41eb-87c8-0dc8d5f66c87",
-      "rel": "self"
-    }
-    ],
-    "stack_status_reason": "Stack CREATE completed successfully",
-    "stack_name": "postman_stack",
-    "creation_time": "2015-02-03T20:07:39",
-    "updated_time": null,
-    "stack_status": "CREATE_COMPLETE",
-    "id": "16ef0584-4458-41eb-87c8-0dc8d5f66c87",
-	"tags": ["rackspace", "atx"]
-  },
-  {
-    "description": "Simple template to test heat commands",
-    "links": [
-    {
-      "href": "http://166.76.160.117:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/gophercloud-test-stack-2/db6977b2-27aa-4775-9ae7-6213212d4ada",
-      "rel": "self"
-    }
-    ],
-    "stack_status_reason": "Stack successfully updated",
-    "stack_name": "gophercloud-test-stack-2",
-    "creation_time": "2014-12-11T17:39:16",
-    "updated_time": "2014-12-11T17:40:37",
-    "stack_status": "UPDATE_COMPLETE",
-    "id": "db6977b2-27aa-4775-9ae7-6213212d4ada",
-	"tags": ["sfo", "satx"]
-  }
-  ]
-}
-`
-
-// HandleListSuccessfully creates an HTTP handler at `/stacks` on the test handler mux
-// that responds with a `List` response.
-func HandleListSuccessfully(t *testing.T, output string) {
-	th.Mux.HandleFunc("/stacks", 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")
-		r.ParseForm()
-		marker := r.Form.Get("marker")
-		switch marker {
-		case "":
-			fmt.Fprintf(w, output)
-		case "db6977b2-27aa-4775-9ae7-6213212d4ada":
-			fmt.Fprintf(w, `[]`)
-		default:
-			t.Fatalf("Unexpected marker: [%s]", marker)
-		}
-	})
-}
-
-// GetExpected represents the expected object from a Get request.
-var GetExpected = &RetrievedStack{
-	DisableRollback: true,
-	Description:     "Simple template to test heat commands",
-	Parameters: map[string]string{
-		"flavor":         "m1.tiny",
-		"OS::stack_name": "postman_stack",
-		"OS::stack_id":   "16ef0584-4458-41eb-87c8-0dc8d5f66c87",
-	},
-	StatusReason: "Stack CREATE completed successfully",
-	Name:         "postman_stack",
-	Outputs:      []map[string]interface{}{},
-	CreationTime: gophercloud.JSONRFC3339NoZ(time.Date(2015, 2, 3, 20, 7, 39, 0, time.UTC)),
-	Links: []gophercloud.Link{
-		gophercloud.Link{
-			Href: "http://166.76.160.117:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/16ef0584-4458-41eb-87c8-0dc8d5f66c87",
-			Rel:  "self",
-		},
-	},
-	Capabilities:        []interface{}{},
-	NotificationTopics:  []interface{}{},
-	Status:              "CREATE_COMPLETE",
-	ID:                  "16ef0584-4458-41eb-87c8-0dc8d5f66c87",
-	TemplateDescription: "Simple template to test heat commands",
-	Tags:                []string{"rackspace", "atx"},
-}
-
-// GetOutput represents the response body from a Get request.
-const GetOutput = `
-{
-  "stack": {
-    "disable_rollback": true,
-    "description": "Simple template to test heat commands",
-    "parameters": {
-      "flavor": "m1.tiny",
-      "OS::stack_name": "postman_stack",
-      "OS::stack_id": "16ef0584-4458-41eb-87c8-0dc8d5f66c87"
-    },
-    "stack_status_reason": "Stack CREATE completed successfully",
-    "stack_name": "postman_stack",
-    "outputs": [],
-    "creation_time": "2015-02-03T20:07:39",
-    "links": [
-    {
-      "href": "http://166.76.160.117:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/16ef0584-4458-41eb-87c8-0dc8d5f66c87",
-      "rel": "self"
-    }
-    ],
-    "capabilities": [],
-    "notification_topics": [],
-    "timeout_mins": null,
-    "stack_status": "CREATE_COMPLETE",
-    "updated_time": null,
-    "id": "16ef0584-4458-41eb-87c8-0dc8d5f66c87",
-    "template_description": "Simple template to test heat commands",
-	"tags": ["rackspace", "atx"]
-  }
-}
-`
-
-// HandleGetSuccessfully creates an HTTP handler at `/stacks/postman_stack/16ef0584-4458-41eb-87c8-0dc8d5f66c87`
-// on the test handler mux that responds with a `Get` response.
-func HandleGetSuccessfully(t *testing.T, output string) {
-	th.Mux.HandleFunc("/stacks/postman_stack/16ef0584-4458-41eb-87c8-0dc8d5f66c87", 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, output)
-	})
-}
-
-// HandleUpdateSuccessfully creates an HTTP handler at `/stacks/postman_stack/16ef0584-4458-41eb-87c8-0dc8d5f66c87`
-// on the test handler mux that responds with an `Update` response.
-func HandleUpdateSuccessfully(t *testing.T) {
-	th.Mux.HandleFunc("/stacks/gophercloud-test-stack-2/db6977b2-27aa-4775-9ae7-6213212d4ada", 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().Set("Content-Type", "application/json")
-		w.WriteHeader(http.StatusAccepted)
-	})
-}
-
-// HandleDeleteSuccessfully creates an HTTP handler at `/stacks/postman_stack/16ef0584-4458-41eb-87c8-0dc8d5f66c87`
-// on the test handler mux that responds with a `Delete` response.
-func HandleDeleteSuccessfully(t *testing.T) {
-	th.Mux.HandleFunc("/stacks/gophercloud-test-stack-2/db6977b2-27aa-4775-9ae7-6213212d4ada", 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)
-	})
-}
-
-// GetExpected represents the expected object from a Get request.
-var PreviewExpected = &PreviewedStack{
-	DisableRollback: true,
-	Description:     "Simple template to test heat commands",
-	Parameters: map[string]string{
-		"flavor":         "m1.tiny",
-		"OS::stack_name": "postman_stack",
-		"OS::stack_id":   "16ef0584-4458-41eb-87c8-0dc8d5f66c87",
-	},
-	Name:         "postman_stack",
-	CreationTime: gophercloud.JSONRFC3339NoZ(time.Date(2015, 2, 3, 20, 7, 39, 0, time.UTC)),
-	Links: []gophercloud.Link{
-		gophercloud.Link{
-			Href: "http://166.76.160.117:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/16ef0584-4458-41eb-87c8-0dc8d5f66c87",
-			Rel:  "self",
-		},
-	},
-	Capabilities:        []interface{}{},
-	NotificationTopics:  []interface{}{},
-	ID:                  "16ef0584-4458-41eb-87c8-0dc8d5f66c87",
-	TemplateDescription: "Simple template to test heat commands",
-}
-
-// HandlePreviewSuccessfully creates an HTTP handler at `/stacks/preview`
-// on the test handler mux that responds with a `Preview` response.
-func HandlePreviewSuccessfully(t *testing.T, output string) {
-	th.Mux.HandleFunc("/stacks/preview", 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")
-
-		w.Header().Set("Content-Type", "application/json")
-		w.WriteHeader(http.StatusOK)
-		fmt.Fprintf(w, output)
-	})
-}
-
-// AbandonExpected represents the expected object from an Abandon request.
-var AbandonExpected = &AbandonedStack{
-	Status: "COMPLETE",
-	Name:   "postman_stack",
-	Template: map[string]interface{}{
-		"heat_template_version": "2013-05-23",
-		"description":           "Simple template to test heat commands",
-		"parameters": map[string]interface{}{
-			"flavor": map[string]interface{}{
-				"default": "m1.tiny",
-				"type":    "string",
-			},
-		},
-		"resources": map[string]interface{}{
-			"hello_world": map[string]interface{}{
-				"type": "OS::Nova::Server",
-				"properties": map[string]interface{}{
-					"key_name": "heat_key",
-					"flavor": map[string]interface{}{
-						"get_param": "flavor",
-					},
-					"image":     "ad091b52-742f-469e-8f3c-fd81cadf0743",
-					"user_data": "#!/bin/bash -xv\necho \"hello world\" > /root/hello-world.txt\n",
-				},
-			},
-		},
-	},
-	Action: "CREATE",
-	ID:     "16ef0584-4458-41eb-87c8-0dc8d5f66c87",
-	Resources: map[string]interface{}{
-		"hello_world": map[string]interface{}{
-			"status":      "COMPLETE",
-			"name":        "hello_world",
-			"resource_id": "8a310d36-46fc-436f-8be4-37a696b8ac63",
-			"action":      "CREATE",
-			"type":        "OS::Nova::Server",
-		},
-	},
-	Files: map[string]string{
-		"file:///Users/prat8228/go/src/github.com/rackspace/rack/my_nova.yaml": "heat_template_version: 2014-10-16\nparameters:\n  flavor:\n    type: string\n    description: Flavor for the server to be created\n    default: 4353\n    hidden: true\nresources:\n  test_server:\n    type: \"OS::Nova::Server\"\n    properties:\n      name: test-server\n      flavor: 2 GB General Purpose v1\n image: Debian 7 (Wheezy) (PVHVM)\n",
-	},
-	StackUserProjectID: "897686",
-	ProjectID:          "897686",
-	Environment: map[string]interface{}{
-		"encrypted_param_names": make([]map[string]interface{}, 0),
-		"parameter_defaults":    make(map[string]interface{}),
-		"parameters":            make(map[string]interface{}),
-		"resource_registry": map[string]interface{}{
-			"file:///Users/prat8228/go/src/github.com/rackspace/rack/my_nova.yaml": "file:///Users/prat8228/go/src/github.com/rackspace/rack/my_nova.yaml",
-			"resources": make(map[string]interface{}),
-		},
-	},
-}
-
-// AbandonOutput represents the response body from an Abandon request.
-const AbandonOutput = `
-{
-  "status": "COMPLETE",
-  "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\" > /root/hello-world.txt\n"
-        }
-      }
-    }
-  },
-  "action": "CREATE",
-  "id": "16ef0584-4458-41eb-87c8-0dc8d5f66c87",
-  "resources": {
-    "hello_world": {
-      "status": "COMPLETE",
-      "name": "hello_world",
-      "resource_id": "8a310d36-46fc-436f-8be4-37a696b8ac63",
-      "action": "CREATE",
-      "type": "OS::Nova::Server"
-    }
-  },
-  "files": {
-    "file:///Users/prat8228/go/src/github.com/rackspace/rack/my_nova.yaml": "heat_template_version: 2014-10-16\nparameters:\n  flavor:\n    type: string\n    description: Flavor for the server to be created\n    default: 4353\n    hidden: true\nresources:\n  test_server:\n    type: \"OS::Nova::Server\"\n    properties:\n      name: test-server\n      flavor: 2 GB General Purpose v1\n image: Debian 7 (Wheezy) (PVHVM)\n"
-},
-  "environment": {
-	"encrypted_param_names": [],
-	"parameter_defaults": {},
-	"parameters": {},
-	"resource_registry": {
-		"file:///Users/prat8228/go/src/github.com/rackspace/rack/my_nova.yaml": "file:///Users/prat8228/go/src/github.com/rackspace/rack/my_nova.yaml",
-		"resources": {}
-	}
-  },
-  "stack_user_project_id": "897686",
-  "project_id": "897686"
-}`
-
-// HandleAbandonSuccessfully creates an HTTP handler at `/stacks/postman_stack/16ef0584-4458-41eb-87c8-0dc8d5f66c87/abandon`
-// on the test handler mux that responds with an `Abandon` response.
-func HandleAbandonSuccessfully(t *testing.T, output string) {
-	th.Mux.HandleFunc("/stacks/postman_stack/16ef0584-4458-41eb-87c8-0dc8d5f66c8/abandon", 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.StatusOK)
-		fmt.Fprintf(w, output)
-	})
-}
-
 // ValidJSONTemplate is a valid OpenStack Heat template in JSON format
 const ValidJSONTemplate = `
 {
@@ -432,29 +25,6 @@
 }
 `
 
-// ValidJSONTemplateParsed is the expected parsed version of ValidJSONTemplate
-var ValidJSONTemplateParsed = map[string]interface{}{
-	"heat_template_version": "2014-10-16",
-	"parameters": map[string]interface{}{
-		"flavor": map[string]interface{}{
-			"default":     4353,
-			"description": "Flavor for the server to be created",
-			"hidden":      true,
-			"type":        "string",
-		},
-	},
-	"resources": map[string]interface{}{
-		"test_server": map[string]interface{}{
-			"properties": map[string]interface{}{
-				"flavor": "2 GB General Purpose v1",
-				"image":  "Debian 7 (Wheezy) (PVHVM)",
-				"name":   "test-server",
-			},
-			"type": "OS::Nova::Server",
-		},
-	},
-}
-
 // ValidYAMLTemplate is a valid OpenStack Heat template in YAML format
 const ValidYAMLTemplate = `
 heat_template_version: 2014-10-16
@@ -493,39 +63,84 @@
 // ValidJSONEnvironment is a valid environment for a stack in JSON format
 const ValidJSONEnvironment = `
 {
-  "parameters": {
-    "user_key": "userkey"
-  },
-  "resource_registry": {
-    "My::WP::Server": "file:///home/shardy/git/heat-templates/hot/F18/WordPress_Native.yaml",
-    "OS::Quantum*": "OS::Neutron*",
-    "AWS::CloudWatch::Alarm": "file:///etc/heat/templates/AWS_CloudWatch_Alarm.yaml",
-    "OS::Metering::Alarm": "OS::Ceilometer::Alarm",
-    "AWS::RDS::DBInstance": "file:///etc/heat/templates/AWS_RDS_DBInstance.yaml",
-    "resources": {
-      "my_db_server": {
-        "OS::DBInstance": "file:///home/mine/all_my_cool_templates/db.yaml"
-      },
-      "my_server": {
-        "OS::DBInstance": "file:///home/mine/all_my_cool_templates/db.yaml",
-        "hooks": "pre-create"
-      },
-      "nested_stack": {
-        "nested_resource": {
-          "hooks": "pre-update"
-        },
-        "another_resource": {
-          "hooks": [
-            "pre-create",
-            "pre-update"
-          ]
-        }
-      }
-    }
-  }
+	"parameters": {
+		"user_key": "userkey"
+	},
+	"resource_registry": {
+		"My::WP::Server": "file:///home/shardy/git/heat-templates/hot/F18/WordPress_Native.yaml",
+		"OS::Quantum*": "OS::Neutron*",
+		"AWS::CloudWatch::Alarm": "file:///etc/heat/templates/AWS_CloudWatch_Alarm.yaml",
+		"OS::Metering::Alarm": "OS::Ceilometer::Alarm",
+		"AWS::RDS::DBInstance": "file:///etc/heat/templates/AWS_RDS_DBInstance.yaml",
+		"resources": {
+			"my_db_server": {
+				"OS::DBInstance": "file:///home/mine/all_my_cool_templates/db.yaml"
+			},
+			"my_server": {
+				"OS::DBInstance": "file:///home/mine/all_my_cool_templates/db.yaml",
+				"hooks": "pre-create"
+			},
+			"nested_stack": {
+				"nested_resource": {
+					"hooks": "pre-update"
+				},
+				"another_resource": {
+					"hooks": [
+						"pre-create",
+						"pre-update"
+					]
+				}
+			}
+		}
+	}
 }
 `
 
+// ValidYAMLEnvironment is a valid environment for a stack in YAML format
+const ValidYAMLEnvironment = `
+parameters:
+  user_key: userkey
+resource_registry:
+  My::WP::Server: file:///home/shardy/git/heat-templates/hot/F18/WordPress_Native.yaml
+  # allow older templates with Quantum in them.
+  "OS::Quantum*": "OS::Neutron*"
+  # Choose your implementation of AWS::CloudWatch::Alarm
+  "AWS::CloudWatch::Alarm": "file:///etc/heat/templates/AWS_CloudWatch_Alarm.yaml"
+  #"AWS::CloudWatch::Alarm": "OS::Heat::CWLiteAlarm"
+  "OS::Metering::Alarm": "OS::Ceilometer::Alarm"
+  "AWS::RDS::DBInstance": "file:///etc/heat/templates/AWS_RDS_DBInstance.yaml"
+  resources:
+    my_db_server:
+      "OS::DBInstance": file:///home/mine/all_my_cool_templates/db.yaml
+    my_server:
+      "OS::DBInstance": file:///home/mine/all_my_cool_templates/db.yaml
+      hooks: pre-create
+    nested_stack:
+      nested_resource:
+        hooks: pre-update
+      another_resource:
+        hooks: [pre-create, pre-update]
+`
+
+// InvalidEnvironment is an invalid environment as it has an extra section called `resources`
+const InvalidEnvironment = `
+parameters:
+	flavor:
+		type: string
+		description: Flavor for the server to be created
+		default: 4353
+		hidden: true
+resources:
+	test_server:
+		type: "OS::Nova::Server"
+		properties:
+			name: test-server
+			flavor: 2 GB General Purpose v1
+			image: Debian 7 (Wheezy) (PVHVM)
+parameter_defaults:
+	KeyName: heat_key
+`
+
 // ValidJSONEnvironmentParsed is the expected parsed version of ValidJSONEnvironment
 var ValidJSONEnvironmentParsed = map[string]interface{}{
 	"parameters": map[string]interface{}{
@@ -560,47 +175,25 @@
 	},
 }
 
-// ValidYAMLEnvironment is a valid environment for a stack in YAML format
-const ValidYAMLEnvironment = `
-parameters:
-  user_key: userkey
-resource_registry:
-  My::WP::Server: file:///home/shardy/git/heat-templates/hot/F18/WordPress_Native.yaml
-  # allow older templates with Quantum in them.
-  "OS::Quantum*": "OS::Neutron*"
-  # Choose your implementation of AWS::CloudWatch::Alarm
-  "AWS::CloudWatch::Alarm": "file:///etc/heat/templates/AWS_CloudWatch_Alarm.yaml"
-  #"AWS::CloudWatch::Alarm": "OS::Heat::CWLiteAlarm"
-  "OS::Metering::Alarm": "OS::Ceilometer::Alarm"
-  "AWS::RDS::DBInstance": "file:///etc/heat/templates/AWS_RDS_DBInstance.yaml"
-  resources:
-    my_db_server:
-      "OS::DBInstance": file:///home/mine/all_my_cool_templates/db.yaml
-    my_server:
-      "OS::DBInstance": file:///home/mine/all_my_cool_templates/db.yaml
-      hooks: pre-create
-    nested_stack:
-      nested_resource:
-        hooks: pre-update
-      another_resource:
-        hooks: [pre-create, pre-update]
-`
-
-// InvalidEnvironment is an invalid environment as it has an extra section called `resources`
-const InvalidEnvironment = `
-parameters:
-  flavor:
-    type: string
-    description: Flavor for the server to be created
-    default: 4353
-    hidden: true
-resources:
-  test_server:
-    type: "OS::Nova::Server"
-    properties:
-      name: test-server
-      flavor: 2 GB General Purpose v1
-      image: Debian 7 (Wheezy) (PVHVM)
-parameter_defaults:
-  KeyName: heat_key
-`
+// ValidJSONTemplateParsed is the expected parsed version of ValidJSONTemplate
+var ValidJSONTemplateParsed = map[string]interface{}{
+	"heat_template_version": "2014-10-16",
+	"parameters": map[string]interface{}{
+		"flavor": map[string]interface{}{
+			"default":     4353,
+			"description": "Flavor for the server to be created",
+			"hidden":      true,
+			"type":        "string",
+		},
+	},
+	"resources": map[string]interface{}{
+		"test_server": map[string]interface{}{
+			"properties": map[string]interface{}{
+				"flavor": "2 GB General Purpose v1",
+				"image":  "Debian 7 (Wheezy) (PVHVM)",
+				"name":   "test-server",
+			},
+			"type": "OS::Nova::Server",
+		},
+	},
+}
diff --git a/openstack/orchestration/v1/stacks/testing/doc.go b/openstack/orchestration/v1/stacks/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/orchestration/v1/stacks/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/orchestration/v1/stacks/testing/fixtures.go b/openstack/orchestration/v1/stacks/testing/fixtures.go
new file mode 100644
index 0000000..2afbed2
--- /dev/null
+++ b/openstack/orchestration/v1/stacks/testing/fixtures.go
@@ -0,0 +1,407 @@
+package testing
+
+import (
+	"fmt"
+	"net/http"
+	"testing"
+	"time"
+
+	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/openstack/orchestration/v1/stacks"
+	th "github.com/gophercloud/gophercloud/testhelper"
+	fake "github.com/gophercloud/gophercloud/testhelper/client"
+)
+
+// CreateExpected represents the expected object from a Create request.
+var CreateExpected = &stacks.CreatedStack{
+	ID: "16ef0584-4458-41eb-87c8-0dc8d5f66c87",
+	Links: []gophercloud.Link{
+		{
+			Href: "http://168.28.170.117:8004/v1/98606384f58drad0bhdb7d02779549ac/stacks/stackcreated/16ef0584-4458-41eb-87c8-0dc8d5f66c87",
+			Rel:  "self",
+		},
+	},
+}
+
+// CreateOutput represents the response body from a Create request.
+const CreateOutput = `
+{
+  "stack": {
+    "id": "16ef0584-4458-41eb-87c8-0dc8d5f66c87",
+    "links": [
+    {
+      "href": "http://168.28.170.117:8004/v1/98606384f58drad0bhdb7d02779549ac/stacks/stackcreated/16ef0584-4458-41eb-87c8-0dc8d5f66c87",
+      "rel": "self"
+    }
+    ]
+  }
+}`
+
+// HandleCreateSuccessfully creates an HTTP handler at `/stacks` on the test handler mux
+// that responds with a `Create` response.
+func HandleCreateSuccessfully(t *testing.T, output string) {
+	th.Mux.HandleFunc("/stacks", 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")
+		w.WriteHeader(http.StatusCreated)
+		fmt.Fprintf(w, output)
+	})
+}
+
+// ListExpected represents the expected object from a List request.
+var ListExpected = []stacks.ListedStack{
+	{
+		Description: "Simple template to test heat commands",
+		Links: []gophercloud.Link{
+			{
+				Href: "http://166.76.160.117:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/16ef0584-4458-41eb-87c8-0dc8d5f66c87",
+				Rel:  "self",
+			},
+		},
+		StatusReason: "Stack CREATE completed successfully",
+		Name:         "postman_stack",
+		CreationTime: gophercloud.JSONRFC3339NoZ(time.Date(2015, 2, 3, 20, 7, 39, 0, time.UTC)),
+		Status:       "CREATE_COMPLETE",
+		ID:           "16ef0584-4458-41eb-87c8-0dc8d5f66c87",
+		Tags:         []string{"rackspace", "atx"},
+	},
+	{
+		Description: "Simple template to test heat commands",
+		Links: []gophercloud.Link{
+			{
+				Href: "http://166.76.160.117:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/gophercloud-test-stack-2/db6977b2-27aa-4775-9ae7-6213212d4ada",
+				Rel:  "self",
+			},
+		},
+		StatusReason: "Stack successfully updated",
+		Name:         "gophercloud-test-stack-2",
+		CreationTime: gophercloud.JSONRFC3339NoZ(time.Date(2014, 12, 11, 17, 39, 16, 0, time.UTC)),
+		UpdatedTime:  gophercloud.JSONRFC3339NoZ(time.Date(2014, 12, 11, 17, 40, 37, 0, time.UTC)),
+		Status:       "UPDATE_COMPLETE",
+		ID:           "db6977b2-27aa-4775-9ae7-6213212d4ada",
+		Tags:         []string{"sfo", "satx"},
+	},
+}
+
+// FullListOutput represents the response body from a List request without a marker.
+const FullListOutput = `
+{
+  "stacks": [
+  {
+    "description": "Simple template to test heat commands",
+    "links": [
+    {
+      "href": "http://166.76.160.117:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/16ef0584-4458-41eb-87c8-0dc8d5f66c87",
+      "rel": "self"
+    }
+    ],
+    "stack_status_reason": "Stack CREATE completed successfully",
+    "stack_name": "postman_stack",
+    "creation_time": "2015-02-03T20:07:39",
+    "updated_time": null,
+    "stack_status": "CREATE_COMPLETE",
+    "id": "16ef0584-4458-41eb-87c8-0dc8d5f66c87",
+	"tags": ["rackspace", "atx"]
+  },
+  {
+    "description": "Simple template to test heat commands",
+    "links": [
+    {
+      "href": "http://166.76.160.117:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/gophercloud-test-stack-2/db6977b2-27aa-4775-9ae7-6213212d4ada",
+      "rel": "self"
+    }
+    ],
+    "stack_status_reason": "Stack successfully updated",
+    "stack_name": "gophercloud-test-stack-2",
+    "creation_time": "2014-12-11T17:39:16",
+    "updated_time": "2014-12-11T17:40:37",
+    "stack_status": "UPDATE_COMPLETE",
+    "id": "db6977b2-27aa-4775-9ae7-6213212d4ada",
+	"tags": ["sfo", "satx"]
+  }
+  ]
+}
+`
+
+// HandleListSuccessfully creates an HTTP handler at `/stacks` on the test handler mux
+// that responds with a `List` response.
+func HandleListSuccessfully(t *testing.T, output string) {
+	th.Mux.HandleFunc("/stacks", 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")
+		r.ParseForm()
+		marker := r.Form.Get("marker")
+		switch marker {
+		case "":
+			fmt.Fprintf(w, output)
+		case "db6977b2-27aa-4775-9ae7-6213212d4ada":
+			fmt.Fprintf(w, `[]`)
+		default:
+			t.Fatalf("Unexpected marker: [%s]", marker)
+		}
+	})
+}
+
+// GetExpected represents the expected object from a Get request.
+var GetExpected = &stacks.RetrievedStack{
+	DisableRollback: true,
+	Description:     "Simple template to test heat commands",
+	Parameters: map[string]string{
+		"flavor":         "m1.tiny",
+		"OS::stack_name": "postman_stack",
+		"OS::stack_id":   "16ef0584-4458-41eb-87c8-0dc8d5f66c87",
+	},
+	StatusReason: "Stack CREATE completed successfully",
+	Name:         "postman_stack",
+	Outputs:      []map[string]interface{}{},
+	CreationTime: gophercloud.JSONRFC3339NoZ(time.Date(2015, 2, 3, 20, 7, 39, 0, time.UTC)),
+	Links: []gophercloud.Link{
+		{
+			Href: "http://166.76.160.117:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/16ef0584-4458-41eb-87c8-0dc8d5f66c87",
+			Rel:  "self",
+		},
+	},
+	Capabilities:        []interface{}{},
+	NotificationTopics:  []interface{}{},
+	Status:              "CREATE_COMPLETE",
+	ID:                  "16ef0584-4458-41eb-87c8-0dc8d5f66c87",
+	TemplateDescription: "Simple template to test heat commands",
+	Tags:                []string{"rackspace", "atx"},
+}
+
+// GetOutput represents the response body from a Get request.
+const GetOutput = `
+{
+  "stack": {
+    "disable_rollback": true,
+    "description": "Simple template to test heat commands",
+    "parameters": {
+      "flavor": "m1.tiny",
+      "OS::stack_name": "postman_stack",
+      "OS::stack_id": "16ef0584-4458-41eb-87c8-0dc8d5f66c87"
+    },
+    "stack_status_reason": "Stack CREATE completed successfully",
+    "stack_name": "postman_stack",
+    "outputs": [],
+    "creation_time": "2015-02-03T20:07:39",
+    "links": [
+    {
+      "href": "http://166.76.160.117:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/16ef0584-4458-41eb-87c8-0dc8d5f66c87",
+      "rel": "self"
+    }
+    ],
+    "capabilities": [],
+    "notification_topics": [],
+    "timeout_mins": null,
+    "stack_status": "CREATE_COMPLETE",
+    "updated_time": null,
+    "id": "16ef0584-4458-41eb-87c8-0dc8d5f66c87",
+    "template_description": "Simple template to test heat commands",
+	"tags": ["rackspace", "atx"]
+  }
+}
+`
+
+// HandleGetSuccessfully creates an HTTP handler at `/stacks/postman_stack/16ef0584-4458-41eb-87c8-0dc8d5f66c87`
+// on the test handler mux that responds with a `Get` response.
+func HandleGetSuccessfully(t *testing.T, output string) {
+	th.Mux.HandleFunc("/stacks/postman_stack/16ef0584-4458-41eb-87c8-0dc8d5f66c87", 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, output)
+	})
+}
+
+// HandleUpdateSuccessfully creates an HTTP handler at `/stacks/postman_stack/16ef0584-4458-41eb-87c8-0dc8d5f66c87`
+// on the test handler mux that responds with an `Update` response.
+func HandleUpdateSuccessfully(t *testing.T) {
+	th.Mux.HandleFunc("/stacks/gophercloud-test-stack-2/db6977b2-27aa-4775-9ae7-6213212d4ada", 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().Set("Content-Type", "application/json")
+		w.WriteHeader(http.StatusAccepted)
+	})
+}
+
+// HandleDeleteSuccessfully creates an HTTP handler at `/stacks/postman_stack/16ef0584-4458-41eb-87c8-0dc8d5f66c87`
+// on the test handler mux that responds with a `Delete` response.
+func HandleDeleteSuccessfully(t *testing.T) {
+	th.Mux.HandleFunc("/stacks/gophercloud-test-stack-2/db6977b2-27aa-4775-9ae7-6213212d4ada", 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)
+	})
+}
+
+// GetExpected represents the expected object from a Get request.
+var PreviewExpected = &stacks.PreviewedStack{
+	DisableRollback: true,
+	Description:     "Simple template to test heat commands",
+	Parameters: map[string]string{
+		"flavor":         "m1.tiny",
+		"OS::stack_name": "postman_stack",
+		"OS::stack_id":   "16ef0584-4458-41eb-87c8-0dc8d5f66c87",
+	},
+	Name:         "postman_stack",
+	CreationTime: gophercloud.JSONRFC3339NoZ(time.Date(2015, 2, 3, 20, 7, 39, 0, time.UTC)),
+	Links: []gophercloud.Link{
+		{
+			Href: "http://166.76.160.117:8004/v1/98606384f58d4ad0b3db7d0d779549ac/stacks/postman_stack/16ef0584-4458-41eb-87c8-0dc8d5f66c87",
+			Rel:  "self",
+		},
+	},
+	Capabilities:        []interface{}{},
+	NotificationTopics:  []interface{}{},
+	ID:                  "16ef0584-4458-41eb-87c8-0dc8d5f66c87",
+	TemplateDescription: "Simple template to test heat commands",
+}
+
+// HandlePreviewSuccessfully creates an HTTP handler at `/stacks/preview`
+// on the test handler mux that responds with a `Preview` response.
+func HandlePreviewSuccessfully(t *testing.T, output string) {
+	th.Mux.HandleFunc("/stacks/preview", 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")
+
+		w.Header().Set("Content-Type", "application/json")
+		w.WriteHeader(http.StatusOK)
+		fmt.Fprintf(w, output)
+	})
+}
+
+// AbandonExpected represents the expected object from an Abandon request.
+var AbandonExpected = &stacks.AbandonedStack{
+	Status: "COMPLETE",
+	Name:   "postman_stack",
+	Template: map[string]interface{}{
+		"heat_template_version": "2013-05-23",
+		"description":           "Simple template to test heat commands",
+		"parameters": map[string]interface{}{
+			"flavor": map[string]interface{}{
+				"default": "m1.tiny",
+				"type":    "string",
+			},
+		},
+		"resources": map[string]interface{}{
+			"hello_world": map[string]interface{}{
+				"type": "OS::Nova::Server",
+				"properties": map[string]interface{}{
+					"key_name": "heat_key",
+					"flavor": map[string]interface{}{
+						"get_param": "flavor",
+					},
+					"image":     "ad091b52-742f-469e-8f3c-fd81cadf0743",
+					"user_data": "#!/bin/bash -xv\necho \"hello world\" > /root/hello-world.txt\n",
+				},
+			},
+		},
+	},
+	Action: "CREATE",
+	ID:     "16ef0584-4458-41eb-87c8-0dc8d5f66c87",
+	Resources: map[string]interface{}{
+		"hello_world": map[string]interface{}{
+			"status":      "COMPLETE",
+			"name":        "hello_world",
+			"resource_id": "8a310d36-46fc-436f-8be4-37a696b8ac63",
+			"action":      "CREATE",
+			"type":        "OS::Nova::Server",
+		},
+	},
+	Files: map[string]string{
+		"file:///Users/prat8228/go/src/github.com/rackspace/rack/my_nova.yaml": "heat_template_version: 2014-10-16\nparameters:\n  flavor:\n    type: string\n    description: Flavor for the server to be created\n    default: 4353\n    hidden: true\nresources:\n  test_server:\n    type: \"OS::Nova::Server\"\n    properties:\n      name: test-server\n      flavor: 2 GB General Purpose v1\n image: Debian 7 (Wheezy) (PVHVM)\n",
+	},
+	StackUserProjectID: "897686",
+	ProjectID:          "897686",
+	Environment: map[string]interface{}{
+		"encrypted_param_names": make([]map[string]interface{}, 0),
+		"parameter_defaults":    make(map[string]interface{}),
+		"parameters":            make(map[string]interface{}),
+		"resource_registry": map[string]interface{}{
+			"file:///Users/prat8228/go/src/github.com/rackspace/rack/my_nova.yaml": "file:///Users/prat8228/go/src/github.com/rackspace/rack/my_nova.yaml",
+			"resources": make(map[string]interface{}),
+		},
+	},
+}
+
+// AbandonOutput represents the response body from an Abandon request.
+const AbandonOutput = `
+{
+  "status": "COMPLETE",
+  "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\" > /root/hello-world.txt\n"
+        }
+      }
+    }
+  },
+  "action": "CREATE",
+  "id": "16ef0584-4458-41eb-87c8-0dc8d5f66c87",
+  "resources": {
+    "hello_world": {
+      "status": "COMPLETE",
+      "name": "hello_world",
+      "resource_id": "8a310d36-46fc-436f-8be4-37a696b8ac63",
+      "action": "CREATE",
+      "type": "OS::Nova::Server"
+    }
+  },
+  "files": {
+    "file:///Users/prat8228/go/src/github.com/rackspace/rack/my_nova.yaml": "heat_template_version: 2014-10-16\nparameters:\n  flavor:\n    type: string\n    description: Flavor for the server to be created\n    default: 4353\n    hidden: true\nresources:\n  test_server:\n    type: \"OS::Nova::Server\"\n    properties:\n      name: test-server\n      flavor: 2 GB General Purpose v1\n image: Debian 7 (Wheezy) (PVHVM)\n"
+},
+  "environment": {
+	"encrypted_param_names": [],
+	"parameter_defaults": {},
+	"parameters": {},
+	"resource_registry": {
+		"file:///Users/prat8228/go/src/github.com/rackspace/rack/my_nova.yaml": "file:///Users/prat8228/go/src/github.com/rackspace/rack/my_nova.yaml",
+		"resources": {}
+	}
+  },
+  "stack_user_project_id": "897686",
+  "project_id": "897686"
+}`
+
+// HandleAbandonSuccessfully creates an HTTP handler at `/stacks/postman_stack/16ef0584-4458-41eb-87c8-0dc8d5f66c87/abandon`
+// on the test handler mux that responds with an `Abandon` response.
+func HandleAbandonSuccessfully(t *testing.T, output string) {
+	th.Mux.HandleFunc("/stacks/postman_stack/16ef0584-4458-41eb-87c8-0dc8d5f66c8/abandon", 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.StatusOK)
+		fmt.Fprintf(w, output)
+	})
+}
diff --git a/openstack/orchestration/v1/stacks/requests_test.go b/openstack/orchestration/v1/stacks/testing/requests_test.go
similarity index 74%
rename from openstack/orchestration/v1/stacks/requests_test.go
rename to openstack/orchestration/v1/stacks/testing/requests_test.go
index 5cff622..bdc6229 100644
--- a/openstack/orchestration/v1/stacks/requests_test.go
+++ b/openstack/orchestration/v1/stacks/testing/requests_test.go
@@ -1,9 +1,10 @@
-package stacks
+package testing
 
 import (
 	"testing"
 
 	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/openstack/orchestration/v1/stacks"
 	"github.com/gophercloud/gophercloud/pagination"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
@@ -13,7 +14,7 @@
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
 	HandleCreateSuccessfully(t, CreateOutput)
-	template := new(Template)
+	template := new(stacks.Template)
 	template.Bin = []byte(`
 		{
 			"heat_template_version": "2013-05-23",
@@ -25,13 +26,13 @@
 				}
 			}
 		}`)
-	createOpts := CreateOpts{
+	createOpts := stacks.CreateOpts{
 		Name:            "stackcreated",
 		Timeout:         60,
 		TemplateOpts:    template,
 		DisableRollback: gophercloud.Disabled,
 	}
-	actual, err := Create(fake.ServiceClient(), createOpts).Extract()
+	actual, err := stacks.Create(fake.ServiceClient(), createOpts).Extract()
 	th.AssertNoErr(t, err)
 
 	expected := CreateExpected
@@ -42,7 +43,7 @@
 	th.SetupHTTP()
 	defer th.TeardownHTTP()
 	HandleCreateSuccessfully(t, CreateOutput)
-	template := new(Template)
+	template := new(stacks.Template)
 	template.Bin = []byte(`
 {
   "stack_name": "postman_stack",
@@ -70,14 +71,14 @@
 	}
   }
 }`)
-	adoptOpts := AdoptOpts{
+	adoptOpts := stacks.AdoptOpts{
 		AdoptStackData:  `{environment{parameters{}}}`,
 		Name:            "stackcreated",
 		Timeout:         60,
 		TemplateOpts:    template,
 		DisableRollback: gophercloud.Disabled,
 	}
-	actual, err := Adopt(fake.ServiceClient(), adoptOpts).Extract()
+	actual, err := stacks.Adopt(fake.ServiceClient(), adoptOpts).Extract()
 	th.AssertNoErr(t, err)
 
 	expected := CreateExpected
@@ -90,9 +91,9 @@
 	HandleListSuccessfully(t, FullListOutput)
 
 	count := 0
-	err := List(fake.ServiceClient(), nil).EachPage(func(page pagination.Page) (bool, error) {
+	err := stacks.List(fake.ServiceClient(), nil).EachPage(func(page pagination.Page) (bool, error) {
 		count++
-		actual, err := ExtractStacks(page)
+		actual, err := stacks.ExtractStacks(page)
 		th.AssertNoErr(t, err)
 
 		th.CheckDeepEquals(t, ListExpected, actual)
@@ -108,7 +109,7 @@
 	defer th.TeardownHTTP()
 	HandleGetSuccessfully(t, GetOutput)
 
-	actual, err := Get(fake.ServiceClient(), "postman_stack", "16ef0584-4458-41eb-87c8-0dc8d5f66c87").Extract()
+	actual, err := stacks.Get(fake.ServiceClient(), "postman_stack", "16ef0584-4458-41eb-87c8-0dc8d5f66c87").Extract()
 	th.AssertNoErr(t, err)
 
 	expected := GetExpected
@@ -120,7 +121,7 @@
 	defer th.TeardownHTTP()
 	HandleUpdateSuccessfully(t)
 
-	template := new(Template)
+	template := new(stacks.Template)
 	template.Bin = []byte(`
 		{
 			"heat_template_version": "2013-05-23",
@@ -132,10 +133,10 @@
 				}
 			}
 		}`)
-	updateOpts := UpdateOpts{
+	updateOpts := stacks.UpdateOpts{
 		TemplateOpts: template,
 	}
-	err := Update(fake.ServiceClient(), "gophercloud-test-stack-2", "db6977b2-27aa-4775-9ae7-6213212d4ada", updateOpts).ExtractErr()
+	err := stacks.Update(fake.ServiceClient(), "gophercloud-test-stack-2", "db6977b2-27aa-4775-9ae7-6213212d4ada", updateOpts).ExtractErr()
 	th.AssertNoErr(t, err)
 }
 
@@ -144,7 +145,7 @@
 	defer th.TeardownHTTP()
 	HandleDeleteSuccessfully(t)
 
-	err := Delete(fake.ServiceClient(), "gophercloud-test-stack-2", "db6977b2-27aa-4775-9ae7-6213212d4ada").ExtractErr()
+	err := stacks.Delete(fake.ServiceClient(), "gophercloud-test-stack-2", "db6977b2-27aa-4775-9ae7-6213212d4ada").ExtractErr()
 	th.AssertNoErr(t, err)
 }
 
@@ -153,7 +154,7 @@
 	defer th.TeardownHTTP()
 	HandlePreviewSuccessfully(t, GetOutput)
 
-	template := new(Template)
+	template := new(stacks.Template)
 	template.Bin = []byte(`
 		{
 			"heat_template_version": "2013-05-23",
@@ -165,13 +166,13 @@
 				}
 			}
 		}`)
-	previewOpts := PreviewOpts{
+	previewOpts := stacks.PreviewOpts{
 		Name:            "stackcreated",
 		Timeout:         60,
 		TemplateOpts:    template,
 		DisableRollback: gophercloud.Disabled,
 	}
-	actual, err := Preview(fake.ServiceClient(), previewOpts).Extract()
+	actual, err := stacks.Preview(fake.ServiceClient(), previewOpts).Extract()
 	th.AssertNoErr(t, err)
 
 	expected := PreviewExpected
@@ -183,7 +184,7 @@
 	defer th.TeardownHTTP()
 	HandleAbandonSuccessfully(t, AbandonOutput)
 
-	actual, err := Abandon(fake.ServiceClient(), "postman_stack", "16ef0584-4458-41eb-87c8-0dc8d5f66c8").Extract()
+	actual, err := stacks.Abandon(fake.ServiceClient(), "postman_stack", "16ef0584-4458-41eb-87c8-0dc8d5f66c8").Extract()
 	th.AssertNoErr(t, err)
 
 	expected := AbandonExpected
diff --git a/openstack/orchestration/v1/stacktemplates/testing/doc.go b/openstack/orchestration/v1/stacktemplates/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/orchestration/v1/stacktemplates/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/orchestration/v1/stacktemplates/fixtures.go b/openstack/orchestration/v1/stacktemplates/testing/fixtures.go
similarity index 95%
rename from openstack/orchestration/v1/stacktemplates/fixtures.go
rename to openstack/orchestration/v1/stacktemplates/testing/fixtures.go
index 4444a57..23ec579 100644
--- a/openstack/orchestration/v1/stacktemplates/fixtures.go
+++ b/openstack/orchestration/v1/stacktemplates/testing/fixtures.go
@@ -1,12 +1,11 @@
-// +build fixtures
-
-package stacktemplates
+package testing
 
 import (
 	"fmt"
 	"net/http"
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/orchestration/v1/stacktemplates"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
 )
@@ -54,7 +53,7 @@
 }
 
 // ValidateExpected represents the expected object from a Validate request.
-var ValidateExpected = &ValidatedTemplate{
+var ValidateExpected = &stacktemplates.ValidatedTemplate{
 	Description: "Simple template to test heat commands",
 	Parameters: map[string]interface{}{
 		"flavor": map[string]interface{}{
diff --git a/openstack/orchestration/v1/stacktemplates/requests_test.go b/openstack/orchestration/v1/stacktemplates/testing/requests_test.go
similarity index 78%
rename from openstack/orchestration/v1/stacktemplates/requests_test.go
rename to openstack/orchestration/v1/stacktemplates/testing/requests_test.go
index 42663dc..442bcb7 100644
--- a/openstack/orchestration/v1/stacktemplates/requests_test.go
+++ b/openstack/orchestration/v1/stacktemplates/testing/requests_test.go
@@ -1,8 +1,9 @@
-package stacktemplates
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud/openstack/orchestration/v1/stacktemplates"
 	th "github.com/gophercloud/gophercloud/testhelper"
 	fake "github.com/gophercloud/gophercloud/testhelper/client"
 )
@@ -12,7 +13,7 @@
 	defer th.TeardownHTTP()
 	HandleGetSuccessfully(t, GetOutput)
 
-	actual, err := Get(fake.ServiceClient(), "postman_stack", "16ef0584-4458-41eb-87c8-0dc8d5f66c87").Extract()
+	actual, err := stacktemplates.Get(fake.ServiceClient(), "postman_stack", "16ef0584-4458-41eb-87c8-0dc8d5f66c87").Extract()
 	th.AssertNoErr(t, err)
 
 	expected := GetExpected
@@ -24,7 +25,7 @@
 	defer th.TeardownHTTP()
 	HandleValidateSuccessfully(t, ValidateOutput)
 
-	opts := ValidateOpts{
+	opts := stacktemplates.ValidateOpts{
 		Template: `{
 		  "heat_template_version": "2013-05-23",
 		  "description": "Simple template to test heat commands",
@@ -49,7 +50,7 @@
 		  }
 		}`,
 	}
-	actual, err := Validate(fake.ServiceClient(), opts).Extract()
+	actual, err := stacktemplates.Validate(fake.ServiceClient(), opts).Extract()
 	th.AssertNoErr(t, err)
 
 	expected := ValidateExpected
diff --git a/openstack/client_test.go b/openstack/testing/client_test.go
similarity index 95%
rename from openstack/client_test.go
rename to openstack/testing/client_test.go
index 8698756..37e63c1 100644
--- a/openstack/client_test.go
+++ b/openstack/testing/client_test.go
@@ -1,4 +1,4 @@
-package openstack
+package testing
 
 import (
 	"fmt"
@@ -6,6 +6,7 @@
 	"testing"
 
 	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/openstack"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
 
@@ -52,7 +53,7 @@
 		Password:         "secret",
 		IdentityEndpoint: th.Endpoint(),
 	}
-	client, err := AuthenticatedClient(options)
+	client, err := openstack.AuthenticatedClient(options)
 	th.AssertNoErr(t, err)
 	th.CheckEquals(t, ID, client.TokenID)
 }
@@ -155,7 +156,7 @@
 		Password:         "secret",
 		IdentityEndpoint: th.Endpoint(),
 	}
-	client, err := AuthenticatedClient(options)
+	client, err := openstack.AuthenticatedClient(options)
 	th.AssertNoErr(t, err)
 	th.CheckEquals(t, "01234567890", client.TokenID)
 }
diff --git a/openstack/testing/doc.go b/openstack/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/openstack/endpoint_location_test.go b/openstack/testing/endpoint_location_test.go
similarity index 89%
rename from openstack/endpoint_location_test.go
rename to openstack/testing/endpoint_location_test.go
index b538e84..ea7bdd2 100644
--- a/openstack/endpoint_location_test.go
+++ b/openstack/testing/endpoint_location_test.go
@@ -1,10 +1,11 @@
-package openstack
+package testing
 
 import (
 	"strings"
 	"testing"
 
 	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/openstack"
 	tokens2 "github.com/gophercloud/gophercloud/openstack/identity/v2/tokens"
 	tokens3 "github.com/gophercloud/gophercloud/openstack/identity/v3/tokens"
 	th "github.com/gophercloud/gophercloud/testhelper"
@@ -68,7 +69,7 @@
 	}
 
 	for availability, expected := range expectedURLs {
-		actual, err := V2EndpointURL(&catalog2, gophercloud.EndpointOpts{
+		actual, err := openstack.V2EndpointURL(&catalog2, gophercloud.EndpointOpts{
 			Type:         "same",
 			Name:         "same",
 			Region:       "same",
@@ -80,7 +81,7 @@
 }
 
 func TestV2EndpointNone(t *testing.T) {
-	_, actual := V2EndpointURL(&catalog2, gophercloud.EndpointOpts{
+	_, actual := openstack.V2EndpointURL(&catalog2, gophercloud.EndpointOpts{
 		Type:         "nope",
 		Availability: gophercloud.AvailabilityPublic,
 	})
@@ -89,7 +90,7 @@
 }
 
 func TestV2EndpointMultiple(t *testing.T) {
-	_, err := V2EndpointURL(&catalog2, gophercloud.EndpointOpts{
+	_, err := openstack.V2EndpointURL(&catalog2, gophercloud.EndpointOpts{
 		Type:         "same",
 		Region:       "same",
 		Availability: gophercloud.AvailabilityPublic,
@@ -100,7 +101,7 @@
 }
 
 func TestV2EndpointBadAvailability(t *testing.T) {
-	_, err := V2EndpointURL(&catalog2, gophercloud.EndpointOpts{
+	_, err := openstack.V2EndpointURL(&catalog2, gophercloud.EndpointOpts{
 		Type:         "same",
 		Name:         "same",
 		Region:       "same",
@@ -188,7 +189,7 @@
 	}
 
 	for availability, expected := range expectedURLs {
-		actual, err := V3EndpointURL(&catalog3, gophercloud.EndpointOpts{
+		actual, err := openstack.V3EndpointURL(&catalog3, gophercloud.EndpointOpts{
 			Type:         "same",
 			Name:         "same",
 			Region:       "same",
@@ -200,7 +201,7 @@
 }
 
 func TestV3EndpointNone(t *testing.T) {
-	_, actual := V3EndpointURL(&catalog3, gophercloud.EndpointOpts{
+	_, actual := openstack.V3EndpointURL(&catalog3, gophercloud.EndpointOpts{
 		Type:         "nope",
 		Availability: gophercloud.AvailabilityPublic,
 	})
@@ -209,7 +210,7 @@
 }
 
 func TestV3EndpointMultiple(t *testing.T) {
-	_, err := V3EndpointURL(&catalog3, gophercloud.EndpointOpts{
+	_, err := openstack.V3EndpointURL(&catalog3, gophercloud.EndpointOpts{
 		Type:         "same",
 		Region:       "same",
 		Availability: gophercloud.AvailabilityPublic,
@@ -220,7 +221,7 @@
 }
 
 func TestV3EndpointBadAvailability(t *testing.T) {
-	_, err := V3EndpointURL(&catalog3, gophercloud.EndpointOpts{
+	_, err := openstack.V3EndpointURL(&catalog3, gophercloud.EndpointOpts{
 		Type:         "same",
 		Name:         "same",
 		Region:       "same",
diff --git a/openstack/utils/choose_version_test.go b/openstack/utils/testing/choose_version_test.go
similarity index 77%
rename from openstack/utils/choose_version_test.go
rename to openstack/utils/testing/choose_version_test.go
index 9f2f363..9c0119c 100644
--- a/openstack/utils/choose_version_test.go
+++ b/openstack/utils/testing/choose_version_test.go
@@ -1,4 +1,4 @@
-package utils
+package testing
 
 import (
 	"fmt"
@@ -6,6 +6,7 @@
 	"testing"
 
 	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/openstack/utils"
 	"github.com/gophercloud/gophercloud/testhelper"
 )
 
@@ -41,14 +42,14 @@
 	defer testhelper.TeardownHTTP()
 	setupVersionHandler()
 
-	v2 := &Version{ID: "v2.0", Priority: 2, Suffix: "blarg"}
-	v3 := &Version{ID: "v3.0", Priority: 3, Suffix: "hargl"}
+	v2 := &utils.Version{ID: "v2.0", Priority: 2, Suffix: "blarg"}
+	v3 := &utils.Version{ID: "v3.0", Priority: 3, Suffix: "hargl"}
 
 	c := &gophercloud.ProviderClient{
 		IdentityBase:     testhelper.Endpoint(),
 		IdentityEndpoint: "",
 	}
-	v, endpoint, err := ChooseVersion(c, []*Version{v2, v3})
+	v, endpoint, err := utils.ChooseVersion(c, []*utils.Version{v2, v3})
 
 	if err != nil {
 		t.Fatalf("Unexpected error from ChooseVersion: %v", err)
@@ -69,14 +70,14 @@
 	defer testhelper.TeardownHTTP()
 	setupVersionHandler()
 
-	v2 := &Version{ID: "v2.0", Priority: 2, Suffix: "nope"}
-	v3 := &Version{ID: "v3.0", Priority: 3, Suffix: "northis"}
+	v2 := &utils.Version{ID: "v2.0", Priority: 2, Suffix: "nope"}
+	v3 := &utils.Version{ID: "v3.0", Priority: 3, Suffix: "northis"}
 
 	c := &gophercloud.ProviderClient{
 		IdentityBase:     testhelper.Endpoint(),
 		IdentityEndpoint: testhelper.Endpoint() + "v2.0/",
 	}
-	v, endpoint, err := ChooseVersion(c, []*Version{v2, v3})
+	v, endpoint, err := utils.ChooseVersion(c, []*utils.Version{v2, v3})
 	if err != nil {
 		t.Fatalf("Unexpected error from ChooseVersion: %v", err)
 	}
@@ -95,14 +96,14 @@
 	testhelper.SetupHTTP()
 	defer testhelper.TeardownHTTP()
 
-	v2 := &Version{ID: "v2.0", Priority: 2, Suffix: "/v2.0/"}
-	v3 := &Version{ID: "v3.0", Priority: 3, Suffix: "/v3.0/"}
+	v2 := &utils.Version{ID: "v2.0", Priority: 2, Suffix: "/v2.0/"}
+	v3 := &utils.Version{ID: "v3.0", Priority: 3, Suffix: "/v3.0/"}
 
 	c := &gophercloud.ProviderClient{
 		IdentityBase:     testhelper.Endpoint(),
 		IdentityEndpoint: testhelper.Endpoint() + "v2.0/",
 	}
-	v, endpoint, err := ChooseVersion(c, []*Version{v2, v3})
+	v, endpoint, err := utils.ChooseVersion(c, []*utils.Version{v2, v3})
 	if err != nil {
 		t.Fatalf("Unexpected error from ChooseVersion: %v", err)
 	}
diff --git a/openstack/utils/testing/doc.go b/openstack/utils/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/openstack/utils/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/pagination/testing/doc.go b/pagination/testing/doc.go
new file mode 100644
index 0000000..7603f83
--- /dev/null
+++ b/pagination/testing/doc.go
@@ -0,0 +1 @@
+package testing
diff --git a/pagination/linked_test.go b/pagination/testing/linked_test.go
similarity index 82%
rename from pagination/linked_test.go
rename to pagination/testing/linked_test.go
index 67e6e3c..3533e44 100644
--- a/pagination/linked_test.go
+++ b/pagination/testing/linked_test.go
@@ -1,4 +1,4 @@
-package pagination
+package testing
 
 import (
 	"fmt"
@@ -6,13 +6,14 @@
 	"reflect"
 	"testing"
 
+	"github.com/gophercloud/gophercloud/pagination"
 	"github.com/gophercloud/gophercloud/testhelper"
 )
 
 // LinkedPager sample and test cases.
 
 type LinkedPageResult struct {
-	LinkedPageBase
+	pagination.LinkedPageBase
 }
 
 func (r LinkedPageResult) IsEmpty() (bool, error) {
@@ -20,7 +21,7 @@
 	return len(is) == 0, err
 }
 
-func ExtractLinkedInts(r Page) ([]int, error) {
+func ExtractLinkedInts(r pagination.Page) ([]int, error) {
 	var s struct {
 		Ints []int `json:"ints"`
 	}
@@ -28,7 +29,7 @@
 	return s.Ints, err
 }
 
-func createLinked(t *testing.T) Pager {
+func createLinked(t *testing.T) pagination.Pager {
 	testhelper.SetupHTTP()
 
 	testhelper.Mux.HandleFunc("/page1", func(w http.ResponseWriter, r *http.Request) {
@@ -48,11 +49,11 @@
 
 	client := createClient()
 
-	createPage := func(r PageResult) Page {
-		return LinkedPageResult{LinkedPageBase{PageResult: r}}
+	createPage := func(r pagination.PageResult) pagination.Page {
+		return LinkedPageResult{pagination.LinkedPageBase{PageResult: r}}
 	}
 
-	return NewPager(client, testhelper.Server.URL+"/page1", createPage)
+	return pagination.NewPager(client, testhelper.Server.URL+"/page1", createPage)
 }
 
 func TestEnumerateLinked(t *testing.T) {
@@ -60,7 +61,7 @@
 	defer testhelper.TeardownHTTP()
 
 	callCount := 0
-	err := pager.EachPage(func(page Page) (bool, error) {
+	err := pager.EachPage(func(page pagination.Page) (bool, error) {
 		actual, err := ExtractLinkedInts(page)
 		if err != nil {
 			return false, err
diff --git a/pagination/marker_test.go b/pagination/testing/marker_test.go
similarity index 83%
rename from pagination/marker_test.go
rename to pagination/testing/marker_test.go
index 4ade8d3..7b1a6da 100644
--- a/pagination/marker_test.go
+++ b/pagination/testing/marker_test.go
@@ -1,4 +1,4 @@
-package pagination
+package testing
 
 import (
 	"fmt"
@@ -6,13 +6,14 @@
 	"strings"
 	"testing"
 
+	"github.com/gophercloud/gophercloud/pagination"
 	"github.com/gophercloud/gophercloud/testhelper"
 )
 
 // MarkerPager sample and test cases.
 
 type MarkerPageResult struct {
-	MarkerPageBase
+	pagination.MarkerPageBase
 }
 
 func (r MarkerPageResult) IsEmpty() (bool, error) {
@@ -34,7 +35,7 @@
 	return results[len(results)-1], nil
 }
 
-func createMarkerPaged(t *testing.T) Pager {
+func createMarkerPaged(t *testing.T) pagination.Pager {
 	testhelper.SetupHTTP()
 
 	testhelper.Mux.HandleFunc("/page", func(w http.ResponseWriter, r *http.Request) {
@@ -56,16 +57,16 @@
 
 	client := createClient()
 
-	createPage := func(r PageResult) Page {
-		p := MarkerPageResult{MarkerPageBase{PageResult: r}}
+	createPage := func(r pagination.PageResult) pagination.Page {
+		p := MarkerPageResult{pagination.MarkerPageBase{PageResult: r}}
 		p.MarkerPageBase.Owner = p
 		return p
 	}
 
-	return NewPager(client, testhelper.Server.URL+"/page", createPage)
+	return pagination.NewPager(client, testhelper.Server.URL+"/page", createPage)
 }
 
-func ExtractMarkerStrings(page Page) ([]string, error) {
+func ExtractMarkerStrings(page pagination.Page) ([]string, error) {
 	content := page.(MarkerPageResult).Body.([]uint8)
 	parts := strings.Split(string(content), "\n")
 	results := make([]string, 0, len(parts))
@@ -82,7 +83,7 @@
 	defer testhelper.TeardownHTTP()
 
 	callCount := 0
-	err := pager.EachPage(func(page Page) (bool, error) {
+	err := pager.EachPage(func(page pagination.Page) (bool, error) {
 		actual, err := ExtractMarkerStrings(page)
 		if err != nil {
 			return false, err
diff --git a/pagination/pagination_test.go b/pagination/testing/pagination_test.go
similarity index 93%
rename from pagination/pagination_test.go
rename to pagination/testing/pagination_test.go
index bd3295e..170dca4 100644
--- a/pagination/pagination_test.go
+++ b/pagination/testing/pagination_test.go
@@ -1,4 +1,4 @@
-package pagination
+package testing
 
 import (
 	"github.com/gophercloud/gophercloud"
diff --git a/pagination/single_test.go b/pagination/testing/single_test.go
similarity index 75%
rename from pagination/single_test.go
rename to pagination/testing/single_test.go
index 2a9466c..8d95e94 100644
--- a/pagination/single_test.go
+++ b/pagination/testing/single_test.go
@@ -1,17 +1,18 @@
-package pagination
+package testing
 
 import (
 	"fmt"
 	"net/http"
 	"testing"
 
+	"github.com/gophercloud/gophercloud/pagination"
 	"github.com/gophercloud/gophercloud/testhelper"
 )
 
 // SinglePage sample and test cases.
 
 type SinglePageResult struct {
-	SinglePageBase
+	pagination.SinglePageBase
 }
 
 func (r SinglePageResult) IsEmpty() (bool, error) {
@@ -22,7 +23,7 @@
 	return len(is) == 0, nil
 }
 
-func ExtractSingleInts(r Page) ([]int, error) {
+func ExtractSingleInts(r pagination.Page) ([]int, error) {
 	var s struct {
 		Ints []int `json:"ints"`
 	}
@@ -30,7 +31,7 @@
 	return s.Ints, err
 }
 
-func setupSinglePaged() Pager {
+func setupSinglePaged() pagination.Pager {
 	testhelper.SetupHTTP()
 	client := createClient()
 
@@ -39,11 +40,11 @@
 		fmt.Fprintf(w, `{ "ints": [1, 2, 3] }`)
 	})
 
-	createPage := func(r PageResult) Page {
-		return SinglePageResult{SinglePageBase(r)}
+	createPage := func(r pagination.PageResult) pagination.Page {
+		return SinglePageResult{pagination.SinglePageBase(r)}
 	}
 
-	return NewPager(client, testhelper.Server.URL+"/only", createPage)
+	return pagination.NewPager(client, testhelper.Server.URL+"/only", createPage)
 }
 
 func TestEnumerateSinglePaged(t *testing.T) {
@@ -51,7 +52,7 @@
 	pager := setupSinglePaged()
 	defer testhelper.TeardownHTTP()
 
-	err := pager.EachPage(func(page Page) (bool, error) {
+	err := pager.EachPage(func(page pagination.Page) (bool, error) {
 		callCount++
 
 		expected := []int{1, 2, 3}
diff --git a/script/acceptancetest b/script/acceptancetest
index f9c89f4..9debd48 100755
--- a/script/acceptancetest
+++ b/script/acceptancetest
@@ -2,4 +2,4 @@
 #
 # Run the acceptance tests.
 
-exec go test -p=1 -tags 'acceptance fixtures' github.com/rackspace/gophercloud/acceptance/... $@
+exec go test -p=1 github.com/gophercloud/gophercloud/acceptance/... $@
diff --git a/testing/endpoint_search_test.go b/testing/endpoint_search_test.go
new file mode 100644
index 0000000..22476cb
--- /dev/null
+++ b/testing/endpoint_search_test.go
@@ -0,0 +1,20 @@
+package testing
+
+import (
+	"testing"
+
+	"github.com/gophercloud/gophercloud"
+	th "github.com/gophercloud/gophercloud/testhelper"
+)
+
+func TestApplyDefaultsToEndpointOpts(t *testing.T) {
+	eo := gophercloud.EndpointOpts{Availability: gophercloud.AvailabilityPublic}
+	eo.ApplyDefaults("compute")
+	expected := gophercloud.EndpointOpts{Availability: gophercloud.AvailabilityPublic, Type: "compute"}
+	th.CheckDeepEquals(t, expected, eo)
+
+	eo = gophercloud.EndpointOpts{Type: "compute"}
+	eo.ApplyDefaults("object-store")
+	expected = gophercloud.EndpointOpts{Availability: gophercloud.AvailabilityPublic, Type: "compute"}
+	th.CheckDeepEquals(t, expected, eo)
+}
diff --git a/params_test.go b/testing/params_test.go
similarity index 73%
rename from params_test.go
rename to testing/params_test.go
index 6789a5a..90f3fad 100644
--- a/params_test.go
+++ b/testing/params_test.go
@@ -1,35 +1,35 @@
-package gophercloud
+package testing
 
 import (
 	"net/url"
 	"reflect"
 	"testing"
-	"time"
 
+	"github.com/gophercloud/gophercloud"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
 
 func TestMaybeString(t *testing.T) {
 	testString := ""
 	var expected *string
-	actual := MaybeString(testString)
+	actual := gophercloud.MaybeString(testString)
 	th.CheckDeepEquals(t, expected, actual)
 
 	testString = "carol"
 	expected = &testString
-	actual = MaybeString(testString)
+	actual = gophercloud.MaybeString(testString)
 	th.CheckDeepEquals(t, expected, actual)
 }
 
 func TestMaybeInt(t *testing.T) {
 	testInt := 0
 	var expected *int
-	actual := MaybeInt(testInt)
+	actual := gophercloud.MaybeInt(testInt)
 	th.CheckDeepEquals(t, expected, actual)
 
 	testInt = 4
 	expected = &testInt
-	actual = MaybeInt(testInt)
+	actual = gophercloud.MaybeInt(testInt)
 	th.CheckDeepEquals(t, expected, actual)
 }
 
@@ -51,7 +51,7 @@
 		TI: []int{1, 2},
 	}
 	expected := &url.URL{RawQuery: "c=true&j=2&r=red&s=one&s=two&s=three&ti=1&ti=2&ts=a&ts=b"}
-	actual, err := BuildQueryString(&opts)
+	actual, err := gophercloud.BuildQueryString(&opts)
 	if err != nil {
 		t.Errorf("Error building query string: %v", err)
 	}
@@ -68,13 +68,13 @@
 		J: 2,
 		C: true,
 	}
-	_, err = BuildQueryString(&opts)
+	_, err = gophercloud.BuildQueryString(&opts)
 	if err == nil {
 		t.Errorf("Expected error: 'Required field not set'")
 	}
 	th.CheckDeepEquals(t, expected, actual)
 
-	_, err = BuildQueryString(map[string]interface{}{"Number": 4})
+	_, err = gophercloud.BuildQueryString(map[string]interface{}{"Number": 4})
 	if err == nil {
 		t.Errorf("Expected error: 'Options type is not a struct'")
 	}
@@ -91,65 +91,22 @@
 		Style:  true,
 	}
 	expected := map[string]string{"Accept": "application/json", "Number": "4", "Style": "true"}
-	actual, err := BuildHeaders(&testStruct)
+	actual, err := gophercloud.BuildHeaders(&testStruct)
 	th.CheckNoErr(t, err)
 	th.CheckDeepEquals(t, expected, actual)
 
 	testStruct.Num = 0
-	_, err = BuildHeaders(&testStruct)
+	_, err = gophercloud.BuildHeaders(&testStruct)
 	if err == nil {
 		t.Errorf("Expected error: 'Required header not set'")
 	}
 
-	_, err = BuildHeaders(map[string]interface{}{"Number": 4})
+	_, err = gophercloud.BuildHeaders(map[string]interface{}{"Number": 4})
 	if err == nil {
 		t.Errorf("Expected error: 'Options type is not a struct'")
 	}
 }
 
-func TestIsZero(t *testing.T) {
-	var testMap map[string]interface{}
-	testMapValue := reflect.ValueOf(testMap)
-	expected := true
-	actual := isZero(testMapValue)
-	th.CheckEquals(t, expected, actual)
-	testMap = map[string]interface{}{"empty": false}
-	testMapValue = reflect.ValueOf(testMap)
-	expected = false
-	actual = isZero(testMapValue)
-	th.CheckEquals(t, expected, actual)
-
-	var testArray [2]string
-	testArrayValue := reflect.ValueOf(testArray)
-	expected = true
-	actual = isZero(testArrayValue)
-	th.CheckEquals(t, expected, actual)
-	testArray = [2]string{"one", "two"}
-	testArrayValue = reflect.ValueOf(testArray)
-	expected = false
-	actual = isZero(testArrayValue)
-	th.CheckEquals(t, expected, actual)
-
-	var testStruct struct {
-		A string
-		B time.Time
-	}
-	testStructValue := reflect.ValueOf(testStruct)
-	expected = true
-	actual = isZero(testStructValue)
-	th.CheckEquals(t, expected, actual)
-	testStruct = struct {
-		A string
-		B time.Time
-	}{
-		B: time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC),
-	}
-	testStructValue = reflect.ValueOf(testStruct)
-	expected = false
-	actual = isZero(testStructValue)
-	th.CheckEquals(t, expected, actual)
-}
-
 func TestQueriesAreEscaped(t *testing.T) {
 	type foo struct {
 		Name  string `q:"something"`
@@ -158,7 +115,7 @@
 
 	expected := &url.URL{RawQuery: "else=Triangl+e&something=blah%2B%3F%21%21foo"}
 
-	actual, err := BuildQueryString(foo{Name: "blah+?!!foo", Shape: "Triangl e"})
+	actual, err := gophercloud.BuildQueryString(foo{Name: "blah+?!!foo", Shape: "Triangl e"})
 	th.AssertNoErr(t, err)
 
 	th.AssertDeepEquals(t, expected, actual)
@@ -236,7 +193,7 @@
 	}
 
 	for _, successCase := range successCases {
-		actual, err := BuildRequestBody(successCase.opts, "auth")
+		actual, err := gophercloud.BuildRequestBody(successCase.opts, "auth")
 		th.AssertNoErr(t, err)
 		th.AssertDeepEquals(t, successCase.expected, actual)
 	}
@@ -250,7 +207,7 @@
 				TenantID:   "987654321",
 				TenantName: "me",
 			},
-			ErrMissingInput{},
+			gophercloud.ErrMissingInput{},
 		},
 		{
 			AuthOptions{
@@ -262,7 +219,7 @@
 					Password: "swordfish",
 				},
 			},
-			ErrMissingInput{},
+			gophercloud.ErrMissingInput{},
 		},
 		{
 			AuthOptions{
@@ -270,7 +227,7 @@
 					Password: "swordfish",
 				},
 			},
-			ErrMissingInput{},
+			gophercloud.ErrMissingInput{},
 		},
 		{
 			AuthOptions{
@@ -282,12 +239,12 @@
 					Filler: 2,
 				},
 			},
-			ErrMissingInput{},
+			gophercloud.ErrMissingInput{},
 		},
 	}
 
 	for _, failCase := range failCases {
-		_, err := BuildRequestBody(failCase.opts, "auth")
+		_, err := gophercloud.BuildRequestBody(failCase.opts, "auth")
 		th.AssertDeepEquals(t, reflect.TypeOf(failCase.expected), reflect.TypeOf(err))
 	}
 }
diff --git a/provider_client_test.go b/testing/provider_client_test.go
similarity index 83%
rename from provider_client_test.go
rename to testing/provider_client_test.go
index 468b2c3..7c0e84e 100644
--- a/provider_client_test.go
+++ b/testing/provider_client_test.go
@@ -1,13 +1,14 @@
-package gophercloud
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
 
 func TestAuthenticatedHeaders(t *testing.T) {
-	p := &ProviderClient{
+	p := &gophercloud.ProviderClient{
 		TokenID: "1234",
 	}
 	expected := map[string]string{"X-Auth-Token": "1234"}
@@ -16,7 +17,7 @@
 }
 
 func TestUserAgent(t *testing.T) {
-	p := &ProviderClient{}
+	p := &gophercloud.ProviderClient{}
 
 	p.UserAgent.Prepend("custom-user-agent/2.4.0")
 	expected := "custom-user-agent/2.4.0 gophercloud/2.0.0"
@@ -28,7 +29,7 @@
 	actual = p.UserAgent.Join()
 	th.CheckEquals(t, expected, actual)
 
-	p.UserAgent = UserAgent{}
+	p.UserAgent = gophercloud.UserAgent{}
 	expected = "gophercloud/2.0.0"
 	actual = p.UserAgent.Join()
 	th.CheckEquals(t, expected, actual)
diff --git a/service_client_test.go b/testing/service_client_test.go
similarity index 67%
rename from service_client_test.go
rename to testing/service_client_test.go
index 0bd0006..904b303 100644
--- a/service_client_test.go
+++ b/testing/service_client_test.go
@@ -1,13 +1,14 @@
-package gophercloud
+package testing
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
 
 func TestServiceURL(t *testing.T) {
-	c := &ServiceClient{Endpoint: "http://123.45.67.8/"}
+	c := &gophercloud.ServiceClient{Endpoint: "http://123.45.67.8/"}
 	expected := "http://123.45.67.8/more/parts/here"
 	actual := c.ServiceURL("more", "parts", "here")
 	th.CheckEquals(t, expected, actual)
diff --git a/util_test.go b/testing/util_test.go
similarity index 75%
rename from util_test.go
rename to testing/util_test.go
index 6b0d734..5985bc3 100644
--- a/util_test.go
+++ b/testing/util_test.go
@@ -1,4 +1,4 @@
-package gophercloud
+package testing
 
 import (
 	"os"
@@ -6,11 +6,12 @@
 	"strings"
 	"testing"
 
+	"github.com/gophercloud/gophercloud"
 	th "github.com/gophercloud/gophercloud/testhelper"
 )
 
 func TestWaitFor(t *testing.T) {
-	err := WaitFor(5, func() (bool, error) {
+	err := gophercloud.WaitFor(5, func() (bool, error) {
 		return true, nil
 	})
 	th.CheckNoErr(t, err)
@@ -26,7 +27,7 @@
 		"SlashAtEnd/",
 	}
 	for i := 0; i < len(expected); i++ {
-		th.CheckEquals(t, expected[i], NormalizeURL(urls[i]))
+		th.CheckEquals(t, expected[i], gophercloud.NormalizeURL(urls[i]))
 	}
 
 }
@@ -36,49 +37,49 @@
 
 	rawPath := "template.yaml"
 	basePath, _ := filepath.Abs(".")
-	result, _ := NormalizePathURL(basePath, rawPath)
+	result, _ := gophercloud.NormalizePathURL(basePath, rawPath)
 	expected := strings.Join([]string{"file:/", filepath.ToSlash(baseDir), "template.yaml"}, "/")
 	th.CheckEquals(t, expected, result)
 
 	rawPath = "http://www.google.com"
 	basePath, _ = filepath.Abs(".")
-	result, _ = NormalizePathURL(basePath, rawPath)
+	result, _ = gophercloud.NormalizePathURL(basePath, rawPath)
 	expected = "http://www.google.com"
 	th.CheckEquals(t, expected, result)
 
 	rawPath = "very/nested/file.yaml"
 	basePath, _ = filepath.Abs(".")
-	result, _ = NormalizePathURL(basePath, rawPath)
+	result, _ = gophercloud.NormalizePathURL(basePath, rawPath)
 	expected = strings.Join([]string{"file:/", filepath.ToSlash(baseDir), "very/nested/file.yaml"}, "/")
 	th.CheckEquals(t, expected, result)
 
 	rawPath = "very/nested/file.yaml"
 	basePath = "http://www.google.com"
-	result, _ = NormalizePathURL(basePath, rawPath)
+	result, _ = gophercloud.NormalizePathURL(basePath, rawPath)
 	expected = "http://www.google.com/very/nested/file.yaml"
 	th.CheckEquals(t, expected, result)
 
 	rawPath = "very/nested/file.yaml/"
 	basePath = "http://www.google.com/"
-	result, _ = NormalizePathURL(basePath, rawPath)
+	result, _ = gophercloud.NormalizePathURL(basePath, rawPath)
 	expected = "http://www.google.com/very/nested/file.yaml"
 	th.CheckEquals(t, expected, result)
 
 	rawPath = "very/nested/file.yaml"
 	basePath = "http://www.google.com/even/more"
-	result, _ = NormalizePathURL(basePath, rawPath)
+	result, _ = gophercloud.NormalizePathURL(basePath, rawPath)
 	expected = "http://www.google.com/even/more/very/nested/file.yaml"
 	th.CheckEquals(t, expected, result)
 
 	rawPath = "very/nested/file.yaml"
 	basePath = strings.Join([]string{"file:/", filepath.ToSlash(baseDir), "only/file/even/more"}, "/")
-	result, _ = NormalizePathURL(basePath, rawPath)
+	result, _ = gophercloud.NormalizePathURL(basePath, rawPath)
 	expected = strings.Join([]string{"file:/", filepath.ToSlash(baseDir), "only/file/even/more/very/nested/file.yaml"}, "/")
 	th.CheckEquals(t, expected, result)
 
 	rawPath = "very/nested/file.yaml/"
 	basePath = strings.Join([]string{"file:/", filepath.ToSlash(baseDir), "only/file/even/more"}, "/")
-	result, _ = NormalizePathURL(basePath, rawPath)
+	result, _ = gophercloud.NormalizePathURL(basePath, rawPath)
 	expected = strings.Join([]string{"file:/", filepath.ToSlash(baseDir), "only/file/even/more/very/nested/file.yaml"}, "/")
 	th.CheckEquals(t, expected, result)