diff --git a/acceptance/openstack/compute_test.go b/acceptance/openstack/compute_test.go
index d44140b..27386ed 100644
--- a/acceptance/openstack/compute_test.go
+++ b/acceptance/openstack/compute_test.go
@@ -11,43 +11,62 @@
 	"text/tabwriter"
 )
 
+type testState struct {
+	o	identity.AuthOptions
+	a	identity.AuthResults
+	sc	*identity.ServiceCatalog
+	eps	[]identity.Endpoint
+	w	*tabwriter.Writer
+}
+
+func prepForTest() (*testState, error) {
+	var err error
+
+	ts := new(testState)
+
+	ts.o, err = utils.AuthOptions()
+	if err != nil {
+		return ts, err
+	}
+
+	ts.a, err = identity.Authenticate(ts.o)
+	if err != nil {
+		return ts, err
+	}
+
+	ts.sc, err = identity.GetServiceCatalog(ts.a)
+	if err != nil {
+		return ts, err
+	}
+
+	ts.eps, err = findAllComputeEndpoints(ts.sc)
+	if err != nil {
+		return ts, err
+	}
+
+	ts.w = new(tabwriter.Writer)
+	ts.w.Init(os.Stdout, 2, 8, 2, ' ', 0)
+
+	return ts, nil
+}
+
 func TestListServers(t *testing.T) {
-	ao, err := utils.AuthOptions()
+	ts, err := prepForTest()
 	if err != nil {
 		t.Error(err)
 		return
 	}
 
-	a, err := identity.Authenticate(ao)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	sc, err := identity.GetServiceCatalog(a)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	eps, err := findAllComputeEndpoints(sc)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	w := new(tabwriter.Writer)
-	w.Init(os.Stdout, 2, 8, 2, ' ', 0)
-	fmt.Fprintln(w, "ID\tRegion\tName\tIPv4\tIPv6\t")
+	fmt.Fprintln(ts.w, "ID\tRegion\tName\tIPv4\tIPv6\t")
 
 	region := os.Getenv("OS_REGION_NAME")
 	n := 0
-	for _, ep := range eps {
+	for _, ep := range ts.eps {
 		if (region != "") && (region != ep.Region) {
 			continue
 		}
 
-		client := servers.NewClient(ep.PublicURL, a, ao)
+		client := servers.NewClient(ep.PublicURL, ts.a, ts.o)
 
 		listResults, err := servers.List(client)
 		if err != nil {
@@ -64,65 +83,30 @@
 		n = n + len(svrs)
 
 		for _, s := range svrs {
-			fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t\n", s.Id, s.Name, ep.Region, s.AccessIPv4, s.AccessIPv6)
+			fmt.Fprintf(ts.w, "%s\t%s\t%s\t%s\t%s\t\n", s.Id, s.Name, ep.Region, s.AccessIPv4, s.AccessIPv6)
 		}
 	}
-	w.Flush()
+	ts.w.Flush()
 	fmt.Printf("--------\n%d servers listed.\n", n)
 }
 
-func findAllComputeEndpoints(sc *identity.ServiceCatalog) ([]identity.Endpoint, error) {
-	ces, err := sc.CatalogEntries()
-	if err != nil {
-		return nil, err
-	}
-
-	for _, ce := range ces {
-		if ce.Type == "compute" {
-			return ce.Endpoints, nil
-		}
-	}
-
-	return nil, fmt.Errorf("Compute endpoint not found.")
-}
-
 func TestListImages(t *testing.T) {
-	ao, err := utils.AuthOptions()
+	ts, err := prepForTest()
 	if err != nil {
 		t.Error(err)
 		return
 	}
 
-	a, err := identity.Authenticate(ao)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	sc, err := identity.GetServiceCatalog(a)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	eps, err := findAllComputeEndpoints(sc)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	w := new(tabwriter.Writer)
-	w.Init(os.Stdout, 2, 8, 2, ' ', 0)
-	fmt.Fprintln(w, "ID\tRegion\tName\tStatus\tCreated\t")
+	fmt.Fprintln(ts.w, "ID\tRegion\tName\tStatus\tCreated\t")
 
 	region := os.Getenv("OS_REGION_NAME")
 	n := 0
-	for _, ep := range eps {
+	for _, ep := range ts.eps {
 		if (region != "") && (region != ep.Region) {
 			continue
 		}
 
-		client := images.NewClient(ep.PublicURL, a, ao)
+		client := images.NewClient(ep.PublicURL, ts.a, ts.o)
 
 		listResults, err := images.List(client)
 		if err != nil {
@@ -139,10 +123,65 @@
 		n = n + len(imgs)
 
 		for _, i := range imgs {
-			fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t\n", i.Id, ep.Region, i.Name, i.Status, i.Created)
+			fmt.Fprintf(ts.w, "%s\t%s\t%s\t%s\t%s\t\n", i.Id, ep.Region, i.Name, i.Status, i.Created)
 		}
 	}
-	w.Flush()
+	ts.w.Flush()
 	fmt.Printf("--------\n%d images listed.\n", n)
 }
 
+func TestListFlavors(t *testing.T) {
+	ts, err := prepForTest()
+	if err != nil {
+		t.Error(err)
+		return
+	}
+
+	fmt.Fprintln(ts.w, "ID\tRegion\tName\tStatus\tCreated\t")
+
+	region := os.Getenv("OS_REGION_NAME")
+	n := 0
+	for _, ep := range ts.eps {
+		if (region != "") && (region != ep.Region) {
+			continue
+		}
+
+		client := flavors.NewClient(ep.PublicURL, ts.a, ts.o)
+
+		listResults, err := flavors.List(client)
+		if err != nil {
+			t.Error(err)
+			return
+		}
+
+		flavs, err := flavors.GetFlavors(listResults)
+		if err != nil {
+			t.Error(err)
+			return
+		}
+
+		n = n + len(flavs)
+
+		for _, f := range flavs {
+			fmt.Fprintf(ts.w, "%s\t%s\t%s\t%s\t%s\t\n", f.Id, ep.Region, f.Name, f.Status, f.Created)
+		}
+	}
+	ts.w.Flush()
+	fmt.Printf("--------\n%d images listed.\n", n)
+}
+
+func findAllComputeEndpoints(sc *identity.ServiceCatalog) ([]identity.Endpoint, error) {
+	ces, err := sc.CatalogEntries()
+	if err != nil {
+		return nil, err
+	}
+
+	for _, ce := range ces {
+		if ce.Type == "compute" {
+			return ce.Endpoints, nil
+		}
+	}
+
+	return nil, fmt.Errorf("Compute endpoint not found.")
+}
+
