diff --git a/acceptance/00-authentication.go b/acceptance/00-authentication.go
deleted file mode 100644
index 6467203..0000000
--- a/acceptance/00-authentication.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// +build acceptance,old
-
-package main
-
-import (
-	"fmt"
-	"github.com/rackspace/gophercloud"
-	"os"
-	"strings"
-)
-
-func main() {
-	provider, username, _, apiKey := getCredentials()
-
-	if !strings.Contains(provider, "rackspace") {
-		fmt.Fprintf(os.Stdout, "Skipping test because provider doesn't support API_KEYs\n")
-		return
-	}
-
-	_, err := gophercloud.Authenticate(
-		provider,
-		gophercloud.AuthOptions{
-			Username: username,
-			ApiKey:   apiKey,
-		},
-	)
-	if err != nil {
-		panic(err)
-	}
-}
diff --git a/acceptance/01-authentication.go b/acceptance/01-authentication.go
deleted file mode 100644
index 5cc9d38..0000000
--- a/acceptance/01-authentication.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// +build acceptance,old
-
-package main
-
-import (
-	"github.com/rackspace/gophercloud"
-)
-
-func main() {
-	provider, username, password, _ := getCredentials()
-
-	_, err := gophercloud.Authenticate(
-		provider,
-		gophercloud.AuthOptions{
-			Username: username,
-			Password: password,
-		},
-	)
-	if err != nil {
-		panic(err)
-	}
-}
diff --git a/acceptance/02-list-servers.go b/acceptance/02-list-servers.go
deleted file mode 100644
index 772852e..0000000
--- a/acceptance/02-list-servers.go
+++ /dev/null
@@ -1,62 +0,0 @@
-// +build acceptance,old
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"github.com/rackspace/gophercloud"
-)
-
-var quiet = flag.Bool("quiet", false, "Quiet mode, for acceptance testing.  $? still indicates errors though.")
-
-func main() {
-	flag.Parse()
-
-	withIdentity(false, func(acc gophercloud.AccessProvider) {
-		withServerApi(acc, func(api gophercloud.CloudServersProvider) {
-			tryFullDetails(api)
-			tryLinksOnly(api)
-		})
-	})
-}
-
-func tryLinksOnly(api gophercloud.CloudServersProvider) {
-	servers, err := api.ListServersLinksOnly()
-	if err != nil {
-		panic(err)
-	}
-
-	if !*quiet {
-		fmt.Println("Id,Name")
-		for _, s := range servers {
-			if s.AccessIPv4 != "" {
-				panic("IPv4 not expected")
-			}
-
-			if s.Status != "" {
-				panic("Status not expected")
-			}
-
-			if s.Progress != 0 {
-				panic("Progress not expected")
-			}
-
-			fmt.Printf("%s,\"%s\"\n", s.Id, s.Name)
-		}
-	}
-}
-
-func tryFullDetails(api gophercloud.CloudServersProvider) {
-	servers, err := api.ListServers()
-	if err != nil {
-		panic(err)
-	}
-
-	if !*quiet {
-		fmt.Println("Id,Name,AccessIPv4,Status,Progress")
-		for _, s := range servers {
-			fmt.Printf("%s,\"%s\",%s,%s,%d\n", s.Id, s.Name, s.AccessIPv4, s.Status, s.Progress)
-		}
-	}
-}
diff --git a/acceptance/03-get-server-details.go b/acceptance/03-get-server-details.go
deleted file mode 100644
index 01140a9..0000000
--- a/acceptance/03-get-server-details.go
+++ /dev/null
@@ -1,134 +0,0 @@
-// +build acceptance,old
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"github.com/rackspace/gophercloud"
-	"os"
-	"github.com/racker/perigee"
-)
-
-var id = flag.String("i", "", "Server ID to get info on.  Defaults to first server in your account if unspecified.")
-var rgn = flag.String("r", "", "Datacenter region.  Leave blank for default region.")
-var quiet = flag.Bool("quiet", false, "Run quietly, for acceptance testing.  $? non-zero if issue.")
-
-func main() {
-	flag.Parse()
-
-	resultCode := 0
-	withIdentity(false, func(auth gophercloud.AccessProvider) {
-		withServerApi(auth, func(servers gophercloud.CloudServersProvider) {
-			var (
-				err              error
-				serverId         string
-				deleteAfterwards bool
-			)
-
-			// Figure out which server to provide server details for.
-			if *id == "" {
-				deleteAfterwards, serverId, err = locateAServer(servers)
-				if err != nil {
-					panic(err)
-				}
-				if deleteAfterwards {
-					defer servers.DeleteServerById(serverId)
-				}
-			} else {
-				serverId = *id
-			}
-
-			// Grab server details by ID, and provide a report.
-			s, err := servers.ServerById(serverId)
-			if err != nil {
-				panic(err)
-			}
-
-			configs := []string{
-				"Access IPv4: %s\n",
-				"Access IPv6: %s\n",
-				"    Created: %s\n",
-				"     Flavor: %s\n",
-				"    Host ID: %s\n",
-				"         ID: %s\n",
-				"      Image: %s\n",
-				"       Name: %s\n",
-				"   Progress: %s\n",
-				"     Status: %s\n",
-				"  Tenant ID: %s\n",
-				"    Updated: %s\n",
-				"    User ID: %s\n",
-			}
-
-			values := []string{
-				s.AccessIPv4,
-				s.AccessIPv6,
-				s.Created,
-				s.Flavor.Id,
-				s.HostId,
-				s.Id,
-				s.Image.Id,
-				s.Name,
-				fmt.Sprintf("%d", s.Progress),
-				s.Status,
-				s.TenantId,
-				s.Updated,
-				s.UserId,
-			}
-
-			if !*quiet {
-				fmt.Println("Server info:")
-				for i, _ := range configs {
-					fmt.Printf(configs[i], values[i])
-				}
-			}
-		})
-
-		// Negative test -- We should absolutely never panic for a server that doesn't exist.
-		withServerApi(auth, func(servers gophercloud.CloudServersProvider) {
-			_, err := servers.ServerById(randomString("garbage", 32))
-			if err == nil {
-				fmt.Printf("Expected a 404 response when looking for a server known not to exist\n")
-				resultCode = 1
-			}
-			perigeeError, ok := err.(*perigee.UnexpectedResponseCodeError)
-			if !ok {
-				fmt.Printf("Unexpected error type\n")
-				resultCode = 1
-			} else {
-				if perigeeError.Actual != 404 {
-					fmt.Printf("Expected a 404 error code\n")
-				}
-			}
-		})
-	})
-	os.Exit(resultCode)
-}
-
-// locateAServer queries the set of servers owned by the user.  If at least one
-// exists, the first found is picked, and its ID is returned.  Otherwise, a new
-// server will be created, and its ID returned.
-//
-// deleteAfter will be true if the caller should schedule a call to DeleteServerById()
-// to clean up.
-func locateAServer(servers gophercloud.CloudServersProvider) (deleteAfter bool, id string, err error) {
-	ss, err := servers.ListServers()
-	if err != nil {
-		return false, "", err
-	}
-
-	if len(ss) > 0 {
-		// We could just cheat and dump the server details from ss[0].
-		// But, that tests ListServers(), and not ServerById().  So, we
-		// elect not to cheat.
-		return false, ss[0].Id, nil
-	}
-
-	serverId, err := createServer(servers, "", "", "", "")
-	if err != nil {
-		return false, "", err
-	}
-	err = waitForServerState(servers, serverId, "ACTIVE")
-	return true, serverId, err
-}
diff --git a/acceptance/04-create-server.go b/acceptance/04-create-server.go
deleted file mode 100644
index 03fd606..0000000
--- a/acceptance/04-create-server.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// +build acceptance,old
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"github.com/rackspace/gophercloud"
-)
-
-var region, serverName, imageRef, flavorRef *string
-var adminPass = flag.String("a", "", "Administrator password (auto-assigned if none)")
-var quiet = flag.Bool("quiet", false, "Quiet mode for acceptance tests.  $? non-zero if error.")
-
-func configure() {
-	region = flag.String("r", "", "Region in which to create the server.  Leave blank for provider-default region.")
-	serverName = flag.String("n", randomString("ACPTTEST--", 16), "Server name (what you see in the control panel)")
-	imageRef = flag.String("i", "", "ID of image to deploy onto the server")
-	flavorRef = flag.String("f", "", "Flavor of server to deploy image upon")
-
-	flag.Parse()
-}
-
-func main() {
-	configure()
-
-	withIdentity(false, func(auth gophercloud.AccessProvider) {
-		withServerApi(auth, func(servers gophercloud.CloudServersProvider) {
-			_, err := createServer(servers, *imageRef, *flavorRef, *serverName, *adminPass)
-			if err != nil {
-				panic(err)
-			}
-
-			allServers, err := servers.ListServers()
-			if err != nil {
-				panic(err)
-			}
-
-			if !*quiet {
-				fmt.Printf("ID,Name,Status,Progress\n")
-				for _, i := range allServers {
-					fmt.Printf("%s,\"%s\",%s,%d\n", i.Id, i.Name, i.Status, i.Progress)
-				}
-			}
-		})
-	})
-}
diff --git a/acceptance/05-list-images.go b/acceptance/05-list-images.go
deleted file mode 100644
index 5ead18b..0000000
--- a/acceptance/05-list-images.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// +build acceptance,old
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"github.com/rackspace/gophercloud"
-)
-
-var quiet = flag.Bool("quiet", false, "Quiet mode for acceptance testing.  $? non-zero on error though.")
-var rgn = flag.String("r", "", "Datacenter region to interrogate.  Leave blank for provider-default region.")
-
-func main() {
-	flag.Parse()
-
-	withIdentity(false, func(auth gophercloud.AccessProvider) {
-		withServerApi(auth, func(servers gophercloud.CloudServersProvider) {
-			images, err := servers.ListImages()
-			if err != nil {
-				panic(err)
-			}
-
-			if !*quiet {
-				fmt.Println("ID,Name,MinRam,MinDisk")
-				for _, image := range images {
-					fmt.Printf("%s,\"%s\",%d,%d\n", image.Id, image.Name, image.MinRam, image.MinDisk)
-				}
-			}
-		})
-	})
-}
diff --git a/acceptance/06-list-flavors.go b/acceptance/06-list-flavors.go
deleted file mode 100644
index 65db7da..0000000
--- a/acceptance/06-list-flavors.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// +build acceptance,old
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"github.com/rackspace/gophercloud"
-)
-
-var quiet = flag.Bool("quiet", false, "Quiet mode for acceptance testing.  $? non-zero on error though.")
-var rgn = flag.String("r", "", "Datacenter region to interrogate.  Leave blank for provider-default region.")
-
-func main() {
-	flag.Parse()
-
-	withIdentity(false, func(auth gophercloud.AccessProvider) {
-		withServerApi(auth, func(servers gophercloud.CloudServersProvider) {
-			flavors, err := servers.ListFlavors()
-			if err != nil {
-				panic(err)
-			}
-
-			if !*quiet {
-				fmt.Println("ID,Name,MinRam,MinDisk")
-				for _, f := range flavors {
-					fmt.Printf("%s,\"%s\",%d,%d\n", f.Id, f.Name, f.Ram, f.Disk)
-				}
-			}
-		})
-	})
-}
diff --git a/acceptance/07-change-admin-password.go b/acceptance/07-change-admin-password.go
deleted file mode 100644
index 880fbe8..0000000
--- a/acceptance/07-change-admin-password.go
+++ /dev/null
@@ -1,49 +0,0 @@
-// +build acceptance,old
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"github.com/rackspace/gophercloud"
-)
-
-var quiet = flag.Bool("quiet", false, "Quiet mode, for acceptance testing.  $? still indicates errors though.")
-var serverId = flag.String("i", "", "ID of server whose admin password is to be changed.")
-var newPass = flag.String("p", "", "New password for the server.")
-
-func main() {
-	flag.Parse()
-
-	withIdentity(false, func(acc gophercloud.AccessProvider) {
-		withServerApi(acc, func(api gophercloud.CloudServersProvider) {
-			// If user doesn't explicitly provide a server ID, create one dynamically.
-			if *serverId == "" {
-				var err error
-				*serverId, err = createServer(api, "", "", "", "")
-				if err != nil {
-					panic(err)
-				}
-				waitForServerState(api, *serverId, "ACTIVE")
-			}
-
-			// If no password is provided, create one dynamically.
-			if *newPass == "" {
-				*newPass = randomString("", 16)
-			}
-
-			// Submit the request for changing the admin password.
-			// Note that we don't verify this actually completes;
-			// doing so is beyond the scope of the SDK, and should be
-			// the responsibility of your specific OpenStack provider.
-			err := api.SetAdminPassword(*serverId, *newPass)
-			if err != nil {
-				panic(err)
-			}
-
-			if !*quiet {
-				fmt.Println("Password change request submitted.")
-			}
-		})
-	})
-}
diff --git a/acceptance/08-reauthentication.go b/acceptance/08-reauthentication.go
deleted file mode 100644
index c46f5bb..0000000
--- a/acceptance/08-reauthentication.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// +build acceptance,old
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"github.com/rackspace/gophercloud"
-)
-
-var quiet = flag.Bool("quiet", false, "Quiet mode for acceptance testing.  $? non-zero on error though.")
-var rgn = flag.String("r", "", "Datacenter region to interrogate.  Leave blank for provider-default region.")
-
-func main() {
-	flag.Parse()
-
-	// Invoke withIdentity such that re-auth is enabled.
-	withIdentity(true, func(auth gophercloud.AccessProvider) {
-		token1 := auth.AuthToken()
-
-		withServerApi(auth, func(servers gophercloud.CloudServersProvider) {
-			// Just to confirm everything works, we should be able to list images without error.
-			_, err := servers.ListImages()
-			if err != nil {
-				panic(err)
-			}
-
-			// Revoke our current authentication token.
-			auth.Revoke(auth.AuthToken())
-
-			// Attempt to list images again.  This should _succeed_, because we enabled re-authentication.
-			_, err = servers.ListImages()
-			if err != nil {
-				panic(err)
-			}
-
-			// However, our new authentication token should differ.
-			token2 := auth.AuthToken()
-
-			if !*quiet {
-				fmt.Println("Old authentication token: ", token1)
-				fmt.Println("New authentication token: ", token2)
-			}
-
-			if token1 == token2 {
-				panic("Tokens should differ")
-			}
-		})
-	})
-}
diff --git a/acceptance/09-resize-server.go b/acceptance/09-resize-server.go
deleted file mode 100644
index a2ef3c8..0000000
--- a/acceptance/09-resize-server.go
+++ /dev/null
@@ -1,102 +0,0 @@
-// +build acceptance,old
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"github.com/rackspace/gophercloud"
-	"time"
-)
-
-var quiet = flag.Bool("quiet", false, "Quiet mode, for acceptance testing.  $? still indicates errors though.")
-
-func main() {
-	flag.Parse()
-
-	withIdentity(false, func(acc gophercloud.AccessProvider) {
-		withServerApi(acc, func(api gophercloud.CloudServersProvider) {
-			// These tests are going to take some time to complete.
-			// So, we'll do two tests at the same time to help amortize test time.
-			done := make(chan bool)
-			go resizeRejectTest(api, done)
-			go resizeAcceptTest(api, done)
-			_ = <-done
-			_ = <-done
-
-			if !*quiet {
-				fmt.Println("Done.")
-			}
-		})
-	})
-}
-
-// Perform the resize test, but reject the resize request.
-func resizeRejectTest(api gophercloud.CloudServersProvider, done chan bool) {
-	withServer(api, func(id string) {
-		newFlavorId := findAlternativeFlavor()
-		err := api.ResizeServer(id, randomString("ACPTTEST", 24), newFlavorId, "")
-		if err != nil {
-			panic(err)
-		}
-
-		waitForServerState(api, id, "VERIFY_RESIZE")
-
-		err = api.RevertResize(id)
-		if err != nil {
-			panic(err)
-		}
-	})
-	done <- true
-}
-
-// Perform the resize test, but accept the resize request.
-func resizeAcceptTest(api gophercloud.CloudServersProvider, done chan bool) {
-	withServer(api, func(id string) {
-		newFlavorId := findAlternativeFlavor()
-		err := api.ResizeServer(id, randomString("ACPTTEST", 24), newFlavorId, "")
-		if err != nil {
-			panic(err)
-		}
-
-		waitForServerState(api, id, "VERIFY_RESIZE")
-
-		err = api.ConfirmResize(id)
-		if err != nil {
-			panic(err)
-		}
-	})
-	done <- true
-}
-
-func withServer(api gophercloud.CloudServersProvider, f func(string)) {
-	id, err := createServer(api, "", "", "", "")
-	if err != nil {
-		panic(err)
-	}
-
-	for {
-		s, err := api.ServerById(id)
-		if err != nil {
-			panic(err)
-		}
-		if s.Status == "ACTIVE" {
-			break
-		}
-		time.Sleep(10 * time.Second)
-	}
-
-	f(id)
-
-	// I've learned that resizing an instance can fail if a delete request
-	// comes in prior to its completion.  This ends up leaving the server
-	// in an error state, and neither the resize NOR the delete complete.
-	// This is a bug in OpenStack, as far as I'm concerned, but thankfully,
-	// there's an easy work-around -- just wait for your server to return to
-	// active state first!
-	waitForServerState(api, id, "ACTIVE")
-	err = api.DeleteServerById(id)
-	if err != nil {
-		panic(err)
-	}
-}
diff --git a/acceptance/10-reboot-server.go b/acceptance/10-reboot-server.go
deleted file mode 100644
index ba6215a..0000000
--- a/acceptance/10-reboot-server.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// +build acceptance,old
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"github.com/rackspace/gophercloud"
-)
-
-var quiet = flag.Bool("quiet", false, "Quiet mode, for acceptance testing.  $? still indicates errors though.")
-
-func main() {
-	flag.Parse()
-
-	withIdentity(false, func(acc gophercloud.AccessProvider) {
-		withServerApi(acc, func(servers gophercloud.CloudServersProvider) {
-			log("Creating server")
-			serverId, err := createServer(servers, "", "", "", "")
-			if err != nil {
-				panic(err)
-			}
-			waitForServerState(servers, serverId, "ACTIVE")
-
-			log("Soft-rebooting server")
-			servers.RebootServer(serverId, false)
-			waitForServerState(servers, serverId, "REBOOT")
-			waitForServerState(servers, serverId, "ACTIVE")
-
-			log("Hard-rebooting server")
-			servers.RebootServer(serverId, true)
-			waitForServerState(servers, serverId, "HARD_REBOOT")
-			waitForServerState(servers, serverId, "ACTIVE")
-
-			log("Done")
-			servers.DeleteServerById(serverId)
-		})
-	})
-}
-
-func log(s string) {
-	if !*quiet {
-		fmt.Println(s)
-	}
-}
diff --git a/acceptance/11-rescue-unrescue-server.go b/acceptance/11-rescue-unrescue-server.go
deleted file mode 100644
index 008ad9d..0000000
--- a/acceptance/11-rescue-unrescue-server.go
+++ /dev/null
@@ -1,52 +0,0 @@
-// +build acceptance,old
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"github.com/rackspace/gophercloud"
-)
-
-var quiet = flag.Bool("quiet", false, "Quiet mode, for acceptance testing.  $? still indicates errors though.")
-
-func main() {
-	flag.Parse()
-	withIdentity(false, func(acc gophercloud.AccessProvider) {
-		withServerApi(acc, func(servers gophercloud.CloudServersProvider) {
-			log("Creating server")
-			id, err := createServer(servers, "", "", "", "")
-			if err != nil {
-				panic(err)
-			}
-			waitForServerState(servers, id, "ACTIVE")
-			defer servers.DeleteServerById(id)
-
-			log("Rescuing server")
-			adminPass, err := servers.RescueServer(id)
-			if err != nil {
-				panic(err)
-			}
-			log("  Admin password = " + adminPass)
-			if len(adminPass) < 1 {
-				panic("Empty admin password")
-			}
-			waitForServerState(servers, id, "RESCUE")
-
-			log("Unrescuing server")
-			err = servers.UnrescueServer(id)
-			if err != nil {
-				panic(err)
-			}
-			waitForServerState(servers, id, "ACTIVE")
-
-			log("Done")
-		})
-	})
-}
-
-func log(s string) {
-	if !*quiet {
-		fmt.Println(s)
-	}
-}
diff --git a/acceptance/12-update-server.go b/acceptance/12-update-server.go
deleted file mode 100644
index c0191f1..0000000
--- a/acceptance/12-update-server.go
+++ /dev/null
@@ -1,46 +0,0 @@
-// +build acceptance,old
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"github.com/rackspace/gophercloud"
-)
-
-var quiet = flag.Bool("quiet", false, "Quiet mode, for acceptance testing.  $? still indicates errors though.")
-
-func main() {
-	flag.Parse()
-	withIdentity(false, func(acc gophercloud.AccessProvider) {
-		withServerApi(acc, func(servers gophercloud.CloudServersProvider) {
-			log("Creating server")
-			id, err := createServer(servers, "", "", "", "")
-			if err != nil {
-				panic(err)
-			}
-			waitForServerState(servers, id, "ACTIVE")
-			defer servers.DeleteServerById(id)
-
-			log("Updating name of server")
-			newName := randomString("ACPTTEST", 32)
-			newDetails, err := servers.UpdateServer(id, gophercloud.NewServerSettings{
-				Name: newName,
-			})
-			if err != nil {
-				panic(err)
-			}
-			if newDetails.Name != newName {
-				panic("Name change didn't appear to take")
-			}
-
-			log("Done")
-		})
-	})
-}
-
-func log(s string) {
-	if !*quiet {
-		fmt.Println(s)
-	}
-}
diff --git a/acceptance/13-rebuild-server.go b/acceptance/13-rebuild-server.go
deleted file mode 100644
index ae7e19f..0000000
--- a/acceptance/13-rebuild-server.go
+++ /dev/null
@@ -1,46 +0,0 @@
-// +build acceptance,old
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"github.com/rackspace/gophercloud"
-)
-
-var quiet = flag.Bool("quiet", false, "Quiet mode, for acceptance testing.  $? still indicates errors though.")
-
-func main() {
-	flag.Parse()
-	withIdentity(false, func(acc gophercloud.AccessProvider) {
-		withServerApi(acc, func(servers gophercloud.CloudServersProvider) {
-			log("Creating server")
-			id, err := createServer(servers, "", "", "", "")
-			if err != nil {
-				panic(err)
-			}
-			waitForServerState(servers, id, "ACTIVE")
-			defer servers.DeleteServerById(id)
-
-			log("Rebuilding server")
-			newDetails, err := servers.RebuildServer(id, gophercloud.NewServer{
-				Name:      randomString("ACPTTEST", 32),
-				ImageRef:  findAlternativeImage(),
-				FlavorRef: findAlternativeFlavor(),
-				AdminPass: randomString("", 16),
-			})
-			if err != nil {
-				panic(err)
-			}
-			waitForServerState(servers, newDetails.Id, "ACTIVE")
-
-			log("Done")
-		})
-	})
-}
-
-func log(s string) {
-	if !*quiet {
-		fmt.Println(s)
-	}
-}
diff --git a/acceptance/14-list-addresses.go b/acceptance/14-list-addresses.go
deleted file mode 100644
index 1d7d26b..0000000
--- a/acceptance/14-list-addresses.go
+++ /dev/null
@@ -1,66 +0,0 @@
-// +build acceptance,old
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"github.com/rackspace/gophercloud"
-)
-
-var quiet = flag.Bool("quiet", false, "Quiet mode, for acceptance testing.  $? still indicates errors though.")
-
-func main() {
-	flag.Parse()
-	withIdentity(false, func(acc gophercloud.AccessProvider) {
-		withServerApi(acc, func(api gophercloud.CloudServersProvider) {
-			log("Creating server")
-			id, err := createServer(api, "", "", "", "")
-			if err != nil {
-				panic(err)
-			}
-			waitForServerState(api, id, "ACTIVE")
-			defer api.DeleteServerById(id)
-
-			tryAllAddresses(id, api)
-			tryAddressesByNetwork("private", id, api)
-
-			log("Done")
-		})
-	})
-}
-
-func tryAllAddresses(id string, api gophercloud.CloudServersProvider) {
-	log("Getting list of all addresses...")
-	addresses, err := api.ListAddresses(id)
-	if (err != nil) && (err != gophercloud.WarnUnauthoritative) {
-		panic(err)
-	}
-	if err == gophercloud.WarnUnauthoritative {
-		log("Uh oh -- got a response back, but it's not authoritative for some reason.")
-	}
-	if !*quiet {
-		fmt.Println("Addresses:")
-		fmt.Printf("%+v\n", addresses)
-	}
-}
-
-func tryAddressesByNetwork(networkLabel string, id string, api gophercloud.CloudServersProvider) {
-	log("Getting list of addresses on", networkLabel, "network...")
-	network, err := api.ListAddressesByNetwork(id, networkLabel)
-	if (err != nil) && (err != gophercloud.WarnUnauthoritative) {
-		panic(err)
-	}
-	if err == gophercloud.WarnUnauthoritative {
-		log("Uh oh -- got a response back, but it's not authoritative for some reason.")
-	}
-	for _, addr := range network[networkLabel] {
-		log("Address:", addr.Addr, "  IPv", addr.Version)
-	}
-}
-
-func log(s ...interface{}) {
-	if !*quiet {
-		fmt.Println(s...)
-	}
-}
diff --git a/acceptance/15-list-keypairs.go b/acceptance/15-list-keypairs.go
deleted file mode 100644
index 1a617ed..0000000
--- a/acceptance/15-list-keypairs.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// +build acceptance,old
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"github.com/rackspace/gophercloud"
-)
-
-var quiet = flag.Bool("quiet", false, "Quiet mode for acceptance testing.  $? non-zero on error though.")
-var rgn = flag.String("r", "", "Datacenter region to interrogate.  Leave blank for provider-default region.")
-
-func main() {
-	flag.Parse()
-
-	withIdentity(false, func(auth gophercloud.AccessProvider) {
-		withServerApi(auth, func(servers gophercloud.CloudServersProvider) {
-			keypairs, err := servers.ListKeyPairs()
-			if err != nil {
-				panic(err)
-			}
-
-			if !*quiet {
-				fmt.Println("name,fingerprint,publickey")
-				for _, key := range keypairs {
-					fmt.Printf("%s,%s,%s\n", key.Name, key.FingerPrint, key.PublicKey)
-				}
-			}
-		})
-	})
-}
diff --git a/acceptance/16-create-delete-keypair.go b/acceptance/16-create-delete-keypair.go
deleted file mode 100644
index f59e51c..0000000
--- a/acceptance/16-create-delete-keypair.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// +build acceptance,old
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"github.com/rackspace/gophercloud"
-)
-
-var quiet = flag.Bool("quiet", false, "Quiet mode for acceptance testing.  $? non-zero on error though.")
-var rgn = flag.String("r", "", "Datacenter region to interrogate.  Leave blank for provider-default region.")
-
-func main() {
-	flag.Parse()
-
-	withIdentity(false, func(auth gophercloud.AccessProvider) {
-		withServerApi(auth, func(servers gophercloud.CloudServersProvider) {
-			name := randomString("ACPTTEST", 16)
-			kp := gophercloud.NewKeyPair{
-				Name: name,
-			}
-			keypair, err := servers.CreateKeyPair(kp)
-			if err != nil {
-				panic(err)
-			}
-			if !*quiet {
-				fmt.Printf("%s,%s,%s\n", keypair.Name, keypair.FingerPrint, keypair.PublicKey)
-			}
-
-			keypair, err = servers.ShowKeyPair(name)
-			if err != nil {
-				panic(err)
-			}
-			if !*quiet {
-				fmt.Printf("%s,%s,%s\n", keypair.Name, keypair.FingerPrint, keypair.PublicKey)
-			}
-
-			err = servers.DeleteKeyPair(name)
-			if err != nil {
-				panic(err)
-			}
-		})
-	})
-}
diff --git a/acceptance/17-create-delete-image.go b/acceptance/17-create-delete-image.go
deleted file mode 100644
index b3d80a3..0000000
--- a/acceptance/17-create-delete-image.go
+++ /dev/null
@@ -1,52 +0,0 @@
-// +build acceptance,old
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"github.com/rackspace/gophercloud"
-)
-
-var quiet = flag.Bool("quiet", false, "Quiet mode for acceptance testing.  $? non-zero on error though.")
-var rgn = flag.String("r", "", "Datacenter region to interrogate.  Leave blank for provider-default region.")
-
-func main() {
-	flag.Parse()
-
-	withIdentity(false, func(auth gophercloud.AccessProvider) {
-		withServerApi(auth, func(servers gophercloud.CloudServersProvider) {
-			log("Creating server")
-			serverId, err := createServer(servers, "", "", "", "")
-			if err != nil {
-				panic(err)
-			}
-			waitForServerState(servers, serverId, "ACTIVE")
-
-			log("Creating image")
-			name := randomString("ACPTTEST", 16)
-			createImage := gophercloud.CreateImage{
-				Name: name,
-			}
-			imageId, err := servers.CreateImage(serverId, createImage)
-			if err != nil {
-				panic(err)
-			}
-			waitForImageState(servers, imageId, "ACTIVE")
-
-			log("Deleting server")
-			servers.DeleteServerById(serverId)
-
-			log("Deleting image")
-			servers.DeleteImageById(imageId)
-
-			log("Done")
-		})
-	})
-}
-
-func log(s string) {
-	if !*quiet {
-		fmt.Println(s)
-	}
-}
diff --git a/acceptance/18-osutil-authentication.go b/acceptance/18-osutil-authentication.go
deleted file mode 100644
index 01ff4e9..0000000
--- a/acceptance/18-osutil-authentication.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// +build acceptance,old
-
-package main
-
-import (
-	"github.com/rackspace/gophercloud"
-	"github.com/rackspace/gophercloud/osutil"
-)
-
-func main() {
-	provider, authOptions, err := osutil.AuthOptions()
-	if err != nil {
-		panic(err)
-	}
-	_, err = gophercloud.Authenticate(provider, authOptions)
-	if err != nil {
-		panic(err)
-	}
-}
diff --git a/acceptance/19-list-addresses-0.1.go b/acceptance/19-list-addresses-0.1.go
deleted file mode 100644
index d60557b..0000000
--- a/acceptance/19-list-addresses-0.1.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// +build acceptance,old
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"github.com/rackspace/gophercloud"
-)
-
-var quiet = flag.Bool("quiet", false, "Quiet mode, for acceptance testing.  $? still indicates errors though.")
-
-func main() {
-	flag.Parse()
-	withIdentity(false, func(acc gophercloud.AccessProvider) {
-		withServerApi(acc, func(api gophercloud.CloudServersProvider) {
-			log("Creating server")
-			id, err := createServer(api, "", "", "", "")
-			if err != nil {
-				panic(err)
-			}
-			waitForServerState(api, id, "ACTIVE")
-			defer api.DeleteServerById(id)
-
-			tryAllAddresses(id, api)
-
-			log("Done")
-		})
-	})
-}
-
-func tryAllAddresses(id string, api gophercloud.CloudServersProvider) {
-	log("Getting the server instance")
-	s, err := api.ServerById(id)
-	if err != nil {
-		panic(err)
-	}
-
-	log("Getting the complete set of pools")
-	ps, err := s.AllAddressPools()
-	if err != nil {
-		panic(err)
-	}
-
-	log("Listing IPs for each pool")
-	for k, v := range ps {
-		log(fmt.Sprintf("  Pool %s", k))
-		for _, a := range v {
-			log(fmt.Sprintf("    IP: %s, Version: %d", a.Addr, a.Version))
-		}
-	}
-}
-
-func log(s ...interface{}) {
-	if !*quiet {
-		fmt.Println(s...)
-	}
-}
diff --git a/acceptance/99-delete-server.go b/acceptance/99-delete-server.go
deleted file mode 100644
index 3e38ba4..0000000
--- a/acceptance/99-delete-server.go
+++ /dev/null
@@ -1,48 +0,0 @@
-// +build acceptance,old
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"github.com/rackspace/gophercloud"
-)
-
-var quiet = flag.Bool("quiet", false, "Quiet operation for acceptance tests.  $? non-zero if problem.")
-var region = flag.String("r", "", "Datacenter region.  Leave blank for provider-default region.")
-
-func main() {
-	flag.Parse()
-
-	withIdentity(false, func(auth gophercloud.AccessProvider) {
-		withServerApi(auth, func(servers gophercloud.CloudServersProvider) {
-			// Grab a listing of all servers.
-			ss, err := servers.ListServers()
-			if err != nil {
-				panic(err)
-			}
-
-			// And for each one that starts with the ACPTTEST prefix, delete it.
-			// These are likely left-overs from previously running acceptance tests.
-			// Note that 04-create-servers.go is intended to leak servers by intention,
-			// so as to test this code.  :)
-			n := 0
-			for _, s := range ss {
-				if len(s.Name) < 8 {
-					continue
-				}
-				if s.Name[0:8] == "ACPTTEST" {
-					err := servers.DeleteServerById(s.Id)
-					if err != nil {
-						panic(err)
-					}
-					n++
-				}
-			}
-
-			if !*quiet {
-				fmt.Printf("%d servers removed.\n", n)
-			}
-		})
-	})
-}
diff --git a/acceptance/libargs.go b/acceptance/libargs.go
deleted file mode 100644
index a9bb92f..0000000
--- a/acceptance/libargs.go
+++ /dev/null
@@ -1,208 +0,0 @@
-// +build acceptance,old
-
-package main
-
-import (
-	"crypto/rand"
-	"fmt"
-	"github.com/rackspace/gophercloud"
-	"os"
-	"strings"
-	"time"
-)
-
-// getCredentials will verify existence of needed credential information
-// provided through environment variables.  This function will not return
-// if at least one piece of required information is missing.
-func getCredentials() (provider, username, password, apiKey string) {
-	provider = os.Getenv("SDK_PROVIDER")
-	username = os.Getenv("SDK_USERNAME")
-	password = os.Getenv("SDK_PASSWORD")
-	apiKey = os.Getenv("SDK_API_KEY")
-
-	if (provider == "") || (username == "") || (password == "") {
-		fmt.Fprintf(os.Stderr, "One or more of the following environment variables aren't set:\n")
-		fmt.Fprintf(os.Stderr, "  SDK_PROVIDER=\"%s\"\n", provider)
-		fmt.Fprintf(os.Stderr, "  SDK_USERNAME=\"%s\"\n", username)
-		fmt.Fprintf(os.Stderr, "  SDK_PASSWORD=\"%s\"\n", password)
-		os.Exit(1)
-	}
-
-	return
-}
-
-// randomString generates a string of given length, but random content.
-// All content will be within the ASCII graphic character set.
-// (Implementation from Even Shaw's contribution on
-// http://stackoverflow.com/questions/12771930/what-is-the-fastest-way-to-generate-a-long-random-string-in-go).
-func randomString(prefix string, n int) string {
-	const alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
-	var bytes = make([]byte, n)
-	rand.Read(bytes)
-	for i, b := range bytes {
-		bytes[i] = alphanum[b%byte(len(alphanum))]
-	}
-	return prefix + string(bytes)
-}
-
-// aSuitableImage finds a minimal image for use in dynamically creating servers.
-// If none can be found, this function will panic.
-func aSuitableImage(api gophercloud.CloudServersProvider) string {
-	images, err := api.ListImages()
-	if err != nil {
-		panic(err)
-	}
-
-	// TODO(sfalvo):
-	// Works for Rackspace, might not work for your provider!
-	// Need to figure out why ListImages() provides 0 values for
-	// Ram and Disk fields.
-	//
-	// Until then, just return Ubuntu 12.04 LTS.
-	for i := 0; i < len(images); i++ {
-		if strings.Contains(images[i].Name, "Ubuntu 12.04 LTS") {
-			return images[i].Id
-		}
-	}
-	panic("Image for Ubuntu 12.04 LTS not found.")
-}
-
-// aSuitableFlavor finds the minimum flavor capable of running the test image
-// chosen by aSuitableImage.  If none can be found, this function will panic.
-func aSuitableFlavor(api gophercloud.CloudServersProvider) string {
-	flavors, err := api.ListFlavors()
-	if err != nil {
-		panic(err)
-	}
-
-	// TODO(sfalvo):
-	// Works for Rackspace, might not work for your provider!
-	// Need to figure out why ListFlavors() provides 0 values for
-	// Ram and Disk fields.
-	//
-	// Until then, just return Ubuntu 12.04 LTS.
-	for i := 0; i < len(flavors); i++ {
-		if flavors[i].Id == "2" {
-			return flavors[i].Id
-		}
-	}
-	panic("Flavor 2 (512MB 1-core 20GB machine) not found.")
-}
-
-// createServer creates a new server in a manner compatible with acceptance testing.
-// In particular, it ensures that the name of the server always starts with "ACPTTEST--",
-// which the delete servers acceptance test relies on to identify servers to delete.
-// Passing in empty image and flavor references will force the use of reasonable defaults.
-// An empty name string will result in a dynamically created name prefixed with "ACPTTEST--".
-// A blank admin password will cause a password to be automatically generated; however,
-// at present no means of recovering this password exists, as no acceptance tests yet require
-// this data.
-func createServer(servers gophercloud.CloudServersProvider, imageRef, flavorRef, name, adminPass string) (string, error) {
-	if imageRef == "" {
-		imageRef = aSuitableImage(servers)
-	}
-
-	if flavorRef == "" {
-		flavorRef = aSuitableFlavor(servers)
-	}
-
-	if len(name) < 1 {
-		name = randomString("ACPTTEST", 16)
-	}
-
-	if (len(name) < 8) || (name[0:8] != "ACPTTEST") {
-		name = fmt.Sprintf("ACPTTEST--%s", name)
-	}
-
-	newServer, err := servers.CreateServer(gophercloud.NewServer{
-		Name:      name,
-		ImageRef:  imageRef,
-		FlavorRef: flavorRef,
-		AdminPass: adminPass,
-	})
-
-	if err != nil {
-		return "", err
-	}
-
-	return newServer.Id, nil
-}
-
-// findAlternativeFlavor locates a flavor to resize a server to.  It is guaranteed to be different
-// than what aSuitableFlavor() returns.  If none could be found, this function will panic.
-func findAlternativeFlavor() string {
-	return "3" // 1GB image, up from 512MB image
-}
-
-// findAlternativeImage locates an image to resize or rebuild a server with.  It is guaranteed to be
-// different than what aSuitableImage() returns.  If none could be found, this function will panic.
-func findAlternativeImage() string {
-	return "c6f9c411-e708-4952-91e5-62ded5ea4d3e"
-}
-
-// withIdentity authenticates the user against the provider's identity service, and provides an
-// accessor for additional services.
-func withIdentity(ar bool, f func(gophercloud.AccessProvider)) {
-	provider, username, password, _ := getCredentials()
-	acc, err := gophercloud.Authenticate(
-		provider,
-		gophercloud.AuthOptions{
-			Username:    username,
-			Password:    password,
-			AllowReauth: ar,
-		},
-	)
-	if err != nil {
-		panic(err)
-	}
-
-	f(acc)
-}
-
-// withServerApi acquires the cloud servers API.
-func withServerApi(acc gophercloud.AccessProvider, f func(gophercloud.CloudServersProvider)) {
-	api, err := gophercloud.ServersApi(acc, gophercloud.ApiCriteria{
-		Name:      "cloudServersOpenStack",
-		VersionId: "2",
-		UrlChoice: gophercloud.PublicURL,
-	})
-	if err != nil {
-		panic(err)
-	}
-
-	f(api)
-}
-
-// waitForServerState polls, every 10 seconds, for a given server to appear in the indicated state.
-// This call will block forever if it never appears in the desired state, so if a timeout is required,
-// make sure to call this function in a goroutine.
-func waitForServerState(api gophercloud.CloudServersProvider, id, state string) error {
-	for {
-		s, err := api.ServerById(id)
-		if err != nil {
-			return err
-		}
-		if s.Status == state {
-			return nil
-		}
-		time.Sleep(10 * time.Second)
-	}
-	panic("Impossible")
-}
-
-// waitForImageState polls, every 10 seconds, for a given image to appear in the indicated state.
-// This call will block forever if it never appears in the desired state, so if a timeout is required,
-// make sure to call this function in a goroutine.
-func waitForImageState(api gophercloud.CloudServersProvider, id, state string) error {
-	for {
-		s, err := api.ImageById(id)
-		if err != nil {
-			return err
-		}
-		if s.Status == state {
-			return nil
-		}
-		time.Sleep(10 * time.Second)
-	}
-	panic("Impossible")
-}
diff --git a/api_fetch.go b/api_fetch.go
deleted file mode 100644
index 353df75..0000000
--- a/api_fetch.go
+++ /dev/null
@@ -1,42 +0,0 @@
-package gophercloud
-
-import (
-	"github.com/mitchellh/mapstructure"
-)
-
-//The default generic openstack api
-var OpenstackApi = map[string]interface{}{
-        "Name":      "nova",
-	"UrlChoice": PublicURL,
-}
-
-// Api for use with rackspace
-var RackspaceApi = map[string]interface{}{
-	"Name":      "cloudServersOpenStack",
-	"VersionId": "2",
-	"UrlChoice": PublicURL,
-}
-
-//Populates an ApiCriteria struct with the api values
-//from one of the api maps
-func PopulateApi(variant string) (ApiCriteria, error) {
-	var Api ApiCriteria
-	var variantMap map[string]interface{}
-
-	switch variant {
-	case "":
-		variantMap = OpenstackApi
-
-	case "openstack":
-		variantMap = OpenstackApi
-
-	case "rackspace":
-		variantMap = RackspaceApi
-	}
-
-	err := mapstructure.Decode(variantMap, &Api)
-	if err != nil {
-		return Api, err
-	}
-	return Api, err
-}
diff --git a/authenticate.go b/authenticate.go
deleted file mode 100644
index ff609aa..0000000
--- a/authenticate.go
+++ /dev/null
@@ -1,257 +0,0 @@
-package gophercloud
-
-import (
-	"fmt"
-	"github.com/racker/perigee"
-)
-
-// AuthOptions lets anyone calling Authenticate() supply the required access credentials.
-// At present, only Identity V2 API support exists; therefore, only Username, Password,
-// and optionally, TenantId are provided.  If future Identity API versions become available,
-// alternative fields unique to those versions may appear here.
-type AuthOptions struct {
-	// Username and Password are required if using Identity V2 API.
-	// Consult with your provider's control panel to discover your
-	// account's username and password.
-	Username, Password string
-
-	// ApiKey used for providers that support Api Key authentication
-	ApiKey string
-
-	// The TenantId field is optional for the Identity V2 API.
-	TenantId string
-
-	// The TenantName can be specified instead of the TenantId
-	TenantName string
-
-	// AllowReauth should be set to true if you grant permission for Gophercloud to cache
-	// your credentials in memory, and to allow Gophercloud to attempt to re-authenticate
-	// automatically if/when your token expires.  If you set it to false, it will not cache
-	// these settings, but re-authentication will not be possible.  This setting defaults
-	// to false.
-	AllowReauth bool
-}
-
-// AuthContainer provides a JSON encoding wrapper for passing credentials to the Identity
-// service.  You will not work with this structure directly.
-type AuthContainer struct {
-	Auth Auth `json:"auth"`
-}
-
-// Auth provides a JSON encoding wrapper for passing credentials to the Identity
-// service.  You will not work with this structure directly.
-type Auth struct {
-	PasswordCredentials *PasswordCredentials `json:"passwordCredentials,omitempty"`
-	ApiKeyCredentials   *ApiKeyCredentials   `json:"RAX-KSKEY:apiKeyCredentials,omitempty"`
-	TenantId            string               `json:"tenantId,omitempty"`
-	TenantName          string               `json:"tenantName,omitempty"`
-}
-
-// PasswordCredentials provides a JSON encoding wrapper for passing credentials to the Identity
-// service.  You will not work with this structure directly.
-type PasswordCredentials struct {
-	Username string `json:"username"`
-	Password string `json:"password"`
-}
-
-type ApiKeyCredentials struct {
-	Username string `json:"username"`
-	ApiKey   string `json:"apiKey"`
-}
-
-// Access encapsulates the API token and its relevant fields, as well as the
-// services catalog that Identity API returns once authenticated.
-type Access struct {
-	Token          Token
-	ServiceCatalog []CatalogEntry
-	User           User
-	provider       Provider    `json:"-"`
-	options        AuthOptions `json:"-"`
-	context        *Context    `json:"-"`
-}
-
-// Token encapsulates an authentication token and when it expires.  It also includes
-// tenant information if available.
-type Token struct {
-	Id, Expires string
-	Tenant      Tenant
-}
-
-// Tenant encapsulates tenant authentication information.  If, after authentication,
-// no tenant information is supplied, both Id and Name will be "".
-type Tenant struct {
-	Id, Name string
-}
-
-// User encapsulates the user credentials, and provides visibility in what
-// the user can do through its role assignments.
-type User struct {
-	Id, Name          string
-	XRaxDefaultRegion string `json:"RAX-AUTH:defaultRegion"`
-	Roles             []Role
-}
-
-// Role encapsulates a permission that a user can rely on.
-type Role struct {
-	Description, Id, Name string
-}
-
-// CatalogEntry encapsulates a service catalog record.
-type CatalogEntry struct {
-	Name, Type string
-	Endpoints  []EntryEndpoint
-}
-
-// EntryEndpoint encapsulates how to get to the API of some service.
-type EntryEndpoint struct {
-	Region, TenantId                    string
-	PublicURL, InternalURL              string
-	VersionId, VersionInfo, VersionList string
-}
-
-type AuthError struct {
-	StatusCode int
-}
-
-func (ae *AuthError) Error() string {
-	switch ae.StatusCode {
-	case 401:
-		return "Auth failed. Bad credentials."
-
-	default:
-		return fmt.Sprintf("Auth failed. Status code is: %s.", ae.StatusCode)
-	}
-}
-
-//
-func getAuthCredentials(options AuthOptions) Auth {
-	if options.ApiKey == "" {
-		return Auth{
-			PasswordCredentials: &PasswordCredentials{
-				Username: options.Username,
-				Password: options.Password,
-			},
-			TenantId:   options.TenantId,
-			TenantName: options.TenantName,
-		}
-	} else {
-		return Auth{
-			ApiKeyCredentials: &ApiKeyCredentials{
-				Username: options.Username,
-				ApiKey:   options.ApiKey,
-			},
-			TenantId:   options.TenantId,
-			TenantName: options.TenantName,
-		}
-	}
-}
-
-// papersPlease contains the common logic between authentication and re-authentication.
-// The name, obviously a joke on the process of authentication, was chosen because
-// of how many other entities exist in the program containing the word Auth or Authorization.
-// I didn't need another one.
-func (c *Context) papersPlease(p Provider, options AuthOptions) (*Access, error) {
-	var access *Access
-	access = new(Access)
-
-	if (options.Username == "") || (options.Password == "" && options.ApiKey == "") {
-		return nil, ErrCredentials
-	}
-
-	resp, err := perigee.Request("POST", p.AuthEndpoint, perigee.Options{
-		CustomClient: c.httpClient,
-		ReqBody: &AuthContainer{
-			Auth: getAuthCredentials(options),
-		},
-		Results: &struct {
-			Access **Access `json:"access"`
-		}{
-			&access,
-		},
-	})
-
-	if err == nil {
-		switch resp.StatusCode {
-		case 200:
-			access.options = options
-			access.provider = p
-			access.context = c
-
-		default:
-			err = &AuthError {
-				StatusCode: resp.StatusCode,
-			}
-		}
-	}
-
-	return access, err
-}
-
-// Authenticate() grants access to the OpenStack-compatible provider API.
-//
-// Providers are identified through a unique key string.
-// See the RegisterProvider() method for more details.
-//
-// The supplied AuthOptions instance allows the client to specify only those credentials
-// relevant for the authentication request.  At present, support exists for OpenStack
-// Identity V2 API only; support for V3 will become available as soon as documentation for it
-// becomes readily available.
-//
-// For Identity V2 API requirements, you must provide at least the Username and Password
-// options.  The TenantId field is optional, and defaults to "".
-func (c *Context) Authenticate(provider string, options AuthOptions) (*Access, error) {
-	p, err := c.ProviderByName(provider)
-	if err != nil {
-		return nil, err
-	}
-	return c.papersPlease(p, options)
-}
-
-// Reauthenticate attempts to reauthenticate using the configured access credentials, if
-// allowed.  This method takes no action unless your AuthOptions has the AllowReauth flag
-// set to true.
-func (a *Access) Reauthenticate() error {
-	var other *Access
-	var err error
-
-	if a.options.AllowReauth {
-		other, err = a.context.papersPlease(a.provider, a.options)
-		if err == nil {
-			*a = *other
-		}
-	}
-	return err
-}
-
-// See AccessProvider interface definition for details.
-func (a *Access) FirstEndpointUrlByCriteria(ac ApiCriteria) string {
-	ep := FindFirstEndpointByCriteria(a.ServiceCatalog, ac)
-	urls := []string{ep.PublicURL, ep.InternalURL}
-	return urls[ac.UrlChoice]
-}
-
-// See AccessProvider interface definition for details.
-func (a *Access) AuthToken() string {
-	return a.Token.Id
-}
-
-// See AccessProvider interface definition for details.
-func (a *Access) Revoke(tok string) error {
-	url := a.provider.AuthEndpoint + "/" + tok
-	err := perigee.Delete(url, perigee.Options{
-		MoreHeaders: map[string]string{
-			"X-Auth-Token": a.AuthToken(),
-		},
-		OkCodes: []int{204},
-	})
-	return err
-}
-
-// See ServiceCatalogerForIdentityV2 interface definition for details.
-// Note that the raw slice is returend; be careful not to alter the fields of any members,
-// for other components of Gophercloud may depend upon them.
-// If this becomes a problem in the future,
-// a future revision may return a deep-copy of the service catalog instead.
-func (a *Access) V2ServiceCatalog() []CatalogEntry {
-	return a.ServiceCatalog
-}
diff --git a/authenticate_test.go b/authenticate_test.go
deleted file mode 100644
index b05c780..0000000
--- a/authenticate_test.go
+++ /dev/null
@@ -1,264 +0,0 @@
-package gophercloud
-
-import (
-	"net/http"
-	"testing"
-)
-
-const SUCCESSFUL_RESPONSE = `{
-	"access": {
-		"serviceCatalog": [{
-			"endpoints": [{
-				"publicURL": "https://ord.servers.api.rackspacecloud.com/v2/12345",
-				"region": "ORD",
-				"tenantId": "12345",
-				"versionId": "2",
-				"versionInfo": "https://ord.servers.api.rackspacecloud.com/v2",
-				"versionList": "https://ord.servers.api.rackspacecloud.com/"
-			},{
-				"publicURL": "https://dfw.servers.api.rackspacecloud.com/v2/12345",
-				"region": "DFW",
-				"tenantId": "12345",
-				"versionId": "2",
-				"versionInfo": "https://dfw.servers.api.rackspacecloud.com/v2",
-				"versionList": "https://dfw.servers.api.rackspacecloud.com/"
-			}],
-			"name": "cloudServersOpenStack",
-			"type": "compute"
-		},{
-			"endpoints": [{
-				"publicURL": "https://ord.databases.api.rackspacecloud.com/v1.0/12345",
-				"region": "ORD",
-				"tenantId": "12345"
-			}],
-			"name": "cloudDatabases",
-			"type": "rax:database"
-		}],
-		"token": {
-			"expires": "2012-04-13T13:15:00.000-05:00",
-			"id": "aaaaa-bbbbb-ccccc-dddd"
-		},
-		"user": {
-			"RAX-AUTH:defaultRegion": "DFW",
-			"id": "161418",
-			"name": "demoauthor",
-			"roles": [{
-				"description": "User Admin Role.",
-				"id": "3",
-				"name": "identity:user-admin"
-			}]
-		}
-	}
-}
-`
-
-func TestAuthProvider(t *testing.T) {
-	tt := newTransport().WithResponse(SUCCESSFUL_RESPONSE)
-	c := TestContext().UseCustomClient(&http.Client{
-		Transport: tt,
-	})
-
-	_, err := c.Authenticate("", AuthOptions{})
-	if err == nil {
-		t.Error("Expected error for empty provider string")
-		return
-	}
-	_, err = c.Authenticate("unknown-provider", AuthOptions{Username: "u", Password: "p"})
-	if err == nil {
-		t.Error("Expected error for unknown service provider")
-		return
-	}
-
-	err = c.RegisterProvider("provider", Provider{AuthEndpoint: "/"})
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	_, err = c.Authenticate("provider", AuthOptions{Username: "u", Password: "p"})
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	if tt.called != 1 {
-		t.Error("Expected transport to be called once.")
-		return
-	}
-}
-
-func TestTenantIdEncoding(t *testing.T) {
-	tt := newTransport().WithResponse(SUCCESSFUL_RESPONSE)
-	c := TestContext().
-		UseCustomClient(&http.Client{
-		Transport: tt,
-	}).
-		WithProvider("provider", Provider{AuthEndpoint: "/"})
-
-	tt.IgnoreTenantId()
-	_, err := c.Authenticate("provider", AuthOptions{
-		Username: "u",
-		Password: "p",
-	})
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	if tt.tenantIdFound {
-		t.Error("Tenant ID should not have been encoded")
-		return
-	}
-
-	tt.ExpectTenantId()
-	_, err = c.Authenticate("provider", AuthOptions{
-		Username: "u",
-		Password: "p",
-		TenantId: "t",
-	})
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	if !tt.tenantIdFound {
-		t.Error("Tenant ID should have been encoded")
-		return
-	}
-}
-
-func TestUserNameAndPassword(t *testing.T) {
-	c := TestContext().
-		WithProvider("provider", Provider{AuthEndpoint: "http://localhost/"}).
-		UseCustomClient(&http.Client{Transport: newTransport().WithResponse(SUCCESSFUL_RESPONSE)})
-
-	credentials := []AuthOptions{
-		{},
-		{Username: "u"},
-		{Password: "p"},
-	}
-	for i, auth := range credentials {
-		_, err := c.Authenticate("provider", auth)
-		if err == nil {
-			t.Error("Expected error from missing credentials (%d)", i)
-			return
-		}
-	}
-
-	_, err := c.Authenticate("provider", AuthOptions{Username: "u", Password: "p"})
-	if err != nil {
-		t.Error(err)
-		return
-	}
-}
-
-func TestUserNameAndApiKey(t *testing.T) {
-	c := TestContext().
-		WithProvider("provider", Provider{AuthEndpoint: "http://localhost/"}).
-		UseCustomClient(&http.Client{Transport: newTransport().WithResponse(SUCCESSFUL_RESPONSE)})
-
-	credentials := []AuthOptions{
-		{},
-		{Username: "u"},
-		{ApiKey: "a"},
-	}
-	for i, auth := range credentials {
-		_, err := c.Authenticate("provider", auth)
-		if err == nil {
-			t.Error("Expected error from missing credentials (%d)", i)
-			return
-		}
-	}
-
-	_, err := c.Authenticate("provider", AuthOptions{Username: "u", ApiKey: "a"})
-	if err != nil {
-		t.Error(err)
-		return
-	}
-}
-
-func TestTokenAcquisition(t *testing.T) {
-	c := TestContext().
-		UseCustomClient(&http.Client{Transport: newTransport().WithResponse(SUCCESSFUL_RESPONSE)}).
-		WithProvider("provider", Provider{AuthEndpoint: "http://localhost/"})
-
-	acc, err := c.Authenticate("provider", AuthOptions{Username: "u", Password: "p"})
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	tok := acc.Token
-	if (tok.Id == "") || (tok.Expires == "") {
-		t.Error("Expected a valid token for successful login; got %s, %s", tok.Id, tok.Expires)
-		return
-	}
-}
-
-func TestServiceCatalogAcquisition(t *testing.T) {
-	c := TestContext().
-		UseCustomClient(&http.Client{Transport: newTransport().WithResponse(SUCCESSFUL_RESPONSE)}).
-		WithProvider("provider", Provider{AuthEndpoint: "http://localhost/"})
-
-	acc, err := c.Authenticate("provider", AuthOptions{Username: "u", Password: "p"})
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	svcs := acc.ServiceCatalog
-	if len(svcs) < 2 {
-		t.Error("Expected 2 service catalog entries; got %d", len(svcs))
-		return
-	}
-
-	types := map[string]bool{
-		"compute":      true,
-		"rax:database": true,
-	}
-	for _, entry := range svcs {
-		if !types[entry.Type] {
-			t.Error("Expected to find type %s.", entry.Type)
-			return
-		}
-	}
-}
-
-func TestUserAcquisition(t *testing.T) {
-	c := TestContext().
-		UseCustomClient(&http.Client{Transport: newTransport().WithResponse(SUCCESSFUL_RESPONSE)}).
-		WithProvider("provider", Provider{AuthEndpoint: "http://localhost/"})
-
-	acc, err := c.Authenticate("provider", AuthOptions{Username: "u", Password: "p"})
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	u := acc.User
-	if u.Id != "161418" {
-		t.Error("Expected user ID of 16148; got", u.Id)
-		return
-	}
-}
-
-func TestAuthenticationNeverReauths(t *testing.T) {
-	tt := newTransport().WithError(401)
-	c := TestContext().
-		UseCustomClient(&http.Client{Transport: tt}).
-		WithProvider("provider", Provider{AuthEndpoint: "http://localhost"})
-
-	_, err := c.Authenticate("provider", AuthOptions{Username: "u", Password: "p"})
-	if err == nil {
-		t.Error("Expected an error from a 401 Unauthorized response")
-		return
-	}
-
-	rc, _ := ActualResponseCode(err)
-	if rc != 401 {
-		t.Error("Expected a 401 error code")
-		return
-	}
-
-	err = tt.VerifyCalls(t, 1)
-	if err != nil {
-		// Test object already flagged.
-		return
-	}
-}
diff --git a/common_types.go b/common_types.go
deleted file mode 100644
index 044b308..0000000
--- a/common_types.go
+++ /dev/null
@@ -1,24 +0,0 @@
-package gophercloud
-
-// Link is used for JSON (un)marshalling.
-// It provides RESTful links to a resource.
-type Link struct {
-	Href string `json:"href"`
-	Rel  string `json:"rel"`
-	Type string `json:"type"`
-}
-
-// FileConfig structures represent a blob of data which must appear at a
-// a specific location in a server's filesystem.  The file contents are
-// base-64 encoded.
-type FileConfig struct {
-	Path     string `json:"path"`
-	Contents string `json:"contents"`
-}
-
-// NetworkConfig structures represent an affinity between a server and a
-// specific, uniquely identified network.  Networks are identified through
-// universally unique IDs.
-type NetworkConfig struct {
-	Uuid string `json:"uuid"`
-}
diff --git a/context.go b/context.go
deleted file mode 100644
index a41cc6d..0000000
--- a/context.go
+++ /dev/null
@@ -1,135 +0,0 @@
-package gophercloud
-
-import (
-	"net/http"
-	"strings"
-)
-
-// Provider structures exist for each tangible provider of OpenStack service.
-// For example, Rackspace, Hewlett-Packard, and NASA might have their own instance of this structure.
-//
-// At a minimum, a provider must expose an authentication endpoint.
-type Provider struct {
-	AuthEndpoint string
-}
-
-// ReauthHandlerFunc functions are responsible for somehow performing the task of
-// reauthentication.
-type ReauthHandlerFunc func(AccessProvider) error
-
-// Context structures encapsulate Gophercloud-global state in a manner which
-// facilitates easier unit testing.  As a user of this SDK, you'll never
-// have to use this structure, except when contributing new code to the SDK.
-type Context struct {
-	// providerMap serves as a directory of supported providers.
-	providerMap map[string]Provider
-
-	// httpClient refers to the current HTTP client interface to use.
-	httpClient *http.Client
-
-	// reauthHandler provides the functionality needed to re-authenticate
-	// if that feature is enabled.  Note: in order to allow for automatic
-	// re-authentication, the Context object will need to remember your
-	// username, password, and tenant ID as provided in the initial call
-	// to Authenticate().  If you do not desire this, you'll need to handle
-	// reauthentication yourself through other means.  Two methods exist:
-	// the first approach is to just handle errors yourself at the application
-	// layer, and the other is through a custom reauthentication handler
-	// set through the WithReauthHandler() method.
-	reauthHandler ReauthHandlerFunc
-}
-
-// TestContext yields a new Context instance, pre-initialized with a barren
-// state suitable for per-unit-test customization.  This configuration consists
-// of:
-//
-// * An empty provider map.
-//
-// * An HTTP client built by the net/http package (see http://godoc.org/net/http#Client).
-func TestContext() *Context {
-	return &Context{
-		providerMap: make(map[string]Provider),
-		httpClient:  &http.Client{},
-		reauthHandler: func(acc AccessProvider) error {
-			return acc.Reauthenticate()
-		},
-	}
-}
-
-// UseCustomClient configures the context to use a customized HTTP client
-// instance.  By default, TestContext() will return a Context which uses
-// the net/http package's default client instance.
-func (c *Context) UseCustomClient(hc *http.Client) *Context {
-	c.httpClient = hc
-	return c
-}
-
-// RegisterProvider allows a unit test to register a mythical provider convenient for testing.
-// If the provider structure lacks adequate configuration, or the configuration given has some
-// detectable error, an ErrConfiguration error will result.
-func (c *Context) RegisterProvider(name string, p Provider) error {
-	if p.AuthEndpoint == "" {
-		return ErrConfiguration
-	}
-
-	c.providerMap[name] = p
-	return nil
-}
-
-// WithProvider offers convenience for unit tests.
-func (c *Context) WithProvider(name string, p Provider) *Context {
-	err := c.RegisterProvider(name, p)
-	if err != nil {
-		panic(err)
-	}
-	return c
-}
-
-// ProviderByName will locate a provider amongst those previously registered, if it exists.
-// If the named provider has not been registered, an ErrProvider error will result.
-//
-// You may also specify a custom Identity API URL.
-// Any provider name that contains the characters "://", in that order, will be treated as a custom Identity API URL.
-// Custom URLs, important for private cloud deployments, overrides all provider configurations.
-func (c *Context) ProviderByName(name string) (p Provider, err error) {
-	for provider, descriptor := range c.providerMap {
-		if name == provider {
-			return descriptor, nil
-		}
-	}
-	if strings.Contains(name, "://") {
-		p = Provider{
-			AuthEndpoint: name,
-		}
-		return p, nil
-	}
-	return Provider{}, ErrProvider
-}
-
-// Instantiates a Cloud Servers API for the provider given.
-func (c *Context) ServersApi(acc AccessProvider, criteria ApiCriteria) (CloudServersProvider, error) {
-	url := acc.FirstEndpointUrlByCriteria(criteria)
-	if url == "" {
-		return nil, ErrEndpoint
-	}
-
-	gcp := &genericServersProvider{
-		endpoint: url,
-		context:  c,
-		access:   acc,
-	}
-
-	return gcp, nil
-}
-
-// WithReauthHandler configures the context to handle reauthentication attempts using the supplied
-// funtion.  By default, reauthentication happens by invoking Authenticate(), which is unlikely to be
-// useful in a unit test.
-//
-// Do not confuse this function with WithReauth()!  Although they work together to support reauthentication,
-// WithReauth() actually contains the decision-making logic to determine when to perform a reauth,
-// while WithReauthHandler() is used to configure what a reauth actually entails.
-func (c *Context) WithReauthHandler(f ReauthHandlerFunc) *Context {
-	c.reauthHandler = f
-	return c
-}
diff --git a/context_test.go b/context_test.go
deleted file mode 100644
index 2936526..0000000
--- a/context_test.go
+++ /dev/null
@@ -1,28 +0,0 @@
-package gophercloud
-
-import (
-	"testing"
-)
-
-func TestProviderRegistry(t *testing.T) {
-	c := TestContext()
-
-	_, err := c.ProviderByName("aProvider")
-	if err == nil {
-		t.Error("Expected error when looking for a provider by non-existant name")
-		return
-	}
-
-	err = c.RegisterProvider("aProvider", Provider{})
-	if err != ErrConfiguration {
-		t.Error("Unexpected error/nil when registering a provider w/out an auth endpoint\n  %s", err)
-		return
-	}
-
-	_ = c.RegisterProvider("aProvider", Provider{AuthEndpoint: "http://localhost/auth"})
-	_, err = c.ProviderByName("aProvider")
-	if err != nil {
-		t.Error(err)
-		return
-	}
-}
diff --git a/errors.go b/errors.go
deleted file mode 100644
index 1719fd2..0000000
--- a/errors.go
+++ /dev/null
@@ -1,44 +0,0 @@
-package gophercloud
-
-import (
-	"fmt"
-)
-
-// ErrNotImplemented should be used only while developing new SDK features.
-// No established function or method will ever produce this error.
-var ErrNotImplemented = fmt.Errorf("Not implemented")
-
-// ErrProvider errors occur when attempting to reference an unsupported
-// provider.  More often than not, this error happens due to a typo in
-// the name.
-var ErrProvider = fmt.Errorf("Missing or incorrect provider")
-
-// ErrCredentials errors happen when attempting to authenticate using a
-// set of credentials not recognized by the Authenticate() method.
-// For example, not providing a username or password when attempting to
-// authenticate against an Identity V2 API.
-var ErrCredentials = fmt.Errorf("Missing or incomplete credentials")
-
-// ErrConfiguration errors happen when attempting to add a new provider, and
-// the provider added lacks a correct or consistent configuration.
-// For example, all providers must expose at least an Identity V2 API
-// for authentication; if this endpoint isn't specified, you may receive
-// this error when attempting to register it against a context.
-var ErrConfiguration = fmt.Errorf("Missing or incomplete configuration")
-
-// ErrEndpoint errors happen when no endpoint with the desired characteristics
-// exists in the service catalog.  This can also happen if your tenant lacks
-// adequate permissions to access a given endpoint.
-var ErrEndpoint = fmt.Errorf("Missing endpoint, or insufficient privileges to access endpoint")
-
-// ErrError errors happen when you attempt to discover the response code
-// responsible for a previous request bombing with an error, but pass in an
-// error interface which doesn't belong to the web client.
-var ErrError = fmt.Errorf("Attempt to solicit actual HTTP response code from error entity which doesn't know")
-
-// WarnUnauthoritative warnings happen when a service believes its response
-// to be correct, but is not in a position of knowing for sure at the moment.
-// For example, the service could be responding with cached data that has
-// exceeded its time-to-live setting, but which has not yet received an official
-// update from an authoritative source.
-var WarnUnauthoritative = fmt.Errorf("Unauthoritative data")
diff --git a/flavors.go b/flavors.go
deleted file mode 100644
index eb864d5..0000000
--- a/flavors.go
+++ /dev/null
@@ -1,55 +0,0 @@
-package gophercloud
-
-import (
-	"github.com/racker/perigee"
-)
-
-// See CloudServersProvider interface for details.
-func (gsp *genericServersProvider) ListFlavors() ([]Flavor, error) {
-	var fs []Flavor
-
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		url := gsp.endpoint + "/flavors/detail"
-		return perigee.Get(url, perigee.Options{
-			CustomClient: gsp.context.httpClient,
-			Results:      &struct{ Flavors *[]Flavor }{&fs},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-		})
-	})
-	return fs, err
-}
-
-// FlavorLink provides a reference to a flavor by either ID or by direct URL.
-// Some services use just the ID, others use just the URL.
-// This structure provides a common means of expressing both in a single field.
-type FlavorLink struct {
-	Id    string `json:"id"`
-	Links []Link `json:"links"`
-}
-
-// Flavor records represent (virtual) hardware configurations for server resources in a region.
-//
-// The Id field contains the flavor's unique identifier.
-// For example, this identifier will be useful when specifying which hardware configuration to use for a new server instance.
-//
-// The Disk and Ram fields provide a measure of storage space offered by the flavor, in GB and MB, respectively.
-//
-// The Name field provides a human-readable moniker for the flavor.
-//
-// Swap indicates how much space is reserved for swap.
-// If not provided, this field will be set to 0.
-//
-// VCpus indicates how many (virtual) CPUs are available for this flavor.
-type Flavor struct {
-	OsFlvDisabled bool    `json:"OS-FLV-DISABLED:disabled"`
-	Disk          int     `json:"disk"`
-	Id            string  `json:"id"`
-	Links         []Link  `json:"links"`
-	Name          string  `json:"name"`
-	Ram           int     `json:"ram"`
-	RxTxFactor    float64 `json:"rxtx_factor"`
-	Swap          int     `json:"swap"`
-	VCpus         int     `json:"vcpus"`
-}
diff --git a/floating_ips.go b/floating_ips.go
deleted file mode 100644
index 1163667..0000000
--- a/floating_ips.go
+++ /dev/null
@@ -1,88 +0,0 @@
-package gophercloud
-
-import (
-	"errors"
-	"fmt"
-	"github.com/racker/perigee"
-)
-
-func (gsp *genericServersProvider) ListFloatingIps() ([]FloatingIp, error) {
-	var fips []FloatingIp
-
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		url := gsp.endpoint + "/os-floating-ips"
-		return perigee.Get(url, perigee.Options{
-			CustomClient: gsp.context.httpClient,
-			Results: &struct {
-				FloatingIps *[]FloatingIp `json:"floating_ips"`
-			}{&fips},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-		})
-	})
-	return fips, err
-}
-
-func (gsp *genericServersProvider) CreateFloatingIp(pool string) (FloatingIp, error) {
-	fip := new(FloatingIp)
-
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		url := gsp.endpoint + "/os-floating-ips"
-		return perigee.Post(url, perigee.Options{
-			CustomClient: gsp.context.httpClient,
-			ReqBody: map[string]string{
-				"pool": pool,
-			},
-			Results: &struct {
-				FloatingIp **FloatingIp `json:"floating_ip"`
-			}{&fip},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-		})
-	})
-
-	if fip.Ip == "" {
-		return *fip, errors.New("Error creating floating IP")
-	}
-
-	return *fip, err
-}
-
-func (gsp *genericServersProvider) AssociateFloatingIp(serverId string, ip FloatingIp) error {
-	return gsp.context.WithReauth(gsp.access, func() error {
-		ep := fmt.Sprintf("%s/servers/%s/action", gsp.endpoint, serverId)
-		return perigee.Post(ep, perigee.Options{
-			CustomClient: gsp.context.httpClient,
-			ReqBody: map[string](map[string]string){
-				"addFloatingIp": map[string]string{"address": ip.Ip},
-			},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-			OkCodes: []int{202},
-		})
-	})
-}
-
-func (gsp *genericServersProvider) DeleteFloatingIp(ip FloatingIp) error {
-	return gsp.context.WithReauth(gsp.access, func() error {
-		ep := fmt.Sprintf("%s/os-floating-ips/%d", gsp.endpoint, ip.Id)
-		return perigee.Delete(ep, perigee.Options{
-			CustomClient: gsp.context.httpClient,
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-			OkCodes: []int{202},
-		})
-	})
-}
-
-type FloatingIp struct {
-	Id         int    `json:"id"`
-	Pool       string `json:"pool"`
-	Ip         string `json:"ip"`
-	FixedIp    string `json:"fixed_ip"`
-	InstanceId string `json:"instance_id"`
-}
diff --git a/global_context.go b/global_context.go
deleted file mode 100644
index 89d283b..0000000
--- a/global_context.go
+++ /dev/null
@@ -1,67 +0,0 @@
-package gophercloud
-
-import (
-	"github.com/racker/perigee"
-)
-
-// globalContext is the, well, "global context."
-// Most of this SDK is written in a manner to facilitate easier testing,
-// which doesn't require all the configuration a real-world application would require.
-// However, for real-world deployments, applications should be able to rely on a consistent configuration of providers, etc.
-var globalContext *Context
-
-// providers is the set of supported providers.
-var providers = map[string]Provider{
-	"rackspace-us": {
-		AuthEndpoint: "https://identity.api.rackspacecloud.com/v2.0/tokens",
-	},
-	"rackspace-uk": {
-		AuthEndpoint: "https://lon.identity.api.rackspacecloud.com/v2.0/tokens",
-	},
-}
-
-// Initialize the global context to sane configuration.
-// The Go runtime ensures this function is called before main(),
-// thus guaranteeing proper configuration before your application ever runs.
-func init() {
-	globalContext = TestContext()
-	for name, descriptor := range providers {
-		globalContext.RegisterProvider(name, descriptor)
-	}
-}
-
-// Authenticate() grants access to the OpenStack-compatible provider API.
-//
-// Providers are identified through a unique key string.
-// Specifying an unsupported provider will result in an ErrProvider error.
-// However, you may also specify a custom Identity API URL.
-// Any provider name that contains the characters "://", in that order, will be treated as a custom Identity API URL.
-// Custom URLs, important for private cloud deployments, overrides all provider configurations.
-//
-// The supplied AuthOptions instance allows the client to specify only those credentials
-// relevant for the authentication request.  At present, support exists for OpenStack
-// Identity V2 API only; support for V3 will become available as soon as documentation for it
-// becomes readily available.
-//
-// For Identity V2 API requirements, you must provide at least the Username and Password
-// options.  The TenantId field is optional, and defaults to "".
-func Authenticate(provider string, options AuthOptions) (*Access, error) {
-	return globalContext.Authenticate(provider, options)
-}
-
-// Instantiates a Cloud Servers object for the provider given.
-func ServersApi(acc AccessProvider, criteria ApiCriteria) (CloudServersProvider, error) {
-	return globalContext.ServersApi(acc, criteria)
-}
-
-// ActualResponseCode inspects a returned error, and discovers the actual response actual
-// response code that caused the error to be raised.
-func ActualResponseCode(e error) (int, error) {
-	if err, typeOk := e.(*perigee.UnexpectedResponseCodeError); typeOk {
-		return err.Actual, nil
-	} else if err, typeOk := e.(*AuthError); typeOk{
-		return err.StatusCode, nil
-	}
-
-	return 0, ErrError
-}
diff --git a/images.go b/images.go
deleted file mode 100644
index a23e0bb..0000000
--- a/images.go
+++ /dev/null
@@ -1,106 +0,0 @@
-package gophercloud
-
-import (
-	"github.com/racker/perigee"
-)
-
-// See the CloudImagesProvider interface for details.
-func (gsp *genericServersProvider) ListImages() ([]Image, error) {
-	var is []Image
-
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		url := gsp.endpoint + "/images/detail"
-		return perigee.Get(url, perigee.Options{
-			CustomClient: gsp.context.httpClient,
-			Results:      &struct{ Images *[]Image }{&is},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-		})
-	})
-	return is, err
-}
-
-func (gsp *genericServersProvider) ImageById(id string) (*Image, error) {
-	var is *Image
-
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		url := gsp.endpoint + "/images/" + id
-		return perigee.Get(url, perigee.Options{
-			CustomClient: gsp.context.httpClient,
-			Results:      &struct{ Image **Image }{&is},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-		})
-	})
-	return is, err
-}
-
-func (gsp *genericServersProvider) DeleteImageById(id string) error {
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		url := gsp.endpoint + "/images/" + id
-		_, err := perigee.Request("DELETE", url, perigee.Options{
-			CustomClient: gsp.context.httpClient,
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-		})
-		return err
-	})
-	return err
-}
-
-// ImageLink provides a reference to a image by either ID or by direct URL.
-// Some services use just the ID, others use just the URL.
-// This structure provides a common means of expressing both in a single field.
-type ImageLink struct {
-	Id    string `json:"id"`
-	Links []Link `json:"links"`
-}
-
-// Image is used for JSON (un)marshalling.
-// It provides a description of an OS image.
-//
-// The Id field contains the image's unique identifier.
-// For example, this identifier will be useful for specifying which operating system to install on a new server instance.
-//
-// The MinDisk and MinRam fields specify the minimum resources a server must provide to be able to install the image.
-//
-// The Name field provides a human-readable moniker for the OS image.
-//
-// The Progress and Status fields indicate image-creation status.
-// Any usable image will have 100% progress.
-//
-// The Updated field indicates the last time this image was changed.
-//
-// OsDcfDiskConfig indicates the server's boot volume configuration.
-// Valid values are:
-//     AUTO
-//     ----
-//     The server is built with a single partition the size of the target flavor disk.
-//     The file system is automatically adjusted to fit the entire partition.
-//     This keeps things simple and automated.
-//     AUTO is valid only for images and servers with a single partition that use the EXT3 file system.
-//     This is the default setting for applicable Rackspace base images.
-//
-//     MANUAL
-//     ------
-//     The server is built using whatever partition scheme and file system is in the source image.
-//     If the target flavor disk is larger,
-//     the remaining disk space is left unpartitioned.
-//     This enables images to have non-EXT3 file systems, multiple partitions, and so on,
-//     and enables you to manage the disk configuration.
-//
-type Image struct {
-	Created         string `json:"created"`
-	Id              string `json:"id"`
-	Links           []Link `json:"links"`
-	MinDisk         int    `json:"minDisk"`
-	MinRam          int    `json:"minRam"`
-	Name            string `json:"name"`
-	Progress        int    `json:"progress"`
-	Status          string `json:"status"`
-	Updated         string `json:"updated"`
-	OsDcfDiskConfig string `json:"OS-DCF:diskConfig"`
-}
diff --git a/interfaces.go b/interfaces.go
deleted file mode 100644
index 71c0be4..0000000
--- a/interfaces.go
+++ /dev/null
@@ -1,229 +0,0 @@
-package gophercloud
-
-// AccessProvider instances encapsulate a Keystone authentication interface.
-type AccessProvider interface {
-	// FirstEndpointUrlByCriteria searches through the service catalog for the first
-	// matching entry endpoint fulfilling the provided criteria.  If nothing found,
-	// return "".  Otherwise, return either the public or internal URL for the
-	// endpoint, depending on both its existence and the setting of the ApiCriteria.UrlChoice
-	// field.
-	FirstEndpointUrlByCriteria(ApiCriteria) string
-
-	// AuthToken provides a copy of the current authentication token for the user's credentials.
-	// Note that AuthToken() will not automatically refresh an expired token.
-	AuthToken() string
-
-	// Revoke allows you to terminate any program's access to the OpenStack API by token ID.
-	Revoke(string) error
-
-	// Reauthenticate attempts to acquire a new authentication token, if the feature is enabled by
-	// AuthOptions.AllowReauth.
-	Reauthenticate() error
-}
-
-// ServiceCatalogerIdentityV2 interface provides direct access to the service catalog as offered by the Identity V2 API.
-// We regret we need to fracture the namespace of what should otherwise be a simple concept; however,
-// the OpenStack community saw fit to render V3's service catalog completely incompatible with V2.
-type ServiceCatalogerForIdentityV2 interface {
-	V2ServiceCatalog() []CatalogEntry
-}
-
-// CloudServersProvider instances encapsulate a Cloud Servers API, should one exist in the service catalog
-// for your provider.
-type CloudServersProvider interface {
-	// Servers
-
-	// ListServers provides a complete list of servers hosted by the user
-	// in a given region.  This function differs from ListServersLinksOnly()
-	// in that it returns all available details for each server returned.
-	ListServers() ([]Server, error)
-
-	// ListServers provides a complete list of servers hosted by the user
-	// in a given region.  This function differs from ListServers() in that
-	// it returns only IDs and links to each server returned.
-	//
-	// This function should be used only under certain circumstances.
-	// It's most useful for checking to see if a server with a given ID exists,
-	// or that you have permission to work with that server.  It's also useful
-	// when the cost of retrieving the server link list plus the overhead of manually
-	// invoking ServerById() for each of the servers you're interested in is less than
-	// just calling ListServers() to begin with.  This may be a consideration, for
-	// example, with mobile applications.
-	//
-	// In other cases, you probably should just call ListServers() and cache the
-	// results to conserve overall bandwidth and reduce your access rate on the API.
-	ListServersLinksOnly() ([]Server, error)
-
-	// ServerById will retrieve a detailed server description given the unique ID
-	// of a server.  The ID can be returned by either ListServers() or by ListServersLinksOnly().
-	ServerById(id string) (*Server, error)
-
-	// CreateServer requests a new server to be created by the cloud server provider.
-	// The user must pass in a pointer to an initialized NewServerContainer structure.
-	// Please refer to the NewServerContainer documentation for more details.
-	//
-	// If the NewServer structure's AdminPass is empty (""), a password will be
-	// automatically generated by your OpenStack provider, and returned through the
-	// AdminPass field of the result.  Take care, however; this will be the only time
-	// this happens.  No other means exists in the public API to acquire a password
-	// for a pre-existing server.  If you lose it, you'll need to call SetAdminPassword()
-	// to set a new one.
-	CreateServer(ns NewServer) (*NewServer, error)
-
-	// DeleteServerById requests that the server with the assigned ID be removed
-	// from your account.  The delete happens asynchronously.
-	DeleteServerById(id string) error
-
-	// SetAdminPassword requests that the server with the specified ID have its
-	// administrative password changed.  For Linux, BSD, or other POSIX-like
-	// system, this password corresponds to the root user.  For Windows machines,
-	// the Administrator password will be affected instead.
-	SetAdminPassword(id string, pw string) error
-
-	// ResizeServer can be a short-hand for RebuildServer where only the size of the server
-	// changes.  Note that after the resize operation is requested, you will need to confirm
-	// the resize has completed for changes to take effect permanently.  Changes will assume
-	// to be confirmed even without an explicit confirmation after 24 hours from the initial
-	// request.
-	ResizeServer(id, newName, newFlavor, newDiskConfig string) error
-
-	// RevertResize will reject a server's resized configuration, thus
-	// rolling back to the original server.
-	RevertResize(id string) error
-
-	// ConfirmResizeServer will acknowledge a server's resized configuration.
-	ConfirmResize(id string) error
-
-	// RebootServer requests that the server with the specified ID be rebooted.
-	// Two reboot mechanisms exist.
-	//
-	// - Hard.  This will physically power-cycle the unit.
-	// - Soft.  This will attempt to use the server's software-based mechanisms to restart
-	//           the machine.  E.g., "shutdown -r now" on Linux.
-	RebootServer(id string, hard bool) error
-
-	// RescueServer requests that the server with the specified ID be placed into
-	// a state of maintenance.  The server instance is replaced with a new instance,
-	// of the same flavor and image.  This new image will have the boot volume of the
-	// original machine mounted as a secondary device, so that repair and administration
-	// may occur.  Use UnrescueServer() to restore the server to its previous state.
-	// Note also that many providers will impose a time limit for how long a server may
-	// exist in rescue mode!  Consult the API documentation for your provider for
-	// details.
-	RescueServer(id string) (string, error)
-
-	// UnrescueServer requests that a server in rescue state be placed into its nominal
-	// operating state.
-	UnrescueServer(id string) error
-
-	// UpdateServer alters one or more fields of the identified server's Server record.
-	// However, not all fields may be altered.  Presently, only Name, AccessIPv4, and
-	// AccessIPv6 fields may be altered.   If unspecified, or set to an empty or zero
-	// value, the corresponding field remains unaltered.
-	//
-	// This function returns the new set of server details if successful.
-	UpdateServer(id string, newValues NewServerSettings) (*Server, error)
-
-	// RebuildServer reprovisions a server to the specifications given by the
-	// NewServer structure.  The following fields are guaranteed to be recognized:
-	//
-	//		Name (required)				AccessIPv4
-	//		imageRef (required)			AccessIPv6
-	//		AdminPass (required)		Metadata
-	//		Personality
-	//
-	// Other providers may reserve the right to act on additional fields.
-	RebuildServer(id string, ns NewServer) (*Server, error)
-
-	// CreateImage will create a new image from the specified server id returning the id of the new image.
-	CreateImage(id string, ci CreateImage) (string, error)
-
-	// Addresses
-
-	// ListAddresses yields the list of available addresses for the server.
-	// This information is also returned by ServerById() in the Server.Addresses
-	// field.  However, if you have a lot of servers and all you need are addresses,
-	// this function might be more efficient.
-	ListAddresses(id string) (AddressSet, error)
-
-	// ListAddressesByNetwork yields the list of available addresses for a given server id and networkLabel.
-	// Example: ListAddressesByNetwork("234-4353-4jfrj-43j2s", "private")
-	ListAddressesByNetwork(id, networkLabel string) (NetworkAddress, error)
-
-	// ListFloatingIps yields the list of all floating IP addresses allocated to the current project.
-	ListFloatingIps() ([]FloatingIp, error)
-
-	// CreateFloatingIp allocates a new IP from the named pool to the current project.
-	CreateFloatingIp(pool string) (FloatingIp, error)
-
-	// DeleteFloatingIp returns the specified IP from the current project to the pool.
-	DeleteFloatingIp(ip FloatingIp) error
-
-	// AssociateFloatingIp associates the given floating IP to the given server id.
-	AssociateFloatingIp(serverId string, ip FloatingIp) error
-
-	// Images
-
-	// ListImages yields the list of available operating system images.  This function
-	// returns full details for each image, if available.
-	ListImages() ([]Image, error)
-
-	// ImageById yields details about a specific image.
-	ImageById(id string) (*Image, error)
-
-	// DeleteImageById will delete the specific image.
-	DeleteImageById(id string) error
-
-	// Flavors
-
-	// ListFlavors yields the list of available system flavors.  This function
-	// returns full details for each flavor, if available.
-	ListFlavors() ([]Flavor, error)
-
-	// KeyPairs
-
-	// ListKeyPairs yields the list of available keypairs.
-	ListKeyPairs() ([]KeyPair, error)
-
-	// CreateKeyPairs will create or generate a new keypair.
-	CreateKeyPair(nkp NewKeyPair) (KeyPair, error)
-
-	// DeleteKeyPair wil delete a keypair.
-	DeleteKeyPair(name string) error
-
-	// ShowKeyPair will yield the named keypair.
-	ShowKeyPair(name string) (KeyPair, error)
-
-	// ListSecurityGroups provides a listing of security groups for the tenant.
-	// This method works only if the provider supports the os-security-groups extension.
-	ListSecurityGroups() ([]SecurityGroup, error)
-
-	// CreateSecurityGroup lets a tenant create a new security group.
-	// Only the SecurityGroup fields which are specified will be marshalled to the API.
-	// This method works only if the provider supports the os-security-groups extension.
-	CreateSecurityGroup(desired SecurityGroup) (*SecurityGroup, error)
-
-	// ListSecurityGroupsByServerId provides a list of security groups which apply to the indicated server.
-	// This method works only if the provider supports the os-security-groups extension.
-	ListSecurityGroupsByServerId(id string) ([]SecurityGroup, error)
-
-	// SecurityGroupById returns a security group corresponding to the provided ID number.
-	// This method works only if the provider supports the os-security-groups extension.
-	SecurityGroupById(id int) (*SecurityGroup, error)
-
-	// DeleteSecurityGroupById disposes of a security group corresponding to the provided ID number.
-	// This method works only if the provider supports the os-security-groups extension.
-	DeleteSecurityGroupById(id int) error
-
-	// ListDefaultSGRules lists default security group rules.
-	// This method only works if the provider supports the os-security-groups-default-rules extension.
-	ListDefaultSGRules() ([]SGRule, error)
-
-	// CreateDefaultSGRule creates a default security group rule.
-	// This method only works if the provider supports the os-security-groups-default-rules extension.
-	CreateDefaultSGRule(SGRule) (*SGRule, error)
-
-	// GetSGRule obtains information for a specified security group rule.
-	// This method only works if the provider supports the os-security-groups-default-rules extension.
-	GetSGRule(string) (*SGRule, error)
-}
diff --git a/keypairs.go b/keypairs.go
deleted file mode 100644
index 9ab8ea7..0000000
--- a/keypairs.go
+++ /dev/null
@@ -1,97 +0,0 @@
-package gophercloud
-
-import (
-	"github.com/racker/perigee"
-)
-
-// See the CloudImagesProvider interface for details.
-func (gsp *genericServersProvider) ListKeyPairs() ([]KeyPair, error) {
-	type KeyPairs struct {
-		KeyPairs []struct {
-			KeyPair KeyPair `json:"keypair"`
-		} `json:"keypairs"`
-	}
-
-	var kp KeyPairs
-
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		url := gsp.endpoint + "/os-keypairs"
-		return perigee.Get(url, perigee.Options{
-			CustomClient: gsp.context.httpClient,
-			Results:      &kp,
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-		})
-	})
-
-	// Flatten out the list of keypairs
-	var keypairs []KeyPair
-	for _, k := range kp.KeyPairs {
-		keypairs = append(keypairs, k.KeyPair)
-	}
-	return keypairs, err
-}
-
-func (gsp *genericServersProvider) CreateKeyPair(nkp NewKeyPair) (KeyPair, error) {
-	var kp KeyPair
-
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		url := gsp.endpoint + "/os-keypairs"
-		return perigee.Post(url, perigee.Options{
-			ReqBody: &struct {
-				KeyPair *NewKeyPair `json:"keypair"`
-			}{&nkp},
-			CustomClient: gsp.context.httpClient,
-			Results:      &struct{ KeyPair *KeyPair }{&kp},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-		})
-	})
-	return kp, err
-}
-
-// See the CloudImagesProvider interface for details.
-func (gsp *genericServersProvider) DeleteKeyPair(name string) error {
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		url := gsp.endpoint + "/os-keypairs/" + name
-		return perigee.Delete(url, perigee.Options{
-			CustomClient: gsp.context.httpClient,
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-			OkCodes: []int{202},
-		})
-	})
-	return err
-}
-
-func (gsp *genericServersProvider) ShowKeyPair(name string) (KeyPair, error) {
-	var kp KeyPair
-
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		url := gsp.endpoint + "/os-keypairs/" + name
-		return perigee.Get(url, perigee.Options{
-			CustomClient: gsp.context.httpClient,
-			Results:      &struct{ KeyPair *KeyPair }{&kp},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-		})
-	})
-	return kp, err
-}
-
-type KeyPair struct {
-	FingerPrint string `json:"fingerprint"`
-	Name        string `json:"name"`
-	PrivateKey  string `json:"private_key,omitempty"`
-	PublicKey   string `json:"public_key"`
-	UserID      string `json:"user_id,omitempty"`
-}
-
-type NewKeyPair struct {
-	Name      string `json:"name"`
-	PublicKey string `json:"public_key,omitempty"`
-}
diff --git a/osutil/auth.go b/osutil/auth.go
deleted file mode 100644
index 409846c..0000000
--- a/osutil/auth.go
+++ /dev/null
@@ -1,59 +0,0 @@
-package osutil
-
-import (
-	"fmt"
-	"github.com/rackspace/gophercloud"
-	"os"
-)
-
-var (
-	nilOptions = gophercloud.AuthOptions{}
-
-	// ErrNoAuthUrl errors occur when the value of the OS_AUTH_URL environment variable cannot be determined.
-	ErrNoAuthUrl = fmt.Errorf("Environment variable OS_AUTH_URL needs to be set.")
-
-	// ErrNoUsername errors occur when the value of the OS_USERNAME environment variable cannot be determined.
-	ErrNoUsername = fmt.Errorf("Environment variable OS_USERNAME needs to be set.")
-
-	// ErrNoPassword errors occur when the value of the OS_PASSWORD environment variable cannot be determined.
-	ErrNoPassword = fmt.Errorf("Environment variable OS_PASSWORD or OS_API_KEY needs to be set.")
-)
-
-// AuthOptions fills out a gophercloud.AuthOptions structure with the settings found on the various OpenStack
-// OS_* environment variables.  The following variables provide sources of truth: OS_AUTH_URL, OS_USERNAME,
-// OS_PASSWORD, OS_TENANT_ID, and OS_TENANT_NAME.  Of these, OS_USERNAME, OS_PASSWORD, and OS_AUTH_URL must
-// have settings, or an error will result.  OS_TENANT_ID and OS_TENANT_NAME are optional.
-//
-// The value of OS_AUTH_URL will be returned directly to the caller, for subsequent use in
-// gophercloud.Authenticate()'s Provider parameter.  This function will not interpret the value of OS_AUTH_URL,
-// so as a convenient extention, you may set OS_AUTH_URL to, e.g., "rackspace-uk", or any other Gophercloud-recognized
-// provider shortcuts.  For broad compatibility, especially with local installations, you should probably
-// avoid the temptation to do this.
-func AuthOptions() (string, gophercloud.AuthOptions, error) {
-	provider := os.Getenv("OS_AUTH_URL")
-	username := os.Getenv("OS_USERNAME")
-	password := os.Getenv("OS_PASSWORD")
-	tenantId := os.Getenv("OS_TENANT_ID")
-	tenantName := os.Getenv("OS_TENANT_NAME")
-
-	if provider == "" {
-		return "", nilOptions, ErrNoAuthUrl
-	}
-
-	if username == "" {
-		return "", nilOptions, ErrNoUsername
-	}
-
-	if password == "" {
-		return "", nilOptions, ErrNoPassword
-	}
-
-	ao := gophercloud.AuthOptions{
-		Username:   username,
-		Password:   password,
-		TenantId:   tenantId,
-		TenantName: tenantName,
-	}
-
-	return provider, ao, nil
-}
diff --git a/osutil/region.go b/osutil/region.go
deleted file mode 100644
index f7df507..0000000
--- a/osutil/region.go
+++ /dev/null
@@ -1,9 +0,0 @@
-package osutil
-
-import "os"
-
-// Region provides a means of querying the OS_REGION_NAME environment variable.
-// At present, you may also use os.Getenv("OS_REGION_NAME") as well.
-func Region() string {
-	return os.Getenv("OS_REGION_NAME")
-}
diff --git a/reauth.go b/reauth.go
deleted file mode 100644
index 342aca4..0000000
--- a/reauth.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package gophercloud
-
-import (
-	"github.com/racker/perigee"
-)
-
-// WithReauth wraps a Perigee request fragment with logic to perform re-authentication
-// if it's deemed necessary.
-//
-// Do not confuse this function with WithReauth()!  Although they work together to support reauthentication,
-// WithReauth() actually contains the decision-making logic to determine when to perform a reauth,
-// while WithReauthHandler() is used to configure what a reauth actually entails.
-func (c *Context) WithReauth(ap AccessProvider, f func() error) error {
-	err := f()
-	cause, ok := err.(*perigee.UnexpectedResponseCodeError)
-	if ok && cause.Actual == 401 {
-		err = c.reauthHandler(ap)
-		if err == nil {
-			err = f()
-		}
-	}
-	return err
-}
-
-// This is like WithReauth above but returns a perigee Response object
-func (c *Context) ResponseWithReauth(ap AccessProvider, f func() (*perigee.Response, error)) (*perigee.Response, error) {
-	response, err := f()
-	cause, ok := err.(*perigee.UnexpectedResponseCodeError)
-	if ok && cause.Actual == 401 {
-		err = c.reauthHandler(ap)
-		if err == nil {
-			response, err = f()
-		}
-	}
-	return response, err
-}
diff --git a/reauth_test.go b/reauth_test.go
deleted file mode 100644
index e3501b8..0000000
--- a/reauth_test.go
+++ /dev/null
@@ -1,133 +0,0 @@
-package gophercloud
-
-import (
-	"github.com/racker/perigee"
-	"testing"
-)
-
-// This reauth-handler does nothing, and returns no error.
-func doNothing(_ AccessProvider) error {
-	return nil
-}
-
-func TestOtherErrorsPropegate(t *testing.T) {
-	calls := 0
-	c := TestContext().WithReauthHandler(doNothing)
-
-	err := c.WithReauth(nil, func() error {
-		calls++
-		return &perigee.UnexpectedResponseCodeError{
-			Expected: []int{204},
-			Actual:   404,
-		}
-	})
-
-	if err == nil {
-		t.Error("Expected MyError to be returned; got nil instead.")
-		return
-	}
-	if _, ok := err.(*perigee.UnexpectedResponseCodeError); !ok {
-		t.Error("Expected UnexpectedResponseCodeError; got %#v", err)
-		return
-	}
-	if calls != 1 {
-		t.Errorf("Expected the body to be invoked once; found %d calls instead", calls)
-		return
-	}
-}
-
-func Test401ErrorCausesBodyInvokation2ndTime(t *testing.T) {
-	calls := 0
-	c := TestContext().WithReauthHandler(doNothing)
-
-	err := c.WithReauth(nil, func() error {
-		calls++
-		return &perigee.UnexpectedResponseCodeError{
-			Expected: []int{204},
-			Actual:   401,
-		}
-	})
-
-	if err == nil {
-		t.Error("Expected MyError to be returned; got nil instead.")
-		return
-	}
-	if calls != 2 {
-		t.Errorf("Expected the body to be invoked once; found %d calls instead", calls)
-		return
-	}
-}
-
-func TestReauthAttemptShouldHappen(t *testing.T) {
-	calls := 0
-	c := TestContext().WithReauthHandler(func(_ AccessProvider) error {
-		calls++
-		return nil
-	})
-	c.WithReauth(nil, func() error {
-		return &perigee.UnexpectedResponseCodeError{
-			Expected: []int{204},
-			Actual:   401,
-		}
-	})
-
-	if calls != 1 {
-		t.Errorf("Expected Reauthenticator to be called once; found %d instead", calls)
-		return
-	}
-}
-
-type MyError struct{}
-
-func (*MyError) Error() string {
-	return "MyError instance"
-}
-
-func TestReauthErrorShouldPropegate(t *testing.T) {
-	c := TestContext().WithReauthHandler(func(_ AccessProvider) error {
-		return &MyError{}
-	})
-
-	err := c.WithReauth(nil, func() error {
-		return &perigee.UnexpectedResponseCodeError{
-			Expected: []int{204},
-			Actual:   401,
-		}
-	})
-
-	if _, ok := err.(*MyError); !ok {
-		t.Errorf("Expected a MyError; got %#v", err)
-		return
-	}
-}
-
-type MyAccess struct{}
-
-func (my *MyAccess) FirstEndpointUrlByCriteria(ApiCriteria) string {
-	return ""
-}
-func (my *MyAccess) AuthToken() string {
-	return ""
-}
-func (my *MyAccess) Revoke(string) error {
-	return nil
-}
-func (my *MyAccess) Reauthenticate() error {
-	return nil
-}
-
-func TestReauthHandlerUsesSameAccessProvider(t *testing.T) {
-	fakeAccess := &MyAccess{}
-	c := TestContext().WithReauthHandler(func(acc AccessProvider) error {
-		if acc != fakeAccess {
-			t.Errorf("Expected acc = fakeAccess")
-		}
-		return nil
-	})
-	c.WithReauth(fakeAccess, func() error {
-		return &perigee.UnexpectedResponseCodeError{
-			Expected: []int{204},
-			Actual:   401,
-		}
-	})
-}
diff --git a/servers.go b/servers.go
deleted file mode 100644
index c102169..0000000
--- a/servers.go
+++ /dev/null
@@ -1,736 +0,0 @@
-// TODO(sfalvo): Remove Rackspace-specific Server structure fields and refactor them into a provider-specific access method.
-// Be sure to update godocs accordingly.
-
-package gophercloud
-
-import (
-	"fmt"
-	"github.com/racker/perigee"
-	"strings"
-)
-
-// genericServersProvider structures provide the implementation for generic OpenStack-compatible
-// CloudServersProvider interfaces.
-type genericServersProvider struct {
-	// endpoint refers to the provider's API endpoint base URL.  This will be used to construct
-	// and issue queries.
-	endpoint string
-
-	// Test context (if any) in which to issue requests.
-	context *Context
-
-	// access associates this API provider with a set of credentials,
-	// which may be automatically renewed if they near expiration.
-	access AccessProvider
-}
-
-// See the CloudServersProvider interface for details.
-func (gcp *genericServersProvider) ListServersLinksOnly() ([]Server, error) {
-	var ss []Server
-
-	err := gcp.context.WithReauth(gcp.access, func() error {
-		url := gcp.endpoint + "/servers"
-		return perigee.Get(url, perigee.Options{
-			CustomClient: gcp.context.httpClient,
-			Results:      &struct{ Servers *[]Server }{&ss},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gcp.access.AuthToken(),
-			},
-		})
-	})
-	return ss, err
-}
-
-// See the CloudServersProvider interface for details.
-func (gcp *genericServersProvider) ListServers() ([]Server, error) {
-	var ss []Server
-
-	err := gcp.context.WithReauth(gcp.access, func() error {
-		url := gcp.endpoint + "/servers/detail"
-		return perigee.Get(url, perigee.Options{
-			CustomClient: gcp.context.httpClient,
-			Results:      &struct{ Servers *[]Server }{&ss},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gcp.access.AuthToken(),
-			},
-		})
-	})
-	return ss, err
-}
-
-// See the CloudServersProvider interface for details.
-func (gsp *genericServersProvider) ServerById(id string) (*Server, error) {
-	var s *Server
-
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		url := gsp.endpoint + "/servers/" + id
-		return perigee.Get(url, perigee.Options{
-			Results: &struct{ Server **Server }{&s},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-			OkCodes: []int{200},
-		})
-	})
-	return s, err
-}
-
-// See the CloudServersProvider interface for details.
-func (gsp *genericServersProvider) CreateServer(ns NewServer) (*NewServer, error) {
-	var s *NewServer
-
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		ep := gsp.endpoint + "/servers"
-		return perigee.Post(ep, perigee.Options{
-			ReqBody: &struct {
-				Server *NewServer `json:"server"`
-			}{&ns},
-			Results: &struct{ Server **NewServer }{&s},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-			OkCodes: []int{202},
-		})
-	})
-
-	return s, err
-}
-
-// See the CloudServersProvider interface for details.
-func (gsp *genericServersProvider) DeleteServerById(id string) error {
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		url := gsp.endpoint + "/servers/" + id
-		return perigee.Delete(url, perigee.Options{
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-			OkCodes: []int{204},
-		})
-	})
-	return err
-}
-
-// See the CloudServersProvider interface for details.
-func (gsp *genericServersProvider) SetAdminPassword(id, pw string) error {
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		url := fmt.Sprintf("%s/servers/%s/action", gsp.endpoint, id)
-		return perigee.Post(url, perigee.Options{
-			ReqBody: &struct {
-				ChangePassword struct {
-					AdminPass string `json:"adminPass"`
-				} `json:"changePassword"`
-			}{
-				struct {
-					AdminPass string `json:"adminPass"`
-				}{pw},
-			},
-			OkCodes: []int{202},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-		})
-	})
-	return err
-}
-
-// See the CloudServersProvider interface for details.
-func (gsp *genericServersProvider) ResizeServer(id, newName, newFlavor, newDiskConfig string) error {
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		url := fmt.Sprintf("%s/servers/%s/action", gsp.endpoint, id)
-		rr := ResizeRequest{
-			Name:       newName,
-			FlavorRef:  newFlavor,
-			DiskConfig: newDiskConfig,
-		}
-		return perigee.Post(url, perigee.Options{
-			ReqBody: &struct {
-				Resize ResizeRequest `json:"resize"`
-			}{rr},
-			OkCodes: []int{202},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-		})
-	})
-	return err
-}
-
-// See the CloudServersProvider interface for details.
-func (gsp *genericServersProvider) RevertResize(id string) error {
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		url := fmt.Sprintf("%s/servers/%s/action", gsp.endpoint, id)
-		return perigee.Post(url, perigee.Options{
-			ReqBody: &struct {
-				RevertResize *int `json:"revertResize"`
-			}{nil},
-			OkCodes: []int{202},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-		})
-	})
-	return err
-}
-
-// See the CloudServersProvider interface for details.
-func (gsp *genericServersProvider) ConfirmResize(id string) error {
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		url := fmt.Sprintf("%s/servers/%s/action", gsp.endpoint, id)
-		return perigee.Post(url, perigee.Options{
-			ReqBody: &struct {
-				ConfirmResize *int `json:"confirmResize"`
-			}{nil},
-			OkCodes: []int{204},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-		})
-	})
-	return err
-}
-
-// See the CloudServersProvider interface for details
-func (gsp *genericServersProvider) RebootServer(id string, hard bool) error {
-	return gsp.context.WithReauth(gsp.access, func() error {
-		url := fmt.Sprintf("%s/servers/%s/action", gsp.endpoint, id)
-		types := map[bool]string{false: "SOFT", true: "HARD"}
-		return perigee.Post(url, perigee.Options{
-			ReqBody: &struct {
-				Reboot struct {
-					Type string `json:"type"`
-				} `json:"reboot"`
-			}{
-				struct {
-					Type string `json:"type"`
-				}{types[hard]},
-			},
-			OkCodes: []int{202},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-		})
-	})
-}
-
-// See the CloudServersProvider interface for details
-func (gsp *genericServersProvider) RescueServer(id string) (string, error) {
-	var pw *string
-
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		url := fmt.Sprintf("%s/servers/%s/action", gsp.endpoint, id)
-		return perigee.Post(url, perigee.Options{
-			ReqBody: &struct {
-				Rescue string `json:"rescue"`
-			}{"none"},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-			Results: &struct {
-				AdminPass **string `json:"adminPass"`
-			}{&pw},
-		})
-	})
-	return *pw, err
-}
-
-// See the CloudServersProvider interface for details
-func (gsp *genericServersProvider) UnrescueServer(id string) error {
-	return gsp.context.WithReauth(gsp.access, func() error {
-		url := fmt.Sprintf("%s/servers/%s/action", gsp.endpoint, id)
-		return perigee.Post(url, perigee.Options{
-			ReqBody: &struct {
-				Unrescue *int `json:"unrescue"`
-			}{nil},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-			OkCodes: []int{202},
-		})
-	})
-}
-
-// See the CloudServersProvider interface for details
-func (gsp *genericServersProvider) UpdateServer(id string, changes NewServerSettings) (*Server, error) {
-	var svr *Server
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		url := fmt.Sprintf("%s/servers/%s", gsp.endpoint, id)
-		return perigee.Put(url, perigee.Options{
-			ReqBody: &struct {
-				Server NewServerSettings `json:"server"`
-			}{changes},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-			Results: &struct {
-				Server **Server `json:"server"`
-			}{&svr},
-		})
-	})
-	return svr, err
-}
-
-// See the CloudServersProvider interface for details.
-func (gsp *genericServersProvider) RebuildServer(id string, ns NewServer) (*Server, error) {
-	var s *Server
-
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		ep := fmt.Sprintf("%s/servers/%s/action", gsp.endpoint, id)
-		return perigee.Post(ep, perigee.Options{
-			ReqBody: &struct {
-				Rebuild *NewServer `json:"rebuild"`
-			}{&ns},
-			Results: &struct{ Server **Server }{&s},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-			OkCodes: []int{202},
-		})
-	})
-
-	return s, err
-}
-
-// See the CloudServersProvider interface for details.
-func (gsp *genericServersProvider) ListAddresses(id string) (AddressSet, error) {
-	var pas *AddressSet
-	var statusCode int
-
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		ep := fmt.Sprintf("%s/servers/%s/ips", gsp.endpoint, id)
-		return perigee.Get(ep, perigee.Options{
-			Results: &struct{ Addresses **AddressSet }{&pas},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-			OkCodes:    []int{200, 203},
-			StatusCode: &statusCode,
-		})
-	})
-
-	if err != nil {
-		if statusCode == 203 {
-			err = WarnUnauthoritative
-		}
-	}
-
-	return *pas, err
-}
-
-// See the CloudServersProvider interface for details.
-func (gsp *genericServersProvider) ListAddressesByNetwork(id, networkLabel string) (NetworkAddress, error) {
-	pas := make(NetworkAddress)
-	var statusCode int
-
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		ep := fmt.Sprintf("%s/servers/%s/ips/%s", gsp.endpoint, id, networkLabel)
-		return perigee.Get(ep, perigee.Options{
-			Results: &pas,
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-			OkCodes:    []int{200, 203},
-			StatusCode: &statusCode,
-		})
-	})
-
-	if err != nil {
-		if statusCode == 203 {
-			err = WarnUnauthoritative
-		}
-	}
-
-	return pas, err
-}
-
-// See the CloudServersProvider interface for details.
-func (gsp *genericServersProvider) CreateImage(id string, ci CreateImage) (string, error) {
-	response, err := gsp.context.ResponseWithReauth(gsp.access, func() (*perigee.Response, error) {
-		ep := fmt.Sprintf("%s/servers/%s/action", gsp.endpoint, id)
-		return perigee.Request("POST", ep, perigee.Options{
-			ReqBody: &struct {
-				CreateImage *CreateImage `json:"createImage"`
-			}{&ci},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-			OkCodes: []int{200, 202},
-		})
-	})
-
-	if err != nil {
-		return "", err
-	}
-	location, err := response.HttpResponse.Location()
-	if err != nil {
-		return "", err
-	}
-
-	// Return the last element of the location which is the image id
-	locationArr := strings.Split(location.Path, "/")
-	return locationArr[len(locationArr)-1], err
-}
-
-// See the CloudServersProvider interface for details.
-func (gsp *genericServersProvider) ListSecurityGroups() ([]SecurityGroup, error) {
-	var sgs []SecurityGroup
-
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		ep := fmt.Sprintf("%s/os-security-groups", gsp.endpoint)
-		return perigee.Get(ep, perigee.Options{
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-			Results: &struct {
-				SecurityGroups *[]SecurityGroup `json:"security_groups"`
-			}{&sgs},
-		})
-	})
-	return sgs, err
-}
-
-// See the CloudServersProvider interface for details.
-func (gsp *genericServersProvider) CreateSecurityGroup(desired SecurityGroup) (*SecurityGroup, error) {
-	var actual *SecurityGroup
-
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		ep := fmt.Sprintf("%s/os-security-groups", gsp.endpoint)
-		return perigee.Post(ep, perigee.Options{
-			ReqBody: struct {
-				AddSecurityGroup SecurityGroup `json:"security_group"`
-			}{desired},
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-			Results: &struct {
-				SecurityGroup **SecurityGroup `json:"security_group"`
-			}{&actual},
-		})
-	})
-	return actual, err
-}
-
-// See the CloudServersProvider interface for details.
-func (gsp *genericServersProvider) ListSecurityGroupsByServerId(id string) ([]SecurityGroup, error) {
-	var sgs []SecurityGroup
-
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		ep := fmt.Sprintf("%s/servers/%s/os-security-groups", gsp.endpoint, id)
-		return perigee.Get(ep, perigee.Options{
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-			Results: &struct {
-				SecurityGroups *[]SecurityGroup `json:"security_groups"`
-			}{&sgs},
-		})
-	})
-	return sgs, err
-}
-
-// See the CloudServersProvider interface for details.
-func (gsp *genericServersProvider) SecurityGroupById(id int) (*SecurityGroup, error) {
-	var actual *SecurityGroup
-
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		ep := fmt.Sprintf("%s/os-security-groups/%d", gsp.endpoint, id)
-		return perigee.Get(ep, perigee.Options{
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-			Results: &struct {
-				SecurityGroup **SecurityGroup `json:"security_group"`
-			}{&actual},
-		})
-	})
-	return actual, err
-}
-
-// See the CloudServersProvider interface for details.
-func (gsp *genericServersProvider) DeleteSecurityGroupById(id int) error {
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		ep := fmt.Sprintf("%s/os-security-groups/%d", gsp.endpoint, id)
-		return perigee.Delete(ep, perigee.Options{
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-			OkCodes: []int{202},
-		})
-	})
-	return err
-}
-
-// See the CloudServersProvider interface for details.
-func (gsp *genericServersProvider) ListDefaultSGRules() ([]SGRule, error) {
-	var sgrs []SGRule
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		ep := fmt.Sprintf("%s/os-security-group-default-rules", gsp.endpoint)
-		return perigee.Get(ep, perigee.Options{
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-			Results: &struct{Security_group_default_rules *[]SGRule}{&sgrs},
-		})
-	})
-	return sgrs, err
-}
-
-// See the CloudServersProvider interface for details.
-func (gsp *genericServersProvider) CreateDefaultSGRule(r SGRule) (*SGRule, error) {
-	var sgr *SGRule
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		ep := fmt.Sprintf("%s/os-security-group-default-rules", gsp.endpoint)
-		return perigee.Post(ep, perigee.Options{
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-			Results: &struct{Security_group_default_rule **SGRule}{&sgr},
-			ReqBody: struct{Security_group_default_rule SGRule `json:"security_group_default_rule"`}{r},
-		})
-	})
-	return sgr, err
-}
-
-// See the CloudServersProvider interface for details.
-func (gsp *genericServersProvider) GetSGRule(id string) (*SGRule, error) {
-	var sgr *SGRule
-	err := gsp.context.WithReauth(gsp.access, func() error {
-		ep := fmt.Sprintf("%s/os-security-group-default-rules/%s", gsp.endpoint, id)
-		return perigee.Get(ep, perigee.Options{
-			MoreHeaders: map[string]string{
-				"X-Auth-Token": gsp.access.AuthToken(),
-			},
-			Results: &struct{Security_group_default_rule **SGRule}{&sgr},
-		})
-	})
-	return sgr, err
-}
-
-// SecurityGroup provides a description of a security group, including all its rules.
-type SecurityGroup struct {
-	Description string   `json:"description,omitempty"`
-	Id          int      `json:"id,omitempty"`
-	Name        string   `json:"name,omitempty"`
-	Rules       []SGRule `json:"rules,omitempty"`
-	TenantId    string   `json:"tenant_id,omitempty"`
-}
-
-// SGRule encapsulates a single rule which applies to a security group.
-// This definition is just a guess, based on the documentation found in another extension here: http://docs.openstack.org/api/openstack-compute/2/content/GET_os-security-group-default-rules-v2_listSecGroupDefaultRules_v2__tenant_id__os-security-group-rules_ext-os-security-group-default-rules.html
-type SGRule struct {
-	FromPort   int                    `json:"from_port,omitempty"`
-	Id         int                    `json:"id,omitempty"`
-	IpProtocol string                 `json:"ip_protocol,omitempty"`
-	IpRange    map[string]interface{} `json:"ip_range,omitempty"`
-	ToPort     int                    `json:"to_port,omitempty"`
-}
-
-// RaxBandwidth provides measurement of server bandwidth consumed over a given audit interval.
-type RaxBandwidth struct {
-	AuditPeriodEnd    string `json:"audit_period_end"`
-	AuditPeriodStart  string `json:"audit_period_start"`
-	BandwidthInbound  int64  `json:"bandwidth_inbound"`
-	BandwidthOutbound int64  `json:"bandwidth_outbound"`
-	Interface         string `json:"interface"`
-}
-
-// A VersionedAddress denotes either an IPv4 or IPv6 (depending on version indicated)
-// address.
-type VersionedAddress struct {
-	Addr    string `json:"addr"`
-	Version int    `json:"version"`
-}
-
-// An AddressSet provides a set of public and private IP addresses for a resource.
-// Each address has a version to identify if IPv4 or IPv6.
-type AddressSet struct {
-	Public  []VersionedAddress `json:"public"`
-	Private []VersionedAddress `json:"private"`
-}
-
-type NetworkAddress map[string][]VersionedAddress
-
-// Server records represent (virtual) hardware instances (not configurations) accessible by the user.
-//
-// The AccessIPv4 / AccessIPv6 fields provides IP addresses for the server in the IPv4 or IPv6 format, respectively.
-//
-// Addresses provides addresses for any attached isolated networks.
-// The version field indicates whether the IP address is version 4 or 6.
-//
-// Created tells when the server entity was created.
-//
-// The Flavor field includes the flavor ID and flavor links.
-//
-// The compute provisioning algorithm has an anti-affinity property that
-// attempts to spread customer VMs across hosts.
-// Under certain situations,
-// VMs from the same customer might be placed on the same host.
-// The HostId field represents the host your server runs on and
-// can be used to determine this scenario if it is relevant to your application.
-// Note that HostId is unique only per account; it is not globally unique.
-//
-// Id provides the server's unique identifier.
-// This field must be treated opaquely.
-//
-// Image indicates which image is installed on the server.
-//
-// Links provides one or more means of accessing the server.
-//
-// Metadata provides a small key-value store for application-specific information.
-//
-// Name provides a human-readable name for the server.
-//
-// Progress indicates how far along it is towards being provisioned.
-// 100 represents complete, while 0 represents just beginning.
-//
-// Status provides an indication of what the server's doing at the moment.
-// A server will be in ACTIVE state if it's ready for use.
-//
-// OsDcfDiskConfig indicates the server's boot volume configuration.
-// Valid values are:
-//     AUTO
-//     ----
-//     The server is built with a single partition the size of the target flavor disk.
-//     The file system is automatically adjusted to fit the entire partition.
-//     This keeps things simple and automated.
-//     AUTO is valid only for images and servers with a single partition that use the EXT3 file system.
-//     This is the default setting for applicable Rackspace base images.
-//
-//     MANUAL
-//     ------
-//     The server is built using whatever partition scheme and file system is in the source image.
-//     If the target flavor disk is larger,
-//     the remaining disk space is left unpartitioned.
-//     This enables images to have non-EXT3 file systems, multiple partitions, and so on,
-//     and enables you to manage the disk configuration.
-//
-// RaxBandwidth provides measures of the server's inbound and outbound bandwidth per interface.
-//
-// OsExtStsPowerState provides an indication of the server's power.
-// This field appears to be a set of flag bits:
-//
-//           ... 4  3   2   1   0
-//         +--//--+---+---+---+---+
-//         | .... | 0 | S | 0 | I |
-//         +--//--+---+---+---+---+
-//                      |       |
-//                      |       +---  0=Instance is down.
-//                      |             1=Instance is up.
-//                      |
-//                      +-----------  0=Server is switched ON.
-//                                    1=Server is switched OFF.
-//                                    (note reverse logic.)
-//
-// Unused bits should be ignored when read, and written as 0 for future compatibility.
-//
-// OsExtStsTaskState and OsExtStsVmState work together
-// to provide visibility in the provisioning process for the instance.
-// Consult Rackspace documentation at
-// http://docs.rackspace.com/servers/api/v2/cs-devguide/content/ch_extensions.html#ext_status
-// for more details.  It's too lengthy to include here.
-type Server struct {
-	AccessIPv4         string            `json:"accessIPv4"`
-	AccessIPv6         string            `json:"accessIPv6"`
-	Addresses          AddressSet        `json:"addresses"`
-	Created            string            `json:"created"`
-	Flavor             FlavorLink        `json:"flavor"`
-	HostId             string            `json:"hostId"`
-	Id                 string            `json:"id"`
-	Image              ImageLink         `json:"image"`
-	Links              []Link            `json:"links"`
-	Metadata           map[string]string `json:"metadata"`
-	Name               string            `json:"name"`
-	Progress           int               `json:"progress"`
-	Status             string            `json:"status"`
-	TenantId           string            `json:"tenant_id"`
-	Updated            string            `json:"updated"`
-	UserId             string            `json:"user_id"`
-	OsDcfDiskConfig    string            `json:"OS-DCF:diskConfig"`
-	RaxBandwidth       []RaxBandwidth    `json:"rax-bandwidth:bandwidth"`
-	OsExtStsPowerState int               `json:"OS-EXT-STS:power_state"`
-	OsExtStsTaskState  string            `json:"OS-EXT-STS:task_state"`
-	OsExtStsVmState    string            `json:"OS-EXT-STS:vm_state"`
-}
-
-// NewServerSettings structures record those fields of the Server structure to change
-// when updating a server (see UpdateServer method).
-type NewServerSettings struct {
-	Name       string `json:"name,omitempty"`
-	AccessIPv4 string `json:"accessIPv4,omitempty"`
-	AccessIPv6 string `json:"accessIPv6,omitempty"`
-}
-
-// NewServer structures are used for both requests and responses.
-// The fields discussed below are relevent for server-creation purposes.
-//
-// The Name field contains the desired name of the server.
-// Note that (at present) Rackspace permits more than one server with the same name;
-// however, software should not depend on this.
-// Not only will Rackspace support thank you, so will your own devops engineers.
-// A name is required.
-//
-// The ImageRef field contains the ID of the desired software image to place on the server.
-// This ID must be found in the image slice returned by the Images() function.
-// This field is required.
-//
-// The FlavorRef field contains the ID of the server configuration desired for deployment.
-// This ID must be found in the flavor slice returned by the Flavors() function.
-// This field is required.
-//
-// For OsDcfDiskConfig, refer to the Image or Server structure documentation.
-// This field defaults to "AUTO" if not explicitly provided.
-//
-// Metadata contains a small key/value association of arbitrary data.
-// Neither Rackspace nor OpenStack places significance on this field in any way.
-// This field defaults to an empty map if not provided.
-//
-// Personality specifies the contents of certain files in the server's filesystem.
-// The files and their contents are mapped through a slice of FileConfig structures.
-// If not provided, all filesystem entities retain their image-specific configuration.
-//
-// Networks specifies an affinity for the server's various networks and interfaces.
-// Networks are identified through UUIDs; see NetworkConfig structure documentation for more details.
-// If not provided, network affinity is determined automatically.
-//
-// The AdminPass field may be used to provide a root- or administrator-password
-// during the server provisioning process.
-// If not provided, a random password will be automatically generated and returned in this field.
-//
-// The following fields are intended to be used to communicate certain results about the server being provisioned.
-// When attempting to create a new server, these fields MUST not be provided.
-// They'll be filled in by the response received from the Rackspace APIs.
-//
-// The Id field contains the server's unique identifier.
-// The identifier's scope is best assumed to be bound by the user's account, unless other arrangements have been made with Rackspace.
-//
-// Any Links provided are used to refer to the server specifically by URL.
-// These links are useful for making additional REST calls not explicitly supported by Gorax.
-type NewServer struct {
-	Name            string                   `json:"name,omitempty"`
-	ImageRef        string                   `json:"imageRef,omitempty"`
-	FlavorRef       string                   `json:"flavorRef,omitempty"`
-	Metadata        map[string]string        `json:"metadata,omitempty"`
-	Personality     []FileConfig             `json:"personality,omitempty"`
-	Networks        []NetworkConfig          `json:"networks,omitempty"`
-	AdminPass       string                   `json:"adminPass,omitempty"`
-	KeyPairName     string                   `json:"key_name,omitempty"`
-	Id              string                   `json:"id,omitempty"`
-	Links           []Link                   `json:"links,omitempty"`
-	OsDcfDiskConfig string                   `json:"OS-DCF:diskConfig,omitempty"`
-	SecurityGroup   []map[string]interface{} `json:"security_groups,omitempty"`
-	ConfigDrive     bool                     `json:"config_drive"`
-	UserData        string                   `json:"user_data"`
-}
-
-// ResizeRequest structures are used internally to encode to JSON the parameters required to resize a server instance.
-// Client applications will not use this structure (no API accepts an instance of this structure).
-// See the Region method ResizeServer() for more details on how to resize a server.
-type ResizeRequest struct {
-	Name       string `json:"name,omitempty"`
-	FlavorRef  string `json:"flavorRef"`
-	DiskConfig string `json:"OS-DCF:diskConfig,omitempty"`
-}
-
-type CreateImage struct {
-	Name     string            `json:"name"`
-	Metadata map[string]string `json:"metadata,omitempty"`
-}
diff --git a/servers_test.go b/servers_test.go
deleted file mode 100644
index 60c71c8..0000000
--- a/servers_test.go
+++ /dev/null
@@ -1,54 +0,0 @@
-package gophercloud
-
-import (
-	"net/http"
-	"testing"
-)
-
-type testAccess struct {
-	public, internal              string
-	calledFirstEndpointByCriteria int
-}
-
-func (ta *testAccess) FirstEndpointUrlByCriteria(ac ApiCriteria) string {
-	ta.calledFirstEndpointByCriteria++
-	urls := []string{ta.public, ta.internal}
-	return urls[ac.UrlChoice]
-}
-
-func (ta *testAccess) AuthToken() string {
-	return ""
-}
-
-func (ta *testAccess) Revoke(string) error {
-	return nil
-}
-
-func (ta *testAccess) Reauthenticate() error {
-	return nil
-}
-
-func TestGetServersApi(t *testing.T) {
-	c := TestContext().UseCustomClient(&http.Client{Transport: newTransport().WithResponse("Hello")})
-
-	acc := &testAccess{
-		public:   "http://localhost:8080",
-		internal: "http://localhost:8086",
-	}
-
-	_, err := c.ServersApi(acc, ApiCriteria{
-		Name:      "cloudComputeOpenStack",
-		Region:    "dfw",
-		VersionId: "2",
-	})
-
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	if acc.calledFirstEndpointByCriteria != 1 {
-		t.Error("Expected FirstEndpointByCriteria to be called")
-		return
-	}
-}
diff --git a/service_catalog.go b/service_catalog.go
deleted file mode 100644
index e6cf4a0..0000000
--- a/service_catalog.go
+++ /dev/null
@@ -1,75 +0,0 @@
-package gophercloud
-
-import (
-	"os"
-	"strings"
-)
-
-// ApiCriteria provides one or more criteria for the SDK to look for appropriate endpoints.
-// Fields left unspecified or otherwise set to their zero-values are assumed to not be
-// relevant, and do not participate in the endpoint search.
-//
-// Name specifies the desired service catalog entry name.
-// Type specifies the desired service catalog entry type.
-// Region specifies the desired endpoint region.
-// If unset, Gophercloud will try to use the region set in the
-// OS_REGION_NAME environment variable.  If that's not set,
-// region comparison will not occur.  If OS_REGION_NAME is set
-// and IgnoreEnvVars is also set, OS_REGION_NAME will be ignored.
-// VersionId specifies the desired version of the endpoint.
-// Note that this field is matched exactly, and is (at present)
-// opaque to Gophercloud.  Thus, requesting a version 2
-// endpoint will _not_ match a version 3 endpoint.
-// The UrlChoice field inidicates whether or not gophercloud
-// should use the public or internal endpoint URL if a
-// candidate endpoint is found.
-// IgnoreEnvVars instructs Gophercloud to ignore helpful environment variables.
-type ApiCriteria struct {
-	Name          string
-	Type          string
-	Region        string
-	VersionId     string
-	UrlChoice     int
-	IgnoreEnvVars bool
-}
-
-// The choices available for UrlChoice.  See the ApiCriteria structure for details.
-const (
-	PublicURL = iota
-	InternalURL
-)
-
-// Given a set of criteria to match on, locate the first candidate endpoint
-// in the provided service catalog.
-//
-// If nothing found, the result will be a zero-valued EntryEndpoint (all URLs
-// set to "").
-func FindFirstEndpointByCriteria(entries []CatalogEntry, ac ApiCriteria) EntryEndpoint {
-	rgn := strings.ToUpper(ac.Region)
-	if (rgn == "") && !ac.IgnoreEnvVars {
-		rgn = os.Getenv("OS_REGION_NAME")
-	}
-
-	for _, entry := range entries {
-		if (ac.Name != "") && (ac.Name != entry.Name) {
-			continue
-		}
-
-		if (ac.Type != "") && (ac.Type != entry.Type) {
-			continue
-		}
-
-		for _, endpoint := range entry.Endpoints {
-			if (rgn != "") && (rgn != strings.ToUpper(endpoint.Region)) {
-				continue
-			}
-
-			if (ac.VersionId != "") && (ac.VersionId != endpoint.VersionId) {
-				continue
-			}
-
-			return endpoint
-		}
-	}
-	return EntryEndpoint{}
-}
diff --git a/service_catalog_test.go b/service_catalog_test.go
deleted file mode 100644
index b78f01f..0000000
--- a/service_catalog_test.go
+++ /dev/null
@@ -1,190 +0,0 @@
-package gophercloud
-
-import (
-	"os"
-	"testing"
-)
-
-// TestFFEBCViaEnvVariable exercises only those calls where a region
-// parameter is required, but is provided by an environment variable.
-func TestFFEBCViaEnvVariable(t *testing.T) {
-	changeRegion("RGN")
-
-	endpoint := FindFirstEndpointByCriteria(
-		catalog("test", "compute", "http://localhost", "", ""),
-		ApiCriteria{Name: "test"},
-	)
-	if endpoint.PublicURL != "" {
-		t.Error("If provided, the Region qualifier must exclude endpoints with missing or mismatching regions.")
-		return
-	}
-
-	endpoint = FindFirstEndpointByCriteria(
-		catalog("test", "compute", "http://localhost", "rgn", ""),
-		ApiCriteria{Name: "test"},
-	)
-	if endpoint.PublicURL != "http://localhost" {
-		t.Error("Regions are case insensitive.")
-		return
-	}
-
-	endpoint = FindFirstEndpointByCriteria(
-		catalog("test", "compute", "http://localhost", "rgn", ""),
-		ApiCriteria{Name: "test", VersionId: "2"},
-	)
-	if endpoint.PublicURL != "" {
-		t.Error("Missing version ID means no match.")
-		return
-	}
-
-	endpoint = FindFirstEndpointByCriteria(
-		catalog("test", "compute", "http://localhost", "rgn", "3"),
-		ApiCriteria{Name: "test", VersionId: "2"},
-	)
-	if endpoint.PublicURL != "" {
-		t.Error("Mismatched version ID means no match.")
-		return
-	}
-
-	endpoint = FindFirstEndpointByCriteria(
-		catalog("test", "compute", "http://localhost", "rgn", "2"),
-		ApiCriteria{Name: "test", VersionId: "2"},
-	)
-	if endpoint.PublicURL != "http://localhost" {
-		t.Error("All search criteria met; endpoint expected.")
-		return
-	}
-}
-
-// TestFFEBCViaRegionOption exercises only those calls where a region
-// parameter is specified explicitly.  The region option overrides
-// any defined OS_REGION_NAME environment setting.
-func TestFFEBCViaRegionOption(t *testing.T) {
-	changeRegion("Starfleet Command")
-
-	endpoint := FindFirstEndpointByCriteria(
-		catalog("test", "compute", "http://localhost", "", ""),
-		ApiCriteria{Name: "test", Region: "RGN"},
-	)
-	if endpoint.PublicURL != "" {
-		t.Error("If provided, the Region qualifier must exclude endpoints with missing or mismatching regions.")
-		return
-	}
-
-	endpoint = FindFirstEndpointByCriteria(
-		catalog("test", "compute", "http://localhost", "rgn", ""),
-		ApiCriteria{Name: "test", Region: "RGN"},
-	)
-	if endpoint.PublicURL != "http://localhost" {
-		t.Error("Regions are case insensitive.")
-		return
-	}
-
-	endpoint = FindFirstEndpointByCriteria(
-		catalog("test", "compute", "http://localhost", "rgn", ""),
-		ApiCriteria{Name: "test", Region: "RGN", VersionId: "2"},
-	)
-	if endpoint.PublicURL != "" {
-		t.Error("Missing version ID means no match.")
-		return
-	}
-
-	endpoint = FindFirstEndpointByCriteria(
-		catalog("test", "compute", "http://localhost", "rgn", "3"),
-		ApiCriteria{Name: "test", Region: "RGN", VersionId: "2"},
-	)
-	if endpoint.PublicURL != "" {
-		t.Error("Mismatched version ID means no match.")
-		return
-	}
-
-	endpoint = FindFirstEndpointByCriteria(
-		catalog("test", "compute", "http://localhost", "rgn", "2"),
-		ApiCriteria{Name: "test", Region: "RGN", VersionId: "2"},
-	)
-	if endpoint.PublicURL != "http://localhost" {
-		t.Error("All search criteria met; endpoint expected.")
-		return
-	}
-}
-
-// TestFFEBCWithoutRegion exercises only those calls where a region
-// is irrelevant.  Just to make sure, though, we enforce Gophercloud
-// from paying any attention to OS_REGION_NAME if it happens to be set.
-func TestFindFirstEndpointByCriteria(t *testing.T) {
-	endpoint := FindFirstEndpointByCriteria([]CatalogEntry{}, ApiCriteria{Name: "test", IgnoreEnvVars: true})
-	if endpoint.PublicURL != "" {
-		t.Error("Not expecting to find anything in an empty service catalog.")
-		return
-	}
-
-	endpoint = FindFirstEndpointByCriteria(
-		[]CatalogEntry{
-			{Name: "test"},
-		},
-		ApiCriteria{Name: "test", IgnoreEnvVars: true},
-	)
-	if endpoint.PublicURL != "" {
-		t.Error("Even though we have a matching entry, no endpoints exist")
-		return
-	}
-
-	endpoint = FindFirstEndpointByCriteria(
-		catalog("test", "compute", "http://localhost", "", ""),
-		ApiCriteria{Name: "test", IgnoreEnvVars: true},
-	)
-	if endpoint.PublicURL != "http://localhost" {
-		t.Error("Looking for an endpoint by name but without region or version ID should match first entry endpoint.")
-		return
-	}
-
-	endpoint = FindFirstEndpointByCriteria(
-		catalog("test", "compute", "http://localhost", "", ""),
-		ApiCriteria{Type: "compute", IgnoreEnvVars: true},
-	)
-	if endpoint.PublicURL != "http://localhost" {
-		t.Error("Looking for an endpoint by type but without region or version ID should match first entry endpoint.")
-		return
-	}
-
-	endpoint = FindFirstEndpointByCriteria(
-		catalog("test", "compute", "http://localhost", "", ""),
-		ApiCriteria{Type: "identity", IgnoreEnvVars: true},
-	)
-	if endpoint.PublicURL != "" {
-		t.Error("Returned mismatched type.")
-		return
-	}
-
-	endpoint = FindFirstEndpointByCriteria(
-		catalog("test", "compute", "http://localhost", "ord", "2"),
-		ApiCriteria{Name: "test", VersionId: "2", IgnoreEnvVars: true},
-	)
-	if endpoint.PublicURL != "http://localhost" {
-		t.Error("Sometimes, you might not care what region your stuff is in.")
-		return
-	}
-}
-
-func catalog(name, entry_type, url, region, version string) []CatalogEntry {
-	return []CatalogEntry{
-		{
-			Name: name,
-			Type: entry_type,
-			Endpoints: []EntryEndpoint{
-				{
-					PublicURL: url,
-					Region:    region,
-					VersionId: version,
-				},
-			},
-		},
-	}
-}
-
-func changeRegion(r string) {
-	err := os.Setenv("OS_REGION_NAME", r)
-	if err != nil {
-		panic(err)
-	}
-}
diff --git a/transport_double_test.go b/transport_double_test.go
deleted file mode 100644
index ef7f19a..0000000
--- a/transport_double_test.go
+++ /dev/null
@@ -1,103 +0,0 @@
-package gophercloud
-
-import (
-	"encoding/json"
-	"fmt"
-	"io/ioutil"
-	"net/http"
-	"strings"
-	"testing"
-)
-
-type transport struct {
-	called         int
-	response       string
-	expectTenantId bool
-	tenantIdFound  bool
-	status         int
-}
-
-func (t *transport) RoundTrip(req *http.Request) (rsp *http.Response, err error) {
-	var authContainer *AuthContainer
-
-	t.called++
-
-	headers := make(http.Header)
-	headers.Add("Content-Type", "application/xml; charset=UTF-8")
-
-	body := ioutil.NopCloser(strings.NewReader(t.response))
-
-	if t.status == 0 {
-		t.status = 200
-	}
-	statusMsg := "OK"
-	if (t.status < 200) || (299 < t.status) {
-		statusMsg = "Error"
-	}
-
-	rsp = &http.Response{
-		Status:           fmt.Sprintf("%d %s", t.status, statusMsg),
-		StatusCode:       t.status,
-		Proto:            "HTTP/1.1",
-		ProtoMajor:       1,
-		ProtoMinor:       1,
-		Header:           headers,
-		Body:             body,
-		ContentLength:    -1,
-		TransferEncoding: nil,
-		Close:            true,
-		Trailer:          nil,
-		Request:          req,
-	}
-
-	bytes, err := ioutil.ReadAll(req.Body)
-	if err != nil {
-		return nil, err
-	}
-	err = json.Unmarshal(bytes, &authContainer)
-	if err != nil {
-		return nil, err
-	}
-	t.tenantIdFound = (authContainer.Auth.TenantId != "")
-
-	if t.tenantIdFound != t.expectTenantId {
-		rsp.Status = "500 Internal Server Error"
-		rsp.StatusCode = 500
-	}
-	return
-}
-
-func newTransport() *transport {
-	return &transport{}
-}
-
-func (t *transport) IgnoreTenantId() *transport {
-	t.expectTenantId = false
-	return t
-}
-
-func (t *transport) ExpectTenantId() *transport {
-	t.expectTenantId = true
-	return t
-}
-
-func (t *transport) WithResponse(r string) *transport {
-	t.response = r
-	t.status = 200
-	return t
-}
-
-func (t *transport) WithError(code int) *transport {
-	t.response = fmt.Sprintf("Error %d", code)
-	t.status = code
-	return t
-}
-
-func (t *transport) VerifyCalls(test *testing.T, n int) error {
-	if t.called != n {
-		err := fmt.Errorf("Expected Transport to be called %d times; found %d instead", n, t.called)
-		test.Error(err)
-		return err
-	}
-	return nil
-}
