Adding ListAPIVersions operation
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)
+	}
+}