Firewall rules bugfixes & enhancements
diff --git a/openstack/networking/v2/extensions/fwaas/rules/requests.go b/openstack/networking/v2/extensions/fwaas/rules/requests.go
index 66f7da4..181a758 100644
--- a/openstack/networking/v2/extensions/fwaas/rules/requests.go
+++ b/openstack/networking/v2/extensions/fwaas/rules/requests.go
@@ -6,15 +6,20 @@
 	"github.com/rackspace/gophercloud/pagination"
 )
 
+// ListOpts allows the filtering and sorting of paginated collections through
+// the API. Filtering is achieved by passing in struct field values that map to
+// the Firewall rule attributes you want to see returned. SortKey allows you to
+// sort by a particular firewall rule attribute. SortDir sets the direction, and is
+// either `asc' or `desc'. Marker and Limit are used for pagination.
 type ListOpts struct {
 	TenantID             string `q:"tenant_id"`
 	Name                 string `q:"name"`
 	Description          string `q:"description"`
 	Protocol             string `q:"protocol"`
 	Action               string `q:"action"`
-	IpVersion            int    `q:"ip_version"`
-	SourceIpAddress      string `q:"source_ip_address"`
-	DestinationIpAddress string `q:"destination_ip_address"`
+	IPVersion            int    `q:"ip_version"`
+	SourceIPAddress      string `q:"source_ip_address"`
+	DestinationIPAddress string `q:"destination_ip_address"`
 	SourcePort           string `q:"source_port"`
 	DestinationPort      string `q:"destination_port"`
 	Enabled              bool   `q:"enabled"`
@@ -44,51 +49,52 @@
 
 // CreateOpts contains all the values needed to create a new firewall rule.
 type CreateOpts struct {
-	// Only required if the caller has an admin role and wants to create a firewall rule
-	// for another tenant.
-	TenantId             string
+	// Mandatory
+	Protocol string
+	Action   string
+	// Optional
+	TenantID             string
 	Name                 string
 	Description          string
-	Protocol             string
-	Action               string
-	IpVersion            int
-	SourceIpAddress      string
-	DestinationIpAddress string
+	IPVersion            *int
+	SourceIPAddress      string
+	DestinationIPAddress string
 	SourcePort           string
 	DestinationPort      string
-	Shared               bool
-	Enabled              bool
+	Shared               *bool
+	Enabled              *bool
 }
 
 // Create accepts a CreateOpts struct and uses the values to create a new firewall rule
 func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult {
+
 	type rule struct {
-		TenantId             string `json:"tenant_id,omitempty"`
-		Name                 string `json:"name,omitempty"`
-		Description          string `json:"description,omitempty"`
+		TenantID             string `json:"tenant_id,omitempty"`
+		Name                 string `json:"name"`
+		Description          string `json:"description"`
 		Protocol             string `json:"protocol"`
 		Action               string `json:"action"`
-		IpVersion            int    `json:"ip_version,omitempty"`
-		SourceIpAddress      string `json:"source_ip_address,omitempty"`
-		DestinationIpAddress string `json:"destination_ip_address,omitempty"`
+		IPVersion            *int   `json:"ip_version,omitempty"`
+		SourceIPAddress      string `json:"source_ip_address,omitempty"`
+		DestinationIPAddress string `json:"destination_ip_address,omitempty"`
 		SourcePort           string `json:"source_port,omitempty"`
 		DestinationPort      string `json:"destination_port,omitempty"`
-		Shared               bool   `json:"shared,omitempty"`
-		Enabled              bool   `json:"enabled,omitempty"`
+		Shared               *bool  `json:"shared,omitempty"`
+		Enabled              *bool  `json:"enabled,omitempty"`
 	}
 	type request struct {
 		Rule rule `json:"firewall_rule"`
 	}
 
 	reqBody := request{Rule: rule{
-		TenantId:             opts.TenantId,
+		TenantID:             opts.TenantID,
 		Name:                 opts.Name,
 		Description:          opts.Description,
 		Protocol:             opts.Protocol,
 		Action:               opts.Action,
-		IpVersion:            opts.IpVersion,
-		SourceIpAddress:      opts.SourceIpAddress,
-		DestinationIpAddress: opts.DestinationIpAddress,
+		IPVersion:            opts.IPVersion,
+		SourceIPAddress:      opts.SourceIPAddress,
+		DestinationIPAddress: opts.DestinationIPAddress,
 		SourcePort:           opts.SourcePort,
 		DestinationPort:      opts.DestinationPort,
 		Shared:               opts.Shared,
@@ -122,13 +128,13 @@
 	Description          string
 	Protocol             string
 	Action               string
-	IpVersion            int
-	SourceIpAddress      string
-	DestinationIpAddress string
+	IPVersion            *int
+	SourceIPAddress      string
+	DestinationIPAddress string
 	SourcePort           string
 	DestinationPort      string
-	Shared               bool
-	Enabled              bool
+	Shared               *bool
+	Enabled              *bool
 }
 
 // Update allows firewall policies to be updated.
@@ -136,15 +142,15 @@
 	type rule struct {
 		Name                 string `json:"name"`
 		Description          string `json:"description"`
-		Protocol             string `json:"protocol,omitempty"`
-		Action               string `json:"action,omitempty"`
-		IpVersion            int    `json:"ip_version,omitempty"`
-		SourceIpAddress      string `json:"source_ip_address,omitempty"`
-		DestinationIpAddress string `json:"destination_ip_address,omitempty"`
-		SourcePort           string `json:"source_port,omitempty"`
-		DestinationPort      string `json:"destination_port,omitempty"`
-		Shared               bool   `json:"shared,omitempty"`
-		Enabled              bool   `json:"enabled,omitempty"`
+		Protocol             string `json:"protocol"`
+		Action               string `json:"action"`
+		IPVersion            *int   `json:"ip_version,omitempty"`
+		SourceIPAddress      string `json:"source_ip_address"`
+		DestinationIPAddress string `json:"destination_ip_address"`
+		SourcePort           string `json:"source_port"`
+		DestinationPort      string `json:"destination_port"`
+		Shared               *bool  `json:"shared,omitempty"`
+		Enabled              *bool  `json:"enabled,omitempty"`
 	}
 	type request struct {
 		Rule rule `json:"firewall_rule"`
@@ -155,9 +161,9 @@
 		Description:          opts.Description,
 		Protocol:             opts.Protocol,
 		Action:               opts.Action,
-		IpVersion:            opts.IpVersion,
-		SourceIpAddress:      opts.SourceIpAddress,
-		DestinationIpAddress: opts.DestinationIpAddress,
+		IPVersion:            opts.IPVersion,
+		SourceIPAddress:      opts.SourceIPAddress,
+		DestinationIPAddress: opts.DestinationIPAddress,
 		SourcePort:           opts.SourcePort,
 		DestinationPort:      opts.DestinationPort,
 		Shared:               opts.Shared,
@@ -171,6 +177,7 @@
 		ReqBody:     &reqBody,
 		Results:     &res.Body,
 		OkCodes:     []int{200},
+		DumpReqJson: true,
 	})
 
 	return res
diff --git a/openstack/networking/v2/extensions/fwaas/rules/results.go b/openstack/networking/v2/extensions/fwaas/rules/results.go
index 2bbb3db..ff3de8a 100644
--- a/openstack/networking/v2/extensions/fwaas/rules/results.go
+++ b/openstack/networking/v2/extensions/fwaas/rules/results.go
@@ -6,19 +6,20 @@
 	"github.com/rackspace/gophercloud/pagination"
 )
 
+// Rule represents a firewall rule
 type Rule struct {
-	Id                   string `json:"id"`
-	Name                 string `json:"name,omitempty"`
-	Description          string `json:"description,omitempty"`
-	Protocol             string `json:"protocol"`
-	Action               string `json:"action"`
-	IpVersion            int    `json:"ip_version,omitempty"`
-	SourceIpAddress      string `json:"source_ip_address,omitempty"`
-	DestinationIpAddress string `json:"destination_ip_address,omitempty"`
-	SourcePort           string `json:"source_port,omitempty"`
-	DestinationPort      string `json:"destination_port,omitempty"`
-	Shared               bool   `json:"shared,omitempty"`
-	Enabled              bool   `json:"enabled,omitempty"`
+	ID                   string `json:"id" mapstructure:"id"`
+	Name                 string `json:"name,omitempty" mapstructure:"name"`
+	Description          string `json:"description,omitempty" mapstructure:"description"`
+	Protocol             string `json:"protocol" mapstructure:"protocol"`
+	Action               string `json:"action" mapstructure:"action"`
+	IPVersion            int    `json:"ip_version,omitempty" mapstructure:"ip_version"`
+	SourceIPAddress      string `json:"source_ip_address,omitempty" mapstructure:"source_ip_address"`
+	DestinationIPAddress string `json:"destination_ip_address,omitempty" mapstructure:"destination_ip_address"`
+	SourcePort           string `json:"source_port,omitempty" mapstructure:"source_port"`
+	DestinationPort      string `json:"destination_port,omitempty" mapstructure:"destination_port"`
+	Shared               bool   `json:"shared,omitempty" mapstructure:"shared"`
+	Enabled              bool   `json:"enabled,omitempty" mapstructure:"enabled"`
 }
 
 // RulePage is the page returned by a pager when traversing over a