summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am2
-rw-r--r--build-aux/pre-inst-env.in14
-rw-r--r--config-daemon.ac11
-rw-r--r--doc/build.scm32
-rw-r--r--doc/contributing.texi16
-rw-r--r--doc/guix.texi713
-rw-r--r--etc/guix-daemon.cil.in4
-rw-r--r--gnu/build/linux-container.scm7
-rw-r--r--gnu/build/shepherd.scm8
-rw-r--r--gnu/local.mk2
-rw-r--r--gnu/packages/admin.scm4
-rw-r--r--gnu/packages/algebra.scm4
-rw-r--r--gnu/packages/audio.scm20
-rw-r--r--gnu/packages/authentication.scm41
-rw-r--r--gnu/packages/bioconductor.scm615
-rw-r--r--gnu/packages/bioinformatics.scm32
-rw-r--r--gnu/packages/check.scm12
-rw-r--r--gnu/packages/cluster.scm35
-rw-r--r--gnu/packages/cmake.scm12
-rw-r--r--gnu/packages/cran.scm476
-rw-r--r--gnu/packages/crates-io.scm4
-rw-r--r--gnu/packages/cups.scm4
-rw-r--r--gnu/packages/dictionaries.scm6
-rw-r--r--gnu/packages/education.scm102
-rw-r--r--gnu/packages/emacs-xyz.scm170
-rw-r--r--gnu/packages/emulators.scm8
-rw-r--r--gnu/packages/engineering.scm69
-rw-r--r--gnu/packages/finance.scm31
-rw-r--r--gnu/packages/freedesktop.scm8
-rw-r--r--gnu/packages/game-development.scm10
-rw-r--r--gnu/packages/games.scm19
-rw-r--r--gnu/packages/gnome.scm72
-rw-r--r--gnu/packages/gnupg.scm32
-rw-r--r--gnu/packages/graph.scm4
-rw-r--r--gnu/packages/graphics.scm41
-rw-r--r--gnu/packages/guile-xyz.scm28
-rw-r--r--gnu/packages/guile.scm12
-rw-r--r--gnu/packages/haskell-apps.scm18
-rw-r--r--gnu/packages/haskell-xyz.scm37
-rw-r--r--gnu/packages/haskell.scm8
-rw-r--r--gnu/packages/image.scm73
-rw-r--r--gnu/packages/irc.scm20
-rw-r--r--gnu/packages/javascript.scm139
-rw-r--r--gnu/packages/kde.scm32
-rw-r--r--gnu/packages/language.scm481
-rw-r--r--gnu/packages/linux.scm40
-rw-r--r--gnu/packages/lisp.scm73
-rw-r--r--gnu/packages/lua.scm66
-rw-r--r--gnu/packages/lxqt.scm3
-rw-r--r--gnu/packages/maths.scm43
-rw-r--r--gnu/packages/mes.scm31
-rw-r--r--gnu/packages/music.scm69
-rw-r--r--gnu/packages/networking.scm8
-rw-r--r--gnu/packages/ntp.scm8
-rw-r--r--gnu/packages/ocr.scm75
-rw-r--r--gnu/packages/package-management.scm102
-rw-r--r--gnu/packages/patches/cmake-curl-certificates.patch40
-rw-r--r--gnu/packages/patches/tipp10-fix-compiling.patch3
-rw-r--r--gnu/packages/patches/weechat-python.patch40
-rw-r--r--gnu/packages/perl-compression.scm5
-rw-r--r--gnu/packages/python-check.scm23
-rw-r--r--gnu/packages/python-xyz.scm213
-rw-r--r--gnu/packages/python.scm6
-rw-r--r--gnu/packages/ruby.scm30
-rw-r--r--gnu/packages/shellutils.scm103
-rw-r--r--gnu/packages/sphinx.scm21
-rw-r--r--gnu/packages/statistics.scm36
-rw-r--r--gnu/packages/suckless.scm28
-rw-r--r--gnu/packages/sync.scm4
-rw-r--r--gnu/packages/terminals.scm7
-rw-r--r--gnu/packages/tex.scm9
-rw-r--r--gnu/packages/textutils.scm51
-rw-r--r--gnu/packages/tls.scm19
-rw-r--r--gnu/packages/video.scm4
-rw-r--r--gnu/packages/vim.scm13
-rw-r--r--gnu/packages/virtualization.scm17
-rw-r--r--gnu/packages/vpn.scm8
-rw-r--r--gnu/packages/vulkan.scm4
-rw-r--r--gnu/packages/web-browsers.scm4
-rw-r--r--gnu/packages/web.scm6
-rw-r--r--gnu/packages/wget.scm68
-rw-r--r--gnu/packages/wine.scm6
-rw-r--r--gnu/packages/wm.scm135
-rw-r--r--gnu/packages/xfce.scm38
-rw-r--r--gnu/services/base.scm9
-rw-r--r--gnu/services/certbot.scm1
-rw-r--r--gnu/services/networking.scm203
-rw-r--r--gnu/services/virtualization.scm11
-rw-r--r--gnu/system/file-systems.scm2
-rw-r--r--gnu/system/linux-container.scm61
-rw-r--r--guix/build/cargo-build-system.scm5
-rw-r--r--guix/docker.scm43
-rw-r--r--guix/gnu-maintenance.scm44
-rw-r--r--guix/import/cran.scm1
-rw-r--r--guix/import/crate.scm29
-rw-r--r--guix/import/github.scm2
-rw-r--r--guix/import/kde.scm190
-rw-r--r--guix/import/utils.scm17
-rw-r--r--guix/packages.scm2
-rw-r--r--guix/scripts/environment.scm13
-rw-r--r--guix/scripts/gc.scm15
-rw-r--r--guix/scripts/import/crate.scm13
-rw-r--r--guix/scripts/pack.scm16
-rw-r--r--guix/scripts/refresh.scm12
-rw-r--r--guix/store/roots.scm129
-rw-r--r--guix/upstream.scm12
-rw-r--r--guix/utils.scm7
-rw-r--r--nix/libstore/build.cc63
-rw-r--r--nix/libstore/builtins.cc4
-rw-r--r--nix/libstore/gc.cc11
-rw-r--r--nix/libstore/globals.cc2
-rw-r--r--nix/libstore/globals.hh11
-rw-r--r--nix/libstore/local-store.cc102
-rw-r--r--nix/libstore/local-store.hh12
-rw-r--r--nix/local.mk16
-rw-r--r--nix/nix-daemon/guix-daemon.cc20
-rw-r--r--nix/nix-daemon/nix-daemon.cc17
-rw-r--r--nix/scripts/authenticate.in11
-rw-r--r--nix/scripts/download.in11
-rw-r--r--nix/scripts/list-runtime-roots.in147
-rw-r--r--nix/scripts/offload.in11
-rw-r--r--nix/scripts/substitute.in11
-rw-r--r--tests/networking.scm113
-rw-r--r--tests/opam.scm2
124 files changed, 4794 insertions, 1554 deletions
diff --git a/Makefile.am b/Makefile.am
index eefce7a3ca..b5e7a01dce 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -221,6 +221,7 @@ MODULES =					\
   guix/import/gnu.scm				\
   guix/import/hackage.scm			\
   guix/import/json.scm				\
+  guix/import/kde.scm				\
   guix/import/launchpad.scm   			\
   guix/import/opam.scm				\
   guix/import/print.scm				\
@@ -402,6 +403,7 @@ SCM_TESTS =					\
   tests/modules.scm				\
   tests/monads.scm				\
   tests/nar.scm				\
+  tests/networking.scm				\
   tests/opam.scm				\
   tests/packages.scm				\
   tests/pack.scm				\
diff --git a/build-aux/pre-inst-env.in b/build-aux/pre-inst-env.in
index 3efab69e7d..e0aa7fe868 100644
--- a/build-aux/pre-inst-env.in
+++ b/build-aux/pre-inst-env.in
@@ -42,17 +42,9 @@ export GUILE_LOAD_COMPILED_PATH GUILE_LOAD_PATH
 PATH="$abs_top_builddir/scripts:$abs_top_builddir:$PATH"
 export PATH
 
-# Daemon helpers.
-
-NIX_ROOT_FINDER="$abs_top_builddir/nix/scripts/list-runtime-roots"
-NIX_LIBEXEC_DIR="@abs_top_builddir@/nix/scripts" # for 'authenticate', etc.
-
-export NIX_ROOT_FINDER NIX_LIBEXEC_DIR
-
-NIX_BUILD_HOOK="$abs_top_builddir/nix/scripts/offload"
-@BUILD_DAEMON_OFFLOAD_TRUE@export NIX_BUILD_HOOK
-@BUILD_DAEMON_OFFLOAD_FALSE@# No offloading support.
-@BUILD_DAEMON_OFFLOAD_FALSE@unset NIX_BUILD_HOOK
+# The daemon invokes 'guix'; tell it which one to use.
+GUIX="$abs_top_builddir/scripts/guix"
+export GUIX
 
 # The following variables need only be defined when compiling Guix
 # modules, but we define them to be on the safe side in case of
diff --git a/config-daemon.ac b/config-daemon.ac
index f1ad10acff..bf94815966 100644
--- a/config-daemon.ac
+++ b/config-daemon.ac
@@ -148,17 +148,6 @@ if test "x$guix_build_daemon" = "xyes"; then
   AC_SUBST([GUIX_TEST_ROOT])
 
   GUIX_CHECK_LOCALSTATEDIR
-
-  AC_CONFIG_FILES([nix/scripts/list-runtime-roots],
-    [chmod +x nix/scripts/list-runtime-roots])
-  AC_CONFIG_FILES([nix/scripts/download],
-    [chmod +x nix/scripts/download])
-  AC_CONFIG_FILES([nix/scripts/substitute],
-    [chmod +x nix/scripts/substitute])
-  AC_CONFIG_FILES([nix/scripts/authenticate],
-    [chmod +x nix/scripts/authenticate])
-  AC_CONFIG_FILES([nix/scripts/offload],
-    [chmod +x nix/scripts/offload])
 fi
 
 AM_CONDITIONAL([HAVE_LIBBZ2], [test "x$HAVE_LIBBZ2" = "xyes"])
diff --git a/doc/build.scm b/doc/build.scm
index c99bd505fd..5bc95d2517 100644
--- a/doc/build.scm
+++ b/doc/build.scm
@@ -29,6 +29,7 @@
              (guix gexp)
              (guix git)
              (guix git-download)
+             (guix utils)
              (git)
              (gnu packages base)
              (gnu packages gawk)
@@ -165,6 +166,35 @@ as well as images, OS examples, and translations."
   ;; Options passed to 'makeinfo --html'.
   '("--css-ref=https://www.gnu.org/software/gnulib/manual.css"))
 
+(define guile-lib/htmlprag-fixed
+  ;; Guile-Lib with a hotfix for (htmlprag).
+  (package
+    (inherit guile-lib)
+    (source (origin
+              (inherit (package-source guile-lib))
+              (modules '(( guix build utils)))
+              (snippet
+               '(begin
+                  ;; When parsing
+                  ;; "<body><blockquote><p>foo</p>\n</blockquote></body>",
+                  ;; 'html->shtml' would mistakenly close 'blockquote' right
+                  ;; before <p>.  This patch removes 'p' from the
+                  ;; 'parent-constraints' alist to fix that.
+                  (substitute* "src/htmlprag.scm"
+                    (("^[[:blank:]]*\\(p[[:blank:]]+\\. \\(body td th\\)\\).*")
+                     ""))
+                  #t))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments guile-lib)
+       ((#:phases phases '%standard-phases)
+        `(modify-phases ,phases
+          (add-before 'check 'skip-known-failure
+            (lambda _
+              ;; XXX: The above change causes one test failure among
+              ;; the htmlprag tests.
+              (setenv "XFAIL_TESTS" "htmlprag.scm")
+              #t))))))))
+
 (define* (syntax-highlighted-html input
                                   #:key
                                   (name "highlighted-syntax")
@@ -174,7 +204,7 @@ as well as images, OS examples, and translations."
 to (1) add them a link to SYNTAX-CSS-URL, and (2) highlight the syntax of all
 its <pre class=\"lisp\"> blocks (as produced by 'makeinfo --html')."
   (define build
-    (with-extensions (list guile-lib guile-syntax-highlight)
+    (with-extensions (list guile-lib/htmlprag-fixed guile-syntax-highlight)
       (with-imported-modules '((guix build utils))
         #~(begin
             (use-modules (htmlprag)
diff --git a/doc/contributing.texi b/doc/contributing.texi
index 59917193f1..655c8283e5 100644
--- a/doc/contributing.texi
+++ b/doc/contributing.texi
@@ -376,7 +376,7 @@ package and does not contain any version number.
 
 For instance, the versions 2.24.20 and 3.9.12 of GTK+ may be packaged as follows:
 
-@example
+@lisp
 (define-public gtk+
   (package
     (name "gtk+")
@@ -387,15 +387,15 @@ For instance, the versions 2.24.20 and 3.9.12 of GTK+ may be packaged as follows
     (name "gtk+")
     (version "2.24.20")
     ...))
-@end example
+@end lisp
 If we also wanted GTK+ 3.8.2, this would be packaged as
-@example
+@lisp
 (define-public gtk+-3.8
   (package
     (name "gtk+")
     (version "3.8.2")
     ...))
-@end example
+@end lisp
 
 @c See <https://lists.gnu.org/archive/html/guix-devel/2016-01/msg00425.html>,
 @c for a discussion of what follows.
@@ -432,7 +432,7 @@ kernel.)  It is best to use the full commit identifiers in
 @code{origin}s, though, to avoid ambiguities.  A typical package
 definition may look like this:
 
-@example
+@lisp
 (define my-package
   (let ((commit "c3f29bc928d5900971f65965feaae59e1272a3f7")
         (revision "1"))          ;Guix package revision
@@ -447,7 +447,7 @@ definition may look like this:
                 (file-name (git-file-name name version))))
       ;; @dots{}
       )))
-@end example
+@end lisp
 
 @node Synopses and Descriptions
 @subsection Synopses and Descriptions
@@ -825,12 +825,12 @@ recommend using the @code{qemu-binfmt-service-type} to emulate them.  In
 order to enable it, add the following service to the list of services in
 your @code{operating-system} configuration:
 
-@example
+@lisp
 (service qemu-binfmt-service-type
  (qemu-binfmt-configuration
    (platforms (lookup-qemu-platforms "arm" "aarch64" "mips64el"))
    (guix-support? #t)))
-@end example
+@end lisp
 
 Then reconfigure your system.
 
diff --git a/doc/guix.texi b/doc/guix.texi
index da84f79490..aff9aed06b 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -48,7 +48,7 @@ Copyright @copyright{} 2017 humanitiesNerd@*
 Copyright @copyright{} 2017 Christopher Allan Webber@*
 Copyright @copyright{} 2017, 2018 Marius Bakke@*
 Copyright @copyright{} 2017 Hartmut Goebel@*
-Copyright @copyright{} 2017 Maxim Cournoyer@*
+Copyright @copyright{} 2017, 2019 Maxim Cournoyer@*
 Copyright @copyright{} 2017, 2018, 2019 Tobias Geerinckx-Rice@*
 Copyright @copyright{} 2017 George Clemmer@*
 Copyright @copyright{} 2017 Andy Wingo@*
@@ -1035,7 +1035,7 @@ build are copied back to the initial machine.
 
 The @file{/etc/guix/machines.scm} file typically looks like this:
 
-@example
+@lisp
 (list (build-machine
         (name "eightysix.example.org")
         (system "x86_64-linux")
@@ -1051,7 +1051,7 @@ The @file{/etc/guix/machines.scm} file typically looks like this:
         (private-key
          (string-append (getenv "HOME")
                         "/.ssh/identity-for-guix"))))
-@end example
+@end lisp
 
 @noindent
 In the example above we specify a list of two build machines, one for
@@ -1724,8 +1724,8 @@ to make sure your TrueType fonts are listed there.
 After installing fonts you may have to refresh the font cache to use
 them in applications.  The same applies when applications installed via
 Guix do not seem to find fonts.  To force rebuilding of the font cache
-run @code{fc-cache -f}.  The @code{fc-cache} command is provided by the
-@code{fontconfig} package.
+run @code{fc-cache -rv}.  The @code{fc-cache} command is provided by
+the @code{fontconfig} package.
 
 @subsection X.509 Certificates
 
@@ -2756,9 +2756,9 @@ Install the package that the code within @var{file} evaluates to.
 As an example, @var{file} might contain a definition like this
 (@pxref{Defining Packages}):
 
-@example
+@lisp
 @verbatiminclude package-hello.scm
-@end example
+@end lisp
 
 Developers may find it useful to include such a @file{guix.scm} file
 in the root of their project source tree that can be used to test
@@ -2814,7 +2814,7 @@ so on.
 of packages:
 
 @findex packages->manifest
-@example
+@lisp
 (use-package-modules guile emacs)
 
 (packages->manifest
@@ -2822,7 +2822,7 @@ of packages:
        guile-2.0
        ;; Use a specific package output.
        (list guile-2.0 "debug")))
-@end example
+@end lisp
 
 @findex specifications->manifest
 In this example we have to know which modules define the @code{emacs}
@@ -2832,10 +2832,10 @@ instead provide regular package specifications and let
 @code{specifications->manifest} look up the corresponding package
 objects, like this:
 
-@example
+@lisp
 (specifications->manifest
  '("emacs" "guile@@2.2" "guile@@2.2:debug"))
-@end example
+@end lisp
 
 @item --roll-back
 @cindex rolling back
@@ -3496,6 +3496,10 @@ This prints nothing unless the daemon was started with
 List the GC roots owned by the user; when run as root, list @emph{all} the GC
 roots.
 
+@item --list-busy
+List store items in use by currently running processes.  These store
+items are effectively considered GC roots: they cannot be deleted.
+
 @item --clear-failures
 Remove the specified store items from the failed-build cache.
 
@@ -3620,7 +3624,7 @@ version.  New @command{guix} sub-commands added by the update also
 become available.
 
 Any user can update their Guix copy using @command{guix pull}, and the
-effect is limited to the user who run @command{guix pull}.  For
+effect is limited to the user who ran @command{guix pull}.  For
 instance, when user @code{root} runs @command{guix pull}, this has no
 effect on the version of Guix that user @code{alice} sees, and vice
 versa.
@@ -4548,9 +4552,9 @@ within @var{file} evaluates to.
 As an example, @var{file} might contain a definition like this
 (@pxref{Defining Packages}):
 
-@example
+@lisp
 @verbatiminclude environment-gdb.scm
-@end example
+@end lisp
 
 @item --manifest=@var{file}
 @itemx -m @var{file}
@@ -5124,7 +5128,7 @@ The high-level interface to package definitions is implemented in the
 example, the package definition, or @dfn{recipe}, for the GNU Hello
 package looks like this:
 
-@example
+@lisp
 (define-module (gnu packages hello)
   #:use-module (guix packages)
   #:use-module (guix download)
@@ -5150,7 +5154,7 @@ package looks like this:
     (description "Guess what GNU Hello prints!")
     (home-page "https://www.gnu.org/software/hello/")
     (license gpl3+)))
-@end example
+@end lisp
 
 @noindent
 Without being a Scheme expert, the reader may have guessed the meaning
@@ -5331,7 +5335,7 @@ the name of a package and returns its new name after rewrite.
 @noindent
 Consider this example:
 
-@example
+@lisp
 (define libressl-instead-of-openssl
   ;; This is a procedure to replace OPENSSL by LIBRESSL,
   ;; recursively.
@@ -5339,7 +5343,7 @@ Consider this example:
 
 (define git-with-libressl
   (libressl-instead-of-openssl git))
-@end example
+@end lisp
 
 @noindent
 Here we first define a rewriting procedure that replaces @var{openssl}
@@ -5361,11 +5365,11 @@ replacement for that package.
 
 The example above could be rewritten this way:
 
-@example
+@lisp
 (define libressl-instead-of-openssl
   ;; Replace all the packages called "openssl" with LibreSSL.
   (package-input-rewriting/spec `(("openssl" . ,(const libressl)))))
-@end example
+@end lisp
 
 The key difference here is that, this time, packages are matched by spec and
 not by identity.  In other words, any package in the graph that is called
@@ -5431,11 +5435,11 @@ defaults to @code{"out"} (@pxref{Packages with Multiple Outputs}, for
 more on package outputs).  For example, the list below specifies three
 inputs:
 
-@example
+@lisp
 `(("libffi" ,libffi)
   ("libunistring" ,libunistring)
   ("glib:bin" ,glib "bin"))  ;the "bin" output of Glib
-@end example
+@end lisp
 
 @cindex cross compilation, package dependencies
 The distinction between @code{native-inputs} and @code{inputs} is
@@ -5516,7 +5520,7 @@ identifier resolves to the package being defined.
 The example below shows how to add a package as a native input of itself when
 cross-compiling:
 
-@example
+@lisp
 (package
   (name "guile")
   ;; ...
@@ -5526,7 +5530,7 @@ cross-compiling:
   (native-inputs (if (%current-target-system)
                      `(("self" ,this-package))
                      '())))
-@end example
+@end lisp
 
 It is an error to refer to @code{this-package} outside a package definition.
 @end deffn
@@ -5563,11 +5567,11 @@ clone the Git version control repository, and check out the revision
 specified in the @code{uri} field as a @code{git-reference} object; a
 @code{git-reference} looks like this:
 
-@example
+@lisp
 (git-reference
   (url "https://git.savannah.gnu.org/git/hello.git")
   (commit "v2.10"))
-@end example
+@end lisp
 @end table
 
 @item @code{sha256}
@@ -6779,7 +6783,7 @@ in a monad---values that carry this additional context---are called
 
 Consider this ``normal'' procedure:
 
-@example
+@lisp
 (define (sh-symlink store)
   ;; Return a derivation that symlinks the 'bash' executable.
   (let* ((drv (package-derivation store bash))
@@ -6787,19 +6791,19 @@ Consider this ``normal'' procedure:
          (sh  (string-append out "/bin/bash")))
     (build-expression->derivation store "sh"
                                   `(symlink ,sh %output))))
-@end example
+@end lisp
 
 Using @code{(guix monads)} and @code{(guix gexp)}, it may be rewritten
 as a monadic function:
 
-@example
+@lisp
 (define (sh-symlink)
   ;; Same, but return a monadic value.
   (mlet %store-monad ((drv (package->derivation bash)))
     (gexp->derivation "sh"
                       #~(symlink (string-append #$drv "/bin/bash")
                                  #$output))))
-@end example
+@end lisp
 
 There are several things to note in the second version: the @code{store}
 parameter is now implicit and is ``threaded'' in the calls to the
@@ -6811,12 +6815,12 @@ As it turns out, the call to @code{package->derivation} can even be
 omitted since it will take place implicitly, as we will see later
 (@pxref{G-Expressions}):
 
-@example
+@lisp
 (define (sh-symlink)
   (gexp->derivation "sh"
                     #~(symlink (string-append #$bash "/bin/bash")
                                #$output)))
-@end example
+@end lisp
 
 @c See
 @c <https://syntaxexclamation.wordpress.com/2014/06/26/escaping-continuations/>
@@ -6826,10 +6830,10 @@ said, ``you exit a monad like you exit a building on fire: by running''.
 So, to exit the monad and get the desired effect, one must use
 @code{run-with-store}:
 
-@example
+@lisp
 (run-with-store (open-connection) (sh-symlink))
 @result{} /gnu/store/...-sh-symlink
-@end example
+@end lisp
 
 Note that the @code{(guix monad-repl)} module extends the Guile REPL with
 new ``meta-commands'' to make it easier to deal with monadic procedures:
@@ -6878,7 +6882,7 @@ Guile.  Thus we use this somewhat cryptic symbol inherited from the
 Haskell language.}.  There can be one @var{mproc} or several of them, as
 in this example:
 
-@example
+@lisp
 (run-with-state
     (with-monad %state-monad
       (>>= (return 1)
@@ -6888,7 +6892,7 @@ in this example:
 
 @result{} 4
 @result{} some-state
-@end example
+@end lisp
 @end deffn
 
 @deffn {Scheme Syntax} mlet @var{monad} ((@var{var} @var{mval}) ...) @
@@ -6947,7 +6951,7 @@ Consider the example below.  The @code{square} procedure returns a value
 in the state monad.  It returns the square of its argument, but also
 increments the current state value:
 
-@example
+@lisp
 (define (square x)
   (mlet %state-monad ((count (current-state)))
     (mbegin %state-monad
@@ -6957,7 +6961,7 @@ increments the current state value:
 (run-with-state (sequence %state-monad (map square (iota 3))) 0)
 @result{} (0 1 4)
 @result{} 3
-@end example
+@end lisp
 
 When ``run'' through @var{%state-monad}, we obtain that additional state
 value, which is the number of @code{square} calls.
@@ -7032,14 +7036,14 @@ entries for which @var{select?} does not return true.
 
 The example below adds a file to the store, under two different names:
 
-@example
+@lisp
 (run-with-store (open-connection)
   (mlet %store-monad ((a (interned-file "README"))
                       (b (interned-file "README" "LEGU-MIN")))
     (return (list a b))))
 
 @result{} ("/gnu/store/rwm@dots{}-README" "/gnu/store/44i@dots{}-LEGU-MIN")
-@end example
+@end lisp
 
 @end deffn
 
@@ -7133,22 +7137,22 @@ below.)
 
 To illustrate the idea, here is an example of a gexp:
 
-@example
+@lisp
 (define build-exp
   #~(begin
       (mkdir #$output)
       (chdir #$output)
       (symlink (string-append #$coreutils "/bin/ls")
                "list-files")))
-@end example
+@end lisp
 
 This gexp can be passed to @code{gexp->derivation}; we obtain a
 derivation that builds a directory containing exactly one symlink to
 @file{/gnu/store/@dots{}-coreutils-8.22/bin/ls}:
 
-@example
+@lisp
 (gexp->derivation "the-thing" build-exp)
-@end example
+@end lisp
 
 As one would expect, the @code{"/gnu/store/@dots{}-coreutils-8.22"} string is
 substituted to the reference to the @var{coreutils} package in the
@@ -7164,7 +7168,7 @@ host---versus references to cross builds of a package.  To that end, the
 @code{#+} plays the same role as @code{#$}, but is a reference to a
 native package build:
 
-@example
+@lisp
 (gexp->derivation "vi"
    #~(begin
        (mkdir #$output)
@@ -7173,7 +7177,7 @@ native package build:
                 (string-append #$emacs "/bin/emacs")
                 (string-append #$output "/bin/vi")))
    #:target "mips64el-linux-gnu")
-@end example
+@end lisp
 
 @noindent
 In the example above, the native build of @var{coreutils} is used, so
@@ -7187,7 +7191,7 @@ able to use certain Guile modules from the ``host environment'' in the
 gexp, so those modules should be imported in the ``build environment''.
 The @code{with-imported-modules} form allows you to express that:
 
-@example
+@lisp
 (let ((build (with-imported-modules '((guix build utils))
                #~(begin
                    (use-modules (guix build utils))
@@ -7197,7 +7201,7 @@ The @code{with-imported-modules} form allows you to express that:
                         #$build
                         (display "success!\n")
                         #t)))
-@end example
+@end lisp
 
 @noindent
 In this example, the @code{(guix build utils)} module is automatically
@@ -7213,7 +7217,7 @@ because of missing dependent modules.  The @code{source-module-closure}
 procedure computes the closure of a module by looking at its source file
 headers, which comes in handy in this case:
 
-@example
+@lisp
 (use-modules (guix modules))   ;for 'source-module-closure'
 
 (with-imported-modules (source-module-closure
@@ -7224,7 +7228,7 @@ headers, which comes in handy in this case:
                         (use-modules (guix build utils)
                                      (gnu build vm))
                         @dots{})))
-@end example
+@end lisp
 
 @cindex extensions, for gexps
 @findex with-extensions
@@ -7233,7 +7237,7 @@ modules, but also ``extensions'' such as Guile bindings to C libraries
 or other ``full-blown'' packages.  Say you need the @code{guile-json}
 package available on the build side, here's how you would do it:
 
-@example
+@lisp
 (use-modules (gnu packages guile))  ;for 'guile-json'
 
 (with-extensions (list guile-json)
@@ -7241,7 +7245,7 @@ package available on the build side, here's how you would do it:
                     #~(begin
                         (use-modules (json))
                         @dots{})))
-@end example
+@end lisp
 
 The syntactic form to construct gexps is summarized below.
 
@@ -7310,12 +7314,12 @@ Each item in @var{modules} can be the name of a module, such as
 @code{(guix build utils)}, or it can be a module name, followed by an
 arrow, followed by a file-like object:
 
-@example
+@lisp
 `((guix build utils)
   (guix gcrypt)
   ((guix config) => ,(scheme-file "config.scm"
                                   #~(define-module @dots{}))))
-@end example
+@end lisp
 
 @noindent
 In the example above, the first two modules are taken from the search
@@ -7414,10 +7418,10 @@ The @code{local-file}, @code{plain-file}, @code{computed-file},
 @dfn{file-like objects}.  That is, when unquoted in a G-expression,
 these objects lead to a file in the store.  Consider this G-expression:
 
-@example
+@lisp
 #~(system* #$(file-append glibc "/sbin/nscd") "-f"
            #$(local-file "/tmp/my-nscd.conf"))
-@end example
+@end lisp
 
 The effect here is to ``intern'' @file{/tmp/my-nscd.conf} by copying it
 to the store.  Once expanded, for instance @i{via}
@@ -7473,13 +7477,13 @@ Look up @var{exp}'s modules in @var{module-path}.
 The example below builds a script that simply invokes the @command{ls}
 command:
 
-@example
+@lisp
 (use-modules (guix gexp) (gnu packages base))
 
 (gexp->script "list-files"
               #~(execl #$(file-append coreutils "/bin/ls")
                        "ls"))
-@end example
+@end lisp
 
 When ``running'' it through the store (@pxref{The Store Monad,
 @code{run-with-store}}), we obtain a derivation that produces an
@@ -7537,14 +7541,14 @@ to create will reference items from the store.  This is typically the
 case when building a configuration file that embeds store file names,
 like this:
 
-@example
+@lisp
 (define (profile.sh)
   ;; Return the name of a shell script in the store that
   ;; initializes the 'PATH' environment variable.
   (text-file* "profile.sh"
               "export PATH=" coreutils "/bin:"
               grep "/bin:" sed "/bin\n"))
-@end example
+@end lisp
 
 In this example, the resulting @file{/gnu/store/@dots{}-profile.sh} file
 will reference @var{coreutils}, @var{grep}, and @var{sed}, thereby
@@ -7556,10 +7560,10 @@ Return an object representing store file @var{name} containing
 @var{text}.  @var{text} is a sequence of strings and file-like objects,
 as in:
 
-@example
+@lisp
 (mixed-text-file "profile"
                  "export PATH=" coreutils "/bin:" grep "/bin")
-@end example
+@end lisp
 
 This is the declarative counterpart of @code{text-file*}.
 @end deffn
@@ -7570,13 +7574,13 @@ Each item in @var{files} must be a two-element list where the first element is t
 file name to use in the new directory, and the second element is a gexp
 denoting the target file.  Here's an example:
 
-@example
+@lisp
 (file-union "etc"
             `(("hosts" ,(plain-file "hosts"
                                     "127.0.0.1 localhost"))
               ("bashrc" ,(plain-file "bashrc"
                                      "alias ls='ls --color=auto'"))))
-@end example
+@end lisp
 
 This yields an @code{etc} directory containing these two files.
 @end deffn
@@ -7585,9 +7589,9 @@ This yields an @code{etc} directory containing these two files.
 Return a directory that is the union of @var{things}, where @var{things} is a list of
 file-like objects denoting directories.  For example:
 
-@example
+@lisp
 (directory-union "guile+emacs" (list guile emacs))
-@end example
+@end lisp
 
 yields a directory that is the union of the @code{guile} and @code{emacs} packages.
 @end deffn
@@ -7599,19 +7603,19 @@ and @var{suffix}, where @var{obj} is a lowerable object and each
 
 As an example, consider this gexp:
 
-@example
+@lisp
 (gexp->script "run-uname"
               #~(system* #$(file-append coreutils
                                         "/bin/uname")))
-@end example
+@end lisp
 
 The same effect could be achieved with:
 
-@example
+@lisp
 (gexp->script "run-uname"
               #~(system* (string-append #$coreutils
                                         "/bin/uname")))
-@end example
+@end lisp
 
 There is one difference though: in the @code{file-append} case, the
 resulting script contains the absolute file name as a string, whereas in
@@ -8099,9 +8103,9 @@ Build the package, derivation, or other file-like object that the code within
 As an example, @var{file} might contain a package definition like this
 (@pxref{Defining Packages}):
 
-@example
+@lisp
 @verbatiminclude package-hello.scm
-@end example
+@end lisp
 
 @item --expression=@var{expr}
 @itemx -e @var{expr}
@@ -8908,7 +8912,17 @@ in Guix.
 @item crate
 @cindex crate
 Import metadata from the crates.io Rust package repository
-@uref{https://crates.io, crates.io}.
+@uref{https://crates.io, crates.io}, as in this example:
+
+@example
+guix import crate blake2-rfc
+@end example
+
+The crate importer also allows you to specify a version string:
+
+@example
+guix import crate constant-time-eq@@0.1.0
+@end example
 
 @item opam
 @cindex OPAM
@@ -8974,13 +8988,13 @@ and @command{guix refresh} needs a little help.  Most updaters honor the
 @code{upstream-name} property in package definitions, which can be used
 to that effect:
 
-@example
+@lisp
 (define-public network-manager
   (package
     (name "network-manager")
     ;; @dots{}
     (properties '((upstream-name . "NetworkManager")))))
-@end example
+@end lisp
 
 When passed @code{--update}, it modifies distribution source files to
 update the version numbers and source tarball hashes of those package
@@ -9323,14 +9337,14 @@ Package developers can specify in package recipes the
 name and version of the package when they differ from the name or version
 that Guix uses, as in this example:
 
-@example
+@lisp
 (package
   (name "grub")
   ;; @dots{}
   ;; CPE calls this package "grub2".
   (properties '((cpe-name . "grub2")
                 (cpe-version . "2.3")))
-@end example
+@end lisp
 
 @c See <https://www.openwall.com/lists/oss-security/2017/03/15/3>.
 Some entries in the CVE database do not specify which version of a
@@ -9338,7 +9352,7 @@ package they apply to, and would thus ``stick around'' forever.  Package
 developers who found CVE alerts and verified they can be ignored can
 declare them as in this example:
 
-@example
+@lisp
 (package
   (name "t1lib")
   ;; @dots{}
@@ -9347,7 +9361,7 @@ declare them as in this example:
                                     "CVE-2011-1553"
                                     "CVE-2011-1554"
                                     "CVE-2011-5244")))))
-@end example
+@end lisp
 
 @item formatting
 Warn about obvious source code formatting issues: trailing white space,
@@ -10447,11 +10461,11 @@ mode, as in the example above.  However, more recent machines rely instead on
 the @dfn{Unified Extensible Firmware Interface} (UEFI) to boot.  In that case,
 the @code{bootloader} field should contain something along these lines:
 
-@example
+@lisp
 (bootloader-configuration
   (bootloader grub-efi-bootloader)
   (target "/boot/efi"))
-@end example
+@end lisp
 
 @xref{Bootloader Configuration}, for more information on the available
 configuration options.
@@ -10588,11 +10602,11 @@ Partitioning,,, guile, GNU Guile Reference Manual}).  For instance, the
 following expression returns a list that contains all the services in
 @code{%desktop-services} minus the Avahi service:
 
-@example
+@lisp
 (remove (lambda (service)
           (eq? (service-kind service) avahi-service-type))
         %desktop-services)
-@end example
+@end lisp
 
 @unnumberedsubsec Instantiating the System
 
@@ -10753,12 +10767,12 @@ the home directory of newly-created user accounts.
 
 For instance, a valid value may look like this:
 
-@example
+@lisp
 `((".bashrc" ,(plain-file "bashrc" "echo Hello\n"))
   (".guile" ,(plain-file "guile"
                          "(use-modules (ice-9 readline))
                           (activate-readline)")))
-@end example
+@end lisp
 
 @item @code{issue} (default: @code{%default-issue})
 A string denoting the contents of the @file{/etc/issue} file, which is
@@ -10836,14 +10850,14 @@ this identifier resolves to the operating system being defined.
 The example below shows how to refer to the operating system being defined in
 the definition of the @code{label} field:
 
-@example
+@lisp
 (use-modules (gnu) (guix))
 
 (operating-system
   ;; ...
   (label (package-full-name
           (operating-system-kernel this-operating-system))))
-@end example
+@end lisp
 
 It is an error to refer to @code{this-operating-system} outside an operating
 system definition.
@@ -10859,12 +10873,12 @@ The list of file systems to be mounted is specified in the
 (@pxref{Using the Configuration System}).  Each file system is declared
 using the @code{file-system} form, like this:
 
-@example
+@lisp
 (file-system
   (mount-point "/home")
   (device "/dev/sda3")
   (type "ext4"))
-@end example
+@end lisp
 
 As usual, some of the fields are mandatory---those shown in the example
 above---while others can be omitted.  These are described below.
@@ -10898,12 +10912,12 @@ procedure, UUIDs are created using @code{uuid}, and @file{/dev} node are
 plain strings.  Here's an example of a file system referred to by its
 label, as shown by the @command{e2label} command:
 
-@example
+@lisp
 (file-system
   (mount-point "/home")
   (type "ext4")
   (device (file-system-label "my-home")))
-@end example
+@end lisp
 
 @findex uuid
 UUIDs are converted from their string representation (as shown by the
@@ -10914,12 +10928,12 @@ form of UUID used by the ext2 family of file systems and others, but it
 is different from ``UUIDs'' found in FAT file systems, for instance.},
 like this:
 
-@example
+@lisp
 (file-system
   (mount-point "/home")
   (type "ext4")
   (device (uuid "4dab5feb-d176-45de-b287-9b0a6e4c01cb")))
-@end example
+@end lisp
 
 When the source of a file system is a mapped device (@pxref{Mapped
 Devices}), its @code{device} field @emph{must} refer to the mapped
@@ -11094,12 +11108,12 @@ The @file{/dev/mapper/home}
 device can then be used as the @code{device} of a @code{file-system}
 declaration (@pxref{File Systems}).
 
-@example
+@lisp
 (mapped-device
   (source "/dev/sda3")
   (target "home")
   (type luks-device-mapping))
-@end example
+@end lisp
 
 Alternatively, to become independent of device numbering, one may obtain
 the LUKS UUID (@dfn{unique identifier}) of the source device by a
@@ -11111,12 +11125,12 @@ cryptsetup luksUUID /dev/sda3
 
 and use it as follows:
 
-@example
+@lisp
 (mapped-device
   (source (uuid "cb67fc72-0d54-4c88-9d4b-b225f30b0f44"))
   (target "home")
   (type luks-device-mapping))
-@end example
+@end lisp
 
 @cindex swap encryption
 It is also desirable to encrypt swap space, since swap space may contain
@@ -11128,12 +11142,12 @@ swap file is encrypted because the entire device is encrypted.
 A RAID device formed of the partitions @file{/dev/sda1} and @file{/dev/sdb1}
 may be declared as follows:
 
-@example
+@lisp
 (mapped-device
   (source (list "/dev/sda1" "/dev/sdb1"))
   (target "/dev/md0")
   (type raid-device-mapping))
-@end example
+@end lisp
 
 The @file{/dev/md0} device can then be used as the @code{device} of a
 @code{file-system} declaration (@pxref{File Systems}).
@@ -11152,7 +11166,7 @@ User accounts and groups are entirely managed through the
 @code{operating-system} declaration.  They are specified with the
 @code{user-account} and @code{user-group} forms:
 
-@example
+@lisp
 (user-account
   (name "alice")
   (group "users")
@@ -11162,7 +11176,7 @@ User accounts and groups are entirely managed through the
                           "cdrom")) ;the good ol' CD-ROM
   (comment "Bob's sister")
   (home-directory "/home/alice"))
-@end example
+@end lisp
 
 When booting or upon completion of @command{guix system reconfigure},
 the system ensures that only the user accounts and groups specified in
@@ -11226,14 +11240,14 @@ If you @emph{do} want to set an initial password for an account, then
 this field must contain the encrypted password, as a string.  You can use the
 @code{crypt} procedure for this purpose:
 
-@example
+@lisp
 (user-account
   (name "charlie")
   (group "users")
 
   ;; Specify a SHA-512-hashed initial password.
   (password (crypt "InitialPassword!" "$6$abc")))
-@end example
+@end lisp
 
 @quotation Note
 The hash of this initial password will be available in a file in
@@ -11251,9 +11265,9 @@ Guile Reference Manual}, for information on Guile's @code{crypt} procedure.
 @cindex groups
 User group declarations are even simpler:
 
-@example
+@lisp
 (user-group (name "students"))
-@end example
+@end lisp
 
 @deftp {Data Type} user-group
 This type is for, well, user groups.  There are just a few fields:
@@ -11340,7 +11354,7 @@ optional variant name, an optional keyboard model name, and a possibly empty
 list of additional options.  In most cases the layout name is all you care
 about.  Here are a few example:
 
-@example
+@lisp
 ;; The German QWERTZ layout.  Here we assume a standard
 ;; "pc105" keyboard model.
 (keyboard-layout "de")
@@ -11365,7 +11379,7 @@ about.  Here are a few example:
 ;; dead keys to enter accented characters.  This is for an
 ;; Apple MacBook keyboard.
 (keyboard-layout "us" "intl" #:model "macbook78")
-@end example
+@end lisp
 
 See the @file{share/X11/xkb} directory of the @code{xkeyboard-config} package
 for a complete list of supported layouts, variants, and models.
@@ -11455,20 +11469,20 @@ used locales, but not all the available locales, in order to save space.
 For instance, to add the North Frisian locale for Germany, the value of
 that field may be:
 
-@example
+@lisp
 (cons (locale-definition
         (name "fy_DE.utf8") (source "fy_DE"))
       %default-locale-definitions)
-@end example
+@end lisp
 
 Likewise, to save space, one might want @code{locale-definitions} to
 list only the locales that are actually used, as in:
 
-@example
+@lisp
 (list (locale-definition
         (name "ja_JP.eucjp") (source "ja_JP")
         (charset "EUC-JP")))
-@end example
+@end lisp
 
 @vindex LOCPATH
 The compiled locale definitions are available at
@@ -11554,13 +11568,13 @@ it---this is especially crucial on a multi-user system.  To do that, the
 administrator can specify several libc packages in the
 @code{locale-libcs} field of @code{operating-system}:
 
-@example
+@lisp
 (use-package-modules base)
 
 (operating-system
   ;; @dots{}
   (locale-libcs (list glibc-2.21 (canonical-package glibc))))
-@end example
+@end lisp
 
 This example would lead to a system containing locale definitions for
 both libc 2.21 and the current version of libc in
@@ -11665,11 +11679,11 @@ This is the default value of the @code{services} field of
 system, you will want to append services to @code{%base-services}, like
 this:
 
-@example
+@lisp
 (append (list (service avahi-service-type)
               (service openssh-service-type))
         %base-services)
-@end example
+@end lisp
 @end defvr
 
 @defvr {Scheme Variable} special-files-service-type
@@ -11682,19 +11696,19 @@ and the second element is its target.  By default it is:
 
 @cindex @file{/bin/sh}
 @cindex @file{sh}, in @file{/bin}
-@example
-`(("/bin/sh" ,(file-append @var{bash} "/bin/sh")))
-@end example
+@lisp
+`(("/bin/sh" ,(file-append bash "/bin/sh")))
+@end lisp
 
 @cindex @file{/usr/bin/env}
 @cindex @file{env}, in @file{/usr/bin}
 If you want to add, say, @code{/usr/bin/env} to your system, you can
 change it to:
 
-@example
-`(("/bin/sh" ,(file-append @var{bash} "/bin/sh"))
-  ("/usr/bin/env" ,(file-append @var{coreutils} "/bin/env")))
-@end example
+@lisp
+`(("/bin/sh" ,(file-append bash "/bin/sh"))
+  ("/usr/bin/env" ,(file-append coreutils "/bin/env")))
+@end lisp
 
 Since this is part of @code{%base-services}, you can use
 @code{modify-services} to customize the set of special files
@@ -11710,10 +11724,10 @@ For example, adding the following lines to the @code{services} field of
 your operating system declaration leads to a @file{/usr/bin/env}
 symlink:
 
-@example
+@lisp
 (extra-special-file "/usr/bin/env"
                     (file-append coreutils "/bin/env"))
-@end example
+@end lisp
 @end deffn
 
 @deffn {Scheme Procedure} host-name-service @var{name}
@@ -12212,14 +12226,14 @@ In the following example, a rule for a USB device is defined to be
 stored in the file @file{90-usb-thing.rules}.  The rule runs a script
 upon detecting a USB device with a given product identifier.
 
-@example
+@lisp
 (define %example-udev-rule
   (udev-rule
     "90-usb-thing.rules"
     (string-append "ACTION==\"add\", SUBSYSTEM==\"usb\", "
                    "ATTR@{product@}==\"Example\", "
                    "RUN+=\"/path/to/script\"")))
-@end example
+@end lisp
 
 The @command{herd rules udev} command, as root, returns the name of the
 directory containing all the active udev rules.
@@ -12227,7 +12241,7 @@ directory containing all the active udev rules.
 
 Here we show how the default @var{udev-service} can be extended with it.
 
-@example
+@lisp
 (operating-system
  ;; @dots{}
  (services
@@ -12236,7 +12250,7 @@ Here we show how the default @var{udev-service} can be extended with it.
      (udev-configuration (inherit config)
       (rules (append (udev-configuration-rules config)
                      (list %example-udev-rule))))))))
-@end example
+@end lisp
 
 @deffn {Scheme Procedure} file->udev-rule [@var{file-name} @var{file}]
 Return a udev file named @var{file-name} containing the rules defined
@@ -12244,7 +12258,7 @@ within @var{file}, a file-like object.
 
 The following example showcases how we can use an existing rule file.
 
-@example
+@lisp
 (use-modules (guix download)     ;for url-fetch
              (guix packages)     ;for origin
              ;; @dots{})
@@ -12259,7 +12273,7 @@ The following example showcases how we can use an existing rule file.
                            "android-udev-rules/" version "/51-android.rules"))
        (sha256
         (base32 "0lmmagpyb6xsq6zcr2w1cyx9qmjqmajkvrdbhjx32gqf1d9is003"))))))
-@end example
+@end lisp
 @end deffn
 
 Additionally, Guix package definitions can be included in @var{rules} in
@@ -12278,7 +12292,7 @@ create such a group, we must define it both as part of the
 @var{supplementary-groups} of our @var{user-account} declaration, as
 well as in the @var{groups} field of the @var{operating-system} record.
 
-@example
+@lisp
 (use-modules (gnu packages android)  ;for android-udev-rules
              (gnu system shadow)     ;for user-group
              ;; @dots{})
@@ -12304,7 +12318,7 @@ well as in the @var{groups} field of the @var{operating-system} record.
       (udev-configuration (inherit config)
                           (rules (cons android-udev-rules
                                        (udev-configuration-rules config))))))))
-@end example
+@end lisp
 
 @defvr {Scheme Variable} urandom-seed-service-type
 Save some entropy in @var{%random-seed-file} to seed @file{/dev/urandom}
@@ -12378,9 +12392,9 @@ This is a list of compression method/level tuple used when compressing
 substitutes.  For example, to compress all substitutes with @emph{both} lzip
 at level 7 and gzip at level 9, write:
 
-@example
+@lisp
 '(("lzip" 7) ("gzip" 9))
-@end example
+@end lisp
 
 Level 9 achieves the best compression ratio at the expense of increased CPU
 usage, whereas level 1 achieves fast compression.
@@ -12435,12 +12449,12 @@ Return a service that installs a configuration file for the
 The following limits definition sets two hard and soft limits for all
 login sessions of users in the @code{realtime} group:
 
-@example
+@lisp
 (pam-limits-service
  (list
   (pam-limits-entry "@@realtime" 'both 'rtprio 99)
   (pam-limits-entry "@@realtime" 'both 'memlock 'unlimited)))
-@end example
+@end lisp
 
 The first entry increases the maximum realtime priority for
 non-privileged processes; the second entry lifts any restriction of the
@@ -12647,7 +12661,7 @@ Taking an example from the Rottlog manual (@pxref{Period Related File
 Examples,,, rottlog, GNU Rot[t]log Manual}), a log rotation might be
 defined like this:
 
-@example
+@lisp
 (log-rotation
   (frequency 'daily)
   (files '("/var/log/apache/*"))
@@ -12655,7 +12669,7 @@ defined like this:
              "rotate 6"
              "notifempty"
              "nocompress")))
-@end example
+@end lisp
 
 The list of fields is as follows:
 
@@ -12704,12 +12718,12 @@ This type defines a service that runs a DHCP daemon.  To create a
 service of this type, you must supply a @code{<dhcpd-configuration>}.
 For example:
 
-@example
+@lisp
 (service dhcpd-service-type
          (dhcpd-configuration
           (config-file (local-file "my-dhcpd.conf"))
           (interfaces '("enp0s25"))))
-@end example
+@end lisp
 @end deffn
 
 @deftp {Data Type} dhcpd-configuration
@@ -12765,11 +12779,11 @@ to handle.
 
 For example:
 
-@example
+@lisp
 (static-networking-service "eno1" "192.168.1.82"
                            #:gateway "192.168.1.2"
                            #:name-servers '("192.168.1.2"))
-@end example
+@end lisp
 @end deffn
 
 @cindex wicd
@@ -12924,11 +12938,11 @@ a network connection manager.
 Its value must be an
 @code{connman-configuration} record as in this example:
 
-@example
+@lisp
 (service connman-service-type
          (connman-configuration
            (disable-vpn? #t)))
-@end example
+@end lisp
 
 See below for details about @code{connman-configuration}.
 @end deffn
@@ -13028,6 +13042,7 @@ objects}).
 @end deftp
 
 @cindex NTP (Network Time Protocol), service
+@cindex ntpd, service for the Network Time Protocol daemon
 @cindex real time clock
 @defvr {Scheme Variable} ntp-service-type
 This is the type of the service running the @uref{http://www.ntp.org,
@@ -13043,10 +13058,11 @@ This is the data type for the NTP service configuration.
 
 @table @asis
 @item @code{servers} (default: @code{%ntp-servers})
-This is the list of servers (host names) with which @command{ntpd} will be
-synchronized.
+This is the list of servers (@code{<ntp-server>} records) with which
+@command{ntpd} will be synchronized.  See the @code{ntp-server} data type
+definition below.
 
-@item @code{allow-large-adjustment?} (default: @code{#f})
+@item @code{allow-large-adjustment?} (default: @code{#t})
 This determines whether @command{ntpd} is allowed to make an initial
 adjustment of more than 1,000 seconds.
 
@@ -13060,13 +13076,39 @@ List of host names used as the default NTP servers.  These are servers of the
 @uref{https://www.ntppool.org/en/, NTP Pool Project}.
 @end defvr
 
+@deftp {Data Type} ntp-server
+The data type representing the configuration of a NTP server.
+
+@table @asis
+@item @code{type} (default: @code{'server})
+The type of the NTP server, given as a symbol. One of @code{'pool},
+@code{'server}, @code{'peer}, @code{'broadcast} or @code{'manycastclient}.
+
+@item @code{address}
+The address of the server, as a string.
+
+@item @code{options}
+NTPD options to use with that specific server, given as a list of option names
+and/or of option names and values tuples. The following example define a server
+to use with the options @option{iburst} and @option{prefer}, as well as
+@option{version} 3 and a @option{maxpoll} time of 16 seconds.
+
+@example
+(ntp-server
+ (type 'server)
+ (address "some.ntp.server.org")
+ (options `(iburst (version 3) (maxpoll 16) prefer))))
+@end example
+@end table
+@end deftp
+
 @cindex OpenNTPD
 @deffn {Scheme Procedure} openntpd-service-type
 Run the @command{ntpd}, the Network Time Protocol (NTP) daemon, as implemented
 by @uref{http://www.openntpd.org, OpenNTPD}.  The daemon will keep the system
 clock synchronized with that of the given servers.
 
-@example
+@lisp
 (service
  openntpd-service-type
  (openntpd-configuration
@@ -13076,9 +13118,14 @@ clock synchronized with that of the given servers.
   (constraints-from '("https://www.google.com/"))
   (allow-large-adjustment? #t)))
 
-@end example
+@end lisp
 @end deffn
 
+@defvr {Scheme Variable} %openntpd-servers
+This variable is a list of the server addresses defined in
+@var{%ntp-servers}.
+@end defvr
+
 @deftp {Data Type} openntpd-configuration
 @table @asis
 @item @code{openntpd} (default: @code{(file-append openntpd "/sbin/ntpd")})
@@ -13092,9 +13139,9 @@ Specify a list of timedelta sensor devices ntpd should use.  @code{ntpd}
 will listen to each sensor that actually exists and ignore non-existent ones.
 See @uref{https://man.openbsd.org/ntpd.conf, upstream documentation} for more
 information.
-@item @code{server} (default: @var{%ntp-servers})
+@item @code{server} (default: @code{'()})
 Specify a list of IP addresses or hostnames of NTP servers to synchronize to.
-@item @code{servers} (default: @code{'()})
+@item @code{servers} (default: @var{%openntp-servers})
 Specify a list of IP addresses or hostnames of NTP pools to synchronize to.
 @item @code{constraint-from} (default: @code{'()})
 @code{ntpd} can be configured to query the ‘Date’ from trusted HTTPS servers via TLS.
@@ -13126,7 +13173,7 @@ built-in @command{echo} service, as well as an smtp service which
 forwards smtp traffic over ssh to a server @code{smtp-server} behind a
 gateway @code{hostname}:
 
-@example
+@lisp
 (service
  inetd-service-type
  (inetd-configuration
@@ -13148,7 +13195,7 @@ gateway @code{hostname}:
              (arguments
               '("ssh" "-qT" "-i" "/path/to/ssh_key"
                 "-W" "smtp-server:25" "user@@hostname")))))
-@end example
+@end lisp
 
 See below for more details about @code{inetd-configuration}.
 @end deffn
@@ -13284,9 +13331,9 @@ This is the service type for the @uref{https://rsync.samba.org, rsync} daemon,
 The value for this service type is a
 @command{rsync-configuration} record as in this example:
 
-@example
+@lisp
 (service rsync-service-type)
-@end example
+@end lisp
 
 See below for details about @code{rsync-configuration}.
 @end deffn
@@ -13390,7 +13437,7 @@ This is the type for the @uref{http://www.openssh.org, OpenSSH} secure
 shell daemon, @command{sshd}.  Its value must be an
 @code{openssh-configuration} record as in this example:
 
-@example
+@lisp
 (service openssh-service-type
          (openssh-configuration
            (x11-forwarding? #t)
@@ -13398,18 +13445,18 @@ shell daemon, @command{sshd}.  Its value must be an
            (authorized-keys
              `(("alice" ,(local-file "alice.pub"))
                ("bob" ,(local-file "bob.pub"))))))
-@end example
+@end lisp
 
 See below for details about @code{openssh-configuration}.
 
 This service can be extended with extra authorized keys, as in this
 example:
 
-@example
+@lisp
 (service-extension openssh-service-type
                    (const `(("charlie"
                              ,(local-file "charlie.pub")))))
-@end example
+@end lisp
 @end deffn
 
 @deftp {Data Type} openssh-configuration
@@ -13486,12 +13533,12 @@ subsystem request.
 
 The command @command{internal-sftp} implements an in-process SFTP
 server.  Alternately, one can specify the @command{sftp-server} command:
-@example
+@lisp
 (service openssh-service-type
          (openssh-configuration
           (subsystems
            `(("sftp" ,(file-append openssh "/libexec/sftp-server"))))))
-@end example
+@end lisp
 
 @item @code{accepted-environment} (default: @code{'()})
 List of strings describing which environment variables may be exported.
@@ -13504,11 +13551,11 @@ It is set by terminal emulators, which support colors.  You can use it in
 your shell's ressource file to enable colors for the prompt and commands
 if this variable is set.
 
-@example
+@lisp
 (service openssh-service-type
          (openssh-configuration
            (accepted-environment '("COLORTERM"))))
-@end example
+@end lisp
 
 @item @code{authorized-keys} (default: @code{'()})
 @cindex authorized keys, SSH
@@ -13517,13 +13564,13 @@ This is the list of authorized keys.  Each element of the list is a user
 name followed by one or more file-like objects that represent SSH public
 keys.  For example:
 
-@example
+@lisp
 (openssh-configuration
   (authorized-keys
     `(("rekado" ,(local-file "rekado.pub"))
       ("chris" ,(local-file "chris.pub"))
       ("root" ,(local-file "rekado.pub") ,(local-file "chris.pub")))))
-@end example
+@end lisp
 
 @noindent
 registers the specified public keys for user accounts @code{rekado},
@@ -13546,12 +13593,12 @@ is especially useful for elaborate configurations that cannot be expressed
 otherwise.  This configuration, for example, would generally disable root
 logins, but permit them from one specific IP address:
 
-@example
+@lisp
 (openssh-configuration
   (extra-content "\
 Match Address 192.168.0.1
   PermitRootLogin yes"))
-@end example
+@end lisp
 
 @end table
 @end deftp
@@ -13564,10 +13611,10 @@ object.
 For example, to specify a Dropbear service listening on port 1234, add
 this call to the operating system's @code{services} field:
 
-@example
+@lisp
 (dropbear-service (dropbear-configuration
                     (port-number 1234)))
-@end example
+@end lisp
 @end deffn
 
 @deftp {Data Type} dropbear-configuration
@@ -13608,7 +13655,7 @@ This variable is typically used in the @code{hosts-file} field of an
 @code{operating-system} declaration (@pxref{operating-system Reference,
 @file{/etc/hosts}}):
 
-@example
+@lisp
 (use-modules (gnu) (guix))
 
 (operating-system
@@ -13620,7 +13667,7 @@ This variable is typically used in the @code{hosts-file} field of an
     (plain-file "hosts"
                 (string-append (local-host-aliases host-name)
                                %facebook-host-aliases))))
-@end example
+@end lisp
 
 This mechanism can prevent programs running locally, such as Web
 browsers, from accessing Facebook.
@@ -14054,9 +14101,9 @@ system, add a @code{cups-service} to the operating system definition:
 The service type for the CUPS print server.  Its value should be a valid
 CUPS configuration (see below).  To use the default settings, simply
 write:
-@example
+@lisp
 (service cups-service-type)
-@end example
+@end lisp
 @end deffn
 
 The CUPS configuration controls the basic things about your CUPS
@@ -14072,13 +14119,13 @@ support for Epson printers @i{via} the @code{escpr} package and for HP
 printers @i{via} the @code{hplip-minimal} package.  You can do that directly,
 like this (you need to use the @code{(gnu packages cups)} module):
 
-@example
+@lisp
 (service cups-service-type
          (cups-configuration
            (web-interface? #t)
            (extensions
              (list cups-filters escpr hplip-minimal))))
-@end example
+@end lisp
 
 Note: If you wish to use the Qt5 based GUI which comes with the hplip
 package then it is suggested that you install the @code{hplip} package,
@@ -14886,12 +14933,12 @@ For example, if your @code{cupsd.conf} and @code{cups-files.conf} are in
 strings of the same name, you could instantiate a CUPS service like
 this:
 
-@example
+@lisp
 (service cups-service-type
          (opaque-cups-configuration
            (cupsd.conf cupsd.conf)
            (cups-files.conf cups-files.conf)))
-@end example
+@end lisp
 
 
 @node Desktop Services
@@ -15034,7 +15081,7 @@ them by default.  To add GNOME, Xfce or MATE, just @code{cons} them onto
 @code{%desktop-services} in the @code{services} field of your
 @code{operating-system}:
 
-@example
+@lisp
 (use-modules (gnu))
 (use-service-modules desktop)
 (operating-system
@@ -15044,7 +15091,7 @@ them by default.  To add GNOME, Xfce or MATE, just @code{cons} them onto
                    (service xfce-desktop-service)
                    %desktop-services))
   ...)
-@end example
+@end lisp
 
 These desktop environments will then be available as options in the
 graphical login window.
@@ -15313,9 +15360,9 @@ Architecture} (ALSA) system, which generates the @file{/etc/asound.conf}
 configuration file.  The value for this type is a @command{alsa-configuration}
 record as in this example:
 
-@example
+@lisp
 (service alsa-service-type)
-@end example
+@end lisp
 
 See below for details about @code{alsa-configuration}.
 @end deffn
@@ -15401,7 +15448,7 @@ to create a geographic database using the @code{postgis} extension, a user can
 configure the postgresql-service as in this example:
 
 @cindex postgis
-@example
+@lisp
 (use-package-modules databases geo)
 
 (operating-system
@@ -15413,7 +15460,7 @@ configure the postgresql-service as in this example:
     (cons*
       (postgresql-service #:extension-packages (list postgis))
       %base-services)))
-@end example
+@end lisp
 
 Then the extension becomes visible and you can initialise an empty geographic
 database in this way:
@@ -15461,9 +15508,9 @@ Memcached} service, which provides a distributed in memory cache.  The
 value for the service type is a @code{memcached-configuration} object.
 @end defvr
 
-@example
+@lisp
 (service memcached-service-type)
-@end example
+@end lisp
 
 @deftp {Data Type} memcached-configuration
 Data type representing the configuration of memcached.
@@ -15492,9 +15539,9 @@ This is the service type for @uref{https://www.mongodb.com/, MongoDB}.
 The value for the service type is a @code{mongodb-configuration} object.
 @end defvr
 
-@example
+@lisp
 (service mongodb-service-type)
-@end example
+@end lisp
 
 @deftp {Data Type} mongodb-configuration
 Data type representing the configuration of mongodb.
@@ -15565,11 +15612,11 @@ administrator to specify these parameters via a uniform Scheme interface.
 For example, to specify that mail is located at @code{maildir~/.mail},
 one would instantiate the Dovecot service like this:
 
-@example
+@lisp
 (dovecot-service #:config
                  (dovecot-configuration
                   (mail-location "maildir:~/.mail")))
-@end example
+@end lisp
 
 The available configuration parameters follow.  Each parameter
 definition is preceded by its type; for example, @samp{string-list foo}
@@ -16905,11 +16952,11 @@ The contents of the @code{dovecot.conf}, as a string.
 For example, if your @code{dovecot.conf} is just the empty string, you
 could instantiate a dovecot service like this:
 
-@example
+@lisp
 (dovecot-service #:config
                  (opaque-dovecot-configuration
                   (string "")))
-@end example
+@end lisp
 
 @subsubheading OpenSMTPD Service
 
@@ -16918,11 +16965,11 @@ This is the type of the @uref{https://www.opensmtpd.org, OpenSMTPD}
 service, whose value should be an @code{opensmtpd-configuration} object
 as in this example:
 
-@example
+@lisp
 (service opensmtpd-service-type
          (opensmtpd-configuration
            (config-file (local-file "./my-smtpd.conf"))))
-@end example
+@end lisp
 @end deffn
 
 @deftp {Data Type} opensmtpd-configuration
@@ -16952,11 +16999,11 @@ This is the type of the @uref{https://exim.org, Exim} mail transfer
 agent (MTA), whose value should be an @code{exim-configuration} object
 as in this example:
 
-@example
+@lisp
 (service exim-service-type
          (exim-configuration
            (config-file (local-file "./my-exim.conf"))))
-@end example
+@end lisp
 @end deffn
 
 In order to use an @code{exim-service-type} service you must also have a
@@ -17280,11 +17327,11 @@ Defaults to @samp{()}.
 This is the type of the service which provides @code{/etc/aliases},
 specifying how to deliver mail to users on this system.
 
-@example
+@lisp
 (service mail-aliases-service-type
          '(("postmaster" "bob")
            ("bob" "bob@@example.com" "bob@@example2.com")))
-@end example
+@end lisp
 @end deffn
 
 The configuration for a @code{mail-aliases-service-type} service is an
@@ -17307,11 +17354,11 @@ This is the type of the GNU Mailutils IMAP4 Daemon (@pxref{imap4d,,,
 mailutils, GNU Mailutils Manual}), whose value should be an
 @code{imap4d-configuration} object as in this example:
 
-@example
+@lisp
 (service imap4d-service-type
          (imap4d-configuration
            (config-file (local-file "imap4d.conf"))))
-@end example
+@end lisp
 @end deffn
 
 @deftp {Data Type} imap4d-configuration
@@ -17345,7 +17392,7 @@ This is the type for the @uref{https://prosody.im, Prosody XMPP
 communication server}.  Its value must be a @code{prosody-configuration}
 record as in this example:
 
-@example
+@lisp
 (service prosody-service-type
          (prosody-configuration
           (modules-enabled (cons "groups" "mam" %default-modules-enabled))
@@ -17359,7 +17406,7 @@ record as in this example:
            (list
             (virtualhost-configuration
              (domain "example.net"))))))
-@end example
+@end lisp
 
 See below for details about @code{prosody-configuration}.
 
@@ -17747,11 +17794,11 @@ The contents of the @code{prosody.cfg.lua} to use.
 For example, if your @code{prosody.cfg.lua} is just the empty
 string, you could instantiate a prosody service like this:
 
-@example
+@lisp
 (service prosody-service-type
          (opaque-prosody-configuration
           (prosody.cfg.lua "")))
-@end example
+@end lisp
 
 @c end of Prosody auto-generated documentation
 
@@ -17770,9 +17817,9 @@ below).
 To have BitlBee listen on port 6667 on localhost, add this line to your
 services:
 
-@example
+@lisp
 (service bitlbee-service-type)
-@end example
+@end lisp
 @end defvr
 
 @deftp {Data Type} bitlbee-configuration
@@ -17844,7 +17891,7 @@ the server of the @uref{https://mumble.info, Mumble} voice-over-IP
 The service type for the Murmur server.  An example configuration can
 look like this:
 
-@example
+@lisp
 (service murmur-service-type
          (murmur-configuration
           (welcome-text
@@ -17852,7 +17899,7 @@ look like this:
           (cert-required? #t) ;disallow text password logins
           (ssl-cert "/etc/letsencrypt/live/mumble.example.com/fullchain.pem")
           (ssl-key "/etc/letsencrypt/live/mumble.example.com/privkey.pem")))
-@end example
+@end lisp
 
 After reconfiguring your system, you can manually set the murmur @code{SuperUser}
 password with the command that is printed during the activation phase.
@@ -17966,14 +18013,14 @@ Should logged ips be obfuscated to protect the privacy of users.
 @item @code{ssl-cert} (default: @code{#f})
 File name of the SSL/TLS certificate used for encrypted connections.
 
-@example
+@lisp
 (ssl-cert "/etc/letsencrypt/live/example.com/fullchain.pem")
-@end example
+@end lisp
 @item @code{ssl-key} (default: @code{#f})
 Filepath to the ssl private key used for encrypted connections.
-@example
+@lisp
 (ssl-key "/etc/letsencrypt/live/example.com/privkey.pem")
-@end example
+@end lisp
 
 @item @code{ssl-dh-params} (default: @code{#f})
 File name of a PEM-encoded file with Diffie-Hellman parameters
@@ -18047,20 +18094,20 @@ viewing and searching log files.
 The following example will configure the service with default values.
 By default, Tailon can be accessed on port 8080 (@code{http://localhost:8080}).
 
-@example
+@lisp
 (service tailon-service-type)
-@end example
+@end lisp
 
 The following example customises more of the Tailon configuration,
 adding @command{sed} to the list of allowed commands.
 
-@example
+@lisp
 (service tailon-service-type
          (tailon-configuration
            (config-file
              (tailon-configuration-file
                (allowed-commands '("tail" "grep" "awk" "sed"))))))
-@end example
+@end lisp
 
 
 @deftp {Data Type} tailon-configuration
@@ -18076,11 +18123,11 @@ The configuration file to use for Tailon. This can be set to a
 For example, to instead use a local file, the @code{local-file} function
 can be used:
 
-@example
+@lisp
 (service tailon-service-type
          (tailon-configuration
            (config-file (local-file "./my-tailon.conf"))))
-@end example
+@end lisp
 
 @item @code{package} (default: @code{tailon})
 The tailon package to use.
@@ -18136,12 +18183,12 @@ restricted to the credentials provided here. To configure users, use a
 list of pairs, where the first element of the pair is the username, and
 the 2nd element of the pair is the password.
 
-@example
+@lisp
 (tailon-configuration-file
   (http-auth "basic")
   (users     '(("user1" . "password1")
                ("user2" . "password2"))))
-@end example
+@end lisp
 
 @end table
 @end deftp
@@ -18158,11 +18205,11 @@ This is the service type for the
 service,  its value must be a @code{darkstat-configuration} record as in
 this example:
 
-@example
+@lisp
 (service darkstat-service-type
          (darkstat-configuration
            (interface "eno1")))
-@end example
+@end lisp
 @end defvar
 
 @deftp {Data Type} darkstat-configuration
@@ -18202,11 +18249,11 @@ This is the service type for the
 service, its value must be a @code{prometheus-node-exporter-configuration}
 record as in this example:
 
-@example
+@lisp
 (service prometheus-node-exporter-service-type
          (prometheus-node-exporter-configuration
            (web-listen-address ":9100")))
-@end example
+@end lisp
 @end defvar
 
 @deftp {Data Type} prometheus-node-exporter-configuration
@@ -18682,7 +18729,7 @@ Here is a simple operating system declaration with a default configuration of
 the @code{nslcd-service-type} and a Name Service Switch configuration that
 consults the @code{ldap} name service last:
 
-@example
+@lisp
 (use-service-modules authentication)
 (use-modules (gnu system nss))
 ...
@@ -18704,7 +18751,7 @@ consults the @code{ldap} name service last:
       (group    services)
       (netgroup services)
       (gshadow  services)))))
-@end example
+@end lisp
 
 @c %start of generated documentation for nslcd-configuration
 
@@ -19163,19 +19210,19 @@ Service type for the @uref{https://httpd.apache.org/,Apache HTTP} server
 
 A simple example configuration is given below.
 
-@example
+@lisp
 (service httpd-service-type
          (httpd-configuration
            (config
              (httpd-config-file
                (server-name "www.example.com")
                (document-root "/srv/http/www.example.com")))))
-@end example
+@end lisp
 
 Other services can also extend the @code{httpd-service-type} to add to
 the configuration.
 
-@example
+@lisp
 (simple-service 'my-extra-server httpd-service-type
                 (list
                   (httpd-virtualhost
@@ -19183,7 +19230,7 @@ the configuration.
                     (list (string-append
                            "ServerName "www.example.com
                             DocumentRoot \"/srv/http/www.example.com\"")))))
-@end example
+@end lisp
 @end deffn
 
 The details for the @code{httpd-configuration}, @code{httpd-module},
@@ -19240,7 +19287,7 @@ additional configuration.
 For example, in order to handle requests for PHP files, you can use Apache’s
 @code{mod_proxy_fcgi} module along with @code{php-fpm-service-type}:
 
-@example
+@lisp
 (service httpd-service-type
          (httpd-configuration
           (config
@@ -19261,7 +19308,7 @@ For example, in order to handle requests for PHP files, you can use Apache’s
          (php-fpm-configuration
           (socket "/var/run/php-fpm.sock")
           (socket-group "httpd")))
-@end example
+@end lisp
 
 @item @code{server-root} (default: @code{httpd})
 The @code{ServerRoot} in the configuration file, defaults to the httpd
@@ -19315,7 +19362,7 @@ This data type represents a virtualhost configuration block for the httpd servic
 
 These should be added to the extra-config for the httpd-service.
 
-@example
+@lisp
 (simple-service 'my-extra-server httpd-service-type
                 (list
                   (httpd-virtualhost
@@ -19323,7 +19370,7 @@ These should be added to the extra-config for the httpd-service.
                     (list (string-append
                            "ServerName "www.example.com
                             DocumentRoot \"/srv/http/www.example.com\"")))))
-@end example
+@end lisp
 
 @table @asis
 @item @code{addresses-and-ports}
@@ -19344,25 +19391,25 @@ value for this service type is a @code{<nginx-configuration>} record.
 
 A simple example configuration is given below.
 
-@example
+@lisp
 (service nginx-service-type
          (nginx-configuration
            (server-blocks
              (list (nginx-server-configuration
                      (server-name '("www.example.com"))
                      (root "/srv/http/www.example.com"))))))
-@end example
+@end lisp
 
 In addition to adding server blocks to the service configuration
 directly, this service can be extended by other services to add server
 blocks, as in this example:
 
-@example
+@lisp
 (simple-service 'my-extra-server nginx-service-type
                 (list (nginx-server-configuration
                         (root "/srv/http/extra-website")
                         (try-files (list "$uri" "$uri/index.html")))))
-@end example
+@end lisp
 @end deffn
 
 At startup, @command{nginx} has not yet read its configuration file, so
@@ -19398,14 +19445,14 @@ file, the elements should be of type
 The following example would setup NGinx to serve @code{www.example.com}
 from the @code{/srv/http/www.example.com} directory, without using
 HTTPS.
-@example
+@lisp
 (service nginx-service-type
          (nginx-configuration
            (server-blocks
              (list (nginx-server-configuration
                      (server-name '("www.example.com"))
                      (root "/srv/http/www.example.com"))))))
-@end example
+@end lisp
 
 @item @code{upstream-blocks} (default: @code{'()})
 A list of @dfn{upstream blocks} to create in the generated configuration
@@ -19419,7 +19466,7 @@ creates a server configuration with one location configuration, that
 will proxy requests to a upstream configuration, which will handle
 requests with two servers.
 
-@example
+@lisp
 (service
   nginx-service-type
   (nginx-configuration
@@ -19437,7 +19484,7 @@ requests with two servers.
               (name "server-proxy")
               (servers (list "server1.example.com"
                              "server2.example.com")))))))
-@end example
+@end lisp
 
 @item @code{file} (default: @code{#f})
 If a configuration @var{file} is provided, this will be used, rather than
@@ -19475,9 +19522,9 @@ path for a UNIX-domain socket on which the server will accept requests.
 Both address and port, or only address or only port can be specified.
 An address may also be a hostname, for example:
 
-@example
+@lisp
 '("127.0.0.1:8000" "127.0.0.1" "8000" "*:8000" "localhost:8000")
-@end example
+@end lisp
 
 @item @code{server-name} (default: @code{(list 'default)})
 A list of server names this server represents. @code{'default} represents the
@@ -19615,7 +19662,7 @@ VCL syntax.
 For example, to mirror @url{http://www.gnu.org,www.gnu.org} with VCL you
 can do something along these lines:
 
-@example
+@lisp
 (define %gnu-mirror
   (plain-file
    "gnu.vcl"
@@ -19629,7 +19676,7 @@ backend gnu @{ .host = "www.gnu.org"; @}"))
                             (listen '(":80"))
                             (vcl %gnu-mirror)))
                   %base-services)))
-@end example
+@end lisp
 
 The configuration of an already running Varnish instance can be inspected
 and changed using the @command{varnishadm} program.
@@ -19665,7 +19712,7 @@ Service type for Patchwork.
 The following example is an example of a minimal service for Patchwork, for
 the @code{patchwork.example.com} domain.
 
-@example
+@lisp
 (service patchwork-service-type
          (patchwork-configuration
           (domain "patchwork.example.com")
@@ -19685,7 +19732,7 @@ the @code{patchwork.example.com} domain.
             (extra-parameters
             '((mailboxes . ("Patches"))))))))
 
-@end example
+@end lisp
 
 There are three records for configuring the Patchwork service.  The
 @code{<patchwork-configuration>} relates to the configuration for Patchwork
@@ -20004,7 +20051,7 @@ A helper function to quickly add php to an @code{nginx-server-configuration}.
 @end deffn
 
 A simple services setup for nginx with php can look like this:
-@example
+@lisp
 (services (cons* (service dhcp-client-service-type)
                  (service php-fpm-service-type)
                  (service nginx-service-type
@@ -20017,7 +20064,7 @@ A simple services setup for nginx with php can look like this:
                            (ssl-certificate #f)
                            (ssl-certificate-key #f)))
                  %base-services))
-@end example
+@end lisp
 
 @cindex cat-avatar-generator
 The cat avatar generator is a simple service to demonstrate the use of php-fpm
@@ -20035,14 +20082,14 @@ be able to use @code{cache-dir} as its cache directory.
 @end deffn
 
 A simple setup for cat-avatar-generator can look like this:
-@example
+@lisp
 (services (cons* (cat-avatar-generator-service
                   #:configuration
                   (nginx-server-configuration
                     (server-name '("example.com"))))
                  ...
                  %base-services))
-@end example
+@end lisp
 
 @subsubheading Hpcguix-web
 
@@ -20099,7 +20146,7 @@ The hpcguix-web package to use.
 
 A typical hpcguix-web service declaration looks like this:
 
-@example
+@lisp
 (service hpcguix-web-service-type
          (hpcguix-web-configuration
           (specs
@@ -20107,7 +20154,7 @@ A typical hpcguix-web service declaration looks like this:
                (hpcweb-configuration
                 (title-prefix "Guix-HPC - ")
                 (menu '(("/about" "ABOUT"))))))))
-@end example
+@end lisp
 
 @quotation Note
 The hpcguix-web service periodically updates the package list it publishes by
@@ -20167,7 +20214,7 @@ can be found there:
 A service type for the @code{certbot} Let's Encrypt client.  Its value
 must be a @code{certbot-configuration} record as in this example:
 
-@example
+@lisp
 (define %nginx-deploy-hook
   (program-file
    "nginx-deploy-hook"
@@ -20184,7 +20231,7 @@ must be a @code{certbot-configuration} record as in this example:
              (deploy-hook %nginx-deploy-hook))
             (certificate-configuration
              (domains '("bar.example.net")))))))
-@end example
+@end lisp
 
 See below for details about @code{certbot-configuration}.
 @end defvr
@@ -20255,7 +20302,9 @@ all domains will be Subject Alternative Names on the certificate.
 The challenge type that has to be run by certbot.  If @code{#f} is specified,
 default to the HTTP challenge.  If a value is specified, defaults to the
 manual plugin (see @code{authentication-hook}, @code{cleanup-hook} and
-the documentation at @url{https://certbot.eff.org/docs/using.html#hooks}).
+the documentation at @url{https://certbot.eff.org/docs/using.html#hooks}),
+and gives Let's Encrypt permission to log the public IP address of the
+requesting machine.
 
 @item @code{authentication-hook} (default: @code{#f})
 Command to be run in a shell once for each certificate challenge to be
@@ -20766,12 +20815,12 @@ The list of knot-zone-configuration used by this configuration.
 This is the type of the dnsmasq service, whose value should be an
 @code{dnsmasq-configuration} object as in this example:
 
-@example
+@lisp
 (service dnsmasq-service-type
          (dnsmasq-configuration
            (no-resolv? #t)
            (servers '("192.168.1.1"))))
-@end example
+@end lisp
 @end deffn
 
 @deftp {Data Type} dnsmasq-configuration
@@ -20824,9 +20873,9 @@ care of automatically updating DNS entries for service providers such as
 The following example show instantiates the service with its default
 configuration:
 
-@example
+@lisp
 (service ddclient-service-type)
-@end example
+@end lisp
 
 Note that ddclient needs to access credentials that are stored in a
 @dfn{secret file}, by default @file{/etc/ddclient/secrets} (see
@@ -21416,7 +21465,7 @@ and builds the packages from a manifest.  Some of the packages are defined in
 the @code{"custom-packages"} input, which is the equivalent of
 @code{GUIX_PACKAGE_PATH}.
 
-@example
+@lisp
 (define %cuirass-specs
   #~(list
      '((#:name . "my-manifest")
@@ -21447,7 +21496,7 @@ the @code{"custom-packages"} input, which is the equivalent of
 (service cuirass-service-type
          (cuirass-configuration
           (specifications %cuirass-specs)))
-@end example
+@end lisp
 
 While information related to build jobs is located directly in the
 specifications, global settings for the @command{cuirass} process are
@@ -21535,9 +21584,9 @@ source is detected.  More information can be found at
 The service type for the TLP tool.  Its value should be a valid
 TLP configuration (see below).  To use the default settings, simply
 write:
-@example
+@lisp
 (service tlp-service-type)
-@end example
+@end lisp
 @end deffn
 
 By default TLP does not need much configuration but most TLP parameters
@@ -22065,12 +22114,12 @@ of clients.
 The following example shows how one might run @code{mpd} as user
 @code{"bob"} on port @code{6666}.  It uses pulseaudio for output.
 
-@example
+@lisp
 (service mpd-service-type
          (mpd-configuration
           (user "bob")
           (port "6666")))
-@end example
+@end lisp
 
 @defvr {Scheme Variable} mpd-service-type
 The service type for @command{mpd}
@@ -22124,12 +22173,12 @@ and performs required management tasks for virtualized guests.
 This is the type of the @uref{https://libvirt.org, libvirt daemon}.
 Its value must be a @code{libvirt-configuration}.
 
-@example
+@lisp
 (service libvirt-service-type
          (libvirt-configuration
           (unix-sock-group "libvirt")
           (tls-port "16555")))
-@end example
+@end lisp
 @end deffn
 
 @c Auto-generated with (generate-libvirt-documentation)
@@ -22690,11 +22739,11 @@ itself upon receiving @code{SIGUSR1}, to allow live upgrades without downtime.
 This is the type of the virtlog daemon.
 Its value must be a @code{virtlog-configuration}.
 
-@example
+@lisp
 (service virtlog-service-type
          (virtlog-configuration
           (max-clients 1000)))
-@end example
+@end lisp
 @end deffn
 
 @deftypevr {@code{virtlog-configuration} parameter} integer log-level
@@ -22832,11 +22881,11 @@ Its value must be a @code{qemu-binfmt-configuration} object, which
 specifies the QEMU package to use as well as the architecture we want to
 emulated:
 
-@example
+@lisp
 (service qemu-binfmt-service-type
          (qemu-binfmt-configuration
            (platforms (lookup-qemu-platforms "arm" "aarch64" "mips64el"))))
-@end example
+@end lisp
 
 In this example, we enable transparent emulation for the ARM and aarch64
 platforms.  Running @code{herd stop qemu-binfmt} turns it off, and
@@ -22862,12 +22911,12 @@ that you can transparently build programs for another architecture.
 For example, let's suppose you're on an x86_64 machine and you have this
 service:
 
-@example
+@lisp
 (service qemu-binfmt-service-type
          (qemu-binfmt-configuration
            (platforms (lookup-qemu-platforms "arm"))
            (guix-support? #t)))
-@end example
+@end lisp
 
 You can run:
 
@@ -23018,7 +23067,7 @@ Compute an @code{nginx-location-configuration} that corresponds to the
 given Git http configuration.  An example nginx service definition to
 serve the default @file{/srv/git} over HTTPS might be:
 
-@example
+@lisp
 (service nginx-service-type
          (nginx-configuration
           (server-blocks
@@ -23034,7 +23083,7 @@ serve the default @file{/srv/git} over HTTPS might be:
               (list
                (git-http-nginx-location-configuration
                 (git-http-configuration (uri-path "/"))))))))))
-@end example
+@end lisp
 
 This example assumes that you are using Let's Encrypt to get your TLS
 certificate.  @xref{Certificate Services}.  The default @code{certbot}
@@ -23053,9 +23102,9 @@ repositories written in C.
 The following example will configure the service with default values.
 By default, Cgit can be accessed on port 80 (@code{http://localhost:80}).
 
-@example
+@lisp
 (service cgit-service-type)
-@end example
+@end lisp
 
 The @code{file-object} type designates either a file-like object
 (@pxref{G-Expressions, file-like objects}) or a string.
@@ -23988,11 +24037,11 @@ The contents of the @code{cgitrc}, as a string.
 For example, if your @code{cgitrc} is just the empty string, you
 could instantiate a cgit service like this:
 
-@example
+@lisp
 (service cgit-service-type
          (opaque-cgit-configuration
           (cgitrc "")))
-@end example
+@end lisp
 
 @subsubheading Gitolite Service
 
@@ -24007,13 +24056,13 @@ configuration of the permissions for the users on the repositories.
 The following example will configure Gitolite using the default @code{git}
 user, and the provided SSH public key.
 
-@example
+@lisp
 (service gitolite-service-type
          (gitolite-configuration
            (admin-pubkey (plain-file
                            "yourname.pub"
                            "ssh-rsa AAAA... guix@@example.com"))))
-@end example
+@end lisp
 
 Gitolite is configured through a special admin repository which you can clone,
 for example, if you setup Gitolite on @code{example.com}, you would run the
@@ -24056,9 +24105,9 @@ within the gitolite-admin repository.
 
 To specify the SSH key as a string, use the @code{plain-file} function.
 
-@example
+@lisp
 (plain-file "yourname.pub" "ssh-rsa AAAA... guix@@example.com")
-@end example
+@end lisp
 
 @end table
 @end deftp
@@ -24103,9 +24152,9 @@ Service type for the wesnothd service.  Its value must be a
 @code{wesnothd-configuration} object.  To run wesnothd in the default
 configuration, instantiate it as:
 
-@example
+@lisp
 (service wesnothd-service-type)
-@end example
+@end lisp
 @end defvar
 
 @deftp {Data Type} wesnothd-configuration
@@ -24133,9 +24182,9 @@ read and identify fingerprints via a fingerprint sensor.
 The service type for @command{fprintd}, which provides the fingerprint
 reading capability.
 
-@example
+@lisp
 (service fprintd-service-type)
-@end example
+@end lisp
 @end defvr
 
 @cindex sysctl
@@ -24149,11 +24198,11 @@ The service type for @command{sysctl}, which modifies kernel parameters
 under @file{/proc/sys/}.  To enable IPv4 forwarding, it can be
 instantiated as:
 
-@example
+@lisp
 (service sysctl-service-type
          (sysctl-configuration
            (settings '(("net.ipv4.ip_forward" . "1")))))
-@end example
+@end lisp
 @end defvr
 
 @deftp {Data Type} sysctl-configuration
@@ -24182,9 +24231,9 @@ Service type for the @command{pcscd} service.  Its value must be a
 @code{pcscd-configuration} object.  To run pcscd in the default
 configuration, instantiate it as:
 
-@example
+@lisp
 (service pcscd-service-type)
-@end example
+@end lisp
 @end defvr
 
 @deftp {Data Type} pcscd-configuration
@@ -24339,7 +24388,7 @@ Dictionary of English using the @code{gcide} package.
 
 The following is an example @code{dicod-service} configuration.
 
-@example
+@lisp
 (dicod-service #:config
   (dicod-configuration
    (handlers (list (dicod-handler
@@ -24353,7 +24402,7 @@ The following is an example @code{dicod-service} configuration.
                      (handler "wordnet")
                      (options '("database=wn")))
                     %dicod-database:gcide))))
-@end example
+@end lisp
 
 @cindex Docker
 @subsubheading Docker Service
@@ -24453,7 +24502,7 @@ This is the type of the service that runs build daemon of the
 @url{https://nixos.org/nix/, Nix} package manager.  Here is an example showing
 how to use it:
 
-@example
+@lisp
 (use-modules (gnu))
 (use-service-modules nix)
 (use-package-modules package-management)
@@ -24465,7 +24514,7 @@ how to use it:
 
   (services (append (list (service nix-service-type))
                     %base-services)))
-@end example
+@end lisp
 
 After @command{guix system reconfigure} configure Nix for your user:
 
@@ -24620,7 +24669,7 @@ As an example, the declaration below configures the NSS to use the
 back-end}, which supports host name lookups over multicast DNS (mDNS)
 for host names ending in @code{.local}:
 
-@example
+@lisp
 (name-service-switch
    (hosts (list %files    ;first, check /etc/hosts
 
@@ -24642,7 +24691,7 @@ for host names ending in @code{.local}:
                 ;; Finally, try with the "full" 'mdns'.
                 (name-service
                   (name "mdns")))))
-@end example
+@end lisp
 
 Do not worry: the @code{%mdns-host-lookup-nss} variable (see below)
 contains this configuration, so you will not have to type it if all you
@@ -24723,10 +24772,10 @@ An action specified using the @code{lookup-specification} macro
 (@pxref{Actions in the NSS configuration,,, libc, The GNU C Library
 Reference Manual}).  For example:
 
-@example
+@lisp
 (lookup-specification (unavailable => continue)
                       (success => return))
-@end example
+@end lisp
 @end table
 @end deftp
 
@@ -24750,11 +24799,11 @@ most use cases.  For example, assuming you need the @code{megaraid_sas}
 module in addition to the default modules to be able to access your root
 file system, you would write:
 
-@example
+@lisp
 (operating-system
   ;; @dots{}
   (initrd-modules (cons "megaraid_sas" %base-initrd-modules)))
-@end example
+@end lisp
 
 @defvr {Scheme Variable} %base-initrd-modules
 This is the list of kernel modules included in the initrd by default.
@@ -24772,14 +24821,14 @@ For example, if you want to add a bunch of kernel modules to be loaded
 at boot time, you can define the @code{initrd} field of the operating
 system declaration like this:
 
-@example
+@lisp
 (initrd (lambda (file-systems . rest)
           ;; Create a standard initrd but set up networking
           ;; with the parameters QEMU expects by default.
           (apply base-initrd file-systems
                  #:qemu-networking? #t
                  rest)))
-@end example
+@end lisp
 
 The @code{base-initrd} procedure also handles common use cases that
 involves using the system as a QEMU guest, or as a ``live'' system with
@@ -25031,13 +25080,13 @@ Should you want to list additional boot menu entries @i{via} the
 boot another distro (hard to imagine!), you can define a menu entry
 along these lines:
 
-@example
+@lisp
 (menu-entry
   (label "The Other Distro")
   (linux "/boot/old/vmlinux-2.6.32")
   (linux-arguments '("root=/dev/sda2"))
   (initrd "/boot/old/initrd"))
-@end example
+@end lisp
 
 Details below.
 
@@ -25052,9 +25101,9 @@ The label to show in the menu---e.g., @code{"GNU"}.
 @item @code{linux}
 The Linux kernel image to boot, for example:
 
-@example
+@lisp
 (file-append linux-libre "/bzImage")
-@end example
+@end lisp
 
 For GRUB, it is also possible to specify a device explicitly in the
 file path using GRUB's device naming convention (@pxref{Naming
@@ -25590,7 +25639,7 @@ guix deploy @var{file}
 Such an invocation will deploy the machines that the code within @var{file}
 evaluates to.  As an example, @var{file} might contain a definition like this:
 
-@example
+@lisp
 ;; This is a Guix deployment of a "bare bones" setup, with
 ;; no X11 display server, to a machine with an SSH daemon
 ;; listening on localhost:2222. A configuration such as this
@@ -25630,7 +25679,7 @@ evaluates to.  As an example, @var{file} might contain a definition like this:
                        (user "alice")
                        (identity "./id_rsa")
                        (port 2222)))))
-@end example
+@end lisp
 
 The file should evaluate to a list of @var{machine} objects.  This example,
 upon being deployed, will create a new generation on the remote system
@@ -25919,7 +25968,7 @@ A @dfn{service type} is a node in the DAG described above.  Let us start
 with a simple example, the service type for the Guix build daemon
 (@pxref{Invoking guix-daemon}):
 
-@example
+@lisp
 (define guix-service-type
   (service-type
    (name 'guix)
@@ -25928,7 +25977,7 @@ with a simple example, the service type for the Guix build daemon
           (service-extension account-service-type guix-accounts)
           (service-extension activation-service-type guix-activation)))
    (default-value (guix-configuration))))
-@end example
+@end lisp
 
 @noindent
 It defines three things:
@@ -25972,12 +26021,12 @@ booted.
 
 A service of this type is instantiated like this:
 
-@example
+@lisp
 (service guix-service-type
          (guix-configuration
            (build-accounts 5)
            (use-substitutes? #f)))
-@end example
+@end lisp
 
 The second argument to the @code{service} form is a value representing
 the parameters of this specific service instance.
@@ -25986,9 +26035,9 @@ information about the @code{guix-configuration} data type.  When the
 value is omitted, the default value specified by
 @code{guix-service-type} is used:
 
-@example
+@lisp
 (service guix-service-type)
-@end example
+@end lisp
 
 @code{guix-service-type} is quite simple because it extends other
 services but is not extensible itself.
@@ -25997,7 +26046,7 @@ services but is not extensible itself.
 
 The service type for an @emph{extensible} service looks like this:
 
-@example
+@lisp
 (define udev-service-type
   (service-type (name 'udev)
                 (extensions
@@ -26011,7 +26060,7 @@ The service type for an @emph{extensible} service looks like this:
                              (udev-configuration
                               (udev udev)   ;the udev package to use
                               (rules (append initial-rules rules)))))))))
-@end example
+@end lisp
 
 This is the service type for the
 @uref{https://wiki.gentoo.org/wiki/Project:Eudev, eudev device
@@ -26068,17 +26117,17 @@ raised.
 
 For instance, this:
 
-@example
+@lisp
 (service openssh-service-type)
-@end example
+@end lisp
 
 @noindent
 is equivalent to this:
 
-@example
+@lisp
 (service openssh-service-type
          (openssh-configuration))
-@end example
+@end lisp
 
 In both cases the result is an instance of @code{openssh-service-type}
 with the default configuration.
@@ -26099,7 +26148,7 @@ parameters.
 
 Here is an example of how a service is created and manipulated:
 
-@example
+@lisp
 (define s
   (service nginx-service-type
            (nginx-configuration
@@ -26113,7 +26162,7 @@ Here is an example of how a service is created and manipulated:
 
 (eq? (service-kind s) nginx-service-type)
 @result{} #t
-@end example
+@end lisp
 
 The @code{modify-services} form provides a handy way to change the
 parameters of some of the services of a list such as
@@ -26215,10 +26264,10 @@ service is an instance.
 For example, this extends mcron (@pxref{Scheduled Job Execution}) with
 an additional job:
 
-@example
+@lisp
 (simple-service 'my-mcron-job mcron-service-type
                 #~(job '(next-hour (3)) "guix gc -F 2G"))
-@end example
+@end lisp
 @end deffn
 
 At the core of the service abstraction lies the @code{fold-services}
@@ -26253,9 +26302,9 @@ The type of the @file{/etc} service.  This service is used to create
 files under @file{/etc} and can be extended by
 passing it name/file tuples such as:
 
-@example
+@lisp
 (list `("issue" ,(plain-file "issue" "Welcome!\n")))
-@end example
+@end lisp
 
 In this example, the effect would be to add an @file{/etc/issue} file
 pointing to the given file.
@@ -26391,7 +26440,7 @@ shepherd, The GNU Shepherd Manual}).
 The following example defines an action called @code{say-hello} that kindly
 greets the user:
 
-@example
+@lisp
 (shepherd-action
   (name 'say-hello)
   (documentation "Say hi!")
@@ -26399,7 +26448,7 @@ greets the user:
                  (format #t "Hello, friend! arguments: ~s\n"
                          args)
                  #t)))
-@end example
+@end lisp
 
 Assuming this action is added to the @code{example} service, then you can do:
 
@@ -26606,13 +26655,13 @@ Bash, say @code{bash-fixed}, in the usual way (@pxref{Defining
 Packages}).  Then, the original package definition is augmented with a
 @code{replacement} field pointing to the package containing the bug fix:
 
-@example
+@lisp
 (define bash
   (package
     (name "bash")
     ;; @dots{}
     (replacement bash-fixed)))
-@end example
+@end lisp
 
 From there on, any package depending directly or indirectly on Bash---as
 reported by @command{guix gc --requisites} (@pxref{Invoking guix
diff --git a/etc/guix-daemon.cil.in b/etc/guix-daemon.cil.in
index c0c82d8fbb..e0c9113498 100644
--- a/etc/guix-daemon.cil.in
+++ b/etc/guix-daemon.cil.in
@@ -277,9 +277,5 @@
            file (system_u object_r guix_daemon_exec_t (low low)))
   (filecon "@storedir@/.+-(guix-.+|profile)/bin/guix-daemon"
            file (system_u object_r guix_daemon_exec_t (low low)))
-  (filecon "@storedir@/.+-(guix-.+|profile)/libexec/guix-authenticate"
-           file (system_u object_r guix_daemon_exec_t (low low)))
-  (filecon "@storedir@/.+-(guix-.+|profile)/libexec/guix/(.*)?"
-           any (system_u object_r guix_daemon_exec_t (low low)))
   (filecon "@guix_localstatedir@/guix/daemon-socket/socket"
            any (system_u object_r guix_daemon_socket_t (low low))))
diff --git a/gnu/build/linux-container.scm b/gnu/build/linux-container.scm
index 6ccb924861..87695c98fd 100644
--- a/gnu/build/linux-container.scm
+++ b/gnu/build/linux-container.scm
@@ -299,8 +299,10 @@ delete it when leaving the dynamic extent of this call."
         (false-if-exception (delete-file-recursively tmp-dir))))))
 
 (define* (call-with-container mounts thunk #:key (namespaces %namespaces)
-                              (host-uids 1) (guest-uid 0) (guest-gid 0))
-  "Run THUNK in a new container process and return its exit status.
+                              (host-uids 1) (guest-uid 0) (guest-gid 0)
+                              (process-spawned-hook (const #t)))
+  "Run THUNK in a new container process and return its exit status; call
+PROCESS-SPAWNED-HOOK with the PID of the new process that has been spawned.
 MOUNTS is a list of <file-system> objects that specify file systems to mount
 inside the container.  NAMESPACES is a list of symbols corresponding to
 the identifiers for Linux namespaces: mnt, ipc, uts, pid, user, and net.  By
@@ -329,6 +331,7 @@ load path must be adjusted as needed."
            (false-if-exception
             (kill pid SIGKILL))))
 
+       (process-spawned-hook pid)
        (match (waitpid pid)
          ((_ . status) status))))))
 
diff --git a/gnu/build/shepherd.scm b/gnu/build/shepherd.scm
index cf68f2108b..b32765ed5e 100644
--- a/gnu/build/shepherd.scm
+++ b/gnu/build/shepherd.scm
@@ -67,16 +67,10 @@
           (file-system-mapping
            (source "/etc/group") (target source))))
 
-  (define nscd-socket
-    (file-system-mapping
-     (source "/var/run/nscd") (target source)
-     (writable? #t)))
-
   (append (cons (tmpfs "/tmp") %container-file-systems)
           (let ((mappings `(,@(if (memq 'net namespaces)
                                   '()
-                                  (cons nscd-socket
-                                        %network-file-mappings))
+                                  %network-file-mappings)
                             ,@(if (and (memq 'mnt namespaces)
                                        (not (memq 'user namespaces)))
                                   accounts
diff --git a/gnu/local.mk b/gnu/local.mk
index ce4510ae4a..63d55c5018 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -743,6 +743,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/clementine-use-openssl.patch		\
   %D%/packages/patches/clisp-remove-failing-test.patch		\
   %D%/packages/patches/clucene-pkgconfig.patch			\
+  %D%/packages/patches/cmake-curl-certificates.patch		\
   %D%/packages/patches/coda-use-system-libs.patch		\
   %D%/packages/patches/combinatorial-blas-awpm.patch		\
   %D%/packages/patches/combinatorial-blas-io-fix.patch		\
@@ -1399,7 +1400,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/wavpack-CVE-2018-6767.patch		\
   %D%/packages/patches/wavpack-CVE-2018-7253.patch		\
   %D%/packages/patches/wavpack-CVE-2018-7254.patch		\
-  %D%/packages/patches/weechat-python.patch			\
   %D%/packages/patches/wicd-bitrate-none-fix.patch		\
   %D%/packages/patches/wicd-get-selected-profile-fix.patch	\
   %D%/packages/patches/wicd-urwid-1.3.patch			\
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index 3e75b73dcb..2e072deed7 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -2725,7 +2725,7 @@ tool for remote execution and deployment.")
 (define-public neofetch
   (package
     (name "neofetch")
-    (version "6.0.0")
+    (version "6.1.0")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -2733,7 +2733,7 @@ tool for remote execution and deployment.")
                     (commit version)))
               (sha256
                (base32
-                "0j0r40llyry1sgc6p9wd7jrpydps2lnj4rwajjp37697g2bik89i"))))
+                "022xzn9jk18k2f4b6011d8jk5nbl84i3mw3inlz4q52p2hvk8fch"))))
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f                      ; there are no tests
diff --git a/gnu/packages/algebra.scm b/gnu/packages/algebra.scm
index fb9e78bf92..02b4d4ca21 100644
--- a/gnu/packages/algebra.scm
+++ b/gnu/packages/algebra.scm
@@ -1435,7 +1435,7 @@ of M4RI from F_2 to F_{2^e}.")
 (define-public eclib
   (package
     (name "eclib")
-    (version "20190226")
+    (version "20190909")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -1444,7 +1444,7 @@ of M4RI from F_2 to F_{2^e}.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1910np1xzyjzszay24xn4b81qhpsvhp5aix9vdpknplni2mq8kwb"))))
+                "1gw27lqc3f525n8qdcmr2nyn16y9g10z9f6dnmckyyxcdzvhq35n"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("autoconf" ,autoconf)
diff --git a/gnu/packages/audio.scm b/gnu/packages/audio.scm
index 2bd07cb01d..e1d7412bfe 100644
--- a/gnu/packages/audio.scm
+++ b/gnu/packages/audio.scm
@@ -3195,24 +3195,28 @@ with support for HD extensions.")
 (define-public bs1770gain
   (package
     (name "bs1770gain")
-    (version "0.5.2")
+    (version "0.6.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://sourceforge/bs1770gain/bs1770gain/"
                            version "/bs1770gain-" version ".tar.gz"))
        (sha256
-        (base32
-         "1p6yz5q7czyf9ard65sp4kawdlkg40cfscr3b24znymmhs3p7rbk"))
+        (base32 "0nnqixvw3x7i22nsr54n4bgm35z9nh3d9qj5s75cfd3ajjsjndyh"))
        (modules '((guix build utils)))
        (snippet
         '(begin
            ;; XXX
-           (substitute* "bs1770gain/bs1770gain.c"
-             (("\"N.*\"") "\"\""))
-           (substitute* "configure"
-             (("URL=.*$")
-              "https://manpages.debian.org/sid/bs1770gain/bs1770gain.1.en.html\n"))))))
+           (substitute* "libbg/bgx.c"
+             (("#define BS.* ") "#define BS ")
+             (("BS.*NO?.*N.*S.*E.*N.*SE?") "NO")
+             (("\"( #|N).*\"") "\"\""))
+           (substitute* (list "config.h"
+                              "configure.ac"
+                              "configure")
+             (("https?://bs1770gain[^/]*/")
+              "https://manpages.debian.org/sid/bs1770gain/bs1770gain.1.en.html"))
+           #t))))
     (build-system gnu-build-system)
     (inputs `(("ffmpeg" ,ffmpeg)
               ("sox" ,sox)))
diff --git a/gnu/packages/authentication.scm b/gnu/packages/authentication.scm
index 70f2a8c103..d995ef7e85 100644
--- a/gnu/packages/authentication.scm
+++ b/gnu/packages/authentication.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -18,10 +19,14 @@
 
 (define-module (gnu packages authentication)
   #:use-module (gnu packages)
+  #:use-module (gnu packages autotools)
+  #:use-module (gnu packages documentation)
   #:use-module (gnu packages linux)
   #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages security-token)
   #:use-module (guix build-system gnu)
   #:use-module (guix download)
+  #:use-module (guix git-download)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages))
 
@@ -86,3 +91,39 @@ Supported technologies include the event-based @dfn{HOTP} algorithm (RFC4226)
 and the time-based @dfn{TOTP} algorithm (RFC6238).")
     (license (list license:lgpl2.1+     ; the libraries (liboath/ & libpskc/)
                    license:gpl3+))))    ; the tools (everything else)
+
+(define-public yubico-pam
+  (let ((commit "b5bd00db81e0e0e0ecced65c684080bb56ddc35b")
+        (revision "0"))
+    (package
+      (name "yubico-pam")
+      (version (git-version "2.26" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/Yubico/yubico-pam.git")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "10dq8dqi3jldllj6p8r9hldx9sank9n82c44w8akxrs1vli6nj3m"))))
+      (build-system gnu-build-system)
+      (arguments
+       ;; The pam_test fails because ykclient fails to build a Curl handle.
+       '(#:make-flags '("TESTS=util_test")))
+      (inputs
+       `(("linux-pam" ,linux-pam)
+         ("libyubikey" ,libyubikey)
+         ("ykclient" ,ykclient)
+         ("yubikey-personalization" ,yubikey-personalization)))
+      (native-inputs
+       `(("autoconf" ,autoconf)
+         ("automake" ,automake)
+         ("libtool" ,libtool)
+         ("asciidoc" ,asciidoc)
+         ("pkg-config" ,pkg-config)))
+      (home-page "https://developers.yubico.com/yubico-pam")
+      (synopsis "Yubico pluggable authentication module")
+      (description "The Yubico PAM module provides an easy way to integrate the
+YubiKey into your existing user authentication infrastructure.")
+      (license license:bsd-2))))
diff --git a/gnu/packages/bioconductor.scm b/gnu/packages/bioconductor.scm
index 37cd51d16c..7ca6788dd8 100644
--- a/gnu/packages/bioconductor.scm
+++ b/gnu/packages/bioconductor.scm
@@ -50,21 +50,14 @@
     (version "1.4.0")
     (source (origin
               (method url-fetch)
-              ;; We cannot use bioconductor-uri here because this tarball is
-              ;; located under "data/annotation/" instead of "bioc/".
-              (uri (string-append "https://www.bioconductor.org/packages/"
-                                  "release/data/annotation/src/contrib/"
-                                  "BSgenome.Celegans.UCSC.ce6_"
-                                  version ".tar.gz"))
+              (uri (bioconductor-uri "BSgenome.Celegans.UCSC.ce6"
+                                     version 'annotation))
               (sha256
                (base32
                 "0mqzb353xv2c3m3vkb315dkmnxkgczp7ndnknyhpgjlybyf715v9"))))
     (properties
      `((upstream-name . "BSgenome.Celegans.UCSC.ce6")))
     (build-system r-build-system)
-    ;; As this package provides little more than a very large data file it
-    ;; doesn't make sense to build substitutes.
-    (arguments `(#:substitutable? #f))
     (propagated-inputs
      `(("r-bsgenome" ,r-bsgenome)))
     (home-page
@@ -817,6 +810,28 @@ annotations.")
 Disease Ontology.")
     (license license:artistic2.0)))
 
+(define-public r-pfam-db
+  (package
+    (name "r-pfam-db")
+    (version "3.8.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "PFAM.db" version 'annotation))
+       (sha256
+        (base32
+         "0rn1arzzcniy3yyc4yc44vn40g0cqss37dhwnvsgxpfayqq1k59s"))))
+    (properties `((upstream-name . "PFAM.db")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-annotationdbi" ,r-annotationdbi)))
+    (home-page "https://bioconductor.org/packages/PFAM.db")
+    (synopsis "Set of protein ID mappings for PFAM")
+    (description
+     "This package provides a set of protein ID mappings for PFAM, assembled
+using data from public repositories.")
+    (license license:artistic2.0)))
+
 
 ;;; Experiment data
 
@@ -942,6 +957,29 @@ jointly normalized data that are available here.  The data are presented in
 the form of an @code{exprSet} object.")
     (license license:artistic2.0)))
 
+(define-public r-affydata
+  (package
+    (name "r-affydata")
+    (version "1.32.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "affydata" version 'experiment))
+       (sha256
+        (base32
+         "1l9qhmjqgbrdl9cmd74rlnvmvr6mslbmckb83n0211whp2i0b7h5"))))
+    (properties `((upstream-name . "affydata")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-affy" ,r-affy)))
+    (home-page "https://bioconductor.org/packages/affydata/")
+    (synopsis "Affymetrix data for demonstration purposes")
+    (description
+     "This package provides example datasets that represent 'real world
+examples' of Affymetrix data, unlike the artificial examples included in the
+package @code{affy}.")
+    (license license:gpl2+)))
+
 
 ;;; Packages
 
@@ -965,6 +1003,147 @@ the form of an @code{exprSet} object.")
 packages.")
     (license license:artistic2.0)))
 
+(define-public r-affycomp
+  (package
+    (name "r-affycomp")
+    (version "1.60.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "affycomp" version))
+       (sha256
+        (base32
+         "1nijqljg5r3qj1y6an0i58sby76hqacj3a3nvainxic4n5wlzh0n"))))
+    (properties `((upstream-name . "affycomp")))
+    (build-system r-build-system)
+    (propagated-inputs `(("r-biobase" ,r-biobase)))
+    (home-page "https://bioconductor.org/packages/affycomp/")
+    (synopsis "Graphics toolbox for assessment of Affymetrix expression measures")
+    (description
+     "The package contains functions that can be used to compare expression
+measures for Affymetrix Oligonucleotide Arrays.")
+    (license license:gpl2+)))
+
+(define-public r-affycompatible
+  (package
+    (name "r-affycompatible")
+    (version "1.44.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "AffyCompatible" version))
+       (sha256
+        (base32
+         "1zi96qa6vkgwvvy5cn6c3p1kbfsaz74zsw2kjxarz5qs744f0xvs"))))
+    (properties
+     `((upstream-name . "AffyCompatible")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-biostrings" ,r-biostrings)
+       ("r-rcurl" ,r-rcurl)
+       ("r-xml" ,r-xml)))
+    (home-page "https://bioconductor.org/packages/AffyCompatible/")
+    (synopsis "Work with Affymetrix GeneChip files")
+    (description
+     "This package provides an interface to Affymetrix chip annotation and
+sample attribute files.  The package allows an easy way for users to download
+and manage local data bases of Affynmetrix NetAffx annotation files.  It also
+provides access to @dfn{GeneChip Operating System} (GCOS) and @dfn{GeneChip
+Command Console} (AGCC)-compatible sample annotation files.")
+    (license license:artistic2.0)))
+
+(define-public r-affycontam
+  (package
+    (name "r-affycontam")
+    (version "1.42.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "affyContam" version))
+       (sha256
+        (base32
+         "0nzk1cm26rhmym753wyhn35hqnz5lvavi3i5qfgdvhxgjy3m1jgp"))))
+    (properties `((upstream-name . "affyContam")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-affy" ,r-affy)
+       ("r-affydata" ,r-affydata)
+       ("r-biobase" ,r-biobase)))
+    (home-page "https://bioconductor.org/packages/affyContam/")
+    (synopsis "Structured corruption of Affymetrix CEL file data")
+    (description
+     "Microarray quality assessment is a major concern of microarray analysts.
+This package provides some simple approaches to in silico creation of quality
+problems in CEL-level data to help evaluate performance of quality metrics.")
+    (license license:artistic2.0)))
+
+(define-public r-affycoretools
+  (package
+    (name "r-affycoretools")
+    (version "1.56.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "affycoretools" version))
+       (sha256
+        (base32
+         "17dxpzhwwdwnxkdpmyjwdnacg41hw60mlc71w4nzlvs28sfsy09s"))))
+    (properties `((upstream-name . "affycoretools")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-affy" ,r-affy)
+       ("r-annotationdbi" ,r-annotationdbi)
+       ("r-biobase" ,r-biobase)
+       ("r-biocgenerics" ,r-biocgenerics)
+       ("r-dbi" ,r-dbi)
+       ("r-edger" ,r-edger)
+       ("r-gcrma" ,r-gcrma)
+       ("r-ggplot2" ,r-ggplot2)
+       ("r-gostats" ,r-gostats)
+       ("r-gplots" ,r-gplots)
+       ("r-hwriter" ,r-hwriter)
+       ("r-lattice" ,r-lattice)
+       ("r-limma" ,r-limma)
+       ("r-oligoclasses" ,r-oligoclasses)
+       ("r-reportingtools" ,r-reportingtools)
+       ("r-rsqlite" ,r-rsqlite)
+       ("r-s4vectors" ,r-s4vectors)
+       ("r-xtable" ,r-xtable)))
+    (home-page "https://bioconductor.org/packages/affycoretools/")
+    (synopsis "Functions for analyses with Affymetrix GeneChips")
+    (description
+     "This package provides various wrapper functions that have been written
+to streamline the more common analyses that a Biostatistician might see.")
+    (license license:artistic2.0)))
+
+(define-public r-affxparser
+  (package
+    (name "r-affxparser")
+    (version "1.56.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "affxparser" version))
+       (sha256
+        (base32
+         "1jv7k9pn4c7szi3ma2f2xsd58pkrkvjpk5wra73r6kc607qgrv33"))))
+    (properties `((upstream-name . "affxparser")))
+    (build-system r-build-system)
+    (home-page "https://github.com/HenrikBengtsson/affxparser")
+    (synopsis "Affymetrix File Parsing SDK")
+    (description
+     "This is a package for parsing Affymetrix files (CDF, CEL, CHP, BPMAP,
+BAR).  It provides methods for fast and memory efficient parsing of Affymetrix
+files using the Affymetrix' Fusion SDK.  Both ASCII- and binary-based files
+are supported.  Currently, there are methods for reading @dfn{chip definition
+file} (CDF) and a @dfn{cell intensity file} (CEL).  These files can be read
+either in full or in part.  For example, probe signals from a few probesets
+can be extracted very quickly from a set of CEL files into a convenient list
+structure.")
+    ;; The Fusion SDK contains files under GPLv2 and LGPLv2.1.  The R code is
+    ;; under LGPLv2+.
+    (license (list license:lgpl2.0+ license:lgpl2.1 license:gpl2))))
+
 (define-public r-annotate
   (package
     (name "r-annotate")
@@ -1013,14 +1192,14 @@ the Human Protein Atlas project.")
 (define-public r-regioner
   (package
     (name "r-regioner")
-    (version "1.16.2")
+    (version "1.16.4")
     (source
      (origin
        (method url-fetch)
        (uri (bioconductor-uri "regioneR" version))
        (sha256
         (base32
-         "1b8ybx4wcxlqw9nvajawsf0lqaqn9v89rxcawg4g3dbzlfssfc5q"))))
+         "0xzk057h6nkr3rvd412prxgnkpq625b90laj1kwb0i5q8j5ch760"))))
     (properties `((upstream-name . "regioneR")))
     (build-system r-build-system)
     (propagated-inputs
@@ -1039,6 +1218,54 @@ customizable permutation tests to assess the association between genomic
 region sets and other genomic features.")
     (license license:artistic2.0)))
 
+(define-public r-reportingtools
+  (package
+    (name "r-reportingtools")
+    (version "2.24.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "ReportingTools" version))
+       (sha256
+        (base32
+         "16ska7mlacka0xi8x2icy8v42vaxccb3a1x73szmfvcrwr592qsc"))))
+    (properties
+     `((upstream-name . "ReportingTools")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-annotate" ,r-annotate)
+       ("r-annotationdbi" ,r-annotationdbi)
+       ("r-biobase" ,r-biobase)
+       ("r-biocgenerics" ,r-biocgenerics)
+       ("r-category" ,r-category)
+       ("r-deseq2" ,r-deseq2)
+       ("r-edger" ,r-edger)
+       ("r-ggbio" ,r-ggbio)
+       ("r-ggplot2" ,r-ggplot2)
+       ("r-gostats" ,r-gostats)
+       ("r-gseabase" ,r-gseabase)
+       ("r-hwriter" ,r-hwriter)
+       ("r-iranges" ,r-iranges)
+       ("r-knitr" ,r-knitr)
+       ("r-lattice" ,r-lattice)
+       ("r-limma" ,r-limma)
+       ("r-pfam-db" ,r-pfam-db)
+       ("r-r-utils" ,r-r-utils)
+       ("r-xml" ,r-xml)))
+    (home-page "https://bioconductor.org/packages/ReportingTools/")
+    (synopsis "Tools for making reports in various formats")
+    (description
+     "The ReportingTools package enables users to easily display reports of
+analysis results generated from sources such as microarray and sequencing
+data.  The package allows users to create HTML pages that may be viewed on a
+web browser, or in other formats.  Users can generate tables with sortable and
+filterable columns, make and display plots, and link table entries to other
+data sources such as NCBI or larger plots within the HTML page.  Using the
+package, users can also produce a table of contents page to link various
+reports together for a particular project that can be viewed in a web
+browser.")
+    (license license:artistic2.0)))
+
 (define-public r-geneplotter
   (package
     (name "r-geneplotter")
@@ -1064,6 +1291,75 @@ region sets and other genomic features.")
      "This package provides functions for plotting genomic data.")
     (license license:artistic2.0)))
 
+(define-public r-oligoclasses
+  (package
+    (name "r-oligoclasses")
+    (version "1.46.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "oligoClasses" version))
+       (sha256
+        (base32
+         "0z86zrmn80kcy6fgb9i9zs82vhim73n8hlkqy7y8sbb2jwksdr72"))))
+    (properties `((upstream-name . "oligoClasses")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-affyio" ,r-affyio)
+       ("r-biobase" ,r-biobase)
+       ("r-biocgenerics" ,r-biocgenerics)
+       ("r-biocmanager" ,r-biocmanager)
+       ("r-biostrings" ,r-biostrings)
+       ("r-dbi" ,r-dbi)
+       ("r-ff" ,r-ff)
+       ("r-foreach" ,r-foreach)
+       ("r-genomicranges" ,r-genomicranges)
+       ("r-iranges" ,r-iranges)
+       ("r-rsqlite" ,r-rsqlite)
+       ("r-s4vectors" ,r-s4vectors)
+       ("r-summarizedexperiment" ,r-summarizedexperiment)))
+    (home-page "https://bioconductor.org/packages/oligoClasses/")
+    (synopsis "Classes for high-throughput arrays")
+    (description
+     "This package contains class definitions, validity checks, and
+initialization methods for classes used by the @code{oligo} and @code{crlmm}
+packages.")
+    (license license:gpl2+)))
+
+(define-public r-oligo
+  (package
+    (name "r-oligo")
+    (version "1.48.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "oligo" version))
+       (sha256
+        (base32
+         "0qkyz65zvry0syibjkvkshwijccna18jy0hlib0n5x4c8x9zs5df"))))
+    (properties `((upstream-name . "oligo")))
+    (build-system r-build-system)
+    (inputs `(("zlib" ,zlib)))
+    (propagated-inputs
+     `(("r-affxparser" ,r-affxparser)
+       ("r-affyio" ,r-affyio)
+       ("r-biobase" ,r-biobase)
+       ("r-biocgenerics" ,r-biocgenerics)
+       ("r-biostrings" ,r-biostrings)
+       ("r-dbi" ,r-dbi)
+       ("r-ff" ,r-ff)
+       ("r-oligoclasses" ,r-oligoclasses)
+       ("r-preprocesscore" ,r-preprocesscore)
+       ("r-rsqlite" ,r-rsqlite)
+       ("r-zlibbioc" ,r-zlibbioc)))
+    (home-page "https://bioconductor.org/packages/oligo/")
+    (synopsis "Preprocessing tools for oligonucleotide arrays")
+    (description
+     "This package provides a package to analyze oligonucleotide
+arrays (expression/SNP/tiling/exon) at probe-level.  It currently supports
+Affymetrix (CEL files) and NimbleGen arrays (XYS files).")
+    (license license:lgpl2.0+)))
+
 (define-public r-qvalue
   (package
     (name "r-qvalue")
@@ -3895,14 +4191,14 @@ analysis.")
 (define-public r-gtrellis
   (package
     (name "r-gtrellis")
-    (version "1.16.0")
+    (version "1.16.1")
     (source
      (origin
        (method url-fetch)
        (uri (bioconductor-uri "gtrellis" version))
        (sha256
         (base32
-         "00d5swg3brnx8ryzpg7hp3mg9hx3vz4yd1lv2chlp2pj2rhsir1y"))))
+         "069hln9vflyxic24bxrlmdmz9h3jdd2qaqy898rgk5bn0gqwcjix"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-circlize" ,r-circlize)
@@ -4888,14 +5184,14 @@ annotations.")
 (define-public r-rsubread
   (package
     (name "r-rsubread")
-    (version "1.34.6")
+    (version "1.34.7")
     (source
      (origin
        (method url-fetch)
        (uri (bioconductor-uri "Rsubread" version))
        (sha256
         (base32
-         "0nnfh4hnrs5kd72m8c50cidbsxjz12szw2vynpmg8q0wpd99q550"))))
+         "0z4ydk9296bp76ah5y6a7za5jyn4h238xngb789zragly902x83y"))))
     (properties `((upstream-name . "Rsubread")))
     (build-system r-build-system)
     (inputs `(("zlib" ,zlib)))
@@ -5047,14 +5343,14 @@ self-organizing map clustering and minimal spanning trees.")
 (define-public r-mixomics
   (package
     (name "r-mixomics")
-    (version "6.8.2")
+    (version "6.8.4")
     (source
      (origin
        (method url-fetch)
        (uri (bioconductor-uri "mixOmics" version))
        (sha256
         (base32
-         "0issfrhsgc102sr33q9v6w6jrrd32plig7szd1nm0n4r3yn4y2fc"))))
+         "0lw4c9lxcm83xrvl4y120i1z710qjbdqginhrw738azpr1f82hcg"))))
     (properties `((upstream-name . "mixOmics")))
     (build-system r-build-system)
     (propagated-inputs
@@ -5466,3 +5762,288 @@ with multiple R processes supported by the package @code{parallel}.")
      "This package provides methods for working with Illumina arrays using the
 @code{gdsfmt} package.")
     (license license:gpl3)))
+
+(define-public r-seqbias
+  (package
+    (name "r-seqbias")
+    (version "1.32.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "seqbias" version))
+       (sha256
+        (base32
+         "1pk97jsq0rxijsdm5wnmlw79mhy19skdq1h3mmfbdjh560md47lw"))))
+    (properties `((upstream-name . "seqbias")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-biostrings" ,r-biostrings)
+       ("r-genomicranges" ,r-genomicranges)
+       ("r-rhtslib" ,r-rhtslib)))
+    (inputs
+     `(("zlib" ,zlib))) ; This comes from rhtslib.
+    (home-page "https://bioconductor.org/packages/seqbias/")
+    (synopsis "Estimation of per-position bias in high-throughput sequencing data")
+    (description
+     "This package implements a model of per-position sequencing bias in
+high-throughput sequencing data using a simple Bayesian network, the structure
+and parameters of which are trained on a set of aligned reads and a reference
+genome sequence.")
+    (license license:lgpl3)))
+
+(define-public r-reqon
+  (package
+    (name "r-reqon")
+    (version "1.30.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "ReQON" version))
+       (sha256
+        (base32
+         "04bljr8vgb9z9800d9v8w7a4rvjkwq48zd8n5divq30zj9k2na7a"))))
+    (properties `((upstream-name . "ReQON")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-rjava" ,r-rjava)
+       ("r-rsamtools" ,r-rsamtools)
+       ("r-seqbias" ,r-seqbias)))
+    (home-page "https://bioconductor.org/packages/ReQON/")
+    (synopsis "Recalibrating quality of nucleotides")
+    (description
+     "This package provides an implementation of an algorithm for
+recalibrating the base quality scores for aligned sequencing data in BAM
+format.")
+    (license license:gpl2)))
+
+(define-public r-wavcluster
+  (package
+    (name "r-wavcluster")
+    (version "2.18.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "wavClusteR" version))
+       (sha256
+        (base32
+         "02i53dskirzr9nls3dsmv7dqhvy3vikkpx7247zpy2qd9r5yvhy2"))))
+    (properties `((upstream-name . "wavClusteR")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-biocgenerics" ,r-biocgenerics)
+       ("r-biostrings" ,r-biostrings)
+       ("r-foreach" ,r-foreach)
+       ("r-genomicfeatures" ,r-genomicfeatures)
+       ("r-genomicranges" ,r-genomicranges)
+       ("r-ggplot2" ,r-ggplot2)
+       ("r-hmisc" ,r-hmisc)
+       ("r-iranges" ,r-iranges)
+       ("r-mclust" ,r-mclust)
+       ("r-rsamtools" ,r-rsamtools)
+       ("r-rtracklayer" ,r-rtracklayer)
+       ("r-s4vectors" ,r-s4vectors)
+       ("r-seqinr" ,r-seqinr)
+       ("r-stringr" ,r-stringr)
+       ("r-wmtsa" ,r-wmtsa)))
+    (home-page "https://bioconductor.org/packages/wavClusteR/")
+    (synopsis "Identification of RNA-protein interaction sites in PAR-CLIP data")
+    (description
+     "This package provides an integrated pipeline for the analysis of
+PAR-CLIP data.  PAR-CLIP-induced transitions are first discriminated from
+sequencing errors, SNPs and additional non-experimental sources by a non-
+parametric mixture model.  The protein binding sites (clusters) are then
+resolved at high resolution and cluster statistics are estimated using a
+rigorous Bayesian framework.  Post-processing of the results, data export for
+UCSC genome browser visualization and motif search analysis are provided.  In
+addition, the package allows to integrate RNA-Seq data to estimate the False
+Discovery Rate of cluster detection.  Key functions support parallel multicore
+computing.  While wavClusteR was designed for PAR-CLIP data analysis, it can
+be applied to the analysis of other NGS data obtained from experimental
+procedures that induce nucleotide substitutions (e.g. BisSeq).")
+    (license license:gpl2)))
+
+(define-public r-timeseriesexperiment
+  (package
+    (name "r-timeseriesexperiment")
+    (version "1.2.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "TimeSeriesExperiment" version))
+       (sha256
+        (base32
+         "1j11g7a2p0yk38fx6wd6152l1xynghj01pfxihalw601jwf1bl0y"))))
+    (properties
+     `((upstream-name . "TimeSeriesExperiment")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-deseq2" ,r-deseq2)
+       ("r-dplyr" ,r-dplyr)
+       ("r-dynamictreecut" ,r-dynamictreecut)
+       ("r-edger" ,r-edger)
+       ("r-ggplot2" ,r-ggplot2)
+       ("r-hmisc" ,r-hmisc)
+       ("r-limma" ,r-limma)
+       ("r-magrittr" ,r-magrittr)
+       ("r-proxy" ,r-proxy)
+       ("r-s4vectors" ,r-s4vectors)
+       ("r-summarizedexperiment" ,r-summarizedexperiment)
+       ("r-tibble" ,r-tibble)
+       ("r-tidyr" ,r-tidyr)
+       ("r-vegan" ,r-vegan)
+       ("r-viridis" ,r-viridis)))
+    (home-page "https://github.com/nlhuong/TimeSeriesExperiment/")
+    (synopsis "Analysis for short time-series data")
+    (description
+     "This package is a visualization and analysis toolbox for short time
+course data which includes dimensionality reduction, clustering, two-sample
+differential expression testing and gene ranking techniques.  The package also
+provides methods for retrieving enriched pathways.")
+    (license license:lgpl3+)))
+
+(define-public r-variantfiltering
+  (package
+    (name "r-variantfiltering")
+    (version "1.20.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "VariantFiltering" version))
+       (sha256
+        (base32
+         "0vpghxacqcbaxx2scb5gfhcmfpw1lkls7h6qnbwbnmjwy01q2p17"))))
+    (properties
+     `((upstream-name . "VariantFiltering")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-annotationdbi" ,r-annotationdbi)
+       ("r-biobase" ,r-biobase)
+       ("r-biocgenerics" ,r-biocgenerics)
+       ("r-biocparallel" ,r-biocparallel)
+       ("r-biostrings" ,r-biostrings)
+       ("r-bsgenome" ,r-bsgenome)
+       ("r-dt" ,r-dt)
+       ("r-genomeinfodb" ,r-genomeinfodb)
+       ("r-genomicfeatures" ,r-genomicfeatures)
+       ("r-genomicranges" ,r-genomicranges)
+       ("r-genomicscores" ,r-genomicscores)
+       ("r-graph" ,r-graph)
+       ("r-gviz" ,r-gviz)
+       ("r-iranges" ,r-iranges)
+       ("r-rbgl" ,r-rbgl)
+       ("r-rsamtools" ,r-rsamtools)
+       ("r-s4vectors" ,r-s4vectors)
+       ("r-shiny" ,r-shiny)
+       ("r-shinyjs" ,r-shinyjs)
+       ("r-shinythemes" ,r-shinythemes)
+       ("r-shinytree" ,r-shinytree)
+       ("r-summarizedexperiment" ,r-summarizedexperiment)
+       ("r-variantannotation" ,r-variantannotation)
+       ("r-xvector" ,r-xvector)))
+    (home-page "https://github.com/rcastelo/VariantFiltering")
+    (synopsis "Filtering of coding and non-coding genetic variants")
+    (description
+     "Filter genetic variants using different criteria such as inheritance
+model, amino acid change consequence, minor allele frequencies across human
+populations, splice site strength, conservation, etc.")
+    (license license:artistic2.0)))
+
+(define-public r-genomegraphs
+  (package
+    (name "r-genomegraphs")
+    (version "1.44.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "GenomeGraphs" version))
+       (sha256
+        (base32
+         "026skcn2cqchlzaqsnk11gb8d8aq1rz7lrnx4mmsba234mh4j7kd"))))
+    (properties `((upstream-name . "GenomeGraphs")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-biomart" ,r-biomart)))
+    (home-page "https://bioconductor.org/packages/GenomeGraphs/")
+    (synopsis "Plotting genomic information from Ensembl")
+    (description
+     "Genomic data analyses requires integrated visualization of known genomic
+information and new experimental data.  GenomeGraphs uses the biomaRt package
+to perform live annotation queries to Ensembl and translates this to e.g.
+gene/transcript structures in viewports of the grid graphics package.  This
+results in genomic information plotted together with your data.  Another
+strength of GenomeGraphs is to plot different data types such as array CGH,
+gene expression, sequencing and other data, together in one plot using the
+same genome coordinate system.")
+    (license license:artistic2.0)))
+
+(define-public r-wavetiling
+  (package
+    (name "r-wavetiling")
+    (version "1.26.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "waveTiling" version))
+       (sha256
+        (base32
+         "0l0saa0myabpq2rl9dq70zff8jpxr3mkanxlj65hc41f0m5xllir"))))
+    (properties `((upstream-name . "waveTiling")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-affy" ,r-affy)
+       ("r-biobase" ,r-biobase)
+       ("r-biostrings" ,r-biostrings)
+       ("r-genomegraphs" ,r-genomegraphs)
+       ("r-genomicranges" ,r-genomicranges)
+       ("r-iranges" ,r-iranges)
+       ("r-oligo" ,r-oligo)
+       ("r-oligoclasses" ,r-oligoclasses)
+       ("r-preprocesscore" ,r-preprocesscore)
+       ("r-waveslim" ,r-waveslim)))
+    (home-page "https://r-forge.r-project.org/projects/wavetiling/")
+    (synopsis "Wavelet-based models for tiling array transcriptome analysis")
+    (description
+     "This package is designed to conduct transcriptome analysis for tiling
+arrays based on fast wavelet-based functional models.")
+    (license license:gpl2+)))
+
+(define-public r-variancepartition
+  (package
+    (name "r-variancepartition")
+    (version "1.14.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "variancePartition" version))
+       (sha256
+        (base32
+         "1ycapwb2mq57xibrzzjz9zwxqz4nwz9f3n5gskhlr5vcs7irkjd6"))))
+    (properties
+     `((upstream-name . "variancePartition")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-biobase" ,r-biobase)
+       ("r-colorramps" ,r-colorramps)
+       ("r-doparallel" ,r-doparallel)
+       ("r-foreach" ,r-foreach)
+       ("r-ggplot2" ,r-ggplot2)
+       ("r-gplots" ,r-gplots)
+       ("r-iterators" ,r-iterators)
+       ("r-limma" ,r-limma)
+       ("r-lme4" ,r-lme4)
+       ("r-lmertest" ,r-lmertest)
+       ("r-mass" ,r-mass)
+       ("r-pbkrtest" ,r-pbkrtest)
+       ("r-progress" ,r-progress)
+       ("r-reshape2" ,r-reshape2)
+       ("r-scales" ,r-scales)))
+    (home-page "https://bioconductor.org/packages/variancePartition/")
+    (synopsis "Analyze variation in gene expression experiments")
+    (description
+     "This is a package providing tools to quantify and interpret multiple
+sources of biological and technical variation in gene expression experiments.
+It uses a linear mixed model to quantify variation in gene expression
+attributable to individual, tissue, time point, or technical variables.  The
+package includes dream differential expression analysis for repeated
+measures.")
+    (license license:gpl2+)))
diff --git a/gnu/packages/bioinformatics.scm b/gnu/packages/bioinformatics.scm
index e158bd3af7..34289501fc 100644
--- a/gnu/packages/bioinformatics.scm
+++ b/gnu/packages/bioinformatics.scm
@@ -7340,13 +7340,13 @@ checks on R packages that are to be submitted to the Bioconductor repository.")
 (define-public r-s4vectors
   (package
     (name "r-s4vectors")
-    (version "0.22.0")
+    (version "0.22.1")
     (source (origin
               (method url-fetch)
               (uri (bioconductor-uri "S4Vectors" version))
               (sha256
                (base32
-                "1wkqmpy0d0fab9bjfc7i5wh2zng75pg9rn9c1z1lkki7fpwaw2jb"))))
+                "0cpxqb18wd3pjd7bi8lry13sm5ffqahcvvxpk5pwm5xcj30cdlm9"))))
     (properties
      `((upstream-name . "S4Vectors")))
     (build-system r-build-system)
@@ -7447,13 +7447,13 @@ names in their natural, rather than lexicographic, order.")
 (define-public r-edger
   (package
     (name "r-edger")
-    (version "3.26.7")
+    (version "3.26.8")
     (source (origin
               (method url-fetch)
               (uri (bioconductor-uri "edgeR" version))
               (sha256
                (base32
-                "1xbhb8aa1ygm5crkp1bmqs2x1601ppa2kgc2xlf2zh8jj8zqapg8"))))
+                "1wwimzviy2vklp80faz7sbbp74qcw2csbmlfgvzj7b785vwarpwg"))))
     (properties `((upstream-name . "edgeR")))
     (build-system r-build-system)
     (propagated-inputs
@@ -7569,13 +7569,13 @@ different technologies, including microarrays, RNA-seq, and quantitative PCR.")
 (define-public r-genomicranges
   (package
     (name "r-genomicranges")
-    (version "1.36.0")
+    (version "1.36.1")
     (source (origin
               (method url-fetch)
               (uri (bioconductor-uri "GenomicRanges" version))
               (sha256
                (base32
-                "1285fr8qjd7d0ixpv7d5imi0n6wzc4k6yia1rkmig71qd2gg556k"))))
+                "1yid84gn0052v52h84685lvk854grl1wl65psmlmxx9yyykgc0jn"))))
     (properties
      `((upstream-name . "GenomicRanges")))
     (build-system r-build-system)
@@ -7872,13 +7872,13 @@ alignments.")
 (define-public r-rtracklayer
   (package
     (name "r-rtracklayer")
-    (version "1.44.3")
+    (version "1.44.4")
     (source (origin
               (method url-fetch)
               (uri (bioconductor-uri "rtracklayer" version))
               (sha256
                (base32
-                "091zydz1zpz519ha0jkbvzrhxjvw5r2963qz9grmvl2jd8girvcg"))))
+                "0dnifr58j2si2qbnvap2wslz3xgjv3h4l7a6v7nmmc57hq6kdbym"))))
     (build-system r-build-system)
     (arguments
      `(#:phases
@@ -9628,14 +9628,14 @@ Shiny-based display methods for Bioconductor objects.")
 (define-public r-annotationhub
   (package
     (name "r-annotationhub")
-    (version "2.16.0")
+    (version "2.16.1")
     (source
      (origin
        (method url-fetch)
        (uri (bioconductor-uri "AnnotationHub" version))
        (sha256
         (base32
-         "1rpzl4x5mrwxrrf1jzm4zni6li6x34fjfyybsdvplb0ixa48zhn4"))))
+         "0c773cmhng907839f0bq161jky7362lxxny36ac55qxiz1giqi8j"))))
     (properties `((upstream-name . "AnnotationHub")))
     (build-system r-build-system)
     (propagated-inputs
@@ -10023,14 +10023,14 @@ interval to data view, mismatch pileup, and several splicing summaries.")
 (define-public r-gprofiler
   (package
     (name "r-gprofiler")
-    (version "0.6.7")
+    (version "0.6.8")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "gProfileR" version))
        (sha256
         (base32
-         "12nwidbnqmnfy5dnqga26byslvdnkrpz2fi19qfcby6xx0wbndk7"))))
+         "05d6y6b7vkkzp2qhs1cwlvp02djij1b28dbwxnrms08f8qi35iaj"))))
     (properties `((upstream-name . "gProfileR")))
     (build-system r-build-system)
     (propagated-inputs
@@ -10448,14 +10448,14 @@ block processing.")
 (define-public r-rhdf5lib
   (package
     (name "r-rhdf5lib")
-    (version "1.6.0")
+    (version "1.6.1")
     (source
      (origin
        (method url-fetch)
        (uri (bioconductor-uri "Rhdf5lib" version))
        (sha256
         (base32
-         "1lpmyxlwwcy92hyxqag321ssc5z6yw3a0ws9r058jwgzyjg7i2gm"))
+         "0niz9dh66fcwbvqpkpsdlz9d06kwi3kfh45dhk3qz9g9qqyiakr1"))
        (modules '((guix build utils)))
        (snippet
         '(begin
@@ -10644,14 +10644,14 @@ variable and significantly correlated genes.")
 (define-public r-delayedmatrixstats
   (package
     (name "r-delayedmatrixstats")
-    (version "1.6.0")
+    (version "1.6.1")
     (source
      (origin
        (method url-fetch)
        (uri (bioconductor-uri "DelayedMatrixStats" version))
        (sha256
         (base32
-         "0632ypndblrgzfk8k98rr8c6m2r0zwzf02pzvlrhcp9bj1pvqbrz"))))
+         "1riyzfsq4bd513hidkw3cfkx3jywk3x87j89q70v459xsdfdc95b"))))
     (properties
      `((upstream-name . "DelayedMatrixStats")))
     (build-system r-build-system)
diff --git a/gnu/packages/check.scm b/gnu/packages/check.scm
index 67ea968e43..dab0bd39c3 100644
--- a/gnu/packages/check.scm
+++ b/gnu/packages/check.scm
@@ -2234,7 +2234,7 @@ provides a simple way to achieve this.")
 (define-public umockdev
   (package
     (name "umockdev")
-    (version "0.12.1")
+    (version "0.13.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/martinpitt/umockdev/"
@@ -2242,7 +2242,7 @@ provides a simple way to achieve this.")
                                   "umockdev-" version ".tar.xz"))
               (sha256
                (base32
-                "1hx5jm9afng6hw9wyp524z8nwdp6w053pca0w2c0gqpgrmvjxvd2"))))
+                "095v3abc321s584sga04y16lcmdzsdi88h24wcrm78v7vq484g74"))))
     (build-system gnu-build-system)
     (arguments
      `(#:phases
@@ -2255,10 +2255,12 @@ provides a simple way to achieve this.")
              #t)))))
     (native-inputs
      `(("vala" ,vala)
-       ("python" ,python)               ; for tests
-       ("which" ,which)                 ; for tests
        ("gtk-doc" ,gtk-doc)
-       ("pkg-config" ,pkg-config)))
+       ("pkg-config" ,pkg-config)
+
+       ;; For tests.
+       ("python" ,python)
+       ("which" ,which)))
     (inputs
      `(("glib" ,glib)
        ("eudev" ,eudev)
diff --git a/gnu/packages/cluster.scm b/gnu/packages/cluster.scm
index 3608d67bed..8b99a21356 100644
--- a/gnu/packages/cluster.scm
+++ b/gnu/packages/cluster.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2018 Sou Bunnbu <iyzsong@member.fsf.org>
 ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2019 Andrew Miloradovsky <andrew@interpretmath.pw>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -21,7 +22,10 @@
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix build-system gnu)
   #:use-module (guix download)
+  #:use-module (guix git-download)
   #:use-module (guix packages)
+  #:use-module (gnu packages autotools)
+  #:use-module (gnu packages gettext)
   #:use-module (gnu packages linux)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages sphinx)
@@ -79,3 +83,34 @@ Server (@dfn{IPVS}) kernel module.  High availability is achieved by the Virtual
 Redundancy Routing Protocol (@dfn{VRRP}).  Each Keepalived framework can be used
 independently or together to provide resilient infrastructures.")
     (license license:gpl2+)))
+
+(define-public libraft
+  (package
+    (name "libraft")
+    (version "0.9.5")
+    (home-page "https://github.com/canonical/raft")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference (url home-page)
+                                  (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1q49f5mmv6nr6dxhnp044xwc6jlczgh0nj0bl6718wiqh28411x0"))))
+    (arguments '(#:configure-flags '("--disable-uv")))
+    ;; The uv plugin tests fail, if libuv (or the example) is enabled,
+    ;; because setting up the environment requires too much privileges.
+    (native-inputs
+     `(("autoconf" ,autoconf)
+       ("automake" ,automake)
+       ("gettext" ,gettext-minimal)
+       ("libtool" ,libtool)
+       ("pkg-config" ,pkg-config)))
+    (build-system gnu-build-system)
+    (synopsis "C implementation of the Raft consensus protocol")
+    (description "The library has modular design: its core part implements only
+the core Raft algorithm logic, in a fully platform independent way.  On top of
+that, a pluggable interface defines the I/O implementation for networking
+(send/receive RPC messages) and disk persistence (store log entries and
+snapshots).")
+    (license license:asl2.0)))
diff --git a/gnu/packages/cmake.scm b/gnu/packages/cmake.scm
index 1d8d829ec5..64349be444 100644
--- a/gnu/packages/cmake.scm
+++ b/gnu/packages/cmake.scm
@@ -207,6 +207,18 @@ and workspaces that can be used in the compiler environment of your choice.")
     (outputs '("out" "doc"))
     (properties (alist-delete 'hidden? (package-properties cmake-minimal)))))
 
+(define-public cmake/fixed
+  ;; This is a variant of CMake that fixes X.509 certificate lookup:
+  ;; <https://issues.guix.gnu.org/issue/37371>.
+  (package
+    (inherit cmake)
+    (version (string-append (package-version cmake) "-1"))
+    (source (origin
+              (inherit (package-source cmake))
+              (patches
+               (append (search-patches "cmake-curl-certificates.patch")
+                       (origin-patches (package-source cmake))))))))
+
 (define-public emacs-cmake-mode
   (package
     (inherit cmake)
diff --git a/gnu/packages/cran.scm b/gnu/packages/cran.scm
index 5bf37e3900..cb0be4aedd 100644
--- a/gnu/packages/cran.scm
+++ b/gnu/packages/cran.scm
@@ -15,6 +15,7 @@
 ;;; Copyright © 2018 Marius Bakke <mbakke@fastmail.com>
 ;;; Copyright © 2018, 2019 Brett Gilio <brettg@posteo.net>
 ;;; Copyright © 2019 Nicolò Balzarotti <anothersms@gmail.com>
+;;; Copyright © 2019 Wiktor Żelazny <wzelazny@vurv.cz>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -447,13 +448,13 @@ into a pipeline of data manipulation and visualisation.")
 (define-public r-httpuv
   (package
     (name "r-httpuv")
-    (version "1.5.1")
+    (version "1.5.2")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "httpuv" version))
               (sha256
                (base32
-                "042piypg4c8sqrlcdl3dwajkafkbglsky3x7d0jpjv8s5wxnpfxm"))))
+                "13ax0hs2lc39ilznh1zarwqdzahcbhb8adilrfik3xg0fkljpcwk"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-bh" ,r-bh)
@@ -796,6 +797,84 @@ extensive prebuilt widgets make it possible to build beautiful,
 responsive, and powerful applications with minimal effort.")
     (license license:artistic2.0)))
 
+;; This package includes minified JavaScript files.  When upgrading please
+;; check that there are no new minified JavaScript files.
+(define-public r-shinytree
+  (package
+    (name "r-shinytree")
+    (version "0.2.7")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "shinyTree" version))
+       (sha256
+        (base32
+         "0jfx2capckv7hf2yx3fn8i4rcmhi222ah91jnmhg497x8wgz31s3"))
+       (modules '((guix build utils)))
+       (snippet
+        '(begin
+           ;; Delete minified JavaScript
+           (for-each delete-file
+                     '("inst/www/jsTree-3.3.7/libs/require.js"
+                       "inst/www/jsTree-3.3.7/libs/jquery.js"
+                       "inst/www/jsTree-3.3.7/jstree.min.js"))
+           #t))))
+    (properties `((upstream-name . "shinyTree")))
+    (build-system r-build-system)
+    (arguments
+     `(#:modules ((guix build utils)
+                  (guix build r-build-system)
+                  (srfi srfi-1)
+                  (ice-9 popen))
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'replace-minified-javascript
+           (lambda* (#:key inputs #:allow-other-keys)
+             (with-directory-excursion "inst/www/jsTree-3.3.7/"
+               (symlink (string-append (assoc-ref inputs "js-requirejs")
+                                       "/share/javascript/require.min.js")
+                        "libs/require.js")
+               (call-with-values
+                   (lambda ()
+                     (unzip2
+                      `((,(assoc-ref inputs "js-jquery")
+                         "libs/jquery.js")
+                        ("jstree.js"
+                         "jstree.min.js"))))
+                 (lambda (sources targets)
+                   (for-each (lambda (source target)
+                               (format #t "Processing ~a --> ~a~%"
+                                       source target)
+                               (let ((minified (open-pipe* OPEN_READ "uglify-js" source)))
+                                 (call-with-output-file target
+                                   (lambda (port)
+                                     (dump-port minified port)))))
+                             sources targets))))
+             #t)))))
+    (propagated-inputs
+     `(("r-htmlwidgets" ,r-htmlwidgets)
+       ("r-jsonlite" ,r-jsonlite)
+       ("r-promises" ,r-promises)
+       ("r-shiny" ,r-shiny)
+       ("r-stringr" ,r-stringr)))
+    (inputs
+     `(("js-requirejs" ,js-requirejs)))
+    (native-inputs
+     `(("uglify-js" ,uglify-js)
+       ("js-jquery"
+        ,(origin
+           (method url-fetch)
+           (uri "https://code.jquery.com/jquery-3.3.1.js")
+           (sha256
+            (base32
+             "1b8zxrp6xwzpw25apn8j4qws0f6sr7qr7h2va5h1mjyfqvn29anq"))))))
+    (home-page "https://cran.r-project.org/web/packages/shinyTree/")
+    (synopsis "jsTree bindings for Shiny")
+    (description
+     "This package exposes R bindings to jsTree, a JavaScript library that
+supports interactive trees, to enable rich, editable trees in Shiny.")
+    (license license:expat)))
+
 (define-public r-shinydashboard
   (package
     (name "r-shinydashboard")
@@ -867,6 +946,31 @@ this gives the user direct access to the file system without the need to
 well as file saving is available.")
     (license license:gpl2+)))
 
+(define-public r-shinythemes
+  (package
+    (name "r-shinythemes")
+    (version "1.1.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "shinythemes" version))
+       (sha256
+        (base32
+         "12miz44n2zxfswnia7p8dirxj3miw0aqn4pkx2111ikz67ax84rf"))))
+    (properties `((upstream-name . "shinythemes")))
+    (build-system r-build-system)
+    (propagated-inputs `(("r-shiny" ,r-shiny)))
+    (home-page "http://rstudio.github.io/shinythemes/")
+    (synopsis "Themes for Shiny")
+    (description
+     "This package provides themes for use with Shiny.  It includes several
+Bootstrap themes, which are packaged for use with Shiny applications.")
+    ;; The package is released under version 3 of the GPL, but it includes
+    ;; source files that are covered by the Expat license.  It also includes
+    ;; fonts under SIL or the ASL.
+    (license (list license:gpl3 license:expat
+                   license:silofl1.1 license:asl2.0))))
+
 ;; The package sources include minified variants of d3.js and non-minified
 ;; source code of d3-jetpack.
 (define-public r-d3r
@@ -1059,14 +1163,14 @@ work well on small screens.")
 (define-public r-feather
   (package
     (name "r-feather")
-    (version "0.3.3")
+    (version "0.3.5")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "feather" version))
        (sha256
         (base32
-         "0ls8lmygyjq60467s88h66d7fczjp1d3a2106rfq4dx9lyfvdfsa"))))
+         "1gxd0h2m56sjjlzn4dry6s13nddxc4l5i11gsvavaf2dwbahdzsh"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-hms" ,r-hms)
@@ -1649,14 +1753,14 @@ validation and filtering on the values, making options invisible or private.")
 (define-public r-circlize
   (package
     (name "r-circlize")
-    (version "0.4.7")
+    (version "0.4.8")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "circlize" version))
        (sha256
         (base32
-         "07y1bchkslpz2wl43yg5j5h1nl9z0i425a07jdmfd5avrynd8p3m"))))
+         "0jvr9hmxyhg0zx101iiqkrg8wfaj86kp62xpv42n2j9fkn5r1mi2"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-colorspace" ,r-colorspace)
@@ -2663,14 +2767,14 @@ Optimization problems by using the simplex algorithm.")
 (define-public r-geometry
   (package
     (name "r-geometry")
-    (version "0.4.3")
+    (version "0.4.4")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "geometry" version))
        (sha256
         (base32
-         "0z4491mhfmrlbb8lazjvq55alrprx7k0abg2d39fj0lsj84cls1r"))))
+         "1mx5n5mw63nij4n6crs9165mlls4fnh1ipw5ch467rjsidgl0mg8"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-magic" ,r-magic)
@@ -5569,14 +5673,14 @@ and adds the annotation to the plot.")
 (define-public r-ggpubr
   (package
     (name "r-ggpubr")
-    (version "0.2.2")
+    (version "0.2.3")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "ggpubr" version))
        (sha256
         (base32
-         "0r5knv3707pmpngmj60zn761y3bh8lj89dhh1b80ss083xnxr4qw"))))
+         "0i81mmz4qn9yzcgfa6dhkcrx4ddlflkm2c3b40isc8all43rm8rn"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-cowplot" ,r-cowplot)
@@ -6091,14 +6195,14 @@ other add-on packages.")
 (define-public r-insight
   (package
     (name "r-insight")
-    (version "0.4.1")
+    (version "0.5.0")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "insight" version))
        (sha256
         (base32
-         "1lw1r3mb97z5p9z25jfzlhs0sbnwp6v8kzysf0am01x4m7l3iz82"))))
+         "0lrh2l9n2zd9n3zzknsxz6nlasnrayx3bplxlz7m616g56gr5nfp"))))
     (build-system r-build-system)
     (home-page "https://easystats.github.io/insight/")
     (synopsis "Easy access to model information for various model objects")
@@ -6117,14 +6221,14 @@ information are missing.")
 (define-public r-sjlabelled
   (package
     (name "r-sjlabelled")
-    (version "1.1.0")
+    (version "1.1.1")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "sjlabelled" version))
        (sha256
         (base32
-         "0rnmlwpp41h04dzfjd5ncvzjzs43slaimb4v2in1axznv3haafyc"))))
+         "0c9wy0gsr2sbkrv2638xbi7qm0gl6jyr6sfricavhkm7l4hljjkz"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-haven" ,r-haven)
@@ -6873,13 +6977,13 @@ and coverage methods to tune the choice of threshold.")
 (define-public r-ggformula
   (package
     (name "r-ggformula")
-    (version "0.9.1")
+    (version "0.9.2")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "ggformula" version))
        (sha256
-        (base32 "01ngx8qh9lhmagng6abx2ky54zi3iyj5bpxlnw59slagwv7l6icx"))))
+        (base32 "16ycabhnp78fsiv1dc63ccgh9gmpsy2683vbmq0fdzl6w3pd87sr"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-ggplot2" ,r-ggplot2)
@@ -7878,14 +7982,14 @@ Hothorn, Westfall, 2010, CRC Press).")
 (define-public r-emmeans
   (package
     (name "r-emmeans")
-    (version "1.4")
+    (version "1.4.1")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "emmeans" version))
        (sha256
         (base32
-         "1ynf9hhbch83k63lwps69ijfch30fk5v0sc418ck264c5vih26dh"))))
+         "1fpawaxnmj67md169a9mzrnnh2d0c973xydfg6hw865933jil9lq"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-estimability" ,r-estimability)
@@ -8036,14 +8140,14 @@ detection, parallelism through BLAS and parallel user templates.")
 (define-public r-sjstats
   (package
     (name "r-sjstats")
-    (version "0.17.5")
+    (version "0.17.6")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "sjstats" version))
        (sha256
         (base32
-         "1x9ybvz84vgaabmqp4z6crbv5q6kqjg6msk1spbr11zx9dbj06ca"))))
+         "11z1wfi0d74d1rld0320l3vmv6rl41wa0v9bjc44rk06yc90wld2"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-bayestestr" ,r-bayestestr)
@@ -8055,6 +8159,7 @@ detection, parallelism through BLAS and parallel user templates.")
        ("r-magrittr" ,r-magrittr)
        ("r-mass" ,r-mass)
        ("r-modelr" ,r-modelr)
+       ("r-parameters" ,r-parameters)
        ("r-performance" ,r-performance)
        ("r-purrr" ,r-purrr)
        ("r-rlang" ,r-rlang)
@@ -8162,14 +8267,14 @@ effects models and Bayesian models.")
 (define-public r-ggeffects
   (package
     (name "r-ggeffects")
-    (version "0.11.0")
+    (version "0.12.0")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "ggeffects" version))
        (sha256
         (base32
-         "1b0lxa8bljdh6h4lk7pql1lrhjlvh7p5c8qlgb8ac6ay8hb79vmi"))))
+         "0idfycjk05gyykfp9ibmhxfcjvd01ikh1dl0fb4nqw6znw3ar0xp"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-dplyr" ,r-dplyr)
@@ -8196,14 +8301,14 @@ results using @code{ggplot2}.")
 (define-public r-sjplot
   (package
     (name "r-sjplot")
-    (version "2.7.0")
+    (version "2.7.1")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "sjPlot" version))
        (sha256
         (base32
-         "1m0gy991fmxvqry91kkzdkdapyalhrwql25d0hg2a2naxgfw4zpk"))))
+         "14shypabpahf68hd66rb1dpqhiyl3i0yx1yc85wamdvljh9fdymb"))))
     (properties `((upstream-name . "sjPlot")))
     (build-system r-build-system)
     (propagated-inputs
@@ -9122,17 +9227,18 @@ Scientific.")
 (define-public r-activity
   (package
     (name "r-activity")
-    (version "1.2")
+    (version "1.3")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "activity" version))
        (sha256
         (base32
-         "11w2bz6p9xbzdh6773dmbbh6rws0h5dj18p8m0ivzizgq932vdzs"))))
+         "12imqj366dp6pam5gap6ji56p5wf1073xz5g4iikfxf5l8snxw92"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-circular" ,r-circular)
+       ("r-insol" ,r-insol)
        ("r-pbapply" ,r-pbapply)))
     (home-page "https://cran.r-project.org/web/packages/activity/")
     (synopsis "Animal activity statistics")
@@ -9444,14 +9550,14 @@ maps.")
 (define-public r-tidytree
   (package
     (name "r-tidytree")
-    (version "0.2.6")
+    (version "0.2.7")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "tidytree" version))
        (sha256
         (base32
-         "13mhizbsawmfqjpnzb73yw6kn1f1wlz0vhyzj3g0rj6ry880rw89"))))
+         "15ky7hj7w08jx94wm0yikckca0apwv3jy5svd77dpzgb2lr9ff9a"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-ape" ,r-ape)
@@ -10767,14 +10873,14 @@ This makes it a convenient and fast interface to C/C++ and Fortran code.")
 (define-public r-spam
   (package
     (name "r-spam")
-    (version "2.2-2")
+    (version "2.3-0")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "spam" version))
        (sha256
         (base32
-         "024dgfnjfxvsiymbzrhadinamj6qy509f4sbd1zxql8ymkyxn7vi"))))
+         "194n5mgvyms9ckjqixl3h33apii8h9kqspqg2si9k741k578qb3w"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-dotcall64" ,r-dotcall64)))
@@ -11152,14 +11258,14 @@ regression coefficients can be conducted via jackknifing.")
 (define-public r-huge
   (package
     (name "r-huge")
-    (version "1.3.2")
+    (version "1.3.3")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "huge" version))
        (sha256
         (base32
-         "1j93gvi1jyq3ld9jhdqhrpm2is54rk3ilmf3yw7fx6gva0y6hjqd"))))
+         "18f8w4hdp9fdi2k5ip6fnrn5z47w4ybgxs2m6a7jdvd2v4wfdr69"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-igraph" ,r-igraph)
@@ -12590,14 +12696,14 @@ barplots or heatmaps.")
 (define-public r-seqinr
   (package
     (name "r-seqinr")
-    (version "3.4-5")
+    (version "3.6-1")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "seqinr" version))
        (sha256
         (base32
-         "17zv0n5cji17izwmwg0jcbxbjl3w5rls91w15svcnlpxjms38ahn"))))
+         "0j30za6kji6y3v09cvcydiacnp65pv6ig8aw7cydl47l5s9chky4"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-ade4" ,r-ade4)
@@ -13607,14 +13713,14 @@ the XKCD web comic.")
 (define-public r-msigdbr
   (package
     (name "r-msigdbr")
-    (version "6.2.1")
+    (version "7.0.1")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "msigdbr" version))
        (sha256
         (base32
-         "1264j1hs74kq7hyh68vfynadfi6mdpq46qm1hnwzkzzhmbzpb9cg"))))
+         "19p8z617m3my8la7n1qgb1s2msf940r372im3q30qkbcx3qxg3sd"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-dplyr" ,r-dplyr)
@@ -13881,14 +13987,14 @@ databases, including ENA, PDB or ChEMBL are also accessible.")
 (define-public r-ggraph
   (package
     (name "r-ggraph")
-    (version "1.0.2")
+    (version "2.0.0")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "ggraph" version))
        (sha256
         (base32
-         "0fpmp326mryd1k1qvacjadksrnhbla8h960i18lmrimzrag7692c"))))
+         "0qj7w3af0pgmd9mil6y571jikfkln7b8csvzg6b08spwbglfy1s3"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-digest" ,r-digest)
@@ -13896,12 +14002,14 @@ databases, including ENA, PDB or ChEMBL are also accessible.")
        ("r-ggforce" ,r-ggforce)
        ("r-ggplot2" ,r-ggplot2)
        ("r-ggrepel" ,r-ggrepel)
+       ("r-graphlayouts" ,r-graphlayouts)
        ("r-gtable" ,r-gtable)
        ("r-igraph" ,r-igraph)
        ("r-mass" ,r-mass)
-       ("r-plyr" ,r-plyr)
        ("r-rcpp" ,r-rcpp)
+       ("r-rlang" ,r-rlang)
        ("r-scales" ,r-scales)
+       ("r-tidygraph" ,r-tidygraph)
        ("r-viridis" ,r-viridis)))
     (home-page "https://cran.r-project.org/web/packages/ggraph/")
     (synopsis "Implementation of grammar of graphics for graphs and networks")
@@ -15212,3 +15320,293 @@ single cell integration, described in Korsunsky et al
 @url{doi.org/10.1101/461954}.  The package includes a standalone Harmony
 function and interfaces to external frameworks.")
       (license license:gpl3))))
+
+(define-public r-covr
+  (package
+    (name "r-covr")
+    (version "3.3.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "covr" version))
+       (sha256
+        (base32
+         "0fvd7v53w11x6kaw61hbml8n1j2ck9l2fv2wvqdsg689xic9rqcs"))))
+    (properties `((upstream-name . "covr")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-crayon" ,r-crayon)
+       ("r-digest" ,r-digest)
+       ("r-httr" ,r-httr)
+       ("r-jsonlite" ,r-jsonlite)
+       ("r-rex" ,r-rex)
+       ("r-withr" ,r-withr)
+       ("r-yaml" ,r-yaml)))
+    (home-page "https://github.com/r-lib/covr")
+    (synopsis "Test coverage for R packages")
+    (description
+     "Thisp package enables you to track and report code coverage for your
+package and (optionally) upload the results to a coverage service.  Code
+coverage is a measure of the amount of code being exercised by a set of tests.
+It is an indirect measure of test quality and completeness.  This package is
+compatible with any testing methodology or framework and tracks coverage of
+both R code and compiled C/C++/FORTRAN code.")
+    (license license:gpl3)))
+
+(define-public r-systemfonts
+  (package
+    (name "r-systemfonts")
+    (version "0.1.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "systemfonts" version))
+       (sha256
+        (base32
+         "0m0ljid683xcam2f14x7k2zv1yx4npac38a3gfv11vhxfbnpgp0z"))))
+    (properties `((upstream-name . "systemfonts")))
+    (build-system r-build-system)
+    (inputs
+     `(("fontconfig" ,fontconfig)
+       ("freetype" ,freetype)
+       ("zlib" ,zlib)))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (home-page "https://github.com/r-lib/systemfonts")
+    (synopsis "System native font finding")
+    (description
+     "This package provides system native access to the font catalogue.  As
+font handling varies between systems it is difficult to correctly locate
+installed fonts across different operating systems.  The 'systemfonts' package
+provides bindings to the native libraries for finding font files that can then
+be used further by e.g. graphic devices.")
+    (license license:expat)))
+
+(define-public r-graphlayouts
+  (package
+    (name "r-graphlayouts")
+    (version "0.5.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "graphlayouts" version))
+       (sha256
+        (base32
+         "03dizbhhdhnzbj2i5zvqgs617kwcv4h2pha4f16adic0fph1rxl3"))))
+    (properties `((upstream-name . "graphlayouts")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-igraph" ,r-igraph)
+       ("r-rcpp" ,r-rcpp)
+       ("r-rcpparmadillo" ,r-rcpparmadillo)))
+    (home-page "https://github.com/schochastics/graphlayouts")
+    (synopsis "Additional layout algorithms for network visualizations")
+    (description
+     "This package provides several layout algorithms to visualize networks
+which are not part of the igraph library.  Most are based on the concept of
+stress majorization by Gansner et al. (2004)
+<doi:10.1007/978-3-540-31843-9_25>.  Some more specific algorithms allow to
+emphasize hidden group structures in networks or focus on specific nodes.")
+    (license license:expat)))
+
+(define-public r-tidygraph
+  (package
+    (name "r-tidygraph")
+    (version "1.1.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "tidygraph" version))
+       (sha256
+        (base32
+         "1zpsarm74afbc7p5dlyb0whc09670qdcddw1ckb25cfc9hfh0hjn"))))
+    (properties `((upstream-name . "tidygraph")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-dplyr" ,r-dplyr)
+       ("r-igraph" ,r-igraph)
+       ("r-magrittr" ,r-magrittr)
+       ("r-pillar" ,r-pillar)
+       ("r-r6" ,r-r6)
+       ("r-rcpp" ,r-rcpp)
+       ("r-rlang" ,r-rlang)
+       ("r-tibble" ,r-tibble)
+       ("r-tidyr" ,r-tidyr)))
+    (home-page "https://github.com/thomasp85/tidygraph")
+    (synopsis "Tidy API for graph manipulation")
+    (description
+     "This package provides a graph implementation that can be thought of as
+two tidy data frames describing node and edge data respectively.  It provides
+an approach to manipulate these two virtual data frames using the API defined
+in the @code{dplyr} package, and it also provides tidy interfaces to a lot of
+common graph algorithms.")
+    (license license:expat)))
+
+(define-public r-soupx
+  (let ((commit "a3354be76fb52fd795be6ddf163cf056c05c6cb8")
+        (revision "1"))
+    (package
+      (name "r-soupx")
+      (version (git-version "0.3.1" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/constantAmateur/SoupX")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32
+           "1zmlyzrl0fz6l79gn2wswid670p88mm3y292is89sa5p3h7frr99"))))
+      (properties `((upstream-name . "SoupX")))
+      (build-system r-build-system)
+      (propagated-inputs
+       `(("r-ggplot2" ,r-ggplot2)
+         ("r-matrix" ,r-matrix)
+         ("r-seurat" ,r-seurat)))
+      (home-page "https://github.com/constantAmateur/SoupX")
+      (synopsis "Single cell mRNA Soup eXterminator")
+      (description
+       "This package provides a package for quantifying, profiling and
+removing cell free mRNA contamination (the \"soup\") from droplet based single
+cell RNA-seq experiments.")
+      (license license:gpl2))))
+
+(define-public r-assertr
+  (package
+    (name "r-assertr")
+    (version "2.6")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "assertr" version))
+       (sha256
+        (base32
+         "0g4ii6vhp0155a29ljhs64a09x0nzy5ybvwwchhk4mkcgsvnvfkj"))))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-dplyr" ,r-dplyr)
+       ("r-mass" ,r-mass)
+       ("r-rlang" ,r-rlang)))
+    (native-inputs
+     `(("r-knitr" ,r-knitr)))           ; needed for vignette
+    (home-page "https://github.com/ropensci/assertr")
+    (synopsis "Assertive programming for R analysis pipelines")
+    (description
+     "This package provides functionality to assert conditions that have to be
+met so that errors in data used in analysis pipelines can fail quickly.  It is
+similar to @code{stopifnot()} but more powerful, friendly, and easier for use
+in pipelines.")
+    (license license:expat)))
+
+(define-public r-parameters
+  (package
+    (name "r-parameters")
+    (version "0.1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "parameters" version))
+       (sha256
+        (base32
+         "12v301va1l3xydicbf0k04anxlmyjclbbjfg0riprryhkxwwk8g5"))))
+    (properties `((upstream-name . "parameters")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-bayestestr" ,r-bayestestr)
+       ("r-insight" ,r-insight)))
+    (home-page "https://cran.r-project.org/web/packages/parameters")
+    (synopsis "Processing of model parameters")
+    (description
+     "This package provides utilities for processing the parameters of various
+statistical models.  Beyond computing p values, CIs, and other indices for a
+wide variety of models, this package implements features like standardization
+or bootstrapping of parameters and models, feature reduction (feature
+extraction and variable selection) as well as conversion between indices of
+effect size.")
+    (license license:gpl3)))
+
+(define-public r-rgdal
+  (package
+    (name "r-rgdal")
+    (version "1.4-4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "rgdal" version))
+       (sha256
+        (base32
+         "1my56hdc9x40ynxx1qwqwqxjvjxybmm00w4xg5gi8zgj19pffci5"))))
+    (properties `((upstream-name . "rgdal")))
+    (build-system r-build-system)
+    (inputs
+     `(("gdal" ,gdal)
+       ("proj.4" ,proj.4)
+       ("zlib" ,zlib)))
+    (propagated-inputs
+     `(("r-sp" ,r-sp)))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (home-page "http://rgdal.r-forge.r-project.org")
+    (synopsis "Bindings for the Geospatial Data Abstraction Library")
+    (description
+     "This package provides bindings to the Geospatial Data Abstraction
+Library (GDAL) and access to projection/transformation operations from the
+PROJ.4 library.")
+    (license license:gpl2+)))
+
+(define-public r-insol
+  (package
+    (name "r-insol")
+    (version "1.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "insol" version))
+       (sha256
+        (base32
+         "14ikz05375pjn9hby7kwkhcnykjilbnkdy5i8lsl7c5qdbhmqcm5"))))
+    (properties `((upstream-name . "insol")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-raster" ,r-raster)
+       ("r-rgdal" ,r-rgdal)))
+    (native-inputs
+     `(("gfortran" ,gfortran)))
+    (home-page "https://meteoexploration.com/R/insol/index.html")
+    (synopsis "Tools for calculating solar radiation")
+    (description
+     "This package provides functions to compute insolation on tilted
+surfaces, computes atmospheric transmittance and related parameters such as:
+Earth radius vector, declination, sunset and sunrise, daylength, equation of
+time, vector in the direction of the sun, vector normal to surface, and some
+atmospheric physics.")
+    (license license:gpl2+)))
+
+(define-public r-lifecycle
+  (package
+    (name "r-lifecycle")
+    (version "0.1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "lifecycle" version))
+       (sha256
+        (base32
+         "11rk7hkw63rfrf4aqmb4xrb88kg95xh8hajpjvjfwjym2v02h74n"))))
+    (properties `((upstream-name . "lifecycle")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-glue" ,r-glue)
+       ("r-rlang" ,r-rlang)))
+    (home-page "https://github.com/r-lib/lifecycle")
+    (synopsis "Manage the life cycle of your package functions")
+    (description
+     "Manage the life cycle of your exported functions with shared
+conventions, documentation badges, and non-invasive deprecation warnings.  The
+lifecycle package defines four development stages (experimental, maturing,
+stable, and questioning) and three deprecation stages (soft-deprecated,
+deprecated, and defunct).  It makes it easy to insert badges corresponding to
+these stages in your documentation.  Usage of deprecated functions are
+signalled with increasing levels of non-invasive verbosity.")
+    (license license:gpl3)))
diff --git a/gnu/packages/crates-io.scm b/gnu/packages/crates-io.scm
index e138b93e9b..906a8e66bf 100644
--- a/gnu/packages/crates-io.scm
+++ b/gnu/packages/crates-io.scm
@@ -2019,7 +2019,7 @@ the @code{take_while} predicate returned false after dropping the @code{by_ref}.
 (define-public rust-percent-encoding
   (package
     (name "rust-percent-encoding")
-    (version "2.0.0")
+    (version "2.1.0")
     (source
       (origin
         (method url-fetch)
@@ -2027,7 +2027,7 @@ the @code{take_while} predicate returned false after dropping the @code{by_ref}.
         (file-name (string-append name "-" version ".tar.gz"))
         (sha256
          (base32
-          "0m6rkp3iy11la04p6z3492rns6n693pvmx585dvfmzzlzak2hkxs"))))
+          "0bp3zrsk3kr47fbpipyczidbbx4g54lzxdm77ni1i3qws10mdzfl"))))
     (build-system cargo-build-system)
     (home-page "https://github.com/servo/rust-url/")
     (synopsis "Percent encoding and decoding")
diff --git a/gnu/packages/cups.scm b/gnu/packages/cups.scm
index 4be1eee156..152258a522 100644
--- a/gnu/packages/cups.scm
+++ b/gnu/packages/cups.scm
@@ -636,14 +636,14 @@ printer/driver specific, but spooler-independent PPD file.")
 (define-public foo2zjs
   (package
     (name "foo2zjs")
-    (version "20190517")
+    (version "20190909")
     (source (origin
               (method url-fetch)
               ;; XXX: This is an unversioned URL!
               (uri "http://foo2zjs.rkkda.com/foo2zjs.tar.gz")
               (sha256
                (base32
-                "13gzsd26nq4brx1xzpwmg1qnr4nk7ykgi94qr1hbjqfi561prki4"))))
+                "1nn84c045mbv6yzpjfggc6152bvgrmcxiyvgz9v2w3sws7ihshrm"))))
     (build-system gnu-build-system)
     (arguments
      '(#:phases (modify-phases %standard-phases
diff --git a/gnu/packages/dictionaries.scm b/gnu/packages/dictionaries.scm
index ba22fecf20..37bd4aaf6b 100644
--- a/gnu/packages/dictionaries.scm
+++ b/gnu/packages/dictionaries.scm
@@ -218,7 +218,7 @@ It comes with a German-English dictionary with approximately 270,000 entries.")
 (define-public grammalecte
   (package
     (name "grammalecte")
-    (version "1.3.0")
+    (version "1.4.0")
     (source
      (origin
        (method url-fetch/zipbomb)
@@ -226,10 +226,10 @@ It comes with a German-English dictionary with approximately 270,000 entries.")
                            "Grammalecte-fr-v" version ".zip"))
        (sha256
         (base32
-         "1knysfdd1rx4vc5cmmnry4jsza0cdjy26fv505m854yfmq6zrckd"))))
+         "0k30b9kcczsadjjgwja03rkm11cpcc1xi6w8l6k0qfbjfpkhsh66"))))
     (build-system python-build-system)
     (home-page "https://grammalecte.net")
-    (synopsis  "French spelling and grammar checker")
+    (synopsis "French spelling and grammar checker")
     (description "Grammalecte is a grammar checker dedicated to the French
 language, derived from Lightproof.
 
diff --git a/gnu/packages/education.scm b/gnu/packages/education.scm
index 1ca2b95c19..66e7e22f26 100644
--- a/gnu/packages/education.scm
+++ b/gnu/packages/education.scm
@@ -2,7 +2,7 @@
 ;;; Copyright © 2016 Danny Milosavljevic <dannym@scratchpost.org>
 ;;; Copyright © 2016, 2017 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016 Hartmut Goebel <h.goebel@crazy-compilers.com>
-;;; Copyright © 2017, 2018 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2017, 2018, 2019 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018, 2019 Nicolas Goaziou <mail@nicolasgoaziou.fr>
 ;;;
@@ -27,6 +27,7 @@
   #:use-module (gnu packages base)
   #:use-module (gnu packages bash)
   #:use-module (gnu packages compression)
+  #:use-module (gnu packages curl)
   #:use-module (gnu packages databases)
   #:use-module (gnu packages fonts)
   #:use-module (gnu packages freedesktop)
@@ -36,6 +37,7 @@
   #:use-module (gnu packages gnome)
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages javascript)
+  #:use-module (gnu packages kde)
   #:use-module (gnu packages kde-frameworks) ; extra-cmake-modules
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pkg-config)
@@ -521,3 +523,101 @@ minutes.  For simpler timetables, it may take a shorter time, under
 difficult timetables, it may take a longer time, a matter of hours.")
     (license license:agpl3+)))
 
+(define-public klavaro
+  (package
+    (name "klavaro")
+    (version "3.09")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (string-append "mirror://sourceforge/klavaro/klavaro-"
+                            version ".tar.bz2"))
+        (sha256
+         (base32
+          "12gml7h45b1w9s318h0d5wxw92h7pgajn2kh57j0ak9saq0yb0wr"))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("intltool" ,intltool)
+       ("pkg-config" ,pkg-config)))
+    (inputs
+     `(("cairo" ,cairo)
+       ("curl" ,curl)
+       ("gtk+" ,gtk+)
+       ("pango" ,pango)))
+    (home-page "https://klavaro.sourceforge.io/en/index.html")
+    (synopsis "Touch typing tutor")
+    (description
+     "Klavaro is a simple tutor to teach correct typing, almost independently of
+language and very flexible regarding to new or unknown keyboard layouts.")
+    (license license:gpl3+)))
+
+(define-public ktouch
+  (package
+    (name "ktouch")
+    (version "19.08.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (string-append "mirror://kde/stable/applications/"
+                            version "/src/ktouch-" version ".tar.xz"))
+        (sha256
+         (base32
+          "19rdk94pls75hdvx11hnfk3qpm6l28p9q45q5f04sknxagrfaznr"))))
+    (build-system cmake-build-system)
+    (arguments
+     `(#:modules ((guix build cmake-build-system)
+                  (guix build qt-utils)
+                  (guix build utils))
+       #:imported-modules (,@%cmake-build-system-modules
+                            (guix build qt-utils))
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'configure 'patch-makefiles
+           (lambda* (#:key inputs #:allow-other-keys)
+             (let ((qtdec (assoc-ref inputs "qtdeclarative")))
+               (substitute* '("src/CMakeFiles/ktouch_autogen.dir/build.make"
+                              "src/CMakeFiles/ktouch.dir/build.make")
+                 (("/gnu/store/.*qmlcachegen")
+                  (string-append qtdec "/bin/qmlcachegen"))))
+             #t))
+         (add-after 'install 'wrap-executable
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (wrap-qt-program out "ktouch"))
+             #t)))))
+    (native-inputs
+     `(("extra-cmake-modules" ,extra-cmake-modules)
+       ("kdoctools" ,kdoctools)
+       ("pkg-config" ,pkg-config)))
+    (inputs
+     `(("kcmutils" ,kcmutils)
+       ("kcompletion" ,kcompletion)
+       ("kconfig" ,kconfig)
+       ("kconfigwidgets" ,kconfigwidgets)
+       ("kcoreaddons" ,kcoreaddons)
+       ("kdeclarative" ,kdeclarative)
+       ("ki18n" ,ki18n)
+       ("kiconthemes" ,kiconthemes)
+       ("kitemviews" ,kitemviews)
+       ("kqtquickcharts" ,kqtquickcharts)
+       ("ktextwidgets" ,ktextwidgets)
+       ("kwidgetsaddons" ,kwidgetsaddons)
+       ("kwindowsystem" ,kwindowsystem)
+       ("kxmlgui" ,kxmlgui)
+       ("libxcb" ,libxcb)
+       ("libxkbfile" ,libxkbfile)
+       ("qtbase" ,qtbase)
+       ("qtdeclarative" ,qtdeclarative)
+       ("qtgraphicaleffects" ,qtgraphicaleffects)
+       ("qtquickcontrols2" ,qtquickcontrols2)
+       ("qtx11extras" ,qtx11extras)
+       ("qtxmlpatterns" ,qtxmlpatterns)))
+    (home-page "https://edu.kde.org/ktouch/")
+    (synopsis "Touch typing tutor")
+    (description
+     "KTouch is an aid for learning how to type with speed and accuracy.  It
+provides a sample text to type and indicates which fingers should be used for
+each key.  A collection of lessons are included for a wide range of different
+languages and keyboard layouts, and typing statistics are used to dynamically
+adjust the level of difficulty.")
+    (license license:gpl2)))
diff --git a/gnu/packages/emacs-xyz.scm b/gnu/packages/emacs-xyz.scm
index e3c23ef945..6b9027df8a 100644
--- a/gnu/packages/emacs-xyz.scm
+++ b/gnu/packages/emacs-xyz.scm
@@ -49,7 +49,7 @@
 ;;; Copyright © 2019 LaFreniere, Joseph <joseph@lafreniere.xyz>
 ;;; Copyright © 2019 Amar Singh <nly@disroot.org>
 ;;; Copyright © 2019 Baptiste Strazzulla <bstrazzull@hotmail.fr>
-;;; Copyright © 2019 Giacomo Leidi <goodoldpaul@autitici.org>
+;;; Copyright © 2019 Giacomo Leidi <goodoldpaul@autistici.org>
 ;;; Copyright © 2019 Jens Mølgaard <jens@zete.tk>
 ;;; Copyright © 2019 Amin Bandali <bandali@gnu.org>
 ;;; Copyright © 2019 Jelle Licht <jlicht@fsfe.org>
@@ -2932,7 +2932,7 @@ snippets for yasnippet.")
 (define-public emacs-smart-mode-line
   (package
     (name "emacs-smart-mode-line")
-    (version "2.12.0")
+    (version "2.13")
     (source
      (origin
        (method git-fetch)
@@ -2941,7 +2941,7 @@ snippets for yasnippet.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1gs4ay9hdg8gmia4ir74qawk80pqwv99hp4yhy108kpfry5mrq6z"))))
+        (base32 "164b697xm1rwcggv37dymhf3npbyh2bs59z8b6m5x35lb4c3lf8b"))))
     (build-system emacs-build-system)
     (propagated-inputs
      `(("emacs-rich-minority" ,emacs-rich-minority)))
@@ -3211,14 +3211,14 @@ source code using IPython.")
 (define-public emacs-debbugs
   (package
     (name "emacs-debbugs")
-    (version "0.18")
+    (version "0.19")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://elpa.gnu.org/packages/debbugs-"
                                   version ".tar"))
               (sha256
                (base32
-                "00kich80zdg7v3v613f9prqddkpwpm1nf9sj10f0n6wh15rzwv07"))))
+                "0cpby8f088cqb5mpd756a2mb706x763k15cg2xdmmsxl415k3yw4"))))
     (build-system emacs-build-system)
     (arguments '(#:include '("\\.el$" "\\.wsdl$" "\\.info$")))
     (propagated-inputs
@@ -6008,7 +6008,7 @@ indentation guides in Emacs:
 (define-public emacs-elpy
   (package
     (name "emacs-elpy")
-    (version "1.28.0")
+    (version "1.31.0")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -6017,7 +6017,7 @@ indentation guides in Emacs:
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "073bwxwjzcbmvpcz9q2xjwzx9x7hkvjni6fwvikh6yawzjp56jis"))))
+                "0bvmgqs3c80bhs9v5ymgadv7vk4iamha10y7rl09pixmjm4mzagk"))))
     (build-system emacs-build-system)
     (arguments
      `(#:include (cons* "^elpy/[^/]+\\.py$" "^snippets\\/" %default-include)
@@ -13189,16 +13189,17 @@ compilation/grep buffers.  Works with @code{wgrep}, @code{ack}, @code{ag},
 (define-public emacs-interactive-align
   (package
     (name "emacs-interactive-align")
-    (version "0.1.0")
+    (version "0.4.2")
     (source
      (origin
-       (method url-fetch)
-       (uri (string-append "https://github.com/mkcms/interactive-align/"
-                           "archive/" "v" version ".tar.gz"))
-       (file-name (string-append name "-" version ".tar.gz"))
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/mkcms/interactive-align.git")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
        (sha256
         (base32
-         "0sibpgb4lp6yy3pziak8f3hz4b28yj0dqy2nzh51z3d0b63h528m"))))
+         "0bh03w91i622hbar5dcq631ndxx1y8kd3h655pgw1g0lqkv1mlnc"))))
     (build-system emacs-build-system)
     (home-page "https://github.com/mkcms/interactive-align/")
     (synopsis "Interactive align-regexp command in Emacs")
@@ -13668,7 +13669,7 @@ through the symbol: @command{this-fn}.")
 (define-public emacs-dumb-jump
   (package
     (name "emacs-dumb-jump")
-    (version "0.5.2")
+    (version "0.5.3")
     (source
      (origin
        (method git-fetch)
@@ -13677,7 +13678,7 @@ through the symbol: @command{this-fn}.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "00ph85vp8sa3k99qrdxfz4l8zx121q9xf47vvspzg26bk9l4nwin"))))
+        (base32 "1njf60264snhxrd36m4z687lqfkis0p9mmrr7cf1c8l0lfdvawxi"))))
     (build-system emacs-build-system)
     (arguments
      `(#:tests? #f ; FIXME: Tests freeze when run.
@@ -14260,30 +14261,29 @@ on-line service.")
     (license license:gpl3+)))
 
 (define-public emacs-helm-company
-  (let ((commit "d3fc093a0e833b4dee6561c00d6df3d62aa50f3f"))
-    (package
-      (name "emacs-helm-company")
-      (version (git-version "0.2.3" "1" commit))
-      (source
-       (origin
-         (method git-fetch)
-         (uri (git-reference
-               (url "https://github.com/Sodel-the-Vociferous/helm-company")
-               (commit commit)))
-         (file-name (git-file-name name version))
-         (sha256
-          (base32
-           "1ciirsanhajdqm5iwl8k9ywf4jha1wdv4sc4d9kslyrfr9zn4q6k"))))
-      (build-system emacs-build-system)
-      (propagated-inputs
-       `(("emacs-helm" ,emacs-helm)
-         ("emacs-company" ,emacs-company)))
-      (home-page "https://github.com/Sodel-the-Vociferous/helm-company")
-      (synopsis "Helm interface for company-mode")
-      (description
-       "This is a Helm interface to company-mode, a text completion
+  (package
+    (name "emacs-helm-company")
+    (version "0.2.5")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/Sodel-the-Vociferous/helm-company")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "1ci37w6ahnqrfpb284gjvxmimlf61sdxb9k192yy9q983cksv2hx"))))
+    (build-system emacs-build-system)
+    (propagated-inputs
+     `(("emacs-helm" ,emacs-helm)
+       ("emacs-company" ,emacs-company)))
+    (home-page "https://github.com/Sodel-the-Vociferous/helm-company")
+    (synopsis "Helm interface for company-mode")
+    (description
+     "This is a Helm interface to company-mode, a text completion
 framework.")
-      (license license:gpl3+))))
+    (license license:gpl3+)))
 
 (define-public emacs-helm-descbinds
   (let ((commit "033be73f21778633813264ce1634a6e1ad873d8e"))
@@ -17804,17 +17804,17 @@ connections using TLS encryption.")
 (define-public emacs-zerodark-theme
   (package
     (name "emacs-zerodark-theme")
-    (version "4.5")
+    (version "4.6")
     (source
      (origin
        (method git-fetch)
        (uri (git-reference
-             (url "https://gitlab.petton.fr/nico/zerodark-theme.git")
+             (url "https://github.com/NicolasPetton/zerodark-theme")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "0nnlxzsmhsbszqigcyxak9i1a0digrd13gv6v18ck4h760mihh1m"))))
+         "0pfyd1iqs7l2ngwgvj9n0r9k1px7yl16h8n502xdyf0pprxcs4p6"))))
     (build-system emacs-build-system)
     (propagated-inputs
      `(("emacs-flycheck" ,emacs-flycheck)
@@ -18171,3 +18171,91 @@ JIRA issue servers.")
        "This packages fontifies the ssh config keywords and creates
 keybindings for skipping from host section to host section.")
       (license license:gpl3+))))
+
+(define-public emacs-tao-theme
+  (let ((commit "c5107fbe7e752f4e58c2d2147ff18a1ebb12937c")
+        (revision "0"))
+    (package
+      (name "emacs-tao-theme")
+      (version (git-version "0" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/11111000000/tao-theme-emacs.git")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32
+           "07vvlglmkj87hpxz79s3bl2cjn71vain57fdxs7j9vlr5jkchxwn"))))
+      (build-system emacs-build-system)
+      (home-page "https://github.com/11111000000/tao-theme-emacs")
+      (synopsis "Parameterized uncolored color themes for Emacs")
+      (description
+       "This package provides two parameterized uncolored color themes for
+Emacs: @code{tao-yin} and @code{tao-yang}.  The default
+@code{tao-theme-scale-fn} is @code{tao-theme-golden-scale}.
+
+You can customize: @code{tao-theme-scale-fn}, that returns 16 2-digit numbers;
+@code{tao-theme-scale-filter-fn}, for edge filter; and
+@code{tao-theme-use-height}.")
+      (license license:gpl3+))))
+
+(define-public emacs-doom-themes
+  (package
+    (name "emacs-doom-themes")
+    (version "2.1.6")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/hlissner/emacs-doom-themes.git")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32 "042pzcdhxi2z07jcscgjbaki9nrrm0cbgbbrnymd1r4q8ckkn8l9"))))
+    (build-system emacs-build-system)
+    (native-inputs
+     `(("emacs-ert-runner" ,emacs-ert-runner)))
+    (arguments
+     `(#:tests? #t
+       #:test-command '("ert-runner")
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'move-themes
+           (lambda _
+             ;; Move the source files to the top level, which is in the
+             ;; EMACSLOADPATH.
+             (for-each (lambda (f)
+                         (rename-file f (basename f)))
+                       (find-files "./themes" ".*\\.el$"))
+             #t)))))
+    (synopsis "Wide collection of color themes for Emacs")
+    (description "Emacs-doom-themes contains numerous popular color themes for
+Emacs that integrate with major modes like Org-mode.")
+    (home-page "https://github.com/hlissner/emacs-doom-themes")
+    (license license:expat)))
+
+(define-public emacs-elixir-mode
+  (package
+    (name "emacs-elixir-mode")
+    (version "2.3.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://stable.melpa.org/packages/elixir-mode-"
+             version
+             ".tar"))
+       (sha256
+        (base32
+         "091cizxg1aw8bkj58y048mj020ssapjflav633z9bl6gmi10dy4v"))))
+    (build-system emacs-build-system)
+    (propagated-inputs
+     `(("emacs-pkg-info" ,emacs-pkg-info)))
+    (home-page
+     "https://github.com/elixir-editors/emacs-elixir")
+    (synopsis "Major mode for editing Elixir files")
+    (description
+     "Elixir-Mode Provides font-locking, indentation and navigation support
+ for the Elixir programming language.")
+    (license license:gpl3+)))
diff --git a/gnu/packages/emulators.scm b/gnu/packages/emulators.scm
index 75a2e245f6..449c694612 100644
--- a/gnu/packages/emulators.scm
+++ b/gnu/packages/emulators.scm
@@ -399,7 +399,7 @@ Super Game Boy, BS-X Satellaview, and Sufami Turbo.")
 (define-public mgba
   (package
     (name "mgba")
-    (version "0.7.2")
+    (version "0.7.3")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -408,7 +408,7 @@ Super Game Boy, BS-X Satellaview, and Sufami Turbo.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0g0xa1mzvan0sl1p5c784j2g5mcw9kd2b7wiahy06gy0c1nmbcnp"))
+                "1wrmwh50rv8bd328r8cisrihq6h90kx2bfb0vmjfbsd3l1jvgrgm"))
               (modules '((guix build utils)))
               (snippet
                ;; Make sure we don't use the bundled software.
@@ -1048,7 +1048,7 @@ emulation community.  It provides highly accurate emulation.")
 (define-public retroarch
   (package
     (name "retroarch")
-    (version "1.7.8")
+    (version "1.7.8.4")
     (source
      (origin
        (method git-fetch)
@@ -1057,7 +1057,7 @@ emulation community.  It provides highly accurate emulation.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0jwy5winrm87s6xa645fwa47x242r25m6i3rwf10x59448bd19r6"))))
+        (base32 "1i3i23xwvmck8k2fpalr49np7xjzfg507243mybqrljawlnbxvph"))))
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f                      ; no tests
diff --git a/gnu/packages/engineering.scm b/gnu/packages/engineering.scm
index 7f5409c835..c1c1b18ed3 100644
--- a/gnu/packages/engineering.scm
+++ b/gnu/packages/engineering.scm
@@ -65,6 +65,7 @@
   #:use-module (gnu packages glib)
   #:use-module (gnu packages gnome)
   #:use-module (gnu packages gperf)
+  #:use-module (gnu packages graphics)
   #:use-module (gnu packages groff)
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages guile)
@@ -89,6 +90,7 @@
   #:use-module (gnu packages tex)
   #:use-module (gnu packages version-control)
   #:use-module (gnu packages wxwidgets)
+  #:use-module (gnu packages xml)
   #:use-module (gnu packages xorg))
 
 (define-public librecad
@@ -2145,3 +2147,70 @@ well as conversion and validation tools for input and output data.  The
 specification can be downloaded at @url{http://3mf.io/specification/}.")
     (home-page "https://3mf.io/")
     (license license:bsd-2)))
+
+(define-public openscad
+  (package
+    (name "openscad")
+    (version "2019.05")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://files.openscad.org/openscad-" version
+                           ".src.tar.gz"))
+       (sha256
+        (base32
+         "0nbgk5q5pgnw53la0kccdcpz2f4xf6d6076rkn0q08z57hkc85ha"))))
+    (build-system cmake-build-system)
+    (inputs
+     `(("boost" ,boost)
+       ("cgal" ,cgal)
+       ("double-conversion" ,double-conversion)
+       ("eigen" ,eigen)
+       ("fontconfig" ,fontconfig)
+       ("glew" ,glew)
+       ("gmp" ,gmp)
+       ("harfbuzz" ,harfbuzz)
+       ("lib3mf" ,lib3mf)
+       ("libxml2" ,libxml2)
+       ("libzip" ,libzip)
+       ("mpfr" ,mpfr)
+       ("opencsg" ,opencsg)
+       ("qscintilla" ,qscintilla)
+       ("qtbase" ,qtbase)
+       ("qtmultimedia" ,qtmultimedia)))
+    (native-inputs
+     `(("bison" ,bison)
+       ("flex" ,flex)
+       ("gettext" ,gettext-minimal)
+       ("pkg-config" ,pkg-config)
+       ("which" ,which)
+       ;; the following are only needed for tests
+       ("imagemagick" ,imagemagick)
+       ("ps" ,procps)
+       ("python" ,python)
+       ("xvfb" ,xorg-server)))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'configure
+           (lambda* (#:key outputs #:allow-other-keys)
+             (invoke "qmake"
+                     (string-append "PREFIX=" (assoc-ref outputs "out")))
+             #t))
+         (replace 'check
+           (lambda _
+             (with-directory-excursion "tests"
+               (invoke "cmake" ".")
+               (invoke "make")
+               (invoke "ctest"))
+             ;; strip python test files since lib dir ends up in out/share
+             (for-each delete-file
+                       (find-files "libraries/MCAD" ".*\\.py"))
+             #t)))))
+    (synopsis "Script-based 3D modeling application")
+    (description
+     "OpenSCAD is a 3D Computer-aided Design (CAD) application.  Unlike an
+interactive modeler, OpenSCAD generates 3D models from a script, giving you
+full programmatic control over your models.")
+    (home-page "https://www.openscad.org/")
+    (license license:gpl2+)))
diff --git a/gnu/packages/finance.scm b/gnu/packages/finance.scm
index e8c4e6bc9d..3f5f7b1285 100644
--- a/gnu/packages/finance.scm
+++ b/gnu/packages/finance.scm
@@ -476,16 +476,20 @@ other machines/servers.  Electroncash does not download the Bitcoin Cash blockch
        ("git" ,git)
        ("graphviz" ,graphviz)
        ("pkg-config" ,pkg-config)
+       ("protobuf" ,protobuf)
+       ("python" ,python)
        ("qttools" ,qttools)))
     (inputs
      `(("boost" ,boost)
        ("cppzmq" ,cppzmq)
        ("expat" ,expat)
        ("hidapi" ,hidapi)
-       ("libunwind" ,libunwind)
        ("libsodium" ,libsodium)
+       ("libunwind" ,libunwind)
+       ("libusb" ,libusb)
        ("miniupnpc" ,miniupnpc)
        ("openssl" ,openssl)
+       ("protobuf" ,protobuf)
        ("rapidjson" ,rapidjson)
        ("readline" ,readline)
        ("unbound" ,unbound)
@@ -493,9 +497,12 @@ other machines/servers.  Electroncash does not download the Bitcoin Cash blockch
        ("zeromq" ,zeromq)))
     (arguments
      `(#:out-of-source? #t
-       #:configure-flags '("-DARCH=default"
-                           "-DBUILD_TESTS=ON"
-                           "-DBUILD_GUI_DEPS=ON")
+       #:configure-flags
+       (list "-DARCH=default"
+             "-DBUILD_TESTS=ON"
+             "-DBUILD_GUI_DEPS=ON"
+             (string-append "-DReadline_ROOT_DIR="
+                            (assoc-ref %build-inputs "readline")))
        #:phases
        (modify-phases %standard-phases
          ;; tests/core_tests need a valid HOME
@@ -534,7 +541,13 @@ other machines/servers.  Electroncash does not download the Bitcoin Cash blockch
                      ":")))
                (invoke "tests/unit_tests/unit_tests"
                        (string-append "--gtest_filter=-"
-                                      excluded-unit-tests))))))))
+                                      excluded-unit-tests)))))
+         (add-after 'install 'delete-dead-links
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (delete-file (string-append out "/lib/libprotobuf.so"))
+               (delete-file (string-append out "/lib/libusb-1.0.so"))
+               #t))))))
     (home-page "https://getmonero.org/")
     (synopsis "Command-line interface to the Monero currency")
     (description
@@ -545,7 +558,7 @@ the Monero command line client and daemon.")
 (define-public monero-gui
   (package
     (name "monero-gui")
-    (version "0.14.1.0")
+    (version "0.14.1.2")
     (source
      (origin
        (method git-fetch)
@@ -555,7 +568,7 @@ the Monero command line client and daemon.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "0ilx47771faygf97wilm64xnqxgxa3b43q0g9v014npk0qj8pc31"))))
+         "1rm043r6y2mzy8pclnzbjjfxgps8pkfa2b92p66k8y8rdmgq6m1k"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)
@@ -563,9 +576,11 @@ the Monero command line client and daemon.")
     (inputs
      `(("boost" ,boost)
        ("hidapi" ,hidapi)
-       ("libunwind" ,libunwind)
        ("libsodium" ,libsodium)
+       ("libunwind" ,libunwind)
+       ("libusb" ,libusb)
        ("openssl" ,openssl)
+       ("protobuf" ,protobuf)
        ("qtbase" ,qtbase)
        ("qtdeclarative" ,qtdeclarative)
        ("qtgraphicaleffects" ,qtgraphicaleffects)
diff --git a/gnu/packages/freedesktop.scm b/gnu/packages/freedesktop.scm
index b1368cb72e..8a302ba5bc 100644
--- a/gnu/packages/freedesktop.scm
+++ b/gnu/packages/freedesktop.scm
@@ -925,15 +925,15 @@ interfaces, based on the useradd, usermod and userdel commands.")
 (define-public libmbim
   (package
     (name "libmbim")
-    (version "1.18.2")
+    (version "1.20.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
-                    "https://www.freedesktop.org/software/" name "/"
-                    name "-" version ".tar.xz"))
+                    "https://www.freedesktop.org/software/libmbim/"
+                    "libmbim-" version ".tar.xz"))
               (sha256
                (base32
-                "0s4jsfsydp2vykv7lnimalp9i680aas1qcx7zdpjiic64b5g48vp"))))
+                "0rm8j4zh9gnb3yi324cnxy91gdimc1vg5gv1kxc2m5lymb3wdxrc"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("glib:bin" ,glib "bin") ; for glib-mkenums
diff --git a/gnu/packages/game-development.scm b/gnu/packages/game-development.scm
index 7eac935a69..bb4c1d26bb 100644
--- a/gnu/packages/game-development.scm
+++ b/gnu/packages/game-development.scm
@@ -314,6 +314,16 @@ provide connectivity for client applications written in any language.")
         (base32
          "1pmvvm3sgnpngfa7884mqhq3fwdjh9sr0ca07ypnidcg0y341w53"))))
     (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-before 'build 'fix-pillow
+           (lambda _
+             ;; pillow's version is not in PIL.Image.VERSION anymore
+             (substitute* "nml/version_info.py"
+               (("from PIL import Image") "import PIL")
+               (("Image.VERSION") "PIL.__version__"))
+             #t)))))
     (propagated-inputs
      `(("python-pillow" ,python-pillow)
        ("python-ply" ,python-ply)))
diff --git a/gnu/packages/games.scm b/gnu/packages/games.scm
index 26170f1cad..d41d3e1f66 100644
--- a/gnu/packages/games.scm
+++ b/gnu/packages/games.scm
@@ -2213,7 +2213,24 @@ also available.")
        (modify-phases %standard-phases
          (add-before
           'configure 'link-libm
-          (lambda _ (setenv "LIBS" "-lm"))))))
+          (lambda _ (setenv "LIBS" "-lm")))
+         (add-after 'install 'create-desktop-entry
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (apps (string-append out "/share/applications")))
+               (mkdir-p apps)
+               (with-output-to-file
+                 (string-append apps "/gnujump.desktop")
+                 (lambda _
+                   (format #t
+                           "[Desktop Entry]~@
+                           Name=GNUjump~@
+                           Comment=Jump up the tower to survive~@
+                           Exec=~a/bin/gnujump~@
+                           Terminal=false~@
+                           Type=Application~@
+                           Categories=Game;ArcadeGame~%"
+                           out)))))))))
     (inputs
      `(("glu" ,glu)
        ("mesa" ,mesa)
diff --git a/gnu/packages/gnome.scm b/gnu/packages/gnome.scm
index a2a5f98b76..520d04d75f 100644
--- a/gnu/packages/gnome.scm
+++ b/gnu/packages/gnome.scm
@@ -39,6 +39,8 @@
 ;;; Copyright © 2019 Giacomo Leidi <goodoldpaul@autistici.org>
 ;;; Copyright © 2019 Jelle Licht <jlicht@fsfe.org>
 ;;; Copyright © 2019 Jonathan Frederickson <jonathan@terracrypt.net>
+;;; Copyright © 2019 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2019 Martin Becze <mjbecze@riseup.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -65,6 +67,7 @@
   #:use-module (gnu packages base)
   #:use-module (gnu packages bash)
   #:use-module (gnu packages bison)
+  #:use-module (gnu packages boost)
   #:use-module (gnu packages build-tools)
   #:use-module (gnu packages calendar)
   #:use-module (gnu packages cdrom)
@@ -2626,7 +2629,7 @@ library.")
               (method url-fetch)
               (uri (string-append "mirror://gnome/sources/glib-networking/"
                                   (version-major+minor version) "/"
-                                  name "-" version ".tar.xz"))
+                                  "glib-networking-" version ".tar.xz"))
               (sha256
                (base32
                 "1mfw44qpmwvz6yzj8c6spx6z357wrmkk15byrkc5byagd82860fm"))))
@@ -2689,7 +2692,7 @@ libxml to ease remote use of the RESTful API.")
               (method url-fetch)
               (uri (string-append "mirror://gnome/sources/libsoup/"
                                   (version-major+minor version) "/"
-                                  name "-" version ".tar.xz"))
+                                  "libsoup-" version ".tar.xz"))
               (sha256
                (base32
                 "0amfw1yvy1kjrg41rfh2vvrw5gkwnyckqbw1fab50hm6xc1acbmx"))))
@@ -2795,16 +2798,16 @@ and the GLib main loop, to integrate well with GNOME applications.")
 (define-public libsecret
   (package
     (name "libsecret")
-    (version "0.18.8")
+    (version "0.19.1")
     (source (origin
               (method url-fetch)
               (uri (string-append
                     "mirror://gnome/sources/libsecret/"
                     (version-major+minor version) "/"
-                    name "-" version ".tar.xz"))
+                    "libsecret-" version ".tar.xz"))
               (sha256
                (base32
-                "058x64689k55wxfkdp4svhnwvv8jmqm7z5mrynybl38f4sfqiyiv"))))
+                "0fhflcsr70b1pps2pcvqcbdhip2ny5am9nbm634f4sj5g40y30w5"))))
     (build-system gnu-build-system)
     (outputs '("out" "doc"))
     (arguments
@@ -3353,7 +3356,7 @@ playlists in a variety of formats.")
 (define-public aisleriot
   (package
     (name "aisleriot")
-    (version "3.22.8")
+    (version "3.22.9")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://gnome/sources/aisleriot/"
@@ -3361,7 +3364,7 @@ playlists in a variety of formats.")
                                   "aisleriot-" version ".tar.xz"))
               (sha256
                (base32
-                "15pm39679ymxki07sb5nvhycz4z53zwbvascyp5wm4864bn98815"))))
+                "0yzdh9cw5cjjgvfh75bihl968czlgfmpmn1z0fdk88sgvpjgzwji"))))
     (build-system glib-or-gtk-build-system)
     (arguments
      '(#:configure-flags
@@ -4204,9 +4207,9 @@ part of udev-extras, then udev, then systemd.  It's now a project on its own.")
     (version "1.40.1")
     (source (origin
               (method url-fetch)
-              (uri (string-append "mirror://gnome/sources/" name "/"
+              (uri (string-append "mirror://gnome/sources/gvfs/"
                                   (version-major+minor version) "/"
-                                  name "-" version ".tar.xz"))
+                                  "gvfs-" version ".tar.xz"))
               (sha256
                (base32
                 "1cfnzamr4mvgpf6yhm28lh9cafy9z6842s8jpbqnfizfxybg8ylj"))))
@@ -5902,15 +5905,15 @@ providing graphical log-ins and managing local and remote displays.")
 (define-public libgtop
   (package
     (name "libgtop")
-    (version "2.38.0")
+    (version "2.40.0")
     (source (origin
               (method url-fetch)
-              (uri (string-append "mirror://gnome/sources/" name "/"
+              (uri (string-append "mirror://gnome/sources/libgtop/"
                                   (version-major+minor version) "/"
-                                  name "-" version ".tar.xz"))
+                                  "libgtop-" version ".tar.xz"))
               (sha256
                (base32
-                "04mnxgzyb26wqk6qij4iw8cxwl82r8pcsna5dg8vz2j3pdi0wv2g"))))
+                "1m6jbqk8maa52gxrf223442fr5bvvxgb7ham6v039i3r1i62gwvq"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("gobject-introspection" ,gobject-introspection)
@@ -6295,9 +6298,9 @@ easy, safe, and automatic.")
     (version "2.0.4")
     (source (origin
               (method url-fetch)
-              (uri (string-append "mirror://gnome/sources/" name "/"
+              (uri (string-append "mirror://gnome/sources/tracker/"
                                   (version-major+minor version) "/"
-                                  name "-" version ".tar.xz"))
+                                  "tracker-" version ".tar.xz"))
               (sha256
                (base32
                 "1mfc5lv820kr7ssi7hldn25gmshh65k19kh478qjsnb64sshsbyf"))))
@@ -7224,9 +7227,9 @@ compiled.")
     (source (origin
               (method url-fetch)
               (uri (string-append
-                    "mirror://gnome/sources/" name "/"
+                    "mirror://gnome/sources/gfbgraph/"
                     (version-major+minor version) "/"
-                    name "-" version ".tar.xz"))
+                    "gfbgraph-" version ".tar.xz"))
               (sha256
                (base32
                 "1dp0v8ia35fxs9yhnqpxj3ir5lh018jlbiwifjfn8ayy7h47j4fs"))))
@@ -7994,7 +7997,7 @@ configurable file renaming. ")
 (define-public workrave
   (package
     (name "workrave")
-    (version "1.10.23")
+    (version "1.10.34")
     (source
      (origin
        (method git-fetch)
@@ -8005,20 +8008,20 @@ configurable file renaming. ")
                                          version)))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1qhlwfhwk5agv4904d6bsf83k9k89q7bms6agg967vsca4905vcw"))))
+        (base32 "0czwhr7nw523753ajcjjfwrf91mq8pmzr19gp0srqsvb1dsn1zcf"))))
     (build-system glib-or-gtk-build-system)
-    (propagated-inputs `(("glib" ,glib)
-                         ("gtk+" ,gtk+)
-                         ("gdk-pixbuf" ,gdk-pixbuf)
-                         ("gtkmm" ,gtkmm)
-                         ("glibmm" ,glibmm)
-                         ("libx11" ,libx11)
-                         ("libxtst" ,libxtst)
-                         ("dconf" ,dconf)
-                         ("libice" ,libice)))
-    (inputs `(("libsm" ,libsm)
-              ("python-cheetah" ,python2-cheetah)))
-    (native-inputs `(("glib" ,glib "bin")
+    (inputs `(("glib" ,glib)
+              ("gtk+" ,gtk+)
+              ("gdk-pixbuf" ,gdk-pixbuf)
+              ("gtkmm" ,gtkmm)
+              ("glibmm" ,glibmm)
+              ("libx11" ,libx11)
+              ("libxtst" ,libxtst)
+              ("dconf" ,dconf)
+              ("libice" ,libice)
+              ("libsm" ,libsm)
+              ("libxscrnsaver" ,libxscrnsaver)))
+    (native-inputs `(("boost" ,boost)
                      ("pkg-config" ,pkg-config)
                      ("gettext" ,gnu-gettext)
                      ("autoconf" ,autoconf)
@@ -8026,9 +8029,9 @@ configurable file renaming. ")
                      ("automake" ,automake)
                      ("libtool" ,libtool)
                      ("intltool" ,intltool)
-                     ("libxscrnsaver" ,libxscrnsaver)
                      ("gobject-introspection" ,gobject-introspection)
-                     ("python2" ,python-2)))
+                     ("python3" ,python-3)
+                     ("python-jinja2" ,python-jinja2)))
     (synopsis "Tool to help prevent repetitive strain injury (RSI)")
     (description
      "Workrave is a program that assists in the recovery and prevention of
@@ -8147,7 +8150,7 @@ generic enough to work for everyone.")
          (add-after 'install 'glib-or-gtk-wrap
            (assoc-ref glib-or-gtk:%standard-phases 'glib-or-gtk-wrap)))))
     (native-inputs
-     `(("glib" ,glib "bin")               ; glib-mkenums
+     `(("glib" ,glib "bin")             ; glib-mkenums
        ("pkg-config" ,pkg-config)
        ("intltool" ,intltool)
        ("itstool" ,itstool)))
@@ -8155,6 +8158,7 @@ generic enough to work for everyone.")
      `(("enchant" ,enchant)
        ("evolution-data-server" ,evolution-data-server) ; must be the same version
        ("gcr" ,gcr)
+       ("gsettings-desktop-schemas" ,gsettings-desktop-schemas)
        ("gnome-autoar" ,gnome-autoar)
        ("gnome-desktop" ,gnome-desktop)
        ("gtkspell3" ,gtkspell3)
diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm
index 95a35368fa..56db412145 100644
--- a/gnu/packages/gnupg.scm
+++ b/gnu/packages/gnupg.scm
@@ -442,7 +442,7 @@ gpgpme starting with version 1.7.")
 (define-public guile-gcrypt
   (package
     (name "guile-gcrypt")
-    (version "0.1.0")
+    (version "0.2.0")
     (home-page "https://notabug.org/cwebber/guile-gcrypt")
     (source (origin
               (method git-fetch)
@@ -451,7 +451,7 @@ gpgpme starting with version 1.7.")
                     (commit (string-append "v" version))))
               (sha256
                (base32
-                "1lhgh3105yi0ggrjsjibv4wp1ipz8s17pa820hk2wln3rc04wpvf"))
+                "1mhc5m4xygkfj7x18f8apiqpfdn9mrql0am5sk13cf5xn8x1r63z"))
               (file-name (string-append name "-" version "-checkout"))))
     (build-system gnu-build-system)
     (native-inputs
@@ -915,6 +915,34 @@ bytes (whether by hand, OCR, QR code, or the like) and paperkey can use
 them to transform your existing public key into a secret key.")
     (license license:gpl2+)))
 
+(define-public pgpdump
+  (package
+    (name "pgpdump")
+    (version "0.33")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://www.mew.org/~kazu/proj/pgpdump/pgpdump-"
+                           version ".tar.gz"))
+       (sha256
+        (base32 "1j001jra2m89n6cys3n0hs574bipjdzfxhzpnd4jfyv95mqwl7n4"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f ; no make check
+       #:configure-flags (list "--prefix=/")
+       #:make-flags (list "CC=gcc"
+                          (string-append "DESTDIR=" (assoc-ref %outputs "out")))))
+    (inputs
+     `(("zlib" ,zlib)))
+    (home-page "https://www.mew.org/~kazu/proj/pgpdump/en/")
+    (synopsis "PGP packet visualizer")
+    (description "pgpdump displays the sequence of OpenPGP or PGP version 2
+packets from a file.
+
+The output of this command is similar to GnuPG's list packets command,
+however, pgpdump produces more detailed and easier to understand output.")
+    (license license:bsd-3)))
+
 (define-public gpa
   (package
     (name "gpa")
diff --git a/gnu/packages/graph.scm b/gnu/packages/graph.scm
index 8b06aaa0e9..bde8b44a30 100644
--- a/gnu/packages/graph.scm
+++ b/gnu/packages/graph.scm
@@ -139,14 +139,14 @@ more.")
 (define-public r-diffusionmap
   (package
     (name "r-diffusionmap")
-    (version "1.1-0.1")
+    (version "1.2.0")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "diffusionMap" version))
        (sha256
         (base32
-         "11l4kbciawvli5nlsi4qaf8afmgk5xgqiqpdyhvaqri5mx0zhk5j"))))
+         "1rvk7069brlm1s9kqj4c31mwwr3mw4hmhay95cjjjfmw5xclff2j"))))
     (properties `((upstream-name . "diffusionMap")))
     (build-system r-build-system)
     (propagated-inputs
diff --git a/gnu/packages/graphics.scm b/gnu/packages/graphics.scm
index 33abdd79a2..b3518efc5f 100644
--- a/gnu/packages/graphics.scm
+++ b/gnu/packages/graphics.scm
@@ -13,6 +13,7 @@
 ;;; Copyright © 2018 Kei Kebreau <kkebreau@posteo.net>
 ;;; Copyright © 2019 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2019 Carlo Zancanaro <carlo@zancanaro.id.au>
+;;; Copyright © 2019 Steve Sprang <scs@stevesprang.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1019,3 +1020,43 @@ requirements.")
 performance subdivision surface (subdiv) evaluation on massively parallel CPU
 and GPU architectures.")
     (license license:asl2.0)))
+
+(define-public opencsg
+  (let ((dot-to-dash (lambda (c) (if (char=? c #\.) #\- c))))
+    (package
+      (name "opencsg")
+      (version "1.4.2")
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/floriankirsch/OpenCSG.git")
+               (commit (string-append "opencsg-"
+                                      (string-map dot-to-dash version)
+                                      "-release"))))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32
+           "00m4vs6jn3scqczscc4591l1d6zg6anqp9v1ldf9ymf70rdyvm7m"))))
+      (build-system gnu-build-system)
+      (arguments
+       `(#:phases
+         (modify-phases %standard-phases
+           (replace 'configure
+             (lambda* (#:key outputs #:allow-other-keys)
+               (substitute* "src/Makefile"
+                 (("/usr/local") (assoc-ref outputs "out")))
+               #t))
+           (add-before 'build 'skip-example
+             (lambda _ (chdir "src") #t)))))
+      (inputs
+       `(("glew" ,glew)
+         ("freeglut" ,freeglut)))
+      (synopsis "Library for rendering Constructive Solid Geometry (CSG)")
+      (description
+       "OpenCSG is a library for rendering Constructive Solid Geometry (CSG) using
+OpenGL.  CSG is an approach for modeling complex 3D-shapes using simpler ones.
+For example, two shapes can be combined by uniting them, by intersecting them,
+or by subtracting one shape from the other.")
+      (home-page "http://www.opencsg.org/")
+      (license license:gpl2))))
diff --git a/gnu/packages/guile-xyz.scm b/gnu/packages/guile-xyz.scm
index b765ef36e1..2f974ee63b 100644
--- a/gnu/packages/guile-xyz.scm
+++ b/gnu/packages/guile-xyz.scm
@@ -5,7 +5,7 @@
 ;;; Copyright © 2016 Alex Sassmannshausen <alex@pompo.co>
 ;;; Copyright © 2016, 2017, 2018, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016 Erik Edrosa <erik.edrosa@gmail.com>
-;;; Copyright © 2016 Eraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016, 2019 Eraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016, 2017 Alex Kost <alezost@gmail.com>
 ;;; Copyright © 2016, 2017 Adonay "adfeno" Felipe Nogueira <https://libreplanet.org/wiki/User:Adfeno> <adfeno@openmailbox.org>
 ;;; Copyright © 2016 Amirouche <amirouche@hypermove.net>
@@ -48,7 +48,6 @@
   #:use-module (gnu packages compression)
   #:use-module (gnu packages databases)
   #:use-module (gnu packages disk)
-  #:use-module (gnu packages ed)
   #:use-module (gnu packages emacs)
   #:use-module (gnu packages emacs-xyz)
   #:use-module (gnu packages gawk)
@@ -1926,30 +1925,17 @@ is no support for parsing block and inline level HTML.")
 (define-public mcron
   (package
     (name "mcron")
-    (version "1.1.1")
+    (version "1.1.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://gnu/mcron/mcron-"
                                   version ".tar.gz"))
               (sha256
                (base32
-                "1i9mcp6r6my61zfiydsm3n6my41mwvl7dfala4q29qx0zn1ynlm4"))))
+                "069m3ri7nc8lgy3h9ka7gj3v3anqj69x9jw4l3cfq65nqkxsch4g"))))
     (build-system gnu-build-system)
     (arguments
      '(#:phases (modify-phases %standard-phases
-                  (add-before 'check 'set-timezone
-                    (lambda* (#:key inputs #:allow-other-keys)
-                      ;; 'tests/job-specifier.scm' expects to be running in
-                      ;; UTC-2 or something.
-                      ;; FIXME: This issue is being investigated upstream, for
-                      ;; now we'll just skip the tests (see below):
-                      ;; <https://lists.gnu.org/archive/html/bug-mcron/2018-04/msg00005.html>.
-                      (let ((tzdata (assoc-ref inputs "tzdata")))
-                        (setenv "TZDIR"
-                                (string-append tzdata
-                                               "/share/zoneinfo"))
-                        (setenv "TZ" "UTC-2")
-                        #t)))
                   (add-before 'check 'adjust-tests
                     (lambda _
                       (substitute* "tests/job-specifier.scm"
@@ -1966,9 +1952,13 @@ is no support for parsing block and inline level HTML.")
                         (("\\(test-equal \"next-year\"" all)
                          (string-append "(test-skip 4)\n" all)))
                       #t)))))
-    (native-inputs `(("pkg-config" ,pkg-config)
+    (native-inputs `(("autoconf" ,autoconf)
+                     ("automake" ,automake)
+                     ("help2man" ,help2man)
+                     ("pkg-config" ,pkg-config)
+                     ("texinfo" ,texinfo)
                      ("tzdata" ,tzdata-for-tests)))
-    (inputs `(("ed" ,ed) ("which" ,which) ("guile" ,guile-2.2)))
+    (inputs `(("guile" ,guile-2.2)))
     (home-page "https://www.gnu.org/software/mcron/")
     (synopsis "Run jobs at scheduled times")
     (description
diff --git a/gnu/packages/guile.scm b/gnu/packages/guile.scm
index 475a6c5ef0..478b8faebe 100644
--- a/gnu/packages/guile.scm
+++ b/gnu/packages/guile.scm
@@ -405,8 +405,8 @@ GNU@tie{}Guile.  Use the @code{(ice-9 readline)} module and call its
     (home-page "https://github.com/aconchillo/guile-json")
     (source (origin
               (method url-fetch)
-              (uri (string-append "https://download.savannah.nongnu.org/releases/"
-                                  name "/" name "-" version ".tar.gz"))
+              (uri (string-append "mirror://savannah/guile-json/guile-json-"
+                                  version ".tar.gz"))
               (sha256
                (base32
                 "15gnb84d7hpazqhskkf3g9z4r6knw54wfj4ch5270kakz1lp70c9"))))
@@ -444,14 +444,14 @@ specification.  These are the main features:
   (package
     (inherit guile-json)
     (name "guile-json")
-    (version "3.1.0")
+    (version "3.2.0")
     (source (origin
               (method url-fetch)
-              (uri (string-append "https://download.savannah.nongnu.org/releases/"
-                                  name "/" name "-" version ".tar.gz"))
+              (uri (string-append "mirror://savannah/guile-json/guile-json-"
+                                  version ".tar.gz"))
               (sha256
                (base32
-                "1yfqscz74i4vxylabd3s9l0wbdp8bg9qxnv1ixdm3b1l7zdx00z3"))))))
+                "14m6b6g2maw0mkvfm4x63rqb54vgbpn1gcqs715ijw4bikfzlqfz"))))))
 
 ;; There are two guile-gdbm packages, one using the FFI and one with
 ;; direct C bindings, hence the verbose name.
diff --git a/gnu/packages/haskell-apps.scm b/gnu/packages/haskell-apps.scm
index 5cd6549c27..e09285d63a 100644
--- a/gnu/packages/haskell-apps.scm
+++ b/gnu/packages/haskell-apps.scm
@@ -245,7 +245,7 @@ unique algebra of patches called @url{http://darcs.net/Theory,Patchtheory}.
 (define-public git-annex
   (package
     (name "git-annex")
-    (version "7.20190708")
+    (version "7.20190912")
     (source
      (origin
        (method url-fetch)
@@ -253,7 +253,7 @@ unique algebra of patches called @url{http://darcs.net/Theory,Patchtheory}.
                            "git-annex/git-annex-" version ".tar.gz"))
        (sha256
         (base32
-         "18s563swrp8mx479995pdhhmn40y3xwlbm1z3w63qsnjqmj7zlij"))))
+         "1a3jvl5cx32v78s3015i10cx00jprm1391rpww4mzkk1vskzn9cv"))))
     (build-system haskell-build-system)
     (arguments
      `(#:configure-flags
@@ -337,6 +337,7 @@ unique algebra of patches called @url{http://darcs.net/Theory,Patchtheory}.
        ("ghc-http-conduit" ,ghc-http-conduit)
        ("ghc-http-types" ,ghc-http-types)
        ("ghc-ifelse" ,ghc-ifelse)
+       ("ghc-magic" ,ghc-magic)
        ("ghc-memory" ,ghc-memory)
        ("ghc-monad-control" ,ghc-monad-control)
        ("ghc-monad-logger" ,ghc-monad-logger)
@@ -374,9 +375,16 @@ unique algebra of patches called @url{http://darcs.net/Theory,Patchtheory}.
 checking the file contents into Git.  It can store files in many places,
 such as local hard drives and cloud storage services.  It can also be
 used to keep a folder in sync between computers.")
-    ;; The web app is released under the AGPLv3+.
-    (license (list license:gpl3+
-                   license:agpl3+))))
+    ;; The main author has released all his changes under AGPLv3+ as of March
+    ;; 2019 (7.20190219-187-g40ecf58d4).  These are also licensed under the
+    ;; original GPLv3+ license, but going forward new changes will be under
+    ;; only AGPLv3+.  The other licenses below cover code written by others.
+    ;; See git-annex's COPYRIGHT file for details on each file.
+    (license (list license:agpl3+
+                   license:gpl3+
+                   license:bsd-2
+                   license:expat
+                   license:gpl2))))
 
 (define-public hlint
   (package
diff --git a/gnu/packages/haskell-xyz.scm b/gnu/packages/haskell-xyz.scm
index 940fbe8a6c..4313b6059e 100644
--- a/gnu/packages/haskell-xyz.scm
+++ b/gnu/packages/haskell-xyz.scm
@@ -5,7 +5,7 @@
 ;;; Copyright © 2015, 2019 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2016, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2016, 2017 ng0 <ng0@n0.is>
-;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016, 2019 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2015, 2016, 2017, 2018, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016, 2017 David Craven <david@craven.ch>
 ;;; Copyright © 2017 Danny Milosavljevic <dannym@scratchpost.org>
@@ -20,6 +20,7 @@
 ;;; Copyright © 2019 Robert Vollmert <rob@vllmrt.net>
 ;;; Copyright © 2019 Jacob MacDonald <jaccarmac@gmail.com>
 ;;; Copyright © 2019 John Soo <jsoo1@asu.edu>
+;;; Copyright © 2019 Kyle Meyer <kyle@kyleam.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -463,7 +464,7 @@ complicated text/binary file formats.")
     (inputs
      `(("ghc-scientific" ,ghc-scientific-bootstrap)))
     (native-inputs '())
-    (properties '(hidden? #t))))
+    (properties '((hidden? #t)))))
 
 (define-public ghc-attoparsec-iso8601
   (package
@@ -5201,7 +5202,7 @@ in migrated modules.")
     (name "ghc-integer-logarithms-bootstrap")
     (arguments `(#:tests? #f))
     (native-inputs '())
-    (properties '(hidden? #t))))
+    (properties '((hidden? #t)))))
 
 (define-public ghc-interpolate
   (package
@@ -5954,6 +5955,28 @@ monadic incremental interface is provided as well.")
 compression algorithm used in the @code{.xz} file format.")
     (license license:bsd-3)))
 
+(define-public ghc-magic
+  (package
+    (name "ghc-magic")
+    (version "1.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://hackage.haskell.org/package/magic/magic-"
+             version ".tar.gz"))
+       (sha256
+        (base32
+         "10p0gjjjwr1dda7hahwrwn5njbfhl67arq3v3nf1jr3vymlkn75j"))))
+    (build-system haskell-build-system)
+    (home-page "http://hackage.haskell.org/package/magic")
+    (synopsis "Interface to C file/magic library")
+    (description
+     "This package provides a full-featured binding to the C libmagic library.
+With it, you can determine the type of a file by examining its contents rather
+than its name.")
+    (license license:bsd-3)))
+
 (define-public ghc-markdown-unlit
   (package
     (name "ghc-markdown-unlit")
@@ -8667,7 +8690,7 @@ notation}.")
        ("ghc-hashable" ,ghc-hashable)
        ("ghc-primitive" ,ghc-primitive)))
     (native-inputs '())
-    (properties '(hidden? #t))))
+    (properties '((hidden? #t)))))
 
 (define-public ghc-sdl
   (package
@@ -8951,7 +8974,7 @@ semigroup.")
        ("ghc-tagged" ,ghc-tagged)
        ("ghc-unordered-containers" ,ghc-unordered-containers-bootstrap)
        ("ghc-hashable" ,ghc-hashable-bootstrap)))
-    (properties '(hidden? #t))))
+    (properties '((hidden? #t)))))
 
 (define-public ghc-setenv
   (package
@@ -10781,7 +10804,7 @@ and high speed.")
     (arguments `(#:tests? #f))
     (inputs
      `(("ghc-hashable" ,ghc-hashable-bootstrap)))
-    (properties '(hidden? #t))))
+    (properties '((hidden? #t)))))
 
 (define-public ghc-unsafe
   (package
@@ -11322,7 +11345,7 @@ widths to the Char type.")
      `(("ghc-setlocale" ,ghc-setlocale)
        ("ghc-utf8-string" ,ghc-utf8-string)
        ("ghc-attoparsec" ,ghc-attoparsec-bootstrap)))
-    (properties '(hidden? #t))))
+    (properties '((hidden? #t)))))
 
 (define-public ghc-weigh
   (package
diff --git a/gnu/packages/haskell.scm b/gnu/packages/haskell.scm
index 4d16cd656f..d86daa52c5 100644
--- a/gnu/packages/haskell.scm
+++ b/gnu/packages/haskell.scm
@@ -596,7 +596,13 @@ interactive environment for the functional language Haskell.")
                  (("^test\\('T8108'") "# guix skipped: test('T8108'"))
                (substitute* "libraries/unix/tests/libposix/all.T"
                  (("^test\\('posix010'") "# guix skipped: test('posix010'"))
-               #t))))))))
+               #t))))))
+    (native-search-paths (list (search-path-specification
+                                (variable "GHC_PACKAGE_PATH")
+                                (files (list
+                                        (string-append "lib/ghc-" version)))
+                                (file-pattern ".*\\.conf\\.d$")
+                                (file-type 'directory))))))
 
 (define-public ghc-8 ghc-8.4)
 
diff --git a/gnu/packages/image.scm b/gnu/packages/image.scm
index 4463007c74..7b6c8b3e0b 100644
--- a/gnu/packages/image.scm
+++ b/gnu/packages/image.scm
@@ -1428,6 +1428,40 @@ PNG, and performs PNG integrity checks and corrections.")
     (home-page "http://optipng.sourceforge.net/")
     (license license:zlib)))
 
+(define-public pngsuite
+  (package
+    (name "pngsuite")
+    (version "2017jul19")
+    (source
+     (origin
+       (method url-fetch/tarbomb)
+       (uri (string-append "http://www.schaik.com/pngsuite2011/PngSuite-"
+                           version ".tgz"))
+       (sha256
+        (base32
+         "1j7xgd9iffcnpphhzz9ld9ybrjmx9brhq0803g0450ssr52b5502"))))
+    (build-system gnu-build-system)
+    (arguments
+     '(#:tests? #f                      ; there is no test target
+       #:license-file-regexp "PngSuite.LICENSE"
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (copy-recursively "." (string-append out "/"))
+             #t)))
+         (delete 'build)
+         (delete 'configure))))
+    (home-page "http://www.schaik.com/pngsuite2011/pngsuite.html")
+    (synopsis "Example PNGs for use in test suites")
+    (description "Collection of graphics images created to test PNG
+applications like viewers, converters and editors.  As far as that is
+possible, all formats supported by the PNG standard are represented.")
+    (license (license:fsdg-compatible "file://PngSuite.LICENSE" "Permission to
+use, copy, modify and distribute these images for any purpose and without fee
+is hereby granted."))))
+
 (define-public libjpeg-turbo
   (package
     (name "libjpeg-turbo")
@@ -1755,3 +1789,42 @@ identical visual appearance.")
 to the standard output.  It works well together with grim.")
    ;; MIT license.
    (license license:expat)))
+
+(define-public sng
+  (package
+    (name "sng")
+    (version "1.1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://sourceforge/sng/sng-"
+                           version ".tar.gz"))
+       (sha256
+        (base32 "06a6ydvx9xb3vxvrzdrg3hq0rjwwj9ibr7fyyxjxq6qx1j3mb70i"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-before 'check 'link-pngsuite
+           ;; tests expect pngsuite in source dir
+           (lambda* (#:key inputs #:allow-other-keys)
+             (symlink (assoc-ref inputs "pngsuite") "pngsuite")
+             #t)))
+       #:configure-flags
+       (list (string-append "--with-rgbtxt="
+                            (assoc-ref %build-inputs "xorg-rgb")
+                            "/share/X11/rgb.txt"))))
+    (inputs `(("xorg-rgb" ,xorg-rgb)
+              ("libpng" ,libpng)))
+    (native-inputs `(("pngsuite" ,pngsuite)))
+    (home-page "http://sng.sourceforge.net")
+    (synopsis "Markup language for representing PNG contents")
+    (description "SNG (Scriptable Network Graphics) is a minilanguage designed
+specifically to represent the entire contents of a PNG (Portable Network
+Graphics) file in an editable form.  Thus, SNGs representing elaborate
+graphics images and ancillary chunk data can be readily generated or modified
+using only text tools.
+
+SNG is implemented by a compiler/decompiler called sng that
+losslessly translates between SNG and PNG.")
+    (license license:zlib)))
diff --git a/gnu/packages/irc.scm b/gnu/packages/irc.scm
index 622f1253d8..e3418c1fec 100644
--- a/gnu/packages/irc.scm
+++ b/gnu/packages/irc.scm
@@ -5,7 +5,7 @@
 ;;; Copyright © 2015, 2016, 2017, 2018, 2019 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 ng0 <ng0@n0.is>
 ;;; Copyright © 2017 Marius Bakke <mbakke@fastmail.com>
-;;; Copyright © 2017, 2018 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2017, 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -166,15 +166,14 @@ SILC and ICB protocols via plugins.")
 (define-public weechat
   (package
     (name "weechat")
-    (version "2.5")
+    (version "2.6")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://weechat.org/files/src/weechat-"
                                   version ".tar.xz"))
               (sha256
                (base32
-                "09sc5lf7z70x3iw87q4zh8rbyngsw89pwnzs5jk195zzqdspgj2j"))
-              (patches (search-patches "weechat-python.patch"))))
+                "0j2iflnfvv31q2l9r67r8aj3ipggqfm2r2dpy7pvdpxgwwq337ps"))))
     (build-system cmake-build-system)
     (native-inputs
      `(("gettext" ,gettext-minimal)
@@ -187,9 +186,11 @@ SILC and ICB protocols via plugins.")
               ("aspell" ,aspell)
               ("curl" ,curl)
               ("gnutls" ,gnutls)
+
+              ;; Scripting language plug-ins.
               ("guile" ,guile-2.0)
               ("lua" ,lua-5.1)
-              ("python" ,python-2)
+              ("python" ,python)
               ("perl" ,perl)
               ("tcl" ,tcl)))
     (arguments
@@ -214,14 +215,7 @@ SILC and ICB protocols via plugins.")
              (substitute* "tests/scripts/test-scripts.cpp"
                ((".*\\{ \"(javascript|php|ruby)\", " all)
                 (string-append "// SKIP" all)))
-             #t))
-         (add-after 'install 'wrap
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let ((out (assoc-ref outputs "out"))
-                   (py2 (assoc-ref inputs "python")))
-               (wrap-program (string-append out "/bin/weechat")
-                 `("PATH" ":" prefix (,(string-append py2 "/bin"))))
-               #t))))))
+             #t)))))
     (synopsis "Extensible chat client")
     (description "WeeChat (Wee Enhanced Environment for Chat) is an
 @dfn{Internet Relay Chat} (IRC) client, which is designed to be light and fast.
diff --git a/gnu/packages/javascript.scm b/gnu/packages/javascript.scm
index 9e1818dfaf..2993eb66f6 100644
--- a/gnu/packages/javascript.scm
+++ b/gnu/packages/javascript.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2017 Arun Isaac <arunisaac@systemreboot.net>
-;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2017, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2017, 2018 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2017, 2018, 2019 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2018 Nicolas Goaziou <mail@nicolasgoaziou.fr>
@@ -144,45 +144,20 @@ be able to view it naturally and easily.")))
     (name "js-respond")
     (version "1.4.2")
     (source (origin
-              (method url-fetch)
-              (uri (string-append "https://github.com/scottjehl/Respond/"
-                                  "archive/" version ".tar.gz"))
-              (file-name (string-append name "-" version ".tar.gz"))
+              (method git-fetch)
+              (uri (git-reference
+                     (url "https://github.com/scottjehl/Respond")
+                     (commit version)))
+              (file-name (git-file-name name version))
               (sha256
                (base32
-                "0ds1ya2a185jp93mdn07159c2x8zczwi960ykrawpp62bwk2n93d"))))
-    (build-system trivial-build-system)
+                "00xid731rirc7sdy1gc8qal3v9g0agr2qx15hm4x97l1lcbylyn2"))))
+    (build-system minify-build-system)
     (arguments
-     `(#:modules ((guix build utils))
-       #:builder
-       (begin
-         (use-modules (guix build utils)
-                      (ice-9 match)
-                      (ice-9 popen)
-                      (srfi srfi-26))
-         (set-path-environment-variable
-          "PATH" '("bin") (map (match-lambda
-                                 ((_ . input)
-                                  input))
-                               %build-inputs))
-         (let ((install-directory (string-append %output
-                                                 "/share/javascript/respond/")))
-           (invoke "tar" "xvf"
-                   (assoc-ref %build-inputs "source")
-                   "--strip" "1")
-           (mkdir-p install-directory)
-           (let* ((file "src/respond.js")
-                  (installed (string-append install-directory "respond.min.js")))
-             (let ((minified (open-pipe* OPEN_READ "uglify-js" file)))
-               (call-with-output-file installed
-                 (cut dump-port minified <>)))))
-         #t)))
+     `(#:javascript-files '("src/matchmedia.addListener.js"
+                            "src/matchmedia.polyfill.js"
+                            "src/respond.js")))
     (home-page "https://github.com/scottjehl/Respond")
-    (native-inputs
-     `(("uglify-js" ,uglify-js)
-       ("source" ,source)
-       ("gzip" ,gzip)
-       ("tar" ,tar)))
     (synopsis "Polyfill for min/max-width CSS3 Media Queries")
     (description "The goal of this script is to provide a fast and lightweight
 script to enable responsive web designs in browsers that don't support CSS3
@@ -194,13 +169,14 @@ Media Queries.")
     (name "js-html5shiv")
     (version "3.7.3")
     (source (origin
-              (method url-fetch)
-              (uri (string-append "https://github.com/aFarkas/html5shiv/"
-                                  "archive/" version ".tar.gz"))
-              (file-name (string-append name "-" version ".tar.gz"))
+              (method git-fetch)
+              (uri (git-reference
+                     (url "https://github.com/aFarkas/html5shiv")
+                     (commit version)))
+              (file-name (git-file-name name version))
               (sha256
                (base32
-                "0inlbpxpqzdyi24lqagzf7l24zxg0y02xcpqs2h4npjscazzw7hg"))))
+                "0y1c5nyq0brl9fjdihhax33vks4s1ij9iv113879sg3zflmgqpd0"))))
     (build-system minify-build-system)
     (home-page "https://github.com/aFarkas/html5shiv")
     (synopsis "Enable HTML5 sectioning elements in legacy browsers")
@@ -264,13 +240,14 @@ provided by ES5.  @code{JSONPath} is used to represent the links.")
     (name "js-strftime")
     (version "0.10.0")
     (source (origin
-              (method url-fetch)
-              (uri (string-append "https://github.com/samsonjs/strftime/"
-                                  "archive/v" version ".tar.gz"))
-              (file-name (string-append name "-" version ".tar.gz"))
+              (method git-fetch)
+              (uri (git-reference
+                     (url"https://github.com/samsonjs/strftime")
+                     (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
               (sha256
                (base32
-                "1iya43w7y26y2dp9l4d40bhjc4scb5a9mng5ng5c8hsqr82f1375"))))
+                "131nmlivazwxyba25kh9lda99749fq4xsyin6lzfalaaydviby4p"))))
     (build-system minify-build-system)
     (arguments
      `(#:javascript-files '("strftime.js")))
@@ -287,13 +264,14 @@ well as some other extensions from Ruby.")
     (name "js-highlight")
     (version "9.12.0")
     (source (origin
-              (method url-fetch)
-              (uri (string-append "https://github.com/isagalaev/highlight.js/"
-                                  "archive/" version ".tar.gz"))
-              (file-name (string-append name "-" version ".tar.gz"))
+              (method git-fetch)
+              (uri (git-reference
+                     (url "https://github.com/isagalaev/highlight.js")
+                     (commit version)))
+              (file-name (git-file-name name version))
               (sha256
                (base32
-                "1jjn9mj7fwq4zpr6is438bscf03b3q8jkj0k5c3fc6pkmjnhw939"))))
+                "12qz22qjpd6svj58pwgcwg2x2rzhihfdrxg6lgj39nfpaln6dris"))))
     (build-system minify-build-system)
     (arguments
      `(#:javascript-files '("src/highlight.js")))
@@ -329,18 +307,41 @@ Javascript library, adding sorting, paging and filtering abilities to plain
 HTML tables with minimal effort.")
     (license license:expat)))
 
+(define-public js-requirejs
+  (package
+    (name "js-requirejs")
+    (version "2.3.6")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                     (url "https://github.com/requirejs/requirejs.git")
+                     (commit version)))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "0cvd5y2mb3h6yil3niqn3gjqrzixdsxcz4rvc2f0hg4kzp5y0w86"))))
+    (build-system minify-build-system)
+    (arguments `(#:javascript-files '("require.js")))
+    (home-page "https://github.com/requirejs/requirejs/")
+    (synopsis "File and module loader for JavaScript")
+    (description "RequireJS loads plain JavaScript files as well as more
+defined modules.  It is optimized for in-browser use, including in a Web
+Worker, but it can be used in other JavaScript environments.")
+    (license license:expat)))
+
 (define-public js-selectize
   (package
     (name "js-selectize")
-    (version "0.12.4")
+    (version "0.12.6")
     (source (origin
-              (method url-fetch)
-              (uri (string-append "https://github.com/selectize/selectize.js/"
-                                  "archive/v" version ".tar.gz"))
-              (file-name (string-append name "-" version ".tar.gz"))
+              (method git-fetch)
+              (uri (git-reference
+                     (url "https://github.com/selectize/selectize.js")
+                     (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
               (sha256
                (base32
-                "0756p49aaz34mw2dx8k1gxf210mngfrri25vkba0j7wihd2af8gn"))))
+                "15gichl8wi6yxag2ps723nxrgyan15976dzsnvw9h9py8sbyyzjn"))))
     (build-system minify-build-system)
     (arguments `(#:javascript-files '("src/selectize.js")))
     (home-page "http://selectize.github.io/selectize.js/")
@@ -353,15 +354,16 @@ navigation; it is useful for tagging, contact lists, etc.")
 (define-public js-es5-shim
   (package
     (name "js-es5-shim")
-    (version "4.5.9")
+    (version "4.5.13")
     (source (origin
-              (method url-fetch)
-              (uri (string-append "https://github.com/es-shims/es5-shim/"
-                                  "archive/v" version ".tar.gz"))
-              (file-name (string-append name "-" version ".tar.gz"))
+              (method git-fetch)
+              (uri (git-reference
+                     (url "https://github.com/es-shims/es5-shim")
+                     (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
               (sha256
                (base32
-                "0yfndyijz0ykddzprpvfjb2453gzpn528klmwycwbqc1bqd3m1hl"))))
+                "142w384fbyllq4yggv173g82lw3wix4jqcg6hkhx1ymq89vvnpmh"))))
     (build-system minify-build-system)
     (arguments `(#:javascript-files
                  '("es5-sham.js"
@@ -381,13 +383,14 @@ means that these shams cause many ES5 methods to silently fail.")
     (name "js-filesaver")
     (version "1.3.8")
     (source (origin
-              (method url-fetch)
-              (uri (string-append "https://github.com/eligrey/FileSaver.js/"
-                                  "archive/" version ".tar.gz"))
-              (file-name (string-append name "-" version))
+              (method git-fetch)
+              (uri (git-reference
+                     (url "https://github.com/eligrey/FileSaver.js")
+                     (commit version)))
+              (file-name (git-file-name name version))
               (sha256
                (base32
-                "1rkhfqs5plaj628kzj7qgm5qahy4v7ihygifidqr6g6265mil97h"))))
+                "0gvqk0hnr8fig0n4da7vj7q6z31bcyv52916xz3rbmdj3pgpiv1d"))))
     (build-system minify-build-system)
     (arguments
      `(#:phases
diff --git a/gnu/packages/kde.scm b/gnu/packages/kde.scm
index d8c0649131..2d72c39436 100644
--- a/gnu/packages/kde.scm
+++ b/gnu/packages/kde.scm
@@ -529,16 +529,16 @@ different notification systems.")
 (define-public kdeconnect
   (package
     (name "kdeconnect")
-    (version "1.3.3")
+    (version "1.3.5")
     (source
       (origin
         (method url-fetch)
         (uri (string-append "mirror://kde/stable/kdeconnect/"
-                            version "/src/kdeconnect-kde-"
+                            version "/kdeconnect-kde-"
                             version ".tar.xz"))
         (sha256
          (base32
-          "1vac0mw1myrswr61adv7lgif0c4wzw5wnsj0sqxj6msp4l4pfgsg"))))
+          "02lr3xx5s2mgddac4n3lkgr7ppf1z5m6ajs90rjix0vs8a271kp5"))))
     (build-system cmake-build-system)
     (arguments
      `(#:configure-flags '("-DBUILD_TESTING=ON")
@@ -600,4 +600,30 @@ communicate with each other.  Here's a few things KDE Connect can do:
 @item Browse your phone from the desktop
 @item Control the desktop's volume from the phone
 @end enumerate")
+    (properties `((upstream-name . "kdeconnect-kde")))
     (license (list license:gpl2 license:gpl3)))) ; dual licensed
+
+(define-public kqtquickcharts
+  (package
+    (name "kqtquickcharts")
+    (version "19.08.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (string-append "mirror://kde/stable/applications/"
+                            version "/src/kqtquickcharts-" version ".tar.xz"))
+        (sha256
+         (base32
+          "1j3rivvh4sa94lsd0hi4xfvcikl05zrqd7634wxyaxs718ais6dg"))))
+    (build-system cmake-build-system)
+    (native-inputs
+     `(("extra-cmake-modules" ,extra-cmake-modules)))
+    (inputs
+     `(("qtbase" ,qtbase)
+       ("qtdeclarative" ,qtdeclarative)))
+    (home-page "https://phabricator.kde.org/source/kqtquickcharts/")
+    (synopsis "Interactive charts for Qt Quick")
+    (description
+     "Kqtquickcharts is a QtQuick plugin to render beautiful and interactive
+charts.")
+    (license license:lgpl2.1+)))
diff --git a/gnu/packages/language.scm b/gnu/packages/language.scm
index 73376feecb..1ed2483615 100644
--- a/gnu/packages/language.scm
+++ b/gnu/packages/language.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2015, 2016 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2017, 2018 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018 ng0 <ng0@n0.is>
+;;; Copyright © 2019 Alex Vong <alexvong1995@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -20,13 +21,26 @@
 
 (define-module (gnu packages language)
   #:use-module (gnu packages)
+  #:use-module (gnu packages glib)
+  #:use-module (gnu packages gtk)
+  #:use-module (gnu packages ocr)
   #:use-module (gnu packages perl)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages python)
   #:use-module (gnu packages perl-check)
+  #:use-module (gnu packages swig)
   #:use-module (gnu packages web)
+  #:use-module (gnu packages xorg)
   #:use-module (guix packages)
+  #:use-module (guix build-system gnu)
   #:use-module (guix build-system perl)
-  #:use-module ((guix licenses) #:select (gpl2 gpl3 perl-license))
-  #:use-module (guix download))
+  #:use-module (guix build-system python)
+  #:use-module ((guix licenses)
+                #:select
+                (bsd-3 gpl2 gpl2+ gpl3 gpl3+ lgpl2.1 perl-license zpl2.1))
+  #:use-module (guix download)
+  #:use-module (guix git-download)
+  #:use-module (guix utils))
 
 (define-public perl-lingua-en-findnumber
   (package
@@ -406,3 +420,466 @@ string can be easily inferred by a human just by reading the identifier.")
     (description "This module is a rather incomplete implementation of work
 done by Gudrun Putze-Meier.")
     (license perl-license)))
+
+(define* (tegaki-release-uri proj version
+                             #:optional (ext "tar.gz"))
+  (string-append "https://github.com/tegaki/tegaki/releases/download"
+                 "/v" version "/" proj "-" version "." ext))
+
+(define remove-pre-compiled-files
+  (lambda exts
+    "Return snippet for removing pre-compiled files matching one of the
+extensions in EXTS."
+    `(begin (for-each delete-file
+                      (find-files "."
+                                  (lambda (name _)
+                                    (any (cut string-suffix? <> name)
+                                         (map (cut string-append "." <>)
+                                              ',exts)))))
+            #t)))
+
+;;; modules required for the above snippet
+(define remove-pre-compiled-files-modules
+  '((guix build utils)
+    (srfi srfi-1)
+    (srfi srfi-26)))
+
+(define-public python2-tegaki-wagomu
+  (package
+    (name "python2-tegaki-wagomu")
+    (version "0.3.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (tegaki-release-uri "tegaki-wagomu" version))
+       (sha256
+        (base32
+         "1pzdiq4zy1nyylaj9i6v2h4h0r05klahskzpafpp367p4rysi1x9"))
+       (modules remove-pre-compiled-files-modules)
+       (snippet (remove-pre-compiled-files "pyc"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:python ,python-2 ; only Python 2 is supported
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'fix-recognizer
+           (lambda* (#:key inputs #:allow-other-keys)
+             ;; fix missing module and function
+             (substitute* "tegakiwagomu.py"
+               (("import Results,")
+                "import ")
+               (("def _recognize")
+                "def recognize")
+               (("Results\\(candidates\\)")
+                "candidates"))
+             #t)))))
+    (inputs
+     `(("glib" ,glib)))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)
+       ("swig" ,swig)))
+    (home-page "https://tegaki.github.io/")
+    (synopsis
+     "Chinese and Japanese Handwriting Recognition (Recognition engine)")
+    (description
+     "Tegaki is an ongoing project which aims to develop a free and open-source
+modern implementation of handwriting recognition software, specifically
+designed for Chinese (simplified and traditional) and Japanese, and that is
+suitable for both the desktop and mobile devices.")
+    (license gpl2+))) ; all files
+
+(define-public python2-tegaki-python
+  (package
+    (inherit python2-tegaki-wagomu)
+    (name "python2-tegaki-python")
+    (version "0.3.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (tegaki-release-uri "tegaki-python" version))
+       (sha256
+        (base32
+         "0x93k7pw9nh0ywd97pr8pm7jv3f94nw044i5k0zvzhdpsjqvak7p"))
+       (modules remove-pre-compiled-files-modules)
+       (snippet (remove-pre-compiled-files "pyc"))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments python2-tegaki-wagomu)
+       ((#:phases _)
+        `(modify-phases %standard-phases
+           (add-after 'unpack 'pre-configure
+             (lambda* (#:key inputs #:allow-other-keys)
+               ;; Always convert string to unicode to avoid the following error
+               ;; when running "tegaki-build" in python2-tegaki-tools:
+               ;;
+               ;; sqlite3.ProgrammingError: You must not use 8-bit bytestrings
+               ;; unless you use a text_factory that can interpret 8-bit
+               ;; bytestrings (like text_factory = str).
+               ;; It is highly recommended that you instead just switch your
+               ;; application to Unicode strings.
+               (substitute* "tegaki/charcol.py"
+                 (("sqlite3.OptimizedUnicode")
+                  "lambda s: unicode(s, 'utf-8')"))
+               (substitute* "tegaki/engine.py"
+                 (("/usr(/local)?")
+                  (assoc-ref inputs "python2-tegaki-wagomu")))
+               #t))))))
+    ;; override inherited inputs
+    (inputs '())
+    (native-inputs '())
+    (propagated-inputs
+     `(("python2-tegaki-wagomu" ,python2-tegaki-wagomu)
+       ("python2-zinnia" ,python2-zinnia)))
+    (synopsis
+     "Chinese and Japanese Handwriting Recognition (Base python library)")
+    (license (list gpl2+ ; all files except...
+                   bsd-3 ; dictutils.py
+                   zpl2.1)))) ; minjson.py
+
+(define-public python2-tegaki-pygtk
+  (package
+    (inherit python2-tegaki-wagomu)
+    (name "python2-tegaki-pygtk")
+    (version "0.3.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (tegaki-release-uri "tegaki-pygtk" version))
+       (sha256
+        (base32
+         "1cip0azxhjdj2dg2z85cp1z3lz4qwx3w1j7z4xmcm7npapmsaqs2"))
+       (modules remove-pre-compiled-files-modules)
+       (snippet (remove-pre-compiled-files "pyc"))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments python2-tegaki-wagomu)
+       ((#:phases _)
+        `(modify-phases %standard-phases
+           (add-after 'unpack 'fix-paths
+             (lambda* (#:key inputs #:allow-other-keys)
+               (substitute* "tegakigtk/fakekey.py"
+                 (("libX11.so.6" so)
+                  (string-append (assoc-ref inputs "libx11") "/lib/" so))
+                 (("libXtst.so.6" so)
+                  (string-append (assoc-ref inputs "libxtst") "/lib/" so)))
+               #t))))))
+    (inputs ; required for sending key strokes
+     `(("libx11" ,libx11)
+       ("libxtst" ,libxtst)))
+    (native-inputs '()) ; override inherited inputs
+    (propagated-inputs
+     `(("python2-pygtk" ,python2-pygtk)
+       ("python2-tegaki-python" ,python2-tegaki-python)))
+    (synopsis "Chinese and Japanese Handwriting Recognition (Base UI library)")
+    (license gpl2+))) ; all files
+
+(define-public python2-tegaki-tools
+  (package
+    (inherit python2-tegaki-wagomu)
+    (name "python2-tegaki-tools")
+    (version "0.3.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (tegaki-release-uri "tegaki-tools" version))
+       (sha256
+        (base32
+         "0xxv97ggh2jgldw3r7y59lv3fhz733r6l7mdn6nh4m0gvb0ja971"))
+       (modules remove-pre-compiled-files-modules)
+       (snippet (remove-pre-compiled-files "pyc"))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments python2-tegaki-wagomu)
+       ((#:phases _) '%standard-phases)))
+    (inputs
+     `(("python2-tegaki-pygtk" ,python2-tegaki-pygtk)))
+    ;; override inherited inputs
+    (native-inputs '())
+    (propagated-inputs '())
+    (synopsis "Chinese and Japanese Handwriting Recognition (Advanced tools)")
+    ;; Files in gifenc/ are licensed under gpl3+ while other files are licensed
+    ;; under gpl2+. Therefore, the combined work is licensed under gpl3+.
+    (license gpl3+)))
+
+(define-public python2-tegaki-recognize
+  (let ((commit "eceec69fe651d0733c8c8752dae569d2283d0f3c")
+        (revision "1"))
+    (package
+      (inherit python2-tegaki-tools)
+      (name "python2-tegaki-recognize")
+      ;; version copied from <https://github.com/tegaki/tegaki/releases>
+      (version (git-version "0.3.1" revision commit))
+      (source
+       (origin
+         ;; We use GIT-FETCH because 'tegaki-recognize.desktop.in' and
+         ;; 'tegaki-recognize.in' are missing in the tarball.
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/tegaki/tegaki.git")
+               (commit commit)))
+         (sha256
+          (base32
+           "09mw2if9p885phbgah5f95q3fwy7s5b46qlmpxqyzfcnj6g7afr5"))
+         (file-name (git-file-name name version))
+         (modules `((guix build utils)
+                    (ice-9 ftw)
+                    (srfi srfi-26)
+                    ,@remove-pre-compiled-files-modules))
+         (snippet
+          `(begin
+             ;; remove unnecessary files with potentially different license
+             (for-each delete-file-recursively
+                       (scandir "."
+                                (negate (cut member <> '("tegaki-recognize"
+                                                         "." "..")))))
+             ,(remove-pre-compiled-files "pyc")
+             #t))))
+      (arguments
+       (substitute-keyword-arguments (package-arguments python2-tegaki-tools)
+         ((#:phases _)
+          `(modify-phases %standard-phases
+             (add-after 'unpack 'chdir
+               (lambda _
+                 (chdir "tegaki-recognize")
+                 #t))
+             ;; 'setup.py' script does not support one of the Python build
+             ;; system's default flags, "--single-version-externally-managed"
+             (replace 'install
+               (lambda* (#:key outputs #:allow-other-keys)
+                 (invoke "python" "setup.py" "install"
+                         (string-append "--prefix=" (assoc-ref outputs "out"))
+                         "--root=/")
+                 #t))))))
+      (synopsis "Chinese and Japanese Handwriting Recognition (Main program)")
+      (license gpl2+)))) ; all files
+
+(define-public tegaki-zinnia-japanese
+  (package
+    (inherit python2-tegaki-wagomu)
+    (name "tegaki-zinnia-japanese")
+    (version "0.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (tegaki-release-uri name version "zip"))
+       (sha256
+        (base32
+         "1nmg9acxhcqly9gwkyb9m0hpy76fll91ywk4b1q4xms0ajxip1h7"))
+       (modules remove-pre-compiled-files-modules)
+       (snippet (remove-pre-compiled-files "model"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f ; no tests
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'configure
+           (lambda* (#:key outputs #:allow-other-keys)
+             (substitute* "Makefile"
+               (("/usr/local")
+                (assoc-ref outputs "out")))
+             #t)))))
+    ;; override inherited inputs
+    (inputs '())
+    (native-inputs
+     `(("python2-tegaki-tools" ,python2-tegaki-tools)))
+    (propagated-inputs '())
+    (native-search-paths
+     (list (search-path-specification
+            (variable "TEGAKI_MODEL_PATH")
+            (files '("share/tegaki/models")))))
+    (synopsis "Chinese and Japanese Handwriting Recognition (Model)")
+    (license lgpl2.1))) ; all files
+
+(define-public tegaki-zinnia-japanese-light
+  (package
+    (inherit tegaki-zinnia-japanese)
+    (name "tegaki-zinnia-japanese-light")
+    (version "0.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (tegaki-release-uri name version "zip"))
+       (sha256
+        (base32
+         "0x0fs29ylqzxd6xvg51h7rigpbisd7q8v11df425ib2j792yfyf8"))
+       (modules remove-pre-compiled-files-modules)
+       (snippet (remove-pre-compiled-files "model"))))
+    (license lgpl2.1))) ; all files
+
+(define-public tegaki-zinnia-japanese-kyoiku
+  (package
+    (inherit tegaki-zinnia-japanese)
+    (name "tegaki-zinnia-japanese-kyoiku")
+    (version "0.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (tegaki-release-uri name version "zip"))
+       (sha256
+        (base32
+         "0am94bcpmbzplxdnwn9gk15sgaizvcfhmv13mk14jjvx3419cvvx"))
+       (modules remove-pre-compiled-files-modules)
+       (snippet (remove-pre-compiled-files "model"))))
+    (license lgpl2.1))) ; all files
+
+(define-public tegaki-zinnia-japanese-joyo
+  (package
+    (inherit tegaki-zinnia-japanese)
+    (name "tegaki-zinnia-japanese-joyo")
+    (version "0.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (tegaki-release-uri name version "zip"))
+       (sha256
+        (base32
+         "1v0j40lzdyiz01ayws0b8r7fsdy2mr32658382kz4wyk883wzx2z"))
+       (modules remove-pre-compiled-files-modules)
+       (snippet (remove-pre-compiled-files "model"))))
+    (license lgpl2.1))) ; all files
+
+(define-public tegaki-zinnia-simplified-chinese
+  (package
+    (inherit tegaki-zinnia-japanese)
+    (name "tegaki-zinnia-simplified-chinese")
+    (version "0.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (tegaki-release-uri name version "zip"))
+       (sha256
+        (base32
+         "18wq0jccv7lpnrfnzspyc110d6pj2v1i21xcx4fmgzz1lnln3fs5"))
+       (modules remove-pre-compiled-files-modules)
+       (snippet (remove-pre-compiled-files "model"))))
+    (license lgpl2.1))) ; all files
+
+(define-public tegaki-zinnia-simplified-chinese-light
+  (package
+    (inherit tegaki-zinnia-japanese)
+    (name "tegaki-zinnia-simplified-chinese-light")
+    (version "0.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (tegaki-release-uri name version "zip"))
+       (sha256
+        (base32
+         "0v24yf0w0p03lb7fyx128a75mwzad166bigvlbrzqnad789qg1sr"))
+       (modules remove-pre-compiled-files-modules)
+       (snippet (remove-pre-compiled-files "model"))))
+    (license lgpl2.1))) ; all files
+
+(define-public tegaki-zinnia-traditional-chinese
+  (package
+    (inherit tegaki-zinnia-japanese)
+    (name "tegaki-zinnia-traditional-chinese")
+    (version "0.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (tegaki-release-uri name version "zip"))
+       (sha256
+        (base32
+         "140nlp6hynrai2svs5670jjfw1za6ayflhyj2dl0bzsfgbk3447l"))
+       (modules remove-pre-compiled-files-modules)
+       (snippet (remove-pre-compiled-files "model"))))
+    (license lgpl2.1))) ; all files
+
+(define-public tegaki-zinnia-traditional-chinese-light
+  (package
+    (inherit tegaki-zinnia-japanese)
+    (name "tegaki-zinnia-traditional-chinese-light")
+    (version "0.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (tegaki-release-uri name version "zip"))
+       (sha256
+        (base32
+         "1m6yk6a57vs9wg5y50qciwi1ahhmklp2mgsjysbj4mnyzv6yhcr2"))
+       (modules remove-pre-compiled-files-modules)
+       (snippet (remove-pre-compiled-files "model"))))
+    (license lgpl2.1))) ; all files
+
+(define-public tegaki-wagomu-japanese
+  (package
+    (inherit tegaki-zinnia-japanese)
+    (name "tegaki-wagomu-japanese")
+    (version "0.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (tegaki-release-uri name version "zip"))
+       (sha256
+        (base32
+         "0flj5id8xwsn7csrrzqz9prdikswnwm2wms0as2vzdpxzph1az4k"))
+       (modules remove-pre-compiled-files-modules)
+       (snippet (remove-pre-compiled-files "model"))))
+    (license lgpl2.1))) ; all files
+
+(define-public tegaki-wagomu-japanese-kyoiku
+  (package
+    (inherit tegaki-zinnia-japanese)
+    (name "tegaki-wagomu-japanese-kyoiku")
+    (version "0.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (tegaki-release-uri name version "zip"))
+       (sha256
+        (base32
+         "0v8crfh8rdf6ndp16g52s5jlrrlwh73xp38zjn5i9dlacx8kfqg1"))
+       (modules remove-pre-compiled-files-modules)
+       (snippet (remove-pre-compiled-files "model"))))
+    (license lgpl2.1))) ; all files
+
+(define-public tegaki-wagomu-japanese-joyo
+  (package
+    (inherit tegaki-zinnia-japanese)
+    (name "tegaki-wagomu-japanese-joyo")
+    (version "0.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (tegaki-release-uri name version "zip"))
+       (sha256
+        (base32
+         "0wk8shpr963zp328g991qs6abpnacq4242003m687z2d6yp7nph2"))
+       (modules remove-pre-compiled-files-modules)
+       (snippet (remove-pre-compiled-files "model"))))
+    (license lgpl2.1))) ; all files
+
+(define-public tegaki-wagomu-simplified-chinese
+  (package
+    (inherit tegaki-zinnia-japanese)
+    (name "tegaki-wagomu-simplified-chinese")
+    (version "0.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (tegaki-release-uri name version "zip"))
+       (sha256
+        (base32
+         "0wqprynigqxqxv128i1smh81gxvmjj056d9qpznxa3n9f5ymlbj6"))
+       (modules remove-pre-compiled-files-modules)
+       (snippet (remove-pre-compiled-files "model"))))
+    (license lgpl2.1))) ; all files
+
+;;; Upstream does not provide the source for tegaki-wagomu-traditional-chinese.
+;;; Therefore, we use the source for tegaki-zinnia-traditional-chinese and
+;;; patch the Makefile accordingly.
+(define-public tegaki-wagomu-traditional-chinese
+  (package
+    (inherit tegaki-zinnia-traditional-chinese)
+    (name "tegaki-wagomu-traditional-chinese")
+    (arguments
+     (substitute-keyword-arguments
+         (package-arguments tegaki-zinnia-traditional-chinese)
+       ((#:phases phases '%standard-phases)
+        `(modify-phases ,phases
+           (replace 'configure
+             (lambda args
+               (let ((configure (assq-ref ,phases 'configure)))
+                 (apply configure args))
+               (substitute* "Makefile"
+                 (("zinnia") "wagomu"))
+               #t))))))
+    (license lgpl2.1))) ; all files
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index a543df3fe8..be18788687 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -349,10 +349,10 @@ corresponding UPSTREAM-SOURCE (an origin), using the given DEBLOB-SCRIPTS."
                         "linux-" version ".tar.xz"))
     (sha256 hash)))
 
-(define-public linux-libre-5.2-version "5.2.13")
+(define-public linux-libre-5.2-version "5.2.15")
 (define-public linux-libre-5.2-pristine-source
   (let ((version linux-libre-5.2-version)
-        (hash (base32 "12hpph3iynr22mfwz7745lp01waf2kg579hr56d4pvhx4iahzdhp")))
+        (hash (base32 "0jhc70r2rygm91qifjagg1jgbpjwyyq6m8g1n5iv81l1v84i0mpb")))
    (make-linux-libre-source version
                             (%upstream-linux-source version hash)
                             deblob-scripts-5.2)))
@@ -3838,7 +3838,7 @@ and copy/paste text in the console and in xterm.")
 (define-public btrfs-progs
   (package
     (name "btrfs-progs")
-    (version "5.2.1")
+    (version "5.2.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://kernel.org/linux/kernel/"
@@ -3846,7 +3846,7 @@ and copy/paste text in the console and in xterm.")
                                   "btrfs-progs-v" version ".tar.xz"))
               (sha256
                (base32
-                "0crjv3i20nyj2dagfw6q7byshscpn6j7wlqch3apkzzzk00lmb1n"))))
+                "1imivxjppi8zl27gn472pwpk8bg5dijkbyi340by31vhy7dj24w2"))))
     (build-system gnu-build-system)
     (outputs '("out"
                "static"))      ; static versions of the binaries in "out"
@@ -4455,18 +4455,18 @@ cpufreq sub-system is enabled or not.")
 (define-public haveged
   (package
     (name "haveged")
-    (version "1.9.4")
+    (version "1.9.6")
     (source
      (origin
        (method git-fetch)
        (uri (git-reference
              (url "https://github.com/jirka-h/haveged.git")
-             (commit version)))
+             (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1hrwzjd4byq4fdrg8svww3d8x449k80jxxrjy9v6jvzhfv19rvxr"))))
+        (base32 "11kr19n2f87izsj341lv5amhd1wc2ckfmqr9pq5fxix8pkbs94rh"))))
     (build-system gnu-build-system)
-    (home-page "http://www.issihosts.com/haveged")
+    (home-page "https://www.issihosts.com/haveged")
     (synopsis "Entropy source for the Linux random number generator")
     (description
      "haveged generates an unpredictable stream of random numbers for use by
@@ -4475,10 +4475,10 @@ standard mechanisms for filling the entropy pool may not be sufficient for
 systems with high needs or limited user interaction, such as headless servers.
 
 @command{haveged} runs as a privileged daemon, harvesting randomness from the
-indirect effects of hardware events on hidden processor state using the HArdware
-Volatile Entropy Gathering and Expansion (@dfn{HAVEGE}) algorithm.  It tunes
-itself to its environment and provides the same built-in test suite for the
-output stream as used on certified hardware security devices.
+indirect effects of hardware events on hidden processor state using the
+@acronym{HAVEGE, HArdware Volatile Entropy Gathering and Expansion} algorithm.
+It tunes itself to its environment and provides the same built-in test suite
+for the output stream as used on certified hardware security devices.
 
 The quality of the randomness produced by this algorithm has not been proven.
 It is recommended to run it together with another entropy source like rngd, and
@@ -5140,14 +5140,14 @@ re-use code and to avoid re-inventing the wheel.")
 (define-public libnftnl
   (package
     (name "libnftnl")
-    (version "1.1.3")
+    (version "1.1.4")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://netfilter.org/libnftnl/"
                            "libnftnl-" version ".tar.bz2"))
        (sha256
-        (base32 "03xszkcpqk3s1rqc6vh7g5j13kh3d3yjnvjhk5scds3an39rgp92"))))
+        (base32 "087dfc2n4saf2k68hyi4byvgz5grwpw5kfjvmkpn3wmd8y1riiy8"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)))
@@ -5164,7 +5164,7 @@ used by nftables.")
 (define-public nftables
   (package
     (name "nftables")
-    (version "0.9.0")
+    (version "0.9.2")
     (source
      (origin
        (method url-fetch)
@@ -5172,7 +5172,7 @@ used by nftables.")
                            "/files/nftables-" version ".tar.bz2"))
        (sha256
         (base32
-         "14bygs6vg2v448cw5r4pxqi8an29hw0m9vab8hpmgjmrzjsq30dd"))))
+         "1x8kalbggjq44j4916i6vyv1rb20dlh1dcsf9xvzqsry2j063djw"))))
     (build-system gnu-build-system)
     (arguments `(#:configure-flags
                  '("--disable-man-doc"))) ; FIXME: Needs docbook2x.
@@ -5874,15 +5874,15 @@ the superuser to make device nodes.")
 (define-public fakeroot
   (package
     (name "fakeroot")
-    (version "1.23")
+    (version "1.24")
     (source (origin
               (method url-fetch)
-              (uri (string-append "http://ftp.debian.org/debian/pool/main/f/"
-                                  "fakeroot/fakeroot_" version ".orig.tar.xz"))
+              (uri (string-append "https://deb.debian.org/debian/pool/main/f/"
+                                  "fakeroot/fakeroot_" version ".orig.tar.gz"))
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "1xpl0s2yjyjwlf832b6kbkaa5921liybaar13k7n45ckd9lxd700"))))
+                "1vb6f93hjyqnwx8dc8mm3dgma7axgqk8s7sdsjs8l2rpc0qmn11f"))))
     (build-system gnu-build-system)
     (arguments
      `(#:phases
diff --git a/gnu/packages/lisp.scm b/gnu/packages/lisp.scm
index 65fc1a58cd..0c8ad1e2fa 100644
--- a/gnu/packages/lisp.scm
+++ b/gnu/packages/lisp.scm
@@ -6861,3 +6861,76 @@ extension-points via the concept of hooks.")
 
 (define-public ecl-cl-hooks
   (sbcl-package->ecl-package sbcl-cl-hooks))
+
+(define-public sbcl-s-sysdeps
+  (let ((commit "d28246b5dffef9e73a0e0e6cfbc4e878006fe34d")
+        (revision "1"))
+    (package
+      (name "sbcl-s-sysdeps")
+      (build-system asdf-build-system/sbcl)
+      (version (git-version "1" revision commit))
+      (home-page "https://github.com/svenvc/s-sysdeps")
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url home-page)
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32
+           "14b69b81yrxmjlvmm3lfxk04x5v7hqz4fql121334wh72czznfh9"))))
+      (synopsis "Common Lisp abstraction layer over platform dependent functionality")
+      (description "@code{s-sysdeps} is an abstraction layer over platform
+dependent functionality.  This simple package is used as a building block in a
+number of other open source projects.
+
+@code{s-sysdeps} abstracts:
+
+@itemize
+@item managing processes,
+@item implementing a standard TCP/IP server,
+@item opening a client TCP/IP socket stream,
+@item working with process locks.
+@end itemize\n")
+      (license license:llgpl))))
+
+(define-public cl-s-sysdeps
+  (sbcl-package->cl-source-package sbcl-s-sysdeps))
+
+(define-public ecl-s-sysdeps
+  (sbcl-package->ecl-package sbcl-s-sysdeps))
+
+(define-public sbcl-cl-prevalence
+  (let ((commit "c163c227ed85d430b82cb1e3502f72d4f88e3cfa")
+        (revision "1"))
+    (package
+      (name "sbcl-cl-prevalence")
+      (build-system asdf-build-system/sbcl)
+      (version (git-version "5" revision commit))
+      (home-page "https://github.com/40ants/cl-prevalence")
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url home-page)
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32
+           "1i9zj1q2ahgwch56an21yzbgkynz0kab9fyxkq9mg8p3xrv38jjn"))))
+      (inputs
+       `(("s-sysdeps" ,sbcl-s-sysdeps)
+         ("s-xml" ,sbcl-s-xml)))
+      (synopsis "Implementation of object prevalence for Common Lisp")
+      (description "This Common Lisp library implements object prevalence (see
+@url{https://en.wikipedia.org/wiki/System_prevalence}).  It allows
+for (de)serializing to and from s-exps as well as XML.  Serialization of arbitrary
+classes and cyclic data structures are supported.")
+      (license license:llgpl))))
+
+(define-public cl-prevalence
+  (sbcl-package->cl-source-package sbcl-cl-prevalence))
+
+(define-public ecl-cl-prevalence
+  (sbcl-package->ecl-package sbcl-cl-prevalence))
diff --git a/gnu/packages/lua.scm b/gnu/packages/lua.scm
index ff62d3b362..075decc61a 100644
--- a/gnu/packages/lua.scm
+++ b/gnu/packages/lua.scm
@@ -4,7 +4,7 @@
 ;;; Copyright © 2014 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2014 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2016, 2017 Efraim Flashner <efraim@flashner.co.il>
-;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2016, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016 doncatnip <gnopap@gmail.com>
 ;;; Copyright © 2016, 2017, 2019 Clément Lassieur <clement@lassieur.org>
 ;;; Copyright © 2016 José Miguel Sánchez García <jmi2k@openmailbox.org>
@@ -39,6 +39,7 @@
   #:use-module (gnu packages tls)
   #:use-module (gnu packages xml)
   #:use-module (gnu packages glib)
+  #:use-module (gnu packages libevent)
   #:use-module (gnu packages libffi)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages xorg)
@@ -450,6 +451,69 @@ Grammars (PEGs).")
 (define-public lua5.2-lpeg
   (make-lua-lpeg "lua5.2-lpeg" lua-5.2))
 
+(define (make-lua-luv name lua)
+  (package
+    (name name)
+    (version "1.30.1-0")
+    (source (origin
+              ;; The release tarball includes the sources of libuv but does
+              ;; not include the pkg-config files.
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/luvit/luv.git")
+                    (commit version)))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1lfzzyphpim28kw33k7zylcyxnf40ckhdg6hbqyzb5hszdf2hbka"))))
+    (build-system cmake-build-system)
+    (arguments
+     `(#:tests? #f ; there are none
+       #:configure-flags
+       '("-DWITH_LUA_ENGINE=Lua"
+         "-DWITH_SHARED_LIBUV=On"
+         "-DBUILD_MODULE=Off"
+         "-DBUILD_SHARED_LIBS=On"
+         "-DLUA_BUILD_TYPE=System")
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'copy-lua-compat
+           (lambda* (#:key inputs #:allow-other-keys)
+             (copy-recursively (assoc-ref inputs "lua-compat")
+                               "lua-compat")
+             (setenv "CPATH"
+                     (string-append (getcwd) "/lua-compat:"
+                                    (or (getenv "CPATH") "")))
+             #t)))))
+    (inputs
+     `(("lua" ,lua)
+       ("libuv" ,libuv)))
+    (native-inputs
+     `(("lua-compat"
+        ,(origin
+           (method git-fetch)
+           (uri (git-reference
+                 (url "https://github.com/keplerproject/lua-compat-5.3.git")
+                 (commit "daebe77a2f498817713df37f0bb316db1d82222f")))
+           (file-name "lua-compat-5.3-checkout")
+           (sha256
+            (base32
+             "02a14nvn7aggg1yikj9h3dcf8aqjbxlws1bfvqbpfxv9d5phnrpz"))))))
+    (home-page "https://github.com/luvit/luv/")
+    (synopsis "Libuv bindings for Lua")
+    (description
+     "This library makes libuv available to Lua scripts.")
+    (license license:asl2.0)))
+
+(define-public lua-luv
+  (make-lua-luv "lua-luv" lua))
+
+(define-public lua5.1-luv
+  (make-lua-luv "lua5.1-luv" lua-5.1))
+
+(define-public lua5.2-luv
+  (make-lua-luv "lua5.2-luv" lua-5.2))
+
 ;; Lua 5.3 is not supported.
 (define (make-lua-bitop name lua)
   (package
diff --git a/gnu/packages/lxqt.scm b/gnu/packages/lxqt.scm
index e72f5b82d9..e5487d3ae4 100644
--- a/gnu/packages/lxqt.scm
+++ b/gnu/packages/lxqt.scm
@@ -1177,7 +1177,8 @@ processes currently in existence, much like code{top} or code{ps}.")
         (base32 "0v1vvi8vf9y8nv8y0gzffaqji53s75ab5jypksih0ndcws8ryww4"))))
     (build-system cmake-build-system)
     (inputs
-     `(("qtbase" ,qtbase)))
+     `(("qtbase" ,qtbase)
+       ("utf8proc" ,utf8proc)))
     (native-inputs
      `(("lxqt-build-tools" ,lxqt-build-tools)
        ("qttools" ,qttools)))
diff --git a/gnu/packages/maths.scm b/gnu/packages/maths.scm
index 16d3af3831..e44ec66cb5 100644
--- a/gnu/packages/maths.scm
+++ b/gnu/packages/maths.scm
@@ -1726,11 +1726,16 @@ This is the certified version of the Open Cascade Technology (OCCT) library.")
     (version "2.16.0")
     (source
      (origin
-      (method url-fetch)
-      (uri (string-append "http://gmsh.info/src/gmsh-"
-                          version "-source.tgz"))
+      (method git-fetch)
+      (uri (git-reference
+            (url "https://gitlab.onelab.info/gmsh/gmsh.git")
+            (commit
+             (string-append "gmsh_"
+                            (string-map (lambda (x) (if (eq? x #\.) #\_ x))
+                                        version)))))
+      (file-name (git-file-name name version))
       (sha256
-       (base32 "1slf0bfkwrcgn6296wb4qhbk4ahz6i4wfb10hnim08x05vrylag8"))
+       (base32 "08rq4jajwmlpivnm9yifz2jhaivnz065lnk0h2zv773nwl9wf162"))
       (modules '((guix build utils)))
       (snippet
        ;; Remove non-free METIS code
@@ -1756,7 +1761,7 @@ This is the certified version of the Open Cascade Technology (OCCT) library.")
      `(#:configure-flags `("-DENABLE_METIS:BOOL=OFF"
                            "-DENABLE_BUILD_SHARED:BOOL=ON"
                            "-DENABLE_BUILD_DYNAMIC:BOOL=ON")))
-    (home-page "http://www.geuz.org/gmsh/")
+    (home-page "http://gmsh.info/")
     (synopsis "3D finite element grid generator")
     (description "Gmsh is a 3D finite element grid generator with a built-in
 CAD engine and post-processor.  Its design goal is to provide a fast, light
@@ -3100,6 +3105,10 @@ parts of it.")
 
 (define-public openblas
   (package
+    ;; TODO: Incorporate 'openblas/fixed-num-threads' changes on the next
+    ;; rebuild cycle.
+    (replacement openblas/fixed-num-threads)
+
     (name "openblas")
     (version "0.3.6")
     (source
@@ -3170,7 +3179,7 @@ parts of it.")
     (license license:bsd-3)))
 
 (define-public openblas-ilp64
-  (package (inherit openblas)
+  (package/inherit openblas
     (name "openblas-ilp64")
     (supported-systems '("x86_64-linux" "aarch64-linux" "mips64el-linux"))
     (arguments
@@ -3181,6 +3190,24 @@ parts of it.")
     (synopsis "Optimized BLAS library based on GotoBLAS (ILP64 version)")
     (license license:bsd-3)))
 
+(define openblas/fixed-num-threads
+  ;; TODO: Move that to 'openblas' proper on the next rebuild cycle.
+  (package
+    (inherit openblas)
+    (version (match (string-split (package-version openblas) #\.)
+               ((numbers ... (= string-length len))
+                (string-join (append numbers
+                                     (list (make-string len #\a)))
+                             "."))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments openblas)
+       ((#:make-flags flags ''())
+        ;; This is the maximum number of threads OpenBLAS will ever use (that
+        ;; is, if $OPENBLAS_NUM_THREADS is greater than that, then NUM_THREADS
+        ;; is used.)  If we don't set it, the makefile sets it to the number
+        ;; of cores of the build machine, which is obviously wrong.
+        `(cons "NUM_THREADS=128" ,flags))))))
+
 (define* (make-blis implementation #:optional substitutable?)
   "Return a BLIS package with the given IMPLEMENTATION (see config/ in the
 source tree for a list of implementations.)
@@ -3837,8 +3864,8 @@ set.")
      `(("doc++" ,doc++)
        ("netpbm" ,netpbm)
        ("perl" ,perl)                   ; needed to run 'ppmquant' during tests
-       ("texlive" ,(texlive-union (list texlive-generic-xypic
-                                        texlive-fonts-xypic
+       ("texlive" ,(texlive-union (list texlive-xypic
+                                        texlive-cm
                                         texlive-latex-hyperref
                                         texlive-bibtex)))
        ("ghostscript" ,ghostscript)))
diff --git a/gnu/packages/mes.scm b/gnu/packages/mes.scm
index 7bdd122f2b..e1cb736b82 100644
--- a/gnu/packages/mes.scm
+++ b/gnu/packages/mes.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2017,2018 Jan Nieuwenhuizen <janneke@gnu.org>
+;;; Copyright © 2017, 2018, 2019 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2017, 2018 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;;
@@ -62,14 +62,14 @@ extensive examples, including parsers for the Javascript and C99 languages.")
 (define-public nyacc
   (package
     (inherit nyacc-0.86)
-    (version "0.94.0")
+    (version "0.99.0")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://savannah/nyacc/nyacc-"
                                   version ".tar.gz"))
               (sha256
                (base32
-                "12qnzwm1n3j8z7hbr9hy2wka9a1aasm2rvnpnvdxkjcsbdzj8fn4"))
+                "0hl5qxx19i4x1r0839sxm19ziqq65g4hy97yik81cc2yb9yvgyv3"))
               (modules '((guix build utils)))
               (snippet
                '(begin
@@ -93,22 +93,19 @@ extensive examples, including parsers for the Javascript and C99 languages.")
 (define-public mes
   (package
     (name "mes")
-    (version "0.19")
+    (version "0.20")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://gnu/mes/"
                                   "mes-" version ".tar.gz"))
               (sha256
                (base32
-                "15h4yhaywdc0djpjlin2jz1kzahpqxfki0r0aav1qm9nxxmnp1l0"))))
+                "04pajp8v31na34ls4730ig5f6miiplhdvkmsb9ls1b8bbmw2vb4n"))))
     (build-system gnu-build-system)
     (supported-systems '("i686-linux" "x86_64-linux"))
     (propagated-inputs
      `(("mescc-tools" ,mescc-tools)
-
-       ;; XXX: MesCC appears to enter an infinite loop (?) while building
-       ;; crt1.o when we switch to nyacc 0.94.
-       ("nyacc" ,nyacc-0.86)))
+       ("nyacc" ,nyacc)))
     (native-inputs
      `(("guile" ,guile-2.2)
        ,@(let ((target-system (or (%current-target-system)
@@ -168,3 +165,19 @@ linker, the blood-elf symbol table generator, the kaem shell, exec_enable and
 get_machine.")
     (home-page "https://savannah.nongnu.org/projects/mescc-tools")
     (license gpl3+))))
+
+(define-public mescc-tools-0.6.1
+  (package
+    (inherit mescc-tools)
+    (name "mescc-tools")
+    (version "0.6.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "http://git.savannah.nongnu.org/cgit/mescc-tools.git/snapshot/"
+                    name "-Release_" version
+                    ".tar.gz"))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "06jpvq6xfjzn2al6b4rdwd3zv3h4cvilc4n9gqcnjr9cr6wjpw2n"))))))
diff --git a/gnu/packages/music.scm b/gnu/packages/music.scm
index db6c42f6b1..2b30308861 100644
--- a/gnu/packages/music.scm
+++ b/gnu/packages/music.scm
@@ -22,6 +22,7 @@
 ;;; Copyright © 2019 Gabriel Hondet <gabrielhondet@gmail.com>
 ;;; Copyright © 2019 Timotej Lazar <timotej.lazar@araneo.si>
 ;;; Copyright © 2019 Jakob L. Kreuze <zerodaysfordays@sdf.lonestar.org>
+;;; Copyright © 2019 raingloom <raingloom@protonmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -2137,7 +2138,7 @@ capabilities, custom envelopes, effects, etc.")
 (define-public yoshimi
   (package
     (name "yoshimi")
-    (version "1.6.0")
+    (version "1.6.0.1")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://sourceforge/yoshimi/"
@@ -2145,10 +2146,10 @@ capabilities, custom envelopes, effects, etc.")
                                   "/yoshimi-" version ".tar.bz2"))
               (sha256
                (base32
-                "0bcc5spnq73yp1fmm367d1mxcswqkmzs3cnpb4cxr513ir98sa50"))))
+                "140f2k4akj39pny8c7i794q125415gyvmy4rday0il5ncp3glik4"))))
     (build-system cmake-build-system)
     (arguments
-     `(#:tests? #f ; there are no tests
+     `(#:tests? #f                      ; there are no tests
        #:configure-flags
        (list (string-append "-DCMAKE_INSTALL_DATAROOTDIR="
                             (assoc-ref %outputs "out") "/share"))
@@ -4521,3 +4522,65 @@ discard bad quality ones.
 controller.")
     (home-page "https://github.com/charlesfleche/lpd8editor")
     (license license:expat)))
+
+(define-public fmit
+  (package
+    (name "fmit")
+    (version "1.2.6")
+    (source (origin
+	      (method git-fetch)
+	      (uri (git-reference
+		    (url "https://github.com/gillesdegottex/fmit/")
+		    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+	      (sha256
+               (base32
+                "03nzkig5mw2rqwhwmg0qvc5cnk9bwh2wp13jh0mdrr935w0587mz"))))
+    (build-system gnu-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+	 (delete 'configure)
+	 (add-before 'build 'qmake
+	   (lambda _
+	     (let ((out (assoc-ref %outputs "out")))
+               (invoke "qmake"
+                       "fmit.pro"
+                       (string-append "PREFIX=" out)
+                       (string-append "PREFIXSHORTCUT=" out)
+                       "CONFIG+=acs_qt acs_alsa acs_jack acs_portaudio"))))
+         (add-after 'install 'wrap-executable
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (wrap-program (string-append out "/bin/fmit")
+                 `("QT_PLUGIN_PATH" ":" prefix
+                   ,(map (lambda (label)
+                           (string-append (assoc-ref inputs label)
+                                          "/lib/qt5/plugins"))
+                         '("qtbase" "qtmultimedia" "qtsvg")))
+                 `("QML2_IMPORT_PATH" ":" prefix
+                   ,(map (lambda (label)
+                           (string-append (assoc-ref inputs label)
+                                          "/lib/qt5/qml"))
+                         '("qtmultimedia"))))
+               #t))))))
+    (inputs
+     `(("alsa-lib" ,alsa-lib)
+       ("fftw" ,fftw)
+       ("jack" ,jack-1)
+       ("portaudio" ,portaudio)
+       ("qtbase" ,qtbase)
+       ("qtmultimedia" ,qtmultimedia)
+       ("qtsvg" ,qtsvg)))
+    (native-inputs
+     `(("gettext" ,gnu-gettext)
+       ("hicolor-icon-theme" ,hicolor-icon-theme)
+       ("itstool" ,itstool)
+       ("qttools" ,qttools)))
+    (synopsis "Musical instrument tuner")
+    (description "FMIT is a graphical utility for tuning musical instruments,
+with error and volume history, and advanced features.")
+    (home-page "https://gillesdegottex.github.io/fmit/")
+    ;; Most of the code is under GPL2+, but some abstract or helper classes
+    ;; are under LGPL2.1.
+    (license (list license:gpl2+ license:lgpl2.1))))
diff --git a/gnu/packages/networking.scm b/gnu/packages/networking.scm
index ee7d65fc06..bfa901a84e 100644
--- a/gnu/packages/networking.scm
+++ b/gnu/packages/networking.scm
@@ -284,7 +284,7 @@ transparently check connection attempts against an access control list.")
                (base32
                 "0qzp80ky4y2k7k1ya09v9gkivvfbz2km813snrb8jhnn634bbmzb"))))
     (build-system gnu-build-system)
-    (home-page "http://zeromq.org")
+    (home-page "https://zeromq.org")
     (synopsis "Library for message-based applications")
     (description
      "The 0MQ lightweight messaging kernel is a library which extends the
@@ -1968,14 +1968,14 @@ displays the results in real time.")
 (define-public strongswan
   (package
     (name "strongswan")
-    (version "5.8.0")
+    (version "5.8.1")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://download.strongswan.org/strongswan-"
                            version ".tar.bz2"))
        (sha256
-        (base32 "0cq9m86ydd2i0awxkv4a256f4926p2f9pzlisyskl9fngl6f3c8m"))))
+        (base32 "034rd6kr1bmnvj8rg2kcxdjb0cgj3dn9310mmm94j1awxan71byr"))))
     (build-system gnu-build-system)
     (arguments
      `(#:phases
@@ -1998,7 +1998,7 @@ displays the results in real time.")
              #t)))
        #:configure-flags
        (list
-        ;; Disable bsd-4 licensed plugins
+        ;; Disable bsd-4 licensed plugins.
         "--disable-des"
         "--disable-blowfish")))
     (inputs
diff --git a/gnu/packages/ntp.scm b/gnu/packages/ntp.scm
index 419b6d7321..6942ecec2f 100644
--- a/gnu/packages/ntp.scm
+++ b/gnu/packages/ntp.scm
@@ -5,6 +5,7 @@
 ;;; Copyright © 2015, 2018 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2016, 2017, 2018 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2019 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -108,8 +109,11 @@ computers over a network.")
                 "0fn12i4kzsi0zkr4qp3dp9bycmirnfapajqvdfx02zhr4hanj0kv"))))
     (build-system gnu-build-system)
     (arguments
-     '(#:configure-flags '("--with-privsep-user=ntpd"
-                           "--localstatedir=/var")
+     '(#:configure-flags `( "--with-privsep-user=ntpd"
+                            "--localstatedir=/var"
+                            ,(string-append "--with-cacert="
+                                            (assoc-ref %build-inputs "libressl")
+                                            "/etc/ssl/cert.pem"))
        #:phases
        (modify-phases %standard-phases
          (add-after 'unpack 'modify-install-locations
diff --git a/gnu/packages/ocr.scm b/gnu/packages/ocr.scm
index 2808359ca2..1266e7e419 100644
--- a/gnu/packages/ocr.scm
+++ b/gnu/packages/ocr.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2013 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2019 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2019 Alex Vong <alexvong1995@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -22,8 +23,11 @@
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
   #:use-module (guix download)
+  #:use-module (guix git-download)
   #:use-module (guix build-system gnu)
+  #:use-module (guix build-system python)
   #:use-module (gnu packages compression)
+  #:use-module (gnu packages python)
   #:use-module (gnu packages image))
 
 (define-public ocrad
@@ -76,3 +80,74 @@ positional information and page layout analysis.  Several image formats are
 supported through the Leptonica library.  It can also detect whether text is
 monospaced or proportional.")
     (license license:asl2.0)))
+
+(define-public zinnia
+  (let* ((commit "581faa8f6f15e4a7b21964be3a5ec36265c80e5b")
+         (revision "1")
+         ;; version copied from 'configure.in'
+         (version (git-version "0.07" revision commit)))
+    (package
+      (name "zinnia")
+      (version version)
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/taku910/zinnia.git")
+               (commit commit)))
+         (sha256
+          (base32
+           "1izjy5qw6swg0rs2ym2i72zndb90mwrfbd1iv8xbpwckbm4899lg"))
+         (file-name (git-file-name name version))
+         (modules '((guix build utils)
+                    (ice-9 ftw)
+                    (srfi srfi-26)))
+         (snippet ; remove unnecessary files with potentially different license
+          '(begin
+             (for-each delete-file-recursively
+                       (scandir "."
+                                (negate (cut member <> '("zinnia"
+                                                         "." "..")))))
+             #t))))
+      (build-system gnu-build-system)
+      (arguments
+       `(#:phases
+         (modify-phases %standard-phases
+           (replace 'bootstrap
+             (lambda _
+               (chdir "zinnia")
+               (for-each make-file-writable
+                         '("config.log" "config.status"))
+               #t)))))
+      (home-page "https://taku910.github.io/zinnia/")
+      (synopsis "Online hand recognition system with machine learning")
+      (description
+       "Zinnia is a simple, customizable and portable online hand recognition
+system based on Support Vector Machines.  Zinnia simply receives user pen
+strokes as a sequence of coordinate data and outputs n-best characters sorted
+by SVM confidence.  To keep portability, Zinnia doesn't have any rendering
+functionality.  In addition to recognition, Zinnia provides training module
+that allows us to create any hand-written recognition systems with low-cost.")
+      (license (list license:bsd-3 ; all files except...
+                     (license:non-copyleft ; some autotools related files
+                      "file://zinnia/aclocal.m4")
+                     license:x11 ; 'install-sh'
+                     license:public-domain))))) ; 'install-sh'
+
+;;; python 2 bindings, license under the same terms as zinnia
+(define-public python2-zinnia
+  (package
+    (inherit zinnia)
+    (name "python2-zinnia")
+    (build-system python-build-system)
+    (arguments
+     `(#:python ,python-2 ; CObject API is used, it was removed in Python 3.2
+       #:tests? #f ; avoid circular dependency on tegaki-zinnia-japanese
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'chdir
+           (lambda _
+             (chdir "zinnia/python")
+             #t)))))
+    (inputs
+     `(("zinnia" ,zinnia)))))
diff --git a/gnu/packages/package-management.scm b/gnu/packages/package-management.scm
index 57589d852c..d396f001ef 100644
--- a/gnu/packages/package-management.scm
+++ b/gnu/packages/package-management.scm
@@ -31,6 +31,7 @@
 (define-module (gnu packages package-management)
   #:use-module (gnu packages)
   #:use-module (gnu packages acl)
+  #:use-module (gnu packages admin)
   #:use-module (gnu packages attr)
   #:use-module (gnu packages avahi)
   #:use-module (gnu packages autotools)
@@ -39,6 +40,7 @@
   #:use-module (gnu packages bdw-gc)
   #:use-module (gnu packages bison)
   #:use-module (gnu packages bootstrap)          ;for 'bootstrap-guile-origin'
+  #:use-module (gnu packages cdrom)
   #:use-module (gnu packages check)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages cpio)
@@ -48,6 +50,7 @@
   #:use-module (gnu packages docbook)
   #:use-module (gnu packages file)
   #:use-module (gnu packages gettext)
+  #:use-module (gnu packages ghostscript)
   #:use-module (gnu packages glib)
   #:use-module (gnu packages gnome)
   #:use-module (gnu packages gnupg)
@@ -55,11 +58,19 @@
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages guile)
   #:use-module (gnu packages guile-xyz)
+  #:use-module (gnu packages haskell)
+  #:use-module (gnu packages image)
+  #:use-module (gnu packages imagemagick)
+  #:use-module (gnu packages java)
   #:use-module (gnu packages linux)
   #:use-module (gnu packages lisp)
+  #:use-module (gnu packages llvm)
   #:use-module (gnu packages man)
+  #:use-module (gnu packages mono)
+  #:use-module (gnu packages nettle)
   #:use-module (gnu packages nss)
   #:use-module (gnu packages patchutils)
+  #:use-module (gnu packages pdf)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages perl-check)
   #:use-module (gnu packages pkg-config)
@@ -71,8 +82,10 @@
   #:use-module (gnu packages sqlite)
   #:use-module (gnu packages ssh)
   #:use-module (gnu packages texinfo)
+  #:use-module (gnu packages textutils)
   #:use-module (gnu packages time)
   #:use-module (gnu packages tls)
+  #:use-module (gnu packages video)
   #:use-module (gnu packages vim)
   #:use-module (gnu packages virtualization)
   #:use-module (gnu packages web)
@@ -110,8 +123,8 @@
   ;; Note: the 'update-guix-package.scm' script expects this definition to
   ;; start precisely like this.
   (let ((version "1.0.1")
-        (commit "c902458863d1d341ffd74970b75e69c2bb848183")
-        (revision 4))
+        (commit "0ed97e69805253656df929a6ad678016aa81f08a")
+        (revision 6))
     (package
       (name "guix")
 
@@ -127,7 +140,7 @@
                       (commit commit)))
                 (sha256
                  (base32
-                  "0w93qjgy9n0qqyij12s7hm7fl4wb6h99bmfril4cqf4ynckpdvbb"))
+                  "1h2qlbbdqi72jslx17gp2cak5494nbm8j44rz57lnplnfcn6iwaw"))
                 (file-name (string-append "guix-" version "-checkout"))))
       (build-system gnu-build-system)
       (arguments
@@ -342,6 +355,19 @@ the Nix package manager.")
         #f)
        ((#:phases phases '%standard-phases)
         `(modify-phases ,phases
+           (add-after 'unpack 'change-default-guix
+             (lambda _
+               ;; We need to tell 'guix-daemon' which 'guix' command to use.
+               ;; Here we use a questionable hack where we hard-code root's
+               ;; current guix, which could be wrong (XXX).  Note that scripts
+               ;; like 'guix perform-download' do not run as root so we assume
+               ;; that they have access to /var/guix/profiles/per-user/root.
+               (substitute* "nix/libstore/globals.cc"
+                 (("guixProgram = (.*)nixBinDir + \"/guix\"" _ before)
+                  (string-append "guixProgram = " before
+                                 "/var/guix/profiles/per-user/root\
+/current-guix/bin/guix")))
+               #t))
            (replace 'build
              (lambda _
                (invoke "make" "nix/libstore/schema.sql.hh")
@@ -351,19 +377,7 @@ the Nix package manager.")
            (delete 'copy-bootstrap-guile)
            (replace 'install
              (lambda* (#:key outputs #:allow-other-keys)
-               (invoke "make" "install-binPROGRAMS"
-                       "install-nodist_pkglibexecSCRIPTS")
-
-               ;; We need to tell 'guix-daemon' which 'guix' command to use.
-               ;; Here we use a questionable hack where we hard-code root's
-               ;; current guix, which could be wrong (XXX).  Note that scripts
-               ;; like 'guix perform-download' do not run as root so we assume
-               ;; that they have access to /var/guix/profiles/per-user/root.
-               (let ((out (assoc-ref outputs "out")))
-                 (substitute* (find-files (string-append out "/libexec"))
-                   (("exec \".*/bin/guix\"")
-                    "exec \"${GUIX:-/var/guix/profiles/per-user/root/current-guix/bin/guix}\""))
-                 #t)))
+               (invoke "make" "install-binPROGRAMS")))
            (delete 'wrap-program)))))))
 
 (define-public guile2.0-guix
@@ -544,7 +558,7 @@ transactions from C or Python.")
     (license license:gpl2+)))
 
 (define-public diffoscope
-  (let ((version "122"))
+  (let ((version "123"))
     (package
       (name "diffoscope")
       (version version)
@@ -556,7 +570,7 @@ transactions from C or Python.")
                 (file-name (git-file-name name version))
                 (sha256
                  (base32
-                  "1pwddknk8qyv88ba63why8vbnlc14b47434lv4ijx49m7ya3zfvg"))))
+                  "11bxms5rkhi0v4pxx29v4qgvhp3fmf0fkzci6gn5xcv4fl1zy4wj"))))
       (build-system python-build-system)
       (arguments
        `(#:phases (modify-phases %standard-phases
@@ -573,6 +587,13 @@ transactions from C or Python.")
                       (lambda _
                         (delete-file "tests/comparators/test_berkeley_db.py")
                         #t))
+                    ;; Test is dynamically generated and may have false
+                    ;; negatives with different ocaml versions.  Further
+                    ;; background in: https://bugs.debian.org/939386
+                    (add-after 'unpack 'remove-ocaml-test
+                      (lambda _
+                        (delete-file "tests/comparators/test_ocaml.py")
+                        #t))
                     (add-after 'unpack 'embed-tool-references
                       (lambda* (#:key inputs #:allow-other-keys)
                         (substitute* "diffoscope/comparators/utils/compare.py"
@@ -592,10 +613,9 @@ transactions from C or Python.")
                         #t))
                     (add-before 'check 'writable-test-data
                       (lambda _
-                        ;; tests/comparators/test_elf.py needs write access to
-                        ;; test data
-                        (make-file-writable
-                         "tests/data/ignore_readelf_errors_expected_diff")
+                        ;; tests may need needs write access to tests
+                        ;; directory
+                        (for-each make-file-writable (find-files "tests"))
                         #t))
                     (add-before 'check 'delete-failing-test
                       (lambda _
@@ -612,7 +632,43 @@ transactions from C or Python.")
                 ("xxd" ,xxd)))
       ;; Below are modules used for tests.
       (native-inputs `(("python-pytest" ,python-pytest)
-                       ("python-chardet" ,python-chardet)))
+                       ("python-chardet" ,python-chardet)
+                       ;; test suite skips tests when tool is missing
+                       ("bdb" ,bdb)
+                       ("binutils" ,binutils)
+                       ("bzip2" ,bzip2)
+                       ("cdrtools" ,cdrtools)
+                       ("colord" ,colord)
+                       ("cpio" ,cpio)
+                       ("docx2txt" ,docx2txt)
+                       ("e2fsprogs" ,e2fsprogs)
+                       ("ffmpeg" ,ffmpeg)
+                       ("gettext" ,gettext-minimal)
+                       ("ghc" ,ghc)
+                       ("ghostscript" ,ghostscript)
+                       ("giflib:bin" ,giflib "bin")
+                       ("gnumeric" ,gnumeric)
+                       ("gnupg" ,gnupg)
+                       ("imagemagick" ,imagemagick)
+                       ("libarchive" ,libarchive)
+                       ("llvm" ,llvm)
+                       ("lz4" ,lz4)
+                       ("mono" ,mono)
+                       ("odt2txt" ,odt2txt)
+                       ;; no unversioned openjdk available
+                       ("openjdk:jdk" ,openjdk12 "jdk")
+                       ("openssh" ,openssh)
+                       ("pgpdump" ,pgpdump)
+                       ("poppler" ,poppler)
+                       ("rpm" ,rpm)
+                       ("sng" ,sng)
+                       ("sqlite" ,sqlite)
+                       ("squashfs-tools" ,squashfs-tools)
+                       ("tcpdump" ,tcpdump)
+                       ("unzip" ,unzip)
+                       ("xxd" ,xxd)
+                       ("xz" ,xz)
+                       ("zip" ,(@ (gnu packages compression) zip))))
       (home-page "https://diffoscope.org/")
       (synopsis "Compare files, archives, and directories in depth")
       (description
diff --git a/gnu/packages/patches/cmake-curl-certificates.patch b/gnu/packages/patches/cmake-curl-certificates.patch
new file mode 100644
index 0000000000..36252083f8
--- /dev/null
+++ b/gnu/packages/patches/cmake-curl-certificates.patch
@@ -0,0 +1,40 @@
+By default commands such as "ctest" would not look for certificates
+at all: <https://issues.guix.gnu.org/issue/37371>.
+
+This changes CMake such that commands honor SSL_CERT_FILE and SSL_CERT_DIR
+as well as /etc/ssl/certs.
+
+--- cmake-3.13.1/Source/cmCurl.cxx	2019-09-10 17:27:36.926907260 +0200
++++ cmake-3.13.1/Source/cmCurl.cxx	2019-09-10 17:52:35.475903919 +0200
+@@ -4,11 +4,8 @@
+ 
+ #include "cmThirdParty.h"
+ 
+-#if !defined(CMAKE_USE_SYSTEM_CURL) && !defined(_WIN32) &&                    \
+-  !defined(__APPLE__) && !defined(CURL_CA_BUNDLE) && !defined(CURL_CA_PATH)
+ #  define CMAKE_FIND_CAFILE
+ #  include "cmSystemTools.h"
+-#endif
+ 
+ // curl versions before 7.21.5 did not provide this error code
+ #if defined(LIBCURL_VERSION_NUM) && LIBCURL_VERSION_NUM < 0x071505
+@@ -29,6 +26,19 @@ std::string cmCurlSetCAInfo(::CURL* curl
+     ::CURLcode res = ::curl_easy_setopt(curl, CURLOPT_CAINFO, cafile);
+     check_curl_result(res, "Unable to set TLS/SSL Verify CAINFO: ");
+   }
++
++  /* Honor the usual environment variables.  */
++  else if (cmSystemTools::GetEnv("SSL_CERT_FILE", e)) {
++    ::CURLcode res =
++      ::curl_easy_setopt(curl, CURLOPT_CAINFO, e.c_str());
++    check_curl_result(res, "Unable to set TLS/SSL Verify CAINFO: ");
++  }
++  else if (cmSystemTools::GetEnv("SSL_CERT_DIR", e)) {
++    ::CURLcode res =
++      ::curl_easy_setopt(curl, CURLOPT_CAPATH, e.c_str());
++    check_curl_result(res, "Unable to set TLS/SSL Verify CAINFO: ");
++  }
++
+ #ifdef CMAKE_FIND_CAFILE
+ #  define CMAKE_CAFILE_FEDORA "/etc/pki/tls/certs/ca-bundle.crt"
+   else if (cmSystemTools::FileExists(CMAKE_CAFILE_FEDORA, true)) {
diff --git a/gnu/packages/patches/tipp10-fix-compiling.patch b/gnu/packages/patches/tipp10-fix-compiling.patch
index 4c206d4d83..3a34a98b22 100644
--- a/gnu/packages/patches/tipp10-fix-compiling.patch
+++ b/gnu/packages/patches/tipp10-fix-compiling.patch
@@ -204,8 +204,7 @@ https://sources.debian.net/data/main/t/tipp10/2.1.0-2/debian/patches/0001-FixCom
  Name=TIPP10
  Comment=Touch Typing Tutor
  Comment[de]=10-Finger-Schreibtrainer
--Exec=tipp10
-+Exec=/usr/bin/tipp10
+ Exec=tipp10
  Icon=tipp10.png
  Terminal=false
  Type=Application
diff --git a/gnu/packages/patches/weechat-python.patch b/gnu/packages/patches/weechat-python.patch
deleted file mode 100644
index 8182636ecb..0000000000
--- a/gnu/packages/patches/weechat-python.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-Get Python LDFLAGS from 'pkg-config'.
-
-The other approach is more complex and gets it wrong: it returns
-"-L/path/to/python/lib/python-2.7.10/lib/python2.7/config -lpython -lwhatever";
-since that config/ sub-directory contains libpython2.7.a, we end up
-statically linking Python in Weechat's python.so, which we do not want.
-
---- weechat-1.3/configure.ac	2015-08-16 08:27:07.000000000 +0200
-+++ weechat-1.3/configure.ac	2015-11-29 18:18:52.975197048 +0100
-@@ -535,29 +535,7 @@ if test "x$enable_python" = "xyes" ; the
-             if test -r "$PYTHON_INCLUDE/Python.h"; then
-                 PYTHON_CFLAGS="-I$PYTHON_INCLUDE"
-                 AC_MSG_RESULT(found)
--                PYTHON_LIB=`$PYTHON -c "import sys, distutils.sysconfig; sys.stdout.write(distutils.sysconfig.get_config_var('LIBPL'))"`
--                PYTHON_LFLAGS="-lpython$PYTHON_VERSION "`$PYTHON -c "import sys, distutils.sysconfig; sys.stdout.write(distutils.sysconfig.get_config_var('LIBS')+' '+distutils.sysconfig.get_config_var('SYSLIBS')+' '+distutils.sysconfig.get_config_var('LINKFORSHARED'))"`
--                AC_MSG_CHECKING(for Python library)
--                if test -r "$PYTHON_LIB/libpython$PYTHON_VERSION.so"; then
--                   PYTHON_LFLAGS="-L$PYTHON_LIB $PYTHON_LFLAGS"
--                   AC_MSG_RESULT(found)
--                elif test -r "$PYTHON_LIB/libpython$PYTHON_VERSION.a"; then
--                   PYTHON_LFLAGS="-L$PYTHON_LIB $PYTHON_LFLAGS"
--                   AC_MSG_RESULT(found)
--                elif test -r "$PYTHON_LIB/libpython$PYTHON_VERSION.dll.a"; then
--                   PYTHON_LFLAGS="-L$PYTHON_LIB $PYTHON_LFLAGS"
--                   AC_MSG_RESULT(found)
--                elif test -r "$PYTHON_SYSPREFIX/lib/libpython$PYTHON_VERSION.so"; then
--                   PYTHON_LFLAGS="-L$PYTHON_SYSPREFIX/lib/ $PYTHON_LFLAGS"
--                   AC_MSG_RESULT(found)
--                else
--                    AC_MSG_WARN([
--*** Python library couldn't be found on your system.
--*** Try to install it with your software package manager.
--*** WeeChat will be built without Python support.])
--                    enable_python="no"
--                    not_found="$not_found python"
--                fi
-+                PYTHON_LFLAGS=`pkg-config python2 --libs`
-             else
-                 AC_MSG_WARN([
- *** Python header files couldn't be found on your system.
diff --git a/gnu/packages/perl-compression.scm b/gnu/packages/perl-compression.scm
index ea71492262..d09e68e294 100644
--- a/gnu/packages/perl-compression.scm
+++ b/gnu/packages/perl-compression.scm
@@ -133,7 +133,7 @@ type by using either Perl modules, or command-line tools on your system.")
 (define-public perl-archive-zip
   (package
     (name "perl-archive-zip")
-    (version "1.64")
+    (version "1.65")
     (source
      (origin
        (method url-fetch)
@@ -141,8 +141,7 @@ type by using either Perl modules, or command-line tools on your system.")
              "mirror://cpan/authors/id/P/PH/PHRED/Archive-Zip-"
              version ".tar.gz"))
        (sha256
-        (base32
-         "0zfinh8nx3rxzscp57vq3w8hihpdb0zs67vvalykcf402kr88pyy"))))
+        (base32 "116vcg8x7n92i7cn3bx0xck69mz9vjy0il9i8p7p7lk40kz7jcbl"))))
     (build-system perl-build-system)
     (native-inputs
      ;; For tests.
diff --git a/gnu/packages/python-check.scm b/gnu/packages/python-check.scm
index 676dae5430..b8aaef9b77 100644
--- a/gnu/packages/python-check.scm
+++ b/gnu/packages/python-check.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2019 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2019 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -226,11 +227,27 @@ testing framework.")
         (base32
          "03w2zz3crblj1p6i8nq17946hbn3zqp9z7cfnifw47hi4a4fww12"))))
     (build-system python-build-system)
-    (arguments '(#:tests? #f)) ; one test fails; can't find virtualenv
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         ;; Reference the virtualenv executable directly, to avoid the need
+         ;; for PYTHONPATH, which gets cleared when instantiating a new
+         ;; virtualenv with pytest-virtualenv.
+         (add-after 'unpack 'patch-virtualenv-executable
+           (lambda* (#:key inputs #:allow-other-keys)
+             (let* ((virtualenv (assoc-ref inputs "python-virtualenv"))
+                    (virtualenv-bin (string-append virtualenv
+                                                   "/bin/virtualenv")))
+               (substitute* "pytest_virtualenv.py"
+                 (("^DEFAULT_VIRTUALENV_FIXTURE_EXECUTABLE.*$")
+                  (format #f "DEFAULT_VIRTUALENV_FIXTURE_EXECUTABLE = '~a'"
+                          virtualenv-bin)))
+               #t))))))
     (propagated-inputs
-     `(("python-virtualenv" ,python-virtualenv)
-       ("python-pytest-shutil" ,python-pytest-shutil)
+     `(("python-pytest-shutil" ,python-pytest-shutil)
        ("python-pytest-fixture-config" ,python-pytest-fixture-config)))
+    (inputs
+     `(("python-virtualenv" ,python-virtualenv)))
     (native-inputs
      `(("python-mock" ,python-mock)
        ("python-pytest" ,python-pytest)
diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 296879f534..eef2079c19 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -3004,38 +3004,44 @@ Language (TOML) configuration files.")
 Server (PLS).")
     (license license:expat)))
 
+;; XXX: We must use a non-release version since the latest release version
+;; requires python-jedi version < 0.15.
 (define-public python-language-server
-  (package
-    (name "python-language-server")
-    (version "0.26.1")
-    (source
-     (origin
-       (method url-fetch)
-       (uri (pypi-uri "python-language-server" version))
-       (sha256
-        (base32
-         "1vs9ckfmm534n1hq3m871916wsjvi5h4gyj6wlzg13ck6506lx0s"))))
-    (build-system python-build-system)
-    (propagated-inputs
-     `(("python-pluggy" ,python-pluggy)
-       ("python-jsonrpc-server" ,python-jsonrpc-server)
-       ("python-jedi" ,python-jedi)
-       ("python-yapf" ,python-yapf)
-       ("python-pyflakes" ,python-pyflakes)
-       ("python-pydocstyle" ,python-pydocstyle)
-       ("python-pycodestyle" ,python-pycodestyle)
-       ("python-mccabe" ,python-mccabe)
-       ("python-rope" ,python-rope)
-       ("python-autopep8" ,python-autopep8)
-       ("python-pylint" ,python-pylint)))
-    (home-page "https://github.com/palantir/python-language-server")
-    (synopsis "Python implementation of the Language Server Protocol")
-    (description
-     "The Python Language Server (pyls) is an implementation of the Python 3
+  (let ((commit "c3cab77a85b1de4af1aec1bafea6a7320d6baec5")
+        (revision "1"))
+    (package
+      (name "python-language-server")
+      (version (git-version "0.28.3" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/palantir/python-language-server.git")
+               (commit commit)))
+         (sha256
+          (base32
+           "1q0xdwgln09sh58j0ryygj92hfgdhwcs57zjvqihya23jr5v0bz4"))))
+      (build-system python-build-system)
+      (propagated-inputs
+       `(("python-pluggy" ,python-pluggy)
+         ("python-jsonrpc-server" ,python-jsonrpc-server)
+         ("python-jedi" ,python-jedi)
+         ("python-yapf" ,python-yapf)
+         ("python-pyflakes" ,python-pyflakes)
+         ("python-pydocstyle" ,python-pydocstyle)
+         ("python-pycodestyle" ,python-pycodestyle)
+         ("python-mccabe" ,python-mccabe)
+         ("python-rope" ,python-rope)
+         ("python-autopep8" ,python-autopep8)
+         ("python-pylint" ,python-pylint)))
+      (home-page "https://github.com/palantir/python-language-server")
+      (synopsis "Python implementation of the Language Server Protocol")
+      (description
+       "The Python Language Server (pyls) is an implementation of the Python 3
 language specification for the Language Server Protocol (LSP).  This tool is
 used in text editing environments to provide a complete and integrated
 feature-set for programming Python effectively.")
-    (license license:expat)))
+      (license license:expat))))
 
 (define-public python-black
   (package
@@ -3848,14 +3854,14 @@ convert between colorspaces like sRGB, XYZ, CIEL*a*b*, CIECAM02, CAM02-UCS, etc.
 (define-public python-matplotlib
   (package
     (name "python-matplotlib")
-    (version "2.2.3")
+    (version "3.1.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "matplotlib" version))
        (sha256
         (base32
-         "1rcc7x9ig3hpchkc4cwdvym3y451w74275fxr455zkfagrsvymbk"))))
+         "14qc109dibp32xfd9lah54djc0rc76fhbsj9cwyb328lzqmd5sqz"))))
     (build-system python-build-system)
     (propagated-inputs ; the following packages are all needed at run time
      `(("python-cycler" ,python-cycler)
@@ -3872,7 +3878,7 @@ convert between colorspaces like sRGB, XYZ, CIEL*a*b*, CIECAM02, CAM02-UCS, etc.
        ;; From version 1.4.0 'matplotlib' makes use of 'cairocffi' instead of
        ;; 'pycairo'. However, 'pygobject' makes use of a 'pycairo' 'context'
        ;; object. For this reason we need to import both libraries.
-       ;; https://pythonhosted.org/cairocffi/cffi_api.html#converting-pycairo
+       ;; https://cairocffi.readthedocs.io/en/stable/cffi_api.html#converting-pycairo-wrappers-to-cairocffi
        ("python-pycairo" ,python-pycairo)
        ("python-cairocffi" ,python-cairocffi)))
     (inputs
@@ -3887,11 +3893,59 @@ convert between colorspaces like sRGB, XYZ, CIEL*a*b*, CIECAM02, CAM02-UCS, etc.
        ("tk" ,tk)))
     (native-inputs
      `(("pkg-config" ,pkg-config)
-       ("python-nose" ,python-nose)
-       ("python-mock" ,python-mock)))
+       ("python-pytest" ,python-pytest)
+       ("python-mock" ,python-mock)
+       ("unzip" ,unzip)
+       ("jquery-ui"
+        ,(origin
+           (method url-fetch)
+           (uri "https://jqueryui.com/resources/download/jquery-ui-1.12.1.zip")
+           (sha256
+            (base32
+             "0kb21xf38diqgxcdi1z3s9ssq36pldvyqxy56hn6pcva6rs3c8zq"))))))
     (arguments
      `(#:phases
        (modify-phases %standard-phases
+         ;; XXX We disable all image comparison tests because we're using a
+         ;; newer version of FreeType than matplotlib expects.  This leads to
+         ;; minor differences throughout the tests.
+         (add-after 'unpack 'fix-and-disable-failing-tests
+           (lambda _
+             (substitute* (append (find-files "lib/matplotlib/tests/"
+                                              "test_.*\\.py$")
+                                  (find-files "lib/mpl_toolkits/tests"
+                                              "test_.*\\.py$"))
+               (("^from matplotlib" match)
+                (string-append "import pytest\n" match))
+               (("( *)@image_comparison" match indent)
+                (string-append indent
+                               "@pytest.mark.skip(reason=\"unknown minor image differences\")\n"
+                               match)))
+             (substitute* "lib/matplotlib/tests/test_animation.py"
+               (("/bin/sh") (which "sh")))
+             (for-each delete-file
+                       ;; test_normal_axes, test_get_tightbbox_polar
+                       '("lib/matplotlib/tests/test_axes.py"
+                         ;; test_outward_ticks
+                         "lib/matplotlib/tests/test_tightlayout.py"
+                         ;; Fontconfig returns no fonts.
+                         "lib/matplotlib/tests/test_font_manager.py"))
+             #t))
+         (add-before 'install 'install-jquery-ui
+           (lambda* (#:key outputs inputs #:allow-other-keys)
+             (let ((dir (string-append (assoc-ref outputs "out")
+                                       "/lib/python3.7/site-packages/matplotlib/backends/web_backend/")))
+               (mkdir-p dir)
+               (invoke "unzip"
+                       (assoc-ref inputs "jquery-ui")
+                       "-d" dir))
+             #t))
+         (delete 'check)
+         (add-after 'install 'check
+           (lambda* (#:key outputs inputs #:allow-other-keys)
+             (add-installed-pythonpath inputs outputs)
+             (invoke "python" "tests.py" "-v"
+                     "-m" "not network")))
          (add-before 'build 'configure-environment
            (lambda* (#:key outputs inputs #:allow-other-keys)
              (let ((cairo (assoc-ref inputs "cairo")))
@@ -3903,8 +3957,8 @@ convert between colorspaces like sRGB, XYZ, CIEL*a*b*, CIECAM02, CAM02-UCS, etc.
                  (lambda (port)
                    (format port "[directories]~%
 basedirlist = ~a,~a~%
- [rc_options]~%
-backend = TkAgg~%"
+[packages]~%
+tests = True~%"
                         (assoc-ref inputs "tcl")
                         (assoc-ref inputs "tk")))))
              #t)))))
@@ -3923,6 +3977,14 @@ toolkits.")
   (let ((matplotlib (package-with-python2
                      (strip-python2-variant python-matplotlib))))
     (package (inherit matplotlib)
+      (version "2.2.3")
+      (source
+       (origin
+         (method url-fetch)
+         (uri (pypi-uri "matplotlib" version))
+         (sha256
+          (base32
+           "1rcc7x9ig3hpchkc4cwdvym3y451w74275fxr455zkfagrsvymbk"))))
       ;; Make sure to use special packages for Python 2 instead
       ;; of those automatically rewritten by package-with-python2.
       (propagated-inputs
@@ -3946,6 +4008,7 @@ toolkits.")
      `(("python-matplotlib" ,python-matplotlib)
        ("python-colorspacious" ,python-colorspacious)
        ("python-sphinx" ,python-sphinx)
+       ("python-sphinx-copybutton" ,python-sphinx-copybutton)
        ("python-sphinx-gallery" ,python-sphinx-gallery)
        ("python-numpydoc" ,python-numpydoc)
        ("python-ipython" ,python-ipython)
@@ -3972,6 +4035,9 @@ toolkits.")
      `(#:tests? #f ; we're only generating documentation
        #:phases
        (modify-phases %standard-phases
+         ;; The tests in python-matplotlib are run after the install phase, so
+         ;; we need to delete the extra phase here.
+         (delete 'check)
          (replace 'build
            (lambda _
              (chdir "doc")
@@ -4020,7 +4086,12 @@ toolkits.")
     (license (package-license python-matplotlib))))
 
 (define-public python2-matplotlib-documentation
-  (package-with-python2 python-matplotlib-documentation))
+  (let ((parent (package-with-python2 python-matplotlib-documentation)))
+    (package
+      (inherit parent)
+      (native-inputs
+       (alist-delete "python-sphinx-copybutton"
+                     (package-native-inputs parent))))))
 
 (define-public python-matplotlib-venn
   (package
@@ -5014,7 +5085,8 @@ releases.")
     (outputs '("out" "doc"))
     (build-system python-build-system)
     (propagated-inputs
-     `(("python-appdirs" ,python-appdirs)))
+     `(("python-appdirs" ,python-appdirs)
+       ("python-importlib-metadata" ,python-importlib-metadata)))
     (native-inputs
      `(("python-setuptools-scm" ,python-setuptools-scm)
        ("python-sphinx" ,python-sphinx)
@@ -5447,6 +5519,13 @@ computing.")
     (arguments
      `(#:phases
        (modify-phases %standard-phases
+         (add-after 'unpack 'make-docs-reproducible
+           (lambda _
+             (substitute* "IPython/sphinxext/ipython_directive.py"
+               ((".*import datetime") "")
+               ((".*datetime.datetime.now\\(\\)") "")
+               (("%timeit") "# %timeit"))
+             #t))
          ;; Tests can only be run after the library has been installed and not
          ;; within the source directory.
          (delete 'check)
@@ -7500,17 +7579,31 @@ serve the same purpose: provide Python bindings for libmagic.")))
   (package
     (name "python-debian")
     (home-page "https://salsa.debian.org/python-debian-team/python-debian")
-    (version "0.1.28")
+    (version "0.1.36")
     (source
      (origin
-       (method url-fetch)
-       (uri (pypi-uri name version))
+       ;; Use git-fetch, as pypi doesn't include test suite.
+       (method git-fetch)
+       (uri (git-reference
+             (url home-page)
+             (commit version)))
+       (file-name (git-file-name name version))
        (sha256
         (base32
-         "0i15f0xzx679sd0ldq2sls9pnnps9fv6vhqvnv9dzf4qhma42i0y"))))
+         "0qy6x28bj6yfikhjww932v5xq4mf5bm1iczl7acy4c7zm6mwhqfa"))))
     (build-system python-build-system)
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+                  (add-after 'unpack 'remove-debian-specific-tests
+                    ;; python-apt, apt and dpkg are not yet available in guix,
+                    ;; and these tests heavily depend on them.
+                    (lambda _
+                      (delete-file "lib/debian/tests/test_deb822.py")
+                      (delete-file "lib/debian/tests/test_debfile.py")
+                      #t)))))
     (propagated-inputs
-     `(("python-six" ,python-six)))
+     `(("python-six" ,python-six)
+       ("python-chardet" ,python-chardet)))
     (synopsis "Debian package related modules")
     (description
      ;; XXX: Use @enumerate instead of @itemize to work around
@@ -10554,25 +10647,29 @@ characters, mouse support, and auto suggestions.")
 (define-public python-jedi
   (package
     (name "python-jedi")
-    (version "0.13.3")
+    (version "0.15.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "jedi" version))
        (sha256
         (base32
-         "0nsrjlb57njqppxmi8wjsb1dkad7qa7svx67jbkhixq66lz61c1b"))))
+         "0bp4pxhsynaarbvzblsn5x32lzp29svy3sxfy8i6m5iwz9s9r1ds"))))
     (build-system python-build-system)
     (arguments
-     `( ;; Many tests are failing with Python 3.7.x as of version 0.13.3 (see:
-        ;; https://github.com/davidhalter/jedi/issues/1263)
-       #:tests? #f
-       #:phases
+     `(#:phases
        (modify-phases %standard-phases
+         (add-after 'unpack 'disable-file-completion-test
+           ;; A single parameterized test currently fail (see:
+           ;; https://github.com/davidhalter/jedi/issues/1395).  Remove it.
+           (lambda _
+             (substitute* "test/test_api/test_completion.py"
+               ((".*'example.py', 'rb\"' \\+ join\\('\\.\\.'.*") ""))
+             #t))
          (replace 'check
-           (lambda* (#:key tests? #:allow-other-keys)
-             (when tests?
-               (invoke "py.test" "-vv")))))))
+           (lambda _
+             (setenv "HOME" "/tmp")
+             (invoke "python" "-m" "pytest"))))))
     (native-inputs
      `(("python-pytest" ,python-pytest)
        ("python-docopt" ,python-docopt)))
@@ -10590,11 +10687,7 @@ well.")
     (license license:expat)))
 
 (define-public python2-jedi
-  (let ((base (package-with-python2 (strip-python2-variant python-jedi))))
-    (package
-      (inherit base)
-      (arguments (substitute-keyword-arguments (package-arguments base)
-                   ((#:tests? _) #t))))))
+  (package-with-python2 python-jedi))
 
 (define-public ptpython
   (package
@@ -14729,17 +14822,21 @@ time-based (TOTP) passwords.")
 (define-public python-parso
   (package
     (name "python-parso")
-    (version "0.3.1")
+    (version "0.5.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "parso" version))
        (sha256
         (base32
-         "18p89iwcm8mnf380f92g9w0bhx5km8wxp392vvjcq4y1ld1llw1m"))))
+         "171a9ivhxwsd52h1cgsz40zgzpgzscn7yqb7sdjhy8m1lzj0wsv6"))))
     (native-inputs
      `(("python-pytest" ,python-pytest)))
     (build-system python-build-system)
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+                  (replace 'check
+                    (lambda _ (invoke "pytest" "-vv"))))))
     (home-page "https://github.com/davidhalter/parso")
     (synopsis "Python Parser")
     (description "Parso is a Python parser that supports error recovery and
diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm
index 9fec18287e..644c9d7666 100644
--- a/gnu/packages/python.scm
+++ b/gnu/packages/python.scm
@@ -509,7 +509,7 @@ instead of @command{python3}.")))
 (define-public micropython
   (package
     (name "micropython")
-    (version "1.10")
+    (version "1.11")
     (source
       (origin
         (method url-fetch)
@@ -518,7 +518,7 @@ instead of @command{python3}.")))
                             "/micropython-" version ".tar.gz"))
         (sha256
          (base32
-          "1g1zjip3rkx6bp16qi1bag72wivnbh56fcsl3nffanrx4j5f4z90"))
+          "0px3xhw16rl0l7qifq7jw1gq92wzlnhd17dmszv9m2c3wbzs9p9f"))
       (modules '((guix build utils)))
       (snippet
        '(begin
@@ -532,7 +532,7 @@ instead of @command{python3}.")))
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         (add-before 'build 'preprare-build
+         (add-before 'build 'prepare-build
            (lambda _
              (chdir "ports/unix")
              ;; see: https://github.com/micropython/micropython/pull/4246
diff --git a/gnu/packages/ruby.scm b/gnu/packages/ruby.scm
index 1f3fb29aba..7d736c7c27 100644
--- a/gnu/packages/ruby.scm
+++ b/gnu/packages/ruby.scm
@@ -17,6 +17,7 @@
 ;;; Copyright © 2019 Mikhail Kirillov <w96k.ru@gmail.com>
 ;;; Copyright © 2019 Jelle Licht <jlicht@fsfe.org>
 ;;; Copyright © 2019 Brian Leung <bkleung89@gmail.com>
+;;; Copyright © 2019 Collin J. Doering <collin@rekahsoft.ca>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -670,6 +671,35 @@ RSpec tests.")
     (home-page "https://github.com/dblock/rspec-rerun")
     (license license:expat)))
 
+(define-public ruby-rspec-wait
+  (package
+    (name "ruby-rspec-wait")
+    (version "0.0.9")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (rubygems-uri "rspec-wait" version))
+        (sha256
+         (base32
+          "0gvj1bp5ccx001dyvcgk2j49s5sl6vs9fdaqqb08z3bd1554hsww"))))
+    (build-system ruby-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (invoke "rake" "spec"))))))
+    (native-inputs
+     `(("bundler" ,bundler)))
+    (propagated-inputs
+     `(("ruby-rspec" ,ruby-rspec)))
+    (home-page "https://github.com/laserlemon/rspec-wait")
+    (synopsis "Wait for conditions in RSpec")
+    (description
+     "RSpec::Wait strives to make it easier to test asynchronous or slow
+interactions.")
+    (license license:expat)))
+
 (define-public ruby-rspec
   (package
     (name "ruby-rspec")
diff --git a/gnu/packages/shellutils.scm b/gnu/packages/shellutils.scm
index f7542ea759..6630332692 100644
--- a/gnu/packages/shellutils.scm
+++ b/gnu/packages/shellutils.scm
@@ -5,6 +5,7 @@
 ;;; Copyright © 2017 Stefan Reichör <stefan@xsteve.at>
 ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018 Benjamin Slade <slade@jnanam.net>
+;;; Copyright © 2019 Collin J. Doering <collin@rekahsoft.ca>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -22,21 +23,107 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu packages shellutils)
-  #:use-module (gnu packages base)
-  #:use-module (gnu packages golang)
-  #:use-module (gnu packages python)
   #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix utils)
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix git-download)
+  #:use-module (guix build-system gnu)
+  #:use-module (guix build-system go)
+  #:use-module (guix build-system python)
   #:use-module (gnu packages autotools)
+  #:use-module (gnu packages base)
+  #:use-module (gnu packages golang)
   #:use-module (gnu packages ncurses)
-  #:use-module (gnu packages readline)
   #:use-module (gnu packages pkg-config)
-  #:use-module (guix utils)
-  #:use-module (guix build-system gnu)
-  #:use-module (guix build-system go)
-  #:use-module (guix build-system python))
+  #:use-module (gnu packages python)
+  #:use-module (gnu packages readline)
+  #:use-module (gnu packages ruby)
+  #:use-module (gnu packages shells)
+  #:use-module (gnu packages tmux))
+
+(define-public zsh-autosuggestions
+  (package
+    (name "zsh-autosuggestions")
+    (version "0.6.3")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/zsh-users/zsh-autosuggestions.git")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1h8h2mz9wpjpymgl2p7pc146c1jgb3dggpvzwm9ln3in336wl95c"))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("ruby" ,ruby)
+       ("ruby-byebug" ,ruby-byebug)
+       ("ruby-pry" ,ruby-pry)
+       ("ruby-rspec" ,ruby-rspec)
+       ("ruby-rspec-wait" ,ruby-rspec-wait)
+       ("tmux" ,tmux)
+       ("zsh" ,zsh)))
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (delete 'configure)
+         (replace 'check ; Tests use ruby's bundler; instead execute rspec directly.
+           (lambda _
+             (setenv "TMUX_TMPDIR" (getenv "TMPDIR"))
+             (setenv "SHELL" (which "zsh"))
+             (invoke "rspec")))
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (zsh-plugins
+                      (string-append out "/share/zsh/plugins/zsh-autosuggestions")))
+               (invoke "make" "all")
+               (install-file "zsh-autosuggestions.zsh" zsh-plugins)
+               #t))))))
+    (home-page "https://github.com/zsh-users/zsh-autosuggestions")
+    (synopsis "Fish-like autosuggestions for zsh")
+    (description
+     "Fish-like fast/unobtrusive autosuggestions for zsh.  It suggests commands
+as you type.")
+    (license license:expat)))
+
+(define-public sh-z
+  (package
+    (name "sh-z")
+    (version "1.11")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/rupa/z.git")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "13zbgkj6y0qhvn5jpkrqbd4jjxjr789k228iwma5hjfh1nx7ghyb"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f ; No tests provided
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure)
+         (delete 'build)
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (man (string-append out "/share/man/man1"))
+                    (bin (string-append out "/bin")))
+               (install-file "z.sh" bin)
+               (chmod (string-append bin "/z.sh") #o755)
+               (install-file "z.1" man)
+               #t))))))
+    (synopsis "Jump about directories")
+    (description
+     "Tracks your most used directories, based on ``frecency''.  After a short
+learning phase, z will take you to the most ``frecent'' directory that matches
+all of the regexes given on the command line in order.")
+    (home-page "https://github.com/rupa/z")
+    (license license:expat)))
 
 (define-public envstore
   (package
diff --git a/gnu/packages/sphinx.scm b/gnu/packages/sphinx.scm
index 5ec769388a..9bd1e8d421 100644
--- a/gnu/packages/sphinx.scm
+++ b/gnu/packages/sphinx.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014 David Thompson <davet@gnu.org>
-;;; Copyright © 2015, 2017 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2015, 2017, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2015, 2016, 2017 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2016 Hartmut Goebel <h.goebel@crazy-compilers.com>
 ;;; Copyright © 2016, 2017, 2018, 2019 Marius Bakke <mbakke@fastmail.com>
@@ -163,6 +163,25 @@ sources.")
 Apple help books.")
     (license license:bsd-2)))
 
+(define-public python-sphinx-copybutton
+  (package
+    (name "python-sphinx-copybutton")
+    (version "0.2.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "sphinx-copybutton" version))
+       (sha256
+        (base32
+         "1bk006nv5s9ym6v67cxd4d2wvd8wm6czqi21mqcs33risygksncl"))))
+    (build-system python-build-system)
+    (home-page "https://github.com/choldgraf/sphinx-copybutton")
+    (synopsis "Sphinx extension to add \"copy\" buttons to code blocks")
+    (description
+     "This package provides a small sphinx extension to add \"copy\" buttons
+to code blocks.")
+    (license license:expat)))
+
 (define-public python-sphinxcontrib-devhelp
   (package
     (name "python-sphinxcontrib-devhelp")
diff --git a/gnu/packages/statistics.scm b/gnu/packages/statistics.scm
index 143df3e63e..2ffe0a10d6 100644
--- a/gnu/packages/statistics.scm
+++ b/gnu/packages/statistics.scm
@@ -49,6 +49,7 @@
   #:use-module (gnu packages curl)
   #:use-module (gnu packages emacs)
   #:use-module (gnu packages emacs-xyz)
+  #:use-module (gnu packages fontutils)
   #:use-module (gnu packages gcc)
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages gettext)
@@ -1199,23 +1200,24 @@ agnes cluster diagrams.")
 (define-public r-gdtools
   (package
     (name "r-gdtools")
-    (version "0.1.9")
+    (version "0.2.0")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "gdtools" version))
        (sha256
         (base32
-         "0w4fihf52q5qxxk0lg36x6yvjjl8vw66y60ncdjs5fvnxqn5z2vb"))))
+         "1mvpkp8cj30fwd4bwlz96x3cff7yzfbfz7iswmf77zl0a6122inh"))))
     (build-system r-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)))
     (inputs
      `(("cairo" ,cairo)
+       ("freetype2" ,freetype)
        ("zlib" ,zlib)))
     (propagated-inputs
      `(("r-rcpp" ,r-rcpp)
-       ("r-withr" ,r-withr)))
+       ("r-systemfonts" ,r-systemfonts)))
     (home-page "https://cran.r-project.org/web/packages/gdtools")
     (synopsis "Utilities for graphical rendering")
     (description
@@ -2436,18 +2438,24 @@ informative error messages when it's not available.")
 (define-public r-devtools
   (package
     (name "r-devtools")
-    (version "2.1.0")
+    (version "2.2.0")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "devtools" version))
               (sha256
                (base32
-                "0393v7nr22gr5g9afgrhq4ab3lwbqy6fd3shnmlhdpqam5357xy1"))))
+                "05fag25mkqy13yja8x32aqr9c0ah9rbm8cfjcsmy1dv5h4j8cxa1"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-callr" ,r-callr)
        ("r-cli" ,r-cli)
+       ("r-covr" ,r-covr)
+       ("r-crayon" ,r-crayon)
+       ("r-desc" ,r-desc)
        ("r-digest" ,r-digest)
+       ("r-dt" ,r-dt)
+       ("r-ellipsis" ,r-ellipsis)
+       ("r-glue" ,r-glue)
        ("r-git2r" ,r-git2r)
        ("r-httr" ,r-httr)
        ("r-jsonlite" ,r-jsonlite)
@@ -2458,6 +2466,7 @@ informative error messages when it's not available.")
        ("r-roxygen2" ,r-roxygen2)
        ("r-remotes" ,r-remotes)
        ("r-rstudioapi" ,r-rstudioapi)
+       ("r-rversions" ,r-rversions)
        ("r-sessioninfo" ,r-sessioninfo)
        ("r-testthat" ,r-testthat)
        ("r-usethis" ,r-usethis)
@@ -2598,13 +2607,13 @@ well as additional utilities such as panel and axis annotation functions.")
 (define-public r-rcpparmadillo
   (package
     (name "r-rcpparmadillo")
-    (version "0.9.600.4.0")
+    (version "0.9.700.2.0")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "RcppArmadillo" version))
               (sha256
                (base32
-                "07jg2667xyhmp1fbcdi5nnhmkk81da76s9rlswfq4k2sjsmbfmr0"))))
+                "0g25w32dnqrvhnri8x4yxqawxd8qhn7w3m8d29nxxy0gybx3y8x9"))))
     (properties `((upstream-name . "RcppArmadillo")))
     (build-system r-build-system)
     ;; All needed for vignettes
@@ -3645,13 +3654,13 @@ t-probabilities, quantiles, random deviates and densities.")
 (define-public r-matrixstats
   (package
     (name "r-matrixstats")
-    (version "0.54.0")
+    (version "0.55.0")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "matrixStats" version))
               (sha256
                (base32
-                "0vx00ldsg2zvdrjn49jxczk2c9iaabgvzgpdka5j02ihh7hv83cg"))))
+                "06fvx0rlaz80k0lkqq2n7v0309xpz7h7ss0m9kgyikp4xs8bvmhn"))))
     (properties `((upstream-name . "matrixStats")))
     (build-system r-build-system)
     (native-inputs
@@ -3748,25 +3757,28 @@ selection.")
 (define-public r-tidyr
   (package
     (name "r-tidyr")
-    (version "0.8.3")
+    (version "1.0.0")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "tidyr" version))
        (sha256
         (base32
-         "0dyc4b03wi65bk7j0ma0y188syh37h57wgxji82i0h8j6pn593x1"))))
+         "1403j0xd93l0r7qj738ryd5zc79hbcghrzybib3c3hrnaq5s78cj"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-dplyr" ,r-dplyr)
+       ("r-ellipsis" ,r-ellipsis)
        ("r-magrittr" ,r-magrittr)
        ("r-glue" ,r-glue)
+       ("r-lifecycle" ,r-lifecycle)
        ("r-purrr" ,r-purrr)
        ("r-rlang" ,r-rlang)
        ("r-tidyselect" ,r-tidyselect)
        ("r-rcpp" ,r-rcpp)
        ("r-stringi" ,r-stringi)
-       ("r-tibble" ,r-tibble)))
+       ("r-tibble" ,r-tibble)
+       ("r-vctrs" ,r-vctrs)))
     (home-page "https://github.com/hadley/tidyr")
     (synopsis "Tidy data with `spread()` and `gather()` functions")
     (description
diff --git a/gnu/packages/suckless.scm b/gnu/packages/suckless.scm
index 427bc44598..f0055cc0cc 100644
--- a/gnu/packages/suckless.scm
+++ b/gnu/packages/suckless.scm
@@ -724,3 +724,31 @@ as -1, to be used instead of U+FFFD.
 It is a front end for ii-like chat programs.  It uses @code{tail -f} to get the
 chat output in the background.")
       (license license:isc))))
+
+(define-public scron
+  (package
+    (name "scron")
+    (version "0.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://dl.2f30.org/releases/"
+                           name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "066fwa55kqcgfrsqgxh94sqbkxfsr691360xg4ljxr4i75d25s2a"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f ; No tests
+       #:make-flags (list "CC=gcc"
+                          (string-append "PREFIX=" %output))
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure)))) ; No configure script
+    (home-page "https://git.2f30.org/scron/")
+    (synopsis "Simple cron daemon")
+    (description
+     "Schedule commands to be run at specified dates and times.
+Single daemon and configuration file.  Log to stdout or syslog.  No mail
+support.")
+    (license license:expat)))
diff --git a/gnu/packages/sync.scm b/gnu/packages/sync.scm
index e281f43554..0c840a1a1d 100644
--- a/gnu/packages/sync.scm
+++ b/gnu/packages/sync.scm
@@ -264,14 +264,14 @@ over the Internet in an HTTP and CDN friendly way;
 (define-public rclone
   (package
     (name "rclone")
-    (version "1.49.1")
+    (version "1.49.2")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/rclone/rclone/releases/download/"
                            "v" version "/rclone-v" version ".tar.gz"))
        (sha256
-        (base32 "1d0qvj7fn5bx3zqlf6hzn1922nrmy4x341n760m1b6h9az32mc5x"))))
+        (base32 "1q8lf85hg2havb1xsal75r19ck166rh19lffpd3i43zgblc6gs8j"))))
     ;; FIXME: Rclone bundles some libraries Guix already provides.  Need to
     ;; un-bundle them.
     (build-system go-build-system)
diff --git a/gnu/packages/terminals.scm b/gnu/packages/terminals.scm
index f0117eead3..98ed77289a 100644
--- a/gnu/packages/terminals.scm
+++ b/gnu/packages/terminals.scm
@@ -7,7 +7,7 @@
 ;;; Copyright © 2016, 2017 José Miguel Sánchez García <jmi2k@openmailbox.org>
 ;;; Copyright © 2017, 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2017 Kei Kebreau <kkebreau@posteo.net>
-;;; Copyright © 2017, 2018 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2017, 2018, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2017 Petter <petter@mykolab.ch>
 ;;; Copyright © 2018 Hartmut Goebel <h.goebel@crazy-compilers.com>
 ;;; Copyright © 2018 Arun Isaac <arunisaac@systemreboot.net>
@@ -460,7 +460,7 @@ should be thread-safe.")
 (define-public libvterm
   (package
     (name "libvterm")
-    (version "0+bzr681")
+    (version "0.1")
     (source
      (origin
        (method url-fetch)
@@ -468,12 +468,13 @@ should be thread-safe.")
                            "libvterm-" version ".tar.gz"))
        (sha256
         (base32
-         "1s56c8p1qz6frkcri0hg4qyydv2wcccj6n2xmz1dwcdqn38ldsmb"))))
+         "1pcxjhvdwhr2f3lyzf2rv1vp3l62bgkjm1ybhj82qf8yly7ca6g4"))))
     (build-system gnu-build-system)
     (arguments
      `(#:make-flags
        (list "CC=gcc"
              (string-append "PREFIX=" (assoc-ref %outputs "out")))
+       #:tests? #f ; XXX: some tests fail in this release
        #:test-target "test"
        #:phases
        (modify-phases %standard-phases
diff --git a/gnu/packages/tex.scm b/gnu/packages/tex.scm
index 28459917c8..e67b0505f3 100644
--- a/gnu/packages/tex.scm
+++ b/gnu/packages/tex.scm
@@ -6827,17 +6827,14 @@ titles.")
                          "/fonts/afm/public/xypic/"
                          "/fonts/tfm/public/xypic/"
                          "/fonts/type1/public/xypic/"
-
-                         ;;"/tex/generic/xypic/" ; I guess these are generated
-                         )
+                         "/tex/generic/xypic/")
                    (base32
-                    "0sqkkvjzzsiazvh8803qqyrcv4is3m1qs9x9v2m35jjikbqc08y8"))))
+                    "09b51bbm189xh7039h5n8nmab5nn2bybhh26qjn08763m80zdhjg")
+                   #:trivial? #t)))
     (package
       (inherit template)
       (arguments
        (substitute-keyword-arguments (package-arguments template)
-         ((#:tex-directory _ #t)
-          "tex/generic/xypic")
          ((#:phases phases)
           `(modify-phases ,phases
              (delete 'reset-gzip-timestamps)))))
diff --git a/gnu/packages/textutils.scm b/gnu/packages/textutils.scm
index 388f164428..9ce01e66ea 100644
--- a/gnu/packages/textutils.scm
+++ b/gnu/packages/textutils.scm
@@ -13,7 +13,7 @@
 ;;; Copyright © 2017,2019 Hartmut Goebel <h.goebel@crazy-compilers.com>
 ;;; Copyright © 2017 Kei Kebreau <kkebreau@posteo.net>
 ;;; Copyright © 2017 Alex Vong <alexvong1995@gmail.com>
-;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018 Pierre Neidhardt <mail@ambrevar.xyz>
 ;;; Copyright © 2018 Meiyo Peng <meiyo.peng@gmail.com>
 ;;; Copyright © 2019 Yoshinori Arai <kumagusu08@gmail.com>
@@ -89,23 +89,22 @@ to DOS format and vice versa.")
 (define-public recode
   (package
     (name "recode")
-    (version "3.7.1")
+    (version "3.7.5")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/rrthomas/recode/releases/"
-                           "download/v" version "/" name "-" version ".tar.gz"))
+                           "download/v" version "/recode-" version ".tar.gz"))
        (sha256
-        (base32
-         "0215hfj0rhlh0grg91qfx75pp6z09bpv8211qdxqihniw7y9a4fs"))
+        (base32 "1sl99dfx2b76paq86wv3a0lcy66f1hylf6iy04rzwxj7ccwpsk30"))
        (modules '((guix build utils)))
        (snippet '(begin
                    (delete-file "tests/Recode.c")
                    #t))))
     (build-system gnu-build-system)
     (native-inputs
-     `(("python" ,python-2)
-       ("python2-cython" ,python2-cython)))
+     `(("python" ,python)
+       ("python-cython" ,python-cython)))
     (home-page "https://github.com/rrthomas/recode")
     (synopsis "Text encoding converter")
     (description "The Recode library converts files between character sets and
@@ -879,6 +878,44 @@ indentation.
     (home-page "http://docx2txt.sourceforge.net")
     (license license:gpl3+)))
 
+(define-public odt2txt
+  (package
+    (name "odt2txt")
+    (version "0.5")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/dstosberg/odt2txt/")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32
+          "0im3kzvhxkjlx57w6h13mc9584c74ma1dyymgvpq2y61av3gc35v"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f ; no make check
+       #:make-flags (list "CC=gcc"
+                          (string-append "DESTDIR=" (assoc-ref %outputs "out")))
+       #:phases
+       (modify-phases %standard-phases
+         ;; no configure script
+         (delete 'configure))))
+    (inputs
+     `(("zlib" ,zlib)))
+    (home-page "https://github.com/dstosberg/odt2txt/")
+    (synopsis "Converter from OpenDocument Text to plain text")
+    (description "odt2txt is a command-line tool which extracts the text out
+of OpenDocument Texts, as produced by OpenOffice.org, KOffice, StarOffice and
+others.
+
+odt2txt can also extract text from some file formats similar to OpenDocument
+Text, such as OpenOffice.org XML (*.sxw), which was used by OpenOffice.org
+version 1.x and older StarOffice versions.  To a lesser extent, odt2txt may be
+useful to extract content from OpenDocument spreadsheets (*.ods) and
+OpenDocument presentations (*.odp).")
+    (license license:gpl2)))
+
 (define-public opencc
   (package
     (name "opencc")
diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
index d896908a12..6689375da6 100644
--- a/gnu/packages/tls.scm
+++ b/gnu/packages/tls.scm
@@ -271,6 +271,7 @@ required structures.")
   (package
    (name "openssl")
    (version "1.1.1c")
+   (replacement openssl-1.1.1d)
    (source (origin
              (method url-fetch)
              (uri (list (string-append "https://www.openssl.org/source/openssl-"
@@ -372,6 +373,24 @@ required structures.")
    (license license:openssl)
    (home-page "https://www.openssl.org/")))
 
+(define openssl-1.1.1d
+  (package/inherit
+   openssl
+   (version "1.1.1d")
+   (source (origin
+             (method url-fetch)
+             (uri (list (string-append "https://www.openssl.org/source/openssl-"
+                                       version ".tar.gz")
+                        (string-append "ftp://ftp.openssl.org/source/"
+                                       "openssl-" version ".tar.gz")
+                        (string-append "ftp://ftp.openssl.org/source/old/"
+                                       (string-trim-right version char-set:letter)
+                                       "/openssl-" version ".tar.gz")))
+             (patches (search-patches "openssl-1.1-c-rehash-in.patch"))
+             (sha256
+              (base32
+               "1whinyw402z3b9xlb3qaxv4b9sk4w1bgh9k0y8df1z4x3yy92fhy"))))))
+
 (define-public openssl-1.0
   (package
     (inherit openssl)
diff --git a/gnu/packages/video.scm b/gnu/packages/video.scm
index 4fb2d76c33..b6c32fabdb 100644
--- a/gnu/packages/video.scm
+++ b/gnu/packages/video.scm
@@ -1492,7 +1492,7 @@ access to mpv's powerful playback capabilities.")
 (define-public youtube-dl
   (package
     (name "youtube-dl")
-    (version "2019.08.13")
+    (version "2019.09.12")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/rg3/youtube-dl/releases/"
@@ -1500,7 +1500,7 @@ access to mpv's powerful playback capabilities.")
                                   version ".tar.gz"))
               (sha256
                (base32
-                "0b94hrhbqa7jhn91pxsbphg2ylwkpkknb2y4v4sczp7rjvgmjgdj"))))
+                "0wmc0rl4l08hnz3agh69ld1pcmjs7czg0d2k7mnnlxhwlwi38w56"))))
     (build-system python-build-system)
     (arguments
      ;; The problem here is that the directory for the man page and completion
diff --git a/gnu/packages/vim.scm b/gnu/packages/vim.scm
index 8ebdbb9a35..b1f47bd010 100644
--- a/gnu/packages/vim.scm
+++ b/gnu/packages/vim.scm
@@ -735,7 +735,7 @@ are detected, the user is notified.")))
 (define-public neovim
   (package
     (name "neovim")
-    (version "0.3.7")
+    (version "0.4.2")
     (source
      (origin
        (method git-fetch)
@@ -745,7 +745,7 @@ are detected, the user is notified.")))
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "1j6w5jvq5v7kf7diad91qs1acr427nidnk9s24yyrz0hwdd1c2lh"))))
+         "13w446plvgl219lhj29jyimhiqvs1y1byrz4qpdmxgyddmx9xqss"))))
     (build-system cmake-build-system)
     (arguments
      `(#:modules ((srfi srfi-26)
@@ -754,13 +754,6 @@ are detected, the user is notified.")))
        #:configure-flags '("-DPREFER_LUA:BOOL=YES")
        #:phases
        (modify-phases %standard-phases
-         ;; TODO: remove 'patch-tic on update
-         ;; see: https://github.com/neovim/neovim/issues/9687
-         (add-after 'unpack 'patch-tic
-           (lambda _
-             (substitute* "src/nvim/tui/tui.c"
-               (("value != NULL") "value != NULL && value != (char *)-1"))
-             #t))
          (add-after 'unpack 'set-lua-paths
            (lambda* (#:key inputs #:allow-other-keys)
              (let* ((lua-version "5.1")
@@ -774,6 +767,7 @@ are detected, the user is notified.")))
                          (string-append path "/?.lua;" path "/?/?.lua"))))
                     (lua-inputs (map (cute assoc-ref %build-inputs <>)
                                      '("lua"
+                                       "lua-luv"
                                        "lua-lpeg"
                                        "lua-bitop"
                                        "lua-libmpack"))))
@@ -791,6 +785,7 @@ are detected, the user is notified.")))
        ("jemalloc" ,jemalloc)
        ("libiconv" ,libiconv)
        ("lua" ,lua-5.1)
+       ("lua-luv" ,lua5.1-luv)
        ("lua-lpeg" ,lua5.1-lpeg)
        ("lua-bitop" ,lua5.1-bitop)
        ("lua-libmpack" ,lua5.1-libmpack)))
diff --git a/gnu/packages/virtualization.scm b/gnu/packages/virtualization.scm
index 2e5b1ce16e..e1ac2189be 100644
--- a/gnu/packages/virtualization.scm
+++ b/gnu/packages/virtualization.scm
@@ -411,7 +411,10 @@ manage system or application containers.")
     (build-system gnu-build-system)
     (arguments
      `(#:configure-flags
-       (list "--with-polkit"
+       (list "--with-qemu"
+             "--with-qemu-user=nobody"
+             "--with-qemu-group=kvm"
+             "--with-polkit"
              (string-append "--docdir=" (assoc-ref %outputs "out") "/share/doc/"
                             ,name "-" ,version)
              "--sysconfdir=/etc"
@@ -450,23 +453,13 @@ manage system or application containers.")
              (apply invoke "make" "install"
                     "sysconfdir=/tmp/etc"
                     "localstatedir=/tmp/var"
-                    make-flags)))
-         (add-after 'install 'wrap-libvirtd
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let ((out (assoc-ref outputs "out")))
-               (wrap-program (string-append out "/sbin/libvirtd")
-                 `("PATH" = (,(string-append (assoc-ref inputs "iproute")
-                                             "/sbin")
-                             ,(string-append (assoc-ref inputs "qemu")
-                                             "/bin"))))
-               #t))))))
+                    make-flags))))))
     (inputs
      `(("libxml2" ,libxml2)
        ("eudev" ,eudev)
        ("libpciaccess" ,libpciaccess)
        ("gnutls" ,gnutls)
        ("dbus" ,dbus)
-       ("qemu" ,qemu)
        ("libpcap" ,libpcap)
        ("libnl" ,libnl)
        ("libtirpc" ,libtirpc)           ;for <rpc/rpc.h>
diff --git a/gnu/packages/vpn.scm b/gnu/packages/vpn.scm
index 3c6db64ad7..bc875b1c99 100644
--- a/gnu/packages/vpn.scm
+++ b/gnu/packages/vpn.scm
@@ -239,13 +239,13 @@ the user specifically asks to proxy, so the @dfn{VPN} interface no longer
 (define-public openconnect
   (package
    (name "openconnect")
-   (version "8.04")
+   (version "8.05")
    (source (origin
             (method url-fetch)
             (uri (string-append "ftp://ftp.infradead.org/pub/openconnect/"
                                 "openconnect-" version ".tar.gz"))
             (sha256
-             (base32 "07zqcl2ykdc4mgix9sbv4jgpg7cybifxfgrycvf99ckq7xp9r5wq"))))
+             (base32 "14i9q727c2zc9xhzp1a9hz3gzb5lwgsslbhircm84dnbs192jp1k"))))
    (build-system gnu-build-system)
    (propagated-inputs
     `(("libxml2" ,libxml2)
@@ -452,14 +452,14 @@ The peer-to-peer VPN implements a Layer 2 (Ethernet) network between the peers
 (define-public wireguard
   (package
     (name "wireguard")
-    (version "0.0.20190702")
+    (version "0.0.20190913")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://git.zx2c4.com/WireGuard/snapshot/"
                                   "WireGuard-" version ".tar.xz"))
               (sha256
                (base32
-                "1b5s1ncwqxdgb0c6cd07x4ynnj6cpbiqp4bxqir7mm5bf6y124qs"))))
+                "06452jfibwar4sh7wf2k2k1a5qk5q703gxqqq5ymj6rdblc2fwwr"))))
     (build-system gnu-build-system)
     (outputs '("out" ; The WireGuard userspace tools
                "kernel-patch")) ; A patch to build Linux with WireGuard support
diff --git a/gnu/packages/vulkan.scm b/gnu/packages/vulkan.scm
index 9111a93be5..479ec9425d 100644
--- a/gnu/packages/vulkan.scm
+++ b/gnu/packages/vulkan.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2017, 2018, 2019 Rutger Helling <rhelling@mykolab.com>
-;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -52,7 +52,7 @@
        (sha256
         (base32
          "0m56smanfcczjfif4yfcqhjj4d4sc088kwg6dgia8fwdsjavdm4d"))
-      (file-name (string-append name "-" version "-checkout"))))
+      (file-name (git-file-name name version))))
     (build-system cmake-build-system)
     (arguments
      `(#:tests? #f ;; No tests
diff --git a/gnu/packages/web-browsers.scm b/gnu/packages/web-browsers.scm
index 745b08f90b..bfc0976f0e 100644
--- a/gnu/packages/web-browsers.scm
+++ b/gnu/packages/web-browsers.scm
@@ -93,14 +93,14 @@ older or slower computers and embedded systems.")
 (define-public links
   (package
     (name "links")
-    (version "2.19")
+    (version "2.20.1")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://links.twibright.com/download/"
                                   "links-" version ".tar.bz2"))
                 (sha256
                (base32
-                "02ls11c02p7xvsdjyb43rrzr850i1yly003r812z0w5vv5yqqxbh"))))
+                "0184g59cxxhg9dqg5gv66f30f1wg8sx957pp5rs7b8icnwnafa5v"))))
     (build-system gnu-build-system)
     (arguments
      `(#:phases
diff --git a/gnu/packages/web.scm b/gnu/packages/web.scm
index 591ae2cb74..f7730f3992 100644
--- a/gnu/packages/web.scm
+++ b/gnu/packages/web.scm
@@ -6389,7 +6389,7 @@ derivation by David Revoy from the original MonsterID by Andreas Gohr.")
        (method url-fetch)
        (uri (string-append "https://github.com/nghttp2/nghttp2/"
                            "releases/download/v" version "/"
-                           name "-" version ".tar.xz"))
+                           "nghttp2-" version ".tar.xz"))
        (sha256
         (base32
          "0j0lk37k8k3f61r9nw647hg4b22z1753l36n3xrp9x01civ614b7"))))
@@ -6602,7 +6602,7 @@ Anonip can also be uses as a Python module in your own Python application.")
 (define-public poussetaches
   (package
     (name "poussetaches")
-    (version "0.0.1")
+    (version "0.0.2")
     (source
      (origin
        (method git-fetch)
@@ -6612,7 +6612,7 @@ Anonip can also be uses as a Python module in your own Python application.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "07106kfcz3a39jvrv3mlqqxlihsmdhgkrjnqznyjsij9absgvdv6"))))
+         "0kckcwvqklavd855np9aq5js6mg84isrlwchr504yigwma0sm7hm"))))
     (build-system go-build-system)
     (propagated-inputs
      `(("go-github-com-robfig-cron" ,go-github-com-robfig-cron)
diff --git a/gnu/packages/wget.scm b/gnu/packages/wget.scm
index 76ceed5ff7..1501ea2746 100644
--- a/gnu/packages/wget.scm
+++ b/gnu/packages/wget.scm
@@ -21,15 +21,13 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu packages wget)
-  #:use-module (guix licenses)
+  #:use-module ((guix licenses) #:prefix license:)
   #:use-module (gnu packages)
-  #:use-module (gnu packages autotools)
   #:use-module (gnu packages base)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages documentation)
-  #:use-module (gnu packages flex)
-  #:use-module (gnu packages gettext)
   #:use-module (gnu packages gnunet)
+  #:use-module (gnu packages gnupg)
   #:use-module (gnu packages libidn)
   #:use-module (gnu packages pcre)
   #:use-module (gnu packages perl)
@@ -40,7 +38,6 @@
   #:use-module (gnu packages xdisorg)
   #:use-module (guix packages)
   #:use-module (guix download)
-  #:use-module (guix git-download)
   #:use-module (guix build-system gnu))
 
 (define-public wget
@@ -74,7 +71,7 @@
 HTTPS and FTP protocols.  It can resume interrupted downloads, use file name
 wild cards, supports proxies and cookies, and it can convert absolute links
 in downloaded documents to relative links.")
-    (license gpl3+))) ; some files are under GPLv2+
+    (license license:gpl3+))) ; some files are under GPLv2+
 
 (define-public wgetpaste
   (package
@@ -136,68 +133,47 @@ in downloaded documents to relative links.")
     (description
      "@code{wgetpaste} is an extremely simple command-line interface to various
 online pastebin services.")
-    (license public-domain)))
+    (license license:public-domain)))
 
 (define-public wget2
   (package
    (name "wget2")
-   (version "1.99.1")
+   (version "1.99.2")
    (source
      (origin
-       (method git-fetch)
-       (uri (git-reference
-              (url "https://gitlab.com/gnuwget/wget2.git")
-              (commit (string-append name "-" version))
-              (recursive? #t))) ;; Needed for 'gnulib' git submodule.
-       (file-name (string-append name "-" version "-checkout"))
+       (method url-fetch)
+       (uri (string-append "mirror://gnu/wget/wget2-" version ".tar.gz"))
        (sha256
         (base32
-         "15wxsnjhc6bzk7f60i1djmsarh1w31gwi5h2gh9k19ncwypfj5dm"))))
+         "0qv55f4bablrlhc8bnic8g3mkk1kq44c4cphrk5jmv92z9aqzi6b"))))
    (build-system gnu-build-system)
    (arguments
     `(#:phases
       (modify-phases %standard-phases
-        (add-after 'unpack 'skip-network-test
+        (add-after 'unpack 'skip-network-tests
           (lambda _
-            (substitute* "tests/Makefile.am"
-              (("test-auth-digest\\$\\(EXEEXT)") ""))
-            #t))
-        (replace 'bootstrap
-          (lambda _
-            ;; Make sure all the files are writable so that ./bootstrap
-            ;; can proceed.
-            (for-each (lambda (file)
-                        (chmod file #o755))
-                        (find-files "."))
-            (patch-shebang "./gnulib/gnulib-tool.py")
-            ;; Remove unnecessary inputs from bootstrap.conf
-            (substitute* "bootstrap.conf"
-              (("flex.*") "")
-              (("makeinfo.*") "")
-              (("lzip.*") "")
-              (("rsync.*") ""))
-            (invoke "sh" "./bootstrap"
-                    "--gnulib-srcdir=gnulib"
-                    "--no-git"))))))
+            (substitute* "tests/Makefile.in"
+              (("test-gpg-verify-no-file\\$\\(EXEEXT)") "")
+              (("test-gpg-valid\\$\\(EXEEXT)") "")
+              (("test-gpg-styles\\$\\(EXEEXT)") ""))
+            #t)))
+      #:configure-flags '("--enable-static=no")))
    (inputs
-    `(("gnutls" ,gnutls/dane)
+    `(("bzip2" ,bzip2)
+      ("gnutls" ,gnutls/dane)
+      ("gpgme" ,gpgme)
       ("libiconv" ,libiconv)
       ("libidn2" ,libidn2)
       ("libmicrohttpd" ,libmicrohttpd)
       ("libpsl" ,libpsl)
-      ("pcre2" ,pcre2)))
+      ("pcre2" ,pcre2)
+      ("zlib" ,zlib)))
    ;; TODO: Add libbrotlidec, libnghttp2.
    (native-inputs
-    `(("autoconf" ,autoconf)
-      ("automake" ,automake)
-      ("flex" ,flex)
-      ("gettext" ,gettext-minimal)
-      ("libtool" ,libtool)
-      ("pkg-config" ,pkg-config)
-      ("python" ,python-2)))
+    `(("pkg-config" ,pkg-config)))
    (home-page "https://gitlab.com/gnuwget/wget2")
    (synopsis "Successor of GNU Wget")
    (description "GNU Wget2 is the successor of GNU Wget, a file and recursive
 website downloader.  Designed and written from scratch it wraps around libwget,
 that provides the basic functions needed by a web client.")
-   (license (list gpl3+ lgpl3+))))
+   (license (list license:gpl3+ license:lgpl3+))))
diff --git a/gnu/packages/wine.scm b/gnu/packages/wine.scm
index 3a5def50b1..d1c27a65a7 100644
--- a/gnu/packages/wine.scm
+++ b/gnu/packages/wine.scm
@@ -318,7 +318,7 @@ integrate Windows applications into your desktop.")
 (define-public wine-staging-patchset-data
   (package
     (name "wine-staging-patchset-data")
-    (version "4.15")
+    (version "4.16")
     (source
      (origin
        (method git-fetch)
@@ -328,7 +328,7 @@ integrate Windows applications into your desktop.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "13g40h2ybcl6vab4zbl1ksqfqyly5hzxssza9dv8r5pmp8x54hgr"))))
+         "0zkvwl6rxr6xcqk4a3h43cak67w6bcyqqnajz6azif07ir3z1c61"))))
     (build-system trivial-build-system)
     (native-inputs
      `(("bash" ,bash)
@@ -374,7 +374,7 @@ integrate Windows applications into your desktop.")
               (file-name (string-append name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0bfh4vd99zwj7f4108zvs80dfvmmnnsap7i6gmf21jgcly3paygq"))))
+                "17qxbddv23ibbayw1ai984m0dlq63cgplms2jhsc09incjhafywd"))))
     (inputs `(("autoconf" ,autoconf) ; for autoreconf
               ("faudio" ,faudio)
               ("ffmpeg" ,ffmpeg)
diff --git a/gnu/packages/wm.scm b/gnu/packages/wm.scm
index a4ae1c2dda..275a766531 100644
--- a/gnu/packages/wm.scm
+++ b/gnu/packages/wm.scm
@@ -21,6 +21,7 @@
 ;;; Copyright © 2019 Rutger Helling <rhelling@mykolab.com>
 ;;; Copyright © 2019 Timothy Sample <samplet@ngyro.com>
 ;;; Copyright © 2019 Gábor Boskovits <boskovits@gmail.com>
+;;; Copyright © 2019 Kyle Andrews <kyle.c.andrews@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -127,6 +128,86 @@
 the leaves of a full binary tree.")
     (license license:bsd-2)))
 
+(define-public herbstluftwm
+  (package
+    (name "herbstluftwm")
+    (version "0.7.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://herbstluftwm.org/tarballs/herbstluftwm-"
+                           version ".tar.gz"))
+       (sha256
+        (base32
+         "1kc18aj9j3nfz6fj4qxg9s3gg4jvn6kzi3ii24hfm0vqdpy17xnz"))
+       (file-name (string-append "herbstluftwm-" version ".tar.gz"))))
+    (build-system gnu-build-system)
+    (inputs
+     `(("dzen"        ,dzen)
+       ("dmenu"       ,dmenu)
+       ("glib"        ,glib)
+       ("glibmm"      ,glibmm)
+       ("xterm"       ,xterm)
+       ("xsetroot"    ,xsetroot)
+       ("libx11"      ,libx11)
+       ("libxext"     ,libxext)
+       ("libxinerama" ,libxinerama)))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (delete 'configure)
+         (delete 'check)
+         (add-after 'install 'install-xsession
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (xsessions (string-append out "/share/xsessions")))
+               (mkdir-p xsessions)
+               (call-with-output-file
+                   (string-append xsessions "/herbstluftwm.desktop")
+                 (lambda (port)
+                   (format port "~
+                     [Desktop Entry]~@
+                     Name=herbstluftwm~@
+                     Comment=Manual tiling window manager~@
+                     Exec=~a/bin/herbstluftwm~@
+                     Type=XSession~%" out)))
+               #t))))
+       #:tests? #f
+       #:make-flags
+       (let ((out (assoc-ref %outputs "out")))
+         (list "CC=gcc"
+               (string-append "PREFIX=''")
+               (string-append "DESTDIR=" out)
+               (string-append "BASHCOMPLETIONDIR=" out
+                              "/etc/bash_completion.d")))))
+    (synopsis "Tiling window manager for X11")
+    (description "herbstluftwm is a manual tiling window manager for X11 using
+Xlib and GLib.  Its main features are:
+
+@itemize
+@item
+The layout is based on splitting frames into subframes which can be split
+again or can be filled with windows (similar to i3 or musca).
+
+@item
+Tags (or workspaces or virtual desktops or …) can be added/removed at runtime.
+Each tag contains an own layout.
+
+@item
+Exactly one tag is viewed on each monitor.  The tags are monitor independent
+(similar to Xmonad).
+
+@item
+It is configured at runtime via IPC calls from @command{herbstclient}.  So the
+configuration file is just a script which is run on startup (similar to wmii
+or musca).
+
+@end itemize")
+    (home-page "https://herbstluftwm.org")
+    (license license:bsd-2)))
+
 (define-public i3status
   (package
     (name "i3status")
@@ -270,42 +351,30 @@ Despite the name it should work with any X11 window manager.")
     (license license:bsd-3)))
 
 (define-public i3blocks
-  (let ((commit "ec050e79ad8489a6f8deb37d4c20ab10729c25c3")
-        (revision "2"))
-    (package
-      (name "i3blocks")
-      (version (string-append "1.4-" revision "."
-                              (string-take commit 7)))
-      (source (origin
-                (method git-fetch)
-                (uri (git-reference
-                      (url "https://github.com/vivien/i3blocks.git")
-                      (commit commit)))
-                (sha256
-                 (base32
-                  "1fx4230lmqa5rpzph68dwnpcjfaaqv5gfkradcr85hd1z8d1qp1b"))
-                (file-name (git-file-name name version))))
-      (build-system gnu-build-system)
-      (arguments
-       `(#:make-flags (list "CC=gcc" (string-append "PREFIX=" %output))
-         #:phases (modify-phases %standard-phases
-                    (add-after 'install 'install-doc
-                      (lambda* (#:key outputs #:allow-other-keys)
-                        (let* ((out (assoc-ref outputs "out"))
-                               (man1 (string-append out "/share/man/man1")))
-                          (install-file "docs/i3blocks.1" man1)
-                          #t))))))
-      (native-inputs
-       `(("autoconf" ,autoconf)
-         ("automake" ,automake)
-         ("pkg-config" ,pkg-config)))
-      (home-page "https://github.com/vivien/i3blocks")
-      (synopsis "Minimalist scheduler for status bar scripts")
-      (description "i3blocks executes your command lines and generates a
+  (package
+    (name "i3blocks")
+    (version "1.5")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/vivien/i3blocks.git")
+                    (commit version)))
+              (sha256
+               (base32
+                "0v8mwnm8qzpv6xnqvrk43s4b9iyld4naqzbaxk4ldq1qkhai0wsv"))
+              (file-name (git-file-name name version))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("autoconf" ,autoconf)
+       ("automake" ,automake)
+       ("pkg-config" ,pkg-config)))
+    (home-page "https://github.com/vivien/i3blocks")
+    (synopsis "Minimalist scheduler for status bar scripts")
+    (description "i3blocks executes your command lines and generates a
 status line from their output.  The generated line is meant to be displayed by
 the i3 window manager through its i3bar component, as an alternative to
 i3status.")
-      (license license:gpl3+))))
+    (license license:gpl3+)))
 
 (define-public perl-anyevent-i3
   (package
diff --git a/gnu/packages/xfce.scm b/gnu/packages/xfce.scm
index 0487c24b68..c71285c7bd 100644
--- a/gnu/packages/xfce.scm
+++ b/gnu/packages/xfce.scm
@@ -9,6 +9,7 @@
 ;;; Copyright © 2017 ng0 <ng0@n0.is>
 ;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2019 Pkill -9 <pkill9@runbox.com>
+;;; Copyright © 2019 L  p R n  d n <guix@lprndn.info>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -283,11 +284,14 @@ merging features essential for loading menus modified with menu editors.")
     (inputs
      `(("dbus" ,dbus)
        ("gdk-pixbuf" ,gdk-pixbuf)
+       ("cairo" ,cairo) ;; Needed for pdf thumbnails (poppler-glibc.pc)
        ("freetype" ,freetype)
        ("libjpeg" ,libjpeg)
        ("libgsf" ,libgsf)
        ("poppler" ,poppler)
-       ("gstreamer" ,gstreamer)))
+       ;; FIXME Provide gstreamer and gstreamer-tag to get video thumbnails
+       ;; ("gstreamer" ,gstreamer)
+       ))
     (home-page "https://www.xfce.org/")
     (synopsis "D-Bus service for applications to request thumbnails")
     (description
@@ -638,7 +642,7 @@ like appearance, display, keyboard and mouse settings.")
 (define-public thunar
   (package
     (name "thunar")
-    (version "1.8.7")
+    (version "1.8.9")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://archive.xfce.org/src/xfce/"
@@ -646,7 +650,7 @@ like appearance, display, keyboard and mouse settings.")
                                   "Thunar-" version ".tar.bz2"))
               (sha256
                (base32
-                "0afkp528mwwa2m18m39mvw53qgaijyynrw9wwwiyxgjiczq3l0ry"))))
+                "1fah2d7v3a7fp28xa5wv896rap1iad9q9y04qchca09mq1x8wxbs"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)
@@ -670,7 +674,7 @@ fast.")
 (define-public thunar-volman
   (package
     (name "thunar-volman")
-    (version "0.9.3")
+    (version "0.9.5")
     (source
      (origin
        (method url-fetch)
@@ -678,7 +682,7 @@ fast.")
                            (version-major+minor version) "/"
                            "thunar-volman-" version ".tar.bz2"))
        (sha256
-        (base32 "1sfmz40164rg77hclrkrgnbk8cb7f325qqi7lz2hh3wbvf8r0c19"))))
+        (base32 "0dqqkbhn43hhmhqyx1fnmawpvysdjzw6ln4ryf629wil6dlwd9vy"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)
@@ -907,7 +911,7 @@ inhibit interface which allows applications to prevent automatic sleep.")
 (define-public ristretto
   (package
     (name "ristretto")
-    (version "0.8.4")
+    (version "0.10.0")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://archive.xfce.org/src/apps/ristretto/"
@@ -915,14 +919,14 @@ inhibit interface which allows applications to prevent automatic sleep.")
                                   "ristretto-" version ".tar.bz2"))
               (sha256
                (base32
-                "18nf01djwnbjc91bdlv3p0h6pwcq1kfnjgp6yaxhxv4kdi9f82rs"))))
+                "0sa75m1w6yvv4xvzrwqiif6vnqgi29hjrixrh87nxss58bbms8hn"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("intltool" ,intltool)
        ("pkg-config" ,pkg-config)))
     (inputs
      `(("desktop-file-utils" ,desktop-file-utils)
-       ("gtk+" ,gtk+-2)
+       ("gtk+" ,gtk+)
        ("libexif" ,libexif)
        ("libxfce4ui" ,libxfce4ui)
        ("librsvg" ,librsvg)
@@ -978,6 +982,14 @@ memory usage graphically, and it can display processes as a tree.")
               (sha256
                (base32
                 "0qlhvnl2m33vfxqlbkic2nmfpwyd4mq230jzhs48cg78392amy9w"))))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'fix-build-with-libical3
+           (lambda* _
+             (substitute* "src/ical-code.c" ;; .is_utc not available in libical3
+               ((".*\\.is_utc.*$") ""))
+             #t)))))
     (build-system gnu-build-system)
     (native-inputs
      `(("intltool" ,intltool)
@@ -1068,7 +1080,7 @@ of data to either CD/DVD/BD.")
 (define-public mousepad
   (package
     (name "mousepad")
-    (version "0.4.1")
+    (version "0.4.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://archive.xfce.org/src/apps/mousepad/"
@@ -1076,11 +1088,10 @@ of data to either CD/DVD/BD.")
                                   version ".tar.bz2"))
               (sha256
                (base32
-                "12si6fvhp68wz4scr339c23jxqq5ywn5nf4w55jld5lxjadkg9rr"))))
+                "1myy7954r1a30dk7inwy7kwki7zvfbnnsc3a8swk72vzrbgjmh44"))))
     (build-system gnu-build-system)
     (arguments
-     '(#:configure-flags '("--enable-gtk3"
-                           ;; Use the GSettings keyfile backend rather than
+     '(#:configure-flags '(;; Use the GSettings keyfile backend rather than
                            ;; DConf.
                            "--enable-keyfile-settings")
        #:phases
@@ -1100,7 +1111,8 @@ of data to either CD/DVD/BD.")
        ("pkg-config" ,pkg-config)))
     (inputs
      `(("gtk+" ,gtk+)
-       ("gtksourceview" ,gtksourceview-3)))
+       ("gtksourceview" ,gtksourceview-3)
+       ("xfconf" ,xfconf)))
     (home-page "https://git.xfce.org/apps/mousepad/")
     (synopsis "Simple text editor for Xfce")
     (description
diff --git a/gnu/services/base.scm b/gnu/services/base.scm
index dcb7278f0f..25716ef152 100644
--- a/gnu/services/base.scm
+++ b/gnu/services/base.scm
@@ -8,6 +8,7 @@
 ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2018 Mathieu Othacehe <m.othacehe@gmail.com>
 ;;; Copyright © 2019 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2019 John Soo <jsoo1@asu.edu>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -41,9 +42,9 @@
   #:use-module (gnu packages admin)
   #:use-module ((gnu packages linux)
                 #:select (alsa-utils crda eudev e2fsprogs fuse gpm kbd lvm2 rng-tools))
-  #:use-module ((gnu packages base)
-                #:select (canonical-package glibc glibc-utf8-locales))
   #:use-module (gnu packages bash)
+  #:use-module ((gnu packages base)
+                #:select (canonical-package coreutils glibc glibc-utf8-locales))
   #:use-module (gnu packages package-management)
   #:use-module ((gnu packages gnupg) #:select (guile-gcrypt))
   #:use-module (gnu packages linux)
@@ -2425,6 +2426,8 @@ to handle."
 
         (service special-files-service-type
                  `(("/bin/sh" ,(file-append (canonical-package bash)
-                                            "/bin/sh"))))))
+                                            "/bin/sh"))
+                   ("/usr/bin/env" ,(file-append (canonical-package coreutils)
+                                                 "/bin/env"))))))
 
 ;;; base.scm ends here
diff --git a/gnu/services/certbot.scm b/gnu/services/certbot.scm
index ae34ad17bb..0d3be03383 100644
--- a/gnu/services/certbot.scm
+++ b/gnu/services/certbot.scm
@@ -99,6 +99,7 @@
                             "--manual"
                             (string-append "--preferred-challenges=" challenge)
                             "--cert-name" name
+                            "--manual-public-ip-logging-ok"
                             "-d" (string-join domains ","))
                       (if rsa-key-size `("--rsa-key-size" ,rsa-key-size) '())
                       (if authentication-hook
diff --git a/gnu/services/networking.scm b/gnu/services/networking.scm
index 376b4ccc4e..c775242f99 100644
--- a/gnu/services/networking.scm
+++ b/gnu/services/networking.scm
@@ -51,6 +51,7 @@
   #:use-module (guix records)
   #:use-module (guix modules)
   #:use-module (guix deprecation)
+  #:use-module (rnrs enums)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-9)
   #:use-module (srfi srfi-26)
@@ -72,13 +73,22 @@
             dhcpd-configuration-pid-file
             dhcpd-configuration-interfaces
 
-            %ntp-servers
-
             ntp-configuration
             ntp-configuration?
+            ntp-configuration-ntp
+            ntp-configuration-servers
+            ntp-allow-large-adjustment?
+
+            %ntp-servers
+            ntp-server
+            ntp-server-type
+            ntp-server-address
+            ntp-server-options
+
             ntp-service
             ntp-service-type
 
+            %openntpd-servers
             openntpd-configuration
             openntpd-configuration?
             openntpd-service-type
@@ -292,30 +302,86 @@ Protocol (DHCP) client, on all the non-loopback network interfaces."
     (list (service-extension shepherd-root-service-type dhcpd-shepherd-service)
           (service-extension activation-service-type dhcpd-activation)))))
 
-(define %ntp-servers
-  ;; Default set of NTP servers. These URLs are managed by the NTP Pool project.
-  ;; Within Guix, Leo Famulari <leo@famulari.name> is the administrative contact
-  ;; for this NTP pool "zone".
-  '("0.guix.pool.ntp.org"
-    "1.guix.pool.ntp.org"
-    "2.guix.pool.ntp.org"
-    "3.guix.pool.ntp.org"))
-
 
 ;;;
 ;;; NTP.
 ;;;
 
-;; TODO: Export.
+(define ntp-server-types (make-enumeration
+                          '(pool
+                            server
+                            peer
+                            broadcast
+                            manycastclient)))
+
+(define-record-type* <ntp-server>
+  ntp-server make-ntp-server
+  ntp-server?
+  ;; The type can be one of the symbols of the NTP-SERVER-TYPE? enumeration.
+  (type ntp-server-type
+        (default 'server))
+  (address ntp-server-address)    ; a string
+  ;; The list of options can contain single option names or tuples in the form
+  ;; '(name value).
+  (options ntp-server-options
+           (default '())))
+
+(define (ntp-server->string ntp-server)
+  ;; Serialize the NTP server object as a string, ready to use in the NTP
+  ;; configuration file.
+  (define (flatten lst)
+    (reverse
+     (let loop ((x lst)
+                (res '()))
+       (if (list? x)
+           (fold loop res x)
+           (cons (format #f "~s" x) res)))))
+
+  (match ntp-server
+    (($ <ntp-server> type address options)
+     ;; XXX: It'd be neater if fields were validated at the syntax level (for
+     ;; static ones at least).  Perhaps the Guix record type could support a
+     ;; predicate property on a field?
+     (unless (enum-set-member? type ntp-server-types)
+       (error "Invalid NTP server type" type))
+     (string-join (cons* (symbol->string type)
+                         address
+                         (flatten options))))))
+
+(define %ntp-servers
+  ;; Default set of NTP servers. These URLs are managed by the NTP Pool project.
+  ;; Within Guix, Leo Famulari <leo@famulari.name> is the administrative contact
+  ;; for this NTP pool "zone".
+  (list
+   (ntp-server
+    (type 'pool)
+    (address "0.guix.pool.ntp.org")
+    (options '("iburst")))))               ;as recommended in the ntpd manual
+
 (define-record-type* <ntp-configuration>
   ntp-configuration make-ntp-configuration
   ntp-configuration?
   (ntp      ntp-configuration-ntp
             (default ntp))
-  (servers  ntp-configuration-servers
+  (servers  %ntp-configuration-servers   ;list of <ntp-server> objects
             (default %ntp-servers))
   (allow-large-adjustment? ntp-allow-large-adjustment?
-                           (default #f)))
+                           (default #t))) ;as recommended in the ntpd manual
+
+(define (ntp-configuration-servers ntp-configuration)
+  ;; A wrapper to support the deprecated form of this field.
+  (let ((ntp-servers (%ntp-configuration-servers ntp-configuration)))
+    (match ntp-servers
+      (((? string?) (? string?) ...)
+       (format (current-error-port) "warning: Defining NTP servers as strings is \
+deprecated.  Please use <ntp-server> records instead.\n")
+       (map (lambda (addr)
+              (ntp-server
+               (type 'server)
+               (address addr)
+               (options '()))) ntp-servers))
+      ((($ <ntp-server>) ($ <ntp-server>) ...)
+       ntp-servers))))
 
 (define ntp-shepherd-service
   (match-lambda
@@ -324,18 +390,21 @@ Protocol (DHCP) client, on all the non-loopback network interfaces."
        ;; TODO: Add authentication support.
        (define config
          (string-append "driftfile /var/run/ntpd/ntp.drift\n"
-                        (string-join (map (cut string-append "server " <>)
-                                          servers)
+                        (string-join (map ntp-server->string servers)
                                      "\n")
                         "
 # Disable status queries as a workaround for CVE-2013-5211:
 # <http://support.ntp.org/bin/view/Main/SecurityNotice#DRDoS_Amplification_Attack_using>.
-restrict default kod nomodify notrap nopeer noquery
-restrict -6 default kod nomodify notrap nopeer noquery
+restrict default kod nomodify notrap nopeer noquery limited
+restrict -6 default kod nomodify notrap nopeer noquery limited
 
 # Yet, allow use of the local 'ntpq'.
 restrict 127.0.0.1
-restrict -6 ::1\n"))
+restrict -6 ::1
+
+# This is required to use servers from a pool directive when using the 'nopeer'
+# option by default, as documented in the 'ntp.conf' manual.
+restrict source notrap nomodify noquery\n"))
 
        (define ntpd.conf
          (plain-file "ntpd.conf" config))
@@ -409,6 +478,9 @@ make an initial adjustment of more than 1,000 seconds."
 ;;; OpenNTPD.
 ;;;
 
+(define %openntpd-servers
+  (map ntp-server-address %ntp-servers))
+
 (define-record-type* <openntpd-configuration>
   openntpd-configuration make-openntpd-configuration
   openntpd-configuration?
@@ -422,9 +494,9 @@ make an initial adjustment of more than 1,000 seconds."
   (sensor                  openntpd-sensor
                            (default '()))
   (server                  openntpd-server
-                           (default %ntp-servers))
-  (servers                 openntpd-servers
                            (default '()))
+  (servers                 openntpd-servers
+                           (default %openntpd-servers))
   (constraint-from         openntpd-constraint-from
                            (default '()))
   (constraints-from        openntpd-constraints-from
@@ -432,45 +504,58 @@ make an initial adjustment of more than 1,000 seconds."
   (allow-large-adjustment? openntpd-allow-large-adjustment?
                            (default #f))) ; upstream default
 
-(define (openntpd-shepherd-service config)
+(define (openntpd-configuration->string config)
+
+  (define (quote-field? name)
+    (member name '("constraints from")))
+
   (match-record config <openntpd-configuration>
-    (openntpd listen-on query-from sensor server servers constraint-from
-              constraints-from allow-large-adjustment?)
-    (let ()
-      (define config
-        (string-join
-          (filter-map
-            (lambda (field value)
-              (string-join
-                (map (cut string-append field <> "\n")
-                     value)))
-            '("listen on " "query from " "sensor " "server " "servers "
-              "constraint from ")
-            (list listen-on query-from sensor server servers constraint-from))
-          ;; The 'constraints from' field needs to be enclosed in double quotes.
-          (string-join
-            (map (cut string-append "constraints from \"" <> "\"\n")
-                 constraints-from))))
-
-      (define ntpd.conf
-        (plain-file "ntpd.conf" config))
-
-      (list (shepherd-service
-              (provision '(ntpd))
-              (documentation "Run the Network Time Protocol (NTP) daemon.")
-              (requirement '(user-processes networking))
-              (start #~(make-forkexec-constructor
-                         (list (string-append #$openntpd "/sbin/ntpd")
-                               "-f" #$ntpd.conf
-                               "-d" ;; don't daemonize
-                               #$@(if allow-large-adjustment?
-                                    '("-s")
-                                    '()))
-                         ;; When ntpd is daemonized it repeatedly tries to respawn
-                         ;; while running, leading shepherd to disable it.  To
-                         ;; prevent spamming stderr, redirect output to logfile.
-                         #:log-file "/var/log/ntpd"))
-              (stop #~(make-kill-destructor)))))))
+    (listen-on query-from sensor server servers constraint-from
+               constraints-from)
+    (string-append
+     (string-join
+      (concatenate
+       (filter-map (lambda (field values)
+                     (match values
+                       (() #f)          ;discard entry with filter-map
+                       ((val ...)       ;validate value type
+                        (map (lambda (value)
+                               (if (quote-field? field)
+                                   (format #f "~a \"~a\"" field value)
+                                   (format #f "~a ~a" field value)))
+                             values))))
+                   ;; The entry names.
+                   '("listen on" "query from" "sensor" "server" "servers"
+                     "constraint from" "constraints from")
+                   ;; The corresponding entry values.
+                   (list listen-on query-from sensor server servers
+                         constraint-from constraints-from)))
+      "\n")
+     "\n")))                              ;add a trailing newline
+
+(define (openntpd-shepherd-service config)
+  (let ((openntpd (openntpd-configuration-openntpd config))
+        (allow-large-adjustment? (openntpd-allow-large-adjustment? config)))
+
+    (define ntpd.conf
+      (plain-file "ntpd.conf" (openntpd-configuration->string config)))
+
+    (list (shepherd-service
+           (provision '(ntpd))
+           (documentation "Run the Network Time Protocol (NTP) daemon.")
+           (requirement '(user-processes networking))
+           (start #~(make-forkexec-constructor
+                     (list (string-append #$openntpd "/sbin/ntpd")
+                           "-f" #$ntpd.conf
+                           "-d" ;; don't daemonize
+                           #$@(if allow-large-adjustment?
+                                  '("-s")
+                                  '()))
+                     ;; When ntpd is daemonized it repeatedly tries to respawn
+                     ;; while running, leading shepherd to disable it.  To
+                     ;; prevent spamming stderr, redirect output to logfile.
+                     #:log-file "/var/log/ntpd"))
+           (stop #~(make-kill-destructor))))))
 
 (define (openntpd-service-activation config)
   "Return the activation gexp for CONFIG."
diff --git a/gnu/services/virtualization.scm b/gnu/services/virtualization.scm
index 705ed84d06..3eecd2c085 100644
--- a/gnu/services/virtualization.scm
+++ b/gnu/services/virtualization.scm
@@ -432,7 +432,10 @@ potential infinite waits blocking libvirt."))
            (provision '(libvirtd))
            (start #~(make-forkexec-constructor
                      (list (string-append #$libvirt "/sbin/libvirtd")
-                           "-f" #$config-file)))
+                           "-f" #$config-file)
+                     #:environment-variables
+                     ;; For finding qemu binaries.
+                     '("PATH=/run/current-system/profile/bin")))
            (stop #~(make-kill-destructor))))))
 
 (define libvirt-service-type
@@ -442,8 +445,10 @@ potential infinite waits blocking libvirt."))
                   (service-extension polkit-service-type
                                      (compose list libvirt-configuration-libvirt))
                   (service-extension profile-service-type
-                                     (compose list
-                                              libvirt-configuration-libvirt))
+                                     (lambda (config)
+                                       (list
+                                        (libvirt-configuration-libvirt config)
+                                        qemu)))
                   (service-extension activation-service-type
                                      %libvirt-activation)
                   (service-extension shepherd-root-service-type
diff --git a/gnu/system/file-systems.scm b/gnu/system/file-systems.scm
index d11b36f25d..6cf6ccc53e 100644
--- a/gnu/system/file-systems.scm
+++ b/gnu/system/file-systems.scm
@@ -508,7 +508,7 @@ a bind mount."
                  ;; symlink to a file in a tmpfs which, for an unknown reason,
                  ;; cannot be bind mounted read-only within the container.
                  (writable? (string=? file "/etc/resolv.conf"))))
-              %network-configuration-files))
+              (cons "/var/run/nscd" %network-configuration-files)))
 
 (define (file-system-type-predicate type)
   "Return a predicate that, when passed a file system, returns #t if that file
diff --git a/gnu/system/linux-container.scm b/gnu/system/linux-container.scm
index 6273cee3d3..c6124cd223 100644
--- a/gnu/system/linux-container.scm
+++ b/gnu/system/linux-container.scm
@@ -30,6 +30,7 @@
   #:use-module (gnu build linux-container)
   #:use-module (gnu services)
   #:use-module (gnu services base)
+  #:use-module (gnu services networking)
   #:use-module (gnu services shepherd)
   #:use-module (gnu system)
   #:use-module (gnu system file-systems)
@@ -109,7 +110,11 @@ containerized OS.  EXTRA-FILE-SYSTEMS is a list of file systems to add to OS."
             ;; Remove nscd service if network is shared with the host.
             (if shared-network?
                 (list nscd-service-type
-                      static-networking-service-type)
+                      static-networking-service-type
+                      dhcp-client-service-type
+                      network-manager-service-type
+                      connman-service-type
+                      wicd-service-type)
                 (list))))
 
   (operating-system
@@ -147,13 +152,6 @@ containerized OS.  EXTRA-FILE-SYSTEMS is a list of file systems to add to OS."
   "Return a derivation of a script that runs OS as a Linux container.
 MAPPINGS is a list of <file-system> objects that specify the files/directories
 that will be shared with the host system."
-  (define nscd-run-directory "/var/run/nscd")
-
-  (define nscd-mapping
-    (file-system-mapping
-     (source nscd-run-directory)
-     (target nscd-run-directory)))
-
   (define (mountable-file-system? file-system)
     ;; Return #t if FILE-SYSTEM should be mounted in the container.
     (and (not (string=? "/" (file-system-mount-point file-system)))
@@ -168,28 +166,42 @@ that will be shared with the host system."
               os (cons %store-mapping mappings)
               #:shared-network? shared-network?
               #:extra-file-systems %container-file-systems))
-         (nscd-os (containerized-operating-system
-                   os (cons* nscd-mapping %store-mapping mappings)
-                   #:shared-network? shared-network?
-                   #:extra-file-systems %container-file-systems))
-         (specs (os-file-system-specs os))
-         (nscd-specs (os-file-system-specs nscd-os)))
+         (specs (os-file-system-specs os)))
 
     (define script
       (with-imported-modules (source-module-closure
                               '((guix build utils)
-                                (gnu build linux-container)))
+                                (gnu build linux-container)
+                                (guix i18n)
+                                (guix diagnostics)))
         #~(begin
             (use-modules (gnu build linux-container)
                          (gnu system file-systems) ;spec->file-system
-                         (guix build utils))
-
-            (call-with-container
-                (map spec->file-system
-                     (if (and #$shared-network?
-                              (file-exists? #$nscd-run-directory))
-                         '#$nscd-specs
-                         '#$specs))
+                         (guix build utils)
+                         (guix i18n)
+                         (guix diagnostics)
+                         (srfi srfi-1))
+
+            (define file-systems
+              (filter-map (lambda (spec)
+                            (let* ((fs    (spec->file-system spec))
+                                   (flags (file-system-flags fs)))
+                              (and (or (not (memq 'bind-mount flags))
+                                       (file-exists? (file-system-device fs)))
+                                   fs)))
+                          '#$specs))
+
+            (define (explain pid)
+              ;; XXX: We can't quite call 'bindtextdomain' so there's actually
+              ;; no i18n.
+              (info (G_ "system container is running as PID ~a~%") pid)
+              ;; XXX: Should we recommend 'guix container exec'?  It's more
+              ;; verbose and doesn't bring much.
+              (info (G_ "Run 'sudo nsenter -a -t ~a' to get a shell into it.~%")
+                    pid)
+              (newline (guix-warning-port)))
+
+            (call-with-container file-systems
               (lambda ()
                 (setenv "HOME" "/root")
                 (setenv "TMPDIR" "/tmp")
@@ -203,7 +215,8 @@ that will be shared with the host system."
               #:host-uids 65536
               #:namespaces (if #$shared-network?
                                (delq 'net %namespaces)
-                               %namespaces)))))
+                               %namespaces)
+              #:process-spawned-hook explain))))
 
     (gexp->script "run-container" script)))
 
diff --git a/guix/build/cargo-build-system.scm b/guix/build/cargo-build-system.scm
index f173b64c83..4be5443083 100644
--- a/guix/build/cargo-build-system.scm
+++ b/guix/build/cargo-build-system.scm
@@ -99,7 +99,7 @@ Cargo.toml file present at its root."
   (for-each
     (match-lambda
       ((name . path)
-       (let* ((basepath (basename path))
+       (let* ((basepath (strip-store-file-name path))
               (crate-dir (string-append vendor-dir "/" basepath)))
          (and (crate-src? path)
               ;; Gracefully handle duplicate inputs
@@ -168,9 +168,6 @@ directory = '" port)
       (apply invoke `("cargo" "test" ,@cargo-test-flags))
       #t))
 
-(define (touch file-name)
-  (call-with-output-file file-name (const #t)))
-
 (define* (install #:key inputs outputs skip-build? #:allow-other-keys)
   "Install a given Cargo package."
   (let* ((out (assoc-ref outputs "out")))
diff --git a/guix/docker.scm b/guix/docker.scm
index 757bdeb458..97ac6d982b 100644
--- a/guix/docker.scm
+++ b/guix/docker.scm
@@ -57,22 +57,36 @@
     (created . ,time)
     (container_config . #nil)))
 
-(define (generate-tag path)
-  "Generate an image tag for the given PATH."
-  (match (string-split (basename path) #\-)
-    ((hash name . rest) (string-append name ":" hash))))
+(define (canonicalize-repository-name name)
+  "\"Repository\" names are restricted to roughtl [a-z0-9_.-].
+Return a version of TAG that follows these rules."
+  (define ascii-letters
+    (string->char-set "abcdefghijklmnopqrstuvwxyz"))
 
-(define (manifest path id)
+  (define separators
+    (string->char-set "_-."))
+
+  (define repo-char-set
+    (char-set-union char-set:digit ascii-letters separators))
+
+  (string-map (lambda (chr)
+                (if (char-set-contains? repo-char-set chr)
+                    chr
+                    #\.))
+              (string-trim (string-downcase name) separators)))
+
+(define* (manifest path id #:optional (tag "guix"))
   "Generate a simple image manifest."
-  `#(((Config . "config.json")
-      (RepoTags . #(,(generate-tag path)))
-      (Layers . #(,(string-append id "/layer.tar"))))))
+  (let ((tag (canonicalize-repository-name tag)))
+    `#(((Config . "config.json")
+        (RepoTags . #(,(string-append tag ":latest")))
+        (Layers . #(,(string-append id "/layer.tar")))))))
 
 ;; According to the specifications this is required for backwards
 ;; compatibility.  It duplicates information provided by the manifest.
-(define (repositories path id)
+(define* (repositories path id #:optional (tag "guix"))
   "Generate a repositories file referencing PATH and the image ID."
-  `((,(generate-tag path) . ((latest . ,id)))))
+  `((,(canonicalize-repository-name tag) . ((latest . ,id)))))
 
 ;; See https://github.com/opencontainers/image-spec/blob/master/config.md
 (define* (config layer time arch #:key entry-point (environment '()))
@@ -112,6 +126,7 @@
 
 (define* (build-docker-image image paths prefix
                              #:key
+                             (repository "guix")
                              (extra-files '())
                              (transformations '())
                              (system (utsname:machine (uname)))
@@ -121,7 +136,9 @@
                              compressor
                              (creation-time (current-time time-utc)))
   "Write to IMAGE a Docker image archive containing the given PATHS.  PREFIX
-must be a store path that is a prefix of any store paths in PATHS.
+must be a store path that is a prefix of any store paths in PATHS.  REPOSITORY
+is a descriptive name that will show up in \"REPOSITORY\" column of the output
+of \"docker images\".
 
 When DATABASE is true, copy it to /var/guix/db in the image and create
 /var/guix/gcroots and friends.
@@ -243,10 +260,10 @@ SRFI-19 time-utc object, as the creation time in metadata."
                              #:entry-point entry-point))))
       (with-output-to-file "manifest.json"
         (lambda ()
-          (scm->json (manifest prefix id))))
+          (scm->json (manifest prefix id repository))))
       (with-output-to-file "repositories"
         (lambda ()
-          (scm->json (repositories prefix id)))))
+          (scm->json (repositories prefix id repository)))))
 
     (apply invoke "tar" "-cf" image "-C" directory
            `(,@%tar-determinism-options
diff --git a/guix/gnu-maintenance.scm b/guix/gnu-maintenance.scm
index d63d44f629..ef067704ad 100644
--- a/guix/gnu-maintenance.scm
+++ b/guix/gnu-maintenance.scm
@@ -62,7 +62,6 @@
 
             %gnu-updater
             %gnu-ftp-updater
-            %kde-updater
             %xorg-updater
             %kernel.org-updater))
 
@@ -230,12 +229,6 @@ network to check in GNU's database."
             (or (assoc-ref (package-properties package) 'ftp-directory)
                 (string-append "/gnu/" name)))))
 
-(define (sans-extension tarball)
-  "Return TARBALL without its .tar.* or .zip extension."
-  (let ((end (or (string-contains tarball ".tar")
-                 (string-contains tarball ".zip"))))
-    (substring tarball 0 end)))
-
 (define %tarball-rx
   ;; The .zip extensions is notably used for freefont-ttf.
   ;; The "-src" pattern is for "TeXmacs-1.0.7.9-src.tar.gz".
@@ -261,14 +254,15 @@ true."
                                           (string-append project
                                                          "-src")))))))
        (not (regexp-exec %alpha-tarball-rx file))
-       (let ((s (sans-extension file)))
+       (let ((s (tarball-sans-extension file)))
          (regexp-exec %package-name-rx s))))
 
 (define (tarball->version tarball)
   "Return the version TARBALL corresponds to.  TARBALL is a file name like
 \"coreutils-8.23.tar.xz\"."
   (let-values (((name version)
-                (gnu-package-name->name+version (sans-extension tarball))))
+                (gnu-package-name->name+version
+                 (tarball-sans-extension tarball))))
     version))
 
 (define* (releases project
@@ -492,8 +486,9 @@ return the corresponding signature URL, or #f it signatures are unavailable."
       (and (string=? url (basename url))          ;relative reference?
            (release-file? package url)
            (let-values (((name version)
-                         (package-name->name+version (sans-extension url)
-                                                     #\-)))
+                         (package-name->name+version
+                          (tarball-sans-extension url)
+                          #\-)))
              (upstream-source
               (package name)
               (version version)
@@ -565,14 +560,16 @@ list available from %GNU-FILE-LIST-URI over HTTP(S)."
                                     (release-file? name (basename file))))
                              files)))
       (match (sort relevant (lambda (file1 file2)
-                              (version>? (sans-extension (basename file1))
-                                         (sans-extension (basename file2)))))
+                              (version>? (tarball-sans-extension
+                                          (basename file1))
+                                         (tarball-sans-extension
+                                          (basename file2)))))
         ((and tarballs (reference _ ...))
          (let* ((version  (tarball->version reference))
                 (tarballs (filter (lambda (file)
-                                    (string=? (sans-extension
+                                    (string=? (tarball-sans-extension
                                                (basename file))
-                                              (sans-extension
+                                              (tarball-sans-extension
                                                (basename reference))))
                                   tarballs)))
            (upstream-source
@@ -615,16 +612,6 @@ releases are on gnu.org."
 (define gnu-hosted?
   (url-prefix-predicate "mirror://gnu/"))
 
-(define (latest-kde-release package)
-  "Return the latest release of PACKAGE, the name of an KDE.org package."
-  (let ((uri (string->uri (origin-uri (package-source package)))))
-    (false-if-ftp-error
-     (latest-ftp-release
-      (package-upstream-name package)
-      #:server "ftp.mirrorservice.org"
-      #:directory (string-append "/sites/ftp.kde.org/pub/kde/"
-                                 (dirname (dirname (uri-path uri))))))))
-
 (define (latest-xorg-release package)
   "Return the latest release of PACKAGE, the name of an X.org package."
   (let ((uri (string->uri (origin-uri (package-source package)))))
@@ -672,13 +659,6 @@ releases are on gnu.org."
                 (pure-gnu-package? package))))
    (latest latest-release*)))
 
-(define %kde-updater
-  (upstream-updater
-    (name 'kde)
-    (description "Updater for KDE packages")
-    (pred (url-prefix-predicate "mirror://kde/"))
-    (latest latest-kde-release)))
-
 (define %xorg-updater
   (upstream-updater
    (name 'xorg)
diff --git a/guix/import/cran.scm b/guix/import/cran.scm
index 35caa3e463..e47aff2b12 100644
--- a/guix/import/cran.scm
+++ b/guix/import/cran.scm
@@ -49,6 +49,7 @@
             cran-recursive-import
             %cran-updater
             %bioconductor-updater
+            %bioconductor-version
 
             cran-package?
             bioconductor-package?
diff --git a/guix/import/crate.scm b/guix/import/crate.scm
index f6057dbf8b..fd1974eae8 100644
--- a/guix/import/crate.scm
+++ b/guix/import/crate.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2016 David Craven <david@craven.ch>
 ;;; Copyright © 2019 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2019 Martin Becze <mjbecze@riseup.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -181,9 +182,11 @@ and LICENSE."
   ;; This regexp matches that.
   (make-regexp "^(.*) OR (.*)$"))
 
-(define (crate->guix-package crate-name)
+(define* (crate->guix-package crate-name #:optional version)
   "Fetch the metadata for CRATE-NAME from crates.io, and return the
-`package' s-expression corresponding to that package, or #f on failure."
+`package' s-expression corresponding to that package, or #f on failure.
+When VERSION is specified, attempt to fetch that version; otherwise fetch the
+latest version of CRATE-NAME."
   (define (string->license string)
     (match (regexp-exec %dual-license-rx string)
       (#f (list (spdx-string->license string)))
@@ -196,12 +199,18 @@ and LICENSE."
   (define crate
     (lookup-crate crate-name))
 
-  (and crate
-       (let* ((version        (find (lambda (version)
-                                      (string=? (crate-version-number version)
-                                                (crate-latest-version crate)))
-                                    (crate-versions crate)))
-              (dependencies   (crate-version-dependencies version))
+  (define version-number
+    (or version
+        (crate-latest-version crate)))
+
+  (define version*
+    (find (lambda (version)
+            (string=? (crate-version-number version)
+                      version-number))
+          (crate-versions crate)))
+
+  (and crate version*
+       (let* ((dependencies   (crate-version-dependencies version*))
               (dep-crates     (filter normal-dependency? dependencies))
               (dev-dep-crates (remove normal-dependency? dependencies))
               (cargo-inputs   (sort (map crate-dependency-id dep-crates)
@@ -210,14 +219,14 @@ and LICENSE."
                (sort (map crate-dependency-id dev-dep-crates)
                      string-ci<?)))
          (make-crate-sexp #:name crate-name
-                          #:version (crate-version-number version)
+                          #:version (crate-version-number version*)
                           #:cargo-inputs cargo-inputs
                           #:cargo-development-inputs cargo-development-inputs
                           #:home-page (or (crate-home-page crate)
                                           (crate-repository crate))
                           #:synopsis (crate-description crate)
                           #:description (crate-description crate)
-                          #:license (and=> (crate-version-license version)
+                          #:license (and=> (crate-version-license version*)
                                            string->license)))))
 
 (define (guix-package->crate-name package)
diff --git a/guix/import/github.scm b/guix/import/github.scm
index 55e1f72a42..55ea00a111 100644
--- a/guix/import/github.scm
+++ b/guix/import/github.scm
@@ -161,7 +161,7 @@ empty list."
         url))
 
   (match (json-fetch (decorate release-url) #:headers headers)
-    (()
+    (#()
      ;; We got the empty list, presumably because the user didn't use GitHub's
      ;; "release" mechanism, but hopefully they did use Git tags.
      (json-fetch (decorate tag-url) #:headers headers))
diff --git a/guix/import/kde.scm b/guix/import/kde.scm
new file mode 100644
index 0000000000..6873418d62
--- /dev/null
+++ b/guix/import/kde.scm
@@ -0,0 +1,190 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016 David Craven <david@craven.ch>
+;;; Copyright © 2016, 2017 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2019 Hartmut Goebel <h.goebel@crazy-compilers.com>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (guix import kde)
+  #:use-module (guix http-client)
+  #:use-module (guix memoization)
+  #:use-module (guix gnu-maintenance)
+  #:use-module (guix packages)
+  #:use-module (guix upstream)
+  #:use-module (guix utils)
+  #:use-module (ice-9 match)
+  #:use-module (ice-9 rdelim)
+  #:use-module (ice-9 regex)
+  #:use-module (srfi srfi-11)
+  #:use-module (web uri)
+
+  #:export (%kde-updater))
+
+;;; Commentary:
+;;;
+;;; This package provides not an actual importer but simply an updater for
+;;; KDE packages.  It grabs available files from the 'ls-lR.bz2' file
+;;; available on download.kde.org.
+;;;
+;;; Code:
+
+(define (tarball->version tarball)
+  "Return the version TARBALL corresponds to.  TARBALL is a file name like
+\"coreutils-8.23.tar.xz\"."
+  (let-values (((name version)
+                (gnu-package-name->name+version
+                 (tarball-sans-extension tarball))))
+    version))
+
+(define %kde-file-list-uri
+  ;; URI of the file list (ls -lR format) for download.kde.org.
+  (string->uri "https://download.kde.org/ls-lR.bz2"))
+
+(define (download.kde.org-files)
+  ;;"Return the list of files available at download.kde.org."
+
+    (define (ls-lR-line->filename path line)
+      ;; Remove mode, blocks, user, group, size, date, time and one space,
+      ;; then prepend PATH
+      (regexp-substitute
+       #f (string-match "^(\\S+\\s+){6}\\S+\\s" line) path 'post))
+
+    (define (canonicalize path)
+      (let* ((path (if (string-prefix? "/srv/archives/ftp/" path)
+                       (string-drop path (string-length "/srv/archives/ftp"))
+                       path))
+             (path (if (string-suffix? ":" path)
+                       (string-drop-right path 1)
+                       path))
+             (path (if (not (string-suffix? "/" path))
+                       (string-append path "/")
+                       path)))
+        path))
+
+    (define (write-cache input cache)
+      "Read bzipped ls-lR from INPUT, and write it as a list of file paths to
+CACHE."
+      (call-with-decompressed-port 'bzip2 input
+        (lambda (input)
+          (let loop_dirs ((files '()))
+            ;; process a new directory block
+            (let ((path (read-line input)))
+              (if
+               (or (eof-object? path) (string= path ""))
+               (write (reverse files) cache)
+               (let loop_entries ((path (canonicalize path))
+                                  (files files))
+                 ;; process entries within the directory block
+                 (let ((line (read-line input)))
+                   (cond
+                    ((eof-object? line)
+                     (write (reverse files) cache))
+                    ((string-prefix? "-" line)
+                     ;; this is a file entry: prepend to FILES, then re-enter
+                     ;; the loop for remaining entries
+                     (loop_entries path
+                                   (cons (ls-lR-line->filename path line) files)
+                                   ))
+                    ((not (string= line ""))
+                     ;; this is a non-file entry: ignore it, just re-enter the
+                     ;; loop for remaining entries
+                     (loop_entries path files))
+                    ;; empty line: directory block end, re-enter the outer
+                    ;; loop for the next block
+                    (#t (loop_dirs files)))))))))))
+
+  (define (cache-miss uri)
+    (format (current-error-port) "fetching ~a...~%" (uri->string uri)))
+
+  (let* ((port (http-fetch/cached %kde-file-list-uri
+                                  #:ttl 3600
+                                  #:write-cache write-cache
+                                  #:cache-miss cache-miss))
+         (files (read port)))
+    (close-port port)
+    files))
+
+(define (uri->kde-path-pattern uri)
+  "Build a regexp from the package's URI suitable for matching the package
+path version-agnostic.
+
+Example:
+Input:
+   mirror://kde//stable/frameworks/5.55/portingAids/kross-5.55.0.zip
+Output:
+   //stable/frameworks/[^/]+/portingAids/
+"
+
+  (define version-regexp
+    ;; regexp for matching versions as used in the ld-lR file
+    (make-regexp
+     (string-join '("^([0-9]+\\.)+[0-9]+-?"   ;; 5.12.90, 4.2.0-preview
+                    "^[0-9]+$"                ;; 20031002
+                    ".*-([0-9]+\\.)+[0-9]+$") ;; kdepim-4.6.1
+                    "|")))
+
+  (define (version->pattern part)
+    ;; If a path element might be a version, replace it by a catch-all part
+    (if (regexp-exec version-regexp part)
+        "[^/]+"
+        part))
+
+  (let* ((path (uri-path uri))
+         (directory-parts (string-split (dirname path) #\/)))
+    (make-regexp
+     (string-append
+      (string-join (map version->pattern directory-parts) "/")
+      "/"))))
+
+(define (latest-kde-release package)
+  "Return the latest release of PACKAGE, a KDE package, or #f if it could
+not be determined."
+  (let* ((uri      (string->uri (origin-uri (package-source package))))
+         (path-rx  (uri->kde-path-pattern uri))
+         (name     (package-upstream-name package))
+         (files    (download.kde.org-files))
+         (relevant (filter (lambda (file)
+                             (and (regexp-exec path-rx file)
+                                  (release-file? name (basename file))))
+                           files)))
+    (match (sort relevant (lambda (file1 file2)
+                            (version>? (tarball-sans-extension
+                                        (basename file1))
+                                       (tarball-sans-extension
+                                        (basename file2)))))
+           ((and tarballs (reference _ ...))
+            (let* ((version  (tarball->version reference))
+                   (tarballs (filter (lambda (file)
+                                       (string=? (tarball-sans-extension
+                                                  (basename file))
+                                                 (tarball-sans-extension
+                                                  (basename reference))))
+                                     tarballs)))
+              (upstream-source
+               (package name)
+               (version version)
+               (urls (map (lambda (file)
+                            (string-append "mirror://kde/" file))
+                          tarballs)))))
+           (()
+            #f))))
+
+(define %kde-updater
+  (upstream-updater
+    (name 'kde)
+    (description "Updater for KDE packages")
+    (pred (url-prefix-predicate "mirror://kde/"))
+    (latest latest-kde-release)))
diff --git a/guix/import/utils.scm b/guix/import/utils.scm
index 252875eeab..4694b6e7ef 100644
--- a/guix/import/utils.scm
+++ b/guix/import/utils.scm
@@ -212,10 +212,19 @@ with dashes."
 (define (beautify-description description)
   "Improve the package DESCRIPTION by turning a beginning sentence fragment
 into a proper sentence and by using two spaces between sentences."
-  (let ((cleaned (if (string-prefix? "A " description)
-                     (string-append "This package provides a"
-                                    (substring description 1))
-                     description)))
+  (let ((cleaned (cond
+                  ((string-prefix? "A " description)
+                   (string-append "This package provides a"
+                                  (substring description 1)))
+                  ((string-prefix? "Provides " description)
+                   (string-append "This package provides"
+                                  (substring description
+                                             (string-length "Provides"))))
+                  ((string-prefix? "Functions " description)
+                   (string-append "This package provides functions"
+                                  (substring description
+                                             (string-length "Functions"))))
+                  (else description))))
     ;; Use double spacing between sentences
     (regexp-substitute/global #f "\\. \\b"
                               cleaned 'pre ".  " 'post)))
diff --git a/guix/packages.scm b/guix/packages.scm
index 39ab28d807..f2c94c7bc2 100644
--- a/guix/packages.scm
+++ b/guix/packages.scm
@@ -352,7 +352,7 @@ object."
 
   (match (package-location package)
     (($ <location> file line column)
-     (catch 'system
+     (catch 'system-error
        (lambda ()
          ;; In general we want to keep relative file names for modules.
          (with-fluids ((%file-port-name-canonicalization 'relative))
diff --git a/guix/scripts/environment.scm b/guix/scripts/environment.scm
index f7f7edda48..cfe0a37c42 100644
--- a/guix/scripts/environment.scm
+++ b/guix/scripts/environment.scm
@@ -463,6 +463,10 @@ host file systems to mount inside the container.  If USER is not #f, each
 target of USER-MAPPINGS will be re-written relative to '/home/USER', and USER
 will be used for the passwd entry.  LINK-PROFILE? creates a symbolic link from
 ~/.guix-profile to the environment profile."
+  (define (optional-mapping->fs mapping)
+    (and (file-exists? (file-system-mapping-source mapping))
+         (file-system-mapping->bind-mount mapping)))
+
   (mlet %store-monad ((reqs (inputs->requisites
                              (list (direct-store-path bash) profile))))
     (return
@@ -499,11 +503,6 @@ will be used for the passwd entry.  LINK-PROFILE? creates a symbolic link from
                                   (target cwd)
                                   (writable? #t)))
                            '())))
-              ;; When in Rome, do as Nix build.cc does: Automagically
-              ;; map common network configuration files.
-              (if network?
-                  %network-file-mappings
-                  '())
               ;; Mappings for the union closure of all inputs.
               (map (lambda (dir)
                      (file-system-mapping
@@ -512,6 +511,10 @@ will be used for the passwd entry.  LINK-PROFILE? creates a symbolic link from
                       (writable? #f)))
                    reqs)))
             (file-systems (append %container-file-systems
+                                  (if network?
+                                      (filter-map optional-mapping->fs
+                                                  %network-file-mappings)
+                                      '())
                                   (map file-system-mapping->bind-mount
                                        mappings))))
        (exit/status
diff --git a/guix/scripts/gc.scm b/guix/scripts/gc.scm
index 31657326b6..3f20a2e192 100644
--- a/guix/scripts/gc.scm
+++ b/guix/scripts/gc.scm
@@ -57,6 +57,8 @@ Invoke the garbage collector.\n"))
   (display (G_ "
       --list-roots       list the user's garbage collector roots"))
   (display (G_ "
+      --list-busy        list store items used by running processes"))
+  (display (G_ "
       --optimize         optimize the store by deduplicating identical files"))
   (display (G_ "
       --list-dead        list dead paths"))
@@ -174,6 +176,10 @@ is deprecated; use '-D'~%"))
                 (lambda (opt name arg result)
                   (alist-cons 'action 'list-roots
                               (alist-delete 'action result))))
+        (option '("list-busy") #f #f
+                (lambda (opt name arg result)
+                  (alist-cons 'action 'list-busy
+                              (alist-delete 'action result))))
         (option '("list-dead") #f #f
                 (lambda (opt name arg result)
                   (alist-cons 'action 'list-dead
@@ -265,6 +271,12 @@ is deprecated; use '-D'~%"))
                   (newline))
                 roots)))
 
+  (define (list-busy)
+    ;; List store items used by running processes.
+    (for-each (lambda (item)
+                (display item) (newline))
+              (busy-store-items)))
+
   (with-error-handling
     (let* ((opts  (parse-options))
            (store (open-connection))
@@ -305,6 +317,9 @@ is deprecated; use '-D'~%"))
         ((list-roots)
          (assert-no-extra-arguments)
          (list-roots))
+        ((list-busy)
+         (assert-no-extra-arguments)
+         (list-busy))
         ((delete)
          (delete-paths store (map direct-store-path paths)))
         ((list-references)
diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm
index cab9a4397b..7ae8638911 100644
--- a/guix/scripts/import/crate.scm
+++ b/guix/scripts/import/crate.scm
@@ -2,6 +2,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014 David Thompson <davet@gnu.org>
 ;;; Copyright © 2016 David Craven <david@craven.ch>
+;;; Copyright © 2019 Martin Becze <mjbecze@riseup.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -75,6 +76,7 @@ Import and convert the crate.io package for PACKAGE-NAME.\n"))
                   (alist-cons 'argument arg result))
                 %default-options))
 
+
   (let* ((opts (parse-options))
          (args (filter-map (match-lambda
                             (('argument . value)
@@ -82,11 +84,16 @@ Import and convert the crate.io package for PACKAGE-NAME.\n"))
                             (_ #f))
                            (reverse opts))))
     (match args
-      ((package-name)
-       (let ((sexp (crate->guix-package package-name)))
+      ((spec)
+       (define-values (name version)
+         (package-name->name+version spec))
+
+       (let ((sexp (crate->guix-package name version)))
          (unless sexp
            (leave (G_ "failed to download meta-data for package '~a'~%")
-                  package-name))
+                  (if version
+                      (string-append name "@" version)
+                      name)))
          sexp))
       (()
        (leave (G_ "too few arguments~%")))
diff --git a/guix/scripts/pack.scm b/guix/scripts/pack.scm
index de5b3fc0ff..920d6c01fe 100644
--- a/guix/scripts/pack.scm
+++ b/guix/scripts/pack.scm
@@ -516,6 +516,18 @@ the image."
               `((directory "/tmp" ,(getuid) ,(getgid) #o1777)
                 ,@(append-map symlink->directives '#$symlinks)))
 
+            (define tag
+              ;; Compute a meaningful "repository" name, which will show up in
+              ;; the output of "docker images".
+              (let ((manifest (profile-manifest #$profile)))
+                (let loop ((names (map manifest-entry-name
+                                       (manifest-entries manifest))))
+                  (define str (string-join names "-"))
+                  (if (< (string-length str) 40)
+                      str
+                      (match names
+                        ((_) str)
+                        ((names ... _) (loop names))))))) ;drop one entry
 
             (setenv "PATH" (string-append #$archiver "/bin"))
 
@@ -524,6 +536,7 @@ the image."
                                      (call-with-input-file "profile"
                                        read-reference-graph))
                                 #$profile
+                                #:repository tag
                                 #:database #+database
                                 #:system (or #$target (utsname:machine (uname)))
                                 #:environment environment
@@ -944,7 +957,8 @@ Create a bundle of PACKAGE.\n"))
                                   (list (transform store package) output))
                                  ((? package? package)
                                   (list (transform store package) "out")))
-                               (filter-map maybe-package-argument opts)))
+                               (reverse
+                                (filter-map maybe-package-argument opts))))
            (manifest-file (assoc-ref opts 'manifest)))
       (define properties
         (if (assoc-ref opts 'save-provenance?)
diff --git a/guix/scripts/refresh.scm b/guix/scripts/refresh.scm
index 4591d0f308..daf6fcf947 100644
--- a/guix/scripts/refresh.scm
+++ b/guix/scripts/refresh.scm
@@ -368,8 +368,16 @@ the latest known version of ~a (~a)~%")
                      (upstream-source-version source)))))))
     (#f
      (when warn?
-       (warn-no-updater package)))))
-
+       ;; Distinguish between "no updater" and "failing updater."
+       (match (lookup-updater package updaters)
+         ((? upstream-updater? updater)
+          (warning (package-location package)
+                   (G_ "'~a' updater failed to determine available \
+releases for ~a~%")
+                   (upstream-updater-name updater)
+                   (package-name package)))
+         (#f
+          (warn-no-updater package)))))))
 
 
 ;;;
diff --git a/guix/store/roots.scm b/guix/store/roots.scm
index 4f23ae34e8..58653507f8 100644
--- a/guix/store/roots.scm
+++ b/guix/store/roots.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2019 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2017, 2019 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -26,9 +26,13 @@
   #:use-module (srfi srfi-26)
   #:use-module (ice-9 match)
   #:use-module (ice-9 regex)
+  #:use-module (ice-9 rdelim)
+  #:use-module (ice-9 ftw)
+  #:use-module (rnrs io ports)
   #:re-export (%gc-roots-directory)
   #:export (gc-roots
-            user-owned?))
+            user-owned?
+            busy-store-items))
 
 ;;; Commentary:
 ;;;
@@ -118,3 +122,124 @@ are user-controlled symlinks stored anywhere on the file system."
 
       (= (stat:uid stat) uid))
     (const #f)))
+
+
+;;;
+;;; Listing "busy" store items: those referenced by currently running
+;;; processes.
+;;;
+
+(define %proc-directory
+  ;; Mount point of Linuxish /proc file system.
+  "/proc")
+
+(define (proc-file-roots dir file)
+  "Return a one-element list containing the file pointed to by DIR/FILE,
+or the empty list."
+  (or (and=> (false-if-exception (readlink (string-append dir "/" file)))
+             list)
+      '()))
+
+(define proc-exe-roots (cut proc-file-roots <> "exe"))
+(define proc-cwd-roots (cut proc-file-roots <> "cwd"))
+
+(define (proc-fd-roots dir)
+  "Return the list of store files referenced by DIR, which is a
+/proc/XYZ directory."
+  (let ((dir (string-append dir "/fd")))
+    (filter-map (lambda (file)
+                  (let ((target (false-if-exception
+                                 (readlink (string-append dir "/" file)))))
+                    (and target
+                         (string-prefix? "/" target)
+                         target)))
+                (or (scandir dir string->number) '()))))
+
+(define (proc-maps-roots dir)
+  "Return the list of store files referenced by DIR, which is a
+/proc/XYZ directory."
+  (define %file-mapping-line
+    (make-regexp "^.*[[:blank:]]+/([^ ]+)$"))
+
+  (call-with-input-file (string-append dir "/maps")
+    (lambda (maps)
+      (let loop ((line  (read-line maps))
+                 (roots '()))
+        (cond ((eof-object? line)
+               roots)
+              ((regexp-exec %file-mapping-line line)
+               =>
+               (lambda (match)
+                 (let ((file (string-append "/"
+                                            (match:substring match 1))))
+                   (loop (read-line maps)
+                         (cons file roots)))))
+              (else
+               (loop (read-line maps) roots)))))))
+
+(define (proc-environ-roots dir)
+  "Return the list of store files referenced by DIR/environ, where DIR is a
+/proc/XYZ directory."
+  (define split-on-nul
+    (cute string-tokenize <>
+          (char-set-complement (char-set #\nul))))
+
+  (define (rhs-file-names str)
+    (let ((equal (string-index str #\=)))
+      (if equal
+          (let* ((str (substring str (+ 1 equal)))
+                 (rx  (string-append (regexp-quote %store-directory)
+                                     "/[0-9a-z]{32}-[a-zA-Z0-9\\._+-]+")))
+            (map match:substring (list-matches rx str)))
+          '())))
+
+  (define environ
+    (string-append dir "/environ"))
+
+  (append-map rhs-file-names
+              (split-on-nul
+               (call-with-input-file environ
+                 get-string-all))))
+
+(define (referenced-files)
+  "Return the list of referenced store items."
+  (append-map (lambda (pid)
+                (let ((proc (string-append %proc-directory "/" pid)))
+                  (catch 'system-error
+                    (lambda ()
+                      (append (proc-exe-roots proc)
+                              (proc-cwd-roots proc)
+                              (proc-fd-roots proc)
+                              (proc-maps-roots proc)
+                              (proc-environ-roots proc)))
+                    (lambda args
+                      (let ((err (system-error-errno args)))
+                        (if (or (= ENOENT err)    ;TOCTTOU race
+                                (= ESRCH err)     ;ditto
+                                (= EACCES err))   ;not running as root
+                            '()
+                            (apply throw args)))))))
+              (scandir %proc-directory string->number
+                       (lambda (a b)
+                         (< (string->number a) (string->number b))))))
+
+(define canonicalize-store-item
+  (let* ((store  (string-append %store-directory "/"))
+         (prefix (string-length store)))
+    (lambda (file)
+      "Return #f if FILE is not a store item; otherwise, return the store file
+name without any sub-directory components."
+      (and (string-prefix? store file)
+           (string-append store
+                          (let ((base (string-drop file prefix)))
+                            (match (string-index base #\/)
+                              (#f    base)
+                              (slash (string-take base slash)))))))))
+
+(define (busy-store-items)
+  "Return the list of store items used by the currently running processes.
+
+This code should typically run as root; it allows the garbage collector to
+determine which store items must not be deleted."
+  (delete-duplicates
+   (filter-map canonicalize-store-item (referenced-files))))
diff --git a/guix/upstream.scm b/guix/upstream.scm
index d4f9c5bb45..aa47dab4b4 100644
--- a/guix/upstream.scm
+++ b/guix/upstream.scm
@@ -245,18 +245,18 @@ correspond to the same version."
 (define (lookup-updater package updaters)
   "Return an updater among UPDATERS that matches PACKAGE, or #f if none of
 them matches."
-  (any (match-lambda
-         (($ <upstream-updater> name description pred latest)
-          (and (pred package) latest)))
-       updaters))
+  (find (match-lambda
+          (($ <upstream-updater> name description pred latest)
+           (pred package)))
+        updaters))
 
 (define (package-latest-release package updaters)
   "Return an upstream source to update PACKAGE, a <package> object, or #f if
 none of UPDATERS matches PACKAGE.  It is the caller's responsibility to ensure
 that the returned source is newer than the current one."
   (match (lookup-updater package updaters)
-    ((? procedure? latest-release)
-     (latest-release package))
+    ((? upstream-updater? updater)
+     ((upstream-updater-latest updater) package))
     (_ #f)))
 
 (define (package-latest-release* package updaters)
diff --git a/guix/utils.scm b/guix/utils.scm
index f480c3291f..1f99c5b3f5 100644
--- a/guix/utils.scm
+++ b/guix/utils.scm
@@ -91,6 +91,7 @@
             arguments-from-environment-variable
             file-extension
             file-sans-extension
+            tarball-sans-extension
             compressed-file?
             switch-symlinks
             call-with-temporary-output-file
@@ -578,6 +579,12 @@ minor version numbers from version-string."
         (substring file 0 dot)
         file)))
 
+(define (tarball-sans-extension tarball)
+  "Return TARBALL without its .tar.* or .zip extension."
+  (let ((end (or (string-contains tarball ".tar")
+                 (string-contains tarball ".zip"))))
+    (substring tarball 0 end)))
+
 (define (compressed-file? file)
   "Return true if FILE denotes a compressed file."
   (->bool (member (file-extension file)
diff --git a/nix/libstore/build.cc b/nix/libstore/build.cc
index fe7bf79069..ad53b81413 100644
--- a/nix/libstore/build.cc
+++ b/nix/libstore/build.cc
@@ -614,9 +614,7 @@ HookInstance::HookInstance()
 {
     debug("starting build hook");
 
-    Path buildHook = getEnv("NIX_BUILD_HOOK");
-    if (string(buildHook, 0, 1) != "/") buildHook = settings.nixLibexecDir + "/nix/" + buildHook;
-    buildHook = canonPath(buildHook);
+    const Path &buildHook = settings.guixProgram;
 
     /* Create a pipe to get the output of the child. */
     fromHook.create();
@@ -642,13 +640,14 @@ HookInstance::HookInstance()
         if (dup2(builderOut.writeSide, 4) == -1)
             throw SysError("dupping builder's stdout/stderr");
 
-        execl(buildHook.c_str(), buildHook.c_str(), settings.thisSystem.c_str(),
+        execl(buildHook.c_str(), buildHook.c_str(), "offload",
+	    settings.thisSystem.c_str(),
             (format("%1%") % settings.maxSilentTime).str().c_str(),
             (format("%1%") % settings.printBuildTrace).str().c_str(),
             (format("%1%") % settings.buildTimeout).str().c_str(),
             NULL);
 
-        throw SysError(format("executing `%1%'") % buildHook);
+        throw SysError(format("executing `%1% offload'") % buildHook);
     });
 
     pid.setSeparatePG(true);
@@ -1581,7 +1580,7 @@ void DerivationGoal::buildDone()
 
 HookReply DerivationGoal::tryBuildHook()
 {
-    if (!settings.useBuildHook || getEnv("NIX_BUILD_HOOK") == "") return rpDecline;
+    if (!settings.useBuildHook) return rpDecline;
 
     if (!worker.hook)
         worker.hook = std::shared_ptr<HookInstance>(new HookInstance);
@@ -2864,15 +2863,6 @@ private:
     /* The store path that should be realised through a substitute. */
     Path storePath;
 
-    /* The remaining substituters. */
-    Paths subs;
-
-    /* The current substituter. */
-    Path sub;
-
-    /* Whether any substituter can realise this path */
-    bool hasSubstitute;
-
     /* Path info returned by the substituter's query info operation. */
     SubstitutablePathInfo info;
 
@@ -2898,6 +2888,8 @@ private:
     typedef void (SubstitutionGoal::*GoalState)();
     GoalState state;
 
+    void tryNext();
+
 public:
     SubstitutionGoal(const Path & storePath, Worker & worker, bool repair = false);
     ~SubstitutionGoal();
@@ -2915,7 +2907,6 @@ public:
 
     /* The states. */
     void init();
-    void tryNext();
     void gotInfo();
     void referencesValid();
     void tryToRun();
@@ -2931,7 +2922,6 @@ public:
 
 SubstitutionGoal::SubstitutionGoal(const Path & storePath, Worker & worker, bool repair)
     : Goal(worker)
-    , hasSubstitute(false)
     , repair(repair)
 {
     this->storePath = storePath;
@@ -2981,37 +2971,31 @@ void SubstitutionGoal::init()
     if (settings.readOnlyMode)
         throw Error(format("cannot substitute path `%1%' - no write access to the store") % storePath);
 
-    subs = settings.substituters;
-
     tryNext();
 }
 
 
 void SubstitutionGoal::tryNext()
 {
-    trace("trying next substituter");
+    trace("trying substituter");
 
-    if (subs.size() == 0) {
+    SubstitutablePathInfos infos;
+    PathSet dummy(singleton<PathSet>(storePath));
+    worker.store.querySubstitutablePathInfos(dummy, infos);
+    SubstitutablePathInfos::iterator k = infos.find(storePath);
+    if (k == infos.end()) {
         /* None left.  Terminate this goal and let someone else deal
            with it. */
         debug(format("path `%1%' is required, but there is no substituter that can build it") % storePath);
         /* Hack: don't indicate failure if there were no substituters.
            In that case the calling derivation should just do a
            build. */
-        amDone(hasSubstitute ? ecFailed : ecNoSubstituters);
-        return;
+        amDone(ecNoSubstituters);
+	return;
     }
 
-    sub = subs.front();
-    subs.pop_front();
-
-    SubstitutablePathInfos infos;
-    PathSet dummy(singleton<PathSet>(storePath));
-    worker.store.querySubstitutablePathInfos(sub, dummy, infos);
-    SubstitutablePathInfos::iterator k = infos.find(storePath);
-    if (k == infos.end()) { tryNext(); return; }
+    /* Found a substitute.  */
     info = k->second;
-    hasSubstitute = true;
 
     /* To maintain the closure invariant, we first have to realise the
        paths referenced by this one. */
@@ -3099,7 +3083,8 @@ void SubstitutionGoal::tryToRun()
 
     /* Fill in the arguments. */
     Strings args;
-    args.push_back(baseNameOf(sub));
+    args.push_back("guix");
+    args.push_back("substitute");
     args.push_back("--substitute");
     args.push_back(storePath);
     args.push_back(destPath);
@@ -3112,9 +3097,9 @@ void SubstitutionGoal::tryToRun()
         if (dup2(outPipe.writeSide, STDOUT_FILENO) == -1)
             throw SysError("cannot dup output pipe into stdout");
 
-        execv(sub.c_str(), stringsToCharPtrs(args).data());
+        execv(settings.guixProgram.c_str(), stringsToCharPtrs(args).data());
 
-        throw SysError(format("executing `%1%'") % sub);
+        throw SysError(format("executing `%1% substitute'") % settings.guixProgram);
     });
 
     pid.setSeparatePG(true);
@@ -3127,7 +3112,9 @@ void SubstitutionGoal::tryToRun()
     state = &SubstitutionGoal::finished;
 
     if (settings.printBuildTrace)
-        printMsg(lvlError, format("@ substituter-started %1% %2%") % storePath % sub);
+	/* The second element in the message used to be the name of the
+	   substituter but we're left with only one.  */
+        printMsg(lvlError, format("@ substituter-started %1% substitute") % storePath);
 }
 
 
@@ -3193,9 +3180,7 @@ void SubstitutionGoal::finished()
                 % storePath % status % e.msg());
         }
 
-        /* Try the next substitute. */
-        state = &SubstitutionGoal::tryNext;
-        worker.wakeUp(shared_from_this());
+	amDone(ecFailed);
         return;
     }
 
diff --git a/nix/libstore/builtins.cc b/nix/libstore/builtins.cc
index f7c7d42484..4111ac4760 100644
--- a/nix/libstore/builtins.cc
+++ b/nix/libstore/builtins.cc
@@ -39,7 +39,7 @@ static void builtinDownload(const Derivation &drv,
 
     const char *const argv[] =
       {
-	"download", drvPath.c_str(), output.c_str(), NULL
+	  "guix", "perform-download", drvPath.c_str(), output.c_str(), NULL
       };
 
     /* Tell the script what the store file name is, so that
@@ -50,7 +50,7 @@ static void builtinDownload(const Derivation &drv,
     /* Tell it about options such as "print-extended-build-trace".  */
     setenv("_NIX_OPTIONS", settings.pack().c_str(), 1);
 
-    const string program = settings.nixLibexecDir + "/download";
+    const string program = settings.guixProgram;
     execv(program.c_str(), (char *const *) argv);
 
     throw SysError(format("failed to run download program '%1%'") % program);
diff --git a/nix/libstore/gc.cc b/nix/libstore/gc.cc
index 46171e116c..c466996668 100644
--- a/nix/libstore/gc.cc
+++ b/nix/libstore/gc.cc
@@ -339,14 +339,11 @@ Roots LocalStore::findRoots()
 
 static void addAdditionalRoots(StoreAPI & store, PathSet & roots)
 {
-    Path rootFinder = getEnv("NIX_ROOT_FINDER",
-        settings.nixLibexecDir + "/list-runtime-roots");
+    debug(format("executing `%1% gc --list-busy' to find additional roots")
+	  % settings.guixProgram);
 
-    if (rootFinder.empty()) return;
-
-    debug(format("executing `%1%' to find additional roots") % rootFinder);
-
-    string result = runProgram(rootFinder);
+    const Strings args = { "gc", "--list-busy" };
+    string result = runProgram(settings.guixProgram, false, args);
 
     StringSet paths = tokenizeString<StringSet>(result, "\n");
 
diff --git a/nix/libstore/globals.cc b/nix/libstore/globals.cc
index 6df20e7a52..0cc001fbe4 100644
--- a/nix/libstore/globals.cc
+++ b/nix/libstore/globals.cc
@@ -70,9 +70,9 @@ void Settings::processEnvironment()
     nixStateDir = canonPath(getEnv("GUIX_STATE_DIRECTORY", NIX_STATE_DIR));
     nixDBPath = getEnv("GUIX_DATABASE_DIRECTORY", nixStateDir + "/db");
     nixConfDir = canonPath(getEnv("GUIX_CONFIGURATION_DIRECTORY", GUIX_CONFIGURATION_DIRECTORY));
-    nixLibexecDir = canonPath(getEnv("NIX_LIBEXEC_DIR", NIX_LIBEXEC_DIR));
     nixBinDir = canonPath(getEnv("NIX_BIN_DIR", NIX_BIN_DIR));
     nixDaemonSocketFile = canonPath(nixStateDir + DEFAULT_SOCKET_PATH);
+    guixProgram = canonPath(getEnv("GUIX", nixBinDir + "/guix"));
 }
 
 
diff --git a/nix/libstore/globals.hh b/nix/libstore/globals.hh
index b073f724b6..27616a2283 100644
--- a/nix/libstore/globals.hh
+++ b/nix/libstore/globals.hh
@@ -57,15 +57,15 @@ struct Settings {
     /* The directory where configuration files are stored. */
     Path nixConfDir;
 
-    /* The directory where internal helper programs are stored. */
-    Path nixLibexecDir;
-
     /* The directory where the main programs are stored. */
     Path nixBinDir;
 
     /* File name of the socket the daemon listens to.  */
     Path nixDaemonSocketFile;
 
+    /* Absolute file name of the 'guix' program.  */
+    Path guixProgram;
+
     /* Whether to keep temporary directories of failed builds. */
     bool keepFailed;
 
@@ -112,11 +112,6 @@ struct Settings {
        means infinity.  */
     time_t buildTimeout;
 
-    /* The substituters.  There are programs that can somehow realise
-       a store path without building, e.g., by downloading it or
-       copying it from a CD. */
-    Paths substituters;
-
     /* Whether to use build hooks (for distributed builds).  Sometimes
        users want to disable this from the command-line. */
     bool useBuildHook;
diff --git a/nix/libstore/local-store.cc b/nix/libstore/local-store.cc
index 892d9300b1..3b08492c64 100644
--- a/nix/libstore/local-store.cc
+++ b/nix/libstore/local-store.cc
@@ -184,13 +184,15 @@ LocalStore::LocalStore(bool reserveSpace)
 LocalStore::~LocalStore()
 {
     try {
-        foreach (RunningSubstituters::iterator, i, runningSubstituters) {
-            if (i->second.disabled) continue;
-            i->second.to.close();
-            i->second.from.close();
-            i->second.error.close();
-            if (i->second.pid != -1)
-                i->second.pid.wait(true);
+	if (runningSubstituter) {
+	    RunningSubstituter &i = *runningSubstituter;
+            if (!i.disabled) {
+		i.to.close();
+		i.from.close();
+		i.error.close();
+		if (i.pid != -1)
+		    i.pid.wait(true);
+	    }
         }
     } catch (...) {
         ignoreException();
@@ -808,11 +810,12 @@ void LocalStore::setSubstituterEnv()
 }
 
 
-void LocalStore::startSubstituter(const Path & substituter, RunningSubstituter & run)
+void LocalStore::startSubstituter(RunningSubstituter & run)
 {
     if (run.disabled || run.pid != -1) return;
 
-    debug(format("starting substituter program `%1%'") % substituter);
+    debug(format("starting substituter program `%1% substitute'")
+	  % settings.guixProgram);
 
     Pipe toPipe, fromPipe, errorPipe;
 
@@ -829,11 +832,10 @@ void LocalStore::startSubstituter(const Path & substituter, RunningSubstituter &
             throw SysError("dupping stdout");
         if (dup2(errorPipe.writeSide, STDERR_FILENO) == -1)
             throw SysError("dupping stderr");
-        execl(substituter.c_str(), substituter.c_str(), "--query", NULL);
-        throw SysError(format("executing `%1%'") % substituter);
+        execl(settings.guixProgram.c_str(), "guix", "substitute", "--query", NULL);
+        throw SysError(format("executing `%1%'") % settings.guixProgram);
     });
 
-    run.program = baseNameOf(substituter);
     run.to = toPipe.writeSide.borrow();
     run.from = run.fromBuf.fd = fromPipe.readSide.borrow();
     run.error = errorPipe.readSide.borrow();
@@ -889,13 +891,14 @@ string LocalStore::getLineFromSubstituter(RunningSubstituter & run)
                 if (errno == EINTR) continue;
                 throw SysError("reading from substituter's stderr");
             }
-            if (n == 0) throw EndOfFile(format("substituter `%1%' died unexpectedly") % run.program);
+            if (n == 0) throw EndOfFile(format("`%1% substitute' died unexpectedly")
+					% settings.guixProgram);
             err.append(buf, n);
             string::size_type p;
             while (((p = err.find('\n')) != string::npos)
 		   || ((p = err.find('\r')) != string::npos)) {
 	        string thing(err, 0, p + 1);
-	        writeToStderr(run.program + ": " + thing);
+	        writeToStderr("substitute: " + thing);
                 err = string(err, p + 1);
             }
         }
@@ -907,7 +910,7 @@ string LocalStore::getLineFromSubstituter(RunningSubstituter & run)
                 unsigned char c;
                 run.fromBuf(&c, 1);
                 if (c == '\n') {
-                    if (!err.empty()) printMsg(lvlError, run.program + ": " + err);
+                    if (!err.empty()) printMsg(lvlError, "substitute: " + err);
                     return res;
                 }
                 res += c;
@@ -930,38 +933,47 @@ PathSet LocalStore::querySubstitutablePaths(const PathSet & paths)
 {
     PathSet res;
 
-    if (!settings.useSubstitutes) return res;
-
-    foreach (Paths::iterator, i, settings.substituters) {
-        if (res.size() == paths.size()) break;
-        RunningSubstituter & run(runningSubstituters[*i]);
-        startSubstituter(*i, run);
-        if (run.disabled) continue;
-        string s = "have ";
-        foreach (PathSet::const_iterator, j, paths)
-            if (res.find(*j) == res.end()) { s += *j; s += " "; }
-        writeLine(run.to, s);
-        while (true) {
-            /* FIXME: we only read stderr when an error occurs, so
-               substituters should only write (short) messages to
-               stderr when they fail.  I.e. they shouldn't write debug
-               output. */
-            Path path = getLineFromSubstituter(run);
-            if (path == "") break;
-            res.insert(path);
-        }
+    if (!settings.useSubstitutes || paths.empty()) return res;
+
+    if (!runningSubstituter) {
+	std::unique_ptr<RunningSubstituter>fresh(new RunningSubstituter);
+	runningSubstituter.swap(fresh);
+    }
+
+    RunningSubstituter & run = *runningSubstituter;
+    startSubstituter(run);
+
+    if (!run.disabled) {
+	string s = "have ";
+	foreach (PathSet::const_iterator, j, paths)
+	    if (res.find(*j) == res.end()) { s += *j; s += " "; }
+	writeLine(run.to, s);
+	while (true) {
+	    /* FIXME: we only read stderr when an error occurs, so
+	       substituters should only write (short) messages to
+	       stderr when they fail.  I.e. they shouldn't write debug
+	       output. */
+	    Path path = getLineFromSubstituter(run);
+	    if (path == "") break;
+	    res.insert(path);
+	}
     }
+
     return res;
 }
 
 
-void LocalStore::querySubstitutablePathInfos(const Path & substituter,
-    PathSet & paths, SubstitutablePathInfos & infos)
+void LocalStore::querySubstitutablePathInfos(PathSet & paths, SubstitutablePathInfos & infos)
 {
     if (!settings.useSubstitutes) return;
 
-    RunningSubstituter & run(runningSubstituters[substituter]);
-    startSubstituter(substituter, run);
+    if (!runningSubstituter) {
+	std::unique_ptr<RunningSubstituter>fresh(new RunningSubstituter);
+	runningSubstituter.swap(fresh);
+    }
+
+    RunningSubstituter & run = *runningSubstituter;
+    startSubstituter(run);
     if (run.disabled) return;
 
     string s = "info ";
@@ -993,10 +1005,9 @@ void LocalStore::querySubstitutablePathInfos(const Path & substituter,
 void LocalStore::querySubstitutablePathInfos(const PathSet & paths,
     SubstitutablePathInfos & infos)
 {
-    PathSet todo = paths;
-    foreach (Paths::iterator, i, settings.substituters) {
-        if (todo.empty()) break;
-        querySubstitutablePathInfos(*i, todo, infos);
+    if (!paths.empty()) {
+	PathSet todo = paths;
+	querySubstitutablePathInfos(todo, infos);
     }
 }
 
@@ -1224,8 +1235,9 @@ static void checkSecrecy(const Path & path)
 
 static std::string runAuthenticationProgram(const Strings & args)
 {
-    return runProgram(settings.nixLibexecDir + "/authenticate",
-		      false, args);
+    Strings fullArgs = { "authenticate" };
+    fullArgs.insert(fullArgs.end(), args.begin(), args.end()); // append
+    return runProgram(settings.guixProgram, false, fullArgs);
 }
 
 void LocalStore::exportPath(const Path & path, bool sign,
diff --git a/nix/libstore/local-store.hh b/nix/libstore/local-store.hh
index 4e6b4cfc1d..4113fafcb5 100644
--- a/nix/libstore/local-store.hh
+++ b/nix/libstore/local-store.hh
@@ -40,7 +40,6 @@ struct OptimiseStats
 
 struct RunningSubstituter
 {
-    Path program;
     Pid pid;
     AutoCloseFD to, from, error;
     FdSource fromBuf;
@@ -52,8 +51,8 @@ struct RunningSubstituter
 class LocalStore : public StoreAPI
 {
 private:
-    typedef std::map<Path, RunningSubstituter> RunningSubstituters;
-    RunningSubstituters runningSubstituters;
+    /* The currently running substituter or empty.  */
+    std::unique_ptr<RunningSubstituter> runningSubstituter;
 
     Path linksDir;
 
@@ -93,8 +92,8 @@ public:
 
     PathSet querySubstitutablePaths(const PathSet & paths);
 
-    void querySubstitutablePathInfos(const Path & substituter,
-        PathSet & paths, SubstitutablePathInfos & infos);
+    void querySubstitutablePathInfos(PathSet & paths,
+        SubstitutablePathInfos & infos);
 
     void querySubstitutablePathInfos(const PathSet & paths,
         SubstitutablePathInfos & infos);
@@ -261,8 +260,7 @@ private:
 
     void removeUnusedLinks(const GCState & state);
 
-    void startSubstituter(const Path & substituter,
-        RunningSubstituter & runningSubstituter);
+    void startSubstituter(RunningSubstituter & runningSubstituter);
 
     string getLineFromSubstituter(RunningSubstituter & run);
 
diff --git a/nix/local.mk b/nix/local.mk
index 6d7e60e9fb..dc5a8398b2 100644
--- a/nix/local.mk
+++ b/nix/local.mk
@@ -110,7 +110,6 @@ libstore_a_CPPFLAGS =				\
   -DNIX_STATE_DIR=\"$(localstatedir)/guix\"	\
   -DNIX_LOG_DIR=\"$(localstatedir)/log/guix\"	\
   -DGUIX_CONFIGURATION_DIRECTORY=\"$(sysconfdir)/guix\"		\
-  -DNIX_LIBEXEC_DIR=\"$(libexecdir)/guix\"	\
   -DNIX_BIN_DIR=\"$(bindir)\"			\
   -DDEFAULT_CHROOT_DIRS="\"\""
 
@@ -154,21 +153,6 @@ noinst_HEADERS =						\
 	         (lambda (in)					\
 	           (write (get-string-all in) out)))))"
 
-nodist_pkglibexec_SCRIPTS =			\
-  %D%/scripts/list-runtime-roots		\
-  %D%/scripts/substitute			\
-  %D%/scripts/download
-
-if BUILD_DAEMON_OFFLOAD
-
-nodist_pkglibexec_SCRIPTS +=			\
-  %D%/scripts/offload
-
-endif BUILD_DAEMON_OFFLOAD
-
-nodist_pkglibexec_SCRIPTS +=			\
-  %D%/scripts/authenticate
-
 # The '.service' files for systemd.
 systemdservicedir = $(libdir)/systemd/system
 nodist_systemdservice_DATA = etc/guix-daemon.service etc/guix-publish.service
diff --git a/nix/nix-daemon/guix-daemon.cc b/nix/nix-daemon/guix-daemon.cc
index f47d142612..6f9c404c8d 100644
--- a/nix/nix-daemon/guix-daemon.cc
+++ b/nix/nix-daemon/guix-daemon.cc
@@ -466,23 +466,15 @@ main (int argc, char *argv[])
     {
       settings.processEnvironment ();
 
-      /* Use our substituter by default.  */
-      settings.substituters.clear ();
+      /* Enable substitutes by default.  */
       settings.set ("build-use-substitutes", "true");
 
       /* Use our substitute server by default.  */
       settings.set ("substitute-urls", GUIX_SUBSTITUTE_URLS);
 
 #ifdef HAVE_DAEMON_OFFLOAD_HOOK
-      /* Use our build hook for distributed builds by default.  */
+      /* Use 'guix offload' for distributed builds by default.  */
       settings.useBuildHook = true;
-      if (getenv ("NIX_BUILD_HOOK") == NULL)
-	{
-	  std::string build_hook;
-
-	  build_hook = settings.nixLibexecDir + "/offload";
-	  setenv ("NIX_BUILD_HOOK", build_hook.c_str (), 1);
-	}
 #else
       /* We are not installing any build hook, so disable it.  */
       settings.useBuildHook = false;
@@ -497,14 +489,6 @@ main (int argc, char *argv[])
       printMsg(lvlDebug,
 	       format ("build log compression: %1%") % settings.logCompression);
 
-      if (settings.useSubstitutes)
-	settings.substituters.push_back (settings.nixLibexecDir
-					 + "/substitute");
-      else
-	/* Clear the substituter list to make sure nothing ever gets
-	   substituted, regardless of the client's settings.  */
-	settings.substituters.clear ();
-
       if (geteuid () == 0 && settings.buildUsersGroup.empty ())
 	fprintf (stderr, _("warning: daemon is running as root, so \
 using `--build-users-group' is highly recommended\n"));
diff --git a/nix/nix-daemon/nix-daemon.cc b/nix/nix-daemon/nix-daemon.cc
index 56137701a1..1163a249d1 100644
--- a/nix/nix-daemon/nix-daemon.cc
+++ b/nix/nix-daemon/nix-daemon.cc
@@ -1,3 +1,4 @@
+#include "config.h"
 #include "shared.hh"
 #include "local-store.hh"
 #include "util.hh"
@@ -580,8 +581,14 @@ static void performOp(bool trusted, unsigned int clientVersion,
             settings.set("build-max-silent-time", std::to_string(readInt(from)));
         }
 
-        if (GET_PROTOCOL_MINOR(clientVersion) >= 2)
+        if (GET_PROTOCOL_MINOR(clientVersion) >= 2) {
+#ifdef HAVE_DAEMON_OFFLOAD_HOOK
             settings.useBuildHook = readInt(from) != 0;
+#else
+	    readInt(from);			  // ignore the user's setting
+#endif
+	}
+
         if (GET_PROTOCOL_MINOR(clientVersion) >= 4) {
             settings.buildVerbosity = (Verbosity) readInt(from);
             logType = (LogType) readInt(from);
@@ -590,8 +597,12 @@ static void performOp(bool trusted, unsigned int clientVersion,
         if (GET_PROTOCOL_MINOR(clientVersion) >= 6
             && GET_PROTOCOL_MINOR(clientVersion) < 0x61)
             settings.set("build-cores", std::to_string(readInt(from)));
-        if (GET_PROTOCOL_MINOR(clientVersion) >= 10)
-            settings.set("build-use-substitutes", readInt(from) ? "true" : "false");
+        if (GET_PROTOCOL_MINOR(clientVersion) >= 10) {
+	    if (settings.useSubstitutes)
+		settings.set("build-use-substitutes", readInt(from) ? "true" : "false");
+	    else
+		readInt(from);			// substitutes remain disabled
+	}
         if (GET_PROTOCOL_MINOR(clientVersion) >= 12) {
             unsigned int n = readInt(from);
             for (unsigned int i = 0; i < n; i++) {
diff --git a/nix/scripts/authenticate.in b/nix/scripts/authenticate.in
deleted file mode 100644
index 5ce57915f0..0000000000
--- a/nix/scripts/authenticate.in
+++ /dev/null
@@ -1,11 +0,0 @@
-#!@SHELL@
-# A shorthand for "guix authenticate", for use by the daemon.
-
-if test "x$GUIX_UNINSTALLED" = "x"
-then
-    prefix="@prefix@"
-    exec_prefix="@exec_prefix@"
-    exec "@bindir@/guix" authenticate "$@"
-else
-    exec guix authenticate "$@"
-fi
diff --git a/nix/scripts/download.in b/nix/scripts/download.in
deleted file mode 100644
index 4d7088a993..0000000000
--- a/nix/scripts/download.in
+++ /dev/null
@@ -1,11 +0,0 @@
-#!@SHELL@
-# A shorthand for "guix perform-download", for use by the daemon.
-
-if test "x$GUIX_UNINSTALLED" = "x"
-then
-    prefix="@prefix@"
-    exec_prefix="@exec_prefix@"
-    exec "@bindir@/guix" perform-download "$@"
-else
-    exec guix perform-download "$@"
-fi
diff --git a/nix/scripts/list-runtime-roots.in b/nix/scripts/list-runtime-roots.in
deleted file mode 100644
index 5f2660fb5e..0000000000
--- a/nix/scripts/list-runtime-roots.in
+++ /dev/null
@@ -1,147 +0,0 @@
-#!@GUILE@ -ds
-!#
-;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2017 Ludovic Courtès <ludo@gnu.org>
-;;;
-;;; This file is part of GNU Guix.
-;;;
-;;; GNU Guix is free software; you can redistribute it and/or modify it
-;;; under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 3 of the License, or (at
-;;; your option) any later version.
-;;;
-;;; GNU Guix is distributed in the hope that it will be useful, but
-;;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
-
-;;;
-;;; List files being used at run time; these files are garbage collector
-;;; roots.  This is equivalent to `find-runtime-roots.pl' in Nix.
-;;;
-
-(use-modules (ice-9 ftw)
-             (ice-9 regex)
-             (ice-9 rdelim)
-             (ice-9 match)
-             (srfi srfi-1)
-             (srfi srfi-26)
-             (rnrs io ports))
-
-(define %proc-directory
-  ;; Mount point of Linuxish /proc file system.
-  "/proc")
-
-(define %store-directory
-  (or (getenv "NIX_STORE_DIR")
-      "@storedir@"))
-
-(define (proc-file-roots dir file)
-  "Return a one-element list containing the file pointed to by DIR/FILE,
-or the empty list."
-  (or (and=> (false-if-exception (readlink (string-append dir "/" file)))
-             list)
-      '()))
-
-(define proc-exe-roots (cut proc-file-roots <> "exe"))
-(define proc-cwd-roots (cut proc-file-roots <> "cwd"))
-
-(define (proc-fd-roots dir)
-  "Return the list of store files referenced by DIR, which is a
-/proc/XYZ directory."
-  (let ((dir (string-append dir "/fd")))
-    (filter-map (lambda (file)
-                  (let ((target (false-if-exception
-                                 (readlink (string-append dir "/" file)))))
-                    (and target
-                         (string-prefix? "/" target)
-                         target)))
-                (or (scandir dir string->number) '()))))
-
-(define (proc-maps-roots dir)
-  "Return the list of store files referenced by DIR, which is a
-/proc/XYZ directory."
-  (define %file-mapping-line
-    (make-regexp "^.*[[:blank:]]+/([^ ]+)$"))
-
-  (call-with-input-file (string-append dir "/maps")
-    (lambda (maps)
-      (let loop ((line  (read-line maps))
-                 (roots '()))
-        (cond ((eof-object? line)
-               roots)
-              ((regexp-exec %file-mapping-line line)
-               =>
-               (lambda (match)
-                 (let ((file (string-append "/"
-                                            (match:substring match 1))))
-                   (loop (read-line maps)
-                         (cons file roots)))))
-              (else
-               (loop (read-line maps) roots)))))))
-
-(define (proc-environ-roots dir)
-  "Return the list of store files referenced by DIR/environ, where DIR is a
-/proc/XYZ directory."
-  (define split-on-nul
-    (cute string-tokenize <>
-          (char-set-complement (char-set #\nul))))
-
-  (define (rhs-file-names str)
-    (let ((equal (string-index str #\=)))
-      (if equal
-          (let* ((str (substring str (+ 1 equal)))
-                 (rx  (string-append (regexp-quote %store-directory)
-                                     "/[0-9a-z]{32}-[a-zA-Z0-9\\._+-]+")))
-            (map match:substring (list-matches rx str)))
-          '())))
-
-  (define environ
-    (string-append dir "/environ"))
-
-  (append-map rhs-file-names
-              (split-on-nul
-               (call-with-input-file environ
-                 get-string-all))))
-
-(define (referenced-files)
-  "Return the list of referenced store items."
-  (append-map (lambda (pid)
-                (let ((proc (string-append %proc-directory "/" pid)))
-                  (catch 'system-error
-                    (lambda ()
-                      (append (proc-exe-roots proc)
-                              (proc-cwd-roots proc)
-                              (proc-fd-roots proc)
-                              (proc-maps-roots proc)
-                              (proc-environ-roots proc)))
-                    (lambda args
-                      (let ((err (system-error-errno args)))
-                        (if (or (= ENOENT err)    ;TOCTTOU race
-                                (= ESRCH err)     ;ditto
-                                (= EACCES err))   ;not running as root
-                            '()
-                            (apply throw args)))))))
-              (scandir %proc-directory string->number
-                       (lambda (a b)
-                         (< (string->number a) (string->number b))))))
-
-(define canonicalize-store-item
-  (let* ((store  (string-append %store-directory "/"))
-         (prefix (string-length store)))
-    (lambda (file)
-      "Return #f if FILE is not a store item; otherwise, return the store file
-name without any sub-directory components."
-      (and (string-prefix? store file)
-           (string-append store
-                          (let ((base (string-drop file prefix)))
-                            (match (string-index base #\/)
-                              (#f    base)
-                              (slash (string-take base slash)))))))))
-
-(for-each (cut simple-format #t "~a~%" <>)
-          (delete-duplicates
-           (filter-map canonicalize-store-item (referenced-files))))
diff --git a/nix/scripts/offload.in b/nix/scripts/offload.in
deleted file mode 100644
index 50faed31c0..0000000000
--- a/nix/scripts/offload.in
+++ /dev/null
@@ -1,11 +0,0 @@
-#!@SHELL@
-# A shorthand for "guix offload", for use by the daemon.
-
-if test "x$GUIX_UNINSTALLED" = "x"
-then
-    prefix="@prefix@"
-    exec_prefix="@exec_prefix@"
-    exec "@bindir@/guix" offload "$@"
-else
-    exec guix offload "$@"
-fi
diff --git a/nix/scripts/substitute.in b/nix/scripts/substitute.in
deleted file mode 100644
index 5a2eeb7259..0000000000
--- a/nix/scripts/substitute.in
+++ /dev/null
@@ -1,11 +0,0 @@
-#!@SHELL@
-# A shorthand for "guix substitute", for use by the daemon.
-
-if test "x$GUIX_UNINSTALLED" = "x"
-then
-    prefix="@prefix@"
-    exec_prefix="@exec_prefix@"
-    exec "@bindir@/guix" substitute "$@"
-else
-    exec guix substitute "$@"
-fi
diff --git a/tests/networking.scm b/tests/networking.scm
new file mode 100644
index 0000000000..439cca5ffc
--- /dev/null
+++ b/tests/networking.scm
@@ -0,0 +1,113 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2019 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (tests networking)
+  #:use-module (ice-9 regex)
+  #:use-module (gnu services networking)
+  #:use-module (srfi srfi-64))
+
+;;; Tests for the (gnu services networking) module.
+
+(test-begin "networking")
+
+
+;;;
+;;; NTP.
+;;;
+
+(define ntp-server->string (@@ (gnu services networking) ntp-server->string))
+
+(define %ntp-server-sample
+  (ntp-server
+   (type 'server)
+   (address "some.ntp.server.org")
+   (options `(iburst (version 3) (maxpoll 16) prefer))))
+
+(test-equal "ntp-server->string"
+  (ntp-server->string %ntp-server-sample)
+  "server some.ntp.server.org iburst version 3 maxpoll 16 prefer")
+
+(test-equal "ntp configuration servers deprecated form"
+  (ntp-configuration-servers
+   (ntp-configuration
+    (servers (list (ntp-server
+                    (type 'server)
+                    (address "example.pool.ntp.org")
+                    (options '()))))))
+  (ntp-configuration-servers
+   (ntp-configuration
+    (servers (list "example.pool.ntp.org")))))
+
+
+;;;
+;;; OpenNTPD
+;;;
+
+(define openntpd-configuration->string (@@ (gnu services networking)
+                                           openntpd-configuration->string))
+
+(define %openntpd-conf-sample
+  (openntpd-configuration
+   (server '("0.guix.pool.ntp.org" "1.guix.pool.ntp.org"))
+   (listen-on '("127.0.0.1" "::1"))
+   (sensor '("udcf0 correction 70000"))
+   (constraint-from '("www.gnu.org"))
+   (constraints-from '("https://www.google.com/"))
+   (allow-large-adjustment? #t)))
+
+(test-assert "openntpd configuration generation sanity check"
+
+  (begin
+    (define (string-match/newline pattern text)
+      (regexp-exec (make-regexp pattern regexp/newline) text))
+
+    (define (match-count pattern text)
+      (fold-matches (make-regexp pattern regexp/newline) text 0
+                    (lambda (match count)
+                      (1+ count))))
+
+    (let ((config (openntpd-configuration->string %openntpd-conf-sample)))
+      (if (not
+           (and (string-match/newline "^listen on 127.0.0.1$" config)
+                (string-match/newline "^listen on ::1$" config)
+                (string-match/newline "^sensor udcf0 correction 70000$" config)
+                (string-match/newline "^constraint from www.gnu.org$" config)
+                (string-match/newline "^server 0.guix.pool.ntp.org$" config)
+                (string-match/newline
+                 "^constraints from \"https://www.google.com/\"$"
+                 config)
+
+                ;; Check for issue #3731 (see:
+                ;; http://debbugs.gnu.org/cgi/bugreport.cgi?bug=37318).
+                (= (match-count "^listen on " config) 2)
+                (= (match-count "^sensor " config) 1)
+                (= (match-count "^constraint from " config) 1)
+                (= (match-count "^server " config) 2)
+                (= (match-count "^constraints from " config) 1)))
+          (begin
+            (format #t "The configuration below failed \
+the sanity check:\n~a~%" config)
+            #f)
+          #t))))
+
+(test-equal "openntpd generated config string ends with a newline"
+  (let ((config (openntpd-configuration->string %openntpd-conf-sample)))
+    (string-take-right config 1))
+  "\n")
+
+(test-end "networking")
diff --git a/tests/opam.scm b/tests/opam.scm
index e8c0d15198..d3626fd010 100644
--- a/tests/opam.scm
+++ b/tests/opam.scm
@@ -99,7 +99,7 @@ url {
                          ('base32
                           (? string? hash)))))
              ('build-system 'ocaml-build-system)
-             ('inputs
+             ('propagated-inputs
               ('quasiquote
                (("ocaml-zarith" ('unquote 'ocaml-zarith)))))
              ('native-inputs