move unit tests into 'testing' directories
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")
 }