create volume
diff --git a/openstack/blockstorage/v1/volumes/requests.go b/openstack/blockstorage/v1/volumes/requests.go
new file mode 100644
index 0000000..b1f45cd
--- /dev/null
+++ b/openstack/blockstorage/v1/volumes/requests.go
@@ -0,0 +1,23 @@
+package volumes
+
+import (
+	"github.com/racker/perigee"
+	blockstorage "github.com/rackspace/gophercloud/openstack/blockstorage/v1"
+)
+
+func Create(c *blockstorage.Client, opts CreateOpts) (Volume, error) {
+	var v Volume
+	h, err := c.GetHeaders()
+	if err != nil {
+		return v, err
+	}
+	url := c.GetVolumeURL()
+	_, err = perigee.Request("POST", url, perigee.Options{
+		Results: &v,
+		ReqBody: map[string]interface{}{
+			"volume": opts,
+		},
+		MoreHeaders: h,
+	})
+	return v, err
+}
diff --git a/openstack/blockstorage/v1/volumes/volumes.go b/openstack/blockstorage/v1/volumes/volumes.go
new file mode 100644
index 0000000..35c416b
--- /dev/null
+++ b/openstack/blockstorage/v1/volumes/volumes.go
@@ -0,0 +1,16 @@
+package volumes
+
+type Volume map[string]interface{}
+
+type CreateOpts struct {
+	Availability_zone   string            `json:"size"`
+	Source_volid        string            `json:"source_volid"`
+	Display_description string            `json:"display_description"`
+	Snapshot_id         string            `json:"snapshot_id"`
+	Size                int               `json:"size"`
+	Display_name        string            `json:"display_name"`
+	ImageRef            string            `json:"imageRef"`
+	Volume_type         string            `json:"volume_type"`
+	Bootable            bool              `json:"bootable"`
+	Metadata            map[string]string `json:"metadata"`
+}