diff --git a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.rs.golden b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.rs.golden
index 0bec6f5c3d696514fe631f8a552d96b9d008b3e4..b7ebb05fb5dd9f33b78aedd32e87892c2a0d6959 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.rs.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.fidl.json.rs.golden
@@ -30,11 +30,11 @@ fidl_enum! {
 }
 
 
-type WithErrorSyntaxErrorAsPrimitiveResult = std::result::Result< WithErrorSyntaxErrorAsPrimitiveResponse , u32 >;
-
-
-type WithErrorSyntaxErrorAsEnumResult = std::result::Result< WithErrorSyntaxErrorAsEnumResponse , ErrorEnun >;
+type WithErrorSyntaxErrorAsPrimitiveResult = std::result::Result< (
+), u32 >;
 
+type WithErrorSyntaxErrorAsEnumResult = std::result::Result< (
+), ErrorEnun >;
 
 
 fidl_empty_struct!(
diff --git a/garnet/go/src/fidl/compiler/backend/rust/generator.go b/garnet/go/src/fidl/compiler/backend/rust/generator.go
index 65ecbf6c10b335976bb42f1d51c8ec8e6b636974..fe1a6823311e22395ee0694650cdbce42a75616d 100644
--- a/garnet/go/src/fidl/compiler/backend/rust/generator.go
+++ b/garnet/go/src/fidl/compiler/backend/rust/generator.go
@@ -30,6 +30,7 @@ func NewFidlGenerator() *FidlGenerator {
 	template.Must(tmpls.Parse(templates.XUnion))
 	template.Must(tmpls.Parse(templates.Union))
 	template.Must(tmpls.Parse(templates.Table))
+	template.Must(tmpls.Parse(templates.Result))
 	return &FidlGenerator{
 		tmpls: tmpls,
 	}
diff --git a/garnet/go/src/fidl/compiler/backend/rust/ir/ir.go b/garnet/go/src/fidl/compiler/backend/rust/ir/ir.go
index 199a99bfe2b840c9df2ae85cbe4151d803b4eb9a..5ad30054d32fc0842f72cc8ecc479d576f4cc147 100644
--- a/garnet/go/src/fidl/compiler/backend/rust/ir/ir.go
+++ b/garnet/go/src/fidl/compiler/backend/rust/ir/ir.go
@@ -67,6 +67,15 @@ type XUnionMember struct {
 	Ordinal int
 }
 
+type Result struct {
+	types.Attributes
+	Name      string
+	Ok        []string
+	Err       UnionMember
+	Size      int
+	Alignment int
+}
+
 type Union struct {
 	types.Attributes
 	Name      string
@@ -77,7 +86,7 @@ type Union struct {
 
 type UnionMember struct {
 	types.Attributes
-	Type   string
+	Type   Type
 	Name   string
 	Offset int
 }
@@ -149,6 +158,7 @@ type Root struct {
 	Structs      []Struct
 	XUnions      []XUnion
 	Unions       []Union
+	Results      []Result
 	Tables       []Table
 	Interfaces   []Interface
 }
@@ -700,12 +710,37 @@ func (c *compiler) compileXUnion(val types.XUnion) XUnion {
 func (c *compiler) compileUnionMember(val types.UnionMember) UnionMember {
 	return UnionMember{
 		Attributes: val.Attributes,
-		Type:       c.compileType(val.Type, false).Decl,
+		Type:       c.compileType(val.Type, false),
 		Name:       compileCamelIdentifier(val.Name),
 		Offset:     val.Offset,
 	}
 }
 
+func (c *compiler) compileResult(val types.Union, root Root) Result {
+	r := Result{
+		Attributes: val.Attributes,
+		Name:       c.compileCamelCompoundIdentifier(val.Name),
+		Ok:         []string{},
+		Err:        c.compileUnionMember(val.Members[1]),
+		Size:       val.Size,
+		Alignment:  val.Alignment,
+	}
+
+	OkArm := val.Members[0]
+	ci := c.compileCamelCompoundIdentifier(OkArm.Type.Identifier)
+
+	// always a struct on the Ok arms in Results
+	for _, v := range root.Structs {
+		if v.Name == ci {
+			for _, m := range v.Members {
+				r.Ok = append(r.Ok, m.Type)
+			}
+		}
+	}
+
+	return r
+}
+
 func (c *compiler) compileUnion(val types.Union) Union {
 	r := Union{
 		Attributes: val.Attributes,
@@ -772,7 +807,12 @@ func Compile(r types.Root) Root {
 	}
 
 	for _, v := range r.Unions {
-		root.Unions = append(root.Unions, c.compileUnion(v))
+		// Results are a specialized type of Union
+		if v.Attributes.HasAttribute("Result") {
+			root.Results = append(root.Results, c.compileResult(v, root))
+		} else {
+			root.Unions = append(root.Unions, c.compileUnion(v))
+		}
 	}
 
 	for _, v := range r.Tables {
diff --git a/garnet/go/src/fidl/compiler/backend/rust/templates/result.tmpl.go b/garnet/go/src/fidl/compiler/backend/rust/templates/result.tmpl.go
new file mode 100644
index 0000000000000000000000000000000000000000..8dfd797249f73b410b8a2c1a1a052bb584617bdb
--- /dev/null
+++ b/garnet/go/src/fidl/compiler/backend/rust/templates/result.tmpl.go
@@ -0,0 +1,21 @@
+// Copyright 2019 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package templates
+
+const Result = `
+{{- define "ResultDeclaration" }}
+type {{ .Name }} = std::result::Result< (
+  {{- if gt (len .Ok) 1 }}
+    {{- range $ok_member_type := .Ok }}
+      {{ $ok_member_type }},
+    {{- end }}
+  {{- else }}
+    {{- range $ok_member_type := .Ok }}
+      {{ $ok_member_type }}
+    {{- end }}
+  {{- end }}
+), {{ .Err.Type.Decl }} >;
+{{- end }}
+`
diff --git a/garnet/go/src/fidl/compiler/backend/rust/templates/sourcefile.tmpl.go b/garnet/go/src/fidl/compiler/backend/rust/templates/sourcefile.tmpl.go
index f63256bed05267b7c83a78a1ba62091dfe6bbc28..cd0a824bc7ef5b97ee1c9b4510a7101e537cbecd 100644
--- a/garnet/go/src/fidl/compiler/backend/rust/templates/sourcefile.tmpl.go
+++ b/garnet/go/src/fidl/compiler/backend/rust/templates/sourcefile.tmpl.go
@@ -38,6 +38,9 @@ use fidl::{
 {{ range $enum := .Enums -}}
 {{ template "EnumDeclaration" $enum }}
 {{ end -}}
+{{ range $result := .Results -}}
+{{ template "ResultDeclaration" $result}}
+{{ end -}}
 {{ range $union := .Unions -}}
 {{ template "UnionDeclaration" $union }}
 {{ end -}}
diff --git a/garnet/go/src/fidl/compiler/backend/rust/templates/union.tmpl.go b/garnet/go/src/fidl/compiler/backend/rust/templates/union.tmpl.go
index 4d26d627e9b13302de0e225acd04e977be719422..aa66c6b24eafb3a433e13952bf078f58fdcdf7d4 100644
--- a/garnet/go/src/fidl/compiler/backend/rust/templates/union.tmpl.go
+++ b/garnet/go/src/fidl/compiler/backend/rust/templates/union.tmpl.go
@@ -6,15 +6,12 @@ package templates
 
 const Union = `
 {{- define "UnionDeclaration" }}
-{{- if .HasAttribute "Result" }}
-type {{ .Name }} = std::result::Result< {{(index .Members 0).Type }} , {{ (index .Members 1).Type }} >;
-{{ else }}
 fidl_union! {
   name: {{ .Name }},
   members: [
   {{- range .Members }}
     {{ .Name }} {
-      ty: {{ .Type }},
+      ty: {{ .Type.Decl }},
       offset: {{ .Offset }},
     },
   {{- end }}
@@ -23,5 +20,4 @@ fidl_union! {
   align: {{ .Alignment }},
 }
 {{- end }}
-{{- end }}
 `
diff --git a/src/connectivity/telephony/ril-qmi/src/main.rs b/src/connectivity/telephony/ril-qmi/src/main.rs
index df1a716b5c05117c1a9e5618dc644e056b966a2b..6972de7a0b11cf515b6e8e9fee7712722c8afada 100644
--- a/src/connectivity/telephony/ril-qmi/src/main.rs
+++ b/src/connectivity/telephony/ril-qmi/src/main.rs
@@ -156,10 +156,9 @@ impl FrilService {
                 let status = lock.connect_transport(channel);
                 fx_log_info!("Connecting the service to the transport driver: {}", status);
                 if status {
-                    return responder.send(&mut Ok(RadioInterfaceLayerConnectTransportResponse {}));
-                } else {
-                    return responder.send(&mut Ok(RadioInterfaceLayerConnectTransportResponse {}));
+                    return responder.send(&mut Ok(()));
                 }
+                responder.send(&mut Err(RilError::TransportError))?
             }
             RadioInterfaceLayerRequest::GetSignalStrength { responder } => {
                 let resp: NAS::GetSignalStrengthResp =
@@ -167,24 +166,19 @@ impl FrilService {
                 if resp.radio_interface != 0x08 {
                     responder.send(&mut Err(RilError::UnsupportedNetworkType))?
                 } else {
-                    responder.send(&mut Ok(RadioInterfaceLayerGetSignalStrengthResponse {
-                        // TODO(bwb): This is wrong. Temporary fix for API review
-                        dbm: resp.signal_strength as f32,
-                    }))?
+                    responder.send(&mut Ok(resp.signal_strength as f32))?
                 }
             }
             RadioInterfaceLayerRequest::GetNetworkSettings { responder } => {
                 let packet: WDS::GetCurrentSettingsResp =
                     qmi_query!(responder, client, WDS::GetCurrentSettingsReq::new(58160));
-                responder.send(&mut Ok(RadioInterfaceLayerGetNetworkSettingsResponse {
-                    settings: NetworkSettings {
+                responder.send(&mut Ok(NetworkSettings {
                         ip_v4_addr: packet.ipv4_addr.unwrap(),
                         ip_v4_dns: packet.ipv4_dns.unwrap(),
                         ip_v4_subnet: packet.ipv4_subnet.unwrap(),
                         ip_v4_gateway: packet.ipv4_gateway.unwrap(),
                         mtu: packet.mtu.unwrap(),
-                    },
-                }))?
+                    }))?
             }
             RadioInterfaceLayerRequest::StartNetwork { apn, responder } => {
                 let packet: WDS::StartNetworkInterfaceResp = qmi_query!(
@@ -201,27 +195,20 @@ impl FrilService {
                     });
                 }
                 let client_end = ClientEnd::<NetworkConnectionMarker>::new(client_chan.into());
-                responder
-                    .send(&mut Ok(RadioInterfaceLayerStartNetworkResponse { conn: client_end }))?
+                responder.send(&mut Ok(client_end))?
             }
             RadioInterfaceLayerRequest::GetDeviceIdentity { responder } => {
                 let resp: DMS::GetDeviceSerialNumbersResp =
                     qmi_query!(responder, client, DMS::GetDeviceSerialNumbersReq::new());
-                responder.send(&mut Ok(RadioInterfaceLayerGetDeviceIdentityResponse {
-                    imei: resp.imei,
-                }))?
+                responder.send(&mut Ok(resp.imei))?
             }
             RadioInterfaceLayerRequest::RadioPowerStatus { responder } => {
                 let resp: DMS::GetOperatingModeResp =
                     qmi_query!(responder, client, DMS::GetOperatingModeReq::new());
                 if resp.operating_mode == 0x00 {
-                    responder.send(&mut Ok(RadioInterfaceLayerRadioPowerStatusResponse {
-                        state: RadioPowerState::On,
-                    }))?
+                    responder.send(&mut Ok(RadioPowerState::On))?
                 } else {
-                    responder.send(&mut Ok(RadioInterfaceLayerRadioPowerStatusResponse {
-                        state: RadioPowerState::Off,
-                    }))?
+                    responder.send(&mut Ok(RadioPowerState::Off))?
                 }
             }
         }
diff --git a/src/connectivity/telephony/tools/ril-ctl/src/main.rs b/src/connectivity/telephony/tools/ril-ctl/src/main.rs
index b33562c8d598b8d75ae5bd674d581ec9022ef387..fdbae546aef5f189a4c1b8d4bb6b4362f04f43d5 100644
--- a/src/connectivity/telephony/tools/ril-ctl/src/main.rs
+++ b/src/connectivity/telephony/tools/ril-ctl/src/main.rs
@@ -93,7 +93,7 @@ async fn get_imei<'a>(
     ril_modem: &'a RadioInterfaceLayerProxy,
 ) -> Result<String, Error> {
     match await!(ril_modem.get_device_identity())? {
-        Ok(imei) => Ok(imei.imei),
+        Ok(imei) => Ok(imei),
         Err(_state) => Err(format_err!("error")),
     }
 }
@@ -106,7 +106,7 @@ async fn connect<'a>(
         Ok(iface) => {
             let settings = await!(ril_modem.get_network_settings())?;
             if let Ok(settings) = settings {
-                return Ok((settings.settings, iface.conn.into_proxy()?));
+                return Ok((settings, iface.into_proxy()?));
             }
             Err(format_err!("error"))
         }
@@ -119,7 +119,7 @@ async fn get_power<'a>(
     ril_modem: &'a RadioInterfaceLayerProxy,
 ) -> Result<String, Error> {
     match await!(ril_modem.radio_power_status())? {
-        Ok(state) => match state.state {
+        Ok(state) => match state {
             RadioPowerState::On => Ok(String::from("radio on")),
             RadioPowerState::Off => Ok(String::from("radio off")),
         },
@@ -133,7 +133,7 @@ async fn get_signal<'a>(
 ) -> Result<String, Error> {
     match await!(ril_modem.get_signal_strength())? {
         Ok(strength) => {
-            Ok(format!("{} dBm", strength.dbm))
+            Ok(format!("{} dBm", strength))
         },
         Err(_e) => Err(format_err!("error")),
     }