diff --git a/acceptance/openstack/networking/v2/network_test.go b/acceptance/openstack/networking/v2/network_test.go
index fe0e7cb..9ec833d 100644
--- a/acceptance/openstack/networking/v2/network_test.go
+++ b/acceptance/openstack/networking/v2/network_test.go
@@ -1,21 +1,34 @@
-// +build acceptance networking
-
 package v2
 
 import (
 	"fmt"
+	"os"
 	"testing"
 
-	networking "github.com/rackspace/gophercloud/openstack/networking/v2"
+	"github.com/rackspace/gophercloud"
+	"github.com/rackspace/gophercloud/openstack"
 	"github.com/rackspace/gophercloud/openstack/networking/v2/networks"
 	"github.com/rackspace/gophercloud/openstack/utils"
 )
 
-var Client *networking.Client
+var Client *gophercloud.ServiceClient
 
-func NewClient() (*networking.Client, error) {
-	provider := gophercloud.AuthenticatedClient(utils.AuthOptions())
+func NewClient() (*gophercloud.ServiceClient, error) {
+	opts, err := utils.AuthOptions()
+	if err != nil {
+		return nil, err
+	}
 
+	provider, err := openstack.AuthenticatedClient(opts)
+	if err != nil {
+		return nil, err
+	}
+
+	eo := gophercloud.EndpointOpts{
+		Type:   "network",
+		Name:   "neutron",
+		Region: os.Getenv("OS_REGION_NAME"),
+	}
 	url, err := provider.EndpointLocator(eo)
 	if err != nil {
 		return nil, err
@@ -25,7 +38,7 @@
 }
 
 func Setup() {
-	client, err = NewClient()
+	client, err := NewClient()
 	if err != nil {
 		fmt.Println("Client failed to load")
 		return
@@ -60,37 +73,37 @@
 }
 
 func TestGetApiInfo(t *testing.T) {
-	networks.ApiInfo()
+	//networks.ApiInfo()
 }
 
 func TestListExts(t *testing.T) {
-	networks.Extensions()
+	//networks.Extensions()
 }
 
 func TestGetExt(t *testing.T) {
-	networks.Extension()
+	//networks.Extension()
 }
 
 func TestListNetworks(t *testing.T) {
-	networks.List()
+	//networks.List()
 }
 
 func TestGetNetwork(t *testing.T) {
-	networks.Get()
+	//networks.Get()
 }
 
 func TestCreateNetwork(t *testing.T) {
-	networks.Create()
+	//networks.Create()
 }
 
 func TestCreateMultipleNetworks(t *testing.T) {
-	networks.CreateMany()
+	//networks.CreateMany()
 }
 
 func TestUpdateNetwork(t *testing.T) {
-	networks.Update()
+	//networks.Update()
 }
 
 func TestDeleteNetwork(t *testing.T) {
-	networks.Delete()
+	//networks.Delete()
 }
diff --git a/openstack/networking/v2/client.go b/openstack/networking/v2/client.go
deleted file mode 100644
index 4b37bd1..0000000
--- a/openstack/networking/v2/client.go
+++ /dev/null
@@ -1,96 +0,0 @@
-package v2
-
-import (
-	"fmt"
-
-	identity "github.com/rackspace/gophercloud/openstack/identity/v2"
-)
-
-// Client is a structure that contains information for communicating with a provider.
-type Client struct {
-	endpoint  string
-	authority identity.AuthResults
-	options   identity.AuthOptions
-	token     *identity.Token
-}
-
-// NewClient creates and returns a *Client.
-func NewClient(e string, a identity.AuthResults, o identity.AuthOptions) *Client {
-	return &Client{
-		endpoint:  e,
-		authority: a,
-		options:   o,
-	}
-}
-
-// ListNetworksURL returns the URL for listing networks available to the tenant.
-func (c *Client) ListNetworksURL() string {
-	return fmt.Sprintf("%sv2.0/networks", c.endpoint)
-}
-
-// CreateNetworkURL returns the URL for creating a network.
-func (c *Client) CreateNetworkURL() string {
-	return c.ListNetworksURL()
-}
-
-// GetNetworkURL returns the URL for showing information for the network with the given id.
-func (c *Client) GetNetworkURL(id string) string {
-	return fmt.Sprintf("%sv2.0/networks/%s", c.endpoint, id)
-}
-
-// UpdateNetworkURL returns the URL for updating information for the network with the given id.
-func (c *Client) UpdateNetworkURL(id string) string {
-	return c.GetNetworkURL(id)
-}
-
-// DeleteNetworkURL returns the URL for deleting the network with the given id.
-func (c *Client) DeleteNetworkURL(id string) string {
-	return c.GetNetworkURL(id)
-}
-
-func (c *Client) ListSubnetsURL() string {
-	return fmt.Sprintf("%sv2.0/subnets", c.endpoint)
-}
-
-func (c *Client) CreateSubnetURL() string {
-	return c.ListSubnetsURL()
-}
-
-func (c *Client) DeleteSubnetURL(id string) string {
-	return fmt.Sprintf("%sv2.0/subnets/%s", c.endpoint, id)
-}
-
-func (c *Client) GetSubnetURL(id string) string {
-	return c.DeleteSubnetURL(id)
-}
-
-func (c *Client) UpdateSubnetURL(id string) string {
-	return c.DeleteSubnetURL(id)
-}
-
-// GetHeaders is a function that gets the header for token authentication against a client's endpoint.
-// This function is exported to allow the subpackages to use it. It is not meant for public consumption.
-func (c *Client) GetHeaders() (map[string]string, error) {
-	t, err := c.getAuthToken()
-	if err != nil {
-		return map[string]string{}, err
-	}
-
-	return map[string]string{
-		"X-Auth-Token": t,
-	}, nil
-}
-
-// getAuthToken is a function that tries to retrieve an authentication token from a client's endpoint.
-func (c *Client) getAuthToken() (string, error) {
-	var err error
-
-	if c.token == nil {
-		c.token, err = identity.GetToken(c.authority)
-		if err != nil {
-			return "", err
-		}
-	}
-
-	return c.token.Id, err
-}
diff --git a/openstack/networking/v2/networks/requests.go b/openstack/networking/v2/networks/requests.go
index b74608b..da97f56 100644
--- a/openstack/networking/v2/networks/requests.go
+++ b/openstack/networking/v2/networks/requests.go
@@ -1,5 +1,10 @@
 package networks
 
+import (
+	"github.com/racker/perigee"
+	"github.com/rackspace/gophercloud"
+)
+
 // User-defined options sent to the API when creating or updating a network.
 type NetworkOpts struct {
 	// The administrative state of the network, which is up (true) or down (false).
@@ -15,3 +20,19 @@
 	// own. You cannot change this value through authorization policies.
 	TenantID string `json:"tenant_id"`
 }
+
+func APIVersions(c *gophercloud.ServiceClient) (*APIVersionsList, error) {
+	url := APIVersionsURL(c)
+
+	var resp APIVersionsList
+	_, err := perigee.Request("GET", url, perigee.Options{
+		MoreHeaders: c.Provider.AuthenticatedHeaders(),
+		Results:     &resp,
+		OkCodes:     []int{200},
+	})
+	if err != nil {
+		return nil, err
+	}
+
+	return &resp, nil
+}
diff --git a/openstack/networking/v2/networks/requests_test.go b/openstack/networking/v2/networks/requests_test.go
index 083ca59..fe11a93 100644
--- a/openstack/networking/v2/networks/requests_test.go
+++ b/openstack/networking/v2/networks/requests_test.go
@@ -1,8 +1,13 @@
 package networks
 
 import (
+	"fmt"
+	"net/http"
+	"reflect"
+	"testing"
+
 	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/testhelper"
+	th "github.com/rackspace/gophercloud/testhelper"
 )
 
 const TokenID = "123"
@@ -12,6 +17,57 @@
 		Provider: &gophercloud.ProviderClient{
 			TokenID: TokenID,
 		},
-		Endpoint: testhelper.Endpoint(),
+		Endpoint: th.Endpoint(),
+	}
+}
+
+func TestListAPIVersions(t *testing.T) {
+	th.SetupHTTP()
+	defer th.TeardownHTTP()
+
+	th.Mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
+		th.TestMethod(t, r, "GET")
+		th.TestHeader(t, r, "X-Auth-Token", TokenID)
+
+		w.Header().Add("Content-Type", "application/json")
+		w.WriteHeader(http.StatusOK)
+
+		fmt.Fprintf(w, `
+{
+    "versions": [
+        {
+            "status": "CURRENT",
+            "id": "v2.0",
+            "links": [
+                {
+                    "href": "http://23.253.228.211:9696/v2.0",
+                    "rel": "self"
+                }
+            ]
+        }
+    ]
+}`)
+	})
+
+	c := ServiceClient()
+
+	res, err := APIVersions(c)
+	if err != nil {
+		t.Fatalf("Error listing API versions: %v", err)
+	}
+
+	coll, err := gophercloud.AllPages(res)
+
+	actual := ToAPIVersions(coll)
+
+	expected := []APIVersion{
+		APIVersion{
+			Status: "CURRENT",
+			ID:     "v2.0",
+		},
+	}
+
+	if !reflect.DeepEqual(expected, actual) {
+		t.Errorf("Expected %#v, got %#v", expected, actual)
 	}
 }
diff --git a/openstack/networking/v2/networks/results.go b/openstack/networking/v2/networks/results.go
index dddeed7..eabf6bc 100644
--- a/openstack/networking/v2/networks/results.go
+++ b/openstack/networking/v2/networks/results.go
@@ -1,5 +1,12 @@
 package networks
 
+import (
+	"fmt"
+
+	"github.com/mitchellh/mapstructure"
+	"github.com/rackspace/gophercloud"
+)
+
 // A Network represents a a virtual layer-2 broadcast domain.
 type Network struct {
 	// Id is the unique identifier for the network.
@@ -25,3 +32,51 @@
 	// ProviderSegmentationId is the provider network identifier (such as the vlan id).
 	ProviderSegmentationId string `json:"provider:segmentation_id"`
 }
+
+type APIVersion struct {
+	Status string
+	ID     string
+}
+
+type APIVersionsList struct {
+	gophercloud.PaginationLinks `json:"links"`
+	Client                      *gophercloud.ServiceClient
+	APIVersions                 []APIVersion `json:"versions"`
+}
+
+func (list APIVersionsList) Pager() gophercloud.Pager {
+	return gophercloud.NewLinkPager(list)
+}
+
+func (list APIVersionsList) Concat(other gophercloud.Collection) gophercloud.Collection {
+	return APIVersionsList{
+		Client:      list.Client,
+		APIVersions: append(list.APIVersions, ToAPIVersions(other)...),
+	}
+}
+
+func (list APIVersionsList) Service() *gophercloud.ServiceClient {
+	return list.Client
+}
+
+func (list APIVersionsList) Links() gophercloud.PaginationLinks {
+	return list.PaginationLinks
+}
+
+func (list APIVersionsList) Interpret(json interface{}) (gophercloud.LinkCollection, error) {
+	mapped, ok := json.(map[string]interface{})
+	if !ok {
+		return nil, fmt.Errorf("Unexpected JSON response: %#v", json)
+	}
+
+	var result APIVersionsList
+	err := mapstructure.Decode(mapped, &result)
+	if err != nil {
+		return nil, err
+	}
+	return result, nil
+}
+
+func ToAPIVersions(results gophercloud.Collection) []APIVersion {
+	return results.(*APIVersionsList).APIVersions
+}
diff --git a/openstack/networking/v2/networks/results_test.go b/openstack/networking/v2/networks/results_test.go
deleted file mode 100644
index e69de29..0000000
--- a/openstack/networking/v2/networks/results_test.go
+++ /dev/null
diff --git a/openstack/networking/v2/networks/urls.go b/openstack/networking/v2/networks/urls.go
index e69de29..012e486 100644
--- a/openstack/networking/v2/networks/urls.go
+++ b/openstack/networking/v2/networks/urls.go
@@ -0,0 +1,9 @@
+package networks
+
+import (
+	"github.com/rackspace/gophercloud"
+)
+
+func APIVersionsURL(c *gophercloud.ServiceClient) string {
+	return c.ServiceURL("")
+}
diff --git a/openstack/networking/v2/networks/urls_test.go b/openstack/networking/v2/networks/urls_test.go
index e69de29..87ae69e 100644
--- a/openstack/networking/v2/networks/urls_test.go
+++ b/openstack/networking/v2/networks/urls_test.go
@@ -0,0 +1,18 @@
+package networks
+
+import (
+	"testing"
+
+	"github.com/rackspace/gophercloud"
+)
+
+const Endpoint = "http://localhost:57909/v3/"
+
+func TestAPIVersionsURL(t *testing.T) {
+	client := gophercloud.ServiceClient{Endpoint: Endpoint}
+	actual := APIVersionsURL(&client)
+	expected := Endpoint
+	if expected != actual {
+		t.Errorf("[%s] does not match expected [%s]", actual, expected)
+	}
+}
