diff --git a/ChangeLog b/ChangeLog
index ff8d7f401bbb889d8351a0dad2450a064e22a9f1..e474c8d63ab59e8b31c1e822bb977420572eee1d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2016-01-26  Niels Möller  <nisse@lysator.liu.se>
+
+	* tools/nettle-pbkdf2.c (main): Fix handling of unrecognized
+	options. Bug reported by Dongsheng Zhang. Display usage message
+	and exit non-zero. Also added "Usage: "-prefix to the message.
+	* tools/nettle-hash.c (usage): New function, extracted from main.
+	(main): Analogous fix for unrecognized options.
+
 2016-01-23  Niels Möller  <nisse@lysator.liu.se>
 
 	* nettle.texinfo: Set UPDATED-FOR to 3.2.
diff --git a/tools/nettle-hash.c b/tools/nettle-hash.c
index c78656ad252849cd0faa8532601421fa0d0e85b4..b669a6eeda09ae830038170a4565b6c1ac45ec9c 100644
--- a/tools/nettle-hash.c
+++ b/tools/nettle-hash.c
@@ -134,6 +134,19 @@ digest_file(const struct nettle_hash *alg,
   return 1;
 }
 
+static void
+usage (FILE *f)
+{
+  fprintf(f, "Usage: nettle-hash -a ALGORITHM [OPTIONS] [FILE ...]\n"
+	  "Options:\n"
+	  "  --help              Show this help.\n"
+	  "  -V, --version       Show version information.\n"
+	  "  --list              List supported hash algorithms.\n"
+	  "  -a, --algorithm=ALG Hash algorithm to use.\n"
+	  "  -l, --length=LENGTH Desired digest length (octets)\n"
+	  "  --raw               Raw binary output.\n");
+}
+
 /* FIXME: Be more compatible with md5sum and sha1sum. Options -c
    (check), -b (binary), -t (text), and output format with hex hash
    sum, optional star (meaning binary mode), and file name. */
@@ -165,15 +178,11 @@ main (int argc, char **argv)
       {
       default:
 	abort();
+      case '?':
+	usage (stderr);
+	return EXIT_FAILURE;
       case OPT_HELP:
-	printf("nettle-hash -a ALGORITHM [OPTIONS] [FILE ...]\n"
-	       "Options:\n"
-	       "  --help              Show this help.\n"
-	       "  -V, --version       Show version information.\n"
-	       "  --list              List supported hash algorithms.\n"
-	       "  -a, --algorithm=ALG Hash algorithm to use.\n"
-	       "  -l, --length=LENGTH Desired digest length (octets)\n"
-	       "  --raw               Raw binary output.\n");
+	usage (stdout);
 	return EXIT_SUCCESS;
       case 'V':
 	printf("nettle-hash (" PACKAGE_STRING ")\n");
diff --git a/tools/nettle-pbkdf2.c b/tools/nettle-pbkdf2.c
index b4e74a26aa90d32ea988249215b8919fad78db1c..16040c386ce710fa7416976ca6a65b4b9e4ee292 100644
--- a/tools/nettle-pbkdf2.c
+++ b/tools/nettle-pbkdf2.c
@@ -51,7 +51,7 @@
 static void
 usage (FILE *f)
 {
-  fprintf(f, "nettle-pbkdf2 [OPTIONS] SALT\n"
+  fprintf(f, "Usage: nettle-pbkdf2 [OPTIONS] SALT\n"
 	  "Options:\n"
 	  "  --help                 Show this help.\n"
 	  "  -V, --version          Show version information.\n"
@@ -97,6 +97,9 @@ main (int argc, char **argv)
       {
       default:
 	abort();
+      case '?':
+	usage (stderr);
+	return EXIT_FAILURE;
       case OPT_HELP:
 	usage (stdout);
 	return EXIT_SUCCESS;