summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.dir-locals.el3
-rw-r--r--.gitignore1
-rw-r--r--.mailmap6
-rw-r--r--HACKING4
-rw-r--r--Makefile.am2
-rw-r--r--THANKS1
-rw-r--r--config-daemon.ac4
-rw-r--r--configure.ac11
-rw-r--r--doc/guix.texi189
-rw-r--r--emacs/guix-devel.el2
-rw-r--r--etc/guix-daemon.service.in1
-rw-r--r--gnu/local.mk15
-rw-r--r--gnu/packages/admin.scm57
-rw-r--r--gnu/packages/algebra.scm4
-rw-r--r--gnu/packages/backup.scm9
-rw-r--r--gnu/packages/bioinformatics.scm636
-rw-r--r--gnu/packages/bittorrent.scm4
-rw-r--r--gnu/packages/busybox.scm67
-rw-r--r--gnu/packages/ccache.scm11
-rw-r--r--gnu/packages/cdrom.scm6
-rw-r--r--gnu/packages/compression.scm37
-rw-r--r--gnu/packages/conkeror.scm11
-rw-r--r--gnu/packages/crypto.scm90
-rw-r--r--gnu/packages/databases.scm2
-rw-r--r--gnu/packages/datastructures.scm22
-rw-r--r--gnu/packages/disk.scm46
-rw-r--r--gnu/packages/documentation.scm38
-rw-r--r--gnu/packages/ebook.scm4
-rw-r--r--gnu/packages/emacs.scm535
-rw-r--r--gnu/packages/engineering.scm27
-rw-r--r--gnu/packages/enlightenment.scm17
-rw-r--r--gnu/packages/flashing-tools.scm5
-rw-r--r--gnu/packages/fonts.scm9
-rw-r--r--gnu/packages/freedesktop.scm6
-rw-r--r--gnu/packages/games.scm38
-rw-r--r--gnu/packages/gd.scm11
-rw-r--r--gnu/packages/geeqie.scm36
-rw-r--r--gnu/packages/gimp.scm1
-rw-r--r--gnu/packages/gl.scm61
-rw-r--r--gnu/packages/gnunet.scm12
-rw-r--r--gnu/packages/gnupg.scm24
-rw-r--r--gnu/packages/golang.scm185
-rw-r--r--gnu/packages/graphics.scm28
-rw-r--r--gnu/packages/grub.scm25
-rw-r--r--gnu/packages/gstreamer.scm24
-rw-r--r--gnu/packages/imagemagick.scm4
-rw-r--r--gnu/packages/irc.scm6
-rw-r--r--gnu/packages/julia.scm3
-rw-r--r--gnu/packages/kde.scm5
-rw-r--r--gnu/packages/libreoffice.scm12
-rw-r--r--gnu/packages/libusb.scm13
-rw-r--r--gnu/packages/linux.scm150
-rw-r--r--gnu/packages/lisp.scm2
-rw-r--r--gnu/packages/llvm.scm90
-rw-r--r--gnu/packages/logging.scm45
-rw-r--r--gnu/packages/lsh.scm159
-rw-r--r--gnu/packages/lxde.scm17
-rw-r--r--gnu/packages/mail.scm46
-rw-r--r--gnu/packages/man.scm12
-rw-r--r--gnu/packages/markdown.scm5
-rw-r--r--gnu/packages/maths.scm30
-rw-r--r--gnu/packages/messaging.scm4
-rw-r--r--gnu/packages/mpd.scm4
-rw-r--r--gnu/packages/music.scm71
-rw-r--r--gnu/packages/networking.scm2
-rw-r--r--gnu/packages/ninja.scm7
-rw-r--r--gnu/packages/node.scm19
-rw-r--r--gnu/packages/openstack.scm4
-rw-r--r--gnu/packages/owncloud.scm17
-rw-r--r--gnu/packages/package-management.scm7
-rw-r--r--gnu/packages/parallel.scm4
-rw-r--r--gnu/packages/patches/avrdude-fix-libusb.patch256
-rw-r--r--gnu/packages/patches/clang-3.8-libc-search-path.patch69
-rw-r--r--gnu/packages/patches/gd-CVE-2016-5766.patch81
-rw-r--r--gnu/packages/patches/gd-CVE-2016-6128.patch253
-rw-r--r--gnu/packages/patches/gd-CVE-2016-6132.patch55
-rw-r--r--gnu/packages/patches/gd-CVE-2016-6214.patch66
-rw-r--r--gnu/packages/patches/gd-fix-test-on-i686.patch34
-rw-r--r--gnu/packages/patches/gimp-CVE-2016-4994.patch96
-rw-r--r--gnu/packages/patches/khmer-use-libraries.patch16
-rw-r--r--gnu/packages/patches/libmtp-devices.patch554
-rw-r--r--gnu/packages/patches/ninja-tests.patch34
-rw-r--r--gnu/packages/patches/openimageio-boost-1.60.patch47
-rw-r--r--gnu/packages/patches/python-dendropy-exclude-failing-tests.patch21
-rw-r--r--gnu/packages/patches/sudo-CVE-2015-5602.patch372
-rw-r--r--gnu/packages/pdf.scm42
-rw-r--r--gnu/packages/perl.scm308
-rw-r--r--gnu/packages/pumpio.scm1
-rw-r--r--gnu/packages/python.scm257
-rw-r--r--gnu/packages/qt.scm87
-rw-r--r--gnu/packages/readline.scm28
-rw-r--r--gnu/packages/samba.scm18
-rw-r--r--gnu/packages/scheme.scm4
-rw-r--r--gnu/packages/screen.scm36
-rw-r--r--gnu/packages/smalltalk.scm15
-rw-r--r--gnu/packages/ssh.scm162
-rw-r--r--gnu/packages/stalonetray.scm7
-rw-r--r--gnu/packages/statistics.scm150
-rw-r--r--gnu/packages/tls.scm2
-rw-r--r--gnu/packages/tmux.scm38
-rw-r--r--gnu/packages/version-control.scm14
-rw-r--r--gnu/packages/video.scm70
-rw-r--r--gnu/packages/web.scm4
-rw-r--r--gnu/packages/wm.scm1
-rw-r--r--gnu/packages/xdisorg.scm31
-rw-r--r--gnu/packages/xfce.scm34
-rw-r--r--gnu/packages/xml.scm9
-rw-r--r--gnu/services.scm102
-rw-r--r--gnu/services/avahi.scm12
-rw-r--r--gnu/services/base.scm264
-rw-r--r--gnu/services/dbus.scm44
-rw-r--r--gnu/services/desktop.scm67
-rw-r--r--gnu/services/networking.scm54
-rw-r--r--gnu/services/shepherd.scm45
-rw-r--r--gnu/services/ssh.scm97
-rw-r--r--gnu/services/web.scm3
-rw-r--r--gnu/services/xorg.scm42
-rw-r--r--gnu/system.scm10
-rw-r--r--gnu/system/install.scm119
-rw-r--r--gnu/system/linux-container.scm49
-rw-r--r--gnu/system/linux-initrd.scm172
-rw-r--r--gnu/system/locale.scm8
-rw-r--r--gnu/system/mapped-devices.scm34
-rw-r--r--gnu/system/pam.scm61
-rw-r--r--gnu/system/shadow.scm47
-rw-r--r--gnu/system/vm.scm166
-rw-r--r--gnu/tests.scm183
-rw-r--r--gnu/tests/base.scm468
-rw-r--r--gnu/tests/install.scm246
-rw-r--r--guix/build/download.scm14
-rw-r--r--guix/build/svn.scm21
-rw-r--r--guix/config.scm.in6
-rw-r--r--guix/cvs-download.scm20
-rw-r--r--guix/download.scm96
-rw-r--r--guix/gexp.scm188
-rw-r--r--guix/git-download.scm36
-rw-r--r--guix/hg-download.scm22
-rw-r--r--guix/import/cpan.scm13
-rw-r--r--guix/packages.scm209
-rw-r--r--guix/profiles.scm422
-rw-r--r--guix/records.scm19
-rw-r--r--guix/scripts/challenge.scm40
-rw-r--r--guix/scripts/gc.scm7
-rw-r--r--guix/scripts/lint.scm17
-rw-r--r--guix/scripts/publish.scm169
-rwxr-xr-xguix/scripts/substitute.scm3
-rw-r--r--guix/scripts/system.scm2
-rw-r--r--guix/store.scm2
-rw-r--r--guix/svn-download.scm26
-rw-r--r--guix/zlib.scm234
-rw-r--r--m4/guix.m411
-rw-r--r--tests/cpan.scm11
-rw-r--r--tests/gexp.scm100
-rw-r--r--tests/grafts.scm16
-rw-r--r--tests/lint.scm52
-rw-r--r--tests/packages.scm1
-rw-r--r--tests/publish.scm59
-rw-r--r--tests/records.scm29
-rw-r--r--tests/system.scm43
-rw-r--r--tests/zlib.scm63
160 files changed, 7031 insertions, 3550 deletions
diff --git a/.dir-locals.el b/.dir-locals.el
index 0873c1d747..572a35f828 100644
--- a/.dir-locals.el
+++ b/.dir-locals.el
@@ -41,6 +41,8 @@
    (eval . (put 'with-atomic-file-output 'scheme-indent-function 1))
    (eval . (put 'call-with-compressed-output-port 'scheme-indent-function 2))
    (eval . (put 'call-with-decompressed-port 'scheme-indent-function 2))
+   (eval . (put 'call-with-gzip-input-port 'scheme-indent-function 1))
+   (eval . (put 'call-with-gzip-output-port 'scheme-indent-function 1))
    (eval . (put 'signature-case 'scheme-indent-function 1))
    (eval . (put 'emacs-batch-eval 'scheme-indent-function 0))
    (eval . (put 'emacs-batch-edit-file 'scheme-indent-function 1))
@@ -59,6 +61,7 @@
    (eval . (put 'run-with-store 'scheme-indent-function 1))
    (eval . (put 'run-with-state 'scheme-indent-function 1))
    (eval . (put 'wrap-program 'scheme-indent-function 1))
+   (eval . (put 'with-imported-modules 'scheme-indent-function 1))
 
    (eval . (put 'call-with-container 'scheme-indent-function 1))
    (eval . (put 'container-excursion 'scheme-indent-function 1))
diff --git a/.gitignore b/.gitignore
index 003412eeab..6e892ca687 100644
--- a/.gitignore
+++ b/.gitignore
@@ -35,6 +35,7 @@
 /doc/guix.ky
 /doc/guix.pg
 /doc/guix.toc
+/doc/guix.t2p
 /doc/guix.tp
 /doc/guix.vr
 /doc/guix.vrs
diff --git a/.mailmap b/.mailmap
index 21841c1a0a..2af7760b16 100644
--- a/.mailmap
+++ b/.mailmap
@@ -30,8 +30,9 @@ Ludovic Courtès <ludo@gnu.org> <ludovic.courtes@inria.fr>
 Mathieu Lirzin <mthl@gnu.org> <mthl@openmailbox.org>
 Mathieu Lirzin <mthl@gnu.org> <mathieu.lirzin@openmailbox.org>
 Nikita Karetnikov <nikita@karetnikov.org> <nikita.karetnikov@gmail.com>
-Nils Gillmann <ng0@libertad.pw> <niasterisk@grrlz.net>
-Nils Gillmann <ng0@libertad.pw> <ng@niasterisk.space>
+ng0 <ng0@we.make.ritual.n0.is> <niasterisk@grrlz.net>
+ng0 <ng0@we.make.ritual.n0.is> <ng@niasterisk.space>
+ng0 <ng0@we.make.ritual.n0.is> <ng0@libertad.pw>
 Pjotr Prins <pjotr.public01@thebird.nl>
 Pjotr Prins <pjotr.public01@thebird.nl> <pjotr.public12@thebird.nl>
 Raimon Grau <raimonster@gmail.com> <raimon@3scale.net>
@@ -41,3 +42,4 @@ Ricardo Wurmus <rekado@elephly.net> <ricardo.wurmus@mdc-berlin.de>
 Sou Bunnbu (宋文武) <iyzsong@gmail.com>
 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
 Tomáš Čech <sleep_walker@gnu.org> <sleep_walker@suse.cz>
+Tobias Geerinckx-Rice <me@tobias.gr> <tobias.geerinckx.rice@gmail.com>
\ No newline at end of file
diff --git a/HACKING b/HACKING
index 41838ee816..d5828f6836 100644
--- a/HACKING
+++ b/HACKING
@@ -35,6 +35,10 @@ upgrading GnuTLS or GLib.)  We have a mailing list for commit notifications
 (guix-commits@gnu.org), so people can notice.  Before pushing your changes,
 make sure to run ‘git pull --rebase’.
 
+All commits that are pushed to the central repository on Savannah should be
+signed with a PGP key, and the public key should be uploaded to your user
+account on Savannah.
+
 For anything else, please post to guix-devel@gnu.org and leave time for a
 review, without committing anything.  If you didn’t receive any reply
 after two weeks, and if you’re confident, it’s OK to commit.
diff --git a/Makefile.am b/Makefile.am
index b7792d0721..dc81d32b6c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -57,6 +57,7 @@ MODULES =					\
   guix/licenses.scm				\
   guix/graph.scm				\
   guix/cve.scm					\
+  guix/zlib.scm					\
   guix/build-system.scm				\
   guix/build-system/ant.scm			\
   guix/build-system/cmake.scm			\
@@ -252,6 +253,7 @@ SCM_TESTS =					\
   tests/graph.scm				\
   tests/challenge.scm				\
   tests/cve.scm					\
+  tests/zlib.scm				\
   tests/file-systems.scm			\
   tests/system.scm				\
   tests/services.scm				\
diff --git a/THANKS b/THANKS
index b0dd79382a..af7afd3576 100644
--- a/THANKS
+++ b/THANKS
@@ -14,6 +14,7 @@ infrastructure help:
 	Alexandru Cojocaru <xojoc@gmx.com>
 	    Aleix Conchillo Flaqué <aconchillo@gmail.com>
           Malcolm Cook <MEC@stowers.org>
+           Thomas Danckaert <thomas.danckaert@gmail.com>
 	   Rafael Ferreira <rafael.f.f1@gmail.com>
 	Christian Grothoff <christian@grothoff.org>
              Eric Hanchrow <eric.hanchrow@gmail.com>
diff --git a/config-daemon.ac b/config-daemon.ac
index 803eb53699..f66f31269d 100644
--- a/config-daemon.ac
+++ b/config-daemon.ac
@@ -113,10 +113,10 @@ if test "x$guix_build_daemon" = "xyes"; then
   dnl Determine the appropriate default list of substitute URLs.
   GUILE_MODULE_AVAILABLE([have_gnutls], [(gnutls)])
   if test "x$have_gnutls" = "xyes"; then
-    guix_substitute_urls="https://mirror.hydra.gnu.org https://hydra.gnu.org"
+    guix_substitute_urls="https://mirror.hydra.gnu.org"
   else
     AC_MSG_WARN([GnuTLS is missing, substitutes will be downloaded in the clear])
-    guix_substitute_urls="http://mirror.hydra.gnu.org http://hydra.gnu.org"
+    guix_substitute_urls="http://mirror.hydra.gnu.org"
   fi
   AC_MSG_CHECKING([for default substitute URLs])
   AC_MSG_RESULT([$guix_substitute_urls])
diff --git a/configure.ac b/configure.ac
index 1f5c549aee..20adf85f0b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -189,6 +189,17 @@ AC_SUBST([LIBGCRYPT_LIBDIR])
 
 GUIX_ASSERT_LIBGCRYPT_USABLE
 
+dnl Library name of zlib suitable for 'dynamic-link'.
+GUIX_LIBZ_LIBDIR([libz_libdir])
+if test "x$libz_libdir" = "x"; then
+  LIBZ="libz"
+else
+  LIBZ="$libz_libdir/libz"
+fi
+AC_MSG_CHECKING([for zlib's shared library name])
+AC_MSG_RESULT([$LIBZ])
+AC_SUBST([LIBZ])
+
 AC_CACHE_SAVE
 
 m4_include([config-daemon.ac])
diff --git a/doc/guix.texi b/doc/guix.texi
index 7204f2e939..318e6cb5d9 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -17,6 +17,7 @@ Copyright @copyright{} 2015, 2016 Mathieu Lirzin@*
 Copyright @copyright{} 2014 Pierre-Antoine Rault@*
 Copyright @copyright{} 2015 Taylan Ulrich Bayırlı/Kammer@*
 Copyright @copyright{} 2015, 2016 Leo Famulari@*
+Copyright @copyright{} 2015, 2016 Ricardo Wurmus@*
 Copyright @copyright{} 2016 Ben Woodcroft@*
 Copyright @copyright{} 2016 Chris Marusich@*
 Copyright @copyright{} 2016 Efraim Flashner
@@ -546,6 +547,10 @@ Installing
 allow you to use the @command{guix import pypi} command (@pxref{Invoking
 guix import}).  It is of
 interest primarily for developers and not for casual users.
+
+@item
+When @url{http://zlib.net, zlib} is available, @command{guix publish}
+can compress build byproducts (@pxref{Invoking guix publish}).
 @end itemize
 
 Unless @code{--disable-daemon} was passed to @command{configure}, the
@@ -2669,6 +2674,7 @@ Examples include:
 download a file from the HTTP, HTTPS, or FTP URL specified in the
 @code{uri} field;
 
+@vindex git-fetch
 @item @var{git-fetch} from @code{(guix git-download)}
 clone the Git version control repository, and check out the revision
 specified in the @code{uri} field as a @code{git-reference} object; a
@@ -2686,6 +2692,10 @@ A bytevector containing the SHA-256 hash of the source.  Typically the
 @code{base32} form is used here to generate the bytevector from a
 base-32 string.
 
+You can obtain this information using @code{guix download}
+(@pxref{Invoking guix download}) or @code{guix hash} (@pxref{Invoking
+guix hash}).
+
 @item @code{file-name} (default: @code{#f})
 The file name under which the source code should be saved.  When this is
 @code{#f}, a sensible default value will be used in most cases.  In case
@@ -2697,8 +2707,9 @@ file name explicitly because the default is not very descriptive.
 A list of file names containing patches to be applied to the source.
 
 @item @code{snippet} (default: @code{#f})
-A quoted piece of code that will be run in the source directory to make
-any modifications, which is sometimes more convenient than a patch.
+A G-expression (@pxref{G-Expressions}) or S-expression that will be run
+in the source directory.  This is a convenient way to modify the source,
+sometimes more convenient than a patch.
 
 @item @code{patch-flags} (default: @code{'("-p1")})
 A list of command-line flags that should be passed to the @code{patch}
@@ -2713,10 +2724,6 @@ such as GNU@tie{}Patch.
 A list of Guile modules that should be loaded during the patching
 process and while running the code in the @code{snippet} field.
 
-@item @code{imported-modules} (default: @code{'()})
-The list of Guile modules to import in the patch derivation, for use by
-the @code{snippet}.
-
 @item @code{patch-guile} (default: @code{#f})
 The Guile package that should be used in the patching process.  When
 this is @code{#f}, a sensible default is used.
@@ -3697,6 +3704,30 @@ In the example above, the native build of @var{coreutils} is used, so
 that @command{ln} can actually run on the host; but then the
 cross-compiled build of @var{emacs} is referenced.
 
+@cindex imported modules, for gexps
+@findex with-imported-modules
+Another gexp feature is @dfn{imported modules}: sometimes you want to be
+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
+(let ((build (with-imported-modules '((guix build utils))
+               #~(begin
+                   (use-modules (guix build utils))
+                   (mkdir-p (string-append #$output "/bin"))))))
+  (gexp->derivation "empty-dir"
+                    #~(begin
+                        #$build
+                        (display "success!\n")
+                        #t)))
+@end example
+
+@noindent
+In this example, the @code{(guix build utils)} module is automatically
+pulled into the isolated build environment of our gexp, such that
+@code{(use-modules (guix build utils))} works as expected.
+
 The syntactic form to construct gexps is summarized below.
 
 @deffn {Scheme Syntax} #~@var{exp}
@@ -3756,6 +3787,16 @@ G-expressions created by @code{gexp} or @code{#~} are run-time objects
 of the @code{gexp?} type (see below.)
 @end deffn
 
+@deffn {Scheme Syntax} with-imported-modules @var{modules} @var{body}@dots{}
+Mark the gexps defined in @var{body}@dots{} as requiring @var{modules}
+in their execution environment.  @var{modules} must be a list of Guile
+module names, such as @code{'((guix build utils) (guix build gremlin))}.
+
+This form has @emph{lexical} scope: it has an effect on the gexps
+directly defined in @var{body}@dots{}, but not on those defined, say, in
+procedures called from @var{body}@dots{}.
+@end deffn
+
 @deffn {Scheme Procedure} gexp? @var{obj}
 Return @code{#t} if @var{obj} is a G-expression.
 @end deffn
@@ -3781,7 +3822,9 @@ stored in a file called @var{script-name}.  When @var{target} is true,
 it is used as the cross-compilation target triplet for packages referred
 to by @var{exp}.
 
-Make @var{modules} available in the evaluation context of @var{exp};
+@var{modules} is deprecated in favor of @code{with-imported-modules}.
+Its meaning is to
+make @var{modules} available in the evaluation context of @var{exp};
 @var{modules} is a list of names of Guile modules searched in
 @var{module-path} to be copied in the store, compiled, and made available in
 the load path during the execution of @var{exp}---e.g., @code{((guix
@@ -3862,10 +3905,9 @@ This is the declarative counterpart of @code{text-file}.
 @end deffn
 
 @deffn {Scheme Procedure} computed-file @var{name} @var{gexp} @
-          [#:modules '()] [#:options '(#:local-build? #t)]
+          [#:options '(#:local-build? #t)]
 Return an object representing the store item @var{name}, a file or
-directory computed by @var{gexp}.  @var{modules} specifies the set of
-modules visible in the execution context of @var{gexp}.  @var{options}
+directory computed by @var{gexp}.  @var{options}
 is a list of additional arguments to pass to @code{gexp->derivation}.
 
 This is the declarative counterpart of @code{gexp->derivation}.
@@ -3873,7 +3915,7 @@ This is the declarative counterpart of @code{gexp->derivation}.
 
 @deffn {Monadic Procedure} gexp->script @var{name} @var{exp}
 Return an executable script @var{name} that runs @var{exp} using
-@var{guile} with @var{modules} in its search path.
+@var{guile}, with @var{exp}'s imported modules in its search path.
 
 The example below builds a script that simply invokes the @command{ls}
 command:
@@ -3899,16 +3941,20 @@ executable file @file{/gnu/store/@dots{}-list-files} along these lines:
 @end deffn
 
 @deffn {Scheme Procedure} program-file @var{name} @var{exp} @
-          [#:modules '()] [#:guile #f]
+          [#:guile #f]
 Return an object representing the executable store item @var{name} that
 runs @var{gexp}.  @var{guile} is the Guile package used to execute that
-script, and @var{modules} is the list of modules visible to that script.
+script.
 
 This is the declarative counterpart of @code{gexp->script}.
 @end deffn
 
-@deffn {Monadic Procedure} gexp->file @var{name} @var{exp}
+@deffn {Monadic Procedure} gexp->file @var{name} @var{exp} @
+            [#:set-load-path? #t]
 Return a derivation that builds a file @var{name} containing @var{exp}.
+When @var{set-load-path?} is true, emit code in the resulting file to
+set @code{%load-path} and @code{%load-compiled-path} to honor
+@var{exp}'s imported modules.
 
 The resulting file holds references to all the dependencies of @var{exp}
 or a subset thereof.
@@ -4533,6 +4579,17 @@ hash (@pxref{Invoking guix archive}).
 @c FIXME: Replace xref above with xref to an ``Archive'' section when
 @c it exists.
 
+@vindex git-fetch
+As an example, here is how you would compute the hash of a Git checkout,
+which is useful when using the @code{git-fetch} method (@pxref{origin
+Reference}):
+
+@example
+$ git clone http://example.org/foo.git
+$ cd foo
+$ rm -rf .git
+$ guix hash -r .
+@end example
 @end table
 
 @node Invoking guix import
@@ -5592,6 +5649,18 @@ accept connections from any interface.
 Change privileges to @var{user} as soon as possible---i.e., once the
 server socket is open and the signing key has been read.
 
+@item --compression[=@var{level}]
+@itemx -C [@var{level}]
+Compress data using the given @var{level}.  When @var{level} is zero,
+disable compression.  The range 1 to 9 corresponds to different gzip
+compression levels: 1 is the fastest, and 9 is the best (CPU-intensive).
+The default is 3.
+
+Compression occurs on the fly and the compressed streams are not
+cached.  Thus, to reduce load on the machine that runs @command{guix
+publish}, it may be a good idea to choose a low compression level, or to
+run @command{guix publish} behind a caching proxy.
+
 @item --ttl=@var{ttl}
 Produce @code{Cache-Control} HTTP headers that advertise a time-to-live
 (TTL) of @var{ttl}.  @var{ttl} must denote a duration: @code{5d} means 5
@@ -7494,6 +7563,41 @@ created by @command{guix archive --generate-key} (@pxref{Invoking guix
 archive}).  If that is not the case, the service will fail to start.
 @end deffn
 
+@anchor{rngd-service}
+@deffn {Scheme Procedure} rngd-service [#:rng-tools @var{rng-tools}] @
+            [#:device "/dev/hwrng"]
+Return a service that runs the @command{rngd} program from @var{rng-tools}
+to add @var{device} to the kernel's entropy pool.  The service will fail if
+@var{device} does not exist.
+@end deffn
+
+@anchor{pam-limits-service}
+@cindex session limits
+@cindex ulimit
+@cindex priority
+@deffn {Scheme Procedure} pam-limits-service [#:limits @var{limits}]
+
+Return a service that installs a configuration file for the
+@uref{http://linux-pam.org/Linux-PAM-html/sag-pam_limits.html,
+@code{pam_limits} module}.  The procedure optionally takes a list of
+@code{pam-limits-entry} values, which can be used to specify
+@code{ulimit} limits and nice priority limits to user sessions.
+
+The following limits definition sets two hard and soft limits for all
+login sessions of users in the @code{realtime} group:
+
+@example
+(pam-limits-service
+ (list
+  (pam-limits-entry "@@realtime" 'both 'rtprio 99)
+  (pam-limits-entry "@@realtime" 'both 'memlock 'unlimited)))
+@end example
+
+The first entry increases the maximum realtime priority for
+non-privileged processes; the second entry lifts any restriction of the
+maximum address space that can be locked in memory.  These settings are
+commonly used for real-time audio systems.
+@end deffn
 
 @node Scheduled Job Execution
 @subsubsection Scheduled Job Execution
@@ -7602,7 +7706,7 @@ Protocol (DHCP) client, on all the non-loopback network interfaces.
 @end deffn
 
 @deffn {Scheme Procedure} static-networking-service @var{interface} @var{ip} @
-       [#:gateway #f] [#:name-services @code{'()}]
+       [#:gateway #f] [#:name-servers @code{'()}]
 Return a service that starts @var{interface} with address @var{ip}.  If
 @var{gateway} is true, it must be a string specifying the default network
 gateway.
@@ -7695,7 +7799,7 @@ In addition, @var{extra-settings} specifies a string to append to the
 configuration file.
 @end deffn
 
-Furthermore, @code{(gnu services ssh)} provides the following service.
+Furthermore, @code{(gnu services ssh)} provides the following services.
 
 @deffn {Scheme Procedure} lsh-service [#:host-key "/etc/lsh/host-key"] @
        [#:daemonic? #t] [#:interfaces '()] [#:port-number 22] @
@@ -7733,6 +7837,47 @@ root.
 The other options should be self-descriptive.
 @end deffn
 
+@deffn {Scheme Procedure} dropbear-service [@var{config}]
+Run the @uref{https://matt.ucc.asn.au/dropbear/dropbear.html,Dropbear SSH
+daemon} with the given @var{config}, a @code{<dropbear-configuration>}
+object.
+
+For example, to specify a Dropbear service listening on port 1234, add
+this call to the operating system's @code{services} field:
+
+@example
+(dropbear-service (dropbear-configuration
+                    (port-number 1234)))
+@end example
+@end deffn
+
+@deftp {Data Type} dropbear-configuration
+This data type represents the configuration of a Dropbear SSH daemon.
+
+@table @asis
+@item @code{dropbear} (default: @var{dropbear})
+The Dropbear package to use.
+
+@item @code{port-number} (default: 22)
+The TCP port where the daemon waits for incoming connections.
+
+@item @code{syslog-output?} (default: @code{#t})
+Whether to enable syslog output.
+
+@item @code{pid-file} (default: @code{"/var/run/dropbear.pid"})
+File name of the daemon's PID file.
+
+@item @code{root-login?} (default: @code{#f})
+Whether to allow @code{root} logins.
+
+@item @code{allow-empty-passwords?} (default: @code{#f})
+Whether to allow empty passwords.
+
+@item @code{password-authentication?} (default: @code{#t})
+Whether to enable password-based authentication.
+@end table
+@end deftp
+
 @defvr {Scheme Variable} %facebook-host-aliases
 This variable contains a string for use in @file{/etc/hosts}
 (@pxref{Host Names,,, libc, The GNU C Library Reference Manual}).  Each
@@ -7767,7 +7912,7 @@ The @code{(gnu services avahi)} provides the following definition.
 @deffn {Scheme Procedure} avahi-service [#:avahi @var{avahi}] @
           [#:host-name #f] [#:publish? #t] [#:ipv4? #t] @
           [#:ipv6? #t] [#:wide-area? #f] @
-          [#:domains-to-browse '()]
+          [#:domains-to-browse '()] [#:debug? #f]
 Return a service that runs @command{avahi-daemon}, a system-wide
 mDNS/DNS-SD responder that allows for service discovery and
 "zero-configuration" host name lookups (see @uref{http://avahi.org/}), and
@@ -9973,15 +10118,11 @@ program.  That gives a lot of flexibility.  The
 program to run in that initrd.
 
 @deffn {Monadic Procedure} expression->initrd @var{exp} @
-       [#:guile %guile-static-stripped] [#:name "guile-initrd"] @
-       [#:modules '()]
+       [#:guile %guile-static-stripped] [#:name "guile-initrd"]
 Return a derivation that builds a Linux initrd (a gzipped cpio archive)
 containing @var{guile} and that evaluates @var{exp}, a G-expression,
 upon booting.  All the derivations referenced by @var{exp} are
 automatically copied to the initrd.
-
-@var{modules} is a list of Guile module names to be embedded in the
-initrd.
 @end deffn
 
 @node GRUB Configuration
@@ -10805,10 +10946,6 @@ where @var{service-name} is one of the symbols in @var{provision}
 This is the list of modules that must be in scope when @code{start} and
 @code{stop} are evaluated.
 
-@item @code{imported-modules} (default: @var{%default-imported-modules})
-This is the list of modules to import in the execution environment of
-the Shepherd.
-
 @end table
 @end deftp
 
diff --git a/emacs/guix-devel.el b/emacs/guix-devel.el
index ee8371ce81..b71670cdfb 100644
--- a/emacs/guix-devel.el
+++ b/emacs/guix-devel.el
@@ -216,6 +216,7 @@ to find 'modify-phases' keywords."
     "with-derivation-substitute"
     "with-directory-excursion"
     "with-error-handling"
+    "with-imported-modules"
     "with-monad"
     "with-mutex"
     "with-store"))
@@ -306,6 +307,7 @@ Each rule should have a form (SYMBOL VALUE).  See `put' for details."
   (with-derivation-substitute 2)
   (with-directory-excursion 1)
   (with-error-handling 0)
+  (with-imported-modules 1)
   (with-monad 1)
   (with-mutex 1)
   (with-store 1)
diff --git a/etc/guix-daemon.service.in b/etc/guix-daemon.service.in
index fc7c811db6..ab0ce090c3 100644
--- a/etc/guix-daemon.service.in
+++ b/etc/guix-daemon.service.in
@@ -7,6 +7,7 @@ Description=Build daemon for GNU Guix
 
 [Service]
 ExecStart=@bindir@/guix-daemon --build-users-group=guixbuild
+Environment=GUIX_LOCPATH=/root/.guix-profile/lib/locale
 RemainAfterExit=yes
 StandardOutput=syslog
 StandardError=syslog
diff --git a/gnu/local.mk b/gnu/local.mk
index ce4cdf65c1..29e1e84ae0 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -150,6 +150,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/packages/gnustep.scm			\
   %D%/packages/gnuzilla.scm			\
   %D%/packages/gnu-pw-mgr.scm			\
+  %D%/packages/golang.scm			\
   %D%/packages/gperf.scm			\
   %D%/packages/gprolog.scm			\
   %D%/packages/gps.scm				\
@@ -214,7 +215,6 @@ GNU_SYSTEM_MODULES =				\
   %D%/packages/llvm.scm				\
   %D%/packages/lout.scm				\
   %D%/packages/logging.scm			\
-  %D%/packages/lsh.scm				\
   %D%/packages/lsof.scm				\
   %D%/packages/lua.scm				\
   %D%/packages/lxde.scm				\
@@ -441,7 +441,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/automake-test-gzip-warning.patch		\
   %D%/packages/patches/avahi-localstatedir.patch		\
   %D%/packages/patches/avidemux-install-to-lib.patch		\
-  %D%/packages/patches/avrdude-fix-libusb.patch			\
   %D%/packages/patches/awesome-reproducible-png.patch		\
   %D%/packages/patches/bash-completion-directories.patch	\
   %D%/packages/patches/beets-image-test-failure.patch		\
@@ -454,6 +453,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/cdparanoia-fpic.patch			\
   %D%/packages/patches/chmlib-inttypes.patch			\
   %D%/packages/patches/clang-libc-search-path.patch		\
+  %D%/packages/patches/clang-3.8-libc-search-path.patch		\
   %D%/packages/patches/clucene-pkgconfig.patch			\
   %D%/packages/patches/cmake-fix-tests.patch			\
   %D%/packages/patches/cpio-gets-undeclared.patch		\
@@ -511,10 +511,16 @@ dist_patch_DATA =						\
   %D%/packages/patches/gcc-cross-environment-variables.patch	\
   %D%/packages/patches/gcc-libvtv-runpath.patch			\
   %D%/packages/patches/gcc-5.0-libvtv-runpath.patch		\
+  %D%/packages/patches/gd-CVE-2016-5766.patch			\
+  %D%/packages/patches/gd-CVE-2016-6128.patch			\
+  %D%/packages/patches/gd-CVE-2016-6132.patch			\
+  %D%/packages/patches/gd-CVE-2016-6214.patch			\
+  %D%/packages/patches/gd-fix-test-on-i686.patch		\
   %D%/packages/patches/gegl-CVE-2012-4433.patch			\
   %D%/packages/patches/geoclue-config.patch			\
   %D%/packages/patches/ghostscript-CVE-2015-3228.patch		\
   %D%/packages/patches/ghostscript-runpath.patch		\
+  %D%/packages/patches/gimp-CVE-2016-4994.patch			\
   %D%/packages/patches/glib-networking-ssl-cert-file.patch	\
   %D%/packages/patches/glib-tests-timer.patch			\
   %D%/packages/patches/glibc-bootstrap-system.patch		\
@@ -590,6 +596,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/jasper-CVE-2016-2089.patch		\
   %D%/packages/patches/jasper-CVE-2016-2116.patch		\
   %D%/packages/patches/jbig2dec-ignore-testtest.patch		\
+  %D%/packages/patches/khmer-use-libraries.patch                \
   %D%/packages/patches/kmod-module-directory.patch		\
   %D%/packages/patches/ldc-disable-tests.patch			\
   %D%/packages/patches/lftp-dont-save-unknown-host-fingerprint.patch \
@@ -603,7 +610,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/libdrm-symbol-check.patch		\
   %D%/packages/patches/libevent-dns-tests.patch			\
   %D%/packages/patches/libextractor-ffmpeg-3.patch		\
-  %D%/packages/patches/libmtp-devices.patch			\
   %D%/packages/patches/liboop-mips64-deplibs-fix.patch		\
   %D%/packages/patches/libotr-test-auth-fix.patch		\
   %D%/packages/patches/liblxqt-include.patch			\
@@ -673,7 +679,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/ocaml-CVE-2015-8869.patch		\
   %D%/packages/patches/ocaml-findlib-make-install.patch	\
   %D%/packages/patches/openexr-missing-samples.patch		\
-  %D%/packages/patches/openimageio-boost-1.60.patch		\
   %D%/packages/patches/openjpeg-CVE-2015-6581.patch		\
   %D%/packages/patches/openjpeg-use-after-free-fix.patch	\
   %D%/packages/patches/openssh-CVE-2015-8325.patch		\
@@ -729,6 +734,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/python-2.7-source-date-epoch.patch	\
   %D%/packages/patches/python-3-deterministic-build-info.patch	\
   %D%/packages/patches/python-3-search-paths.patch		\
+  %D%/packages/patches/python-dendropy-exclude-failing-tests.patch \
   %D%/packages/patches/python-disable-ssl-test.patch		\
   %D%/packages/patches/python-fix-tests.patch			\
   %D%/packages/patches/python-ipython-inputhook-ctype.patch	\
@@ -760,7 +766,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/slim-sigusr1.patch			\
   %D%/packages/patches/slurm-configure-remove-nonfree-contribs.patch \
   %D%/packages/patches/soprano-find-clucene.patch		\
-  %D%/packages/patches/sudo-CVE-2015-5602.patch			\
   %D%/packages/patches/superlu-dist-scotchmetis.patch		\
   %D%/packages/patches/synfig-build-fix.patch			\
   %D%/packages/patches/t1lib-CVE-2010-2642.patch		\
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index 415a35aab3..1d08be9e13 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -11,6 +11,7 @@
 ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Peter Feigl <peter.feigl@nexoid.at>
+;;; Copyright © 2016 John J. Foerch <jjfoerch@earthlink.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -789,18 +790,17 @@ system administrator.")
 (define-public sudo
   (package
     (name "sudo")
-    (version "1.8.15")
+    (version "1.8.17p1")
     (source (origin
               (method url-fetch)
               (uri
-               (list (string-append "http://www.sudo.ws/sudo/dist/sudo-"
+               (list (string-append "https://www.sudo.ws/sudo/dist/sudo-"
                                     version ".tar.gz")
                      (string-append "ftp://ftp.sudo.ws/pub/sudo/OLD/sudo-"
                                     version ".tar.gz")))
               (sha256
                (base32
-                "0263gi6i19fyzzc488n0qw3m518i39f6a7qmrfvahk9j10bkh5j3"))
-              (patches (search-patches "sudo-CVE-2015-5602.patch"))))
+                "1k2mn65l1kmsxm8wh0gjxy496xhbpiimbpm6yv6kw6snzc3xg466"))))
     (build-system gnu-build-system)
     (arguments
      `(#:configure-flags
@@ -849,7 +849,7 @@ system administrator.")
      `(("groff" ,groff)
        ("linux-pam" ,linux-pam)
        ("coreutils" ,coreutils)))
-    (home-page "http://www.sudo.ws/")
+    (home-page "https://www.sudo.ws/")
     (synopsis "Run commands as root")
     (description
      "Sudo (su \"do\") allows a system administrator to delegate authority to
@@ -1139,19 +1139,20 @@ characters can be replaced as well, as can UTF-8 characters.")
 (define-public testdisk
   (package
     (name "testdisk")
-    (version "6.14")
+    (version "7.0")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://www.cgsecurity.org/testdisk-"
                                   version ".tar.bz2"))
               (sha256
                (base32
-                "0v1jap83f5h99zv01v3qmqm160d36n4ysi0gyq7xzb3mqgmw75x5"))))
+                "0ba4wfz2qrf60vwvb1qsq9l6j0pgg81qgf7fh22siaz649mkpfq0"))))
     (build-system gnu-build-system)
     (inputs
-     `(;; ("ntfs" ,ntfs)
+     `(("ntfs-3g" ,ntfs-3g)
        ("util-linux" ,util-linux)
        ("openssl" ,openssl)
+       ;; FIXME: add reiserfs
        ("zlib" ,zlib)
        ("e2fsprogs" ,e2fsprogs)
        ("libjpeg" ,libjpeg)
@@ -1345,17 +1346,14 @@ of supported upstream metrics systems simultaneously.")
 (define-public ansible
   (package
     (name "ansible")
-    (version "1.9.2")
+    (version "2.1.0.0")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append
-             "https://pypi.python.org/packages/source/a/ansible/ansible-"
-             version
-             ".tar.gz"))
+       (uri (pypi-uri "ansible" version))
        (sha256
         (base32
-         "007fzgsqaahb0y4gjdxxmir9kcni7wph2z14jhqgpz88idrz8pn2"))))
+         "1bfc2xiplpad6f2nwi48y0kps7xqnsll85dlz63cy8k5bysl6d20"))))
     (build-system python-build-system)
     (native-inputs
      `(("python2-setuptools" ,python2-setuptools)
@@ -1708,3 +1706,34 @@ throughput (in the same interval).")
      "The Fuck tries to match a rule for a previous, mistyped command, creates
 a new command using the matched rule, and runs it.")
     (license license:x11)))
+
+(define-public di
+  (package
+    (name "di")
+    (version "4.42")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://gentoo.com/di/di-" version ".tar.gz"))
+       (sha256
+        (base32 "1i6m9zdnidn8268q1lz9fd8payk7s4pgwh5zlam9rr4dy6h6a67n"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f ; Obscure test failures.
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure)
+         (add-before 'build 'setup-environment
+           (lambda* (#:key outputs #:allow-other-keys)
+             (setenv "CC" "gcc")
+             (setenv "prefix" (assoc-ref outputs "out"))
+             #t)))
+       #:make-flags (list "--environment-overrides")))
+    (home-page "https://www.gentoo.com/di/")
+    (synopsis "Advanced df like disk information utility")
+    (description
+     "'di' is a disk information utility, displaying everything
+(and more) that your @code{df} command does.  It features the ability to
+display your disk usage in whatever format you prefer.  It is designed to be
+highly portable.  Great for heterogenous networks.")
+    (license license:zlib)))
diff --git a/gnu/packages/algebra.scm b/gnu/packages/algebra.scm
index b0ffd7009b..92b4d4c27e 100644
--- a/gnu/packages/algebra.scm
+++ b/gnu/packages/algebra.scm
@@ -202,7 +202,7 @@ GP2C, the GP to C compiler, translates GP scripts to PARI programs.")
 (define-public giac-xcas
   (package
     (name "giac-xcas")
-    (version "1.2.2-59")
+    (version "1.2.2-75")
     (source (origin
               (method url-fetch)
               ;; "~parisse/giac" is not used because the maintainer regularly
@@ -214,7 +214,7 @@ GP2C, the GP to C compiler, translates GP scripts to PARI programs.")
                                   "source/giac_" version ".tar.gz"))
               (sha256
                (base32
-                "02s774v2zg2ya43rm8s7bcwzrmp4wlmn8h2rlg4816zpfrjkrdn4"))))
+                "0vs111fkd900wkm7yypaxmplc8i8j63d9shc3fbdhddn7cdj70b1"))))
     (build-system gnu-build-system)
     (arguments
      `(#:phases
diff --git a/gnu/packages/backup.scm b/gnu/packages/backup.scm
index eb36238b44..956ead4d5a 100644
--- a/gnu/packages/backup.scm
+++ b/gnu/packages/backup.scm
@@ -407,17 +407,14 @@ detection, and lossless compression.")
 (define-public borg
   (package
     (name "borg")
-    (version "1.0.3")
+    (version "1.0.6")
     (source (origin
               (method url-fetch)
-              (uri (string-append
-                     "https://pypi.python.org/packages/"
-                     "c9/c6/1efc338724b054d4d264dfeadfcba11cefa6c3c50f474cec91b8f0c21d3a"
-                     "/borgbackup-" version ".tar.gz"))
+              (uri (pypi-uri "borgbackup" version))
 
               (sha256
                (base32
-                "0kzr0xa00yjfxx27aipli67qg5ffj52yrnqhpf3sdy6k5wzwaybs"))))
+                "1dxn9p4xm0zd32xzzd9hs4a542db34clykrrnnv3hrdnc394895p"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
diff --git a/gnu/packages/bioinformatics.scm b/gnu/packages/bioinformatics.scm
index f5e7285193..1cbf85ff6c 100644
--- a/gnu/packages/bioinformatics.scm
+++ b/gnu/packages/bioinformatics.scm
@@ -27,6 +27,7 @@
   #:use-module (guix utils)
   #:use-module (guix download)
   #:use-module (guix git-download)
+  #:use-module (guix hg-download)
   #:use-module (guix build-system ant)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system cmake)
@@ -49,18 +50,23 @@
   #:use-module (gnu packages file)
   #:use-module (gnu packages gawk)
   #:use-module (gnu packages gcc)
+  #:use-module (gnu packages gd)
+  #:use-module (gnu packages image)
   #:use-module (gnu packages java)
   #:use-module (gnu packages linux)
+  #:use-module (gnu packages logging)
   #:use-module (gnu packages machine-learning)
   #:use-module (gnu packages maths)
   #:use-module (gnu packages mpi)
   #:use-module (gnu packages ncurses)
   #:use-module (gnu packages pcre)
+  #:use-module (gnu packages pdf)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages popt)
   #:use-module (gnu packages protobuf)
   #:use-module (gnu packages python)
+  #:use-module (gnu packages readline)
   #:use-module (gnu packages ruby)
   #:use-module (gnu packages statistics)
   #:use-module (gnu packages tbb)
@@ -70,6 +76,7 @@
   #:use-module (gnu packages vim)
   #:use-module (gnu packages web)
   #:use-module (gnu packages xml)
+  #:use-module (gnu packages xorg)
   #:use-module (gnu packages zip)
   #:use-module (srfi srfi-1))
 
@@ -215,7 +222,7 @@ computational cluster.")
 (define-public bedtools
   (package
     (name "bedtools")
-    (version "2.25.0")
+    (version "2.26.0")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/arq5x/bedtools2/archive/v"
@@ -223,7 +230,7 @@ computational cluster.")
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "1ywcy3yfwzhl905b51l0ffjia55h75vv3mw5xkvib04pp6pj548m"))))
+                "0xvri5hnp2iim1cx6mcd5d9f102p5ql41x69rd6106x1c17pinqm"))))
     (build-system gnu-build-system)
     (native-inputs `(("python" ,python-2)))
     (inputs `(("samtools" ,samtools)
@@ -251,6 +258,51 @@ intervals from multiple files in widely-used genomic file formats such as BAM,
 BED, GFF/GTF, VCF.")
     (license license:gpl2)))
 
+;; Later releases of bedtools produce files with more columns than
+;; what Ribotaper expects.
+(define-public bedtools-2.18
+  (package (inherit bedtools)
+    (name "bedtools")
+    (version "2.18.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/arq5x/bedtools2/"
+                                  "archive/v" version ".tar.gz"))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "05vrnr8yp7swfagshzpgqmzk1blnwnq8pq5pckzi1m26w98d63vf"))))))
+
+(define-public ribotaper
+  (package
+    (name "ribotaper")
+    (version "1.3.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://ohlerlab.mdc-berlin.de/"
+                                  "files/RiboTaper/RiboTaper_Version_"
+                                  version ".tar.gz"))
+              (sha256
+               (base32
+                "0ykjbps1y3z3085q94npw8i9x5gldc6shy8vlc08v76zljsm07hv"))))
+    (build-system gnu-build-system)
+    (inputs
+     `(("bedtools" ,bedtools-2.18)
+       ("samtools" ,samtools-0.1)
+       ("r" ,r)
+       ("r-foreach" ,r-foreach)
+       ("r-xnomial" ,r-xnomial)
+       ("r-domc" ,r-domc)
+       ("r-multitaper" ,r-multitaper)
+       ("r-seqinr" ,r-seqinr)))
+    (home-page "https://ohlerlab.mdc-berlin.de/software/RiboTaper_126/")
+    (synopsis "Define translated ORFs using ribosome profiling data")
+    (description
+     "Ribotaper is a method for defining translated @dfn{open reading
+frames} (ORFs) using ribosome profiling (ribo-seq) data.  This package
+provides the Ribotaper pipeline.")
+    (license license:gpl3+)))
+
 (define-public bioawk
   (package
     (name "bioawk")
@@ -421,7 +473,7 @@ into separate processes; and more.")
 (define-public blast+
   (package
     (name "blast+")
-    (version "2.2.31")
+    (version "2.4.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -429,7 +481,7 @@ into separate processes; and more.")
                     version "/ncbi-blast-" version "+-src.tar.gz"))
               (sha256
                (base32
-                "19gq6as4k1jrgsd26158ads6h7v4jca3h4r5dzg1y0m6ya50x5ph"))
+                "14n9jik6vhiwjd3m7bach4xj1pzfn0szbsbyfxybd9l9cc43b6mb"))
               (modules '((guix build utils)))
               (snippet
                '(begin
@@ -1439,6 +1491,40 @@ accessing bigWig files.")
       (native-inputs
        `(("python-setuptools" ,python2-setuptools))))))
 
+(define-public python-dendropy
+  (package
+    (name "python-dendropy")
+    (version "4.1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "DendroPy" version))
+       (sha256
+        (base32
+         "1jfz7gp18wph311w1yygbvjanb3n5mdqal439bb6myw41dwb5m63"))
+       ;; There are two known test failures that will be fixed in the next
+       ;; release after 4.1.0.
+       ;; https://github.com/jeetsukumaran/DendroPy/issues/48
+       (patches (search-patches
+                 "python-dendropy-exclude-failing-tests.patch"))))
+    (build-system python-build-system)
+    (home-page "http://packages.python.org/DendroPy/")
+    (synopsis "Library for phylogenetics and phylogenetic computing")
+    (description
+     "DendroPy is a library for phylogenetics and phylogenetic computing: reading,
+writing, simulation, processing and manipulation of phylogenetic
+trees (phylogenies) and characters.")
+    (license license:bsd-3)
+    (properties `((python2-variant . ,(delay python2-dendropy))))))
+
+(define-public python2-dendropy
+  (let ((base (package-with-python2 (strip-python2-variant python-dendropy))))
+    (package
+      (inherit base)
+      (native-inputs `(("python2-setuptools" ,python2-setuptools)
+                       ,@(package-native-inputs base))))))
+
+
 (define-public deeptools
   (package
     (name "deeptools")
@@ -1482,7 +1568,7 @@ identify enrichments with functional annotations of the genome.")
 (define-public diamond
   (package
     (name "diamond")
-    (version "0.8.7")
+    (version "0.8.15")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1491,7 +1577,7 @@ identify enrichments with functional annotations of the genome.")
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "15r7gcrqc4pv5d4kvv530zc3xnni92c74y63zrxzidriss7591yx"))))
+                "14n0p28b4i5j8vvz1fl4xj1gxnpg98bj0kr3i90mhn7miwr4pkpw"))))
     (build-system cmake-build-system)
     (arguments
      '(#:tests? #f ; no "check" target
@@ -1517,6 +1603,75 @@ data and settings.")
     (license (license:non-copyleft "file://src/COPYING"
                                    "See src/COPYING in the distribution."))))
 
+(define-public eigensoft
+  (let ((revision "1")
+        (commit "b14d1e202e21e532536ff8004f0419cd5e259dc7"))
+    (package
+      (name "eigensoft")
+      (version (string-append "6.1.2-"
+                              revision "."
+                              (string-take commit 9)))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/DReichLab/EIG.git")
+               (commit commit)))
+         (file-name (string-append "eigensoft-" commit "-checkout"))
+         (sha256
+          (base32
+           "0f5m6k2j5c16xc3xbywcs989xyc26ncy1zfzp9j9n55n9r4xcaiq"))
+         (modules '((guix build utils)))
+         ;; Remove pre-built binaries.
+         (snippet '(begin
+                     (delete-file-recursively "bin")
+                     (mkdir "bin")
+                     #t))))
+      (build-system gnu-build-system)
+      (arguments
+       `(#:tests? #f                    ; There are no tests.
+         #:make-flags '("CC=gcc")
+         #:phases
+         (modify-phases %standard-phases
+           ;; There is no configure phase, but the Makefile is in a
+           ;; sub-directory.
+           (replace 'configure
+             (lambda _
+               (chdir "src")
+               ;; The link flags are incomplete.
+               (substitute* "Makefile"
+                 (("-lgsl") "-lgsl -lm -llapack -llapacke -lpthread"))
+               #t))
+           ;; The provided install target only copies executables to
+           ;; the "bin" directory in the build root.
+           (add-after 'install 'actually-install
+             (lambda* (#:key outputs #:allow-other-keys)
+               (let* ((out (assoc-ref outputs "out"))
+                      (bin  (string-append out "/bin")))
+                 (mkdir-p bin)
+                 (for-each (lambda (file)
+                             (install-file file bin))
+                           (find-files "../bin" ".*"))
+                 #t))))))
+      (inputs
+       `(("gsl" ,gsl)
+         ("lapack" ,lapack)
+         ("openblas" ,openblas)
+         ("perl" ,perl)
+         ("gfortran" ,gfortran "lib")))
+      (home-page "https://github.com/DReichLab/EIG")
+      (synopsis "Tools for population genetics")
+      (description "The EIGENSOFT package provides tools for population
+genetics and stratification correction.  EIGENSOFT implements methods commonly
+used in population genetics analyses such as PCA, computation of Tracy-Widom
+statistics, and finding related individuals in structured populations.  It
+comes with a built-in plotting script and supports multiple file formats and
+quantitative phenotypes.")
+      ;; The license of the eigensoft tools is Expat, but since it's
+      ;; linking with the GNU Scientific Library (GSL) the effective
+      ;; license is the GPL.
+      (license license:gpl3+))))
+
 (define-public edirect
   (package
     (name "edirect")
@@ -2170,7 +2325,7 @@ manipulating HTS data.")
 (define-public htslib
   (package
     (name "htslib")
-    (version "1.2.1")
+    (version "1.3.1")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2178,7 +2333,7 @@ manipulating HTS data.")
                     version "/htslib-" version ".tar.bz2"))
               (sha256
                (base32
-                "1c32ssscbnjwfw3dra140fq7riarp2x990qxybh34nr1p5r17nxx"))))
+                "1rja282fwdc25ql6izkhdyh8ppw8x2fs0w0js78zgkmqjlikmma9"))))
     (build-system gnu-build-system)
     (arguments
      `(#:phases
@@ -2301,6 +2456,87 @@ command, or queried for specific k-mers with @code{jellyfish query}.")
     ;; files such as lib/jsoncpp.cpp are released under the Expat license.
     (license (list license:gpl3+ license:expat))))
 
+(define-public khmer
+  (package
+    (name "khmer")
+    (version "2.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "khmer" version))
+       (sha256
+        (base32
+         "0wb05shqh77v00256qlm68vbbx3kl76fyzihszbz5nhanl4ni33a"))
+       (patches (search-patches "khmer-use-libraries.patch"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'set-paths
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             ;; Delete bundled libraries.
+             (delete-file-recursively "third-party/zlib")
+             (delete-file-recursively "third-party/bzip2")
+             ;; Replace bundled seqan.
+             (let* ((seqan-all "third-party/seqan")
+                    (seqan-include (string-append
+                                    seqan-all "/core/include")))
+               (delete-file-recursively seqan-all)
+               (copy-recursively (string-append (assoc-ref inputs "seqan")
+                                                "/include/seqan")
+                          (string-append seqan-include "/seqan")))
+             ;; We do not replace the bundled MurmurHash as the canonical
+             ;; repository for this code 'SMHasher' is unsuitable for
+             ;; providing a library.  See
+             ;; https://lists.gnu.org/archive/html/guix-devel/2016-06/msg00977.html
+             #t))
+         (add-after 'unpack 'set-cc
+           (lambda _
+             (setenv "CC" "gcc")
+             #t))
+         ;; It is simpler to test after installation.
+         (delete 'check)
+         (add-after 'install 'post-install-check
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (setenv "PATH"
+                       (string-append
+                        (getenv "PATH")
+                        ":"
+                        (assoc-ref outputs "out")
+                        "/bin"))
+               (setenv "PYTHONPATH"
+                       (string-append
+                        (getenv "PYTHONPATH")
+                        ":"
+                        out
+                        "/lib/python"
+                        (string-take (string-take-right
+                                      (assoc-ref inputs "python") 5) 3)
+                        "/site-packages"))
+               (with-directory-excursion "build"
+                 (zero? (system* "nosetests" "khmer" "--attr"
+                                 "!known_failing")))))))))
+    (native-inputs
+     `(("seqan" ,seqan)
+       ("python-nose" ,python-nose)))
+    (inputs
+     `(("zlib" ,zlib)
+       ("bzip2" ,bzip2)
+       ("python-screed" ,python-screed)
+       ("python-bz2file" ,python-bz2file)))
+    (home-page "https://khmer.readthedocs.org/")
+    (synopsis "K-mer counting, filtering and graph traversal library")
+    (description "The khmer software is a set of command-line tools for
+working with DNA shotgun sequencing data from genomes, transcriptomes,
+metagenomes and single cells.  Khmer can make de novo assemblies faster, and
+sometimes better.  Khmer can also identify and fix problems with shotgun
+data.")
+    ;; When building on i686, armhf and mips64el, we get the following error:
+    ;; error: ['khmer', 'khmer.tests', 'oxli'] require 64-bit operating system
+    (supported-systems '("x86_64-linux"))
+    (license license:bsd-3)))
+
 (define-public macs
   (package
     (name "macs")
@@ -2333,7 +2569,7 @@ sequencing tag position and orientation.")
 (define-public mafft
   (package
     (name "mafft")
-    (version "7.267")
+    (version "7.299")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2342,7 +2578,7 @@ sequencing tag position and orientation.")
               (file-name (string-append name "-" version ".tgz"))
               (sha256
                (base32
-                "1xl6xq1rfxkws0svrlhyqxhhwbv6r77jwblsdpcyiwzsscw6wlk0"))))
+                "1pwwdy5a17ggx8h9v9y712ilswj27dc3d23r65l56jgjz67y5zc0"))))
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f ; no automated tests, though there are tests in the read me
@@ -2408,7 +2644,7 @@ sequences).")
 (define-public metabat
   (package
     (name "metabat")
-    (version "0.26.1")
+    (version "0.26.3")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2417,31 +2653,40 @@ sequences).")
               (file-name (string-append name "-" version ".tar.bz2"))
               (sha256
                (base32
-                "0vgrhbaxg4dkxyax2kbigak7w0arhqvw0szwp6gd9wmyilc44kfa"))))
+                "1vpfvgsn8wdsv1g7z73zxcncskx7dy7bw5msg1hhibk25ay11pyg"))))
     (build-system gnu-build-system)
     (arguments
      `(#:phases
        (modify-phases %standard-phases
          (add-after 'unpack 'fix-includes
-                    (lambda _
-                      (substitute* "SConstruct"
-                        (("/include/bam/bam.h")
-                         "/include/samtools/bam.h"))
-                      (substitute* "src/BamUtils.h"
-                        (("^#include \"bam/bam\\.h\"")
-                         "#include \"samtools/bam.h\"")
-                        (("^#include \"bam/sam\\.h\"")
-                         "#include \"samtools/sam.h\""))
-                      (substitute* "src/KseqReader.h"
-                        (("^#include \"bam/kseq\\.h\"")
-                         "#include \"samtools/kseq.h\""))
-                      #t))
+           (lambda _
+             (substitute* "src/BamUtils.h"
+               (("^#include \"bam/bam\\.h\"")
+                "#include \"samtools/bam.h\"")
+               (("^#include \"bam/sam\\.h\"")
+                "#include \"samtools/sam.h\""))
+             (substitute* "src/KseqReader.h"
+               (("^#include \"bam/kseq\\.h\"")
+                "#include \"htslib/kseq.h\""))
+             #t))
          (add-after 'unpack 'fix-scons
-                    (lambda _
-                      (substitute* "SConstruct" ; Do not distribute README
-                        (("^env\\.Install\\(idir_prefix, 'README\\.md'\\)")
-                         ""))
-                      #t))
+            (lambda* (#:key inputs #:allow-other-keys)
+              (substitute* "SConstruct"
+                (("^htslib_dir = 'samtools'")
+                 (string-append "hitslib_dir = '"
+                                (assoc-ref inputs "htslib")
+                                "'"))
+                (("^samtools_dir = 'samtools'")
+                 (string-append "samtools_dir = '"
+                                (assoc-ref inputs "htslib")
+                                "'"))
+                (("^findStaticOrShared\\('bam', hts_lib")
+                 (string-append "findStaticOrShared('bam', '"
+                                (assoc-ref inputs "samtools")
+                                "/lib'"))
+                ;; Do not distribute README.
+                (("^env\\.Install\\(idir_prefix, 'README\\.md'\\)") ""))
+              #t))
          (delete 'configure)
          (replace 'build
                   (lambda* (#:key inputs outputs #:allow-other-keys)
@@ -2451,16 +2696,10 @@ sequences).")
                                      "PREFIX="
                                      (assoc-ref outputs "out"))
                                     (string-append
-                                     "HTSLIB_DIR="
-                                     (assoc-ref inputs "htslib"))
-                                    (string-append
-                                     "SAMTOOLS_DIR="
-                                     (assoc-ref inputs "samtools"))
-                                    (string-append
                                      "BOOST_ROOT="
                                      (assoc-ref inputs "boost"))
                                     "install"))))
-         ;; check and install carried out during build phase
+         ;; Check and install are carried out during build phase.
          (delete 'check)
          (delete 'install))))
     (inputs
@@ -2919,6 +3158,75 @@ while RNA-seq specific modules evaluate sequencing saturation, mapped reads
 distribution, coverage uniformity, strand specificity, etc.")
     (license license:gpl3+)))
 
+(define-public seek
+  ;; There are no release tarballs.  According to the installation
+  ;; instructions at http://seek.princeton.edu/installation.jsp, the latest
+  ;; stable release is identified by this changeset ID.
+  (let ((changeset "2329130")
+        (revision "1"))
+    (package
+      (name "seek")
+      (version (string-append "0-" revision "." changeset))
+      (source (origin
+                (method hg-fetch)
+                (uri (hg-reference
+                      (url "https://bitbucket.org/libsleipnir/sleipnir")
+                      (changeset changeset)))
+                (sha256
+                 (base32
+                  "0qrvilwh18dpbhkf92qvxbmay0j75ra3jg2wrhz67gf538zzphsx"))))
+      (build-system gnu-build-system)
+      (arguments
+       `(#:modules ((srfi srfi-1)
+                    (guix build gnu-build-system)
+                    (guix build utils))
+         #:phases
+         (let ((dirs '("SeekMiner"
+                       "SeekEvaluator"
+                       "SeekPrep"
+                       "Distancer"
+                       "Data2DB"
+                       "PCL2Bin")))
+           (modify-phases %standard-phases
+             (add-before 'configure 'bootstrap
+               (lambda _
+                 (zero? (system* "bash" "gen_auto"))))
+             (add-after 'build 'build-additional-tools
+               (lambda* (#:key make-flags #:allow-other-keys)
+                 (every (lambda (dir)
+                          (with-directory-excursion (string-append "tools/" dir)
+                            (zero? (apply system* "make" make-flags))))
+                        dirs)))
+             (add-after 'install 'install-additional-tools
+               (lambda* (#:key make-flags #:allow-other-keys)
+                 (fold (lambda (dir result)
+                         (with-directory-excursion (string-append "tools/" dir)
+                           (and result
+                                (zero? (apply system*
+                                              `("make" ,@make-flags "install"))))))
+                       #t dirs)))))))
+      (inputs
+       `(("gsl" ,gsl)
+         ("boost" ,boost)
+         ("libsvm" ,libsvm)
+         ("readline" ,readline)
+         ("gengetopt" ,gengetopt)
+         ("log4cpp" ,log4cpp)))
+      (native-inputs
+       `(("autoconf" ,autoconf)
+         ("automake" ,automake)
+         ("perl" ,perl)))
+      (home-page "http://seek.princeton.edu")
+      (synopsis "Gene co-expression search engine")
+      (description
+       "SEEK is a computational gene co-expression search engine.  SEEK provides
+biologists with a way to navigate the massive human expression compendium that
+now contains thousands of expression datasets.  SEEK returns a robust ranking
+of co-expressed genes in the biological area of interest defined by the user's
+query genes.  It also prioritizes thousands of expression datasets according
+to the user's query of interest.")
+      (license license:cc-by3.0))))
+
 (define-public samtools
   (package
     (name "samtools")
@@ -3359,6 +3667,44 @@ optimize the sequencing depth, or to screen multiple libraries to avoid low
 complexity samples.")
     (license license:gpl3+)))
 
+(define-public python-screed
+  (package
+    (name "python-screed")
+    (version "0.9")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "screed" version))
+       (sha256
+        (base32
+         "18czszp9fkx3j6jr7y5kp6dfialscgddk05mw1zkhh2zhn0jd8i0"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (setenv "PYTHONPATH"
+                     (string-append (getenv "PYTHONPATH") ":."))
+             (zero? (system* "nosetests" "--attr" "!known_failing")))))))
+    (native-inputs
+     `(("python-nose" ,python-nose)))
+    (inputs
+     `(("python-bz2file" ,python-bz2file)))
+    (home-page "http://github.com/dib-lab/screed/")
+    (synopsis "Short read sequence database utilities")
+    (description "Screed parses FASTA and FASTQ files and generates databases.
+Values such as sequence name, sequence description, sequence quality and the
+sequence itself can be retrieved from these databases.")
+    (license license:bsd-3)))
+
+(define-public python2-screed
+  (let ((base (package-with-python2 (strip-python2-variant python-screed))))
+    (package
+      (inherit base)
+      (native-inputs `(("python2-setuptools" ,python2-setuptools)
+                       ,@(package-native-inputs base))))))
+
 (define-public sra-tools
   (package
     (name "sra-tools")
@@ -3600,7 +3946,7 @@ application of SortMeRNA is filtering rRNA from metatranscriptomic data.")
 (define-public star
   (package
     (name "star")
-    (version "2.5.1b")
+    (version "2.5.2a")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/alexdobin/STAR/archive/"
@@ -3608,7 +3954,7 @@ application of SortMeRNA is filtering rRNA from metatranscriptomic data.")
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "0wzcfhkg10apnh0y73xlarfa79xxwxdizicbdl11wb48awk44iq4"))
+                "0xjlsm4p9flln111hv4xx7xy94c2nl53zvdvbk9winmiradjsdra"))
               (modules '((guix build utils)))
               (snippet
                '(begin
@@ -3665,6 +4011,8 @@ by seed clustering and stitching procedure.  In addition to unbiased de novo
 detection of canonical junctions, STAR can discover non-canonical splices and
 chimeric (fusion) transcripts, and is also capable of mapping full-length RNA
 sequences.")
+    ;; Only 64-bit systems are supported according to the README.
+    (supported-systems '("x86_64-linux" "mips64el-linux"))
     ;; STAR is licensed under GPLv3 or later; htslib is MIT-licensed.
     (license license:gpl3+)))
 
@@ -3869,7 +4217,7 @@ data types as well.")
 (define-public vsearch
   (package
     (name "vsearch")
-    (version "2.0.0")
+    (version "2.0.1")
     (source
      (origin
        (method url-fetch)
@@ -3879,7 +4227,7 @@ data types as well.")
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
         (base32
-         "1sd57abgx077icqrbj36jq9q7pdpzc6dbics2pn1555kisq2jhfh"))
+         "0q7szwbf7r29yxkhb415a8i51vj87kvl5ap7h09w7k9ycb2ywvzw"))
        (modules '((guix build utils)))
        (snippet
         '(begin
@@ -4191,6 +4539,30 @@ In addition, a few low-level concrete subclasses of general interest (e.g.
 S4Vectors package itself.")
     (license license:artistic2.0)))
 
+(define-public r-seqinr
+  (package
+    (name "r-seqinr")
+    (version "3.1-3")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (cran-uri "seqinr" version))
+        (sha256
+          (base32
+            "0bbjfwbqg74wsamb3iz01g0ssdpdpg65gh00y9xlnpk4wb990n4n"))))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-ade4" ,r-ade4)))
+    (inputs
+     `(("zlib" ,zlib)))
+    (home-page "http://seqinr.r-forge.r-project.org/")
+    (synopsis "Biological sequences retrieval and analysis")
+    (description
+     "This package provides tools for exploratory data analysis and data
+visualization of biological sequence (DNA and protein) data.  It also includes
+utilities for sequence data management under the ACNUC system.")
+    (license license:gpl2+)))
+
 (define-public r-iranges
   (package
     (name "r-iranges")
@@ -4246,6 +4618,31 @@ translation between different chromosome sequence naming conventions (e.g.,
 names in their natural, rather than lexicographic, order.")
     (license license:artistic2.0)))
 
+(define-public r-edger
+  (package
+    (name "r-edger")
+    (version "3.14.0")
+    (source (origin
+              (method url-fetch)
+              (uri (bioconductor-uri "edgeR" version))
+              (sha256
+               (base32
+                "14vrygy7rz5ngaap4kgkvr3j18y5l6m742n79h68plk6iqgmsskn"))))
+    (properties `((upstream-name . "edgeR")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-limma" ,r-limma)))
+    (home-page "http://bioinf.wehi.edu.au/edgeR")
+    (synopsis "EdgeR does empirical analysis of digital gene expression data")
+    (description "This package can do differential expression analysis of
+RNA-seq expression profiles with biological replication.  It implements a range
+of statistical methodology based on the negative binomial distributions,
+including empirical Bayes estimation, exact tests, generalized linear models
+and quasi-likelihood tests.  It be applied to differential signal analysis of
+other types of genomic data that produce counts, including ChIP-seq, SAGE and
+CAGE.")
+    (license license:gpl2+)))
+
 (define-public r-variantannotation
   (package
     (name "r-variantannotation")
@@ -4278,6 +4675,25 @@ names in their natural, rather than lexicographic, order.")
 coding changes and predict coding outcomes.")
     (license license:artistic2.0)))
 
+(define-public r-limma
+  (package
+    (name "r-limma")
+    (version "3.28.14")
+    (source (origin
+              (method url-fetch)
+              (uri (bioconductor-uri "limma" version))
+              (sha256
+               (base32
+                "1jgn66ajafhjlqpfcw2p85h6ah8mgmz66znmsw6pcapia7d34akw"))))
+    (build-system r-build-system)
+    (home-page "http://bioinf.wehi.edu.au/limma")
+    (synopsis "Package for linear models for microarray and RNA-seq data")
+    (description "This package can be used for the analysis of gene expression
+studies, especially the use of linear models for analysing designed experiments
+and the assessment of differential expression.  The analysis methods apply to
+different technologies, including microarrays, RNA-seq, and quantitative PCR.")
+    (license license:gpl2+)))
+
 (define-public r-xvector
   (package
     (name "r-xvector")
@@ -5237,6 +5653,115 @@ two-dimensional genome scans.")
 libraries for systems that do not have these available via other means.")
     (license license:artistic2.0)))
 
+(define-public emboss
+  (package
+    (name "emboss")
+    (version "6.5.7")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "ftp://emboss.open-bio.org/pub/EMBOSS/old/"
+                                  (version-major+minor version) ".0/"
+                                  "EMBOSS-" version ".tar.gz"))
+              (sha256
+               (base32
+                "0vsmz96gc411yj2iyzdrsmg4l2n1nhgmp7vrgzlxx3xixv9xbf0q"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:configure-flags
+       (list (string-append "--with-hpdf="
+                            (assoc-ref %build-inputs "libharu")))
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'fix-checks
+           (lambda _
+             ;; The PNGDRIVER tests check for the presence of libgd, libpng
+             ;; and zlib, but assume that they are all found at the same
+             ;; prefix.
+             (substitute* "configure.in"
+               (("CHECK_PNGDRIVER")
+                "LIBS=\"$LIBS -lgd -lpng -lz -lm\"
+AC_DEFINE([PLD_png], [1], [Define to 1 if PNG support is available])
+AM_CONDITIONAL(AMPNG, true)"))
+             #t))
+         (add-after 'unpack 'disable-update-check
+           (lambda _
+             ;; At build time there is no connection to the Internet, so
+             ;; looking for updates will not work.
+             (substitute* "Makefile.am"
+               (("\\$\\(bindir\\)/embossupdate") ""))
+             #t))
+         (add-before 'configure 'autogen
+           (lambda _ (zero? (system* "autoreconf" "-vif")))))))
+    (inputs
+     `(("perl" ,perl)
+       ("libpng" ,libpng)
+       ("gd" ,gd)
+       ("libx11" ,libx11)
+       ("libharu" ,libharu)
+       ("zlib" ,zlib)))
+    (native-inputs
+     `(("autoconf" ,autoconf)
+       ("automake" ,automake)
+       ("libtool" ,libtool)
+       ("pkg-config" ,pkg-config)))
+    (home-page "http://emboss.sourceforge.net")
+    (synopsis "Molecular biology analysis suite")
+    (description "EMBOSS is the \"European Molecular Biology Open Software
+Suite\".  EMBOSS is an analysis package specially developed for the needs of
+the molecular biology (e.g. EMBnet) user community.  The software
+automatically copes with data in a variety of formats and even allows
+transparent retrieval of sequence data from the web.  It also provides a
+number of libraries for the development of software in the field of molecular
+biology.  EMBOSS also integrates a range of currently available packages and
+tools for sequence analysis into a seamless whole.")
+    (license license:gpl2+)))
+
+(define-public bits
+  (let ((revision "1")
+        (commit "3cc4567896d9d6442923da944beb704750a08d2d"))
+    (package
+      (name "bits")
+      ;; The version is 2.13.0 even though no release archives have been
+      ;; published as yet.
+      (version (string-append "2.13.0-" revision "." (string-take commit 9)))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/arq5x/bits.git")
+                      (commit commit)))
+                (file-name (string-append name "-" version "-checkout"))
+                (sha256
+                 (base32
+                  "17n2kffk4kmhivd8c98g2vr6y1s23vbg4sxlxs689wni66797hbs"))))
+      (build-system gnu-build-system)
+      (arguments
+       `(#:tests? #f ;no tests included
+         #:phases
+         (modify-phases %standard-phases
+           (delete 'configure)
+           (add-after 'unpack 'remove-cuda
+             (lambda _
+               (substitute* "Makefile"
+                 ((".*_cuda") "")
+                 (("(bits_test_intersections) \\\\" _ match) match))
+               #t))
+           (replace 'install
+             (lambda* (#:key outputs #:allow-other-keys)
+               (copy-recursively
+                "bin" (string-append (assoc-ref outputs "out") "/bin"))
+               #t)))))
+      (inputs
+       `(("gsl" ,gsl)
+         ("zlib" ,zlib)))
+      (home-page "https://github.com/arq5x/bits")
+      (synopsis "Implementation of binary interval search algorithm")
+      (description "This package provides an implementation of the
+BITS (Binary Interval Search) algorithm, an approach to interval set
+intersection.  It is especially suited for the comparison of diverse genomic
+datasets and the exploration of large datasets of genome
+intervals (e.g. genes, sequence alignments).")
+      (license license:gpl2))))
+
 (define-public piranha
   ;; There is no release tarball for the latest version.  The latest commit is
   ;; older than one year at the time of this writing.
@@ -5372,3 +5897,32 @@ group or two ChIP groups run under different conditions.")
       (description "This program compares version strings.  It intends to be a
 replacement for strverscmp.")
       (license license:gpl3+))))
+
+(define-public multiqc
+  (package
+    (name "multiqc")
+    (version "0.6")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "multiqc" version))
+       (sha256
+        (base32
+         "0avw11h63ldpxy5pizc3wl1wa01ha7q10wb240nggsjz3jaqvyiy"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-jinja2" ,python-jinja2)
+       ("python-simplejson" ,python-simplejson)
+       ("python-pyyaml" ,python-pyyaml)
+       ("python-click" ,python-click)
+       ("python-matplotlib" ,python-matplotlib)
+       ("python-numpy" ,python-numpy)))
+    (native-inputs
+     `(("python-setuptools" ,python-setuptools)))
+    (home-page "http://multiqc.info")
+    (synopsis "Aggregate bioinformatics analysis reports")
+    (description
+     "MultiQC is a tool to aggregate bioinformatics results across many
+samples into a single report.  It contains modules for a large number of
+common bioinformatics tools.")
+    (license license:gpl3)))
diff --git a/gnu/packages/bittorrent.scm b/gnu/packages/bittorrent.scm
index 75e5519a77..f04dc95196 100644
--- a/gnu/packages/bittorrent.scm
+++ b/gnu/packages/bittorrent.scm
@@ -207,7 +207,7 @@ interface, for the Transmission BitTorrent daemon.")
 (define-public aria2
   (package
     (name "aria2")
-    (version "1.24.0")
+    (version "1.25.0")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/tatsuhiro-t/aria2/"
@@ -215,7 +215,7 @@ interface, for the Transmission BitTorrent daemon.")
                                   name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0dxzyy3x20vla4c4563zjqkl71djv731db6wn3h0gysgf399d91m"))))
+                "0d8drwc5m5ps4bw63iq2gng36gyc2vadzixbynk1dj6gfr6fp2gz"))))
     (build-system gnu-build-system)
     (arguments
      `(#:configure-flags '("--enable-libaria2")
diff --git a/gnu/packages/busybox.scm b/gnu/packages/busybox.scm
index e2d6cf8f9e..ecbdd6f939 100644
--- a/gnu/packages/busybox.scm
+++ b/gnu/packages/busybox.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014 John Darrington  <jmd@gnu.org>
+;;; Copyright © 2014 John Darrington <jmd@gnu.org>
+;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -29,49 +30,48 @@
 (define-public busybox
   (package
     (name "busybox")
-    (version "1.22.1")
+    (version "1.25.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
-                    "http://www.busybox.net/downloads/" name "-"
+                    "https://www.busybox.net/downloads/" name "-"
                     version ".tar.bz2"))
               (sha256
                (base32
-                "12v7nri79v8gns3inmz4k24q7pcnwi00hybs0wddfkcy1afh42xf"))))
+                "1z52mh6prhd6v47qryz4rvng5r1z0am6masrnigq06zfhmlf03ss"))))
     (build-system gnu-build-system)
     (arguments
      `(#:phases
-       (alist-replace
-        'configure
-        (lambda _ (zero? (system* "make" "defconfig")))
-        (alist-replace
-         'check
-         (lambda _
+       (modify-phases %standard-phases
+         (replace 'configure
+           (lambda _ (zero? (system* "make" "defconfig"))))
+         (replace 'check
+           (lambda _
            (substitute* '("testsuite/du/du-s-works"
-                          "testsuite/du/du-works")
-             (("/bin") "/etc"))  ; there is no /bin but there is a /etc
+                           "testsuite/du/du-works")
+               (("/bin") "/etc"))  ; there is no /bin but there is a /etc
 
            ;; There is no /usr/bin or /bin - replace it with /gnu/store
            (substitute* "testsuite/cpio.tests"
-              (("/usr/bin") (%store-directory))
-              (("usr") (car (filter (negate string-null?)
-                                    (string-split (%store-directory) #\/)))))
+               (("/usr/bin") (%store-directory))
+               (("usr") (car (filter (negate string-null?)
+                                       (string-split (%store-directory) #\/)))))
 
            (substitute* "testsuite/date/date-works-1"
-             (("/bin/date") (which "date")))
+               (("/bin/date") (which "date")))
 
            ;; The pidof tests assume that pid 1 is called "init" but that is not
            ;; true in guix build environment
            (substitute* "testsuite/pidof.tests"
-             (("-s init") "-s $(cat /proc/1/comm)"))
+               (("-s init") "-s $(cat /proc/1/comm)"))
 
            (substitute* "testsuite/grep.tests"
-             ;; The subject of this test is buggy.  It is known by upstream (fixed in git)
-             ;; So mark it with SKIP_KNOWN_BUGS like the others.
-             ;; Presumably it wasn't known at the time of release ...
-             ;; (It is strange that they release software which they know to have bugs)
-             (("testing \"grep -w \\^str doesn't match str not at the beginning\"")
-              "test x\"$SKIP_KNOWN_BUGS\" = x\"\" && testing \"grep -w ^str doesn't match str not at the beginning\""))
+               ;; The subject of this test is buggy.  It is known by upstream (fixed in git)
+               ;; So mark it with SKIP_KNOWN_BUGS like the others.
+               ;; Presumably it wasn't known at the time of release ...
+               ;; (It is strange that they release software which they know to have bugs)
+               (("testing \"grep -w \\^str doesn't match str not at the beginning\"")
+               "test x\"$SKIP_KNOWN_BUGS\" = x\"\" && testing \"grep -w ^str doesn't match str not at the beginning\""))
 
            ;; This test cannot possibly pass.
            ;; It is trying to test that "which ls" returns "/bin/ls" when PATH is not set.
@@ -83,24 +83,23 @@
                            ;; "V=1"
                            "SKIP_KNOWN_BUGS=1"
                            "SKIP_INTERNET_TESTS=1"
-                           "check")))
-         (alist-replace
-          'install
-          (lambda* (#:key outputs #:allow-other-keys)
-            (let ((out (assoc-ref outputs "out")))
-              (zero?
-               (system* "make"
-                        (string-append "CONFIG_PREFIX=" out)
-                        "install"))))
-          %standard-phases)))))
+                           "check"))))
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (zero?
+                (system* "make"
+                         (string-append "CONFIG_PREFIX=" out)
+                         "install"))))))))
     (native-inputs `(("perl" ,perl) ; needed to generate the man pages (pod2man)
                      ;; The following are needed by the tests.
                      ("inetutils" ,inetutils)
+                     ("which" ,(@ (gnu packages base) which))
                      ("zip" ,zip)))
     (synopsis "Many common UNIX utilities in a single executable")
     (description "BusyBox combines tiny versions of many common UNIX utilities
 into a single small executable.  It provides a fairly complete environment for
 any small or embedded system.")
-    (home-page "http://www.busybox.net")
+    (home-page "https://www.busybox.net")
     ;; Some files are gplv2+
     (license gpl2)))
diff --git a/gnu/packages/ccache.scm b/gnu/packages/ccache.scm
index d84ac80bbf..01db7ae57d 100644
--- a/gnu/packages/ccache.scm
+++ b/gnu/packages/ccache.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014, 2015, 2016 Eric Bavier <bavier@member.fsf.org>
+;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -28,7 +29,7 @@
 (define-public ccache
   (package
     (name "ccache")
-    (version "3.2.4")
+    (version "3.2.5")
     (source
      (origin
       (method url-fetch)
@@ -36,16 +37,18 @@
                           version ".tar.xz"))
       (sha256
        (base32
-        "0pga3hvd80f2p7mz88jmmbwzxh4vn5ihyjx5f6na8y2fclzsjg8w"))))
+        "11db1g109g0g5si0s50yd99ja5f8j4asxb081clvx78r9d9i2w0i"))))
     (build-system gnu-build-system)
-    (native-inputs `(("perl" ,perl)))   ;for test.sh
+    (native-inputs `(("perl" ,perl)     ;for test.sh
+                     ("which" ,(@ (gnu packages base) which))))
     (inputs `(("zlib" ,zlib)))
     (arguments
      '(#:phases (alist-cons-before
                  'check 'setup-tests
                  (lambda _
                    (substitute* '("test/test_hashutil.c" "test.sh")
-                     (("#!/bin/sh") (string-append "#!" (which "sh"))))
+                     (("#!/bin/sh") (string-append "#!" (which "sh")))
+                     (("which") (which "which")))
                    #t)
                  %standard-phases)))
     (home-page "https://ccache.samba.org/")
diff --git a/gnu/packages/cdrom.scm b/gnu/packages/cdrom.scm
index 70772bf157..2dd84a2a17 100644
--- a/gnu/packages/cdrom.scm
+++ b/gnu/packages/cdrom.scm
@@ -130,14 +130,14 @@ libcdio.")
 (define-public xorriso
   (package
     (name "xorriso")
-    (version "1.4.2")
+    (version "1.4.4")
     (source (origin
              (method url-fetch)
              (uri (string-append "mirror://gnu/xorriso/xorriso-"
                                  version ".tar.gz"))
              (sha256
               (base32
-               "1cq4a0904lnz6nygbgarnlq49cz4qnfdyvz90s3nfk5as7gbwhr8"))))
+               "1izv8dvwacyh432vv1rm6lyjrq0v205kyakfra6iwa146c9m9fgr"))))
     (build-system gnu-build-system)
     (inputs
      `(("acl" ,acl)
@@ -145,7 +145,7 @@ libcdio.")
        ("bzip2" ,bzip2)
        ("zlib" ,zlib)
        ("libcdio" ,libcdio)))
-    (home-page "http://www.gnu.org/software/xorriso/")
+    (home-page "https://www.gnu.org/software/xorriso/")
     (synopsis "Create, manipulate, burn ISO-9660 filesystems")
     (description
      "GNU Xorriso is a tool for copying files to and from ISO 9660 Rock
diff --git a/gnu/packages/compression.scm b/gnu/packages/compression.scm
index 47e0499f7f..af3bba1f61 100644
--- a/gnu/packages/compression.scm
+++ b/gnu/packages/compression.scm
@@ -10,6 +10,7 @@
 ;;; Copyright © 2015, 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Ben Woodcroft <donttrustben@gmail.com>
 ;;; Copyright © 2016 Danny Milosavljevic <dannym@scratchpost.org>
+;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -796,3 +797,39 @@ respectively, based on the reference implementation from Google.")
     (description "Extracts files out of Microsoft Cabinet (.cab) archives")
     ;; Some source files specify gpl2+, lgpl2+, however COPYING is gpl3.
     (license license:gpl3+)))
+
+(define-public xdelta
+  (package
+    (name "xdelta")
+    (version "3.1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/jmacd/xdelta/archive/v"
+                           version ".tar.gz"))
+       (sha256
+        (base32
+         "17g2pbbqy6h20qgdjq7ykib7kg5ajh8fwbsfgyjqg8pwg19wy5bm"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (snippet
+        ;; This file isn't freely distributable and has no effect on building.
+        '(delete-file "xdelta3/draft-korn-vcdiff.txt"))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("autoconf" ,autoconf)
+       ("automake" ,automake)))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'enter-build-directory
+           (lambda _ (chdir "xdelta3")))
+         (add-before 'configure 'autoconf
+           (lambda _ (zero? (system* "autoreconf" "-vfi")))))))
+    (home-page "http://xdelta.com")
+    (synopsis "Delta encoder for binary files")
+    (description "xdelta encodes only the differences between two binary files
+using the VCDIFF algorithm and patch file format described in RFC 3284.  It can
+also be used to apply such patches.  xdelta is similar to @command{diff} and
+@command{patch}, but is not limited to plain text and does not generate
+human-readable output.")
+    (license license:asl2.0)))
diff --git a/gnu/packages/conkeror.scm b/gnu/packages/conkeror.scm
index cfeb22e8c3..d9722a1906 100644
--- a/gnu/packages/conkeror.scm
+++ b/gnu/packages/conkeror.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014 Cyrill Schenkel <cyrill.schenkel@gmail.com>
 ;;; Copyright © 2014, 2015 Eric Bavier <bavier@member.fsf.org>
+;;; Copyright © 2016 John J. Foerch <jjfoerch@earthlink.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -28,16 +29,16 @@
 (define-public conkeror
   (package
     (name "conkeror")
-    (version "1.0pre1.20150730")
+    (version "1.0.3")
     (source (origin
               (method url-fetch)
               (uri
-               (string-append "http://repo.or.cz/w/conkeror.git/snapshot/"
-                              "a1f7e879b129df5cf14ea4ce80a9c1407380ed58"
-                              ".tar.gz")) ; tag: debian-1.0--pre-1+git150730-1
+               (string-append "http://repo.or.cz/conkeror.git/snapshot/"
+                              version ".tar.gz"))
+              (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "1q45hc30733gz3ca2ixvw0rzzcbi7rlay7gx7kvzjv17a030nyk0"))))
+                "0ybmincxw3msnrfpby9gnckbq2x94c7fra2m66zham54cjc7mav3"))))
     (build-system gnu-build-system)
     (inputs `(("icecat" ,icecat)))
     (arguments
diff --git a/gnu/packages/crypto.scm b/gnu/packages/crypto.scm
index f167f3320c..7d61164b05 100644
--- a/gnu/packages/crypto.scm
+++ b/gnu/packages/crypto.scm
@@ -3,6 +3,7 @@
 ;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2016 Lukas Gradl <lgradl@openmailbox>
+;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -22,14 +23,18 @@
 (define-module (gnu packages crypto)
   #:use-module (gnu packages)
   #:use-module (gnu packages autotools)
+  #:use-module (gnu packages boost)
+  #:use-module (gnu packages gettext)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages libbsd)
+  #:use-module (gnu packages linux)
   #:use-module (gnu packages nettle)
   #:use-module (gnu packages password-utils)
+  #:use-module (gnu packages perl)
   #:use-module (gnu packages readline)
   #:use-module (gnu packages serialization)
   #:use-module (gnu packages tls)
-  #:use-module (guix licenses)
+  #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix build-system gnu))
@@ -54,7 +59,7 @@
     (description
      "Sodium is a new easy-to-use high-speed software library for network
 communication, encryption, decryption, signatures, etc.")
-    (license isc)
+    (license license:isc)
     (home-page "http://libsodium.org")))
 
 (define-public signify
@@ -91,10 +96,11 @@ OpenBSD tool of the same name.")
     (home-page "https://github.com/aperezdc/signify")
     ;; This package includes third-party code that was originally released under
     ;; various non-copyleft licenses. See the source files for clarification.
-    (license (list bsd-3 bsd-4 expat isc public-domain
-                   (non-copyleft "file://base64.c"
-                                 "See base64.c in the distribution for
-                                 the license from IBM.")))))
+    (license (list license:bsd-3 license:bsd-4 license:expat license:isc
+                   license:public-domain (license:non-copyleft
+                                          "file://base64.c"
+                                          "See base64.c in the distribution for
+                                           the license from IBM.")))))
 
 
 (define-public opendht
@@ -146,4 +152,74 @@ OpenBSD tool of the same name.")
     (description "OpenDHT is a Distributed Hash Table (DHT) library.  It may
 be used to manage peer-to-peer network connections as needed for real time
 communication.")
-    (license gpl3)))
+    (license license:gpl3)))
+
+(define rlog
+  (package
+    (name "rlog")
+    (version "1.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri
+        (string-append "http://rlog.googlecode.com/files/rlog-"
+                       version ".tar.gz"))
+       (sha256
+        (base32
+         "0y9zg0pd7vmnskwac1qdyzl282z7kb01nmn57lsg2mjdxgnywf59"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+                  (add-before 'configure 'patch-/bin/sh
+                    (lambda _
+                      (substitute* "docs/Makefile.in"
+                        (("/bin/sh") "sh")))))))
+    (home-page "http://www.arg0.net/rlog")
+    (synopsis "Flexible message logging library for EncFS")
+    (description
+     "RLog provides message logging for EncFS.  It is no longer maintained.")
+    (license license:lgpl2.1+)))
+
+(define-public encfs
+  (package
+    (name "encfs")
+    (version "1.8.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri
+        (string-append "https://github.com/vgough/encfs/releases/download/v"
+                       version "/encfs-" version ".tar.gz"))
+       (sha256
+        (base32
+         "1lfmcsk187qr6ahy8c8959p7jrk9d5rd9kcsx572850ca3zmf0la"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:configure-flags '("--with-boost-serialization=boost_wserialization"
+                           "--with-boost-filesystem=boost_filesystem")
+       #:phases (modify-phases %standard-phases
+                  (add-before 'configure 'autoconf
+                    (lambda _
+                      (zero? (system* "autoreconf" "-vfi")))))))
+    (native-inputs
+     `(("autoconf" ,autoconf)
+       ("automake" ,automake)
+       ("gettext" ,gnu-gettext)
+       ("libtool" ,libtool)
+       ("perl" ,perl)
+       ("pkg-config" ,pkg-config)))
+    (inputs
+     `(("boost" ,boost)
+       ("fuse" ,fuse)
+       ("openssl" ,openssl)
+       ("rlog" ,rlog)))
+    (home-page "https://vgough.github.io/encfs")
+    (synopsis "Encrypted virtual file system")
+    (description
+     "EncFS creates a virtual encrypted file system in user-space.  Each file
+created under an EncFS mount point is stored as a separate encrypted file on
+the underlying file system.  Like most encrypted file systems, EncFS is meant
+to provide security against off-line attacks, such as a drive falling into
+the wrong hands.")
+    (license (list license:lgpl3+                 ;encfs library
+                   license:gpl3+))))              ;command-line tools
diff --git a/gnu/packages/databases.scm b/gnu/packages/databases.scm
index 4f2f211fb3..fdee887af7 100644
--- a/gnu/packages/databases.scm
+++ b/gnu/packages/databases.scm
@@ -8,7 +8,7 @@
 ;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com>
 ;;; Copyright © 2015 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
-;;; Copyright © 2016 Nils Gillmann <niasterisk@grrlz.net>
+;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is>
 ;;; Copyright © 2016 Roel Janssen <roel@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
diff --git a/gnu/packages/datastructures.scm b/gnu/packages/datastructures.scm
index 74b9fff4af..b9e6061238 100644
--- a/gnu/packages/datastructures.scm
+++ b/gnu/packages/datastructures.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015, 2016 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -70,3 +71,24 @@ probing.  This method is space-efficient -- there is no pointer overhead --
 and time-efficient for good hash functions.")
     (home-page "https://github.com/sparsehash/sparsehash")
     (license license:bsd-3)))
+
+(define-public ssdeep
+  (package
+    (name "ssdeep")
+    (version "2.13")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://sourceforge/ssdeep/"
+                                  name "-" version "/"
+                                  name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1igqy0j7jrklb8fdlrm6ald4cyl1fda5ipfl8crzyl6bax2ajk3f"))))
+    (build-system gnu-build-system)
+    (home-page "http://ssdeep.sourceforge.net")
+    (synopsis "Context-triggered piecewise hashing algorithm")
+    (description "ssdeep computes and matches context triggered piecewise
+hashes (CTPH), also called fuzzy checksums.  It can identify similar files
+that have sequences of identical bytes in the same order, even though bytes
+in between these sequences may be different in both content and length.")
+    (license license:gpl2+)))
diff --git a/gnu/packages/disk.scm b/gnu/packages/disk.scm
index c60eacb15e..54f23db01e 100644
--- a/gnu/packages/disk.scm
+++ b/gnu/packages/disk.scm
@@ -2,8 +2,9 @@
 ;;; Copyright © 2012, 2013 Nikita Karetnikov <nikita@karetnikov.org>
 ;;; Copyright © 2015 Mathieu Lirzin <mthl@gnu.org>
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
-;;; Copyright © 2016 Tobias Geerinckx-Rice <tobias.geerinckx.rice@gmail.com>
+;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -25,9 +26,12 @@
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix build-system gnu)
+  #:use-module (gnu packages)
   #:use-module (gnu packages gettext)
   #:use-module (gnu packages linux)
+  #:use-module (gnu packages ncurses)
   #:use-module (gnu packages perl)
+  #:use-module (gnu packages popt)
   #:use-module (gnu packages python)
   #:use-module (gnu packages readline)
   #:use-module (gnu packages guile)
@@ -97,6 +101,46 @@ fdisk.  fdisk is used for the creation and manipulation of disk partition
 tables, and it understands a variety of different formats.")
     (license gpl3+)))
 
+(define-public gptfdisk
+  (package
+    (name "gptfdisk")
+    (version "1.0.1")
+    (source
+     (origin
+      (method url-fetch)
+      (uri (string-append "mirror://sourceforge/gptfdisk/gptfdisk/"
+                          version "/" name "-" version ".tar.gz"))
+      (sha256
+       (base32
+        "1izazbyv5n2d81qdym77i8mg9m870hiydmq4d0s51npx5vp8lk46"))))
+    (build-system gnu-build-system)
+    (inputs
+     `(("gettext" ,gnu-gettext)
+       ("ncurses" ,ncurses)
+       ("popt" ,popt)
+       ("util-linux" ,util-linux))) ; libuuid
+    (arguments
+     `(#:test-target "test"
+       #:phases
+       (modify-phases %standard-phases
+         ;; no configure script
+         (delete 'configure)
+         ;; no install target
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((bin (string-append (assoc-ref outputs "out") "/bin")))
+               (install-file "gdisk" bin)
+               (install-file "sgdisk" bin)
+               (install-file "cgdisk" bin)
+               (install-file "fixparts" bin)))))))
+    (home-page "http://www.rodsbooks.com/gdisk/")
+    (synopsis "Low-level GPT disk partitioning and formatting")
+    (description "GPT fdisk (aka gdisk) is a text-mode partitioning tool that
+works on Globally Unique Identifier (GUID) Partition Table (GPT) disks, rather
+than on the more common (through 2009) Master Boot Record (MBR) partition
+tables.")
+    (license gpl2)))
+
 (define-public ddrescue
   (package
     (name "ddrescue")
diff --git a/gnu/packages/documentation.scm b/gnu/packages/documentation.scm
index 17a69e2c25..8302cc49cc 100644
--- a/gnu/packages/documentation.scm
+++ b/gnu/packages/documentation.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2014 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014, 2016 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2016 Eric Bavier <bavier@member.fsf.org>
+;;; Copyright © 2016 Roel Janssen <roel@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -27,9 +28,11 @@
   #:use-module (gnu packages)
   #:use-module (gnu packages python)
   #:use-module (gnu packages bison)
+  #:use-module (gnu packages docbook)
   #:use-module (gnu packages flex)
   #:use-module (gnu packages graphviz)
   #:use-module (gnu packages gettext)
+  #:use-module (gnu packages glib)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages xml)
   #:autoload   (gnu packages zip) (unzip))
@@ -115,3 +118,38 @@ generate both TeX output for high-quality hardcopies or HTML output for online
 brwosing.  The documentation is extracted directly from the C/C++/IDL source
 or Java class files.")
     (license gpl2+)))
+
+(define-public scrollkeeper
+  (package
+    (name "scrollkeeper")
+    (version "0.3.14")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://sourceforge/scrollkeeper/scrollkeeper-"
+                           version ".tar.gz"))
+       (sha256
+        (base32 "1bfxwxc1ngh11v36z899sz9qam366r050fhkyb5adv65lb1x62sa"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:configure-flags
+       (list (string-append "--with-xml-catalog="
+                            (assoc-ref %build-inputs "docbook-xml")
+                            "/xml/dtd/docbook/catalog.xml"))))
+    (inputs
+     `(("perl" ,perl)
+       ("libxml2" ,libxml2)
+       ("libxslt" ,libxslt)
+       ;; The configure script checks for either version 4.2 or 4.1.2.
+       ("docbook-xml" ,docbook-xml-4.2)))
+    (native-inputs
+     `(("intltool" ,intltool)))
+    (home-page "http://scrollkeeper.sourceforge.net/")
+    (synopsis "Open Documentation Cataloging Project")
+    (description "ScrollKeeper is a cataloging system for documentation on open
+systems.  It manages documentation metadata as specified by the Open Source
+Metadata Framework and provides a simple API to allow help browsers to find,
+sort, and search the document catalog.  It will also be able to communicate
+with catalog servers on the Net to search for documents which are not on the
+local system.")
+    (license lgpl2.1+)))
diff --git a/gnu/packages/ebook.scm b/gnu/packages/ebook.scm
index f7e15584f3..69946b1e78 100644
--- a/gnu/packages/ebook.scm
+++ b/gnu/packages/ebook.scm
@@ -61,7 +61,7 @@
 (define-public calibre
   (package
     (name "calibre")
-    (version "2.58.0")
+    (version "2.62.0")
     (source
       (origin
         (method url-fetch)
@@ -70,7 +70,7 @@
                             version ".tar.xz"))
         (sha256
          (base32
-          "0npqvfjqj1vwa7nmnsyd4d30z40brydw275ldf1jankrp6dr9dyd"))
+          "15qskfsdg3fy9cpw1m3mccwgn45366yn7lci5kim0fdzpw9pnkna"))
         ;; Remove non-free or doubtful code, see
         ;; https://lists.gnu.org/archive/html/guix-devel/2015-02/msg00478.html
         (modules '((guix build utils)))
diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scm
index 7b60722c10..926db42a46 100644
--- a/gnu/packages/emacs.scm
+++ b/gnu/packages/emacs.scm
@@ -5,7 +5,6 @@
 ;;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
 ;;; Copyright © 2015 Federico Beffa <beffa@fbengineering.ch>
 ;;; Copyright © 2015, 2016 Ricardo Wurmus <rekado@elephly.net>
-;;; Copyright © 2016 Nils Gillmann <niasterisk@grrlz.net>
 ;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com>
 ;;; Copyright © 2015, 2016 Christopher Allan Webber <cwebber@dustycloud.org>
 ;;; Copyright © 2016 humanitiesNerd <catonano@gmail.com>
@@ -47,6 +46,7 @@
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages gnome)
   #:use-module (gnu packages ncurses)
+  #:use-module (gnu packages tex)
   #:use-module (gnu packages texinfo)
   #:use-module (gnu packages tls)
   #:use-module (gnu packages pkg-config)
@@ -68,6 +68,7 @@
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pdf)
   #:use-module (gnu packages scheme)
+  #:use-module (gnu packages statistics)
   #:use-module (gnu packages xiph)
   #:use-module (gnu packages mp3)
   #:use-module (guix utils)
@@ -554,6 +555,31 @@ operations.")
 support for Git-SVN.")
     (license license:gpl3+)))
 
+(define-public emacs-magit-popup
+  (package
+    (name "emacs-magit-popup")
+    (version (package-version magit))
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://raw.githubusercontent.com/magit/magit/"
+                    version "/lisp/magit-popup.el"))
+              (file-name (string-append "magit-popup-" version ".el"))
+              (sha256
+               (base32
+                "144nl7j5mn86ccan6qxgg40bsxpkbc83vwnhd5y657gqki74972r"))))
+    (build-system emacs-build-system)
+    (propagated-inputs
+     `(("emacs-dash" ,emacs-dash)))
+    (home-page "https://github.com/magit/magit")
+    (synopsis "Define prefix-infix-suffix command combos")
+    (description
+     "This library implements a generic interface for toggling switches and
+setting options and then invoking an Emacs command which does something with
+these arguments.  The prototypical use is for the command to call an external
+process, passing on the arguments as command line arguments.")
+    (license license:gpl3+)))
+
 (define-public haskell-mode
   (package
     (name "haskell-mode")
@@ -664,7 +690,7 @@ the body are let-bound and this search is done at compile time.")
 (define-public flycheck
   (package
     (name "emacs-flycheck")
-    (version "0.23")
+    (version "28")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -672,11 +698,12 @@ the body are let-bound and this search is done at compile time.")
                     version "/flycheck-" version ".tar"))
               (sha256
                (base32
-                "1n2cifzsl5dbv42l82bi3y1vk6q33msi8dd4bj7b9nvnl9jfjj5b"))))
+                "1yjxivk11d7w39zfhj2xr4h6xhwx1aj6yhyzd63rjrad7xpjfl86"))))
     (build-system emacs-build-system)
     (propagated-inputs
      `(("emacs-dash" ,emacs-dash)
-       ("emacs-let-alist" ,let-alist)))
+       ("emacs-let-alist" ,let-alist)
+       ("emacs-seq" ,emacs-seq)))
     (home-page "https://www.flycheck.org")
     (synopsis "On-the-fly syntax checking")
     (description
@@ -821,7 +848,7 @@ provides an optional IDE-like error list.")
 
 (define-public emms
   (package
-    (name "emms")
+    (name "emacs-emms")
     (version "4.1")
     (source (origin
               (method url-fetch)
@@ -933,6 +960,29 @@ light user interface.")
     (home-page "http://www.gnu.org/software/emms/")
     (license license:gpl3+)))
 
+(define-public emacs-emms-player-mpv
+  (package
+    (name "emacs-emms-player-mpv")
+    (version "0.0.8")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/dochang/emms-player-mpv/archive/"
+                           version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "01wj410dpx25b3i8781i2j9c6nlvzvvphy9qgh7zfpmyz6a3wsm4"))))
+    (build-system emacs-build-system)
+    (propagated-inputs
+     `(("emms" ,emms)))
+    (home-page "https://github.com/dochang/emms-player-mpv/")
+    (synopsis "Mpv support for EMMS")
+    (description
+     "This package provides an EMMS player that uses mpv.  It supports pause
+and seeking.")
+    (license license:gpl3+)))
+
 
 ;;;
 ;;; Miscellaneous.
@@ -1225,6 +1275,317 @@ strings.")
 files and directories.")
     (license license:gpl3+)))
 
+(define-public emacs-el-mock
+  (package
+    (name "emacs-el-mock")
+    (version "1.25.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/rejeep/el-mock.el/"
+                           "archive/v" version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "16xw94n58xxn3zvgyj72bmzs0k5lkvswjmzs79ws9n7rzdivb38b"))))
+    (build-system emacs-build-system)
+    (home-page "http://github.com/rejeep/el-mock.el")
+    (synopsis "Tiny mock and stub framework in Emacs Lisp")
+    (description
+     "Emacs Lisp Mock is a library for mocking and stubbing using readable
+syntax.  Most commonly Emacs Lisp Mock is used in conjunction with Emacs Lisp
+Expectations, but it can be used in other contexts.")
+    (license license:gpl3+)))
+
+(define-public emacs-espuds
+  (package
+    (name "emacs-espuds")
+    (version "0.3.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/ecukes/espuds/"
+                           "archive/v" version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "0xv551376pbmh735a3zjwc9z4qdx6ngj1vpq3xqjpn0a1rwjyn4k"))))
+    (build-system emacs-build-system)
+    (propagated-inputs
+     `(("emacs-s" ,emacs-s)
+       ("emacs-dash" ,emacs-dash)
+       ("emacs-f" ,emacs-f)))
+    (home-page "http://github.com/ecukes/espuds")
+    (synopsis "Common step definitions for Ecukes")
+    (description "Espuds is a collection of the most commonly used step
+definitions for testing with the Ecukes framework.")
+    (license license:gpl3+)))
+
+(define-public emacs-expand-region
+  (package
+    (name "emacs-expand-region")
+    (version "0.10.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/magnars/expand-region.el"
+                           "/archive/" version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "1zfiaqyb3zqiyqjkpqsjw660j09805nqsg25q6ars2h8gs0rnvxb"))))
+    (build-system emacs-build-system)
+    (home-page "https://github.com/magnars/expand-region.el")
+    (synopsis "Increase selected region by semantic units")
+    (description
+     "Expand region increases the selected region by semantic units.  Just
+keep pressing the key until it selects what you want.  There's also
+@code{er/contract-region} if you expand too far.")
+    (license license:gpl3+)))
+
+(define-public emacs-fill-column-indicator
+  (package
+    (name "emacs-fill-column-indicator")
+    (version "1.81")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/alpaker/Fill-Column-Indicator"
+                           "/archive/v" version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "1xwyqbjbbicmvhlb85vg4j5snwy1vd7rfk89ws4viws5ljkhhyg8"))))
+    (build-system emacs-build-system)
+    (home-page "https://www.emacswiki.org/emacs/FillColumnIndicator")
+    (synopsis "Graphically indicate the fill column")
+    (description
+     "Fill-column-indicator graphically indicates the location of the fill
+column by drawing a thin line down the length of the editing window.")
+    (license license:gpl3+)))
+
+(define-public emacs-znc
+  (package
+    (name "emacs-znc")
+    (version "0.0.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://marmalade-repo.org/packages/znc-"
+                           version ".el"))
+       (sha256
+        (base32
+         "1d8lqvybgyazin5z0g1c4l3rg1vzrrvf0saqs53jr1zcdg0lianh"))))
+    (build-system emacs-build-system)
+    (home-page "https://github.com/sshirokov/ZNC.el")
+    (synopsis "Make ERC and ZNC get along better")
+    (description
+     "This is a thin wrapper around @code{erc} that enables one to use the ZNC
+IRC bouncer with ERC.")
+    (license license:expat)))
+
+(define-public emacs-shut-up
+  (package
+    (name "emacs-shut-up")
+    (version "0.3.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/cask/shut-up/"
+                           "archive/v" version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "09kzrjdkb569iviyg7ydwq44yh84m3f9hkl7jizfrlk0w4gz67d1"))))
+    (build-system emacs-build-system)
+    (home-page "https://github.com/cask/shut-up")
+    (synopsis "Silence Emacs")
+    (description "This package silences most output of Emacs when running an
+Emacs shell script.")
+    (license license:expat)))
+
+(define-public emacs-undercover
+  (package
+    (name "emacs-undercover")
+    (version "0.6.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/sviridov/undercover.el/"
+                           "archive/v" version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "0f48fi0xnbsqs382rgh85m9mq1wdnr0yib7as9xhwzvq0hsr5m0a"))))
+    (build-system emacs-build-system)
+    (propagated-inputs
+     `(("emacs-dash" ,emacs-dash)
+       ("emacs-shut-up" ,emacs-shut-up)))
+    (home-page "https://github.com/sviridov/undercover.el")
+    (synopsis "Test coverage library for Emacs Lisp")
+    (description
+     "Undercover is a test coverage library for software written in Emacs
+Lisp.")
+    (license license:expat)))
+
+(define-public emacs-paren-face
+  (package
+    (name "emacs-paren-face")
+    (version "1.0.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/tarsius/paren-face/archive/"
+                           version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "0y4qrhxa9332vsvr999jg7qj1ymnfgwpf591yi4a4jgg90pm7qnn"))))
+    (build-system emacs-build-system)
+    (home-page "http://github.com/tarsius/paren-face")
+    (synopsis "Face for parentheses in lisp modes")
+    (description
+     "This library defines a face named @code{parenthesis} used just for
+parentheses.  The intended purpose of this face is to make parentheses less
+visible in Lisp code by dimming them.  Lispers probably don't need to be
+constantly made aware of the existence of the parentheses.  Dimming them might
+be even more useful for people new to lisp who have not yet learned to
+subconsciously blend out the parentheses.")
+    (license license:gpl3+)))
+
+(define-public emacs-page-break-lines
+  (package
+    (name "emacs-page-break-lines")
+    (version "0.11")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/purcell/page-break-lines/"
+                           "archive/" version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "1zzhziq5kbrm9rxk30kx2glz455fp1blqxg8cpcf6l8xl3w8z4pg"))))
+    (build-system emacs-build-system)
+    (home-page "https://github.com/purcell/page-break-lines")
+    (synopsis "Display page breaks as tidy horizontal lines")
+    (description
+     "This library provides a global mode which displays form feed characters
+as horizontal rules.")
+    (license license:gpl3+)))
+
+(define-public emacs-simple-httpd
+  (package
+    (name "emacs-simple-httpd")
+    (version "1.4.6")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/skeeto/emacs-web-server/"
+                           "archive/" version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "01r7h3imnj4qx1m53a2wjafvbylcyz5f9r2rg2cs7ky3chlg220r"))))
+    (build-system emacs-build-system)
+    (home-page "https://github.com/skeeto/emacs-http-server")
+    (synopsis "HTTP server in pure Emacs Lisp")
+    (description
+     "This package provides a simple HTTP server written in Emacs Lisp to
+serve files and directory listings.")
+    (license license:unlicense)))
+
+(define-public emacs-skewer-mode
+  (package
+    (name "emacs-skewer-mode")
+    (version "1.6.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/skeeto/skewer-mode/archive/"
+                           version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "07jpz374j0j964szy3zznrkyja2kpdl3xa87wh7349mzxivqxdx0"))))
+    (build-system emacs-build-system)
+    (propagated-inputs
+     `(("emacs-simple-httpd" ,emacs-simple-httpd)
+       ("emacs-js2-mode" ,emacs-js2-mode)))
+    (home-page "https://github.com/skeeto/skewer-mode")
+    (synopsis "Live web development in Emacs")
+    (description
+     "Skewer-mode provides live interaction with JavaScript, CSS, and HTML in
+a web browser.  Expressions are sent on-the-fly from an editing buffer to be
+evaluated in the browser, just like Emacs does with an inferior Lisp process
+in Lisp modes.")
+    (license license:unlicense)))
+
+(define-public emacs-rich-minority
+  (package
+    (name "emacs-rich-minority")
+    (version "1.0.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/Malabarba/rich-minority/"
+                           "archive/" version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "1l0cb0q7kyi88nwfqd542psnkgwnjklpzc5rx32gzd3lkwkrbr8v"))))
+    (build-system emacs-build-system)
+    (home-page "https://github.com/Malabarba/rich-minority")
+    (synopsis "Clean-up and beautify the list of minor modes")
+    (description
+     "This Emacs package hides and/or highlights minor modes in the
+mode-line.")
+    (license license:gpl2+)))
+
+(define-public emacs-smart-mode-line
+  (package
+    (name "emacs-smart-mode-line")
+    (version "2.10.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/Malabarba/smart-mode-line/"
+                           "archive/" version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "0i9wajabrrsjzwd842q0m2611kf0q31p9hg1pdj81177gynkw8l8"))))
+    (build-system emacs-build-system)
+    (propagated-inputs
+     `(("emacs-rich-minority" ,emacs-rich-minority)))
+    (home-page "http://github.com/Malabarba/smart-mode-line")
+    (synopsis "Color-coded smart mode-line.")
+    (description
+     "Smart Mode Line is a mode-line theme for Emacs.  It aims to be easy to
+read from small to large monitors by using colors, a prefix feature, and smart
+truncation.")
+    (license license:gpl2+)))
+
+(define-public emacs-shell-switcher
+  (package
+    (name "emacs-shell-switcher")
+    (version "1.0.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/DamienCassou/shell-switcher"
+                           "/archive/v" version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "1c23mfkdqz2g9rixd9smm323vzlvhzz3ng34ambcqjfq309qb2nz"))))
+    (build-system emacs-build-system)
+    (home-page "https://github.com/DamienCassou/shell-switcher")
+    (synopsis "Provide fast switching between shell buffers")
+    (description
+     "This package provides commands to quickly switch between shell buffers.")
+    (license license:gpl3+)))
+
 (define-public emacs-ob-ipython
   (package
     (name "emacs-ob-ipython")
@@ -1482,10 +1843,34 @@ identifiers in the MIT-Scheme documentation.")
 constants and units into an Emacs buffer.")
     (license license:gpl2+)))
 
+(define-public emacs-tagedit
+  (package
+    (name "emacs-tagedit")
+    (version "1.4.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/magnars/tagedit/"
+                           "archive/" version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "1apfnann4qklfdsmdi7icjsj18x7gwx8d83iqr4z25clszz95xfq"))))
+    (build-system emacs-build-system)
+    (propagated-inputs
+     `(("emacs-s" ,emacs-s)
+       ("emacs-dash" ,emacs-dash)))
+    (home-page "https://github.com/magnars/tagedit")
+    (synopsis "Some paredit-like features for html-mode")
+    (description
+     "This package provides a collection of paredit-like functions for editing
+in @code{html-mode}.")
+    (license license:gpl3+)))
+
 (define-public emacs-slime
   (package
     (name "emacs-slime")
-    (version "2.15")
+    (version "2.18")
     (source
      (origin
        (file-name (string-append name "-" version ".tar.gz"))
@@ -1495,7 +1880,7 @@ constants and units into an Emacs buffer.")
              version ".tar.gz"))
        (sha256
         (base32
-         "0l2z6l2xm78mhh0nczkrmzh2ddb1n911ij9xb6q40zwvx4f8blds"))))
+         "146avwbwr6mw0nmgyihx8gkr0mv6al7a73igzxvysj62000cqvlj"))))
     (build-system emacs-build-system)
     (native-inputs
      `(("texinfo" ,texinfo)))
@@ -1680,6 +2065,30 @@ number.")
 It is built on top of the custom theme support in Emacs 24 or later.")
     (license license:gpl3+)))
 
+(define-public emacs-solarized-theme
+  (package
+    (name "emacs-solarized-theme")
+    (version "1.2.2")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/bbatsov/solarized-emacs/"
+                                  "archive/v"  version ".tar.gz"))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1ha3slc6d9wi9ilkhmwrzkvf308n6ph7b0k69pk369s9304awxzx"))))
+    (build-system emacs-build-system)
+    (propagated-inputs
+     `(("emacs-dash" ,emacs-dash)
+       ("emacs-f" ,emacs-f)
+       ("emacs-s" ,emacs-s)))
+    (home-page "http://github.com/bbatsov/solarized-emacs")
+    (synopsis "Port of the Solarized theme for Emacs")
+    (description
+     "Solarized for Emacs is a port of the Solarized theme for Vim.  This
+package provides a light and a dark variant.")
+    (license license:gpl3+)))
+
 (define-public emacs-smartparens
   (package
     (name "emacs-smartparens")
@@ -1709,6 +2118,55 @@ features found in other packages it also brings many improvements as
 well as completely new features.")
     (license license:gpl3+)))
 
+(define-public emacs-hl-todo
+  (package
+    (name "emacs-hl-todo")
+    (version "1.7.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://raw.githubusercontent.com/tarsius/hl-todo/"
+                    version "/hl-todo.el"))
+              (sha256
+               (base32
+                "18zydm43zajlglhgr0bhdkd4pln27amd063k2ql6p1mvyam3j8ia"))))
+    (build-system emacs-build-system)
+    (home-page "https://github.com/tarsius/hl-todo")
+    (synopsis "Emacs mode to highlight TODO and similar keywords")
+    (description
+     "This package provides an Emacs mode to highlight TODO and similar
+keywords in comments and strings.  This package also provides commands for
+moving to the next or previous keyword and to invoke @code{occur} with a
+regexp that matches all known keywords.")
+    (license license:gpl3+)))
+
+(define-public emacs-perspective
+  (package
+    (name "emacs-perspective")
+    (version "1.12")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/nex3/perspective-el/"
+                           "archive/" version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "078ahh0kmhdylq5ib9c81c76kz1n02xwc83pm729d00i84ibviic"))))
+    (build-system emacs-build-system)
+    (home-page "http://github.com/nex3/perspective-el")
+    (synopsis "Switch between named \"perspectives\"")
+    (description
+     "This package provides tagged workspaces in Emacs, similar to workspaces in
+windows managers such as Awesome and XMonad.  @code{perspective.el} provides
+multiple workspaces (or \"perspectives\") for each Emacs frame.  Each
+perspective is composed of a window configuration and a set of buffers.
+Switching to a perspective activates its window configuration, and when in a
+perspective only its buffers are available by default.")
+    ;; This package is released under the same license as Emacs (GPLv3+) or
+    ;; the Expat license.
+    (license license:gpl3+)))
+
 (define-public emacs-hydra
   (package
     (name "emacs-hydra")
@@ -2021,6 +2479,65 @@ Emacs default configuration in uncontroversial ways that nearly everyone can
 agree upon.")
     (license license:gpl3+)))
 
+(define-public emacs-eprime
+  (let ((commit "17a481af26496be91c07139a9bfc05cfe722506f"))
+    (package
+      (name "emacs-eprime")
+      (version (string-append "20140513-" (string-take commit 7)))
+      (source (origin
+                (method url-fetch)
+                (uri (string-append "https://raw.githubusercontent.com"
+                                    "/AndrewHynes/eprime-mode/"
+                                    commit "/eprime-mode.el"))
+                (file-name (string-append "eprime-" version ".el"))
+                (sha256
+                 (base32
+                  "0v68lggkyq7kbcr9zyi573m2g2x251xy3jadlaw8kx02l8krwq8d"))))
+      (build-system emacs-build-system)
+      (home-page "https://github.com/AndrewHynes/eprime-mode")
+      (synopsis "E-prime checking mode for Emacs")
+      (description "This package provides an E-prime checking mode for Emacs
+that highlights non-conforming text.  The subset of the English language called
+E-Prime forbids the use of the \"to be\" form to strengthen your writing.")
+      (license license:gpl3+))))
+
+(define-public emacs-ess
+  (package
+    (name "emacs-ess")
+    (version "16.04")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://ess.r-project.org/downloads/ess/ess-"
+                                  version ".tgz"))
+              (sha256
+               (base32
+                "0w7mbbajn377gdmvnd21mpyr368b2ia46gq6cb99y4y5rspf9pcg"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f ; There is no test suite.
+       #:make-flags (list (string-append "PREFIX=" (assoc-ref %outputs "out")))
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure)
+         (add-before 'build 'more-shebang-patching
+           (lambda* (#:key inputs #:allow-other-keys)
+             (substitute* "Makeconf"
+               (("SHELL = /bin/sh")
+                (string-append "SHELL = " (which "sh")))))))))
+    (inputs
+     `(("emacs" ,emacs-minimal)
+       ("r" ,r)))
+    (native-inputs
+     `(("perl" ,perl)
+       ("texinfo" ,texinfo)
+       ("texlive" ,texlive)))
+    (home-page "http://ess.r-project.org/")
+    (synopsis "Emacs mode for statistical analysis programs")
+    (description "Emacs Speaks Statistics (ESS) is an add-on package for GNU
+Emacs.  It is designed to support editing of scripts and interaction with
+various statistical analysis programs such as R and OpenBUGS.")
+    (license license:gpl2+)))
+
 (define-public emacs-smex
   (package
     (name "emacs-smex")
@@ -2273,7 +2790,7 @@ Dust.js, React/JSX, Angularjs, ejs, etc.")
 (define-public emacs-helm
   (package
     (name "emacs-helm")
-    (version "1.9.6")
+    (version "1.9.8")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2282,7 +2799,7 @@ Dust.js, React/JSX, Angularjs, ejs, etc.")
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "0fc897rwf1fm2m7jrsikkgcyzhngfcysxfmzchpwzfj6v9sb5rl9"))))
+                "019dpzr6l83k1fgxn40aqxjvrpz4dl5d9vi7fc5wjnifmxaqxia6"))))
     (build-system emacs-build-system)
     (propagated-inputs
      `(("emacs-async" ,emacs-async)
diff --git a/gnu/packages/engineering.scm b/gnu/packages/engineering.scm
index 7b21c11ad3..b3e4431138 100644
--- a/gnu/packages/engineering.scm
+++ b/gnu/packages/engineering.scm
@@ -58,7 +58,7 @@
 (define-public librecad
   (package
     (name "librecad")
-    (version "2.0.11")
+    (version "2.1.1")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -67,7 +67,7 @@
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "0jda23qspziph6fwgq1q3nmnllbgn9kwfpjylv1f0wa7c5l85gh5"))))
+                "132vv9pzbx64zmbnikyg06d4j47yzlmwi4mywxnd9gkaik4yd2kb"))))
     (build-system gnu-build-system)
     (arguments
      '(#:phases
@@ -108,26 +108,25 @@ plans and designs.")
 (define-public geda-gaf
   (package
     (name "geda-gaf")
-    (version "1.8.2")
+    (version "1.9.2")
     (source (origin
               (method url-fetch)
               (uri (string-append
-                    "http://ftp.geda-project.org/geda-gaf/stable/v"
+                    "http://ftp.geda-project.org/geda-gaf/unstable/v"
                     (version-major+minor version) "/"
                     version "/geda-gaf-" version ".tar.gz"))
               (sha256
                (base32
-                "08dpa506xk4gjbbi8vnxcb640wq4ihlgmhzlssl52nhvxwx7gx5v"))))
+                "14mk45pfz11v54q66gafw2l68n1p5ssvvjmdm8ffgc8x1w5ajfrz"))))
     (build-system gnu-build-system)
     (arguments
      '(#:phases
-       ;; tests require a writable HOME
-       (alist-cons-before
-        'check 'set-home
-        (lambda _
-          (setenv "HOME" (getenv "TMPDIR")))
-        %standard-phases
-        )
+       (modify-phases %standard-phases
+         ;; tests require a writable HOME
+         (add-before 'check 'set-home
+           (lambda _
+             (setenv "HOME" (getenv "TMPDIR"))
+             #t)))
        #:configure-flags
        (let ((pcb (assoc-ref %build-inputs "pcb")))
          (list (string-append "--with-pcb-datadir=" pcb "/share")
@@ -229,10 +228,6 @@ optimizer; and it can produce photorealistic and design review images.")
               (snippet
                ;; Remove a non-free file.
                '(delete-file "doc/psfig.sty"))
-              (modules '((guix build utils)
-                         (guix build download)
-                         (guix ftp-client)))
-              (imported-modules modules)
               (patches (search-patches "fastcap-mulSetup.patch"
                                        "fastcap-mulGlobal.patch"))))
     (build-system gnu-build-system)
diff --git a/gnu/packages/enlightenment.scm b/gnu/packages/enlightenment.scm
index 2a606ebd7e..a8187f8f85 100644
--- a/gnu/packages/enlightenment.scm
+++ b/gnu/packages/enlightenment.scm
@@ -47,7 +47,6 @@
   #:use-module (gnu packages pulseaudio)
   #:use-module (gnu packages python)
   #:use-module (gnu packages tls)
-  #:use-module (gnu packages valgrind)
   #:use-module (gnu packages video)
   #:use-module (gnu packages xorg))
 
@@ -93,7 +92,6 @@
        ("mesa" ,mesa)
        ("printproto" ,printproto)
        ("scrnsaverproto" ,scrnsaverproto)
-       ("valgrind" ,valgrind)
        ("xextproto" ,xextproto)
        ("xinput" ,xinput)
        ("xpr" ,xpr)
@@ -118,12 +116,11 @@
     (arguments
      `(#:configure-flags '("--disable-silent-rules")
        #:phases
-       (alist-cons-before
-        'configure 'patch-config-files
-        (lambda _
-          (substitute* "po/Makefile.in.in"
-            (("/bin/sh") (which "bash"))))
-        %standard-phases)))
+       (modify-phases %standard-phases
+         (add-before 'configure 'patch-config-files
+           (lambda _
+             (substitute* "po/Makefile.in.in"
+                          (("/bin/sh") (which "bash"))))))))
     (home-page "http://www.enlightenment.org")
     (synopsis "Enlightenment Foundation Libraries")
     (description
@@ -273,7 +270,7 @@ Libraries with some extra bells and whistles.")
 (define-public enlightenment
   (package
     (name "enlightenment")
-    (version "0.20.9")
+    (version "0.21.0")
     (source (origin
               (method url-fetch)
               (uri
@@ -281,7 +278,7 @@ Libraries with some extra bells and whistles.")
                               name "/" name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1gniy7i3mg3q9cgqf004lvnv397yncdr2b7w1gzj69bvv7a2lyfv"))))
+                "0p85dmk9ysbf9y7vlc92z7495mh9l860xj3s8pspy9mscv3dnwg9"))))
     (build-system gnu-build-system)
     (arguments
      `(#:configure-flags '("--enable-mount-eeze")))
diff --git a/gnu/packages/flashing-tools.scm b/gnu/packages/flashing-tools.scm
index 0ab8bc57ee..e3f8d80c02 100644
--- a/gnu/packages/flashing-tools.scm
+++ b/gnu/packages/flashing-tools.scm
@@ -90,12 +90,11 @@ programmer devices.")
                           version ".tar.gz"))
       (sha256
        (base32
-        "0frxg0q09nrm95z7ymzddx7ysl77ilfbdix1m81d9jjpiv5bm64y"))
-      (patches (search-patches "avrdude-fix-libusb.patch"))))
+        "0frxg0q09nrm95z7ymzddx7ysl77ilfbdix1m81d9jjpiv5bm64y"))))
     (build-system gnu-build-system)
     (inputs
      `(("libelf" ,libelf)
-       ("libusb" ,libusb)
+       ("libusb" ,libusb-compat)
        ("libftdi" ,libftdi)))
     (native-inputs
      `(("bison" ,bison)
diff --git a/gnu/packages/fonts.scm b/gnu/packages/fonts.scm
index 4b8a278610..3faeb2ebd8 100644
--- a/gnu/packages/fonts.scm
+++ b/gnu/packages/fonts.scm
@@ -6,7 +6,8 @@
 ;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com>
 ;;; Copyright © 2015 Eric Dvorsak <eric@dvorsak.fr>
 ;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
-;;; Copyright © 2016 Nils Gillmann <niasterisk@grrlz.net>
+;;; Copyright © 2015, 2016 Leo Famulari <leo@famulari.name>
+;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is>
 ;;; Copyright © 2016 Jookia <166291@gmail.com>
 ;;; Copyright © 2016 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2016 Dmitry Nikolaev <cameltheman@gmail.com>
@@ -599,15 +600,15 @@ languages, plus Greek and Cyrillic.")
 (define-public font-gnu-unifont
   (package
     (name "font-gnu-unifont")
-    (version "8.0.01")
+    (version "9.0.01")
     (source (origin
               (method url-fetch)
               (uri (string-append
-                    "mirror://gnu/unifont/unifont-8.0.01/unifont-"
+                    "mirror://gnu/unifont/unifont-" version "/unifont-"
                     version ".tar.gz"))
               (sha256
                (base32
-                "176bzc2y3i49xavrmbyyz5lkqp0qq3bkj7rjrl197kib873by82b"))))
+                "14z4lx6asa94i73m19lsdgzqjn9xzi8320h3dafvzq9ima94pm9b"))))
     (build-system gnu-build-system)
     (outputs '("out" ; TrueType version
                "pcf" ; PCF (bitmap) version
diff --git a/gnu/packages/freedesktop.scm b/gnu/packages/freedesktop.scm
index 53bd757c1d..458331d703 100644
--- a/gnu/packages/freedesktop.scm
+++ b/gnu/packages/freedesktop.scm
@@ -82,14 +82,14 @@ freedesktop.org project.")
 (define-public libinput
   (package
     (name "libinput")
-    (version "1.3.0")
+    (version "1.4.0")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://freedesktop.org/software/libinput/"
                                   name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1sn1s1bz06fa49izqkqf519sjclsvhf42i6slzx1w5hx4vxpb2lr"))))
+                "085lcxy111j8r1lwyghsc6zrysqh0vg8xip5axxsdl8r8n3i1vvn"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)))
@@ -99,7 +99,7 @@ freedesktop.org project.")
      `(("libevdev" ,libevdev)
        ("mtdev" ,mtdev)
        ("libwacom" ,libwacom)))
-    (home-page "http://www.freedesktop.org/wiki/Software/libinput/")
+    (home-page "https://www.freedesktop.org/wiki/Software/libinput/")
     (synopsis "Input devices handling library")
     (description
      "Libinput is a library to handle input devices for display servers and
diff --git a/gnu/packages/games.scm b/gnu/packages/games.scm
index 6036ce3e19..731e243f46 100644
--- a/gnu/packages/games.scm
+++ b/gnu/packages/games.scm
@@ -17,7 +17,7 @@
 ;;; Copyright © 2015 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
 ;;; Copyright © 2016 Rodger Fox <thylakoid@openmailbox.org>
 ;;; Copyright © 2016 Manolis Fragkiskos Ragkousis <manolis837@gmail.com>
-;;; Copyright © 2016 Nils Gillmann <niasterisk@grrlz.net>
+;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is>
 ;;; Copyright © 2016 Albin Söderqvist <albin@fripost.org>
 ;;; Copyright © 2016 Kei Kebreau <kei@openmailbox.org>
 ;;; Copyright © 2016 Alex Griffin <a@ajgrf.com>
@@ -2493,3 +2493,39 @@ in strikes against the evil corporation.")
                    license:cc-by-sa3.0
                    license:cc0
                    license:public-domain))))
+
+(define-public chromium-bsu
+  (package
+    (name "chromium-bsu")
+    (version "0.9.15.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://sourceforge/" name
+                                  "/Chromium B.S.U. source code/"
+                                  name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "01c4mki0rpz6wrqbf18fj4vd7axln5v0xqm80cyksbv63g04s6w6"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+                  (add-after 'set-paths 'set-sdl-paths
+                             (lambda* (#:key inputs #:allow-other-keys)
+                               (setenv "CPATH"
+                                       (string-append (assoc-ref inputs "sdl-union")
+                                                      "/include/SDL"))
+                               #t)))))
+    (native-inputs `(("pkg-config" ,pkg-config)))
+    (inputs `(("glu" ,glu)
+              ("quesoglc" ,quesoglc)
+              ("sdl-union" ,(sdl-union (list sdl sdl-image sdl-mixer)))))
+    (home-page "http://chromium-bsu.sourceforge.net/")
+    (synopsis "Fast-paced, arcade-style, top-scrolling space shooter")
+    (description
+     "In this game you are the captain of the cargo ship Chromium B.S.U. and
+are responsible for delivering supplies to the troops on the front line.  Your
+ship has a small fleet of robotic fighters which you control from the relative
+safety of the Chromium vessel.")
+    ;; Clarified Artistic License for everything but sound, which is covered
+    ;; by the Expat License.
+    (license (list license:clarified-artistic license:expat))))
diff --git a/gnu/packages/gd.scm b/gnu/packages/gd.scm
index 4d6b1a3c89..3313ee68f2 100644
--- a/gnu/packages/gd.scm
+++ b/gnu/packages/gd.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013, 2016 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2015, 2016 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
 ;;;
@@ -40,16 +40,21 @@
     ;; Note: With libgd.org now pointing to github.com, genuine old
     ;; tarballs are no longer available.  Notably, versions 2.0.x are
     ;; missing.
-    (version "2.2.1")
+    (version "2.2.2")
 
     (source (origin
              (method url-fetch)
              (uri (string-append
                    "https://github.com/libgd/libgd/releases/download/gd-"
                    version "/libgd-" version ".tar.xz"))
+             (patches (search-patches "gd-fix-test-on-i686.patch"
+                                      "gd-CVE-2016-5766.patch"
+                                      "gd-CVE-2016-6128.patch"
+                                      "gd-CVE-2016-6132.patch"
+                                      "gd-CVE-2016-6214.patch"))
              (sha256
               (base32
-               "0xmrqka1ggqgml84xbmkw1y0r0lg7qn657v5b1my8pry92p651vh"))))
+               "1311g5mva2xlzqv3rjqjc4jjkn5lzls4skvr395h633zw1n7b7s8"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)))
diff --git a/gnu/packages/geeqie.scm b/gnu/packages/geeqie.scm
index 7ea75aa3a0..110fb68ea0 100644
--- a/gnu/packages/geeqie.scm
+++ b/gnu/packages/geeqie.scm
@@ -22,29 +22,33 @@
   #:use-module (guix download)
   #:use-module ((guix licenses) #:prefix l:)
   #:use-module (guix build-system gnu)
-  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages autotools)
+  #:use-module (gnu packages compression)
+  #:use-module (gnu packages ghostscript)
   #:use-module (gnu packages glib)
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages image)
-  #:use-module (gnu packages ghostscript)
-  #:use-module (gnu packages compression)
+  #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages xml))
 
 (define-public exiv2                              ; XXX: move elsewhere?
   (package
     (name "exiv2")
-    (version "0.23")
+    (version "0.25")
     (source (origin
              (method url-fetch)
              (uri (string-append "http://www.exiv2.org/exiv2-"
                                  version ".tar.gz"))
              (sha256
               (base32
-               "04bbg2cg6mgcyz435zamx37sp5zw44n2alb59ki1daz71f851yl1"))))
+               "197g6vgcpyf9p2cwn5p5hb1r714xsk1v4p96f5pv1z8mi9vzq2y8"))))
     (build-system gnu-build-system)
     (arguments '(#:tests? #f))                    ; no `check' target
     (propagated-inputs
-     `(("expat" ,expat) ("zlib" ,zlib)))
+     `(("expat" ,expat)
+       ("zlib" ,zlib)))
+    (native-inputs
+     `(("intltool" ,intltool)))
     (home-page "http://www.exiv2.org/")
     (synopsis "Library and command-line utility to manage image metadata")
     (description
@@ -61,16 +65,23 @@ and XMP metadata of images in various formats.")
 (define-public geeqie
   (package
     (name "geeqie")
-    (version "1.1")
+    (version "1.3")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://github.com/BestImageViewer/geeqie/"
-                                 "archive/" version ".tar.gz"))
-             (file-name (string-append name "-" version ".tar.gz"))
+                                 "releases/download/v" version "/geeqie-"
+                                 version ".tar.xz"))
              (sha256
               (base32
-               "1kzy39z9505xkayyx7rjj2wda76xy3ch1s5z35zn8yli54ffhi2m"))))
+               "0gzc82sy66pbsmq7lnmq4y37zqad1zfwfls3ik3dmfm8s5nmcvsb"))))
     (build-system gnu-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'autogen
+           (lambda _
+             (setenv "NOCONFIGURE" "true")
+             (zero? (system* "sh" "autogen.sh")))))))
     (inputs
      `(;; ("libchamplain" ,libchamplain)
        ("lcms" ,lcms)
@@ -78,7 +89,10 @@ and XMP metadata of images in various formats.")
        ("libpng" ,libpng)
        ("gtk+" ,gtk+-2)))
     (native-inputs
-     `(("intltool" ,intltool)
+     `(("autoconf" ,autoconf)
+       ("automake" ,automake)
+       ("glib" ,glib "bin") ; glib-gettextize
+       ("intltool" ,intltool)
        ("pkg-config" ,pkg-config)))
     (home-page "http://www.geeqie.org/")
     (synopsis "Lightweight GTK+ based image viewer")
diff --git a/gnu/packages/gimp.scm b/gnu/packages/gimp.scm
index 1cd779a9b0..d5c58e26ba 100644
--- a/gnu/packages/gimp.scm
+++ b/gnu/packages/gimp.scm
@@ -130,6 +130,7 @@ buffers.")
               (uri (string-append "http://download.gimp.org/pub/gimp/v"
                                   (version-major+minor version)
                                   "/gimp-" version ".tar.bz2"))
+              (patches (search-patches "gimp-CVE-2016-4994.patch"))
               (sha256
                (base32
                 "1dsgazia9hmab8cw3iis7s69dvqyfj5wga7ds7w2q5mms1xqbqwm"))))
diff --git a/gnu/packages/gl.scm b/gnu/packages/gl.scm
index 907e3bf30a..7fa79bbde3 100644
--- a/gnu/packages/gl.scm
+++ b/gnu/packages/gl.scm
@@ -20,29 +20,29 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu packages gl)
-  #:use-module (ice-9 match)
-  #:use-module (guix build utils)
-  #:use-module ((guix licenses) #:prefix l:)
-  #:use-module (guix packages)
-  #:use-module (guix download)
-  #:use-module (guix build-system gnu)
-  #:use-module (guix build-system cmake)
-  #:use-module (guix packages)
-  #:use-module (guix utils)
   #:use-module (gnu packages autotools)
   #:use-module (gnu packages bison)
   #:use-module (gnu packages flex)
-  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages fontutils)
+  #:use-module (gnu packages freedesktop)
   #:use-module (gnu packages gettext)
+  #:use-module (gnu packages guile)
   #:use-module (gnu packages linux)
+  #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages python)
-  #:use-module (gnu packages xorg)
-  #:use-module (gnu packages xml)
-  #:use-module (gnu packages fontutils)
-  #:use-module (gnu packages guile)
   #:use-module (gnu packages video)
   #:use-module (gnu packages xdisorg)
-  #:use-module (gnu packages zip))
+  #:use-module (gnu packages xml)
+  #:use-module (gnu packages xorg)
+  #:use-module (gnu packages zip)
+  #:use-module (guix download)
+  #:use-module (guix build utils)
+  #:use-module (guix build-system gnu)
+  #:use-module (guix build-system cmake)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix packages)
+  #:use-module (guix utils)
+  #:use-module (ice-9 match))
 
 (define-public glu
   (package
@@ -71,7 +71,7 @@ matrices for creating perspective and orthographic projections,
 positioning a camera, and selection/picking, Rendering of disk,
 cylinder, and sphere primitives, Interpreting OpenGL error values
 as ASCII text.")
-    (license (l:x11-style "http://directory.fsf.org/wiki/License:SGIFreeBv2"))))
+    (license (license:x11-style "http://directory.fsf.org/wiki/License:SGIFreeBv2"))))
 
 (define-public freeglut
   (package
@@ -112,7 +112,7 @@ GLUT (and hence freeglut) allows the user to create and manage windows
 containing OpenGL contexts on a wide range of platforms and also read
 the mouse, keyboard and joystick functions.  Freeglut is released under
 the X-Consortium license.")
-    (license l:x11)))
+    (license license:x11)))
 
 (define-public ftgl
   (package
@@ -138,7 +138,7 @@ the X-Consortium license.")
      "FTGL is a font rendering library for OpenGL applications.  Supported
 rendering modes are: Bitmaps, Anti-aliased pixmaps, Texture maps, Outlines,
 Polygon meshes, and Extruded polygon meshes.")
-    (license l:x11)))
+    (license license:x11)))
 
 (define-public s2tc
   (package
@@ -170,7 +170,7 @@ Polygon meshes, and Extruded polygon meshes.")
     (description
      "S2TC is a patent-free implementation of S3 Texture Compression (S3TC,
 also known as DXTn or DXTC) for Mesa.")
-    (license l:expat)))
+    (license license:expat)))
 
 ;;; Mesa needs LibVA headers to build its Gallium-based VA API implementation;
 ;;; LibVA itself depends on Mesa.  We use the following to solve the circular
@@ -287,7 +287,7 @@ also known as DXTn or DXTC) for Mesa.")
 a system for rendering interactive 3D graphics.  A variety of device drivers
 allows Mesa to be used in many different environments ranging from software
 emulation to complete hardware acceleration for modern GPUs.")
-    (license l:x11)))
+    (license license:x11)))
 
 (define-public mesa-headers
   (package
@@ -317,12 +317,12 @@ emulation to complete hardware acceleration for modern GPUs.")
     (method url-fetch)
     (uri (string-append "ftp://ftp.freedesktop.org/pub/mesa/demos/" version
                         "/mesa-demos-" version ".tar.bz2"))
-    (sha256 (base32 "14msj0prbl3ljwd24yaqv9pz1xzicdmqgg616xxlppbdh6syrgz4"))))
+    (sha256 (base32 "1vqb7s5m3fcg2csbiz45mha1pys2xx6rhw94fcyvapqdpm5iawy1"))))
 
 (define-public mesa-utils
   (package
     (name "mesa-utils")
-    (version "8.2.0")
+    (version "8.3.0")
     (source (mesa-demos-source version))
     (build-system gnu-build-system)
     (inputs
@@ -332,12 +332,7 @@ emulation to complete hardware acceleration for modern GPUs.")
     (native-inputs
      `(("pkg-config" ,pkg-config)))
     (arguments
-     '(;; XXX: fails to build against latest mesa:
-       ;;   eglut.c: error: 'EGL_SCREEN_BIT_MESA' undeclared
-       ;;
-       ;; <https://bugs.freedesktop.org/show_bug.cgi?id=91643>
-       #:configure-flags '("--disable-egl")
-       #:phases
+     '(#:phases
        (modify-phases %standard-phases
          (replace
           'install
@@ -355,7 +350,7 @@ emulation to complete hardware acceleration for modern GPUs.")
      "The mesa-utils package contains several utility tools for Mesa: glxdemo,
 glxgears, glxheads, and glxinfo.")
     ;; glxdemo is public domain; others expat.
-    (license (list l:expat l:public-domain))))
+    (license (list license:expat license:public-domain))))
 
 (define-public glew
   (package
@@ -399,7 +394,7 @@ glxgears, glxheads, and glxinfo.")
 loading library.  GLEW provides efficient run-time mechanisms for determining
 which OpenGL extensions are supported on the target platform.  OpenGL core and
 extension functionality is exposed in a single header file.")
-    (license l:bsd-3)))
+    (license license:bsd-3)))
 
 (define-public guile-opengl
   (package
@@ -445,7 +440,7 @@ extension functionality is exposed in a single header file.")
     (description
      "Guile-OpenGL is a library for Guile that provides bindings to the
 OpenGL graphics API.")
-    (license l:lgpl3+)))
+    (license license:lgpl3+)))
 
 (define-public libepoxy
   (package
@@ -502,7 +497,7 @@ OpenGL graphics API.")
     (synopsis "A library for handling OpenGL function pointer management")
     (description
      "A library for handling OpenGL function pointer management.")
-    (license l:x11)))
+    (license license:x11)))
 
 (define-public soil
   (package
@@ -544,4 +539,4 @@ OpenGL graphics API.")
     (description
      "SOIL is a tiny C library used primarily for uploading textures into
 OpenGL.")
-    (license l:public-domain)))
+    (license license:public-domain)))
diff --git a/gnu/packages/gnunet.scm b/gnu/packages/gnunet.scm
index c4e2a37955..f052eab40c 100644
--- a/gnu/packages/gnunet.scm
+++ b/gnu/packages/gnunet.scm
@@ -3,7 +3,6 @@
 ;;; Copyright © 2014 Sree Harsha Totakura <sreeharsha@totakura.in>
 ;;; Copyright © 2015 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2015 Efraim Flashner <efraim@flashner.co.il>
-;;; Copyright © 2016 Ni* Gillmann <ng@niasterisk.space>
 ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is>
@@ -154,13 +153,16 @@ and support for SSL3 and TLS.")
 (define-public gnurl
   (package
    (name "gnurl")
-   (version "7.45.0")
+   (version "7.48.0")
    (source (origin
             (method url-fetch)
-            (uri (string-append "https://gnunet.org/sites/default/files/gnurl-"
-                                version ".tar.bz2"))
+            (uri (let ((version-with-underscores
+                        (string-join (string-split version #\.) "_")))
+                   (string-append "https://gnunet.org/sites/default/files/"
+                                  name "-" version-with-underscores ".tar.bz2")))
             (sha256
-             (base32 "0hd8w4wyjwagd4k6vm6srphqbmysz08rcwf8z7f4b2d6d2yrn3mm"))))
+             (base32
+              "14gch4rdibrc8qs4mijsczxvl45dsclf234g17dk6c8nc2s4bm0a"))))
    (build-system gnu-build-system)
    (inputs `(("gnutls" ,gnutls)
              ("libidn" ,libidn)
diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm
index 2ef241036a..2b4ce71866 100644
--- a/gnu/packages/gnupg.scm
+++ b/gnu/packages/gnupg.scm
@@ -60,7 +60,7 @@
        (base32
         "0ywxwswizmkyciy480kzczxn6nhbgzf3z8my4nk43nvv67k4x87j"))))
     (build-system gnu-build-system)
-    (home-page "http://gnupg.org")
+    (home-page "https://gnupg.org")
     (synopsis "Library of error values for GnuPG components")
     (description
      "Libgpg-error is a small library that defines common error values
@@ -96,7 +96,7 @@ Daemon and possibly more in the future.")
        (list (string-append "--with-gpg-error-prefix="
                             (assoc-ref %build-inputs "libgpg-error-host")))))
     (outputs '("out" "debug"))
-    (home-page "http://gnupg.org/")
+    (home-page "https://gnupg.org/")
     (synopsis "Cryptographic function library")
     (description
      "Libgcrypt is a general-purpose cryptographic library.  It provides the
@@ -122,7 +122,7 @@ generation.")
 (define-public libassuan
   (package
     (name "libassuan")
-    (version "2.4.2")
+    (version "2.4.3")
     (source
      (origin
       (method url-fetch)
@@ -130,11 +130,11 @@ generation.")
                           version ".tar.bz2"))
       (sha256
        (base32
-        "086bbcdnvs48qq5g4iac7dpk76j0q3jrp16mchdvyx0b720xq1mv"))))
+        "0w9bmasln4z8mn16s1is55a06w3nv8jbyal496z5jvr5vcxkm112"))))
     (build-system gnu-build-system)
     (propagated-inputs
      `(("libgpg-error" ,libgpg-error) ("pth" ,pth)))
-    (home-page "http://gnupg.org")
+    (home-page "https://gnupg.org")
     (synopsis
      "IPC library used by GnuPG and related software")
     (description
@@ -171,7 +171,7 @@ provided.")
                    '())
              (string-append "--with-gpg-error-prefix="
                             (assoc-ref %build-inputs "libgpg-error")))))
-    (home-page "http://www.gnupg.org")
+    (home-page "https://www.gnupg.org")
     (synopsis "CMS and X.509 access library")
     (description
      "KSBA (pronounced Kasbah) is a library to make X.509 certificates
@@ -195,7 +195,7 @@ specifications are building blocks of S/MIME and TLS.")
        (base32
         "12n0nvhw4fzwp0k7gjv3rc6pdml0qiinbbfiz4ilg6pl5kdxvnvd"))))
     (build-system gnu-build-system)
-    (home-page "http://www.gnupg.org")
+    (home-page "https://www.gnupg.org")
     (synopsis "Non-preemptive thread library")
     (description
      "Npth is a library to provide the GNU Pth API and thus a non-preemptive
@@ -242,7 +242,7 @@ compatible to GNU Pth.")
           (substitute* "tests/openpgp/defs.inc"
             (("/bin/pwd") (which "pwd"))))
        %standard-phases)))
-    (home-page "http://gnupg.org/")
+    (home-page "https://gnupg.org/")
     (synopsis "GNU Privacy Guard")
     (description
      "The GNU Privacy Guard is a complete implementation of the OpenPGP
@@ -332,7 +332,7 @@ libskba (working with X.509 certificates and CMS data).")
      `(("gnupg" ,gnupg-2.0)
        ("libassuan" ,libassuan)))
     (arguments '(#:make-flags '("GPG=gpg2")))
-    (home-page "http://www.gnupg.org/related_software/gpgme/")
+    (home-page "https://www.gnupg.org/related_software/gpgme/")
     (synopsis "Library providing simplified access to GnuPG functionality")
     (description
      "GnuPG Made Easy (GPGME) is a library designed to make access to GnuPG
@@ -418,7 +418,7 @@ decrypt messages using the OpenPGP format by making use of GPGME.")
                                     "test_gnupg.py" "--no-doctests")))))))
     (native-inputs
      `(("gnupg" ,gnupg-1)))
-    (home-page "http://packages.python.org/python-gnupg/index.html")
+    (home-page "https://packages.python.org/python-gnupg/index.html")
     (synopsis "Wrapper for the GNU Privacy Guard")
     (description
       "This module allows easy access to GnuPG’s key management, encryption
@@ -466,7 +466,7 @@ to the process.
 pius-keyring-mgr and pius-party-worksheet help organisers of
 PGP keysigning parties.")
    (license license:gpl2)
-   (home-page "http://www.phildev.net/pius/index.shtml")))
+   (home-page "https://www.phildev.net/pius/index.shtml")))
 
 (define-public signing-party
   (package
@@ -566,7 +566,7 @@ including tools for signing keys, keyring analysis, and party preparation.
    ;; and caff and gpgsigs: bsd-3, see
    ;; http://packages.debian.org/changelogs/pool/main/s/signing-party/current/copyright
    (license license:gpl2)
-   (home-page "http://pgp-tools.alioth.debian.org/")))
+   (home-page "https://pgp-tools.alioth.debian.org/")))
 
 (define-public pinentry-tty
   (package
diff --git a/gnu/packages/golang.scm b/gnu/packages/golang.scm
new file mode 100644
index 0000000000..cc1b66f0ae
--- /dev/null
+++ b/gnu/packages/golang.scm
@@ -0,0 +1,185 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016 Matthew Jordan <matthewjordandevops@yandex.com>
+;;; Copyright © 2016 Andy Wingo <wingo@igalia.com>
+;;;
+;;; This file is an addendum 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 (gnu packages golang)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix utils)
+  #:use-module (guix download)
+  #:use-module (guix packages)
+  #:use-module (guix build-system gnu)
+  #:use-module (gnu packages admin)
+  #:use-module (gnu packages gcc)
+  #:use-module (gnu packages base)
+  #:use-module (gnu packages perl)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages pcre)
+  #:use-module (ice-9 match)
+  #:use-module (srfi srfi-1))
+
+;; According to https://golang.org/doc/install/gccgo, gccgo-4.8.2 includes a
+;; complete go-1.1.2 implementation, gccgo-4.9 includes a complete go-1.2
+;; implementation, and gccgo-5 a complete implementation of go-1.4.  Ultimately
+;; we hope to build go-1.5+ with a bootstrap process using gccgo-5.  As of
+;; go-1.5, go cannot be bootstrapped without go-1.4, so we need to use go-1.4 or
+;; gccgo-5.  Mips is not officially supported, but it should work if it is
+;; bootstrapped.
+
+(define-public go-1.4
+  (package
+    (name "go")
+    (version "1.4.3")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://storage.googleapis.com/golang/"
+                                  name version ".src.tar.gz"))
+              (sha256
+               (base32
+                "0na9yqilzpvq0bjndbibfp07wr796gf252y471cip10bbdqgqiwr"))))
+    (build-system gnu-build-system)
+    (outputs '("out"
+               "doc"
+               "tests"))
+    (arguments
+     `(#:modules ((ice-9 match)
+                  (guix build gnu-build-system)
+                  (guix build utils))
+       #:tests? #f ; Tests are run by the all.bash script.
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure)
+         (add-after 'patch-generated-file-shebangs 'chdir
+           (lambda _
+             (chdir "src")))
+         (add-before 'build 'prebuild
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let* ((gcclib (string-append (assoc-ref inputs "gcc:lib") "/lib"))
+                    (ld (string-append (assoc-ref inputs "libc") "/lib"))
+                    (loader (car (find-files ld "^ld-linux.+")))
+                    (net-base (assoc-ref inputs "net-base"))
+                    (tzdata-path
+                     (string-append (assoc-ref inputs "tzdata") "/share/zoneinfo"))
+                    (output (assoc-ref outputs "out")))
+
+               ;; Removing net/ tests, which fail when attempting to access
+               ;; network resources not present in the build container.
+               (for-each delete-file
+                         '("net/multicast_test.go" "net/parse_test.go"
+                           "net/port_test.go"))
+
+               ;; Add libgcc to the RUNPATH.
+               (substitute* "cmd/go/build.go"
+                 (("cgoldflags := \\[\\]string\\{\\}")
+                  (string-append "cgoldflags := []string{"
+                                 "\"-rpath=" gcclib "\"}"))
+                 (("ldflags := buildLdflags")
+                  (string-append
+                   "ldflags := buildLdflags\n"
+                   "ldflags = append(ldflags, \"-r\")\n"
+                   "ldflags = append(ldflags, \"" gcclib "\")\n")))
+
+               (substitute* "os/os_test.go"
+                 (("/usr/bin") (getcwd))
+                 (("/bin/pwd") (which "pwd")))
+
+               ;; Disable failing tests: these tests attempt to access
+               ;; commands or network resources which are neither available or
+               ;; necessary for the build to succeed.
+               (for-each
+                (match-lambda
+                  ((file regex)
+                   (substitute* file
+                     ((regex all before test_name)
+                      (string-append before "Disabled" test_name)))))
+                '(("net/net_test.go" "(.+)(TestShutdownUnix.+)")
+                  ("net/dial_test.go" "(.+)(TestDialTimeout.+)")
+                  ("os/os_test.go" "(.+)(TestHostname.+)")
+                  ("time/format_test.go" "(.+)(TestParseInSydney.+)")
+                  ("os/exec/exec_test.go" "(.+)(TestEcho.+)")
+                  ("os/exec/exec_test.go" "(.+)(TestCommandRelativeName.+)")
+                  ("os/exec/exec_test.go" "(.+)(TestCatStdin.+)")
+                  ("os/exec/exec_test.go" "(.+)(TestCatGoodAndBadFile.+)")
+                  ("os/exec/exec_test.go" "(.+)(TestExitStatus.+)")
+                  ("os/exec/exec_test.go" "(.+)(TestPipes.+)")
+                  ("os/exec/exec_test.go" "(.+)(TestStdinClose.+)")
+                  ("syscall/syscall_unix_test.go" "(.+)(TestPassFD\\(.+)")
+                  ("os/exec/exec_test.go" "(.+)(TestExtraFiles.+)")))
+
+               (substitute* "net/lookup_unix.go"
+                 (("/etc/protocols") (string-append net-base "/etc/protocols")))
+               (substitute* "time/zoneinfo_unix.go"
+                 (("/usr/share/zoneinfo/") tzdata-path))
+               (substitute* (find-files "cmd" "asm.c")
+                 (("/lib/ld-linux.*\\.so\\.[0-9]") loader))
+               #t)))
+
+         (replace 'build
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             ;; FIXME: Some of the .a files are not bit-reproducible.
+             (let* ((output (assoc-ref outputs "out")))
+               (setenv "CC" (which "gcc"))
+               (setenv "GOOS" "linux")
+               (setenv "GOROOT" (dirname (getcwd)))
+               (setenv "GOROOT_FINAL" output)
+               (setenv "CGO_ENABLED" "1")
+               (zero? (system* "sh" "all.bash")))))
+
+         (replace 'install
+           (lambda* (#:key outputs inputs #:allow-other-keys)
+             (let* ((output (assoc-ref outputs "out"))
+                    (doc_out (assoc-ref outputs "doc"))
+                    (bash (string-append (assoc-ref inputs "bash") "bin/bash"))
+                    (docs (string-append doc_out "/share/doc/" ,name "-" ,version))
+                    (tests (string-append
+                            (assoc-ref outputs "tests") "/share/" ,name "-" ,version)))
+               (mkdir-p tests)
+               (copy-recursively "../test" (string-append tests "/test"))
+               (delete-file-recursively "../test")
+               (mkdir-p docs)
+               (copy-recursively "../api" (string-append docs "/api"))
+               (delete-file-recursively "../api")
+               (copy-recursively "../doc" (string-append docs "/doc"))
+               (delete-file-recursively "../doc")
+
+               (for-each (lambda (file)
+                           (let ((file (string-append "../" file)))
+                             (install-file file docs)
+                             (delete-file file)))
+                         '("README" "CONTRIBUTORS" "AUTHORS" "PATENTS"
+                           "LICENSE" "VERSION" "robots.txt"))
+               (copy-recursively "../" output)
+               #t))))))
+    (inputs
+     `(("tzdata" ,tzdata)
+       ("pcre" ,pcre)
+       ("gcc:lib" ,gcc "lib")))
+    (native-inputs
+     `(("pkg-config" ,%pkg-config)
+       ("which" ,which)
+       ("net-base" ,net-base)
+       ("perl" ,perl)))
+
+    (home-page "https://golang.org/")
+    (synopsis "Compiler and libraries for Go, a statically-typed language")
+    (description "Go, also commonly referred to as golang, is an imperative
+programming language.  Designed primarily for systems programming, it is a
+compiled, statically typed language in the tradition of C and C++, with
+garbage collection, various safety features and in the style of communicating
+sequential processes (CSP) concurrent programming features added.")
+    (license license:bsd-3)))
diff --git a/gnu/packages/graphics.scm b/gnu/packages/graphics.scm
index ca99cd0302..f6298ce394 100644
--- a/gnu/packages/graphics.scm
+++ b/gnu/packages/graphics.scm
@@ -3,6 +3,7 @@
 ;;; Copyright © 2015 Tomáš Čech <sleep_walker@gnu.org>
 ;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -139,15 +140,15 @@ application can be customized via its API for Python scripting.")
 (define-public cgal
   (package
     (name "cgal")
-    (version "4.6.3")
+    (version "4.8.1")
     (source (origin
               (method url-fetch)
               (uri (string-append
-                    "http://gforge.inria.fr/frs/download.php/file/"
-                    "35139/CGAL-4.6.3.tar.xz"))
+                    "https://github.com/CGAL/cgal/releases/download/releases/"
+                    "CGAL-" version "/CGAL-" version ".tar.xz"))
               (sha256
                (base32
-                "08gwjjh0qz3fakj1y2nsl2qvb0qv5lc7k1pxwjkagh37hxxh4f73"))))
+                "1c41yzl2jg3d6zx5k0iccwqwibp950q7dr7z7pp4xi9wlph3c87s"))))
     (build-system cmake-build-system)
     (arguments
      '(;; "RelWithDebInfo" is not supported.
@@ -211,9 +212,17 @@ exception-handling library.")
                 "0ca2j526n4wlamrxb85y2jrgcv0gf21b3a19rr0gh4rjqkv1581n"))
               (modules '((guix build utils)))
               (snippet
-               '(substitute* (find-files "." "tmpDir\\.h")
-                  (("\"/var/tmp/\"")
-                   "\"/tmp/\"")))
+               '(begin
+                  (substitute* (find-files "." "tmpDir\\.h")
+                    (("\"/var/tmp/\"")
+                     "\"/tmp/\""))
+
+                  ;; Install 'ImfStdIO.h'.  Reported at
+                  ;; <https://lists.nongnu.org/archive/html/openexr-devel/2016-06/msg00001.html>
+                  ;; and <https://github.com/openexr/openexr/pull/184>.
+                  (substitute* "IlmImf/Makefile.in"
+                    (("ImfIO\\.h")
+                     "ImfIO.h ImfStdIO.h"))))
               (patches (search-patches "openexr-missing-samples.patch"))))
     (build-system gnu-build-system)
     (arguments
@@ -246,7 +255,7 @@ storage of the \"EXR\" file format for storing 16-bit floating-point images.")
 (define-public openimageio
   (package
     (name "openimageio")
-    (version "1.5.18")
+    (version "1.6.15")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/OpenImageIO/oiio/"
@@ -254,8 +263,7 @@ storage of the \"EXR\" file format for storing 16-bit floating-point images.")
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "0mn7cz19mn8dcrhkq15h25gl20ammr1wz0j2j3c2vxs6ph7zn8jy"))
-              (patches (search-patches "openimageio-boost-1.60.patch"))))
+                "144crq0205d0w5aq4iglh2rhzf54a8rv3pksy6d533b75w5d7rq7"))))
     (build-system cmake-build-system)
     ;; FIXME: To run all tests successfully, test image sets from multiple
     ;; third party sources have to be present.  For details see
diff --git a/gnu/packages/grub.scm b/gnu/packages/grub.scm
index 31b270c0d8..01f2a8454d 100644
--- a/gnu/packages/grub.scm
+++ b/gnu/packages/grub.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 Leo Famulari <leo@famulari.name>
+;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -76,20 +77,21 @@
 (define-public grub
   (package
     (name "grub")
-    (version "2.00")
+    (version "2.02beta3")
     (source (origin
              (method url-fetch)
-             (uri (string-append "mirror://gnu/grub/grub-"
-                                 version ".tar.xz"))
+             (uri (string-append
+                   "ftp://alpha.gnu.org/gnu/grub/grub-"
+                   "2.02~beta3"
+                   ".tar.xz"))
+             (file-name (string-append name "-" version ".tar.xz"))
              (sha256
               (base32
-               "0n64hpmsccvicagvr0c6v0kgp2yw0kgnd3jvsyd26cnwgs7c6kkq"))
-             (patches (search-patches "grub-gets-undeclared.patch"
-                                      "grub-freetype.patch"
-                                      "grub-CVE-2015-8370.patch"))))
+               "18ddwnw0vxs7zigvah0g6a5z5vvlz0p8fjglxv1h59sjbrakvv1h"))))
     (build-system gnu-build-system)
     (arguments
-     '(#:configure-flags '("--disable-werror")
+     '(;; Two warnings: suggest braces, signed/unsigned comparison.
+       #:configure-flags '("--disable-werror")
        #:phases (modify-phases %standard-phases
                   (add-after
                    'unpack 'patch-stuff
@@ -100,6 +102,13 @@
                      ;; Make the font visible.
                      (copy-file (assoc-ref inputs "unifont") "unifont.bdf.gz")
                      (system* "gunzip" "unifont.bdf.gz")
+
+                     ;; We hit an assertion failure in
+                     ;; grub-core/tests/video_checksum.c, as reported at
+                     ;; <https://lists.gnu.org/archive/html/grub-devel/2016-07/msg00026.html>.
+                     ;; Disable this test for now.
+                     (substitute* "tests/grub_func_test.in"
+                       (("set -e") "exit 77\nset -e"))
                      #t)))))
     (inputs
      `(;; ("lvm2" ,lvm2)
diff --git a/gnu/packages/gstreamer.scm b/gnu/packages/gstreamer.scm
index f9e677bca4..a39a3b434d 100644
--- a/gnu/packages/gstreamer.scm
+++ b/gnu/packages/gstreamer.scm
@@ -97,7 +97,7 @@ arrays of data.")
 (define-public gstreamer
   (package
     (name "gstreamer")
-    (version "1.8.0")
+    (version "1.8.2")
     (source
      (origin
       (method url-fetch)
@@ -106,7 +106,7 @@ arrays of data.")
             version ".tar.xz"))
       (sha256
        (base32
-        "1p5y9bbrhywng0prmpxv29p6jsz6vd039d49bnc98p9b45532yll"))))
+        "0hc3j684nx209p10ampvnkza3gna2yiryr7jyx701ciakh3vxglx"))))
     (build-system gnu-build-system)
     (outputs '("out" "doc"))
     (arguments
@@ -145,7 +145,7 @@ This package provides the core library and elements.")
 (define-public gst-plugins-base
   (package
     (name "gst-plugins-base")
-    (version "1.8.0")
+    (version "1.8.2")
     (source
      (origin
       (method url-fetch)
@@ -153,7 +153,7 @@ This package provides the core library and elements.")
                           name "-" version ".tar.xz"))
       (sha256
        (base32
-        "08hmg7fp519wim1fm04r7f2q2020ssdninawqsbrqjsvs70srh5b"))))
+        "13fk751vvfrfhbm4ip28vxyvlsm4b4y0bc0pvf7fqp8azg40jwcx"))))
     (build-system gnu-build-system)
     (outputs '("out" "doc"))
     (propagated-inputs
@@ -198,7 +198,7 @@ for the GStreamer multimedia library.")
 (define-public gst-plugins-good
   (package
     (name "gst-plugins-good")
-    (version "1.8.0")
+    (version "1.8.2")
     (source
      (origin
       (method url-fetch)
@@ -207,7 +207,7 @@ for the GStreamer multimedia library.")
             name "-" version ".tar.xz"))
       (sha256
        (base32
-        "0kczdvqxvl8kxiy2d7czv16jp73hv9k3nykh47ckihnv8x6i6362"))))
+        "0i1rlbbx3m6ykvcdyaidsd8wa2b7nq2qmcvbrsg00yivi88ljxcd"))))
     (build-system gnu-build-system)
     (inputs
      `(("aalib" ,aalib)
@@ -336,7 +336,7 @@ par compared to the rest.")
 (define-public gst-plugins-ugly
   (package
     (name "gst-plugins-ugly")
-    (version "1.8.0")
+    (version "1.8.2")
     (source
      (origin
        (method url-fetch)
@@ -344,7 +344,7 @@ par compared to the rest.")
                            name "/" name "-" version ".tar.xz"))
        (sha256
         (base32
-         "137b6kqykh5nwbmiv28nn1pc1d2x2rb2xxg382pc9pa9gpxpyrak"))))
+         "1b58s7z430cbbaw8mgy87kslbpmj3xmm66wsr7bddhcgm6i36nww"))))
     (build-system gnu-build-system)
     (inputs
      `(("gst-plugins-base" ,gst-plugins-base)
@@ -374,7 +374,7 @@ distribution problems in some jurisdictions, e.g. due to patent threats.")
 (define-public gst-libav
   (package
     (name "gst-libav")
-    (version "1.8.0")
+    (version "1.8.2")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -382,7 +382,7 @@ distribution problems in some jurisdictions, e.g. due to patent threats.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0719njp8aarhvn038pijq6dmsnli0zlg146hyfs3rsdffs4f472s"))))
+                "0yk8pxg3xi26ndj7pliqdfphy0jmqsq4dmdzy31gbd9rgficgwxm"))))
     (build-system gnu-build-system)
     (arguments
      '(#:configure-flags '("--with-system-libav")
@@ -411,7 +411,7 @@ compression formats through the use of the libav library.")
 (define-public python-gst
   (package
     (name "python-gst")
-    (version "1.8.0")
+    (version "1.8.2")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -419,7 +419,7 @@ compression formats through the use of the libav library.")
                     "gst-python-" version ".tar.xz"))
               (sha256
                (base32
-                "1spn49x7yaj69df6mxh9wwcs0y3abswkfpk84njs71lzqlbzyiff"))))
+                "15sdfa6lq5pswvi09vk51cs30yf8wr2rlm9myhb4q0c2jhiial2g"))))
     (build-system gnu-build-system)
     (arguments
      ;; XXX: Factorize python-sitedir with python-build-system.
diff --git a/gnu/packages/imagemagick.scm b/gnu/packages/imagemagick.scm
index 4497150db7..038ca00c79 100644
--- a/gnu/packages/imagemagick.scm
+++ b/gnu/packages/imagemagick.scm
@@ -41,14 +41,14 @@
 (define-public imagemagick
   (package
     (name "imagemagick")
-    (version "6.9.4-10")
+    (version "6.9.5-0")
     (source (origin
              (method url-fetch)
              (uri (string-append "mirror://imagemagick/ImageMagick-"
                                  version ".tar.xz"))
              (sha256
               (base32
-               "0bbac9zdjl2g8x127jx5jisih9r49980w7ar6m8xj3nyh3m83jd2"))))
+               "1d1hmmnks071zfkpv971b3q56qlml0wv1xlw8yvq6cnybc2cwc3q"))))
     (build-system gnu-build-system)
     (arguments
      `(#:configure-flags '("--with-frozenpaths")
diff --git a/gnu/packages/irc.scm b/gnu/packages/irc.scm
index def16c939c..03f014aa4e 100644
--- a/gnu/packages/irc.scm
+++ b/gnu/packages/irc.scm
@@ -72,14 +72,16 @@
                            "-DUSE_QT5=ON" ; default is qt4
                            "-DWITH_KDE=OFF" ; no to integration
                            "-DWITH_OXYGEN=ON" ; on=embed icons
-                           "-DWITH_WEBKIT=ON") ; wants qtwebkit, in qt5
+                           "-DWITH_WEBKIT=OFF") ; qtwebkit isn't packaged
        #:tests? #f)) ; no test target
     (native-inputs `(("pkg-config" ,pkg-config)))
     (inputs
      `(("extra-cmake-modules" ,extra-cmake-modules)
        ("oxygen-icons" ,oxygen-icons)
        ("qca" ,qca)
-       ("qt", qt)
+       ("qtbase", qtbase)
+       ("qttools" ,qttools)
+       ("qtscript" ,qtscript)
        ("snorenotify" ,snorenotify)
        ("zlib" ,zlib)))
     (home-page "http://quassel-irc.org/")
diff --git a/gnu/packages/julia.scm b/gnu/packages/julia.scm
index 1cda5d89c8..e3cefb4330 100644
--- a/gnu/packages/julia.scm
+++ b/gnu/packages/julia.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015, 2016 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -26,6 +27,7 @@
   #:use-module (gnu packages)
   #:use-module (gnu packages algebra)
   #:use-module (gnu packages base)
+  #:use-module (gnu packages compression)
   #:use-module (gnu packages elf)
   #:use-module (gnu packages gcc)
   #:use-module (gnu packages llvm)
@@ -262,6 +264,7 @@
        ("mpfr" ,mpfr)
        ("wget" ,wget)
        ("which" ,which)
+       ("zlib" ,zlib)
        ("gmp" ,gmp)
        ;; FIXME: The following inputs are downloaded from upstream to allow us
        ;; to use the lightweight Julia release tarball.  Ideally, these inputs
diff --git a/gnu/packages/kde.scm b/gnu/packages/kde.scm
index b74a6051ea..34a5046d20 100644
--- a/gnu/packages/kde.scm
+++ b/gnu/packages/kde.scm
@@ -44,7 +44,7 @@
      `(("pkg-config" ,pkg-config)))
     (inputs
      `(("openssl" ,openssl)
-       ("qt" ,qt)))
+       ("qtbase" ,qtbase)))
     (home-page "http://delta.affinix.com/qca/")
     (synopsis "Libraries for the Qt Cryptographic Architecture")
     (description "The Qt Cryptographic Architecture (QCA) provides a
@@ -70,7 +70,8 @@ cards.")
      `(#:tests? #f)) ; both tests fail, require display
     (inputs
      `(("extra-cmake-modules" ,extra-cmake-modules)
-       ("qt" ,qt)))
+       ("qtbase" ,qtbase)
+       ("qttools" ,qttools)))
     (home-page "https://techbase.kde.org/Projects/Snorenotify")
     (synopsis "Qt notification framework")
     (description "Snorenotify is a multi platform Qt notification framework.
diff --git a/gnu/packages/libreoffice.scm b/gnu/packages/libreoffice.scm
index 60a6d7df73..18606f96a1 100644
--- a/gnu/packages/libreoffice.scm
+++ b/gnu/packages/libreoffice.scm
@@ -94,14 +94,14 @@ their dependencies automatically upon calculation.")
 (define-public orcus
   (package
     (name "orcus")
-    (version "0.7.1")
+    (version "0.9.2")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "http://kohei.us/files/" name "/src/lib"
                           name "-" version ".tar.xz"))
       (sha256 (base32
-               "0hva4qalg3dk6n1118ncr5fy8cqnj2f7fwldw7aa04124rj6p104"))))
+               "170racjz7s7yxza722hxsqc12788w57qnp6x6j2692pzp3qzjjfx"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)))
@@ -709,7 +709,7 @@ and to return information on pronunciations, meanings and synonyms.")
 (define-public libreoffice
   (package
     (name "libreoffice")
-    (version "5.0.5.2")
+    (version "5.1.4.2")
     (source
      (origin
       (method url-fetch)
@@ -718,7 +718,7 @@ and to return information on pronunciations, meanings and synonyms.")
           "http://download.documentfoundation.org/libreoffice/src/"
           (version-prefix version 3) "/libreoffice-" version ".tar.xz"))
       (sha256 (base32
-               "120vcxpxzs0za76fyfry281ysv6d1ianb37d1yq8py8chkdjkrqy"))))
+               "11c30y9gvsy5h3nh9pnciq57gi99plrmr6qp8hhdk2l5xmwlmrfa"))))
     (build-system gnu-build-system)
     (native-inputs
      `(;; autoreconf is run by the LibreOffice build system, since after
@@ -730,7 +730,7 @@ and to return information on pronunciations, meanings and synonyms.")
        ("cppunit" ,cppunit)
        ("flex" ,flex)
        ("pkg-config" ,pkg-config)
-       ("python" ,python)
+       ("python" ,python-wrapper)
        ("which" ,which)))
     (inputs
      `(("bluez" ,bluez)
@@ -851,6 +851,8 @@ and to return information on pronunciations, meanings and synonyms.")
           "--disable-coinmp"
           "--disable-firebird-sdbc" ; embedded firebird
           "--disable-gltf"
+          "--without-doxygen"
+          "--disable-gtk3"
           "--disable-liblangtag")))
     (home-page "https://www.libreoffice.org/")
     (synopsis "Office suite")
diff --git a/gnu/packages/libusb.scm b/gnu/packages/libusb.scm
index 1e72442c73..1f659c7594 100644
--- a/gnu/packages/libusb.scm
+++ b/gnu/packages/libusb.scm
@@ -92,14 +92,14 @@ version of libusb to run with newer libusb.")
 (define-public python-pyusb
   (package
     (name "python-pyusb")
-    (version "1.0.0rc1")
+    (version "1.0.0")
     (source
      (origin
        (method url-fetch)
-       (uri (pypi-uri "pyusb" version))
+       (uri (pypi-uri "PyUSB" version))
        (sha256
         (base32
-         "07cjq11qhngzjd746k7688s6y2x7lpj669fxqfsiy985rg0jsn7j"))))
+         "0s2k4z06fapd5vp1gnrlf8a9sjpc03p9974lzw5k6ky39akzyd2v"))))
     (build-system python-build-system)
     (arguments
      `(#:tests? #f  ;no tests
@@ -135,15 +135,14 @@ version of libusb to run with newer libusb.")
 (define-public libmtp
   (package
     (name "libmtp")
-    (version "1.1.9")
+    (version "1.1.11")
     (source (origin
              (method url-fetch)
              (uri (string-append "mirror://sourceforge/libmtp/" version
                                  "/libmtp-" version ".tar.gz"))
              (sha256
-               (base32
-                "12dinqic0ljnhrwx3rc61jc7q24ybr0mckc2ya5kh1s1np0d7w93"))
-             (patches (search-patches "libmtp-devices.patch"))))
+              (base32
+               "1sc768q2cixwanlwrz95mp389iaadl4s95486caavxx4g7znvn8m"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)))
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index bfb6580cbf..5ce6007b40 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -7,12 +7,13 @@
 ;;; Copyright © 2015 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
 ;;; Copyright © 2015, 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Christopher Allan Webber <cwebber@dustycloud.org>
-;;; Copyright © 2016 Tobias Geerinckx-Rice <tobias.geerinckx.rice@gmail.com>
+;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2016 Alex Kost <alezost@gmail.com>
 ;;; Copyright © 2016 Raymond Nicholson <rain1@openmailbox.org>
 ;;; Copyright © 2016 Mathieu Lirzin <mthl@gnu.org>
 ;;; Copyright © 2016 Nicolas Goaziou <mail@nicolasgoaziou.fr>
 ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2016 David Craven <david@craven.ch>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -30,49 +31,49 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu packages linux)
-  #:use-module ((guix licenses) #:prefix license:)
   #:use-module (gnu packages)
+  #:use-module (gnu packages admin)
+  #:use-module (gnu packages algebra)
+  #:use-module (gnu packages attr)
+  #:use-module (gnu packages autotools)
+  #:use-module (gnu packages base)
+  #:use-module (gnu packages bison)
+  #:use-module (gnu packages calendar)
+  #:use-module (gnu packages check)
   #:use-module (gnu packages compression)
-  #:use-module (gnu packages gcc)
+  #:use-module (gnu packages databases)
+  #:use-module (gnu packages docbook)
+  #:use-module (gnu packages documentation)
+  #:use-module (gnu packages elf)
   #:use-module (gnu packages flex)
-  #:use-module (gnu packages bison)
-  #:use-module (gnu packages admin)
+  #:use-module (gnu packages freedesktop)
+  #:use-module (gnu packages gcc)
+  #:use-module (gnu packages gettext)
+  #:use-module (gnu packages glib)
   #:use-module (gnu packages gperf)
+  #:use-module (gnu packages gtk)
   #:use-module (gnu packages libusb)
+  #:use-module (gnu packages maths)
   #:use-module (gnu packages ncurses)
-  #:use-module (gnu packages pciutils)
-  #:use-module (gnu packages databases)
   #:use-module (gnu packages perl)
+  #:use-module (gnu packages pciutils)
   #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages pulseaudio)
   #:use-module (gnu packages python)
+  #:use-module (gnu packages readline)
+  #:use-module (gnu packages rrdtool)
   #:use-module (gnu packages slang)
-  #:use-module (gnu packages algebra)
-  #:use-module (gnu packages gettext)
-  #:use-module (gnu packages glib)
-  #:use-module (gnu packages pulseaudio)
-  #:use-module (gnu packages attr)
-  #:use-module (gnu packages xml)
-  #:use-module (gnu packages autotools)
   #:use-module (gnu packages texinfo)
-  #:use-module (gnu packages check)
-  #:use-module (gnu packages maths)
-  #:use-module (gnu packages base)
-  #:use-module (gnu packages rrdtool)
-  #:use-module (gnu packages elf)
-  #:use-module (gnu packages gtk)
-  #:use-module (gnu packages docbook)
-  #:use-module (gnu packages documentation)
-  #:use-module (gnu packages readline)
-  #:use-module (gnu packages calendar)
   #:use-module (gnu packages tls)
-  #:use-module (gnu packages freedesktop)
-  #:use-module (guix packages)
-  #:use-module (guix download)
-  #:use-module (guix utils)
-  #:use-module (guix build-system gnu)
+  #:use-module (gnu packages xml)
   #:use-module (guix build-system cmake)
+  #:use-module (guix build-system gnu)
   #:use-module (guix build-system python)
   #:use-module (guix build-system trivial)
+  #:use-module (guix download)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix packages)
+  #:use-module (guix utils)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-2)
   #:use-module (srfi srfi-26)
@@ -225,7 +226,7 @@ for SYSTEM and optionally VARIANT, or #f if there is no such configuration."
     (search-path %load-path file)))
 
 (define-public linux-libre
-  (let* ((version "4.6.3")
+  (let* ((version "4.6.4")
          (build-phase
           '(lambda* (#:key system inputs #:allow-other-keys #:rest args)
              ;; Avoid introducing timestamps
@@ -303,7 +304,7 @@ for SYSTEM and optionally VARIANT, or #f if there is no such configuration."
              (uri (linux-libre-urls version))
              (sha256
               (base32
-               "1ajhdk9jq0pfxlhvzwarbxc23418yqav1v0z0mnfs575y5lq2gmp"))))
+               "1294qw4agax0cnbhh0dk33jz358smhflllg77zv0rd8w9g433xiz"))))
     (build-system gnu-build-system)
     (supported-systems '("x86_64-linux" "i686-linux"))
     (native-inputs `(("perl" ,perl)
@@ -340,13 +341,13 @@ It has been modified to remove all non-free binary blobs.")
 (define-public linux-libre-4.4
   (package
     (inherit linux-libre)
-    (version "4.4.14")
+    (version "4.4.15")
     (source (origin
               (method url-fetch)
               (uri (linux-libre-urls version))
               (sha256
                (base32
-                "1yfmzrjrkj8mn2dfd7p98w13afchrkpz26gwfcm2fhsmla16n1my"))))
+                "0n3lz4xnciif9v3y769q1pjs9321gvl6a2wr10r40sl1ixlk3ipz"))))
     (native-inputs
      (let ((conf (kernel-config (or (%current-target-system)
                                     (%current-system))
@@ -1433,17 +1434,15 @@ UnionFS-FUSE additionally supports copy-on-write.")
 (define-public sshfs-fuse
   (package
     (name "sshfs-fuse")
-    (version "2.5")
+    (version "2.8")
     (source (origin
               (method url-fetch)
-              (uri (let ((version-with-underscores
-                          (string-join (string-split version #\.) "_")))
-                     (string-append "https://github.com/libfuse/sshfs/releases/"
-                                    "download/sshfs_" version-with-underscores
-                                    "/sshfs-fuse-" version ".tar.gz")))
+              (uri (string-append "https://github.com/libfuse/sshfs/releases/"
+                                  "download/sshfs_" version
+                                  "/sshfs-" version ".tar.gz"))
               (sha256
                (base32
-                "0gp6qr33l2p0964j0kds0dfmvyyf5lpgsn11daf0n5fhwm9185z9"))))
+                "08mdd4rs7yys7hmyig6i08qlid76p17xlvrh64k7wsrfs1s92s3z"))))
     (build-system gnu-build-system)
     (inputs
      `(("fuse" ,fuse)
@@ -1876,9 +1875,14 @@ country-specific regulations for the wireless spectrum.")
     (version "3.3.5")
     (source (origin
               (method url-fetch)
-              (uri (string-append
-                    "ftp://ftp.netroedge.com/pub/lm-sensors/lm_sensors-"
-                    version ".tar.bz2"))
+              (uri (list (string-append
+                           "ftp://ftp.netroedge.com/pub/lm-sensors/"
+                           "lm_sensors-" version ".tar.bz2")
+                         (string-append
+                           "http://pkgs.fedoraproject.org/repo/pkgs/"
+                           "lm_sensors/lm_sensors-3.3.5.tar.bz2/"
+                           "da506dedceb41822e64865f6ba34828a/"
+                           "lm_sensors-3.3.5.tar.bz2")))
               (sha256
                (base32
                 "1ksgrynxgrq590nb2fwxrl1gwzisjkqlyg3ljfd1al0ibrk6mbjx"))
@@ -2754,3 +2758,63 @@ from userspace.")
 commonly found on Microsoft Windows.  It is implemented as a FUSE file system.
 The package provides additional NTFS tools.")
     (license license:gpl2+)))
+
+(define-public rng-tools
+  (package
+    (name "rng-tools")
+    (version "5")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                "http://downloads.sourceforge.net/sourceforge/gkernel/"
+                "rng-tools-" version ".tar.gz"))
+              (sha256
+               (base32
+                "13h7lc8wl9khhvkr0i3bl5j9bapf8anhqis1lcnwxg1vc2v058b0"))))
+    (build-system gnu-build-system)
+    (synopsis "Random number generator daemon")
+    (description
+     "Monitor a hardware random number generator, and supply entropy
+from that to the system kernel's @file{/dev/random} machinery.")
+    (home-page "http://sourceforge.net/projects/gkernel")
+    ;; The source package is offered under the GPL2+, but the files
+    ;; 'rngd_rdrand.c' and 'rdrand_asm.S' are only available under the GPL2.
+    (license (list license:gpl2 license:gpl2+))))
+
+(define-public cpupower
+  (package
+    (name "cpupower")
+    (version (package-version linux-libre))
+    (source (package-source linux-libre))
+    (build-system gnu-build-system)
+    (arguments
+     '(#:phases (modify-phases %standard-phases
+                  (add-after 'unpack 'enter-subdirectory
+                    (lambda _
+                      (chdir "tools/power/cpupower")))
+                  (delete 'configure)
+                  (add-before 'build 'fix-makefiles
+                    (lambda _
+                      (substitute* "Makefile"
+                        (("/usr/") "/")
+                        (("/bin/(install|pwd)" _ command) command))
+                      (substitute* "bench/Makefile"
+                        (("\\$\\(CC\\) -o") "$(CC) $(LDFLAGS) -o")))))
+       #:make-flags (let ((out (assoc-ref %outputs "out")))
+                      (list (string-append "DESTDIR=" out)
+                            (string-append "LDFLAGS=-Wl,-rpath=" out "/lib")
+                            "docdir=/share/doc/cpupower"
+                            "confdir=$(docdir)/examples"
+                            ;; The Makefile recommends the following changes
+                            "DEBUG=false"
+                            "PACKAGE_BUGREPORT=bug-guix@gnu.org"))
+       #:tests? #f)) ;no tests
+    (native-inputs `(("gettext" ,gnu-gettext)))
+    (inputs `(("pciutils" ,pciutils)))
+    (home-page (package-home-page linux-libre))
+    (synopsis "CPU frequency and voltage scaling tools for Linux")
+    (description
+     "cpupower is a set of user-space tools that use the cpufreq feature of the
+Linux kernel to retrieve and control processor features related to power saving,
+such as frequency and voltage scaling.")
+    (license license:gpl2)))
diff --git a/gnu/packages/lisp.scm b/gnu/packages/lisp.scm
index e349907f14..22f542ccc5 100644
--- a/gnu/packages/lisp.scm
+++ b/gnu/packages/lisp.scm
@@ -3,7 +3,7 @@
 ;;; Copyright © 2015 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2016 Federico Beffa <beffa@fbengineering.ch>
-;;; Copyright © 2016 Nils Gillmann <niasterisk@grrlz.net>
+;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm
index 3bf019fa83..c380eba122 100644
--- a/gnu/packages/llvm.scm
+++ b/gnu/packages/llvm.scm
@@ -1,7 +1,8 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
+;;; Copyright © 2014, 2016 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2016 Dennis Mungai <dmngaie@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -20,7 +21,7 @@
 
 (define-module (gnu packages llvm)
   #:use-module (guix packages)
-  #:use-module (guix licenses)
+  #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix download)
   #:use-module (guix utils)
   #:use-module (guix build-system gnu)
@@ -28,6 +29,8 @@
   #:use-module (gnu packages)
   #:use-module (gnu packages gcc)
   #:use-module (gnu packages bootstrap)           ;glibc-dynamic-linker
+  #:use-module (gnu packages compression)
+  #:use-module (gnu packages libffi)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages python)
   #:use-module (gnu packages xml))
@@ -35,7 +38,7 @@
 (define-public llvm
   (package
     (name "llvm")
-    (version "3.6.2")
+    (version "3.8.1")
     (source
      (origin
       (method url-fetch)
@@ -43,14 +46,21 @@
                           version "/llvm-" version ".src.tar.xz"))
       (sha256
        (base32
-        "153vcvj8gvgwakzr4j0kndc0b7wn91c2g1vy2vg24s6spxcc23gn"))))
+        "1ybmnid4pw2hxn12ax5qa5kl1ldfns0njg8533y3mzslvd5cx0kf"))))
     (build-system cmake-build-system)
     (native-inputs
-     `(("python" ,python-wrapper)
+     `(("python" ,python-2) ;bytes->str conversion in clang>=3.7 needs python-2
        ("perl"   ,perl)))
+    (inputs
+     `(("libffi" ,libffi)
+       ("zlib" ,zlib)))
     (arguments
      `(#:configure-flags '("-DCMAKE_SKIP_BUILD_RPATH=FALSE"
-                           "-DCMAKE_BUILD_WITH_INSTALL_RPATH=FALSE")))
+                           "-DCMAKE_BUILD_WITH_INSTALL_RPATH=FALSE"
+                           "-DLLVM_ENABLE_FFI:BOOL=TRUE")
+
+       ;; Don't use '-g' during the build, to save space.
+       #:build-type "Release"))
     (home-page "http://www.llvm.org")
     (synopsis "Optimizing compiler infrastructure")
     (description
@@ -60,7 +70,7 @@ languages.  It currently supports compilation of C and C++ programs, using
 front-ends derived from GCC 4.0.1.  A new front-end for the C family of
 languages is in development.  The compiler infrastructure includes mirror sets
 of programming tools as well as libraries with equivalent functionality.")
-    (license ncsa)))
+    (license license:ncsa)))
 
 (define (clang-runtime-from-llvm llvm hash)
   (package
@@ -78,8 +88,8 @@ of programming tools as well as libraries with equivalent functionality.")
      `(("llvm" ,llvm)))
     (arguments
      `(;; Don't use '-g' during the build to save space.
-       #:build-type "Release"))
-
+       #:build-type "Release"
+       #:tests? #f))                    ; Tests require gtest
     (home-page "http://compiler-rt.llvm.org")
     (synopsis "Runtime library for Clang/LLVM")
     (description
@@ -87,12 +97,13 @@ of programming tools as well as libraries with equivalent functionality.")
 functions for C and C++ programs.  It also provides header files that allow C
 and C++ source code to interface with the \"sanitization\" passes of the clang
 compiler.  In LLVM this library is called \"compiler-rt\".")
-    (license ncsa)
+    (license license:ncsa)
 
     ;; <http://compiler-rt.llvm.org/> doesn't list MIPS as supported.
     (supported-systems (delete "mips64el-linux" %supported-systems))))
 
-(define (clang-from-llvm llvm clang-runtime hash)
+(define* (clang-from-llvm llvm clang-runtime hash
+                          #:key (patches '("clang-libc-search-path.patch")))
   (package
     (name "clang")
     (version (package-version llvm))
@@ -102,7 +113,7 @@ compiler.  In LLVM this library is called \"compiler-rt\".")
        (uri (string-append "http://llvm.org/releases/"
                            version "/cfe-" version ".src.tar.xz"))
        (sha256 (base32 hash))
-       (patches (search-patches "clang-libc-search-path.patch"))))
+       (patches (map search-patch patches))))
     ;; Using cmake allows us to treat llvm as an external library.  There
     ;; doesn't seem to be any way to do this with clang's autotools-based
     ;; build system.
@@ -170,20 +181,63 @@ compiler.  In LLVM this library is called \"compiler-rt\".")
 Objective-C++ programming languages.  It uses LLVM as its back end.  The Clang
 project includes the Clang front end, the Clang static analyzer, and several
 code analysis tools.")
-    (license ncsa)))
+    (license license:ncsa)))
 
 (define-public clang-runtime
   (clang-runtime-from-llvm
    llvm
-   "11qx8d3pbfqjaj2x207pvlvzihbs1z2xbw4crpz7aid6h1yz6bqg"))
+   "0p0y85c7izndbpg2l816z7z7558axq11d5pwkm4h11sdw7d13w0d"))
 
 (define-public clang
   (clang-from-llvm llvm clang-runtime
+                   "1prc72xmkgx8wrzmrr337776676nhsp1qd3mw2bvb22bzdnq7lsc"
+                   #:patches '("clang-3.8-libc-search-path.patch")))
+
+(define-public llvm-3.7
+  (package (inherit llvm)
+    (version "3.7.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "http://llvm.org/releases/"
+                           version "/llvm-" version ".src.tar.xz"))
+       (sha256
+        (base32
+         "1masakdp9g2dan1yrazg7md5am2vacbkb3nahb3dchpc1knr8xxy"))))))
+
+(define-public clang-runtime-3.7
+  (clang-runtime-from-llvm
+   llvm-3.7
+   "10c1mz2q4bdq9bqfgr3dirc6hz1h3sq8573srd5q5lr7m7j6jiwx"))
+
+(define-public clang-3.7
+  (clang-from-llvm llvm-3.7 clang-runtime-3.7
+                   "0x065d0w9b51xvdjxwfzjxng0gzpbx45fgiaxpap45ragi61dqjn"))
+
+(define-public llvm-3.6
+  (package (inherit llvm)
+    (version "3.6.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "http://llvm.org/releases/"
+                           version "/llvm-" version ".src.tar.xz"))
+       (sha256
+        (base32
+         "153vcvj8gvgwakzr4j0kndc0b7wn91c2g1vy2vg24s6spxcc23gn"))))))
+
+(define-public clang-runtime-3.6
+  (clang-runtime-from-llvm
+   llvm-3.6
+   "11qx8d3pbfqjaj2x207pvlvzihbs1z2xbw4crpz7aid6h1yz6bqg"))
+
+(define-public clang-3.6
+  (clang-from-llvm llvm-3.6 clang-runtime-3.6
                    "1wwr8s6lzr324hv4s1k6na4j5zv6n9kdhi14s4kb9b13d93814df"))
 
 (define-public llvm-3.5
   (package (inherit llvm)
-    (version "3.5.0")
+    (version "3.5.2")
     (source
      (origin
        (method url-fetch)
@@ -191,13 +245,13 @@ code analysis tools.")
                            version "/llvm-" version ".src.tar.xz"))
        (sha256
         (base32
-         "00swb43mzlvda8306arlg2jw7g6k3acwfccgf1k4c2pgd3rrkq98"))))))
+         "0xf5q17kkxsrm2gsi93h4pwlv663kji73r2g4asb97klsmb626a4"))))))
 
 (define-public clang-runtime-3.5
   (clang-runtime-from-llvm
    llvm-3.5
-   "0dl1kbrhz96djsxqr61iw5h788s7ncfpfb7aayixky1bhdaydcx4"))
+   "1hsdnzzdr5kglz6fnv3lcsjs222zjsy14y8ax9dy6zqysanplbal"))
 
 (define-public clang-3.5
   (clang-from-llvm llvm-3.5 clang-runtime-3.5
-                   "12yv3jwdjcbkrx7zjm8wh4jrvb59v8fdw4mnmz3zc1jb00p9k07w"))
+                   "0846h8vn3zlc00jkmvrmy88gc6ql6014c02l4jv78fpvfigmgssg"))
diff --git a/gnu/packages/logging.scm b/gnu/packages/logging.scm
index 68af09e08c..c40d6ebbaf 100644
--- a/gnu/packages/logging.scm
+++ b/gnu/packages/logging.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -21,8 +22,10 @@
   #:use-module (guix packages)
   #:use-module (guix utils)
   #:use-module (guix download)
+  #:use-module (guix git-download)
   #:use-module (guix build-system gnu)
-  #:use-module (gnu packages))
+  #:use-module (gnu packages perl)
+  #:use-module (gnu packages autotools))
 
 (define-public log4cpp
   (package
@@ -45,3 +48,43 @@ IDSA and other destinations.  It is modeled after the Log4j Java library,
 staying as close to their API as is reasonable.")
     (home-page "http://log4cpp.sourceforge.net/")
     (license license:lgpl2.1+)))
+
+(define-public glog
+  (package
+    (name "glog")
+    (version "0.3.4")
+    (home-page "https://github.com/google/glog")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url home-page)
+                    (commit (string-append "v" version))))
+              (sha256
+               (base32
+                "0ym5g15m7c8kjfr2c3zq6bz08ghin2d1r1nb6v2vnkfh1vn945x1"))
+              (file-name (string-append name "-" version "-checkout"))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("perl" ,perl)                             ;for tests
+       ("autoconf" ,(autoconf-wrapper))
+       ("automake" ,automake)
+       ("libtool" ,libtool)))
+    (arguments
+     '(#:phases (modify-phases %standard-phases
+                  (add-before 'configure 'add-automake-files
+                    (lambda _
+                      ;; The 'test-driver' file is a dangling symlink to
+                      ;; /usr/share/automake; replace it.  We can't just run
+                      ;; 'automake -ac' because it complains about version
+                      ;; mismatch, so run the whole thing.
+                      (delete-file "test-driver")
+                      (delete-file "configure")   ;it's read-only
+                      (zero? (system* "autoreconf" "-vfi")))))))
+    (synopsis "C++ logging library")
+    (description
+     "Google glog is a library that implements application-level logging.
+This library provides logging APIs based on C++-style streams and various
+helper macros.  You can log a message by simply streaming things to log at a
+particular severity level.  It allows logging to be controlled from the
+command line.")
+    (license license:bsd-3)))
diff --git a/gnu/packages/lsh.scm b/gnu/packages/lsh.scm
deleted file mode 100644
index 2ea1591354..0000000000
--- a/gnu/packages/lsh.scm
+++ /dev/null
@@ -1,159 +0,0 @@
-;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015, 2016 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/>.
-
-(define-module (gnu packages lsh)
-  #:use-module ((guix licenses) #:prefix license:)
-  #:use-module (guix packages)
-  #:use-module (guix download)
-  #:use-module (guix build-system gnu)
-  #:use-module (gnu packages)
-  #:use-module (gnu packages m4)
-  #:use-module (gnu packages linux)
-  #:use-module (gnu packages nettle)
-  #:use-module (gnu packages compression)
-  #:use-module (gnu packages multiprecision)
-  #:use-module (gnu packages readline)
-  #:use-module (gnu packages gperf)
-  #:use-module (gnu packages guile)
-  #:use-module (gnu packages xorg))
-
-(define-public liboop
-  (package
-    (name "liboop")
-    (version "1.0")
-    (source
-     (origin
-      (method url-fetch)
-      (uri (string-append "http://download.ofb.net/liboop/liboop-"
-                          version ".tar.gz"))
-      (sha256
-       (base32
-        "0z6rlalhvfca64jpvksppc9bdhs7jwhiw4y35g5ibvh91xp3rn1l"))
-      (patches (search-patches "liboop-mips64-deplibs-fix.patch"))))
-    (build-system gnu-build-system)
-    (home-page "http://www.lysator.liu.se/liboop/")
-    (synopsis "Event loop library")
-    (description "Liboop is a low-level event loop management library for
-POSIX-based operating systems.  It supports the development of modular,
-multiplexed applications which may respond to events from several sources.  It
-replaces the \"select() loop\" and allows the registration of event handlers
-for file and network I/O, timers and signals.  Since processes use these
-mechanisms for almost all external communication, liboop can be used as the
-basis for almost any application.")
-    (license license:lgpl2.1+)))
-
-(define-public lsh
-  (package
-    (name "lsh")
-    (version "2.1")
-    (source (origin
-              (method url-fetch)
-              (uri (string-append "mirror://gnu/lsh/lsh-"
-                                  version ".tar.gz"))
-              (sha256
-               (base32
-                "1qqjy9zfzgny0rkb27c8c7dfsylvb6n0ld8h3an2r83pmaqr9gwb"))
-              (modules '((guix build utils)))
-              (snippet
-               '(begin
-                  (substitute* "src/testsuite/functions.sh"
-                    (("localhost")
-                     ;; Avoid host name lookups since they don't work in
-                     ;; chroot builds.
-                     "127.0.0.1")
-                    (("set -e")
-                     ;; Make tests more verbose.
-                     "set -e\nset -x"))
-
-                  (substitute* (find-files "src/testsuite" "-test$")
-                    (("localhost") "127.0.0.1"))
-
-                  (substitute* "src/testsuite/login-auth-test"
-                    (("/bin/cat") "cat"))))))
-    (build-system gnu-build-system)
-    (native-inputs
-     `(("m4" ,m4)
-       ("guile" ,guile-2.0)
-       ("gperf" ,gperf)
-       ("psmisc" ,psmisc)))                       ; for `killall'
-    (inputs
-     `(("nettle" ,nettle-2)
-       ("linux-pam" ,linux-pam)
-
-       ;; 'rl.c' uses the 'CPPFunction' type, which is no longer in
-       ;; Readline 6.3.
-       ("readline" ,readline-6.2)
-
-       ("liboop" ,liboop)
-       ("zlib" ,zlib)
-       ("gmp" ,gmp)
-
-       ;; The server (lshd) invokes xauth when X11 forwarding is requested.
-       ;; This adds 24 MiB (or 27%) to the closure of lsh.
-       ("xauth" ,xauth)))
-    (arguments
-     '(;; Skip the `configure' test that checks whether /dev/ptmx &
-       ;; co. work as expected, because it relies on impurities (for
-       ;; instance, /dev/pts may be unavailable in chroots.)
-       #:configure-flags '("lsh_cv_sys_unix98_ptys=yes")
-
-       ;; FIXME: Tests won't run in a chroot, presumably because
-       ;; /etc/profile is missing, and thus clients get an empty $PATH
-       ;; and nothing works.
-       #:tests? #f
-
-       #:phases
-       (modify-phases %standard-phases
-         (add-before 'configure 'pre-configure
-           (lambda* (#:key inputs #:allow-other-keys)
-             (let* ((nettle    (assoc-ref inputs "nettle"))
-                    (sexp-conv (string-append nettle "/bin/sexp-conv")))
-               ;; Make sure 'lsh' and 'lshd' pick 'sexp-conv' in the right place
-               ;; by default.
-               (substitute* "src/environ.h.in"
-                 (("^#define PATH_SEXP_CONV.*")
-                  (string-append "#define PATH_SEXP_CONV \""
-                                 sexp-conv "\"\n")))
-
-               ;; Same for the 'lsh-authorize' script.
-               (substitute* "src/lsh-authorize"
-                 (("=sexp-conv")
-                  (string-append "=" sexp-conv)))
-
-               ;; Tell lshd where 'xauth' lives.  Another option would be to
-               ;; hardcode "/run/current-system/profile/bin/xauth", thereby
-               ;; reducing the closure size, but that wouldn't work on foreign
-               ;; distros.
-               (with-fluids ((%default-port-encoding "ISO-8859-1"))
-                 (substitute* "src/server_x11.c"
-                   (("define XAUTH_PROGRAM.*")
-                    (string-append "define XAUTH_PROGRAM \""
-                                   (assoc-ref inputs "xauth")
-                                   "/bin/xauth\"\n")))))
-
-             ;; Tests rely on $USER being set.
-             (setenv "USER" "guix"))))))
-    (home-page "http://www.lysator.liu.se/~nisse/lsh/")
-    (synopsis "GNU implementation of the Secure Shell (ssh) protocols")
-    (description
-     "GNU lsh is a free implementation of the SSH version 2 protocol.  It is
-used to create a secure line of communication between two computers,
-providing shell access to the server system from the client.  It provides
-both the server daemon and the client application, as well as tools for
-manipulating key files.")
-    (license license:gpl2+)))
diff --git a/gnu/packages/lxde.scm b/gnu/packages/lxde.scm
index 7ce31ad36a..c00400ca70 100644
--- a/gnu/packages/lxde.scm
+++ b/gnu/packages/lxde.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015 Mathieu Lirzin <mthl@openmailbox.org>
+;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -71,14 +72,14 @@ libFM file management library.")))
 (define-public lxappearance
   (package
     (name "lxappearance")
-    (version "0.6.1")
+    (version "0.6.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://sourceforge/project/lxde/"
                                   "LXAppearance/" name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1phnv1b2jdj2vlibjyc9z01izcf3k5zxj8glsaf0i3vh77zqmqq9"))))
+                "07r0xbi6504zjnbpan7zrn7gi4j0kbsqqfpj8v2x94gr05p16qj4"))))
     (build-system gnu-build-system)
     (inputs `(("gtk+" ,gtk+-2)))
     (native-inputs `(("intltool"   ,intltool)
@@ -92,7 +93,7 @@ able to change themes, icons, and fonts used by GTK+ applications.")
 (define-public lxrandr
   (package
     (name "lxrandr")
-    (version "0.3.0")
+    (version "0.3.1")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://sourceforge/project/lxde/LXRandR"
@@ -101,7 +102,7 @@ able to change themes, icons, and fonts used by GTK+ applications.")
                                   name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0xkbqv66hisbxkvnf7y5kwqbhrq26f49wd7w6ylhnjlccpnylg8q"))))
+                "0khqi42paqg82jllb2kza4arf3fafzgq90fhyr3rw3d9hn23763d"))))
     (build-system gnu-build-system)
     (inputs `(("gtk+" ,gtk+-2)))
     (native-inputs `(("intltool"   ,intltool)
@@ -118,7 +119,7 @@ or external monitor.")
 (define-public lxtask
   (package
     (name "lxtask")
-    (version "0.1.6")
+    (version "0.1.7")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://sourceforge/project/lxde/LXTask"
@@ -127,7 +128,7 @@ or external monitor.")
                                   name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0ia3i430lpwgl2kch6sl1za8qf96wc4fkcv91yhdzgnzafcnm3gp"))))
+                "1zihhvzsg9bl6k0gv7jwx6cgsi3rmcagvnmshc1h0mjq2immmdph"))))
     (build-system gnu-build-system)
     (inputs `(("gtk+" ,gtk+-2)))
     (native-inputs `(("intltool"   ,intltool)
@@ -167,7 +168,7 @@ performance, all instances of the terminal are sharing a single process.")
 (define-public menu-cache
   (package
     (name "menu-cache")
-    (version "1.0.0")
+    (version "1.0.1")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://sourceforge/project/lxde/" name "/"
@@ -175,7 +176,7 @@ performance, all instances of the terminal are sharing a single process.")
                                   name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1bws84fiwk3anp30hcr0lw1xw5cgp44x5ik2yv2ijcgxpcvz8zgz"))))
+                "0ngxvwfj9drabqi3lyzgpi0d0za6431sy2ijb010filrj54jdiqa"))))
     (build-system gnu-build-system)
     (inputs `(("glib"  ,glib)
               ("libfm" ,libfm-extra)))
diff --git a/gnu/packages/mail.scm b/gnu/packages/mail.scm
index 5ce7ed4254..a36fd5ff70 100644
--- a/gnu/packages/mail.scm
+++ b/gnu/packages/mail.scm
@@ -14,6 +14,7 @@
 ;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2016 Lukas Gradl <lgradl@openmailbox.org>
 ;;; Copyright © 2016 Alex Kost <alezost@gmail.com>
+;;; Copyright © 2016 Troy Sankey <sankeytms@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -397,6 +398,40 @@ messages you need; in addition, it allows you to view messages, extract
 attachments, create new maildirs, and so on.")
     (license gpl3+)))
 
+(define-public alot
+  (package
+    (name "alot")
+    (version "0.3.7")
+    (source (origin
+              (method url-fetch)
+              ; v0.3.7 not on PyPi yet, so use github instead
+              (uri (string-append "https://github.com/pazz/alot/archive/"
+                                  version ".tar.gz"))
+              (file-name (string-append "alot-" version ".tar.gz"))
+              (sha256
+               (base32
+                "09md9llg38r6xby8l0y0zf8nhlh91cr4xs0r15b294hhp8hl2bgx"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:tests? #f ; no tests
+       ; python 3 is unsupported, more info:
+       ; https://github.com/pazz/alot/blob/0.3.7/docs/source/faq.rst
+       #:python ,python-2))
+    (inputs
+     `(("python2-magic" ,python2-magic)
+       ("python2-configobj" ,python2-configobj)
+       ("python2-twisted" ,python2-twisted)
+       ("python2-urwid" ,python2-urwid)
+       ("python2-urwidtrees" ,python2-urwidtrees)
+       ("python2-pygpgme" ,python2-pygpgme)
+       ("python2-notmuch" ,python2-notmuch)))
+    (home-page "https://github.com/pazz/alot")
+    (synopsis "Commandline MUA using notmuch")
+    (description
+     "Alot is an experimental terminal mail user agent (MUA) based on
+@code{notmuch} mail.  It is written in Python using the @code{urwid} toolkit.")
+    (license gpl3+)))
+
 (define-public notmuch
   (package
     (name "notmuch")
@@ -519,7 +554,7 @@ and search library.")
 (define-public getmail
   (package
     (name "getmail")
-    (version "4.48.0")
+    (version "4.49.0")
     (source
      (origin
        (method url-fetch)
@@ -527,7 +562,7 @@ and search library.")
                            name "-" version ".tar.gz"))
        (sha256
         (base32
-         "0k5rm5kag14izng2ajcagvli9sns5mzvkyfa65ri4xymxs91wi29"))))
+         "1m0yzxd05fklwbmjj1n2q4sx397c1j5qi9a0r5fv3h8pplz4lv0w"))))
     (build-system python-build-system)
     (arguments
      `(#:tests? #f ; no tests
@@ -546,14 +581,14 @@ useful features.")
 (define-public libetpan
   (package
     (name "libetpan")
-    (version "1.6")
+    (version "1.7.2")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://github.com/dinhviethoa/" name
                    "/archive/" version ".tar.gz"))
              (file-name (string-append name "-" version ".tar.gz"))
              (sha256
-               (base32 "05qyqx2c1ppb1jnrs3m52i60f9xlxfxdmb9dnwg4vqjv8kwv2qkr"))))
+               (base32 "081ixgj3skglq9i7v0jb835lmfx21zi4i5b7997igwr0lj174y9j"))))
     (build-system gnu-build-system)
     (native-inputs `(("autoconf" ,(autoconf-wrapper))
                      ("automake" ,automake)
@@ -566,7 +601,8 @@ useful features.")
        ("openssl" ,openssl)))
     (inputs
      `(("curl" ,curl)
-       ("expat" ,expat)))
+       ("expat" ,expat)
+       ("zlib" ,zlib)))
     (arguments
       '(#:phases (alist-cons-after
                   'unpack 'autogen
diff --git a/gnu/packages/man.scm b/gnu/packages/man.scm
index ab5e770b52..9ffbba9de9 100644
--- a/gnu/packages/man.scm
+++ b/gnu/packages/man.scm
@@ -58,14 +58,14 @@ a flexible and convenient way.")
 (define-public man-db
   (package
     (name "man-db")
-    (version "2.7.1")
+    (version "2.7.5")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://savannah/man-db/man-db-"
                                   version ".tar.xz"))
               (sha256
                (base32
-                "03ly0hbpgjnag576rgccanaisn7f6422q5qxrj64vyzslc2651y4"))))
+                "056a3il7agfazac12yggcg4gf412yq34k065im0cpfxbcw6xskaw"))))
     (build-system gnu-build-system)
     (arguments
      '(#:phases
@@ -129,7 +129,7 @@ the traditional flat-text whatis databases.")
 (define-public man-pages
   (package
     (name "man-pages")
-    (version "4.04")
+    (version "4.06")
     (source (origin
               (method url-fetch)
               (uri
@@ -142,7 +142,7 @@ the traditional flat-text whatis databases.")
                     "man-pages-" version ".tar.xz")))
               (sha256
                (base32
-                "0v8zxq4scfixy3pjpw9ankvv5v8frv62khv4xm1jpkswyq6rbqcg"))))
+                "0vv056k9yyf05dqal9m2pq3pv9c8lnp7i5rjxvcnic6aq7vyrafb"))))
     (build-system gnu-build-system)
     (arguments
      '(#:phases (alist-delete 'configure %standard-phases)
@@ -168,7 +168,7 @@ Linux kernel and C library interfaces employed by user-space programs.")
 (define-public help2man
   (package
     (name "help2man")
-    (version "1.47.3")
+    (version "1.47.4")
     (source
      (origin
       (method url-fetch)
@@ -176,7 +176,7 @@ Linux kernel and C library interfaces employed by user-space programs.")
                           version ".tar.xz"))
       (sha256
        (base32
-        "0miqq77ssk5rgsc9xlv7k5n2wk2c5wv2m1kh4zhbwrggfmjaycn2"))))
+        "0lvp4306f5nq08f3snffs5pp1zwv8l35z6f5g0dds51zs6bzdv6l"))))
     (build-system gnu-build-system)
     (arguments `(;; There's no `check' target.
                  #:tests? #f))
diff --git a/gnu/packages/markdown.scm b/gnu/packages/markdown.scm
index a20eef6818..dab3d4eab1 100644
--- a/gnu/packages/markdown.scm
+++ b/gnu/packages/markdown.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015 Mathieu Lirzin <mthl@openmailbox.org>
 ;;; Copyright © 2015 David Thompson <davet@gnu.org>
+;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -31,7 +32,7 @@
 (define-public hoedown
   (package
     (name "hoedown")
-    (version "3.0.3")
+    (version "3.0.7")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://github.com/hoedown/hoedown/archive/"
@@ -39,7 +40,7 @@
              (file-name (string-append name "-" version ".tar.gz"))
              (sha256
               (base32
-               "0mmmkfayqgh6k39kbi3pq68mg03x35aiygy3zypxzvwx9y8b53ky"))))
+               "0859dc2xjasd6kgkshi8mb20kbyw5sql1ln0hw3bfaf33qdh5dh1"))))
     (build-system gnu-build-system)
     (arguments
      '(#:make-flags (list "CC=gcc" (string-append "PREFIX=" %output))
diff --git a/gnu/packages/maths.scm b/gnu/packages/maths.scm
index 3b860a957f..b8ec213d8b 100644
--- a/gnu/packages/maths.scm
+++ b/gnu/packages/maths.scm
@@ -63,6 +63,7 @@
   #:use-module (gnu packages image)
   #:use-module (gnu packages less)
   #:use-module (gnu packages lisp)
+  #:use-module (gnu packages logging)
   #:use-module (gnu packages gnome)
   #:use-module (gnu packages guile)
   #:use-module (gnu packages xorg)
@@ -333,7 +334,8 @@ large scale eigenvalue problems.")
     (inputs `(("fortran" ,gfortran)
               ("python" ,python-2)))
     (arguments
-     `(#:configure-flags '("-DBUILD_SHARED_LIBS:BOOL=YES")
+     `(#:configure-flags '("-DBUILD_SHARED_LIBS:BOOL=YES"
+                           "-DLAPACKE=ON")
        #:phases (alist-cons-before
                  'check 'patch-python
                  (lambda* (#:key inputs #:allow-other-keys)
@@ -644,10 +646,7 @@ interfaces.")
     (build-system cmake-build-system)
     (arguments
      ;; TODO: Build HTML user documentation and install separately.
-     ;; XXX: Use the embedded "miniglog" as a replacement for
-     ;; <https://github.com/google/glog>.  TODO: Use Glog when it's available.
-     '(#:configure-flags '("-DMINIGLOG=ON"
-                           "-DBUILD_EXAMPLES=OFF"
+     '(#:configure-flags '("-DBUILD_EXAMPLES=OFF"
                            "-DBUILD_SHARED_LIBS=ON")
 
        #:phases (modify-phases %standard-phases
@@ -660,6 +659,8 @@ interfaces.")
                       #t)))))
     (native-inputs
      `(("pkg-config" ,pkg-config)))
+    (propagated-inputs
+     `(("glog" ,glog)))                           ;for #include <glog/glog.h>
     (inputs
      `(("eigen" ,eigen)
        ("blas" ,openblas)
@@ -1874,7 +1875,7 @@ constant parts of it.")
 (define-public openlibm
   (package
     (name "openlibm")
-    (version "0.4.1")
+    (version "0.5.1")
     (source
      (origin
        (method url-fetch)
@@ -1883,7 +1884,7 @@ constant parts of it.")
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
         (base32
-         "0cwqqqlblj3kzp9aq1wnpfs1fl0qd1wp1xzm5shb09w06i4rh9nn"))))
+         "11czx2z7nh6dfpz45s3xl7v38hw36jxzxfvny454bk3if14pfakq"))))
     (build-system gnu-build-system)
     (arguments
      `(#:make-flags
@@ -1911,7 +1912,7 @@ environments.")
 (define-public openspecfun
   (package
     (name "openspecfun")
-    (version "0.4")
+    (version "0.5.2")
     (source
      (origin
        (method url-fetch)
@@ -1920,7 +1921,7 @@ environments.")
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
         (base32
-         "0nsa3jjmlhcqkw5ba5ypbn3n0c8b6lc22zzlxnmxkxi9shhdx65z"))))
+         "1y5b2h6f2k72536kym3vzy3li3bhpd23x463g7hdmjdi3cncavz1"))))
     (build-system gnu-build-system)
     (arguments
      '(#:tests? #f  ;no "check" target
@@ -2119,14 +2120,13 @@ Optimization occurs at build time.  For this reason, the library is built on
 the machine where it is installed, without resorting to pre-built substitutes.
 
 Before building the library, CPU throttling should be disabled.  This can be
-done in the BIOS, or, on GNU/Linux, with the following commands:
+done in the BIOS, or, on GNU/Linux, with the following command:
 
-cpufreq-selector -g performance -c 0
-...
-cpufreq-selector -g performance -c N-1
+@example
+# cpupower --governor performance
+@end example
 
-where N is the number of cores of your CPU.  Failure to do so will result in a
-library with poor performance.")
+Failure to do so will result in a library with poor performance.")
     (license license:bsd-3)))
 
 (define-public glm
diff --git a/gnu/packages/messaging.scm b/gnu/packages/messaging.scm
index 215fa19bb8..de9ac179bb 100644
--- a/gnu/packages/messaging.scm
+++ b/gnu/packages/messaging.scm
@@ -257,7 +257,7 @@ supports IPv6, SSL-protected connections as well as PAM for authentication.")
 (define-public pidgin
   (package
     (name "pidgin")
-    (version "2.10.11")
+    (version "2.11.0")
     (source
      (origin
        (method url-fetch)
@@ -265,7 +265,7 @@ supports IPv6, SSL-protected connections as well as PAM for authentication.")
                            version "/" name "-" version ".tar.bz2"))
        (sha256
         (base32
-         "01s0q30qrjlzj7kkz6f8lvrwsdd55a9yjh2xjjwyyxzw849j3bpj"))
+         "0crkggjj6y07v1kdwil9vw532b0vrs6p33nmlvdkpnl60m2169pp"))
        (patches (search-patches "pidgin-add-search-path.patch"))))
     (build-system glib-or-gtk-build-system)
     (native-inputs
diff --git a/gnu/packages/mpd.scm b/gnu/packages/mpd.scm
index 3162cf18b8..da7c1ccb37 100644
--- a/gnu/packages/mpd.scm
+++ b/gnu/packages/mpd.scm
@@ -71,7 +71,7 @@ interfacing MPD in the C, C++ & Objective C languages.")
 (define-public mpd
   (package
     (name "mpd")
-    (version "0.19.14")
+    (version "0.19.17")
     (source (origin
               (method url-fetch)
               (uri
@@ -80,7 +80,7 @@ interfacing MPD in the C, C++ & Objective C languages.")
                               "/mpd-" version ".tar.xz"))
               (sha256
                (base32
-                "1rwr1qb9an1qylddf35xwdasyfkxghd00c29saj04l1f2c2kilig"))))
+                "1xxjkwbs0d1bdcsykhmw6l1lybpyp2l7b2bw58y1j70w5fnwhzj8"))))
     (build-system gnu-build-system)
     (inputs `(("ao" ,ao)
               ("alsa-lib" ,alsa-lib)
diff --git a/gnu/packages/music.scm b/gnu/packages/music.scm
index dfc21cc95f..91ba4be97b 100644
--- a/gnu/packages/music.scm
+++ b/gnu/packages/music.scm
@@ -6,6 +6,7 @@
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2016 Kei Kebreau <kei@openmailbox.org>
+;;; Copyright © 2016 John J. Foerch <jjfoerch@earthlink.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -715,6 +716,49 @@ Editor.  It is compatible with Power Tab Editor 1.7 and Guitar Pro.")
 oscillators and stereo effects.")
     (license license:gpl2+)))
 
+(define-public amsynth
+  (package
+    (name "amsynth")
+    (version "1.6.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/amsynth/amsynth/releases/"
+                           "download/release-" version
+                           "/amsynth-" version ".tar.bz2"))
+       (sha256
+        (base32
+         "07dp9dl38g9krjqxxh89l2z42z08yzrl57cx95b1l67xnxwjp5k3"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-before 'configure 'set-flags
+           (lambda _
+             ;; Compile with C++11, required by gtkmm.
+             (setenv "CXXFLAGS" "-std=c++11")
+             #t)))))
+    (inputs
+     `(("alsa-lib" ,alsa-lib)
+       ("jack" ,jack-1)
+       ("lv2" ,lv2)
+       ("libsndfile" ,libsndfile)
+       ("gtk+" ,gtk+-2)
+       ("gtkmm" ,gtkmm-2)))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (home-page "http://amsynth.github.io")
+    (synopsis "Analog modeling synthesizer")
+    (description
+     "amsynth is an easy-to-use software synthesizer with a classic
+subtractive synthesizer topology.  Its features include: dual
+oscillators (sine, saw, square, noise) with hard sync; 12 and 24 dB/oct
+resonant filters (low-pass, high-pass, band-pass, notch); mono, poly, legato
+keyboard modes; dual ADSR envelope generators for filter and amplitude; LFO
+which can modulate the oscillators, filter, and amplitude; distortion and
+reverb effects.")
+    (license license:gpl2+)))
+
 (define-public setbfree
   (package
     (name "setbfree")
@@ -1594,3 +1638,30 @@ for improved Amiga ProTracker 2/3 compatibility.")
 formats, including most audio formats recognized by FFMpeg.")
     (home-page "http://moc.daper.net")
     (license license:gpl2+)))
+
+(define-public midicsv
+  (package
+    (name "midicsv")
+    (version "1.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://www.fourmilab.ch/webtools/midicsv/"
+                                  name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1vvhk2nf9ilfw0wchmxy8l13hbw9cnpz079nsx5srsy4nnd78nkw"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:phases (modify-phases %standard-phases (delete 'configure))
+       #:make-flags (list "CC=gcc" (string-append "INSTALL_DEST=" %output))))
+    (synopsis "Convert MIDI files to and from CSV")
+    (description
+     "Midicsv reads a standard MIDI file and decodes it into a comma-separated
+value file (CSV), which preserves all the information in the MIDI file.  The
+ASCII CSV file may be loaded into a spreadsheet or database application, or
+processed by a program to transform the MIDI data (for example, to key
+transpose a composition or extract a track from a multi-track sequence).  A
+CSV file in the format created by midicsv may be converted back into a
+standard MIDI file with the csvmidi program.")
+    (home-page "http://www.fourmilab.ch/webtools/midicsv/")
+    (license license:public-domain)))
diff --git a/gnu/packages/networking.scm b/gnu/packages/networking.scm
index 72c601102c..9e4f7bb010 100644
--- a/gnu/packages/networking.scm
+++ b/gnu/packages/networking.scm
@@ -4,7 +4,7 @@
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 Stefan Reichör <stefan@xsteve.at>
 ;;; Copyright © 2016 Raimon Grau <raimonster@gmail.com>
-;;; Copyright © 2016 Tobias Geerinckx-Rice <tobias.geerinckx.rice@gmail.com>
+;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright   2016 John Darrington <jmd@gnu.org>
 ;;; Copyright © 2016 Nicolas Goaziou <mail@nicolasgoaziou.fr>
 ;;;
diff --git a/gnu/packages/ninja.scm b/gnu/packages/ninja.scm
index cfcc6d5a51..8f18eb3560 100644
--- a/gnu/packages/ninja.scm
+++ b/gnu/packages/ninja.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com>
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -28,7 +29,7 @@
 (define-public ninja
   (package
     (name "ninja")
-    (version "1.5.3")
+    (version "1.7.1")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/martine/ninja/"
@@ -36,7 +37,7 @@
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "1h3yfwcfl61v493vna6jia2fizh8rpig7qw2504cvkr6gid3p5bw"))
+                "06dy2dc1aafm61ynw9gzig88la3km9dsh53bxf4mnw7l7kjisn2i"))
               (patches (search-patches "ninja-zero-mtime.patch"
                                        "ninja-tests.patch"))))
     (build-system gnu-build-system)
@@ -69,7 +70,7 @@
               (install-file "ninja" bin)
               (install-file "doc/manual.asciidoc" doc)
               #t))))))
-    (home-page "http://martine.github.io/ninja/")
+    (home-page "https://ninja-build.org/")
     (synopsis "Small build system")
     (description
      "Ninja is a small build system with a focus on speed.  It differs from
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index 2f269d08b1..887ef930ff 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2014 Cyrill Schenkel <cyrill.schenkel@gmail.com>
 ;;; Copyright © 2015 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2015, 2016 David Thompson <davet@gnu.org>
+;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -99,7 +100,23 @@
                (zero? (apply system*
                              (string-append (assoc-ref inputs "python")
                                             "/bin/python")
-                             "configure" flags))))))))
+                             "configure" flags)))))
+         (replace 'patch-shebangs
+           (lambda* (#:key outputs #:allow-other-keys #:rest all)
+             ;; Work around <http://bugs.gnu.org/23723>.
+             (let* ((patch  (assoc-ref %standard-phases 'patch-shebangs))
+                    (npm    (string-append (assoc-ref outputs "out")
+                                           "/bin/npm"))
+                    (target (readlink npm)))
+               (and (apply patch all)
+                    (with-directory-excursion (dirname npm)
+                      ;; Turn NPM into a symlink to TARGET again, which 'npm'
+                      ;; relies on for the resolution of relative file names
+                      ;; in JS files.
+                      (delete-file target)
+                      (rename-file npm target)
+                      (symlink target npm)
+                      #t))))))))
     (native-inputs
      `(("python" ,python-2)
        ("perl" ,perl)
diff --git a/gnu/packages/openstack.scm b/gnu/packages/openstack.scm
index 780fb7f252..a316af9666 100644
--- a/gnu/packages/openstack.scm
+++ b/gnu/packages/openstack.scm
@@ -529,14 +529,14 @@ in transmittable and storable formats, such as JSON and MessagePack.")
 (define-public python-oslosphinx
   (package
     (name "python-oslosphinx")
-    (version "4.2.0")
+    (version "4.3.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "oslosphinx" version))
        (sha256
         (base32
-         "178svff46pmynpsnw06gpxk0w13p1gwkqbsvyxphblxv9wl09ksz"))))
+         "0cz8ym4i1n4rgljlqhyhfkpgdmid7nkb909k8r8nk186m9cmpla2"))))
     (build-system python-build-system)
     (propagated-inputs
       `(("python-requests" ,python-requests)))
diff --git a/gnu/packages/owncloud.scm b/gnu/packages/owncloud.scm
index 4969d31c01..f755df4f0b 100644
--- a/gnu/packages/owncloud.scm
+++ b/gnu/packages/owncloud.scm
@@ -34,14 +34,27 @@
 (define-public owncloud-client
   (package
     (name "owncloud-client")
-    (version "2.2.1")
+    (version "2.2.2")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://download.owncloud.com/desktop/stable/"
                            "owncloudclient-" version ".tar.xz"))
        (sha256
-        (base32 "1wis62jk4y4mbr25y39y6af57pi6vp2mbryazmvn6zgnygf69m3h"))))
+        (base32 "0m0pxv12w72qqgxim9fh8w3bgkgnhpjyay8ldll3nnzq1jmhk09n"))
+       (modules '((guix build utils)))
+       (snippet
+        '(begin
+           ;; only allows bundled libcrashreporter-qt
+           (delete-file-recursively "src/3rdparty/libcrashreporter-qt")
+           ;; we already package qtkeychain and sqlite
+           (delete-file-recursively "src/3rdparty/qtkeychain")
+           (delete-file-recursively "src/3rdparty/sqlite3")
+           ;; qjson is packaged, qprogessindicator, qlockedfile, qtokenizer and
+           ;; qtsingleapplication have not yet been packaged, but all are
+           ;; explicitly used from the 3rdparty folder during build.
+           ;; We can also remove the macgoodies folder
+           (delete-file-recursively "src/3rdparty/qtmacgoodies")))))
     (build-system cmake-build-system)
     (arguments
      `(#:phases
diff --git a/gnu/packages/package-management.scm b/gnu/packages/package-management.scm
index f3a1cda149..cd58fde249 100644
--- a/gnu/packages/package-management.scm
+++ b/gnu/packages/package-management.scm
@@ -192,7 +192,8 @@
     (propagated-inputs
      `(("gnutls" ,gnutls)                         ;for 'guix download' & co.
        ("guile-json" ,guile-json)
-       ("geiser" ,geiser)))                       ;for guix.el
+       ("geiser" ,geiser)                         ;for guix.el
+       ("emacs-magit-popup" ,emacs-magit-popup))) ;for "M-x guix" command
 
     (home-page "http://www.gnu.org/software/guix")
     (synopsis "Functional package manager for installed software packages and versions")
@@ -474,13 +475,13 @@ transactions from C or Python.")
 (define-public diffoscope
   (package
     (name "diffoscope")
-    (version "51")
+    (version "54")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri name version))
               (sha256
                (base32
-                "18rn6rrwh586228vnaf1nq0wayh19zbvfc0qmnbys6ln2pv2v007"))))
+                "1dv46ywzcll3mlqgvr48mq7rncizfvsic62c6dd2kdhynb22087n"))))
     (build-system python-build-system)
     (arguments
      `(#:phases (modify-phases %standard-phases
diff --git a/gnu/packages/parallel.scm b/gnu/packages/parallel.scm
index d1f49abed3..766167d6e9 100644
--- a/gnu/packages/parallel.scm
+++ b/gnu/packages/parallel.scm
@@ -44,7 +44,7 @@
 (define-public parallel
   (package
     (name "parallel")
-    (version "20160522")
+    (version "20160622")
     (source
      (origin
       (method url-fetch)
@@ -52,7 +52,7 @@
                           version ".tar.bz2"))
       (sha256
        (base32
-        "03r07ksxw5xx946x9s26ivifgldr8bc9bz6da4wfrd0dx4546xyy"))))
+        "1axng9bwapmb0vrrv67pp787gv7r5g02zyrfwnrhpxhi8zmm1jmg"))))
     (build-system gnu-build-system)
     (inputs `(("perl" ,perl)))
     (home-page "http://www.gnu.org/software/parallel/")
diff --git a/gnu/packages/patches/avrdude-fix-libusb.patch b/gnu/packages/patches/avrdude-fix-libusb.patch
deleted file mode 100644
index 13d0eca91c..0000000000
--- a/gnu/packages/patches/avrdude-fix-libusb.patch
+++ /dev/null
@@ -1,256 +0,0 @@
-Avrdude cannot build with our version of libusb. This patch fixes that.
-See http://savannah.nongnu.org/bugs/?41854
-
-diff --git a/dfu.c b/dfu.c
-index 7d349bc..0f80440 100644
---- a/dfu.c
-+++ b/dfu.c
-@@ -36,13 +36,14 @@
- 
- #ifndef HAVE_LIBUSB
- 
--int dfu_open(struct dfu_dev *dfu, char *port_name) {
-+struct dfu_dev * dfu_open(char *port_spec) {
-   fprintf(stderr, "%s: Error: No USB support in this compile of avrdude\n",
-     progname);
--  return -1;
-+  return NULL;
- }
- 
--int dfu_init(struct dfu_dev *dfu, unsigned short usb_pid) {
-+int dfu_init(struct dfu_dev *dfu,
-+  unsigned short vid, unsigned short pid) {
-   return -1;
- }
- 
-diff --git a/flip1.c b/flip1.c
-index b891d80..0959996 100644
---- a/flip1.c
-+++ b/flip1.c
-@@ -164,6 +164,8 @@ static void flip1_setup(PROGRAMMER * pgm);
- static void flip1_teardown(PROGRAMMER * pgm);
- 
- /* INTERNAL PROGRAMMER FUNCTION PROTOTYPES */
-+#ifdef HAVE_LIBUSB
-+// The internal ones are made conditional, as they're not defined further down #ifndef HAVE_LIBUSB
- 
- static void flip1_show_info(struct flip1 *flip1);
- 
-@@ -177,6 +179,8 @@ static const char * flip1_mem_unit_str(enum flip1_mem_unit mem_unit);
- static int flip1_set_mem_page(struct dfu_dev *dfu, unsigned short page_addr);
- static enum flip1_mem_unit flip1_mem_unit(const char *name);
- 
-+#endif /* HAVE_LIBUSB */
-+
- /* THE INITPGM FUNCTION DEFINITIONS */
- 
- void flip1_initpgm(PROGRAMMER *pgm)
-@@ -201,6 +205,7 @@ void flip1_initpgm(PROGRAMMER *pgm)
-   pgm->teardown         = flip1_teardown;
- }
- 
-+#ifdef HAVE_LIBUSB
- /* EXPORTED PROGRAMMER FUNCTION DEFINITIONS */
- 
- int flip1_open(PROGRAMMER *pgm, char *port_spec)
-@@ -876,3 +881,82 @@ enum flip1_mem_unit flip1_mem_unit(const char *name) {
-     return FLIP1_MEM_UNIT_EEPROM;
-   return FLIP1_MEM_UNIT_UNKNOWN;
- }
-+#else /* HAVE_LIBUSB */
-+// Dummy functions
-+int flip1_open(PROGRAMMER *pgm, char *port_spec)
-+{
-+  fprintf(stderr, "%s: Error: No USB support in this compile of avrdude\n",
-+    progname);
-+  return NULL;
-+}
-+
-+int flip1_initialize(PROGRAMMER* pgm, AVRPART *part)
-+{
-+  return -1;
-+}
-+
-+void flip1_close(PROGRAMMER* pgm)
-+{
-+}
-+
-+void flip1_enable(PROGRAMMER* pgm)
-+{
-+}
-+
-+void flip1_disable(PROGRAMMER* pgm)
-+{
-+}
-+
-+void flip1_display(PROGRAMMER* pgm, const char *prefix)
-+{
-+}
-+
-+int flip1_program_enable(PROGRAMMER* pgm, AVRPART *part)
-+{
-+  return -1;
-+}
-+
-+int flip1_chip_erase(PROGRAMMER* pgm, AVRPART *part)
-+{
-+  return -1;
-+}
-+
-+int flip1_read_byte(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
-+  unsigned long addr, unsigned char *value)
-+{
-+  return -1;
-+}
-+
-+int flip1_write_byte(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
-+  unsigned long addr, unsigned char value)
-+{
-+  return -1;
-+}
-+
-+int flip1_paged_load(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
-+  unsigned int page_size, unsigned int addr, unsigned int n_bytes)
-+{
-+  return -1;
-+}
-+
-+int flip1_paged_write(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
-+  unsigned int page_size, unsigned int addr, unsigned int n_bytes)
-+{
-+  return -1;
-+}
-+
-+int flip1_read_sig_bytes(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem)
-+{
-+  return -1;
-+}
-+
-+void flip1_setup(PROGRAMMER * pgm)
-+{
-+}
-+
-+void flip1_teardown(PROGRAMMER * pgm)
-+{
-+}
-+
-+
-+#endif /* HAVE_LIBUSB */
-\ No newline at end of file
-
-diff --git a/flip2.c b/flip2.c
-index ed8e996..16c4bf8 100644
---- a/flip2.c
-+++ b/flip2.c
-@@ -151,6 +151,8 @@ static void flip2_setup(PROGRAMMER * pgm);
- static void flip2_teardown(PROGRAMMER * pgm);
- 
- /* INTERNAL PROGRAMMER FUNCTION PROTOTYPES */
-+#ifdef HAVE_LIBUSB
-+// The internal ones are made conditional, as they're not defined further down #ifndef HAVE_LIBUSB
- 
- static void flip2_show_info(struct flip2 *flip2);
- 
-@@ -171,6 +173,8 @@ static const char * flip2_status_str(const struct dfu_status *status);
- static const char * flip2_mem_unit_str(enum flip2_mem_unit mem_unit);
- static enum flip2_mem_unit flip2_mem_unit(const char *name);
- 
-+#endif /* HAVE_LIBUSB */
-+
- /* THE INITPGM FUNCTION DEFINITIONS */
- 
- void flip2_initpgm(PROGRAMMER *pgm)
-@@ -195,6 +199,7 @@ void flip2_initpgm(PROGRAMMER *pgm)
-   pgm->teardown         = flip2_teardown;
- }
- 
-+#ifdef HAVE_LIBUSB
- /* EXPORTED PROGRAMMER FUNCTION DEFINITIONS */
- 
- int flip2_open(PROGRAMMER *pgm, char *port_spec)
-@@ -922,3 +927,85 @@ enum flip2_mem_unit flip2_mem_unit(const char *name) {
-     return FLIP2_MEM_UNIT_SIGNATURE;
-   return FLIP2_MEM_UNIT_UNKNOWN;
- }
-+
-+#else /* HAVE_LIBUSB */
-+
-+/* EXPORTED PROGRAMMER FUNCTION DEFINITIONS */
-+
-+int flip2_open(PROGRAMMER *pgm, char *port_spec)
-+{
-+  fprintf(stderr, "%s: Error: No USB support in this compile of avrdude\n",
-+    progname);
-+  return NULL;
-+}
-+
-+int flip2_initialize(PROGRAMMER* pgm, AVRPART *part)
-+{
-+  return -1;
-+}
-+
-+void flip2_close(PROGRAMMER* pgm)
-+{
-+}
-+
-+void flip2_enable(PROGRAMMER* pgm)
-+{
-+}
-+
-+void flip2_disable(PROGRAMMER* pgm)
-+{
-+}
-+
-+void flip2_display(PROGRAMMER* pgm, const char *prefix)
-+{
-+}
-+
-+int flip2_program_enable(PROGRAMMER* pgm, AVRPART *part)
-+{
-+  return -1;
-+}
-+
-+int flip2_chip_erase(PROGRAMMER* pgm, AVRPART *part)
-+{
-+  return -1;
-+}
-+
-+int flip2_read_byte(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
-+  unsigned long addr, unsigned char *value)
-+{
-+  return -1;
-+}
-+
-+int flip2_write_byte(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
-+  unsigned long addr, unsigned char value)
-+{
-+  return -1;
-+}
-+
-+int flip2_paged_load(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
-+  unsigned int page_size, unsigned int addr, unsigned int n_bytes)
-+{
-+  return -1;
-+}
-+
-+int flip2_paged_write(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem,
-+  unsigned int page_size, unsigned int addr, unsigned int n_bytes)
-+{
-+  return -1;
-+}
-+
-+int flip2_read_sig_bytes(PROGRAMMER* pgm, AVRPART *part, AVRMEM *mem)
-+{
-+  return -1;
-+}
-+
-+void flip2_setup(PROGRAMMER * pgm)
-+{
-+}
-+
-+void flip2_teardown(PROGRAMMER * pgm)
-+{
-+}
-+
-+
-+#endif /* HAVE_LIBUSB */
diff --git a/gnu/packages/patches/clang-3.8-libc-search-path.patch b/gnu/packages/patches/clang-3.8-libc-search-path.patch
new file mode 100644
index 0000000000..0f7d0a4add
--- /dev/null
+++ b/gnu/packages/patches/clang-3.8-libc-search-path.patch
@@ -0,0 +1,69 @@
+Clang attempts to guess file names based on the OS and distro (yes!),
+but unfortunately, that doesn't work for us.
+
+This patch makes it easy to insert libc's $libdir so that Clang passes the
+correct absolute file name of crt1.o etc. to 'ld'.  It also disables all
+the distro-specific stuff and removes the hard-coded FHS directory names
+to make sure Clang also works on non-GuixSD systems.
+
+This patch makes slight adjustments over "clang-libc-search-path.patch" for
+changes in clang 3.8.
+
+--- cfe-3.8.0.src/lib/Driver/ToolChains.cpp
++++ cfe-3.8.0.src/lib/Driver/ToolChains.cpp
+@@ -3661,6 +3661,9 @@
+                          GCCInstallation.getTriple().str() + "/bin")
+                        .str());
+ 
++  // Comment out the distro-specific tweaks so that they don't bite when
++  // using Guix on a foreign distro.
++#if 0
+   Distro Distro = DetectDistro(D, Arch);
+ 
+   if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
+@@ -3702,6 +3705,7 @@
+ 
+   if (IsOpenSUSE(Distro))
+     ExtraOpts.push_back("--enable-new-dtags");
++#endif
+ 
+   // The selection of paths to try here is designed to match the patterns which
+   // the GCC driver itself uses, as this is part of the GCC-compatible driver.
+@@ -3771,14 +3775,12 @@
+     addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
+   }
+ 
+-  addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
+-  addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
+-  addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
+-  addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
+-
+   // Try walking via the GCC triple path in case of biarch or multiarch GCC
+   // installations with strange symlinks.
+   if (GCCInstallation.isValid()) {
++    // The following code would end up adding things like
++    // "/usr/lib/x86_64-unknown-linux-gnu/../../lib64" to the search path.
++#if 0
+     addPathIfExists(D,
+                     SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
+                         "/../../" + OSLibDir,
+@@ -3791,6 +3793,7 @@
+                              BiarchSibling.gccSuffix(),
+                       Paths);
+     }
++#endif
+ 
+     // See comments above on the multilib variant for details of why this is
+     // included even from outside the sysroot.
+@@ -3815,8 +3818,9 @@
+   if (StringRef(D.Dir).startswith(SysRoot))
+     addPathIfExists(D, D.Dir + "/../lib", Paths);
+ 
+-  addPathIfExists(D, SysRoot + "/lib", Paths);
+-  addPathIfExists(D, SysRoot + "/usr/lib", Paths);
++  // Add libc's lib/ directory to the search path, so that crt1.o, crti.o,
++  // and friends can be found.
++  addPathIfExists(D, "@GLIBC_LIBDIR@", Paths);
+ }
+ 
+ bool Linux::HasNativeLLVMSupport() const { return true; }
diff --git a/gnu/packages/patches/gd-CVE-2016-5766.patch b/gnu/packages/patches/gd-CVE-2016-5766.patch
new file mode 100644
index 0000000000..400cb0ab48
--- /dev/null
+++ b/gnu/packages/patches/gd-CVE-2016-5766.patch
@@ -0,0 +1,81 @@
+Fix CVE-2016-5766 (Integer Overflow in _gd2GetHeader() resulting in heap
+overflow).
+
+https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-5766
+
+Adapted from upstream commits:
+https://github.com/libgd/libgd/commit/aba3db8ba159465ecec1089027a24835a6da9cc0
+https://github.com/libgd/libgd/commit/a6a0e7feabb2a9738086a5dc96348f233c87fa79
+
+Since `patch` cannot apply Git binary diffs, we omit the addition of
+'tests/gd2/php_bug_72339.c' and its associated binary data.
+
+From aba3db8ba159465ecec1089027a24835a6da9cc0 Mon Sep 17 00:00:00 2001
+From: Pierre Joye <pierre.php@gmail.com>
+Date: Tue, 28 Jun 2016 16:23:42 +0700
+Subject: [PATCH] fix php bug 72339 (CVE-2016-5766), Integer Overflow in
+ _gd2GetHeader() resulting in heap overflow
+
+---
+ src/gd_gd2.c                    |   5 ++++-
+ tests/gd2/CMakeLists.txt        |   1 +
+ tests/gd2/Makemodule.am         |   6 ++++--
+ tests/gd2/php_bug_72339.c       |  21 +++++++++++++++++++++
+ tests/gd2/php_bug_72339_exp.gd2 | Bin 0 -> 67108882 bytes
+ 5 files changed, 30 insertions(+), 3 deletions(-)
+ create mode 100644 tests/gd2/php_bug_72339.c
+ create mode 100644 tests/gd2/php_bug_72339_exp.gd2
+
+diff --git a/src/gd_gd2.c b/src/gd_gd2.c
+index fd1e0c9..bdbbecf 100644
+--- a/src/gd_gd2.c
++++ b/src/gd_gd2.c
+@@ -154,8 +154,11 @@ _gd2GetHeader (gdIOCtxPtr in, int *sx, int *sy,
+ 		nc = (*ncx) * (*ncy);
+ 		GD2_DBG (printf ("Reading %d chunk index entries\n", nc));
+ 		sidx = sizeof (t_chunk_info) * nc;
++		if (overflow2(sidx, nc)) {
++			goto fail1;
++		}
+ 		cidx = gdCalloc (sidx, 1);
+-		if (!cidx) {
++		if (cidx == NULL) {
+ 			goto fail1;
+ 		}
+ 		for (i = 0; i < nc; i++) {
+From a6a0e7feabb2a9738086a5dc96348f233c87fa79 Mon Sep 17 00:00:00 2001
+From: Pierre Joye <pierre.php@gmail.com>
+Date: Wed, 29 Jun 2016 09:36:26 +0700
+Subject: [PATCH] fix php bug 72339 (CVE-2016-5766), Integer Overflow in
+ _gd2GetHeader() resulting in heap overflow. Sync with php's sync
+
+---
+ src/gd_gd2.c              | 7 ++++++-
+ tests/gd2/php_bug_72339.c | 2 +-
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/src/gd_gd2.c b/src/gd_gd2.c
+index bdbbecf..2837456 100644
+--- a/src/gd_gd2.c
++++ b/src/gd_gd2.c
+@@ -152,11 +152,16 @@ _gd2GetHeader (gdIOCtxPtr in, int *sx, int *sy,
+ 
+ 	if (gd2_compressed (*fmt)) {
+ 		nc = (*ncx) * (*ncy);
++
+ 		GD2_DBG (printf ("Reading %d chunk index entries\n", nc));
++		if (overflow2(sizeof(t_chunk_info), nc)) {
++			goto fail1;
++		}
+ 		sidx = sizeof (t_chunk_info) * nc;
+-		if (overflow2(sidx, nc)) {
++		if (sidx <= 0) {
+ 			goto fail1;
+ 		}
++
+ 		cidx = gdCalloc (sidx, 1);
+ 		if (cidx == NULL) {
+ 			goto fail1;
+-- 
+2.9.1
+
diff --git a/gnu/packages/patches/gd-CVE-2016-6128.patch b/gnu/packages/patches/gd-CVE-2016-6128.patch
new file mode 100644
index 0000000000..45ee6b0cfa
--- /dev/null
+++ b/gnu/packages/patches/gd-CVE-2016-6128.patch
@@ -0,0 +1,253 @@
+Fix CVE-2016-6128 (invalid color index is not properly handled leading
+to denial of service).
+
+https://cve.mitre.org/cgi-bin/cvename.cgi?name=2016-6128
+
+Copied from upstream commits:
+https://github.com/libgd/libgd/compare/3fe0a7128bac5000fdcfab888bd2a75ec0c9447d...fd623025505e87bba7ec8555eeb72dae4fb0afd
+
+From 1ccfe21e14c4d18336f9da8515cd17db88c3de61 Mon Sep 17 00:00:00 2001
+From: Pierre Joye <pierre.php@gmail.com>
+Date: Mon, 27 Jun 2016 11:17:39 +0700
+Subject: [PATCH 1/8] fix php 72494, invalid color index not handled, can lead
+ to crash
+
+---
+ src/gd_crop.c        | 4 ++++
+ tests/CMakeLists.txt | 1 +
+ tests/Makefile.am    | 1 +
+ 3 files changed, 6 insertions(+)
+
+diff --git a/src/gd_crop.c b/src/gd_crop.c
+index 0296633..532b49b 100644
+--- a/src/gd_crop.c
++++ b/src/gd_crop.c
+@@ -136,6 +136,10 @@ BGD_DECLARE(gdImagePtr) gdImageCropThreshold(gdImagePtr im, const unsigned int c
+ 		return NULL;
+ 	}
+ 
++	if (color < 0 || (!gdImageTrueColor(im) && color >= gdImageColorsTotal(im))) {
++		return NULL;
++	}
++
+ 	/* TODO: Add gdImageGetRowPtr and works with ptr at the row level
+ 	 * for the true color and palette images
+ 	 * new formats will simply work with ptr
+diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
+index 6f5c786..5093d52 100644
+--- a/tests/CMakeLists.txt
++++ b/tests/CMakeLists.txt
+@@ -31,6 +31,7 @@ if (BUILD_TEST)
+ 		gdimagecolortransparent
+ 		gdimagecopy
+ 		gdimagecopyrotated
++        gdimagecrop
+ 		gdimagefile
+ 		gdimagefill
+ 		gdimagefilledellipse
+diff --git a/tests/Makefile.am b/tests/Makefile.am
+index 4f6e756..5a0ebe8 100644
+--- a/tests/Makefile.am
++++ b/tests/Makefile.am
+@@ -25,6 +25,7 @@ include gdimagecolorresolve/Makemodule.am
+ include gdimagecolortransparent/Makemodule.am
+ include gdimagecopy/Makemodule.am
+ include gdimagecopyrotated/Makemodule.am
++include gdimagecrop/Makemodule.am
+ include gdimagefile/Makemodule.am
+ include gdimagefill/Makemodule.am
+ include gdimagefilledellipse/Makemodule.am
+-- 
+2.9.1
+
+From 8c9f39c7cb1f62ea00bc7a48aff64d3811c2d6d0 Mon Sep 17 00:00:00 2001
+From: Pierre Joye <pierre.php@gmail.com>
+Date: Mon, 27 Jun 2016 11:20:07 +0700
+Subject: [PATCH 2/8] fix php 72494, invalid color index not handled, can lead
+ to crash
+
+---
+ tests/gdimagecrop/.gitignore | 1 +
+ 1 file changed, 1 insertion(+)
+ create mode 100644 tests/gdimagecrop/.gitignore
+
+diff --git a/tests/gdimagecrop/.gitignore b/tests/gdimagecrop/.gitignore
+new file mode 100644
+index 0000000..8e8c9c3
+--- /dev/null
++++ b/tests/gdimagecrop/.gitignore
+@@ -0,0 +1 @@
++/php_bug_72494
+-- 
+2.9.1
+
+From 8de370b7b6263a02268037a7cd13ddd991b43ea9 Mon Sep 17 00:00:00 2001
+From: Pierre Joye <pierre.php@gmail.com>
+Date: Mon, 27 Jun 2016 11:24:50 +0700
+Subject: [PATCH 3/8] fix php 72494, invalid color index not handled, can lead
+ to crash
+
+---
+ tests/gdimagecrop/CMakeLists.txt | 5 +++++
+ 1 file changed, 5 insertions(+)
+ create mode 100644 tests/gdimagecrop/CMakeLists.txt
+
+diff --git a/tests/gdimagecrop/CMakeLists.txt b/tests/gdimagecrop/CMakeLists.txt
+new file mode 100644
+index 0000000..f7e4c7e
+--- /dev/null
++++ b/tests/gdimagecrop/CMakeLists.txt
+@@ -0,0 +1,5 @@
++SET(TESTS_FILES
++	php_bug_72494
++)
++
++ADD_GD_TESTS()
+-- 
+2.9.1
+
+From bca12e4e11ecda8a0ea719472700ad5c2b36a0d6 Mon Sep 17 00:00:00 2001
+From: Pierre Joye <pierre.php@gmail.com>
+Date: Mon, 27 Jun 2016 11:25:12 +0700
+Subject: [PATCH 4/8] fix php 72494, invalid color index not handled, can lead
+ to crash
+
+---
+ tests/gdimagecrop/Makemodule.am | 5 +++++
+ 1 file changed, 5 insertions(+)
+ create mode 100644 tests/gdimagecrop/Makemodule.am
+
+diff --git a/tests/gdimagecrop/Makemodule.am b/tests/gdimagecrop/Makemodule.am
+new file mode 100644
+index 0000000..210888b
+--- /dev/null
++++ b/tests/gdimagecrop/Makemodule.am
+@@ -0,0 +1,5 @@
++libgd_test_programs += \
++	gdimagecrop/php_bug_72494
++
++EXTRA_DIST += \
++	gdimagecrop/CMakeLists.txt
+-- 
+2.9.1
+
+From 6ff72ae40c7c20ece939afb362d98cc37f4a1c96 Mon Sep 17 00:00:00 2001
+From: Pierre Joye <pierre.php@gmail.com>
+Date: Mon, 27 Jun 2016 11:25:40 +0700
+Subject: [PATCH 5/8] fix php 72494, invalid color index not handled, can lead
+ to crash
+
+---
+ tests/gdimagecrop/php_bug_72494.c | 23 +++++++++++++++++++++++
+ 1 file changed, 23 insertions(+)
+ create mode 100644 tests/gdimagecrop/php_bug_72494.c
+
+diff --git a/tests/gdimagecrop/php_bug_72494.c b/tests/gdimagecrop/php_bug_72494.c
+new file mode 100644
+index 0000000..adaa379
+--- /dev/null
++++ b/tests/gdimagecrop/php_bug_72494.c
+@@ -0,0 +1,23 @@
++#include <stdio.h>
++#include <stdlib.h>
++#include "gd.h"
++
++#include "gdtest.h"
++
++int main()
++{
++	gdImagePtr im, exp;
++	int error = 0;
++
++	im = gdImageCreate(50, 50);
++
++	if (!im) {
++		gdTestErrorMsg("gdImageCreate failed.\n");
++		return 1;
++	}
++
++	gdImageCropThreshold(im, 1337, 0);
++	gdImageDestroy(im);
++	/* this bug tests a crash, it never reaches this point if the bug exists*/
++	return 0;
++}
+-- 
+2.9.1
+
+From a0f9f8f7bd0d3a6c6afd6d180b8e75d93aadddfa Mon Sep 17 00:00:00 2001
+From: Pierre Joye <pierre.php@gmail.com>
+Date: Mon, 27 Jun 2016 11:38:07 +0700
+Subject: [PATCH 6/8] fix php 72494, CID 149753, color is unsigned int, remove
+ useless <0 comparison
+
+---
+ src/gd_crop.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/gd_crop.c b/src/gd_crop.c
+index 532b49b..d51ad67 100644
+--- a/src/gd_crop.c
++++ b/src/gd_crop.c
+@@ -136,7 +136,7 @@ BGD_DECLARE(gdImagePtr) gdImageCropThreshold(gdImagePtr im, const unsigned int c
+ 		return NULL;
+ 	}
+ 
+-	if (color < 0 || (!gdImageTrueColor(im) && color >= gdImageColorsTotal(im))) {
++	if (!gdImageTrueColor(im) && color >= gdImageColorsTotal(im)) {
+ 		return NULL;
+ 	}
+ 
+-- 
+2.9.1
+
+From 907115fbb980862934d0de91af4977a216745039 Mon Sep 17 00:00:00 2001
+From: Pierre Joye <pierre.php@gmail.com>
+Date: Mon, 27 Jun 2016 11:51:40 +0700
+Subject: [PATCH 7/8] fix php 72494, CID 149753, color is unsigned int, remove
+ useless <0 comparison
+
+---
+ tests/gdimagecrop/php_bug_72494.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tests/gdimagecrop/php_bug_72494.c b/tests/gdimagecrop/php_bug_72494.c
+index adaa379..5cb589b 100644
+--- a/tests/gdimagecrop/php_bug_72494.c
++++ b/tests/gdimagecrop/php_bug_72494.c
+@@ -6,7 +6,7 @@
+ 
+ int main()
+ {
+-	gdImagePtr im, exp;
++	gdImagePtr im;
+ 	int error = 0;
+ 
+ 	im = gdImageCreate(50, 50);
+-- 
+2.9.1
+
+From fd623025505e87bba7ec8555eeb72dae4fb0afdc Mon Sep 17 00:00:00 2001
+From: Pierre Joye <pierre.php@gmail.com>
+Date: Mon, 27 Jun 2016 12:04:25 +0700
+Subject: [PATCH 8/8] fix php 72494, CID 149753, color is unsigned int, remove
+ useless <0 comparison
+
+---
+ tests/gdimagecrop/php_bug_72494.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/tests/gdimagecrop/php_bug_72494.c b/tests/gdimagecrop/php_bug_72494.c
+index 5cb589b..3bd19be 100644
+--- a/tests/gdimagecrop/php_bug_72494.c
++++ b/tests/gdimagecrop/php_bug_72494.c
+@@ -7,7 +7,6 @@
+ int main()
+ {
+ 	gdImagePtr im;
+-	int error = 0;
+ 
+ 	im = gdImageCreate(50, 50);
+ 
+-- 
+2.9.1
+
diff --git a/gnu/packages/patches/gd-CVE-2016-6132.patch b/gnu/packages/patches/gd-CVE-2016-6132.patch
new file mode 100644
index 0000000000..4c475b71b2
--- /dev/null
+++ b/gnu/packages/patches/gd-CVE-2016-6132.patch
@@ -0,0 +1,55 @@
+Fix CVE-2016-6132 (read out-of-bounds when parsing TGA files).
+
+https://cve.mitre.org/cgi-bin/cvename.cgi?name=2016-6132
+
+Copied from upstream commit:
+https://github.com/libgd/libgd/commit/ead349e99868303b37f5e6e9d9d680c9dc71ff8d
+
+From ead349e99868303b37f5e6e9d9d680c9dc71ff8d Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= <ondrej@sury.org>
+Date: Tue, 12 Jul 2016 11:24:09 +0200
+Subject: [PATCH] Fix #247, A read out-of-bands was found in the parsing of TGA
+ files (CVE-2016-6132)
+
+---
+ src/gd_tga.c | 13 +++++++++++--
+ 1 file changed, 11 insertions(+), 2 deletions(-)
+
+diff --git a/src/gd_tga.c b/src/gd_tga.c
+index ef20f86..20fe2d2 100644
+--- a/src/gd_tga.c
++++ b/src/gd_tga.c
+@@ -237,7 +237,11 @@ int read_image_tga( gdIOCtx *ctx, oTga *tga )
+ 			return -1;
+ 		}
+ 
+-		gdGetBuf(conversion_buffer, image_block_size, ctx);
++		if (gdGetBuf(conversion_buffer, image_block_size, ctx) != image_block_size) {
++			gd_error("gd-tga: premature end of image data\n");
++			gdFree(conversion_buffer);
++			return -1;
++		}
+ 
+ 		while (buffer_caret < image_block_size) {
+ 			tga->bitmap[buffer_caret] = (int) conversion_buffer[buffer_caret];
+@@ -257,11 +261,16 @@ int read_image_tga( gdIOCtx *ctx, oTga *tga )
+ 		}
+ 		conversion_buffer = (unsigned char *) gdMalloc(image_block_size * sizeof(unsigned char));
+ 		if (conversion_buffer == NULL) {
++			gd_error("gd-tga: premature end of image data\n");
+ 			gdFree( decompression_buffer );
+ 			return -1;
+ 		}
+ 
+-		gdGetBuf( conversion_buffer, image_block_size, ctx );
++		if (gdGetBuf(conversion_buffer, image_block_size, ctx) != image_block_size) {
++			gdFree(conversion_buffer);
++			gdFree(decompression_buffer);
++			return -1;
++		}
+ 
+ 		buffer_caret = 0;
+ 
+-- 
+2.9.1
+
diff --git a/gnu/packages/patches/gd-CVE-2016-6214.patch b/gnu/packages/patches/gd-CVE-2016-6214.patch
new file mode 100644
index 0000000000..7894a32bb1
--- /dev/null
+++ b/gnu/packages/patches/gd-CVE-2016-6214.patch
@@ -0,0 +1,66 @@
+Fix CVE-2016-6214 (read out-of-bounds when parsing TGA files).
+
+https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-6214
+
+Adapted from upstream commit:
+https://github.com/libgd/libgd/commit/341aa68843ceceae9ba6e083431f14a07bd92308
+
+Since `patch` cannot apply Git binary diffs, we omit the addition of
+'tests/tga/bug00247a.c' and its associated binary data.
+
+From 341aa68843ceceae9ba6e083431f14a07bd92308 Mon Sep 17 00:00:00 2001
+From: "Christoph M. Becker" <cmbecker69@gmx.de>
+Date: Tue, 12 Jul 2016 19:23:13 +0200
+Subject: [PATCH] Unsupported TGA bpp/alphabit combinations should error
+ gracefully
+
+Currently, only 24bpp without alphabits and 32bpp with 8 alphabits are
+really supported. All other combinations will be rejected with a warning.
+
+(cherry picked from commit cb1a0b7e54e9aa118270c23a4a6fe560e4590dc9)
+---
+ src/gd_tga.c             |  16 ++++++----------
+ tests/tga/.gitignore     |   1 +
+ tests/tga/CMakeLists.txt |   1 +
+ tests/tga/Makemodule.am  |   4 +++-
+ tests/tga/bug00247a.c    |  19 +++++++++++++++++++
+ tests/tga/bug00247a.tga  | Bin 0 -> 36 bytes
+ 6 files changed, 30 insertions(+), 11 deletions(-)
+ create mode 100644 tests/tga/bug00247a.c
+ create mode 100644 tests/tga/bug00247a.tga
+
+diff --git a/src/gd_tga.c b/src/gd_tga.c
+index 20fe2d2..b4f8fa6 100644
+--- a/src/gd_tga.c
++++ b/src/gd_tga.c
+@@ -99,7 +99,7 @@ BGD_DECLARE(gdImagePtr) gdImageCreateFromTgaCtx(gdIOCtx* ctx)
+ 			if (tga->bits == TGA_BPP_24) {
+ 				*tpix = gdTrueColor(tga->bitmap[bitmap_caret + 2], tga->bitmap[bitmap_caret + 1], tga->bitmap[bitmap_caret]);
+ 				bitmap_caret += 3;
+-			} else if (tga->bits == TGA_BPP_32 || tga->alphabits) {
++			} else if (tga->bits == TGA_BPP_32 && tga->alphabits) {
+ 				register int a = tga->bitmap[bitmap_caret + 3];
+ 
+ 				*tpix = gdTrueColorAlpha(tga->bitmap[bitmap_caret + 2], tga->bitmap[bitmap_caret + 1], tga->bitmap[bitmap_caret], gdAlphaMax - (a >> 1));
+@@ -159,16 +159,12 @@ int read_header_tga(gdIOCtx *ctx, oTga *tga)
+ 	printf("wxh: %i %i\n", tga->width, tga->height);
+ #endif
+ 
+-	switch(tga->bits) {
+-	case 8:
+-	case 16:
+-	case 24:
+-	case 32:
+-		break;
+-	default:
+-		gd_error("bps %i not supported", tga->bits);
++	if (!((tga->bits == TGA_BPP_24 && tga->alphabits == 0)
++		|| (tga->bits == TGA_BPP_32 && tga->alphabits == 8)))
++	{
++		gd_error_ex(GD_WARNING, "gd-tga: %u bits per pixel with %u alpha bits not supported\n",
++			tga->bits, tga->alphabits);
+ 		return -1;
+-		break;
+ 	}
+ 
+ 	tga->ident = NULL;
diff --git a/gnu/packages/patches/gd-fix-test-on-i686.patch b/gnu/packages/patches/gd-fix-test-on-i686.patch
new file mode 100644
index 0000000000..6dd2e0fb03
--- /dev/null
+++ b/gnu/packages/patches/gd-fix-test-on-i686.patch
@@ -0,0 +1,34 @@
+Disable part of the gdimagerotate test on architectures such as i686
+where intermediate floating-point operations are done with 80-bit long
+doubles, and typically later rounded to 64-bit doubles.  This double
+rounding causes small differences in the resulting pixel values
+compared with other architectures, causing the image comparison to
+fail.
+
+Patch by Mark H Weaver <mhw@netris.org>.
+
+--- libgd-2.2.2/tests/gdimagerotate/bug00067.c	1969-12-31 19:00:00.000000000 -0500
++++ libgd-2.2.2/tests/gdimagerotate/bug00067.c	2016-07-18 12:19:19.885423132 -0400
+@@ -1,5 +1,6 @@
+ #include <stdio.h>
+ #include <stdlib.h>
++#include <float.h>
+ #include "gd.h"
+ 
+ #include "gdtest.h"
+@@ -41,6 +42,7 @@
+ 			return 1;
+ 		}
+ 
++#if FLT_EVAL_METHOD != 2
+ 		sprintf(filename, "bug00067_%03d_exp.png", angle);
+ 		path = gdTestFilePath2("gdimagerotate", filename);
+ 		if (!gdAssertImageEqualsToFile(path, exp)) {
+@@ -48,6 +50,7 @@
+ 			error += 1;
+ 		}
+ 		free(path);
++#endif
+ 
+ 		gdImageDestroy(exp);
+ 	}
diff --git a/gnu/packages/patches/gimp-CVE-2016-4994.patch b/gnu/packages/patches/gimp-CVE-2016-4994.patch
new file mode 100644
index 0000000000..6c81c63386
--- /dev/null
+++ b/gnu/packages/patches/gimp-CVE-2016-4994.patch
@@ -0,0 +1,96 @@
+Fix CVE-2016-4994:
+https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-4994
+
+Copied from upstream repository:
+https://git.gnome.org/browse/gimp/patch/?id=e82aaa4b4ee0703c879e35ea9321fff6be3e9b6f
+
+From e82aaa4b4ee0703c879e35ea9321fff6be3e9b6f Mon Sep 17 00:00:00 2001
+From: Shmuel H <shmuelgimp@gmail.com>
+Date: Mon, 20 Jun 2016 17:14:41 +0300
+Subject: Bug 767873 - (CVE-2016-4994) Multiple Use-After-Free when parsing...
+
+...XCF channel and layer properties
+
+The properties PROP_ACTIVE_LAYER, PROP_FLOATING_SELECTION,
+PROP_ACTIVE_CHANNEL saves the current object pointer the @info
+structure. Others like PROP_SELECTION (for channel) and
+PROP_GROUP_ITEM (for layer) will delete the current object and create
+a new object, leaving the pointers in @info invalid (dangling).
+
+Therefore, if a property from the first type will come before the
+second, the result will be an UaF in the last lines of xcf_load_image
+(when it actually using the pointers from @info).
+
+I wasn't able to exploit this bug because that
+g_object_instance->c_class gets cleared by the last g_object_unref and
+GIMP_IS_{LAYER,CHANNEL} detects that and return FALSE.
+
+(cherry picked from commit 6d804bf9ae77bc86a0a97f9b944a129844df9395)
+---
+ app/xcf/xcf-load.c | 29 +++++++++++++++++++++++++++++
+ 1 file changed, 29 insertions(+)
+
+diff --git a/app/xcf/xcf-load.c b/app/xcf/xcf-load.c
+index b180377..67cc6d4 100644
+--- a/app/xcf/xcf-load.c
++++ b/app/xcf/xcf-load.c
+@@ -904,6 +904,18 @@ xcf_load_layer_props (XcfInfo    *info,
+         case PROP_GROUP_ITEM:
+           {
+             GimpLayer *group;
++            gboolean   is_active_layer;
++
++            /* We're going to delete *layer, Don't leave its pointers
++             * in @info.  After that, we'll restore them back with the
++             * new pointer. See bug #767873.
++             */
++            is_active_layer = (*layer == info->active_layer);
++            if (is_active_layer)
++              info->active_layer = NULL;
++
++            if (*layer == info->floating_sel)
++              info->floating_sel = NULL;
+ 
+             group = gimp_group_layer_new (image);
+ 
+@@ -916,6 +928,13 @@ xcf_load_layer_props (XcfInfo    *info,
+             g_object_ref_sink (*layer);
+             g_object_unref (*layer);
+             *layer = group;
++
++            if (is_active_layer)
++              info->active_layer = *layer;
++
++            /* Don't restore info->floating_sel because group layers
++             * can't be floating selections
++             */
+           }
+           break;
+ 
+@@ -986,6 +1005,12 @@ xcf_load_channel_props (XcfInfo      *info,
+           {
+             GimpChannel *mask;
+ 
++            /* We're going to delete *channel, Don't leave its pointer
++             * in @info. See bug #767873.
++             */
++            if (*channel == info->active_channel)
++              info->active_channel = NULL;
++
+             mask =
+               gimp_selection_new (image,
+                                   gimp_item_get_width  (GIMP_ITEM (*channel)),
+@@ -1000,6 +1025,10 @@ xcf_load_channel_props (XcfInfo      *info,
+             *channel = mask;
+             (*channel)->boundary_known = FALSE;
+             (*channel)->bounds_known   = FALSE;
++
++            /* Don't restore info->active_channel because the
++             * selection can't be the active channel
++             */
+           }
+           break;
+ 
+-- 
+cgit v0.12
+
diff --git a/gnu/packages/patches/khmer-use-libraries.patch b/gnu/packages/patches/khmer-use-libraries.patch
new file mode 100644
index 0000000000..47d163a99a
--- /dev/null
+++ b/gnu/packages/patches/khmer-use-libraries.patch
@@ -0,0 +1,16 @@
+Change setup.cfg so that the bundled zlib and bzip2 are not used.  This cannot
+currently be achieved using "--library z,bz2" as instructed in the setup.py.
+
+diff --git a/setup.cfg b/setup.cfg
+index c054092..080992e 100644
+--- a/setup.cfg
++++ b/setup.cfg
+@@ -1,7 +1,7 @@
+ [build_ext]
+ define = SEQAN_HAS_BZIP2,SEQAN_HAS_ZLIB
+ undef = NO_UNIQUE_RC
+-# libraries = z,bz2
++libraries = z,bz2
+ ## if using system libraries
+ include-dirs = lib:third-party/zlib:third-party/bzip2:third-party/seqan/core/include:third-party/smhasher
+ # include-dirs = lib
diff --git a/gnu/packages/patches/libmtp-devices.patch b/gnu/packages/patches/libmtp-devices.patch
deleted file mode 100644
index 9b985e526d..0000000000
--- a/gnu/packages/patches/libmtp-devices.patch
+++ /dev/null
@@ -1,554 +0,0 @@
-Add additional devices; the patched file corresponds to git commit 8e471b,
-to which one additional device has been added as reported at
-   http://sourceforge.net/p/libmtp/bugs/1422/
-
-diff -u -r libmtp-1.1.9.orig/src/music-players.h libmtp-1.1.9/src/music-players.h
---- libmtp-1.1.9.orig/src/music-players.h	2015-09-19 22:54:24.537330594 +0200
-+++ libmtp-1.1.9/src/music-players.h	2015-09-19 23:16:41.079206331 +0200
-@@ -47,82 +47,61 @@
-    * and properties.
-    */
-   { "Creative", 0x041e, "ZEN Vision", 0x411f,
--      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL |
--      DEVICE_FLAG_BROKEN_GET_OBJECT_PROPVAL },
-+      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL },
-   { "Creative", 0x041e, "Portable Media Center", 0x4123,
--      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL |
--      DEVICE_FLAG_BROKEN_GET_OBJECT_PROPVAL },
-+      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL },
-   { "Creative", 0x041e, "ZEN Xtra (MTP mode)", 0x4128,
--      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL |
--      DEVICE_FLAG_BROKEN_GET_OBJECT_PROPVAL },
-+      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL },
-   { "Dell", 0x041e, "DJ (2nd generation)", 0x412f,
--      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL |
--      DEVICE_FLAG_BROKEN_GET_OBJECT_PROPVAL },
-+      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL },
-   { "Creative", 0x041e, "ZEN Micro (MTP mode)", 0x4130,
--      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL |
--      DEVICE_FLAG_BROKEN_GET_OBJECT_PROPVAL },
-+      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL },
-   { "Creative", 0x041e, "ZEN Touch (MTP mode)", 0x4131,
--      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL |
--      DEVICE_FLAG_BROKEN_GET_OBJECT_PROPVAL },
-+      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL },
-   { "Dell", 0x041e, "Dell Pocket DJ (MTP mode)", 0x4132,
--      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL |
--      DEVICE_FLAG_BROKEN_GET_OBJECT_PROPVAL },
-- { "Creative", 0x041e, "ZEN MicroPhoto (alternate version)", 0x4133,
--      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL |
--      DEVICE_FLAG_BROKEN_GET_OBJECT_PROPVAL },
-+      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL },
-+  { "Creative", 0x041e, "ZEN MicroPhoto (alternate version)", 0x4133,
-+      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL },
-   { "Creative", 0x041e, "ZEN Sleek (MTP mode)", 0x4137,
--      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL |
--      DEVICE_FLAG_BROKEN_GET_OBJECT_PROPVAL },
-+      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL },
-   { "Creative", 0x041e, "ZEN MicroPhoto", 0x413c,
--      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL |
--      DEVICE_FLAG_BROKEN_GET_OBJECT_PROPVAL },
-+      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL },
-   { "Creative", 0x041e, "ZEN Sleek Photo", 0x413d,
--      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL |
--      DEVICE_FLAG_BROKEN_GET_OBJECT_PROPVAL },
-+      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL },
-   { "Creative", 0x041e, "ZEN Vision:M", 0x413e,
--      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL |
--      DEVICE_FLAG_BROKEN_GET_OBJECT_PROPVAL },
-+      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL },
-   // Reported by marazm@o2.pl
-   { "Creative", 0x041e, "ZEN V", 0x4150,
--      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL |
--      DEVICE_FLAG_BROKEN_GET_OBJECT_PROPVAL },
-+      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL },
-   // Reported by danielw@iinet.net.au
-   // This version of the Vision:M needs the no release interface flag,
-   // unclear whether the other version above need it too or not.
-   { "Creative", 0x041e, "ZEN Vision:M (DVP-HD0004)", 0x4151,
-       DEVICE_FLAG_NO_RELEASE_INTERFACE |
--      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL |
--      DEVICE_FLAG_BROKEN_GET_OBJECT_PROPVAL },
-+      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL },
-   // Reported by Darel on the XNJB forums
-   { "Creative", 0x041e, "ZEN V Plus", 0x4152,
--      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL |
--      DEVICE_FLAG_BROKEN_GET_OBJECT_PROPVAL },
-+      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL },
-   { "Creative", 0x041e, "ZEN Vision W", 0x4153,
--      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL |
--      DEVICE_FLAG_BROKEN_GET_OBJECT_PROPVAL },
-+      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL },
-   // Don't add 0x4155: this is a Zen Stone device which is not MTP
-   // Reported by Paul Kurczaba <paul@kurczaba.com>
-   { "Creative", 0x041e, "ZEN", 0x4157,
-       DEVICE_FLAG_IGNORE_HEADER_ERRORS |
-       DEVICE_FLAG_BROKEN_SET_SAMPLE_DIMENSIONS |
--      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL |
--      DEVICE_FLAG_BROKEN_GET_OBJECT_PROPVAL },
-+      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL },
-   // Reported by Ringofan <mcroman@users.sourceforge.net>
-   { "Creative", 0x041e, "ZEN V 2GB", 0x4158,
--      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL |
--      DEVICE_FLAG_BROKEN_GET_OBJECT_PROPVAL },
-+      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL },
-   // Reported by j norment <stormzen@gmail.com>
-   { "Creative", 0x041e, "ZEN Mozaic", 0x4161,
--      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL |
--      DEVICE_FLAG_BROKEN_GET_OBJECT_PROPVAL },
-+      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL },
-   // Reported by Aaron F. Gonzalez <sub_tex@users.sourceforge.net>
-   { "Creative", 0x041e, "ZEN X-Fi", 0x4162,
--      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL |
--      DEVICE_FLAG_BROKEN_GET_OBJECT_PROPVAL },
-+      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL },
-   // Reported by farmerstimuli <farmerstimuli@users.sourceforge.net>
-   { "Creative", 0x041e, "ZEN X-Fi 3", 0x4169,
--      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL |
--      DEVICE_FLAG_BROKEN_GET_OBJECT_PROPVAL },
-+      DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL },
-   // Reported by Todor Gyumyushev <yodor1@users.sourceforge.net>
-   { "ZiiLABS", 0x041e, "Zii EGG", 0x6000,
-       DEVICE_FLAG_UNLOAD_DRIVER |
-@@ -607,8 +586,17 @@
-   /* https://sourceforge.net/p/libmtp/bugs/1251/ */
-   { "Acer", 0x0502, "E39", 0x3643,
-       DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1369/ */
-+  { "Acer", 0x0502, "liquid e700", 0x3644,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-   { "Acer", 0x0502, "One 7", 0x3657,
-       DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/support-requests/183/ */
-+  { "Acer", 0x0502, "Z200", 0x3683,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1341/ */
-+  { "Acer", 0x0502, "Liquid S56", 0x3725,
-+      DEVICE_FLAGS_ANDROID_BUGS },
- 
-   /*
-    * SanDisk
-@@ -952,6 +940,7 @@
-   { "Archos", 0x0e79, "SPOD (MTP mode)", 0x1341, DEVICE_FLAG_UNLOAD_DRIVER },
-   { "Archos", 0x0e79, "5S IT (MTP mode)", 0x1351, DEVICE_FLAG_UNLOAD_DRIVER },
-   { "Archos", 0x0e79, "5H IT (MTP mode)", 0x1357, DEVICE_FLAG_UNLOAD_DRIVER },
-+  { "Archos", 0x0e79, "48 (MTP mode)", 0x1421, DEVICE_FLAGS_ANDROID_BUGS },
-   { "Archos", 0x0e79, "Arnova Childpad", 0x1458, DEVICE_FLAGS_ANDROID_BUGS },
-   { "Archos", 0x0e79, "Arnova 8c G3", 0x145e, DEVICE_FLAGS_ANDROID_BUGS },
-   { "Archos", 0x0e79, "Arnova 10bG3 Tablet", 0x146b, DEVICE_FLAGS_ANDROID_BUGS },
-@@ -973,9 +962,17 @@
-   { "Archos", 0x0e79, "70it2 (ID 2)", 0x1569, DEVICE_FLAGS_ANDROID_BUGS },
-   { "Archos", 0x0e79, "50c", 0x2008, DEVICE_FLAGS_ANDROID_BUGS },
-   { "Archos", 0x0e79, "C40", 0x31ab, DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1393/ */
-+  { "Archos", 0x0e79, "Phone", 0x31e1, DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1325/ */
-+  { "Archos", 0x0e79, "45 Neon", 0x31f3, DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1352/ */
-+  { "Archos", 0x0e79, "50 Diamond", 0x3229, DEVICE_FLAGS_ANDROID_BUGS },
-   { "Archos", 0x0e79, "101 G4", 0x4002, DEVICE_FLAGS_ANDROID_BUGS },
-   { "Archos (for Tesco)", 0x0e79, "Hudl (ID1)", 0x5008, DEVICE_FLAGS_ANDROID_BUGS },
-   { "Archos (for Tesco)", 0x0e79, "Hudl (ID2)", 0x5009, DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1404/ */
-+  { "Archos", 0x0e79, "AC40DTI", 0x5217, DEVICE_FLAGS_ANDROID_BUGS },
- 
-   /*
-    * Dunlop (OEM of EGOMAN ltd?) reported by Nanomad
-@@ -1181,6 +1178,10 @@
-   { "Qualcomm (for OnePlus)", 0x05c6, "One (MTP+ADB)",
-       0x6765, DEVICE_FLAGS_ANDROID_BUGS },
- 
-+  /* https://sourceforge.net/p/libmtp/bugs/1377/ */
-+  { "Qualcomm (for Xolo)", 0x901b, "Xolo Black (MTP)",
-+      0x9039, DEVICE_FLAGS_ANDROID_BUGS },
-+
-   { "Qualcomm (for PhiComm)", 0x05c6, "C230w (MTP)",
-       0x9039, DEVICE_FLAGS_ANDROID_BUGS },
- 
-@@ -1221,6 +1222,9 @@
-   // Reported by Thomas Bretthauer
-   { "Fujitsu, Ltd", 0x04c5, "STYLISTIC M532", 0x133b,
-       DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/feature-requests/137/ */
-+  { "Fujitsu, Ltd", 0x04c5, "F02-E", 0x1378,
-+      DEVICE_FLAGS_ANDROID_BUGS },
- 
-   /*
-    * Palm device userland program named Pocket Tunes
-@@ -1247,6 +1251,9 @@
-   // Reported by anonymous SourceForge user
-   { "Medion", 0x066f, "MD8333 (ID2)", 0x8588,
-     DEVICE_FLAG_UNLOAD_DRIVER | DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST },
-+  /* https://sourceforge.net/p/libmtp/bugs/1359/ */
-+  { "Verizon", 0x0408, "Ellipsis 7", 0x3899,
-+    DEVICE_FLAGS_ANDROID_BUGS },
-   // The vendor ID is "Quanta Computer, Inc."
-   // same as Olivetti Olipad 110
-   // Guessing on device flags
-@@ -1403,6 +1410,9 @@
-       DEVICE_FLAGS_ANDROID_BUGS },
-   { "LG Electronics Inc.", 0x1004, "LG2 Optimus", 0x6225,
-       DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1386/ */
-+  { "LG Electronics Inc.", 0x1004, "LG VS950", 0x622a,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-   { "LG Electronics Inc.", 0x1004, "LG VS870", 0x6239,
-       DEVICE_FLAGS_ANDROID_BUGS },
-   /* https://sourceforge.net/p/libmtp/bugs/992/ */
-@@ -1410,6 +1420,8 @@
-       DEVICE_FLAGS_ANDROID_BUGS },
-   { "LG Electronics Inc.", 0x1004, "VK810", 0x6265,
-       DEVICE_FLAGS_ANDROID_BUGS },
-+  { "LG Electronics Inc.", 0x1004, "G3", 0x627f,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-   /* https://sourceforge.net/p/libmtp/support-requests/134/ */
-   { "LG Electronics Inc.", 0x1004, "G3 (VS985)", 0x626e,
-       DEVICE_FLAGS_ANDROID_BUGS },
-@@ -1723,8 +1735,12 @@
-       DEVICE_FLAG_NONE },
-   { "SONY", 0x0fce, "Xperia M2 MTP", 0x01aa,
-       DEVICE_FLAG_NONE },
-+  { "SONY", 0x0fce, "Xperia M2 Dual MTP", 0x01ab,
-+      DEVICE_FLAG_NONE },
-   { "SONY", 0x0fce, "Xperia Z2 MTP", 0x01af,
-       DEVICE_FLAG_NONE },
-+  { "SONY", 0x0fce, "Xperia Z2 Tablet MTP", 0x01b1,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-   { "SONY", 0x0fce, "Xperia Z Ultra MTP", 0x01b6,
-       DEVICE_FLAGS_ANDROID_BUGS },
-   { "SONY", 0x0fce, "Xperia Z3 MTP", 0x01ba,
-@@ -1733,6 +1749,10 @@
-       DEVICE_FLAG_NONE },
-   { "SONY", 0x0fce, "Xperia E3 MTP", 0x01bc,
-       DEVICE_FLAG_NONE },
-+  { "SONY", 0x0fce, "XPeria Z3+ MTP", 0x01c9,
-+      DEVICE_FLAG_NONE },
-+  { "SONY", 0x0fce, "XPeria E4g MTP", 0x01cb,
-+      DEVICE_FLAG_NONE },
- 
- 
-   /*
-@@ -1788,6 +1808,8 @@
-       DEVICE_FLAG_NONE },
-   { "SONY", 0x0fce, "Xperia M MTP+CDROM", 0x419b,
-       DEVICE_FLAG_NONE },
-+  { "SONY", 0x0fce, "Xperia Z Ultra MTP+CDROM (ID3)", 0x419c,
-+      DEVICE_FLAG_NONE },
-   { "SONY", 0x0fce, "Xperia Z1 MTP+CDROM", 0x419e,
-       DEVICE_FLAG_NONE },
-   { "SONY", 0x0fce, "Xperia C MTP+CDROM", 0x41a3,
-@@ -1796,10 +1818,20 @@
-       DEVICE_FLAG_NONE },
-   { "SONY", 0x0fce, "Xperia M2 MTP+CDROM", 0x41aa,
-       DEVICE_FLAG_NONE },
-+  { "SONY", 0x0fce, "Xperia M2 Dual MTP+CDROM", 0x41ab,
-+      DEVICE_FLAG_NONE },
-   { "SONY", 0x0fce, "Xperia Z2 MTP+CDROM", 0x41af,
-       DEVICE_FLAG_NONE },
-   { "SONY", 0x0fce, "Xperia Z3 MTP+CDROM", 0x41ba,
-       DEVICE_FLAG_NONE },
-+  { "SONY", 0x0fce, "Xperia Z3 Compact MTP+CDROM", 0x41bb,
-+      DEVICE_FLAG_NONE },
-+  { "SONY", 0x0fce, "Xperia E3 MTP+CDROM", 0x01bc,
-+      DEVICE_FLAG_NONE },
-+  { "SONY", 0x0fce, "XPeria Z3+ MTP+CDROM", 0x41c9,
-+      DEVICE_FLAG_NONE },
-+  { "SONY", 0x0fce, "XPeria E4g MTP+CDROM", 0x41cb,
-+      DEVICE_FLAG_NONE },
- 
-   /*
-    * MTP+ADB personalities of MTP devices (see above)
-@@ -1888,6 +1920,8 @@
-       DEVICE_FLAG_NONE },
-   { "SONY", 0x0fce, "Xperia M2 MTP+ADB", 0x51aa,
-       DEVICE_FLAG_NONE },
-+  { "SONY", 0x0fce, "Xperia M2 Dual MTP+ADB", 0x51ab,
-+      DEVICE_FLAG_NONE },
-   { "SONY", 0x0fce, "Xperia Z2 MTP+ADB", 0x51af,
-       DEVICE_FLAG_NONE },
-   { "SONY", 0x0fce, "Xperia Z Ultra MTP+ADB", 0x51b6,
-@@ -1898,6 +1932,10 @@
-       DEVICE_FLAG_NONE },
-   { "SONY", 0x0fce, "Xperia E3 MTP+ADB", 0x51bc,
-       DEVICE_FLAG_NONE },
-+  { "SONY", 0x0fce, "XPeria Z3+ MTP+ADB", 0x51c9,
-+      DEVICE_FLAG_NONE },
-+  { "SONY", 0x0fce,  "XPeria E4g MTP+ADB", 0x51cb,
-+      DEVICE_FLAG_NONE },
- 
-   /*
-    * MTP+UMS modes
-@@ -1936,6 +1974,9 @@
-    * Motorola
-    * Assume DEVICE_FLAG_BROKEN_SET_OBJECT_PROPLIST on all of these.
-    */
-+  /* https://sourceforge.net/p/libmtp/feature-requests/136/ */
-+  { "Motorola", 0x22b8, "XT1524 (MTP)", 0x002e,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-   // Reported by David Boyd <tiggrdave@users.sourceforge.net>
-   { "Motorola", 0x22b8, "V3m/V750 verizon", 0x2a65,
-       DEVICE_FLAG_BROKEN_SET_OBJECT_PROPLIST |
-@@ -1952,6 +1993,9 @@
-       DEVICE_FLAGS_ANDROID_BUGS },
-   { "Motorola", 0x22b8, "Moto X (XT1058)", 0x2e63,
-       DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1323/ */
-+  { "Motorola", 0x22b8, "Moto X (XT1080)", 0x2e66,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-   { "Motorola", 0x22b8, "Droid Maxx (XT1080)", 0x2e67,
-       DEVICE_FLAGS_ANDROID_BUGS },
-   { "Motorola", 0x22b8, "Droid Ultra", 0x2e68,
-@@ -2345,6 +2389,14 @@
-   /* https://sourceforge.net/p/libmtp/bugs/1244/ */
-   { "Asus", 0x0b05, "MemoPad 8 ME181 CX (MTP)", 0x5561,
-       DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1406/ */
-+  { "Asus", 0x0b05, "Zenfone 2 (MTP)", 0x5600,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1364/ */
-+  { "Asus", 0x0b05, "Z00AD (MTP)", 0x5601,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-+  { "Asus", 0x0b05, "TX201LA (MTP)", 0x561f,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-   /* https://sourceforge.net/p/libmtp/bugs/1271/ */
-   { "Asus", 0x0b05, "ZenFone 4 (MTP)", 0x580f,
-       DEVICE_FLAGS_ANDROID_BUGS },
-@@ -2354,9 +2406,20 @@
-   /* https://sourceforge.net/p/libmtp/bugs/1258/ */
-   { "Asus", 0x0b05, "A450CG (MTP)", 0x5a0f,
-       DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1350/ */
-+  { "Asus", 0x0b05, "Zenfone 2 ZE550ML (MTP)", 0x5f02,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1364/ */
-+  { "Asus", 0x0b05, "Zenfone 2 ZE551ML (MTP)", 0x5f03,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-   /* https://sourceforge.net/p/libmtp/bugs/1232/ */
-   { "Asus", 0x0b05, "MemoPad 7 (ME572CL)", 0x7772,
-       DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1351/ */
-+  { "Asus", 0x0b05, "Fonepad 7 (FE375CXG)", 0x7773,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-+  { "Asus", 0x0b05, "ZenFone 5 A500KL (MTP)", 0x7780,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-   /* https://sourceforge.net/p/libmtp/bugs/1247/ */
-   { "Asus", 0x0b05, "ZenFone 5 A500KL (MTP+ADB)", 0x7781,
-       DEVICE_FLAGS_ANDROID_BUGS },
-@@ -2365,6 +2428,12 @@
-   /*
-    * Lenovo
-    */
-+  /* https://sourceforge.net/p/libmtp/support-requests/178/ */
-+  { "Lenovo", 0x17ef, "P70-A", 0x0c02,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1415/ */
-+  { "Lenovo", 0x17ef, "P70", 0x2008,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-   // Reported by Richard Körber <shredzone@users.sourceforge.net>
-   { "Lenovo", 0x17ef, "K1", 0x740a,
-       DEVICE_FLAGS_ANDROID_BUGS },
-@@ -2407,6 +2476,9 @@
-       DEVICE_FLAGS_ANDROID_BUGS },
-   { "Lenovo", 0x17ef, "Toga Tablet B6000-F", 0x76f2,
-       DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1122/ */
-+  { "Lenovo", 0x17ef, "S930", 0x7718,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-   /* https://sourceforge.net/p/libmtp/bugs/1250/ */
-   { "Lenovo", 0x17ef, "A5500-F", 0x772b,
-       DEVICE_FLAGS_ANDROID_BUGS },
-@@ -2417,15 +2489,24 @@
-   /* https://sourceforge.net/p/libmtp/bugs/1155/ */
-   { "Lenovo", 0x17ef, "Yoga Tablet 10 B8000-H", 0x76ff,
-       DEVICE_FLAGS_ANDROID_BUGS },
-+  /*  https://sourceforge.net/p/libmtp/bugs/1391/ */
-+  { "Lenovo", 0x17ef, "A7600-F", 0x7731,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-   /* https://sourceforge.net/p/libmtp/bugs/1291/ */
-   { "Lenovo", 0x17ef, "A3500-F", 0x7737,
-       DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/support-requests/186/ */
-+  { "Lenovo", 0x17ef, "Yoga Tablet 2 - 1050F", 0x77a4,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-   /* https://sourceforge.net/p/libmtp/support-requests/168/ */
-   { "Lenovo", 0x17ef, "Yoga Tablet 2 Pro", 0x77b1,
-       DEVICE_FLAGS_ANDROID_BUGS },
-   /* https://sourceforge.net/p/libmtp/feature-requests/125/ */
-   { "Lenovo", 0x17ef, "Vibe Z2", 0x77ea,
-       DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1360/ */
-+  { "Lenovo", 0x17ef, "K3 Note", 0x7883,
-+      DEVICE_FLAGS_ANDROID_BUGS },
- 
-   /*
-    * Huawei
-@@ -2435,6 +2516,15 @@
-       DEVICE_FLAGS_ANDROID_BUGS },
-   { "Huawei", 0x12d1, "MTP device (ID2)", 0x1052,
-       DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1381/ */
-+  { "Huawei", 0x12d1, "H60-L11", 0x1079,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1361/ */
-+  { "Huawei", 0x12d1, "Ascend P8 ", 0x1082,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1418/ */
-+  { "Huawei", 0x12d1, "Honor 3C ", 0x2012,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-   { "Huawei", 0x12d1, "Mediapad (mode 0)", 0x360f,
-       DEVICE_FLAGS_ANDROID_BUGS },
-   // Reported by Bearsh <bearsh@users.sourceforge.net>
-@@ -2452,6 +2542,8 @@
-   /* https://sourceforge.net/p/libmtp/bugs/672/ */
-   { "ZTE", 0x19d2, "Grand X In", 0x0343, DEVICE_FLAGS_ANDROID_BUGS },
-   { "ZTE", 0x19d2, "V985", 0x0383, DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1328/ */
-+  { "ZTE", 0x19d2, "V5", 0xffce, DEVICE_FLAGS_ANDROID_BUGS },
- 
-   /*
-    * HTC (High Tech Computer Corp)
-@@ -2459,6 +2551,12 @@
-    * Steven Eastland <grassmonk@users.sourceforge.net>
-    * Kevin Cheng <kache@users.sf.net>
-    */
-+  /* https://sourceforge.net/p/libmtp/support-requests/181/ */
-+  { "HTC", 0x0bb4, "HTC One M9 (MTP)", 0x040b,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1398/ */
-+  { "HTC", 0x0bb4, "Spreadtrum SH57MYZ03342 (MTP)", 0x05e3,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-   /* reported by Mikkel Oscar Lyderik <mikkeloscar@gmail.com> */
-   { "HTC", 0x0bb4, "HTC Desire 510 (MTP+ADB)", 0x05fd,
-       DEVICE_FLAGS_ANDROID_BUGS },
-@@ -2545,6 +2643,9 @@
-   /* https://sourceforge.net/p/libmtp/bugs/1182/ */
-   { "HTC", 0x0bb4, "Desire 310 (MTP)", 0x0ec6,
-       DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1420/ */
-+  { "HTC", 0x0bb4, "Desire 816G (MTP)", 0x0edb,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-   { "HTC", 0x0bb4, "HTC One (MTP+ADB+CDC)", 0x0f5f,
-       DEVICE_FLAGS_ANDROID_BUGS },
-   { "HTC", 0x0bb4, "HTC One (MTP+CDC)", 0x0f60,
-@@ -2658,6 +2759,9 @@
-       DEVICE_FLAGS_ANDROID_BUGS },
-   { "Amazon", 0x1949, "Kindle Fire (ID5)", 0x0012,
-       DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1353/ */
-+  { "Amazon", 0x1949, "Kindle Fire HD6", 0x00f2,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-   { "Amazon", 0x1949, "Fire Phone", 0x0800,
-       DEVICE_FLAGS_ANDROID_BUGS },
- 
-@@ -2677,6 +2781,9 @@
-       DEVICE_FLAGS_ANDROID_BUGS },
-   { "YiFang", 0x2207, "BQ Tesla", 0x0006,
-       DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1354/ */
-+  { "Various", 0x2207, "Viewpia DR/bq Kepler Debugging", 0x0011,
-+      DEVICE_FLAGS_ANDROID_BUGS },
- 
-   /*
-    * Kobo
-@@ -2708,6 +2815,8 @@
-   { "Intel", 0x8087, "Foxconn iView i700", 0x0a15, DEVICE_FLAGS_ANDROID_BUGS },
-   /* https://sourceforge.net/p/libmtp/bugs/1237/ */
-   { "Intel", 0x8087, "Telcast Air 3G", 0x0a5e, DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1338/ */
-+  { "Intel", 0x8087, "Chuwi vi8", 0x0a5f, DEVICE_FLAGS_ANDROID_BUGS },
- 
-   /*
-    * Xiaomi
-@@ -2738,6 +2847,15 @@
-       DEVICE_FLAGS_ANDROID_BUGS },
-   { "Xiaomi", 0x2717, "Mi-2 (MTP)", 0xf003,
-       DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1397/ */
-+  { "Xiaomi", 0x2717, "Mi-2s (id2) (MTP)", 0xff40,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1339/ */
-+  { "Xiaomi", 0x2717, "Mi-2s (MTP)", 0xff48,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1402/ */
-+  { "Xiaomi", 0x2717, "Redmi 2 (MTP)", 0xff60,
-+      DEVICE_FLAGS_ANDROID_BUGS },
- 
-   /*
-    * XO Learning Tablet
-@@ -2774,6 +2892,9 @@
-   /* https://sourceforge.net/p/libmtp/bugs/1304/ */
-   { "Alcatel", 0x1bbb, "OneTouch 5042D (MTP)", 0xa00e,
-       DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1401/ */
-+  { "Alcatel", 0x1bbb, "OneTouch Idol 3 (MTP)", 0xaf2b,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-   /* https://sourceforge.net/p/libmtp/feature-requests/114/ */
-   { "Alcatel", 0x1bbb, "OneTouch 6034R", 0xf003,
-       DEVICE_FLAGS_ANDROID_BUGS },
-@@ -2782,8 +2903,12 @@
-    * Kyocera
-    */
-   { "Kyocera", 0x0482, "Rise", 0x0571, DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/feature-requests/134/ */
-+  { "Kyocera", 0x0482, "Torque Model E6715", 0x0059a, DEVICE_FLAGS_ANDROID_BUGS },
-   /* https://sourceforge.net/p/libmtp/discussion/535190/thread/6270f5ce/ */
-   { "Kyocera", 0x0482, "KYL22", 0x0810, DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1345/ */
-+  { "Kyocera", 0x0482, "DuraForce", 0x0979, DEVICE_FLAGS_ANDROID_BUGS },
- 
-   /*
-    * HiSense
-@@ -2798,12 +2923,20 @@
-       DEVICE_FLAGS_ANDROID_BUGS },
-   { "Hewlett-Packard", 0x03f0, "Slate 7 2800", 0x5d1d,
-       DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/bugs/1366/ */
-+  { "Hewlett-Packard", 0x03f0, "Slate 10 HD", 0x7e1d,
-+      DEVICE_FLAGS_ANDROID_BUGS },
- 
-   /*
-    * MediaTek Inc.
-    */
-   { "MediaTek Inc", 0x0e8d, "MT5xx and MT6xx SoCs", 0x0050,
-       DEVICE_FLAGS_ANDROID_BUGS },
-+  { "MediaTek Inc", 0x0e8d, "MT65xx", 0x2008,
-+      DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/feature-requests/79/ */
-+  { "MediaTek Inc", 0x0e8d, "Elephone P8000", 0x201d,
-+      DEVICE_FLAGS_ANDROID_BUGS },
- 
-   /*
-    * Jolla
-@@ -2860,6 +2993,8 @@
-   { "Prestigio", 0x29e4, "5505 DUO ", 0x1103, DEVICE_FLAGS_ANDROID_BUGS },
-   /* https://sourceforge.net/p/libmtp/bugs/1243/ */
-   { "Prestigio", 0x29e4, "5504 DUO ", 0x1203, DEVICE_FLAGS_ANDROID_BUGS },
-+  /* https://sourceforge.net/p/libmtp/feature-requests/141/ */
-+  { "Prestigio", 0x29e4, "3405 DUO ", 0x3201, DEVICE_FLAGS_ANDROID_BUGS },
- 
-   /* https://sourceforge.net/p/libmtp/bugs/1283/ */
-   { "Megafon", 0x201e, "MFLogin3T", 0x42ab, DEVICE_FLAGS_ANDROID_BUGS },
-@@ -2867,6 +3002,8 @@
-   /* https://sourceforge.net/p/libmtp/bugs/1287/ */
-   { "Gensis", 0x040d, "GT-7305 ", 0x885c, DEVICE_FLAGS_ANDROID_BUGS },
- 
-+  /* https://sourceforge.net/p/libmtp/support-requests/182/ */
-+  { "Oppo", 0x22d9, "Find 5", 0x2764, DEVICE_FLAGS_ANDROID_BUGS },
-   /* https://sourceforge.net/p/libmtp/bugs/1207/ */
-   { "Oppo", 0x22d9, "Find 7 (ID 1)", 0x2765, DEVICE_FLAGS_ANDROID_BUGS },
-   /* https://sourceforge.net/p/libmtp/bugs/1277/ */
-@@ -2916,6 +3053,14 @@
-   /* https://sourceforge.net/p/libmtp/bugs/1314/ */
-   { "BenQ", 0x1d45, "F5", 0x459d, DEVICE_FLAGS_ANDROID_BUGS },
- 
-+  /* https://sourceforge.net/p/libmtp/bugs/1362/ */
-+  { "TomTom", 0x1390, "Rider 40", 0x5455, DEVICE_FLAGS_ANDROID_BUGS },
-+
-+  /* https://sourceforge.net/p/libmtp/feature-requests/135/. guessed android. */
-+  { "OUYA", 0x2836, "Videogame Console", 0x0010, DEVICE_FLAGS_ANDROID_BUGS },
-+
-+  /* https://sourceforge.net/p/libmtp/bugs/1383/ */
-+  { "BLU", 0x0e8d, "Studio HD", 0x2008, DEVICE_FLAGS_ANDROID_BUGS },
-   /*
-    * Other strange stuff.
-    */
diff --git a/gnu/packages/patches/ninja-tests.patch b/gnu/packages/patches/ninja-tests.patch
index 3436b6314d..f9b0d9f910 100644
--- a/gnu/packages/patches/ninja-tests.patch
+++ b/gnu/packages/patches/ninja-tests.patch
@@ -1,16 +1,17 @@
-SubprocessTest.SetWithLots fails with:
-  Raise [ulimit -n] well above 1025 to make this test go.
-Skip it.
+From 67d6b9262efad99f8aad63ab81efc8e689748766 Mon Sep 17 00:00:00 2001
+From: Efraim Flashner <efraim@flashner.co.il>
+Date: Sun, 3 Jul 2016 11:55:43 +0300
+Subject: [PATCH] patch
 
-SubprocessTest.InterruptChild fails when using 'system*':
-  *** Failure in src/subprocess_test.cc:83
-  ExitInterrupted == subproc->Finish()
-I can pass it by using 'system' instead of 'system*' when building locally,
-but it still failed on Hydra.  Skip it.
+---
+ src/subprocess_test.cc | 4 ++++
+ 1 file changed, 4 insertions(+)
 
---- ninja-1.5.3.orig/src/subprocess_test.cc	2015-01-15 10:34:28.859522176 +0800
-+++ ninja-1.5.3/src/subprocess_test.cc	2015-01-15 10:37:52.969572075 +0800
-@@ -72,6 +72,7 @@
+diff --git a/src/subprocess_test.cc b/src/subprocess_test.cc
+index ee16190..a537c11 100644
+--- a/src/subprocess_test.cc
++++ b/src/subprocess_test.cc
+@@ -72,6 +72,7 @@ TEST_F(SubprocessTest, NoSuchCommand) {
  
  #ifndef _WIN32
  
@@ -18,7 +19,7 @@ but it still failed on Hydra.  Skip it.
  TEST_F(SubprocessTest, InterruptChild) {
    Subprocess* subproc = subprocs_.Add("kill -INT $$");
    ASSERT_NE((Subprocess *) 0, subproc);
-@@ -82,6 +83,7 @@
+@@ -82,6 +83,7 @@ TEST_F(SubprocessTest, InterruptChild) {
  
    EXPECT_EQ(ExitInterrupted, subproc->Finish());
  }
@@ -26,7 +27,7 @@ but it still failed on Hydra.  Skip it.
  
  TEST_F(SubprocessTest, InterruptParent) {
    Subprocess* subproc = subprocs_.Add("kill -INT $PPID ; sleep 1");
-@@ -169,6 +171,7 @@
+@@ -217,6 +219,7 @@ TEST_F(SubprocessTest, SetWithMulti) {
  // OS X's process limit is less than 1025 by default
  // (|sysctl kern.maxprocperuid| is 709 on 10.7 and 10.8 and less prior to that).
  #if !defined(__APPLE__) && !defined(_WIN32)
@@ -34,11 +35,14 @@ but it still failed on Hydra.  Skip it.
  TEST_F(SubprocessTest, SetWithLots) {
    // Arbitrary big number; needs to be over 1024 to confirm we're no longer
    // hostage to pselect.
-@@ -196,6 +199,7 @@
+@@ -245,6 +248,7 @@ TEST_F(SubprocessTest, SetWithLots) {
    }
    ASSERT_EQ(kNumProcs, subprocs_.finished_.size());
  }
 +#endif
- #endif  // !__APPLE__ && !_WIN32 
+ #endif  // !__APPLE__ && !_WIN32
  
  // TODO: this test could work on Windows, just not sure how to simply
+-- 
+2.9.0
+
diff --git a/gnu/packages/patches/openimageio-boost-1.60.patch b/gnu/packages/patches/openimageio-boost-1.60.patch
deleted file mode 100644
index 92fc3237bb..0000000000
--- a/gnu/packages/patches/openimageio-boost-1.60.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-From 875fbbd92695397bfc83d1cd5fdd4094e1d50199 Mon Sep 17 00:00:00 2001
-From: Larry Gritz <lg@larrygritz.com>
-Date: Mon, 28 Dec 2015 11:46:07 -0800
-Subject: [PATCH] Python ImageCache binding fixes -- disable broken calls
-
-Some of these calls (thankfully undocumented and presumably unused)
-are horribly broken. They compiled before, but with new Boost 1.60
-they don't even compile properly. So just comment them out on this
-obsolete branch. They are fully fixed in RB-1.6 and beyond.
-
---- a/src/python/py_imagecache.cpp
-+++ b/src/python/py_imagecache.cpp
-@@ -199,23 +199,24 @@ void declare_imagecache()
-         .def("destroy", &ImageCacheWrap::destroy)
-         .staticmethod("destroy")
-         .def("clear", &ImageCacheWrap::clear)
--        .def("attribute", &ImageCacheWrap::attribute)
-+        // .def("attribute", &ImageCacheWrap::attribute)
-         .def("attribute", &ImageCacheWrap::attribute_int)
-         .def("attribute", &ImageCacheWrap::attribute_float)
--        .def("attribute", &ImageCacheWrap::attribute_double)
--        .def("attribute", &ImageCacheWrap::attribute_char)
-+        // .def("attribute", &ImageCacheWrap::attribute_double)
-+        // .def("attribute", &ImageCacheWrap::attribute_char)
-         .def("attribute", &ImageCacheWrap::attribute_string)
--        .def("getattribute", &ImageCacheWrap::attribute)
-+        // .def("getattribute", &ImageCacheWrap::attribute)
-         .def("getattribute", &ImageCacheWrap::getattribute_int)
-         .def("getattribute", &ImageCacheWrap::getattribute_float)
--        .def("getattribute", &ImageCacheWrap::getattribute_double)
--        .def("getattribute", &ImageCacheWrap::getattribute_char)
-+        // .def("getattribute", &ImageCacheWrap::getattribute_double)
-+        // .def("getattribute", &ImageCacheWrap::getattribute_char)
-         .def("getattribute", &ImageCacheWrap::getattribute_string)
--        .def("resolve_filename", &ImageCacheWrap::resolve_filename)
--        .def("get_image_info", &ImageCacheWrap::get_image_info)
--        .def("get_image_info", &ImageCacheWrap::get_image_info_old)
-+        // .def("get_image_info", &ImageCacheWrap::get_image_info)
-+        // .def("get_image_info", &ImageCacheWrap::get_image_info_old)
-         .def("get_imagespec", &ImageCacheWrap::get_imagespec)
--        .def("get_pixels", &ImageCacheWrap::get_pixels)
-+        // .def("get_pixels", &ImageCacheWrap::get_pixels)
-+        .def("resolve_filename", &ImageCacheWrap::resolve_filename)
-+
- //      .def("get_tile", &ImageCacheWrap::get_tile)
- //      .def("release_tile", &ImageCacheWrap::release_tile)
- //      .def("tile_pixels", &ImageCacheWrap::tile_pixels)
diff --git a/gnu/packages/patches/python-dendropy-exclude-failing-tests.patch b/gnu/packages/patches/python-dendropy-exclude-failing-tests.patch
new file mode 100644
index 0000000000..288a58b06f
--- /dev/null
+++ b/gnu/packages/patches/python-dendropy-exclude-failing-tests.patch
@@ -0,0 +1,21 @@
+diff --git a/dendropy/test/test_phylogenetic_distance_matrix.py b/dendropy/test/test_phylogenetic_distance_matrix.py
+index 10c05f5..a18ba52 100644
+--- a/dendropy/test/test_phylogenetic_distance_matrix.py
++++ b/dendropy/test/test_phylogenetic_distance_matrix.py
+@@ -793,7 +793,7 @@ class PdmUpgmaTree(PdmTreeChecker, unittest.TestCase):
+                     expected_tree=expected_tree)
+ 
+ class NodeToNodeDistancesTest(unittest.TestCase):
+-
++    @unittest.expectedFailure
+     def test_distances(self):
+         ## get distances from ape
+         # library(ape)
+@@ -825,6 +825,7 @@ class NodeToNodeDistancesTest(unittest.TestCase):
+                     e = reference_table[nd1.label, nd2.label]
+                     self.assertAlmostEqual(d, e)
+ 
++    @unittest.expectedFailure
+     def test_mrca(self):
+         test_runs = [
+                 "hiv1.newick",
diff --git a/gnu/packages/patches/sudo-CVE-2015-5602.patch b/gnu/packages/patches/sudo-CVE-2015-5602.patch
deleted file mode 100644
index 36c90fbee7..0000000000
--- a/gnu/packages/patches/sudo-CVE-2015-5602.patch
+++ /dev/null
@@ -1,372 +0,0 @@
-Based on the patch from https://www.sudo.ws/repos/sudo/raw-rev/c2e36a80a279
-Backported to 1.8.15 by Mark H Weaver <mhw@netris.org>
-
-# HG changeset patch
-# User Todd C. Miller <Todd.Miller@courtesan.com>
-# Date 1452475889 25200
-# Node ID c2e36a80a27927c32cba55afae78b8dc830cddc3
-# Parent  94ffd6b18431fa4b9ed0a0c3f0b7b9582a4f6bde
-Rewritten sudoedit_checkdir support that checks all the dirs in the
-path and refuses to follow symlinks in writable directories.
-This is a better fix for CVE-2015-5602.
-Adapted from a diff by Ben Hutchings.  Bug #707
-
-diff -r 94ffd6b18431 -r c2e36a80a279 doc/CONTRIBUTORS
---- a/doc/CONTRIBUTORS	Mon Jan 04 10:47:11 2016 -0700
-+++ b/doc/CONTRIBUTORS	Sun Jan 10 18:31:29 2016 -0700
-@@ -58,6 +58,7 @@
-     Holloway, Nick
-     Hoover, Adam
-     Hunter, Michael T.
-+    Hutchings, Ben
-     Irrgang, Eric
-     Jackson, Brian
-     Jackson, John R.
-diff -r 94ffd6b18431 -r c2e36a80a279 doc/UPGRADE
---- a/doc/UPGRADE	Mon Jan 04 10:47:11 2016 -0700
-+++ b/doc/UPGRADE	Sun Jan 10 18:31:29 2016 -0700
-@@ -1,6 +1,15 @@
- Notes on upgrading from an older release
- ========================================
- 
-+o Upgrading from a version prior to the post-1.8.15 fix for CVE-2015-5602.
-+
-+    The meaning of the sudoedit_checkdir sudoers option has changed.
-+    Previously, it would only check the parent directory
-+    of the file to be edited.  After the CVE fix, all directories
-+    in the path to be edited are checked and sudoedit will refuse
-+    to follow a symbolic link in a directory that is writable by
-+    the invoking user.
-+
- o Upgrading from a version prior to 1.8.15:
- 
-     Prior to version 1.8.15, when env_reset was enabled (the default)
-diff -r 94ffd6b18431 -r c2e36a80a279 doc/sudoers.cat
---- a/doc/sudoers.cat	Mon Jan 04 10:47:11 2016 -0700
-+++ b/doc/sudoers.cat	Sun Jan 10 18:31:29 2016 -0700
-@@ -1275,12 +1275,15 @@
-                        system call.  This flag is _o_f_f by default.
- 
-      sudoedit_checkdir
--                       If set, ssuuddooeeddiitt will refuse to edit files located in a
--                       directory that is writable by the invoking user unless
--                       it is run by root.  On many systems, this option
--                       requires that the parent directory of the file to be
--                       edited be readable by the target user.  This flag is
--                       _o_f_f by default.
-+                       If set, ssuuddooeeddiitt will check directories in the path to
-+                       be edited for writability by the invoking user.
-+                       Symbolic links will not be followed in writable
-+                       directories and ssuuddooeeddiitt will also refuse to edit a
-+                       file located in a writable directory.  Theses
-+                       restrictions are not enforced when ssuuddooeeddiitt is invoked
-+                       as root.  On many systems, this option requires that
-+                       all directories in the path to be edited be readable by
-+                       the target user.  This flag is _o_f_f by default.
- 
-      sudoedit_follow   By default, ssuuddooeeddiitt will not follow symbolic links
-                        when opening files.  The _s_u_d_o_e_d_i_t___f_o_l_l_o_w option can be
-diff -r 94ffd6b18431 -r c2e36a80a279 doc/sudoers.man.in
---- a/doc/sudoers.man.in	Mon Jan 04 10:47:11 2016 -0700
-+++ b/doc/sudoers.man.in	Sun Jan 10 18:31:29 2016 -0700
-@@ -2715,10 +2715,16 @@
- .br
- If set,
- \fBsudoedit\fR
--will refuse to edit files located in a directory that is writable
--by the invoking user unless it is run by root.
--On many systems, this option requires that the parent directory
--of the file to be edited be readable by the target user.
-+will check directories in the path to be edited for writability
-+by the invoking user.
-+Symbolic links will not be followed in writable directories and
-+\fBsudoedit\fR
-+will also refuse to edit a file located in a writable directory.
-+Theses restrictions are not enforced when
-+\fBsudoedit\fR
-+is invoked as root.
-+On many systems, this option requires that all directories
-+in the path to be edited be readable by the target user.
- This flag is
- \fIoff\fR
- by default.
-diff -r 94ffd6b18431 -r c2e36a80a279 doc/sudoers.mdoc.in
---- a/doc/sudoers.mdoc.in	Mon Jan 04 10:47:11 2016 -0700
-+++ b/doc/sudoers.mdoc.in	Sun Jan 10 18:31:29 2016 -0700
-@@ -2549,10 +2549,16 @@
- .It sudoedit_checkdir
- If set,
- .Nm sudoedit
--will refuse to edit files located in a directory that is writable
--by the invoking user unless it is run by root.
--On many systems, this option requires that the parent directory
--of the file to be edited be readable by the target user.
-+will check directories in the path to be edited for writability
-+by the invoking user.
-+Symbolic links will not be followed in writable directories and
-+.Nm sudoedit
-+will also refuse to edit a file located in a writable directory.
-+Theses restrictions are not enforced when
-+.Nm sudoedit
-+is invoked as root.
-+On many systems, this option requires that all directories
-+in the path to be edited be readable by the target user.
- This flag is
- .Em off
- by default.
-diff -r 94ffd6b18431 -r c2e36a80a279 include/sudo_compat.h
---- a/include/sudo_compat.h	Mon Jan 04 10:47:11 2016 -0700
-+++ b/include/sudo_compat.h	Sun Jan 10 18:31:29 2016 -0700
-@@ -182,6 +182,8 @@
- # ifndef UTIME_NOW
- #  define UTIME_NOW	-2L
- # endif
-+#endif
-+#if !defined(HAVE_OPENAT) || (!defined(HAVE_FUTIMENS) && !defined(HAVE_UTIMENSAT))
- # ifndef AT_FDCWD
- #  define AT_FDCWD	-100
- # endif
-diff -r 94ffd6b18431 -r c2e36a80a279 src/sudo_edit.c
---- a/src/sudo_edit.c	Mon Jan 04 10:47:11 2016 -0700
-+++ b/src/sudo_edit.c	Sun Jan 10 18:31:29 2016 -0700
-@@ -179,13 +179,15 @@
- }
- 
- #ifndef HAVE_OPENAT
--/* This does not support AT_FDCWD... */
- static int
- sudo_openat(int dfd, const char *path, int flags, mode_t mode)
- {
-     int fd, odfd;
-     debug_decl(sudo_openat, SUDO_DEBUG_EDIT)
- 
-+    if (dfd == AT_FDCWD)
-+	debug_return_int(open(path, flags, mode));
-+
-     /* Save cwd */
-     if ((odfd = open(".", O_RDONLY)) == -1)
- 	debug_return_int(-1);
-@@ -207,6 +209,64 @@
- #define openat sudo_openat
- #endif /* HAVE_OPENAT */
- 
-+#ifdef O_NOFOLLOW
-+static int
-+sudo_edit_openat_nofollow(int dfd, char *path, int oflags, mode_t mode)
-+{
-+    debug_decl(sudo_edit_open_nofollow, SUDO_DEBUG_EDIT)
-+
-+    debug_return_int(openat(dfd, path, oflags|O_NOFOLLOW, mode));
-+}
-+#else
-+/*
-+ * Returns true if fd and path don't match or path is a symlink.
-+ * Used on older systems without O_NOFOLLOW.
-+ */
-+static bool
-+sudo_edit_is_symlink(int fd, char *path)
-+{
-+    struct stat sb1, sb2;
-+    debug_decl(sudo_edit_is_symlink, SUDO_DEBUG_EDIT)
-+
-+    /*
-+     * Treat [fl]stat() failure like there was a symlink.
-+     */
-+    if (fstat(fd, &sb1) == -1 || lstat(path, &sb2) == -1)
-+	debug_return_bool(true);
-+
-+    /*
-+     * Make sure we did not open a link and that what we opened
-+     * matches what is currently on the file system.
-+     */
-+    if (S_ISLNK(sb2.st_mode) ||
-+	sb1.st_dev != sb2.st_dev || sb1.st_ino != sb2.st_ino) {
-+	debug_return_bool(true);
-+    }
-+
-+    debug_return_bool(false);
-+}
-+
-+static int
-+sudo_edit_openat_nofollow(char *path, int oflags, mode_t mode)
-+{
-+    struct stat sb1, sb2;
-+    int fd;
-+    debug_decl(sudo_edit_openat_nofollow, SUDO_DEBUG_EDIT)
-+
-+    fd = openat(dfd, path, oflags, mode);
-+    if (fd == -1)
-+	debug_return_int(-1);
-+
-+    if (sudo_edit_is_symlink(fd, path)) {
-+	close(fd);
-+	fd = -1;
-+	errno = ELOOP;
-+    }
-+
-+    debug_return_int(fd);
-+}
-+#endif /* O_NOFOLLOW */
-+
- /*
-  * Returns true if the directory described by sb is writable
-  * by the user.  We treat directories with the sticky bit as
-@@ -245,49 +305,94 @@
-     debug_return_bool(false);
- }
- 
-+/*
-+ * Directory open flags for use with openat(2) and fstat(2).
-+ * Use O_PATH and O_DIRECTORY where possible.
-+ */
-+#if defined(O_PATH) && defined(O_DIRECTORY)
-+# define DIR_OPEN_FLAGS	(O_PATH|O_DIRECTORY)
-+#elif defined(O_PATH) && !defined(O_DIRECTORY)
-+# define DIR_OPEN_FLAGS	O_PATH
-+#elif !defined(O_PATH) && defined(O_DIRECTORY)
-+# define DIR_OPEN_FLAGS	(O_RDONLY|O_DIRECTORY)
-+#else
-+# define DIR_OPEN_FLAGS	(O_RDONLY|O_NONBLOCK)
-+#endif
-+
- static int
- sudo_edit_open_nonwritable(char *path, int oflags, mode_t mode)
- {
--    char *base, *dir;
-+    int dfd, fd, dflags = DIR_OPEN_FLAGS;
-+#if defined(__linux__) && defined(O_PATH)
-+    char *opath = path;
-+#endif
-+    bool is_writable;
-     struct stat sb;
--    int dfd, fd;
-     debug_decl(sudo_edit_open_nonwritable, SUDO_DEBUG_EDIT)
- 
--    base = strrchr(path, '/');
--    if (base != NULL) {
--	*base++ = '\0';
--	dir = path;
-+#if defined(__linux__) && defined(O_PATH)
-+restart:
-+#endif
-+    if (path[0] == '/') {
-+	dfd = open("/", dflags);
-+	path++;
-     } else {
--	base = path;
--	dir = ".";
-+	dfd = open(".", dflags);
-+	if (path[0] == '.' && path[1] == '/')
-+	    path += 2;
-     }
--#ifdef O_PATH
--    if ((dfd = open(dir, O_PATH)) != -1) {
--	/* Linux kernels < 3.6 can't do fstat on O_PATH fds. */
--	if (fstat(dfd, &sb) == -1) {
--	    close(dfd);
--	    dfd = open(dir, O_RDONLY);
--	    if (fstat(dfd, &sb) == -1) {
--		close(dfd);
--		dfd = -1;
--	    }
--	}
--    }
--#else
--    if ((dfd = open(dir, O_RDONLY)) != -1) {
--	if (fstat(dfd, &sb) == -1) {
--	    close(dfd);
--	    dfd = -1;
--	}
--    }
--#endif
--    if (base != path)
--	base[-1] = '/';			/* restore path */
-     if (dfd == -1)
- 	debug_return_int(-1);
- 
--    if (dir_is_writable(&sb, user_details.uid, user_details.gid,
--	user_details.ngroups, user_details.groups)) {
-+    for (;;) {
-+	char *slash;
-+	int subdfd;
-+
-+	/*
-+	 * Look up one component at a time, avoiding symbolic links in
-+	 * writable directories.
-+	 */
-+	if (fstat(dfd, &sb) == -1) {
-+	    close(dfd);
-+#if defined(__linux__) && defined(O_PATH)
-+	    /* Linux prior to 3.6 can't fstat an O_PATH fd */
-+	    if (ISSET(dflags, O_PATH)) {
-+		CLR(dflags, O_PATH);
-+		path = opath;
-+		goto restart;
-+	    }
-+#endif
-+	    debug_return_int(-1);
-+	}
-+#ifndef O_DIRECTORY
-+	if (!S_ISDIR(sb.st_mode)) {
-+	    close(dfd);
-+	    errno = ENOTDIR;
-+	    debug_return_int(-1);
-+	}
-+#endif
-+	is_writable = dir_is_writable(&sb, user_details.uid, user_details.gid,
-+	    user_details.ngroups, user_details.groups);
-+
-+	while (path[0] == '/')
-+	    path++;
-+	slash = strchr(path, '/');
-+	if (slash == NULL)
-+	    break;
-+	*slash = '\0';
-+	if (is_writable)
-+	    subdfd = sudo_edit_openat_nofollow(dfd, path, dflags, 0);
-+	else
-+	    subdfd = openat(dfd, path, dflags, 0);
-+	*slash = '/';			/* restore path */
-+	close(dfd);
-+	if (subdfd == -1)
-+	    debug_return_int(-1);
-+	path = slash + 1;
-+	dfd = subdfd;
-+    }
-+
-+    if (is_writable) {
- 	close(dfd);
- 	errno = EISDIR;
- 	debug_return_int(-1);
-@@ -332,27 +437,10 @@
-     if (!ISSET(oflags, O_NONBLOCK))
- 	(void) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_NONBLOCK);
- 
--    /*
--     * Treat [fl]stat() failure like an open() failure.
--     */
--    if (fstat(fd, &sb1) == -1 || lstat(path, &sb2) == -1) {
--	const int serrno = errno;
-+    if (!ISSET(sflags, CD_SUDOEDIT_FOLLOW) && sudo_edit_is_symlink(fd, path)) {
- 	close(fd);
--	errno = serrno;
--	debug_return_int(-1);
--    }
--
--    /*
--     * Make sure we did not open a link and that what we opened
--     * matches what is currently on the file system.
--     */
--    if (!ISSET(sflags, CD_SUDOEDIT_FOLLOW)) {
--	if (S_ISLNK(sb2.st_mode) ||
--	    sb1.st_dev != sb2.st_dev || sb1.st_ino != sb2.st_ino) {
--	    close(fd);
--	    errno = ELOOP;
--	    debug_return_int(-1);
--	}
-+	fd = -1;
-+	errno = ELOOP;
-     }
- 
-     debug_return_int(fd);
-
diff --git a/gnu/packages/pdf.scm b/gnu/packages/pdf.scm
index 7c2651764a..36c538c165 100644
--- a/gnu/packages/pdf.scm
+++ b/gnu/packages/pdf.scm
@@ -1,7 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013, 2015, 2016 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2014 Mark H Weaver <mhw@netris.org>
-;;; Copyright © 2014, 2015 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2014, 2015, 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2015 Paul van der Walt <paul@denknerd.org>
 ;;; Copyright © 2016 Roel Janssen <roel@gnu.org>
 ;;;
@@ -28,6 +28,7 @@
   #:use-module (guix build-system cmake)
   #:use-module (guix build-system python)
   #:use-module (gnu packages)
+  #:use-module (gnu packages autotools)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages fontutils)
   #:use-module (gnu packages ghostscript)
@@ -157,6 +158,45 @@
 Poppler PDF rendering library.")
     (license license:lgpl2.1+)))
 
+(define-public libharu
+  (package
+   (name "libharu")
+   (version "2.3.0")
+   (source (origin
+             (method url-fetch)
+             (uri (string-append "https://github.com/libharu/libharu/archive/"
+                                 "RELEASE_"
+                                 (string-join (string-split version #\.) "_")
+                                 ".tar.gz"))
+             (file-name (string-append name "-" version ".tar.gz"))
+             (sha256
+              (base32
+               "1lm4v539y9cb1lvbq387j57sy7yxda3yv8b1pk8m6zazbp66i7lg"))))
+   (build-system gnu-build-system)
+   (arguments
+    `(#:configure-flags
+      (list (string-append "--with-zlib="
+                           (assoc-ref %build-inputs "zlib"))
+            (string-append "--with-png="
+                           (assoc-ref %build-inputs "libpng")))
+      #:phases
+      (modify-phases %standard-phases
+        (add-before 'configure 'autogen
+          (lambda _ (zero? (system* "autoreconf" "-vif")))))))
+   (inputs
+    `(("zlib" ,zlib)
+      ("libpng" ,libpng)))
+   (native-inputs
+    `(("autoconf" ,autoconf)
+      ("automake" ,automake)
+      ("libtool" ,libtool)))
+   (home-page "http://libharu.org/")
+   (synopsis "Library for generating PDF files")
+   (description
+    "libHaru is a library for generating PDF files.  libHaru does not support
+reading and editing of existing PDF files.")
+   (license license:zlib)))
+
 (define-public xpdf
   (package
    (name "xpdf")
diff --git a/gnu/packages/perl.scm b/gnu/packages/perl.scm
index 211505a846..9f298ac960 100644
--- a/gnu/packages/perl.scm
+++ b/gnu/packages/perl.scm
@@ -8,6 +8,8 @@
 ;;; Copyright © 2016 Jochem Raat <jchmrt@riseup.net>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Coypright © 2016 ng0 <ng0@we.make.ritual.n0.is>
+;;; Copyright © 2016 Alex Sassmannshausen <alex@pompo.co>
+;;; Copyright © 2016 Roel Janssen <roel@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1002,6 +1004,29 @@ some enhancements such as here-documents, C-style comments, and multiline
 options.")
     (license (package-license perl))))
 
+(define-public perl-config-ini
+  (package
+    (name "perl-config-ini")
+    (version "0.025")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "mirror://cpan/authors/id/R/RJ/RJBS/Config-INI-"
+                    version ".tar.gz"))
+              (sha256
+               (base32
+                "0clphq6a17chvb663fvjnxqvyvh26g03x0fl4bg9vy4ibdnzg2v2"))))
+    (build-system perl-build-system)
+    (inputs
+     `(("perl-mixin-linewise" ,perl-mixin-linewise)
+       ("perl-perlio-utf8_strict" ,perl-perlio-utf8_strict)
+       ("perl-sub-exporter" ,perl-sub-exporter)))
+    (home-page "http://search.cpan.org/dist/Config-INI")
+    (synopsis "Simple .ini-file format reader and writer")
+    (description "@code{Config::INI} is a module that facilates the reading
+and writing of @code{.ini}-style configuration files.")
+    (license (package-license perl))))
+
 (define-public perl-context-preserve
   (package
     (name "perl-context-preserve")
@@ -2458,6 +2483,26 @@ shell.")
                               "File-Which-" version))
     (license (package-license perl))))
 
+(define-public perl-file-zglob
+  (package
+    (name "perl-file-zglob")
+    (version "0.11")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "mirror://cpan/authors/id/T/TO/TOKUHIROM/File-Zglob-"
+                    version ".tar.gz"))
+              (sha256
+               (base32
+                "16v61rn0yimpv5kp6b20z2f1c93n5kpsyjvr0gq4w2dc43gfvc8w"))))
+    (build-system perl-build-system)
+    (home-page "http://search.cpan.org/dist/File-Zglob")
+    (synopsis "Extended Unix style glob functionality")
+    (description "@code{File::Zglob} provides a traditional Unix @code{glob}
+functionality; it returns a list of file names that match the given pattern.
+For instance, it supports the @code{**/*.pm} form.")
+    (license (package-license perl))))
+
 (define-public perl-getopt-long-descriptive
   (package
     (name "perl-getopt-long-descriptive")
@@ -2505,6 +2550,29 @@ vaguely inspired by John Ousterhout's Tk_ParseArgv.")
                               "Getopt-Tabular-" version))
     (license (package-license perl))))
 
+(define-public perl-guard
+  (package
+    (name "perl-guard")
+    (version "1.023")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://cpan/authors/id/M/ML/MLEHMANN/Guard-"
+                                  version ".tar.gz"))
+              (sha256
+               (base32
+                "1p6i9mfmbs9cw40jqdv71ihv2xfi0vvlv8bdv2810gf93zwxvi1l"))))
+    (build-system perl-build-system)
+    (home-page "http://search.cpan.org/dist/Guard")
+    (synopsis "Safe cleanup blocks implemented as guards")
+    (description "@code{Guard} implements so-called @dfn{guards}.  A guard is
+something (usually an object) that \"guards\" a resource, ensuring that it is
+cleaned up when expected.
+
+Specifically, this module supports two different types of guards: guard
+objects, which execute a given code block when destroyed, and scoped guards,
+which are tied to the scope exit.")
+    (license (package-license perl))))
+
 (define-public perl-hash-merge
   (package
     (name "perl-hash-merge")
@@ -2592,6 +2660,31 @@ dependencies for CPAN distributions.  These dependencies get bundled into the
 inc directory within a distribution and are used by Makefile.PL or Build.PL.")
     (license asl2.0)))
 
+(define-public perl-io-captureoutput
+  (package
+    (name "perl-io-captureoutput")
+    (version "1.1104")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://cpan/authors/id/D/DA/DAGOLDEN/IO-CaptureOutput-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "0c437zvzpqi8f0h3nmblwdi2bvsb92b7g30fndr7my9qnky35izw"))))
+    (build-system perl-build-system)
+    (home-page "http://search.cpan.org/dist/IO-CaptureOutput")
+    (synopsis "Capture STDOUT and STDERR from Perl code, subprocesses or XS")
+    (description "@code{IO::CaptureOutput} provides routines for capturing
+@code{STDOUT} and @code{STDERR} from perl subroutines, forked system
+calls (e.g. @code{system()}, @code{fork()}) and from XS or C modules.
+
+This module is no longer recommended by its maintainer.  Users are advised to
+try @code{Capture::Tiny} instead.")
+    (license (package-license perl))))
+
 (define-public perl-io-interactive
   (package
     (name "perl-io-interactive")
@@ -2744,6 +2837,30 @@ Perlish API and none of the bloat and rarely used features of IPC::Run.")
 allowing data to be efficiently communicated between processes.")
     (license (package-license perl))))
 
+(define-public perl-ipc-system-simple
+  (package
+    (name "perl-ipc-system-simple")
+    (version "1.25")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "mirror://cpan/authors/id/P/PJ/PJF/IPC-System-Simple-"
+                    version ".tar.gz"))
+              (sha256
+               (base32
+                "0fsdb81shjj4hifyyzvj7vpkhq5jrfhlcpw2xbjfi1mqz8fsmdpi"))))
+    (build-system perl-build-system)
+    (home-page "http://search.cpan.org/dist/IPC-System-Simple")
+    (synopsis "Run commands simply, with detailed diagnostics")
+    (description "Calling Perl's in-built @code{system} function is easy,
+determining if it was successful is hard.  Let's face it, @code{$?} isn't the
+nicest variable in the world to play with, and even if you do check it,
+producing a well-formatted error string takes a lot of work.
+
+@code{IPC::System::Simple} takes the hard work out of calling external
+commands.")
+    (license (package-license perl))))
+
 (define-public perl-json
   (package
     (name "perl-json")
@@ -2913,6 +3030,30 @@ one: logging, exceptions, and translations.")
 List::Util or List::MoreUtils defines, with preference to List::Util.")
     (license (package-license perl))))
 
+(define-public perl-list-compare
+  (package
+    (name "perl-list-compare")
+    (version "0.53")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://cpan/authors/id/J/JK/JKEENAN/List-Compare-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "0l451yqhx1hlm7f2c3bjsl3n8w6l1jngrxzyfm2d8d9iggv4zgzx"))))
+    (build-system perl-build-system)
+    (native-inputs
+     `(("perl-io-captureoutput" ,perl-io-captureoutput)))
+    (home-page "http://search.cpan.org/dist/List-Compare")
+    (synopsis "Compare elements of two or more lists")
+    (description "@code{List::Compare} provides a module to perform
+comparative operations on two or more lists.  Provided operations include
+intersections, unions, unique elements, complements and many more.")
+    (license (package-license perl))))
+
 (define-public perl-list-moreutils
   (package
     (name "perl-list-moreutils")
@@ -2938,6 +3079,39 @@ List::Util or List::MoreUtils defines, with preference to List::Util.")
 functionality on lists which is not going to go into List::Util.")
     (license (package-license perl))))
 
+(define-public perl-list-someutils
+  (package
+    (name "perl-list-someutils")
+    (version "0.52")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://cpan/authors/id/D/DR/DROLSKY/List-SomeUtils-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "1b450jyxaa6q2yl0cdhknr3c2a5s7b9b18ccnwac625c681r130y"))))
+    (build-system perl-build-system)
+    (native-inputs
+     `(("perl-test-leaktrace" ,perl-test-leaktrace)))
+    (inputs
+     `(("perl-exporter-tiny" ,perl-exporter-tiny)
+       ("perl-module-implementation"
+        ,perl-module-implementation)))
+    (home-page "http://search.cpan.org/dist/List-SomeUtils")
+    (synopsis "Provide the stuff missing in List::Util")
+    (description "@code{List::SomeUtils} provides some trivial but commonly
+needed functionality on lists which is not going to go into @code{List::Util}.
+
+All of the below functions are implementable in only a couple of lines of Perl
+code.  Using the functions from this module however should give slightly
+better performance as everything is implemented in C.  The pure-Perl
+implementation of these functions only serves as a fallback in case the C
+portions of this module couldn't be compiled on this machine.")
+    (license (package-license perl))))
+
 (define-public perl-memoize-expirelru
   (package
     (name "perl-memoize-expirelru")
@@ -2997,6 +3171,31 @@ from various sources.  For instance, it contains all IANA types and the
 knowledge of Apache.")
     (license (package-license perl))))
 
+(define-public perl-mixin-linewise
+  (package
+    (name "perl-mixin-linewise")
+    (version "0.108")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "mirror://cpan/authors/id/R/RJ/RJBS/Mixin-Linewise-"
+                    version ".tar.gz"))
+              (sha256
+               (base32
+                "1wmfr19w9y8qys7b32mnj1vmps7qwdahqas71a9p62ac8xw0dwkx"))))
+    (build-system perl-build-system)
+    (inputs
+     `(("perl-perlio-utf8_strict" ,perl-perlio-utf8_strict)
+       ("perl-sub-exporter" ,perl-sub-exporter)))
+    (home-page "http://search.cpan.org/dist/Mixin-Linewise")
+    (synopsis "Write your linewise code for handles; this does the rest")
+    (description "It's boring to deal with opening files for IO, converting
+strings to handle-like objects, and all that.  With
+@code{Mixin::Linewise::Readers} and @code{Mixin::Linewise::Writers}, you can
+just write a method to handle handles, and methods for handling strings and
+file names are added for you.")
+    (license (package-license perl))))
+
 (define-public perl-module-build-tiny
   (package
     (name "perl-module-build-tiny")
@@ -4154,6 +4353,29 @@ up inheritance from those modules at the same time.")
 directory specifications in a cross-platform manner.")
     (license (package-license perl))))
 
+(define-public perl-perlio-utf8_strict
+  (package
+    (name "perl-perlio-utf8-strict")
+    (version "0.006")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "mirror://cpan/authors/id/L/LE/LEONT/PerlIO-utf8_strict-"
+                    version ".tar.gz"))
+              (sha256
+               (base32
+                "0qnmiflirfq10jkmrxyy81ch6hzyndfzxqf8maif0fy44kk1004q"))))
+    (build-system perl-build-system)
+    (native-inputs
+     `(("perl-test-exception" ,perl-test-exception)))
+    (home-page
+     "http://search.cpan.org/dist/PerlIO-utf8_strict")
+    (synopsis "Fast and correct UTF-8 IO")
+    (description "@code{PerlIO::utf8_strict} provides a fast and correct UTF-8
+PerlIO layer.  Unlike Perl's default @code{:utf8} layer it checks the input
+for correctness.")
+    (license (package-license perl))))
+
 (define-public perl-pod-coverage
   (package
     (name "perl-pod-coverage")
@@ -4939,6 +5161,66 @@ framework base class.  It concentrates on offering reusable data driven
 patterns, so that you can write tests with a minimum of code.")
     (license (package-license perl))))
 
+(define-public perl-test-class
+  (package
+    (name "perl-test-class")
+    (version "0.50")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://cpan.metacpan.org/authors/id/E/ET/ETHER/Test-Class-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "0l0kk5jvxjkic2jkf1r7v41irb344aasnzr3f5ygjgxgiknm9489"))))
+    (build-system perl-build-system)
+    (native-inputs
+     `(("perl-test-exception" ,perl-test-exception)))
+    (inputs
+     `(("perl-module-runtime" ,perl-module-runtime)
+       ("perl-mro-compat" ,perl-mro-compat)
+       ("perl-try-tiny" ,perl-try-tiny)))
+    (home-page "http://search.cpan.org/dist/Test-Class")
+    (synopsis "Easily create test classes in an xUnit/JUnit style")
+    (description "@code{Test::Class} provides a simple way of creating classes
+and objects to test your code in an xUnit style.
+
+Built using @code{Test::Builder}, it was designed to work with other
+@code{Test::Builder} based modules (@code{Test::More},
+@code{Test::Differences}, @code{Test::Exception}, etc.).")
+    (license (package-license perl))))
+
+(define-public perl-test-class-most
+  (package
+    (name "perl-test-class-most")
+    (version "0.08")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://cpan/authors/id/O/OV/OVID/Test-Class-Most-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "1zvx9hil0mg0pnb8xfa4m0xgjpvh8s5gnbyprq3xwpdsdgcdwk33"))))
+    (build-system perl-build-system)
+    (native-inputs
+     `(("perl-module-build" ,perl-module-build)))
+    (inputs
+     `(("perl-test-class" ,perl-test-class)
+       ("perl-test-most" ,perl-test-most)
+       ("perl-module-runtime" ,perl-module-runtime)
+       ("perl-try-tiny" ,perl-try-tiny)
+       ("perl-mro-compat" ,perl-mro-compat)))
+    (home-page "http://search.cpan.org/dist/Test-Class-Most")
+    (synopsis "Test classes the easy way")
+    (description "@code{Test::Class::Most} provides some more convenience when
+using @code{Test::Class}.")
+    (license (package-license perl))))
+
 (define-public perl-test-cleannamespaces
   (package
     (name "perl-test-cleannamespaces")
@@ -5651,15 +5933,15 @@ can combine fields into a CSV string and parse a CSV string into fields.")
 (define-public perl-text-diff
   (package
     (name "perl-text-diff")
-    (version "1.41")
+    (version "1.44")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "mirror://cpan/authors/id/O/OV/OVID/"
+       (uri (string-append "mirror://cpan/authors/id/N/NE/NEILB/"
                            "Text-Diff-" version ".tar.gz"))
        (sha256
         (base32
-         "1ynjsa4sr1yvyh65sdfvahaafglibz70j8b6rj01cg1iisj50zx6"))))
+         "041v92zla2acdc433f47giridf6p820sdczs7x5d71fhsyza1xsp"))))
     (build-system perl-build-system)
     (propagated-inputs
      `(("perl-algorithm-diff" ,perl-algorithm-diff)))
@@ -5806,6 +6088,26 @@ system.")
 as exceptions to standard program flow.")
     (license (package-license perl))))
 
+(define-public perltidy
+  (package
+    (name "perltidy")
+    (version "20160302")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://sourceforge/perltidy/Perl-Tidy-"
+                                  version ".tar.gz"))
+              (sha256
+               (base32
+                "19yw63yh5s3pq7k3nkw6nsamg5b8vvwyhgbizslgxg0mqgc4xl3d"))))
+    (build-system perl-build-system)
+    (home-page "http://perltidy.sourceforge.net/")
+    (synopsis "Perl script tidier")
+    (description "This package contains a Perl script which indents and
+reformats Perl scripts to make them easier to read.   The formatting can be
+controlled with command line parameters.  The default parameter settings
+approximately follow the suggestions in the Perl Style Guide.")
+    (license gpl2+)))
+
 (define-public perl-tie-ixhash
   (package
   (name "perl-tie-ixhash")
diff --git a/gnu/packages/pumpio.scm b/gnu/packages/pumpio.scm
index 9d705ea3d5..a74d474368 100644
--- a/gnu/packages/pumpio.scm
+++ b/gnu/packages/pumpio.scm
@@ -61,7 +61,6 @@
     (inputs
      `(("aspell" ,aspell)
        ("qtbase" ,qtbase)
-       ("qjson" ,qjson)
        ("tidy" ,tidy)))
     (synopsis "Qt-based pump.io client")
     (description "Pumpa is a simple pump.io client written in C++ and Qt.")
diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm
index 8bba7ca256..717a81e59f 100644
--- a/gnu/packages/python.scm
+++ b/gnu/packages/python.scm
@@ -22,6 +22,8 @@
 ;;; Copyright © 2016 Hartmut Goebel <h.goebel@crazy-compilers.com>
 ;;; Copyright © 2016 Daniel Pimentel <d4n1@d4n1.org>
 ;;; Copyright © 2016 Sou Bunnbu <iyzsong@gmail.com>
+;;; Copyright © 2016 Troy Sankey <sankeytms@gmail.com>
+;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -384,18 +386,18 @@ instead of @command{python3}.")))
 (define-public python-psutil
   (package
     (name "python-psutil")
-    (version "3.3.0")
+    (version "4.3.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "psutil" version))
        (sha256
         (base32
-         "11bd1555vf2ibjnmqf64im5cp55vcqfq45ccinm9ll3bs68na6s2"))))
+         "1w4r09fvn6kd80m5mx4ws1wz100brkaq6hzzpwrns8cgjzjpl6c6"))))
     (build-system python-build-system)
     (native-inputs
      `(("python-setuptools" ,python-setuptools)))
-    (home-page "https://pypi.python.org/pypi/psutil/")
+    (home-page "https://www.github.com/giampaolo/psutil")
     (synopsis "Library for retrieving information on running processes")
     (description
      "psutil (Python system and process utilities) is a library for retrieving
@@ -1139,15 +1141,14 @@ after Andy Lester’s Perl module WWW::Mechanize.")
 (define-public python-simplejson
   (package
     (name "python-simplejson")
-    (version "3.3.0")
+    (version "3.8.2")
     (source
      (origin
       (method url-fetch)
-      (uri (string-append "https://pypi.python.org/packages/source/s/simplejson/simplejson-"
-                          version ".tar.gz"))
+      (uri (pypi-uri "simplejson" version))
       (sha256
        (base32
-        "07wsry5j44l5zzm74l4j2bvasiq8n5m32f31n2p7c68i5vc6p2ks"))))
+        "0zylrnax8b6r0ndgni4w9c599fi6wm9vx5g6k3ddqfj3932kk16m"))))
     (build-system python-build-system)
     (home-page "http://simplejson.readthedocs.org/en/latest/")
     (synopsis
@@ -2030,14 +2031,14 @@ have failed since the last commit or what tests are currently failing.")
 (define-public python-coverage
   (package
     (name "python-coverage")
-    (version "4.0.3")
+    (version "4.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "coverage" version))
        (sha256
         (base32
-         "0qjlja8ny4gcfp8abqfwdrvr8qw9kr69lkja0b4cqqbsdmdjgcc5"))))
+         "01rbr4br4lsk0lwn8fb96zwd2xr4f0mg1w7iq3j11i8f5ig2nqs1"))))
     (build-system python-build-system)
     (inputs
      `(("python-setuptools" ,python-setuptools)))
@@ -2083,14 +2084,13 @@ backported from Python 2.7 for Python 2.4+.")
 (define-public behave
   (package
     (name "behave")
-    (version "1.2.4")
+    (version "1.2.5")
     (source (origin
              (method url-fetch)
-             (uri (string-append "https://pypi.python.org/packages/source/b/"
-                                 name "/" name "-" version ".tar.gz"))
+             (uri (pypi-uri "behave" version ".tar.bz2"))
              (sha256
               (base32
-               "1v2rfy8xnf0rk7cj4cgr7lam4015d458i7bg0xqs9czfv6njlm14"))))
+               "1iypp6z46r19n4xmgx6m1lwmlpfjh8vapq8izigrqlaarvp2y64c"))))
     (build-system python-build-system)
     (inputs
      `(("python-setuptools" ,python-setuptools)
@@ -3283,15 +3283,14 @@ that client code uses to construct the grammar directly in Python code.")
 (define-public python-numexpr
   (package
     (name "python-numexpr")
-    (version "2.4.4")
+    (version "2.6.0")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "https://pypi.python.org/packages/source/"
-                           "n/numexpr/numexpr-" version ".tar.gz"))
+       (uri (pypi-uri "numexpr" version))
        (sha256
         (base32
-         "0nsnff5312fm38w6dm34bw7ghfqqy8vl9gig0al963h4mz8zm8nz"))))
+         "0i6iagl2hhbr8q4qzbbjd859v5806vqylq87fq7pi914ps6d6cag"))))
     (build-system python-build-system)
     (arguments `(#:tests? #f))          ; no tests included
     (propagated-inputs
@@ -4132,13 +4131,13 @@ child application and control it as if a human were typing commands.")
 (define-public python-setuptools-scm
   (package
     (name "python-setuptools-scm")
-    (version "1.9.0")
+    (version "1.11.1")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "setuptools_scm" version))
               (sha256
                (base32
-                "0y24bl893zk6nrklbvdrlmpkalf214zjn6k1xrglljd29rrn4wxi"))))
+                "1gqr73i150yzj3mz32854vj93x07yr52kn8fdckwa41ll8wgficc"))))
     (build-system python-build-system)
     (native-inputs `(("python-setuptools" ,python-setuptools)))
     (home-page "https://github.com/pypa/setuptools_scm/")
@@ -4507,6 +4506,30 @@ features useful for text console applications.")
 (define-public python2-urwid
   (package-with-python2 python-urwid))
 
+(define-public python-urwidtrees
+  (package
+    (name "python-urwidtrees")
+    (version "1.0.1.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "urwidtrees" version))
+        (sha256
+          (base32
+            "1zcvy12s7h3fazf33d6y7b4v19p8hg95xqwhqlmw6jz9fq76v9h8"))))
+    (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; no tests
+    (inputs `(("python-urwid" ,python-urwid)))
+    (home-page "https://github.com/pazz/urwidtrees")
+    (synopsis "Tree widgets for urwid")
+    (description "Urwidtrees is a Widget Container API for the @code{urwid}
+toolkit.  Use it to build trees of widgets.")
+    (license gpl3+)))
+
+(define-public python2-urwidtrees
+  (package-with-python2 python-urwidtrees))
+
 (define-public python-dbus
   (package
     (name "python-dbus")
@@ -4591,14 +4614,14 @@ translate the complete SQLite API into Python.")
 (define-public python-lxml
   (package
     (name "python-lxml")
-    (version "3.5.0")
+    (version "3.6.0")
     (source
       (origin
         (method url-fetch)
         (uri (pypi-uri "lxml" version))
         (sha256
-          (base32
-            "0y7m2s8ci6q642zl85y5axkj8z827l0vhjl532acb75hlkir77rl"))))
+         (base32
+          "1pvbmiy2m7jwv493kilbghhj2pkh8wy1na3ji350vhzhlwlclx4w"))))
     (build-system python-build-system)
     (inputs
       `(("libxml2" ,libxml2)
@@ -4651,17 +4674,14 @@ converts incoming documents to Unicode and outgoing documents to UTF-8.")
 (define-public python2-cssutils
   (package
     (name "python2-cssutils")
-    (version "1.0")
+    (version "1.0.1")
     (source
       (origin
         (method url-fetch)
-        (uri (string-append
-              "https://pypi.python.org/packages/source/c/cssutils/cssutils-"
-              version
-              ".zip"))
+        (uri (pypi-uri "cssutils" version))
         (sha256
-          (base32
-            "1bwim1353r4hqiir73sn4sc43y7ymh09qx0kly7vj048blppc125"))))
+         (base32
+          "0qwha9x1wml2qmipbcz03gndnlwhzrjdvw9i09si247a90l8p8fq"))))
     (build-system python-build-system)
     (native-inputs
       `(("python2-mock" ,python2-mock) ; for the tests
@@ -4684,17 +4704,14 @@ options.")
 (define-public python-cssselect
   (package
     (name "python-cssselect")
-    (version "0.9.1")
+    (version "0.9.2")
     (source
       (origin
         (method url-fetch)
-        (uri (string-append
-              "https://pypi.python.org/packages/source/c/cssselect/cssselect-"
-              version
-              ".tar.gz"))
+        (uri (pypi-uri "cssselect" version))
         (sha256
-          (base32
-            "10h623qnp6dp1191jri7lvgmnd4yfkl36k9smqklp1qlf3iafd85"))))
+         (base32
+          "1xg6gbva1yswghiycmgincv6ab4bn7hpm720ndbj40h8xycmnfvi"))))
     (build-system python-build-system)
     (inputs
       `(("python-setuptools" ,python-setuptools)))
@@ -5961,18 +5978,14 @@ responses, rather than doing any computation.")
 (define-public python-cryptography-vectors
   (package
     (name "python-cryptography-vectors")
-    (version "1.3.2")
+    (version "1.3.4")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append
-              "https://pypi.python.org/packages/"
-              "3f/fd/"
-              "5883a7fdfcdf6edec55c58605be99d8c36ce97a9b729763ea9cf30e761b7"
-              "/cryptography_vectors-" version ".tar.gz"))
+       (uri (pypi-uri "cryptography_vectors" version))
        (sha256
         (base32
-         "0ss682bpgzdfy2vam8yhhrx7p5gnw89ydlvaswqp52za8sd8nsh0"))))
+         "15h1iz2klnpb4f8djxy7cpbnyn3wbjp7bnj4pz6s7w6plghbq524"))))
     (build-system python-build-system)
     (native-inputs
      `(("python-setuptools" ,python-setuptools)))
@@ -5989,18 +6002,14 @@ responses, rather than doing any computation.")
 (define-public python-cryptography
   (package
     (name "python-cryptography")
-    (version "1.3.2")
+    (version "1.3.4")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append
-              "https://pypi.python.org/packages/"
-              "04/da/"
-              "35f9a1d34dab5d777f65fb87731288f338ab0ae46a525ffdf0405b573dd0"
-              "/cryptography-" version ".tar.gz"))
+       (uri (pypi-uri "cryptography" version))
        (sha256
         (base32
-         "121067qdbzd0ir0nxjdf0kgai7qlsc9yh2xhrj4cavcn4y4gmapv"))))
+         "1a85l548w5vvq3yhz0az7ajg2ijixzp6gagapw6wgrqvq28ghgs2"))))
     (build-system python-build-system)
     (inputs
      `(("openssl" ,openssl)))
@@ -6666,16 +6675,14 @@ facilities for defining, registering and looking up components.")
 (define-public python2-pythondialog
   (package
     (name "python2-pythondialog")
-    (version "3.3.0")
+    (version "3.4.0")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "https://pypi.python.org/packages/source/p/"
-                           "python2-pythondialog/python2-pythondialog-"
-                           version ".tar.gz"))
+       (uri (pypi-uri "python2-pythondialog" version))
        (sha256
         (base32
-         "1yhkagsh99bfi592ymczf8rnw8rk6n9hdqy3dd98m3yrx8zmjvry"))))
+         "0d8k7lxk50imdyx85lv8j98i4c93a71iwpapnl1506rpkbm9qvd9"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -6896,16 +6903,14 @@ tables.")
 (define-public python-websocket-client
   (package
     (name "python-websocket-client")
-    (version "0.34.0")
+    (version "0.37.0")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "https://pypi.python.org/packages/source/w"
-                           "/websocket-client/websocket_client-"
-                           version ".tar.gz"))
+       (uri (pypi-uri "websocket_client" version))
        (sha256
         (base32
-         "1prdx6d49f1cff17kzj15bnz09palfdgc1m5dkq9jd4mr90n4ak8"))))
+         "0h9glp1jll3z76ly3kg08aqgxqk0a68p4zi9yn50353bh5nj92v7"))))
     (build-system python-build-system)
     (native-inputs
      `(("python-six" ,python-six))) ; for tests
@@ -7094,7 +7099,17 @@ minimal and fast API targetting the following uses:
     (description "The pytest-cache plugin provides tools to rerun failures from
 the last py.test invocation.")
     (home-page "https://bitbucket.org/hpk42/pytest-cache/")
-    (license license:expat)))
+    (license license:expat)
+    (properties `((python2-variant . ,(delay python2-pytest-cache))))))
+
+(define-public python2-pytest-cache
+  (let ((pytest-cache (package-with-python2
+                        (strip-python2-variant python-pytest-cache))))
+    (package
+      (inherit pytest-cache)
+      (native-inputs
+       `(("python2-setuptools" ,python2-setuptools)
+         ,@(package-native-inputs pytest-cache))))))
 
 (define-public python-pytest-localserver
   (package
@@ -7975,14 +7990,14 @@ layouts.")
 (define-public python-pyquery
   (package
     (name "python-pyquery")
-    (version "1.2.11")
+    (version "1.2.13")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "pyquery" version))
        (sha256
         (base32
-         "1ikz1387nsp0pp7mzzr6ip9n5gr67acpap24yn33987v7fkjp0sa"))))
+         "0j9fsisip21qv4xljsg5dmni1pgpvwrjyyhhql0glydc4bs5rjgv"))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-lxml" ,python-lxml)
@@ -8335,13 +8350,13 @@ commands into documents, helping you to keep your command examples up to date.")
 (define-public python-sphinx-repoze-autointerface
   (package
     (name "python-sphinx-repoze-autointerface")
-    (version "0.7.1")
+    (version "0.8")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "repoze.sphinx.autointerface" version))
               (sha256
                (base32
-                "016mv3wbylw278wl7z33y2liyra8ljp08zq1g0anzadh1an5zvwp"))))
+                "08ycivzf7bh4a1zcyp31hbyqs1b2c9r26raa3vxjwwmbfqr3iw4f"))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-docutils" ,python-docutils)
@@ -9123,8 +9138,9 @@ to provide a high-level synchronous API on top of the libev event loop.")
                 "0ydxrp9myw1mvsz3qfzx5579y5llmqa82pxvqchgp5syczffi450"))))
     (build-system python-build-system)
     (native-inputs
-     `(("python-setuptools" ,python-setuptools)
-       ("python-zope-interface" ,python-zope-interface)))
+     `(("python-setuptools" ,python-setuptools)))
+    (propagated-inputs
+     `(("python-zope-interface" ,python-zope-interface)))
     (home-page "https://twistedmatrix.com/")
     (synopsis "Asynchronous networking framework written in Python")
     (description
@@ -9209,8 +9225,9 @@ data in Python.")
     (build-system python-build-system)
     (arguments '(#:tests? #f)) ; XXX: needs zookeeper
     (native-inputs
-     `(("python-setuptools" ,python-setuptools)
-       ("python-six" ,python-six)))
+     `(("python-setuptools" ,python-setuptools)))
+    (propagated-inputs
+     `(("python-six" ,python-six)))
     (home-page "https://kazoo.readthedocs.org")
     (synopsis "High-level Zookeeper client library")
     (description
@@ -9238,9 +9255,10 @@ programming errors.")
     (build-system python-build-system)
     (arguments '(#:tests? #f)) ; XXX: needs zookeeper, kafka, etc.
     (native-inputs
+     `(("python-setuptools" ,python-setuptools)))
+    (propagated-inputs
      `(("python-gevent" ,python-gevent)
        ("python-kazoo" ,python-kazoo)
-       ("python-setuptools" ,python-setuptools)
        ("python-tabulate" ,python-tabulate)))
     (inputs
      `(("librdkafka" ,librdkafka)))
@@ -9277,7 +9295,8 @@ wide-character codes.  It is useful for those implementing a terminal emulator,
 or programs that carefully produce output to be interpreted by one.  It is a
 Python implementation of the @code{wcwidth} and @code{wcswidth} C functions
 specified in POSIX.1-2001 and POSIX.1-2008.")
-  (license license:expat)))
+  (license license:expat)
+  (properties `((python2-variant . ,(delay python2-wcwidth))))))
 
 (define-public python2-wcwidth
   (package
@@ -9348,10 +9367,11 @@ objects, patterned after the Mocha library for Ruby.")
     (build-system python-build-system)
     (native-inputs
      `(("python-setuptools" ,python-setuptools)
-       ("python-dateutil" ,python-dateutil-2)
        ;; For testing
        ("python-chai" ,python-chai)
        ("python-simplejson" ,python-simplejson)))
+    (propagated-inputs
+     `(("python-dateutil" ,python-dateutil-2)))
     (home-page "https://github.com/crsmithdev/arrow/")
     (synopsis "Dates and times for Python")
     (description
@@ -9422,12 +9442,13 @@ Wikipedia code samples at
                 "1k2dcl6mqpn5bljyl6w42rqyd9mb3y9kh2mg7m2x3kfjwvg0rpva"))))
     (build-system python-build-system)
     (native-inputs
-     `(("python-psutil" ,python-psutil)
-       ("python-pylev" ,python-pylev)
-       ("python-setuptools" ,python-setuptools)
+     `(("python-setuptools" ,python-setuptools)
        ;; For testing
        ("python-mock" ,python-mock)
        ("python-pytest" ,python-pytest)))
+    (propagated-inputs
+     `(("python-psutil" ,python-psutil)
+       ("python-pylev" ,python-pylev)))
     (home-page "https://github.com/sdispater/cleo")
     (synopsis "Command-line arguments library for Python")
     (description
@@ -9507,9 +9528,10 @@ It supports TSIG authenticated messages and EDNS0.")
                (("dnspython3") "dnspython"))
              #t)))))
     (native-inputs
+     `(("python-setuptools" ,python-setuptools)))
+    (propagated-inputs
      `(("python-dnspython" ,python-dnspython)
-       ("python-idna" ,python-idna)
-       ("python-setuptools" ,python-setuptools)))
+       ("python-idna" ,python-idna)))
     (home-page "https://github.com/JoshData/python-email-validator")
     (synopsis "Email address validation library for Python")
     (description
@@ -9564,13 +9586,14 @@ parsing UK postcodes.")
            (delete-file "faker/tests/ne_np/__init__.py")
            #t)))))
   (native-inputs
-   `(("python-dateutil" ,python-dateutil-2)
-     ("python-setuptools" ,python-setuptools)
-     ("python-six" ,python-six)
+   `(("python-setuptools" ,python-setuptools)
      ;; For testing
      ("python-email-validator" ,python-email-validator)
      ("python-mock" ,python-mock)
      ("python-ukpostcodeparser" ,python-ukpostcodeparser)))
+  (propagated-inputs
+   `(("python-dateutil" ,python-dateutil-2)
+     ("python-six" ,python-six)))
   (home-page "http://github.com/joke2k/faker")
   (synopsis "Python package that generates fake data")
   (description
@@ -9584,9 +9607,9 @@ addresses, and phone numbers.")
                                      python-fake-factory))))
     (package
       (inherit base)
-      (native-inputs
+      (propagated-inputs
        `(("python2-ipaddress" ,python2-ipaddress)
-         ,@(package-native-inputs base))))))
+         ,@(package-propagated-inputs base))))))
 
 (define-public python-pyaml
   (package
@@ -9649,6 +9672,8 @@ mocks, stubs and fakes.")
     (build-system python-build-system)
     (arguments '(#:tests? #f)) ; no tests
     (native-inputs
+     `(("python-setuptools" ,python-setuptools)))
+    (propagated-inputs
      `(("python-arrow" ,python-arrow)
        ("python-blinker" ,python-blinker)
        ("python-cleo" ,python-cleo)
@@ -9656,7 +9681,6 @@ mocks, stubs and fakes.")
        ("python-inflection" ,python-inflection)
        ("python-lazy-object-proxy" ,python-lazy-object-proxy)
        ("python-pyaml" ,python-pyaml)
-       ("python-setuptools" ,python-setuptools)
        ("python-simplejson" ,python-simplejson)
        ("python-wrapt" ,python-wrapt)))
     (home-page "https://orator-orm.com/")
@@ -9671,6 +9695,71 @@ implementation for Python.")
   (let ((base (package-with-python2 (strip-python2-variant python-orator))))
     (package
       (inherit base)
-      (native-inputs
+      (propagated-inputs
        `(("python2-ipaddress" ,python2-ipaddress)
+         ,@(package-propagated-inputs base))))))
+
+(define-public python-prompt-toolkit
+ (package
+  (name "python-prompt-toolkit")
+  (version "1.0.3")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (string-append
+             "https://pypi.python.org/packages/"
+             "8d/de/412f23919929c01e6b55183e124623f705e4b91796d3d2dce2cb53d595ad/"
+             "prompt_toolkit-" version ".tar.gz"))
+      (sha256
+        (base32
+          "18lbmmkyjf509klc3217lq0x863pfzix779zx5kp9lms1iph4pl0"))))
+  (build-system python-build-system)
+  (inputs `(("python-wcwidth" ,python-wcwidth)
+            ("python-pygments" ,python-pygments)))
+  (native-inputs `(("python-six" ,python-six)))
+  (home-page "https://github.com/jonathanslenders/python-prompt-toolkit")
+  (synopsis "Library for building command line interfaces in Python")
+  (description
+    "Prompt-Toolkit is a library for building interactive command line
+interfaces in Python.  It's like GNU Readline but it also features syntax
+highlighting while typing, out-of-the-box multi-line input editing, advanced
+code completion, incremental search, support for Chinese double-width
+characters, mouse support, and auto suggestions.")
+  (license bsd-3)
+  (properties `((python2-variant . ,(delay python2-prompt-toolkit))))))
+
+(define-public python2-prompt-toolkit
+  (let ((base (package-with-python2 (strip-python2-variant python-prompt-toolkit))))
+    (package
+      (inherit base)
+      (native-inputs
+       `(("python2-setuptools" ,python2-setuptools)
+         ,@(package-native-inputs base))))))
+
+(define-public python-jedi
+  (package
+    (name "python-jedi")
+    (version "0.9.0")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "jedi" version))
+        (sha256
+          (base32
+            "0c8x962ynpx001fdvp07m2q5jk4igkxbj3rmnydavphvlgxijk1v"))))
+    (build-system python-build-system)
+    (home-page "https://github.com/davidhalter/jedi")
+    (synopsis
+      "Autocompletion for Python that can be used for text editors")
+    (description
+      "Jedi is an autocompletion tool for Python that can be used for text editors.")
+    (license license:expat)
+    (properties `((python2-variant . ,(delay python2-jedi))))))
+
+(define-public python2-jedi
+  (let ((base (package-with-python2 (strip-python2-variant python-jedi))))
+    (package
+      (inherit base)
+      (native-inputs
+       `(("python2-setuptools" ,python2-setuptools)
          ,@(package-native-inputs base))))))
diff --git a/gnu/packages/qt.scm b/gnu/packages/qt.scm
index cab1f30db5..6c1bbc33c3 100644
--- a/gnu/packages/qt.scm
+++ b/gnu/packages/qt.scm
@@ -302,7 +302,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtbase
   (package
     (name "qtbase")
-    (version "5.6.1")
+    (version "5.6.1-1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -310,8 +310,8 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  "/submodules/" name "-opensource-src-"
                                  version ".tar.xz"))
              (sha256
-               (base32
-                 "0r3jrqymnnxrig4f11xvs33c26f0kzfakbp3kcbdpv795gpc276h"))
+              (base32
+               "0fbwprlhqmdyhh2wb9122fcpq7pbil530iak482b9sy5gqs7i5ij"))
              (modules '((guix build utils)))
              (snippet
               '(begin
@@ -328,12 +328,14 @@ developers using C++ or QML, a CSS & JavaScript like language.")
      `(("alsa-lib" ,alsa-lib)
        ("cups" ,cups)
        ("dbus" ,dbus)
+       ("eudev" ,eudev)
        ("expat" ,expat)
        ("fontconfig" ,fontconfig)
        ("freetype" ,freetype)
        ("glib" ,glib)
        ("harfbuzz" ,harfbuzz)
        ("icu4c" ,icu4c)
+       ("libinput" ,libinput)
        ("libjpeg" ,libjpeg)
        ("libmng" ,libmng)
        ("libpng" ,libpng)
@@ -435,7 +437,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtsvg
   (package (inherit qtbase)
     (name "qtsvg")
-    (version "5.6.1")
+    (version "5.6.1-1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -444,7 +446,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "08ca5g46g75acy27jfnvnalmcias5hxmjp7491v3y4k9y7a4ybpi"))))
+               "1w0jvhgaiddafcms2nv8wl1klg07lncmjwm1zhdw3l6rxi9071sw"))))
     (propagated-inputs `())
     (native-inputs `(("perl" ,perl)))
     (inputs
@@ -469,7 +471,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtimageformats
   (package (inherit qtsvg)
     (name "qtimageformats")
-    (version "5.6.1")
+    (version "5.6.1-1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -478,7 +480,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "020v1148433zx4g87z2r8fgff32n0laajxqqsja1l3yzz7jbrwvl"))))
+               "1p98acvsm3azka2by1ph4gdb31qbnndrr5k5wns4xk2d760y8ifc"))))
     (native-inputs `())
     (inputs
      `(("libmng" ,libmng)
@@ -491,7 +493,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtx11extras
   (package (inherit qtsvg)
     (name "qtx11extras")
-    (version "5.6.1")
+    (version "5.6.1-1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -500,7 +502,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "0l736qiz8adrnh267xz63hv4sph6nhy90h836qfnnmv3p78ipsz8"))))
+               "0yj5yg2dqkrwbgbicmk2rpqsagmi8dsffkrprpsj0fmkx4awhv5y"))))
     (native-inputs `(("perl" ,perl)))
     (inputs
      `(("mesa" ,mesa)
@@ -509,7 +511,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtxmlpatterns
   (package (inherit qtsvg)
     (name "qtxmlpatterns")
-    (version "5.6.1")
+    (version "5.6.1-1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -518,14 +520,14 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "0q412jv3xbg7v05b8pbahifwx17gzlp96s90akh6zwhpm8i6xx34"))))
+               "1966rrk7f6c55k57j33rffdjs77kk4mawrnnl8yv1ckcirxc3np1"))))
     (native-inputs `(("perl" ,perl)))
     (inputs `(("qtbase" ,qtbase)))))
 
 (define-public qtdeclarative
   (package (inherit qtsvg)
     (name "qtdeclarative")
-    (version "5.6.1")
+    (version "5.6.1-1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -534,7 +536,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "1d2217kxk85kpi7ls08b41hqzy26hvch8m4cgzq6km5sqi5zvz0j"))))
+               "094gx5mzqzcga97y7ihf052b6i5iv512lh7m0702m5q94nsn1pqw"))))
     (native-inputs
      `(("perl" ,perl)
        ("pkg-config" ,pkg-config)
@@ -548,7 +550,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtconnectivity
   (package (inherit qtsvg)
     (name "qtconnectivity")
-    (version "5.6.1")
+    (version "5.6.1-1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -557,7 +559,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "06fr9321f52kf0nda9zjjfzp5694hbnx0y0v315iw28mnpvandas"))))
+               "0sr6sxp0q45pacs25knr28139xdrphcjgrwlksdhdpsryfw19mzi"))))
     (native-inputs
      `(("perl" ,perl)
        ("pkg-config" ,pkg-config)
@@ -569,7 +571,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtwebsockets
   (package (inherit qtsvg)
     (name "qtwebsockets")
-    (version "5.6.1")
+    (version "5.6.1-1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -578,7 +580,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "0fkj52i4yi6gmq4jfjgdij08cspxspac6mbpf0fknnllimmkl7jm"))))
+               "1fz0x8570zxc00a22skd848svma3p2g3xyxj14jq10559jihqqil"))))
     (native-inputs
      `(("perl" ,perl)
        ("qtdeclarative" ,qtdeclarative)))
@@ -587,7 +589,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtsensors
   (package (inherit qtsvg)
     (name "qtsensors")
-    (version "5.6.1")
+    (version "5.6.1-1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -596,7 +598,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "0bll7ll6s5g8w89knyrc0famjwqyfzwpn512m1f96bf6xwacs967"))))
+               "0kcrvf6vzn6g2v2m70f9r3raalzmfp48rwjlqhss3w84jfz3y04r"))))
     (native-inputs
      `(("perl" ,perl)
        ("qtdeclarative" ,qtdeclarative)))
@@ -605,7 +607,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtmultimedia
   (package (inherit qtsvg)
     (name "qtmultimedia")
-    (version "5.6.1")
+    (version "5.6.1-1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -614,7 +616,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "058523c2qra3d8fq46ygcndnkrbwlh316zy28s2cr5pjr5gmnjyj"))))
+               "0paffx0614ivjbf87lr9klpbqik6r1pzbc14l41np6d9jv3dqa2f"))))
     (native-inputs
      `(("perl" ,perl)
        ("pkg-config" ,pkg-config)
@@ -629,7 +631,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtwayland
   (package (inherit qtsvg)
     (name "qtwayland")
-    (version "5.6.1")
+    (version "5.6.1-1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -638,7 +640,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "1jgghjfrg0wwyfzfwgwhagwxz9k936ylv3w2l9bwlpql8rgm8d11"))))
+               "1fnvgpi49ilds3ah9iizxj9qhhb5rnwqd9h03bhkwf0ydywv52c4"))))
     (native-inputs
      `(("glib" ,glib)
        ("perl" ,perl)
@@ -660,7 +662,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtserialport
   (package (inherit qtsvg)
     (name "qtserialport")
-    (version "5.6.1")
+    (version "5.6.1-1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -669,14 +671,16 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "1hp63cgqhps6y1k041lzhcb2b0rcpcmszabnn293q5ilbvla4x0b"))))
+               "135cbgghxk0c6dblmyyrw6znfb9m8sac9hhyc2dm6vq7vzy8id52"))))
     (native-inputs `(("perl" ,perl)))
-    (inputs `(("qtbase" ,qtbase)))))
+    (inputs
+     `(("qtbase" ,qtbase)
+       ("eudev" ,eudev)))))
 
 (define-public qtwebchannel
   (package (inherit qtsvg)
     (name "qtwebchannel")
-    (version "5.6.1")
+    (version "5.6.1-1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -685,7 +689,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "01q80917a1048hdhaii4v50dqs84h16lc9w3v99r9xvspk8vab7q"))))
+               "10kys3ppjkj60fs1s335fdcpdsbxsjn6ibvm6zph9gqbncabd2l7"))))
     (native-inputs
      `(("perl" ,perl)
        ("qtdeclarative" ,qtdeclarative)
@@ -695,7 +699,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtlocation
   (package (inherit qtsvg)
     (name "qtlocation")
-    (version "5.6.1")
+    (version "5.6.1-1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -704,7 +708,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "0qahs7a2n3l4h0bl8bnwci9mzy1vra3zncnzr40csic9ys67ddfk"))))
+               "0my4pbcxa58yzvdh65l5qx99ln03chjr5c3ml5v37wfk7nx23k69"))))
     (native-inputs
      `(("perl" ,perl)
        ("qtdeclarative" ,qtdeclarative)
@@ -715,7 +719,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qttools
   (package (inherit qtsvg)
     (name "qttools")
-    (version "5.6.1")
+    (version "5.6.1-1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -724,7 +728,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "0wbzq60d7lkvlb7b5lqcw87qgy6kyjz1npjavz8f4grdxsaqi8vp"))))
+               "0haic027a2d7p7k8xz83fbvci4a4dln34360rlwgy7hlyy5m4nip"))))
     (native-inputs
      `(("perl" ,perl)
        ("qtdeclarative" ,qtdeclarative)))
@@ -732,6 +736,25 @@ developers using C++ or QML, a CSS & JavaScript like language.")
      `(("mesa" ,mesa)
        ("qtbase" ,qtbase)))))
 
+(define-public qtscript
+  (package (inherit qtsvg)
+    (name "qtscript")
+    (version "5.6.1-1")
+    (source (origin
+             (method url-fetch)
+             (uri (string-append "https://download.qt.io/official_releases/qt/"
+                                 (version-major+minor version) "/" version
+                                 "/submodules/" name "-opensource-src-"
+                                 version ".tar.xz"))
+             (sha256
+              (base32
+               "1gini9483flqa9q4a4bl81bh7g5s408bycqykqhgbklmfd29y5lx"))))
+    (native-inputs
+     `(("perl" ,perl)
+       ("qttools" ,qttools)))
+    (inputs
+     `(("qtbase" ,qtbase)))))
+
 (define-public qjson
   (package
     (name "qjson")
diff --git a/gnu/packages/readline.scm b/gnu/packages/readline.scm
index db469db051..169a7386c4 100644
--- a/gnu/packages/readline.scm
+++ b/gnu/packages/readline.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2012, 2013, 2014 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -20,6 +21,7 @@
   #:use-module (guix licenses)
   #:use-module (gnu packages)
   #:use-module (gnu packages ncurses)
+  #:use-module (gnu packages perl)
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix build-system gnu))
@@ -85,3 +87,29 @@ comfortable for anyone.")
               (sha256
                (base32
                 "10ckm2bd2rkxhvdmj7nmbsylmihw0abwcsnxf8y27305183rd9kr"))))))
+
+(define-public rlwrap
+  (package
+    (name "rlwrap")
+    (version "0.42")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (string-append "http://utopia.knoware.nl/~hlub/uck/rlwrap/rlwrap-"
+                            version ".tar.gz"))
+        (sha256
+         (base32
+          "0i3yz303wscrysyzpdq04h4nrl9ajz9dbwi80risdl5rkm3dhw2s"))))
+    (build-system gnu-build-system)
+    (native-inputs `(("perl" ,perl)))
+    (inputs
+     `(("readline" ,readline)))
+    (synopsis "Wrapper to allow the editing of keyboard commands")
+    (description
+     "Rlwrap is a 'readline wrapper', a small utility that uses the GNU
+readline library to allow the editing of keyboard input for any command.  You
+should consider rlwrap especially when you need user-defined completion (by way
+of completion word lists) and persistent history, or if you want to program
+'special effects' using the filter mechanism.")
+    (home-page "http://utopia.knoware.nl/~hlub/uck/rlwrap/")
+    (license gpl2+)))
diff --git a/gnu/packages/samba.scm b/gnu/packages/samba.scm
index 8aac6a5dc1..9f0b57c739 100644
--- a/gnu/packages/samba.scm
+++ b/gnu/packages/samba.scm
@@ -99,14 +99,14 @@ anywhere.")
 (define-public samba
   (package
     (name "samba")
-    (version "4.3.8")
+    (version "4.3.11")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://www.samba.org/samba/ftp/stable/samba-"
                                  version ".tar.gz"))
              (sha256
               (base32
-               "041b5frh4ikcka922aqhqjvlv4w2s7jycyykpvsknj0a79ncd79p"))))
+               "1v2grwivm6rasz1ganbybs0ikz1lydaniy65kxf1v8rl1qqngach"))))
     (build-system gnu-build-system)
     (arguments
      '(#:phases
@@ -150,7 +150,7 @@ anywhere.")
      `(("perl" ,perl)
        ("pkg-config" ,pkg-config)
        ("python" ,python-2))) ; incompatible with Python 3
-    (home-page "http://www.samba.org/")
+    (home-page "https://www.samba.org/")
     (synopsis
      "The standard Windows interoperability suite of programs for GNU and Unix")
     (description
@@ -165,14 +165,14 @@ Desktops into Active Directory environments using the winbind daemon.")
 (define-public talloc
   (package
     (name "talloc")
-    (version "2.1.5")
+    (version "2.1.7")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://www.samba.org/ftp/talloc/talloc-"
                                   version ".tar.gz"))
               (sha256
                (base32
-                "1pfx3kmj973hpacfw46fzfnjd7ms1j03ifkc30wk930brx8ffcrq"))))
+                "01m0kzndciyj43z1zd2nc61xqgh9knjv0w7lk1rrrlj8irr4w58r"))))
     (build-system gnu-build-system)
     (arguments
      '(#:phases
@@ -202,14 +202,14 @@ destructors.  It is the core memory allocator used in Samba.")
 (define-public tevent
   (package
     (name "tevent")
-    (version "0.9.26")
+    (version "0.9.28")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://www.samba.org/ftp/tevent/tevent-"
                                   version ".tar.gz"))
               (sha256
                (base32
-                "1gbh6d2m49j1v2hkaiyrh8bj02i5wxd4hqayzk2g44yyivbi8b16"))))
+                "0a9ml52jjnzz7qg9z750mavlvs1yibjwrzy4yl55dc95j0vm7n84"))))
     (build-system gnu-build-system)
     (arguments
      '(#:phases
@@ -237,14 +237,14 @@ many event types, including timers, signals, and the classic file descriptor eve
 (define-public ldb
   (package
     (name "ldb")
-    (version "1.1.24")
+    (version "1.1.26")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://www.samba.org/ftp/ldb/ldb-"
                                   version ".tar.gz"))
               (sha256
                (base32
-                "08ab66qzigfsfxqdvp6lx1knwsl3sqsww309xbq17l7hfcjgbsa5"))))
+                "1rmjv12pf57vga8s5z9p9d90rlfckc1lqjbcp89r83cq5fkwfhw8"))))
     (build-system gnu-build-system)
     (arguments
      '(#:phases
diff --git a/gnu/packages/scheme.scm b/gnu/packages/scheme.scm
index eac550e4ab..1e00e6bb9d 100644
--- a/gnu/packages/scheme.scm
+++ b/gnu/packages/scheme.scm
@@ -400,7 +400,7 @@ implementation techniques and as an expository tool.")
 (define-public racket
   (package
     (name "racket")
-    (version "6.2.1")
+    (version "6.5")
     (source (origin
              (method url-fetch)
              (uri (list (string-append "http://mirror.racket-lang.org/installers/"
@@ -410,7 +410,7 @@ implementation techniques and as an expository tool.")
                          version "/racket/racket-" version "-src-unix.tgz")))
              (sha256
               (base32
-               "0555j63k7fs10iv0icmivlxpzgp6s7gwcbfddmbwxlf2rk80qhq0"))))
+               "0gvh7i5k87mg1gpqk8gaq50ja9ksbhnvdqn7qqh0n17byidd6999"))))
     (build-system gnu-build-system)
     (arguments
      '(#:phases
diff --git a/gnu/packages/screen.scm b/gnu/packages/screen.scm
index a4eefd85a6..e3f97f4b68 100644
--- a/gnu/packages/screen.scm
+++ b/gnu/packages/screen.scm
@@ -3,6 +3,7 @@
 ;;; Copyright © 2014 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016 Alex Griffin <a@ajgrf.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -49,11 +50,9 @@
        ("perl" ,perl)))
     (arguments
      `(#:configure-flags
-       ;; By default, man and info pages are put in PREFIX/{man,info},
-       ;; but we want them in PREFIX/share/{man,info}.
-       (let ((out (assoc-ref %outputs "out")))
-         (list (string-append "--mandir=" out "/share/man")
-               (string-append "--infodir=" out "/share/info")))))
+       ;; By default, screen supports 16 colors, but we want 256 when
+       ;; ~/.screenrc contains 'term xterm-256color'.
+       '("--enable-colors256")))
     (home-page "http://www.gnu.org/software/screen/")
     (synopsis "Full-screen window manager providing multiple terminals")
     (description
@@ -144,3 +143,30 @@ as folding room dividers.  The Byobu software includes an enhanced profile,
 configuration utilities, and system status notifications for the GNU Screen
 window manager as well as the Tmux terminal multiplexer.")
     (license gpl3+)))
+
+(define-public reptyr
+  (package
+    (name "reptyr")
+    (version "0.6.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/nelhage/reptyr/archive"
+                           "/reptyr-" version ".tar.gz"))
+       (sha256
+        (base32
+         "07pfl0rkgm8m3f3jy8r9l2yvnhf8lgllpsk3mh57mhzdxq8fagf7"))))
+    (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))))
+    (home-page "https://github.com/nelhage/reptyr")
+    (synopsis "Tool for reparenting a running program to a new terminal")
+    (description
+     "reptyr is a utility for taking an existing running program and attaching
+it to a new terminal.  Started a long-running process over @code{ssh}, but have
+to leave and don't want to interrupt it?  Just start a @code{screen}, use
+reptyr to grab it, and then kill the @code{ssh} session and head on home.")
+    (license expat)))
diff --git a/gnu/packages/smalltalk.scm b/gnu/packages/smalltalk.scm
index c9d733d505..77e033f847 100644
--- a/gnu/packages/smalltalk.scm
+++ b/gnu/packages/smalltalk.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
+;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -21,6 +22,10 @@
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix build-system gnu)
+  #:use-module (gnu packages autotools)
+  #:use-module (gnu packages libffi)
+  #:use-module (gnu packages libsigsegv)
+  #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages zip))
 
 (define-public smalltalk
@@ -36,7 +41,13 @@
        (base32
         "1k2ssrapfzhngc7bg1zrnd9n2vyxp9c9m70byvsma6wapbvib6l1"))))
     (build-system gnu-build-system)
-    (inputs `(("zip" ,zip)))
+    (native-inputs
+     `(("libffi" ,libffi)
+       ("libltdl" ,libltdl)
+       ("libsigsegv" ,libsigsegv)
+       ("pkg-config" ,pkg-config)))
+    (inputs
+     `(("zip" ,zip)))
     (arguments
      `(#:phases (alist-cons-before
                  'configure 'fix-libc
@@ -46,7 +57,7 @@
                        (("@LIBC_SO_NAME@") "libc.so")
                        (("@LIBC_SO_DIR@")  (string-append libc "/lib")))))
                 %standard-phases)))
-    (home-page "https://www.gnu.org/software/smalltalk/")
+    (home-page "http://smalltalk.gnu.org/")
     (synopsis "Smalltalk environment")
     (description
      "GNU Smalltalk is a free implementation of the Smalltalk language.  It
diff --git a/gnu/packages/ssh.scm b/gnu/packages/ssh.scm
index b8f107b111..71310ecf94 100644
--- a/gnu/packages/ssh.scm
+++ b/gnu/packages/ssh.scm
@@ -1,4 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2013, 2014 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015, 2016 Efraim Flashner <efraim@flashner.co.il>
@@ -20,27 +21,34 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu packages ssh)
-  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (gnu packages)
+  #:use-module (gnu packages autotools)
+  #:use-module (gnu packages base)
+  #:autoload   (gnu packages boost) (boost)
   #:use-module (gnu packages compression)
+  #:use-module (gnu packages elf)
   #:use-module (gnu packages gnupg)
+  #:use-module (gnu packages gperf)
   #:use-module (gnu packages groff)
-  #:use-module (gnu packages elf)
   #:use-module (gnu packages guile)
-  #:use-module (gnu packages pkg-config)
-  #:use-module (gnu packages autotools)
-  #:use-module (gnu packages texinfo)
-  #:use-module (gnu packages perl)
+  #:use-module (gnu packages linux)
+  #:use-module (gnu packages m4)
+  #:use-module (gnu packages multiprecision)
   #:use-module (gnu packages ncurses)
+  #:use-module (gnu packages nettle)
+  #:use-module (gnu packages perl)
+  #:use-module (gnu packages pkg-config)
   #:autoload   (gnu packages protobuf) (protobuf)
-  #:autoload   (gnu packages boost) (boost)
-  #:use-module (gnu packages base)
+  #:use-module (gnu packages readline)
+  #:use-module (gnu packages texinfo)
   #:use-module (gnu packages tls)
-  #:use-module (gnu packages)
-  #:use-module (guix packages)
+  #:use-module (gnu packages xorg)
+  #:use-module (guix build-system cmake)
+  #:use-module (guix build-system gnu)
   #:use-module (guix download)
   #:use-module (guix git-download)
-  #:use-module (guix build-system gnu)
-  #:use-module (guix build-system cmake))
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix packages))
 
 (define-public libssh
   (package
@@ -337,7 +345,7 @@ especially over Wi-Fi, cellular, and long-distance links.")
 (define-public dropbear
   (package
     (name "dropbear")
-    (version "2016.72")
+    (version "2016.73")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -345,7 +353,7 @@ especially over Wi-Fi, cellular, and long-distance links.")
                     name "-" version ".tar.bz2"))
               (sha256
                (base32
-                "10fnlaf6rm537v3rml1gnd58d42plv2q5cp7svbrysap69npc8wk"))))
+                "1mzg18jss1bsmcnn88zv7kv5yj01hzimndnd5636hfq9kgva8qaw"))))
     (build-system gnu-build-system)
     (arguments  `(#:tests? #f)) ; There is no "make check" or anything similar
     (inputs `(("zlib" ,zlib)))
@@ -355,3 +363,129 @@ client.  It runs on a variety of POSIX-based platforms.  Dropbear is
 particularly useful for embedded systems, such as wireless routers.")
     (home-page "https://matt.ucc.asn.au/dropbear/dropbear.html")
     (license (license:x11-style "" "See file LICENSE."))))
+
+(define-public liboop
+  (package
+    (name "liboop")
+    (version "1.0")
+    (source
+     (origin
+      (method url-fetch)
+      (uri (string-append "http://download.ofb.net/liboop/liboop-"
+                          version ".tar.gz"))
+      (sha256
+       (base32
+        "0z6rlalhvfca64jpvksppc9bdhs7jwhiw4y35g5ibvh91xp3rn1l"))
+      (patches (search-patches "liboop-mips64-deplibs-fix.patch"))))
+    (build-system gnu-build-system)
+    (home-page "http://www.lysator.liu.se/liboop/")
+    (synopsis "Event loop library")
+    (description "Liboop is a low-level event loop management library for
+POSIX-based operating systems.  It supports the development of modular,
+multiplexed applications which may respond to events from several sources.  It
+replaces the \"select() loop\" and allows the registration of event handlers
+for file and network I/O, timers and signals.  Since processes use these
+mechanisms for almost all external communication, liboop can be used as the
+basis for almost any application.")
+    (license license:lgpl2.1+)))
+
+(define-public lsh
+  (package
+    (name "lsh")
+    (version "2.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://gnu/lsh/lsh-"
+                                  version ".tar.gz"))
+              (sha256
+               (base32
+                "1qqjy9zfzgny0rkb27c8c7dfsylvb6n0ld8h3an2r83pmaqr9gwb"))
+              (modules '((guix build utils)))
+              (snippet
+               '(begin
+                  (substitute* "src/testsuite/functions.sh"
+                    (("localhost")
+                     ;; Avoid host name lookups since they don't work in
+                     ;; chroot builds.
+                     "127.0.0.1")
+                    (("set -e")
+                     ;; Make tests more verbose.
+                     "set -e\nset -x"))
+
+                  (substitute* (find-files "src/testsuite" "-test$")
+                    (("localhost") "127.0.0.1"))
+
+                  (substitute* "src/testsuite/login-auth-test"
+                    (("/bin/cat") "cat"))))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("m4" ,m4)
+       ("guile" ,guile-2.0)
+       ("gperf" ,gperf)
+       ("psmisc" ,psmisc)))                       ; for `killall'
+    (inputs
+     `(("nettle" ,nettle-2)
+       ("linux-pam" ,linux-pam)
+
+       ;; 'rl.c' uses the 'CPPFunction' type, which is no longer in
+       ;; Readline 6.3.
+       ("readline" ,readline-6.2)
+
+       ("liboop" ,liboop)
+       ("zlib" ,zlib)
+       ("gmp" ,gmp)
+
+       ;; The server (lshd) invokes xauth when X11 forwarding is requested.
+       ;; This adds 24 MiB (or 27%) to the closure of lsh.
+       ("xauth" ,xauth)))
+    (arguments
+     '(;; Skip the `configure' test that checks whether /dev/ptmx &
+       ;; co. work as expected, because it relies on impurities (for
+       ;; instance, /dev/pts may be unavailable in chroots.)
+       #:configure-flags '("lsh_cv_sys_unix98_ptys=yes")
+
+       ;; FIXME: Tests won't run in a chroot, presumably because
+       ;; /etc/profile is missing, and thus clients get an empty $PATH
+       ;; and nothing works.
+       #:tests? #f
+
+       #:phases
+       (modify-phases %standard-phases
+         (add-before 'configure 'pre-configure
+           (lambda* (#:key inputs #:allow-other-keys)
+             (let* ((nettle    (assoc-ref inputs "nettle"))
+                    (sexp-conv (string-append nettle "/bin/sexp-conv")))
+               ;; Make sure 'lsh' and 'lshd' pick 'sexp-conv' in the right place
+               ;; by default.
+               (substitute* "src/environ.h.in"
+                 (("^#define PATH_SEXP_CONV.*")
+                  (string-append "#define PATH_SEXP_CONV \""
+                                 sexp-conv "\"\n")))
+
+               ;; Same for the 'lsh-authorize' script.
+               (substitute* "src/lsh-authorize"
+                 (("=sexp-conv")
+                  (string-append "=" sexp-conv)))
+
+               ;; Tell lshd where 'xauth' lives.  Another option would be to
+               ;; hardcode "/run/current-system/profile/bin/xauth", thereby
+               ;; reducing the closure size, but that wouldn't work on foreign
+               ;; distros.
+               (with-fluids ((%default-port-encoding "ISO-8859-1"))
+                 (substitute* "src/server_x11.c"
+                   (("define XAUTH_PROGRAM.*")
+                    (string-append "define XAUTH_PROGRAM \""
+                                   (assoc-ref inputs "xauth")
+                                   "/bin/xauth\"\n")))))
+
+             ;; Tests rely on $USER being set.
+             (setenv "USER" "guix"))))))
+    (home-page "http://www.lysator.liu.se/~nisse/lsh/")
+    (synopsis "GNU implementation of the Secure Shell (ssh) protocols")
+    (description
+     "GNU lsh is a free implementation of the SSH version 2 protocol.  It is
+used to create a secure line of communication between two computers,
+providing shell access to the server system from the client.  It provides
+both the server daemon and the client application, as well as tools for
+manipulating key files.")
+    (license license:gpl2+)))
diff --git a/gnu/packages/stalonetray.scm b/gnu/packages/stalonetray.scm
index e1604327ab..c803fb06f6 100644
--- a/gnu/packages/stalonetray.scm
+++ b/gnu/packages/stalonetray.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014 Raimon Grau <raimonster@gmail.com>
+;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -26,16 +27,16 @@
 (define-public stalonetray
   (package
     (name "stalonetray")
-    (version "0.8.1")
+    (version "0.8.3")
     (source
      (origin
        (method url-fetch)
        (uri
-        (string-append "mirror://sourceforge/stalonetray/stalonetray-"
+        (string-append "mirror://sourceforge/stalonetray/stalonetray/stalonetray-"
                        version "/stalonetray-" version ".tar.bz2"))
        (sha256
         (base32
-         "1wp8pnlv34w7xizj1vivnc3fkwqq4qgb9dbrsg15598iw85gi8ll"))))
+         "0k7xnpdb6dvx25d67v0crlr32cdnzykdsi9j889njiididc8lm1n"))))
     (inputs `(("libx11" ,libx11)))
     (build-system gnu-build-system)
     (home-page "http://stalonetray.sourceforge.net")
diff --git a/gnu/packages/statistics.scm b/gnu/packages/statistics.scm
index c84845dd29..45e50b651c 100644
--- a/gnu/packages/statistics.scm
+++ b/gnu/packages/statistics.scm
@@ -165,7 +165,9 @@ be output in text, PostScript, PDF or HTML.")
        ("which" ,which) ; for tests/Examples/base-Ex.R
        ("xz" ,xz)))
     (inputs
-     `(("cairo" ,cairo)
+     `(;; We need not only cairo here, but pango to ensure that tests for the
+       ;; "cairo" bitmapType plotting backend succeed.
+       ("pango" ,pango)
        ("curl" ,curl)
        ("tzdata" ,tzdata)
        ("gfortran" ,gfortran)
@@ -596,7 +598,8 @@ legends.")
        ("r-plyr" ,r-plyr)
        ("r-proto" ,r-proto)
        ("r-reshape2" ,r-reshape2)
-       ("r-scales" ,r-scales)))
+       ("r-scales" ,r-scales)
+       ("r-svglite" ,r-svglite)))
     (home-page "http://ggplot2.org")
     (synopsis "An implementation of the grammar of graphics")
     (description
@@ -608,6 +611,55 @@ multidimensional conditioning system and a consistent interface to map data to
 aesthetic attributes.")
     (license license:gpl2+)))
 
+(define-public r-gdtools
+  (package
+    (name "r-gdtools")
+    (version "0.0.7")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "gdtools" version))
+       (sha256
+        (base32
+         "1bmnf9d677f2jy8jnb9ymjz1qzm4yrd0qp6k5qrrly06jfffyx7g"))))
+    (build-system r-build-system)
+    (native-inputs
+     `(("r-rcpp" ,r-rcpp)
+       ("pkg-config" ,pkg-config)))
+    (inputs
+     `(("cairo" ,cairo)))
+    (home-page "http://cran.r-project.org/web/packages/gdtools")
+    (synopsis "Utilities for graphical rendering")
+    (description
+     "The @code{gdtools} package provides functionalities to get font metrics
+and to generate base64 encoded string from raster matrix.")
+    (license license:gpl3)))
+
+(define-public r-svglite
+  (package
+    (name "r-svglite")
+    (version "1.1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "svglite" version))
+       (sha256
+        (base32
+         "11ryicjglfi6jvkk4jgg5kra42qbs5z2zid7jjhlslpjcljfwc70"))))
+    (build-system r-build-system)
+    (native-inputs  `(("r-rcpp" ,r-rcpp)))
+    (propagated-inputs
+     `(("r-bh" ,r-bh)
+       ("r-gdtools" ,r-gdtools)))
+    (home-page "https://github.com/hadley/svglite")
+    (synopsis "SVG graphics device")
+    (description
+     "@code{svglite} is a graphics device that produces clean
+@dfn{SVG} (Scalable Vector Graphics) output, suitable for use on the web, or
+hand editing.  Compared to the built-in @code{svg()}, @code{svglite} is
+considerably faster, produces smaller files, and leaves text as is.")
+    (license license:gpl2+)))
+
 (define-public r-assertthat
   (package
     (name "r-assertthat")
@@ -1353,6 +1405,25 @@ diagnostic tests of convergence to the equilibrium distribution of the Markov
 chain.")
     (license license:gpl2+)))
 
+(define-public r-ade4
+  (package
+    (name "r-ade4")
+    (version "1.7-4")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (cran-uri "ade4" version))
+        (sha256
+          (base32
+            "17sbicash7z4b63dlrbaf8xx2pbwh62vykzvhdjs43h8jkl881y7"))))
+    (build-system r-build-system)
+    (home-page "http://pbil.univ-lyon1.fr/ADE-4")
+    (synopsis "Multivariate data analysis and graphical display")
+    (description
+     "The ade4 package contains data analysis functions to analyze ecological
+and environmental data in the framework of Euclidean exploratory methods.")
+    (license license:gpl2+)))
+
 (define-public r-xml2
   (package
     (name "r-xml2")
@@ -1377,6 +1448,32 @@ chain.")
 files in R.  It is built on top of the libxml2 C library.")
     (license license:gpl2+)))
 
+(define-public r-multitaper
+  (package
+    (name "r-multitaper")
+    (version "1.0-11")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "multitaper" version))
+       (sha256
+        (base32
+         "1s0lmjzpyd7zmc2p1ywv5fm7qkq357p70b76gw9wjlms6d81j1n4"))))
+    (build-system r-build-system)
+    (native-inputs
+     `(("gfortran" ,gfortran)))
+    (home-page "http://github.com/wesleyburr/multitaper/")
+    (synopsis "Multitaper spectral analysis tools")
+    (description
+     "This package implements multitaper spectral estimation
+techniques using prolate spheroidal sequences (Slepians) and sine
+tapers for time series analysis.  It includes an adaptive weighted
+multitaper spectral estimate, a coherence estimate, Thomson's Harmonic
+F-test, and complex demodulation.  The Slepians sequences are
+generated efficiently using a tridiagonal matrix solution, and
+jackknifed confidence intervals are available for most estimates.")
+    (license license:gpl2+)))
+
 (define-public r-rversions
   (package
     (name "r-rversions")
@@ -2170,6 +2267,29 @@ parallel.")
 using the parallel package.")
     (license license:gpl2+)))
 
+(define-public r-domc
+  (package
+    (name "r-domc")
+    (version "1.3.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "doMC" version))
+       (sha256
+        (base32
+         "0y47jl6g4f83r14pj8bafdzq1phj7bxy5dwyz3k43d2rr8phk8bn"))))
+    (properties `((upstream-name . "doMC")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-foreach" ,r-foreach)
+       ("r-iterators" ,r-iterators)))
+    (home-page "http://cran.r-project.org/web/packages/doMC")
+    (synopsis "Foreach parallel adaptor for the 'parallel' package")
+    (description
+     "This package provides a parallel backend for the @code{%dopar%} function
+using the multicore functionality of the parallel package.")
+    (license license:gpl2+)))
+
 (define-public r-dt
   (package
     (name "r-dt")
@@ -2242,6 +2362,32 @@ singular and eigenvalue decompositions, as well as for principal component
 analysis of large sparse or dense matrices.")
     (license (list license:gpl2+ license:gpl3+))))
 
+(define-public r-glmnet
+  (package
+   (name "r-glmnet")
+   (version "2.0-5")
+   (source
+    (origin
+     (method url-fetch)
+     (uri (cran-uri "glmnet" version))
+     (sha256
+      (base32
+       "1cbpzmbv837fvq88rgn6mgzgr9f1wqp9fg8gh2kkmngvr1957a9c"))))
+   (build-system r-build-system)
+    (inputs
+     `(("gfortran" ,gfortran)))
+   (propagated-inputs
+    `(("r-foreach" ,r-foreach)))
+   (home-page "http://www.jstatsoft.org/v33/i01")
+   (synopsis "Lasso and elastic-net regularized generalized linear models")
+   (description
+    "The glmnet package provides efficient procedures for fitting the entire
+lasso or elastic-net regularization path for linear and Poisson regression, as
+well as logistic, multinomial, Cox, multiple-response Gaussian and grouped
+multinomial models.  The algorithm uses cyclical coordinate descent in a
+path-wise fashion.")
+   (license license:gpl2+)))
+
 (define-public r-pkgmaker
   (package
     (name "r-pkgmaker")
diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
index ec4d3df1a6..9abaabad89 100644
--- a/gnu/packages/tls.scm
+++ b/gnu/packages/tls.scm
@@ -6,7 +6,7 @@
 ;;; Copyright © 2015 David Thompson <davet@gnu.org>
 ;;; Copyright © 2015 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
-;;; Copyright © 2016 Nils Gillmann <niasterisk@grrlz.net>
+;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
diff --git a/gnu/packages/tmux.scm b/gnu/packages/tmux.scm
index d89fc16844..e4f3b45d68 100644
--- a/gnu/packages/tmux.scm
+++ b/gnu/packages/tmux.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013 Cyril Roelandt <tipecaml@gmail.com>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016 Matthew Jordan <matthewjordandevops@yandex.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -21,11 +22,13 @@
   #:use-module (guix licenses)
   #:use-module (guix packages)
   #:use-module (guix download)
+  #:use-module (guix git-download)
   #:use-module (guix build-system gnu)
   #:use-module (gnu packages)
   #:use-module (gnu packages libevent)
   #:use-module (gnu packages ncurses))
 
+
 (define-public tmux
   (package
     (name "tmux")
@@ -50,3 +53,38 @@ windows), each running a separate program, to be created, accessed, and
 controlled from a single screen.  tmux may be detached from a screen and
 continue running in the background, then later reattached.")
     (license isc)))
+
+(define-public tmux-themepack
+  (let ((commit "03a372866f7677f7fe63bcee140b48b9fd372c48")
+        (revision "1"))
+    (package
+      (name "tmux-themepack")
+      (version
+       (string-append "0.0.0-" revision "." (string-take commit 7))) ;; No version tags
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url
+                       (string-append "https://github.com/jimeh/" name ".git"))
+                      (commit commit)))
+                (sha256
+                 (base32
+                  "1d3k87mq5lca042jbap5kxskjy3kg79wjhhpnm6jacbn3anc67zl"))
+                (file-name (string-append name "-" version "-checkout"))))
+      (build-system gnu-build-system)
+      (arguments
+       `(#:tests? #f ; No test suite.
+         #:phases (modify-phases %standard-phases
+                    (delete 'configure)
+                    (delete 'build)
+                    (replace 'install
+                      (lambda* (#:key outputs #:allow-other-keys)
+                        (let* ((out (string-append
+                                     (assoc-ref outputs "out")
+                                     "/share/" ,name "-" ,version)))
+                          (copy-recursively "." out)))))))
+      (home-page "https://github.com/jimeh/tmux-themepack")
+      (synopsis "Collection of themes for Tmux")
+      (description "A collection of various themes for Tmux.")
+      (license
+       (non-copyleft "http://www.wtfpl.net/txt/copying/")))))
diff --git a/gnu/packages/version-control.scm b/gnu/packages/version-control.scm
index e6e7e0011b..ec7f9e8a3c 100644
--- a/gnu/packages/version-control.scm
+++ b/gnu/packages/version-control.scm
@@ -112,14 +112,14 @@ as well as the classic centralized workflow.")
   ;; Keep in sync with 'git-manpages'!
   (package
    (name "git")
-   (version "2.9.0")
+   (version "2.9.1")
    (source (origin
             (method url-fetch)
             (uri (string-append "mirror://kernel.org/software/scm/git/git-"
                                 version ".tar.xz"))
             (sha256
              (base32
-              "02dl8yvvl7m4zy39s0xmqr958ah7krvkv94lmx4vz3wl95wsj7zl"))))
+              "18l2jb4bkp9ljz6p2aviwzxqyzza9z3v6h1pnkz7kjf1fay61zp8"))))
    (build-system gnu-build-system)
    (native-inputs
     `(("native-perl" ,perl)
@@ -294,7 +294,7 @@ everything from small to very large projects with speed and efficiency.")
                     version ".tar.xz"))
               (sha256
                (base32
-                "0ic4zs4axkkwa44nqv5iihj3q2nm42kx0j8scnfp1z93m6pw31fw"))))
+                "1v9icsf85vvrrg7fakm91d11q23rvnh6dq4b4c4ya8v95z00mg8p"))))
     (build-system trivial-build-system)
     (arguments
      '(#:modules ((guix build utils))
@@ -369,7 +369,7 @@ write native speed custom Git applications in any language with bindings.")
 (define-public cgit
   (package
     (name "cgit")
-    (version "0.12")
+    (version "1.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -377,7 +377,7 @@ write native speed custom Git applications in any language with bindings.")
                     version ".tar.xz"))
               (sha256
                (base32
-                "1dx54hgfyabmg9nm5qp6d01f54nlbqbbdwhwl0llb9imjf237qif"))))
+                "0kbh835p7dl4h88qv55fyfh1za09cgnqh63rii325w9215hm95x8"))))
     (build-system gnu-build-system)
     (arguments
      '(#:tests? #f ; XXX: fail to build the in-source git.
@@ -608,14 +608,14 @@ control to Git repositories.")
 (define-public mercurial
   (package
     (name "mercurial")
-    (version "3.8.1")
+    (version "3.8.4")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://www.mercurial-scm.org/"
                                  "release/mercurial-" version ".tar.gz"))
              (sha256
               (base32
-               "156m6269xdqq7mpw01c6b065k29xnb8b9lyzn1b0nlz5il2izkps"))))
+               "19ixvxgifx48lxp9vdmsf88nnjsxl035ahmp3iw1vyilkpqkwbjb"))))
     (build-system python-build-system)
     (arguments
      `(;; Restrict to Python 2, as Python 3 would require
diff --git a/gnu/packages/video.scm b/gnu/packages/video.scm
index 819c0d5f48..dfce444d9e 100644
--- a/gnu/packages/video.scm
+++ b/gnu/packages/video.scm
@@ -7,6 +7,7 @@
 ;;; Copyright © 2015 Andy Patterson <ajpatter@uwaterloo.ca>
 ;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2015 Alex Vong <alexvong1995@gmail.com>
+;;; Copyright © 2016 Alex Griffin <a@ajgrf.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -25,6 +26,8 @@
 
 (define-module (gnu packages video)
   #:use-module (ice-9 match)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-26)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix utils)
   #:use-module (guix packages)
@@ -32,6 +35,7 @@
   #:use-module (guix git-download)
   #:use-module (guix build-system cmake)
   #:use-module (guix build-system gnu)
+  #:use-module (guix build-system glib-or-gtk)
   #:use-module (guix build-system python)
   #:use-module (guix build-system waf)
   #:use-module (gnu packages)
@@ -373,14 +377,14 @@ standards (MPEG-2, MPEG-4 ASP/H.263, MPEG-4 AVC/H.264, and VC-1/VMW3).")
 (define-public ffmpeg
   (package
     (name "ffmpeg")
-    (version "3.0.2")
+    (version "3.1.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://ffmpeg.org/releases/ffmpeg-"
                                  version ".tar.xz"))
              (sha256
               (base32
-               "08sjp4dxgcinmv9ly7nm24swmn2cnbbhvph44ihlplf4n33kr542"))))
+               "1nris3flwqd4v4b65yrrv9aqhsab7cb9lfp4wpxz6bi0m3r13g3i"))))
     (build-system gnu-build-system)
     (inputs
      `(("fontconfig" ,fontconfig)
@@ -539,14 +543,14 @@ audio/video codec library.")
 (define-public ffmpeg-2.8
   (package
     (inherit ffmpeg)
-    (version "2.8.6")
+    (version "2.8.7")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://ffmpeg.org/releases/ffmpeg-"
                                  version ".tar.xz"))
              (sha256
               (base32
-               "1yh7dvm7zwdlsspdaq524s5qaggma5md9h95qc4kvb5dmyyyvg15"))))
+               "0z0mcj2q3ysp9qdn1ks03g5sn2zxyr06vxs4al0m4b5b3in8mglp"))))
     (arguments
      (substitute-keyword-arguments (package-arguments ffmpeg)
        ((#:configure-flags flags)
@@ -818,7 +822,7 @@ SVCD, DVD, 3ivx, DivX 3/4/5, WMV and H.264 movies.")
           (lambda* (#:key inputs #:allow-other-keys)
             (copy-file (assoc-ref inputs "waf") "waf")
             (setenv "CC" "gcc"))))
-       #:configure-flags (list "--enable-zsh-comp")
+       #:configure-flags (list "--enable-libmpv-shared" "--enable-zsh-comp")
        ;; No check function defined.
        #:tests? #f))
     (home-page "https://mpv.io/")
@@ -828,6 +832,34 @@ fork of mplayer2 and MPlayer.  It shares some features with the former
 projects while introducing many more.")
     (license license:gpl2+)))
 
+(define-public gnome-mpv
+  (package
+    (name "gnome-mpv")
+    (version "0.9")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/gnome-mpv/gnome-mpv/releases"
+                           "/download/v" version "/gnome-mpv-" version
+                           ".tar.xz"))
+       (sha256
+        (base32
+         "06pgxl6f3kkgxv8nlmyl7gy3pg55sqf8vgr8m6426mlpm4p3qdn0"))))
+    (native-inputs
+     `(("intltool" ,intltool)
+       ("pkg-config" ,pkg-config)))
+    (inputs
+     `(("gtk+" ,gtk+)
+       ("libepoxy" ,libepoxy)
+       ("mpv" ,mpv)))
+    (build-system glib-or-gtk-build-system)
+    (home-page "https://github.com/gnome-mpv/gnome-mpv")
+    (synopsis "GTK+ frontend for the mpv media player")
+    (description "GNOME MPV is a simple GTK+ frontend for the mpv media player.
+GNOME MPV interacts with mpv via the client API exported by libmpv, allowing
+access to mpv's powerful playback capabilities.")
+    (license license:gpl3+)))
+
 (define-public libvpx
   (package
     (name "libvpx")
@@ -910,15 +942,15 @@ YouTube.com and a few more sites.")
 (define-public libbluray
   (package
     (name "libbluray")
-    (version "0.9.2")
+    (version "0.9.3")
     (source (origin
               (method url-fetch)
-              (uri (string-append "http://download.videolan.org/videolan/"
+              (uri (string-append "https://download.videolan.org/videolan/"
                                   name "/" version "/"
                                   name "-" version ".tar.bz2"))
               (sha256
                (base32
-                "1sp71j4agcsg17g6b85cqz78pn5vknl5pl39rvr6mkib5ps99jgg"))))
+                "1q1whviqv5sr9nr372h31zwid1rvbfbx3z4lzr8lnj25xha6cdm6"))))
     (build-system gnu-build-system)
     (arguments `(#:configure-flags '("--disable-bdjava")))
     (native-inputs `(("pkg-config" ,pkg-config)))
@@ -926,7 +958,7 @@ YouTube.com and a few more sites.")
      `(("fontconfig" ,fontconfig)
        ("freetype" ,freetype)
        ("libxml2" ,libxml2)))
-    (home-page "http://www.videolan.org/developers/libbluray.html")
+    (home-page "https://www.videolan.org/developers/libbluray.html")
     (synopsis "Blu-Ray Disc playback library")
     (description
      "libbluray is a library designed for Blu-Ray Disc playback for media
@@ -1363,7 +1395,7 @@ be used for realtime video capture via Linux-specific APIs.")
 (define-public obs
   (package
     (name "obs")
-    (version "0.14.2")
+    (version "0.15.1")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/jp9000/obs-studio"
@@ -1371,9 +1403,23 @@ be used for realtime video capture via Linux-specific APIs.")
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "1cb8naa67kfnnngkzv1wpd4y241j29ggnk1w7jgnymp9j8dny1xl"))))
+                "18fycg7xlj2i89wdb9c5js0bnl964s1lpmnvmfyj11zi9k061wsg"))))
     (build-system cmake-build-system)
-    (arguments '(#:tests? #f)) ; no tests
+    (arguments
+     `(#:tests? #f ; no tests
+       ,@(if (any (cute string-prefix? <> (or (%current-target-system)
+                                              (%current-system)))
+                  '("arm" "mips"))
+           '(#:phases
+             (modify-phases %standard-phases
+             (add-after 'unpack 'remove-architecture-specific-instructions
+               ;; non-Intel platforms fail to build with the architecture
+               ;; specific compiler flags included by default.
+               (lambda _
+                 (substitute* "libobs/CMakeLists.txt"
+                              (("if\\(NOT MSVC\\)") "if(MSVC)"))
+                 #t))))
+           '())))
     (native-inputs
      `(("pkg-config" ,pkg-config)))
     (inputs
diff --git a/gnu/packages/web.scm b/gnu/packages/web.scm
index 19870ef8f4..ea1a30ad26 100644
--- a/gnu/packages/web.scm
+++ b/gnu/packages/web.scm
@@ -76,14 +76,14 @@
 (define-public httpd
   (package
     (name "httpd")
-    (version "2.4.16")
+    (version "2.4.23")
     (source (origin
              (method url-fetch)
              (uri (string-append "mirror://apache/httpd/httpd-"
                                  version ".tar.bz2"))
              (sha256
               (base32
-               "0hrpy6gjwma0kba7p7m61vwh82qcnkf08123lrwpg257m93hnrmc"))))
+               "0n2yx3gjlpr4kgqx845fj6amnmg25r2l6a7rzab5hxnpmar985hc"))))
     (build-system gnu-build-system)
     (native-inputs `(("pcre" ,pcre "bin")))       ;for 'pcre-config'
     (inputs `(("apr" ,apr)
diff --git a/gnu/packages/wm.scm b/gnu/packages/wm.scm
index f385d2b4fb..790c74bbfd 100644
--- a/gnu/packages/wm.scm
+++ b/gnu/packages/wm.scm
@@ -393,7 +393,6 @@ experience.")
                "1m910lr7wkw2dgzmirfvz7dasfswhhccdf65l21iiciv24c3w1bb"))
              (modules '((guix build utils)
                         (srfi srfi-19)))
-             (imported-modules '((guix build utils)))
              (snippet
               ;; Remove non-reproducible timestamp and use the date of the
               ;; source file instead.
diff --git a/gnu/packages/xdisorg.scm b/gnu/packages/xdisorg.scm
index bfcba473a8..44d82dac60 100644
--- a/gnu/packages/xdisorg.scm
+++ b/gnu/packages/xdisorg.scm
@@ -12,6 +12,7 @@
 ;;; Copyright © 2016 Christopher Allan Webber <cwebber@dustycloud.org>
 ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -63,14 +64,14 @@
 (define-public arandr
   (package
     (name "arandr")
-    (version "0.1.8")
+    (version "0.1.9")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://christian.amsuess.com/tools/" name
                                   "/files/" name "-" version ".tar.gz"))
               (sha256
                (base32
-                "0d574mbmhaqmh7kivaryj2hpghz6xkvic9ah43s1hf385y7c33kd"))))
+                "1i3f1agixxbfy4kxikb2b241p7c2lg73cl9wqfvlwz3q6zf5faxv"))))
     (build-system python-build-system)
     (arguments
      `(#:python ,python-2     ;incompatible with python 3
@@ -126,14 +127,14 @@ avoiding password prompts when X11 forwarding has already been setup.")
 (define-public libxkbcommon
   (package
     (name "libxkbcommon")
-    (version "0.5.0")
+    (version "0.6.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "http://xkbcommon.org/download/" name "-"
                                  version ".tar.xz"))
              (sha256
               (base32
-               "176ii5dn2wh74q48sd8ac37ljlvgvp5f506glr96z6ibfhj7igch"))))
+               "0q47xa1szlxwgvwmhv4b7xwawnykz1hnc431d84nj8dlh2q8f22v"))))
     (build-system gnu-build-system)
     (inputs
      `(("libx11" ,libx11)
@@ -296,7 +297,7 @@ and Matrox.")
 (define-public mtdev
   (package
     (name "mtdev")
-    (version "1.1.3")
+    (version "1.1.5")
     (source
       (origin
         (method url-fetch)
@@ -304,8 +305,8 @@ and Matrox.")
                "http://bitmath.org/code/mtdev/mtdev-"
                version ".tar.bz2"))
         (sha256
-          (base32
-            "159ndzwfpw0xr8mw4lhl47w9c2krshlfrscs7k6n186vknv2hk3d"))))
+         (base32
+          "0zxs7shzgbalkvlaiibi25bd902rbmkv9n1lww6q8j3ri9qdaxv6"))))
     (build-system gnu-build-system)
     (home-page "http://bitmath.org/code/mtdev/")
     (synopsis "Multitouch protocol translation library")
@@ -638,7 +639,7 @@ Guile will work for XBindKeys.")
 (define-public sxhkd
   (package
     (name "sxhkd")
-    (version "0.5.5")
+    (version "0.5.6")
     (source
      (origin
        (file-name (string-append name "-" version ".tar.gz"))
@@ -648,7 +649,7 @@ Guile will work for XBindKeys.")
              version ".tar.gz"))
        (sha256
         (base32
-         "04s3y2bq9502gw72jj3y2zsh96yj3qg2av3zsa8ahd2farvrysg6"))))
+         "15grmzpxz5fqlbfg2slj7gb7r6nzkvjmflmbkqx7mlby9pm6wdkj"))))
     (build-system gnu-build-system)
     (inputs
      `(("asciidoc" ,asciidoc)
@@ -670,14 +671,14 @@ compact configuration syntax.")
 (define-public rxvt-unicode
   (package
     (name "rxvt-unicode")
-    (version "9.21")
+    (version "9.22")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://dist.schmorp.de/rxvt-unicode/Attic/"
                                   name "-" version ".tar.bz2"))
               (sha256
                (base32
-                "0swmi308v5yxsddrdhvi4cch88k2bbs2nffpl5j5m2f55gbhw9vm"))))
+                "1pddjn5ynblwfrdmskylrsxb9vfnk3w4jdnq2l8xn2pspkljhip9"))))
     (build-system gnu-build-system)
     (arguments
      ;; This sets the destination when installing the necessary terminal
@@ -848,7 +849,7 @@ color temperature should be set to match the lamps in your room.")
 (define-public xscreensaver
   (package
     (name "xscreensaver")
-    (version "5.34")
+    (version "5.35")
     (source
      (origin
        (method url-fetch)
@@ -857,7 +858,7 @@ color temperature should be set to match the lamps in your room.")
                        version ".tar.gz"))
        (sha256
         (base32
-         "09sy5v8bn62hiq4ib3jyvp8lipqcvn3rdsj74q25qgklpv27xzvg"))))
+         "08kbb0ry7ih436ab4i5g6lnhaaz13zkcdmbdibrn4j5gm5qq8v0y"))))
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f  ; no check target
@@ -914,7 +915,7 @@ demos.  It also acts as a nice screen locker.")
 (define-public rofi
   (package
     (name "rofi")
-    (version "1.0.1")
+    (version "1.1.0")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/DaveDavenport/rofi/"
@@ -922,7 +923,7 @@ demos.  It also acts as a nice screen locker.")
                                   version "/rofi-" version ".tar.xz"))
               (sha256
                (base32
-                "01jxml9vk4cw7pngpan7dipmb98s6ibh6f0023lw3hbgxy650637"))))
+                "1l8vl0mh7i0b1ycifqpg6392f5i4qxlv003m126skfk6fnlfq8hn"))))
     (build-system gnu-build-system)
     (inputs
      `(("libx11" ,libx11)
diff --git a/gnu/packages/xfce.scm b/gnu/packages/xfce.scm
index c201f03ab5..5639f1daa3 100644
--- a/gnu/packages/xfce.scm
+++ b/gnu/packages/xfce.scm
@@ -28,6 +28,7 @@
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system trivial)
   #:use-module (gnu packages)
+  #:use-module (gnu packages calendar)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages glib)
   #:use-module (gnu packages gtk)
@@ -43,6 +44,7 @@
   #:use-module (gnu packages linux)
   #:use-module (gnu packages photo)
   #:use-module (gnu packages pcre)
+  #:use-module (gnu packages popt)
   #:use-module (gnu packages pulseaudio))
 
 (define-public gtk-xfce-engine
@@ -815,3 +817,35 @@ the desktop wallpaper.")
      "This is a task manager for the Xfce desktop.  It displays the CPU and
 memory usage graphically, and it can display processes as a tree.")
     (license gpl2+)))
+
+(define-public orage
+  (package
+    (name "orage")
+    (version "4.12.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://archive.xfce.org/src/apps/"
+                                  name "/" (version-major+minor version) "/"
+                                  name "-" version ".tar.bz2"))
+              (sha256
+               (base32
+                "0qlhvnl2m33vfxqlbkic2nmfpwyd4mq230jzhs48cg78392amy9w"))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("intltool" ,intltool)
+       ("pkg-config" ,pkg-config)))
+    (inputs
+     `(("gtk+" ,gtk+-2)
+       ("libical" ,libical)
+       ("libnotify" ,libnotify)
+       ("popt" ,popt)
+       ("xfce4-panel" ,xfce4-panel)))
+    (home-page "http://www.xfce.org/projects/")
+    (synopsis "Simple calendar application with reminders")
+    (description
+     "This is a simple calendar application for the Xfce desktop.  Orage has
+alarms and uses the iCalendar format, making it compatible with many other
+calendar applications.  It also includes a panel clock plugin and an
+international clock application capable of simultaneously showing clocks from
+several different time zones.")
+    (license gpl2+)))
diff --git a/gnu/packages/xml.scm b/gnu/packages/xml.scm
index ef7f257139..fb0d07d8cf 100644
--- a/gnu/packages/xml.scm
+++ b/gnu/packages/xml.scm
@@ -532,16 +532,15 @@ server, collect the answer, and finally decoding the XML to Perl.")
 (define-public pugixml
   (package
     (name "pugixml")
-    (version "1.6")
+    (version "1.7")
     (source
      (origin
       (method url-fetch)
-      (uri (string-append "https://github.com/zeux/pugixml/archive/v"
-                          version ".tar.gz"))
-      (file-name (string-append name "-" version ".tar.gz"))
+      (uri (string-append "https://github.com/zeux/pugixml/releases/download/v"
+                          version "/pugixml-" version ".tar.gz"))
       (sha256
        (base32
-        "0czbcv9aqf2rw3s9cljz2wb1f4zbhd07wnj7ykklklccl0ipfnwi"))))
+        "1jpml475kbhs1aqwa48g2cbfxlrb9qp115m2j9yryxhxyr30vqgv"))))
     (build-system cmake-build-system)
     (arguments
      `(#:tests? #f
diff --git a/gnu/services.scm b/gnu/services.scm
index 50e76df818..5479bfae19 100644
--- a/gnu/services.scm
+++ b/gnu/services.scm
@@ -238,42 +238,33 @@ directory."
 (define (cleanup-gexp _)
   "Return as a monadic value a gexp to clean up /tmp and similar places upon
 boot."
-  (define %modules
-    '((guix build utils)))
-
-  (mlet %store-monad ((modules  (imported-modules %modules))
-                      (compiled (compiled-modules %modules)))
-    (return #~(begin
-                (eval-when (expand load eval)
-                  ;; Make sure 'use-modules' below succeeds.
-                  (set! %load-path (cons #$modules %load-path))
-                  (set! %load-compiled-path
-                    (cons #$compiled %load-compiled-path)))
-
-                (use-modules (guix build utils))
-
-                ;; Clean out /tmp and /var/run.
-                ;;
-                ;; XXX This needs to happen before service activations, so it
-                ;; has to be here, but this also implicitly assumes that /tmp
-                ;; and /var/run are on the root partition.
-                (letrec-syntax ((fail-safe (syntax-rules ()
-                                             ((_ exp rest ...)
-                                              (begin
-                                                (catch 'system-error
-                                                  (lambda () exp)
-                                                  (const #f))
-                                                (fail-safe rest ...)))
-                                             ((_)
-                                              #t))))
-                  ;; Ignore I/O errors so the system can boot.
-                  (fail-safe
-                   (delete-file-recursively "/tmp")
-                   (delete-file-recursively "/var/run")
-                   (mkdir "/tmp")
-                   (chmod "/tmp" #o1777)
-                   (mkdir "/var/run")
-                   (chmod "/var/run" #o755)))))))
+  (with-monad %store-monad
+    (with-imported-modules '((guix build utils))
+      (return #~(begin
+                  (use-modules (guix build utils))
+
+                  ;; Clean out /tmp and /var/run.
+                  ;;
+                  ;; XXX This needs to happen before service activations, so it
+                  ;; has to be here, but this also implicitly assumes that /tmp
+                  ;; and /var/run are on the root partition.
+                  (letrec-syntax ((fail-safe (syntax-rules ()
+                                               ((_ exp rest ...)
+                                                (begin
+                                                  (catch 'system-error
+                                                    (lambda () exp)
+                                                    (const #f))
+                                                  (fail-safe rest ...)))
+                                               ((_)
+                                                #t))))
+                    ;; Ignore I/O errors so the system can boot.
+                    (fail-safe
+                     (delete-file-recursively "/tmp")
+                     (delete-file-recursively "/var/run")
+                     (mkdir "/tmp")
+                     (chmod "/tmp" #o1777)
+                     (mkdir "/var/run")
+                     (chmod "/var/run" #o755))))))))
 
 (define cleanup-service-type
   ;; Service that cleans things up in /tmp and similar.
@@ -309,10 +300,10 @@ file."
      one)
     (_
      (computed-file name
-                    #~(begin
-                        (use-modules (guix build union))
-                        (union-build #$output '#$things))
-                    #:modules '((guix build union))))))
+                    (with-imported-modules '((guix build union))
+                      #~(begin
+                          (use-modules (guix build union))
+                          (union-build #$output '#$things)))))))
 
 (define* (activation-service->script service)
   "Return as a monadic value the activation script for SERVICE, a service of
@@ -337,29 +328,22 @@ ACTIVATION-SCRIPT-TYPE."
           (cut gexp->file "activate-service" <>)
           gexps))
 
-  (mlet* %store-monad ((actions  (service-activations))
-                       (modules  (imported-modules %modules))
-                       (compiled (compiled-modules %modules)))
+  (mlet* %store-monad ((actions (service-activations)))
     (gexp->file "activate"
-                #~(begin
-                    (eval-when (expand load eval)
-                      ;; Make sure 'use-modules' below succeeds.
-                      (set! %load-path (cons #$modules %load-path))
-                      (set! %load-compiled-path
-                        (cons #$compiled %load-compiled-path)))
-
-                    (use-modules (gnu build activation))
+                (with-imported-modules %modules
+                  #~(begin
+                      (use-modules (gnu build activation))
 
-                    ;; Make sure /bin/sh is valid and current.
-                    (activate-/bin/sh
-                     (string-append #$(canonical-package bash) "/bin/sh"))
+                      ;; Make sure /bin/sh is valid and current.
+                      (activate-/bin/sh
+                       (string-append #$(canonical-package bash) "/bin/sh"))
 
-                    ;; Run the services' activation snippets.
-                    ;; TODO: Use 'load-compiled'.
-                    (for-each primitive-load '#$actions)
+                      ;; Run the services' activation snippets.
+                      ;; TODO: Use 'load-compiled'.
+                      (for-each primitive-load '#$actions)
 
-                    ;; Set up /run/current-system.
-                    (activate-current-system)))))
+                      ;; Set up /run/current-system.
+                      (activate-current-system))))))
 
 (define (gexps->activation-gexp gexps)
   "Return a gexp that runs the activation script containing GEXPS."
diff --git a/gnu/services/avahi.scm b/gnu/services/avahi.scm
index 8005b066ed..562005c22c 100644
--- a/gnu/services/avahi.scm
+++ b/gnu/services/avahi.scm
@@ -42,6 +42,8 @@
   avahi-configuration?
   (avahi             avahi-configuration-avahi    ;<package>
                      (default avahi))
+  (debug?            avahi-configuration-debug?   ;Boolean
+                     (default #f))
   (host-name         avahi-configuration-host-name) ;string
   (publish?          avahi-configuration-publish?)  ;Boolean
   (ipv4?             avahi-configuration-ipv4?)     ;Boolean
@@ -96,6 +98,7 @@
 (define (avahi-shepherd-service config)
   "Return a list of <shepherd-service> for CONFIG."
   (let ((config (configuration-file config))
+        (debug? (avahi-configuration-debug? config))
         (avahi  (avahi-configuration-avahi config)))
     (list (shepherd-service
            (documentation "Run the Avahi mDNS/DNS-SD responder.")
@@ -104,7 +107,10 @@
 
            (start #~(make-forkexec-constructor
                      (list (string-append #$avahi "/sbin/avahi-daemon")
-                           "--syslog" "-f" #$config)))
+                           "--daemonize"
+                           #$@(if debug? #~("--debug") #~())
+                           "-f" #$config)
+                     #:pid-file "/var/run/avahi-daemon/pid"))
            (stop #~(make-kill-destructor))))))
 
 (define avahi-service-type
@@ -127,7 +133,7 @@
                          (service-extension profile-service-type
                                             avahi-package))))))
 
-(define* (avahi-service #:key (avahi avahi)
+(define* (avahi-service #:key (avahi avahi) debug?
                         host-name
                         (publish? #t)
                         (ipv4? #t) (ipv6? #t)
@@ -155,7 +161,7 @@ Boolean values @var{ipv4?} and @var{ipv6?} determine whether to use IPv4/IPv6
 sockets."
   (service avahi-service-type
            (avahi-configuration
-            (avahi avahi) (host-name host-name)
+            (avahi avahi) (debug? debug?) (host-name host-name)
             (publish? publish?) (ipv4? ipv4?) (ipv6? ipv6?)
             (wide-area? wide-area?)
             (domains-to-browse domains-to-browse))))
diff --git a/gnu/services/base.scm b/gnu/services/base.scm
index 2780d124c7..805ba7d12c 100644
--- a/gnu/services/base.scm
+++ b/gnu/services/base.scm
@@ -4,6 +4,8 @@
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com>
 ;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
+;;; Copyright © 2016 David Craven <david@craven.ch>
+;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -31,11 +33,11 @@
   #:use-module (gnu system mapped-devices)
   #:use-module (gnu packages admin)
   #:use-module ((gnu packages linux)
-                #:select (eudev kbd e2fsprogs lvm2 fuse alsa-utils crda gpm))
+                #:select (alsa-utils crda eudev e2fsprogs fuse gpm kbd lvm2 rng-tools))
   #:use-module ((gnu packages base)
                 #:select (canonical-package glibc))
   #:use-module (gnu packages package-management)
-  #:use-module (gnu packages lsh)
+  #:use-module (gnu packages ssh)
   #:use-module (gnu packages lsof)
   #:use-module ((gnu build file-systems)
                 #:select (mount-flags->bit-mask))
@@ -81,6 +83,7 @@
             nscd-service-type
             nscd-service
             syslog-service
+            syslog-service-type
             %default-syslog.conf
 
             guix-configuration
@@ -94,7 +97,12 @@
             gpm-service-type
             gpm-service
 
+            urandom-seed-service-type
             urandom-seed-service
+            rngd-service-type
+            rngd-service
+            pam-limits-service-type
+            pam-limits-service
 
             %base-services))
 
@@ -224,59 +232,58 @@ FILE-SYSTEM."
         (create? (file-system-create-mount-point? file-system))
         (dependencies (file-system-dependencies file-system)))
     (if (file-system-mount? file-system)
-        (list
-         (shepherd-service
-          (provision (list (file-system->shepherd-service-name file-system)))
-          (requirement `(root-file-system
-                         ,@(map dependency->shepherd-service-name dependencies)))
-          (documentation "Check, mount, and unmount the given file system.")
-          (start #~(lambda args
-                     ;; FIXME: Use or factorize with 'mount-file-system'.
-                     (let ((device (canonicalize-device-spec #$device '#$title))
-                           (flags  #$(mount-flags->bit-mask
-                                      (file-system-flags file-system))))
-                       #$(if create?
-                             #~(mkdir-p #$target)
-                             #~#t)
-                       #$(if check?
-                             #~(begin
-                                 ;; Make sure fsck.ext2 & co. can be found.
-                                 (setenv "PATH"
-                                         (string-append
-                                          #$e2fsprogs "/sbin:"
-                                          "/run/current-system/profile/sbin:"
-                                          (getenv "PATH")))
-                                 (check-file-system device #$type))
-                             #~#t)
-
-                       (mount device #$target #$type flags
-                              #$(file-system-options file-system))
-
-                       ;; For read-only bind mounts, an extra remount is
-                       ;; needed, as per <http://lwn.net/Articles/281157/>,
-                       ;; which still applies to Linux 4.0.
-                       (when (and (= MS_BIND (logand flags MS_BIND))
-                                  (= MS_RDONLY (logand flags MS_RDONLY)))
-                         (mount device #$target #$type
-                                (logior MS_BIND MS_REMOUNT MS_RDONLY))))
-                     #t))
-          (stop #~(lambda args
-                    ;; Normally there are no processes left at this point, so
-                    ;; TARGET can be safely unmounted.
-
-                    ;; Make sure PID 1 doesn't keep TARGET busy.
-                    (chdir "/")
-
-                    (umount #$target)
-                    #f))
-
-          ;; We need an additional module.
-          (modules `(((gnu build file-systems)
-                      #:select (check-file-system canonicalize-device-spec))
-                     ,@%default-modules))
-          (imported-modules `((gnu build file-systems)
-                              (guix build bournish)
-                              ,@%default-imported-modules))))
+        (with-imported-modules '((gnu build file-systems)
+                                 (guix build bournish))
+          (list
+           (shepherd-service
+            (provision (list (file-system->shepherd-service-name file-system)))
+            (requirement `(root-file-system
+                           ,@(map dependency->shepherd-service-name dependencies)))
+            (documentation "Check, mount, and unmount the given file system.")
+            (start #~(lambda args
+                       ;; FIXME: Use or factorize with 'mount-file-system'.
+                       (let ((device (canonicalize-device-spec #$device '#$title))
+                             (flags  #$(mount-flags->bit-mask
+                                        (file-system-flags file-system))))
+                         #$(if create?
+                               #~(mkdir-p #$target)
+                               #~#t)
+                         #$(if check?
+                               #~(begin
+                                   ;; Make sure fsck.ext2 & co. can be found.
+                                   (setenv "PATH"
+                                           (string-append
+                                            #$e2fsprogs "/sbin:"
+                                            "/run/current-system/profile/sbin:"
+                                            (getenv "PATH")))
+                                   (check-file-system device #$type))
+                               #~#t)
+
+                         (mount device #$target #$type flags
+                                #$(file-system-options file-system))
+
+                         ;; For read-only bind mounts, an extra remount is
+                         ;; needed, as per <http://lwn.net/Articles/281157/>,
+                         ;; which still applies to Linux 4.0.
+                         (when (and (= MS_BIND (logand flags MS_BIND))
+                                    (= MS_RDONLY (logand flags MS_RDONLY)))
+                           (mount device #$target #$type
+                                  (logior MS_BIND MS_REMOUNT MS_RDONLY))))
+                       #t))
+            (stop #~(lambda args
+                      ;; Normally there are no processes left at this point, so
+                      ;; TARGET can be safely unmounted.
+
+                      ;; Make sure PID 1 doesn't keep TARGET busy.
+                      (chdir "/")
+
+                      (umount #$target)
+                      #f))
+
+            ;; We need an additional module.
+            (modules `(((gnu build file-systems)
+                        #:select (check-file-system canonicalize-device-spec))
+                       ,@%default-modules)))))
         '())))
 
 (define file-system-service-type
@@ -484,7 +491,47 @@ stopped before 'kill' is called."
 (define (urandom-seed-service)
   (service urandom-seed-service-type #f))
 
-
+
+;;;
+;;; Add hardware random number generator to entropy pool.
+;;;
+
+(define-record-type* <rngd-configuration>
+  rngd-configuration make-rngd-configuration
+  rngd-configuration?
+  (rng-tools rngd-configuration-rng-tools)        ;package
+  (device    rngd-configuration-device))          ;string
+
+(define rngd-service-type
+  (shepherd-service-type
+    'rngd
+    (lambda (config)
+      (define rng-tools (rngd-configuration-rng-tools config))
+      (define device (rngd-configuration-device config))
+
+      (define rngd-command
+        (list #~(string-append #$rng-tools "/sbin/rngd")
+              "-f" "-r" device))
+
+      (shepherd-service
+        (documentation "Add TRNG to entropy pool.")
+        (requirement '(udev))
+        (provision '(trng))
+        (start #~(make-forkexec-constructor #$@rngd-command))
+        (stop #~(make-kill-destructor))))))
+
+(define* (rngd-service #:key
+                       (rng-tools rng-tools)
+                       (device "/dev/hwrng"))
+  "Return a service that runs the @command{rngd} program from @var{rng-tools}
+to add @var{device} to the kernel's entropy pool.  The service will fail if
+@var{device} does not exist."
+  (service rngd-service-type
+           (rngd-configuration
+            (rng-tools rng-tools)
+            (device device))))
+
+
 ;;;
 ;;; System-wide environment variables.
 ;;;
@@ -790,6 +837,11 @@ the tty to run, among other things."
                                           "/sbin/nscd")
                            "-f" #$nscd.conf "--foreground")
 
+                     ;; Wait for the PID file.  However, the PID file is
+                     ;; written before nscd is actually listening on its
+                     ;; socket (XXX).
+                     #:pid-file "/var/run/nscd/nscd.pid"
+
                      #:environment-variables
                      (list (string-append "LD_LIBRARY_PATH="
                                           (string-join
@@ -875,6 +927,46 @@ settings.
 information on the configuration file syntax."
   (service syslog-service-type config-file))
 
+(define pam-limits-service-type
+  (let ((security-limits
+         ;; Create /etc/security containing the provided "limits.conf" file.
+         (lambda (limits-file)
+           `(("security"
+              ,(computed-file
+                "security"
+                #~(begin
+                    (mkdir #$output)
+                    (stat #$limits-file)
+                    (symlink #$limits-file
+                             (string-append #$output "/limits.conf"))))))))
+        (pam-extension
+         (lambda (pam)
+           (let ((pam-limits (pam-entry
+                              (control "required")
+                              (module "pam_limits.so")
+                              (arguments '("conf=/etc/security/limits.conf")))))
+             (if (member (pam-service-name pam)
+                         '("login" "su" "slim"))
+                 (pam-service
+                  (inherit pam)
+                  (session (cons pam-limits
+                                 (pam-service-session pam))))
+                 pam)))))
+    (service-type
+     (name 'limits)
+     (extensions
+      (list (service-extension etc-service-type security-limits)
+            (service-extension pam-root-service-type
+                               (lambda _ (list pam-extension))))))))
+
+(define* (pam-limits-service #:optional (limits '()))
+  "Return a service that makes selected programs respect the list of
+pam-limits-entry specified in LIMITS via pam_limits.so."
+  (service pam-limits-service-type
+           (plain-file "limits.conf"
+                       (string-join (map pam-limits-entry->string limits)
+                                    "\n"))))
+
 
 ;;;
 ;;; Guix services.
@@ -1088,44 +1180,44 @@ archive}).  If that is not the case, the service will fail to start."
   "Return the union of the @code{lib/udev/rules.d} directories found in each
 item of @var{packages}."
   (define build
-    #~(begin
-        (use-modules (guix build union)
-                     (guix build utils)
-                     (srfi srfi-1)
-                     (srfi srfi-26))
+    (with-imported-modules '((guix build union)
+                             (guix build utils))
+      #~(begin
+          (use-modules (guix build union)
+                       (guix build utils)
+                       (srfi srfi-1)
+                       (srfi srfi-26))
 
-        (define %standard-locations
-          '("/lib/udev/rules.d" "/libexec/udev/rules.d"))
+          (define %standard-locations
+            '("/lib/udev/rules.d" "/libexec/udev/rules.d"))
 
-        (define (rules-sub-directory directory)
-          ;; Return the sub-directory of DIRECTORY containing udev rules, or
-          ;; #f if none was found.
-          (find directory-exists?
-                (map (cut string-append directory <>) %standard-locations)))
+          (define (rules-sub-directory directory)
+            ;; Return the sub-directory of DIRECTORY containing udev rules, or
+            ;; #f if none was found.
+            (find directory-exists?
+                  (map (cut string-append directory <>) %standard-locations)))
 
-        (mkdir-p (string-append #$output "/lib/udev"))
-        (union-build (string-append #$output "/lib/udev/rules.d")
-                     (filter-map rules-sub-directory '#$packages))))
+          (mkdir-p (string-append #$output "/lib/udev"))
+          (union-build (string-append #$output "/lib/udev/rules.d")
+                       (filter-map rules-sub-directory '#$packages)))))
 
-  (computed-file "udev-rules" build
-                 #:modules '((guix build union)
-                             (guix build utils))))
+  (computed-file "udev-rules" build))
 
 (define (udev-rule file-name contents)
   "Return a directory with a udev rule file FILE-NAME containing CONTENTS."
   (computed-file file-name
-                 #~(begin
-                     (use-modules (guix build utils))
-
-                     (define rules.d
-                       (string-append #$output "/lib/udev/rules.d"))
-
-                     (mkdir-p rules.d)
-                     (call-with-output-file
-                         (string-append rules.d "/" #$file-name)
-                       (lambda (port)
-                         (display #$contents port))))
-                 #:modules '((guix build utils))))
+                 (with-imported-modules '((guix build utils))
+                   #~(begin
+                       (use-modules (guix build utils))
+
+                       (define rules.d
+                         (string-append #$output "/lib/udev/rules.d"))
+
+                       (mkdir-p rules.d)
+                       (call-with-output-file
+                           (string-append rules.d "/" #$file-name)
+                         (lambda (port)
+                           (display #$contents port)))))))
 
 (define kvm-udev-rule
   ;; Return a directory with a udev rule that changes the group of /dev/kvm to
diff --git a/gnu/services/dbus.scm b/gnu/services/dbus.scm
index 9a4a13d41d..6ef13568ef 100644
--- a/gnu/services/dbus.scm
+++ b/gnu/services/dbus.scm
@@ -46,26 +46,27 @@
   "Return the system service directory, containing @code{.service} files for
 all the services that may be activated by the daemon."
   (computed-file "dbus-system-services"
-                 #~(begin
-                     (use-modules (guix build utils)
-                                  (srfi srfi-1))
-
-                     (define files
-                       (append-map (lambda (service)
-                                     (find-files (string-append
-                                                  service
-                                                  "/share/dbus-1/system-services")
-                                                 "\\.service$"))
-                                   (list #$@services)))
-
-                     (mkdir #$output)
-                     (for-each (lambda (file)
-                                 (symlink file
-                                          (string-append #$output "/"
-                                                         (basename file))))
-                               files)
-                     #t)
-                 #:modules '((guix build utils))))
+                 (with-imported-modules '((guix build utils))
+                   #~(begin
+                       (use-modules (guix build utils)
+                                    (srfi srfi-1))
+
+                       (define files
+                         (append-map (lambda (service)
+                                       (find-files
+                                        (string-append
+                                         service
+                                         "/share/dbus-1/system-services")
+                                        "\\.service$"))
+                                     (list #$@services)))
+
+                       (mkdir #$output)
+                       (for-each (lambda (file)
+                                   (symlink file
+                                            (string-append #$output "/"
+                                                           (basename file))))
+                                 files)
+                       #t))))
 
 (define (dbus-configuration-directory services)
   "Return a directory contains the @code{system-local.conf} file for DBUS that
@@ -168,7 +169,8 @@ includes the @code{etc/dbus-1/system.d} directories of each package listed in
             (requirement '(user-processes))
             (start #~(make-forkexec-constructor
                       (list (string-append #$dbus "/bin/dbus-daemon")
-                            "--nofork" "--system")))
+                            "--nofork" "--system")
+                      #:pid-file "/var/run/dbus/pid"))
             (stop #~(make-kill-destructor)))))))
 
 (define dbus-root-service-type
diff --git a/gnu/services/desktop.scm b/gnu/services/desktop.scm
index 2fb08cd1b3..86214a73bf 100644
--- a/gnu/services/desktop.scm
+++ b/gnu/services/desktop.scm
@@ -91,30 +91,33 @@ is set to @var{value} when the bus daemon launches it."
                              (string-append #$service "/" #$program)
                              (cdr (command-line))))))
 
+  (define build
+    (with-imported-modules '((guix build utils))
+      #~(begin
+          (use-modules (guix build utils))
+
+          (define service-directory
+            "/share/dbus-1/system-services")
+
+          (mkdir-p (dirname (string-append #$output
+                                           service-directory)))
+          (copy-recursively (string-append #$service
+                                           service-directory)
+                            (string-append #$output
+                                           service-directory))
+          (symlink (string-append #$service "/etc") ;for etc/dbus-1
+                   (string-append #$output "/etc"))
+
+          (for-each (lambda (file)
+                      (substitute* file
+                        (("Exec[[:blank:]]*=[[:blank:]]*([[:graph:]]+)(.*)$"
+                          _ original-program arguments)
+                         (string-append "Exec=" #$wrapper arguments
+                                        "\n"))))
+                    (find-files #$output "\\.service$")))))
+
   (computed-file (string-append (package-name service) "-wrapper")
-                 #~(begin
-                     (use-modules (guix build utils))
-
-                     (define service-directory
-                       "/share/dbus-1/system-services")
-
-                     (mkdir-p (dirname (string-append #$output
-                                                      service-directory)))
-                     (copy-recursively (string-append #$service
-                                                      service-directory)
-                                       (string-append #$output
-                                                      service-directory))
-                     (symlink (string-append #$service "/etc") ;for etc/dbus-1
-                              (string-append #$output "/etc"))
-
-                     (for-each (lambda (file)
-                                 (substitute* file
-                                   (("Exec[[:blank:]]*=[[:blank:]]*([[:graph:]]+)(.*)$"
-                                     _ original-program arguments)
-                                    (string-append "Exec=" #$wrapper arguments
-                                                   "\n"))))
-                               (find-files #$output "\\.service$")))
-                 #:modules '((guix build utils))))
+                 build))
 
 
 ;;;
@@ -408,15 +411,15 @@ Users need to be in the @code{lp} group to access the D-Bus service.
 (define (polkit-directory packages)
   "Return a directory containing an @file{actions} and possibly a
 @file{rules.d} sub-directory, for use as @file{/etc/polkit-1}."
-  (computed-file "etc-polkit-1"
-                 #~(begin
-                     (use-modules (guix build union) (srfi srfi-26))
-
-                     (union-build #$output
-                                  (map (cut string-append <>
-                                            "/share/polkit-1")
-                                       (list #$@packages))))
-                 #:modules '((guix build union))))
+  (with-imported-modules '((guix build union))
+    (computed-file "etc-polkit-1"
+                   #~(begin
+                       (use-modules (guix build union) (srfi srfi-26))
+
+                       (union-build #$output
+                                    (map (cut string-append <>
+                                              "/share/polkit-1")
+                                         (list #$@packages)))))))
 
 (define polkit-etc-files
   (match-lambda
diff --git a/gnu/services/networking.scm b/gnu/services/networking.scm
index af2a60936b..a77ed3bb80 100644
--- a/gnu/services/networking.scm
+++ b/gnu/services/networking.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;;
@@ -345,39 +345,39 @@ keep the system clock synchronized with that of @var{servers}."
     (($ <tor-configuration> tor config-file services)
      (computed-file
       "torrc"
-      #~(begin
-          (use-modules (guix build utils)
-                       (ice-9 match))
-
-          (call-with-output-file #$output
-            (lambda (port)
-              (display "\
+      (with-imported-modules '((guix build utils))
+        #~(begin
+            (use-modules (guix build utils)
+                         (ice-9 match))
+
+            (call-with-output-file #$output
+              (lambda (port)
+                (display "\
 # The beginning was automatically added.
 User tor
 DataDirectory /var/lib/tor
 Log notice syslog\n" port)
 
-              (for-each (match-lambda
-                          ((service (ports hosts) ...)
-                           (format port "\
+                (for-each (match-lambda
+                            ((service (ports hosts) ...)
+                             (format port "\
 HiddenServiceDir /var/lib/tor/hidden-services/~a~%"
-                                   service)
-                           (for-each (lambda (tcp-port host)
-                                       (format port "\
+                                     service)
+                             (for-each (lambda (tcp-port host)
+                                         (format port "\
 HiddenServicePort ~a ~a~%"
-                                               tcp-port host))
-                                     ports hosts)))
-                        '#$(map (match-lambda
-                                  (($ <hidden-service> name mapping)
-                                   (cons name mapping)))
-                                services))
-
-              ;; Append the user's config file.
-              (call-with-input-file #$config-file
-                (lambda (input)
-                  (dump-port input port)))
-              #t)))
-      #:modules '((guix build utils))))))
+                                                 tcp-port host))
+                                       ports hosts)))
+                          '#$(map (match-lambda
+                                    (($ <hidden-service> name mapping)
+                                     (cons name mapping)))
+                                  services))
+
+                ;; Append the user's config file.
+                (call-with-input-file #$config-file
+                  (lambda (input)
+                    (dump-port input port)))
+                #t))))))))
 
 (define (tor-shepherd-service config)
   "Return a <shepherd-service> running TOR."
diff --git a/gnu/services/shepherd.scm b/gnu/services/shepherd.scm
index 5d829e4c38..a14f51592a 100644
--- a/gnu/services/shepherd.scm
+++ b/gnu/services/shepherd.scm
@@ -47,9 +47,7 @@
             shepherd-service-stop
             shepherd-service-auto-start?
             shepherd-service-modules
-            shepherd-service-imported-modules
 
-            %default-imported-modules
             %default-modules
 
             shepherd-service-file
@@ -138,9 +136,7 @@ for a service that extends SHEPHERD-ROOT-SERVICE-TYPE and nothing else."
   (auto-start?   shepherd-service-auto-start?          ;Boolean
                  (default #t))
   (modules       shepherd-service-modules              ;list of module names
-                 (default %default-modules))
-  (imported-modules shepherd-service-imported-modules  ;list of module names
-                    (default %default-imported-modules)))
+                 (default %default-modules)))
 
 (define (shepherd-service-canonical-name service)
   "Return the 'canonical name' of SERVICE."
@@ -179,7 +175,7 @@ assertion failure."
                           (&message
                            (message
                             (format #f (_ "service '~a' requires '~a', \
-which is undefined")
+which is not provided by any service")
                                     (match (shepherd-service-provision service)
                                       ((head . _) head)
                                       (_          service))
@@ -203,37 +199,26 @@ stored."
 (define (shepherd-service-file service)
   "Return a file defining SERVICE."
   (gexp->file (shepherd-service-file-name service)
-              #~(begin
-                  (use-modules #$@(shepherd-service-modules service))
-
-                  (make <service>
-                    #:docstring '#$(shepherd-service-documentation service)
-                    #:provides '#$(shepherd-service-provision service)
-                    #:requires '#$(shepherd-service-requirement service)
-                    #:respawn? '#$(shepherd-service-respawn? service)
-                    #:start #$(shepherd-service-start service)
-                    #:stop #$(shepherd-service-stop service)))))
+              (with-imported-modules %default-imported-modules
+                #~(begin
+                    (use-modules #$@(shepherd-service-modules service))
+
+                    (make <service>
+                      #:docstring '#$(shepherd-service-documentation service)
+                      #:provides '#$(shepherd-service-provision service)
+                      #:requires '#$(shepherd-service-requirement service)
+                      #:respawn? '#$(shepherd-service-respawn? service)
+                      #:start #$(shepherd-service-start service)
+                      #:stop #$(shepherd-service-stop service))))))
 
 (define (shepherd-configuration-file services)
   "Return the shepherd configuration file for SERVICES."
-  (define modules
-    (delete-duplicates
-     (append-map shepherd-service-imported-modules services)))
-
   (assert-valid-graph services)
 
-  (mlet %store-monad ((modules  (imported-modules modules))
-                      (compiled (compiled-modules modules))
-                      (files    (mapm %store-monad
-                                      shepherd-service-file
-                                      services)))
+  (mlet %store-monad ((files (mapm %store-monad
+                                   shepherd-service-file services)))
     (define config
       #~(begin
-          (eval-when (expand load eval)
-            (set! %load-path (cons #$modules %load-path))
-            (set! %load-compiled-path
-              (cons #$compiled %load-compiled-path)))
-
           (use-modules (srfi srfi-34)
                        (system repl error-handling))
 
diff --git a/gnu/services/ssh.scm b/gnu/services/ssh.scm
index 33e1951a6e..743b5e3805 100644
--- a/gnu/services/ssh.scm
+++ b/gnu/services/ssh.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014, 2015 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2016 David Craven <david@craven.ch>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -17,14 +18,19 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu services ssh)
-  #:use-module (guix gexp)
-  #:use-module (guix records)
+  #:use-module (gnu packages ssh)
   #:use-module (gnu services)
   #:use-module (gnu services shepherd)
   #:use-module (gnu system pam)
-  #:use-module (gnu packages lsh)
+  #:use-module (guix gexp)
+  #:use-module (guix records)
   #:use-module (srfi srfi-26)
-  #:export (lsh-service))
+  #:export (lsh-service
+
+            dropbear-configuration
+            dropbear-configuration?
+            dropbear-service-type
+            dropbear-service))
 
 ;;; Commentary:
 ;;;
@@ -235,4 +241,85 @@ The other options should be self-descriptive."
                                public-key-authentication?)
                               (initialize? initialize?))))
 
+
+;;;
+;;; Dropbear.
+;;;
+
+(define-record-type* <dropbear-configuration>
+  dropbear-configuration make-dropbear-configuration
+  dropbear-configuration?
+  (dropbear               dropbear-configuration-dropbear
+                          (default dropbear))
+  (port-number            dropbear-configuration-port-number
+                          (default 22))
+  (syslog-output?         dropbear-configuration-syslog-output?
+                          (default #t))
+  (pid-file               dropbear-configuration-pid-file
+                          (default "/var/run/dropbear.pid"))
+  (root-login?            dropbear-configuration-root-login?
+                          (default #f))
+  (allow-empty-passwords? dropbear-configuration-allow-empty-passwords?
+                          (default #f))
+  (password-authentication? dropbear-configuration-password-authentication?
+                            (default #t)))
+
+(define (dropbear-activation config)
+  "Return the activation gexp for CONFIG."
+  #~(begin
+      (mkdir-p "/etc/dropbear")))
+
+(define (dropbear-shepherd-service config)
+  "Return a <shepherd-service> for dropbear with CONFIG."
+  (define dropbear
+    (dropbear-configuration-dropbear config))
+
+  (define pid-file
+    (dropbear-configuration-pid-file config))
+
+  (define dropbear-command
+    #~(list (string-append #$dropbear "/sbin/dropbear")
+
+            ;; '-R' allows host keys to be automatically generated upon first
+            ;; connection, at a time when /dev/urandom is more likely securely
+            ;; seeded.
+            "-F" "-R"
+
+            "-p" #$(number->string (dropbear-configuration-port-number config))
+            "-P" #$pid-file
+            #$@(if (dropbear-configuration-syslog-output? config) '() '("-E"))
+            #$@(if (dropbear-configuration-root-login? config) '() '("-w"))
+            #$@(if (dropbear-configuration-password-authentication? config)
+                   '()
+                   '("-s" "-g"))
+            #$@(if (dropbear-configuration-allow-empty-passwords? config)
+                   '("-B")
+                   '())))
+
+  (define requires
+    (if (dropbear-configuration-syslog-output? config)
+        '(networking syslogd) '(networking)))
+
+  (list (shepherd-service
+         (documentation "Dropbear SSH server.")
+         (requirement requires)
+         (provision '(ssh-daemon))
+         (start #~(make-forkexec-constructor #$dropbear-command
+                                             #:pid-file #$pid-file))
+         (stop #~(make-kill-destructor)))))
+
+(define dropbear-service-type
+  (service-type (name 'dropbear)
+                (extensions
+                 (list (service-extension shepherd-root-service-type
+                                          dropbear-shepherd-service)
+                       (service-extension activation-service-type
+                                          dropbear-activation)))))
+
+(define* (dropbear-service #:optional (config (dropbear-configuration)))
+  "Run the @uref{https://matt.ucc.asn.au/dropbear/dropbear.html,Dropbear SSH
+daemon} with the given @var{config}, a @code{<dropbear-configuration>}
+object."
+  (service dropbear-service-type config))
+
 ;;; ssh.scm ends here
diff --git a/gnu/services/web.scm b/gnu/services/web.scm
index 0e17f6e5c6..72ef7d4050 100644
--- a/gnu/services/web.scm
+++ b/gnu/services/web.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015 David Thompson <davet@gnu.org>
 ;;; Copyright © 2015 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -114,7 +115,7 @@
                          (default-nginx-config log-directory run-directory)))
   "Return a service that runs NGINX, the nginx web server.
 
-The nginx daemon loads its runtime configuration from CONFIG-FIGLE, stores log
+The nginx daemon loads its runtime configuration from CONFIG-FILE, stores log
 files in LOG-DIRECTORY, and stores temporary runtime files in RUN-DIRECTORY."
   (service nginx-service-type
            (nginx-configuration
diff --git a/gnu/services/xorg.scm b/gnu/services/xorg.scm
index 9908b9526b..44d12a7e77 100644
--- a/gnu/services/xorg.scm
+++ b/gnu/services/xorg.scm
@@ -158,27 +158,27 @@ EndSection
   "Return a directory that contains the @code{.conf} files for X.org that
 includes the @code{share/X11/xorg.conf.d} directories of each package listed
 in @var{modules}."
-  (computed-file "xorg.conf.d"
-                 #~(begin
-                     (use-modules (guix build utils)
-                                  (srfi srfi-1))
-
-                     (define files
-                       (append-map (lambda (module)
-                                     (find-files (string-append
-                                                  module
-                                                  "/share/X11/xorg.conf.d")
-                                                 "\\.conf$"))
-                                   (list #$@modules)))
-
-                     (mkdir #$output)
-                     (for-each (lambda (file)
-                                 (symlink file
-                                          (string-append #$output "/"
-                                                         (basename file))))
-                               files)
-                     #t)
-                 #:modules '((guix build utils))))
+  (with-imported-modules '((guix build utils))
+    (computed-file "xorg.conf.d"
+                   #~(begin
+                       (use-modules (guix build utils)
+                                    (srfi srfi-1))
+
+                       (define files
+                         (append-map (lambda (module)
+                                       (find-files (string-append
+                                                    module
+                                                    "/share/X11/xorg.conf.d")
+                                                   "\\.conf$"))
+                                     (list #$@modules)))
+
+                       (mkdir #$output)
+                       (for-each (lambda (file)
+                                   (symlink file
+                                            (string-append #$output "/"
+                                                           (basename file))))
+                                 files)
+                       #t))))
 
 (define* (xorg-start-command #:key
                              (guile (canonical-package guile-2.0))
diff --git a/gnu/system.scm b/gnu/system.scm
index 96ea153cd0..476720b9f9 100644
--- a/gnu/system.scm
+++ b/gnu/system.scm
@@ -81,6 +81,8 @@
             operating-system-mapped-devices
             operating-system-file-systems
             operating-system-store-file-system
+            operating-system-user-mapped-devices
+            operating-system-boot-mapped-devices
             operating-system-activation-script
             operating-system-user-accounts
             operating-system-shepherd-service-names
@@ -208,8 +210,9 @@ as 'needed-for-boot'."
   "Return a file system among FILE-SYSTEMS that uses DEVICE, or #f."
   (let ((target (string-append "/dev/mapper/" (mapped-device-target device))))
     (find (lambda (fs)
-            (and (eq? 'device (file-system-title fs))
-                 (string=? (file-system-device fs) target)))
+            (or (member device (file-system-dependencies fs))
+                (and (eq? 'device (file-system-title fs))
+                     (string=? (file-system-device fs) target))))
           file-systems)))
 
 (define (operating-system-user-mapped-devices os)
@@ -731,7 +734,8 @@ this file is the reconstruction of GRUB menu entries for old configurations."
                                    (kernel #$(operating-system-kernel os))
                                    (kernel-arguments
                                     #$(operating-system-kernel-arguments os))
-                                   (initrd #$initrd)))))
+                                   (initrd #$initrd))
+                #:set-load-path? #f)))
 
 
 ;;;
diff --git a/gnu/system/install.scm b/gnu/system/install.scm
index de14f6fb4c..734a361c37 100644
--- a/gnu/system/install.scm
+++ b/gnu/system/install.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2016 Andreas Enge <andreas@enge.fr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -55,52 +56,53 @@ under /root/.guix-profile where GUIX is installed."
                                 (manifest
                                  (list (package->manifest-entry guix))))))
     (define build
-      #~(begin
-          (use-modules (guix build utils)
-                       (gnu build install))
-
-          (define %root "root")
-
-          (setenv "PATH"
-                  (string-append #$guix "/sbin:" #$tar "/bin:" #$xz "/bin"))
-
-          ;; Note: there is not much to gain here with deduplication and there
-          ;; is the overhead of the '.links' directory, so turn it off.
-          (populate-single-profile-directory %root
-                                             #:profile #$profile
-                                             #:closure "profile"
-                                             #:deduplicate? #f)
-
-          ;; Create the tarball.  Use GNU format so there's no file name
-          ;; length limitation.
-          (with-directory-excursion %root
-            (zero? (system* "tar" "--xz" "--format=gnu"
-
-                            ;; Avoid non-determinism in the archive.  Use
-                            ;; mtime = 1, not zero, because that is what the
-                            ;; daemon does for files in the store (see the
-                            ;; 'mtimeStore' constant in local-store.cc.)
-                            "--sort=name"
-                            "--mtime=@1"          ;for files in /var/guix
-                            "--owner=root:0"
-                            "--group=root:0"
-
-                            "--check-links"
-                            "-cvf" #$output
-                            ;; Avoid adding / and /var to the tarball,
-                            ;; so that the ownership and permissions of those
-                            ;; directories will not be overwritten when
-                            ;; extracting the archive.  Do not include /root
-                            ;; because the root account might have a different
-                            ;; home directory.
-                            "./var/guix"
-                            (string-append "." (%store-directory)))))))
+      (with-imported-modules '((guix build utils)
+                               (guix build store-copy)
+                               (gnu build install))
+        #~(begin
+            (use-modules (guix build utils)
+                         (gnu build install))
+
+            (define %root "root")
+
+            (setenv "PATH"
+                    (string-append #$guix "/sbin:" #$tar "/bin:" #$xz "/bin"))
+
+            ;; Note: there is not much to gain here with deduplication and
+            ;; there is the overhead of the '.links' directory, so turn it
+            ;; off.
+            (populate-single-profile-directory %root
+                                               #:profile #$profile
+                                               #:closure "profile"
+                                               #:deduplicate? #f)
+
+            ;; Create the tarball.  Use GNU format so there's no file name
+            ;; length limitation.
+            (with-directory-excursion %root
+              (zero? (system* "tar" "--xz" "--format=gnu"
+
+                              ;; Avoid non-determinism in the archive.  Use
+                              ;; mtime = 1, not zero, because that is what the
+                              ;; daemon does for files in the store (see the
+                              ;; 'mtimeStore' constant in local-store.cc.)
+                              "--sort=name"
+                              "--mtime=@1"        ;for files in /var/guix
+                              "--owner=root:0"
+                              "--group=root:0"
+
+                              "--check-links"
+                              "-cvf" #$output
+                              ;; Avoid adding / and /var to the tarball, so
+                              ;; that the ownership and permissions of those
+                              ;; directories will not be overwritten when
+                              ;; extracting the archive.  Do not include /root
+                              ;; because the root account might have a
+                              ;; different home directory.
+                              "./var/guix"
+                              (string-append "." (%store-directory))))))))
 
     (gexp->derivation "guix-tarball.tar.xz" build
-                      #:references-graphs `(("profile" ,profile))
-                      #:modules '((guix build utils)
-                                  (guix build store-copy)
-                                  (gnu build install)))))
+                      #:references-graphs `(("profile" ,profile)))))
 
 
 (define (log-to-info)
@@ -212,20 +214,20 @@ the user's target storage device rather than on the RAM disk."
 
   (define directory
     (computed-file "configuration-templates"
-                   #~(begin
-                       (mkdir #$output)
-                       (for-each (lambda (file target)
-                                   (copy-file file
-                                              (string-append #$output "/"
-                                                             target)))
-                                 '(#$(file "bare-bones.tmpl")
-                                   #$(file "desktop.tmpl")
-                                   #$(file "lightweight-desktop.tmpl"))
-                                 '("bare-bones.scm"
-                                   "desktop.scm"
-                                   "lightweight-desktop.scm"))
-                       #t)
-                   #:modules '((guix build utils))))
+                   (with-imported-modules '((guix build utils))
+                     #~(begin
+                         (mkdir #$output)
+                         (for-each (lambda (file target)
+                                     (copy-file file
+                                                (string-append #$output "/"
+                                                               target)))
+                                   '(#$(file "bare-bones.tmpl")
+                                     #$(file "desktop.tmpl")
+                                     #$(file "lightweight-desktop.tmpl"))
+                                   '("bare-bones.scm"
+                                     "desktop.scm"
+                                     "lightweight-desktop.scm"))
+                         #t))))
 
   `(("configuration" ,directory)))
 
@@ -391,6 +393,7 @@ Use Alt-F2 for documentation.
                      parted ddrescue
                      grub                  ;mostly so xrefs to its manual work
                      cryptsetup
+                     mdadm
                      btrfs-progs
                      wireless-tools iw wpa-supplicant-minimal iproute
                      ;; XXX: We used to have GNU fdisk here, but as of version
diff --git a/gnu/system/linux-container.scm b/gnu/system/linux-container.scm
index 3acc579a6b..d3c0036f47 100644
--- a/gnu/system/linux-container.scm
+++ b/gnu/system/linux-container.scm
@@ -87,30 +87,29 @@ that will be shared with the host system."
                                   #:container? #t)))
 
       (define script
-        #~(begin
-            (use-modules (gnu build linux-container)
-                         (guix build utils))
+        (with-imported-modules '((guix config)
+                                 (guix utils)
+                                 (guix combinators)
+                                 (guix build utils)
+                                 (guix build syscalls)
+                                 (guix build bournish)
+                                 (gnu build file-systems)
+                                 (gnu build linux-container))
+          #~(begin
+              (use-modules (gnu build linux-container)
+                           (guix build utils))
 
-            (call-with-container '#$specs
-              (lambda ()
-                (setenv "HOME" "/root")
-                (setenv "TMPDIR" "/tmp")
-                (setenv "GUIX_NEW_SYSTEM" #$os-drv)
-                (for-each mkdir-p '("/run" "/bin" "/etc" "/home" "/var"))
-                (primitive-load (string-append #$os-drv "/boot")))
-              ;; A range of 65536 uid/gids is used to cover 16 bits worth of
-              ;; users and groups, which is sufficient for most cases.
-              ;;
-              ;; See: http://www.freedesktop.org/software/systemd/man/systemd-nspawn.html#--private-users=
-              #:host-uids 65536)))
+              (call-with-container '#$specs
+                (lambda ()
+                  (setenv "HOME" "/root")
+                  (setenv "TMPDIR" "/tmp")
+                  (setenv "GUIX_NEW_SYSTEM" #$os-drv)
+                  (for-each mkdir-p '("/run" "/bin" "/etc" "/home" "/var"))
+                  (primitive-load (string-append #$os-drv "/boot")))
+                ;; A range of 65536 uid/gids is used to cover 16 bits worth of
+                ;; users and groups, which is sufficient for most cases.
+                ;;
+                ;; See: http://www.freedesktop.org/software/systemd/man/systemd-nspawn.html#--private-users=
+                #:host-uids 65536))))
 
-      (gexp->script "run-container" script
-                    #:modules '((ice-9 match)
-                                (srfi srfi-98)
-                                (guix config)
-                                (guix utils)
-                                (guix build utils)
-                                (guix build syscalls)
-                                (guix build bournish)
-                                (gnu build file-systems)
-                                (gnu build linux-container))))))
+      (gexp->script "run-container" script))))
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 484bce71c4..bbaa5c0f89 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2016 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -54,85 +55,81 @@
                              (guile %guile-static-stripped)
                              (gzip gzip)
                              (name "guile-initrd")
-                             (system (%current-system))
-                             (modules '()))
+                             (system (%current-system)))
   "Return a derivation that builds a Linux initrd (a gzipped cpio archive)
 containing GUILE and that evaluates EXP, a G-expression, upon booting.  All
-the derivations referenced by EXP are automatically copied to the initrd.
-
-MODULES is a list of Guile module names to be embedded in the initrd."
+the derivations referenced by EXP are automatically copied to the initrd."
 
   ;; General Linux overview in `Documentation/early-userspace/README' and
   ;; `Documentation/filesystems/ramfs-rootfs-initramfs.txt'.
 
   (mlet %store-monad ((init (gexp->script "init" exp
-                                          #:modules modules
                                           #:guile guile)))
     (define builder
-      #~(begin
-          (use-modules (gnu build linux-initrd))
+      (with-imported-modules '((guix cpio)
+                               (guix build utils)
+                               (guix build store-copy)
+                               (gnu build linux-initrd))
+        #~(begin
+            (use-modules (gnu build linux-initrd))
 
-          (mkdir #$output)
-          (build-initrd (string-append #$output "/initrd")
-                        #:guile #$guile
-                        #:init #$init
-                        ;; Copy everything INIT refers to into the initrd.
-                        #:references-graphs '("closure")
-                        #:gzip (string-append #$gzip "/bin/gzip"))))
+            (mkdir #$output)
+            (build-initrd (string-append #$output "/initrd")
+                          #:guile #$guile
+                          #:init #$init
+                          ;; Copy everything INIT refers to into the initrd.
+                          #:references-graphs '("closure")
+                          #:gzip (string-append #$gzip "/bin/gzip")))))
 
-   (gexp->derivation name builder
-                     #:modules '((guix cpio)
-                                 (guix build utils)
-                                 (guix build store-copy)
-                                 (gnu build linux-initrd))
-                     #:references-graphs `(("closure" ,init)))))
+    (gexp->derivation name builder
+                      #:references-graphs `(("closure" ,init)))))
 
 (define (flat-linux-module-directory linux modules)
   "Return a flat directory containing the Linux kernel modules listed in
 MODULES and taken from LINUX."
   (define build-exp
-    #~(begin
-        (use-modules (ice-9 match) (ice-9 regex)
-                     (srfi srfi-1)
-                     (guix build utils)
-                     (gnu build linux-modules))
+    (with-imported-modules '((guix build utils)
+                             (guix elf)
+                             (gnu build linux-modules))
+      #~(begin
+          (use-modules (ice-9 match) (ice-9 regex)
+                       (srfi srfi-1)
+                       (guix build utils)
+                       (gnu build linux-modules))
 
-        (define (string->regexp str)
-          ;; Return a regexp that matches STR exactly.
-          (string-append "^" (regexp-quote str) "$"))
+          (define (string->regexp str)
+            ;; Return a regexp that matches STR exactly.
+            (string-append "^" (regexp-quote str) "$"))
 
-        (define module-dir
-          (string-append #$linux "/lib/modules"))
+          (define module-dir
+            (string-append #$linux "/lib/modules"))
 
-        (define (lookup module)
-          (let ((name (ensure-dot-ko module)))
-            (match (find-files module-dir (string->regexp name))
-              ((file)
-               file)
-              (()
-               (error "module not found" name module-dir))
-              ((_ ...)
-               (error "several modules by that name"
-                      name module-dir)))))
+          (define (lookup module)
+            (let ((name (ensure-dot-ko module)))
+              (match (find-files module-dir (string->regexp name))
+                ((file)
+                 file)
+                (()
+                 (error "module not found" name module-dir))
+                ((_ ...)
+                 (error "several modules by that name"
+                        name module-dir)))))
 
-        (define modules
-          (let ((modules (map lookup '#$modules)))
-            (append modules
-                    (recursive-module-dependencies modules
-                                                   #:lookup-module lookup))))
+          (define modules
+            (let ((modules (map lookup '#$modules)))
+              (append modules
+                      (recursive-module-dependencies modules
+                                                     #:lookup-module lookup))))
 
-        (mkdir #$output)
-        (for-each (lambda (module)
-                    (format #t "copying '~a'...~%" module)
-                    (copy-file module
-                               (string-append #$output "/"
-                                              (basename module))))
-                  (delete-duplicates modules))))
+          (mkdir #$output)
+          (for-each (lambda (module)
+                      (format #t "copying '~a'...~%" module)
+                      (copy-file module
+                                 (string-append #$output "/"
+                                                (basename module))))
+                    (delete-duplicates modules)))))
 
-  (gexp->derivation "linux-modules" build-exp
-                    #:modules '((guix build utils)
-                                (guix elf)
-                                (gnu build linux-modules))))
+  (gexp->derivation "linux-modules" build-exp))
 
 (define* (base-initrd file-systems
                       #:key
@@ -183,6 +180,7 @@ loaded at boot time in the order in which they appear."
       "usb-storage" "uas"                     ;for the installation image etc.
       "usbhid" "hid-generic" "hid-apple"      ;keyboards during early boot
       "dm-crypt" "xts" "serpent_generic" "wp512" ;for encrypted root partitions
+      "nvme"                                     ;for new SSD NVMe devices
       ,@(if (string-match "^(x86_64|i[3-6]86)-" (%current-system))
             '("pata_acpi" "pata_atiixp"    ;for ATA controllers
               "isci")                      ;for SAS controllers like Intel C602
@@ -225,38 +223,38 @@ loaded at boot time in the order in which they appear."
   (mlet %store-monad ((kodir (flat-linux-module-directory linux
                                                           linux-modules)))
     (expression->initrd
-     #~(begin
-         (use-modules (gnu build linux-boot)
-                      (guix build utils)
-                      (guix build bournish)   ;add the 'bournish' meta-command
-                      (srfi srfi-26)
+     (with-imported-modules '((guix build bournish)
+                              (guix build utils)
+                              (guix build syscalls)
+                              (gnu build linux-boot)
+                              (gnu build linux-modules)
+                              (gnu build file-systems)
+                              (guix elf))
+       #~(begin
+           (use-modules (gnu build linux-boot)
+                        (guix build utils)
+                        (guix build bournish) ;add the 'bournish' meta-command
+                        (srfi srfi-26)
 
-                      ;; FIXME: The following modules are for
-                      ;; LUKS-DEVICE-MAPPING.  We should instead propagate
-                      ;; this info via gexps.
-                      ((gnu build file-systems)
-                       #:select (find-partition-by-luks-uuid))
-                      (rnrs bytevectors))
+                        ;; FIXME: The following modules are for
+                        ;; LUKS-DEVICE-MAPPING.  We should instead propagate
+                        ;; this info via gexps.
+                        ((gnu build file-systems)
+                         #:select (find-partition-by-luks-uuid))
+                        (rnrs bytevectors))
 
-         (with-output-to-port (%make-void-port "w")
-           (lambda ()
-             (set-path-environment-variable "PATH" '("bin" "sbin")
-                                            '#$helper-packages)))
+           (with-output-to-port (%make-void-port "w")
+             (lambda ()
+               (set-path-environment-variable "PATH" '("bin" "sbin")
+                                              '#$helper-packages)))
 
-         (boot-system #:mounts '#$(map file-system->spec file-systems)
-                      #:pre-mount (lambda ()
-                                    (and #$@device-mapping-commands))
-                      #:linux-modules '#$linux-modules
-                      #:linux-module-directory '#$kodir
-                      #:qemu-guest-networking? #$qemu-networking?
-                      #:volatile-root? '#$volatile-root?))
-     #:name "base-initrd"
-     #:modules '((guix build bournish)
-                 (guix build utils)
-                 (guix build syscalls)
-                 (gnu build linux-boot)
-                 (gnu build linux-modules)
-                 (gnu build file-systems)
-                 (guix elf)))))
+           (boot-system #:mounts '#$(map file-system->spec file-systems)
+                        #:pre-mount (lambda ()
+                                      (and #$@device-mapping-commands))
+                        #:linux-modules '#$linux-modules
+                        #:linux-module-directory '#$kodir
+                        #:qemu-guest-networking? #$qemu-networking?
+                        #:volatile-root? '#$volatile-root?)))
+     #:name "base-initrd")))
 
 ;;; linux-initrd.scm ends here
diff --git a/gnu/system/locale.scm b/gnu/system/locale.scm
index f9d713e0cf..3bb9f950a8 100644
--- a/gnu/system/locale.scm
+++ b/gnu/system/locale.scm
@@ -154,10 +154,10 @@ data format changes between libc versions."
                                                                 #:libc libc))
                                      libcs)))
        (gexp->derivation "locale-multiple-versions"
-                         #~(begin
-                             (use-modules (guix build union))
-                             (union-build #$output (list #$@dirs)))
-                         #:modules '((guix build union))
+                         (with-imported-modules '((guix build union))
+                           #~(begin
+                               (use-modules (guix build union))
+                               (union-build #$output (list #$@dirs))))
                          #:local-build? #t
                          #:substitutable? #f)))))
 
diff --git a/gnu/system/mapped-devices.scm b/gnu/system/mapped-devices.scm
index 450b4737ac..732f73cc4b 100644
--- a/gnu/system/mapped-devices.scm
+++ b/gnu/system/mapped-devices.scm
@@ -85,9 +85,7 @@
        (modules `((rnrs bytevectors)              ;bytevector?
                   ((gnu build file-systems)
                    #:select (find-partition-by-luks-uuid))
-                  ,@%default-modules))
-       (imported-modules `((gnu build file-systems)
-                           ,@%default-imported-modules)))))))
+                  ,@%default-modules)))))))
 
 (define (device-mapping-service mapped-device)
   "Return a service that sets up @var{mapped-device}."
@@ -101,20 +99,22 @@
 (define (open-luks-device source target)
   "Return a gexp that maps SOURCE to TARGET as a LUKS device, using
 'cryptsetup'."
-  #~(let ((source #$source))
-      (zero? (system* (string-append #$cryptsetup "/sbin/cryptsetup")
-                      "open" "--type" "luks"
-
-                      ;; Note: We cannot use the "UUID=source" syntax here
-                      ;; because 'cryptsetup' implements it by searching the
-                      ;; udev-populated /dev/disk/by-id directory but udev may
-                      ;; be unavailable at the time we run this.
-                      (if (bytevector? source)
-                          (or (find-partition-by-luks-uuid source)
-                              (error "LUKS partition not found" source))
-                          source)
-
-                      #$target))))
+  (with-imported-modules '((gnu build file-systems)
+                           (guix build bournish))
+    #~(let ((source #$source))
+        (zero? (system* (string-append #$cryptsetup "/sbin/cryptsetup")
+                        "open" "--type" "luks"
+
+                        ;; Note: We cannot use the "UUID=source" syntax here
+                        ;; because 'cryptsetup' implements it by searching the
+                        ;; udev-populated /dev/disk/by-id directory but udev may
+                        ;; be unavailable at the time we run this.
+                        (if (bytevector? source)
+                            (or (find-partition-by-luks-uuid source)
+                                (error "LUKS partition not found" source))
+                            source)
+
+                        #$target)))))
 
 (define (close-luks-device source target)
   "Return a gexp that closes TARGET, a LUKS device."
diff --git a/gnu/system/pam.scm b/gnu/system/pam.scm
index 743039daf6..cd7a3427ed 100644
--- a/gnu/system/pam.scm
+++ b/gnu/system/pam.scm
@@ -23,6 +23,7 @@
   #:use-module (gnu services)
   #:use-module (ice-9 match)
   #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-9)
   #:use-module (srfi srfi-11)
   #:use-module (srfi srfi-26)
   #:use-module ((guix utils) #:select (%current-system))
@@ -38,6 +39,13 @@
             pam-entry-module
             pam-entry-arguments
 
+            pam-limits-entry
+            pam-limits-entry-domain
+            pam-limits-entry-type
+            pam-limits-entry-item
+            pam-limits-entry-value
+            pam-limits-entry->string
+
             pam-services->directory
             unix-pam-service
             base-pam-services
@@ -76,6 +84,59 @@
   (arguments  pam-entry-arguments        ; list of string-valued g-expressions
               (default '())))
 
+;; PAM limits entries are used by the pam_limits PAM module to set or override
+;; limits on system resources for user sessions.  The format is specified
+;; here: http://linux-pam.org/Linux-PAM-html/sag-pam_limits.html
+(define-record-type <pam-limits-entry>
+  (make-pam-limits-entry domain type item value)
+  pam-limits-entry?
+  (domain     pam-limits-entry-domain)   ; string
+  (type       pam-limits-entry-type)     ; symbol
+  (item       pam-limits-entry-item)     ; symbol
+  (value      pam-limits-entry-value))   ; symbol or number
+
+(define (pam-limits-entry domain type item value)
+  "Construct a pam-limits-entry ensuring that the provided values are valid."
+  (define (valid? value)
+    (case item
+      ((priority) (number? value))
+      ((nice)     (and (number? value)
+                       (>= value -20)
+                       (<= value 19)))
+      (else       (or (and (number? value)
+                           (>= value -1))
+                      (member value '(unlimited infinity))))))
+  (define items
+    (list 'core      'data       'fsize
+          'memlock   'nofile     'rss
+          'stack     'cpu        'nproc
+          'as        'maxlogins  'maxsyslogins
+          'priority  'locks      'sigpending
+          'msgqueue  'nice       'rtprio))
+  (when (not (member type '(hard soft both)))
+    (error "invalid limit type" type))
+  (when (not (member item items))
+    (error "invalid limit item" item))
+  (when (not (valid? value))
+    (error "invalid limit value" value))
+  (make-pam-limits-entry domain type item value))
+
+(define (pam-limits-entry->string entry)
+  "Convert a pam-limits-entry record to a string."
+  (match entry
+    (($ <pam-limits-entry> domain type item value)
+     (string-join (list domain
+                        (if (eq? type 'both)
+                            "-"
+                            (symbol->string type))
+                        (symbol->string item)
+                        (cond
+                         ((symbol? value)
+                          (symbol->string value))
+                         (else
+                          (number->string value))))
+                  "	"))))
+
 (define (pam-service->configuration service)
   "Return the derivation building the configuration file for SERVICE, to be
 dumped in /etc/pam.d/NAME, where NAME is the name of SERVICE."
diff --git a/gnu/system/shadow.scm b/gnu/system/shadow.scm
index f09e8c24f2..c3948900eb 100644
--- a/gnu/system/shadow.scm
+++ b/gnu/system/shadow.scm
@@ -126,17 +126,19 @@
          (name "nobody")
          (uid 65534)
          (group "nogroup")
-         (home-directory "/var/empty")
+         (shell #~(string-append #$shadow "/sbin/nologin"))
+         (home-directory "/nonexistent")
          (system? #t))))
 
 (define (default-skeletons)
   "Return the default skeleton files for /etc/skel.  These files are copied by
 'useradd' in the home directory of newly created user accounts."
   (define copy-guile-wm
-    #~(begin
-        (use-modules (guix build utils))
-        (copy-file (car (find-files #$guile-wm "wm-init-sample.scm"))
-                   #$output)))
+    (with-imported-modules '((guix build utils))
+      #~(begin
+          (use-modules (guix build utils))
+          (copy-file (car (find-files #$guile-wm "wm-init-sample.scm"))
+                     #$output))))
 
   (let ((profile (plain-file "bash_profile" "\
 # Honor per-interactive-shell startup file
@@ -170,8 +172,7 @@ alias ll='ls -l'\n"))
         (zlogin    (plain-file "zlogin" "\
 # Honor system-wide environment variables
 source /etc/profile\n"))
-        (guile-wm  (computed-file "guile-wm" copy-guile-wm
-                                  #:modules '((guix build utils))))
+        (guile-wm  (computed-file "guile-wm" copy-guile-wm))
         (xdefaults (plain-file "Xdefaults" "\
 XTerm*utf8: always
 XTerm*metaSendsEscape: true\n"))
@@ -188,22 +189,22 @@ set debug-file-directory ~/.guix-profile/lib/debug\n")))
 (define (skeleton-directory skeletons)
   "Return a directory containing SKELETONS, a list of name/derivation tuples."
   (computed-file "skel"
-                 #~(begin
-                     (use-modules (ice-9 match)
-                                  (guix build utils))
-
-                     (mkdir #$output)
-                     (chdir #$output)
-
-                     ;; Note: copy the skeletons instead of symlinking
-                     ;; them like 'file-union' does, because 'useradd'
-                     ;; would just copy the symlinks as is.
-                     (for-each (match-lambda
-                                 ((target source)
-                                  (copy-recursively source target)))
-                               '#$skeletons)
-                     #t)
-                 #:modules '((guix build utils))))
+                 (with-imported-modules '((guix build utils))
+                   #~(begin
+                       (use-modules (ice-9 match)
+                                    (guix build utils))
+
+                       (mkdir #$output)
+                       (chdir #$output)
+
+                       ;; Note: copy the skeletons instead of symlinking
+                       ;; them like 'file-union' does, because 'useradd'
+                       ;; would just copy the symlinks as is.
+                       (for-each (match-lambda
+                                   ((target source)
+                                    (copy-recursively source target)))
+                                 '#$skeletons)
+                       #t))))
 
 (define (assert-valid-users/groups users groups)
   "Raise an error if USERS refer to groups not listed in GROUPS."
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index 676e89df98..c31e3a80ef 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -90,6 +90,21 @@
           (options "trans=virtio")
           (check? #f))))
 
+(define %vm-module-closure
+  ;; The closure of (gnu build vm), roughly.
+  ;; FIXME: Compute it automatically.
+  '((gnu build vm)
+    (gnu build install)
+    (gnu build linux-boot)
+    (gnu build linux-modules)
+    (gnu build file-systems)
+    (guix elf)
+    (guix records)
+    (guix build utils)
+    (guix build syscalls)
+    (guix build bournish)
+    (guix build store-copy)))
+
 (define* (expression->derivation-in-linux-vm name exp
                                              #:key
                                              (system (%current-system))
@@ -97,18 +112,6 @@
                                              initrd
                                              (qemu qemu-minimal)
                                              (env-vars '())
-                                             (modules
-                                              '((gnu build vm)
-                                                (gnu build install)
-                                                (gnu build linux-boot)
-                                                (gnu build linux-modules)
-                                                (gnu build file-systems)
-                                                (guix elf)
-                                                (guix records)
-                                                (guix build utils)
-                                                (guix build syscalls)
-                                                (guix build bournish)
-                                                (guix build store-copy)))
                                              (guile-for-build
                                               (%guile-for-build))
 
@@ -128,23 +131,13 @@ When MAKE-DISK-IMAGE? is true, then create a QEMU disk image of type
 DISK-IMAGE-FORMAT (e.g., 'qcow2' or 'raw'), of DISK-IMAGE-SIZE bytes and
 return it.
 
-MODULES is the set of modules imported in the execution environment of EXP.
-
 When REFERENCES-GRAPHS is true, it must be a list of file name/store path
 pairs, as for `derivation'.  The files containing the reference graphs are
 made available under the /xchg CIFS share."
   (mlet* %store-monad
-      ((module-dir   (imported-modules modules))
-       (compiled     (compiled-modules modules))
-       (user-builder (gexp->file "builder-in-linux-vm" exp))
+      ((user-builder (gexp->file "builder-in-linux-vm" exp))
        (loader       (gexp->file "linux-vm-loader"
-                                 #~(begin
-                                     (set! %load-path
-                                           (cons #$module-dir %load-path))
-                                     (set! %load-compiled-path
-                                           (cons #$compiled
-                                                 %load-compiled-path))
-                                     (primitive-load #$user-builder))))
+                                 #~(primitive-load #$user-builder)))
        (coreutils -> (canonical-package coreutils))
        (initrd       (if initrd                   ; use the default initrd?
                          (return initrd)
@@ -155,34 +148,34 @@ made available under the /xchg CIFS share."
 
     (define builder
       ;; Code that launches the VM that evaluates EXP.
-      #~(begin
-          (use-modules (guix build utils)
-                       (gnu build vm))
-
-          (let ((inputs  '#$(list qemu coreutils))
-                (linux   (string-append #$linux "/bzImage"))
-                (initrd  (string-append #$initrd "/initrd"))
-                (loader  #$loader)
-                (graphs  '#$(match references-graphs
-                              (((graph-files . _) ...) graph-files)
-                              (_ #f))))
-
-            (set-path-environment-variable "PATH" '("bin") inputs)
-
-            (load-in-linux-vm loader
-                              #:output #$output
-                              #:linux linux #:initrd initrd
-                              #:memory-size #$memory-size
-                              #:make-disk-image? #$make-disk-image?
-                              #:disk-image-format #$disk-image-format
-                              #:disk-image-size #$disk-image-size
-                              #:references-graphs graphs))))
+      (with-imported-modules %vm-module-closure
+        #~(begin
+            (use-modules (guix build utils)
+                         (gnu build vm))
+
+            (let ((inputs  '#$(list qemu coreutils))
+                  (linux   (string-append #$linux "/bzImage"))
+                  (initrd  (string-append #$initrd "/initrd"))
+                  (loader  #$loader)
+                  (graphs  '#$(match references-graphs
+                                (((graph-files . _) ...) graph-files)
+                                (_ #f))))
+
+              (set-path-environment-variable "PATH" '("bin") inputs)
+
+              (load-in-linux-vm loader
+                                #:output #$output
+                                #:linux linux #:initrd initrd
+                                #:memory-size #$memory-size
+                                #:make-disk-image? #$make-disk-image?
+                                #:disk-image-format #$disk-image-format
+                                #:disk-image-size #$disk-image-size
+                                #:references-graphs graphs)))))
 
     (gexp->derivation name builder
                       ;; TODO: Require the "kvm" feature.
                       #:system system
                       #:env-vars env-vars
-                      #:modules modules
                       #:guile-for-build guile-for-build
                       #:references-graphs references-graphs)))
 
@@ -212,45 +205,46 @@ register INPUTS in the store database of the image so that Guix can be used in
 the image."
   (expression->derivation-in-linux-vm
    name
-   #~(begin
-       (use-modules (gnu build vm)
-                    (guix build utils))
-
-       (let ((inputs
-              '#$(append (list qemu parted grub e2fsprogs)
-                         (map canonical-package
-                              (list sed grep coreutils findutils gawk))
-                         (if register-closures? (list guix) '())))
-
-             ;; This variable is unused but allows us to add INPUTS-TO-COPY
-             ;; as inputs.
-             (to-register
-              '#$(map (match-lambda
-                       ((name thing) thing)
-                       ((name thing output) `(,thing ,output)))
-                      inputs)))
-
-         (set-path-environment-variable "PATH" '("bin" "sbin") inputs)
-
-         (let* ((graphs     '#$(match inputs
-                                 (((names . _) ...)
-                                  names)))
-                (initialize (root-partition-initializer
-                             #:closures graphs
-                             #:copy-closures? #$copy-inputs?
-                             #:register-closures? #$register-closures?
-                             #:system-directory #$os-derivation))
-                (partitions (list (partition
-                                   (size #$(- disk-image-size
-                                              (* 10 (expt 2 20))))
-                                   (label #$file-system-label)
-                                   (file-system #$file-system-type)
-                                   (bootable? #t)
-                                   (initializer initialize)))))
-           (initialize-hard-disk "/dev/vda"
-                                 #:partitions partitions
-                                 #:grub.cfg #$grub-configuration)
-           (reboot))))
+   (with-imported-modules %vm-module-closure
+     #~(begin
+         (use-modules (gnu build vm)
+                      (guix build utils))
+
+         (let ((inputs
+                '#$(append (list qemu parted grub e2fsprogs)
+                           (map canonical-package
+                                (list sed grep coreutils findutils gawk))
+                           (if register-closures? (list guix) '())))
+
+               ;; This variable is unused but allows us to add INPUTS-TO-COPY
+               ;; as inputs.
+               (to-register
+                '#$(map (match-lambda
+                          ((name thing) thing)
+                          ((name thing output) `(,thing ,output)))
+                        inputs)))
+
+           (set-path-environment-variable "PATH" '("bin" "sbin") inputs)
+
+           (let* ((graphs     '#$(match inputs
+                                   (((names . _) ...)
+                                    names)))
+                  (initialize (root-partition-initializer
+                               #:closures graphs
+                               #:copy-closures? #$copy-inputs?
+                               #:register-closures? #$register-closures?
+                               #:system-directory #$os-derivation))
+                  (partitions (list (partition
+                                     (size #$(- disk-image-size
+                                                (* 10 (expt 2 20))))
+                                     (label #$file-system-label)
+                                     (file-system #$file-system-type)
+                                     (bootable? #t)
+                                     (initializer initialize)))))
+             (initialize-hard-disk "/dev/vda"
+                                   #:partitions partitions
+                                   #:grub.cfg #$grub-configuration)
+             (reboot)))))
    #:system system
    #:make-disk-image? #t
    #:disk-image-size disk-image-size
diff --git a/gnu/tests.scm b/gnu/tests.scm
index ea779ed6f0..8abe6c608b 100644
--- a/gnu/tests.scm
+++ b/gnu/tests.scm
@@ -27,7 +27,13 @@
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-9 gnu)
   #:use-module (ice-9 match)
-  #:export (marionette-service-type
+  #:export (marionette-configuration
+            marionette-configuration?
+            marionette-configuration-device
+            marionette-configuration-imported-modules
+            marionette-configuration-requirements
+
+            marionette-service-type
             marionette-operating-system
             define-os-with-source
 
@@ -50,81 +56,93 @@
 ;;;
 ;;; Code:
 
-(define (marionette-shepherd-service imported-modules)
+(define-record-type* <marionette-configuration>
+  marionette-configuration make-marionette-configuration
+  marionette-configuration?
+  (device           marionette-configuration-device ;string
+                    (default "/dev/hvc0"))
+  (imported-modules marionette-configuration-imported-modules
+                    (default '()))
+  (requirements     marionette-configuration-requirements ;list of symbols
+                    (default '())))
+
+(define (marionette-shepherd-service config)
   "Return the Shepherd service for the marionette REPL"
-  (define device
-    "/dev/hvc0")
-
-  (list (shepherd-service
-         (provision '(marionette))
-         (requirement '(udev))                    ;so that DEVICE is available
-         (modules '((ice-9 match)
-                    (srfi srfi-9 gnu)
-                    (guix build syscalls)
-                    (rnrs bytevectors)))
-         (imported-modules `((guix build syscalls)
-                             ,@imported-modules))
-         (start
-          #~(lambda ()
-              (define (clear-echo termios)
-                (set-field termios (termios-local-flags)
-                           (logand (lognot (local-flags ECHO))
-                                   (termios-local-flags termios))))
-
-              (define (self-quoting? x)
-                (letrec-syntax ((one-of (syntax-rules ()
-                                          ((_) #f)
-                                          ((_ pred rest ...)
-                                           (or (pred x)
-                                               (one-of rest ...))))))
-                  (one-of symbol? string? pair? null? vector?
-                          bytevector? number? boolean?)))
-
-              (match (primitive-fork)
-                (0
-                 (dynamic-wind
-                   (const #t)
-                   (lambda ()
-                     (let* ((repl    (open-file #$device "r+0"))
-                            (termios (tcgetattr (fileno repl)))
-                            (console (open-file "/dev/console" "r+0")))
-                       ;; Don't echo input back.
-                       (tcsetattr (fileno repl) (tcsetattr-action TCSANOW)
-                                  (clear-echo termios))
-
-                       ;; Redirect output to the console.
-                       (close-fdes 1)
-                       (close-fdes 2)
-                       (dup2 (fileno console) 1)
-                       (dup2 (fileno console) 2)
-                       (close-port console)
-
-                       (display 'ready repl)
-                       (let loop ()
-                         (newline repl)
-
-                         (match (read repl)
-                           ((? eof-object?)
-                            (primitive-exit 0))
-                           (expr
-                            (catch #t
-                              (lambda ()
-                                (let ((result (primitive-eval expr)))
-                                  (write (if (self-quoting? result)
-                                             result
-                                             (object->string result))
-                                         repl)))
-                              (lambda (key . args)
-                                (print-exception (current-error-port)
-                                                 (stack-ref (make-stack #t) 1)
-                                                 key args)
-                                (write #f repl)))))
-                         (loop))))
-                   (lambda ()
-                     (primitive-exit 1))))
-                (pid
-                 pid))))
-         (stop #~(make-kill-destructor)))))
+  (match config
+    (($ <marionette-configuration> device imported-modules requirement)
+     (list (shepherd-service
+            (provision '(marionette))
+
+            ;; Always depend on UDEV so that DEVICE is available.
+            (requirement `(udev ,@requirement))
+
+            (modules '((ice-9 match)
+                       (srfi srfi-9 gnu)
+                       (guix build syscalls)
+                       (rnrs bytevectors)))
+            (start
+             (with-imported-modules `((guix build syscalls)
+                                      ,@imported-modules)
+               #~(lambda ()
+                   (define (clear-echo termios)
+                     (set-field termios (termios-local-flags)
+                                (logand (lognot (local-flags ECHO))
+                                        (termios-local-flags termios))))
+
+                   (define (self-quoting? x)
+                     (letrec-syntax ((one-of (syntax-rules ()
+                                               ((_) #f)
+                                               ((_ pred rest ...)
+                                                (or (pred x)
+                                                    (one-of rest ...))))))
+                       (one-of symbol? string? pair? null? vector?
+                               bytevector? number? boolean?)))
+
+                   (match (primitive-fork)
+                     (0
+                      (dynamic-wind
+                        (const #t)
+                        (lambda ()
+                          (let* ((repl    (open-file #$device "r+0"))
+                                 (termios (tcgetattr (fileno repl)))
+                                 (console (open-file "/dev/console" "r+0")))
+                            ;; Don't echo input back.
+                            (tcsetattr (fileno repl) (tcsetattr-action TCSANOW)
+                                       (clear-echo termios))
+
+                            ;; Redirect output to the console.
+                            (close-fdes 1)
+                            (close-fdes 2)
+                            (dup2 (fileno console) 1)
+                            (dup2 (fileno console) 2)
+                            (close-port console)
+
+                            (display 'ready repl)
+                            (let loop ()
+                              (newline repl)
+
+                              (match (read repl)
+                                ((? eof-object?)
+                                 (primitive-exit 0))
+                                (expr
+                                 (catch #t
+                                   (lambda ()
+                                     (let ((result (primitive-eval expr)))
+                                       (write (if (self-quoting? result)
+                                                  result
+                                                  (object->string result))
+                                              repl)))
+                                   (lambda (key . args)
+                                     (print-exception (current-error-port)
+                                                      (stack-ref (make-stack #t) 1)
+                                                      key args)
+                                     (write #f repl)))))
+                              (loop))))
+                        (lambda ()
+                          (primitive-exit 1))))
+                     (pid
+                      pid)))))
+            (stop #~(make-kill-destructor)))))))
 
 (define marionette-service-type
   ;; This is the type of the "marionette" service, allowing a guest system to
@@ -136,12 +154,19 @@
                                           marionette-shepherd-service)))))
 
 (define* (marionette-operating-system os
-                                      #:key (imported-modules '()))
-  "Return a marionetteed variant of OS such that OS can be used as a marionette
-in a virtual machine--i.e., controlled from the host system."
+                                      #:key
+                                      (imported-modules '())
+                                      (requirements '()))
+  "Return a marionetteed variant of OS such that OS can be used as a
+marionette in a virtual machine--i.e., controlled from the host system.  The
+marionette service in the guest is started after the Shepherd services listed
+in REQUIREMENTS."
   (operating-system
     (inherit os)
-    (services (cons (service marionette-service-type imported-modules)
+    (services (cons (service marionette-service-type
+                             (marionette-configuration
+                              (requirements requirements)
+                              (imported-modules imported-modules)))
                     (operating-system-user-services os)))))
 
 (define-syntax define-os-with-source
diff --git a/gnu/tests/base.scm b/gnu/tests/base.scm
index 4fe779802b..479403e5c1 100644
--- a/gnu/tests/base.scm
+++ b/gnu/tests/base.scm
@@ -22,10 +22,15 @@
   #:use-module (gnu system grub)
   #:use-module (gnu system file-systems)
   #:use-module (gnu system shadow)
+  #:use-module (gnu system nss)
   #:use-module (gnu system vm)
   #:use-module (gnu services)
+  #:use-module (gnu services base)
+  #:use-module (gnu services dbus)
+  #:use-module (gnu services avahi)
   #:use-module (gnu services mcron)
   #:use-module (gnu services shepherd)
+  #:use-module (gnu services networking)
   #:use-module (guix gexp)
   #:use-module (guix store)
   #:use-module (guix monads)
@@ -33,7 +38,8 @@
   #:use-module (srfi srfi-1)
   #:export (run-basic-test
             %test-basic-os
-            %test-mcron))
+            %test-mcron
+            %test-nss-mdns))
 
 (define %simple-os
   (operating-system
@@ -64,104 +70,123 @@
 using COMMAND, a gexp that evaluates to a list of strings.  Compare some
 properties of running system to what's declared in OS, an <operating-system>."
   (define test
-    #~(begin
-        (use-modules (gnu build marionette)
-                     (srfi srfi-1)
-                     (srfi srfi-26)
-                     (srfi srfi-64)
-                     (ice-9 match))
-
-        (define marionette
-          (make-marionette #$command))
-
-        (mkdir #$output)
-        (chdir #$output)
-
-        (test-begin "basic")
-
-        (test-assert "uname"
-          (match (marionette-eval '(uname) marionette)
-            (#("Linux" host-name version _ architecture)
-             (and (string=? host-name
-                            #$(operating-system-host-name os))
-                  (string-prefix? #$(package-version
-                                     (operating-system-kernel os))
-                                  version)
-                  (string-prefix? architecture %host-type)))))
-
-        (test-assert "shell and user commands"
-          ;; Is everything in $PATH?
-          (zero? (marionette-eval '(system "
+    (with-imported-modules '((gnu build marionette))
+      #~(begin
+          (use-modules (gnu build marionette)
+                       (srfi srfi-64)
+                       (ice-9 match))
+
+          (define marionette
+            (make-marionette #$command))
+
+          (mkdir #$output)
+          (chdir #$output)
+
+          (test-begin "mcron")
+
+          (test-assert "uname"
+            (match (marionette-eval '(uname) marionette)
+              (#("Linux" host-name version _ architecture)
+               (and (string=? host-name
+                              #$(operating-system-host-name os))
+                    (string-prefix? #$(package-version
+                                       (operating-system-kernel os))
+                                    version)
+                    (string-prefix? architecture %host-type)))))
+
+          (test-assert "shell and user commands"
+            ;; Is everything in $PATH?
+            (zero? (marionette-eval '(system "
 . /etc/profile
 set -e -x
 guix --version
 ls --version
 grep --version
 info --version")
-                                  marionette)))
-
-        (test-assert "accounts"
-          (let ((users (marionette-eval '(begin
-                                           (use-modules (ice-9 match))
-                                           (let loop ((result '()))
-                                             (match (getpw)
-                                               (#f (reverse result))
-                                               (x  (loop (cons x result))))))
-                                        marionette)))
-            (lset= string=?
-                   (map passwd:name users)
-                   (list
-                    #$@(map user-account-name
-                            (operating-system-user-accounts os))))))
-
-        (test-assert "shepherd services"
-          (let ((services (marionette-eval '(begin
-                                              (use-modules (gnu services herd))
-                                              (call-with-values current-services
-                                                append))
-                                           marionette)))
-            (lset= eq?
-                   (pk 'services services)
-                   '(root #$@(operating-system-shepherd-service-names os)))))
-
-        (test-equal "login on tty1"
-          "root\n"
-          (begin
-            (marionette-control "sendkey ctrl-alt-f1" marionette)
-            ;; Wait for the 'term-tty1' service to be running (using
-            ;; 'start-service' is the simplest and most reliable way to do
-            ;; that.)
+                                    marionette)))
+
+          (test-assert "accounts"
+            (let ((users (marionette-eval '(begin
+                                             (use-modules (ice-9 match))
+                                             (let loop ((result '()))
+                                               (match (getpw)
+                                                 (#f (reverse result))
+                                                 (x  (loop (cons x result))))))
+                                          marionette)))
+              (lset= string=?
+                     (map passwd:name users)
+                     (list
+                      #$@(map user-account-name
+                              (operating-system-user-accounts os))))))
+
+          (test-assert "shepherd services"
+            (let ((services (marionette-eval '(begin
+                                                (use-modules (gnu services herd))
+                                                (call-with-values current-services
+                                                  append))
+                                             marionette)))
+              (lset= eq?
+                     (pk 'services services)
+                     '(root #$@(operating-system-shepherd-service-names os)))))
+
+          (test-equal "login on tty1"
+            "root\n"
+            (begin
+              (marionette-control "sendkey ctrl-alt-f1" marionette)
+              ;; Wait for the 'term-tty1' service to be running (using
+              ;; 'start-service' is the simplest and most reliable way to do
+              ;; that.)
+              (marionette-eval
+               '(begin
+                  (use-modules (gnu services herd))
+                  (start-service 'term-tty1))
+               marionette)
+
+              ;; Now we can type.
+              (marionette-type "root\n\nid -un > logged-in\n" marionette)
+
+              ;; It can take a while before the shell commands are executed.
+              (let loop ((i 0))
+                (unless (or (file-exists? "/root/logged-in") (> i 15))
+                  (sleep 1)
+                  (loop (+ i 1))))
+              (marionette-eval '(use-modules (rnrs io ports)) marionette)
+              (marionette-eval '(call-with-input-file "/root/logged-in"
+                                  get-string-all)
+                               marionette)))
+
+          (test-assert "host name resolution"
+            (match (marionette-eval
+                    '(begin
+                       ;; Wait for nscd or our requests go through it.
+                       (use-modules (gnu services herd))
+                       (start-service 'nscd)
+
+                       (list (getaddrinfo "localhost")
+                             (getaddrinfo #$(operating-system-host-name os))))
+                    marionette)
+              ((((? vector?) ..1) ((? vector?) ..1))
+               #t)
+              (x
+               (pk 'failure x #f))))
+
+          (test-equal "host not found"
+            #f
             (marionette-eval
-             '(begin
-                (use-modules (gnu services herd))
-                (start-service 'term-tty1))
-             marionette)
-
-            ;; Now we can type.
-            (marionette-type "root\n\nid -un > logged-in\n" marionette)
-
-            ;; It can take a while before the shell commands are executed.
-            (let loop ((i 0))
-              (unless (or (file-exists? "/root/logged-in") (> i 15))
-                (sleep 1)
-                (loop (+ i 1))))
-            (marionette-eval '(use-modules (rnrs io ports)) marionette)
-            (marionette-eval '(call-with-input-file "/root/logged-in"
-                                get-string-all)
-                             marionette)))
-
-        (test-assert "screendump"
-          (begin
-            (marionette-control (string-append "screendump " #$output
-                                               "/tty1.ppm")
-                                marionette)
-            (file-exists? "tty1.ppm")))
-
-        (test-end)
-        (exit (= (test-runner-fail-count (test-runner-current)) 0))))
-
-  (gexp->derivation name test
-                    #:modules '((gnu build marionette))))
+             '(false-if-exception (getaddrinfo "does-not-exist"))
+             marionette))
+
+          (test-assert "screendump"
+            (begin
+              (marionette-control (string-append "screendump " #$output
+                                                 "/tty1.ppm")
+                                  marionette)
+              (file-exists? "tty1.ppm")))
+
+          (test-end)
+          (exit (= (test-runner-fail-count (test-runner-current)) 0)))))
+
+  (gexp->derivation name test))
 
 (define %test-basic-os
   (system-test
@@ -216,70 +241,207 @@ functionality tests.")
                        (command (system-qemu-image/shared-store-script
                                  os #:graphic? #f)))
     (define test
-      #~(begin
-          (use-modules (gnu build marionette)
-                       (srfi srfi-64)
-                       (ice-9 match))
-
-          (define marionette
-            (make-marionette (list #$command)))
-
-          (define (wait-for-file file)
-            ;; Wait until FILE exists in the guest; 'read' its content and
-            ;; return it.
-            (marionette-eval
-             `(let loop ((i 10))
-                (cond ((file-exists? ,file)
-                       (call-with-input-file ,file read))
-                      ((> i 0)
-                       (sleep 1)
-                       (loop (- i 1)))
-                      (else
-                       (error "file didn't show up" ,file))))
-             marionette))
-
-          (mkdir #$output)
-          (chdir #$output)
-
-          (test-begin "mcron")
-
-          (test-eq "service running"
-            'running!
-            (marionette-eval
-             '(begin
-                (use-modules (gnu services herd))
-                (start-service 'mcron)
-                'running!)
-             marionette))
-
-          ;; Make sure root's mcron job runs, has its cwd set to "/root", and
-          ;; runs with the right UID/GID.
-          (test-equal "root's job"
-            '(0 0)
-            (wait-for-file "/root/witness"))
-
-          ;; Likewise for Alice's job.  We cannot know what its GID is since
-          ;; it's chosen by 'groupadd', but it's strictly positive.
-          (test-assert "alice's job"
-            (match (wait-for-file "/home/alice/witness")
-              ((1000 gid)
-               (>= gid 100))))
-
-          ;; Last, the job that uses a command; allows us to test whether
-          ;; $PATH is sane.  (Note that 'marionette-eval' stringifies objects
-          ;; that don't have a read syntax, hence the string.)
-          (test-equal "root's job with command"
-            "#<eof>"
-            (wait-for-file "/root/witness-touch"))
-
-          (test-end)
-          (exit (= (test-runner-fail-count (test-runner-current)) 0))))
-
-    (gexp->derivation name test
-                      #:modules '((gnu build marionette)))))
+      (with-imported-modules '((gnu build marionette))
+        #~(begin
+            (use-modules (gnu build marionette)
+                         (srfi srfi-64)
+                         (ice-9 match))
+
+            (define marionette
+              (make-marionette (list #$command)))
+
+            (define (wait-for-file file)
+              ;; Wait until FILE exists in the guest; 'read' its content and
+              ;; return it.
+              (marionette-eval
+               `(let loop ((i 10))
+                  (cond ((file-exists? ,file)
+                         (call-with-input-file ,file read))
+                        ((> i 0)
+                         (sleep 1)
+                         (loop (- i 1)))
+                        (else
+                         (error "file didn't show up" ,file))))
+               marionette))
+
+            (mkdir #$output)
+            (chdir #$output)
+
+            (test-begin "mcron")
+
+            (test-eq "service running"
+              'running!
+              (marionette-eval
+               '(begin
+                  (use-modules (gnu services herd))
+                  (start-service 'mcron)
+                  'running!)
+               marionette))
+
+            ;; Make sure root's mcron job runs, has its cwd set to "/root", and
+            ;; runs with the right UID/GID.
+            (test-equal "root's job"
+              '(0 0)
+              (wait-for-file "/root/witness"))
+
+            ;; Likewise for Alice's job.  We cannot know what its GID is since
+            ;; it's chosen by 'groupadd', but it's strictly positive.
+            (test-assert "alice's job"
+              (match (wait-for-file "/home/alice/witness")
+                ((1000 gid)
+                 (>= gid 100))))
+
+            ;; Last, the job that uses a command; allows us to test whether
+            ;; $PATH is sane.  (Note that 'marionette-eval' stringifies objects
+            ;; that don't have a read syntax, hence the string.)
+            (test-equal "root's job with command"
+              "#<eof>"
+              (wait-for-file "/root/witness-touch"))
+
+            (test-end)
+            (exit (= (test-runner-fail-count (test-runner-current)) 0)))))
+
+    (gexp->derivation name test)))
 
 (define %test-mcron
   (system-test
    (name "mcron")
    (description "Make sure the mcron service works as advertised.")
    (value (run-mcron-test name))))
+
+
+;;;
+;;; Avahi and NSS-mDNS.
+;;;
+
+(define %avahi-os
+  (operating-system
+    (inherit %simple-os)
+    (name-service-switch %mdns-host-lookup-nss)
+    (services (cons* (avahi-service #:debug? #t)
+                     (dbus-service)
+                     (dhcp-client-service)        ;needed for multicast
+
+                     ;; Enable heavyweight debugging output.
+                     (modify-services (operating-system-user-services
+                                       %simple-os)
+                       (nscd-service-type config
+                                          => (nscd-configuration
+                                              (inherit config)
+                                              (debug-level 3)
+                                              (log-file "/dev/console")))
+                       (syslog-service-type config
+                                            =>
+                                            (plain-file
+                                             "syslog.conf"
+                                             "*.* /dev/console\n")))))))
+
+(define (run-nss-mdns-test)
+  ;; Test resolution of '.local' names via libc.  Start the marionette service
+  ;; *after* nscd.  Failing to do that, libc will try to connect to nscd,
+  ;; fail, then never try again (see '__nss_not_use_nscd_hosts' in libc),
+  ;; leading to '.local' resolution failures.
+  (mlet* %store-monad ((os -> (marionette-operating-system
+                               %avahi-os
+                               #:requirements '(nscd)
+                               #:imported-modules '((gnu services herd)
+                                                    (guix combinators))))
+                       (run   (system-qemu-image/shared-store-script
+                               os #:graphic? #f)))
+    (define mdns-host-name
+      (string-append (operating-system-host-name os)
+                     ".local"))
+
+    (define test
+      (with-imported-modules '((gnu build marionette))
+        #~(begin
+            (use-modules (gnu build marionette)
+                         (srfi srfi-1)
+                         (srfi srfi-64)
+                         (ice-9 match))
+
+            (define marionette
+              (make-marionette (list #$run)))
+
+            (mkdir #$output)
+            (chdir #$output)
+
+            (test-begin "avahi")
+
+            (test-assert "wait for services"
+              (marionette-eval
+               '(begin
+                  (use-modules (gnu services herd))
+
+                  (start-service 'nscd)
+
+                  ;; XXX: Work around a race condition in nscd: nscd creates its
+                  ;; PID file before it is listening on its socket.
+                  (let ((sock (socket PF_UNIX SOCK_STREAM 0)))
+                    (let try ()
+                      (catch 'system-error
+                        (lambda ()
+                          (connect sock AF_UNIX "/var/run/nscd/socket")
+                          (close-port sock)
+                          (format #t "nscd is ready~%"))
+                        (lambda args
+                          (format #t "waiting for nscd...~%")
+                          (usleep 500000)
+                          (try)))))
+
+                  ;; Wait for the other useful things.
+                  (start-service 'avahi-daemon)
+                  (start-service 'networking)
+
+                  #t)
+               marionette))
+
+            (test-equal "avahi-resolve-host-name"
+              0
+              (marionette-eval
+               '(system*
+                 "/run/current-system/profile/bin/avahi-resolve-host-name"
+                 "-v" #$mdns-host-name)
+               marionette))
+
+            (test-equal "avahi-browse"
+              0
+              (marionette-eval
+               '(system* "avahi-browse" "-avt")
+               marionette))
+
+            (test-assert "getaddrinfo .local"
+              ;; Wait for the 'avahi-daemon' service and perform a resolution.
+              (match (marionette-eval
+                      '(getaddrinfo #$mdns-host-name)
+                      marionette)
+                (((? vector? addrinfos) ..1)
+                 (pk 'getaddrinfo addrinfos)
+                 (and (any (lambda (ai)
+                             (= AF_INET (addrinfo:fam ai)))
+                           addrinfos)
+                      (any (lambda (ai)
+                             (= AF_INET6 (addrinfo:fam ai)))
+                           addrinfos)))))
+
+            (test-assert "gethostbyname .local"
+              (match (pk 'gethostbyname
+                         (marionette-eval '(gethostbyname #$mdns-host-name)
+                                          marionette))
+                ((? vector? result)
+                 (and (string=? (hostent:name result) #$mdns-host-name)
+                      (= (hostent:addrtype result) AF_INET)))))
+
+
+            (test-end)
+            (exit (= (test-runner-fail-count (test-runner-current)) 0)))))
+
+    (gexp->derivation "nss-mdns" test)))
+
+(define %test-nss-mdns
+  (system-test
+   (name "nss-mdns")
+   (description
+    "Test Avahi's multicast-DNS implementation, and in particular, test its
+glibc name service switch (NSS) module.")
+   (value (run-nss-mdns-test))))
diff --git a/gnu/tests/install.scm b/gnu/tests/install.scm
index 5d893deb4c..4e79fdb294 100644
--- a/gnu/tests/install.scm
+++ b/gnu/tests/install.scm
@@ -32,7 +32,8 @@
   #:use-module (guix grafts)
   #:use-module (guix gexp)
   #:use-module (guix utils)
-  #:export (%test-installed-os))
+  #:export (%test-installed-os
+            %test-encrypted-os))
 
 ;;; Commentary:
 ;;;
@@ -66,8 +67,9 @@
                   (home-directory "/home/alice"))
                  %base-user-accounts))
     (services (cons (service marionette-service-type
-                             '((gnu services herd)
-                               (guix combinators)))
+                             (marionette-configuration
+                              (imported-modules '((gnu services herd)
+                                                  (guix combinators)))))
                     %base-services))))
 
 (define (operating-system-with-current-guix os)
@@ -90,7 +92,33 @@
 
 (define MiB (expt 2 20))
 
-(define* (run-install #:key
+(define %simple-installation-script
+  ;; Shell script of a simple installation.
+  "\
+. /etc/profile
+set -e -x
+guix --version
+
+export GUIX_BUILD_OPTIONS=--no-grafts
+guix build isc-dhcp
+parted --script /dev/vdb mklabel gpt \\
+  mkpart primary ext2 1M 3M \\
+  mkpart primary ext2 3M 1G \\
+  set 1 boot on \\
+  set 1 bios_grub on
+mkfs.ext4 -L my-root /dev/vdb2
+mount /dev/vdb2 /mnt
+df -h /mnt
+herd start cow-store /mnt
+mkdir /mnt/etc
+cp /etc/target-config.scm /mnt/etc/config.scm
+guix system init /mnt/etc/config.scm /mnt --no-substitutes
+sync
+reboot\n")
+
+(define* (run-install target-os target-os-source
+                      #:key
+                      (script %simple-installation-script)
                       (os (marionette-operating-system
                            ;; Since the image has no network access, use the
                            ;; current Guix so the store items we need are in
@@ -102,12 +130,13 @@
                            #:imported-modules '((gnu services herd)
                                                 (guix combinators))))
                       (target-size (* 1200 MiB)))
-  "Run the GuixSD installation procedure from OS and return a VM image of
-TARGET-SIZE bytes containing the installed system."
+  "Run SCRIPT (a shell script following the GuixSD installation procedure) in
+OS to install TARGET-OS.  Return a VM image of TARGET-SIZE bytes containing
+the installed system."
 
   (mlet* %store-monad ((_      (set-grafting #f))
                        (system (current-system))
-                       (target (operating-system-derivation %minimal-os))
+                       (target (operating-system-derivation target-os))
 
                        ;; Since the installation system has no network access,
                        ;; we cheat a little bit by adding TARGET to its GC
@@ -118,95 +147,158 @@ TARGET-SIZE bytes containing the installed system."
                                  os (list target))
                                 #:disk-image-size (* 1500 MiB))))
     (define install
-      #~(begin
-          (use-modules (guix build utils)
-                       (gnu build marionette))
-
-          (set-path-environment-variable "PATH" '("bin")
-                                         (list #$qemu-minimal))
-
-          (system* "qemu-img" "create" "-f" "qcow2"
-                   #$output #$(number->string target-size))
-
-          (define marionette
-            (make-marionette
-             (cons (which #$(qemu-command system))
-                   (cons* "-no-reboot" "-m" "800"
-                          "-drive"
-                          (string-append "file=" #$image
-                                         ",if=virtio,readonly")
-                          "-drive"
-                          (string-append "file=" #$output ",if=virtio")
-                          (if (file-exists? "/dev/kvm")
-                              '("-enable-kvm")
-                              '())))))
-
-          (pk 'uname (marionette-eval '(uname) marionette))
-
-          ;; Wait for tty1.
-          (marionette-eval '(begin
-                              (use-modules (gnu services herd))
-                              (start 'term-tty1))
-                           marionette)
-
-          (marionette-eval '(call-with-output-file "/etc/litl-config.scm"
-                              (lambda (port)
-                                (write '#$%minimal-os-source port)))
-                           marionette)
-
-          (exit (marionette-eval '(zero? (system "
+      (with-imported-modules '((guix build utils)
+                               (gnu build marionette))
+        #~(begin
+            (use-modules (guix build utils)
+                         (gnu build marionette))
+
+            (set-path-environment-variable "PATH" '("bin")
+                                           (list #$qemu-minimal))
+
+            (system* "qemu-img" "create" "-f" "qcow2"
+                     #$output #$(number->string target-size))
+
+            (define marionette
+              (make-marionette
+               (cons (which #$(qemu-command system))
+                     (cons* "-no-reboot" "-m" "800"
+                            "-drive"
+                            (string-append "file=" #$image
+                                           ",if=virtio,readonly")
+                            "-drive"
+                            (string-append "file=" #$output ",if=virtio")
+                            (if (file-exists? "/dev/kvm")
+                                '("-enable-kvm")
+                                '())))))
+
+            (pk 'uname (marionette-eval '(uname) marionette))
+
+            ;; Wait for tty1.
+            (marionette-eval '(begin
+                                (use-modules (gnu services herd))
+                                (start 'term-tty1))
+                             marionette)
+
+            (marionette-eval '(call-with-output-file "/etc/target-config.scm"
+                                (lambda (port)
+                                  (write '#$target-os-source port)))
+                             marionette)
+
+            (exit (marionette-eval '(zero? (system #$script))
+                                   marionette)))))
+
+    (gexp->derivation "installation" install)))
+
+(define (qemu-command/writable-image image)
+  "Return as a monadic value the command to run QEMU on a writable copy of
+IMAGE, a disk image."
+  (mlet %store-monad ((system (current-system)))
+    (return #~(let ((image #$image))
+                ;; First we need a writable copy of the image.
+                (format #t "copying image '~a'...~%" image)
+                (copy-file image "disk.img")
+                (chmod "disk.img" #o644)
+                `(,(string-append #$qemu-minimal "/bin/"
+                                  #$(qemu-command system))
+                  ,@(if (file-exists? "/dev/kvm")
+                        '("-enable-kvm")
+                        '())
+                  "-no-reboot" "-m" "256"
+                  "-drive" "file=disk.img,if=virtio")))))
+
+
+(define %test-installed-os
+  (system-test
+   (name "installed-os")
+   (description
+    "Test basic functionality of an OS installed like one would do by hand.
+This test is expensive in terms of CPU and storage usage since we need to
+build (current-guix) and then store a couple of full system images.")
+   (value
+    (mlet* %store-monad ((image   (run-install %minimal-os %minimal-os-source))
+                         (command (qemu-command/writable-image image)))
+      (run-basic-test %minimal-os command
+                      "installed-os")))))
+
+
+(define-os-with-source (%encrypted-root-os %encrypted-root-os-source)
+  ;; The OS we want to install.
+  (use-modules (gnu) (gnu tests) (srfi srfi-1))
+
+  (operating-system
+    (host-name "liberigilo")
+    (timezone "Europe/Paris")
+    (locale "en_US.UTF-8")
+
+    (bootloader (grub-configuration (device "/dev/vdb")))
+    (kernel-arguments '("console=ttyS0"))
+    (file-systems (cons (file-system
+                          (device "/dev/mapper/the-root-device")
+                          (title 'device)
+                          (mount-point "/")
+                          (type "ext4"))
+                        %base-file-systems))
+    (mapped-devices (list (mapped-device
+                           (source "REPLACE-WITH-LUKS-UUID")
+                           (target "the-root-device")
+                           (type luks-device-mapping))))
+    (users (cons (user-account
+                  (name "charlie")
+                  (group "users")
+                  (home-directory "/home/charlie")
+                  (supplementary-groups '("wheel" "audio" "video")))
+                 %base-user-accounts))
+    (services (cons (service marionette-service-type
+                             (marionette-configuration
+                              (imported-modules '((gnu services herd)
+                                                  (guix combinators)))))
+                    %base-services))))
+
+(define %encrypted-root-installation-script
+  ;; Shell script of a simple installation.
+  "\
 . /etc/profile
-set -e -x;
+set -e -x
 guix --version
-guix gc --list-live | grep isc-dhcp
 
 export GUIX_BUILD_OPTIONS=--no-grafts
-guix build isc-dhcp
+ls -l /run/current-system/gc-roots
 parted --script /dev/vdb mklabel gpt \\
   mkpart primary ext2 1M 3M \\
   mkpart primary ext2 3M 1G \\
   set 1 boot on \\
   set 1 bios_grub on
-mkfs.ext4 -L my-root /dev/vdb2
-ls -l /dev/vdb
-mount /dev/vdb2 /mnt
-df -h /mnt
+echo -n thepassphrase | cryptsetup luksFormat -q /dev/vdb2 -
+echo -n thepassphrase | \\
+  cryptsetup open --type luks --key-file - /dev/vdb2 the-root-device
+mkfs.ext4 -L my-root /dev/mapper/the-root-device
+mount LABEL=my-root /mnt
 herd start cow-store /mnt
 mkdir /mnt/etc
-cp /etc/litl-config.scm /mnt/etc/config.scm
+cp /etc/target-config.scm /mnt/etc/config.scm
+cat /mnt/etc/config
+luks_uuid=`cryptsetup luksUUID /dev/vdb2`
+sed -i /mnt/etc/config.scm \\
+    -e \"s/\\\"REPLACE-WITH-LUKS-UUID\\\"/(uuid \\\"$luks_uuid\\\")/g\"
+guix system build /mnt/etc/config.scm
 guix system init /mnt/etc/config.scm /mnt --no-substitutes
 sync
-reboot\n"))
-                                 marionette))))
-
-    (gexp->derivation "installation" install
-                      #:modules '((guix build utils)
-                                  (gnu build marionette)))))
+reboot\n")
 
-
-(define %test-installed-os
+(define %test-encrypted-os
   (system-test
-   (name "installed-os")
+   (name "encrypted-root-os")
    (description
     "Test basic functionality of an OS installed like one would do by hand.
 This test is expensive in terms of CPU and storage usage since we need to
 build (current-guix) and then store a couple of full system images.")
    (value
-    (mlet %store-monad ((image  (run-install))
-                        (system (current-system)))
-      (run-basic-test %minimal-os
-                      #~(let ((image #$image))
-                          ;; First we need a writable copy of the image.
-                          (format #t "copying image '~a'...~%" image)
-                          (copy-file image "disk.img")
-                          (chmod "disk.img" #o644)
-                          `(,(string-append #$qemu-minimal "/bin/"
-                                            #$(qemu-command system))
-                            ,@(if (file-exists? "/dev/kvm")
-                                  '("-enable-kvm")
-                                  '())
-                            "-no-reboot" "-m" "256"
-                            "-drive" "file=disk.img,if=virtio"))
-                      "installed-os")))))
+    (mlet* %store-monad ((image   (run-install %encrypted-root-os
+                                               %encrypted-root-os-source
+                                               #:script
+                                               %encrypted-root-installation-script))
+                         (command (qemu-command/writable-image image)))
+      (run-basic-test %encrypted-root-os command "encrypted-root-os")))))
 
 ;;; install.scm ends here
diff --git a/guix/build/download.scm b/guix/build/download.scm
index bd011ce878..103e784bb1 100644
--- a/guix/build/download.scm
+++ b/guix/build/download.scm
@@ -23,9 +23,11 @@
   #:use-module (web http)
   #:use-module ((web client) #:hide (open-socket-for-uri))
   #:use-module (web response)
+  #:use-module (guix base64)
   #:use-module (guix ftp-client)
   #:use-module (guix build utils)
   #:use-module (rnrs io ports)
+  #:use-module (rnrs bytevectors)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-11)
   #:use-module (srfi srfi-19)
@@ -598,14 +600,22 @@ FILE on success."
         (string>? (version) "2.0.7")))
 
   (define headers
-    '(;; Some web sites, such as http://dist.schmorp.de, would block you if
+    `(;; Some web sites, such as http://dist.schmorp.de, would block you if
       ;; there's no 'User-Agent' header, presumably on the assumption that
       ;; you're a spammer.  So work around that.
       (User-Agent . "GNU Guile")
 
       ;; Some servers, such as https://alioth.debian.org, return "406 Not
       ;; Acceptable" when not explicitly told that everything is accepted.
-      (Accept . "*/*")))
+      (Accept . "*/*")
+
+      ;; Basic authentication, if needed.
+      ,@(match (uri-userinfo uri)
+          ((? string? str)
+           `((Authorization . ,(string-append "Basic "
+                                              (base64-encode
+                                               (string->utf8 str))))))
+          (_ '()))))
 
   (let*-values (((connection)
                  (open-connection-for-uri uri #:timeout timeout))
diff --git a/guix/build/svn.scm b/guix/build/svn.scm
index 74fe084da5..31c30edaf5 100644
--- a/guix/build/svn.scm
+++ b/guix/build/svn.scm
@@ -29,15 +29,22 @@
 ;;; Code:
 
 (define* (svn-fetch url revision directory
-                    #:key (svn-command "svn"))
+                    #:key (svn-command "svn")
+                    (user-name #f)
+                    (password #f))
   "Fetch REVISION from URL into DIRECTORY.  REVISION must be an integer, and a
 valid Subversion revision.  Return #t on success, #f otherwise."
-  (and (zero? (system* svn-command "checkout" "--non-interactive"
-                       ;; Trust the server certificate.  This is OK as we
-                       ;; verify the checksum later.  This can be removed when
-                       ;; ca-certificates package is added.
-                       "--trust-server-cert" "-r" (number->string revision)
-                       url directory))
+  (and (zero? (apply system* svn-command
+                     "checkout" "--non-interactive"
+                     ;; Trust the server certificate.  This is OK as we
+                     ;; verify the checksum later.  This can be removed when
+                     ;; ca-certificates package is added.
+                     "--trust-server-cert" "-r" (number->string revision)
+                     `(,@(if (and user-name password)
+                             (list (string-append "--username=" user-name)
+                                   (string-append "--password=" password))
+                             '())
+                       ,url ,directory)))
        (with-directory-excursion directory
          (begin
            ;; The contents of '.svn' vary as a function of the current status
diff --git a/guix/config.scm.in b/guix/config.scm.in
index adffa0cfec..6d42cf233c 100644
--- a/guix/config.scm.in
+++ b/guix/config.scm.in
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -27,6 +27,7 @@
             %guix-register-program
             %system
             %libgcrypt
+            %libz
             %nix-instantiate
             %gzip
             %bzip2
@@ -72,6 +73,9 @@
 (define %libgcrypt
   "@LIBGCRYPT@")
 
+(define %libz
+  "@LIBZ@")
+
 (define %nix-instantiate
   "@NIX_INSTANTIATE@")
 
diff --git a/guix/cvs-download.scm b/guix/cvs-download.scm
index 72478dd2c2..85744c5b55 100644
--- a/guix/cvs-download.scm
+++ b/guix/cvs-download.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014, 2015 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014 Sree Harsha Totakura <sreeharsha@totakura.in>
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
 ;;;
@@ -60,13 +60,15 @@
 object.  The output is expected to have recursive hash HASH of type
 HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
   (define build
-    #~(begin
-        (use-modules (guix build cvs))
-        (cvs-fetch '#$(cvs-reference-root-directory ref)
-                   '#$(cvs-reference-module ref)
-                   '#$(cvs-reference-revision ref)
-                   #$output
-                   #:cvs-command (string-append #+cvs "/bin/cvs"))))
+    (with-imported-modules '((guix build cvs)
+                             (guix build utils))
+      #~(begin
+          (use-modules (guix build cvs))
+          (cvs-fetch '#$(cvs-reference-root-directory ref)
+                     '#$(cvs-reference-module ref)
+                     '#$(cvs-reference-revision ref)
+                     #$output
+                     #:cvs-command (string-append #+cvs "/bin/cvs")))))
 
   (mlet %store-monad ((guile (package->derivation guile system)))
     (gexp->derivation (or name "cvs-checkout") build
@@ -74,8 +76,6 @@ HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
                       #:hash-algo hash-algo
                       #:hash hash
                       #:recursive? #t
-                      #:modules '((guix build cvs)
-                                  (guix build utils))
                       #:guile-for-build guile
                       #:local-build? #t)))
 
diff --git a/guix/download.scm b/guix/download.scm
index 9b238dcbdf..bcb043ba80 100644
--- a/guix/download.scm
+++ b/guix/download.scm
@@ -99,27 +99,23 @@
        "http://www.centervenus.com/mirrors/nongnu/"
        "http://download.savannah.gnu.org/releases-noredirect/")
       (sourceforge ; https://sourceforge.net/p/forge/documentation/Mirrors/
-       "http://prdownloads.sourceforge.net/"
-       "http://heanet.dl.sourceforge.net/sourceforge/"
-       "http://dfn.dl.sourceforge.net/sourceforge/"
-       "http://freefr.dl.sourceforge.net/sourceforge/"
-       "http://internode.dl.sourceforge.net/sourceforge/"
-       "http://iweb.dl.sourceforge.net/sourceforge/"
-       "http://jaist.dl.sourceforge.net/sourceforge/"
-       "http://kaz.dl.sourceforge.net/sourceforge/"
-       "http://kent.dl.sourceforge.net/sourceforge/"
-       "http://liquidtelecom.dl.sourceforge.net/sourceforge/"
-       "http://nbtelecom.dl.sourceforge.net/sourceforge/"
-       "http://nchc.dl.sourceforge.net/sourceforge/"
-       "http://ncu.dl.sourceforge.net/sourceforge/"
-       "http://netcologne.dl.sourceforge.net/sourceforge/"
-       "http://netix.dl.sourceforge.net/sourceforge/"
-       "http://pilotfiber.dl.sourceforge.net/sourceforge/"
-       "http://superb-sea2.dl.sourceforge.net/sourceforge/"
-       "http://tenet.dl.sourceforge.net/sourceforge/"
-       "http://ufpr.dl.sourceforge.net/sourceforge/"
-       "http://vorboss.dl.sourceforge.net/sourceforge/"
-       "http://netassist.dl.sourceforge.net/sourceforge/")
+       "http://ufpr.dl.sourceforge.net/project/"
+       "http://heanet.dl.sourceforge.net/project/"
+       "http://freefr.dl.sourceforge.net/project/"
+       "http://internode.dl.sourceforge.net/project/"
+       "http://jaist.dl.sourceforge.net/project/"
+       "http://kent.dl.sourceforge.net/project/"
+       "http://liquidtelecom.dl.sourceforge.net/project/"
+       "http://nbtelecom.dl.sourceforge.net/project/"
+       "http://nchc.dl.sourceforge.net/project/"
+       "http://ncu.dl.sourceforge.net/project/"
+       "http://netcologne.dl.sourceforge.net/project/"
+       "http://netix.dl.sourceforge.net/project/"
+       "http://pilotfiber.dl.sourceforge.net/project/"
+       "http://superb-sea2.dl.sourceforge.net/project/"
+       "http://tenet.dl.sourceforge.net/project/"
+       "http://vorboss.dl.sourceforge.net/project/"
+       "http://netassist.dl.sourceforge.net/project/")
       (kernel.org
        "http://www.all.kernel.org/pub/"
        "http://ramses.wh2.tu-dresden.de/pub/mirrors/kernel.org/"
@@ -168,7 +164,7 @@
        "http://x.cs.pu.edu.tw/"
        "ftp://ftp.is.co.za/pub/x.org")            ; South Africa
       (cpan                              ; from http://www.cpan.org/SITES.html
-       "http://cpan.enstimac.fr/"
+       "http://mirror.ibcp.fr/pub/CPAN/"
        "ftp://ftp.ciril.fr/pub/cpan/"
        "ftp://artfiles.org/cpan.org/"
        "http://www.cpan.org/"
@@ -286,33 +282,39 @@ in the store."
          (any https? url)))))
 
   (define builder
-    #~(begin
-        #+(if need-gnutls?
+    (with-imported-modules '((guix build download)
+                             (guix build utils)
+                             (guix ftp-client)
+                             (guix base32)
+                             (guix base64))
+      #~(begin
+          #+(if need-gnutls?
 
-              ;; Add GnuTLS to the inputs and to the load path.
-              #~(eval-when (load expand eval)
-                  (set! %load-path
-                        (cons (string-append #+(gnutls-package)
-                                             "/share/guile/site/"
-                                             (effective-version))
-                              %load-path)))
-              #~#t)
+                ;; Add GnuTLS to the inputs and to the load path.
+                #~(eval-when (load expand eval)
+                    (set! %load-path
+                      (cons (string-append #+(gnutls-package)
+                                           "/share/guile/site/"
+                                           (effective-version))
+                            %load-path)))
+                #~#t)
 
-        (use-modules (guix build download)
-                     (guix base32))
+          (use-modules (guix build download)
+                       (guix base32))
 
-        (let ((value-from-environment (lambda (variable)
-                                        (call-with-input-string
-                                            (getenv variable)
-                                          read))))
-          (url-fetch (value-from-environment "guix download url")
-                     #$output
-                     #:mirrors (call-with-input-file #$%mirror-file read)
+          (let ((value-from-environment (lambda (variable)
+                                          (call-with-input-string
+                                              (getenv variable)
+                                            read))))
+            (url-fetch (value-from-environment "guix download url")
+                       #$output
+                       #:mirrors (call-with-input-file #$%mirror-file read)
 
-                     ;; Content-addressed mirrors.
-                     #:hashes (value-from-environment "guix download hashes")
-                     #:content-addressed-mirrors
-                     (primitive-load #$%content-addressed-mirror-file)))))
+                       ;; Content-addressed mirrors.
+                       #:hashes
+                       (value-from-environment "guix download hashes")
+                       #:content-addressed-mirrors
+                       (primitive-load #$%content-addressed-mirror-file))))))
 
   (let ((uri (and (string? url) (string->uri url))))
     (if (or (and (string? url) (not uri))
@@ -325,10 +327,6 @@ in the store."
                             #:system system
                             #:hash-algo hash-algo
                             #:hash hash
-                            #:modules '((guix build download)
-                                        (guix build utils)
-                                        (guix ftp-client)
-                                        (guix base32))
 
                             ;; Use environment variables and a fixed script
                             ;; name so there's only one script in store for
diff --git a/guix/gexp.scm b/guix/gexp.scm
index b929b79c26..302879fb42 100644
--- a/guix/gexp.scm
+++ b/guix/gexp.scm
@@ -29,6 +29,7 @@
   #:use-module (ice-9 match)
   #:export (gexp
             gexp?
+            with-imported-modules
 
             gexp-input
             gexp-input?
@@ -49,14 +50,12 @@
             computed-file?
             computed-file-name
             computed-file-gexp
-            computed-file-modules
             computed-file-options
 
             program-file
             program-file?
             program-file-name
             program-file-gexp
-            program-file-modules
             program-file-guile
 
             scheme-file
@@ -98,11 +97,11 @@
 
 ;; "G expressions".
 (define-record-type <gexp>
-  (make-gexp references natives proc)
+  (make-gexp references modules proc)
   gexp?
-  (references gexp-references)                    ; ((DRV-OR-PKG OUTPUT) ...)
-  (natives    gexp-native-references)             ; ((DRV-OR-PKG OUTPUT) ...)
-  (proc       gexp-proc))                         ; procedure
+  (references gexp-references)                    ;list of <gexp-input>
+  (modules    gexp-self-modules)                  ;list of module names
+  (proc       gexp-proc))                         ;procedure
 
 (define (write-gexp gexp port)
   "Write GEXP on PORT."
@@ -113,8 +112,7 @@
   ;; tries to use 'append' on that, which fails with wrong-type-arg.
   (false-if-exception
    (write (apply (gexp-proc gexp)
-                 (append (gexp-references gexp)
-                         (gexp-native-references gexp)))
+                 (gexp-references gexp))
           port))
   (format port " ~a>"
           (number->string (object-address gexp) 16)))
@@ -273,55 +271,49 @@ This is the declarative counterpart of 'text-file'."
      (text-file name content references))))
 
 (define-record-type <computed-file>
-  (%computed-file name gexp modules options)
+  (%computed-file name gexp options)
   computed-file?
   (name       computed-file-name)                 ;string
   (gexp       computed-file-gexp)                 ;gexp
-  (modules    computed-file-modules)              ;list of module names
   (options    computed-file-options))             ;list of arguments
 
 (define* (computed-file name gexp
-                        #:key (modules '()) (options '(#:local-build? #t)))
+                        #:key (options '(#:local-build? #t)))
   "Return an object representing the store item NAME, a file or directory
-computed by GEXP.  MODULES specifies the set of modules visible in the
-execution context of GEXP.  OPTIONS is a list of additional arguments to pass
+computed by GEXP.  OPTIONS is a list of additional arguments to pass
 to 'gexp->derivation'.
 
 This is the declarative counterpart of 'gexp->derivation'."
-  (%computed-file name gexp modules options))
+  (%computed-file name gexp options))
 
 (define-gexp-compiler (computed-file-compiler (file computed-file?)
                                               system target)
   ;; Compile FILE by returning a derivation whose build expression is its
   ;; gexp.
   (match file
-    (($ <computed-file> name gexp modules options)
-     (apply gexp->derivation name gexp #:modules modules options))))
+    (($ <computed-file> name gexp options)
+     (apply gexp->derivation name gexp options))))
 
 (define-record-type <program-file>
-  (%program-file name gexp modules guile)
+  (%program-file name gexp guile)
   program-file?
   (name       program-file-name)                  ;string
   (gexp       program-file-gexp)                  ;gexp
-  (modules    program-file-modules)               ;list of module names
   (guile      program-file-guile))                ;package
 
-(define* (program-file name gexp
-                       #:key (modules '()) (guile #f))
+(define* (program-file name gexp #:key (guile #f))
   "Return an object representing the executable store item NAME that runs
-GEXP.  GUILE is the Guile package used to execute that script, and MODULES is
-the list of modules visible to that script.
+GEXP.  GUILE is the Guile package used to execute that script.
 
 This is the declarative counterpart of 'gexp->script'."
-  (%program-file name gexp modules guile))
+  (%program-file name gexp guile))
 
 (define-gexp-compiler (program-file-compiler (file program-file?)
                                              system target)
   ;; Compile FILE by returning a derivation that builds the script.
   (match file
-    (($ <program-file> name gexp modules guile)
+    (($ <program-file> name gexp guile)
      (gexp->script name gexp
-                   #:modules modules
                    #:guile (or guile (default-guile))))))
 
 (define-record-type <scheme-file>
@@ -386,6 +378,23 @@ whether this should be considered a \"native\" input or not."
 
 (set-record-type-printer! <gexp-output> write-gexp-output)
 
+(define (gexp-modules gexp)
+  "Return the list of Guile module names GEXP relies on."
+  (delete-duplicates
+   (append (gexp-self-modules gexp)
+           (append-map (match-lambda
+                         (($ <gexp-input> (? gexp? exp))
+                          (gexp-modules exp))
+                         (($ <gexp-input> (lst ...))
+                          (append-map (lambda (item)
+                                        (if (gexp? item)
+                                            (gexp-modules item)
+                                            '()))
+                                      lst))
+                         (_
+                          '()))
+                       (gexp-references gexp)))))
+
 (define raw-derivation
   (store-lift derivation))
 
@@ -467,7 +476,8 @@ derivation) on SYSTEM; EXP is stored in a file called SCRIPT-NAME.  When
 TARGET is true, it is used as the cross-compilation target triplet for
 packages referred to by EXP.
 
-Make MODULES available in the evaluation context of EXP; MODULES is a list of
+MODULES is deprecated in favor of 'with-imported-modules'.  Its meaning is to
+make MODULES available in the evaluation context of EXP; MODULES is a list of
 names of Guile modules searched in MODULE-PATH to be copied in the store,
 compiled, and made available in the load path during the execution of
 EXP---e.g., '((guix build utils) (guix build gnu-build-system)).
@@ -496,7 +506,9 @@ Similarly for DISALLOWED-REFERENCES, which can list items that must not be
 referenced by the outputs.
 
 The other arguments are as for 'derivation'."
-  (define %modules modules)
+  (define %modules
+    (delete-duplicates
+     (append modules (gexp-modules exp))))
   (define outputs (gexp-outputs exp))
 
   (define (graphs-file-names graphs)
@@ -630,11 +642,15 @@ references; otherwise, return only non-native references."
        ;; Ignore references to other kinds of objects.
        result)))
 
+  (define (native-input? x)
+    (and (gexp-input? x)
+         (gexp-input-native? x)))
+
   (fold-right add-reference-inputs
               '()
               (if native?
-                  (gexp-native-references exp)
-                  (gexp-references exp))))
+                  (filter native-input? (gexp-references exp))
+                  (remove native-input? (gexp-references exp)))))
 
 (define gexp-native-inputs
   (cut gexp-inputs <> #:native? #t))
@@ -687,7 +703,7 @@ and in the current monad setting (system type, etc.)"
                            (if (gexp-input? ref)
                                ref
                                (%gexp-input ref "out" n?))
-                           native?))
+                           (or n? native?)))
                         refs)))
         (($ <gexp-input> (? struct? thing) output n?)
          (let ((target (if (or n? native?) #f target)))
@@ -706,9 +722,7 @@ and in the current monad setting (system type, etc.)"
 
   (mlet %store-monad
       ((args (sequence %store-monad
-                       (append (map reference->sexp (gexp-references exp))
-                               (map (cut reference->sexp <> #t)
-                                    (gexp-native-references exp))))))
+                       (map reference->sexp (gexp-references exp)))))
     (return (apply (gexp-proc exp) args))))
 
 (define (syntax-location-string s)
@@ -724,6 +738,17 @@ and in the current monad setting (system type, etc.)"
               (simple-format #f "~a:~a" line column)))
         "<unknown location>")))
 
+(define-syntax-parameter current-imported-modules
+  ;; Current list of imported modules.
+  (identifier-syntax '()))
+
+(define-syntax-rule (with-imported-modules modules body ...)
+  "Mark the gexps defined in BODY... as requiring MODULES in their execution
+environment."
+  (syntax-parameterize ((current-imported-modules
+                         (identifier-syntax modules)))
+    body ...))
+
 (define-syntax gexp
   (lambda (s)
     (define (collect-escapes exp)
@@ -741,33 +766,9 @@ and in the current monad setting (system type, etc.)"
           ((ungexp-splicing _ ...)
            (cons exp result))
           ((ungexp-native _ ...)
-           result)
-          ((ungexp-native-splicing _ ...)
-           result)
-          ((exp0 exp ...)
-           (let ((result (loop #'exp0 result)))
-             (fold loop result #'(exp ...))))
-          (_
-           result))))
-
-    (define (collect-native-escapes exp)
-      ;; Return all the 'ungexp-native' forms present in EXP.
-      (let loop ((exp    exp)
-                 (result '()))
-        (syntax-case exp (ungexp
-                          ungexp-splicing
-                          ungexp-native
-                          ungexp-native-splicing)
-          ((ungexp-native _)
-           (cons exp result))
-          ((ungexp-native _ _)
            (cons exp result))
           ((ungexp-native-splicing _ ...)
            (cons exp result))
-          ((ungexp _ ...)
-           result)
-          ((ungexp-splicing _ ...)
-           result)
           ((exp0 exp ...)
            (let ((result (loop #'exp0 result)))
              (fold loop result #'(exp ...))))
@@ -838,14 +839,12 @@ and in the current monad setting (system type, etc.)"
 
     (syntax-case s (ungexp output)
       ((_ exp)
-       (let* ((normals (delete-duplicates (collect-escapes #'exp)))
-              (natives (delete-duplicates (collect-native-escapes #'exp)))
-              (escapes (append normals natives))
+       (let* ((escapes (delete-duplicates (collect-escapes #'exp)))
               (formals (generate-temporaries escapes))
               (sexp    (substitute-references #'exp (zip escapes formals)))
-              (refs    (map escape->ref normals))
-              (nrefs   (map escape->ref natives)))
-         #`(make-gexp (list #,@refs) (list #,@nrefs)
+              (refs    (map escape->ref escapes)))
+         #`(make-gexp (list #,@refs)
+                      current-imported-modules
                       (lambda #,formals
                         #,sexp)))))))
 
@@ -983,12 +982,24 @@ they can refer to each other."
   (module-ref (resolve-interface '(gnu packages commencement))
               'guile-final))
 
-(define* (gexp->script name exp
-                       #:key (modules '()) (guile (default-guile)))
-  "Return an executable script NAME that runs EXP using GUILE with MODULES in
-its search path."
+(define (load-path-expression modules)
+  "Return as a monadic value a gexp that sets '%load-path' and
+'%load-compiled-path' to point to MODULES, a list of module names."
   (mlet %store-monad ((modules  (imported-modules modules))
                       (compiled (compiled-modules modules)))
+    (return (gexp (eval-when (expand load eval)
+                    (set! %load-path
+                      (cons (ungexp modules) %load-path))
+                    (set! %load-compiled-path
+                      (cons (ungexp compiled)
+                            %load-compiled-path)))))))
+
+(define* (gexp->script name exp
+                       #:key (guile (default-guile)))
+  "Return an executable script NAME that runs EXP using GUILE, with EXP's
+imported modules in its search path."
+  (mlet %store-monad ((set-load-path
+                       (load-path-expression (gexp-modules exp))))
     (gexp->derivation name
                       (gexp
                        (call-with-output-file (ungexp output)
@@ -1001,28 +1012,33 @@ its search path."
                                    "#!~a/bin/guile --no-auto-compile~%!#~%"
                                    (ungexp guile))
 
-                           ;; Write the 'eval-when' form so that it can be
-                           ;; compiled.
-                           (write
-                            '(eval-when (expand load eval)
-                               (set! %load-path
-                                    (cons (ungexp modules) %load-path))
-                               (set! %load-compiled-path
-                                     (cons (ungexp compiled)
-                                           %load-compiled-path)))
-                            port)
+                           (write '(ungexp set-load-path) port)
                            (write '(ungexp exp) port)
                            (chmod port #o555)))))))
 
-(define (gexp->file name exp)
-  "Return a derivation that builds a file NAME containing EXP."
-  (gexp->derivation name
-                    (gexp
-                     (call-with-output-file (ungexp output)
-                       (lambda (port)
-                         (write '(ungexp exp) port))))
-                    #:local-build? #t
-                    #:substitutable? #f))
+(define* (gexp->file name exp #:key (set-load-path? #t))
+  "Return a derivation that builds a file NAME containing EXP.  When
+SET-LOAD-PATH? is true, emit code in the resulting file to set '%load-path'
+and '%load-compiled-path' to honor EXP's imported modules."
+  (match (if set-load-path? (gexp-modules exp) '())
+    (()                                           ;zero modules
+     (gexp->derivation name
+                       (gexp
+                        (call-with-output-file (ungexp output)
+                          (lambda (port)
+                            (write '(ungexp exp) port))))
+                       #:local-build? #t
+                       #:substitutable? #f))
+    ((modules ...)
+     (mlet %store-monad ((set-load-path (load-path-expression modules)))
+       (gexp->derivation name
+                         (gexp
+                          (call-with-output-file (ungexp output)
+                            (lambda (port)
+                              (write '(ungexp set-load-path) port)
+                              (write '(ungexp exp) port))))
+                         #:local-build? #t
+                         #:substitutable? #f)))))
 
 (define* (text-file* name #:rest text)
   "Return as a monadic value a derivation that builds a text file containing
diff --git a/guix/git-download.scm b/guix/git-download.scm
index 1e5c845e34..9cc6dd3d94 100644
--- a/guix/git-download.scm
+++ b/guix/git-download.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014, 2015 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -68,23 +68,25 @@ HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
         '()))
 
   (define build
-    #~(begin
-        (use-modules (guix build git)
-                     (guix build utils)
-                     (ice-9 match))
+    (with-imported-modules '((guix build git)
+                             (guix build utils))
+      #~(begin
+          (use-modules (guix build git)
+                       (guix build utils)
+                       (ice-9 match))
 
-        ;; The 'git submodule' commands expects Coreutils, sed,
-        ;; grep, etc. to be in $PATH.
-        (set-path-environment-variable "PATH" '("bin")
-                                       (match '#+inputs
-                                         (((names dirs) ...)
-                                          dirs)))
+          ;; The 'git submodule' commands expects Coreutils, sed,
+          ;; grep, etc. to be in $PATH.
+          (set-path-environment-variable "PATH" '("bin")
+                                         (match '#+inputs
+                                           (((names dirs) ...)
+                                            dirs)))
 
-        (git-fetch '#$(git-reference-url ref)
-                   '#$(git-reference-commit ref)
-                   #$output
-                   #:recursive? '#$(git-reference-recursive? ref)
-                   #:git-command (string-append #+git "/bin/git"))))
+          (git-fetch '#$(git-reference-url ref)
+                     '#$(git-reference-commit ref)
+                     #$output
+                     #:recursive? '#$(git-reference-recursive? ref)
+                     #:git-command (string-append #+git "/bin/git")))))
 
   (mlet %store-monad ((guile (package->derivation guile system)))
     (gexp->derivation (or name "git-checkout") build
@@ -93,8 +95,6 @@ HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
                       #:hash-algo hash-algo
                       #:hash hash
                       #:recursive? #t
-                      #:modules '((guix build git)
-                                  (guix build utils))
                       #:guile-for-build guile
                       #:local-build? #t)))
 
diff --git a/guix/hg-download.scm b/guix/hg-download.scm
index f3e1d2906a..8420980905 100644
--- a/guix/hg-download.scm
+++ b/guix/hg-download.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014, 2015 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -60,15 +60,17 @@
 object.  The output is expected to have recursive hash HASH of type
 HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
   (define build
-    #~(begin
-        (use-modules (guix build hg)
-                     (guix build utils)
-                     (ice-9 match))
+    (with-imported-modules '((guix build hg)
+                             (guix build utils))
+      #~(begin
+          (use-modules (guix build hg)
+                       (guix build utils)
+                       (ice-9 match))
 
-        (hg-fetch '#$(hg-reference-url ref)
-                  '#$(hg-reference-changeset ref)
-                  #$output
-                  #:hg-command (string-append #+hg "/bin/hg"))))
+          (hg-fetch '#$(hg-reference-url ref)
+                    '#$(hg-reference-changeset ref)
+                    #$output
+                    #:hg-command (string-append #+hg "/bin/hg")))))
 
   (mlet %store-monad ((guile (package->derivation guile system)))
     (gexp->derivation (or name "hg-checkout") build
@@ -77,8 +79,6 @@ HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
                       #:hash-algo hash-algo
                       #:hash hash
                       #:recursive? #t
-                      #:modules '((guix build hg)
-                                  (guix build utils))
                       #:guile-for-build guile)))
 
 ;;; hg-download.scm ends here
diff --git a/guix/import/cpan.scm b/guix/import/cpan.scm
index ad61ee7916..213a155fd6 100644
--- a/guix/import/cpan.scm
+++ b/guix/import/cpan.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2016 Alex Sassmannshausen <alex@pompo.co>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -99,6 +100,13 @@ or #f on failure.  MODULE should be e.g. \"Test::Script\""
 (define (cpan-home name)
   (string-append "http://search.cpan.org/dist/" name))
 
+(define (fix-source-url download-url)
+  "Return a new download URL based on DOWNLOAD-URL which now uses our mirrors,
+if the original's domain was metacpan."
+  (regexp-substitute/global #f "http[s]?://cpan.metacpan.org" download-url
+                            'pre "mirror://cpan" 'post))
+
+
 (define %corelist
   (delay
     (let* ((perl (with-store store
@@ -183,10 +191,7 @@ META."
        (list (list guix-name
                    (list 'quasiquote inputs))))))
 
-  (define source-url
-    (regexp-substitute/global #f "http://cpan.metacpan.org"
-                              (assoc-ref meta "download_url")
-                              'pre "mirror://cpan" 'post))
+  (define source-url (fix-source-url (assoc-ref meta "download_url")))
 
   (let ((tarball (with-store store
                    (download-to-store store source-url))))
diff --git a/guix/packages.scm b/guix/packages.scm
index acb8f34417..bfb4c557ab 100644
--- a/guix/packages.scm
+++ b/guix/packages.scm
@@ -56,7 +56,6 @@
             origin-patch-guile
             origin-snippet
             origin-modules
-            origin-imported-modules
             base32
 
             package
@@ -164,8 +163,7 @@
                 (default #f))
   (modules      origin-modules                    ; list of module names
                 (default '()))
-  (imported-modules origin-imported-modules       ; list of module names
-                    (default '()))
+
   (patch-guile origin-patch-guile                 ; package or #f
                (default #f)))
 
@@ -381,14 +379,13 @@ the build code of derivation."
                            (snippet #f)
                            (flags '("-p1"))
                            (modules '())
-                           (imported-modules '())
                            (guile-for-build (%guile-for-build))
                            (system (%current-system)))
   "Unpack SOURCE (a derivation or store path), apply all of PATCHES, and
 repack the tarball using the tools listed in INPUTS.  When SNIPPET is true,
 it must be an s-expression that will run from within the directory where
-SOURCE was unpacked, after all of PATCHES have been applied.  MODULES and
-IMPORTED-MODULES specify modules to use/import for use by SNIPPET."
+SOURCE was unpacked, after all of PATCHES have been applied.  MODULES
+specifies modules in scope when evaluating SNIPPET."
   (define source-file-name
     ;; SOURCE is usually a derivation, but it could be a store file.
     (if (derivation? source)
@@ -449,107 +446,107 @@ IMPORTED-MODULES specify modules to use/import for use by SNIPPET."
                       (patches    (sequence %store-monad
                                             (map instantiate-patch patches))))
     (define build
-      #~(begin
-          (use-modules (ice-9 ftw)
-                       (srfi srfi-1)
-                       (guix build utils))
-
-          ;; The --sort option was added to GNU tar in version 1.28, released
-          ;; 2014-07-28.  During bootstrap we must cope with older versions.
-          (define tar-supports-sort?
-            (zero? (system* (string-append #+tar "/bin/tar")
-                            "cf" "/dev/null" "--files-from=/dev/null"
-                            "--sort=name")))
-
-          (define (apply-patch patch)
-            (format (current-error-port) "applying '~a'...~%" patch)
-
-            ;; Use '--force' so that patches that do not apply perfectly are
-            ;; rejected.
-            (zero? (system* (string-append #+patch "/bin/patch")
-                            "--force" #+@flags "--input" patch)))
-
-          (define (first-file directory)
-            ;; Return the name of the first file in DIRECTORY.
-            (car (scandir directory
-                          (lambda (name)
-                            (not (member name '("." "..")))))))
-
-          ;; Encoding/decoding errors shouldn't be silent.
-          (fluid-set! %default-port-conversion-strategy 'error)
-
-          (when #+locales
-            ;; First of all, install a UTF-8 locale so that UTF-8 file names
-            ;; are correctly interpreted.  During bootstrap, LOCALES is #f.
-            (setenv "LOCPATH"
-                    (string-append #+locales "/lib/locale/"
-                                   #+(and locales
-                                          (package-version locales))))
-            (setlocale LC_ALL "en_US.utf8"))
-
-          (setenv "PATH" (string-append #+xz "/bin" ":"
-                                        #+decomp "/bin"))
-
-          ;; SOURCE may be either a directory or a tarball.
-          (and (if (file-is-directory? #+source)
-                   (let* ((store     (%store-directory))
-                          (len       (+ 1 (string-length store)))
-                          (base      (string-drop #+source len))
-                          (dash      (string-index base #\-))
-                          (directory (string-drop base (+ 1 dash))))
-                     (mkdir directory)
-                     (copy-recursively #+source directory)
-                     #t)
-                   #+(if (string=? decompression-type "unzip")
-                         #~(zero? (system* "unzip" #+source))
-                         #~(zero? (system* (string-append #+tar "/bin/tar")
-                                           "xvf" #+source))))
-               (let ((directory (first-file ".")))
-                 (format (current-error-port)
-                         "source is under '~a'~%" directory)
-                 (chdir directory)
-
-                 (and (every apply-patch '#+patches)
-                      #+@(if snippet
-                             #~((let ((module (make-fresh-user-module)))
-                                  (module-use-interfaces! module
-                                                          (map resolve-interface
-                                                               '#+modules))
-                                  ((@ (system base compile) compile)
-                                   '#+snippet
-                                   #:to 'value
-                                   #:opts %auto-compilation-options
-                                   #:env module)))
-                             #~())
-
-                      (begin (chdir "..") #t)
-
-                      (unless tar-supports-sort?
-                        (call-with-output-file ".file_list"
-                          (lambda (port)
-                            (for-each (lambda (name) (format port "~a~%" name))
-                                      (find-files directory
-                                                  #:directories? #t
-                                                  #:fail-on-error? #t)))))
-                      (zero? (apply system* (string-append #+tar "/bin/tar")
-                                    "cvfa" #$output
-                                    ;; avoid non-determinism in the archive
-                                    "--mtime=@0"
-                                    "--owner=root:0"
-                                    "--group=root:0"
-                                    (if tar-supports-sort?
-                                        `("--sort=name"
-                                          ,directory)
-                                        '("--no-recursion"
-                                          "--files-from=.file_list")))))))))
-
-    (let ((name    (tarxz-name original-file-name))
-          (modules (delete-duplicates (cons '(guix build utils)
-                                            imported-modules))))
+      (with-imported-modules '((guix build utils))
+        #~(begin
+            (use-modules (ice-9 ftw)
+                         (srfi srfi-1)
+                         (guix build utils))
+
+            ;; The --sort option was added to GNU tar in version 1.28, released
+            ;; 2014-07-28.  During bootstrap we must cope with older versions.
+            (define tar-supports-sort?
+              (zero? (system* (string-append #+tar "/bin/tar")
+                              "cf" "/dev/null" "--files-from=/dev/null"
+                              "--sort=name")))
+
+            (define (apply-patch patch)
+              (format (current-error-port) "applying '~a'...~%" patch)
+
+              ;; Use '--force' so that patches that do not apply perfectly are
+              ;; rejected.
+              (zero? (system* (string-append #+patch "/bin/patch")
+                              "--force" #+@flags "--input" patch)))
+
+            (define (first-file directory)
+              ;; Return the name of the first file in DIRECTORY.
+              (car (scandir directory
+                            (lambda (name)
+                              (not (member name '("." "..")))))))
+
+            ;; Encoding/decoding errors shouldn't be silent.
+            (fluid-set! %default-port-conversion-strategy 'error)
+
+            (when #+locales
+              ;; First of all, install a UTF-8 locale so that UTF-8 file names
+              ;; are correctly interpreted.  During bootstrap, LOCALES is #f.
+              (setenv "LOCPATH"
+                      (string-append #+locales "/lib/locale/"
+                                     #+(and locales
+                                            (package-version locales))))
+              (setlocale LC_ALL "en_US.utf8"))
+
+            (setenv "PATH" (string-append #+xz "/bin" ":"
+                                          #+decomp "/bin"))
+
+            ;; SOURCE may be either a directory or a tarball.
+            (and (if (file-is-directory? #+source)
+                     (let* ((store     (%store-directory))
+                            (len       (+ 1 (string-length store)))
+                            (base      (string-drop #+source len))
+                            (dash      (string-index base #\-))
+                            (directory (string-drop base (+ 1 dash))))
+                       (mkdir directory)
+                       (copy-recursively #+source directory)
+                       #t)
+                     #+(if (string=? decompression-type "unzip")
+                           #~(zero? (system* "unzip" #+source))
+                           #~(zero? (system* (string-append #+tar "/bin/tar")
+                                             "xvf" #+source))))
+                 (let ((directory (first-file ".")))
+                   (format (current-error-port)
+                           "source is under '~a'~%" directory)
+                   (chdir directory)
+
+                   (and (every apply-patch '#+patches)
+                        #+@(if snippet
+                               #~((let ((module (make-fresh-user-module)))
+                                    (module-use-interfaces!
+                                     module
+                                     (map resolve-interface '#+modules))
+                                    ((@ (system base compile) compile)
+                                     '#+snippet
+                                     #:to 'value
+                                     #:opts %auto-compilation-options
+                                     #:env module)))
+                               #~())
+
+                        (begin (chdir "..") #t)
+
+                        (unless tar-supports-sort?
+                          (call-with-output-file ".file_list"
+                            (lambda (port)
+                              (for-each (lambda (name)
+                                          (format port "~a~%" name))
+                                        (find-files directory
+                                                    #:directories? #t
+                                                    #:fail-on-error? #t)))))
+                        (zero? (apply system*
+                                      (string-append #+tar "/bin/tar")
+                                      "cvfa" #$output
+                                      ;; avoid non-determinism in the archive
+                                      "--mtime=@0"
+                                      "--owner=root:0"
+                                      "--group=root:0"
+                                      (if tar-supports-sort?
+                                          `("--sort=name"
+                                            ,directory)
+                                          '("--no-recursion"
+                                            "--files-from=.file_list"))))))))))
+
+    (let ((name (tarxz-name original-file-name)))
       (gexp->derivation name build
                         #:graft? #f
                         #:system system
-                        #:modules modules
                         #:guile-for-build guile-for-build))))
 
 (define (transitive-inputs inputs)
@@ -1138,8 +1135,7 @@ cross-compilation target triplet."
      ;; No patches, no snippet: this is a fixed-output derivation.
      (method uri 'sha256 sha256 name #:system system))
     (($ <origin> uri method sha256 name (= force (patches ...)) snippet
-        (flags ...) inputs (modules ...) (imported-modules ...)
-        guile-for-build)
+        (flags ...) inputs (modules ...) guile-for-build)
      ;; Patches and/or a snippet.
      (mlet %store-monad ((source (method uri 'sha256 sha256 name
                                          #:system system))
@@ -1153,7 +1149,6 @@ cross-compilation target triplet."
                          #:flags flags
                          #:system system
                          #:modules modules
-                         #:imported-modules imported-modules
                          #:guile-for-build guile)))))
 
 (define-gexp-compiler (origin-compiler (origin origin?) system target)
diff --git a/guix/profiles.scm b/guix/profiles.scm
index 90c43325a0..77df6ad185 100644
--- a/guix/profiles.scm
+++ b/guix/profiles.scm
@@ -489,87 +489,87 @@ MANIFEST."
     (module-ref (resolve-interface '(gnu packages compression)) 'gzip))
 
   (define build
-    #~(begin
-        (use-modules (guix build utils)
-                     (srfi srfi-1) (srfi srfi-26)
-                     (ice-9 ftw))
-
-        (define (info-file? file)
-          (or (string-suffix? ".info" file)
-              (string-suffix? ".info.gz" file)))
-
-        (define (info-files top)
-          (let ((infodir (string-append top "/share/info")))
-            (map (cut string-append infodir "/" <>)
-                 (or (scandir infodir info-file?) '()))))
-
-        (define (install-info info)
-          (setenv "PATH" (string-append #+gzip "/bin")) ;for info.gz files
-          (zero?
-           (system* (string-append #+texinfo "/bin/install-info") "--silent"
-                    info (string-append #$output "/share/info/dir"))))
-
-        (mkdir-p (string-append #$output "/share/info"))
-        (exit (every install-info
-                     (append-map info-files
-                                 '#$(manifest-inputs manifest))))))
+    (with-imported-modules '((guix build utils))
+      #~(begin
+          (use-modules (guix build utils)
+                       (srfi srfi-1) (srfi srfi-26)
+                       (ice-9 ftw))
+
+          (define (info-file? file)
+            (or (string-suffix? ".info" file)
+                (string-suffix? ".info.gz" file)))
+
+          (define (info-files top)
+            (let ((infodir (string-append top "/share/info")))
+              (map (cut string-append infodir "/" <>)
+                   (or (scandir infodir info-file?) '()))))
+
+          (define (install-info info)
+            (setenv "PATH" (string-append #+gzip "/bin")) ;for info.gz files
+            (zero?
+             (system* (string-append #+texinfo "/bin/install-info") "--silent"
+                      info (string-append #$output "/share/info/dir"))))
+
+          (mkdir-p (string-append #$output "/share/info"))
+          (exit (every install-info
+                       (append-map info-files
+                                   '#$(manifest-inputs manifest)))))))
 
   (gexp->derivation "info-dir" build
-                    #:modules '((guix build utils))
                     #:local-build? #t
                     #:substitutable? #f))
 
 (define (ghc-package-cache-file manifest)
   "Return a derivation that builds the GHC 'package.cache' file for all the
 entries of MANIFEST, or #f if MANIFEST does not have any GHC packages."
-  (define ghc                                 ;lazy reference
+  (define ghc                                     ;lazy reference
     (module-ref (resolve-interface '(gnu packages haskell)) 'ghc))
 
   (define build
-    #~(begin
-        (use-modules (guix build utils)
-                     (srfi srfi-1) (srfi srfi-26)
-                     (ice-9 ftw))
-
-        (define ghc-name-version
-          (let* ((base (basename #+ghc)))
-            (string-drop base
-                         (+ 1 (string-index base #\-)))))
-
-        (define db-subdir
-          (string-append "lib/" ghc-name-version "/package.conf.d"))
-
-        (define db-dir
-          (string-append #$output "/" db-subdir))
-
-        (define (conf-files top)
-          (let ((db (string-append top "/" db-subdir)))
-            (if (file-exists? db)
-                (find-files db "\\.conf$")
-                '())))
-
-        (define (copy-conf-file conf)
-          (let ((base (basename conf)))
-            (copy-file conf (string-append db-dir "/" base))))
-
-        (system* (string-append #+ghc "/bin/ghc-pkg") "init" db-dir)
-        (for-each copy-conf-file
-                  (append-map conf-files
-                              (delete-duplicates
-                               '#$(manifest-inputs manifest))))
-        (let ((success
-               (zero?
-                (system* (string-append #+ghc "/bin/ghc-pkg") "recache"
-                         (string-append "--package-db=" db-dir)))))
-          (for-each delete-file (find-files db-dir "\\.conf$"))
-          (exit success))))
+    (with-imported-modules '((guix build utils))
+      #~(begin
+          (use-modules (guix build utils)
+                       (srfi srfi-1) (srfi srfi-26)
+                       (ice-9 ftw))
+
+          (define ghc-name-version
+            (let* ((base (basename #+ghc)))
+              (string-drop base
+                           (+ 1 (string-index base #\-)))))
+
+          (define db-subdir
+            (string-append "lib/" ghc-name-version "/package.conf.d"))
+
+          (define db-dir
+            (string-append #$output "/" db-subdir))
+
+          (define (conf-files top)
+            (let ((db (string-append top "/" db-subdir)))
+              (if (file-exists? db)
+                  (find-files db "\\.conf$")
+                  '())))
+
+          (define (copy-conf-file conf)
+            (let ((base (basename conf)))
+              (copy-file conf (string-append db-dir "/" base))))
+
+          (system* (string-append #+ghc "/bin/ghc-pkg") "init" db-dir)
+          (for-each copy-conf-file
+                    (append-map conf-files
+                                (delete-duplicates
+                                 '#$(manifest-inputs manifest))))
+          (let ((success
+                 (zero?
+                  (system* (string-append #+ghc "/bin/ghc-pkg") "recache"
+                           (string-append "--package-db=" db-dir)))))
+            (for-each delete-file (find-files db-dir "\\.conf$"))
+            (exit success)))))
 
   (with-monad %store-monad
     ;; Don't depend on GHC when there's nothing to do.
     (if (any (cut string-prefix? "ghc" <>)
              (map manifest-entry-name (manifest-entries manifest)))
         (gexp->derivation "ghc-package-cache" build
-                          #:modules '((guix build utils))
                           #:local-build? #t
                           #:substitutable? #f)
         (return #f))))
@@ -585,58 +585,58 @@ MANIFEST.  Single-file bundles are required by programs such as Git and Lynx."
     (module-ref (resolve-interface '(gnu packages base)) 'glibc-utf8-locales))
 
   (define build
-    #~(begin
-        (use-modules (guix build utils)
-                     (rnrs io ports)
-                     (srfi srfi-1)
-                     (srfi srfi-26)
-                     (ice-9 ftw)
-                     (ice-9 match))
-
-        (define (pem-file? file)
-          (string-suffix? ".pem" file))
-
-        (define (ca-files top)
-          (let ((cert-dir (string-append top "/etc/ssl/certs")))
-            (map (cut string-append cert-dir "/" <>)
-                 (or (scandir cert-dir pem-file?) '()))))
-
-        (define (concatenate-files files result)
-          "Make RESULT the concatenation of all of FILES."
-          (define (dump file port)
-            (display (call-with-input-file file get-string-all)
-                     port)
-            (newline port))    ;required, see <https://bugs.debian.org/635570>
-
-          (call-with-output-file result
-            (lambda (port)
-              (for-each (cut dump <> port) files))))
-
-        ;; Some file names in the NSS certificates are UTF-8 encoded so
-        ;; install a UTF-8 locale.
-        (setenv "LOCPATH"
-                (string-append #+glibc-utf8-locales "/lib/locale/"
-                               #+(package-version glibc-utf8-locales)))
-        (setlocale LC_ALL "en_US.utf8")
-
-        (match (append-map ca-files '#$(manifest-inputs manifest))
-          (()
-           ;; Since there are no CA files, just create an empty directory.  Do
-           ;; not create the etc/ssl/certs sub-directory, since that would
-           ;; wrongfully lead to a message about 'SSL_CERT_DIR' needing to be
-           ;; defined.
-           (mkdir #$output)
-           #t)
-          ((ca-files ...)
-           (let ((result (string-append #$output "/etc/ssl/certs")))
-             (mkdir-p result)
-             (concatenate-files ca-files
-                                (string-append result
-                                               "/ca-certificates.crt"))
-             #t)))))
+    (with-imported-modules '((guix build utils))
+      #~(begin
+          (use-modules (guix build utils)
+                       (rnrs io ports)
+                       (srfi srfi-1)
+                       (srfi srfi-26)
+                       (ice-9 ftw)
+                       (ice-9 match))
+
+          (define (pem-file? file)
+            (string-suffix? ".pem" file))
+
+          (define (ca-files top)
+            (let ((cert-dir (string-append top "/etc/ssl/certs")))
+              (map (cut string-append cert-dir "/" <>)
+                   (or (scandir cert-dir pem-file?) '()))))
+
+          (define (concatenate-files files result)
+            "Make RESULT the concatenation of all of FILES."
+            (define (dump file port)
+              (display (call-with-input-file file get-string-all)
+                       port)
+              (newline port))  ;required, see <https://bugs.debian.org/635570>
+
+            (call-with-output-file result
+              (lambda (port)
+                (for-each (cut dump <> port) files))))
+
+          ;; Some file names in the NSS certificates are UTF-8 encoded so
+          ;; install a UTF-8 locale.
+          (setenv "LOCPATH"
+                  (string-append #+glibc-utf8-locales "/lib/locale/"
+                                 #+(package-version glibc-utf8-locales)))
+          (setlocale LC_ALL "en_US.utf8")
+
+          (match (append-map ca-files '#$(manifest-inputs manifest))
+            (()
+             ;; Since there are no CA files, just create an empty directory.  Do
+             ;; not create the etc/ssl/certs sub-directory, since that would
+             ;; wrongfully lead to a message about 'SSL_CERT_DIR' needing to be
+             ;; defined.
+             (mkdir #$output)
+             #t)
+            ((ca-files ...)
+             (let ((result (string-append #$output "/etc/ssl/certs")))
+               (mkdir-p result)
+               (concatenate-files ca-files
+                                  (string-append result
+                                                 "/ca-certificates.crt"))
+               #t))))))
 
   (gexp->derivation "ca-certificate-bundle" build
-                    #:modules '((guix build utils))
                     #:local-build? #t
                     #:substitutable? #f))
 
@@ -645,44 +645,44 @@ MANIFEST.  Single-file bundles are required by programs such as Git and Lynx."
 creates the GTK+ 'icon-theme.cache' file for each theme."
   (mlet %store-monad ((gtk+ (manifest-lookup-package manifest "gtk+")))
     (define build
-      #~(begin
-          (use-modules (guix build utils)
-                       (guix build union)
-                       (guix build profiles)
-                       (srfi srfi-26)
-                       (ice-9 ftw))
-
-          (let* ((destdir  (string-append #$output "/share/icons"))
-                 (icondirs (filter file-exists?
-                                   (map (cut string-append <> "/share/icons")
-                                        '#$(manifest-inputs manifest))))
-                 (update-icon-cache (string-append
-                                     #+gtk+ "/bin/gtk-update-icon-cache")))
-
-            ;; Union all the icons.
-            (mkdir-p (string-append #$output "/share"))
-            (union-build destdir icondirs
-                         #:log-port (%make-void-port "w"))
-
-            ;; Update the 'icon-theme.cache' file for each icon theme.
-            (for-each
-             (lambda (theme)
-               (let ((dir (string-append destdir "/" theme)))
-                 ;; Occasionally DESTDIR contains plain files, such as
-                 ;; "abiword_48.png".  Ignore these.
-                 (when (file-is-directory? dir)
-                   (ensure-writable-directory dir)
-                   (system* update-icon-cache "-t" dir "--quiet"))))
-             (scandir destdir (negate (cut member <> '("." ".."))))))))
+      (with-imported-modules '((guix build utils)
+                               (guix build union)
+                               (guix build profiles)
+                               (guix search-paths)
+                               (guix records))
+        #~(begin
+            (use-modules (guix build utils)
+                         (guix build union)
+                         (guix build profiles)
+                         (srfi srfi-26)
+                         (ice-9 ftw))
+
+            (let* ((destdir  (string-append #$output "/share/icons"))
+                   (icondirs (filter file-exists?
+                                     (map (cut string-append <> "/share/icons")
+                                          '#$(manifest-inputs manifest))))
+                   (update-icon-cache (string-append
+                                       #+gtk+ "/bin/gtk-update-icon-cache")))
+
+              ;; Union all the icons.
+              (mkdir-p (string-append #$output "/share"))
+              (union-build destdir icondirs
+                           #:log-port (%make-void-port "w"))
+
+              ;; Update the 'icon-theme.cache' file for each icon theme.
+              (for-each
+               (lambda (theme)
+                 (let ((dir (string-append destdir "/" theme)))
+                   ;; Occasionally DESTDIR contains plain files, such as
+                   ;; "abiword_48.png".  Ignore these.
+                   (when (file-is-directory? dir)
+                     (ensure-writable-directory dir)
+                     (system* update-icon-cache "-t" dir "--quiet"))))
+               (scandir destdir (negate (cut member <> '("." "..")))))))))
 
     ;; Don't run the hook when there's nothing to do.
     (if gtk+
         (gexp->derivation "gtk-icon-themes" build
-                          #:modules '((guix build utils)
-                                      (guix build union)
-                                      (guix build profiles)
-                                      (guix search-paths)
-                                      (guix records))
                           #:local-build? #t
                           #:substitutable? #f)
         (return #f))))
@@ -695,28 +695,28 @@ MIME type."
                        (manifest-lookup-package
                         manifest "desktop-file-utils")))
     (define build
-      #~(begin
-          (use-modules (srfi srfi-26)
-                       (guix build utils)
-                       (guix build union))
-          (let* ((destdir (string-append #$output "/share/applications"))
-                 (appdirs (filter file-exists?
-                                  (map (cut string-append <>
-                                            "/share/applications")
-                                       '#$(manifest-inputs manifest))))
-                 (update-desktop-database (string-append
-                                           #+desktop-file-utils
-                                           "/bin/update-desktop-database")))
-            (mkdir-p (string-append #$output "/share"))
-            (union-build destdir appdirs
-                         #:log-port (%make-void-port "w"))
-            (exit (zero? (system* update-desktop-database destdir))))))
+      (with-imported-modules '((guix build utils)
+                               (guix build union))
+        #~(begin
+            (use-modules (srfi srfi-26)
+                         (guix build utils)
+                         (guix build union))
+            (let* ((destdir (string-append #$output "/share/applications"))
+                   (appdirs (filter file-exists?
+                                    (map (cut string-append <>
+                                              "/share/applications")
+                                         '#$(manifest-inputs manifest))))
+                   (update-desktop-database (string-append
+                                             #+desktop-file-utils
+                                             "/bin/update-desktop-database")))
+              (mkdir-p (string-append #$output "/share"))
+              (union-build destdir appdirs
+                           #:log-port (%make-void-port "w"))
+              (exit (zero? (system* update-desktop-database destdir)))))))
 
     ;; Don't run the hook when 'desktop-file-utils' is not referenced.
     (if desktop-file-utils
         (gexp->derivation "xdg-desktop-database" build
-                          #:modules '((guix build utils)
-                                      (guix build union))
                           #:local-build? #t
                           #:substitutable? #f)
         (return #f))))
@@ -728,30 +728,30 @@ entries.  It's used to query the MIME type of a given file."
                        (manifest-lookup-package
                         manifest "shared-mime-info")))
     (define build
-      #~(begin
-          (use-modules (srfi srfi-26)
-                       (guix build utils)
-                       (guix build union))
-          (let* ((datadir (string-append #$output "/share"))
-                 (destdir (string-append datadir "/mime"))
-                 (pkgdirs (filter file-exists?
-                                  (map (cut string-append <>
-                                            "/share/mime/packages")
-                                       '#$(manifest-inputs manifest))))
-                 (update-mime-database (string-append
-                                        #+shared-mime-info
-                                        "/bin/update-mime-database")))
-            (mkdir-p destdir)
-            (union-build (string-append destdir "/packages") pkgdirs
-                         #:log-port (%make-void-port "w"))
-            (setenv "XDG_DATA_HOME" datadir)
-            (exit (zero? (system* update-mime-database destdir))))))
+      (with-imported-modules  '((guix build utils)
+                                (guix build union))
+        #~(begin
+            (use-modules (srfi srfi-26)
+                         (guix build utils)
+                         (guix build union))
+            (let* ((datadir (string-append #$output "/share"))
+                   (destdir (string-append datadir "/mime"))
+                   (pkgdirs (filter file-exists?
+                                    (map (cut string-append <>
+                                              "/share/mime/packages")
+                                         '#$(manifest-inputs manifest))))
+                   (update-mime-database (string-append
+                                          #+shared-mime-info
+                                          "/bin/update-mime-database")))
+              (mkdir-p destdir)
+              (union-build (string-append destdir "/packages") pkgdirs
+                           #:log-port (%make-void-port "w"))
+              (setenv "XDG_DATA_HOME" datadir)
+              (exit (zero? (system* update-mime-database destdir)))))))
 
     ;; Don't run the hook when 'shared-mime-info' is referenced.
     (if shared-mime-info
         (gexp->derivation "xdg-mime-database" build
-                          #:modules '((guix build utils)
-                                      (guix build union))
                           #:local-build? #t
                           #:substitutable? #f)
         (return #f))))
@@ -790,34 +790,34 @@ the monadic procedures listed in HOOKS--such as an Info 'dir' file, etc."
               (manifest-inputs manifest)))
 
     (define builder
-      #~(begin
-          (use-modules (guix build profiles)
-                       (guix search-paths)
-                       (srfi srfi-1))
-
-          (setvbuf (current-output-port) _IOLBF)
-          (setvbuf (current-error-port) _IOLBF)
-
-          (define search-paths
-            ;; Search paths of MANIFEST's packages, converted back to their
-            ;; record form.
-            (map sexp->search-path-specification
-                 (delete-duplicates
-                  '#$(map search-path-specification->sexp
-                          (append-map manifest-entry-search-paths
-                                      (manifest-entries manifest))))))
-
-          (build-profile #$output '#$inputs
-                         #:manifest '#$(manifest->gexp manifest)
-                         #:search-paths search-paths)))
+      (with-imported-modules '((guix build profiles)
+                               (guix build union)
+                               (guix build utils)
+                               (guix search-paths)
+                               (guix records))
+        #~(begin
+            (use-modules (guix build profiles)
+                         (guix search-paths)
+                         (srfi srfi-1))
+
+            (setvbuf (current-output-port) _IOLBF)
+            (setvbuf (current-error-port) _IOLBF)
+
+            (define search-paths
+              ;; Search paths of MANIFEST's packages, converted back to their
+              ;; record form.
+              (map sexp->search-path-specification
+                   (delete-duplicates
+                    '#$(map search-path-specification->sexp
+                            (append-map manifest-entry-search-paths
+                                        (manifest-entries manifest))))))
+
+            (build-profile #$output '#$inputs
+                           #:manifest '#$(manifest->gexp manifest)
+                           #:search-paths search-paths))))
 
     (gexp->derivation "profile" builder
                       #:system system
-                      #:modules '((guix build profiles)
-                                  (guix build union)
-                                  (guix build utils)
-                                  (guix search-paths)
-                                  (guix records))
 
                       ;; Not worth offloading.
                       #:local-build? #t
diff --git a/guix/records.scm b/guix/records.scm
index 0d35a747b0..f3f3aafb04 100644
--- a/guix/records.scm
+++ b/guix/records.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -42,6 +42,15 @@
                        (format #f fmt args ...)
                        form))))
 
+(define (report-invalid-field-specifier name bindings)
+  "Report the first invalid binding among BINDINGS."
+  (let loop ((bindings bindings))
+    (syntax-case bindings ()
+      (((field value) rest ...)                   ;good
+       (loop #'(rest ...)))
+      ((weird _ ...)                              ;weird!
+       (syntax-violation name "invalid field specifier" #'weird)))))
+
 (define-syntax make-syntactic-constructor
   (syntax-rules ()
     "Make the syntactic constructor NAME for TYPE, that calls CTOR, and
@@ -147,7 +156,13 @@ fields, and DELAYED is the list of identifiers of delayed fields."
                                      "missing field initializers ~a"
                                      (lset-difference eq?
                                                       '(expected ...)
-                                                      fields)))))))))))))
+                                                      fields)))))))
+           ((_ bindings (... ...))
+            ;; One of BINDINGS doesn't match the (field value) pattern.
+            ;; Report precisely which one is faulty, instead of letting the
+            ;; "source expression failed to match any pattern" error.
+            (report-invalid-field-specifier 'name
+                                            #'(bindings (... ...))))))))))
 
 (define-syntax-rule (define-field-property-predicate predicate property)
   "Define PREDICATE as a procedure that takes a syntax object and, when passed
diff --git a/guix/scripts/challenge.scm b/guix/scripts/challenge.scm
index 149647cfdf..590d8f1099 100644
--- a/guix/scripts/challenge.scm
+++ b/guix/scripts/challenge.scm
@@ -21,6 +21,7 @@
   #:use-module (guix scripts)
   #:use-module (guix store)
   #:use-module (guix utils)
+  #:use-module (guix grafts)
   #:use-module (guix monads)
   #:use-module (guix base32)
   #:use-module (guix packages)
@@ -222,23 +223,26 @@ Challenge the substitutes for PACKAGE... provided by one or more servers.\n"))
            (urls     (assoc-ref opts 'substitute-urls)))
       (leave-on-EPIPE
        (with-store store
-         (let ((files (match files
-                        (()
-                         (filter (cut locally-built? store <>)
-                                 (live-paths store)))
-                        (x
-                         files))))
-           (set-build-options store
-                              #:use-substitutes? #f)
-
-           (run-with-store store
-             (mlet* %store-monad ((items  (mapm %store-monad
-                                                ensure-store-item files))
-                                  (issues (discrepancies items urls)))
-               (for-each summarize-discrepancy issues)
-               (unless (null? issues)
-                 (exit 2))
-               (return (null? issues)))
-             #:system system)))))))
+         ;; Disable grafts since substitute servers normally provide only
+         ;; ungrafted stuff.
+         (parameterize ((%graft? #f))
+           (let ((files (match files
+                          (()
+                           (filter (cut locally-built? store <>)
+                                   (live-paths store)))
+                          (x
+                           files))))
+             (set-build-options store
+                                #:use-substitutes? #f)
+
+             (run-with-store store
+               (mlet* %store-monad ((items  (mapm %store-monad
+                                                  ensure-store-item files))
+                                    (issues (discrepancies items urls)))
+                 (for-each summarize-discrepancy issues)
+                 (unless (null? issues)
+                   (exit 2))
+                 (return (null? issues)))
+               #:system system))))))))
 
 ;;; challenge.scm ends here
diff --git a/guix/scripts/gc.scm b/guix/scripts/gc.scm
index 8db28138c8..bdfee4308c 100644
--- a/guix/scripts/gc.scm
+++ b/guix/scripts/gc.scm
@@ -24,6 +24,7 @@
   #:use-module (ice-9 match)
   #:use-module (ice-9 regex)
   #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-11)
   #:use-module (srfi srfi-26)
   #:use-module (srfi srfi-37)
   #:export (guix-gc))
@@ -221,9 +222,11 @@ Invoke the garbage collector.\n"))
             (free-space
              (ensure-free-space store free-space))
             (min-freed
-             (collect-garbage store min-freed))
+             (let-values (((paths freed) (collect-garbage store min-freed)))
+              (info (_ "freed ~h bytes~%") freed)))
             (else
-             (collect-garbage store)))))
+             (let-values (((paths freed) (collect-garbage store)))
+              (info (_ "freed ~h bytes~%") freed))))))
         ((delete)
          (delete-paths store (map direct-store-path paths)))
         ((list-references)
diff --git a/guix/scripts/lint.scm b/guix/scripts/lint.scm
index b4fdb6f905..d5e9197cc9 100644
--- a/guix/scripts/lint.scm
+++ b/guix/scripts/lint.scm
@@ -359,7 +359,22 @@ warning for PACKAGE mentionning the FIELD."
                 (probe-uri uri #:timeout 3)))     ;wait at most 3 seconds
     (case status
       ((http-response)
-       (or (= 200 (response-code argument))
+       (if (= 200 (response-code argument))
+           (match (response-content-length argument)
+             ((? number? length)
+              ;; As of July 2016, SourceForge returns 200 (instead of 404)
+              ;; with a small HTML page upon failure.  Attempt to detect such
+              ;; malicious behavior.
+              (or (> length 1000)
+                  (begin
+                    (emit-warning package
+                                  (format #f
+                                          (_ "URI ~a returned \
+suspiciously small file (~a bytes)")
+                                          (uri->string uri)
+                                          length))
+                    #f)))
+             (_ #t))
            (begin
              (emit-warning package
                            (format #f
diff --git a/guix/scripts/publish.scm b/guix/scripts/publish.scm
index 4c0aa8e419..3baceaf645 100644
--- a/guix/scripts/publish.scm
+++ b/guix/scripts/publish.scm
@@ -27,6 +27,7 @@
   #:use-module (rnrs bytevectors)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-2)
+  #:use-module (srfi srfi-9)
   #:use-module (srfi srfi-9 gnu)
   #:use-module (srfi srfi-19)
   #:use-module (srfi srfi-26)
@@ -45,6 +46,7 @@
   #:use-module (guix pk-crypto)
   #:use-module (guix store)
   #:use-module (guix serialization)
+  #:use-module (guix zlib)
   #:use-module (guix ui)
   #:use-module (guix scripts)
   #:export (guix-publish))
@@ -59,6 +61,9 @@ Publish ~a over HTTP.\n") %store-directory)
   (display (_ "
   -u, --user=USER        change privileges to USER as soon as possible"))
   (display (_ "
+  -C, --compression[=LEVEL]
+                         compress archives at LEVEL"))
+  (display (_ "
       --ttl=TTL          announce narinfos can be cached for TTL seconds"))
   (display (_ "
   -r, --repl[=PORT]      spawn REPL server on PORT"))
@@ -79,6 +84,20 @@ Publish ~a over HTTP.\n") %store-directory)
       (leave (_ "lookup of host '~a' failed: ~a~%")
              host (gai-strerror error)))))
 
+;; Nar compression parameters.
+(define-record-type <compression>
+  (compression type level)
+  compression?
+  (type   compression-type)
+  (level  compression-level))
+
+(define %no-compression
+  (compression 'none 0))
+
+(define %default-gzip-compression
+  ;; Since we compress on the fly, default to fast compression.
+  (compression 'gzip 3))
+
 (define %options
   (list (option '(#\h "help") #f #f
                 (lambda _
@@ -102,6 +121,20 @@ Publish ~a over HTTP.\n") %store-directory)
                     (()
                      (leave (_ "lookup of host '~a' returned nothing")
                             name)))))
+        (option '(#\C "compression") #f #t
+                (lambda (opt name arg result)
+                  (match (if arg (string->number* arg) 3)
+                    (0
+                     (alist-cons 'compression %no-compression result))
+                    (level
+                     (if (zlib-available?)
+                         (alist-cons 'compression
+                                     (compression 'gzip level)
+                                     result)
+                         (begin
+                           (warning (_ "zlib support is missing; \
+compression disabled~%"))
+                           result))))))
         (option '("ttl") #t #f
                 (lambda (opt name arg result)
                   (let ((duration (string->duration arg)))
@@ -117,6 +150,12 @@ Publish ~a over HTTP.\n") %store-directory)
 
 (define %default-options
   `((port . 8080)
+
+    ;; Default to fast & low compression.
+    (compression . ,(if (zlib-available?)
+                        %default-gzip-compression
+                        %no-compression))
+
     (address . ,(make-socket-address AF_INET INADDR_ANY 0))
     (repl . #f)))
 
@@ -152,12 +191,20 @@ Publish ~a over HTTP.\n") %store-directory)
 (define base64-encode-string
   (compose base64-encode string->utf8))
 
-(define (narinfo-string store store-path key)
+(define* (narinfo-string store store-path key
+                         #:key (compression %no-compression))
   "Generate a narinfo key/value string for STORE-PATH; an exception is raised
-if STORE-PATH is invalid.  The narinfo is signed with KEY."
+if STORE-PATH is invalid.  Produce a URL that corresponds to COMPRESSION.  The
+narinfo is signed with KEY."
   (let* ((path-info  (query-path-info store store-path))
-         (url        (encode-and-join-uri-path (list "nar"
-                                                     (basename store-path))))
+         (url        (encode-and-join-uri-path
+                      `("nar"
+                        ,@(match compression
+                            (($ <compression> 'none)
+                             '())
+                            (($ <compression> type)
+                             (list (symbol->string type))))
+                        ,(basename store-path))))
          (hash       (bytevector->nix-base32-string
                       (path-info-hash path-info)))
          (size       (path-info-nar-size path-info))
@@ -166,13 +213,16 @@ if STORE-PATH is invalid.  The narinfo is signed with KEY."
                       " "))
          (deriver    (path-info-deriver path-info))
          (base-info  (format #f
-                             "StorePath: ~a
+                             "\
+StorePath: ~a
 URL: ~a
-Compression: none
+Compression: ~a
 NarHash: sha256:~a
 NarSize: ~d
 References: ~a~%"
-                             store-path url hash size references))
+                             store-path url
+                             (compression-type compression)
+                             hash size references))
          ;; Do not render a "Deriver" or "System" line if we are rendering
          ;; info for a derivation.
          (info       (if (not deriver)
@@ -209,7 +259,8 @@ References: ~a~%"
                         (format port "~a: ~a~%" key value)))
                       %nix-cache-info))))
 
-(define* (render-narinfo store request hash #:key ttl)
+(define* (render-narinfo store request hash
+                         #:key ttl (compression %no-compression))
   "Render metadata for the store path corresponding to HASH.  If TTL is true,
 advertise it as the maximum validity period (in seconds) via the
 'Cache-Control' header.  This allows 'guix substitute' to cache it for an
@@ -222,18 +273,35 @@ appropriate duration."
                         `((cache-control (max-age . ,ttl)))
                         '()))
                 (cut display
-                     (narinfo-string store store-path (force %private-key))
-                     <>)))))
-
-(define (render-nar store request store-item)
+                  (narinfo-string store store-path (force %private-key)
+                                  #:compression compression)
+                  <>)))))
+
+;; XXX: Declare the 'Guix-Compression' HTTP header, which is in fact for
+;; internal consumption: it allows us to pass the compression info to
+;; 'http-write', as part of the workaround to <http://bugs.gnu.org/21093>.
+(declare-header! "Guix-Nar-Compression"
+                 (lambda (str)
+                   (match (call-with-input-string str read)
+                     (('compression type level)
+                      (compression type level))))
+                 compression?
+                 (lambda (compression port)
+                   (match compression
+                     (($ <compression> type level)
+                      (write `(compression ,type ,level) port)))))
+
+(define* (render-nar store request store-item
+                     #:key (compression %no-compression))
   "Render archive of the store path corresponding to STORE-ITEM."
   (let ((store-path (string-append %store-directory "/" store-item)))
     ;; The ISO-8859-1 charset *must* be used otherwise HTTP clients will
     ;; interpret the byte stream as UTF-8 and arbitrarily change invalid byte
     ;; sequences.
     (if (valid-path? store store-path)
-        (values '((content-type . (application/x-nix-archive
-                                   (charset . "ISO-8859-1"))))
+        (values `((content-type . (application/x-nix-archive
+                                   (charset . "ISO-8859-1")))
+                  (guix-nar-compression . ,compression))
                 ;; XXX: We're not returning the actual contents, deferring
                 ;; instead to 'http-write'.  This is a hack to work around
                 ;; <http://bugs.gnu.org/21093>.
@@ -282,6 +350,28 @@ example: \"/foo/bar\" yields '(\"foo\" \"bar\")."
           (values)
           (apply throw args)))))
 
+(define-syntax-rule (swallow-zlib-error exp ...)
+  "Swallow 'zlib-error' exceptions raised by EXP..."
+  (catch 'zlib-error
+    (lambda ()
+      exp ...)
+    (const #f)))
+
+(define (nar-response-port response)
+  "Return a port on which to write the body of RESPONSE, the response of a
+/nar request, according to COMPRESSION."
+  (match (assoc-ref (response-headers response) 'guix-nar-compression)
+    (($ <compression> 'gzip level)
+     ;; Note: We cannot used chunked encoding here because
+     ;; 'make-gzip-output-port' wants a file port.
+     (make-gzip-output-port (response-port response)
+                            #:level level
+                            #:buffer-size (* 64 1024)))
+    (($ <compression> 'none)
+     (response-port response))
+    (#f
+     (response-port response))))
+
 (define (http-write server client response body)
   "Write RESPONSE and BODY to CLIENT, possibly in a separate thread to avoid
 blocking."
@@ -293,16 +383,20 @@ blocking."
       (lambda ()
         (let* ((response (write-response (sans-content-length response)
                                          client))
-               (port     (response-port response)))
+               (port     (begin
+                           (force-output client)
+                           (nar-response-port response))))
           ;; XXX: Given our ugly workaround for <http://bugs.gnu.org/21093> in
           ;; 'render-nar', BODY here is just the file name of the store item.
           ;; We call 'write-file' from here because we know that's the only
           ;; way to avoid building the whole nar in memory, which could
           ;; quickly become a real problem.  As a bonus, we even do
           ;; sendfile(2) directly from the store files to the socket.
-          (swallow-EPIPE
-           (write-file (utf8->string body) port))
-          (close-port port)
+          (swallow-zlib-error
+           (swallow-EPIPE
+            (write-file (utf8->string body) port)))
+          (swallow-zlib-error
+           (close-port port))
           (values)))))
     (_
      ;; Handle other responses sequentially.
@@ -316,7 +410,10 @@ blocking."
   http-write
   (@@ (web server http) http-close))
 
-(define* (make-request-handler store #:key narinfo-ttl)
+(define* (make-request-handler store
+                               #:key
+                               narinfo-ttl
+                               (compression %no-compression))
   (lambda (request body)
     (format #t "~a ~a~%"
             (request-method request)
@@ -330,16 +427,37 @@ blocking."
           (((= extract-narinfo-hash (? string? hash)))
            ;; TODO: Register roots for HASH that will somehow remain for
            ;; NARINFO-TTL.
-           (render-narinfo store request hash #:ttl narinfo-ttl))
+           (render-narinfo store request hash
+                           #:ttl narinfo-ttl
+                           #:compression compression))
+
+          ;; Use different URLs depending on the compression type.  This
+          ;; guarantees that /nar URLs remain valid even when 'guix publish'
+          ;; is restarted with different compression parameters.
+
           ;; /nar/<store-item>
           (("nar" store-item)
-           (render-nar store request store-item))
+           (render-nar store request store-item
+                       #:compression %no-compression))
+          ;; /nar/gzip/<store-item>
+          (("nar" "gzip" store-item)
+           (if (zlib-available?)
+               (render-nar store request store-item
+                           #:compression
+                           (match compression
+                             (($ <compression> 'gzip)
+                              compression)
+                             (_
+                              %default-gzip-compression)))
+               (not-found request)))
           (_ (not-found request)))
         (not-found request))))
 
 (define* (run-publish-server socket store
-                             #:key narinfo-ttl)
-  (run-server (make-request-handler store #:narinfo-ttl narinfo-ttl)
+                             #:key (compression %no-compression) narinfo-ttl)
+  (run-server (make-request-handler store
+                                    #:narinfo-ttl narinfo-ttl
+                                    #:compression compression)
               concurrent-http-server
               `(#:socket ,socket)))
 
@@ -378,6 +496,7 @@ blocking."
            (user    (assoc-ref opts 'user))
            (port    (assoc-ref opts 'port))
            (ttl     (assoc-ref opts 'narinfo-ttl))
+           (compression (assoc-ref opts 'compression))
            (address (let ((addr (assoc-ref opts 'address)))
                       (make-socket-address (sockaddr:fam addr)
                                            (sockaddr:addr addr)
@@ -404,4 +523,6 @@ consider using the '--user' option!~%")))
       (when repl-port
         (repl:spawn-server (repl:make-tcp-server-socket #:port repl-port)))
       (with-store store
-        (run-publish-server socket store #:narinfo-ttl ttl)))))
+        (run-publish-server socket store
+                            #:compression compression
+                            #:narinfo-ttl ttl)))))
diff --git a/guix/scripts/substitute.scm b/guix/scripts/substitute.scm
index 5722aa821d..8827c45fb8 100755
--- a/guix/scripts/substitute.scm
+++ b/guix/scripts/substitute.scm
@@ -610,7 +610,8 @@ if file doesn't exist, and the narinfo otherwise."
             (update-progress!)
             (cons narinfo result))
           (let* ((path      (uri-path (request-uri request)))
-                 (hash-part (string-drop-right path 8))) ; drop ".narinfo"
+                 (hash-part (basename
+                             (string-drop-right path 8)))) ;drop ".narinfo"
             (if len
                 (get-bytevector-n port len)
                 (read-to-eof port))
diff --git a/guix/scripts/system.scm b/guix/scripts/system.scm
index dd1e534c9b..e2c6b2efee 100644
--- a/guix/scripts/system.scm
+++ b/guix/scripts/system.scm
@@ -362,7 +362,7 @@ it atomically, and then run OS's activation script."
        ;; The activation script may modify '%load-path' & co., so protect
        ;; against that.  This is necessary to ensure that
        ;; 'upgrade-shepherd-services' gets to see the right modules when it
-       ;; computes derivations with (gexp->derivation #:modules …).
+       ;; computes derivations with 'gexp->derivation'.
        (save-load-path-excursion
         (primitive-load (derivation->output-path script))))
 
diff --git a/guix/store.scm b/guix/store.scm
index 276684e2fb..9f409b4209 100644
--- a/guix/store.scm
+++ b/guix/store.scm
@@ -510,7 +510,7 @@ encoding conversion errors."
   (map (if (false-if-exception (resolve-interface '(gnutls)))
            (cut string-append "https://" <>)
            (cut string-append "http://" <>))
-       '("mirror.hydra.gnu.org" "hydra.gnu.org")))
+       '("mirror.hydra.gnu.org")))
 
 (define* (set-build-options server
                             #:key keep-failed? keep-going? fallback?
diff --git a/guix/svn-download.scm b/guix/svn-download.scm
index d6853ca861..c1200fa0c5 100644
--- a/guix/svn-download.scm
+++ b/guix/svn-download.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014, 2015 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014 Sree Harsha Totakura <sreeharsha@totakura.in>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -41,8 +41,10 @@
 (define-record-type* <svn-reference>
   svn-reference make-svn-reference
   svn-reference?
-  (url      svn-reference-url)                    ; string
-  (revision svn-reference-revision))              ; number
+  (url       svn-reference-url)                    ; string
+  (revision  svn-reference-revision)               ; number
+  (user-name svn-reference-user-name (default #f))
+  (password  svn-reference-password (default #f)))
 
 (define (subversion-package)
   "Return the default Subversion package."
@@ -57,12 +59,16 @@
 object.  The output is expected to have recursive hash HASH of type
 HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
   (define build
-    #~(begin
-        (use-modules (guix build svn))
-        (svn-fetch '#$(svn-reference-url ref)
-                   '#$(svn-reference-revision ref)
-                   #$output
-                   #:svn-command (string-append #+svn "/bin/svn"))))
+    (with-imported-modules '((guix build svn)
+                             (guix build utils))
+      #~(begin
+          (use-modules (guix build svn))
+          (svn-fetch '#$(svn-reference-url ref)
+                     '#$(svn-reference-revision ref)
+                     #$output
+                     #:svn-command (string-append #+svn "/bin/svn")
+                     #:user-name #$(svn-reference-user-name ref)
+                     #:password #$(svn-reference-password ref)))))
 
   (mlet %store-monad ((guile (package->derivation guile system)))
     (gexp->derivation (or name "svn-checkout") build
@@ -70,8 +76,6 @@ HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
                       #:hash-algo hash-algo
                       #:hash hash
                       #:recursive? #t
-                      #:modules '((guix build svn)
-                                  (guix build utils))
                       #:guile-for-build guile
                       #:local-build? #t)))
 
diff --git a/guix/zlib.scm b/guix/zlib.scm
new file mode 100644
index 0000000000..51e5e9e426
--- /dev/null
+++ b/guix/zlib.scm
@@ -0,0 +1,234 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016 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/>.
+
+(define-module (guix zlib)
+  #:use-module (rnrs bytevectors)
+  #:use-module (ice-9 binary-ports)
+  #:use-module (ice-9 match)
+  #:use-module (system foreign)
+  #:use-module (guix config)
+  #:export (zlib-available?
+            make-gzip-input-port
+            make-gzip-output-port
+            call-with-gzip-input-port
+            call-with-gzip-output-port
+            %default-buffer-size
+            %default-compression-level))
+
+;;; Commentary:
+;;;
+;;; Bindings to the gzip-related part of zlib's API.  The main limitation of
+;;; this API is that it requires a file descriptor as the source or sink.
+;;;
+;;; Code:
+
+(define %zlib
+  ;; File name of zlib's shared library.  When updating via 'guix pull',
+  ;; '%libz' might be undefined so protect against it.
+  (delay (dynamic-link (if (defined? '%libz)
+                           %libz
+                           "libz"))))
+
+(define (zlib-available?)
+  "Return true if zlib is available, #f otherwise."
+  (false-if-exception (force %zlib)))
+
+(define (zlib-procedure ret name parameters)
+  "Return a procedure corresponding to C function NAME in libz, or #f if
+either zlib or the function could not be found."
+  (match (false-if-exception (dynamic-func name (force %zlib)))
+    ((? pointer? ptr)
+     (pointer->procedure ret ptr parameters))
+    (#f
+     #f)))
+
+(define-wrapped-pointer-type <gzip-file>
+  ;; Scheme counterpart of the 'gzFile' opaque type.
+  gzip-file?
+  pointer->gzip-file
+  gzip-file->pointer
+  (lambda (obj port)
+    (format port "#<gzip-file ~a>"
+            (number->string (object-address obj) 16))))
+
+(define gzerror
+  (let ((proc (zlib-procedure '* "gzerror" '(* *))))
+    (lambda (gzfile)
+      (let* ((errnum* (make-bytevector (sizeof int)))
+             (ptr     (proc (gzip-file->pointer gzfile)
+                            (bytevector->pointer errnum*))))
+        (values (bytevector-sint-ref errnum* 0
+                                     (native-endianness) (sizeof int))
+                (pointer->string ptr))))))
+
+(define gzdopen
+  (let ((proc (zlib-procedure '* "gzdopen" (list int '*))))
+    (lambda (fd mode)
+      "Open file descriptor FD as a gzip stream with the given MODE.  MODE must
+be a string denoting the how FD is to be opened, such as \"r\" for reading or
+\"w9\" for writing data compressed at level 9 to FD.  Calling 'gzclose' also
+closes FD."
+      (let ((result (proc fd (string->pointer mode))))
+        (if (null-pointer? result)
+            (throw 'zlib-error 'gzdopen)
+            (pointer->gzip-file result))))))
+
+(define gzread!
+  (let ((proc (zlib-procedure int "gzread" (list '* '* unsigned-int))))
+    (lambda* (gzfile bv #:optional (start 0) (count (bytevector-length bv)))
+      "Read up to COUNT bytes from GZFILE into BV at offset START.  Return the
+number of uncompressed bytes actually read."
+      (let ((ret (proc (gzip-file->pointer gzfile)
+                       (bytevector->pointer bv start)
+                       count)))
+        (if (< ret 0)
+            (throw 'zlib-error 'gzread! ret)
+            ret)))))
+
+(define gzwrite
+  (let ((proc (zlib-procedure int "gzwrite" (list '* '* unsigned-int))))
+    (lambda* (gzfile bv #:optional (start 0) (count (bytevector-length bv)))
+      "Write up to COUNT bytes from BV at offset START into GZFILE.  Return
+the number of uncompressed bytes written, a strictly positive integer."
+      (let ((ret (proc (gzip-file->pointer gzfile)
+                       (bytevector->pointer bv start)
+                       count)))
+        (if (<= ret 0)
+            (throw 'zlib-error 'gzwrite ret)
+            ret)))))
+
+(define gzbuffer!
+  (let ((proc (zlib-procedure int "gzbuffer" (list '* unsigned-int))))
+    (lambda (gzfile size)
+      "Change the internal buffer size of GZFILE to SIZE bytes."
+      (let ((ret (proc (gzip-file->pointer gzfile) size)))
+        (unless (zero? ret)
+          (throw 'zlib-error 'gzbuffer! ret))))))
+
+(define gzeof?
+  (let ((proc (zlib-procedure int "gzeof" '(*))))
+    (lambda (gzfile)
+      "Return true if the end-of-file has been reached on GZFILE."
+      (not (zero? (proc (gzip-file->pointer gzfile)))))))
+
+(define gzclose
+  (let ((proc (zlib-procedure int "gzclose" '(*))))
+    (lambda (gzfile)
+      "Close GZFILE."
+      (let ((ret (proc (gzip-file->pointer gzfile))))
+        (unless (zero? ret)
+          (throw 'zlib-error 'gzclose ret (gzerror gzfile)))))))
+
+
+
+;;;
+;;; Port interface.
+;;;
+
+(define %default-buffer-size
+  ;; Default buffer size, as documented in <zlib.h>.
+  8192)
+
+(define %default-compression-level
+  ;; Z_DEFAULT_COMPRESSION.
+  -1)
+
+(define (close-procedure gzfile port)
+  "Return a procedure that closes GZFILE, ensuring its underlying PORT is
+closed even if closing GZFILE triggers an exception."
+  (lambda ()
+    (catch 'zlib-error
+      (lambda ()
+        ;; 'gzclose' closes the underlying file descriptor.  'close-port'
+        ;; calls close(2), gets EBADF, which is ignores.
+        (gzclose gzfile)
+        (close-port port))
+      (lambda args
+        ;; Make sure PORT is closed despite the zlib error.
+        (close-port port)
+        (apply throw args)))))
+
+(define* (make-gzip-input-port port #:key (buffer-size %default-buffer-size))
+  "Return an input port that decompresses data read from PORT, a file port.
+PORT is automatically closed when the resulting port is closed.  BUFFER-SIZE
+is the size in bytes of the internal buffer, 8 KiB by default; using a larger
+buffer increases decompression speed."
+  (define gzfile
+    (gzdopen (fileno port) "r"))
+
+  (define (read! bv start count)
+    ;; XXX: Can 'gzread!' return zero even though we haven't reached the EOF?
+    (gzread! gzfile bv start count))
+
+  (unless (= buffer-size %default-buffer-size)
+    (gzbuffer! gzfile buffer-size))
+
+  (make-custom-binary-input-port "gzip-input" read! #f #f
+                                 (close-procedure gzfile port)))
+
+(define* (make-gzip-output-port port
+                                #:key
+                                (level %default-compression-level)
+                                (buffer-size %default-buffer-size))
+  "Return an output port that compresses data at the given LEVEL, using PORT,
+a file port, as its sink.  PORT is automatically closed when the resulting
+port is closed."
+  (define gzfile
+    (gzdopen (fileno port)
+             (string-append "w" (number->string level))))
+
+  (define (write! bv start count)
+    (gzwrite gzfile bv start count))
+
+  (unless (= buffer-size %default-buffer-size)
+    (gzbuffer! gzfile buffer-size))
+
+  (make-custom-binary-output-port "gzip-output" write! #f #f
+                                  (close-procedure gzfile port)))
+
+(define* (call-with-gzip-input-port port proc
+                                    #:key (buffer-size %default-buffer-size))
+  "Call PROC with a port that wraps PORT and decompresses data read from it.
+PORT is closed upon completion.  The gzip internal buffer size is set to
+BUFFER-SIZE bytes."
+  (let ((gzip (make-gzip-input-port port #:buffer-size buffer-size)))
+    (dynamic-wind
+      (const #t)
+      (lambda ()
+        (proc gzip))
+      (lambda ()
+        (close-port gzip)))))
+
+(define* (call-with-gzip-output-port port proc
+                                     #:key
+                                     (level %default-compression-level)
+                                     (buffer-size %default-buffer-size))
+  "Call PROC with an output port that wraps PORT and compresses data.  PORT is
+close upon completion.  The gzip internal buffer size is set to BUFFER-SIZE
+bytes."
+  (let ((gzip (make-gzip-output-port port
+                                     #:level level
+                                     #:buffer-size buffer-size)))
+    (dynamic-wind
+      (const #t)
+      (lambda ()
+        (proc gzip))
+      (lambda ()
+        (close-port gzip)))))
+
+;;; zlib.scm ends here
diff --git a/m4/guix.m4 b/m4/guix.m4
index 654789e1d9..949ae4ca7c 100644
--- a/m4/guix.m4
+++ b/m4/guix.m4
@@ -295,6 +295,17 @@ AC_DEFUN([GUIX_LIBGCRYPT_LIBDIR], [
   $1="$guix_cv_libgcrypt_libdir"
 ])
 
+dnl GUIX_LIBZ_LIBDIR VAR
+dnl
+dnl Attempt to determine libz's LIBDIR; store the result in VAR.
+AC_DEFUN([GUIX_LIBZ_LIBDIR], [
+  AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+  AC_CACHE_CHECK([zlib's library directory],
+    [guix_cv_libz_libdir],
+    [guix_cv_libz_libdir="`$PKG_CONFIG zlib --variable=libdir 2> /dev/null`"])
+  $1="$guix_cv_libz_libdir"
+])
+
 dnl GUIX_CURRENT_LOCALSTATEDIR
 dnl
 dnl Determine the localstatedir of an existing Guix installation and set
diff --git a/tests/cpan.scm b/tests/cpan.scm
index 5d56f0bd2b..898081b3e5 100644
--- a/tests/cpan.scm
+++ b/tests/cpan.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015 Eric Bavier <bavier@member.fsf.org>
+;;; Copyright © 2016 Alex Sassmannshausen <alex@pompo.co>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -97,4 +98,14 @@
       (x
        (pk 'fail x #f)))))
 
+(test-equal "source-url-http"
+  ((@@ (guix import cpan) fix-source-url)
+   "http://cpan.metacpan.org/authors/id/T/TE/TEST/Foo-Bar-0.1.tar.gz")
+  "mirror://cpan/authors/id/T/TE/TEST/Foo-Bar-0.1.tar.gz")
+
+(test-equal "source-url-https"
+  ((@@ (guix import cpan) fix-source-url)
+   "https://cpan.metacpan.org/authors/id/T/TE/TEST/Foo-Bar-0.1.tar.gz")
+  "mirror://cpan/authors/id/T/TE/TEST/Foo-Bar-0.1.tar.gz")
+
 (test-end "cpan")
diff --git a/tests/gexp.scm b/tests/gexp.scm
index f44f0eaf9a..03a64fa6bb 100644
--- a/tests/gexp.scm
+++ b/tests/gexp.scm
@@ -526,6 +526,18 @@
                             get-bytevector-all))))
                 files))))))
 
+(test-equal "gexp-modules & ungexp"
+  '((bar) (foo))
+  ((@@ (guix gexp) gexp-modules)
+   #~(foo #$(with-imported-modules '((foo)) #~+)
+          #+(with-imported-modules '((bar)) #~-))))
+
+(test-equal "gexp-modules & ungexp-splicing"
+  '((foo) (bar))
+  ((@@ (guix gexp) gexp-modules)
+   #~(foo #$@(list (with-imported-modules '((foo)) #~+)
+                   (with-imported-modules '((bar)) #~-)))))
+
 (test-assertm "gexp->derivation #:modules"
   (mlet* %store-monad
       ((build ->  #~(begin
@@ -540,31 +552,75 @@
              (s (stat (string-append p "/guile/guix/nix"))))
         (return (eq? (stat:type s) 'directory))))))
 
+(test-assertm "gexp->derivation & with-imported-modules"
+  ;; Same test as above, but using 'with-imported-modules'.
+  (mlet* %store-monad
+      ((build ->  (with-imported-modules '((guix build utils))
+                    #~(begin
+                        (use-modules (guix build utils))
+                        (mkdir-p (string-append #$output "/guile/guix/nix"))
+                        #t)))
+       (drv       (gexp->derivation "test-with-modules" build)))
+    (mbegin %store-monad
+      (built-derivations (list drv))
+      (let* ((p (derivation->output-path drv))
+             (s (stat (string-append p "/guile/guix/nix"))))
+        (return (eq? (stat:type s) 'directory))))))
+
+(test-assertm "gexp->derivation & nested with-imported-modules"
+  (mlet* %store-monad
+      ((build1 ->  (with-imported-modules '((guix build utils))
+                     #~(begin
+                         (use-modules (guix build utils))
+                         (mkdir-p (string-append #$output "/guile/guix/nix"))
+                         #t)))
+       (build2 ->  (with-imported-modules '((guix build bournish))
+                     #~(begin
+                         (use-modules (guix build bournish)
+                                      (system base compile))
+                         #+build1
+                         (call-with-output-file (string-append #$output "/b")
+                           (lambda (port)
+                             (write
+                              (read-and-compile (open-input-string "cd /foo")
+                                                #:from %bournish-language
+                                                #:to 'scheme)
+                              port))))))
+       (drv        (gexp->derivation "test-with-modules" build2)))
+    (mbegin %store-monad
+      (built-derivations (list drv))
+      (let* ((p (derivation->output-path drv))
+             (s (stat (string-append p "/guile/guix/nix")))
+             (b (string-append p "/b")))
+        (return (and (eq? (stat:type s) 'directory)
+                     (equal? '(chdir "/foo")
+                             (call-with-input-file b read))))))))
+
 (test-assertm "gexp->derivation #:references-graphs"
   (mlet* %store-monad
       ((one (text-file "one" (random-text)))
        (two (gexp->derivation "two"
                               #~(symlink #$one #$output:chbouib)))
-       (drv (gexp->derivation "ref-graphs"
-                              #~(begin
-                                  (use-modules (guix build store-copy))
-                                  (with-output-to-file #$output
-                                    (lambda ()
-                                      (write (call-with-input-file "guile"
-                                               read-reference-graph))))
-                                  (with-output-to-file #$output:one
-                                    (lambda ()
-                                      (write (call-with-input-file "one"
-                                               read-reference-graph))))
-                                  (with-output-to-file #$output:two
-                                    (lambda ()
-                                      (write (call-with-input-file "two"
-                                               read-reference-graph)))))
+       (build -> (with-imported-modules '((guix build store-copy)
+                                          (guix build utils))
+                   #~(begin
+                       (use-modules (guix build store-copy))
+                       (with-output-to-file #$output
+                         (lambda ()
+                           (write (call-with-input-file "guile"
+                                    read-reference-graph))))
+                       (with-output-to-file #$output:one
+                         (lambda ()
+                           (write (call-with-input-file "one"
+                                    read-reference-graph))))
+                       (with-output-to-file #$output:two
+                         (lambda ()
+                           (write (call-with-input-file "two"
+                                    read-reference-graph)))))))
+       (drv (gexp->derivation "ref-graphs" build
                               #:references-graphs `(("one" ,one)
                                                     ("two" ,two "chbouib")
-                                                    ("guile" ,%bootstrap-guile))
-                              #:modules '((guix build store-copy)
-                                          (guix build utils))))
+                                                    ("guile" ,%bootstrap-guile))))
        (ok? (built-derivations (list drv)))
        (guile-drv  (package->derivation %bootstrap-guile))
        (bash       (interned-file (search-bootstrap-binary "bash"
@@ -676,11 +732,11 @@
 
 (test-assertm "program-file"
   (let* ((n      (random (expt 2 50)))
-         (exp    (gexp (begin
-                         (use-modules (guix build utils))
-                         (display (ungexp n)))))
+         (exp    (with-imported-modules '((guix build utils))
+                   (gexp (begin
+                           (use-modules (guix build utils))
+                           (display (ungexp n))))))
          (file   (program-file "program" exp
-                               #:modules '((guix build utils))
                                #:guile %bootstrap-guile)))
     (mlet* %store-monad ((drv (lower-object file))
                          (out -> (derivation->output-path drv)))
diff --git a/tests/grafts.scm b/tests/grafts.scm
index 8cd048552c..13c56750ed 100644
--- a/tests/grafts.scm
+++ b/tests/grafts.scm
@@ -135,14 +135,14 @@
                                      (replacement fake)))
                          (drv     (gexp->derivation
                                    "to-graft"
-                                   #~(begin
-                                       (use-modules (guix build utils))
-                                       (mkdir-p (string-append #$output
-                                                               "/a/b/c/d"))
-                                       (symlink #$%bash
-                                                (string-append #$output
-                                                               "/bash")))
-                                   #:modules '((guix build utils))))
+                                   (with-imported-modules '((guix build utils))
+                                     #~(begin
+                                         (use-modules (guix build utils))
+                                         (mkdir-p (string-append #$output
+                                                                 "/a/b/c/d"))
+                                         (symlink #$%bash
+                                                  (string-append #$output
+                                                                 "/bash"))))))
                          (grafted ((store-lift graft-derivation) drv
                                    (list graft)))
                          (_       (built-derivations (list grafted)))
diff --git a/tests/lint.scm b/tests/lint.scm
index 1f1b0c95e9..ce751c42c9 100644
--- a/tests/lint.scm
+++ b/tests/lint.scm
@@ -102,14 +102,14 @@
   http-write
   (@@ (web server http) http-close))
 
-(define (call-with-http-server code thunk)
-  "Call THUNK with an HTTP server running and returning CODE on HTTP
-requests."
+(define (call-with-http-server code data thunk)
+  "Call THUNK with an HTTP server running and returning CODE and DATA (a
+string) on HTTP requests."
   (define (server-body)
     (define (handle request body)
       (values (build-response #:code code
                               #:reason-phrase "Such is life")
-              "Hello, world."))
+              data))
 
     (catch 'quit
       (lambda ()
@@ -123,8 +123,11 @@ requests."
       ;; Normally SERVER exits automatically once it has received a request.
       (thunk))))
 
-(define-syntax-rule (with-http-server code body ...)
-  (call-with-http-server code (lambda () body ...)))
+(define-syntax-rule (with-http-server code data body ...)
+  (call-with-http-server code data (lambda () body ...)))
+
+(define %long-string
+  (make-string 2000 #\a))
 
 
 (test-begin "lint")
@@ -402,18 +405,30 @@ requests."
 (test-equal "home-page: 200"
   ""
   (with-warnings
-   (with-http-server 200
+   (with-http-server 200 %long-string
      (let ((pkg (package
                   (inherit (dummy-package "x"))
                   (home-page %local-url))))
        (check-home-page pkg)))))
 
 (test-skip (if %http-server-socket 0 1))
+(test-assert "home-page: 200 but short length"
+  (->bool
+   (string-contains
+    (with-warnings
+      (with-http-server 200 "This is too small."
+        (let ((pkg (package
+                     (inherit (dummy-package "x"))
+                     (home-page %local-url))))
+          (check-home-page pkg))))
+    "suspiciously small")))
+
+(test-skip (if %http-server-socket 0 1))
 (test-assert "home-page: 404"
   (->bool
    (string-contains
     (with-warnings
-      (with-http-server 404
+      (with-http-server 404 %long-string
         (let ((pkg (package
                      (inherit (dummy-package "x"))
                      (home-page %local-url))))
@@ -501,7 +516,7 @@ requests."
 (test-equal "source: 200"
   ""
   (with-warnings
-   (with-http-server 200
+   (with-http-server 200 %long-string
      (let ((pkg (package
                   (inherit (dummy-package "x"))
                   (source (origin
@@ -511,11 +526,26 @@ requests."
        (check-source pkg)))))
 
 (test-skip (if %http-server-socket 0 1))
+(test-assert "source: 200 but short length"
+  (->bool
+   (string-contains
+    (with-warnings
+      (with-http-server 200 "This is too small."
+        (let ((pkg (package
+                     (inherit (dummy-package "x"))
+                     (source (origin
+                               (method url-fetch)
+                               (uri %local-url)
+                               (sha256 %null-sha256))))))
+          (check-source pkg))))
+    "suspiciously small")))
+
+(test-skip (if %http-server-socket 0 1))
 (test-assert "source: 404"
   (->bool
    (string-contains
     (with-warnings
-      (with-http-server 404
+      (with-http-server 404 %long-string
         (let ((pkg (package
                      (inherit (dummy-package "x"))
                      (source (origin
@@ -617,6 +647,6 @@ requests."
 (test-end "lint")
 
 ;; Local Variables:
-;; eval: (put 'with-http-server 'scheme-indent-function 1)
+;; eval: (put 'with-http-server 'scheme-indent-function 2)
 ;; eval: (put 'with-warnings 'scheme-indent-function 0)
 ;; End:
diff --git a/tests/packages.scm b/tests/packages.scm
index 94f5ea71a5..fc75e38730 100644
--- a/tests/packages.scm
+++ b/tests/packages.scm
@@ -335,7 +335,6 @@
                        ("patch" ,%bootstrap-coreutils&co)))
                     (patch-guile %bootstrap-guile)
                     (modules '((guix build utils)))
-                    (imported-modules modules)
                     (snippet '(begin
                                 ;; We end up in 'bin', because it's the first
                                 ;; directory, alphabetically.  Not a very good
diff --git a/tests/publish.scm b/tests/publish.scm
index d6d537c58a..9bf181f1fc 100644
--- a/tests/publish.scm
+++ b/tests/publish.scm
@@ -28,12 +28,15 @@
   #:use-module (guix store)
   #:use-module (guix base32)
   #:use-module (guix base64)
+  #:use-module ((guix records) #:select (recutils->alist))
   #:use-module ((guix serialization) #:select (restore-file))
   #:use-module (guix pk-crypto)
+  #:use-module (guix zlib)
   #:use-module (web uri)
   #:use-module (web client)
   #:use-module (web response)
   #:use-module (rnrs bytevectors)
+  #:use-module (ice-9 binary-ports)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-26)
   #:use-module (srfi srfi-64)
@@ -52,20 +55,28 @@
   (call-with-values (lambda () (http-get uri))
     (lambda (response body) body)))
 
+(define (http-get-port uri)
+  (call-with-values (lambda () (http-get uri #:streaming? #t))
+    (lambda (response port) port)))
+
 (define (publish-uri route)
   (string-append "http://localhost:6789" route))
 
 ;; Run a local publishing server in a separate thread.
 (call-with-new-thread
  (lambda ()
-   (guix-publish "--port=6789"))) ; attempt to avoid port collision
+   (guix-publish "--port=6789" "-C0")))       ;attempt to avoid port collision
+
+(define (wait-until-ready port)
+  ;; Wait until the server is accepting connections.
+  (let ((conn (socket PF_INET SOCK_STREAM 0)))
+    (let loop ()
+      (unless (false-if-exception
+               (connect conn AF_INET (inet-pton AF_INET "127.0.0.1") port))
+        (loop)))))
 
-;; Wait until the server is accepting connections.
-(let ((conn (socket PF_INET SOCK_STREAM 0)))
-  (let loop ()
-    (unless (false-if-exception
-             (connect conn AF_INET (inet-pton AF_INET "127.0.0.1") 6789))
-      (loop))))
+;; Wait until the two servers are ready.
+(wait-until-ready 6789)
 
 
 (test-begin "publish")
@@ -145,6 +156,40 @@ References: ~%"
        (call-with-input-string nar (cut restore-file <> temp)))
      (call-with-input-file temp read-string))))
 
+(unless (zlib-available?)
+  (test-skip 1))
+(test-equal "/nar/gzip/*"
+  "bar"
+  (call-with-temporary-output-file
+   (lambda (temp port)
+     (let ((nar (http-get-port
+                 (publish-uri
+                  (string-append "/nar/gzip/" (basename %item))))))
+       (call-with-gzip-input-port nar
+         (cut restore-file <> temp)))
+     (call-with-input-file temp read-string))))
+
+(unless (zlib-available?)
+  (test-skip 1))
+(test-equal "/*.narinfo with compression"
+  `(("StorePath" . ,%item)
+    ("URL" . ,(string-append "nar/gzip/" (basename %item)))
+    ("Compression" . "gzip"))
+  (let ((thread (call-with-new-thread
+                 (lambda ()
+                   (guix-publish "--port=6799" "-C5")))))
+    (wait-until-ready 6799)
+    (let* ((url  (string-append "http://localhost:6799/"
+                                (store-path-hash-part %item) ".narinfo"))
+           (body (http-get-port url)))
+      (filter (lambda (item)
+                (match item
+                  (("Compression" . _) #t)
+                  (("StorePath" . _)  #t)
+                  (("URL" . _) #t)
+                  (_ #f)))
+              (recutils->alist body)))))
+
 (test-equal "/nar/ with properly encoded '+' sign"
   "Congrats!"
   (let ((item (add-text-to-store %store "fake-gtk+" "Congrats!")))
diff --git a/tests/records.scm b/tests/records.scm
index c6f85d4a81..d6d27bb96a 100644
--- a/tests/records.scm
+++ b/tests/records.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -17,6 +17,7 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (test-records)
+  #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-64)
   #:use-module (ice-9 match)
   #:use-module (ice-9 regex)
@@ -214,6 +215,32 @@
              (equal? (foo-bar y) 1))              ;promise was already forced
            (eq? (foo-baz y) 'b)))))
 
+(test-assert "define-record-type* & wrong field specifier"
+  (let ((exp '(begin
+                (define-record-type* <foo> foo make-foo
+                  foo?
+                  (bar foo-bar (default 42))
+                  (baz foo-baz))
+
+                (foo (baz 1 2 3 4 5))))           ;syntax error
+        (loc         (current-source-location)))  ;keep this alignment!
+    (catch 'syntax-error
+      (lambda ()
+        (eval exp (test-module))
+        #f)
+      (lambda (key proc message location form . args)
+        (and (eq? proc 'foo)
+             (string-match "invalid field" message)
+             (equal? form '(baz 1 2 3 4 5))
+
+             ;; Make sure the location is that of the field specifier.
+             ;; See <http://bugs.gnu.org/23969>.
+             (lset= equal?
+                    (pk 'expected-loc
+                        `((line . ,(- (assq-ref loc 'line) 1))
+                          ,@(alist-delete 'line loc)))
+                    (pk 'actual-loc location)))))))
+
 (test-assert "define-record-type* & missing initializers"
   (catch 'syntax-error
     (lambda ()
diff --git a/tests/system.scm b/tests/system.scm
index b935bd07eb..b5bb9af016 100644
--- a/tests/system.scm
+++ b/tests/system.scm
@@ -41,6 +41,25 @@
 
     (users %base-user-accounts)))
 
+(define %luks-device
+  (mapped-device
+   (source "/dev/foo") (target "my-luks-device")
+   (type luks-device-mapping)))
+
+(define %os-with-mapped-device
+  (operating-system
+    (host-name "komputilo")
+    (timezone "Europe/Berlin")
+    (locale "en_US.utf8")
+    (bootloader (grub-configuration (device "/dev/sdX")))
+    (mapped-devices (list %luks-device))
+    (file-systems (cons (file-system
+                          (inherit %root-fs)
+                          (dependencies (list %luks-device)))
+                        %base-file-systems))
+    (users %base-user-accounts)))
+
+
 (test-begin "system")
 
 (test-assert "operating-system-store-file-system"
@@ -71,4 +90,28 @@
                                      %base-file-systems)))))
     (eq? gnu (operating-system-store-file-system os))))
 
+(test-equal "operating-system-user-mapped-devices"
+  '()
+  (operating-system-user-mapped-devices %os-with-mapped-device))
+
+(test-equal "operating-system-boot-mapped-devices"
+  (list %luks-device)
+  (operating-system-boot-mapped-devices %os-with-mapped-device))
+
+(test-equal "operating-system-boot-mapped-devices, implicit dependency"
+  (list %luks-device)
+
+  ;; Here we expect the implicit dependency between "/" and
+  ;; "/dev/mapper/my-luks-device" to be found, in spite of the lack of a
+  ;; 'dependencies' field in the root file system.
+  (operating-system-boot-mapped-devices
+   (operating-system
+     (inherit %os-with-mapped-device)
+     (file-systems (cons (file-system
+                           (device "/dev/mapper/my-luks-device")
+                           (title 'device)
+                           (mount-point "/")
+                           (type "ext4"))
+                         %base-file-systems)))))
+
 (test-end)
diff --git a/tests/zlib.scm b/tests/zlib.scm
new file mode 100644
index 0000000000..5455240a71
--- /dev/null
+++ b/tests/zlib.scm
@@ -0,0 +1,63 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016 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/>.
+
+(define-module (test-zlib)
+  #:use-module (guix zlib)
+  #:use-module (guix tests)
+  #:use-module (srfi srfi-64)
+  #:use-module (rnrs bytevectors)
+  #:use-module (rnrs io ports)
+  #:use-module (ice-9 match))
+
+;; Test the (guix zlib) module.
+
+(unless (zlib-available?)
+  (exit 77))
+
+(test-begin "zlib")
+
+(test-assert "compression/decompression pipe"
+  (let ((data (random-bytevector (+ (random 10000)
+                                    (* 20 1024)))))
+    (match (pipe)
+      ((parent . child)
+       (match (primitive-fork)
+         (0                                       ;compress
+          (dynamic-wind
+            (const #t)
+            (lambda ()
+              (close-port parent)
+              (call-with-gzip-output-port child
+                (lambda (port)
+                  (put-bytevector port data))))
+            (lambda ()
+              (primitive-exit 0))))
+         (pid                                     ;decompress
+          (begin
+            (close-port child)
+            (let ((received (call-with-gzip-input-port parent
+                              (lambda (port)
+                                (get-bytevector-all port))
+                              #:buffer-size (* 64 1024))))
+              (match (waitpid pid)
+                ((_ . status)
+                 (and (zero? status)
+                      (port-closed? parent)
+                      (bytevector=? received data))))))))))))
+
+(test-end)