diff --git a/tools/virsh-host.c b/tools/virsh-host.c
index 734f1a8503..ae14311fc1 100644
--- a/tools/virsh-host.c
+++ b/tools/virsh-host.c
@@ -68,6 +68,70 @@ cmdCapabilities(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
     return true;
 }
 
+/*
+ * "domcapabilities" command
+ */
+static const vshCmdInfo info_domcapabilities[] = {
+    {.name = "help",
+     .data = N_("domain capabilities")
+    },
+    {.name = "desc",
+     .data = N_("Returns capabilities of emulator with respect to host and libvirt.")
+    },
+    {.name = NULL}
+};
+
+static const vshCmdOptDef opts_domcapabilities[] = {
+    {.name = "virttype",
+     .type = VSH_OT_STRING,
+     .help = N_("virtualization type (/domain/@type)"),
+    },
+    {.name = "emulatorbin",
+     .type = VSH_OT_STRING,
+     .help = N_("path to emulator binary (/domain/devices/emulator)"),
+    },
+    {.name = "arch",
+     .type = VSH_OT_STRING,
+     .help = N_("domain architecture (/domain/os/type/@arch)"),
+    },
+    {.name = "machine",
+     .type = VSH_OT_STRING,
+     .help = N_("machine type (/domain/os/type/@machine)"),
+    },
+    {.name = NULL}
+};
+
+static bool
+cmdDomCapabilities(vshControl *ctl, const vshCmd *cmd)
+{
+    bool ret = false;
+    char *caps = NULL;
+    const char *virttype = NULL;
+    const char *emulatorbin = NULL;
+    const char *arch = NULL;
+    const char *machine = NULL;
+    const unsigned int flags = 0; /* No flags so far */
+
+    if (vshCommandOptStringReq(ctl, cmd, "virttype", &virttype) < 0 ||
+        vshCommandOptStringReq(ctl, cmd, "emulatorbin", &emulatorbin) < 0 ||
+        vshCommandOptStringReq(ctl, cmd, "arch", &arch) < 0 ||
+        vshCommandOptStringReq(ctl, cmd, "machine", &machine) < 0)
+        return ret;
+
+    caps = virConnectGetDomainCapabilities(ctl->conn, emulatorbin,
+                                           arch, machine, virttype, flags);
+    if (!caps) {
+        vshError(ctl, "%s", _("failed to get emulator capabilities"));
+        goto cleanup;
+    }
+
+    vshPrint(ctl, "%s\n", caps);
+    ret = true;
+ cleanup:
+    VIR_FREE(caps);
+    return ret;
+}
+
 /*
  * "freecell" command
  */
@@ -1131,6 +1195,12 @@ const vshCmdDef hostAndHypervisorCmds[] = {
      .info = info_cpu_models,
      .flags = 0
     },
+    {.name = "domcapabilities",
+     .handler = cmdDomCapabilities,
+     .opts = opts_domcapabilities,
+     .info = info_domcapabilities,
+     .flags = 0
+    },
     {.name = "freecell",
      .handler = cmdFreecell,
      .opts = opts_freecell,
diff --git a/tools/virsh.pod b/tools/virsh.pod
index 620ea369eb..1b6f3c40ee 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -350,6 +350,41 @@ description see:
   L<http://libvirt.org/formatcaps.html>
 The XML also show the NUMA topology information if available.
 
+=item B<domcapabilities> [I<virttype>] [I<emulatorbin>]
+[I<arch>] [I<machine>]
+
+Print an XML document describing the domain capabilities for the
+hypervisor we are connected to using information either sourced from an
+existing domain or taken from the B<virsh capabilities> output. This may
+be useful if you intend to create a new domain and are curious if for
+instance it could make use of VFIO by creating a domain for the
+hypervisor with a specific emulator and architecture.
+
+Each hypervisor will have different requirements regarding which options
+are required and which are optional. A hypervisor can support providing
+a default value for any of the options.
+
+The I<virttype> option specifies the virtualization type used. The value
+to be used is either from the 'type' attribute of the <domain/> top
+level element from the domain XML or the 'type' attribute found within
+each <guest/> element from the B<virsh capabilities> output.  The
+I<emulatorbin> option specifies the path to the emulator. The value to
+be used is either the <emulator> element in the domain XML or the
+B<virsh capabilities> output. The I<arch> option specifies the
+architecture to be used for the domain. The value to be used is either
+the "arch" attribute from the domain's XML <os/> element and <type/>
+subelement or the "name" attribute of an <arch/> element from the
+B<virsh capabililites> output. The I<machine> specifies the machine type
+for the emulator. The value to be used is either the "machine" attribute
+from the domain's XML <os/> element and <type/> subelement or one from a
+list of machines from the B<virsh capabilities> output for a specific
+architecture and domain type.
+
+For the qemu hypervisor, a I<virttype> of either 'qemu' or 'kvm' must be
+supplied along with either the I<emulatorbin> or I<arch> in order to
+generate output for the default I<machine>.  Supplying a I<machine>
+value will generate output for the specific machine.
+
 =item B<inject-nmi> I<domain>
 
 Inject NMI to the guest.