diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 00000000..956be3cb
Binary files /dev/null and b/.DS_Store differ
diff --git a/Cargo.toml b/Cargo.toml
index 5f5c8a9f..bf4195dd 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -4,5 +4,6 @@ version = "0.1.0"
 authors = ["olivia <olivia@fastmail.com>"]
 
 [dependencies]
-quicli = "0.2.0"
-ansi_term = "0.11.0"
+clap = "2.32.0"
+indicatif = "0.9.0"
+console = "0.6.2"
diff --git a/README.md b/README.md
index 4ddaae5e..8049c22b 100644
--- a/README.md
+++ b/README.md
@@ -1,44 +1,3 @@
 # rustlings
 
 A cool thing that is currently in development.
-
-## How it's structured
-
-Ideally, like RubyKoans, all exercises can be run by executing one command, in this case
-`cargo run` (most likely). This runs `src/main.rs`, which in turn runs all of the exercises.
-Each exercise is contained in a Rust file called `about_<exercise topic>.rs`. A minimal exercise looks
-somewhat like this:
-
-```rust
-fn exercise_function() {
-  "hello"
-}
-
-mod tests {
-  use super::*;
-  
-  pub fn test() {
-    verify!("REPLACE ME", exercise_function(), "Function description");
-  }
-}
-
-pub fn exec() {
-  tests::test();
-}
-```
-
-Each exercise file is supposed to have one `exec` function which gets called by the `main.rs` file.
-This function, in turn, calls all individual test functions.
-
-The tests themselves can generally be structured in whatever way is desired, there doesn't have to be a "tests" module, for example. Two macros are provided
-for convenience. The `verify` helper function is essentially a specialized `assert_eq!`, but it doesn't panic
-if the values mismatch, instead it prints out a helpful error message and keeps going. The
-`verify_easy` function is designed as a drop-in replacement for the `verify` function for if the learner needs help solving the exercise. It prints the expected value, too.
-
-This is roughly what the console output for a simple exercise looks right now:
-
-![](https://i.imgur.com/gGgjvLW.png)
-
-Keep in mind that this is a very early draft of how things work. Anything here might be changed
-at any time, and this documentation should be updated accordingly.
-
diff --git a/old_curriculum/error_handling/errors1.rs b/exercises/error_handling/errors1.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/error_handling/errors1.rs
rename to exercises/error_handling/errors1.rs
diff --git a/old_curriculum/error_handling/errors2.rs b/exercises/error_handling/errors2.rs
old mode 100644
new mode 100755
similarity index 89%
rename from old_curriculum/error_handling/errors2.rs
rename to exercises/error_handling/errors2.rs
index 05824c13..15c21c8a
--- a/old_curriculum/error_handling/errors2.rs
+++ b/exercises/error_handling/errors2.rs
@@ -66,7 +66,7 @@ mod tests {
 // One way to handle this is using a `match` statement on
 // `item_quantity.parse::<i32>()` where the cases are `Ok(something)` and
 // `Err(something)`. This pattern is very common in Rust, though, so there's
-// a `try!` macro that does pretty much what you would make that match statement
+// a `?` operator that does pretty much what you would make that match statement
 // do for you! Take a look at this section of the Error Handling chapter:
-// https://doc.rust-lang.org/stable/book/error-handling.html#the-try-macro
-// and give it a `try!`
+// https://doc.rust-lang.org/stable/book/second-edition/ch09-02-recoverable-errors-with-result.html#a-shortcut-for-propagating-errors-the--operator
+// and give it a try!
diff --git a/old_curriculum/error_handling/errors3.rs b/exercises/error_handling/errors3.rs
old mode 100644
new mode 100755
similarity index 50%
rename from old_curriculum/error_handling/errors3.rs
rename to exercises/error_handling/errors3.rs
index 9b285e0b..9c29af58
--- a/old_curriculum/error_handling/errors3.rs
+++ b/exercises/error_handling/errors3.rs
@@ -1,7 +1,7 @@
 // errors3.rs
 // This is a program that is trying to use a completed version of the
 // `total_cost` function from the previous exercise. It's not working though--
-// we can't call the `try!` macro in the `main()` function! Why not?
+// we can't use the `?` operator in the `main()` function! Why not?
 // What should we do instead? Scroll for hints!
 
 use std::num::ParseIntError;
@@ -10,7 +10,7 @@ fn main() {
     let mut tokens = 100;
     let pretend_user_input = "8";
 
-    let cost = try!(total_cost(pretend_user_input));
+    let cost = total_cost(pretend_user_input)?;
 
     if cost > tokens {
         println!("You can't afford that many!");
@@ -23,7 +23,7 @@ fn main() {
 pub fn total_cost(item_quantity: &str) -> Result<i32, ParseIntError> {
     let processing_fee = 1;
     let cost_per_item = 5;
-    let qty = try!(item_quantity.parse::<i32>());
+    let qty = item_quantity.parse::<i32>()?;
 
     Ok(qty * cost_per_item + processing_fee)
 }
@@ -45,23 +45,18 @@ pub fn total_cost(item_quantity: &str) -> Result<i32, ParseIntError> {
 
 
 
-// Since the `try!` macro returns an `Err` early if the thing it's trying to
-// do fails, you can only use the `try!` macro in functions that have a
+// Since the `?` operator returns an `Err` early if the thing it's trying to
+// do fails, you can only use the `?` operator in functions that have a
 // `Result` as their return type.
 
-// The error that you get if you run this code is:
+// Hence the error that you get if you run this code is:
 
 // ```
-// error: mismatched types:
-// expected `()`,
-// found `std::result::Result<_, _>`
+// error[E0277]: the `?` operator can only be used in a function that returns `Result` (or another type that implements `std::ops::Try`)
 // ```
 
-// which is saying that the expected return type of the `main` function is
-// the empty tuple, but we tried to return a `Result`-- and that's happening
-// in the implementation of `try!`. The `main` function never has a return type,
-// so we have to use another way of handling a `Result` within `main`.
+// So we have to use another way of handling a `Result` within `main`.
 
 // Decide what we should do if `pretend_user_input` has a string value that does
-// not parse to an integer, and implement that instead of calling the `try!`
-// macro.
+// not parse to an integer, and implement that instead of using the `?`
+// operator.
diff --git a/old_curriculum/error_handling/errorsn.rs b/exercises/error_handling/errorsn.rs
old mode 100644
new mode 100755
similarity index 90%
rename from old_curriculum/error_handling/errorsn.rs
rename to exercises/error_handling/errorsn.rs
index ee1179dc..15c6cd59
--- a/old_curriculum/error_handling/errorsn.rs
+++ b/exercises/error_handling/errorsn.rs
@@ -115,21 +115,21 @@ impl error::Error for CreationError {
 
 // Next hint: There are three places in `read_and_validate` that we call a
 // function that returns a `Result` (that is, the functions might fail).
-// Wrap those calls in a `try!` macro call so that we return immediately from
+// Apply the `?` operator on those calls so that we return immediately from
 // `read_and_validate` if those function calls fail.
 
-// Another hint: under the hood, the `try!` macro calls `From::from`
+// Another hint: under the hood, the `?` operator calls `From::from`
 // on the error value to convert it to a boxed trait object, a Box<error::Error>,
 // which is polymorphic-- that means that lots of different kinds of errors
 // can be returned from the same function because all errors act the same
 // since they all implement the `error::Error` trait.
 // Check out this section of the book:
-// https://doc.rust-lang.org/stable/book/error-handling.html#standard-library-traits-used-for-error-handling
+// https://doc.rust-lang.org/stable/book/second-edition/ch09-02-recoverable-errors-with-result.html#a-shortcut-for-propagating-errors-the--operator
 
-// Another another hint: Note that because the `try!` macro returns
+// Another another hint: Note that because the `?` operator returns
 // the *unwrapped* value in the `Ok` case, if we want to return a `Result` from
 // `read_and_validate` for *its* success case, we'll have to rewrap a value
-// that we got from the return value of a `try!` call in an `Ok`-- this will
+// that we got from the return value of a `?`ed call in an `Ok`-- this will
 // look like `Ok(something)`.
 
 // Another another another hint: `Result`s must be "used", that is, you'll
diff --git a/old_curriculum/error_handling/option1.rs b/exercises/error_handling/option1.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/error_handling/option1.rs
rename to exercises/error_handling/option1.rs
diff --git a/old_curriculum/error_handling/result1.rs b/exercises/error_handling/result1.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/error_handling/result1.rs
rename to exercises/error_handling/result1.rs
diff --git a/old_curriculum/ex1.rs b/exercises/ex1.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/ex1.rs
rename to exercises/ex1.rs
diff --git a/old_curriculum/ex2.rs b/exercises/ex2.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/ex2.rs
rename to exercises/ex2.rs
diff --git a/old_curriculum/ex3.rs b/exercises/ex3.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/ex3.rs
rename to exercises/ex3.rs
diff --git a/old_curriculum/ex4.rs b/exercises/ex4.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/ex4.rs
rename to exercises/ex4.rs
diff --git a/old_curriculum/ex5.rs b/exercises/ex5.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/ex5.rs
rename to exercises/ex5.rs
diff --git a/old_curriculum/functions/functions1.rs b/exercises/functions/functions1.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/functions/functions1.rs
rename to exercises/functions/functions1.rs
diff --git a/old_curriculum/functions/functions2.rs b/exercises/functions/functions2.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/functions/functions2.rs
rename to exercises/functions/functions2.rs
diff --git a/old_curriculum/functions/functions3.rs b/exercises/functions/functions3.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/functions/functions3.rs
rename to exercises/functions/functions3.rs
diff --git a/old_curriculum/functions/functions4.rs b/exercises/functions/functions4.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/functions/functions4.rs
rename to exercises/functions/functions4.rs
diff --git a/old_curriculum/functions/functions5.rs b/exercises/functions/functions5.rs
old mode 100644
new mode 100755
similarity index 51%
rename from old_curriculum/functions/functions5.rs
rename to exercises/functions/functions5.rs
index f8fac5d2..d3ff0024
--- a/old_curriculum/functions/functions5.rs
+++ b/exercises/functions/functions5.rs
@@ -40,5 +40,8 @@ fn square(num: i32) -> i32 {
 
 // This is a really common error that can be fixed by removing one character.
 // It happens because Rust distinguishes between expressions and statements: expressions return
-// a value and statements don't. We want to return a value from the `square` function, but it
-// isn't returning one right now...
+// a value based on its operand, and statements simply return a () type which behaves just like `void` in C/C++ language. 
+// We want to return a value of `i32` type from the `square` function, but it is returning a `()` type...
+// They are not the same. There are two solutions:
+// 1. Add a `return` ahead of `num * num;`
+// 2. remove `;`, make it to be `num * num`
diff --git a/old_curriculum/if/if1.rs b/exercises/if/if1.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/if/if1.rs
rename to exercises/if/if1.rs
diff --git a/old_curriculum/macros/macros1.rs b/exercises/macros/macros1.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/macros/macros1.rs
rename to exercises/macros/macros1.rs
diff --git a/old_curriculum/macros/macros2.rs b/exercises/macros/macros2.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/macros/macros2.rs
rename to exercises/macros/macros2.rs
diff --git a/old_curriculum/macros/macros3.rs b/exercises/macros/macros3.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/macros/macros3.rs
rename to exercises/macros/macros3.rs
diff --git a/old_curriculum/macros/macros4.rs b/exercises/macros/macros4.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/macros/macros4.rs
rename to exercises/macros/macros4.rs
diff --git a/old_curriculum/modules/modules1.rs b/exercises/modules/modules1.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/modules/modules1.rs
rename to exercises/modules/modules1.rs
diff --git a/old_curriculum/modules/modules2.rs b/exercises/modules/modules2.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/modules/modules2.rs
rename to exercises/modules/modules2.rs
diff --git a/old_curriculum/move_semantics/move_semantics1.rs b/exercises/move_semantics/move_semantics1.rs
old mode 100644
new mode 100755
similarity index 97%
rename from old_curriculum/move_semantics/move_semantics1.rs
rename to exercises/move_semantics/move_semantics1.rs
index 73dc0ab1..37038ecd
--- a/old_curriculum/move_semantics/move_semantics1.rs
+++ b/exercises/move_semantics/move_semantics1.rs
@@ -1,7 +1,7 @@
 // move_semantics1.rs
 // Make me compile! Scroll down for hints :)
 
-pub fn main() {
+fn main() {
     let vec0 = Vec::new();
 
     let vec1 = fill_vec(vec0);
diff --git a/old_curriculum/move_semantics/move_semantics2.rs b/exercises/move_semantics/move_semantics2.rs
old mode 100644
new mode 100755
similarity index 98%
rename from old_curriculum/move_semantics/move_semantics2.rs
rename to exercises/move_semantics/move_semantics2.rs
index bc42d8ec..b50e3497
--- a/old_curriculum/move_semantics/move_semantics2.rs
+++ b/exercises/move_semantics/move_semantics2.rs
@@ -1,7 +1,7 @@
 // move_semantics2.rs
 // Make me compile without changing line 10! Scroll down for hints :)
 
-pub fn main() {
+fn main() {
     let vec0 = Vec::new();
 
     let mut vec1 = fill_vec(vec0);
diff --git a/old_curriculum/move_semantics/move_semantics3.rs b/exercises/move_semantics/move_semantics3.rs
old mode 100644
new mode 100755
similarity index 98%
rename from old_curriculum/move_semantics/move_semantics3.rs
rename to exercises/move_semantics/move_semantics3.rs
index 7805d442..8e7b0ad9
--- a/old_curriculum/move_semantics/move_semantics3.rs
+++ b/exercises/move_semantics/move_semantics3.rs
@@ -3,7 +3,7 @@
 // (no lines with multiple semicolons necessary!)
 // Scroll down for hints :)
 
-pub fn main() {
+fn main() {
     let vec0 = Vec::new();
 
     let mut vec1 = fill_vec(vec0);
diff --git a/old_curriculum/move_semantics/move_semantics4.rs b/exercises/move_semantics/move_semantics4.rs
old mode 100644
new mode 100755
similarity index 98%
rename from old_curriculum/move_semantics/move_semantics4.rs
rename to exercises/move_semantics/move_semantics4.rs
index 2b1ed8aa..903a330f
--- a/old_curriculum/move_semantics/move_semantics4.rs
+++ b/exercises/move_semantics/move_semantics4.rs
@@ -3,7 +3,7 @@
 // in `fn main`, we instead create it within `fn fill_vec` and transfer the
 // freshly created vector from fill_vec to its caller. Scroll for hints!
 
-pub fn main() {
+fn main() {
     let vec0 = Vec::new();
 
     let mut vec1 = fill_vec(vec0);
diff --git a/old_curriculum/primitive_types/primitive_types1.rs b/exercises/primitive_types/primitive_types1.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/primitive_types/primitive_types1.rs
rename to exercises/primitive_types/primitive_types1.rs
diff --git a/old_curriculum/primitive_types/primitive_types2.rs b/exercises/primitive_types/primitive_types2.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/primitive_types/primitive_types2.rs
rename to exercises/primitive_types/primitive_types2.rs
diff --git a/old_curriculum/primitive_types/primitive_types3.rs b/exercises/primitive_types/primitive_types3.rs
old mode 100644
new mode 100755
similarity index 78%
rename from old_curriculum/primitive_types/primitive_types3.rs
rename to exercises/primitive_types/primitive_types3.rs
index a2f9b3b3..7ce22262
--- a/old_curriculum/primitive_types/primitive_types3.rs
+++ b/exercises/primitive_types/primitive_types3.rs
@@ -39,8 +39,9 @@ fn main() {
 
 
 // There's a shorthand to initialize Arrays with a certain size that does not 
-// require you to type in 100 items (but you certainly can if you want!)
-// Check out the Primitive Types -> Arrays section of the book:
-// https://doc.rust-lang.org/stable/book/second-edition/ch03-02-data-types.html#arrays
+// require you to type in 100 items (but you certainly can if you want!).
+// For example, you can do:
+// let array = ["Are we there yet?"; 10];
+
 // Bonus: what are some other things you could have that would return true
 // for `a.len() >= 100`?
diff --git a/old_curriculum/primitive_types/primitive_types4.rs b/exercises/primitive_types/primitive_types4.rs
old mode 100644
new mode 100755
similarity index 63%
rename from old_curriculum/primitive_types/primitive_types4.rs
rename to exercises/primitive_types/primitive_types4.rs
index c20b63bb..7dc9e478
--- a/old_curriculum/primitive_types/primitive_types4.rs
+++ b/exercises/primitive_types/primitive_types4.rs
@@ -38,12 +38,12 @@ fn main() {
 
 
 
-// Take a look at the Primitive Types -> Slices section of the book:
-// http://doc.rust-lang.org/stable/book/primitive-types.html#slices
+// Take a look at the Understanding Ownership -> Slices -> Other Slices section of the book:
+// https://doc.rust-lang.org/stable/book/second-edition/ch04-03-slices.html#other-slices
 // and use the starting and ending indices of the items in the Array
 // that you want to end up in the slice.
 
 // If you're curious why the right hand of the `==` comparison does not
 // have an ampersand for a reference since the left hand side is a
-// reference, take a look at the Deref coercions chapter:
-// http://doc.rust-lang.org/stable/book/deref-coercions.html
+// reference, take a look at the Deref coercions section of the book:
+// https://doc.rust-lang.org/stable/book/second-edition/ch15-02-deref.html#implicit-deref-coercions-with-functions-and-methods
diff --git a/exercises/primitive_types/primitive_types5.rs b/exercises/primitive_types/primitive_types5.rs
new file mode 100755
index 00000000..4045e783
--- /dev/null
+++ b/exercises/primitive_types/primitive_types5.rs
@@ -0,0 +1,45 @@
+// primitive_types5.rs
+// Destructure the `cat` tuple so that the println will work.
+// Scroll down for hints!
+
+fn main() {
+    let cat = ("Furry McFurson", 3.5);
+    let /* your pattern here */ = cat;
+
+    println!("{} is {} years old.", name, age);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+// Take a look at the Data Types -> The Tuple Type section of the book:
+// https://doc.rust-lang.org/stable/book/second-edition/ch03-02-data-types.html#the-tuple-type
+// Particularly the part about destructuring (second to last example in the section). 
+// You'll need to make a pattern to bind `name` and `age` to the appropriate parts
+// of the tuple. You can do it!!
diff --git a/old_curriculum/primitive_types/primitive_types6.rs b/exercises/primitive_types/primitive_types6.rs
old mode 100644
new mode 100755
similarity index 65%
rename from old_curriculum/primitive_types/primitive_types6.rs
rename to exercises/primitive_types/primitive_types6.rs
index d0166428..439a56bc
--- a/old_curriculum/primitive_types/primitive_types6.rs
+++ b/exercises/primitive_types/primitive_types6.rs
@@ -39,6 +39,7 @@ fn main() {
 
 
 // While you could use a destructuring `let` for the tuple here, try 
-// indexing into it instead, as explained here:
-// http://doc.rust-lang.org/stable/book/primitive-types.html#tuple-indexing
+// indexing into it instead, as explained in the last example of the 
+// Data Types -> The Tuple Type section of the book:
+// https://doc.rust-lang.org/stable/book/second-edition/ch03-02-data-types.html#the-tuple-type
 // Now you have another tool in your toolbox!
diff --git a/old_curriculum/standard_library_types/arc1.rs b/exercises/standard_library_types/arc1.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/standard_library_types/arc1.rs
rename to exercises/standard_library_types/arc1.rs
diff --git a/old_curriculum/standard_library_types/iterator3.rs b/exercises/standard_library_types/iterator3.rs
old mode 100644
new mode 100755
similarity index 92%
rename from old_curriculum/standard_library_types/iterator3.rs
rename to exercises/standard_library_types/iterator3.rs
index e973ac64..1d2e1351
--- a/old_curriculum/standard_library_types/iterator3.rs
+++ b/exercises/standard_library_types/iterator3.rs
@@ -114,7 +114,8 @@ mod tests {
 
 
 
-// Minor hint: In each of the two cases in the match in main, you can create x with either a 'turbofish' or by hinting the type of x to the compiler. You may try both.
+// Minor hint: In each of the two cases in the match in main, you can create x with either 
+// a 'turbofish' or by hinting the type of x to the compiler. You may try both.
 
 
 
@@ -142,4 +143,5 @@ mod tests {
 
 
 
-// Major hint: Have a look at the Iter trait and at the explanation of its collect function. Especially the part about Result is interesting.
+// Major hint: Have a look at the Iter trait and at the explanation of its collect function. 
+// Especially the part about Result is interesting.
diff --git a/old_curriculum/standard_library_types/iterators4.rs b/exercises/standard_library_types/iterators4.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/standard_library_types/iterators4.rs
rename to exercises/standard_library_types/iterators4.rs
diff --git a/old_curriculum/strings/strings1.rs b/exercises/strings/strings1.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/strings/strings1.rs
rename to exercises/strings/strings1.rs
diff --git a/old_curriculum/strings/strings2.rs b/exercises/strings/strings2.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/strings/strings2.rs
rename to exercises/strings/strings2.rs
diff --git a/old_curriculum/strings/strings3.rs b/exercises/strings/strings3.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/strings/strings3.rs
rename to exercises/strings/strings3.rs
diff --git a/old_curriculum/tests/tests1.rs b/exercises/tests/tests1.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/tests/tests1.rs
rename to exercises/tests/tests1.rs
diff --git a/old_curriculum/tests/tests2.rs b/exercises/tests/tests2.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/tests/tests2.rs
rename to exercises/tests/tests2.rs
diff --git a/old_curriculum/tests/tests3.rs b/exercises/tests/tests3.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/tests/tests3.rs
rename to exercises/tests/tests3.rs
diff --git a/old_curriculum/tests/tests4.rs b/exercises/tests/tests4.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/tests/tests4.rs
rename to exercises/tests/tests4.rs
diff --git a/old_curriculum/threads/threads1.rs b/exercises/threads/threads1.rs
old mode 100644
new mode 100755
similarity index 95%
rename from old_curriculum/threads/threads1.rs
rename to exercises/threads/threads1.rs
index b4a5dc98..4f9aa898
--- a/old_curriculum/threads/threads1.rs
+++ b/exercises/threads/threads1.rs
@@ -45,7 +45,7 @@ fn main() {
 // to **immutable** data. But we want to *change* the number of `jobs_completed`
 // so we'll need to also use another type that will only allow one thread to
 // mutate the data at a time. Take a look at this section of the book:
-// https://doc.rust-lang.org/stable/book/concurrency.html#safe-shared-mutable-state
+// https://doc.rust-lang.org/stable/book/second-edition/ch16-03-shared-state.html#atomic-reference-counting-with-arct
 // and keep scrolling if you'd like more hints :)
 
 
diff --git a/old_curriculum/variables/variables1.rs b/exercises/variables/variables1.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/variables/variables1.rs
rename to exercises/variables/variables1.rs
diff --git a/old_curriculum/variables/variables2.rs b/exercises/variables/variables2.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/variables/variables2.rs
rename to exercises/variables/variables2.rs
diff --git a/old_curriculum/variables/variables3.rs b/exercises/variables/variables3.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/variables/variables3.rs
rename to exercises/variables/variables3.rs
diff --git a/old_curriculum/variables/variables4.rs b/exercises/variables/variables4.rs
old mode 100644
new mode 100755
similarity index 100%
rename from old_curriculum/variables/variables4.rs
rename to exercises/variables/variables4.rs
diff --git a/old_curriculum/.travis.yml b/old_curriculum/.travis.yml
deleted file mode 100644
index 684b2659..00000000
--- a/old_curriculum/.travis.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-language: rust
-
-branches:
-  only:
-  - master
-
-cache:
-  cargo: true
-
-script:
-  - cargo run --bin generate_readme
-  - git config user.name "Carol (Nichols || Goulding)"
-  - git config user.email "carol.nichols@gmail.com"
-  - git commit -am "Regenerate README" && git remote add upstream "https://$GH_TOKEN@github.com/carols10cents/rustlings.git" && git push -q upstream HEAD:master > /dev/null 2>&1 || true
-
-notifications:
-  email:
-    on_success: never
-
diff --git a/old_curriculum/Cargo.lock b/old_curriculum/Cargo.lock
deleted file mode 100644
index 7bff9011..00000000
--- a/old_curriculum/Cargo.lock
+++ /dev/null
@@ -1,456 +0,0 @@
-[[package]]
-name = "aho-corasick"
-version = "0.6.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "ansi_term"
-version = "0.10.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "atty"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "libc 0.2.37 (registry+https://github.com/rust-lang/crates.io-index)",
- "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "bitflags"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "cfg-if"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "clap"
-version = "2.30.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "atty 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "dtoa"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "encoding"
-version = "0.2.33"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "encoding-index-korean 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "encoding-index-simpchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "encoding-index-singlebyte 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "encoding-index-japanese"
-version = "1.20141219.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "encoding-index-korean"
-version = "1.20141219.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "encoding-index-simpchinese"
-version = "1.20141219.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "encoding-index-singlebyte"
-version = "1.20141219.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "encoding-index-tradchinese"
-version = "1.20141219.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "encoding_index_tests"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "glob"
-version = "0.2.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "handlebars"
-version = "0.32.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "pest_derive 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "quick-error 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "regex 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_json 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "idna"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "itoa"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "lazy_static"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "libc"
-version = "0.2.37"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "log"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "matches"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "memchr"
-version = "2.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "libc 0.2.37 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "num-traits"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "percent-encoding"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "pest"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "pest_derive"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "prlink"
-version = "0.1.0"
-source = "git+https://github.com/btbytes/prlink#f0536ed3b322072d65c42da2fc2a817b77d77308"
-dependencies = [
- "clap 2.30.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
- "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "quick-error"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "quote"
-version = "0.3.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "redox_syscall"
-version = "0.1.37"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "redox_termios"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "regex"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "rustlings"
-version = "0.1.0"
-dependencies = [
- "handlebars 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "prlink 0.1.0 (git+https://github.com/btbytes/prlink)",
- "serde_json 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "serde"
-version = "1.0.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "serde_json"
-version = "1.0.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "itoa 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "num-traits 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "strsim"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "syn"
-version = "0.11.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
- "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "synom"
-version = "0.11.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "termion"
-version = "1.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "libc 0.2.37 (registry+https://github.com/rust-lang/crates.io-index)",
- "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
- "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "textwrap"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "thread_local"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "unicode-bidi"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "unicode-normalization"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "unicode-width"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "unicode-xid"
-version = "0.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "unreachable"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "url"
-version = "1.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
- "idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "utf8-ranges"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "vec_map"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "void"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "winapi"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[metadata]
-"checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4"
-"checksum ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6b3568b48b7cefa6b8ce125f9bb4989e52fbcc29ebea88df04cc7c5f12f70455"
-"checksum atty 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8352656fd42c30a0c3c89d26dea01e3b77c0ab2af18230835c15e2e13cd51859"
-"checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf"
-"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de"
-"checksum clap 2.30.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1c07b9257a00f3fc93b7f3c417fc15607ec7a56823bc2c37ec744e266387de5b"
-"checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab"
-"checksum encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec"
-"checksum encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91"
-"checksum encoding-index-korean 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81"
-"checksum encoding-index-simpchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7"
-"checksum encoding-index-singlebyte 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a"
-"checksum encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18"
-"checksum encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569"
-"checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb"
-"checksum handlebars 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07af2ff31f66f39a5c8b8b8a5dc02734a453110146763e3a2323f4931a915a76"
-"checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d"
-"checksum itoa 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8324a32baf01e2ae060e9de58ed0bc2320c9a2833491ee36cd3b4c414de4db8c"
-"checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d"
-"checksum libc 0.2.37 (registry+https://github.com/rust-lang/crates.io-index)" = "56aebce561378d99a0bb578f8cb15b6114d2a1814a6c7949bbe646d968bb4fa9"
-"checksum log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "89f010e843f2b1a31dbd316b3b8d443758bc634bed37aabade59c686d644e0a2"
-"checksum matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "100aabe6b8ff4e4a7e32c1c13523379802df0772b82466207ac25b013f193376"
-"checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d"
-"checksum num-traits 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3c2bd9b9d21e48e956b763c9f37134dc62d9e95da6edb3f672cacb6caf3cd3"
-"checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831"
-"checksum pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0fce5d8b5cc33983fc74f78ad552b5522ab41442c4ca91606e4236eb4b5ceefc"
-"checksum pest_derive 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "6453faedc5c9980a3c278f28b1df33344a79cc6d4a2fd96e2b56288374dc822a"
-"checksum prlink 0.1.0 (git+https://github.com/btbytes/prlink)" = "<none>"
-"checksum quick-error 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eda5fe9b71976e62bc81b781206aaa076401769b2143379d3eb2118388babac4"
-"checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"
-"checksum redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "0d92eecebad22b767915e4d529f89f28ee96dbbf5a4810d2b844373f136417fd"
-"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76"
-"checksum regex 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "5be5347bde0c48cfd8c3fdc0766cdfe9d8a755ef84d620d6794c778c91de8b2b"
-"checksum regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8e931c58b93d86f080c734bfd2bce7dd0079ae2331235818133c8be7f422e20e"
-"checksum serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "db99f3919e20faa51bb2996057f5031d8685019b5a06139b1ce761da671b8526"
-"checksum serde_json 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "57781ed845b8e742fc2bf306aba8e3b408fe8c366b900e3769fbc39f49eb8b39"
-"checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550"
-"checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad"
-"checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6"
-"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096"
-"checksum textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c0b59b6b4b44d867f1370ef1bd91bfb262bf07bf0ae65c202ea2fbc16153b693"
-"checksum thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "279ef31c19ededf577bfd12dfae728040a21f635b06a24cd670ff510edd38963"
-"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
-"checksum unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "51ccda9ef9efa3f7ef5d91e8f9b83bbe6955f9bf86aec89d5cce2c874625920f"
-"checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f"
-"checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc"
-"checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56"
-"checksum url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f808aadd8cfec6ef90e4a14eb46f24511824d1ac596b9682703c87056c8678b7"
-"checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122"
-"checksum vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887b5b631c2ad01628bbbaa7dd4c869f80d3186688f8d0b6f58774fbe324988c"
-"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
-"checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3"
-"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
-"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
diff --git a/old_curriculum/Cargo.toml b/old_curriculum/Cargo.toml
deleted file mode 100644
index d82b8a1f..00000000
--- a/old_curriculum/Cargo.toml
+++ /dev/null
@@ -1,9 +0,0 @@
-[package]
-name = "rustlings"
-version = "0.1.0"
-authors = ["Carol (Nichols || Goulding) <carol.nichols@gmail.com>"]
-
-[dependencies]
-handlebars = "0.32.0"
-serde_json = "1.0.10"
-prlink = { git = "https://github.com/btbytes/prlink" }
diff --git a/old_curriculum/README-template.hbs b/old_curriculum/README-template.hbs
deleted file mode 100644
index 5cfec7f3..00000000
--- a/old_curriculum/README-template.hbs
+++ /dev/null
@@ -1,190 +0,0 @@
-<!--
-{{ autogenerated_notice }}
--->
-
-# rustlings
-
-Small exercises to get you used to reading and writing Rust code. Includes practice reading and
-responding to compiler messages!
-
-This repo is very much the smallest thing that could possibly work :)
-
-## To do these exercises
-
-Thanks to [btbytes'](https://twitter.com/btbytes) [prlinks](https://github.com/btbytes/prlink), you
-can now click on the links below to load the exercises in the rust playground!
-
-There are infinite correct answers-- the exercises are sometimes left very open-ended. Scroll down
-in the playground to find comments that have hints.
-
-If you need more help or would like to compare solutions, you can ask in [#rust-beginners on
-irc.mozilla.org](https://chat.mibbit.com/?server=irc.mozilla.org&channel=%23rust-beginners ), the
-[user forum](https://users.rust-lang.org/), or [the subreddit](https://reddit.com/r/rust). If an
-exercise could be improved in any way, please [create an
-issue](https://github.com/carols10cents/rustlings/issues/new) or submit a pull request!
-
-### Variable bindings
-
-[Relevant chapter in The Rust Programming
-Language](https://doc.rust-lang.org/book/second-edition/ch03-01-variables-and-mutability.html)
-
-{{ playground_link "variables/variables1.rs" }}
-{{ playground_link "variables/variables2.rs" }}
-{{ playground_link "variables/variables3.rs" }}
-{{ playground_link "variables/variables4.rs" }}
-
-### Functions
-
-[Relevant chapter in The Rust Programming
-Language](https://doc.rust-lang.org/book/second-edition/ch03-03-how-functions-work.html)
-
-{{ playground_link "functions/functions1.rs" }}
-{{ playground_link "functions/functions2.rs" }}
-{{ playground_link "functions/functions3.rs" }}
-{{ playground_link "functions/functions4.rs" }}
-{{ playground_link "functions/functions5.rs" }}
-
-### Primitive types
-
-[Relevant chapter in The Rust Programming
-Language](https://doc.rust-lang.org/book/second-edition/ch03-02-data-types.html)
-
-{{ playground_link "primitive_types/primitive_types1.rs" }}
-{{ playground_link "primitive_types/primitive_types2.rs" }}
-{{ playground_link "primitive_types/primitive_types3.rs" }}
-{{ playground_link "primitive_types/primitive_types4.rs" }}
-{{ playground_link "primitive_types/primitive_types5.rs" }}
-{{ playground_link "primitive_types/primitive_types6.rs" }}
-
-### Tests
-
-Going out of order from the book to cover tests-- many of the following exercises will ask you to
-make tests pass!
-
-[Relevant chapter in The Rust Programming
-Language](https://doc.rust-lang.org/book/second-edition/ch11-01-writing-tests.html)
-
-{{ playground_link "tests/tests1.rs" }}
-{{ playground_link "tests/tests2.rs" }}
-{{ playground_link "tests/tests3.rs" }}
-{{ playground_link "tests/tests4.rs" }}
-
-### If
-
-[Relevant chapter in The Rust Programming
-Language](https://doc.rust-lang.org/book/second-edition/ch03-05-control-flow.html)
-
-{{ playground_link "if/if1.rs" }}
-
-### Strings
-
-[Relevant chapter in The Rust Programming
-Language](https://doc.rust-lang.org/book/second-edition/ch08-02-strings.html)
-
-{{ playground_link "strings/strings1.rs" }}
-{{ playground_link "strings/strings2.rs" }}
-{{ playground_link "strings/strings3.rs" }}
-
-### Move semantics
-
-These exercises are adapted from [pnkfelix]()'s [Rust
-Tutorial](https://pnkfelix.github.io/rust-examples-icfp2014/) -- thank you Felix!!!
-
-Relevant chapters in the book:
-
-- [Ownership](https://doc.rust-lang.org/book/second-edition/ch04-01-what-is-ownership.html)
-- [References and borrowing](https://doc.rust-lang.org/book/second-edition/ch04-02-references-and-borrowing.html)
-
-Note that the exercises in this section may look similar to each other but they are subtly
-different :)
-
-{{ playground_link "move_semantics/move_semantics1.rs" }}
-{{ playground_link "move_semantics/move_semantics2.rs" }}
-{{ playground_link "move_semantics/move_semantics3.rs" }}
-{{ playground_link "move_semantics/move_semantics4.rs" }}
-
-### Modules
-
-[Relevant chapter in The Rust Programming
-Language](https://doc.rust-lang.org/book/second-edition/ch07-01-mod-and-the-filesystem.html)
-
-{{ playground_link "modules/modules1.rs" }}
-{{ playground_link "modules/modules2.rs" }}
-
-### Macros
-
-Check out:
-
-- [The Macros section of the first edition of the book
-  book](https://doc.rust-lang.org/book/first-edition/macros.html)
-- [The Macros appendix of the second edition of the
-  book](https://doc.rust-lang.org/book/second-edition/appendix-04-macros.html)
-- [The Little Book of Rust Macros](https://danielkeep.github.io/tlborm/book/index.html)
-
-{{ playground_link "macros/macros1.rs" }}
-{{ playground_link "macros/macros2.rs" }}
-{{ playground_link "macros/macros3.rs" }}
-{{ playground_link "macros/macros4.rs" }}
-
-### Error Handling
-
-The [Error
-Handling](https://doc.rust-lang.org/book/second-edition/ch09-02-recoverable-errors-with-result.html)
-and [Generics](https://doc.rust-lang.org/book/second-edition/ch10-01-syntax.html) sections are
-relevant.
-
-{{ playground_link "error_handling/option1.rs" }}
-{{ playground_link "error_handling/result1.rs" }}
-{{ playground_link "error_handling/errors1.rs" }}
-{{ playground_link "error_handling/errors2.rs" }}
-{{ playground_link "error_handling/errors3.rs" }}
-{{ playground_link "error_handling/errorsn.rs" }}
-
-### Standard library types
-
-#### `Arc`
-
-The [Concurrency](https://doc.rust-lang.org/book/second-edition/ch16-03-shared-state.html) section
-is relevant.
-
-{{ playground_link "standard_library_types/arc1.rs" }}
-
-#### Iterators
-
-Do not adjust your monitors-- iterators 1 and 2 are indeed missing. Iterator 3 is a bit challenging
-so we're leaving space for some exercises to lead up to it!
-
-Check out the [Iterators chapter of the
-book](https://doc.rust-lang.org/book/second-edition/ch13-02-iterators.html) and the [Iterator
-docs](https://doc.rust-lang.org/stable/std/iter/trait.Iterator.html).
-
-{{ playground_link "standard_library_types/iterator3.rs" }}
-{{ playground_link "standard_library_types/iterators4.rs" }}
-
-### Threads
-
-See [the Dining Philosophers
-example](https://doc.rust-lang.org/1.4.0/book/first-edition/dining-philosophers.html) and the
-[Concurrency Chapter](https://doc.rust-lang.org/book/second-edition/ch16-01-threads.html) from the
-book.
-
-{{ playground_link "threads/threads1.rs" }}
-
-### Uncategorized
-
-A few exercises based on things I've encountered or had trouble with getting used to.
-
-{{ playground_link "ex1.rs" }}
-{{ playground_link "ex2.rs" }}
-{{ playground_link "ex3.rs" }}
-{{ playground_link "ex4.rs" }}
-{{ playground_link "ex5.rs" }}
-
-## To help with this repo/TODO list
-
-* File issues for problems or suggestions!
-* Contribute more exercises! Anything that took you time to get used to, or that you had trouble
-  with, or that deserves practice would be a good exercise!
-* How could the process of doing these exercises work better? This is an open-ended question :) Are
-  the playground links good enough? Are there ways that we could make going to the next exercise
-  easier without forking the playground??
diff --git a/old_curriculum/primitive_types/primitive_types5.rs b/old_curriculum/primitive_types/primitive_types5.rs
deleted file mode 100644
index 14c2fd26..00000000
--- a/old_curriculum/primitive_types/primitive_types5.rs
+++ /dev/null
@@ -1,45 +0,0 @@
-// primitive_types5.rs
-// Destructure the `cat` tuple so that the println will work.
-// Scroll down for hints!
-
-fn main() {
-    let cat = ("Furry McFurson", 3.5);
-    let /* your pattern here */ = cat;
-
-    println!("{} is {} years old.", name, age);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-// Take a look at the Primitive Types -> Tuples section of the book:
-// http://doc.rust-lang.org/stable/book/primitive-types.html#tuples
-// Particularly the part about "destructuring lets". You'll need to
-// make a pattern to bind `name` and `age` to the appropriate parts
-// of the tuple. You can do it!!
diff --git a/old_curriculum/src/bin/generate_readme.rs b/old_curriculum/src/bin/generate_readme.rs
deleted file mode 100644
index a502feae..00000000
--- a/old_curriculum/src/bin/generate_readme.rs
+++ /dev/null
@@ -1,49 +0,0 @@
-// This script reads README-template.md and generates the playground links
-// from the Rust source files in the various directories.
-
-// To add a new exercise, add it to the appropriate place in README-template.md
-// and then make sure to recompile this script (because the template gets
-// included at compile time and then run it to generate a new version of
-// README.md.
-
-extern crate handlebars;
-extern crate prlink;
-#[macro_use]
-extern crate serde_json;
-
-use handlebars::{Handlebars, Helper, RenderContext, RenderError};
-
-use std::fs::File;
-use std::io::prelude::*;
-use std::path::PathBuf;
-
-fn main() {
-    let mut template_file = File::open("README-template.hbs").unwrap();
-    let mut template = String::new();
-    template_file.read_to_string(&mut template).unwrap();
-
-    let autogenerated_notice = "This file was autogenerated by the script in src/bin/generate_readme.rs.
-Please edit either the script or the template in README-template.md in
-order to make changes here rather than committing the changes directly.";
-
-    let mut generated_readme = File::create("README.md").unwrap();
-
-    let mut hbs = Handlebars::new();
-    hbs.register_helper("playground_link", Box::new(playground_link_helper));
-
-    write!(
-        generated_readme,
-        "{}",
-        hbs.render_template(
-            &template,
-            &json!({ "autogenerated_notice": autogenerated_notice }),
-        ).unwrap()
-    ).unwrap();
-}
-
-fn playground_link_helper(h: &Helper, _: &Handlebars, rc: &mut RenderContext) -> Result<(), RenderError> {
-    let filename = PathBuf::from(h.param(0).unwrap().value().as_str().unwrap());
-    let link = prlink::linkify_file(&filename);
-    rc.writer.write(link.into_bytes().as_ref())?;
-    Ok(())
-}
diff --git a/src/about_variables.rs b/src/about_variables.rs
deleted file mode 100644
index 1587dc00..00000000
--- a/src/about_variables.rs
+++ /dev/null
@@ -1,38 +0,0 @@
-use helpers::*;
-
-// Variables in Rust are defined using the "let" keyword. Like this:
-
-fn exercise_one() {
-    let x = 5;
-    verify(5, x);
-    //      ^  ^
-    //      |  |
-    // What's  The variable
-    //  in it  name
-}
-
-// Try to replace the "0" with the value of the variable, then run
-// "cargo run" and see if it was correct!
-
-// Here's a more complicated example:
-
-fn guess_me() -> &'static str {
-    let x = 10;
-    if x == 10 {
-        return "Ten!";
-    } else {
-        return "Not ten!";
-    }
-}
-
-fn exercise_two() {
-    let result = guess_me();
-    verify("REPLACE ME", result);
-}
-
-pub fn exec() {
-    title("Variables: Exercise 1");
-    exercise_one();
-    title("Variables: Exercise 2");
-    exercise_two();
-}
diff --git a/src/helpers.rs b/src/helpers.rs
deleted file mode 100644
index e0b560b5..00000000
--- a/src/helpers.rs
+++ /dev/null
@@ -1,33 +0,0 @@
-use ansi_term::Color::{Green, Red, Yellow};
-use std::fmt::Display;
-
-pub fn verify<T: PartialEq + Display>(left: T, right: T) {
-    if left == right {
-        println!("{} {} == {}", Green.bold().paint("PASS"), left, right);
-    } else {
-        println!(
-            "{} You submitted {}, but that's not correct!",
-            Red.bold().paint("FAIL"),
-            left
-        );
-        println!("     Please correct your code to make this test pass!");
-    }
-}
-
-pub fn verify_easy<T: PartialEq + Display>(left: T, right: T) {
-    if left == right {
-        println!("{} {} == {}", Green.bold().paint("PASS"), left, right);
-    } else {
-        println!(
-            "{} You submitted {}, but that's not correct!",
-            Red.bold().paint("FAIL"),
-            left
-        );
-        println!("     Expected: {}", right);
-        println!("     Please correct your code to make this test pass!");
-    }
-}
-
-pub fn title(s: &str) {
-    println!("{} {}", Yellow.bold().paint("RUN"), s);
-}
diff --git a/src/main.rs b/src/main.rs
index 02f02274..cf2eddd4 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,21 +1,44 @@
 #[macro_use]
-extern crate quicli;
-extern crate ansi_term;
+extern crate clap;
+extern crate indicatif;
+extern crate console;
 
-use ansi_term::Color::Yellow;
-use quicli::prelude::*;
+use clap::{App, SubCommand};
+use indicatif::{ProgressBar};
+use console::{style, Emoji};
+use std::process::Command;
 
-mod helpers;
-mod about_variables;
-
-#[derive(Debug, StructOpt)]
-struct Cli {
-    exercise: Option<String>,
+fn main() {
+  let matches = App::new("r2")
+      .version(crate_version!())
+      .author("Olivia Hugger")
+      .about("Test")
+      .subcommand(SubCommand::with_name("verify").alias("v"))
+      .get_matches();
+  
+  if let Some(_) = matches.subcommand_matches("verify") {
+    execute("exercises/ex1.rs");
+    execute("exercises/ex2.rs");
+    execute("exercises/ex3.rs");
+    execute("exercises/ex4.rs");
+    execute("exercises/ex5.rs");
+  }
 }
 
-main!(|args: Cli| if let Some(e) = args.exercise {
-    println!("selected {}", e);
-} else {
-    println!("Welcome to {}!\n", Yellow.paint("Rustlings"));
-    about_variables::exec();
-});
+fn execute(filename: &str) {
+  let bar = ProgressBar::new_spinner();
+  bar.set_message(format!("Compiling {}...", filename).as_str());
+  bar.enable_steady_tick(100);
+  let compilecmd = Command::new("rustc")
+                           .args(&[filename, "-o", "temp"])
+                           .output()
+                           .expect("fail");
+  bar.finish_and_clear();
+  if compilecmd.status.success() {
+    println!("{} Successfully compiled {}!", Emoji("✅", "✓"), style(filename).italic());
+  } else {
+    println!("{} Compilation of {} failed! Compiler error message:\n", Emoji("⚠️ ", "!"), style(filename).italic());
+    println!("{}", String::from_utf8_lossy(&compilecmd.stderr));
+    std::process::exit(1);
+  }
+}