diff --git a/acceptance/openstack/compute/v2/bootfromvolume_test.go b/acceptance/openstack/compute/v2/bootfromvolume_test.go
index d1607be..6b73347 100644
--- a/acceptance/openstack/compute/v2/bootfromvolume_test.go
+++ b/acceptance/openstack/compute/v2/bootfromvolume_test.go
@@ -1,33 +1,32 @@
-// +build acceptance
+// +build acceptance compute bootfromvolume
 
 package v2
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud"
 	"github.com/gophercloud/gophercloud/acceptance/tools"
 	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/bootfromvolume"
 	"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
-	th "github.com/gophercloud/gophercloud/testhelper"
 )
 
-func TestBootFromVolume(t *testing.T) {
-	client, err := newClient()
-	th.AssertNoErr(t, err)
-
+func TestBootFromVolumeSingleVolume(t *testing.T) {
 	if testing.Short() {
 		t.Skip("Skipping test that requires server creation in short mode.")
 	}
 
+	client, err := newClient()
+	if err != nil {
+		t.Fatalf("Unable to create a compute client: %v", err)
+	}
+
 	choices, err := ComputeChoicesFromEnv()
 	if err != nil {
 		t.Fatal(err)
 	}
 
-	name := tools.RandomString("Gophercloud-", 8)
-	t.Logf("Creating server [%s].", name)
-
-	bd := []bootfromvolume.BlockDevice{
+	blockDevices := []bootfromvolume.BlockDevice{
 		bootfromvolume.BlockDevice{
 			UUID:       choices.ImageID,
 			SourceType: bootfromvolume.Image,
@@ -35,48 +34,41 @@
 		},
 	}
 
-	serverCreateOpts := servers.CreateOpts{
-		Name:      name,
-		FlavorRef: choices.FlavorID,
-		ImageRef:  choices.ImageID,
+	server, err := createBootableVolumeServer(t, client, blockDevices, choices)
+	if err != nil {
+		t.Fatal("Unable to create server: %v", err)
 	}
-	server, err := bootfromvolume.Create(client, bootfromvolume.CreateOptsExt{
-		serverCreateOpts,
-		bd,
-	}).Extract()
-	th.AssertNoErr(t, err)
 	if err = waitForStatus(client, server, "ACTIVE"); err != nil {
-		t.Fatal(err)
+		t.Fatal("Unable to wait for server: %v", err)
 	}
+	defer deleteServer(t, client, server)
 
-	t.Logf("Created server: %+v\n", server)
-	defer servers.Delete(client, server.ID)
-	t.Logf("Deleting server [%s]...", name)
+	printServer(t, server)
 }
 
-func TestMultiEphemeral(t *testing.T) {
-	client, err := newClient()
-	th.AssertNoErr(t, err)
-
+func TestBootFromVolumeMultiEphemeral(t *testing.T) {
 	if testing.Short() {
 		t.Skip("Skipping test that requires server creation in short mode.")
 	}
 
+	client, err := newClient()
+	if err != nil {
+		t.Fatalf("Unable to create a compute client: %v", err)
+	}
+
 	choices, err := ComputeChoicesFromEnv()
 	if err != nil {
 		t.Fatal(err)
 	}
 
-	name := tools.RandomString("Gophercloud-", 8)
-	t.Logf("Creating server [%s].", name)
-
-	bd := []bootfromvolume.BlockDevice{
+	blockDevices := []bootfromvolume.BlockDevice{
 		bootfromvolume.BlockDevice{
 			BootIndex:           0,
 			UUID:                choices.ImageID,
 			SourceType:          bootfromvolume.Image,
 			DestinationType:     "local",
 			DeleteOnTermination: true,
+			VolumeSize:          5,
 		},
 		bootfromvolume.BlockDevice{
 			BootIndex:           -1,
@@ -96,21 +88,48 @@
 		},
 	}
 
+	server, err := createBootableVolumeServer(t, client, blockDevices, choices)
+	if err != nil {
+		t.Fatalf("Unable to create server: %v", err)
+	}
+	if err = waitForStatus(client, server, "ACTIVE"); err != nil {
+		t.Fatalf("Unable to wait for server: %v", err)
+	}
+	defer deleteServer(t, client, server)
+
+	printServer(t, server)
+}
+
+func createBootableVolumeServer(t *testing.T, client *gophercloud.ServiceClient, blockDevices []bootfromvolume.BlockDevice, choices *ComputeChoices) (*servers.Server, error) {
+	if testing.Short() {
+		t.Skip("Skipping test that requires server creation in short mode.")
+	}
+
+	networkID, err := getNetworkIDFromTenantNetworks(t, client, choices.NetworkName)
+	if err != nil {
+		t.Fatalf("Failed to obtain network ID: %v", err)
+	}
+
+	name := tools.RandomString("ACPTTEST", 16)
+	t.Logf("Attempting to create bootable volume server: %s", name)
+
 	serverCreateOpts := servers.CreateOpts{
 		Name:      name,
 		FlavorRef: choices.FlavorID,
 		ImageRef:  choices.ImageID,
-	}
-	server, err := bootfromvolume.Create(client, bootfromvolume.CreateOptsExt{
-		serverCreateOpts,
-		bd,
-	}).Extract()
-	th.AssertNoErr(t, err)
-	if err = waitForStatus(client, server, "ACTIVE"); err != nil {
-		t.Fatal(err)
+		Networks: []servers.Network{
+			servers.Network{UUID: networkID},
+		},
 	}
 
-	t.Logf("Created server: %+v\n", server)
-	defer servers.Delete(client, server.ID)
-	t.Logf("Deleting server [%s]...", name)
+	server, err := bootfromvolume.Create(client, bootfromvolume.CreateOptsExt{
+		serverCreateOpts,
+		blockDevices,
+	}).Extract()
+
+	if err != nil {
+		return server, err
+	}
+
+	return server, nil
 }
