Add update server call
diff --git a/acceptance/openstack/compute_test.go b/acceptance/openstack/compute_test.go
index c495ebc..5b35b8f 100644
--- a/acceptance/openstack/compute_test.go
+++ b/acceptance/openstack/compute_test.go
@@ -281,6 +281,145 @@
 	}
 }
 
+func TestUpdateServer(t *testing.T) {
+	ts, err := setupForList()
+	if err != nil {
+		t.Error(err)
+		return
+	}
+
+	imageId := os.Getenv("OS_IMAGE_ID")
+	if imageId == "" {
+		t.Error("Expected OS_IMAGE_ID environment variable to be set")
+		return
+	}
+
+	flavorId := os.Getenv("OS_FLAVOR_ID")
+	if flavorId == "" {
+		t.Error("Expected OS_FLAVOR_ID environment variable to be set")
+		return
+	}
+
+	region := os.Getenv("OS_REGION_NAME")
+	if region == "" {
+		region = ts.eps[0].Region
+	}
+
+	ep, err := findEndpointForRegion(ts.eps, region)
+	if err != nil {
+		t.Error(err)
+		return
+	}
+
+	serverName := randomString("ACPTTEST", 16)
+	fmt.Printf("Attempting to create server: %s\n", serverName)
+
+	client := servers.NewClient(ep, ts.a, ts.o)
+
+	cr, err := servers.Create(client, map[string]interface{}{
+		"flavorRef": flavorId,
+		"imageRef": imageId,
+		"name": serverName,
+	})
+	if err != nil {
+		t.Error(err)
+		return
+	}
+
+	createdServer, err := servers.GetServer(cr)
+	if err != nil {
+		t.Error(err)
+		return
+	}
+	defer func() {
+		servers.Delete(client, createdServer.Id)
+	}()
+
+	timeout := 300
+	for ; timeout > 0; timeout-- {
+		gr, err := servers.GetDetail(client, createdServer.Id)
+		if err != nil {
+			t.Error(err)
+			return
+		}
+
+		gottenServer, err := servers.GetServer(gr)
+		if err != nil {
+			t.Error(err)
+			return
+		}
+
+		if gottenServer.Id != createdServer.Id {
+			t.Error("Created server ID (%s) != gotten server ID (%s)", createdServer.Id, gottenServer.Id)
+			return
+		}
+
+		if gottenServer.Status == "ACTIVE" {
+			fmt.Printf("Server created after %d seconds (approximately)\n", 300-timeout)
+			break
+		}
+		time.Sleep(1*time.Second)
+	}
+	if timeout < 1 {
+		fmt.Printf("I'm not waiting around.\n")
+	}
+
+	alternateName := randomString("ACPTTEST", 16)
+	for alternateName == serverName {
+		alternateName = randomString("ACPTTEST", 16)
+	}
+
+	fmt.Println("Attempting to change server name")
+
+	ur, err := servers.Update(client, createdServer.Id, map[string]interface{}{
+		"name": alternateName,
+	})
+	if err != nil {
+		t.Error(err)
+		return
+	}
+
+	updatedServer, err := servers.GetServer(ur)
+	if err != nil {
+		t.Error(err)
+		return
+	}
+
+	if updatedServer.Id != createdServer.Id {
+		t.Error("Expected updated and created server to share the same ID")
+		return
+	}
+
+	timeout = 300
+	for ; timeout > 0; timeout-- {
+		gr, err := servers.GetDetail(client, createdServer.Id)
+		if err != nil {
+			t.Error(err)
+			return
+		}
+
+		gottenServer, err := servers.GetServer(gr)
+		if err != nil {
+			t.Error(err)
+			return
+		}
+
+		if gottenServer.Id != updatedServer.Id {
+			t.Error("Updated server ID (%s) != gotten server ID (%s)", updatedServer.Id, gottenServer.Id)
+			return
+		}
+
+		if gottenServer.Name == alternateName {
+			fmt.Printf("Server updated after %d seconds (approximately)\n", 300-timeout)
+			break
+		}
+		time.Sleep(1*time.Second)
+	}
+	if timeout < 1 {
+		fmt.Printf("I'm not waiting around.\n")
+	}
+}
+
 // randomString generates a string of given length, but random content.
 // All content will be within the ASCII graphic character set.
 // (Implementation from Even Shaw's contribution on
diff --git a/openstack/compute/servers/client.go b/openstack/compute/servers/client.go
index 8b7d1fb..03c5c15 100644
--- a/openstack/compute/servers/client.go
+++ b/openstack/compute/servers/client.go
@@ -38,6 +38,10 @@
 	return c.getDeleteUrl(id)
 }
 
+func (c *Client) getUpdateUrl(id string) string {
+	return c.getDeleteUrl(id)
+}
+
 func (c *Client) getListHeaders() (map[string]string, error) {
 	t, err := c.getAuthToken()
 	if err != nil {
@@ -61,6 +65,10 @@
 	return c.getListHeaders()
 }
 
+func (c *Client) getUpdateHeaders() (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 8506aac..385e3c2 100644
--- a/openstack/compute/servers/requests.go
+++ b/openstack/compute/servers/requests.go
@@ -78,3 +78,22 @@
 	return sr, err
 }
 
+// Update requests that various attributes of the indicated server be changed.
+func Update(c *Client, id string, opts map[string]interface{}) (ServerResult, error) {
+	var sr ServerResult
+
+	h, err := c.getUpdateHeaders()
+	if err != nil {
+		return nil, err
+	}
+
+	err = perigee.Put(c.getUpdateUrl(id), perigee.Options{
+		Results: &sr,
+		ReqBody: map[string]interface{}{
+			"server": opts,
+		},
+		MoreHeaders: h,
+	})
+	return sr, err
+}
+