Create, delete, and query server
diff --git a/openstack/compute/servers/client.go b/openstack/compute/servers/client.go
index a59a339..8b7d1fb 100644
--- a/openstack/compute/servers/client.go
+++ b/openstack/compute/servers/client.go
@@ -26,6 +26,18 @@
 	return fmt.Sprintf("%s/servers/detail", c.endpoint)
 }
 
+func (c *Client) getCreateUrl() string {
+	return fmt.Sprintf("%s/servers", c.endpoint)
+}
+
+func (c *Client) getDeleteUrl(id string) string {
+	return fmt.Sprintf("%s/servers/%s", c.endpoint, id)
+}
+
+func (c *Client) getDetailUrl(id string) string {
+	return c.getDeleteUrl(id)
+}
+
 func (c *Client) getListHeaders() (map[string]string, error) {
 	t, err := c.getAuthToken()
 	if err != nil {
@@ -37,6 +49,18 @@
 	}, nil
 }
 
+func (c *Client) getCreateHeaders() (map[string]string, error) {
+	return c.getListHeaders()
+}
+
+func (c *Client) getDeleteHeaders() (map[string]string, error) {
+	return c.getListHeaders()
+}
+
+func (c *Client) getDetailHeaders() (map[string]string, error) {
+	return c.getListHeaders()
+}
+
 func (c *Client) getAuthToken() (string, error) {
 	var err error
 
diff --git a/openstack/compute/servers/requests.go b/openstack/compute/servers/requests.go
index 0c49159..8506aac 100644
--- a/openstack/compute/servers/requests.go
+++ b/openstack/compute/servers/requests.go
@@ -10,6 +10,8 @@
 // provided through separate, type-safe accessors or methods. 
 type ListResult map[string]interface{}
 
+type ServerResult map[string]interface{}
+
 // List makes a request against the API to list servers accessible to you.
 func List(c *Client) (ListResult, error) {
 	var lr ListResult
@@ -26,3 +28,53 @@
 	return lr, err
 }
 
+// Create requests a server to be provisioned to the user in the current tenant.
+func Create(c *Client, opts map[string]interface{}) (ServerResult, error) {
+	var sr ServerResult
+
+	h, err := c.getCreateHeaders()
+	if err != nil {
+		return nil, err
+	}
+
+	err = perigee.Post(c.getCreateUrl(), perigee.Options{
+		Results: &sr,
+		ReqBody: map[string]interface{} {
+			"server": opts,
+		},
+		MoreHeaders: h,
+		OkCodes: []int{202},
+	})
+	return sr, err
+}
+
+// Delete requests that a server previously provisioned be removed from your account.
+func Delete(c *Client, id string) error {
+	h, err := c.getDeleteHeaders()
+	if err != nil {
+		return err
+	}
+
+	err = perigee.Delete(c.getDeleteUrl(id), perigee.Options{
+		MoreHeaders: h,
+		OkCodes: []int{204},
+	})
+	return err
+}
+
+// GetDetail requests details on a single server, by ID.
+func GetDetail(c *Client, id string) (ServerResult, error) {
+	var sr ServerResult
+
+	h, err := c.getDetailHeaders()
+	if err != nil {
+		return nil, err
+	}
+
+	err = perigee.Get(c.getDetailUrl(id), perigee.Options{
+		Results: &sr,
+		MoreHeaders: h,
+	})
+	return sr, err
+}
+
diff --git a/openstack/compute/servers/servers.go b/openstack/compute/servers/servers.go
index 7061993..c02cf9f 100644
--- a/openstack/compute/servers/servers.go
+++ b/openstack/compute/servers/servers.go
@@ -75,3 +75,15 @@
 	return servers, nil
 }
 
+// GetServer interprets the result of a call expected to return data on a single server.
+func GetServer(sr ServerResult) (*Server, error) {
+	so, ok := sr["server"]
+	if !ok {
+		return nil, ErrNotImplemented
+	}
+	serverObj := so.(map[string]interface{})
+	s := new(Server)
+	err := mapstructure.Decode(serverObj, s)
+	return s, err
+}
+