diff --git a/src/librustpkg/context.rs b/src/librustpkg/context.rs
index 681ae1dc80780..721cfedd4aabc 100644
--- a/src/librustpkg/context.rs
+++ b/src/librustpkg/context.rs
@@ -229,12 +229,13 @@ pub enum Command {
     BuildCmd,
     CleanCmd,
     DoCmd,
+    HelpCmd,
     InfoCmd,
+    InitCmd,
     InstallCmd,
     ListCmd,
     PreferCmd,
     TestCmd,
-    InitCmd,
     UninstallCmd,
     UnpreferCmd,
 }
@@ -246,6 +247,7 @@ impl FromStr for Command {
             &"build" => Some(BuildCmd),
             &"clean" => Some(CleanCmd),
             &"do" => Some(DoCmd),
+            &"help" => Some(HelpCmd),
             &"info" => Some(InfoCmd),
             &"install" => Some(InstallCmd),
             &"list"    => Some(ListCmd),
diff --git a/src/librustpkg/lib.rs b/src/librustpkg/lib.rs
index 135b659871dd7..27d3a3e549a87 100644
--- a/src/librustpkg/lib.rs
+++ b/src/librustpkg/lib.rs
@@ -43,7 +43,7 @@ use workspace::{each_pkg_parent_workspace, pkg_parent_workspaces, cwd_to_workspa
 use workspace::determine_destination;
 use context::{BuildContext, Trans, Nothing, Pretty, Analysis,
               LLVMAssemble, LLVMCompileBitcode};
-use context::{Command, BuildCmd, CleanCmd, DoCmd, InfoCmd, InstallCmd, ListCmd,
+use context::{Command, BuildCmd, CleanCmd, DoCmd, HelpCmd, InfoCmd, InstallCmd, ListCmd,
     PreferCmd, TestCmd, InitCmd, UninstallCmd, UnpreferCmd};
 use crate_id::CrateId;
 use package_source::PkgSrc;
@@ -314,6 +314,18 @@ impl CtxMethods for BuildContext {
 
                 self.do_cmd(args[0].clone(), args[1].clone());
             }
+            HelpCmd => {
+                if args.len() != 1 {
+                    return usage::general();
+                }
+                match FromStr::from_str(args[0]) {
+                    Some(help_cmd) => usage::usage_for_command(help_cmd),
+                    None => {
+                        usage::general();
+                        error(format!("{} is not a recognized command", args[0]))
+                    }
+                }
+            }
             InfoCmd => {
                 self.info();
             }
@@ -372,7 +384,7 @@ impl CtxMethods for BuildContext {
             }
             PreferCmd => {
                 if args.len() < 1 {
-                    return usage::uninstall();
+                    return usage::prefer();
                 }
 
                 self.prefer(args[0], None);
diff --git a/src/librustpkg/usage.rs b/src/librustpkg/usage.rs
index a41e99f6d663d..ccc0beafd71ca 100644
--- a/src/librustpkg/usage.rs
+++ b/src/librustpkg/usage.rs
@@ -16,6 +16,9 @@ pub fn general() {
 Where <cmd> is one of:
     build, clean, do, info, install, list, prefer, test, uninstall, unprefer
 
+For more help on a given command, you can run:
+    rustpkg help <cmd>
+
 Options:
 
     -h, --help                  Display this message
@@ -162,6 +165,7 @@ pub fn usage_for_command(command: Command){
         BuildCmd => build(),
         CleanCmd => clean(),
         DoCmd => do_cmd(),
+        HelpCmd => general(),
         InfoCmd => info(),
         InstallCmd => install(),
         ListCmd => list(),