diff --git a/gnu/packages/libldm.scm b/gnu/packages/libldm.scm
new file mode 100644
index 0000000000..38fb5e218e
--- /dev/null
+++ b/gnu/packages/libldm.scm
@@ -0,0 +1,70 @@
+(define-module (gnu packages libldm)
+  #:use-module (gnu packages)
+  #:use-module (guix packages)
+  #:use-module ((guix licenses)
+                #:prefix license:)
+  #:use-module (guix build-system gnu)
+  #:use-module (gnu packages base)
+  #:use-module (gnu packages autotools)
+  #:use-module (gnu packages m4)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages gnome)
+  #:use-module (gnu packages glib)
+  #:use-module (gnu packages compression)
+  #:use-module (gnu packages readline)
+  #:use-module (gnu packages linux)
+  #:use-module (gnu packages xml)
+  #:use-module (gnu packages docbook)
+  #:use-module (gnu packages gtk)
+  #:use-module (guix git-download))
+
+(define-public libldm
+  (package
+    (name "libldm")
+    (version "0.2.5")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/mdbooth/libldm.git")
+                    (commit (string-append "libldm-" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "08iz3kq4ci79abpyxwwqmzi3bayyk4s29n8h1jqgdgk5yskwgnrn"))))
+    (build-system gnu-build-system)
+    (inputs (list json-glib
+                  glib
+                  zlib
+                  readline
+                  lvm2
+                  libgudev))
+    (native-inputs (list which
+                         m4
+                         libtool
+                         autoconf-wrapper
+                         automake
+                         pkg-config
+                         `(,glib "bin")
+                         gtk-doc
+                         libxml2
+                         libxslt
+                         docbook-xsl))
+    (arguments
+     '(#:tests? #f
+       #:parallel-build? #t
+       #:phases (modify-phases %standard-phases
+                  (add-before 'configure 'set-env
+                    (lambda _
+                      (setenv "CONFIG_SHELL"
+                              (which "")) #t))
+                  (add-before 'bootstrap 'run-gtkdocize
+                    (lambda _
+                      (invoke "gtkdocize")))
+                  (replace 'bootstrap
+                    (lambda _
+                      (invoke "autoreconf" "-fiv"))))))
+    (home-page "https://github.com/mdbooth/libldm")
+    (synopsis "Manager for Microsoft Windows dynamic disks")
+    (description
+     "Libldm is a library for managing Microsoft Windows dynamic
disks, which use Microsoft's LDM metadata.  It can inspect them, and
also create and remove device-mapper block devices which can be
mounted.")
+    (license license:gpl3)))
diff --git a/gnu/services/libldm.scm b/gnu/services/libldm.scm
new file mode 100644
index 0000000000..00e19540f0
--- /dev/null
+++ b/gnu/services/libldm.scm
@@ -0,0 +1,47 @@
+(define-module (gnu services libldm)
+  #:use-module (guix records)
+  #:use-module (guix gexp)
+  #:use-module (guix diagnostics)
+  #:use-module (guix i18n)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-26)
+  #:use-module (ice-9 match)
+  #:use-module (guix gexp)
+  #:use-module (gnu services)
+  #:use-module (guix modules)
+  #:use-module (gnu services base)
+  #:use-module (gnu services shepherd)
+  #:use-module (gnu packages libldm)
+  #:export (libldm-configuration libldm-configuration? libldm-service-type))
+
+(define-record-type* <libldm-configuration>
+                     libldm-configuration
+                     make-libldm-configuration
+                     libldm-configuration?
+                     (package
+                       libldm-configuration-package
+                       (default libldm))
+                     (action libldm-configuration-action
+                             (default '("create" "all"))))
+
+(define (libldm-shepherd-service config)
+  "Return a <shepherd-service> for libldm with CONFIG"
+  (let* ((libldm (libldm-configuration-package config))
+         (action (libldm-configuration-action config)))
+    (list (shepherd-service (documentation
+                             "Run ldmtool to create Windows dynamic
disc device nodes at startup.")
+                            (provision '(libldmd))
+                            (one-shot? #t)
+                            (start #~(make-forkexec-constructor
(append (list (string-append #$libldm
+
         "/bin/ldmtool"))
+
  '(#$@action))))
+                            (stop #~(make-kill-destructor))))))
+
+(define libldm-service-type
+  (service-type (name 'libldm)
+                (extensions (list (service-extension
+                                   shepherd-root-service-type
