diff --git a/.gitignore b/.gitignore
index 6094e5c..06de871 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,4 @@ target/
 exercises/clippy/Cargo.toml
 exercises/clippy/Cargo.lock
 .idea
+.vscode
diff --git a/.gitpod.yml b/.gitpod.yml
new file mode 100644
index 0000000..46b1a6a
--- /dev/null
+++ b/.gitpod.yml
@@ -0,0 +1,7 @@
+tasks:
+  - init: /workspace/rustlings/install.sh
+    command: /workspace/.cargo/bin/rustlings watch
+
+vscode:
+  extensions:
+    - rust-lang.rust@0.7.8:CvNqMTgDdt3UXt+6BCDTVg==
diff --git a/.replit b/.replit
new file mode 100644
index 0000000..8462a6f
--- /dev/null
+++ b/.replit
@@ -0,0 +1,2 @@
+language = "rust"
+run = "[ -x ~/.cargo/bin/rustlings ] && ~/.cargo/bin/rustlings watch || ./install.sh"
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f72c960..0d984eb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,45 @@
+<a name="4.0.0"></a>
+## 4.0.0 (2020-07-08)
+
+#### Breaking Changes
+
+*   Add a --nocapture option to display test harnesses' outputs ([8ad5f9bf](https://github.com/rust-lang/rustlings/commit/8ad5f9bf531a4848b1104b7b389a20171624c82f))
+*   Rename test to quiz, fixes #244 ([010a0456](https://github.com/rust-lang/rustlings/commit/010a04569282149cea7f7a76fc4d7f4c9f0f08dd))
+
+#### Features
+
+*   Add traits README ([173bb141](https://github.com/rust-lang/rustlings/commit/173bb14140c5530cbdb59e53ace3991a99d804af))
+*   Add box1.rs exercise ([7479a473](https://github.com/rust-lang/rustlings/commit/7479a4737bdcac347322ad0883ca528c8675e720))
+*   Rewrite try_from_into (#393) ([763aa6e3](https://github.com/rust-lang/rustlings/commit/763aa6e378a586caae2d8d63755a85eeba227933))
+*   Add if2 exercise ([1da84b5f](https://github.com/rust-lang/rustlings/commit/1da84b5f7c489f65bd683c244f13c7d1ee812df0))
+*   Added exercise structs3.rs ([b66e2e09](https://github.com/rust-lang/rustlings/commit/b66e2e09622243e086a0f1258dd27e1a2d61c891))
+*   Add exercise variables6 covering const (#352) ([5999acd2](https://github.com/rust-lang/rustlings/commit/5999acd24a4f203292be36e0fd18d385887ec481))
+
+#### Bug Fixes
+
+*   Change then to than ([ddd98ad7](https://github.com/rust-lang/rustlings/commit/ddd98ad75d3668fbb10eff74374148aa5ed2344d))
+*   rename quiz1 to tests1 in info (#420) ([0dd1c6ca](https://github.com/rust-lang/rustlings/commit/0dd1c6ca6b389789e0972aa955fe17aa15c95f29))
+*   fix quiz naming inconsistency (#421) ([5563adbb](https://github.com/rust-lang/rustlings/commit/5563adbb890587fc48fbbc9c4028642687f1e85b))
+*   confine the user further in variable exercises ([06ef4cc6](https://github.com/rust-lang/rustlings/commit/06ef4cc654e75d22a526812919ee49b8956280bf))
+*   update iterator and macro text for typos and clarity ([95900828](https://github.com/rust-lang/rustlings/commit/959008284834bece0196a01e17ac69a7e3590116))
+*   update generics2       closes #362 ([964c974a](https://github.com/rust-lang/rustlings/commit/964c974a0274199d755073b917c2bc5da0c9b4f1))
+*   confusing comment in conversions/try_from_into.rs ([c9e4f2cf](https://github.com/rust-lang/rustlings/commit/c9e4f2cfb4c48d0b7451263cfb43b9426438122d))
+* **arc1:**  Passively introduce attributes (#429) ([113cdae2](https://github.com/rust-lang/rustlings/commit/113cdae2d4e4c55905e8056ad326ede7fd7de356))
+* **box1:**  fix comment typo (#426) ([bb2ca251](https://github.com/rust-lang/rustlings/commit/bb2ca251106b27a7272d9a30872904dd1376654c))
+* **errorsn:**  Try harder to confine the user. (#388) ([2b20c8a0](https://github.com/rust-lang/rustlings/commit/2b20c8a0f5774d07c58d110d75879f33fc6273b5))
+* **from_into.rs:**  typo ([a901499e](https://github.com/rust-lang/rustlings/commit/a901499ededd3ce1995164700514fe4e9a0373ea))
+* **generics2:**  Guide students to the answer (#430) ([e6bd8021](https://github.com/rust-lang/rustlings/commit/e6bd8021d9a7dd06feebc30c9d5f953901d7b419))
+* **installation:**
+  *  Provide a backup git reference when tag can't be curl ([9e4fb100](https://github.com/rust-lang/rustlings/commit/9e4fb1009f1c9e3433915c03e22c2af422e5c5fe))
+  *  Check if python is available while checking for git,rustc and cargo ([9cfb617d](https://github.com/rust-lang/rustlings/commit/9cfb617d5b0451b4b51644a1298965390cda9884))
+* **option1:**
+  *  Don't add only zeros to the numbers array ([cce6a442](https://github.com/rust-lang/rustlings/commit/cce6a4427718724a9096800754cd3abeca6a1580))
+  *  Add cast to usize, as it is confusing in the context of an exercise about Option ([f6cffc7e](https://github.com/rust-lang/rustlings/commit/f6cffc7e487b42f15a6f958e49704c93a8d4465b))
+* **option2:**  Add TODO to comments (#400) ([10967bce](https://github.com/rust-lang/rustlings/commit/10967bce57682812dc0891a9f9757da1a9d87404))
+* **options1:**  Add hint about Array Initialization (#389) ([9f75554f](https://github.com/rust-lang/rustlings/commit/9f75554f2a30295996f03f0160b98c0458305502))
+* **test2:**  name of type String and &str (#394) ([d6c0a688](https://github.com/rust-lang/rustlings/commit/d6c0a688e6a96f93ad60d540d4b326f342fc0d45))
+* **variables6:**  minor typo (#419) ([524e17df](https://github.com/rust-lang/rustlings/commit/524e17df10db95f7b90a0f75cc8997182a8a4094))
+
 <a name="3.0.0"></a>
 ## 3.0.0 (2020-04-11)
 
diff --git a/Cargo.lock b/Cargo.lock
index 52c8ed4..732a4b5 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -592,7 +592,7 @@ dependencies = [
 
 [[package]]
 name = "rustlings"
-version = "3.0.0"
+version = "4.0.0"
 dependencies = [
  "assert_cmd 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
diff --git a/Cargo.toml b/Cargo.toml
index 3481a88..d4180da2 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "rustlings"
-version = "3.0.0"
+version = "4.0.0"
 authors = ["Marisa <mokou@posteo.de>", "Carol (Nichols || Goulding) <carol.nichols@gmail.com>"]
 edition = "2018"
 
diff --git a/README.md b/README.md
index 6724f05..7fba9d8 100644
--- a/README.md
+++ b/README.md
@@ -48,6 +48,12 @@ Start-BitsTransfer -Source https://git.io/rustlings-win -Destination $env:TMP/in
 
 To install Rustlings. Same as on MacOS/Linux, you will have access to the `rustlings` command after it.
 
+## Browser:
+
+[Run on Repl.it](https://repl.it/github/rust-lang/rustlings)
+
+[Open in Gitpod](https://gitpod.io/#https://github.com/rust-lang/rustlings)
+
 ## Manually
 
 Basically: Clone the repository, checkout to the latest tag, run `cargo install`.
@@ -55,7 +61,7 @@ Basically: Clone the repository, checkout to the latest tag, run `cargo install`
 ```bash
 git clone https://github.com/rust-lang/rustlings
 cd rustlings
-git checkout tags/3.0.0 # or whatever the latest version is (find out at https://github.com/rust-lang/rustlings/releases/latest)
+git checkout tags/4.0.0 # or whatever the latest version is (find out at https://github.com/rust-lang/rustlings/releases/latest)
 cargo install --force --path .
 ```
 
@@ -70,7 +76,7 @@ Then, same as above, run `rustlings` to get started.
 
 The exercises are sorted by topic and can be found in the subdirectory `rustlings/exercises/<topic>`. For every topic there is an additional README file with some resources to get you started on the topic. We really recommend that you have a look at them before you start.
 
-The task is simple. Most exercises contain an error that keep it from compiling, and it's up to you to fix it! Some exercises are also run as tests, but rustlings handles them all the same. To run the exercises in the recommended order, execute:
+The task is simple. Most exercises contain an error that keep them from compiling, and it's up to you to fix it! Some exercises are also run as tests, but rustlings handles them all the same. To run the exercises in the recommended order, execute:
 
 ```bash
 rustlings watch
@@ -101,6 +107,17 @@ rustlings hint myExercise1
 
 After every couple of sections, there will be a quiz that'll test your knowledge on a bunch of sections at once. These quizzes are found in `exercises/quizN.rs`.
 
+## Continuing On
+
+Once you've completed Rustlings, put your new knowledge to good use! Continue practicing your Rust skills by building your own projects, contributing to Rustlings, or finding other open-source projects to contribute to.
+
+If you'd like to uninstall Rustlings, you can do so by invoking cargo and removing the rustlings directory:
+
+```bash
+cargo uninstall rustlings
+rm -r rustlings/ # or on Windows: rmdir /s rustlings
+```
+
 ## Completion
 
 Rustlings isn't done; there are a couple of sections that are very experimental and don't have proper documentation. These include:
diff --git a/exercises/conversions/from_into.rs b/exercises/conversions/from_into.rs
index 428a0a6..167053e 100644
--- a/exercises/conversions/from_into.rs
+++ b/exercises/conversions/from_into.rs
@@ -32,6 +32,9 @@ impl Default for Person {
 // 5. Extract the other element from the split operation and parse it into a `usize` as the age
 // If while parsing the age, something goes wrong, then return the default of Person
 // Otherwise, then return an instantiated Person object with the results
+
+// I AM NOT DONE
+
 impl From<&str> for Person {
     fn from(s: &str) -> Person {
         if s.len() == 0 {
diff --git a/exercises/conversions/try_from_into.rs b/exercises/conversions/try_from_into.rs
index 64362db..784f083 100644
--- a/exercises/conversions/try_from_into.rs
+++ b/exercises/conversions/try_from_into.rs
@@ -174,4 +174,10 @@ mod tests {
         let v = vec![0, 0, 0, 0];
         let _ = Color::try_from(&v[..]).unwrap();
     }
+    #[test]
+    #[should_panic]
+    fn test_slice_insufficient_length() {
+        let v = vec![0, 0];
+        let _ = Color::try_from(&v[..]).unwrap();
+    }
 }
diff --git a/exercises/conversions/using_as.rs b/exercises/conversions/using_as.rs
index 75a46e8..22bc065 100644
--- a/exercises/conversions/using_as.rs
+++ b/exercises/conversions/using_as.rs
@@ -1,7 +1,7 @@
 // Type casting in Rust is done via the usage of the `as` operator.
 // Please note that the `as` operator is not only used when type casting.
 // It also helps with renaming imports.
-
+//
 // The goal is to make sure that the division does not fail to compile
 fn average(values: &[f64]) -> f64 {
     let total = values.iter().fold(0.0, |a, b| a + b);
diff --git a/exercises/enums/enums3.rs b/exercises/enums/enums3.rs
index 8fa56fb..6ae1d01 100644
--- a/exercises/enums/enums3.rs
+++ b/exercises/enums/enums3.rs
@@ -57,7 +57,7 @@ mod tests {
             position: Point { x: 0, y: 0 },
             color: (0, 0, 0),
         };
-        state.process(Message::ChangeColor(255, 0, 255));
+        state.process(Message::ChangeColor((255, 0, 255)));
         state.process(Message::Echo(String::from("hello world")));
         state.process(Message::Move(Point { x: 10, y: 15 }));
         state.process(Message::Quit);
diff --git a/exercises/structs/structs3.rs b/exercises/structs/structs3.rs
index c931386..649f584 100644
--- a/exercises/structs/structs3.rs
+++ b/exercises/structs/structs3.rs
@@ -58,6 +58,7 @@ mod tests {
     fn create_international_package() {
         let sender_country = String::from("Spain");
         let recipient_country = String::from("Russia");
+
         let package = Package::new(sender_country, recipient_country, 1200);
 
         assert!(package.is_international());
@@ -70,6 +71,7 @@ mod tests {
 
         let cents_per_kg = 3000;
         let package = Package::new(sender_country, recipient_country, 1500);
+
         assert_eq!(package.get_fees(cents_per_kg), 4500);
     }
 }
diff --git a/info.toml b/info.toml
index ee4ab2f..46e353f 100644
--- a/info.toml
+++ b/info.toml
@@ -64,7 +64,7 @@ hint = """
 We know about variables and mutability, but there is another important type of 
 variable available; constants. 
 Constants are always immutable and they are declared with keyword 'const' rather 
-then keyword 'let'.
+than keyword 'let'.
 Constants types must also always be annotated.
 
 Read more about constants under 'Differences Between Variables and Constants' in the book's section 'Variables and Mutability': 
diff --git a/src/exercise.rs b/src/exercise.rs
index 2108d81..e70538b 100644
--- a/src/exercise.rs
+++ b/src/exercise.rs
@@ -167,9 +167,10 @@ path = "{}.rs""#,
     fn run(&self) -> Result<ExerciseOutput, ExerciseOutput> {
         let arg = match self.mode {
             Mode::Test => "--show-output",
-            _ => ""
+            _ => "",
         };
-        let cmd = Command::new(&temp_file()).arg(arg)
+        let cmd = Command::new(&temp_file())
+            .arg(arg)
             .output()
             .expect("Failed to run 'run' command");
 
diff --git a/src/main.rs b/src/main.rs
index aa67aca..b5814bf 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -126,9 +126,7 @@ fn main() {
         );
         println!();
         println!("We hope you enjoyed learning about the various aspects of Rust!");
-        println!(
-            "If you noticed any issues, please don't hesitate to report them to our repo."
-        );
+        println!("If you noticed any issues, please don't hesitate to report them to our repo.");
         println!("You can also contribute your own exercises to help the greater community!");
         println!();
         println!("Before reporting an issue or contributing, please read our guidelines:");
@@ -143,15 +141,18 @@ fn main() {
 
 fn spawn_watch_shell(failed_exercise_hint: &Arc<Mutex<Option<String>>>) {
     let failed_exercise_hint = Arc::clone(failed_exercise_hint);
-    println!("Type 'hint' to get help");
+    println!("Type 'hint' to get help or 'clear' to clear the screen");
     thread::spawn(move || loop {
         let mut input = String::new();
         match io::stdin().read_line(&mut input) {
             Ok(_) => {
-                if input.trim().eq("hint") {
+                let input = input.trim();
+                if input.eq("hint") {
                     if let Some(hint) = &*failed_exercise_hint.lock().unwrap() {
                         println!("{}", hint);
                     }
+                } else if input.eq("clear") {
+                    println!("\x1B[2J\x1B[1;1H");
                 } else {
                     println!("unknown command: {}", input);
                 }
diff --git a/src/verify.rs b/src/verify.rs
index fac0491..00e45c8 100644
--- a/src/verify.rs
+++ b/src/verify.rs
@@ -9,7 +9,7 @@ use indicatif::ProgressBar;
 // determines whether or not the test harness outputs are displayed.
 pub fn verify<'a>(
     start_at: impl IntoIterator<Item = &'a Exercise>,
-    verbose: bool
+    verbose: bool,
 ) -> Result<(), &'a Exercise> {
     for exercise in start_at {
         let compile_result = match exercise.mode {
@@ -65,6 +65,7 @@ fn compile_and_run_interactively(exercise: &Exercise) -> Result<bool, ()> {
         Err(output) => {
             warn!("Ran {} with errors", exercise);
             println!("{}", output.stdout);
+            println!("{}", output.stderr);
             return Err(());
         }
     };
@@ -76,9 +77,7 @@ fn compile_and_run_interactively(exercise: &Exercise) -> Result<bool, ()> {
 
 // Compile the given Exercise as a test harness and display
 // the output if verbose is set to true
-fn compile_and_test(
-    exercise: &Exercise, run_mode: RunMode, verbose: bool
-) -> Result<bool, ()> {
+fn compile_and_test(exercise: &Exercise, run_mode: RunMode, verbose: bool) -> Result<bool, ()> {
     let progress_bar = ProgressBar::new_spinner();
     progress_bar.set_message(format!("Testing {}...", exercise).as_str());
     progress_bar.enable_steady_tick(100);
diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs
index 0f49b5a..2baf9b8 100644
--- a/tests/integration_tests.rs
+++ b/tests/integration_tests.rs
@@ -180,4 +180,4 @@ fn run_single_test_success_without_output() {
         .assert()
         .code(0)
         .stdout(predicates::str::contains("THIS TEST TOO SHALL PAS").not());
-}
\ No newline at end of file
+}