diff --git a/examples/late-resources.rs b/examples/late-resources.rs
index 933a252b248051fdff2ba16f429ae3b4038c796e..b5dba1467e29003afdadfd2c898915bd3ba306a9 100644
--- a/examples/late-resources.rs
+++ b/examples/late-resources.rs
@@ -26,13 +26,24 @@ app! {
         // the initializer. Doing that will require `init` to return the values of all "late"
         // resources.
         static IP_ADDRESS: u32;
+
+        // PORT is used by 2 tasks, making it a shared resource. This just tests another internal
+        // code path and is not important for the example.
+        static PORT: u16;
     },
 
     tasks: {
         SYS_TICK: {
+            priority: 1,
             path: sys_tick,
-            resources: [IP_ADDRESS, ON],
+            resources: [IP_ADDRESS, PORT, ON],
         },
+
+        EXTI0: {
+            priority: 2,
+            path: exti0,
+            resources: [PORT],
+        }
     }
 }
 
@@ -47,6 +58,7 @@ fn init(_p: init::Peripherals, _r: init::Resources) -> init::LateResourceValues
     init::LateResourceValues {
         // This struct will contain fields for all resources with omitted initializers.
         IP_ADDRESS: ip_address,
+        PORT: 0,
     }
 }
 
@@ -57,6 +69,8 @@ fn sys_tick(_t: &mut Threshold, r: SYS_TICK::Resources) {
     r.IP_ADDRESS;
 }
 
+fn exti0(_t: &mut Threshold, _r: EXTI0::Resources) {}
+
 fn idle() -> ! {
     loop {
         rtfm::wfi();
diff --git a/macros/src/trans.rs b/macros/src/trans.rs
index 890e083d07bacaf00fecfa2b1e67e5c133c73eec..45841e730078ea954423c5582fb9b83be4420d32 100644
--- a/macros/src/trans.rs
+++ b/macros/src/trans.rs
@@ -351,6 +351,11 @@ fn resources(app: &App, ownerships: &Ownerships, root: &mut Vec<Tokens>) {
             Ownership::Shared { ceiling } => {
                 if let Some(resource) = app.resources.get(name) {
                     let ty = &resource.ty;
+                    let res_rvalue = if resource.expr.is_some() {
+                        quote!(#_name)
+                    } else {
+                        quote!(#_name.some)
+                    };
 
                     impl_items.push(quote! {
                         type Data = #ty;
@@ -361,7 +366,7 @@ fn resources(app: &App, ownerships: &Ownerships, root: &mut Vec<Tokens>) {
                         ) -> &'cs #krate::Static<#ty> {
                             assert!(t.value() >= #ceiling);
 
-                            unsafe { #krate::Static::ref_(&#_name) }
+                            unsafe { #krate::Static::ref_(&#res_rvalue) }
                         }
 
                         fn borrow_mut<'cs>(
@@ -371,7 +376,7 @@ fn resources(app: &App, ownerships: &Ownerships, root: &mut Vec<Tokens>) {
                             assert!(t.value() >= #ceiling);
 
                             unsafe {
-                                #krate::Static::ref_mut(&mut #_name)
+                                #krate::Static::ref_mut(&mut #res_rvalue)
                             }
                         }
 
@@ -387,7 +392,7 @@ fn resources(app: &App, ownerships: &Ownerships, root: &mut Vec<Tokens>) {
                         {
                             unsafe {
                                 #krate::claim(
-                                    #krate::Static::ref_(&#_name),
+                                    #krate::Static::ref_(&#res_rvalue),
                                     #ceiling,
                                     #device::NVIC_PRIO_BITS,
                                     t,
@@ -408,7 +413,7 @@ fn resources(app: &App, ownerships: &Ownerships, root: &mut Vec<Tokens>) {
                         {
                             unsafe {
                                 #krate::claim(
-                                    #krate::Static::ref_mut(&mut #_name),
+                                    #krate::Static::ref_mut(&mut #res_rvalue),
                                     #ceiling,
                                     #device::NVIC_PRIO_BITS,
                                     t,