diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs
index 009fb61984638..a1cf38ae336d2 100644
--- a/src/librustc/session/config.rs
+++ b/src/librustc/session/config.rs
@@ -1013,6 +1013,8 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options,
         "set the threshold for inlining a function (default: 225)"),
     panic: Option<PanicStrategy> = (None, parse_panic_strategy,
         [TRACKED], "panic strategy to compile crate with"),
+    incremental: Option<String> = (None, parse_opt_string, [UNTRACKED],
+          "enable incremental compilation"),
 }
 
 options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
@@ -1663,7 +1665,24 @@ pub fn build_session_options_and_crate_config(matches: &getopts::Matches)
         early_error(error_format, "Value for codegen units must be a positive nonzero integer");
     }
 
-    if cg.lto && debugging_opts.incremental.is_some() {
+    let incremental = match (&debugging_opts.incremental, &cg.incremental) {
+        (&Some(ref path1), &Some(ref path2)) => {
+            if path1 != path2 {
+                early_error(error_format,
+                    &format!("conflicting paths for `-Z incremental` and \
+                              `-C incremental` specified: {} versus {}",
+                              path1,
+                              path2));
+            } else {
+                Some(path1)
+            }
+        }
+        (&Some(ref path), &None) => Some(path),
+        (&None, &Some(ref path)) => Some(path),
+        (&None, &None) => None,
+    }.map(|m| PathBuf::from(m));
+
+    if cg.lto && incremental.is_some() {
         early_error(error_format, "can't perform LTO when compiling incrementally");
     }
 
@@ -1837,8 +1856,6 @@ pub fn build_session_options_and_crate_config(matches: &getopts::Matches)
 
     let crate_name = matches.opt_str("crate-name");
 
-    let incremental = debugging_opts.incremental.as_ref().map(|m| PathBuf::from(m));
-
     (Options {
         crate_types,
         optimize: opt_level,
@@ -2581,6 +2598,9 @@ mod tests {
         opts.cg.save_temps = true;
         assert_eq!(reference.dep_tracking_hash(), opts.dep_tracking_hash());
 
+        opts.cg.incremental = Some(String::from("abc"));
+        assert_eq!(reference.dep_tracking_hash(), opts.dep_tracking_hash());
+
 
         // Make sure changing a [TRACKED] option changes the hash
         opts = reference.clone();
diff --git a/src/librustc_trans/base.rs b/src/librustc_trans/base.rs
index bfc72ff06aa70..1314c98c8a30d 100644
--- a/src/librustc_trans/base.rs
+++ b/src/librustc_trans/base.rs
@@ -1025,7 +1025,7 @@ fn collect_and_partition_translation_items<'a, 'tcx>(
 
     assert_symbols_are_distinct(tcx, items.iter());
 
-    let strategy = if tcx.sess.opts.debugging_opts.incremental.is_some() {
+    let strategy = if tcx.sess.opts.incremental.is_some() {
         PartitioningStrategy::PerModule
     } else {
         PartitioningStrategy::FixedUnitCount(tcx.sess.codegen_units())
diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs
index 06e798554167b..3aee88136a1ff 100644
--- a/src/tools/compiletest/src/runtest.rs
+++ b/src/tools/compiletest/src/runtest.rs
@@ -1506,7 +1506,7 @@ impl<'test> TestCx<'test> {
 
         if let Some(ref incremental_dir) = self.props.incremental_dir {
             rustc.args(&[
-                "-Z",
+                "-C",
                 &format!("incremental={}", incremental_dir.display()),
             ]);
             rustc.args(&["-Z", "incremental-verify-ich"]);