Extract the new token from headers.
diff --git a/openstack/identity/v3/tokens/requests.go b/openstack/identity/v3/tokens/requests.go
index 121de43..b8f0d76 100644
--- a/openstack/identity/v3/tokens/requests.go
+++ b/openstack/identity/v3/tokens/requests.go
@@ -228,11 +228,18 @@
 		}
 	}
 
-	var resp TokenCreateResult
-	perigee.Post(getTokenURL(c), perigee.Options{
+	var result TokenCreateResult
+	response, err := perigee.Request("POST", getTokenURL(c), perigee.Options{
 		ReqBody: &req,
-		Results: &resp,
+		Results: &result.response,
 		OkCodes: []int{201},
 	})
-	return &resp, nil
+	if err != nil {
+		return nil, err
+	}
+
+	// Extract the token ID from the response, if present.
+	result.tokenID = response.HttpResponse.Header.Get("X-Subject-Token")
+
+	return &result, nil
 }
diff --git a/openstack/identity/v3/tokens/requests_test.go b/openstack/identity/v3/tokens/requests_test.go
index 3ac49cd..6038f96 100644
--- a/openstack/identity/v3/tokens/requests_test.go
+++ b/openstack/identity/v3/tokens/requests_test.go
@@ -26,6 +26,7 @@
 		testhelper.TestHeader(t, r, "Accept", "application/json")
 		testhelper.TestJSONRequest(t, r, requestJSON)
 
+		w.WriteHeader(http.StatusCreated)
 		fmt.Fprintf(w, `{}`)
 	})
 
@@ -234,6 +235,33 @@
 	`)
 }
 
+func TestCreateExtractsTokenFromResponse(t *testing.T) {
+	setup()
+	defer teardown()
+
+	client := gophercloud.ServiceClient{
+		Endpoint: endpoint(),
+		Options:  gophercloud.AuthOptions{UserID: "me", Password: "shhh"},
+	}
+
+	mux.HandleFunc("/auth/tokens", func(w http.ResponseWriter, r *http.Request) {
+		w.Header().Add("X-Subject-Token", "aaa111")
+
+		w.WriteHeader(http.StatusCreated)
+		fmt.Fprintf(w, `{}`)
+	})
+
+	result, err := Create(&client, nil)
+	if err != nil {
+		t.Errorf("Create returned an error: %v", err)
+	}
+
+	token, _ := result.TokenID()
+	if token != "aaa111" {
+		t.Errorf("Expected token to be aaa111, but was %s", token)
+	}
+}
+
 func TestCreateFailureEmptyAuth(t *testing.T) {
 	authTokenPostErr(t, gophercloud.AuthOptions{}, nil, false, ErrMissingPassword)
 }
diff --git a/openstack/identity/v3/tokens/results.go b/openstack/identity/v3/tokens/results.go
index ca727c3..0f44744 100644
--- a/openstack/identity/v3/tokens/results.go
+++ b/openstack/identity/v3/tokens/results.go
@@ -1,9 +1,12 @@
 package tokens
 
 // TokenCreateResult contains the document structure returned from a Create call.
-type TokenCreateResult map[string]interface{}
+type TokenCreateResult struct {
+	response map[string]interface{}
+	tokenID  string
+}
 
 // TokenID retrieves a token generated by a Create call from an token creation response.
-func (r TokenCreateResult) TokenID() (string, error) {
-	return "", nil
+func (r *TokenCreateResult) TokenID() (string, error) {
+	return r.tokenID, nil
 }
diff --git a/openstack/identity/v3/tokens/results_test.go b/openstack/identity/v3/tokens/results_test.go
new file mode 100644
index 0000000..ca0d563
--- /dev/null
+++ b/openstack/identity/v3/tokens/results_test.go
@@ -0,0 +1,12 @@
+package tokens
+
+import "testing"
+
+func TestTokenID(t *testing.T) {
+	result := TokenCreateResult{tokenID: "1234"}
+
+	token, _ := result.TokenID()
+	if token != "1234" {
+		t.Errorf("Expected tokenID of 1234, got %s", token)
+	}
+}