diff --git a/acceptance/openstack/blockstorage/v1/volumes_test.go b/acceptance/openstack/blockstorage/v1/volumes_test.go
index b6f6335..145fde0 100644
--- a/acceptance/openstack/blockstorage/v1/volumes_test.go
+++ b/acceptance/openstack/blockstorage/v1/volumes_test.go
@@ -3,6 +3,7 @@
 package v1
 
 import (
+	"fmt"
 	"os"
 	"strconv"
 	"testing"
@@ -39,8 +40,9 @@
 		t.Fatalf("Failed to create Block Storage v1 client: %v", err)
 	}
 
+	var cv *volumes.Volume
 	for i := 0; i < numVols; i++ {
-		cv, err := volumes.Create(client, volumes.VolumeOpts{
+		cv, err = volumes.Create(client, volumes.VolumeOpts{
 			Size: 1,
 			Name: "gophercloud-test-volume-" + strconv.Itoa(i),
 		})
@@ -59,6 +61,18 @@
 
 	}
 
+	gr, err := volumes.Get(client, cv.ID)
+	if err != nil {
+		t.Error(err)
+		return
+	}
+	v, err := volumes.ExtractVolume(gr)
+	if err != nil {
+		t.Error(err)
+		return
+	}
+	fmt.Printf("Got volume: %+v\n", v)
+
 	pager := volumes.List(client, volumes.ListOpts{})
 	if err != nil {
 		t.Error(err)
diff --git a/openstack/blockstorage/v1/volumes/requests.go b/openstack/blockstorage/v1/volumes/requests.go
index f32e061..7de272f 100644
--- a/openstack/blockstorage/v1/volumes/requests.go
+++ b/openstack/blockstorage/v1/volumes/requests.go
@@ -76,23 +76,14 @@
 	return pagination.NewPager(client, volumesURL(client), createPage)
 }
 
-/*
-func Get(c *blockstorage.Client, opts GetOpts) (Volume, error) {
-	var v Volume
-	h, err := c.GetHeaders()
-	if err != nil {
-		return v, err
-	}
-	url := c.GetVolumeURL(opts["id"])
-	_, err = perigee.Request("GET", url, perigee.Options{
-		Results: &struct {
-			Volume *Volume `json:"volume"`
-		}{&v},
-		MoreHeaders: h,
+func Get(client *gophercloud.ServiceClient, id string) (GetResult, error) {
+	var gr GetResult
+	_, err := perigee.Request("GET", volumeURL(client, id), perigee.Options{
+		Results:     &gr,
+		MoreHeaders: client.Provider.AuthenticatedHeaders(),
 	})
-	return v, err
+	return gr, err
 }
-*/
 
 func Delete(client *gophercloud.ServiceClient, id string) error {
 	_, err := perigee.Request("DELETE", volumeURL(client, id), perigee.Options{
diff --git a/openstack/blockstorage/v1/volumes/results.go b/openstack/blockstorage/v1/volumes/results.go
index 429ab8c..ebf788e 100644
--- a/openstack/blockstorage/v1/volumes/results.go
+++ b/openstack/blockstorage/v1/volumes/results.go
@@ -1,27 +1,30 @@
 package volumes
 
 import (
+	"fmt"
+
 	"github.com/rackspace/gophercloud/pagination"
 
 	"github.com/mitchellh/mapstructure"
 )
 
 type Volume struct {
-	Status           string
-	Name             string
-	Attachments      []string
-	AvailabilityZone string
-	Bootable         bool
-	CreatedAt        string
-	Description      string
-	VolumeType       string
-	SnapshotID       string
-	SourceVolID      string
-	Metadata         map[string]string
-	ID               string
-	Size             int
+	Status           string            `mapstructure:"status"`
+	Name             string            `mapstructure:"display_name"`
+	Attachments      []string          `mapstructure:"attachments"`
+	AvailabilityZone string            `mapstructure:"availability_zone"`
+	Bootable         string            `mapstructure:"bootable"`
+	CreatedAt        string            `mapstructure:"created_at"`
+	Description      string            `mapstructure:"display_discription"`
+	VolumeType       string            `mapstructure:"volume_type"`
+	SnapshotID       string            `mapstructure:"snapshot_id"`
+	SourceVolID      string            `mapstructure:"source_volid"`
+	Metadata         map[string]string `mapstructure:"metadata"`
+	ID               string            `mapstructure:"id"`
+	Size             int               `mapstructure:"size"`
 }
 
+// ListOpts holds options for listing volumes. It is passed to the volumes.List function.
 type ListOpts struct {
 	// AllTenants is an admin-only option. Set it to true to see a tenant volumes.
 	AllTenants bool
@@ -47,6 +50,7 @@
 	return len(volumes) == 0, nil
 }
 
+// ExtractVolumes extracts and returns the Volumes from a 'List' request.
 func ExtractVolumes(page pagination.Page) ([]Volume, error) {
 	var response struct {
 		Volumes []Volume `json:"volumes"`
@@ -55,3 +59,18 @@
 	err := mapstructure.Decode(page.(ListResult).Body, &response)
 	return response.Volumes, err
 }
+
+type GetResult map[string]interface{}
+
+// ExtractVolume extracts and returns the Volume from a 'Get' request.
+func ExtractVolume(gr GetResult) (*Volume, error) {
+	var response struct {
+		Volume *Volume `json:"volume"`
+	}
+
+	err := mapstructure.Decode(gr, &response)
+	if err != nil {
+		return nil, fmt.Errorf("volumes: Error decoding volumes.GetResult: %v", err)
+	}
+	return response.Volume, nil
+}
