remove mapstructure from identity,networking,objectstorage,orchestration,pagination
diff --git a/openstack/orchestration/v1/stackresources/results.go b/openstack/orchestration/v1/stackresources/results.go
index edbd34f..951f144 100644
--- a/openstack/orchestration/v1/stackresources/results.go
+++ b/openstack/orchestration/v1/stackresources/results.go
@@ -2,29 +2,25 @@
 
 import (
 	"encoding/json"
-	"fmt"
-	"reflect"
-	"time"
 
-	"github.com/mitchellh/mapstructure"
 	"github.com/gophercloud/gophercloud"
 	"github.com/gophercloud/gophercloud/pagination"
 )
 
 // Resource represents a stack resource.
 type Resource struct {
-	Attributes   map[string]interface{} `mapstructure:"attributes"`
-	CreationTime time.Time              `mapstructure:"-"`
-	Description  string                 `mapstructure:"description"`
-	Links        []gophercloud.Link     `mapstructure:"links"`
-	LogicalID    string                 `mapstructure:"logical_resource_id"`
-	Name         string                 `mapstructure:"resource_name"`
-	PhysicalID   string                 `mapstructure:"physical_resource_id"`
-	RequiredBy   []interface{}          `mapstructure:"required_by"`
-	Status       string                 `mapstructure:"resource_status"`
-	StatusReason string                 `mapstructure:"resource_status_reason"`
-	Type         string                 `mapstructure:"resource_type"`
-	UpdatedTime  time.Time              `mapstructure:"-"`
+	Attributes   map[string]interface{}     `json:"attributes"`
+	CreationTime gophercloud.JSONRFC3339NoZ `json:"creation_time"`
+	Description  string                     `json:"description"`
+	Links        []gophercloud.Link         `json:"links"`
+	LogicalID    string                     `json:"logical_resource_id"`
+	Name         string                     `json:"resource_name"`
+	PhysicalID   string                     `json:"physical_resource_id"`
+	RequiredBy   []interface{}              `json:"required_by"`
+	Status       string                     `json:"resource_status"`
+	StatusReason string                     `json:"resource_status_reason"`
+	Type         string                     `json:"resource_type"`
+	UpdatedTime  gophercloud.JSONRFC3339NoZ `json:"updated_time"`
 }
 
 // FindResult represents the result of a Find operation.
@@ -35,39 +31,11 @@
 // Extract returns a slice of Resource objects and is called after a
 // Find operation.
 func (r FindResult) Extract() ([]Resource, error) {
-	if r.Err != nil {
-		return nil, r.Err
+	var s struct {
+		Resources []Resource `json:"resources"`
 	}
-
-	var res struct {
-		Res []Resource `mapstructure:"resources"`
-	}
-
-	if err := mapstructure.Decode(r.Body, &res); err != nil {
-		return nil, err
-	}
-
-	resources := r.Body.(map[string]interface{})["resources"].([]interface{})
-
-	for i, resourceRaw := range resources {
-		resource := resourceRaw.(map[string]interface{})
-		if date, ok := resource["updated_time"]; ok && date != nil {
-			t, err := time.Parse(gophercloud.StackFmtTime, date.(string))
-			if err != nil {
-				return nil, err
-			}
-			res.Res[i].UpdatedTime = t
-		}
-		if date, ok := resource["creation_time"]; ok && date != nil {
-			t, err := time.Parse(gophercloud.StackFmtTime, date.(string))
-			if err != nil {
-				return nil, err
-			}
-			res.Res[i].CreationTime = t
-		}
-	}
-
-	return res.Res, nil
+	err := r.ExtractInto(&s)
+	return s.Resources, err
 }
 
 // ResourcePage abstracts the raw results of making a List() request against the API.
@@ -80,51 +48,16 @@
 // IsEmpty returns true if a page contains no Server results.
 func (r ResourcePage) IsEmpty() (bool, error) {
 	resources, err := ExtractResources(r)
-	if err != nil {
-		return true, err
-	}
-	return len(resources) == 0, nil
+	return len(resources) == 0, err
 }
 
 // ExtractResources interprets the results of a single page from a List() call, producing a slice of Resource entities.
-func ExtractResources(page pagination.Page) ([]Resource, error) {
-	casted := page.(ResourcePage).Body
-
-	var response struct {
-		Resources []Resource `mapstructure:"resources"`
+func ExtractResources(r pagination.Page) ([]Resource, error) {
+	var s struct {
+		Resources []Resource `json:"resources"`
 	}
-	if err := mapstructure.Decode(casted, &response); err != nil {
-		return nil, err
-	}
-	var resources []interface{}
-	switch casted.(type) {
-	case map[string]interface{}:
-		resources = casted.(map[string]interface{})["resources"].([]interface{})
-	case map[string][]interface{}:
-		resources = casted.(map[string][]interface{})["resources"]
-	default:
-		return response.Resources, fmt.Errorf("Unknown type: %v", reflect.TypeOf(casted))
-	}
-
-	for i, resourceRaw := range resources {
-		resource := resourceRaw.(map[string]interface{})
-		if date, ok := resource["updated_time"]; ok && date != nil {
-			t, err := time.Parse(gophercloud.StackFmtTime, date.(string))
-			if err != nil {
-				return nil, err
-			}
-			response.Resources[i].UpdatedTime = t
-		}
-		if date, ok := resource["creation_time"]; ok && date != nil {
-			t, err := time.Parse(gophercloud.StackFmtTime, date.(string))
-			if err != nil {
-				return nil, err
-			}
-			response.Resources[i].CreationTime = t
-		}
-	}
-
-	return response.Resources, nil
+	err := (r.(ResourcePage)).ExtractInto(&s)
+	return s.Resources, err
 }
 
 // GetResult represents the result of a Get operation.
@@ -135,36 +68,11 @@
 // Extract returns a pointer to a Resource object and is called after a
 // Get operation.
 func (r GetResult) Extract() (*Resource, error) {
-	if r.Err != nil {
-		return nil, r.Err
+	var s struct {
+		Resource *Resource `json:"resource"`
 	}
-
-	var res struct {
-		Res *Resource `mapstructure:"resource"`
-	}
-
-	if err := mapstructure.Decode(r.Body, &res); err != nil {
-		return nil, err
-	}
-
-	resource := r.Body.(map[string]interface{})["resource"].(map[string]interface{})
-
-	if date, ok := resource["updated_time"]; ok && date != nil {
-		t, err := time.Parse(gophercloud.StackFmtTime, date.(string))
-		if err != nil {
-			return nil, err
-		}
-		res.Res.UpdatedTime = t
-	}
-	if date, ok := resource["creation_time"]; ok && date != nil {
-		t, err := time.Parse(gophercloud.StackFmtTime, date.(string))
-		if err != nil {
-			return nil, err
-		}
-		res.Res.CreationTime = t
-	}
-
-	return res.Res, nil
+	err := r.ExtractInto(&s)
+	return s.Resource, err
 }
 
 // MetadataResult represents the result of a Metadata operation.
@@ -175,19 +83,11 @@
 // Extract returns a map object and is called after a
 // Metadata operation.
 func (r MetadataResult) Extract() (map[string]string, error) {
-	if r.Err != nil {
-		return nil, r.Err
+	var s struct {
+		Meta map[string]string `json:"metadata"`
 	}
-
-	var res struct {
-		Meta map[string]string `mapstructure:"metadata"`
-	}
-
-	if err := mapstructure.Decode(r.Body, &res); err != nil {
-		return nil, err
-	}
-
-	return res.Meta, nil
+	err := r.ExtractInto(&s)
+	return s.Meta, err
 }
 
 // ResourceTypePage abstracts the raw results of making a ListTypes() request against the API.
@@ -200,10 +100,7 @@
 // IsEmpty returns true if a ResourceTypePage contains no resource types.
 func (r ResourceTypePage) IsEmpty() (bool, error) {
 	rts, err := ExtractResourceTypes(r)
-	if err != nil {
-		return true, err
-	}
-	return len(rts) == 0, nil
+	return len(rts) == 0, err
 }
 
 // ResourceTypes represents the type that holds the result of ExtractResourceTypes.
@@ -223,25 +120,20 @@
 }
 
 // ExtractResourceTypes extracts and returns resource types.
-func ExtractResourceTypes(page pagination.Page) (ResourceTypes, error) {
-	casted := page.(ResourceTypePage).Body
-
-	var response struct {
-		ResourceTypes ResourceTypes `mapstructure:"resource_types"`
+func ExtractResourceTypes(r pagination.Page) (ResourceTypes, error) {
+	var s struct {
+		ResourceTypes ResourceTypes `json:"resource_types"`
 	}
-
-	if err := mapstructure.Decode(casted, &response); err != nil {
-		return nil, err
-	}
-	return response.ResourceTypes, nil
+	err := (r.(ResourceTypePage)).ExtractInto(&s)
+	return s.ResourceTypes, err
 }
 
 // TypeSchema represents a stack resource schema.
 type TypeSchema struct {
-	Attributes    map[string]interface{} `mapstructure:"attributes"`
-	Properties    map[string]interface{} `mapstrucutre:"properties"`
-	ResourceType  string                 `mapstructure:"resource_type"`
-	SupportStatus map[string]interface{} `mapstructure:"support_status"`
+	Attributes    map[string]interface{} `json:"attributes"`
+	Properties    map[string]interface{} `json:"properties"`
+	ResourceType  string                 `json:"resource_type"`
+	SupportStatus map[string]interface{} `json:"support_status"`
 }
 
 // SchemaResult represents the result of a Schema operation.
@@ -252,17 +144,9 @@
 // Extract returns a pointer to a TypeSchema object and is called after a
 // Schema operation.
 func (r SchemaResult) Extract() (*TypeSchema, error) {
-	if r.Err != nil {
-		return nil, r.Err
-	}
-
-	var res TypeSchema
-
-	if err := mapstructure.Decode(r.Body, &res); err != nil {
-		return nil, err
-	}
-
-	return &res, nil
+	var s *TypeSchema
+	err := r.ExtractInto(&s)
+	return s, err
 }
 
 // TemplateResult represents the result of a Template operation.