diff --git a/examples/simple.rs b/examples/simple.rs
new file mode 100644
index 0000000000000000000000000000000000000000..187239d817fa0cd807821800551af8efa0dfab16
--- /dev/null
+++ b/examples/simple.rs
@@ -0,0 +1,86 @@
+//! Minimal example with zero tasks
+//#![deny(unsafe_code)]
+// IMPORTANT always include this feature gate
+#![feature(proc_macro)]
+#![feature(used)]
+#![no_std]
+
+extern crate cortex_m_rtfm as rtfm;
+// IMPORTANT always do this rename
+extern crate stm32f413;
+
+//#[macro_use]
+extern crate klee;
+//use klee::{k_abort, k_assert, k_assume};
+
+// import the procedural macro
+use rtfm::{app, Threshold};
+
+app! {
+    // this is the path to the device crate
+    device: stm32f413,
+
+    resources: {
+        static X:u32 = 1;
+        static Y:u32 = 1;
+    },
+
+    tasks: {
+        EXTI1: {
+            path: exti1,
+            priority: 1,
+            resources: [X, Y],
+        },
+    },
+}
+
+#[inline(never)]
+fn exti1(_t: &mut Threshold, mut r: EXTI1::Resources) {
+    if *r.X > 10 {
+        *r.Y = 5;
+    } else {
+        *r.Y = 8;
+    }
+}
+
+// The `init` function
+//
+// This function runs as an atomic section before any tasks
+// are allowed to start
+#[inline(never)]
+#[allow(dead_code)]
+fn init(_: init::Peripherals, _: init::Resources) {}
+
+// The idle loop.
+//
+// This runs after `init` and has a priority of 0. All tasks can preempt this
+// function. This function can never return so it must contain some sort of
+// endless loop.
+#[inline(never)]
+fn idle() -> ! {
+    loop {}
+}
+
+// Assignments
+//
+// Rust strives at being a safe language.
+// - Memory safety,
+//   - static checking where possible
+//   - run-time checking causing `panic!` on violation
+//
+// - No undefined behavior in "safe" Rust
+//   - panic! in case undef behavior (e.g., div 0)
+//
+// Compiling and analysing the code using KLEE
+//
+// What problem(s) did KLEE identify
+// ** your answer here **
+//
+// Now try to solve this by contracts
+// You should not change the code, just enable the contacts
+// The `_` should be filled with concrete values
+//
+// Can you find a type invariant that satisfies BOTH pre- and post-conditions
+// at the same time.
+//
+// If not, why is that not possible?
diff --git a/examples/simple2.rs b/examples/simple2.rs
new file mode 100644
index 0000000000000000000000000000000000000000..d4adb824eadac27f6022668ae72547e9e43701cf
--- /dev/null
+++ b/examples/simple2.rs
@@ -0,0 +1,88 @@
+//! Minimal example with zero tasks
+//#![deny(unsafe_code)]
+// IMPORTANT always include this feature gate
+#![feature(proc_macro)]
+#![feature(used)]
+#![no_std]
+
+extern crate cortex_m_rtfm as rtfm;
+// IMPORTANT always do this rename
+extern crate stm32f413;
+
+#[macro_use]
+extern crate klee;
+use klee::{k_abort, k_assert, k_assume};
+
+// import the procedural macro
+use rtfm::{app, Threshold};
+
+app! {
+    // this is the path to the device crate
+    device: stm32f413,
+
+    resources: {
+        static X:u32 = 1;
+        static Y:u32 = 1;
+    },
+
+    tasks: {
+        EXTI1: {
+            path: exti1,
+            priority: 1,
+            resources: [X, Y],
+        },
+    },
+}
+
+#[inline(never)]
+fn exti1(_t: &mut Threshold, mut r: EXTI1::Resources) {
+    if *r.X > 10 {
+        *r.Y = 5;
+    } else {
+        if *r.X < 5 {
+            *r.Y = 8;
+        }
+    }
+}
+
+// The `init` function
+//
+// This function runs as an atomic section before any tasks
+// are allowed to start
+#[inline(never)]
+#[allow(dead_code)]
+fn init(_: init::Peripherals, _: init::Resources) {}
+
+// The idle loop.
+//
+// This runs after `init` and has a priority of 0. All tasks can preempt this
+// function. This function can never return so it must contain some sort of
+// endless loop.
+#[inline(never)]
+fn idle() -> ! {
+    loop {}
+}
+
+// Assignments
+//
+// Rust strives at being a safe language.
+// - Memory safety,
+//   - static checking where possible
+//   - run-time checking causing `panic!` on violation
+//
+// - No undefined behavior in "safe" Rust
+//   - panic! in case undef behavior (e.g., div 0)
+//
+// Compiling and analysing the code using KLEE
+//
+// What problem(s) did KLEE identify
+// ** your answer here **
+//
+// Now try to solve this by contracts
+// You should not change the code, just enable the contacts
+// The `_` should be filled with concrete values
+//
+// Can you find a type invariant that satisfies BOTH pre- and post-conditions
+// at the same time.
+//
+// If not, why is that not possible?
diff --git a/examples/simple3.rs b/examples/simple3.rs
new file mode 100644
index 0000000000000000000000000000000000000000..deb8a3da8083c2849f1f79ebf1ba5264b644aa4f
--- /dev/null
+++ b/examples/simple3.rs
@@ -0,0 +1,88 @@
+//! Minimal example with zero tasks
+//#![deny(unsafe_code)]
+// IMPORTANT always include this feature gate
+#![feature(proc_macro)]
+#![feature(used)]
+#![no_std]
+
+extern crate cortex_m_rtfm as rtfm;
+// IMPORTANT always do this rename
+extern crate stm32f413;
+
+#[macro_use]
+extern crate klee;
+use klee::{k_abort, k_assert, k_assume};
+
+// import the procedural macro
+use rtfm::{app, Threshold};
+
+app! {
+    // this is the path to the device crate
+    device: stm32f413,
+
+    resources: {
+        static X:u32 = 1;
+        static Y:u32 = 1;
+    },
+
+    tasks: {
+        EXTI1: {
+            path: exti1,
+            priority: 1,
+            resources: [X, Y],
+        },
+    },
+}
+
+#[inline(never)]
+fn exti1(_t: &mut Threshold, mut r: EXTI1::Resources) {
+    if *r.X < 5 {
+        let old = *r.Y;
+        for _ in 0..*r.X {
+            *r.Y += 1;
+        }
+        k_assert!(*r.Y == *r.X + old);
+    }
+}
+
+// The `init` function
+//
+// This function runs as an atomic section before any tasks
+// are allowed to start
+#[inline(never)]
+#[allow(dead_code)]
+fn init(_: init::Peripherals, _: init::Resources) {}
+
+// The idle loop.
+//
+// This runs after `init` and has a priority of 0. All tasks can preempt this
+// function. This function can never return so it must contain some sort of
+// endless loop.
+#[inline(never)]
+fn idle() -> ! {
+    loop {}
+}
+
+// Assignments
+//
+// Rust strives at being a safe language.
+// - Memory safety,
+//   - static checking where possible
+//   - run-time checking causing `panic!` on violation
+//
+// - No undefined behavior in "safe" Rust
+//   - panic! in case undef behavior (e.g., div 0)
+//
+// Compiling and analysing the code using KLEE
+//
+// What problem(s) did KLEE identify
+// ** your answer here **
+//
+// Now try to solve this by contracts
+// You should not change the code, just enable the contacts
+// The `_` should be filled with concrete values
+//
+// Can you find a type invariant that satisfies BOTH pre- and post-conditions
+// at the same time.
+//
+// If not, why is that not possible?
diff --git a/examples/simple4.rs b/examples/simple4.rs
new file mode 100644
index 0000000000000000000000000000000000000000..22e1b8f3128975d675d144e1674bbb5dc2c9b5d6
--- /dev/null
+++ b/examples/simple4.rs
@@ -0,0 +1,100 @@
+//! Minimal example with zero tasks
+//#![deny(unsafe_code)]
+// IMPORTANT always include this feature gate
+#![feature(proc_macro)]
+#![feature(used)]
+#![no_std]
+
+extern crate cortex_m_rtfm as rtfm;
+// IMPORTANT always do this rename
+extern crate stm32f413;
+
+#[macro_use]
+extern crate klee;
+use klee::{k_abort, k_assert, k_assume};
+
+// import the procedural macro
+use rtfm::{app, Resource, Threshold};
+
+app! {
+    // this is the path to the device crate
+    device: stm32f413,
+
+    resources: {
+        static X:u32 = 1;
+        static Y:u32 = 1;
+    },
+
+    tasks: {
+        EXTI1: {
+            path: exti1,
+            priority: 1,
+            resources: [X, Y],
+        },
+        EXTI2: {
+            path: exti2,
+            priority: 2,
+            resources: [X, Y],
+        },
+    },
+}
+
+#[inline(never)]
+#[allow(non_snake_case)]
+fn exti1(t: &mut Threshold, EXTI1::Resources { X, mut Y }: EXTI1::Resources) {
+    X.claim(t, |x, t1| {
+        Y.claim_mut(t1, |y, _| {
+            let old = *y;
+            if *x < 5 {
+                for _ in 0..*x {
+                    *y += 1;
+                }
+                //assert!(*y == *x + old);
+            }
+        });
+    });
+}
+
+fn exti2(_: &mut Threshold, _: EXTI2::Resources) {}
+
+// The `init` function
+//
+// This function runs as an atomic section before any tasks
+// are allowed to start
+#[inline(never)]
+#[allow(dead_code)]
+fn init(_: init::Peripherals, _: init::Resources) {}
+
+// The idle loop.
+//
+// This runs after `init` and has a priority of 0. All tasks can preempt this
+// function. This function can never return so it must contain some sort of
+// endless loop.
+#[inline(never)]
+fn idle() -> ! {
+    loop {}
+}
+
+// Assignments
+//
+// Rust strives at being a safe language.
+// - Memory safety,
+//   - static checking where possible
+//   - run-time checking causing `panic!` on violation
+//
+// - No undefined behavior in "safe" Rust
+//   - panic! in case undef behavior (e.g., div 0)
+//
+// Compiling and analysing the code using KLEE
+//
+// What problem(s) did KLEE identify
+// ** your answer here **
+//
+// Now try to solve this by contracts
+// You should not change the code, just enable the contacts
+// The `_` should be filled with concrete values
+//
+// Can you find a type invariant that satisfies BOTH pre- and post-conditions
+// at the same time.
+//
+// If not, why is that not possible?
diff --git a/examples/simple5.rs b/examples/simple5.rs
new file mode 100644
index 0000000000000000000000000000000000000000..0e5f60e23c6808764d60a8f8a892e655a925ae7b
--- /dev/null
+++ b/examples/simple5.rs
@@ -0,0 +1,96 @@
+//! Minimal example with zero tasks
+//#![deny(unsafe_code)]
+// IMPORTANT always include this feature gate
+#![feature(proc_macro)]
+#![feature(used)]
+#![no_std]
+
+extern crate cortex_m_rtfm as rtfm;
+// IMPORTANT always do this rename
+extern crate stm32f413;
+
+#[macro_use]
+extern crate klee;
+use klee::{k_abort, k_assert, k_assume};
+
+// import the procedural macro
+use rtfm::{app, Resource, Threshold};
+
+app! {
+    // this is the path to the device crate
+    device: stm32f413,
+
+    resources: {
+        static X:u32 = 1;
+        static Y:u32 = 1;
+    },
+
+    tasks: {
+        EXTI1: {
+            path: exti1,
+            priority: 1,
+            resources: [X, Y],
+        },
+        EXTI2: {
+            path: exti2,
+            priority: 2,
+            resources: [Y],
+        },
+    },
+}
+
+#[inline(never)]
+#[allow(non_snake_case)]
+fn exti1(t: &mut Threshold, EXTI1::Resources { X, mut Y }: EXTI1::Resources) {
+    Y.claim_mut(t, |y, _| {
+        if *X < 5 {
+            for _ in 0..*X {
+                *y += 1;
+            }
+        }
+    });
+}
+
+fn exti2(_: &mut Threshold, _: EXTI2::Resources) {}
+
+// The `init` function
+//
+// This function runs as an atomic section before any tasks
+// are allowed to start
+#[inline(never)]
+#[allow(dead_code)]
+fn init(_: init::Peripherals, _: init::Resources) {}
+
+// The idle loop.
+//
+// This runs after `init` and has a priority of 0. All tasks can preempt this
+// function. This function can never return so it must contain some sort of
+// endless loop.
+#[inline(never)]
+fn idle() -> ! {
+    loop {}
+}
+
+// Assignments
+//
+// Rust strives at being a safe language.
+// - Memory safety,
+//   - static checking where possible
+//   - run-time checking causing `panic!` on violation
+//
+// - No undefined behavior in "safe" Rust
+//   - panic! in case undef behavior (e.g., div 0)
+//
+// Compiling and analysing the code using KLEE
+//
+// What problem(s) did KLEE identify
+// ** your answer here **
+//
+// Now try to solve this by contracts
+// You should not change the code, just enable the contacts
+// The `_` should be filled with concrete values
+//
+// Can you find a type invariant that satisfies BOTH pre- and post-conditions
+// at the same time.
+//
+// If not, why is that not possible?
diff --git a/examples/simple6.rs b/examples/simple6.rs
new file mode 100644
index 0000000000000000000000000000000000000000..ec18fe9bae4dc2c343536c5f2799de5252375cdb
--- /dev/null
+++ b/examples/simple6.rs
@@ -0,0 +1,98 @@
+//! Minimal example with zero tasks
+//#![deny(unsafe_code)]
+// IMPORTANT always include this feature gate
+#![feature(proc_macro)]
+#![feature(used)]
+#![no_std]
+
+extern crate cortex_m_rtfm as rtfm;
+// IMPORTANT always do this rename
+extern crate stm32f413;
+
+#[macro_use]
+extern crate klee;
+use klee::{k_abort, k_assert, k_assume, k_read};
+
+// import the procedural macro
+use rtfm::{app, Resource, Threshold};
+
+app! {
+    // this is the path to the device crate
+    device: stm32f413,
+
+    resources: {
+        static X:u32 = 1;
+        static Y:u32 = 1;
+    },
+
+    tasks: {
+        EXTI1: {
+            path: exti1,
+            priority: 1,
+            resources: [X, Y],
+        },
+        EXTI2: {
+            path: exti2,
+            priority: 2,
+            resources: [X],
+        },
+    },
+}
+
+#[inline(never)]
+#[allow(non_snake_case)]
+fn exti1(t: &mut Threshold, EXTI1::Resources { X, mut Y }: EXTI1::Resources) {
+    X.claim(t, |x, _| {
+        if *x > 10 {
+            *Y = 5;
+        } else {
+            if *x < 5 {
+                *Y = 8;
+            }
+        }
+    });
+}
+
+fn exti2(_: &mut Threshold, _: EXTI2::Resources) {}
+
+// The `init` function
+//
+// This function runs as an atomic section before any tasks
+// are allowed to start
+#[inline(never)]
+#[allow(dead_code)]
+fn init(_: init::Peripherals, _: init::Resources) {}
+
+// The idle loop.
+//
+// This runs after `init` and has a priority of 0. All tasks can preempt this
+// function. This function can never return so it must contain some sort of
+// endless loop.
+#[inline(never)]
+fn idle() -> ! {
+    loop {}
+}
+
+// Assignments
+//
+// Rust strives at being a safe language.
+// - Memory safety,
+//   - static checking where possible
+//   - run-time checking causing `panic!` on violation
+//
+// - No undefined behavior in "safe" Rust
+//   - panic! in case undef behavior (e.g., div 0)
+//
+// Compiling and analysing the code using KLEE
+//
+// What problem(s) did KLEE identify
+// ** your answer here **
+//
+// Now try to solve this by contracts
+// You should not change the code, just enable the contacts
+// The `_` should be filled with concrete values
+//
+// Can you find a type invariant that satisfies BOTH pre- and post-conditions
+// at the same time.
+//
+// If not, why is that not possible?
diff --git a/examples/simple7.rs b/examples/simple7.rs
new file mode 100644
index 0000000000000000000000000000000000000000..bb91ed95dd2bd2835517774c160925877b44f247
--- /dev/null
+++ b/examples/simple7.rs
@@ -0,0 +1,100 @@
+//! Minimal example with zero tasks
+//#![deny(unsafe_code)]
+// IMPORTANT always include this feature gate
+#![feature(proc_macro)]
+#![feature(used)]
+#![no_std]
+
+extern crate cortex_m_rtfm as rtfm;
+// IMPORTANT always do this rename
+extern crate stm32f413;
+
+#[macro_use]
+extern crate klee;
+use klee::{k_abort, k_assert, k_assume, k_read};
+
+// import the procedural macro
+use rtfm::{app, Resource, Threshold};
+
+app! {
+    // this is the path to the device crate
+    device: stm32f413,
+
+    resources: {
+        static X:u32 = 1;
+        static Y:u32 = 1;
+    },
+
+    tasks: {
+        EXTI1: {
+            path: exti1,
+            priority: 1,
+            resources: [X, Y],
+        },
+        EXTI2: {
+            path: exti2,
+            priority: 2,
+            resources: [X, Y],
+        },
+    },
+}
+
+#[inline(never)]
+#[allow(non_snake_case)]
+fn exti1(t: &mut Threshold, EXTI1::Resources { X, mut Y }: EXTI1::Resources) {
+    X.claim(t, |x, t| {
+        Y.claim_mut(t, |y, _| {
+            if *x > 10 {
+                *y = 5;
+            } else {
+                if *x < 5 {
+                    *y = 8;
+                }
+            }
+        });
+    });
+}
+
+fn exti2(_: &mut Threshold, _: EXTI2::Resources) {}
+
+// The `init` function
+//
+// This function runs as an atomic section before any tasks
+// are allowed to start
+#[inline(never)]
+#[allow(dead_code)]
+fn init(_: init::Peripherals, _: init::Resources) {}
+
+// The idle loop.
+//
+// This runs after `init` and has a priority of 0. All tasks can preempt this
+// function. This function can never return so it must contain some sort of
+// endless loop.
+#[inline(never)]
+fn idle() -> ! {
+    loop {}
+}
+
+// Assignments
+//
+// Rust strives at being a safe language.
+// - Memory safety,
+//   - static checking where possible
+//   - run-time checking causing `panic!` on violation
+//
+// - No undefined behavior in "safe" Rust
+//   - panic! in case undef behavior (e.g., div 0)
+//
+// Compiling and analysing the code using KLEE
+//
+// What problem(s) did KLEE identify
+// ** your answer here **
+//
+// Now try to solve this by contracts
+// You should not change the code, just enable the contacts
+// The `_` should be filled with concrete values
+//
+// Can you find a type invariant that satisfies BOTH pre- and post-conditions
+// at the same time.
+//
+// If not, why is that not possible?