diff --git a/.travis.yml b/.travis.yml
index 094e996c93a3b851daed9d6a831cddb201119b53..59a66b4a0a86870d196de5fc9b979895dcff1334 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -51,7 +51,10 @@ script:
 
 after_script: set +e
 
-cache: cargo
+cache:
+  cargo: true
+  directories:
+    - $HOME/.xargo
 before_cache:
   - chmod -R a+r $HOME/.cargo
 
diff --git a/examples/full-syntax.rs b/examples/full-syntax.rs
index 9b6b394e5e7442d6149a155a9e6ba0e7e12435cb..a8f79a7210d3a0e022a44593f049c71cede52762 100644
--- a/examples/full-syntax.rs
+++ b/examples/full-syntax.rs
@@ -1,5 +1,6 @@
 //! A showcase of the `app!` macro syntax
 #![deny(unsafe_code)]
+#![deny(warnings)]
 #![feature(proc_macro)]
 #![no_std]
 
diff --git a/examples/generics.rs b/examples/generics.rs
index bc2fe7a81b8fc61c52cc676d9d239e775750e347..7cf9257b32db041257a9d02ec5c70f38a953c229 100644
--- a/examples/generics.rs
+++ b/examples/generics.rs
@@ -1,5 +1,6 @@
 //! Working with resources in a generic fashion
 #![deny(unsafe_code)]
+#![deny(warnings)]
 #![feature(proc_macro)]
 #![no_std]
 
diff --git a/examples/late-resources.rs b/examples/late-resources.rs
index 69a0ce8ae02d1c84bd8ef77159d16b25252cd7d3..d42431c28a403b3d2e4dbfe5587bf35c7cc04bbb 100644
--- a/examples/late-resources.rs
+++ b/examples/late-resources.rs
@@ -1,6 +1,7 @@
 //! Demonstrates initialization of resources in `init`.
 
 #![deny(unsafe_code)]
+#![deny(warnings)]
 #![feature(proc_macro)]
 #![no_std]
 
diff --git a/examples/nested.rs b/examples/nested.rs
index 1c164f86b029d221f2bd2ce0a2302bc9143ebcf2..d2309f3d38649f1da8b55738403351eb0348475c 100644
--- a/examples/nested.rs
+++ b/examples/nested.rs
@@ -3,6 +3,7 @@
 //! If you run this program you'll hit the breakpoints as indicated by the
 //! letters in the comments: A, then B, then C, etc.
 #![deny(unsafe_code)]
+#![deny(warnings)]
 #![feature(proc_macro)]
 #![no_std]
 
diff --git a/examples/one-task.rs b/examples/one-task.rs
index 38f0135467fdff1705668a8c32ede7010f0bdd96..2e7767689191dd44e29975a71026a0e3906049f1 100644
--- a/examples/one-task.rs
+++ b/examples/one-task.rs
@@ -1,5 +1,6 @@
 //! An application with one task
 #![deny(unsafe_code)]
+#![deny(warnings)]
 #![feature(proc_macro)]
 #![no_std]
 
diff --git a/examples/preemption.rs b/examples/preemption.rs
index 5fda37d57e1902ae7164014d4de876589256d0a8..98dde8d1f3992c657f5dbef11af351eb6fef701c 100644
--- a/examples/preemption.rs
+++ b/examples/preemption.rs
@@ -1,5 +1,6 @@
 //! Two tasks running at *different* priorities with access to the same resource
 #![deny(unsafe_code)]
+#![deny(warnings)]
 #![feature(proc_macro)]
 #![no_std]
 
diff --git a/examples/two-tasks.rs b/examples/two-tasks.rs
index 2200e5baa0b7b2cd46f541a76d689ec00d34beec..df6e784a97974956c3a1ba36e40ccf15cf63a5ed 100644
--- a/examples/two-tasks.rs
+++ b/examples/two-tasks.rs
@@ -1,5 +1,6 @@
 //! Two tasks running at the *same* priority with access to the same resource
 #![deny(unsafe_code)]
+#![deny(warnings)]
 #![feature(proc_macro)]
 #![no_std]
 
diff --git a/examples/zero-tasks.rs b/examples/zero-tasks.rs
index 58e6afc76c65cc1c6f3a0f81cb42b4a19805cbc4..b1ebab6f8ef512c7f15dd8ff8e58a038e62b949b 100644
--- a/examples/zero-tasks.rs
+++ b/examples/zero-tasks.rs
@@ -1,5 +1,6 @@
 //! Minimal example with zero tasks
 #![deny(unsafe_code)]
+#![deny(warnings)]
 // IMPORTANT always include this feature gate
 #![feature(proc_macro)]
 #![no_std]
diff --git a/macros/src/trans.rs b/macros/src/trans.rs
index 96631d5d0371ad18923dca4b2964c820456f4ce1..77eada415337c8bcd2d827772bd4093130cb58ef 100644
--- a/macros/src/trans.rs
+++ b/macros/src/trans.rs
@@ -438,12 +438,14 @@ fn resources(app: &App, ownerships: &Ownerships, root: &mut Vec<Tokens>) {
 
                 items.push(quote! {
                     #[allow(non_camel_case_types)]
-                    pub struct #name { _0: () }
+                    pub struct #name { _0: PhantomData<*const ()> }
+
+                    unsafe impl Sync for #name {}
 
                     #[allow(unsafe_code)]
                     impl #name {
                         pub unsafe fn new() -> Self {
-                            #name { _0: () }
+                            #name { _0: PhantomData }
                         }
                     }
                 });
@@ -455,6 +457,8 @@ fn resources(app: &App, ownerships: &Ownerships, root: &mut Vec<Tokens>) {
         root.push(quote! {
             #[allow(unsafe_code)]
             mod _resource {
+                use core::marker::PhantomData;
+
                 #(#items)*
             }
         })
diff --git a/tests/cfail/critical-section.rs b/tests/cfail/critical-section.rs
index 728388e8b715c238972e71996bc8ff13fdb46e84..65719788cb150d081b35b1088e7e6f86722c643c 100644
--- a/tests/cfail/critical-section.rs
+++ b/tests/cfail/critical-section.rs
@@ -1,3 +1,4 @@
+#![deny(unsafe_code)]
 #![deny(warnings)]
 #![feature(const_fn)]
 #![feature(proc_macro)]
diff --git a/tests/cfail/duplicated-task.rs b/tests/cfail/duplicated-task.rs
index d91f09b6649714415e87af7765a9087c15133548..82b7ac630603430738532b19112e345049193bc5 100644
--- a/tests/cfail/duplicated-task.rs
+++ b/tests/cfail/duplicated-task.rs
@@ -1,3 +1,4 @@
+#![deny(unsafe_code)]
 #![deny(warnings)]
 #![feature(proc_macro)]
 #![no_std]
diff --git a/tests/cfail/exception.rs b/tests/cfail/exception.rs
index 065ccad81c73ec57aeee2636fb408fb95ade8b57..e2e749a27ebbd1caeb7523ef7260696222d5c23b 100644
--- a/tests/cfail/exception.rs
+++ b/tests/cfail/exception.rs
@@ -1,3 +1,4 @@
+#![deny(unsafe_code)]
 #![deny(warnings)]
 #![feature(proc_macro)]
 #![no_std]
diff --git a/tests/cfail/idle.rs b/tests/cfail/idle.rs
index a362ec7915e025ecb85a8cae8f57edfef3fd958a..79fe99b0daddfbc16eca1e511f7b6807a8682f32 100644
--- a/tests/cfail/idle.rs
+++ b/tests/cfail/idle.rs
@@ -1,3 +1,4 @@
+#![deny(unsafe_code)]
 #![deny(warnings)]
 #![feature(proc_macro)]
 #![no_std]
diff --git a/tests/cfail/init.rs b/tests/cfail/init.rs
index 73643b111d841c7bffa31779a698a6948d43001a..d2823e3f82625300a1c45aa69e645bec03f1e999 100644
--- a/tests/cfail/init.rs
+++ b/tests/cfail/init.rs
@@ -1,3 +1,4 @@
+#![deny(unsafe_code)]
 #![deny(warnings)]
 #![feature(proc_macro)]
 #![no_std]
diff --git a/tests/cfail/interrupt.rs b/tests/cfail/interrupt.rs
index b913d832023ddcb3768f6cfc567a562eb1e34c04..e3ef2e8ffd47dead241f60aee1566e838b75f30e 100644
--- a/tests/cfail/interrupt.rs
+++ b/tests/cfail/interrupt.rs
@@ -1,3 +1,4 @@
+#![deny(unsafe_code)]
 #![deny(warnings)]
 #![feature(proc_macro)]
 #![no_std]
diff --git a/tests/cfail/late-resource-init.rs b/tests/cfail/late-resource-init.rs
index cb37887f70100ba45856dbb1b84b74624ccea972..a1059f3403caeaeab095f18f75d440cf26af1d9f 100644
--- a/tests/cfail/late-resource-init.rs
+++ b/tests/cfail/late-resource-init.rs
@@ -1,3 +1,4 @@
+#![deny(unsafe_code)]
 #![deny(warnings)]
 #![feature(proc_macro)]
 #![no_std]
diff --git a/tests/cfail/lock.rs b/tests/cfail/lock.rs
index e0e37e0fb074d0c35b9a8d193051e8c03fa523b4..5630649aeb89bae58311adbf9846df114c176183 100644
--- a/tests/cfail/lock.rs
+++ b/tests/cfail/lock.rs
@@ -1,3 +1,4 @@
+#![deny(unsafe_code)]
 #![deny(warnings)]
 #![feature(const_fn)]
 #![feature(proc_macro)]
diff --git a/tests/cfail/peripheral-alias.rs b/tests/cfail/peripheral-alias.rs
index 042666afaf19ed2694bee0ba54e9660f077408da..3528ec666b913e69b78a82f018ce8a68a97f89ac 100644
--- a/tests/cfail/peripheral-alias.rs
+++ b/tests/cfail/peripheral-alias.rs
@@ -1,3 +1,4 @@
+#![deny(unsafe_code)]
 #![deny(warnings)]
 #![feature(proc_macro)]
 #![no_std]
diff --git a/tests/cfail/priority-too-high.rs b/tests/cfail/priority-too-high.rs
index c139471df97faef9ccd9884a981e868b32959d79..5c353770d26fd5006557aac2b3a71baa644f3345 100644
--- a/tests/cfail/priority-too-high.rs
+++ b/tests/cfail/priority-too-high.rs
@@ -1,3 +1,4 @@
+#![deny(unsafe_code)]
 #![deny(warnings)]
 #![feature(proc_macro)]
 #![no_std]
diff --git a/tests/cfail/priority-too-low.rs b/tests/cfail/priority-too-low.rs
index cefd34281a1207343b6b4a52d6b87ed28fe75557..2be2254deb022c70d04275a5f930764654d561a6 100644
--- a/tests/cfail/priority-too-low.rs
+++ b/tests/cfail/priority-too-low.rs
@@ -1,3 +1,4 @@
+#![deny(unsafe_code)]
 #![deny(warnings)]
 #![feature(proc_macro)]
 #![no_std]
diff --git a/tests/cfail/resource-alias.rs b/tests/cfail/resource-alias.rs
index 788af6f6347843d1f029c6a1674391278de430a0..e1c73bb581a5ad338c6eae7888479a14c3f9391e 100644
--- a/tests/cfail/resource-alias.rs
+++ b/tests/cfail/resource-alias.rs
@@ -1,3 +1,4 @@
+#![deny(unsafe_code)]
 #![deny(warnings)]
 #![feature(proc_macro)]
 #![no_std]
diff --git a/tests/cfail/resource-not-send.rs b/tests/cfail/resource-not-send.rs
new file mode 100644
index 0000000000000000000000000000000000000000..c89c3d31ccb898b04573392723aef972250cd917
--- /dev/null
+++ b/tests/cfail/resource-not-send.rs
@@ -0,0 +1,53 @@
+#![deny(unsafe_code)]
+#![deny(warnings)]
+#![feature(const_fn)]
+#![feature(proc_macro)]
+#![no_std]
+
+extern crate cortex_m_rtfm as rtfm;
+extern crate stm32f103xx;
+
+use rtfm::{app, Resource, Threshold};
+
+app! {
+    device: stm32f103xx,
+
+    resources: {
+        static SHARED: bool = false;
+    },
+
+    tasks: {
+        EXTI0: {
+            path: exti0,
+            priority: 1,
+            resources: [SHARED],
+        },
+
+        EXTI1: {
+            path: exti1,
+            priority: 2,
+            resources: [SHARED],
+        },
+    },
+}
+
+fn init(_p: init::Peripherals, _r: init::Resources) {}
+
+fn idle() -> ! {
+    loop {}
+}
+
+fn is_send<T>(_: &T) where T: Send {}
+fn is_sync<T>(_: &T) where T: Sync {}
+
+fn exti0(_t: &mut Threshold, r: EXTI0::Resources) {
+    // OK
+    is_sync(&r.SHARED);
+
+    // ERROR resource proxies are not `Send`able across tasks
+    is_send(&r.SHARED);
+    //~^ error the trait bound `*const (): core::marker::Send` is not satisfied
+}
+
+fn exti1(_t: &mut Threshold, _r: EXTI1::Resources) {
+}
diff --git a/tests/cfail/token-outlive.rs b/tests/cfail/token-outlive.rs
index 31231b7289ad8fd29b53413a207c33ac3f75c96a..819a3d1583b7b53d3df97b80d65be104d1c76def 100644
--- a/tests/cfail/token-outlive.rs
+++ b/tests/cfail/token-outlive.rs
@@ -1,3 +1,4 @@
+#![deny(unsafe_code)]
 #![deny(warnings)]
 #![feature(const_fn)]
 #![feature(proc_macro)]
diff --git a/tests/cfail/token-transfer.rs b/tests/cfail/token-transfer.rs
index 38e878683b7af1aef963f1a03ef6fa9b3e683a54..bc6205217a67933d0cb4238b946af9e509d5406d 100644
--- a/tests/cfail/token-transfer.rs
+++ b/tests/cfail/token-transfer.rs
@@ -1,3 +1,4 @@
+#![deny(unsafe_code)]
 #![deny(warnings)]
 #![feature(const_fn)]
 #![feature(proc_macro)]
diff --git a/tests/cfail/wrong-threshold.rs b/tests/cfail/wrong-threshold.rs
index b97407150dddaa0f5fab2cc15104561512f1158d..149f357da3d8cc35be9bfe8f970c769121369d5d 100644
--- a/tests/cfail/wrong-threshold.rs
+++ b/tests/cfail/wrong-threshold.rs
@@ -1,3 +1,4 @@
+#![deny(unsafe_code)]
 #![deny(warnings)]
 #![feature(proc_macro)]
 #![no_std]