diff --git a/qemu-options.hx b/qemu-options.hx
index 77f5853..49b78df 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -6,17 +6,123 @@ HXCOMM construct option structures, enums and help message for specified
 HXCOMM architectures.
 HXCOMM HXCOMM can be used for comments, discarded from both texi and C
 
+#if defined(QEMU_HELP_SELECT_STANDARD) || !defined(QEMU_HELP_SELECT)
+#undef QEMU_HELP_SELECT_STANDARD
 DEFHEADING(Standard options:)
 STEXI
 @table @option
 ETEXI
 
 DEF("help", 0, QEMU_OPTION_h,
-    "-h or -help     display this help and exit\n", QEMU_ARCH_ALL)
+    "-h or -help     display all help options and exit\n", QEMU_ARCH_ALL)
 STEXI
 @item -h
 @findex -h
-Display help and exit
+Display all help options and exit
+ETEXI
+
+DEF("help-standard", 0, QEMU_OPTION_h_standard,
+    "-help-standard  display standard options\n", QEMU_ARCH_ALL)
+STEXI
+@item -help-standard
+@findex -help-standard
+Display standard options
+ETEXI
+
+DEF("help-block", 0, QEMU_OPTION_h_block,
+    "-help-block     display block options\n", QEMU_ARCH_ALL)
+STEXI
+@item -help-block
+@findex -help-block
+Display block options
+ETEXI
+
+DEF("help-usb", 0, QEMU_OPTION_h_usb,
+    "-help-usb       display usb options\n", QEMU_ARCH_ALL)
+STEXI
+@item -help-usb
+@findex -help-usb
+Display usb options
+ETEXI
+
+DEF("help-display", 0, QEMU_OPTION_h_display,
+    "-help-display   display display options\n", QEMU_ARCH_ALL)
+STEXI
+@item -help-display
+@findex -help-display
+Display display options
+ETEXI
+
+DEF("help-machine", 0, QEMU_OPTION_h_machine,
+    "-help-machine   display machine options\n", QEMU_ARCH_ALL)
+STEXI
+@item -help-machine
+@findex -help-machine
+Display machine options
+ETEXI
+
+DEF("help-network", 0, QEMU_OPTION_h_network,
+    "-help-network   display network options\n", QEMU_ARCH_ALL)
+STEXI
+@item -help-network
+@findex -help-network
+Display network options
+ETEXI
+
+DEF("help-character", 0, QEMU_OPTION_h_character,
+    "-help-character display character options\n", QEMU_ARCH_ALL)
+STEXI
+@item -help-character
+@findex -help-character
+Display character options
+ETEXI
+
+DEF("help-url", 0, QEMU_OPTION_h_url,
+    "-help-url       display url options\n", QEMU_ARCH_ALL)
+STEXI
+@item -help-url
+@findex -help-url
+Display url options
+ETEXI
+
+DEF("help-bt", 0, QEMU_OPTION_h_bt,
+    "-help-bt        display bt options\n", QEMU_ARCH_ALL)
+STEXI
+@item -help-bt
+@findex -help-bt
+Display bt options
+ETEXI
+
+DEF("help-tpm", 0, QEMU_OPTION_h_tpm,
+    "-help-tpm       display tpm options\n", QEMU_ARCH_ALL)
+STEXI
+@item -help-tpm
+@findex -help-tpm
+Display tpm options
+ETEXI
+
+DEF("help-kernel", 0, QEMU_OPTION_h_kernel,
+    "-help-kernel    display kernel options\n", QEMU_ARCH_ALL)
+STEXI
+@item -help-kernel
+@findex -help-kernel
+Display kernel options
+ETEXI
+
+DEF("help-expert", 0, QEMU_OPTION_h_expert,
+    "-help-expert    display expert options\n", QEMU_ARCH_ALL)
+STEXI
+@item -help-expert
+@findex -help-expert
+Display expert options
+ETEXI
+
+DEF("help-object", 0, QEMU_OPTION_h_object,
+    "-help-object    display object options\n", QEMU_ARCH_ALL)
+STEXI
+@item -help-object
+@findex -help-object
+Display object options
 ETEXI
 
 DEF("version", 0, QEMU_OPTION_version,
@@ -410,7 +516,10 @@ STEXI
 @end table
 ETEXI
 DEFHEADING()
+#endif
 
+#if defined(QEMU_HELP_SELECT_BLOCK) || !defined(QEMU_HELP_SELECT)
+#undef QEMU_HELP_SELECT_BLOCK
 DEFHEADING(Block device options:)
 STEXI
 @table @option
@@ -798,7 +907,10 @@ STEXI
 @end table
 ETEXI
 DEFHEADING()
+#endif
 
+#if defined(QEMU_HELP_SELECT_USB) || !defined(QEMU_HELP_SELECT)
+#undef QEMU_HELP_SELECT_USB
 DEFHEADING(USB options:)
 STEXI
 @table @option
@@ -862,7 +974,10 @@ STEXI
 @end table
 ETEXI
 DEFHEADING()
+#endif
 
+#if defined(QEMU_HELP_SELECT_DISPLAY) || !defined(QEMU_HELP_SELECT)
+#undef QEMU_HELP_SELECT_DISPLAY
 DEFHEADING(Display options:)
 STEXI
 @table @option
@@ -1329,7 +1444,10 @@ STEXI
 @end table
 ETEXI
 ARCHHEADING(, QEMU_ARCH_I386)
+#endif
 
+#if defined(QEMU_HELP_SELECT_MACHINE) || !defined(QEMU_HELP_SELECT)
+#undef QEMU_HELP_SELECT_MACHINE
 ARCHHEADING(i386 target only:, QEMU_ARCH_I386)
 STEXI
 @table @option
@@ -1441,7 +1559,10 @@ STEXI
 @end table
 ETEXI
 DEFHEADING()
+#endif
 
+#if defined(QEMU_HELP_SELECT_NETWORK) || !defined(QEMU_HELP_SELECT)
+#undef QEMU_HELP_SELECT_NETWORK
 DEFHEADING(Network options:)
 STEXI
 @table @option
@@ -1995,7 +2116,10 @@ STEXI
 @end table
 ETEXI
 DEFHEADING()
+#endif
 
+#if defined(QEMU_HELP_SELECT_CHARACTER) || !defined(QEMU_HELP_SELECT)
+#undef QEMU_HELP_SELECT_CHARACTER
 DEFHEADING(Character device options:)
 STEXI
 
@@ -2273,7 +2397,10 @@ STEXI
 @end table
 ETEXI
 DEFHEADING()
+#endif
 
+#if defined(QEMU_HELP_SELECT_URL) || !defined(QEMU_HELP_SELECT)
+#undef QEMU_HELP_SELECT_URL
 DEFHEADING(Device URL Syntax:)
 STEXI
 
@@ -2482,7 +2609,10 @@ ETEXI
 STEXI
 @end table
 ETEXI
+#endif
 
+#if defined(QEMU_HELP_SELECT_BT) || !defined(QEMU_HELP_SELECT)
+#undef QEMU_HELP_SELECT_BT
 DEFHEADING(Bluetooth(R) options:)
 STEXI
 @table @option
@@ -2557,7 +2687,10 @@ STEXI
 @end table
 ETEXI
 DEFHEADING()
+#endif
 
+#if defined(QEMU_HELP_SELECT_TPM) || !defined(QEMU_HELP_SELECT)
+#undef QEMU_HELP_SELECT_TPM
 #ifdef CONFIG_TPM
 DEFHEADING(TPM device options:)
 
@@ -2632,7 +2765,10 @@ ETEXI
 DEFHEADING()
 
 #endif
+#endif
 
+#if defined(QEMU_HELP_SELECT_KERNEL) || !defined(QEMU_HELP_SELECT)
+#undef QEMU_HELP_SELECT_KERNEL
 DEFHEADING(Linux/Multiboot boot specific:)
 STEXI
 
@@ -2688,7 +2824,10 @@ STEXI
 @end table
 ETEXI
 DEFHEADING()
+#endif
 
+#if defined(QEMU_HELP_SELECT_EXPERT) || !defined(QEMU_HELP_SELECT)
+#undef QEMU_HELP_SELECT_EXPERT
 DEFHEADING(Debug/Expert options:)
 STEXI
 @table @option
@@ -3510,7 +3649,7 @@ DEF("dump-vmstate", HAS_ARG, QEMU_OPTION_dump_vmstate,
     "                Output vmstate information in JSON format to file.\n"
     "                Use the scripts/vmstate-static-checker.py file to\n"
     "                check for possible regressions in migration code\n"
-    "                by comparing two such vmstate dumps.",
+    "                by comparing two such vmstate dumps.\n",
     QEMU_ARCH_ALL)
 STEXI
 @item -dump-vmstate @var{file}
@@ -3518,7 +3657,10 @@ STEXI
 Dump json-encoded vmstate information for current machine type to file
 in @var{file}
 ETEXI
+#endif
 
+#if defined(QEMU_HELP_SELECT_OBJECT) || !defined(QEMU_HELP_SELECT)
+#undef QEMU_HELP_SELECT_OBJECT
 DEFHEADING(Generic object creation)
 
 DEF("object", HAS_ARG, QEMU_OPTION_object,
@@ -3571,7 +3713,7 @@ to the RNG daemon.
 @end table
 
 ETEXI
-
+#endif
 
 HXCOMM This is the last statement. Insert new options before this line!
 STEXI
diff --git a/vl.c b/vl.c
index 584ca88..e581dd2 100644
--- a/vl.c
+++ b/vl.c
@@ -1931,6 +1931,101 @@ static void help(int exitcode)
     exit(exitcode);
 }
 
+#define QEMU_HELP_SELECT
+static void help_standard(int exitcode)
+{
+#define QEMU_HELP_SELECT_STANDARD
+#define QEMU_OPTIONS_GENERATE_HELP
+#include "qemu-options-wrapper.h"
+    exit(exitcode);
+}
+static void help_block(int exitcode)
+{
+#define QEMU_HELP_SELECT_BLOCK
+#define QEMU_OPTIONS_GENERATE_HELP
+#include "qemu-options-wrapper.h"
+    exit(exitcode);
+}
+static void help_usb(int exitcode)
+{
+#define QEMU_HELP_SELECT_USB
+#define QEMU_OPTIONS_GENERATE_HELP
+#include "qemu-options-wrapper.h"
+    exit(exitcode);
+}
+static void help_display(int exitcode)
+{
+#define QEMU_HELP_SELECT_DISPLAY
+#define QEMU_OPTIONS_GENERATE_HELP
+#include "qemu-options-wrapper.h"
+    exit(exitcode);
+}
+static void help_machine(int exitcode)
+{
+#define QEMU_HELP_SELECT_MACHINE
+#define QEMU_OPTIONS_GENERATE_HELP
+#include "qemu-options-wrapper.h"
+    exit(exitcode);
+}
+static void help_network(int exitcode)
+{
+#define QEMU_HELP_SELECT_NETWORK
+#define QEMU_OPTIONS_GENERATE_HELP
+#include "qemu-options-wrapper.h"
+    exit(exitcode);
+}
+static void help_character(int exitcode)
+{
+#define QEMU_HELP_SELECT_CHARACTER
+#define QEMU_OPTIONS_GENERATE_HELP
+#include "qemu-options-wrapper.h"
+    exit(exitcode);
+}
+static void help_url(int exitcode)
+{
+#define QEMU_HELP_SELECT_URL
+#define QEMU_OPTIONS_GENERATE_HELP
+#include "qemu-options-wrapper.h"
+    exit(exitcode);
+}
+static void help_bt(int exitcode)
+{
+#define QEMU_HELP_SELECT_BT
+#define QEMU_OPTIONS_GENERATE_HELP
+#include "qemu-options-wrapper.h"
+    exit(exitcode);
+}
+static void help_tpm(int exitcode)
+{
+#define QEMU_HELP_SELECT_TPM
+#define QEMU_OPTIONS_GENERATE_HELP
+#include "qemu-options-wrapper.h"
+    exit(exitcode);
+}
+static void help_kernel(int exitcode)
+{
+#define QEMU_HELP_SELECT_KERNEL
+#define QEMU_OPTIONS_GENERATE_HELP
+#include "qemu-options-wrapper.h"
+    exit(exitcode);
+}
+static void help_expert(int exitcode)
+{
+#define QEMU_HELP_SELECT_EXPERT
+#define QEMU_OPTIONS_GENERATE_HELP
+#include "qemu-options-wrapper.h"
+    exit(exitcode);
+}
+static void help_object(int exitcode)
+{
+#define QEMU_HELP_SELECT_OBJECT
+#define QEMU_OPTIONS_GENERATE_HELP
+#include "qemu-options-wrapper.h"
+    exit(exitcode);
+}
+#undef QEMU_HELP_SELECT
+
+
 #define HAS_ARG 0x0001
 
 typedef struct QEMUOption {
@@ -3318,6 +3413,42 @@ int main(int argc, char **argv, char **envp)
             case QEMU_OPTION_h:
                 help(0);
                 break;
+            case QEMU_OPTION_h_standard:
+                help_standard(0);
+                break;
+            case QEMU_OPTION_h_block:
+                help_block(0);
+                break;
+            case QEMU_OPTION_h_usb:
+                help_usb(0);
+                break;
+            case QEMU_OPTION_h_display:
+                help_display(0);
+                break;
+            case QEMU_OPTION_h_machine:
+                help_machine(0);
+                break;
+            case QEMU_OPTION_h_network:
+                help_network(0);
+                break;
+            case QEMU_OPTION_h_character:
+                help_character(0);
+                break;
+            case QEMU_OPTION_h_url:
+                help_url(0);
+                break;
+            case QEMU_OPTION_h_bt:
+                help_bt(0);
+                break;
+            case QEMU_OPTION_h_kernel:
+                help_kernel(0);
+                break;
+            case QEMU_OPTION_h_expert:
+                help_expert(0);
+                break;
+            case QEMU_OPTION_h_object:
+                help_object(0);
+                break;
             case QEMU_OPTION_version:
                 version();
                 exit(0);
@@ -3330,6 +3461,9 @@ int main(int argc, char **argv, char **envp)
                 }
                 break;
 #ifdef CONFIG_TPM
+            case QEMU_OPTION_h_tpm:
+                help_tpm(0);
+                break;
             case QEMU_OPTION_tpmdev:
                 if (tpm_config_parse(qemu_find_opts("tpmdev"), optarg) < 0) {
                     exit(1);
