main: show the command usage when a valid one is used with a bad or -h flag
diff --git a/help.go b/help.go
index 218a074..a2669a1 100644
--- a/help.go
+++ b/help.go
@@ -109,8 +109,3 @@
 	tmpl(bw, usageTemplate, commands)
 	bw.Flush()
 }
-
-func usage() {
-	printUsage(os.Stderr)
-	os.Exit(2)
-}
diff --git a/main.go b/main.go
index 93c8ef8..3f435b8 100644
--- a/main.go
+++ b/main.go
@@ -2,15 +2,16 @@
 
 import (
 	"flag"
+	"fmt"
 	"log"
 	"os"
 	"path/filepath"
 )
 
-var fs = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
+var fs = flag.NewFlagSet(os.Args[0], flag.ContinueOnError)
 
 func init() {
-	fs.Usage = usage
+	fs.Usage = func() {}
 }
 
 type Command struct {
@@ -54,17 +55,24 @@
 			}
 
 			if err := fs.Parse(args[1:]); err != nil {
-				log.Fatalf("could not parse flags: %v", err)
+				if err == flag.ErrHelp {
+					help(args[:1])
+					os.Exit(0)
+				}
+				fmt.Fprint(os.Stderr, "\n")
+				help(args[:1])
+				os.Exit(3)
 			}
-			args = fs.Args() // reset args to the leftovers from fs.Parse
 
-			if err := command.Run(args); err != nil {
+			if err := command.Run(fs.Args()); err != nil {
 				log.Fatalf("command %q failed: %v", command.Name, err)
 			}
 			return
 		}
 	}
-	log.Fatalf("unknown command %q ", args[0])
+	fmt.Fprintf(os.Stderr, "unknown command: %q\n\n", args[0])
+	printUsage(os.Stderr)
+	os.Exit(3)
 }
 
 const manifestfile = "manifest"