Merge branch 'master' into add-router-type
diff --git a/openstack/networking/v2/extensions/layer3/routers/requests.go b/openstack/networking/v2/extensions/layer3/routers/requests.go
index 1ffc136..ed0ea07 100644
--- a/openstack/networking/v2/extensions/layer3/routers/requests.go
+++ b/openstack/networking/v2/extensions/layer3/routers/requests.go
@@ -49,6 +49,7 @@
 	AdminStateUp *bool
 	Distributed  *bool
 	TenantID     string
+	DriverOpts   map[string]string
 	GatewayInfo  *GatewayInfo
 }
 
@@ -61,29 +62,41 @@
 // an external network (it is external if its `router:external' field is set to
 // true).
 func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult {
-	type router struct {
-		Name         *string      `json:"name,omitempty"`
-		AdminStateUp *bool        `json:"admin_state_up,omitempty"`
-		Distributed  *bool        `json:"distributed,omitempty"`
-		TenantID     *string      `json:"tenant_id,omitempty"`
-		GatewayInfo  *GatewayInfo `json:"external_gateway_info,omitempty"`
-	}
 
 	type request struct {
-		Router router `json:"router"`
+		Router map[string]interface{} `json:"router"`
 	}
 
-	reqBody := request{Router: router{
-		Name:         gophercloud.MaybeString(opts.Name),
-		AdminStateUp: opts.AdminStateUp,
-		Distributed:  opts.Distributed,
-		TenantID:     gophercloud.MaybeString(opts.TenantID),
-	}}
+	routerMap := make(map[string]interface{})
+
+	if gophercloud.MaybeString(opts.Name) != nil {
+		routerMap["name"] = opts.Name
+	}
+
+	if opts.AdminStateUp != nil {
+		routerMap["admin_state_up"] = opts.AdminStateUp
+	}
+
+	if opts.Distributed != nil {
+		routerMap["distributed"] = opts.Distributed
+	}
+
+	if gophercloud.MaybeString(opts.TenantID) != nil {
+		routerMap["tenant_id"] = opts.TenantID
+	}
 
 	if opts.GatewayInfo != nil {
-		reqBody.Router.GatewayInfo = opts.GatewayInfo
+		routerMap["external_gateway_info"] = opts.GatewayInfo
 	}
 
+	if opts.DriverOpts != nil {
+		for k, v := range opts.DriverOpts {
+			routerMap[k] = v
+		}
+	}
+
+	reqBody := request{Router: routerMap}
+
 	var res CreateResult
 	_, res.Err = c.Post(rootURL(c), reqBody, &res.Body, nil)
 	return res
diff --git a/openstack/networking/v2/extensions/layer3/routers/results.go b/openstack/networking/v2/extensions/layer3/routers/results.go
index 4534123..9b811cb 100644
--- a/openstack/networking/v2/extensions/layer3/routers/results.go
+++ b/openstack/networking/v2/extensions/layer3/routers/results.go
@@ -48,6 +48,9 @@
 	// other than its own.
 	TenantID string `json:"tenant_id" mapstructure:"tenant_id"`
 
+	// Whether router is Exclusive or Shared.
+	RouterType string `json:"router_type" mapstructure:"router_type"`
+
 	Routes []Route `json:"routes" mapstructure:"routes"`
 }