summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--.mailmap23
-rw-r--r--HACKING5
-rw-r--r--Makefile.am33
-rw-r--r--NEWS478
-rw-r--r--build-aux/check-final-inputs-self-contained.scm7
-rw-r--r--build-aux/hydra/demo-os.scm84
-rw-r--r--build-aux/hydra/gnu-system.scm15
-rw-r--r--configure.ac22
-rw-r--r--d3.v3.js9584
-rw-r--r--doc/contributing.texi28
-rw-r--r--doc/emacs.texi881
-rw-r--r--doc/guix.texi799
-rw-r--r--doc/htmlxref.cnf2
-rw-r--r--doc/images/bootstrap-packages.dot210
-rw-r--r--doc/images/coreutils-bag-graph.dot424
-rw-r--r--doc/images/coreutils-graph.dot44
-rw-r--r--doc/images/shepherd-graph.dot86
-rw-r--r--doc/local.mk3
-rw-r--r--emacs/guix-about.el37
-rw-r--r--emacs/guix-backend.el393
-rw-r--r--emacs/guix-base.el377
-rw-r--r--emacs/guix-buffer.el624
-rw-r--r--emacs/guix-build-log.el381
-rw-r--r--emacs/guix-command.el830
-rw-r--r--emacs/guix-config.el.in44
-rw-r--r--emacs/guix-devel.el382
-rw-r--r--emacs/guix-entry.el59
-rw-r--r--emacs/guix-external.el88
-rw-r--r--emacs/guix-geiser.el126
-rw-r--r--emacs/guix-guile.el98
-rw-r--r--emacs/guix-help-vars.el108
-rw-r--r--emacs/guix-helper.scm.in65
-rw-r--r--emacs/guix-history.el92
-rw-r--r--emacs/guix-hydra-build.el362
-rw-r--r--emacs/guix-hydra-jobset.el162
-rw-r--r--emacs/guix-hydra.el367
-rw-r--r--emacs/guix-info.el482
-rw-r--r--emacs/guix-init.el3
-rw-r--r--emacs/guix-license.el65
-rw-r--r--emacs/guix-list.el585
-rw-r--r--emacs/guix-location.el79
-rw-r--r--emacs/guix-main.scm1163
-rw-r--r--emacs/guix-messages.el247
-rw-r--r--emacs/guix-pcomplete.el370
-rw-r--r--emacs/guix-popup.el48
-rw-r--r--emacs/guix-prettify.el210
-rw-r--r--emacs/guix-profiles.el77
-rw-r--r--emacs/guix-read.el147
-rw-r--r--emacs/guix-ui-generation.el456
-rw-r--r--emacs/guix-ui-license.el150
-rw-r--r--emacs/guix-ui-location.el83
-rw-r--r--emacs/guix-ui-package.el1191
-rw-r--r--emacs/guix-ui-system-generation.el105
-rw-r--r--emacs/guix-ui.el323
-rw-r--r--emacs/guix-utils.el609
-rw-r--r--emacs/local.mk77
-rwxr-xr-xetc/git/pre-push57
-rwxr-xr-xetc/indent-package.el.in53
-rw-r--r--gnu/build/file-systems.scm318
-rw-r--r--gnu/local.mk46
-rw-r--r--gnu/packages/abiword.scm9
-rw-r--r--gnu/packages/admin.scm18
-rw-r--r--gnu/packages/algebra.scm18
-rw-r--r--gnu/packages/aspell.scm40
-rw-r--r--gnu/packages/audio.scm15
-rw-r--r--gnu/packages/backup.scm78
-rw-r--r--gnu/packages/base.scm9
-rw-r--r--gnu/packages/bioinformatics.scm278
-rw-r--r--gnu/packages/bittorrent.scm9
-rw-r--r--gnu/packages/boost.scm2
-rw-r--r--gnu/packages/bootstrap.scm4
-rw-r--r--gnu/packages/busybox.scm12
-rw-r--r--gnu/packages/c.scm34
-rw-r--r--gnu/packages/calendar.scm1
-rw-r--r--gnu/packages/cdrom.scm101
-rw-r--r--gnu/packages/check.scm4
-rw-r--r--gnu/packages/ci.scm31
-rw-r--r--gnu/packages/code.scm4
-rw-r--r--gnu/packages/commencement.scm5
-rw-r--r--gnu/packages/compression.scm6
-rw-r--r--gnu/packages/connman.scm49
-rw-r--r--gnu/packages/cross-base.scm2
-rw-r--r--gnu/packages/cups.scm16
-rw-r--r--gnu/packages/curl.scm10
-rw-r--r--gnu/packages/databases.scm8
-rw-r--r--gnu/packages/dav.scm4
-rw-r--r--gnu/packages/disk.scm36
-rw-r--r--gnu/packages/display-managers.scm2
-rw-r--r--gnu/packages/dns.scm28
-rw-r--r--gnu/packages/ebook.scm6
-rw-r--r--gnu/packages/emacs.scm123
-rw-r--r--gnu/packages/embedded.scm352
-rw-r--r--gnu/packages/engineering.scm13
-rw-r--r--gnu/packages/enlightenment.scm4
-rw-r--r--gnu/packages/fonts.scm159
-rw-r--r--gnu/packages/fpga.scm18
-rw-r--r--gnu/packages/freedesktop.scm85
-rw-r--r--gnu/packages/game-development.scm4
-rw-r--r--gnu/packages/games.scm18
-rw-r--r--gnu/packages/gcc.scm13
-rw-r--r--gnu/packages/ghostscript.scm2
-rw-r--r--gnu/packages/gimp.scm2
-rw-r--r--gnu/packages/gl.scm4
-rw-r--r--gnu/packages/gnome.scm54
-rw-r--r--gnu/packages/gnucash.scm10
-rw-r--r--gnu/packages/gnunet.scm35
-rw-r--r--gnu/packages/gnupg.scm137
-rw-r--r--gnu/packages/gnuzilla.scm69
-rw-r--r--gnu/packages/graphviz.scm50
-rw-r--r--gnu/packages/groff.scm41
-rw-r--r--gnu/packages/grub.scm61
-rw-r--r--gnu/packages/gtk.scm52
-rw-r--r--gnu/packages/guile.scm183
-rw-r--r--gnu/packages/gv.scm23
-rw-r--r--gnu/packages/haskell.scm243
-rw-r--r--gnu/packages/hurd.scm19
-rw-r--r--gnu/packages/idris.scm256
-rw-r--r--gnu/packages/image-viewers.scm5
-rw-r--r--gnu/packages/image.scm106
-rw-r--r--gnu/packages/imagemagick.scm7
-rw-r--r--gnu/packages/inkscape.scm32
-rw-r--r--gnu/packages/irc.scm20
-rw-r--r--gnu/packages/java.scm44
-rw-r--r--gnu/packages/kde-frameworks.scm40
-rw-r--r--gnu/packages/kde.scm175
-rw-r--r--gnu/packages/libreoffice.scm26
-rw-r--r--gnu/packages/libupnp.scm3
-rw-r--r--gnu/packages/linux-libre-4.9-i686.conf (renamed from gnu/packages/linux-libre-4.8-i686.conf)208
-rw-r--r--gnu/packages/linux-libre-4.9-x86_64.conf (renamed from gnu/packages/linux-libre-4.8-x86_64.conf)216
-rw-r--r--gnu/packages/linux.scm272
-rw-r--r--gnu/packages/lisp.scm42
-rw-r--r--gnu/packages/llvm.scm6
-rw-r--r--gnu/packages/lynx.scm4
-rw-r--r--gnu/packages/mail.scm170
-rw-r--r--gnu/packages/make-bootstrap.scm4
-rw-r--r--gnu/packages/man.scm4
-rw-r--r--gnu/packages/maths.scm83
-rw-r--r--gnu/packages/mc.scm14
-rw-r--r--gnu/packages/messaging.scm129
-rw-r--r--gnu/packages/monitoring.scm15
-rw-r--r--gnu/packages/moreutils.scm60
-rw-r--r--gnu/packages/mp3.scm6
-rw-r--r--gnu/packages/mpd.scm15
-rw-r--r--gnu/packages/mtools.scm3
-rw-r--r--gnu/packages/music.scm70
-rw-r--r--gnu/packages/nano.scm4
-rw-r--r--gnu/packages/networking.scm50
-rw-r--r--gnu/packages/nim.scm59
-rw-r--r--gnu/packages/ocaml.scm685
-rw-r--r--gnu/packages/onc-rpc.scm2
-rw-r--r--gnu/packages/package-management.scm49
-rw-r--r--gnu/packages/parallel.scm4
-rw-r--r--gnu/packages/password-utils.scm34
-rw-r--r--gnu/packages/patches/awesome-reproducible-png.patch4
-rw-r--r--gnu/packages/patches/chicken-CVE-2016-6830+CVE-2016-6831.patch81
-rw-r--r--gnu/packages/patches/cracklib-fix-buffer-overflow.patch39
-rw-r--r--gnu/packages/patches/gnupg-test-segfault-on-32bit-arch.patch40
-rw-r--r--gnu/packages/patches/inkscape-drop-wait-for-targets.patch68
-rw-r--r--gnu/packages/patches/kdbusaddons-kinit-file-name.patch15
-rw-r--r--gnu/packages/patches/khal-disable-failing-tests.patch33
-rw-r--r--gnu/packages/patches/libpng-CVE-2016-10087.patch37
-rw-r--r--gnu/packages/patches/libtiff-CVE-2016-10092.patch42
-rw-r--r--gnu/packages/patches/libtiff-CVE-2016-10093.patch53
-rw-r--r--gnu/packages/patches/libtiff-CVE-2016-10094.patch34
-rw-r--r--gnu/packages/patches/libtiff-assertion-failure.patch60
-rw-r--r--gnu/packages/patches/libtiff-divide-by-zero-ojpeg.patch63
-rw-r--r--gnu/packages/patches/libtiff-divide-by-zero-tiffcp.patch104
-rw-r--r--gnu/packages/patches/libtiff-divide-by-zero-tiffcrop.patch57
-rw-r--r--gnu/packages/patches/libtiff-divide-by-zero.patch67
-rw-r--r--gnu/packages/patches/libtiff-heap-overflow-pixarlog-luv.patch131
-rw-r--r--gnu/packages/patches/libtiff-heap-overflow-tif-dirread.patch132
-rw-r--r--gnu/packages/patches/libtiff-heap-overflow-tiffcp.patch67
-rw-r--r--gnu/packages/patches/libtiff-heap-overflow-tiffcrop.patch60
-rw-r--r--gnu/packages/patches/libtiff-invalid-read.patch64
-rw-r--r--gnu/packages/patches/libtiff-null-dereference.patch42
-rw-r--r--gnu/packages/patches/libtiff-tiffcp-underflow.patch41
-rw-r--r--gnu/packages/patches/libupnp-CVE-2016-8863.patch72
-rw-r--r--gnu/packages/patches/libxml2-CVE-2016-4658.patch257
-rw-r--r--gnu/packages/patches/libxml2-CVE-2016-5131.patch218
-rw-r--r--gnu/packages/patches/libxt-guix-search-paths.patch126
-rw-r--r--gnu/packages/patches/mcrypt-CVE-2012-4409.patch35
-rw-r--r--gnu/packages/patches/mcrypt-CVE-2012-4527.patch198
-rw-r--r--gnu/packages/patches/multiqc-fix-git-subprocess-error.patch16
-rw-r--r--gnu/packages/patches/ocaml-Add-a-.file-directive.patch96
-rw-r--r--gnu/packages/patches/ocaml-bisect-fix-camlp4-in-another-directory.patch125
-rw-r--r--gnu/packages/patches/ocaml-bitstring-fix-configure.patch53
-rw-r--r--gnu/packages/patches/openssh-memory-exhaustion.patch39
-rw-r--r--gnu/packages/patches/python-dendropy-exclude-failing-tests.patch21
-rw-r--r--gnu/packages/patches/python-pycrypto-CVE-2013-7459.patch97
-rw-r--r--gnu/packages/patches/python-pygpgme-fix-pinentry-tests.patch69
-rw-r--r--gnu/packages/patches/qemu-CVE-2016-8576.patch62
-rw-r--r--gnu/packages/patches/qemu-CVE-2016-8577.patch36
-rw-r--r--gnu/packages/patches/qemu-CVE-2016-8578.patch27
-rw-r--r--gnu/packages/patches/ruby-yard-fix-skip-of-markdown-tests.patch17
-rw-r--r--gnu/packages/patches/slock-CVE-2016-6866.patch51
-rw-r--r--gnu/packages/patches/unrtf-CVE-2016-10091.patch189
-rw-r--r--gnu/packages/pdf.scm9
-rw-r--r--gnu/packages/perl.scm46
-rw-r--r--gnu/packages/python.scm737
-rw-r--r--gnu/packages/qemu.scm18
-rw-r--r--gnu/packages/qt.scm352
-rw-r--r--gnu/packages/ruby.scm84
-rw-r--r--gnu/packages/rust.scm332
-rw-r--r--gnu/packages/samba.scm4
-rw-r--r--gnu/packages/scanner.scm64
-rw-r--r--gnu/packages/scheme.scm31
-rw-r--r--gnu/packages/sdl.scm15
-rw-r--r--gnu/packages/search.scm4
-rw-r--r--gnu/packages/security-token.scm6
-rw-r--r--gnu/packages/serialization.scm4
-rw-r--r--gnu/packages/shells.scm13
-rw-r--r--gnu/packages/shellutils.scm6
-rw-r--r--gnu/packages/speech.scm34
-rw-r--r--gnu/packages/ssh.scm5
-rw-r--r--gnu/packages/statistics.scm403
-rw-r--r--gnu/packages/suckless.scm30
-rw-r--r--gnu/packages/sync.scm4
-rw-r--r--gnu/packages/telephony.scm4
-rw-r--r--gnu/packages/terminals.scm42
-rw-r--r--gnu/packages/tls.scm24
-rw-r--r--gnu/packages/tor.scm14
-rw-r--r--gnu/packages/unrtf.scm2
-rw-r--r--gnu/packages/upnp.scm11
-rw-r--r--gnu/packages/version-control.scm6
-rw-r--r--gnu/packages/video.scm30
-rw-r--r--gnu/packages/vim.scm4
-rw-r--r--gnu/packages/vpn.scm10
-rw-r--r--gnu/packages/web.scm50
-rw-r--r--gnu/packages/wm.scm12
-rw-r--r--gnu/packages/xdisorg.scm14
-rw-r--r--gnu/packages/xfig.scm155
-rw-r--r--gnu/packages/xml.scm10
-rw-r--r--gnu/packages/xorg.scm160
-rw-r--r--gnu/packages/zile.scm82
-rw-r--r--gnu/packages/zip.scm4
-rw-r--r--gnu/services/admin.scm7
-rw-r--r--gnu/services/avahi.scm2
-rw-r--r--gnu/services/base.scm46
-rw-r--r--gnu/services/configuration.scm3
-rw-r--r--gnu/services/cuirass.scm60
-rw-r--r--gnu/services/databases.scm116
-rw-r--r--gnu/services/desktop.scm5
-rw-r--r--gnu/services/messaging.scm726
-rw-r--r--gnu/services/networking.scm9
-rw-r--r--gnu/services/sddm.scm2
-rw-r--r--gnu/services/shepherd.scm2
-rw-r--r--gnu/services/web.scm96
-rw-r--r--gnu/system/grub.scm17
-rw-r--r--gnu/system/install.scm8
-rw-r--r--gnu/system/linux-initrd.scm15
-rw-r--r--gnu/tests/install.scm77
-rw-r--r--gnu/tests/nfs.scm131
-rw-r--r--graph.js129
-rw-r--r--guix/build-system/cargo.scm149
-rw-r--r--guix/build-system/ocaml.scm181
-rw-r--r--guix/build/cargo-build-system.scm110
-rw-r--r--guix/build/download.scm9
-rw-r--r--guix/build/make-bootstrap.scm5
-rw-r--r--guix/build/ocaml-build-system.scm119
-rw-r--r--guix/build/syscalls.scm6
-rw-r--r--guix/derivations.scm58
-rw-r--r--guix/docker.scm127
-rw-r--r--guix/gexp.scm53
-rw-r--r--guix/git-download.scm33
-rw-r--r--guix/gnu-maintenance.scm8
-rw-r--r--guix/grafts.scm90
-rw-r--r--guix/graph.scm79
-rw-r--r--guix/http-client.scm7
-rw-r--r--guix/import/cran.scm215
-rw-r--r--guix/import/crate.scm165
-rw-r--r--guix/import/elpa.scm10
-rw-r--r--guix/import/github.scm15
-rw-r--r--guix/import/pypi.scm3
-rw-r--r--guix/import/utils.scm36
-rw-r--r--guix/profiles.scm24
-rw-r--r--guix/scripts/archive.scm36
-rw-r--r--guix/scripts/build.scm6
-rw-r--r--guix/scripts/challenge.scm2
-rw-r--r--guix/scripts/copy.scm207
-rw-r--r--guix/scripts/environment.scm37
-rw-r--r--guix/scripts/graph.scm57
-rw-r--r--guix/scripts/hash.scm5
-rw-r--r--guix/scripts/import.scm21
-rw-r--r--guix/scripts/import/cran.scm26
-rw-r--r--guix/scripts/import/crate.scm94
-rw-r--r--guix/scripts/offload.scm154
-rw-r--r--guix/scripts/package.scm10
-rw-r--r--guix/scripts/perform-download.scm37
-rw-r--r--guix/scripts/refresh.scm3
-rw-r--r--guix/ssh.scm226
-rw-r--r--guix/ui.scm10
-rw-r--r--guix/upstream.scm8
-rw-r--r--guix/utils.scm10
-rw-r--r--nix/libstore/build.cc28
-rw-r--r--nix/libstore/builtins.cc10
-rw-r--r--nix/libstore/builtins.hh5
-rw-r--r--nix/local.mk24
-rw-r--r--po/guix/POTFILES.in1
-rw-r--r--po/guix/da.po1023
-rw-r--r--po/guix/fr.po920
-rw-r--r--po/guix/pt_BR.po929
-rw-r--r--po/packages/da.po6288
-rw-r--r--tests/cpan.scm73
-rw-r--r--tests/crate.scm103
-rw-r--r--tests/derivations.scm27
-rw-r--r--tests/gem.scm10
-rw-r--r--tests/gexp.scm23
-rw-r--r--tests/graph.scm17
-rw-r--r--tests/guix-environment.sh17
-rw-r--r--tests/guix-package.sh10
-rw-r--r--tests/packages.scm3
-rw-r--r--tests/profiles.scm18
-rw-r--r--tests/pypi.scm159
-rw-r--r--tests/scripts-build.scm13
315 files changed, 30351 insertions, 19028 deletions
diff --git a/.gitignore b/.gitignore
index b64f5ef4b0..5bcc734ac5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -128,3 +128,4 @@ stamp-h[0-9]
 tmp
 /doc/os-config-lightweight-desktop.texi
 /nix/scripts/download
+/etc/indent-package.el
diff --git a/.mailmap b/.mailmap
index ada5026ba3..a6687ee447 100644
--- a/.mailmap
+++ b/.mailmap
@@ -2,24 +2,32 @@
 # contributors reported by "git log" and "git shortlog" commands.
 
 Al McElrath <hello@yrns.org> <hello@atonesir.com>
+Alex Sassmannshausen <alex@pompo.co> <alex.sassmannshausen@gmail.com>
 Alexander I. Grafov <grafov@gmail.com>
 Alírio Eyng <alirioeyng@gmail.com>
 Amirouche Boubekki <amirouche@hypermove.net>
 Andreas Enge <andreas@enge.fr> <andreas.enge@inria.fr>
 Andreas Enge <andreas@enge.fr> <privat@xobs-novena>
 Andy Wingo <wingo@igalia.com> <wingo@pobox.com>
+Ben Woodcroft <donttrustben@gmail.com>
 Ben Woodcroft <donttrustben@gmail.com> <b.woodcroft@uq.edu.au>
 Ben Woodcroft <donttrustben@gmail.com> <donttrustben near gmail.com>
 Claes Wallin (韋嘉誠) <claes.wallin@greatsinodevelopment.com>
 Cyprien Nicolas <cyprien@nicolas.tf> <c.nicolas+gitorious@gmail.com>
+Daniel Pimentel <d4n1@d4n1.org> <d4n1@member.fsf.org>
 Danny Milosavljevic <dannym@scratchpost.org> <dannym+a@scratchpost.org>
+David Hashe <david.hashe@dhashe.com> <address@hidden>
 David Thompson <davet@gnu.org> <dthompson2@worcester.edu>
 David Thompson <davet@gnu.org> <dthompson@member.fsf.org>
 David Thompson <davet@gnu.org> <dthompson@vistahigherlearning.com>
 Deck Pickard <deck.r.pickard@gmail.com> <nebu@kipple>
 Eric Bavier <bavier@member.fsf.org> <ericbavier@gmail.com>
 Eric Dvorsak <eric@dvorsak.fr> <yenda1@gmail.com>
+George Clemmer <myglc2@gmail.com>
+Ivan Vilata i Balaguer <ivan@selidor.net>
+Jeff Mickey <j@codemac.net> <jm@igneous.io>
 John Darrington <jmd@gnu.org> <john@darrington.wattle.id.au>
+John J. Foerch <jjfoerch@earthlink.net>
 Joshua Grant <tadni@riseup.net> <gzg@riseup.net>
 Joshua Grant <tadni@riseup.net> <jgrant@parenthetical.io>
 Joshua Grant <tadni@riseup.net> <tadnimi@gmail.com>
@@ -27,6 +35,8 @@ Joshua Grant <tadni@riseup.net> <youlysses@riseup.net>
 Kei Kebreau <kei@openmailbox.org>
 Leo Famulari <leo@famulari.name> <lfamular@gmail.com>
 Ludovic Courtès <ludo@gnu.org> <ludovic.courtes@inria.fr>
+Marek Benc <dusxmt@gmx.com> <merkur32@gmail.com>
+Marius Bakke <mbakke@fastmail.com> <m.bakke@warwick.ac.uk>
 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>
@@ -35,13 +45,20 @@ ng0 <ng0@libertad.pw> <ngillmann@runbox.com>
 ng0 <ng0@libertad.pw> <niasterisk@grrlz.net>
 ng0 <ng0@libertad.pw> <ng@niasterisk.space>
 ng0 <ng0@libertad.pw>
-Pjotr Prins <pjotr.public01@thebird.nl>
-Pjotr Prins <pjotr.public01@thebird.nl> <pjotr.public12@thebird.nl>
+Pjotr Prins <pjotr.guix@thebird.nl> <pjotr.public01@thebird.nl>
+Pjotr Prins <pjotr.guix@thebird.nl> <pjotr.public12@thebird.nl>
+Pjotr Prins <pjotr.guix@thebird.nl> <pjotr.public12@email>
 Raimon Grau <raimonster@gmail.com> <raimon@3scale.net>
+Raoul Jean Pierre Bonnal <ilpuccio.febo@gmail.com>
 Raymond Nicholson <rain1@openmailbox.org>
+Rene Saavedra <rennes@openmailbox.org>
 Ricardo Wurmus <rekado@elephly.net>
 Ricardo Wurmus <rekado@elephly.net> <ricardo.wurmus@mdc-berlin.de>
 Sou Bunnbu (宋文武) <iyzsong@gmail.com>
+Sou Bunnbu (宋文武) <iyzsong@gmail.com> <iyzsong@member.fsf.org>
+Stefan Reichör <stefan@xsteve.at>
 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
+Thomas Danckaert <thomas.danckaert@gmail.com> <post@thomasdanckaert.be>
+Tobias Geerinckx-Rice <me@tobias.gr> <tobias.geerinckx.rice@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
+Vincent Legoll <vincent.legoll@gmail.com> <vincent.legoll@idgrilles.fr>
diff --git a/HACKING b/HACKING
index 28948b3e23..e210143c9e 100644
--- a/HACKING
+++ b/HACKING
@@ -4,6 +4,7 @@
 
 Copyright © 2012, 2013, 2014, 2016 Ludovic Courtès <ludo@gnu.org>
 Copyright © 2015 Mathieu Lirzin <mthl@openmailbox.org>
+Copyright © 2017 Leo Famulari <leo@famulari.name>
 
   Copying and distribution of this file, with or without modification,
   are permitted in any medium without royalty provided the copyright
@@ -43,6 +44,10 @@ configure Git to automatically sign commits, run:
   git config commit.gpgsign true
   git config user.signingkey CABBA6EA1DC0FF33
 
+You can prevent yourself from accidentally pushing unsigned commits to Savannah
+by using the pre-push Git hook called 'pre-push'. It's located at
+'etc/git/pre-push'.
+
 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 0e3ddac146..c13d0df8a4 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -61,6 +61,7 @@ MODULES =					\
   guix/zlib.scm					\
   guix/build-system.scm				\
   guix/build-system/ant.scm			\
+  guix/build-system/cargo.scm			\
   guix/build-system/cmake.scm			\
   guix/build-system/emacs.scm			\
   guix/build-system/asdf.scm			\
@@ -69,6 +70,7 @@ MODULES =					\
   guix/build-system/haskell.scm			\
   guix/build-system/perl.scm			\
   guix/build-system/python.scm			\
+  guix/build-system/ocaml.scm			\
   guix/build-system/waf.scm			\
   guix/build-system/r.scm			\
   guix/build-system/ruby.scm			\
@@ -83,6 +85,7 @@ MODULES =					\
   guix/ui.scm					\
   guix/build/ant-build-system.scm		\
   guix/build/download.scm			\
+  guix/build/cargo-build-system.scm		\
   guix/build/cmake-build-system.scm		\
   guix/build/emacs-build-system.scm		\
   guix/build/asdf-build-system.scm		\
@@ -93,6 +96,7 @@ MODULES =					\
   guix/build/gnu-dist.scm			\
   guix/build/perl-build-system.scm		\
   guix/build/python-build-system.scm		\
+  guix/build/ocaml-build-system.scm		\
   guix/build/r-build-system.scm			\
   guix/build/ruby-build-system.scm		\
   guix/build/waf-build-system.scm		\
@@ -156,8 +160,11 @@ MODULES =					\
 if HAVE_GUILE_JSON
 
 MODULES +=					\
+  guix/docker.scm	   			\
   guix/import/github.scm   			\
   guix/import/json.scm				\
+  guix/import/crate.scm				\
+  guix/scripts/import/crate.scm			\
   guix/import/pypi.scm				\
   guix/scripts/import/pypi.scm			\
   guix/import/cpan.scm				\
@@ -166,6 +173,14 @@ MODULES +=					\
 
 endif
 
+if HAVE_GUILE_SSH
+
+MODULES +=					\
+  guix/ssh.scm					\
+  guix/scripts/copy.scm
+
+endif HAVE_GUILE_SSH
+
 if BUILD_DAEMON_OFFLOAD
 
 MODULES +=					\
@@ -178,8 +193,8 @@ dist_noinst_DATA = guix/tests.scm guix/tests/http.scm
 
 # Linux-Libre configurations.
 KCONFIGS =					\
-  gnu/packages/linux-libre-4.8-i686.conf	\
-  gnu/packages/linux-libre-4.8-x86_64.conf	\
+  gnu/packages/linux-libre-4.9-i686.conf	\
+  gnu/packages/linux-libre-4.9-x86_64.conf	\
   gnu/packages/linux-libre-4.4-i686.conf	\
   gnu/packages/linux-libre-4.4-x86_64.conf	\
   gnu/packages/linux-libre-4.1-i686.conf	\
@@ -280,7 +295,8 @@ if HAVE_GUILE_JSON
 SCM_TESTS += 					\
   tests/pypi.scm				\
   tests/cpan.scm				\
-  tests/gem.scm
+  tests/gem.scm					\
+  tests/crate.scm
 
 endif
 
@@ -377,6 +393,8 @@ EXTRA_DIST =						\
   build-aux/generate-authors.scm			\
   build-aux/test-driver.scm				\
   build-aux/run-system-tests.scm			\
+  d3.v3.js						\
+  graph.js						\
   srfi/srfi-37.scm.in					\
   srfi/srfi-64.scm					\
   srfi/srfi-64.upstream.scm				\
@@ -458,10 +476,6 @@ AM_DISTCHECK_CONFIGURE_FLAGS =			\
   --with-nix-prefix="$(NIX_PREFIX)"		\
   --enable-daemon
 
-dist_emacsui_DATA = emacs/guix-main.scm
-nodist_emacsui_DATA = emacs/guix-helper.scm
-include emacs/local.mk
-
 # The self-contained tarball.
 guix-binary.%.tar.xz:
 	$(AM_V_GEN)GUIX_PACKAGE_PATH= \
@@ -500,6 +514,7 @@ assert-no-store-file-names:
 	     --exclude=*.info-[0-9] --exclude=*.dot				\
 	     --exclude=*.eps --exclude-dir=bootstrap				\
 	     --exclude=guix-prettify.el						\
+	     --exclude=ChangeLog						\
 	     -E "$(storedir)/[a-z0-9]{32}-" $(distdir) ;			\
 	then									\
 	  echo "error: store file names embedded in the distribution" >&2 ;	\
@@ -540,10 +555,6 @@ AM_V_DOT = $(AM_V_DOT_$(V))
 AM_V_DOT_ = $(AM_V_DOT_$(AM_DEFAULT_VERBOSITY))
 AM_V_DOT_0 = @echo "  DOT     " $@;
 
-AM_V_EMACS = $(AM_V_EMACS_$(V))
-AM_V_EMACS_ = $(AM_V_EMACS_$(AM_DEFAULT_VERBOSITY))
-AM_V_EMACS_0 = @echo "  EMACS   " $@;
-
 AM_V_HELP2MAN = $(AM_V_HELP2MAN_$(V))
 AM_V_HELP2MAN_ = $(AM_V_HELP2MAN_$(AM_DEFAULT_VERBOSITY))
 AM_V_HELP2MAN_0 = @echo "  HELP2MAN" $@;
diff --git a/NEWS b/NEWS
index 310e9b6175..8b6727fd93 100644
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,484 @@ Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 
 Please send Guix bug reports to bug-guix@gnu.org.
 
+* Changes in 0.12.0 (since 0.11.0)
+
+** Package management
+
+*** Guix can now be built with Guile 2.1/2.2
+*** New ‘--with-graft’ package transformation option
+*** Grafting is now faster than before
+*** The ‘replacement’ of a package can now have a different name
+*** ‘guix-daemon’ offloading support now uses Guile-SSH
+*** New ‘guix offload test’ command
+*** New updaters for ‘guix refresh’: ‘kernel.org’, ‘cpan’, ‘crates’
+*** ‘guix refresh --list-updaters’ shows updater coverage
+*** New ‘cargo-build-system’ and importer for Rust packages
+*** New ‘asdf-build-system’ for Common Lisp packages
+*** Python build system now uses setuptools by default
+*** New updater for CPAN packages
+*** Added ‘--recursive’ option for importer for the CRAN/Bioconductor importer
+*** New d3.js backend for ‘guix graph’
+*** ‘guix package’ now displays generation diffs
+*** New services
+New services for CUPS printing, SPICE vdagent, SDDM, a login service, kmscon service, opensmtpd mail service, git service, wpa-supplicant service, rottlog, OpenSSH, Cuirass, and NFS related services.
+*** New arm-none-eabi cross-compiler toolchains
+*** New 'guix system' actions: ‘switch-generation’ and ‘roll-back’
+
+** Distribution
+
+*** GuixSD can now be installed to a LUKS-encrypted root
+    (<http://bugs.gnu.org/21843>)
+*** ‘openssl’ has a new “doc” output for its man pages
+*** Added support for a native GNU/Hurd system
+*** New system tests for the OpenSSH and Dropbear daemons
+*** New tests for the GuixSD installation on encrypted or RAID roots
+*** New ‘netmask’ option for ‘static-networking-service’
+*** New “i686-w64-mingw32” cross-compilation target (MinGW)
+*** A modular set of packages supersede the monolithic ‘qt’ package
+*** 853 new packages
+
+abc, acme-client, aircrack-ng, ams-lv2, ao-cad, arachne-pnr,
+arm-none-eabi-nano-toolchain, arm-none-eabi-nano-toolchain,
+arm-none-eabi-toolchain, arm-none-eabi-toolchain, asn1c, aspell-dict-de,
+aspell-dict-el, aspell-dict-grc, aspell-dict-he, aspell-dict-sv, assimp,
+attica, autossh, b43-tools, baloo, bambam, bamm, bcftools, biber, biber-next,
+bind, bluefish, bluez-qt, bpp-core, bpp-phyl, bpp-popgen, bpp-seq, bppsuite,
+breeze-icons, bs1770gain, bwm-ng, c-toxcore, cairo-xcb, capnproto,
+cargo-bootstrap, cbatticon, ccid, cfitsio, chez-fmt, chez-irregex,
+chez-matchable, chez-mit, chez-scmutils, chez-sockets, chez-srfi, chez-web,
+chromaprint, cl-alexandria, cl-bordeaux-threads, cl-clx, cl-fiveam,
+cl-flexi-streams, cl-ppcre, cl-slynk, cl-stumpwm, cl-trivial-gray-streams,
+clipit, clojure, cmark, coda, cryptsetup-static, cuirass, darkhttpd, dash,
+dbacl, dbus-c++, denemo, ding, direnv, discrover, dlib, dnscrypt-proxy,
+dnscrypt-wrapper, dotconf, drumkv1, dtc, ecl-alexandria, ecl-bordeaux-threads,
+ecl-cl-ppcre, ecl-clx, ecl-fiveam, ecl-flexi-streams, ecl-slynk, ecl-stumpwm,
+ecl-trivial-gray-streams, econnman, ecryptfs-utils, edi, editres, efibootmgr,
+efivar, emacs-ahungry-theme, emacs-auto-complete, emacs-bui,
+emacs-cyberpunk-theme, emacs-d-mode, emacs-danneskjold-theme, emacs-el-search,
+emacs-emms-mode-line-cycle, emacs-es-mode, emacs-evil, emacs-flx,
+emacs-goto-chg, emacs-guix, emacs-neotree, emacs-nginx-mode, emacs-org,
+emacs-org-trello, emacs-paredit, emacs-request, emacs-rudel, emacs-stream,
+enet, epic5, eschalot, espeak, exonerate, extempore, fatfsck-static, fbida,
+fcgi, fcgiwrap, femtolisp, filteraudio, fio, font-adobe-source-code-pro,
+font-fira-mono, freealut, gcc-cross-sans-libc-arm-none-eabi,
+gcc-cross-sans-libc-arm-none-eabi, gcompris, gctp, gdb-arm-none-eabi,
+geierlein, geteltorito, gettext-minimal, gforth, ghc-array,
+ghc-base16-bytestring, ghc-binary, ghc-bytestring, ghc-bytestring-handle,
+ghc-chell, ghc-chell-quickcheck, ghc-colour, ghc-conduit-extra,
+ghc-constraints, ghc-cryptohash, ghc-data-accessor,
+ghc-data-accessor-transformers, ghc-data-ordlist, ghc-directory, ghc-easyplot,
+ghc-fgl-arbitrary, ghc-findbin, ghc-fsnotify, ghc-gnuplot, ghc-graphviz,
+ghc-hashtables, ghc-haskeline, ghc-hinotify, ghc-hmatrix, ghc-hmatrix-gsl,
+ghc-hmatrix-gsl-stats, ghc-hmatrix-special, ghc-hs-bibutils, ghc-ieee754,
+ghc-lifted-async, ghc-monads-tf, ghc-options, ghc-pandoc-citeproc,
+ghc-patience, ghc-process, ghc-regex-applicative, ghc-regex-compat-tdfa,
+ghc-regex-tdfa, ghc-rfc5051, ghc-sandi, ghc-shelly, ghc-storable-complex,
+ghc-system-fileio, ghc-system-filepath, ghc-tar, ghc-tasty-rerun,
+ghc-tasty-th, ghc-terminal-size, ghc-transformers, ghc-transformers,
+ghc-utility-ht, ghc-wl-pprint-text, ghc-xml-conduit, ghc-xml-types, glfw,
+gloox, gnome-calculator, gnome-dictionary, gnome-system-monitor, gnuastro,
+goaccess, gobby, gparted, gpgmepp, grantlee, greenisland, grub-efi, gsm,
+gtkwave, gucharmap, guile-aspell, guile-bytestructures, guile-commonmark,
+guile2.2-commonmark, guile2.2-irregex, guile2.2-json, guile2.2-minikanren,
+guile2.2-redis, guitarix-lv2, gx-guvnor-lv2, gx-hyperion-lv2,
+gx-overdriver-lv2, gx-push-pull-lv2, gx-saturator-lv2, gx-slow-gear-lv2,
+gx-super-fuzz-lv2, gx-suppa-tone-bender-lv2, gx-switchless-wah-lv2,
+gx-tone-mender-lv2, gx-vbass-preamp-lv2, gx-vintage-fuzz-master-lv2,
+gx-voodoo-fuzz-lv2, gxtuner, gzstream, handbrake, hdf-eos2, hdf-eos5, hdf4,
+hdf4-alt, hidapi, highlight, httptunnel, hyperrogue, icestorm, ii, impressive,
+infamous-plugins, infernal, ingen, interrobang, iperf, ircii, iverilog,
+jack-keyboard, jalv-select, jimtcl, jsoncpp, jupyter, kactivities,
+kactivities-stats, kapidox, karchive, kauth, kbookmarks, kcmutils, kcodecs,
+kcompletion, kconfig, kconfigwidgets, kcoreaddons, kcrash, kdbusaddons,
+kdeclarative, kded, kdesignerplugin, kdesu, kdevelop, kdevelop-pg-qt,
+kdevplatform, kdnssd, kdoctools, kemoticons, keyutils, kfilemetadata,
+kglobalaccel, kguiaddons, ki18n, kicad, kicad-library, kiconthemes, kidletime,
+kimageformats, kinit, kio, kiss-fft-for-extempore, kitemmodels, kitemviews,
+kjobwidgets, kmscon, knewstuff, knotifications, knotifyconfig, kobodeluxe,
+kpackage, kparts, kpeople, kplotting, kpmcore, kpty, krunner, kservice,
+ksyntaxhighlighting, ktexteditor, ktextwidgets, kunitconversion, kwallet,
+kwayland, kwidgetsaddons, kxmlgui, kxmlrpcclient, laby, lci, lekha, libaacs,
+libasr, libbdplus, libhdate, libicns, libidn2, libjaylink, libjpeg-turbo,
+libjxr, libkomparediff2, libksysguard, libnet6, libnfsidmap, libosinfo,
+libpqxx, libpsyc, libseccomp, libtermkey, libtoxcore, libtsm, libunique,
+libvirt, libvirt-glib, limnoria, linux-libre-arm-generic, llvm-with-rtti,
+lmdb, lndir, lua-lgi, lua-lpeg, lua5.1-expat, lua5.1-filesystem, lua5.1-sec,
+lua5.1-sec, lua5.1-socket, lvm2-static, m17n-db, m17n-lib, mash, mb2md,
+mcelog, mcl, mdadm-static, mhonarc, microcom, minced, mingw-w64, mktorrent,
+mlocate, mobile-broadband-provider-info, mod-host, mod-utilities,
+modemmanager-qt, mono, mpop, mps-youtube, mrrescue, mtd-utils, mumble, musl,
+nanovg-for-extempore, nethogs, netsurf, networkmanager-qt, newick-utils,
+newlib, newlib-nano, newsbeuter, nfs-utils, nickle, non-session-manager,
+notifymuch, obby, ocaml-menhir, ola, onionshare, openfwwf-firmware, openh264,
+openocd, opensmtpd, opensmtpd-extras, optipng, p7zip, pam-krb5, par2cmdline,
+pcb-rnd, pcsc-lite, pdf2svg, pdfposter, perl-array-utils,
+perl-autovivification, perl-business-isbn, perl-business-isbn-data,
+perl-business-ismn, perl-business-issn, perl-class-errorhandler,
+perl-crypt-openssl-bignum, perl-crypt-openssl-random, perl-crypt-openssl-rsa,
+perl-curses, perl-data-compare, perl-data-uniqid, perl-date-simple,
+perl-datetime-calendar-julian, perl-datetime-format-mail,
+perl-datetime-format-w3cdtf, perl-digest-md5, perl-encode-detect,
+perl-encode-eucjpascii, perl-encode-hanextra, perl-encode-jis2k,
+perl-env-path, perl-extutils-libbuilder, perl-feed-find,
+perl-file-find-object, perl-file-find-object-rule, perl-file-grep,
+perl-file-path, perl-file-slurper, perl-geo-ip, perl-getopt-long, perl-graph,
+perl-graph-readwrite, perl-io-socket-inet6, perl-ipc-cmd,
+perl-lingua-translit, perl-mail-spf, perl-modern-perl, perl-mojolicious,
+perl-mozilla-ca, perl-net-cidr-lite, perl-net-dns,
+perl-net-dns-resolver-programmable, perl-net-patricia, perl-net-psyc,
+perl-net-statsd, perl-netaddr-ip, perl-parse-yapp, perl-path-tiny,
+perl-socket6, perl-sort-key, perl-test-files, perl-test-manifest,
+perl-test-trailingspace, perl-text-bibtex, perl-text-csv-xs, perl-text-roman,
+perl-tie-cycle, perl-unicode-collate, perl-unicode-normalize,
+perl-unicode-utf8, perl-uri-fetch, perl-uri-template, perl-www-opensearch,
+perl-xml-atom, perl-xml-feed, perl-xml-libxslt, perl-xml-rss, perl-xml-writer,
+perl-xml-xpath, phonon, php, picocom, pinentry-gnome3, plantuml,
+plasma-framework, portmidi-for-extempore, prank, prosody, proteinortho,
+proxychains-ng, psyclpc, pybitmessage, python-aniso8601, python-argcomplete,
+python-axolotl, python-axolotl-curve25519, python-bcrypt, python-betamax,
+python-binaryornot, python-biom-format, python-bleach, python-cachecontrol,
+python-consul, python-cov-core, python-discogs-client, python-django,
+python-django-filter, python-django-simple-math-captcha, python-entrypoints,
+python-feedparser, python-flask-babel, python-flask-basicauth,
+python-flask-restful, python-flask-restful-swagger, python-flask-restplus,
+python-flask-sqlalchemy, python-freezegun, python-furl, python-future,
+python-git-review, python-glances, python-graphene, python-graphql-core,
+python-graphql-relay, python-i3-py, python-imagesize, python-ipaddress,
+python-ipykernel, python-ipywidgets, python-jupyter-client,
+python-jupyter-console, python-jupyter-core, python-kivy, python-kivy-next,
+python-libvirt, python-lirc, python-lit, python-mailmanclient, python-natsort,
+python-nautilus, python-nbconvert, python-nbformat, python-nltk, python-nose2,
+python-notebook, python-notmuch, python-odfpy, python-orderedmultidict,
+python-pafy, python-peewee, python-pika, python-polib, python-promise,
+python-publicsuffix, python-publicsuffix2, python-pycodestyle, python-pyev,
+python-pymongo, python-pypdf2, python-pyserial, python-pytest-django,
+python-pytest-flakes, python-pytest-mock, python-pytest-pep8,
+python-pythondialog, python-pyxb, python-q, python-rednose, python-reportlab,
+python-requests-oauthlib, python-rst.linker, python-s3transfer,
+python-sadisplay, python-schematics, python-setproctitle, python-sh,
+python-socksipy-branch, python-sqlalchemy-utils, python-stem,
+python-termcolor, python-termstyle, python-testpath, python-url,
+python-validictory, python-webencodings, python-whoosh,
+python-widgetsnbextension, python-xopen, python2-argcomplete, python2-axolotl,
+python2-axolotl-curve25519, python2-bcrypt, python2-betamax,
+python2-binaryornot, python2-biom-format, python2-bleach,
+python2-cachecontrol, python2-consul, python2-cov-core,
+python2-discogs-client, python2-django, python2-django-filter,
+python2-django-simple-math-captcha, python2-entrypoints, python2-feedparser,
+python2-flask-babel, python2-flask-restful-swagger, python2-freezegun,
+python2-furl, python2-future, python2-git-review, python2-glances,
+python2-graphene, python2-graphql-core, python2-graphql-relay, python2-i3-py,
+python2-imagesize, python2-ipykernel, python2-ipywidgets,
+python2-jupyter-client, python2-jupyter-console, python2-jupyter-core,
+python2-kivy, python2-kivy-next, python2-libvirt, python2-lirc, python2-lit,
+python2-mailmanclient, python2-natsort, python2-nbconvert, python2-nbformat,
+python2-nltk, python2-nose2, python2-notebook, python2-odfpy,
+python2-orderedmultidict, python2-pathlib2, python2-peewee, python2-pika,
+python2-polib, python2-promise, python2-publicsuffix, python2-publicsuffix2,
+python2-pycodestyle, python2-pyev, python2-pymongo, python2-pypdf,
+python2-pypdf2, python2-pyserial, python2-pytest-django,
+python2-pytest-flakes, python2-pytest-mock, python2-pytest-pep8, python2-pyxb,
+python2-q, python2-reportlab, python2-requests-oauthlib, python2-rpython,
+python2-rst.linker, python2-s3transfer, python2-sadisplay, python2-schematics,
+python2-setproctitle, python2-sh, python2-socksipy-branch,
+python2-sqlalchemy-utils, python2-stem, python2-termcolor, python2-testpath,
+python2-url, python2-validictory, python2-webencodings, python2-whoosh,
+python2-widgetsnbextension, python2-wxpython, python2-xopen, qmidiarp,
+qsyncthingtray, qtgraphicaleffects, qtox, qtquickcontrols, qtquickcontrols2,
+qtwebkit, quickswitch-i3, qwt, r-annotate, r-annotationforge, r-backports,
+r-bamsignals, r-batchjobs, r-bbmisc, r-bigmemory, r-bigmemory-sri,
+r-bioccheck, r-biocinstaller, r-biocstyle, r-biocviews, r-bit, r-bit64,
+r-bsgenome-celegans-ucsc-ce10, r-category, r-cellranger, r-checkmate,
+r-chipkernels, r-deseq2, r-dynamictreecut, r-e1071, r-fail, r-fastcluster,
+r-gdata, r-genefilter, r-geneplotter, r-getopt, r-gkmsvm, r-googlesheets,
+r-gostats, r-gplots, r-grohmm, r-gseabase, r-gtools, r-hmisc, r-hms,
+r-htmltable, r-hwriter, r-kernlab, r-kernsmooth, r-matrix,
+r-mutationalpatterns, r-optparse, r-pheatmap, r-preprocesscore, r-purrr,
+r-quadprog, r-r4rna, r-rbgl, r-rcas, r-rematch, r-rhtslib, r-rjson, r-rocr,
+r-rpart, r-rtsne, r-segmented, r-sendmailr, r-seqgl, r-sfsmisc, r-shortread,
+r-spams, r-survival, r-synchronicity, r-systempiper, r-tibble,
+r-txdb-hsapiens-ucsc-hg19-knowngene, r-viridislite, r-wgcna, radeontop, raxml,
+rcas-web, re2, remind, rkflashtool, roary, rpcbind, ruby-gherkin,
+ruby-net-http-digest-auth, rustc, samplv1, sane-backends-minimal,
+sbcl-alexandria, sbcl-bordeaux-threads, sbcl-cl-ppcre, sbcl-clx, sbcl-fiveam,
+sbcl-flexi-streams, sbcl-slynk, sbcl-stumpwm, sbcl-stumpwm-with-slynk,
+sbcl-trivial-gray-streams, schismtracker, sdcc, sddm, sendmail, sent, seq24,
+seqtk, sg3-utils, sic, snappy, solid, sonata, sonnet, speech-dispatcher,
+sqlcipher, squeak-vm, sshoot, sshuttle, sslh, stagit, stb-image-for-extempore,
+steghide, stfl, stress-make, sunxi-tools, supertuxkart, surfraw,
+swh-plugins-lv2, swish-e, tcp-wrappers, telepathy-idle,
+telepathy-mission-control, teximpatient, threadweaver, tint2, tintin++,
+tinyxml2, tomb, u-boot-am335x_boneblack, u-boot-malta, u-boot-vexpress_ca9x4,
+uget, utox, vc, viewnior, vifm, vim-full, virt-manager, vis,
+wayland-protocols, wcslib, weston, wgetpaste, whois, wxwidgets-gtk2, x265,
+xcalib, xcb-util-xrm, xlsx2csv, xonsh, xorg-server-xwayland, xpad, yadifa,
+yaml-cpp, yosys, ytalk, zzuf
+*** 864 package updates
+
+abcde-2.7.2, accountsservice-0.6.43, adns-1.5.1, aisleriot-3.20.2,
+allegro-5.2.0, alot-0.4, alsa-utils-1.1.2, apl-1.6, aragorn-1.2.38,
+ardour-5.5, argon2-20161029, aria2-1.29.0, armadillo-7.500.0,
+armadillo-7.500.0, aspell-dict-en-2016.11.20-0, at-spi2-core-2.20.2,
+atlas-3.10.3, autoconf-2.69, autoconf-archive-2016.09.16, autogen-5.18.12,
+autojump-22.3.4, avr-binutils-2.27, avr-gcc-5.4.0, avr-toolchain-5.4.0,
+awesome-3.5.9, awscli-1.11.5, babl-0.1.18, bash-4.4.0, bash-completion-2.4,
+bash-minimal-4.4.0, bash-static-4.4.0, bdb-6.2.23, bedtools-2.26.0,
+beets-1.4.1, binutils-2.27, binutils-static-stripped-tarball-2.27,
+bioperl-minimal-1.7.0, bison-3.0.4, bitcoin-core-0.13.0, blender-2.78a,
+bluez-5.43, boost-1.61.0, borg-1.0.8, bowtie-2.2.9, btrfs-progs-4.8.5,
+bullet-2.85.1, bundler-1.13.6, c-ares-1.12.0, c-reduce-2.5.0, calibre-2.74.0,
+caribou-0.4.21, ccache-3.3.3, cereal-1.2.1, certbot-0.9.3, chess-6.2.4,
+chromium-bsu-0.9.16.1, claws-mail-3.14.1, clipper-1.1, cmake-3.6.1,
+cmocka-1.1.0, connman-1.33, coq-8.5pl2, cppcheck-1.76.1, cpupower-4.8.15,
+cryptsetup-1.7.3, cssc-1.4.0, cups-2.2.1, cups-filters-1.11.5,
+cups-minimal-2.2.1, curl-7.50.3, cutadapt-1.12, dblatex-0.3.9, dbus-1.10.14,
+dbus-glib-0.106, dconf-editor-3.20.3, dejagnu-1.6, diamond-0.8.29, dico-2.4,
+diffoscope-63, diffutils-3.5, direvent-5.1, docbook-xml-4.4, docbook-xml-4.5,
+docbook-xsl-1.79.1, dovecot-2.2.27, dropbear-2016.74, drumstick-1.1.0,
+efl-1.18.4, eigen-3.2.9, elfutils-0.167, emacs-25.1, emacs-dash-2.13.0,
+emacs-debbugs-0.12, emacs-emms-4.2, emacs-emms-player-mpv-0.0.10,
+emacs-expand-region-0.11.0, emacs-f-0.18.2, emacs-hl-todo-1.7.4,
+emacs-hydra-0.13.6, emacs-magit-popup-2.8.0, emacs-minimal-25.1,
+emacs-no-x-25.1, emacs-no-x-toolkit-25.1, emacs-s-1.11.0,
+emacs-smartparens-1.8.0, emacs-with-editor-2.5.8, encfs-1.9.1,
+enlightenment-0.21.5, entr-3.6, eog-3.20.4, epiphany-3.22.1, ethtool-4.8,
+eudev-3.2, evince-3.20.1, evolution-data-server-3.20.5, exfat-utils-1.2.5,
+expat-2.2.0, extra-cmake-modules-5.28.0, extremetuxracer-0.7.3, faust-2.0.a51,
+ffmpeg-2.8.9, ffmpeg-3.2.2, fftw-3.3.5, fftw-3.3.5, fftw-openmpi-3.3.5,
+fftwf-3.3.5, fftwf-3.3.5, file-5.28, file-roller-3.20.3, fish-2.4.0,
+flashrom-0.9.9, flex-2.6.1, font-dejavu-2.37, font-gnu-unifont-9.0.02,
+fontconfig-2.12.1, fossil-1.35, freefall-4.8.15, freeipmi-1.5.5,
+fuse-exfat-1.2.5, gajim-0.16.6, gambit-c-4.8.5, ganv-1.4.2-1.31685d283,
+gawk-4.1.4, gcc-4.9.4, gcc-5.4.0, gcc-6.2.0, gcc-objc++-4.9.4, gcc-objc-4.9.4,
+gcc-stripped-tarball-4.9.4, gcc-toolchain-6.2.0, gccgo-4.9.4, gcj-4.9.4,
+gdb-7.12, gedit-3.20.2, geiser-0.9, geiser-next-0.9, geoclue-2.4.4,
+gettext-0.19.8.1, gexiv2-0.10.4, gfortran-5.4.0, ghc-8.0.1, ghc-cmark-0.5.3.1,
+ghc-cryptonite-0.19, ghc-fgl-5.5.3.0, ghc-highlighting-kate-0.6.3,
+ghc-pandoc-1.17.2, ghc-pandoc-types-1.16.1.1, ghc-tagsoup-0.14,
+ghc-texmath-0.8.6.5, ghc-tls-1.3.8, ghc-trifecta-1.6, giac-xcas-1.2.2-103,
+gimp-2.8.18, girara-0.2.6, git-2.11.0, git-2.9.3, glew-2.0.0, glib-2.48.2,
+glib-networking-2.48.2, glibc-2.23, glibc-2.24, glibc-locales-2.24,
+glibc-utf8-locales-2.24, global-6.5.5, gmp-6.1.1, gmsh-2.15.0, gnome-3.20.4,
+gnome-bluetooth-3.20.0, gnome-desktop-3.20.2, gnome-klotski-3.20.2,
+gnome-maps-3.18.3, gnome-mines-3.20.1, gnome-mpv-0.10,
+gnome-online-accounts-3.20.3, gnome-screenshot-3.20.1, gnome-session-3.20.2,
+gnome-shell-3.20.4, gnome-sudoku-3.20.5, gnome-terminal-3.20.2,
+gnome-themes-standard-3.20.2, gnu-c-manual-0.2.5, gnucash-2.6.14,
+gnumach-headers-1.8, gnumeric-1.12.32, gnupg-1.4.21, gnupg-2.0.30,
+gnupg-2.1.16, gnuplot-5.0.5, gnurl-7.51.0, gnutls-3.5.4, go-1.7.4,
+goffice-0.10.32, gphoto2-2.5.11, graphicsmagick-1.3.25-1.56c8cae, gsl-2.3,
+gst-libav-1.10.2, gst-plugins-bad-1.10.2, gst-plugins-base-1.10.2,
+gst-plugins-good-1.10.2, gst-plugins-ugly-1.10.2, gstreamer-1.10.2,
+gtk+-3.20.9, gtk-doc-1.25, gtk-vnc-0.6.0, gtkmm-3.20.1, gtksourceview-3.20.4,
+guile-2.0.12, guile-daemon-0.1.1, guile-irregex-0.9.6, guile-lib-0.2.3,
+guile-ncurses-2.1, guile-next-2.1.5, guile-ssh-0.10.2,
+guile-static-stripped-2.0.12, guile-static-stripped-tarball-2.0.12,
+guile-xosd-0.2.1, guitarix-0.35.2, guix-0.11.0, guix-0.11.0-8.8d12,
+gvfs-1.28.3, gvpe-3.0, gzochi-0.10.1, harfbuzz-1.3.3, haskell-mode-16.1,
+hdf5-1.8.18, hdf5-parallel-openmpi-1.8.18, hexchat-2.12.2, higan-101,
+hop-2.5.1, hplip-3.16.11, httping-2.5, hunspell-1.5.4, hurd-core-headers-0.9,
+hurd-headers-0.9, hurd-minimal-0.9, hydra-20151030.1ff48da, hydrogen-0.9.7,
+i3-wm-4.13, ibus-1.5.14, icecat-45.5.1-gnu1, icedtea-3.2.0, idris-0.12.3,
+imagemagick-6.9.6-8, info-reader-6.3, inputproto-2.3.2, iproute2-4.9.0,
+irrlicht-1.8.4, irssi-0.8.20, isc-dhcp-4.3.5, iw-4.9, jansson-2.9,
+jasper-2.0.6, java-ngs-1.2.5, jbig2dec-0.13, jpegoptim-1.4.4, json-c-0.12.1,
+json-glib-1.2.2, julia-0.5.0, keepassx-2.0.3, khal-0.8.4,
+kwindowsystem-5.28.0, ldb-1.1.27, ldc-0.17.2, ledger-3.1.1, letsencrypt-0.9.3,
+lftp-4.7.4, libass-0.13.4, libcdio-0.94, libdrm-2.4.68, libev-4.23,
+libgcrypt-1.7.3, libgit2-0.24.3, libgpg-error-1.24, libgphoto2-2.5.11,
+libgsf-1.14.40, libgtop-2.34.1, libgweather-3.20.3, libiberty-4.9.4,
+libidn-1.33, libinput-1.5.1, libinput-minimal-1.5.1, libjpeg-9b,
+libksba-1.3.5, libmateweather-1.16.1, libmicrohttpd-0.9.52, libmikmod-3.3.10,
+libpng-1.6.25, libpsl-0.16.1, libraw-0.17.2, libraw1394-2.1.2, librecad-2.1.3,
+libreoffice-5.1.5.2, libressl-2.5.0, librsvg-2.40.16, libsigc++-2.10.0,
+libsodium-1.0.11, libsoup-2.56.0, libstdc++-4.9.4, libstdc++-doc-5.4.0,
+libtasn1-4.9, libtiff-4.0.7, libuninameslist-20160701, libupnp-1.6.20,
+libva-1.7.1, libvpx-1.6.0, libwebp-0.5.1, libwnck-3.20.1, libx11-1.6.4,
+libx264-20161205-2245, libxcb-1.11.1, libxfixes-5.0.3, libxfont-1.5.2,
+libxi-1.7.8, libxmp-4.4.1, libxrandr-1.5.1, libxrender-0.9.10, libxtst-1.2.3,
+libxv-1.0.11, libxvmc-1.0.10, lilv-0.22.0, lilypond-2.19.51, links-2.14,
+linux-libre-4.4.39, linux-libre-4.8.15, linux-libre-headers-4.4.18,
+linux-pam-1.3.0, llvm-3.6.2, llvm-3.7.1, llvm-3.7.1, llvm-3.8.1,
+lm-sensors-3.4.0, love-0.10.2, lrzip-0.631, lua-5.3.3, lv2-1.14.0,
+lvm2-2.02.166, lynx-2.8.9dev.9, mafft-7.305, magit-2.8.0, mailutils-3.0,
+make-4.2.1, man-pages-4.09, manaplus-1.6.8.14, mariadb-10.1.19,
+mate-desktop-1.16.1, mate-icon-theme-1.16.0, mate-menus-1.16.0,
+mate-themes-3.20.9, maxima-5.39.0, mercurial-3.9, mesa-13.0.2,
+mesa-headers-13.0.2, metabat-0.32.4-1.cbdca756, mig-1.8, miniupnpc-2.0,
+mit-krb5-1.14.3, mosh-1.2.6, mozjs-24.2.0, mpd-0.19.19, mpd-mpc-0.28,
+mpg123-1.23.8, mpg321-0.3.2, mpv-0.22.0, mumps-5.0.2, mumps-metis-5.0.2,
+mumps-metis-openmpi-5.0.2, mumps-openmpi-5.0.2, mupdf-1.10a, mutt-1.7.1,
+mutter-3.20.3, mysql-5.7.16, nano-2.7.2, nasm-2.12.02, nautilus-3.20.2,
+ncbi-vdb-2.7.0, ncdu-1.12, ncmpc-0.25, ncmpcpp-0.7.7, nestopia-ue-1.47,
+netcdf-4.4.1.1, netcdf-parallel-openmpi-4.4.1.1, nettle-3.2,
+network-manager-1.4.2, network-manager-applet-1.4.2, nginx-1.11.6,
+ngs-sdk-1.2.5, nmap-7.31, node-6.8.0, non-sequencer-1.9.5-2.a22f33f,
+notmuch-0.23.3, npth-1.3, nss-3.27.2, nss-certs-3.27.2, ntp-4.2.8p9,
+obs-0.16.6, octave-4.2.0, offlineimap-7.0.12, opam-1.2.2, openal-1.17.2,
+openblas-0.2.19, openconnect-7.08, openjpeg-2.1.1, openssh-7.4p1,
+openssl-1.0.2j, openssl-1.1.0c, opusfile-0.8, orc-0.4.26, orfm-0.6.1,
+owncloud-client-2.2.4, oxygen-icons-5.28.0, p11-kit-0.23.2, pangomm-2.40.1,
+parallel-20161122, pardre-1.1.5-1, pciutils-3.5.2, perf-4.8.15, perl-5.24.0,
+perl-apache-logformat-compiler-0.33, perl-catalyst-action-rest-1.20,
+perl-catalyst-plugin-accesslog-1.10, perl-catalyst-plugin-session-0.40,
+perl-catalyst-view-json-0.36, perl-catalyst-view-tt-0.44, perl-cgi-4.35,
+perl-class-method-modifiers-2.12, perl-dbd-mysql-4.041, perl-dbd-sqlite-1.52,
+perl-dbix-class-0.082840, perl-dbix-class-cursor-cached-1.001004,
+perl-dbix-class-introspectablem2m-0.001002,
+perl-dbix-class-schema-loader-0.07046, perl-email-address-1.908,
+perl-email-messageid-1.406, perl-email-mime-1.937,
+perl-email-mime-contenttype-1.018, perl-email-sender-1.300028,
+perl-email-simple-2.211, perl-encode-locale-1.05, perl-eval-closure-0.14,
+perl-finance-quote-1.38, perl-html-parser-3.72, perl-http-body-1.22,
+perl-http-cookiejar-0.008, perl-http-message-6.11,
+perl-http-server-simple-0.51, perl-http-tiny-0.070, perl-io-socket-ssl-2.038,
+perl-libwww-6.15, perl-module-build-0.4220, perl-namespace-autoclean-0.28,
+perl-test-mockobject-1.20150527, perl-test-simple-1.302062,
+perl-unicode-linebreak-2016.003, perl-xml-compile-1.54,
+perl-xml-compile-cache-1.05, perl-xml-compile-soap-3.20,
+perl-xml-compile-wsdl11-3.05, perl-xml-dom-1.46, perl-xml-libxml-simple-0.97,
+pies-1.3, pinentry-1.0.0, pinentry-gtk2-1.0.0, pinentry-qt-1.0.0,
+pinentry-tty-1.0.0, poppler-0.47.0, poppler-qt4-0.47.0, poppler-qt5-0.47.0,
+postgresql-9.5.5, privoxy-3.0.26, procps-3.3.12, pulseaudio-9.0, python-3.4.5,
+python-3.5.2, python-acme-0.9.3, python-beautifulsoup4-4.5.1,
+python-billiard-3.3.0.23, python-biopython-1.68, python-botocore-1.4.62,
+python-celery-3.1.24, python-certifi-2016.8.31, python-cryptography-1.7.1,
+python-cryptography-vectors-1.7.1, python-cython-0.24.1,
+python-dateutil-2.5.2, python-dnspython-1.15.0, python-docutils-0.13.1,
+python-efl-1.18.0, python-fake-factory-0.7.2, python-file-5.28,
+python-flake8-2.5.4, python-flask-0.11.1, python-gst-1.10.2,
+python-html5lib-1.0b10, python-icalendar-3.11, python-ipython-4.0.3,
+python-jellyfish-0.5.6, python-joblib-0.10.3, python-kombu-3.0.37,
+python-llfuse-1.1.1, python-mccabe-0.4.0, python-minimal-3.5.2,
+python-minimal-wrapper-3.5.2, python-msgpack-0.4.8, python-munkres-1.0.8,
+python-musicbrainzngs-0.6, python-mutagen-1.35.1, python-os-testr-0.8.0,
+python-passlib-1.7.0, python-pillow-3.3.3, python-plastid-0.4.6,
+python-prompt-toolkit-1.0.7, python-py3status-3.1, python-pyasn1-0.1.9,
+python-pyflakes-1.0.0, python-pylast-1.6.0, python-pyld-0.7.1,
+python-pyopenssl-16.2.0, python-pyqt-5.7, python-pysam-0.9.1.4,
+python-pytest-2.9.2, python-rarfile-2.8, python-requests-mock-1.0.0,
+python-rsa-3.4.2, python-setuptools-31.0.0, python-simplejson-3.10.0,
+python-sip-4.18.1, python-tempest-lib-1.0.0, python-traitlets-4.2.0,
+python-twobitreader-3.1.4, python-urllib3-1.18.1, python-urwid-1.3.1,
+python-urwidtrees-1.0.2, python-vcversioner-2.16.0.0,
+python-virtualenv-15.0.3, python-waf-1.9.5, python-werkzeug-0.11.11,
+python-wrapper-3.5.2, python-xlrd-1.0.0, python2-acme-0.9.3,
+python2-beautifulsoup4-4.5.1, python2-billiard-3.3.0.23,
+python2-biopython-1.68, python2-botocore-1.4.62, python2-celery-3.1.24,
+python2-certifi-2016.8.31, python2-cryptography-1.7.1,
+python2-cryptography-vectors-1.7.1, python2-cython-0.24.1,
+python2-dateutil-2.5.2, python2-dnspython-1.15.0, python2-docutils-0.13.1,
+python2-efl-1.18.0, python2-fake-factory-0.7.2, python2-file-5.28,
+python2-flake8-2.5.4, python2-flask-0.11.1, python2-gst-1.10.2,
+python2-html5lib-1.0b10, python2-ipaddress-1.0.16, python2-ipython-4.0.3,
+python2-jellyfish-0.5.6, python2-joblib-0.10.3, python2-kombu-3.0.37,
+python2-llfuse-1.1.1, python2-mccabe-0.4.0, python2-msgpack-0.4.8,
+python2-munkres-1.0.8, python2-musicbrainzngs-0.6, python2-mutagen-1.35.1,
+python2-notmuch-0.23.3, python2-os-testr-0.8.0, python2-passlib-1.7.0,
+python2-pbcore-1.2.10, python2-pep8-1.7.0, python2-pillow-3.3.3,
+python2-plastid-0.4.6, python2-prompt-toolkit-1.0.7, python2-pyasn1-0.1.9,
+python2-pyflakes-1.0.0, python2-pylast-1.6.0, python2-pyld-0.7.1,
+python2-pyopenssl-16.2.0, python2-pyqt-5.7, python2-pysam-0.9.1.4,
+python2-rarfile-2.8, python2-requests-mock-1.0.0, python2-rsa-3.4.2,
+python2-setuptools-31.0.0, python2-simplejson-3.10.0, python2-sip-4.18.1,
+python2-tempest-lib-1.0.0, python2-traitlets-4.2.0,
+python2-twobitreader-3.1.4, python2-urllib3-1.18.1, python2-urwid-1.3.1,
+python2-urwidtrees-1.0.2, python2-vcversioner-2.16.0.0,
+python2-virtualenv-15.0.3, python2-waf-1.9.5, python2-werkzeug-0.11.11,
+python2-xlrd-1.0.0, qemu-2.7.0, qemu-minimal-2.7.0, qpdf-6.0.0, qsynth-0.4.3,
+qt-5.6.2, qtbase-5.7.0, qtconnectivity-5.7.0, qtdeclarative-5.7.0,
+qtimageformats-5.7.0, qtlocation-5.7.0, qtmultimedia-5.7.0, qtractor-0.8.0,
+qtscript-5.7.0, qtsensors-5.7.0, qtserialport-5.7.0, qtsvg-5.7.0,
+qttools-5.7.0, qtwayland-5.7.0, qtwebchannel-5.7.0, qtwebsockets-5.7.0,
+qtx11extras-5.7.0, qtxmlpatterns-5.7.0, r-3.3.2, r-acepack-1.4.1,
+r-acsnminer-0.16.8.25, r-annotationdbi-1.36.0, r-biobase-2.34.0,
+r-biocgenerics-0.20.0, r-biocparallel-1.8.1, r-biomart-2.30.0,
+r-biostrings-2.42.0, r-bsgenome-1.42.0, r-cluster-2.0.5, r-codetools-0.2-15,
+r-colorspace-1.2-7, r-crayon-1.3.2, r-curl-2.2, r-dbi-0.5-1,
+r-devtools-1.12.0, r-digest-0.6.10, r-dnacopy-1.48.0, r-dplyr-0.5.0, r-dt-0.2,
+r-edger-3.16.1, r-evaluate-0.10, r-foreign-0.8-67, r-futile-logger-1.4.3,
+r-gdtools-0.1.1, r-genomation-1.6.0, r-genomationdata-1.6.0,
+r-genomeinfodb-1.10.0, r-genomicalignments-1.10.0, r-genomicfeatures-1.26.0,
+r-genomicranges-1.26.1, r-go-db-3.4.0, r-graph-1.52.0, r-htmlwidgets-0.7,
+r-httr-1.2.1, r-impute-1.48.0, r-iranges-2.8.0, r-irlba-2.1.2, r-jsonlite-1.1,
+r-knitr-1.14, r-lambda-r-1.1.9, r-lattice-0.20-34, r-lazyeval-0.2.0,
+r-limma-3.30.2, r-matrixstats-0.51.0, r-mgcv-1.8-15, r-mime-0.5,
+r-motifrg-1.18.0, r-multitaper-1.0-12, r-openssl-0.9.5, r-org-ce-eg-db-3.4.0,
+r-org-dm-eg-db-3.4.0, r-org-hs-eg-db-3.4.0, r-org-mm-eg-db-3.4.0,
+r-permute-0.9-4, r-plotly-4.5.2, r-plotrix-3.6-3, r-plyr-1.8.4,
+r-pracma-1.9.5, r-proto-1.0.0, r-r-oo-1.21.0, r-r-utils-2.4.0, r-r6-2.2.0,
+r-rcpp-0.12.7, r-rcpparmadillo-0.7.500.0.0, r-readr-1.0.0, r-reshape2-1.4.2,
+r-rmarkdown-1.1, r-rsamtools-1.26.1, r-rstudioapi-0.6, r-rtracklayer-1.34.1,
+r-rversions-1.0.3, r-s4vectors-0.12.0, r-seqinr-3.3-3, r-seqlogo-1.40.0,
+r-seqpattern-1.6.0, r-snow-0.4-2, r-sparsem-1.72, r-stringi-1.1.2,
+r-stringr-1.1.0, r-summarizedexperiment-1.4.0, r-tidyr-0.6.0, r-topgo-2.26.0,
+r-variantannotation-1.20.0, r-vegan-2.4-1, r-withr-1.0.2, r-xml2-1.0.0,
+r-xvector-0.14.0, r-zlibbioc-1.20.0, racket-6.6, rage-0.2.1,
+raul-0.8.4-1.f8bf77d3c, readline-7.0, red-eclipse-1.5.6, redis-3.2.4,
+retroarch-1.3.6, rhythmbox-3.4, rofi-1.2.0, ruby-2.1.10, ruby-2.2.6,
+ruby-2.3.3, ruby-activesupport-5.0.0, ruby-arel-7.1.4,
+ruby-cucumber-core-1.5.0, ruby-domain-name-0.5.20161021, ruby-hoe-3.15.2,
+ruby-http-cookie-1.0.3, ruby-lumberjack-1.0.10,
+ruby-mime-types-data-3.2016.0521, ruby-puma-3.6.0, ruby-rack-2.0.1,
+ruby-rake-compiler-1.0.1, ruby-rspec-3.5.0, ruby-rspec-core-3.5.4,
+ruby-rspec-expectations-3.5.0, ruby-rspec-mocks-3.5.0, ruby-sdoc-0.4.2,
+ruby-sequel-4.40.0, ruby-shoulda-context-1.2.2, ruby-simplecov-0.12.0,
+ruby-spring-1.7.2, ruby-sqlite3-1.3.12, ruby-tzinfo-data-1.2016.9,
+ruby-yard-0.9.5-1.d816482a, rush-1.8, samba-4.5.3, samtools-1.3.1,
+sane-backends-1.0.25, scribus-1.5.2, sdl2-2.0.5, serd-0.22.0,
+shared-mime-info-1.7, shepherd-0.3.2, shotwell-0.25.0.1, signify-20,
+simple-scan-3.22.0.1, slock-1.3, sord-0.14.0, sqlite-3.14.1, sqlite-3.15.1,
+sra-tools-2.7.0, st-0.7, star-2.5.2b, starfighter-1.6, subread-1.5.1,
+subversion-1.8.17, supertux-0.5.0, swig-3.0.10, synergy-1.8.2, synthv1-0.8.0,
+taglib-1.10, talloc-2.1.8, tbb-2017_20160916, tdb-1.3.11, termite-12,
+tevent-0.9.31, texinfo-6.3, thefuck-3.11, tig-2.2, tilda-1.3.3, tiled-0.17.0,
+tmux-2.3, tor-0.2.9.8, torsocks-2.2.0, transmission-2.92, tuxguitar-1.3.2,
+tzdata-2016j, udisks-2.1.8, usbredir-0.7.1-1.ac80a59, usbutils-008,
+utf8proc-2.0.2, util-linux-2.28.1, vala-0.32.1, valgrind-3.12.0,
+vapoursynth-35, vdirsyncer-0.14.0, videoproto-2.3.3, vim-8.0.0133,
+vsearch-2.3.4, vte-0.44.2, vtk-7.1.0, w3m-0.5.3+git20161120,
+warzone2100-3.2.1, webkitgtk-2.14.2, weechat-1.6, weex-2.8.2,
+windowmaker-0.95.7, wine-1.9.24, wireless-regdb-2016.06.10, wireshark-2.2.2,
+wpa-supplicant-2.6, wpa-supplicant-minimal-2.6, wxmaxima-16.12.0,
+xapian-1.4.1, xboard-4.9.1, xf86-input-evdev-2.10.4,
+xf86-input-joystick-1.6.3, xf86-input-keyboard-1.9.0,
+xf86-input-libinput-0.23.0, xf86-input-mouse-1.9.2,
+xf86-input-synaptics-1.9.0, xf86-video-ati-7.8.0, xf86-video-nouveau-1.0.13,
+xf86-video-openchrome-0.5.0, xkbcomp-1.3.1, xkeyboard-config-2.18, xmp-4.1.0,
+xorg-server-1.18.4, xorriso-1.4.6, xproto-7.0.29, yoshimi-1.5.0,
+youtube-dl-2016.12.15, zathura-0.3.6, zathura-cb-0.1.5, zathura-djvu-0.2.5,
+zathura-pdf-poppler-0.2.6, zathura-ps-0.2.3, zile-2.4.13, zimg-2.3,
+zynaddsubfx-3.0.1
+
+** Programming interfaces
+
+*** New procedure ‘package-for-guile-2.2’ for Guile package variants
+*** New ‘package-input-rewriting’ customization procedure in (guix packages)
+*** New ‘deprecated-package’ procedure in (guix packages)
+*** New ‘file-append’ procedure in (guix gexp)
+*** New (guix modules) module, to determine the closure of a Guile module
+*** ‘wrap-program’ from (guix utils) now produces only one wrapper file.
+
+** Noteworthy bug fixes
+
+*** ‘ld-wrapper’ no longer aborts if Guile 2.2 modules are in the search path
+*** ‘guix system reconfigure’ no longer unloads services depended on
+*** GuixSD ‘menu-entry’ can specify arbitrary kernel and initrd file names
+    (<http://bugs.gnu.org/20067>)
+*** Fix typo in device-opening code for ‘raid-device-type’
+*** Grafts are applied to replacement packages (<http://bugs.gnu.org/24418>)
+*** guix-daemon does not fail when deduplicating would lead to ENOSPC
+*** ‘guix download’ now checks X.509 certificates by default (<http://bugs.gnu.org/24466>)
+*** Avoid bootstrapping issue for HTTPS downloads (<http://bugs.gnu.org/22774>)
+*** Failed build directories are owned by the user to ease debugging (<http://bugs.gnu.org/15890>)
+*** Significantly reduced the closure of Perl (<http://bugs.gnu.org/23077>)
+*** Fixed importer for Nixpkgs (<http://bugs.gnu.org/25053>)
+
+** Native language support
+
+Updated translations: da (Danish), pl (Polish), de (German), pt_BR (Portuguese, Brazil), and fr (French).
+
 * Changes in 0.11.0 (since 0.10.0)
 
 ** Package management
diff --git a/build-aux/check-final-inputs-self-contained.scm b/build-aux/check-final-inputs-self-contained.scm
index 255286be29..dc44c4b636 100644
--- a/build-aux/check-final-inputs-self-contained.scm
+++ b/build-aux/check-final-inputs-self-contained.scm
@@ -37,12 +37,17 @@
                 (let ((drv (package-derivation store package system)))
                   ;; Libc's 'debug' output refers to gcc-cross-boot0, but it's
                   ;; hard to avoid, so we tolerate it.  This should be the
-                  ;; only exception.
+                  ;; only exception.  Likewise, 'bash:include' depends on
+                  ;; bootstrap-binaries via its 'Makefile.inc' (FIXME).
                   (filter-map (match-lambda
                                (("debug" . directory)
                                 (if (string=? "glibc" (package-name package))
                                     #f
                                     directory))
+                               (("include" . directory)
+                                (if (string=? "bash" (package-name package))
+                                    #f
+                                    directory))
                                ((_ . directory) directory))
                               (derivation->output-paths drv)))))
               %final-inputs))
diff --git a/build-aux/hydra/demo-os.scm b/build-aux/hydra/demo-os.scm
deleted file mode 100644
index d933bc8b25..0000000000
--- a/build-aux/hydra/demo-os.scm
+++ /dev/null
@@ -1,84 +0,0 @@
-;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014, 2015 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/>.
-
-
-;;;
-;;; This file defines an operating system configuration for the demo virtual
-;;; machine images that we build.
-;;;
-
-(use-modules (gnu))
-(use-service-modules desktop xorg networking avahi dbus)
-(use-package-modules linux xorg tor avahi)
-
-(operating-system
- (host-name "gnu")
- (timezone "Europe/Paris")
- (locale "en_US.utf8")
-
- (bootloader (grub-configuration
-              (device "/dev/sda")))
- (file-systems
-  ;; We provide a dummy file system for /, but that's OK because the VM build
-  ;; code will automatically declare the / file system for us.
-  (cons* (file-system
-           (mount-point "/")
-           (device "dummy")
-           (type "dummy"))
-         ;; %fuse-control-file-system   ; needs fuse.ko
-         ;; %binary-format-file-system  ; needs binfmt.ko
-         %base-file-systems))
-
- (users (list (user-account
-               (name "guest")
-               (group "users")
-               (supplementary-groups '("wheel"))  ; allow use of sudo
-               (password "")
-               (comment "Guest of GNU")
-               (home-directory "/home/guest"))))
-
- (issue "
-This is an alpha preview of the GNU system.  Welcome.
-
-This image features the GNU Guix package manager, which was used to
-build it (http://www.gnu.org/software/guix/).  The init system is
-the GNU Shepherd (http://www.gnu.org/software/shepherd/).
-
-You can log in as 'guest' or 'root' with no password.
-")
-
- (services (cons* (slim-service #:auto-login? #t
-                                #:default-user "guest")
-
-                  ;; QEMU networking settings.
-                  (static-networking-service "eth0" "10.0.2.10"
-                                             #:name-servers '("10.0.2.3")
-                                             #:gateway "10.0.2.2")
-
-                  (avahi-service)
-                  (dbus-service)
-                  (tor-service)
-
-                  %base-services))
- (pam-services
-  ;; Explicitly allow for empty passwords.
-  (base-pam-services #:allow-empty-passwords? #t))
-
- (packages (cons* strace
-                  tor torsocks
-                  xterm avahi %base-packages)))
diff --git a/build-aux/hydra/gnu-system.scm b/build-aux/hydra/gnu-system.scm
index cddda85eac..e406ed94c5 100644
--- a/build-aux/hydra/gnu-system.scm
+++ b/build-aux/hydra/gnu-system.scm
@@ -125,12 +125,6 @@ SYSTEM."
     "arm-linux-gnueabihf"
     "i686-w64-mingw32"))
 
-(define (demo-os)
-  "Return the \"demo\" 'operating-system' structure."
-  (let* ((dir  (dirname (assoc-ref (current-source-location) 'filename)))
-         (file (string-append dir "/demo-os.scm")))
-    (read-operating-system file)))
-
 (define %guixsd-supported-systems
   '("x86_64-linux" "i686-linux"))
 
@@ -156,14 +150,7 @@ system.")
     (expt 2 20))
 
   (if (member system %guixsd-supported-systems)
-      (list (->job 'qemu-image
-                   (run-with-store store
-                     (mbegin %store-monad
-                       (set-guile-for-build (default-guile))
-                       (system-qemu-image (demo-os)
-                                          #:disk-image-size
-                                          (* 1400 MiB))))) ; 1.4 GiB
-            (->job 'usb-image
+      (list (->job 'usb-image
                    (run-with-store store
                      (mbegin %store-monad
                        (set-guile-for-build (default-guile))
diff --git a/configure.ac b/configure.ac
index 34f1323792..f628fa9d0d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,7 +2,7 @@
 # Process this file with autoconf to produce a configure script.
 
 AC_PREREQ(2.68)
-AC_INIT([GNU Guix], [0.11.0], [bug-guix@gnu.org], [guix],
+AC_INIT([GNU Guix], [0.12.0], [bug-guix@gnu.org], [guix],
   [http://www.gnu.org/software/guix/])
 AC_CONFIG_AUX_DIR([build-aux])
 
@@ -216,6 +216,11 @@ AC_MSG_CHECKING([for zlib's shared library name])
 AC_MSG_RESULT([$LIBZ])
 AC_SUBST([LIBZ])
 
+dnl Check for Guile-SSH, for the (guix ssh) module.
+GUIX_CHECK_GUILE_SSH
+AM_CONDITIONAL([HAVE_GUILE_SSH],
+  [test "x$guix_cv_have_recent_guile_ssh" = "xyes"])
+
 AC_CACHE_SAVE
 
 m4_include([config-daemon.ac])
@@ -227,6 +232,10 @@ AM_MISSING_PROG([DOT], [dot])
 dnl Manual pages.
 AM_MISSING_PROG([HELP2MAN], [help2man])
 
+dnl Emacs (optional), for 'etc/indent-package.el'.
+AC_PATH_PROG([EMACS], [emacs], [/usr/bin/emacs])
+AC_SUBST([EMACS])
+
 AC_CONFIG_FILES([Makefile
                  po/guix/Makefile.in
                  po/packages/Makefile.in
@@ -236,15 +245,6 @@ AC_CONFIG_FILES([scripts/guix], [chmod +x scripts/guix])
 AC_CONFIG_FILES([test-env:build-aux/test-env.in], [chmod +x test-env])
 AC_CONFIG_FILES([pre-inst-env:build-aux/pre-inst-env.in],
   [chmod +x pre-inst-env])
-
-dnl Emacs interface.
-AC_PATH_PROG([DOT_USER_PROGRAM], [dot], [dot])
-AM_PATH_LISPDIR
-AM_CONDITIONAL([HAVE_EMACS], [test "x$EMACS" != "xno"])
-
-emacsuidir="${guilemoduledir}/guix/emacs"
-AC_SUBST([emacsuidir])
-AC_CONFIG_FILES([emacs/guix-config.el
-                 emacs/guix-helper.scm])
+AC_CONFIG_FILES([etc/indent-package.el], [chmod +x etc/indent-package.el])
 
 AC_OUTPUT
diff --git a/d3.v3.js b/d3.v3.js
new file mode 100644
index 0000000000..d234c4ec86
--- /dev/null
+++ b/d3.v3.js
@@ -0,0 +1,9584 @@
+// Downloaded from http://d3js.org/d3.v3.js
+//
+// Copyright 2010-2016 Mike Bostock
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright notice, this
+//   list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above copyright notice,
+//   this list of conditions and the following disclaimer in the documentation
+//   and/or other materials provided with the distribution.
+//
+// * Neither the name of the author nor the names of contributors may be used to
+//   endorse or promote products derived from this software without specific prior
+//   written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+!function() {
+  var d3 = {
+    version: "3.5.17"
+  };
+  var d3_arraySlice = [].slice, d3_array = function(list) {
+    return d3_arraySlice.call(list);
+  };
+  var d3_document = this.document;
+  function d3_documentElement(node) {
+    return node && (node.ownerDocument || node.document || node).documentElement;
+  }
+  function d3_window(node) {
+    return node && (node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView);
+  }
+  if (d3_document) {
+    try {
+      d3_array(d3_document.documentElement.childNodes)[0].nodeType;
+    } catch (e) {
+      d3_array = function(list) {
+        var i = list.length, array = new Array(i);
+        while (i--) array[i] = list[i];
+        return array;
+      };
+    }
+  }
+  if (!Date.now) Date.now = function() {
+    return +new Date();
+  };
+  if (d3_document) {
+    try {
+      d3_document.createElement("DIV").style.setProperty("opacity", 0, "");
+    } catch (error) {
+      var d3_element_prototype = this.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = this.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty;
+      d3_element_prototype.setAttribute = function(name, value) {
+        d3_element_setAttribute.call(this, name, value + "");
+      };
+      d3_element_prototype.setAttributeNS = function(space, local, value) {
+        d3_element_setAttributeNS.call(this, space, local, value + "");
+      };
+      d3_style_prototype.setProperty = function(name, value, priority) {
+        d3_style_setProperty.call(this, name, value + "", priority);
+      };
+    }
+  }
+  d3.ascending = d3_ascending;
+  function d3_ascending(a, b) {
+    return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
+  }
+  d3.descending = function(a, b) {
+    return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
+  };
+  d3.min = function(array, f) {
+    var i = -1, n = array.length, a, b;
+    if (arguments.length === 1) {
+      while (++i < n) if ((b = array[i]) != null && b >= b) {
+        a = b;
+        break;
+      }
+      while (++i < n) if ((b = array[i]) != null && a > b) a = b;
+    } else {
+      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {
+        a = b;
+        break;
+      }
+      while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;
+    }
+    return a;
+  };
+  d3.max = function(array, f) {
+    var i = -1, n = array.length, a, b;
+    if (arguments.length === 1) {
+      while (++i < n) if ((b = array[i]) != null && b >= b) {
+        a = b;
+        break;
+      }
+      while (++i < n) if ((b = array[i]) != null && b > a) a = b;
+    } else {
+      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {
+        a = b;
+        break;
+      }
+      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;
+    }
+    return a;
+  };
+  d3.extent = function(array, f) {
+    var i = -1, n = array.length, a, b, c;
+    if (arguments.length === 1) {
+      while (++i < n) if ((b = array[i]) != null && b >= b) {
+        a = c = b;
+        break;
+      }
+      while (++i < n) if ((b = array[i]) != null) {
+        if (a > b) a = b;
+        if (c < b) c = b;
+      }
+    } else {
+      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {
+        a = c = b;
+        break;
+      }
+      while (++i < n) if ((b = f.call(array, array[i], i)) != null) {
+        if (a > b) a = b;
+        if (c < b) c = b;
+      }
+    }
+    return [ a, c ];
+  };
+  function d3_number(x) {
+    return x === null ? NaN : +x;
+  }
+  function d3_numeric(x) {
+    return !isNaN(x);
+  }
+  d3.sum = function(array, f) {
+    var s = 0, n = array.length, a, i = -1;
+    if (arguments.length === 1) {
+      while (++i < n) if (d3_numeric(a = +array[i])) s += a;
+    } else {
+      while (++i < n) if (d3_numeric(a = +f.call(array, array[i], i))) s += a;
+    }
+    return s;
+  };
+  d3.mean = function(array, f) {
+    var s = 0, n = array.length, a, i = -1, j = n;
+    if (arguments.length === 1) {
+      while (++i < n) if (d3_numeric(a = d3_number(array[i]))) s += a; else --j;
+    } else {
+      while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) s += a; else --j;
+    }
+    if (j) return s / j;
+  };
+  d3.quantile = function(values, p) {
+    var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h;
+    return e ? v + e * (values[h] - v) : v;
+  };
+  d3.median = function(array, f) {
+    var numbers = [], n = array.length, a, i = -1;
+    if (arguments.length === 1) {
+      while (++i < n) if (d3_numeric(a = d3_number(array[i]))) numbers.push(a);
+    } else {
+      while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) numbers.push(a);
+    }
+    if (numbers.length) return d3.quantile(numbers.sort(d3_ascending), .5);
+  };
+  d3.variance = function(array, f) {
+    var n = array.length, m = 0, a, d, s = 0, i = -1, j = 0;
+    if (arguments.length === 1) {
+      while (++i < n) {
+        if (d3_numeric(a = d3_number(array[i]))) {
+          d = a - m;
+          m += d / ++j;
+          s += d * (a - m);
+        }
+      }
+    } else {
+      while (++i < n) {
+        if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) {
+          d = a - m;
+          m += d / ++j;
+          s += d * (a - m);
+        }
+      }
+    }
+    if (j > 1) return s / (j - 1);
+  };
+  d3.deviation = function() {
+    var v = d3.variance.apply(this, arguments);
+    return v ? Math.sqrt(v) : v;
+  };
+  function d3_bisector(compare) {
+    return {
+      left: function(a, x, lo, hi) {
+        if (arguments.length < 3) lo = 0;
+        if (arguments.length < 4) hi = a.length;
+        while (lo < hi) {
+          var mid = lo + hi >>> 1;
+          if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid;
+        }
+        return lo;
+      },
+      right: function(a, x, lo, hi) {
+        if (arguments.length < 3) lo = 0;
+        if (arguments.length < 4) hi = a.length;
+        while (lo < hi) {
+          var mid = lo + hi >>> 1;
+          if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1;
+        }
+        return lo;
+      }
+    };
+  }
+  var d3_bisect = d3_bisector(d3_ascending);
+  d3.bisectLeft = d3_bisect.left;
+  d3.bisect = d3.bisectRight = d3_bisect.right;
+  d3.bisector = function(f) {
+    return d3_bisector(f.length === 1 ? function(d, x) {
+      return d3_ascending(f(d), x);
+    } : f);
+  };
+  d3.shuffle = function(array, i0, i1) {
+    if ((m = arguments.length) < 3) {
+      i1 = array.length;
+      if (m < 2) i0 = 0;
+    }
+    var m = i1 - i0, t, i;
+    while (m) {
+      i = Math.random() * m-- | 0;
+      t = array[m + i0], array[m + i0] = array[i + i0], array[i + i0] = t;
+    }
+    return array;
+  };
+  d3.permute = function(array, indexes) {
+    var i = indexes.length, permutes = new Array(i);
+    while (i--) permutes[i] = array[indexes[i]];
+    return permutes;
+  };
+  d3.pairs = function(array) {
+    var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n);
+    while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ];
+    return pairs;
+  };
+  d3.transpose = function(matrix) {
+    if (!(n = matrix.length)) return [];
+    for (var i = -1, m = d3.min(matrix, d3_transposeLength), transpose = new Array(m); ++i < m; ) {
+      for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n; ) {
+        row[j] = matrix[j][i];
+      }
+    }
+    return transpose;
+  };
+  function d3_transposeLength(d) {
+    return d.length;
+  }
+  d3.zip = function() {
+    return d3.transpose(arguments);
+  };
+  d3.keys = function(map) {
+    var keys = [];
+    for (var key in map) keys.push(key);
+    return keys;
+  };
+  d3.values = function(map) {
+    var values = [];
+    for (var key in map) values.push(map[key]);
+    return values;
+  };
+  d3.entries = function(map) {
+    var entries = [];
+    for (var key in map) entries.push({
+      key: key,
+      value: map[key]
+    });
+    return entries;
+  };
+  d3.merge = function(arrays) {
+    var n = arrays.length, m, i = -1, j = 0, merged, array;
+    while (++i < n) j += arrays[i].length;
+    merged = new Array(j);
+    while (--n >= 0) {
+      array = arrays[n];
+      m = array.length;
+      while (--m >= 0) {
+        merged[--j] = array[m];
+      }
+    }
+    return merged;
+  };
+  var abs = Math.abs;
+  d3.range = function(start, stop, step) {
+    if (arguments.length < 3) {
+      step = 1;
+      if (arguments.length < 2) {
+        stop = start;
+        start = 0;
+      }
+    }
+    if ((stop - start) / step === Infinity) throw new Error("infinite range");
+    var range = [], k = d3_range_integerScale(abs(step)), i = -1, j;
+    start *= k, stop *= k, step *= k;
+    if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k);
+    return range;
+  };
+  function d3_range_integerScale(x) {
+    var k = 1;
+    while (x * k % 1) k *= 10;
+    return k;
+  }
+  function d3_class(ctor, properties) {
+    for (var key in properties) {
+      Object.defineProperty(ctor.prototype, key, {
+        value: properties[key],
+        enumerable: false
+      });
+    }
+  }
+  d3.map = function(object, f) {
+    var map = new d3_Map();
+    if (object instanceof d3_Map) {
+      object.forEach(function(key, value) {
+        map.set(key, value);
+      });
+    } else if (Array.isArray(object)) {
+      var i = -1, n = object.length, o;
+      if (arguments.length === 1) while (++i < n) map.set(i, object[i]); else while (++i < n) map.set(f.call(object, o = object[i], i), o);
+    } else {
+      for (var key in object) map.set(key, object[key]);
+    }
+    return map;
+  };
+  function d3_Map() {
+    this._ = Object.create(null);
+  }
+  var d3_map_proto = "__proto__", d3_map_zero = "\x00";
+  d3_class(d3_Map, {
+    has: d3_map_has,
+    get: function(key) {
+      return this._[d3_map_escape(key)];
+    },
+    set: function(key, value) {
+      return this._[d3_map_escape(key)] = value;
+    },
+    remove: d3_map_remove,
+    keys: d3_map_keys,
+    values: function() {
+      var values = [];
+      for (var key in this._) values.push(this._[key]);
+      return values;
+    },
+    entries: function() {
+      var entries = [];
+      for (var key in this._) entries.push({
+        key: d3_map_unescape(key),
+        value: this._[key]
+      });
+      return entries;
+    },
+    size: d3_map_size,
+    empty: d3_map_empty,
+    forEach: function(f) {
+      for (var key in this._) f.call(this, d3_map_unescape(key), this._[key]);
+    }
+  });
+  function d3_map_escape(key) {
+    return (key += "") === d3_map_proto || key[0] === d3_map_zero ? d3_map_zero + key : key;
+  }
+  function d3_map_unescape(key) {
+    return (key += "")[0] === d3_map_zero ? key.slice(1) : key;
+  }
+  function d3_map_has(key) {
+    return d3_map_escape(key) in this._;
+  }
+  function d3_map_remove(key) {
+    return (key = d3_map_escape(key)) in this._ && delete this._[key];
+  }
+  function d3_map_keys() {
+    var keys = [];
+    for (var key in this._) keys.push(d3_map_unescape(key));
+    return keys;
+  }
+  function d3_map_size() {
+    var size = 0;
+    for (var key in this._) ++size;
+    return size;
+  }
+  function d3_map_empty() {
+    for (var key in this._) return false;
+    return true;
+  }
+  d3.nest = function() {
+    var nest = {}, keys = [], sortKeys = [], sortValues, rollup;
+    function map(mapType, array, depth) {
+      if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array;
+      var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values;
+      while (++i < n) {
+        if (values = valuesByKey.get(keyValue = key(object = array[i]))) {
+          values.push(object);
+        } else {
+          valuesByKey.set(keyValue, [ object ]);
+        }
+      }
+      if (mapType) {
+        object = mapType();
+        setter = function(keyValue, values) {
+          object.set(keyValue, map(mapType, values, depth));
+        };
+      } else {
+        object = {};
+        setter = function(keyValue, values) {
+          object[keyValue] = map(mapType, values, depth);
+        };
+      }
+      valuesByKey.forEach(setter);
+      return object;
+    }
+    function entries(map, depth) {
+      if (depth >= keys.length) return map;
+      var array = [], sortKey = sortKeys[depth++];
+      map.forEach(function(key, keyMap) {
+        array.push({
+          key: key,
+          values: entries(keyMap, depth)
+        });
+      });
+      return sortKey ? array.sort(function(a, b) {
+        return sortKey(a.key, b.key);
+      }) : array;
+    }
+    nest.map = function(array, mapType) {
+      return map(mapType, array, 0);
+    };
+    nest.entries = function(array) {
+      return entries(map(d3.map, array, 0), 0);
+    };
+    nest.key = function(d) {
+      keys.push(d);
+      return nest;
+    };
+    nest.sortKeys = function(order) {
+      sortKeys[keys.length - 1] = order;
+      return nest;
+    };
+    nest.sortValues = function(order) {
+      sortValues = order;
+      return nest;
+    };
+    nest.rollup = function(f) {
+      rollup = f;
+      return nest;
+    };
+    return nest;
+  };
+  d3.set = function(array) {
+    var set = new d3_Set();
+    if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]);
+    return set;
+  };
+  function d3_Set() {
+    this._ = Object.create(null);
+  }
+  d3_class(d3_Set, {
+    has: d3_map_has,
+    add: function(key) {
+      this._[d3_map_escape(key += "")] = true;
+      return key;
+    },
+    remove: d3_map_remove,
+    values: d3_map_keys,
+    size: d3_map_size,
+    empty: d3_map_empty,
+    forEach: function(f) {
+      for (var key in this._) f.call(this, d3_map_unescape(key));
+    }
+  });
+  d3.behavior = {};
+  function d3_identity(d) {
+    return d;
+  }
+  d3.rebind = function(target, source) {
+    var i = 1, n = arguments.length, method;
+    while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);
+    return target;
+  };
+  function d3_rebind(target, source, method) {
+    return function() {
+      var value = method.apply(source, arguments);
+      return value === source ? target : value;
+    };
+  }
+  function d3_vendorSymbol(object, name) {
+    if (name in object) return name;
+    name = name.charAt(0).toUpperCase() + name.slice(1);
+    for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) {
+      var prefixName = d3_vendorPrefixes[i] + name;
+      if (prefixName in object) return prefixName;
+    }
+  }
+  var d3_vendorPrefixes = [ "webkit", "ms", "moz", "Moz", "o", "O" ];
+  function d3_noop() {}
+  d3.dispatch = function() {
+    var dispatch = new d3_dispatch(), i = -1, n = arguments.length;
+    while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);
+    return dispatch;
+  };
+  function d3_dispatch() {}
+  d3_dispatch.prototype.on = function(type, listener) {
+    var i = type.indexOf("."), name = "";
+    if (i >= 0) {
+      name = type.slice(i + 1);
+      type = type.slice(0, i);
+    }
+    if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener);
+    if (arguments.length === 2) {
+      if (listener == null) for (type in this) {
+        if (this.hasOwnProperty(type)) this[type].on(name, null);
+      }
+      return this;
+    }
+  };
+  function d3_dispatch_event(dispatch) {
+    var listeners = [], listenerByName = new d3_Map();
+    function event() {
+      var z = listeners, i = -1, n = z.length, l;
+      while (++i < n) if (l = z[i].on) l.apply(this, arguments);
+      return dispatch;
+    }
+    event.on = function(name, listener) {
+      var l = listenerByName.get(name), i;
+      if (arguments.length < 2) return l && l.on;
+      if (l) {
+        l.on = null;
+        listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));
+        listenerByName.remove(name);
+      }
+      if (listener) listeners.push(listenerByName.set(name, {
+        on: listener
+      }));
+      return dispatch;
+    };
+    return event;
+  }
+  d3.event = null;
+  function d3_eventPreventDefault() {
+    d3.event.preventDefault();
+  }
+  function d3_eventSource() {
+    var e = d3.event, s;
+    while (s = e.sourceEvent) e = s;
+    return e;
+  }
+  function d3_eventDispatch(target) {
+    var dispatch = new d3_dispatch(), i = 0, n = arguments.length;
+    while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);
+    dispatch.of = function(thiz, argumentz) {
+      return function(e1) {
+        try {
+          var e0 = e1.sourceEvent = d3.event;
+          e1.target = target;
+          d3.event = e1;
+          dispatch[e1.type].apply(thiz, argumentz);
+        } finally {
+          d3.event = e0;
+        }
+      };
+    };
+    return dispatch;
+  }
+  d3.requote = function(s) {
+    return s.replace(d3_requote_re, "\\$&");
+  };
+  var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;
+  var d3_subclass = {}.__proto__ ? function(object, prototype) {
+    object.__proto__ = prototype;
+  } : function(object, prototype) {
+    for (var property in prototype) object[property] = prototype[property];
+  };
+  function d3_selection(groups) {
+    d3_subclass(groups, d3_selectionPrototype);
+    return groups;
+  }
+  var d3_select = function(s, n) {
+    return n.querySelector(s);
+  }, d3_selectAll = function(s, n) {
+    return n.querySelectorAll(s);
+  }, d3_selectMatches = function(n, s) {
+    var d3_selectMatcher = n.matches || n[d3_vendorSymbol(n, "matchesSelector")];
+    d3_selectMatches = function(n, s) {
+      return d3_selectMatcher.call(n, s);
+    };
+    return d3_selectMatches(n, s);
+  };
+  if (typeof Sizzle === "function") {
+    d3_select = function(s, n) {
+      return Sizzle(s, n)[0] || null;
+    };
+    d3_selectAll = Sizzle;
+    d3_selectMatches = Sizzle.matchesSelector;
+  }
+  d3.selection = function() {
+    return d3.select(d3_document.documentElement);
+  };
+  var d3_selectionPrototype = d3.selection.prototype = [];
+  d3_selectionPrototype.select = function(selector) {
+    var subgroups = [], subgroup, subnode, group, node;
+    selector = d3_selection_selector(selector);
+    for (var j = -1, m = this.length; ++j < m; ) {
+      subgroups.push(subgroup = []);
+      subgroup.parentNode = (group = this[j]).parentNode;
+      for (var i = -1, n = group.length; ++i < n; ) {
+        if (node = group[i]) {
+          subgroup.push(subnode = selector.call(node, node.__data__, i, j));
+          if (subnode && "__data__" in node) subnode.__data__ = node.__data__;
+        } else {
+          subgroup.push(null);
+        }
+      }
+    }
+    return d3_selection(subgroups);
+  };
+  function d3_selection_selector(selector) {
+    return typeof selector === "function" ? selector : function() {
+      return d3_select(selector, this);
+    };
+  }
+  d3_selectionPrototype.selectAll = function(selector) {
+    var subgroups = [], subgroup, node;
+    selector = d3_selection_selectorAll(selector);
+    for (var j = -1, m = this.length; ++j < m; ) {
+      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
+        if (node = group[i]) {
+          subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j)));
+          subgroup.parentNode = node;
+        }
+      }
+    }
+    return d3_selection(subgroups);
+  };
+  function d3_selection_selectorAll(selector) {
+    return typeof selector === "function" ? selector : function() {
+      return d3_selectAll(selector, this);
+    };
+  }
+  var d3_nsXhtml = "http://www.w3.org/1999/xhtml";
+  var d3_nsPrefix = {
+    svg: "http://www.w3.org/2000/svg",
+    xhtml: d3_nsXhtml,
+    xlink: "http://www.w3.org/1999/xlink",
+    xml: "http://www.w3.org/XML/1998/namespace",
+    xmlns: "http://www.w3.org/2000/xmlns/"
+  };
+  d3.ns = {
+    prefix: d3_nsPrefix,
+    qualify: function(name) {
+      var i = name.indexOf(":"), prefix = name;
+      if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
+      return d3_nsPrefix.hasOwnProperty(prefix) ? {
+        space: d3_nsPrefix[prefix],
+        local: name
+      } : name;
+    }
+  };
+  d3_selectionPrototype.attr = function(name, value) {
+    if (arguments.length < 2) {
+      if (typeof name === "string") {
+        var node = this.node();
+        name = d3.ns.qualify(name);
+        return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name);
+      }
+      for (value in name) this.each(d3_selection_attr(value, name[value]));
+      return this;
+    }
+    return this.each(d3_selection_attr(name, value));
+  };
+  function d3_selection_attr(name, value) {
+    name = d3.ns.qualify(name);
+    function attrNull() {
+      this.removeAttribute(name);
+    }
+    function attrNullNS() {
+      this.removeAttributeNS(name.space, name.local);
+    }
+    function attrConstant() {
+      this.setAttribute(name, value);
+    }
+    function attrConstantNS() {
+      this.setAttributeNS(name.space, name.local, value);
+    }
+    function attrFunction() {
+      var x = value.apply(this, arguments);
+      if (x == null) this.removeAttribute(name); else this.setAttribute(name, x);
+    }
+    function attrFunctionNS() {
+      var x = value.apply(this, arguments);
+      if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x);
+    }
+    return value == null ? name.local ? attrNullNS : attrNull : typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant;
+  }
+  function d3_collapse(s) {
+    return s.trim().replace(/\s+/g, " ");
+  }
+  d3_selectionPrototype.classed = function(name, value) {
+    if (arguments.length < 2) {
+      if (typeof name === "string") {
+        var node = this.node(), n = (name = d3_selection_classes(name)).length, i = -1;
+        if (value = node.classList) {
+          while (++i < n) if (!value.contains(name[i])) return false;
+        } else {
+          value = node.getAttribute("class");
+          while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;
+        }
+        return true;
+      }
+      for (value in name) this.each(d3_selection_classed(value, name[value]));
+      return this;
+    }
+    return this.each(d3_selection_classed(name, value));
+  };
+  function d3_selection_classedRe(name) {
+    return new RegExp("(?:^|\\s+)" + d3.requote(name) + "(?:\\s+|$)", "g");
+  }
+  function d3_selection_classes(name) {
+    return (name + "").trim().split(/^|\s+/);
+  }
+  function d3_selection_classed(name, value) {
+    name = d3_selection_classes(name).map(d3_selection_classedName);
+    var n = name.length;
+    function classedConstant() {
+      var i = -1;
+      while (++i < n) name[i](this, value);
+    }
+    function classedFunction() {
+      var i = -1, x = value.apply(this, arguments);
+      while (++i < n) name[i](this, x);
+    }
+    return typeof value === "function" ? classedFunction : classedConstant;
+  }
+  function d3_selection_classedName(name) {
+    var re = d3_selection_classedRe(name);
+    return function(node, value) {
+      if (c = node.classList) return value ? c.add(name) : c.remove(name);
+      var c = node.getAttribute("class") || "";
+      if (value) {
+        re.lastIndex = 0;
+        if (!re.test(c)) node.setAttribute("class", d3_collapse(c + " " + name));
+      } else {
+        node.setAttribute("class", d3_collapse(c.replace(re, " ")));
+      }
+    };
+  }
+  d3_selectionPrototype.style = function(name, value, priority) {
+    var n = arguments.length;
+    if (n < 3) {
+      if (typeof name !== "string") {
+        if (n < 2) value = "";
+        for (priority in name) this.each(d3_selection_style(priority, name[priority], value));
+        return this;
+      }
+      if (n < 2) {
+        var node = this.node();
+        return d3_window(node).getComputedStyle(node, null).getPropertyValue(name);
+      }
+      priority = "";
+    }
+    return this.each(d3_selection_style(name, value, priority));
+  };
+  function d3_selection_style(name, value, priority) {
+    function styleNull() {
+      this.style.removeProperty(name);
+    }
+    function styleConstant() {
+      this.style.setProperty(name, value, priority);
+    }
+    function styleFunction() {
+      var x = value.apply(this, arguments);
+      if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority);
+    }
+    return value == null ? styleNull : typeof value === "function" ? styleFunction : styleConstant;
+  }
+  d3_selectionPrototype.property = function(name, value) {
+    if (arguments.length < 2) {
+      if (typeof name === "string") return this.node()[name];
+      for (value in name) this.each(d3_selection_property(value, name[value]));
+      return this;
+    }
+    return this.each(d3_selection_property(name, value));
+  };
+  function d3_selection_property(name, value) {
+    function propertyNull() {
+      delete this[name];
+    }
+    function propertyConstant() {
+      this[name] = value;
+    }
+    function propertyFunction() {
+      var x = value.apply(this, arguments);
+      if (x == null) delete this[name]; else this[name] = x;
+    }
+    return value == null ? propertyNull : typeof value === "function" ? propertyFunction : propertyConstant;
+  }
+  d3_selectionPrototype.text = function(value) {
+    return arguments.length ? this.each(typeof value === "function" ? function() {
+      var v = value.apply(this, arguments);
+      this.textContent = v == null ? "" : v;
+    } : value == null ? function() {
+      this.textContent = "";
+    } : function() {
+      this.textContent = value;
+    }) : this.node().textContent;
+  };
+  d3_selectionPrototype.html = function(value) {
+    return arguments.length ? this.each(typeof value === "function" ? function() {
+      var v = value.apply(this, arguments);
+      this.innerHTML = v == null ? "" : v;
+    } : value == null ? function() {
+      this.innerHTML = "";
+    } : function() {
+      this.innerHTML = value;
+    }) : this.node().innerHTML;
+  };
+  d3_selectionPrototype.append = function(name) {
+    name = d3_selection_creator(name);
+    return this.select(function() {
+      return this.appendChild(name.apply(this, arguments));
+    });
+  };
+  function d3_selection_creator(name) {
+    function create() {
+      var document = this.ownerDocument, namespace = this.namespaceURI;
+      return namespace === d3_nsXhtml && document.documentElement.namespaceURI === d3_nsXhtml ? document.createElement(name) : document.createElementNS(namespace, name);
+    }
+    function createNS() {
+      return this.ownerDocument.createElementNS(name.space, name.local);
+    }
+    return typeof name === "function" ? name : (name = d3.ns.qualify(name)).local ? createNS : create;
+  }
+  d3_selectionPrototype.insert = function(name, before) {
+    name = d3_selection_creator(name);
+    before = d3_selection_selector(before);
+    return this.select(function() {
+      return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null);
+    });
+  };
+  d3_selectionPrototype.remove = function() {
+    return this.each(d3_selectionRemove);
+  };
+  function d3_selectionRemove() {
+    var parent = this.parentNode;
+    if (parent) parent.removeChild(this);
+  }
+  d3_selectionPrototype.data = function(value, key) {
+    var i = -1, n = this.length, group, node;
+    if (!arguments.length) {
+      value = new Array(n = (group = this[0]).length);
+      while (++i < n) {
+        if (node = group[i]) {
+          value[i] = node.__data__;
+        }
+      }
+      return value;
+    }
+    function bind(group, groupData) {
+      var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData;
+      if (key) {
+        var nodeByKeyValue = new d3_Map(), keyValues = new Array(n), keyValue;
+        for (i = -1; ++i < n; ) {
+          if (node = group[i]) {
+            if (nodeByKeyValue.has(keyValue = key.call(node, node.__data__, i))) {
+              exitNodes[i] = node;
+            } else {
+              nodeByKeyValue.set(keyValue, node);
+            }
+            keyValues[i] = keyValue;
+          }
+        }
+        for (i = -1; ++i < m; ) {
+          if (!(node = nodeByKeyValue.get(keyValue = key.call(groupData, nodeData = groupData[i], i)))) {
+            enterNodes[i] = d3_selection_dataNode(nodeData);
+          } else if (node !== true) {
+            updateNodes[i] = node;
+            node.__data__ = nodeData;
+          }
+          nodeByKeyValue.set(keyValue, true);
+        }
+        for (i = -1; ++i < n; ) {
+          if (i in keyValues && nodeByKeyValue.get(keyValues[i]) !== true) {
+            exitNodes[i] = group[i];
+          }
+        }
+      } else {
+        for (i = -1; ++i < n0; ) {
+          node = group[i];
+          nodeData = groupData[i];
+          if (node) {
+            node.__data__ = nodeData;
+            updateNodes[i] = node;
+          } else {
+            enterNodes[i] = d3_selection_dataNode(nodeData);
+          }
+        }
+        for (;i < m; ++i) {
+          enterNodes[i] = d3_selection_dataNode(groupData[i]);
+        }
+        for (;i < n; ++i) {
+          exitNodes[i] = group[i];
+        }
+      }
+      enterNodes.update = updateNodes;
+      enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode;
+      enter.push(enterNodes);
+      update.push(updateNodes);
+      exit.push(exitNodes);
+    }
+    var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]);
+    if (typeof value === "function") {
+      while (++i < n) {
+        bind(group = this[i], value.call(group, group.parentNode.__data__, i));
+      }
+    } else {
+      while (++i < n) {
+        bind(group = this[i], value);
+      }
+    }
+    update.enter = function() {
+      return enter;
+    };
+    update.exit = function() {
+      return exit;
+    };
+    return update;
+  };
+  function d3_selection_dataNode(data) {
+    return {
+      __data__: data
+    };
+  }
+  d3_selectionPrototype.datum = function(value) {
+    return arguments.length ? this.property("__data__", value) : this.property("__data__");
+  };
+  d3_selectionPrototype.filter = function(filter) {
+    var subgroups = [], subgroup, group, node;
+    if (typeof filter !== "function") filter = d3_selection_filter(filter);
+    for (var j = 0, m = this.length; j < m; j++) {
+      subgroups.push(subgroup = []);
+      subgroup.parentNode = (group = this[j]).parentNode;
+      for (var i = 0, n = group.length; i < n; i++) {
+        if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {
+          subgroup.push(node);
+        }
+      }
+    }
+    return d3_selection(subgroups);
+  };
+  function d3_selection_filter(selector) {
+    return function() {
+      return d3_selectMatches(this, selector);
+    };
+  }
+  d3_selectionPrototype.order = function() {
+    for (var j = -1, m = this.length; ++j < m; ) {
+      for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) {
+        if (node = group[i]) {
+          if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);
+          next = node;
+        }
+      }
+    }
+    return this;
+  };
+  d3_selectionPrototype.sort = function(comparator) {
+    comparator = d3_selection_sortComparator.apply(this, arguments);
+    for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator);
+    return this.order();
+  };
+  function d3_selection_sortComparator(comparator) {
+    if (!arguments.length) comparator = d3_ascending;
+    return function(a, b) {
+      return a && b ? comparator(a.__data__, b.__data__) : !a - !b;
+    };
+  }
+  d3_selectionPrototype.each = function(callback) {
+    return d3_selection_each(this, function(node, i, j) {
+      callback.call(node, node.__data__, i, j);
+    });
+  };
+  function d3_selection_each(groups, callback) {
+    for (var j = 0, m = groups.length; j < m; j++) {
+      for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) {
+        if (node = group[i]) callback(node, i, j);
+      }
+    }
+    return groups;
+  }
+  d3_selectionPrototype.call = function(callback) {
+    var args = d3_array(arguments);
+    callback.apply(args[0] = this, args);
+    return this;
+  };
+  d3_selectionPrototype.empty = function() {
+    return !this.node();
+  };
+  d3_selectionPrototype.node = function() {
+    for (var j = 0, m = this.length; j < m; j++) {
+      for (var group = this[j], i = 0, n = group.length; i < n; i++) {
+        var node = group[i];
+        if (node) return node;
+      }
+    }
+    return null;
+  };
+  d3_selectionPrototype.size = function() {
+    var n = 0;
+    d3_selection_each(this, function() {
+      ++n;
+    });
+    return n;
+  };
+  function d3_selection_enter(selection) {
+    d3_subclass(selection, d3_selection_enterPrototype);
+    return selection;
+  }
+  var d3_selection_enterPrototype = [];
+  d3.selection.enter = d3_selection_enter;
+  d3.selection.enter.prototype = d3_selection_enterPrototype;
+  d3_selection_enterPrototype.append = d3_selectionPrototype.append;
+  d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;
+  d3_selection_enterPrototype.node = d3_selectionPrototype.node;
+  d3_selection_enterPrototype.call = d3_selectionPrototype.call;
+  d3_selection_enterPrototype.size = d3_selectionPrototype.size;
+  d3_selection_enterPrototype.select = function(selector) {
+    var subgroups = [], subgroup, subnode, upgroup, group, node;
+    for (var j = -1, m = this.length; ++j < m; ) {
+      upgroup = (group = this[j]).update;
+      subgroups.push(subgroup = []);
+      subgroup.parentNode = group.parentNode;
+      for (var i = -1, n = group.length; ++i < n; ) {
+        if (node = group[i]) {
+          subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j));
+          subnode.__data__ = node.__data__;
+        } else {
+          subgroup.push(null);
+        }
+      }
+    }
+    return d3_selection(subgroups);
+  };
+  d3_selection_enterPrototype.insert = function(name, before) {
+    if (arguments.length < 2) before = d3_selection_enterInsertBefore(this);
+    return d3_selectionPrototype.insert.call(this, name, before);
+  };
+  function d3_selection_enterInsertBefore(enter) {
+    var i0, j0;
+    return function(d, i, j) {
+      var group = enter[j].update, n = group.length, node;
+      if (j != j0) j0 = j, i0 = 0;
+      if (i >= i0) i0 = i + 1;
+      while (!(node = group[i0]) && ++i0 < n) ;
+      return node;
+    };
+  }
+  d3.select = function(node) {
+    var group;
+    if (typeof node === "string") {
+      group = [ d3_select(node, d3_document) ];
+      group.parentNode = d3_document.documentElement;
+    } else {
+      group = [ node ];
+      group.parentNode = d3_documentElement(node);
+    }
+    return d3_selection([ group ]);
+  };
+  d3.selectAll = function(nodes) {
+    var group;
+    if (typeof nodes === "string") {
+      group = d3_array(d3_selectAll(nodes, d3_document));
+      group.parentNode = d3_document.documentElement;
+    } else {
+      group = d3_array(nodes);
+      group.parentNode = null;
+    }
+    return d3_selection([ group ]);
+  };
+  d3_selectionPrototype.on = function(type, listener, capture) {
+    var n = arguments.length;
+    if (n < 3) {
+      if (typeof type !== "string") {
+        if (n < 2) listener = false;
+        for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));
+        return this;
+      }
+      if (n < 2) return (n = this.node()["__on" + type]) && n._;
+      capture = false;
+    }
+    return this.each(d3_selection_on(type, listener, capture));
+  };
+  function d3_selection_on(type, listener, capture) {
+    var name = "__on" + type, i = type.indexOf("."), wrap = d3_selection_onListener;
+    if (i > 0) type = type.slice(0, i);
+    var filter = d3_selection_onFilters.get(type);
+    if (filter) type = filter, wrap = d3_selection_onFilter;
+    function onRemove() {
+      var l = this[name];
+      if (l) {
+        this.removeEventListener(type, l, l.$);
+        delete this[name];
+      }
+    }
+    function onAdd() {
+      var l = wrap(listener, d3_array(arguments));
+      onRemove.call(this);
+      this.addEventListener(type, this[name] = l, l.$ = capture);
+      l._ = listener;
+    }
+    function removeAll() {
+      var re = new RegExp("^__on([^.]+)" + d3.requote(type) + "$"), match;
+      for (var name in this) {
+        if (match = name.match(re)) {
+          var l = this[name];
+          this.removeEventListener(match[1], l, l.$);
+          delete this[name];
+        }
+      }
+    }
+    return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll;
+  }
+  var d3_selection_onFilters = d3.map({
+    mouseenter: "mouseover",
+    mouseleave: "mouseout"
+  });
+  if (d3_document) {
+    d3_selection_onFilters.forEach(function(k) {
+      if ("on" + k in d3_document) d3_selection_onFilters.remove(k);
+    });
+  }
+  function d3_selection_onListener(listener, argumentz) {
+    return function(e) {
+      var o = d3.event;
+      d3.event = e;
+      argumentz[0] = this.__data__;
+      try {
+        listener.apply(this, argumentz);
+      } finally {
+        d3.event = o;
+      }
+    };
+  }
+  function d3_selection_onFilter(listener, argumentz) {
+    var l = d3_selection_onListener(listener, argumentz);
+    return function(e) {
+      var target = this, related = e.relatedTarget;
+      if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) {
+        l.call(target, e);
+      }
+    };
+  }
+  var d3_event_dragSelect, d3_event_dragId = 0;
+  function d3_event_dragSuppress(node) {
+    var name = ".dragsuppress-" + ++d3_event_dragId, click = "click" + name, w = d3.select(d3_window(node)).on("touchmove" + name, d3_eventPreventDefault).on("dragstart" + name, d3_eventPreventDefault).on("selectstart" + name, d3_eventPreventDefault);
+    if (d3_event_dragSelect == null) {
+      d3_event_dragSelect = "onselectstart" in node ? false : d3_vendorSymbol(node.style, "userSelect");
+    }
+    if (d3_event_dragSelect) {
+      var style = d3_documentElement(node).style, select = style[d3_event_dragSelect];
+      style[d3_event_dragSelect] = "none";
+    }
+    return function(suppressClick) {
+      w.on(name, null);
+      if (d3_event_dragSelect) style[d3_event_dragSelect] = select;
+      if (suppressClick) {
+        var off = function() {
+          w.on(click, null);
+        };
+        w.on(click, function() {
+          d3_eventPreventDefault();
+          off();
+        }, true);
+        setTimeout(off, 0);
+      }
+    };
+  }
+  d3.mouse = function(container) {
+    return d3_mousePoint(container, d3_eventSource());
+  };
+  var d3_mouse_bug44083 = this.navigator && /WebKit/.test(this.navigator.userAgent) ? -1 : 0;
+  function d3_mousePoint(container, e) {
+    if (e.changedTouches) e = e.changedTouches[0];
+    var svg = container.ownerSVGElement || container;
+    if (svg.createSVGPoint) {
+      var point = svg.createSVGPoint();
+      if (d3_mouse_bug44083 < 0) {
+        var window = d3_window(container);
+        if (window.scrollX || window.scrollY) {
+          svg = d3.select("body").append("svg").style({
+            position: "absolute",
+            top: 0,
+            left: 0,
+            margin: 0,
+            padding: 0,
+            border: "none"
+          }, "important");
+          var ctm = svg[0][0].getScreenCTM();
+          d3_mouse_bug44083 = !(ctm.f || ctm.e);
+          svg.remove();
+        }
+      }
+      if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX, 
+      point.y = e.clientY;
+      point = point.matrixTransform(container.getScreenCTM().inverse());
+      return [ point.x, point.y ];
+    }
+    var rect = container.getBoundingClientRect();
+    return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ];
+  }
+  d3.touch = function(container, touches, identifier) {
+    if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches;
+    if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) {
+      if ((touch = touches[i]).identifier === identifier) {
+        return d3_mousePoint(container, touch);
+      }
+    }
+  };
+  d3.behavior.drag = function() {
+    var event = d3_eventDispatch(drag, "drag", "dragstart", "dragend"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, d3_window, "mousemove", "mouseup"), touchstart = dragstart(d3_behavior_dragTouchId, d3.touch, d3_identity, "touchmove", "touchend");
+    function drag() {
+      this.on("mousedown.drag", mousedown).on("touchstart.drag", touchstart);
+    }
+    function dragstart(id, position, subject, move, end) {
+      return function() {
+        var that = this, target = d3.event.target.correspondingElement || d3.event.target, parent = that.parentNode, dispatch = event.of(that, arguments), dragged = 0, dragId = id(), dragName = ".drag" + (dragId == null ? "" : "-" + dragId), dragOffset, dragSubject = d3.select(subject(target)).on(move + dragName, moved).on(end + dragName, ended), dragRestore = d3_event_dragSuppress(target), position0 = position(parent, dragId);
+        if (origin) {
+          dragOffset = origin.apply(that, arguments);
+          dragOffset = [ dragOffset.x - position0[0], dragOffset.y - position0[1] ];
+        } else {
+          dragOffset = [ 0, 0 ];
+        }
+        dispatch({
+          type: "dragstart"
+        });
+        function moved() {
+          var position1 = position(parent, dragId), dx, dy;
+          if (!position1) return;
+          dx = position1[0] - position0[0];
+          dy = position1[1] - position0[1];
+          dragged |= dx | dy;
+          position0 = position1;
+          dispatch({
+            type: "drag",
+            x: position1[0] + dragOffset[0],
+            y: position1[1] + dragOffset[1],
+            dx: dx,
+            dy: dy
+          });
+        }
+        function ended() {
+          if (!position(parent, dragId)) return;
+          dragSubject.on(move + dragName, null).on(end + dragName, null);
+          dragRestore(dragged);
+          dispatch({
+            type: "dragend"
+          });
+        }
+      };
+    }
+    drag.origin = function(x) {
+      if (!arguments.length) return origin;
+      origin = x;
+      return drag;
+    };
+    return d3.rebind(drag, event, "on");
+  };
+  function d3_behavior_dragTouchId() {
+    return d3.event.changedTouches[0].identifier;
+  }
+  d3.touches = function(container, touches) {
+    if (arguments.length < 2) touches = d3_eventSource().touches;
+    return touches ? d3_array(touches).map(function(touch) {
+      var point = d3_mousePoint(container, touch);
+      point.identifier = touch.identifier;
+      return point;
+    }) : [];
+  };
+  var ε = 1e-6, ε2 = ε * ε, π = Math.PI, τ = 2 * π, τε = τ - ε, halfπ = π / 2, d3_radians = π / 180, d3_degrees = 180 / π;
+  function d3_sgn(x) {
+    return x > 0 ? 1 : x < 0 ? -1 : 0;
+  }
+  function d3_cross2d(a, b, c) {
+    return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
+  }
+  function d3_acos(x) {
+    return x > 1 ? 0 : x < -1 ? π : Math.acos(x);
+  }
+  function d3_asin(x) {
+    return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x);
+  }
+  function d3_sinh(x) {
+    return ((x = Math.exp(x)) - 1 / x) / 2;
+  }
+  function d3_cosh(x) {
+    return ((x = Math.exp(x)) + 1 / x) / 2;
+  }
+  function d3_tanh(x) {
+    return ((x = Math.exp(2 * x)) - 1) / (x + 1);
+  }
+  function d3_haversin(x) {
+    return (x = Math.sin(x / 2)) * x;
+  }
+  var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4;
+  d3.interpolateZoom = function(p0, p1) {
+    var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S;
+    if (d2 < ε2) {
+      S = Math.log(w1 / w0) / ρ;
+      i = function(t) {
+        return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * t * S) ];
+      };
+    } else {
+      var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
+      S = (r1 - r0) / ρ;
+      i = function(t) {
+        var s = t * S, coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0));
+        return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ];
+      };
+    }
+    i.duration = S * 1e3;
+    return i;
+  };
+  d3.behavior.zoom = function() {
+    var view = {
+      x: 0,
+      y: 0,
+      k: 1
+    }, translate0, center0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, duration = 250, zooming = 0, mousedown = "mousedown.zoom", mousemove = "mousemove.zoom", mouseup = "mouseup.zoom", mousewheelTimer, touchstart = "touchstart.zoom", touchtime, event = d3_eventDispatch(zoom, "zoomstart", "zoom", "zoomend"), x0, x1, y0, y1;
+    if (!d3_behavior_zoomWheel) {
+      d3_behavior_zoomWheel = "onwheel" in d3_document ? (d3_behavior_zoomDelta = function() {
+        return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1);
+      }, "wheel") : "onmousewheel" in d3_document ? (d3_behavior_zoomDelta = function() {
+        return d3.event.wheelDelta;
+      }, "mousewheel") : (d3_behavior_zoomDelta = function() {
+        return -d3.event.detail;
+      }, "MozMousePixelScroll");
+    }
+    function zoom(g) {
+      g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + ".zoom", mousewheeled).on("dblclick.zoom", dblclicked).on(touchstart, touchstarted);
+    }
+    zoom.event = function(g) {
+      g.each(function() {
+        var dispatch = event.of(this, arguments), view1 = view;
+        if (d3_transitionInheritId) {
+          d3.select(this).transition().each("start.zoom", function() {
+            view = this.__chart__ || {
+              x: 0,
+              y: 0,
+              k: 1
+            };
+            zoomstarted(dispatch);
+          }).tween("zoom:zoom", function() {
+            var dx = size[0], dy = size[1], cx = center0 ? center0[0] : dx / 2, cy = center0 ? center0[1] : dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]);
+            return function(t) {
+              var l = i(t), k = dx / l[2];
+              this.__chart__ = view = {
+                x: cx - l[0] * k,
+                y: cy - l[1] * k,
+                k: k
+              };
+              zoomed(dispatch);
+            };
+          }).each("interrupt.zoom", function() {
+            zoomended(dispatch);
+          }).each("end.zoom", function() {
+            zoomended(dispatch);
+          });
+        } else {
+          this.__chart__ = view;
+          zoomstarted(dispatch);
+          zoomed(dispatch);
+          zoomended(dispatch);
+        }
+      });
+    };
+    zoom.translate = function(_) {
+      if (!arguments.length) return [ view.x, view.y ];
+      view = {
+        x: +_[0],
+        y: +_[1],
+        k: view.k
+      };
+      rescale();
+      return zoom;
+    };
+    zoom.scale = function(_) {
+      if (!arguments.length) return view.k;
+      view = {
+        x: view.x,
+        y: view.y,
+        k: null
+      };
+      scaleTo(+_);
+      rescale();
+      return zoom;
+    };
+    zoom.scaleExtent = function(_) {
+      if (!arguments.length) return scaleExtent;
+      scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ];
+      return zoom;
+    };
+    zoom.center = function(_) {
+      if (!arguments.length) return center;
+      center = _ && [ +_[0], +_[1] ];
+      return zoom;
+    };
+    zoom.size = function(_) {
+      if (!arguments.length) return size;
+      size = _ && [ +_[0], +_[1] ];
+      return zoom;
+    };
+    zoom.duration = function(_) {
+      if (!arguments.length) return duration;
+      duration = +_;
+      return zoom;
+    };
+    zoom.x = function(z) {
+      if (!arguments.length) return x1;
+      x1 = z;
+      x0 = z.copy();
+      view = {
+        x: 0,
+        y: 0,
+        k: 1
+      };
+      return zoom;
+    };
+    zoom.y = function(z) {
+      if (!arguments.length) return y1;
+      y1 = z;
+      y0 = z.copy();
+      view = {
+        x: 0,
+        y: 0,
+        k: 1
+      };
+      return zoom;
+    };
+    function location(p) {
+      return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ];
+    }
+    function point(l) {
+      return [ l[0] * view.k + view.x, l[1] * view.k + view.y ];
+    }
+    function scaleTo(s) {
+      view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));
+    }
+    function translateTo(p, l) {
+      l = point(l);
+      view.x += p[0] - l[0];
+      view.y += p[1] - l[1];
+    }
+    function zoomTo(that, p, l, k) {
+      that.__chart__ = {
+        x: view.x,
+        y: view.y,
+        k: view.k
+      };
+      scaleTo(Math.pow(2, k));
+      translateTo(center0 = p, l);
+      that = d3.select(that);
+      if (duration > 0) that = that.transition().duration(duration);
+      that.call(zoom.event);
+    }
+    function rescale() {
+      if (x1) x1.domain(x0.range().map(function(x) {
+        return (x - view.x) / view.k;
+      }).map(x0.invert));
+      if (y1) y1.domain(y0.range().map(function(y) {
+        return (y - view.y) / view.k;
+      }).map(y0.invert));
+    }
+    function zoomstarted(dispatch) {
+      if (!zooming++) dispatch({
+        type: "zoomstart"
+      });
+    }
+    function zoomed(dispatch) {
+      rescale();
+      dispatch({
+        type: "zoom",
+        scale: view.k,
+        translate: [ view.x, view.y ]
+      });
+    }
+    function zoomended(dispatch) {
+      if (!--zooming) dispatch({
+        type: "zoomend"
+      }), center0 = null;
+    }
+    function mousedowned() {
+      var that = this, dispatch = event.of(that, arguments), dragged = 0, subject = d3.select(d3_window(that)).on(mousemove, moved).on(mouseup, ended), location0 = location(d3.mouse(that)), dragRestore = d3_event_dragSuppress(that);
+      d3_selection_interrupt.call(that);
+      zoomstarted(dispatch);
+      function moved() {
+        dragged = 1;
+        translateTo(d3.mouse(that), location0);
+        zoomed(dispatch);
+      }
+      function ended() {
+        subject.on(mousemove, null).on(mouseup, null);
+        dragRestore(dragged);
+        zoomended(dispatch);
+      }
+    }
+    function touchstarted() {
+      var that = this, dispatch = event.of(that, arguments), locations0 = {}, distance0 = 0, scale0, zoomName = ".zoom-" + d3.event.changedTouches[0].identifier, touchmove = "touchmove" + zoomName, touchend = "touchend" + zoomName, targets = [], subject = d3.select(that), dragRestore = d3_event_dragSuppress(that);
+      started();
+      zoomstarted(dispatch);
+      subject.on(mousedown, null).on(touchstart, started);
+      function relocate() {
+        var touches = d3.touches(that);
+        scale0 = view.k;
+        touches.forEach(function(t) {
+          if (t.identifier in locations0) locations0[t.identifier] = location(t);
+        });
+        return touches;
+      }
+      function started() {
+        var target = d3.event.target;
+        d3.select(target).on(touchmove, moved).on(touchend, ended);
+        targets.push(target);
+        var changed = d3.event.changedTouches;
+        for (var i = 0, n = changed.length; i < n; ++i) {
+          locations0[changed[i].identifier] = null;
+        }
+        var touches = relocate(), now = Date.now();
+        if (touches.length === 1) {
+          if (now - touchtime < 500) {
+            var p = touches[0];
+            zoomTo(that, p, locations0[p.identifier], Math.floor(Math.log(view.k) / Math.LN2) + 1);
+            d3_eventPreventDefault();
+          }
+          touchtime = now;
+        } else if (touches.length > 1) {
+          var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1];
+          distance0 = dx * dx + dy * dy;
+        }
+      }
+      function moved() {
+        var touches = d3.touches(that), p0, l0, p1, l1;
+        d3_selection_interrupt.call(that);
+        for (var i = 0, n = touches.length; i < n; ++i, l1 = null) {
+          p1 = touches[i];
+          if (l1 = locations0[p1.identifier]) {
+            if (l0) break;
+            p0 = p1, l0 = l1;
+          }
+        }
+        if (l1) {
+          var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0);
+          p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ];
+          l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ];
+          scaleTo(scale1 * scale0);
+        }
+        touchtime = null;
+        translateTo(p0, l0);
+        zoomed(dispatch);
+      }
+      function ended() {
+        if (d3.event.touches.length) {
+          var changed = d3.event.changedTouches;
+          for (var i = 0, n = changed.length; i < n; ++i) {
+            delete locations0[changed[i].identifier];
+          }
+          for (var identifier in locations0) {
+            return void relocate();
+          }
+        }
+        d3.selectAll(targets).on(zoomName, null);
+        subject.on(mousedown, mousedowned).on(touchstart, touchstarted);
+        dragRestore();
+        zoomended(dispatch);
+      }
+    }
+    function mousewheeled() {
+      var dispatch = event.of(this, arguments);
+      if (mousewheelTimer) clearTimeout(mousewheelTimer); else d3_selection_interrupt.call(this), 
+      translate0 = location(center0 = center || d3.mouse(this)), zoomstarted(dispatch);
+      mousewheelTimer = setTimeout(function() {
+        mousewheelTimer = null;
+        zoomended(dispatch);
+      }, 50);
+      d3_eventPreventDefault();
+      scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k);
+      translateTo(center0, translate0);
+      zoomed(dispatch);
+    }
+    function dblclicked() {
+      var p = d3.mouse(this), k = Math.log(view.k) / Math.LN2;
+      zoomTo(this, p, location(p), d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1);
+    }
+    return d3.rebind(zoom, event, "on");
+  };
+  var d3_behavior_zoomInfinity = [ 0, Infinity ], d3_behavior_zoomDelta, d3_behavior_zoomWheel;
+  d3.color = d3_color;
+  function d3_color() {}
+  d3_color.prototype.toString = function() {
+    return this.rgb() + "";
+  };
+  d3.hsl = d3_hsl;
+  function d3_hsl(h, s, l) {
+    return this instanceof d3_hsl ? void (this.h = +h, this.s = +s, this.l = +l) : arguments.length < 2 ? h instanceof d3_hsl ? new d3_hsl(h.h, h.s, h.l) : d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl) : new d3_hsl(h, s, l);
+  }
+  var d3_hslPrototype = d3_hsl.prototype = new d3_color();
+  d3_hslPrototype.brighter = function(k) {
+    k = Math.pow(.7, arguments.length ? k : 1);
+    return new d3_hsl(this.h, this.s, this.l / k);
+  };
+  d3_hslPrototype.darker = function(k) {
+    k = Math.pow(.7, arguments.length ? k : 1);
+    return new d3_hsl(this.h, this.s, k * this.l);
+  };
+  d3_hslPrototype.rgb = function() {
+    return d3_hsl_rgb(this.h, this.s, this.l);
+  };
+  function d3_hsl_rgb(h, s, l) {
+    var m1, m2;
+    h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h;
+    s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s;
+    l = l < 0 ? 0 : l > 1 ? 1 : l;
+    m2 = l <= .5 ? l * (1 + s) : l + s - l * s;
+    m1 = 2 * l - m2;
+    function v(h) {
+      if (h > 360) h -= 360; else if (h < 0) h += 360;
+      if (h < 60) return m1 + (m2 - m1) * h / 60;
+      if (h < 180) return m2;
+      if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;
+      return m1;
+    }
+    function vv(h) {
+      return Math.round(v(h) * 255);
+    }
+    return new d3_rgb(vv(h + 120), vv(h), vv(h - 120));
+  }
+  d3.hcl = d3_hcl;
+  function d3_hcl(h, c, l) {
+    return this instanceof d3_hcl ? void (this.h = +h, this.c = +c, this.l = +l) : arguments.length < 2 ? h instanceof d3_hcl ? new d3_hcl(h.h, h.c, h.l) : h instanceof d3_lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : new d3_hcl(h, c, l);
+  }
+  var d3_hclPrototype = d3_hcl.prototype = new d3_color();
+  d3_hclPrototype.brighter = function(k) {
+    return new d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));
+  };
+  d3_hclPrototype.darker = function(k) {
+    return new d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));
+  };
+  d3_hclPrototype.rgb = function() {
+    return d3_hcl_lab(this.h, this.c, this.l).rgb();
+  };
+  function d3_hcl_lab(h, c, l) {
+    if (isNaN(h)) h = 0;
+    if (isNaN(c)) c = 0;
+    return new d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);
+  }
+  d3.lab = d3_lab;
+  function d3_lab(l, a, b) {
+    return this instanceof d3_lab ? void (this.l = +l, this.a = +a, this.b = +b) : arguments.length < 2 ? l instanceof d3_lab ? new d3_lab(l.l, l.a, l.b) : l instanceof d3_hcl ? d3_hcl_lab(l.h, l.c, l.l) : d3_rgb_lab((l = d3_rgb(l)).r, l.g, l.b) : new d3_lab(l, a, b);
+  }
+  var d3_lab_K = 18;
+  var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883;
+  var d3_labPrototype = d3_lab.prototype = new d3_color();
+  d3_labPrototype.brighter = function(k) {
+    return new d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);
+  };
+  d3_labPrototype.darker = function(k) {
+    return new d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);
+  };
+  d3_labPrototype.rgb = function() {
+    return d3_lab_rgb(this.l, this.a, this.b);
+  };
+  function d3_lab_rgb(l, a, b) {
+    var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200;
+    x = d3_lab_xyz(x) * d3_lab_X;
+    y = d3_lab_xyz(y) * d3_lab_Y;
+    z = d3_lab_xyz(z) * d3_lab_Z;
+    return new d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z));
+  }
+  function d3_lab_hcl(l, a, b) {
+    return l > 0 ? new d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : new d3_hcl(NaN, NaN, l);
+  }
+  function d3_lab_xyz(x) {
+    return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037;
+  }
+  function d3_xyz_lab(x) {
+    return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;
+  }
+  function d3_xyz_rgb(r) {
+    return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055));
+  }
+  d3.rgb = d3_rgb;
+  function d3_rgb(r, g, b) {
+    return this instanceof d3_rgb ? void (this.r = ~~r, this.g = ~~g, this.b = ~~b) : arguments.length < 2 ? r instanceof d3_rgb ? new d3_rgb(r.r, r.g, r.b) : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb) : new d3_rgb(r, g, b);
+  }
+  function d3_rgbNumber(value) {
+    return new d3_rgb(value >> 16, value >> 8 & 255, value & 255);
+  }
+  function d3_rgbString(value) {
+    return d3_rgbNumber(value) + "";
+  }
+  var d3_rgbPrototype = d3_rgb.prototype = new d3_color();
+  d3_rgbPrototype.brighter = function(k) {
+    k = Math.pow(.7, arguments.length ? k : 1);
+    var r = this.r, g = this.g, b = this.b, i = 30;
+    if (!r && !g && !b) return new d3_rgb(i, i, i);
+    if (r && r < i) r = i;
+    if (g && g < i) g = i;
+    if (b && b < i) b = i;
+    return new d3_rgb(Math.min(255, r / k), Math.min(255, g / k), Math.min(255, b / k));
+  };
+  d3_rgbPrototype.darker = function(k) {
+    k = Math.pow(.7, arguments.length ? k : 1);
+    return new d3_rgb(k * this.r, k * this.g, k * this.b);
+  };
+  d3_rgbPrototype.hsl = function() {
+    return d3_rgb_hsl(this.r, this.g, this.b);
+  };
+  d3_rgbPrototype.toString = function() {
+    return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);
+  };
+  function d3_rgb_hex(v) {
+    return v < 16 ? "0" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16);
+  }
+  function d3_rgb_parse(format, rgb, hsl) {
+    var r = 0, g = 0, b = 0, m1, m2, color;
+    m1 = /([a-z]+)\((.*)\)/.exec(format = format.toLowerCase());
+    if (m1) {
+      m2 = m1[2].split(",");
+      switch (m1[1]) {
+       case "hsl":
+        {
+          return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100);
+        }
+
+       case "rgb":
+        {
+          return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2]));
+        }
+      }
+    }
+    if (color = d3_rgb_names.get(format)) {
+      return rgb(color.r, color.g, color.b);
+    }
+    if (format != null && format.charAt(0) === "#" && !isNaN(color = parseInt(format.slice(1), 16))) {
+      if (format.length === 4) {
+        r = (color & 3840) >> 4;
+        r = r >> 4 | r;
+        g = color & 240;
+        g = g >> 4 | g;
+        b = color & 15;
+        b = b << 4 | b;
+      } else if (format.length === 7) {
+        r = (color & 16711680) >> 16;
+        g = (color & 65280) >> 8;
+        b = color & 255;
+      }
+    }
+    return rgb(r, g, b);
+  }
+  function d3_rgb_hsl(r, g, b) {
+    var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2;
+    if (d) {
+      s = l < .5 ? d / (max + min) : d / (2 - max - min);
+      if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4;
+      h *= 60;
+    } else {
+      h = NaN;
+      s = l > 0 && l < 1 ? 0 : h;
+    }
+    return new d3_hsl(h, s, l);
+  }
+  function d3_rgb_lab(r, g, b) {
+    r = d3_rgb_xyz(r);
+    g = d3_rgb_xyz(g);
+    b = d3_rgb_xyz(b);
+    var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z);
+    return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));
+  }
+  function d3_rgb_xyz(r) {
+    return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4);
+  }
+  function d3_rgb_parseNumber(c) {
+    var f = parseFloat(c);
+    return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f;
+  }
+  var d3_rgb_names = d3.map({
+    aliceblue: 15792383,
+    antiquewhite: 16444375,
+    aqua: 65535,
+    aquamarine: 8388564,
+    azure: 15794175,
+    beige: 16119260,
+    bisque: 16770244,
+    black: 0,
+    blanchedalmond: 16772045,
+    blue: 255,
+    blueviolet: 9055202,
+    brown: 10824234,
+    burlywood: 14596231,
+    cadetblue: 6266528,
+    chartreuse: 8388352,
+    chocolate: 13789470,
+    coral: 16744272,
+    cornflowerblue: 6591981,
+    cornsilk: 16775388,
+    crimson: 14423100,
+    cyan: 65535,
+    darkblue: 139,
+    darkcyan: 35723,
+    darkgoldenrod: 12092939,
+    darkgray: 11119017,
+    darkgreen: 25600,
+    darkgrey: 11119017,
+    darkkhaki: 12433259,
+    darkmagenta: 9109643,
+    darkolivegreen: 5597999,
+    darkorange: 16747520,
+    darkorchid: 10040012,
+    darkred: 9109504,
+    darksalmon: 15308410,
+    darkseagreen: 9419919,
+    darkslateblue: 4734347,
+    darkslategray: 3100495,
+    darkslategrey: 3100495,
+    darkturquoise: 52945,
+    darkviolet: 9699539,
+    deeppink: 16716947,
+    deepskyblue: 49151,
+    dimgray: 6908265,
+    dimgrey: 6908265,
+    dodgerblue: 2003199,
+    firebrick: 11674146,
+    floralwhite: 16775920,
+    forestgreen: 2263842,
+    fuchsia: 16711935,
+    gainsboro: 14474460,
+    ghostwhite: 16316671,
+    gold: 16766720,
+    goldenrod: 14329120,
+    gray: 8421504,
+    green: 32768,
+    greenyellow: 11403055,
+    grey: 8421504,
+    honeydew: 15794160,
+    hotpink: 16738740,
+    indianred: 13458524,
+    indigo: 4915330,
+    ivory: 16777200,
+    khaki: 15787660,
+    lavender: 15132410,
+    lavenderblush: 16773365,
+    lawngreen: 8190976,
+    lemonchiffon: 16775885,
+    lightblue: 11393254,
+    lightcoral: 15761536,
+    lightcyan: 14745599,
+    lightgoldenrodyellow: 16448210,
+    lightgray: 13882323,
+    lightgreen: 9498256,
+    lightgrey: 13882323,
+    lightpink: 16758465,
+    lightsalmon: 16752762,
+    lightseagreen: 2142890,
+    lightskyblue: 8900346,
+    lightslategray: 7833753,
+    lightslategrey: 7833753,
+    lightsteelblue: 11584734,
+    lightyellow: 16777184,
+    lime: 65280,
+    limegreen: 3329330,
+    linen: 16445670,
+    magenta: 16711935,
+    maroon: 8388608,
+    mediumaquamarine: 6737322,
+    mediumblue: 205,
+    mediumorchid: 12211667,
+    mediumpurple: 9662683,
+    mediumseagreen: 3978097,
+    mediumslateblue: 8087790,
+    mediumspringgreen: 64154,
+    mediumturquoise: 4772300,
+    mediumvioletred: 13047173,
+    midnightblue: 1644912,
+    mintcream: 16121850,
+    mistyrose: 16770273,
+    moccasin: 16770229,
+    navajowhite: 16768685,
+    navy: 128,
+    oldlace: 16643558,
+    olive: 8421376,
+    olivedrab: 7048739,
+    orange: 16753920,
+    orangered: 16729344,
+    orchid: 14315734,
+    palegoldenrod: 15657130,
+    palegreen: 10025880,
+    paleturquoise: 11529966,
+    palevioletred: 14381203,
+    papayawhip: 16773077,
+    peachpuff: 16767673,
+    peru: 13468991,
+    pink: 16761035,
+    plum: 14524637,
+    powderblue: 11591910,
+    purple: 8388736,
+    rebeccapurple: 6697881,
+    red: 16711680,
+    rosybrown: 12357519,
+    royalblue: 4286945,
+    saddlebrown: 9127187,
+    salmon: 16416882,
+    sandybrown: 16032864,
+    seagreen: 3050327,
+    seashell: 16774638,
+    sienna: 10506797,
+    silver: 12632256,
+    skyblue: 8900331,
+    slateblue: 6970061,
+    slategray: 7372944,
+    slategrey: 7372944,
+    snow: 16775930,
+    springgreen: 65407,
+    steelblue: 4620980,
+    tan: 13808780,
+    teal: 32896,
+    thistle: 14204888,
+    tomato: 16737095,
+    turquoise: 4251856,
+    violet: 15631086,
+    wheat: 16113331,
+    white: 16777215,
+    whitesmoke: 16119285,
+    yellow: 16776960,
+    yellowgreen: 10145074
+  });
+  d3_rgb_names.forEach(function(key, value) {
+    d3_rgb_names.set(key, d3_rgbNumber(value));
+  });
+  function d3_functor(v) {
+    return typeof v === "function" ? v : function() {
+      return v;
+    };
+  }
+  d3.functor = d3_functor;
+  d3.xhr = d3_xhrType(d3_identity);
+  function d3_xhrType(response) {
+    return function(url, mimeType, callback) {
+      if (arguments.length === 2 && typeof mimeType === "function") callback = mimeType, 
+      mimeType = null;
+      return d3_xhr(url, mimeType, response, callback);
+    };
+  }
+  function d3_xhr(url, mimeType, response, callback) {
+    var xhr = {}, dispatch = d3.dispatch("beforesend", "progress", "load", "error"), headers = {}, request = new XMLHttpRequest(), responseType = null;
+    if (this.XDomainRequest && !("withCredentials" in request) && /^(http(s)?:)?\/\//.test(url)) request = new XDomainRequest();
+    "onload" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() {
+      request.readyState > 3 && respond();
+    };
+    function respond() {
+      var status = request.status, result;
+      if (!status && d3_xhrHasResponse(request) || status >= 200 && status < 300 || status === 304) {
+        try {
+          result = response.call(xhr, request);
+        } catch (e) {
+          dispatch.error.call(xhr, e);
+          return;
+        }
+        dispatch.load.call(xhr, result);
+      } else {
+        dispatch.error.call(xhr, request);
+      }
+    }
+    request.onprogress = function(event) {
+      var o = d3.event;
+      d3.event = event;
+      try {
+        dispatch.progress.call(xhr, request);
+      } finally {
+        d3.event = o;
+      }
+    };
+    xhr.header = function(name, value) {
+      name = (name + "").toLowerCase();
+      if (arguments.length < 2) return headers[name];
+      if (value == null) delete headers[name]; else headers[name] = value + "";
+      return xhr;
+    };
+    xhr.mimeType = function(value) {
+      if (!arguments.length) return mimeType;
+      mimeType = value == null ? null : value + "";
+      return xhr;
+    };
+    xhr.responseType = function(value) {
+      if (!arguments.length) return responseType;
+      responseType = value;
+      return xhr;
+    };
+    xhr.response = function(value) {
+      response = value;
+      return xhr;
+    };
+    [ "get", "post" ].forEach(function(method) {
+      xhr[method] = function() {
+        return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments)));
+      };
+    });
+    xhr.send = function(method, data, callback) {
+      if (arguments.length === 2 && typeof data === "function") callback = data, data = null;
+      request.open(method, url, true);
+      if (mimeType != null && !("accept" in headers)) headers["accept"] = mimeType + ",*/*";
+      if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);
+      if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);
+      if (responseType != null) request.responseType = responseType;
+      if (callback != null) xhr.on("error", callback).on("load", function(request) {
+        callback(null, request);
+      });
+      dispatch.beforesend.call(xhr, request);
+      request.send(data == null ? null : data);
+      return xhr;
+    };
+    xhr.abort = function() {
+      request.abort();
+      return xhr;
+    };
+    d3.rebind(xhr, dispatch, "on");
+    return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));
+  }
+  function d3_xhr_fixCallback(callback) {
+    return callback.length === 1 ? function(error, request) {
+      callback(error == null ? request : null);
+    } : callback;
+  }
+  function d3_xhrHasResponse(request) {
+    var type = request.responseType;
+    return type && type !== "text" ? request.response : request.responseText;
+  }
+  d3.dsv = function(delimiter, mimeType) {
+    var reFormat = new RegExp('["' + delimiter + "\n]"), delimiterCode = delimiter.charCodeAt(0);
+    function dsv(url, row, callback) {
+      if (arguments.length < 3) callback = row, row = null;
+      var xhr = d3_xhr(url, mimeType, row == null ? response : typedResponse(row), callback);
+      xhr.row = function(_) {
+        return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row;
+      };
+      return xhr;
+    }
+    function response(request) {
+      return dsv.parse(request.responseText);
+    }
+    function typedResponse(f) {
+      return function(request) {
+        return dsv.parse(request.responseText, f);
+      };
+    }
+    dsv.parse = function(text, f) {
+      var o;
+      return dsv.parseRows(text, function(row, i) {
+        if (o) return o(row, i - 1);
+        var a = new Function("d", "return {" + row.map(function(name, i) {
+          return JSON.stringify(name) + ": d[" + i + "]";
+        }).join(",") + "}");
+        o = f ? function(row, i) {
+          return f(a(row), i);
+        } : a;
+      });
+    };
+    dsv.parseRows = function(text, f) {
+      var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol;
+      function token() {
+        if (I >= N) return EOF;
+        if (eol) return eol = false, EOL;
+        var j = I;
+        if (text.charCodeAt(j) === 34) {
+          var i = j;
+          while (i++ < N) {
+            if (text.charCodeAt(i) === 34) {
+              if (text.charCodeAt(i + 1) !== 34) break;
+              ++i;
+            }
+          }
+          I = i + 2;
+          var c = text.charCodeAt(i + 1);
+          if (c === 13) {
+            eol = true;
+            if (text.charCodeAt(i + 2) === 10) ++I;
+          } else if (c === 10) {
+            eol = true;
+          }
+          return text.slice(j + 1, i).replace(/""/g, '"');
+        }
+        while (I < N) {
+          var c = text.charCodeAt(I++), k = 1;
+          if (c === 10) eol = true; else if (c === 13) {
+            eol = true;
+            if (text.charCodeAt(I) === 10) ++I, ++k;
+          } else if (c !== delimiterCode) continue;
+          return text.slice(j, I - k);
+        }
+        return text.slice(j);
+      }
+      while ((t = token()) !== EOF) {
+        var a = [];
+        while (t !== EOL && t !== EOF) {
+          a.push(t);
+          t = token();
+        }
+        if (f && (a = f(a, n++)) == null) continue;
+        rows.push(a);
+      }
+      return rows;
+    };
+    dsv.format = function(rows) {
+      if (Array.isArray(rows[0])) return dsv.formatRows(rows);
+      var fieldSet = new d3_Set(), fields = [];
+      rows.forEach(function(row) {
+        for (var field in row) {
+          if (!fieldSet.has(field)) {
+            fields.push(fieldSet.add(field));
+          }
+        }
+      });
+      return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) {
+        return fields.map(function(field) {
+          return formatValue(row[field]);
+        }).join(delimiter);
+      })).join("\n");
+    };
+    dsv.formatRows = function(rows) {
+      return rows.map(formatRow).join("\n");
+    };
+    function formatRow(row) {
+      return row.map(formatValue).join(delimiter);
+    }
+    function formatValue(text) {
+      return reFormat.test(text) ? '"' + text.replace(/\"/g, '""') + '"' : text;
+    }
+    return dsv;
+  };
+  d3.csv = d3.dsv(",", "text/csv");
+  d3.tsv = d3.dsv("	", "text/tab-separated-values");
+  var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_frame = this[d3_vendorSymbol(this, "requestAnimationFrame")] || function(callback) {
+    setTimeout(callback, 17);
+  };
+  d3.timer = function() {
+    d3_timer.apply(this, arguments);
+  };
+  function d3_timer(callback, delay, then) {
+    var n = arguments.length;
+    if (n < 2) delay = 0;
+    if (n < 3) then = Date.now();
+    var time = then + delay, timer = {
+      c: callback,
+      t: time,
+      n: null
+    };
+    if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer;
+    d3_timer_queueTail = timer;
+    if (!d3_timer_interval) {
+      d3_timer_timeout = clearTimeout(d3_timer_timeout);
+      d3_timer_interval = 1;
+      d3_timer_frame(d3_timer_step);
+    }
+    return timer;
+  }
+  function d3_timer_step() {
+    var now = d3_timer_mark(), delay = d3_timer_sweep() - now;
+    if (delay > 24) {
+      if (isFinite(delay)) {
+        clearTimeout(d3_timer_timeout);
+        d3_timer_timeout = setTimeout(d3_timer_step, delay);
+      }
+      d3_timer_interval = 0;
+    } else {
+      d3_timer_interval = 1;
+      d3_timer_frame(d3_timer_step);
+    }
+  }
+  d3.timer.flush = function() {
+    d3_timer_mark();
+    d3_timer_sweep();
+  };
+  function d3_timer_mark() {
+    var now = Date.now(), timer = d3_timer_queueHead;
+    while (timer) {
+      if (now >= timer.t && timer.c(now - timer.t)) timer.c = null;
+      timer = timer.n;
+    }
+    return now;
+  }
+  function d3_timer_sweep() {
+    var t0, t1 = d3_timer_queueHead, time = Infinity;
+    while (t1) {
+      if (t1.c) {
+        if (t1.t < time) time = t1.t;
+        t1 = (t0 = t1).n;
+      } else {
+        t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n;
+      }
+    }
+    d3_timer_queueTail = t0;
+    return time;
+  }
+  function d3_format_precision(x, p) {
+    return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);
+  }
+  d3.round = function(x, n) {
+    return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x);
+  };
+  var d3_formatPrefixes = [ "y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y" ].map(d3_formatPrefix);
+  d3.formatPrefix = function(value, precision) {
+    var i = 0;
+    if (value = +value) {
+      if (value < 0) value *= -1;
+      if (precision) value = d3.round(value, d3_format_precision(value, precision));
+      i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);
+      i = Math.max(-24, Math.min(24, Math.floor((i - 1) / 3) * 3));
+    }
+    return d3_formatPrefixes[8 + i / 3];
+  };
+  function d3_formatPrefix(d, i) {
+    var k = Math.pow(10, abs(8 - i) * 3);
+    return {
+      scale: i > 8 ? function(d) {
+        return d / k;
+      } : function(d) {
+        return d * k;
+      },
+      symbol: d
+    };
+  }
+  function d3_locale_numberFormat(locale) {
+    var locale_decimal = locale.decimal, locale_thousands = locale.thousands, locale_grouping = locale.grouping, locale_currency = locale.currency, formatGroup = locale_grouping && locale_thousands ? function(value, width) {
+      var i = value.length, t = [], j = 0, g = locale_grouping[0], length = 0;
+      while (i > 0 && g > 0) {
+        if (length + g + 1 > width) g = Math.max(1, width - length);
+        t.push(value.substring(i -= g, i + g));
+        if ((length += g + 1) > width) break;
+        g = locale_grouping[j = (j + 1) % locale_grouping.length];
+      }
+      return t.reverse().join(locale_thousands);
+    } : d3_identity;
+    return function(specifier) {
+      var match = d3_format_re.exec(specifier), fill = match[1] || " ", align = match[2] || ">", sign = match[3] || "-", symbol = match[4] || "", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, prefix = "", suffix = "", integer = false, exponent = true;
+      if (precision) precision = +precision.substring(1);
+      if (zfill || fill === "0" && align === "=") {
+        zfill = fill = "0";
+        align = "=";
+      }
+      switch (type) {
+       case "n":
+        comma = true;
+        type = "g";
+        break;
+
+       case "%":
+        scale = 100;
+        suffix = "%";
+        type = "f";
+        break;
+
+       case "p":
+        scale = 100;
+        suffix = "%";
+        type = "r";
+        break;
+
+       case "b":
+       case "o":
+       case "x":
+       case "X":
+        if (symbol === "#") prefix = "0" + type.toLowerCase();
+
+       case "c":
+        exponent = false;
+
+       case "d":
+        integer = true;
+        precision = 0;
+        break;
+
+       case "s":
+        scale = -1;
+        type = "r";
+        break;
+      }
+      if (symbol === "$") prefix = locale_currency[0], suffix = locale_currency[1];
+      if (type == "r" && !precision) type = "g";
+      if (precision != null) {
+        if (type == "g") precision = Math.max(1, Math.min(21, precision)); else if (type == "e" || type == "f") precision = Math.max(0, Math.min(20, precision));
+      }
+      type = d3_format_types.get(type) || d3_format_typeDefault;
+      var zcomma = zfill && comma;
+      return function(value) {
+        var fullSuffix = suffix;
+        if (integer && value % 1) return "";
+        var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, "-") : sign === "-" ? "" : sign;
+        if (scale < 0) {
+          var unit = d3.formatPrefix(value, precision);
+          value = unit.scale(value);
+          fullSuffix = unit.symbol + suffix;
+        } else {
+          value *= scale;
+        }
+        value = type(value, precision);
+        var i = value.lastIndexOf("."), before, after;
+        if (i < 0) {
+          var j = exponent ? value.lastIndexOf("e") : -1;
+          if (j < 0) before = value, after = ""; else before = value.substring(0, j), after = value.substring(j);
+        } else {
+          before = value.substring(0, i);
+          after = locale_decimal + value.substring(i + 1);
+        }
+        if (!zfill && comma) before = formatGroup(before, Infinity);
+        var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : "";
+        if (zcomma) before = formatGroup(padding + before, padding.length ? width - after.length : Infinity);
+        negative += prefix;
+        value = before + after;
+        return (align === "<" ? negative + value + padding : align === ">" ? padding + negative + value : align === "^" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + fullSuffix;
+      };
+    };
+  }
+  var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i;
+  var d3_format_types = d3.map({
+    b: function(x) {
+      return x.toString(2);
+    },
+    c: function(x) {
+      return String.fromCharCode(x);
+    },
+    o: function(x) {
+      return x.toString(8);
+    },
+    x: function(x) {
+      return x.toString(16);
+    },
+    X: function(x) {
+      return x.toString(16).toUpperCase();
+    },
+    g: function(x, p) {
+      return x.toPrecision(p);
+    },
+    e: function(x, p) {
+      return x.toExponential(p);
+    },
+    f: function(x, p) {
+      return x.toFixed(p);
+    },
+    r: function(x, p) {
+      return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p))));
+    }
+  });
+  function d3_format_typeDefault(x) {
+    return x + "";
+  }
+  var d3_time = d3.time = {}, d3_date = Date;
+  function d3_date_utc() {
+    this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]);
+  }
+  d3_date_utc.prototype = {
+    getDate: function() {
+      return this._.getUTCDate();
+    },
+    getDay: function() {
+      return this._.getUTCDay();
+    },
+    getFullYear: function() {
+      return this._.getUTCFullYear();
+    },
+    getHours: function() {
+      return this._.getUTCHours();
+    },
+    getMilliseconds: function() {
+      return this._.getUTCMilliseconds();
+    },
+    getMinutes: function() {
+      return this._.getUTCMinutes();
+    },
+    getMonth: function() {
+      return this._.getUTCMonth();
+    },
+    getSeconds: function() {
+      return this._.getUTCSeconds();
+    },
+    getTime: function() {
+      return this._.getTime();
+    },
+    getTimezoneOffset: function() {
+      return 0;
+    },
+    valueOf: function() {
+      return this._.valueOf();
+    },
+    setDate: function() {
+      d3_time_prototype.setUTCDate.apply(this._, arguments);
+    },
+    setDay: function() {
+      d3_time_prototype.setUTCDay.apply(this._, arguments);
+    },
+    setFullYear: function() {
+      d3_time_prototype.setUTCFullYear.apply(this._, arguments);
+    },
+    setHours: function() {
+      d3_time_prototype.setUTCHours.apply(this._, arguments);
+    },
+    setMilliseconds: function() {
+      d3_time_prototype.setUTCMilliseconds.apply(this._, arguments);
+    },
+    setMinutes: function() {
+      d3_time_prototype.setUTCMinutes.apply(this._, arguments);
+    },
+    setMonth: function() {
+      d3_time_prototype.setUTCMonth.apply(this._, arguments);
+    },
+    setSeconds: function() {
+      d3_time_prototype.setUTCSeconds.apply(this._, arguments);
+    },
+    setTime: function() {
+      d3_time_prototype.setTime.apply(this._, arguments);
+    }
+  };
+  var d3_time_prototype = Date.prototype;
+  function d3_time_interval(local, step, number) {
+    function round(date) {
+      var d0 = local(date), d1 = offset(d0, 1);
+      return date - d0 < d1 - date ? d0 : d1;
+    }
+    function ceil(date) {
+      step(date = local(new d3_date(date - 1)), 1);
+      return date;
+    }
+    function offset(date, k) {
+      step(date = new d3_date(+date), k);
+      return date;
+    }
+    function range(t0, t1, dt) {
+      var time = ceil(t0), times = [];
+      if (dt > 1) {
+        while (time < t1) {
+          if (!(number(time) % dt)) times.push(new Date(+time));
+          step(time, 1);
+        }
+      } else {
+        while (time < t1) times.push(new Date(+time)), step(time, 1);
+      }
+      return times;
+    }
+    function range_utc(t0, t1, dt) {
+      try {
+        d3_date = d3_date_utc;
+        var utc = new d3_date_utc();
+        utc._ = t0;
+        return range(utc, t1, dt);
+      } finally {
+        d3_date = Date;
+      }
+    }
+    local.floor = local;
+    local.round = round;
+    local.ceil = ceil;
+    local.offset = offset;
+    local.range = range;
+    var utc = local.utc = d3_time_interval_utc(local);
+    utc.floor = utc;
+    utc.round = d3_time_interval_utc(round);
+    utc.ceil = d3_time_interval_utc(ceil);
+    utc.offset = d3_time_interval_utc(offset);
+    utc.range = range_utc;
+    return local;
+  }
+  function d3_time_interval_utc(method) {
+    return function(date, k) {
+      try {
+        d3_date = d3_date_utc;
+        var utc = new d3_date_utc();
+        utc._ = date;
+        return method(utc, k)._;
+      } finally {
+        d3_date = Date;
+      }
+    };
+  }
+  d3_time.year = d3_time_interval(function(date) {
+    date = d3_time.day(date);
+    date.setMonth(0, 1);
+    return date;
+  }, function(date, offset) {
+    date.setFullYear(date.getFullYear() + offset);
+  }, function(date) {
+    return date.getFullYear();
+  });
+  d3_time.years = d3_time.year.range;
+  d3_time.years.utc = d3_time.year.utc.range;
+  d3_time.day = d3_time_interval(function(date) {
+    var day = new d3_date(2e3, 0);
+    day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());
+    return day;
+  }, function(date, offset) {
+    date.setDate(date.getDate() + offset);
+  }, function(date) {
+    return date.getDate() - 1;
+  });
+  d3_time.days = d3_time.day.range;
+  d3_time.days.utc = d3_time.day.utc.range;
+  d3_time.dayOfYear = function(date) {
+    var year = d3_time.year(date);
+    return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5);
+  };
+  [ "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" ].forEach(function(day, i) {
+    i = 7 - i;
+    var interval = d3_time[day] = d3_time_interval(function(date) {
+      (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7);
+      return date;
+    }, function(date, offset) {
+      date.setDate(date.getDate() + Math.floor(offset) * 7);
+    }, function(date) {
+      var day = d3_time.year(date).getDay();
+      return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i);
+    });
+    d3_time[day + "s"] = interval.range;
+    d3_time[day + "s"].utc = interval.utc.range;
+    d3_time[day + "OfYear"] = function(date) {
+      var day = d3_time.year(date).getDay();
+      return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7);
+    };
+  });
+  d3_time.week = d3_time.sunday;
+  d3_time.weeks = d3_time.sunday.range;
+  d3_time.weeks.utc = d3_time.sunday.utc.range;
+  d3_time.weekOfYear = d3_time.sundayOfYear;
+  function d3_locale_timeFormat(locale) {
+    var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_days = locale.days, locale_shortDays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths;
+    function d3_time_format(template) {
+      var n = template.length;
+      function format(date) {
+        var string = [], i = -1, j = 0, c, p, f;
+        while (++i < n) {
+          if (template.charCodeAt(i) === 37) {
+            string.push(template.slice(j, i));
+            if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);
+            if (f = d3_time_formats[c]) c = f(date, p == null ? c === "e" ? " " : "0" : p);
+            string.push(c);
+            j = i + 1;
+          }
+        }
+        string.push(template.slice(j, i));
+        return string.join("");
+      }
+      format.parse = function(string) {
+        var d = {
+          y: 1900,
+          m: 0,
+          d: 1,
+          H: 0,
+          M: 0,
+          S: 0,
+          L: 0,
+          Z: null
+        }, i = d3_time_parse(d, template, string, 0);
+        if (i != string.length) return null;
+        if ("p" in d) d.H = d.H % 12 + d.p * 12;
+        var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)();
+        if ("j" in d) date.setFullYear(d.y, 0, d.j); else if ("W" in d || "U" in d) {
+          if (!("w" in d)) d.w = "W" in d ? 1 : 0;
+          date.setFullYear(d.y, 0, 1);
+          date.setFullYear(d.y, 0, "W" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7);
+        } else date.setFullYear(d.y, d.m, d.d);
+        date.setHours(d.H + (d.Z / 100 | 0), d.M + d.Z % 100, d.S, d.L);
+        return localZ ? date._ : date;
+      };
+      format.toString = function() {
+        return template;
+      };
+      return format;
+    }
+    function d3_time_parse(date, template, string, j) {
+      var c, p, t, i = 0, n = template.length, m = string.length;
+      while (i < n) {
+        if (j >= m) return -1;
+        c = template.charCodeAt(i++);
+        if (c === 37) {
+          t = template.charAt(i++);
+          p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t];
+          if (!p || (j = p(date, string, j)) < 0) return -1;
+        } else if (c != string.charCodeAt(j++)) {
+          return -1;
+        }
+      }
+      return j;
+    }
+    d3_time_format.utc = function(template) {
+      var local = d3_time_format(template);
+      function format(date) {
+        try {
+          d3_date = d3_date_utc;
+          var utc = new d3_date();
+          utc._ = date;
+          return local(utc);
+        } finally {
+          d3_date = Date;
+        }
+      }
+      format.parse = function(string) {
+        try {
+          d3_date = d3_date_utc;
+          var date = local.parse(string);
+          return date && date._;
+        } finally {
+          d3_date = Date;
+        }
+      };
+      format.toString = local.toString;
+      return format;
+    };
+    d3_time_format.multi = d3_time_format.utc.multi = d3_time_formatMulti;
+    var d3_time_periodLookup = d3.map(), d3_time_dayRe = d3_time_formatRe(locale_days), d3_time_dayLookup = d3_time_formatLookup(locale_days), d3_time_dayAbbrevRe = d3_time_formatRe(locale_shortDays), d3_time_dayAbbrevLookup = d3_time_formatLookup(locale_shortDays), d3_time_monthRe = d3_time_formatRe(locale_months), d3_time_monthLookup = d3_time_formatLookup(locale_months), d3_time_monthAbbrevRe = d3_time_formatRe(locale_shortMonths), d3_time_monthAbbrevLookup = d3_time_formatLookup(locale_shortMonths);
+    locale_periods.forEach(function(p, i) {
+      d3_time_periodLookup.set(p.toLowerCase(), i);
+    });
+    var d3_time_formats = {
+      a: function(d) {
+        return locale_shortDays[d.getDay()];
+      },
+      A: function(d) {
+        return locale_days[d.getDay()];
+      },
+      b: function(d) {
+        return locale_shortMonths[d.getMonth()];
+      },
+      B: function(d) {
+        return locale_months[d.getMonth()];
+      },
+      c: d3_time_format(locale_dateTime),
+      d: function(d, p) {
+        return d3_time_formatPad(d.getDate(), p, 2);
+      },
+      e: function(d, p) {
+        return d3_time_formatPad(d.getDate(), p, 2);
+      },
+      H: function(d, p) {
+        return d3_time_formatPad(d.getHours(), p, 2);
+      },
+      I: function(d, p) {
+        return d3_time_formatPad(d.getHours() % 12 || 12, p, 2);
+      },
+      j: function(d, p) {
+        return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3);
+      },
+      L: function(d, p) {
+        return d3_time_formatPad(d.getMilliseconds(), p, 3);
+      },
+      m: function(d, p) {
+        return d3_time_formatPad(d.getMonth() + 1, p, 2);
+      },
+      M: function(d, p) {
+        return d3_time_formatPad(d.getMinutes(), p, 2);
+      },
+      p: function(d) {
+        return locale_periods[+(d.getHours() >= 12)];
+      },
+      S: function(d, p) {
+        return d3_time_formatPad(d.getSeconds(), p, 2);
+      },
+      U: function(d, p) {
+        return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2);
+      },
+      w: function(d) {
+        return d.getDay();
+      },
+      W: function(d, p) {
+        return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2);
+      },
+      x: d3_time_format(locale_date),
+      X: d3_time_format(locale_time),
+      y: function(d, p) {
+        return d3_time_formatPad(d.getFullYear() % 100, p, 2);
+      },
+      Y: function(d, p) {
+        return d3_time_formatPad(d.getFullYear() % 1e4, p, 4);
+      },
+      Z: d3_time_zone,
+      "%": function() {
+        return "%";
+      }
+    };
+    var d3_time_parsers = {
+      a: d3_time_parseWeekdayAbbrev,
+      A: d3_time_parseWeekday,
+      b: d3_time_parseMonthAbbrev,
+      B: d3_time_parseMonth,
+      c: d3_time_parseLocaleFull,
+      d: d3_time_parseDay,
+      e: d3_time_parseDay,
+      H: d3_time_parseHour24,
+      I: d3_time_parseHour24,
+      j: d3_time_parseDayOfYear,
+      L: d3_time_parseMilliseconds,
+      m: d3_time_parseMonthNumber,
+      M: d3_time_parseMinutes,
+      p: d3_time_parseAmPm,
+      S: d3_time_parseSeconds,
+      U: d3_time_parseWeekNumberSunday,
+      w: d3_time_parseWeekdayNumber,
+      W: d3_time_parseWeekNumberMonday,
+      x: d3_time_parseLocaleDate,
+      X: d3_time_parseLocaleTime,
+      y: d3_time_parseYear,
+      Y: d3_time_parseFullYear,
+      Z: d3_time_parseZone,
+      "%": d3_time_parseLiteralPercent
+    };
+    function d3_time_parseWeekdayAbbrev(date, string, i) {
+      d3_time_dayAbbrevRe.lastIndex = 0;
+      var n = d3_time_dayAbbrevRe.exec(string.slice(i));
+      return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
+    }
+    function d3_time_parseWeekday(date, string, i) {
+      d3_time_dayRe.lastIndex = 0;
+      var n = d3_time_dayRe.exec(string.slice(i));
+      return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
+    }
+    function d3_time_parseMonthAbbrev(date, string, i) {
+      d3_time_monthAbbrevRe.lastIndex = 0;
+      var n = d3_time_monthAbbrevRe.exec(string.slice(i));
+      return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
+    }
+    function d3_time_parseMonth(date, string, i) {
+      d3_time_monthRe.lastIndex = 0;
+      var n = d3_time_monthRe.exec(string.slice(i));
+      return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
+    }
+    function d3_time_parseLocaleFull(date, string, i) {
+      return d3_time_parse(date, d3_time_formats.c.toString(), string, i);
+    }
+    function d3_time_parseLocaleDate(date, string, i) {
+      return d3_time_parse(date, d3_time_formats.x.toString(), string, i);
+    }
+    function d3_time_parseLocaleTime(date, string, i) {
+      return d3_time_parse(date, d3_time_formats.X.toString(), string, i);
+    }
+    function d3_time_parseAmPm(date, string, i) {
+      var n = d3_time_periodLookup.get(string.slice(i, i += 2).toLowerCase());
+      return n == null ? -1 : (date.p = n, i);
+    }
+    return d3_time_format;
+  }
+  var d3_time_formatPads = {
+    "-": "",
+    _: " ",
+    "0": "0"
+  }, d3_time_numberRe = /^\s*\d+/, d3_time_percentRe = /^%/;
+  function d3_time_formatPad(value, fill, width) {
+    var sign = value < 0 ? "-" : "", string = (sign ? -value : value) + "", length = string.length;
+    return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
+  }
+  function d3_time_formatRe(names) {
+    return new RegExp("^(?:" + names.map(d3.requote).join("|") + ")", "i");
+  }
+  function d3_time_formatLookup(names) {
+    var map = new d3_Map(), i = -1, n = names.length;
+    while (++i < n) map.set(names[i].toLowerCase(), i);
+    return map;
+  }
+  function d3_time_parseWeekdayNumber(date, string, i) {
+    d3_time_numberRe.lastIndex = 0;
+    var n = d3_time_numberRe.exec(string.slice(i, i + 1));
+    return n ? (date.w = +n[0], i + n[0].length) : -1;
+  }
+  function d3_time_parseWeekNumberSunday(date, string, i) {
+    d3_time_numberRe.lastIndex = 0;
+    var n = d3_time_numberRe.exec(string.slice(i));
+    return n ? (date.U = +n[0], i + n[0].length) : -1;
+  }
+  function d3_time_parseWeekNumberMonday(date, string, i) {
+    d3_time_numberRe.lastIndex = 0;
+    var n = d3_time_numberRe.exec(string.slice(i));
+    return n ? (date.W = +n[0], i + n[0].length) : -1;
+  }
+  function d3_time_parseFullYear(date, string, i) {
+    d3_time_numberRe.lastIndex = 0;
+    var n = d3_time_numberRe.exec(string.slice(i, i + 4));
+    return n ? (date.y = +n[0], i + n[0].length) : -1;
+  }
+  function d3_time_parseYear(date, string, i) {
+    d3_time_numberRe.lastIndex = 0;
+    var n = d3_time_numberRe.exec(string.slice(i, i + 2));
+    return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1;
+  }
+  function d3_time_parseZone(date, string, i) {
+    return /^[+-]\d{4}$/.test(string = string.slice(i, i + 5)) ? (date.Z = -string, 
+    i + 5) : -1;
+  }
+  function d3_time_expandYear(d) {
+    return d + (d > 68 ? 1900 : 2e3);
+  }
+  function d3_time_parseMonthNumber(date, string, i) {
+    d3_time_numberRe.lastIndex = 0;
+    var n = d3_time_numberRe.exec(string.slice(i, i + 2));
+    return n ? (date.m = n[0] - 1, i + n[0].length) : -1;
+  }
+  function d3_time_parseDay(date, string, i) {
+    d3_time_numberRe.lastIndex = 0;
+    var n = d3_time_numberRe.exec(string.slice(i, i + 2));
+    return n ? (date.d = +n[0], i + n[0].length) : -1;
+  }
+  function d3_time_parseDayOfYear(date, string, i) {
+    d3_time_numberRe.lastIndex = 0;
+    var n = d3_time_numberRe.exec(string.slice(i, i + 3));
+    return n ? (date.j = +n[0], i + n[0].length) : -1;
+  }
+  function d3_time_parseHour24(date, string, i) {
+    d3_time_numberRe.lastIndex = 0;
+    var n = d3_time_numberRe.exec(string.slice(i, i + 2));
+    return n ? (date.H = +n[0], i + n[0].length) : -1;
+  }
+  function d3_time_parseMinutes(date, string, i) {
+    d3_time_numberRe.lastIndex = 0;
+    var n = d3_time_numberRe.exec(string.slice(i, i + 2));
+    return n ? (date.M = +n[0], i + n[0].length) : -1;
+  }
+  function d3_time_parseSeconds(date, string, i) {
+    d3_time_numberRe.lastIndex = 0;
+    var n = d3_time_numberRe.exec(string.slice(i, i + 2));
+    return n ? (date.S = +n[0], i + n[0].length) : -1;
+  }
+  function d3_time_parseMilliseconds(date, string, i) {
+    d3_time_numberRe.lastIndex = 0;
+    var n = d3_time_numberRe.exec(string.slice(i, i + 3));
+    return n ? (date.L = +n[0], i + n[0].length) : -1;
+  }
+  function d3_time_zone(d) {
+    var z = d.getTimezoneOffset(), zs = z > 0 ? "-" : "+", zh = abs(z) / 60 | 0, zm = abs(z) % 60;
+    return zs + d3_time_formatPad(zh, "0", 2) + d3_time_formatPad(zm, "0", 2);
+  }
+  function d3_time_parseLiteralPercent(date, string, i) {
+    d3_time_percentRe.lastIndex = 0;
+    var n = d3_time_percentRe.exec(string.slice(i, i + 1));
+    return n ? i + n[0].length : -1;
+  }
+  function d3_time_formatMulti(formats) {
+    var n = formats.length, i = -1;
+    while (++i < n) formats[i][0] = this(formats[i][0]);
+    return function(date) {
+      var i = 0, f = formats[i];
+      while (!f[1](date)) f = formats[++i];
+      return f[0](date);
+    };
+  }
+  d3.locale = function(locale) {
+    return {
+      numberFormat: d3_locale_numberFormat(locale),
+      timeFormat: d3_locale_timeFormat(locale)
+    };
+  };
+  var d3_locale_enUS = d3.locale({
+    decimal: ".",
+    thousands: ",",
+    grouping: [ 3 ],
+    currency: [ "$", "" ],
+    dateTime: "%a %b %e %X %Y",
+    date: "%m/%d/%Y",
+    time: "%H:%M:%S",
+    periods: [ "AM", "PM" ],
+    days: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ],
+    shortDays: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ],
+    months: [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ],
+    shortMonths: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ]
+  });
+  d3.format = d3_locale_enUS.numberFormat;
+  d3.geo = {};
+  function d3_adder() {}
+  d3_adder.prototype = {
+    s: 0,
+    t: 0,
+    add: function(y) {
+      d3_adderSum(y, this.t, d3_adderTemp);
+      d3_adderSum(d3_adderTemp.s, this.s, this);
+      if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t;
+    },
+    reset: function() {
+      this.s = this.t = 0;
+    },
+    valueOf: function() {
+      return this.s;
+    }
+  };
+  var d3_adderTemp = new d3_adder();
+  function d3_adderSum(a, b, o) {
+    var x = o.s = a + b, bv = x - a, av = x - bv;
+    o.t = a - av + (b - bv);
+  }
+  d3.geo.stream = function(object, listener) {
+    if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) {
+      d3_geo_streamObjectType[object.type](object, listener);
+    } else {
+      d3_geo_streamGeometry(object, listener);
+    }
+  };
+  function d3_geo_streamGeometry(geometry, listener) {
+    if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) {
+      d3_geo_streamGeometryType[geometry.type](geometry, listener);
+    }
+  }
+  var d3_geo_streamObjectType = {
+    Feature: function(feature, listener) {
+      d3_geo_streamGeometry(feature.geometry, listener);
+    },
+    FeatureCollection: function(object, listener) {
+      var features = object.features, i = -1, n = features.length;
+      while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener);
+    }
+  };
+  var d3_geo_streamGeometryType = {
+    Sphere: function(object, listener) {
+      listener.sphere();
+    },
+    Point: function(object, listener) {
+      object = object.coordinates;
+      listener.point(object[0], object[1], object[2]);
+    },
+    MultiPoint: function(object, listener) {
+      var coordinates = object.coordinates, i = -1, n = coordinates.length;
+      while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]);
+    },
+    LineString: function(object, listener) {
+      d3_geo_streamLine(object.coordinates, listener, 0);
+    },
+    MultiLineString: function(object, listener) {
+      var coordinates = object.coordinates, i = -1, n = coordinates.length;
+      while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0);
+    },
+    Polygon: function(object, listener) {
+      d3_geo_streamPolygon(object.coordinates, listener);
+    },
+    MultiPolygon: function(object, listener) {
+      var coordinates = object.coordinates, i = -1, n = coordinates.length;
+      while (++i < n) d3_geo_streamPolygon(coordinates[i], listener);
+    },
+    GeometryCollection: function(object, listener) {
+      var geometries = object.geometries, i = -1, n = geometries.length;
+      while (++i < n) d3_geo_streamGeometry(geometries[i], listener);
+    }
+  };
+  function d3_geo_streamLine(coordinates, listener, closed) {
+    var i = -1, n = coordinates.length - closed, coordinate;
+    listener.lineStart();
+    while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]);
+    listener.lineEnd();
+  }
+  function d3_geo_streamPolygon(coordinates, listener) {
+    var i = -1, n = coordinates.length;
+    listener.polygonStart();
+    while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1);
+    listener.polygonEnd();
+  }
+  d3.geo.area = function(object) {
+    d3_geo_areaSum = 0;
+    d3.geo.stream(object, d3_geo_area);
+    return d3_geo_areaSum;
+  };
+  var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder();
+  var d3_geo_area = {
+    sphere: function() {
+      d3_geo_areaSum += 4 * π;
+    },
+    point: d3_noop,
+    lineStart: d3_noop,
+    lineEnd: d3_noop,
+    polygonStart: function() {
+      d3_geo_areaRingSum.reset();
+      d3_geo_area.lineStart = d3_geo_areaRingStart;
+    },
+    polygonEnd: function() {
+      var area = 2 * d3_geo_areaRingSum;
+      d3_geo_areaSum += area < 0 ? 4 * π + area : area;
+      d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop;
+    }
+  };
+  function d3_geo_areaRingStart() {
+    var λ00, φ00, λ0, cosφ0, sinφ0;
+    d3_geo_area.point = function(λ, φ) {
+      d3_geo_area.point = nextPoint;
+      λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), 
+      sinφ0 = Math.sin(φ);
+    };
+    function nextPoint(λ, φ) {
+      λ *= d3_radians;
+      φ = φ * d3_radians / 2 + π / 4;
+      var dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(adλ), v = k * sdλ * Math.sin(adλ);
+      d3_geo_areaRingSum.add(Math.atan2(v, u));
+      λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ;
+    }
+    d3_geo_area.lineEnd = function() {
+      nextPoint(λ00, φ00);
+    };
+  }
+  function d3_geo_cartesian(spherical) {
+    var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ);
+    return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ];
+  }
+  function d3_geo_cartesianDot(a, b) {
+    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
+  }
+  function d3_geo_cartesianCross(a, b) {
+    return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ];
+  }
+  function d3_geo_cartesianAdd(a, b) {
+    a[0] += b[0];
+    a[1] += b[1];
+    a[2] += b[2];
+  }
+  function d3_geo_cartesianScale(vector, k) {
+    return [ vector[0] * k, vector[1] * k, vector[2] * k ];
+  }
+  function d3_geo_cartesianNormalize(d) {
+    var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
+    d[0] /= l;
+    d[1] /= l;
+    d[2] /= l;
+  }
+  function d3_geo_spherical(cartesian) {
+    return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ];
+  }
+  function d3_geo_sphericalEqual(a, b) {
+    return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε;
+  }
+  d3.geo.bounds = function() {
+    var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range;
+    var bound = {
+      point: point,
+      lineStart: lineStart,
+      lineEnd: lineEnd,
+      polygonStart: function() {
+        bound.point = ringPoint;
+        bound.lineStart = ringStart;
+        bound.lineEnd = ringEnd;
+        dλSum = 0;
+        d3_geo_area.polygonStart();
+      },
+      polygonEnd: function() {
+        d3_geo_area.polygonEnd();
+        bound.point = point;
+        bound.lineStart = lineStart;
+        bound.lineEnd = lineEnd;
+        if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90;
+        range[0] = λ0, range[1] = λ1;
+      }
+    };
+    function point(λ, φ) {
+      ranges.push(range = [ λ0 = λ, λ1 = λ ]);
+      if (φ < φ0) φ0 = φ;
+      if (φ > φ1) φ1 = φ;
+    }
+    function linePoint(λ, φ) {
+      var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]);
+      if (p0) {
+        var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal);
+        d3_geo_cartesianNormalize(inflection);
+        inflection = d3_geo_spherical(inflection);
+        var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180;
+        if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) {
+          var φi = inflection[1] * d3_degrees;
+          if (φi > φ1) φ1 = φi;
+        } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) {
+          var φi = -inflection[1] * d3_degrees;
+          if (φi < φ0) φ0 = φi;
+        } else {
+          if (φ < φ0) φ0 = φ;
+          if (φ > φ1) φ1 = φ;
+        }
+        if (antimeridian) {
+          if (λ < λ_) {
+            if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;
+          } else {
+            if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;
+          }
+        } else {
+          if (λ1 >= λ0) {
+            if (λ < λ0) λ0 = λ;
+            if (λ > λ1) λ1 = λ;
+          } else {
+            if (λ > λ_) {
+              if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;
+            } else {
+              if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;
+            }
+          }
+        }
+      } else {
+        point(λ, φ);
+      }
+      p0 = p, λ_ = λ;
+    }
+    function lineStart() {
+      bound.point = linePoint;
+    }
+    function lineEnd() {
+      range[0] = λ0, range[1] = λ1;
+      bound.point = point;
+      p0 = null;
+    }
+    function ringPoint(λ, φ) {
+      if (p0) {
+        var dλ = λ - λ_;
+        dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ;
+      } else λ__ = λ, φ__ = φ;
+      d3_geo_area.point(λ, φ);
+      linePoint(λ, φ);
+    }
+    function ringStart() {
+      d3_geo_area.lineStart();
+    }
+    function ringEnd() {
+      ringPoint(λ__, φ__);
+      d3_geo_area.lineEnd();
+      if (abs(dλSum) > ε) λ0 = -(λ1 = 180);
+      range[0] = λ0, range[1] = λ1;
+      p0 = null;
+    }
+    function angle(λ0, λ1) {
+      return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1;
+    }
+    function compareRanges(a, b) {
+      return a[0] - b[0];
+    }
+    function withinRange(x, range) {
+      return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
+    }
+    return function(feature) {
+      φ1 = λ1 = -(λ0 = φ0 = Infinity);
+      ranges = [];
+      d3.geo.stream(feature, bound);
+      var n = ranges.length;
+      if (n) {
+        ranges.sort(compareRanges);
+        for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) {
+          b = ranges[i];
+          if (withinRange(b[0], a) || withinRange(b[1], a)) {
+            if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
+            if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
+          } else {
+            merged.push(a = b);
+          }
+        }
+        var best = -Infinity, dλ;
+        for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {
+          b = merged[i];
+          if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1];
+        }
+      }
+      ranges = range = null;
+      return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ];
+    };
+  }();
+  d3.geo.centroid = function(object) {
+    d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;
+    d3.geo.stream(object, d3_geo_centroid);
+    var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z;
+    if (m < ε2) {
+      x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1;
+      if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0;
+      m = x * x + y * y + z * z;
+      if (m < ε2) return [ NaN, NaN ];
+    }
+    return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ];
+  };
+  var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2;
+  var d3_geo_centroid = {
+    sphere: d3_noop,
+    point: d3_geo_centroidPoint,
+    lineStart: d3_geo_centroidLineStart,
+    lineEnd: d3_geo_centroidLineEnd,
+    polygonStart: function() {
+      d3_geo_centroid.lineStart = d3_geo_centroidRingStart;
+    },
+    polygonEnd: function() {
+      d3_geo_centroid.lineStart = d3_geo_centroidLineStart;
+    }
+  };
+  function d3_geo_centroidPoint(λ, φ) {
+    λ *= d3_radians;
+    var cosφ = Math.cos(φ *= d3_radians);
+    d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ));
+  }
+  function d3_geo_centroidPointXYZ(x, y, z) {
+    ++d3_geo_centroidW0;
+    d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0;
+    d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0;
+    d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0;
+  }
+  function d3_geo_centroidLineStart() {
+    var x0, y0, z0;
+    d3_geo_centroid.point = function(λ, φ) {
+      λ *= d3_radians;
+      var cosφ = Math.cos(φ *= d3_radians);
+      x0 = cosφ * Math.cos(λ);
+      y0 = cosφ * Math.sin(λ);
+      z0 = Math.sin(φ);
+      d3_geo_centroid.point = nextPoint;
+      d3_geo_centroidPointXYZ(x0, y0, z0);
+    };
+    function nextPoint(λ, φ) {
+      λ *= d3_radians;
+      var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);
+      d3_geo_centroidW1 += w;
+      d3_geo_centroidX1 += w * (x0 + (x0 = x));
+      d3_geo_centroidY1 += w * (y0 + (y0 = y));
+      d3_geo_centroidZ1 += w * (z0 + (z0 = z));
+      d3_geo_centroidPointXYZ(x0, y0, z0);
+    }
+  }
+  function d3_geo_centroidLineEnd() {
+    d3_geo_centroid.point = d3_geo_centroidPoint;
+  }
+  function d3_geo_centroidRingStart() {
+    var λ00, φ00, x0, y0, z0;
+    d3_geo_centroid.point = function(λ, φ) {
+      λ00 = λ, φ00 = φ;
+      d3_geo_centroid.point = nextPoint;
+      λ *= d3_radians;
+      var cosφ = Math.cos(φ *= d3_radians);
+      x0 = cosφ * Math.cos(λ);
+      y0 = cosφ * Math.sin(λ);
+      z0 = Math.sin(φ);
+      d3_geo_centroidPointXYZ(x0, y0, z0);
+    };
+    d3_geo_centroid.lineEnd = function() {
+      nextPoint(λ00, φ00);
+      d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd;
+      d3_geo_centroid.point = d3_geo_centroidPoint;
+    };
+    function nextPoint(λ, φ) {
+      λ *= d3_radians;
+      var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u);
+      d3_geo_centroidX2 += v * cx;
+      d3_geo_centroidY2 += v * cy;
+      d3_geo_centroidZ2 += v * cz;
+      d3_geo_centroidW1 += w;
+      d3_geo_centroidX1 += w * (x0 + (x0 = x));
+      d3_geo_centroidY1 += w * (y0 + (y0 = y));
+      d3_geo_centroidZ1 += w * (z0 + (z0 = z));
+      d3_geo_centroidPointXYZ(x0, y0, z0);
+    }
+  }
+  function d3_geo_compose(a, b) {
+    function compose(x, y) {
+      return x = a(x, y), b(x[0], x[1]);
+    }
+    if (a.invert && b.invert) compose.invert = function(x, y) {
+      return x = b.invert(x, y), x && a.invert(x[0], x[1]);
+    };
+    return compose;
+  }
+  function d3_true() {
+    return true;
+  }
+  function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) {
+    var subject = [], clip = [];
+    segments.forEach(function(segment) {
+      if ((n = segment.length - 1) <= 0) return;
+      var n, p0 = segment[0], p1 = segment[n];
+      if (d3_geo_sphericalEqual(p0, p1)) {
+        listener.lineStart();
+        for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]);
+        listener.lineEnd();
+        return;
+      }
+      var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false);
+      a.o = b;
+      subject.push(a);
+      clip.push(b);
+      a = new d3_geo_clipPolygonIntersection(p1, segment, null, false);
+      b = new d3_geo_clipPolygonIntersection(p1, null, a, true);
+      a.o = b;
+      subject.push(a);
+      clip.push(b);
+    });
+    clip.sort(compare);
+    d3_geo_clipPolygonLinkCircular(subject);
+    d3_geo_clipPolygonLinkCircular(clip);
+    if (!subject.length) return;
+    for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) {
+      clip[i].e = entry = !entry;
+    }
+    var start = subject[0], points, point;
+    while (1) {
+      var current = start, isSubject = true;
+      while (current.v) if ((current = current.n) === start) return;
+      points = current.z;
+      listener.lineStart();
+      do {
+        current.v = current.o.v = true;
+        if (current.e) {
+          if (isSubject) {
+            for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]);
+          } else {
+            interpolate(current.x, current.n.x, 1, listener);
+          }
+          current = current.n;
+        } else {
+          if (isSubject) {
+            points = current.p.z;
+            for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]);
+          } else {
+            interpolate(current.x, current.p.x, -1, listener);
+          }
+          current = current.p;
+        }
+        current = current.o;
+        points = current.z;
+        isSubject = !isSubject;
+      } while (!current.v);
+      listener.lineEnd();
+    }
+  }
+  function d3_geo_clipPolygonLinkCircular(array) {
+    if (!(n = array.length)) return;
+    var n, i = 0, a = array[0], b;
+    while (++i < n) {
+      a.n = b = array[i];
+      b.p = a;
+      a = b;
+    }
+    a.n = b = array[0];
+    b.p = a;
+  }
+  function d3_geo_clipPolygonIntersection(point, points, other, entry) {
+    this.x = point;
+    this.z = points;
+    this.o = other;
+    this.e = entry;
+    this.v = false;
+    this.n = this.p = null;
+  }
+  function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) {
+    return function(rotate, listener) {
+      var line = clipLine(listener), rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]);
+      var clip = {
+        point: point,
+        lineStart: lineStart,
+        lineEnd: lineEnd,
+        polygonStart: function() {
+          clip.point = pointRing;
+          clip.lineStart = ringStart;
+          clip.lineEnd = ringEnd;
+          segments = [];
+          polygon = [];
+        },
+        polygonEnd: function() {
+          clip.point = point;
+          clip.lineStart = lineStart;
+          clip.lineEnd = lineEnd;
+          segments = d3.merge(segments);
+          var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon);
+          if (segments.length) {
+            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;
+            d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener);
+          } else if (clipStartInside) {
+            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;
+            listener.lineStart();
+            interpolate(null, null, 1, listener);
+            listener.lineEnd();
+          }
+          if (polygonStarted) listener.polygonEnd(), polygonStarted = false;
+          segments = polygon = null;
+        },
+        sphere: function() {
+          listener.polygonStart();
+          listener.lineStart();
+          interpolate(null, null, 1, listener);
+          listener.lineEnd();
+          listener.polygonEnd();
+        }
+      };
+      function point(λ, φ) {
+        var point = rotate(λ, φ);
+        if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ);
+      }
+      function pointLine(λ, φ) {
+        var point = rotate(λ, φ);
+        line.point(point[0], point[1]);
+      }
+      function lineStart() {
+        clip.point = pointLine;
+        line.lineStart();
+      }
+      function lineEnd() {
+        clip.point = point;
+        line.lineEnd();
+      }
+      var segments;
+      var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygonStarted = false, polygon, ring;
+      function pointRing(λ, φ) {
+        ring.push([ λ, φ ]);
+        var point = rotate(λ, φ);
+        ringListener.point(point[0], point[1]);
+      }
+      function ringStart() {
+        ringListener.lineStart();
+        ring = [];
+      }
+      function ringEnd() {
+        pointRing(ring[0][0], ring[0][1]);
+        ringListener.lineEnd();
+        var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length;
+        ring.pop();
+        polygon.push(ring);
+        ring = null;
+        if (!n) return;
+        if (clean & 1) {
+          segment = ringSegments[0];
+          var n = segment.length - 1, i = -1, point;
+          if (n > 0) {
+            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;
+            listener.lineStart();
+            while (++i < n) listener.point((point = segment[i])[0], point[1]);
+            listener.lineEnd();
+          }
+          return;
+        }
+        if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
+        segments.push(ringSegments.filter(d3_geo_clipSegmentLength1));
+      }
+      return clip;
+    };
+  }
+  function d3_geo_clipSegmentLength1(segment) {
+    return segment.length > 1;
+  }
+  function d3_geo_clipBufferListener() {
+    var lines = [], line;
+    return {
+      lineStart: function() {
+        lines.push(line = []);
+      },
+      point: function(λ, φ) {
+        line.push([ λ, φ ]);
+      },
+      lineEnd: d3_noop,
+      buffer: function() {
+        var buffer = lines;
+        lines = [];
+        line = null;
+        return buffer;
+      },
+      rejoin: function() {
+        if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
+      }
+    };
+  }
+  function d3_geo_clipSort(a, b) {
+    return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]);
+  }
+  var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, [ -π, -π / 2 ]);
+  function d3_geo_clipAntimeridianLine(listener) {
+    var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean;
+    return {
+      lineStart: function() {
+        listener.lineStart();
+        clean = 1;
+      },
+      point: function(λ1, φ1) {
+        var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0);
+        if (abs(dλ - π) < ε) {
+          listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ);
+          listener.point(sλ0, φ0);
+          listener.lineEnd();
+          listener.lineStart();
+          listener.point(sλ1, φ0);
+          listener.point(λ1, φ0);
+          clean = 0;
+        } else if (sλ0 !== sλ1 && dλ >= π) {
+          if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;
+          if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;
+          φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);
+          listener.point(sλ0, φ0);
+          listener.lineEnd();
+          listener.lineStart();
+          listener.point(sλ1, φ0);
+          clean = 0;
+        }
+        listener.point(λ0 = λ1, φ0 = φ1);
+        sλ0 = sλ1;
+      },
+      lineEnd: function() {
+        listener.lineEnd();
+        λ0 = φ0 = NaN;
+      },
+      clean: function() {
+        return 2 - clean;
+      }
+    };
+  }
+  function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {
+    var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1);
+    return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2;
+  }
+  function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {
+    var φ;
+    if (from == null) {
+      φ = direction * halfπ;
+      listener.point(-π, φ);
+      listener.point(0, φ);
+      listener.point(π, φ);
+      listener.point(π, 0);
+      listener.point(π, -φ);
+      listener.point(0, -φ);
+      listener.point(-π, -φ);
+      listener.point(-π, 0);
+      listener.point(-π, φ);
+    } else if (abs(from[0] - to[0]) > ε) {
+      var s = from[0] < to[0] ? π : -π;
+      φ = direction * s / 2;
+      listener.point(-s, φ);
+      listener.point(0, φ);
+      listener.point(s, φ);
+    } else {
+      listener.point(to[0], to[1]);
+    }
+  }
+  function d3_geo_pointInPolygon(point, polygon) {
+    var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0;
+    d3_geo_areaRingSum.reset();
+    for (var i = 0, n = polygon.length; i < n; ++i) {
+      var ring = polygon[i], m = ring.length;
+      if (!m) continue;
+      var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1;
+      while (true) {
+        if (j === m) j = 0;
+        point = ring[j];
+        var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, antimeridian = adλ > π, k = sinφ0 * sinφ;
+        d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ)));
+        polarAngle += antimeridian ? dλ + sdλ * τ : dλ;
+        if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) {
+          var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point));
+          d3_geo_cartesianNormalize(arc);
+          var intersection = d3_geo_cartesianCross(meridianNormal, arc);
+          d3_geo_cartesianNormalize(intersection);
+          var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]);
+          if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) {
+            winding += antimeridian ^ dλ >= 0 ? 1 : -1;
+          }
+        }
+        if (!j++) break;
+        λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point;
+      }
+    }
+    return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < -ε) ^ winding & 1;
+  }
+  function d3_geo_clipCircle(radius) {
+    var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians);
+    return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]);
+    function visible(λ, φ) {
+      return Math.cos(λ) * Math.cos(φ) > cr;
+    }
+    function clipLine(listener) {
+      var point0, c0, v0, v00, clean;
+      return {
+        lineStart: function() {
+          v00 = v0 = false;
+          clean = 1;
+        },
+        point: function(λ, φ) {
+          var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0;
+          if (!point0 && (v00 = v0 = v)) listener.lineStart();
+          if (v !== v0) {
+            point2 = intersect(point0, point1);
+            if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) {
+              point1[0] += ε;
+              point1[1] += ε;
+              v = visible(point1[0], point1[1]);
+            }
+          }
+          if (v !== v0) {
+            clean = 0;
+            if (v) {
+              listener.lineStart();
+              point2 = intersect(point1, point0);
+              listener.point(point2[0], point2[1]);
+            } else {
+              point2 = intersect(point0, point1);
+              listener.point(point2[0], point2[1]);
+              listener.lineEnd();
+            }
+            point0 = point2;
+          } else if (notHemisphere && point0 && smallRadius ^ v) {
+            var t;
+            if (!(c & c0) && (t = intersect(point1, point0, true))) {
+              clean = 0;
+              if (smallRadius) {
+                listener.lineStart();
+                listener.point(t[0][0], t[0][1]);
+                listener.point(t[1][0], t[1][1]);
+                listener.lineEnd();
+              } else {
+                listener.point(t[1][0], t[1][1]);
+                listener.lineEnd();
+                listener.lineStart();
+                listener.point(t[0][0], t[0][1]);
+              }
+            }
+          }
+          if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) {
+            listener.point(point1[0], point1[1]);
+          }
+          point0 = point1, v0 = v, c0 = c;
+        },
+        lineEnd: function() {
+          if (v0) listener.lineEnd();
+          point0 = null;
+        },
+        clean: function() {
+          return clean | (v00 && v0) << 1;
+        }
+      };
+    }
+    function intersect(a, b, two) {
+      var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b);
+      var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;
+      if (!determinant) return !two && a;
+      var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2);
+      d3_geo_cartesianAdd(A, B);
+      var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1);
+      if (t2 < 0) return;
+      var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu);
+      d3_geo_cartesianAdd(q, A);
+      q = d3_geo_spherical(q);
+      if (!two) return q;
+      var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z;
+      if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z;
+      var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε;
+      if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z;
+      if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) {
+        var q1 = d3_geo_cartesianScale(u, (-w + t) / uu);
+        d3_geo_cartesianAdd(q1, A);
+        return [ q, d3_geo_spherical(q1) ];
+      }
+    }
+    function code(λ, φ) {
+      var r = smallRadius ? radius : π - radius, code = 0;
+      if (λ < -r) code |= 1; else if (λ > r) code |= 2;
+      if (φ < -r) code |= 4; else if (φ > r) code |= 8;
+      return code;
+    }
+  }
+  function d3_geom_clipLine(x0, y0, x1, y1) {
+    return function(line) {
+      var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;
+      r = x0 - ax;
+      if (!dx && r > 0) return;
+      r /= dx;
+      if (dx < 0) {
+        if (r < t0) return;
+        if (r < t1) t1 = r;
+      } else if (dx > 0) {
+        if (r > t1) return;
+        if (r > t0) t0 = r;
+      }
+      r = x1 - ax;
+      if (!dx && r < 0) return;
+      r /= dx;
+      if (dx < 0) {
+        if (r > t1) return;
+        if (r > t0) t0 = r;
+      } else if (dx > 0) {
+        if (r < t0) return;
+        if (r < t1) t1 = r;
+      }
+      r = y0 - ay;
+      if (!dy && r > 0) return;
+      r /= dy;
+      if (dy < 0) {
+        if (r < t0) return;
+        if (r < t1) t1 = r;
+      } else if (dy > 0) {
+        if (r > t1) return;
+        if (r > t0) t0 = r;
+      }
+      r = y1 - ay;
+      if (!dy && r < 0) return;
+      r /= dy;
+      if (dy < 0) {
+        if (r > t1) return;
+        if (r > t0) t0 = r;
+      } else if (dy > 0) {
+        if (r < t0) return;
+        if (r < t1) t1 = r;
+      }
+      if (t0 > 0) line.a = {
+        x: ax + t0 * dx,
+        y: ay + t0 * dy
+      };
+      if (t1 < 1) line.b = {
+        x: ax + t1 * dx,
+        y: ay + t1 * dy
+      };
+      return line;
+    };
+  }
+  var d3_geo_clipExtentMAX = 1e9;
+  d3.geo.clipExtent = function() {
+    var x0, y0, x1, y1, stream, clip, clipExtent = {
+      stream: function(output) {
+        if (stream) stream.valid = false;
+        stream = clip(output);
+        stream.valid = true;
+        return stream;
+      },
+      extent: function(_) {
+        if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];
+        clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]);
+        if (stream) stream.valid = false, stream = null;
+        return clipExtent;
+      }
+    };
+    return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]);
+  };
+  function d3_geo_clipExtent(x0, y0, x1, y1) {
+    return function(listener) {
+      var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring;
+      var clip = {
+        point: point,
+        lineStart: lineStart,
+        lineEnd: lineEnd,
+        polygonStart: function() {
+          listener = bufferListener;
+          segments = [];
+          polygon = [];
+          clean = true;
+        },
+        polygonEnd: function() {
+          listener = listener_;
+          segments = d3.merge(segments);
+          var clipStartInside = insidePolygon([ x0, y1 ]), inside = clean && clipStartInside, visible = segments.length;
+          if (inside || visible) {
+            listener.polygonStart();
+            if (inside) {
+              listener.lineStart();
+              interpolate(null, null, 1, listener);
+              listener.lineEnd();
+            }
+            if (visible) {
+              d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener);
+            }
+            listener.polygonEnd();
+          }
+          segments = polygon = ring = null;
+        }
+      };
+      function insidePolygon(p) {
+        var wn = 0, n = polygon.length, y = p[1];
+        for (var i = 0; i < n; ++i) {
+          for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) {
+            b = v[j];
+            if (a[1] <= y) {
+              if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn;
+            } else {
+              if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn;
+            }
+            a = b;
+          }
+        }
+        return wn !== 0;
+      }
+      function interpolate(from, to, direction, listener) {
+        var a = 0, a1 = 0;
+        if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) {
+          do {
+            listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
+          } while ((a = (a + direction + 4) % 4) !== a1);
+        } else {
+          listener.point(to[0], to[1]);
+        }
+      }
+      function pointVisible(x, y) {
+        return x0 <= x && x <= x1 && y0 <= y && y <= y1;
+      }
+      function point(x, y) {
+        if (pointVisible(x, y)) listener.point(x, y);
+      }
+      var x__, y__, v__, x_, y_, v_, first, clean;
+      function lineStart() {
+        clip.point = linePoint;
+        if (polygon) polygon.push(ring = []);
+        first = true;
+        v_ = false;
+        x_ = y_ = NaN;
+      }
+      function lineEnd() {
+        if (segments) {
+          linePoint(x__, y__);
+          if (v__ && v_) bufferListener.rejoin();
+          segments.push(bufferListener.buffer());
+        }
+        clip.point = point;
+        if (v_) listener.lineEnd();
+      }
+      function linePoint(x, y) {
+        x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x));
+        y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y));
+        var v = pointVisible(x, y);
+        if (polygon) ring.push([ x, y ]);
+        if (first) {
+          x__ = x, y__ = y, v__ = v;
+          first = false;
+          if (v) {
+            listener.lineStart();
+            listener.point(x, y);
+          }
+        } else {
+          if (v && v_) listener.point(x, y); else {
+            var l = {
+              a: {
+                x: x_,
+                y: y_
+              },
+              b: {
+                x: x,
+                y: y
+              }
+            };
+            if (clipLine(l)) {
+              if (!v_) {
+                listener.lineStart();
+                listener.point(l.a.x, l.a.y);
+              }
+              listener.point(l.b.x, l.b.y);
+              if (!v) listener.lineEnd();
+              clean = false;
+            } else if (v) {
+              listener.lineStart();
+              listener.point(x, y);
+              clean = false;
+            }
+          }
+        }
+        x_ = x, y_ = y, v_ = v;
+      }
+      return clip;
+    };
+    function corner(p, direction) {
+      return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;
+    }
+    function compare(a, b) {
+      return comparePoints(a.x, b.x);
+    }
+    function comparePoints(a, b) {
+      var ca = corner(a, 1), cb = corner(b, 1);
+      return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];
+    }
+  }
+  function d3_geo_conic(projectAt) {
+    var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1);
+    p.parallels = function(_) {
+      if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ];
+      return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180);
+    };
+    return p;
+  }
+  function d3_geo_conicEqualArea(φ0, φ1) {
+    var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n;
+    function forward(λ, φ) {
+      var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;
+      return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ];
+    }
+    forward.invert = function(x, y) {
+      var ρ0_y = ρ0 - y;
+      return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ];
+    };
+    return forward;
+  }
+  (d3.geo.conicEqualArea = function() {
+    return d3_geo_conic(d3_geo_conicEqualArea);
+  }).raw = d3_geo_conicEqualArea;
+  d3.geo.albers = function() {
+    return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070);
+  };
+  d3.geo.albersUsa = function() {
+    var lower48 = d3.geo.albers();
+    var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]);
+    var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]);
+    var point, pointStream = {
+      point: function(x, y) {
+        point = [ x, y ];
+      }
+    }, lower48Point, alaskaPoint, hawaiiPoint;
+    function albersUsa(coordinates) {
+      var x = coordinates[0], y = coordinates[1];
+      point = null;
+      (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y);
+      return point;
+    }
+    albersUsa.invert = function(coordinates) {
+      var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k;
+      return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates);
+    };
+    albersUsa.stream = function(stream) {
+      var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream);
+      return {
+        point: function(x, y) {
+          lower48Stream.point(x, y);
+          alaskaStream.point(x, y);
+          hawaiiStream.point(x, y);
+        },
+        sphere: function() {
+          lower48Stream.sphere();
+          alaskaStream.sphere();
+          hawaiiStream.sphere();
+        },
+        lineStart: function() {
+          lower48Stream.lineStart();
+          alaskaStream.lineStart();
+          hawaiiStream.lineStart();
+        },
+        lineEnd: function() {
+          lower48Stream.lineEnd();
+          alaskaStream.lineEnd();
+          hawaiiStream.lineEnd();
+        },
+        polygonStart: function() {
+          lower48Stream.polygonStart();
+          alaskaStream.polygonStart();
+          hawaiiStream.polygonStart();
+        },
+        polygonEnd: function() {
+          lower48Stream.polygonEnd();
+          alaskaStream.polygonEnd();
+          hawaiiStream.polygonEnd();
+        }
+      };
+    };
+    albersUsa.precision = function(_) {
+      if (!arguments.length) return lower48.precision();
+      lower48.precision(_);
+      alaska.precision(_);
+      hawaii.precision(_);
+      return albersUsa;
+    };
+    albersUsa.scale = function(_) {
+      if (!arguments.length) return lower48.scale();
+      lower48.scale(_);
+      alaska.scale(_ * .35);
+      hawaii.scale(_);
+      return albersUsa.translate(lower48.translate());
+    };
+    albersUsa.translate = function(_) {
+      if (!arguments.length) return lower48.translate();
+      var k = lower48.scale(), x = +_[0], y = +_[1];
+      lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point;
+      alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;
+      hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;
+      return albersUsa;
+    };
+    return albersUsa.scale(1070);
+  };
+  var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {
+    point: d3_noop,
+    lineStart: d3_noop,
+    lineEnd: d3_noop,
+    polygonStart: function() {
+      d3_geo_pathAreaPolygon = 0;
+      d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;
+    },
+    polygonEnd: function() {
+      d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;
+      d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2);
+    }
+  };
+  function d3_geo_pathAreaRingStart() {
+    var x00, y00, x0, y0;
+    d3_geo_pathArea.point = function(x, y) {
+      d3_geo_pathArea.point = nextPoint;
+      x00 = x0 = x, y00 = y0 = y;
+    };
+    function nextPoint(x, y) {
+      d3_geo_pathAreaPolygon += y0 * x - x0 * y;
+      x0 = x, y0 = y;
+    }
+    d3_geo_pathArea.lineEnd = function() {
+      nextPoint(x00, y00);
+    };
+  }
+  var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1;
+  var d3_geo_pathBounds = {
+    point: d3_geo_pathBoundsPoint,
+    lineStart: d3_noop,
+    lineEnd: d3_noop,
+    polygonStart: d3_noop,
+    polygonEnd: d3_noop
+  };
+  function d3_geo_pathBoundsPoint(x, y) {
+    if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x;
+    if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x;
+    if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y;
+    if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y;
+  }
+  function d3_geo_pathBuffer() {
+    var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = [];
+    var stream = {
+      point: point,
+      lineStart: function() {
+        stream.point = pointLineStart;
+      },
+      lineEnd: lineEnd,
+      polygonStart: function() {
+        stream.lineEnd = lineEndPolygon;
+      },
+      polygonEnd: function() {
+        stream.lineEnd = lineEnd;
+        stream.point = point;
+      },
+      pointRadius: function(_) {
+        pointCircle = d3_geo_pathBufferCircle(_);
+        return stream;
+      },
+      result: function() {
+        if (buffer.length) {
+          var result = buffer.join("");
+          buffer = [];
+          return result;
+        }
+      }
+    };
+    function point(x, y) {
+      buffer.push("M", x, ",", y, pointCircle);
+    }
+    function pointLineStart(x, y) {
+      buffer.push("M", x, ",", y);
+      stream.point = pointLine;
+    }
+    function pointLine(x, y) {
+      buffer.push("L", x, ",", y);
+    }
+    function lineEnd() {
+      stream.point = point;
+    }
+    function lineEndPolygon() {
+      buffer.push("Z");
+    }
+    return stream;
+  }
+  function d3_geo_pathBufferCircle(radius) {
+    return "m0," + radius + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + "z";
+  }
+  var d3_geo_pathCentroid = {
+    point: d3_geo_pathCentroidPoint,
+    lineStart: d3_geo_pathCentroidLineStart,
+    lineEnd: d3_geo_pathCentroidLineEnd,
+    polygonStart: function() {
+      d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart;
+    },
+    polygonEnd: function() {
+      d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;
+      d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart;
+      d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd;
+    }
+  };
+  function d3_geo_pathCentroidPoint(x, y) {
+    d3_geo_centroidX0 += x;
+    d3_geo_centroidY0 += y;
+    ++d3_geo_centroidZ0;
+  }
+  function d3_geo_pathCentroidLineStart() {
+    var x0, y0;
+    d3_geo_pathCentroid.point = function(x, y) {
+      d3_geo_pathCentroid.point = nextPoint;
+      d3_geo_pathCentroidPoint(x0 = x, y0 = y);
+    };
+    function nextPoint(x, y) {
+      var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);
+      d3_geo_centroidX1 += z * (x0 + x) / 2;
+      d3_geo_centroidY1 += z * (y0 + y) / 2;
+      d3_geo_centroidZ1 += z;
+      d3_geo_pathCentroidPoint(x0 = x, y0 = y);
+    }
+  }
+  function d3_geo_pathCentroidLineEnd() {
+    d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;
+  }
+  function d3_geo_pathCentroidRingStart() {
+    var x00, y00, x0, y0;
+    d3_geo_pathCentroid.point = function(x, y) {
+      d3_geo_pathCentroid.point = nextPoint;
+      d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y);
+    };
+    function nextPoint(x, y) {
+      var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);
+      d3_geo_centroidX1 += z * (x0 + x) / 2;
+      d3_geo_centroidY1 += z * (y0 + y) / 2;
+      d3_geo_centroidZ1 += z;
+      z = y0 * x - x0 * y;
+      d3_geo_centroidX2 += z * (x0 + x);
+      d3_geo_centroidY2 += z * (y0 + y);
+      d3_geo_centroidZ2 += z * 3;
+      d3_geo_pathCentroidPoint(x0 = x, y0 = y);
+    }
+    d3_geo_pathCentroid.lineEnd = function() {
+      nextPoint(x00, y00);
+    };
+  }
+  function d3_geo_pathContext(context) {
+    var pointRadius = 4.5;
+    var stream = {
+      point: point,
+      lineStart: function() {
+        stream.point = pointLineStart;
+      },
+      lineEnd: lineEnd,
+      polygonStart: function() {
+        stream.lineEnd = lineEndPolygon;
+      },
+      polygonEnd: function() {
+        stream.lineEnd = lineEnd;
+        stream.point = point;
+      },
+      pointRadius: function(_) {
+        pointRadius = _;
+        return stream;
+      },
+      result: d3_noop
+    };
+    function point(x, y) {
+      context.moveTo(x + pointRadius, y);
+      context.arc(x, y, pointRadius, 0, τ);
+    }
+    function pointLineStart(x, y) {
+      context.moveTo(x, y);
+      stream.point = pointLine;
+    }
+    function pointLine(x, y) {
+      context.lineTo(x, y);
+    }
+    function lineEnd() {
+      stream.point = point;
+    }
+    function lineEndPolygon() {
+      context.closePath();
+    }
+    return stream;
+  }
+  function d3_geo_resample(project) {
+    var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16;
+    function resample(stream) {
+      return (maxDepth ? resampleRecursive : resampleNone)(stream);
+    }
+    function resampleNone(stream) {
+      return d3_geo_transformPoint(stream, function(x, y) {
+        x = project(x, y);
+        stream.point(x[0], x[1]);
+      });
+    }
+    function resampleRecursive(stream) {
+      var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0;
+      var resample = {
+        point: point,
+        lineStart: lineStart,
+        lineEnd: lineEnd,
+        polygonStart: function() {
+          stream.polygonStart();
+          resample.lineStart = ringStart;
+        },
+        polygonEnd: function() {
+          stream.polygonEnd();
+          resample.lineStart = lineStart;
+        }
+      };
+      function point(x, y) {
+        x = project(x, y);
+        stream.point(x[0], x[1]);
+      }
+      function lineStart() {
+        x0 = NaN;
+        resample.point = linePoint;
+        stream.lineStart();
+      }
+      function linePoint(λ, φ) {
+        var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ);
+        resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);
+        stream.point(x0, y0);
+      }
+      function lineEnd() {
+        resample.point = point;
+        stream.lineEnd();
+      }
+      function ringStart() {
+        lineStart();
+        resample.point = ringPoint;
+        resample.lineEnd = ringEnd;
+      }
+      function ringPoint(λ, φ) {
+        linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
+        resample.point = linePoint;
+      }
+      function ringEnd() {
+        resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream);
+        resample.lineEnd = lineEnd;
+        lineEnd();
+      }
+      return resample;
+    }
+    function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {
+      var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;
+      if (d2 > 4 * δ2 && depth--) {
+        var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;
+        if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {
+          resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);
+          stream.point(x2, y2);
+          resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);
+        }
+      }
+    }
+    resample.precision = function(_) {
+      if (!arguments.length) return Math.sqrt(δ2);
+      maxDepth = (δ2 = _ * _) > 0 && 16;
+      return resample;
+    };
+    return resample;
+  }
+  d3.geo.path = function() {
+    var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream;
+    function path(object) {
+      if (object) {
+        if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
+        if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream);
+        d3.geo.stream(object, cacheStream);
+      }
+      return contextStream.result();
+    }
+    path.area = function(object) {
+      d3_geo_pathAreaSum = 0;
+      d3.geo.stream(object, projectStream(d3_geo_pathArea));
+      return d3_geo_pathAreaSum;
+    };
+    path.centroid = function(object) {
+      d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;
+      d3.geo.stream(object, projectStream(d3_geo_pathCentroid));
+      return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ];
+    };
+    path.bounds = function(object) {
+      d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity);
+      d3.geo.stream(object, projectStream(d3_geo_pathBounds));
+      return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ];
+    };
+    path.projection = function(_) {
+      if (!arguments.length) return projection;
+      projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity;
+      return reset();
+    };
+    path.context = function(_) {
+      if (!arguments.length) return context;
+      contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_);
+      if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
+      return reset();
+    };
+    path.pointRadius = function(_) {
+      if (!arguments.length) return pointRadius;
+      pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
+      return path;
+    };
+    function reset() {
+      cacheStream = null;
+      return path;
+    }
+    return path.projection(d3.geo.albersUsa()).context(null);
+  };
+  function d3_geo_pathProjectStream(project) {
+    var resample = d3_geo_resample(function(x, y) {
+      return project([ x * d3_degrees, y * d3_degrees ]);
+    });
+    return function(stream) {
+      return d3_geo_projectionRadians(resample(stream));
+    };
+  }
+  d3.geo.transform = function(methods) {
+    return {
+      stream: function(stream) {
+        var transform = new d3_geo_transform(stream);
+        for (var k in methods) transform[k] = methods[k];
+        return transform;
+      }
+    };
+  };
+  function d3_geo_transform(stream) {
+    this.stream = stream;
+  }
+  d3_geo_transform.prototype = {
+    point: function(x, y) {
+      this.stream.point(x, y);
+    },
+    sphere: function() {
+      this.stream.sphere();
+    },
+    lineStart: function() {
+      this.stream.lineStart();
+    },
+    lineEnd: function() {
+      this.stream.lineEnd();
+    },
+    polygonStart: function() {
+      this.stream.polygonStart();
+    },
+    polygonEnd: function() {
+      this.stream.polygonEnd();
+    }
+  };
+  function d3_geo_transformPoint(stream, point) {
+    return {
+      point: point,
+      sphere: function() {
+        stream.sphere();
+      },
+      lineStart: function() {
+        stream.lineStart();
+      },
+      lineEnd: function() {
+        stream.lineEnd();
+      },
+      polygonStart: function() {
+        stream.polygonStart();
+      },
+      polygonEnd: function() {
+        stream.polygonEnd();
+      }
+    };
+  }
+  d3.geo.projection = d3_geo_projection;
+  d3.geo.projectionMutator = d3_geo_projectionMutator;
+  function d3_geo_projection(project) {
+    return d3_geo_projectionMutator(function() {
+      return project;
+    })();
+  }
+  function d3_geo_projectionMutator(projectAt) {
+    var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) {
+      x = project(x, y);
+      return [ x[0] * k + δx, δy - x[1] * k ];
+    }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream;
+    function projection(point) {
+      point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);
+      return [ point[0] * k + δx, δy - point[1] * k ];
+    }
+    function invert(point) {
+      point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k);
+      return point && [ point[0] * d3_degrees, point[1] * d3_degrees ];
+    }
+    projection.stream = function(output) {
+      if (stream) stream.valid = false;
+      stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output))));
+      stream.valid = true;
+      return stream;
+    };
+    projection.clipAngle = function(_) {
+      if (!arguments.length) return clipAngle;
+      preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians);
+      return invalidate();
+    };
+    projection.clipExtent = function(_) {
+      if (!arguments.length) return clipExtent;
+      clipExtent = _;
+      postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity;
+      return invalidate();
+    };
+    projection.scale = function(_) {
+      if (!arguments.length) return k;
+      k = +_;
+      return reset();
+    };
+    projection.translate = function(_) {
+      if (!arguments.length) return [ x, y ];
+      x = +_[0];
+      y = +_[1];
+      return reset();
+    };
+    projection.center = function(_) {
+      if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ];
+      λ = _[0] % 360 * d3_radians;
+      φ = _[1] % 360 * d3_radians;
+      return reset();
+    };
+    projection.rotate = function(_) {
+      if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ];
+      δλ = _[0] % 360 * d3_radians;
+      δφ = _[1] % 360 * d3_radians;
+      δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0;
+      return reset();
+    };
+    d3.rebind(projection, projectResample, "precision");
+    function reset() {
+      projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project);
+      var center = project(λ, φ);
+      δx = x - center[0] * k;
+      δy = y + center[1] * k;
+      return invalidate();
+    }
+    function invalidate() {
+      if (stream) stream.valid = false, stream = null;
+      return projection;
+    }
+    return function() {
+      project = projectAt.apply(this, arguments);
+      projection.invert = project.invert && invert;
+      return reset();
+    };
+  }
+  function d3_geo_projectionRadians(stream) {
+    return d3_geo_transformPoint(stream, function(x, y) {
+      stream.point(x * d3_radians, y * d3_radians);
+    });
+  }
+  function d3_geo_equirectangular(λ, φ) {
+    return [ λ, φ ];
+  }
+  (d3.geo.equirectangular = function() {
+    return d3_geo_projection(d3_geo_equirectangular);
+  }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular;
+  d3.geo.rotation = function(rotate) {
+    rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0);
+    function forward(coordinates) {
+      coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians);
+      return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;
+    }
+    forward.invert = function(coordinates) {
+      coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians);
+      return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;
+    };
+    return forward;
+  };
+  function d3_geo_identityRotation(λ, φ) {
+    return [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];
+  }
+  d3_geo_identityRotation.invert = d3_geo_equirectangular;
+  function d3_geo_rotation(δλ, δφ, δγ) {
+    return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_identityRotation;
+  }
+  function d3_geo_forwardRotationλ(δλ) {
+    return function(λ, φ) {
+      return λ += δλ, [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];
+    };
+  }
+  function d3_geo_rotationλ(δλ) {
+    var rotation = d3_geo_forwardRotationλ(δλ);
+    rotation.invert = d3_geo_forwardRotationλ(-δλ);
+    return rotation;
+  }
+  function d3_geo_rotationφγ(δφ, δγ) {
+    var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ);
+    function rotation(λ, φ) {
+      var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ;
+      return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ];
+    }
+    rotation.invert = function(λ, φ) {
+      var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ;
+      return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ];
+    };
+    return rotation;
+  }
+  d3.geo.circle = function() {
+    var origin = [ 0, 0 ], angle, precision = 6, interpolate;
+    function circle() {
+      var center = typeof origin === "function" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = [];
+      interpolate(null, null, 1, {
+        point: function(x, y) {
+          ring.push(x = rotate(x, y));
+          x[0] *= d3_degrees, x[1] *= d3_degrees;
+        }
+      });
+      return {
+        type: "Polygon",
+        coordinates: [ ring ]
+      };
+    }
+    circle.origin = function(x) {
+      if (!arguments.length) return origin;
+      origin = x;
+      return circle;
+    };
+    circle.angle = function(x) {
+      if (!arguments.length) return angle;
+      interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians);
+      return circle;
+    };
+    circle.precision = function(_) {
+      if (!arguments.length) return precision;
+      interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians);
+      return circle;
+    };
+    return circle.angle(90);
+  };
+  function d3_geo_circleInterpolate(radius, precision) {
+    var cr = Math.cos(radius), sr = Math.sin(radius);
+    return function(from, to, direction, listener) {
+      var step = direction * precision;
+      if (from != null) {
+        from = d3_geo_circleAngle(cr, from);
+        to = d3_geo_circleAngle(cr, to);
+        if (direction > 0 ? from < to : from > to) from += direction * τ;
+      } else {
+        from = radius + direction * τ;
+        to = radius - .5 * step;
+      }
+      for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) {
+        listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]);
+      }
+    };
+  }
+  function d3_geo_circleAngle(cr, point) {
+    var a = d3_geo_cartesian(point);
+    a[0] -= cr;
+    d3_geo_cartesianNormalize(a);
+    var angle = d3_acos(-a[1]);
+    return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI);
+  }
+  d3.geo.distance = function(a, b) {
+    var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t;
+    return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ);
+  };
+  d3.geo.graticule = function() {
+    var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5;
+    function graticule() {
+      return {
+        type: "MultiLineString",
+        coordinates: lines()
+      };
+    }
+    function lines() {
+      return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) {
+        return abs(x % DX) > ε;
+      }).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) {
+        return abs(y % DY) > ε;
+      }).map(y));
+    }
+    graticule.lines = function() {
+      return lines().map(function(coordinates) {
+        return {
+          type: "LineString",
+          coordinates: coordinates
+        };
+      });
+    };
+    graticule.outline = function() {
+      return {
+        type: "Polygon",
+        coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ]
+      };
+    };
+    graticule.extent = function(_) {
+      if (!arguments.length) return graticule.minorExtent();
+      return graticule.majorExtent(_).minorExtent(_);
+    };
+    graticule.majorExtent = function(_) {
+      if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ];
+      X0 = +_[0][0], X1 = +_[1][0];
+      Y0 = +_[0][1], Y1 = +_[1][1];
+      if (X0 > X1) _ = X0, X0 = X1, X1 = _;
+      if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;
+      return graticule.precision(precision);
+    };
+    graticule.minorExtent = function(_) {
+      if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];
+      x0 = +_[0][0], x1 = +_[1][0];
+      y0 = +_[0][1], y1 = +_[1][1];
+      if (x0 > x1) _ = x0, x0 = x1, x1 = _;
+      if (y0 > y1) _ = y0, y0 = y1, y1 = _;
+      return graticule.precision(precision);
+    };
+    graticule.step = function(_) {
+      if (!arguments.length) return graticule.minorStep();
+      return graticule.majorStep(_).minorStep(_);
+    };
+    graticule.majorStep = function(_) {
+      if (!arguments.length) return [ DX, DY ];
+      DX = +_[0], DY = +_[1];
+      return graticule;
+    };
+    graticule.minorStep = function(_) {
+      if (!arguments.length) return [ dx, dy ];
+      dx = +_[0], dy = +_[1];
+      return graticule;
+    };
+    graticule.precision = function(_) {
+      if (!arguments.length) return precision;
+      precision = +_;
+      x = d3_geo_graticuleX(y0, y1, 90);
+      y = d3_geo_graticuleY(x0, x1, precision);
+      X = d3_geo_graticuleX(Y0, Y1, 90);
+      Y = d3_geo_graticuleY(X0, X1, precision);
+      return graticule;
+    };
+    return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]);
+  };
+  function d3_geo_graticuleX(y0, y1, dy) {
+    var y = d3.range(y0, y1 - ε, dy).concat(y1);
+    return function(x) {
+      return y.map(function(y) {
+        return [ x, y ];
+      });
+    };
+  }
+  function d3_geo_graticuleY(x0, x1, dx) {
+    var x = d3.range(x0, x1 - ε, dx).concat(x1);
+    return function(y) {
+      return x.map(function(x) {
+        return [ x, y ];
+      });
+    };
+  }
+  function d3_source(d) {
+    return d.source;
+  }
+  function d3_target(d) {
+    return d.target;
+  }
+  d3.geo.greatArc = function() {
+    var source = d3_source, source_, target = d3_target, target_;
+    function greatArc() {
+      return {
+        type: "LineString",
+        coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ]
+      };
+    }
+    greatArc.distance = function() {
+      return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments));
+    };
+    greatArc.source = function(_) {
+      if (!arguments.length) return source;
+      source = _, source_ = typeof _ === "function" ? null : _;
+      return greatArc;
+    };
+    greatArc.target = function(_) {
+      if (!arguments.length) return target;
+      target = _, target_ = typeof _ === "function" ? null : _;
+      return greatArc;
+    };
+    greatArc.precision = function() {
+      return arguments.length ? greatArc : 0;
+    };
+    return greatArc;
+  };
+  d3.geo.interpolate = function(source, target) {
+    return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians);
+  };
+  function d3_geo_interpolate(x0, y0, x1, y1) {
+    var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d);
+    var interpolate = d ? function(t) {
+      var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1;
+      return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ];
+    } : function() {
+      return [ x0 * d3_degrees, y0 * d3_degrees ];
+    };
+    interpolate.distance = d;
+    return interpolate;
+  }
+  d3.geo.length = function(object) {
+    d3_geo_lengthSum = 0;
+    d3.geo.stream(object, d3_geo_length);
+    return d3_geo_lengthSum;
+  };
+  var d3_geo_lengthSum;
+  var d3_geo_length = {
+    sphere: d3_noop,
+    point: d3_noop,
+    lineStart: d3_geo_lengthLineStart,
+    lineEnd: d3_noop,
+    polygonStart: d3_noop,
+    polygonEnd: d3_noop
+  };
+  function d3_geo_lengthLineStart() {
+    var λ0, sinφ0, cosφ0;
+    d3_geo_length.point = function(λ, φ) {
+      λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ);
+      d3_geo_length.point = nextPoint;
+    };
+    d3_geo_length.lineEnd = function() {
+      d3_geo_length.point = d3_geo_length.lineEnd = d3_noop;
+    };
+    function nextPoint(λ, φ) {
+      var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t);
+      d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ);
+      λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ;
+    }
+  }
+  function d3_geo_azimuthal(scale, angle) {
+    function azimuthal(λ, φ) {
+      var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ);
+      return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ];
+    }
+    azimuthal.invert = function(x, y) {
+      var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c);
+      return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ];
+    };
+    return azimuthal;
+  }
+  var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) {
+    return Math.sqrt(2 / (1 + cosλcosφ));
+  }, function(ρ) {
+    return 2 * Math.asin(ρ / 2);
+  });
+  (d3.geo.azimuthalEqualArea = function() {
+    return d3_geo_projection(d3_geo_azimuthalEqualArea);
+  }).raw = d3_geo_azimuthalEqualArea;
+  var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) {
+    var c = Math.acos(cosλcosφ);
+    return c && c / Math.sin(c);
+  }, d3_identity);
+  (d3.geo.azimuthalEquidistant = function() {
+    return d3_geo_projection(d3_geo_azimuthalEquidistant);
+  }).raw = d3_geo_azimuthalEquidistant;
+  function d3_geo_conicConformal(φ0, φ1) {
+    var cosφ0 = Math.cos(φ0), t = function(φ) {
+      return Math.tan(π / 4 + φ / 2);
+    }, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n;
+    if (!n) return d3_geo_mercator;
+    function forward(λ, φ) {
+      if (F > 0) {
+        if (φ < -halfπ + ε) φ = -halfπ + ε;
+      } else {
+        if (φ > halfπ - ε) φ = halfπ - ε;
+      }
+      var ρ = F / Math.pow(t(φ), n);
+      return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ];
+    }
+    forward.invert = function(x, y) {
+      var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y);
+      return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - halfπ ];
+    };
+    return forward;
+  }
+  (d3.geo.conicConformal = function() {
+    return d3_geo_conic(d3_geo_conicConformal);
+  }).raw = d3_geo_conicConformal;
+  function d3_geo_conicEquidistant(φ0, φ1) {
+    var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0;
+    if (abs(n) < ε) return d3_geo_equirectangular;
+    function forward(λ, φ) {
+      var ρ = G - φ;
+      return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ];
+    }
+    forward.invert = function(x, y) {
+      var ρ0_y = G - y;
+      return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ];
+    };
+    return forward;
+  }
+  (d3.geo.conicEquidistant = function() {
+    return d3_geo_conic(d3_geo_conicEquidistant);
+  }).raw = d3_geo_conicEquidistant;
+  var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) {
+    return 1 / cosλcosφ;
+  }, Math.atan);
+  (d3.geo.gnomonic = function() {
+    return d3_geo_projection(d3_geo_gnomonic);
+  }).raw = d3_geo_gnomonic;
+  function d3_geo_mercator(λ, φ) {
+    return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ];
+  }
+  d3_geo_mercator.invert = function(x, y) {
+    return [ x, 2 * Math.atan(Math.exp(y)) - halfπ ];
+  };
+  function d3_geo_mercatorProjection(project) {
+    var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto;
+    m.scale = function() {
+      var v = scale.apply(m, arguments);
+      return v === m ? clipAuto ? m.clipExtent(null) : m : v;
+    };
+    m.translate = function() {
+      var v = translate.apply(m, arguments);
+      return v === m ? clipAuto ? m.clipExtent(null) : m : v;
+    };
+    m.clipExtent = function(_) {
+      var v = clipExtent.apply(m, arguments);
+      if (v === m) {
+        if (clipAuto = _ == null) {
+          var k = π * scale(), t = translate();
+          clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]);
+        }
+      } else if (clipAuto) {
+        v = null;
+      }
+      return v;
+    };
+    return m.clipExtent(null);
+  }
+  (d3.geo.mercator = function() {
+    return d3_geo_mercatorProjection(d3_geo_mercator);
+  }).raw = d3_geo_mercator;
+  var d3_geo_orthographic = d3_geo_azimuthal(function() {
+    return 1;
+  }, Math.asin);
+  (d3.geo.orthographic = function() {
+    return d3_geo_projection(d3_geo_orthographic);
+  }).raw = d3_geo_orthographic;
+  var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) {
+    return 1 / (1 + cosλcosφ);
+  }, function(ρ) {
+    return 2 * Math.atan(ρ);
+  });
+  (d3.geo.stereographic = function() {
+    return d3_geo_projection(d3_geo_stereographic);
+  }).raw = d3_geo_stereographic;
+  function d3_geo_transverseMercator(λ, φ) {
+    return [ Math.log(Math.tan(π / 4 + φ / 2)), -λ ];
+  }
+  d3_geo_transverseMercator.invert = function(x, y) {
+    return [ -y, 2 * Math.atan(Math.exp(x)) - halfπ ];
+  };
+  (d3.geo.transverseMercator = function() {
+    var projection = d3_geo_mercatorProjection(d3_geo_transverseMercator), center = projection.center, rotate = projection.rotate;
+    projection.center = function(_) {
+      return _ ? center([ -_[1], _[0] ]) : (_ = center(), [ _[1], -_[0] ]);
+    };
+    projection.rotate = function(_) {
+      return _ ? rotate([ _[0], _[1], _.length > 2 ? _[2] + 90 : 90 ]) : (_ = rotate(), 
+      [ _[0], _[1], _[2] - 90 ]);
+    };
+    return rotate([ 0, 0, 90 ]);
+  }).raw = d3_geo_transverseMercator;
+  d3.geom = {};
+  function d3_geom_pointX(d) {
+    return d[0];
+  }
+  function d3_geom_pointY(d) {
+    return d[1];
+  }
+  d3.geom.hull = function(vertices) {
+    var x = d3_geom_pointX, y = d3_geom_pointY;
+    if (arguments.length) return hull(vertices);
+    function hull(data) {
+      if (data.length < 3) return [];
+      var fx = d3_functor(x), fy = d3_functor(y), i, n = data.length, points = [], flippedPoints = [];
+      for (i = 0; i < n; i++) {
+        points.push([ +fx.call(this, data[i], i), +fy.call(this, data[i], i), i ]);
+      }
+      points.sort(d3_geom_hullOrder);
+      for (i = 0; i < n; i++) flippedPoints.push([ points[i][0], -points[i][1] ]);
+      var upper = d3_geom_hullUpper(points), lower = d3_geom_hullUpper(flippedPoints);
+      var skipLeft = lower[0] === upper[0], skipRight = lower[lower.length - 1] === upper[upper.length - 1], polygon = [];
+      for (i = upper.length - 1; i >= 0; --i) polygon.push(data[points[upper[i]][2]]);
+      for (i = +skipLeft; i < lower.length - skipRight; ++i) polygon.push(data[points[lower[i]][2]]);
+      return polygon;
+    }
+    hull.x = function(_) {
+      return arguments.length ? (x = _, hull) : x;
+    };
+    hull.y = function(_) {
+      return arguments.length ? (y = _, hull) : y;
+    };
+    return hull;
+  };
+  function d3_geom_hullUpper(points) {
+    var n = points.length, hull = [ 0, 1 ], hs = 2;
+    for (var i = 2; i < n; i++) {
+      while (hs > 1 && d3_cross2d(points[hull[hs - 2]], points[hull[hs - 1]], points[i]) <= 0) --hs;
+      hull[hs++] = i;
+    }
+    return hull.slice(0, hs);
+  }
+  function d3_geom_hullOrder(a, b) {
+    return a[0] - b[0] || a[1] - b[1];
+  }
+  d3.geom.polygon = function(coordinates) {
+    d3_subclass(coordinates, d3_geom_polygonPrototype);
+    return coordinates;
+  };
+  var d3_geom_polygonPrototype = d3.geom.polygon.prototype = [];
+  d3_geom_polygonPrototype.area = function() {
+    var i = -1, n = this.length, a, b = this[n - 1], area = 0;
+    while (++i < n) {
+      a = b;
+      b = this[i];
+      area += a[1] * b[0] - a[0] * b[1];
+    }
+    return area * .5;
+  };
+  d3_geom_polygonPrototype.centroid = function(k) {
+    var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c;
+    if (!arguments.length) k = -1 / (6 * this.area());
+    while (++i < n) {
+      a = b;
+      b = this[i];
+      c = a[0] * b[1] - b[0] * a[1];
+      x += (a[0] + b[0]) * c;
+      y += (a[1] + b[1]) * c;
+    }
+    return [ x * k, y * k ];
+  };
+  d3_geom_polygonPrototype.clip = function(subject) {
+    var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d;
+    while (++i < n) {
+      input = subject.slice();
+      subject.length = 0;
+      b = this[i];
+      c = input[(m = input.length - closed) - 1];
+      j = -1;
+      while (++j < m) {
+        d = input[j];
+        if (d3_geom_polygonInside(d, a, b)) {
+          if (!d3_geom_polygonInside(c, a, b)) {
+            subject.push(d3_geom_polygonIntersect(c, d, a, b));
+          }
+          subject.push(d);
+        } else if (d3_geom_polygonInside(c, a, b)) {
+          subject.push(d3_geom_polygonIntersect(c, d, a, b));
+        }
+        c = d;
+      }
+      if (closed) subject.push(subject[0]);
+      a = b;
+    }
+    return subject;
+  };
+  function d3_geom_polygonInside(p, a, b) {
+    return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);
+  }
+  function d3_geom_polygonIntersect(c, d, a, b) {
+    var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21);
+    return [ x1 + ua * x21, y1 + ua * y21 ];
+  }
+  function d3_geom_polygonClosed(coordinates) {
+    var a = coordinates[0], b = coordinates[coordinates.length - 1];
+    return !(a[0] - b[0] || a[1] - b[1]);
+  }
+  var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = [];
+  function d3_geom_voronoiBeach() {
+    d3_geom_voronoiRedBlackNode(this);
+    this.edge = this.site = this.circle = null;
+  }
+  function d3_geom_voronoiCreateBeach(site) {
+    var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach();
+    beach.site = site;
+    return beach;
+  }
+  function d3_geom_voronoiDetachBeach(beach) {
+    d3_geom_voronoiDetachCircle(beach);
+    d3_geom_voronoiBeaches.remove(beach);
+    d3_geom_voronoiBeachPool.push(beach);
+    d3_geom_voronoiRedBlackNode(beach);
+  }
+  function d3_geom_voronoiRemoveBeach(beach) {
+    var circle = beach.circle, x = circle.x, y = circle.cy, vertex = {
+      x: x,
+      y: y
+    }, previous = beach.P, next = beach.N, disappearing = [ beach ];
+    d3_geom_voronoiDetachBeach(beach);
+    var lArc = previous;
+    while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) {
+      previous = lArc.P;
+      disappearing.unshift(lArc);
+      d3_geom_voronoiDetachBeach(lArc);
+      lArc = previous;
+    }
+    disappearing.unshift(lArc);
+    d3_geom_voronoiDetachCircle(lArc);
+    var rArc = next;
+    while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) {
+      next = rArc.N;
+      disappearing.push(rArc);
+      d3_geom_voronoiDetachBeach(rArc);
+      rArc = next;
+    }
+    disappearing.push(rArc);
+    d3_geom_voronoiDetachCircle(rArc);
+    var nArcs = disappearing.length, iArc;
+    for (iArc = 1; iArc < nArcs; ++iArc) {
+      rArc = disappearing[iArc];
+      lArc = disappearing[iArc - 1];
+      d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
+    }
+    lArc = disappearing[0];
+    rArc = disappearing[nArcs - 1];
+    rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex);
+    d3_geom_voronoiAttachCircle(lArc);
+    d3_geom_voronoiAttachCircle(rArc);
+  }
+  function d3_geom_voronoiAddBeach(site) {
+    var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._;
+    while (node) {
+      dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x;
+      if (dxl > ε) node = node.L; else {
+        dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix);
+        if (dxr > ε) {
+          if (!node.R) {
+            lArc = node;
+            break;
+          }
+          node = node.R;
+        } else {
+          if (dxl > -ε) {
+            lArc = node.P;
+            rArc = node;
+          } else if (dxr > -ε) {
+            lArc = node;
+            rArc = node.N;
+          } else {
+            lArc = rArc = node;
+          }
+          break;
+        }
+      }
+    }
+    var newArc = d3_geom_voronoiCreateBeach(site);
+    d3_geom_voronoiBeaches.insert(lArc, newArc);
+    if (!lArc && !rArc) return;
+    if (lArc === rArc) {
+      d3_geom_voronoiDetachCircle(lArc);
+      rArc = d3_geom_voronoiCreateBeach(lArc.site);
+      d3_geom_voronoiBeaches.insert(newArc, rArc);
+      newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);
+      d3_geom_voronoiAttachCircle(lArc);
+      d3_geom_voronoiAttachCircle(rArc);
+      return;
+    }
+    if (!rArc) {
+      newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);
+      return;
+    }
+    d3_geom_voronoiDetachCircle(lArc);
+    d3_geom_voronoiDetachCircle(rArc);
+    var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = {
+      x: (cy * hb - by * hc) / d + ax,
+      y: (bx * hc - cx * hb) / d + ay
+    };
+    d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex);
+    newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex);
+    rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex);
+    d3_geom_voronoiAttachCircle(lArc);
+    d3_geom_voronoiAttachCircle(rArc);
+  }
+  function d3_geom_voronoiLeftBreakPoint(arc, directrix) {
+    var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix;
+    if (!pby2) return rfocx;
+    var lArc = arc.P;
+    if (!lArc) return -Infinity;
+    site = lArc.site;
+    var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix;
+    if (!plby2) return lfocx;
+    var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2;
+    if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
+    return (rfocx + lfocx) / 2;
+  }
+  function d3_geom_voronoiRightBreakPoint(arc, directrix) {
+    var rArc = arc.N;
+    if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix);
+    var site = arc.site;
+    return site.y === directrix ? site.x : Infinity;
+  }
+  function d3_geom_voronoiCell(site) {
+    this.site = site;
+    this.edges = [];
+  }
+  d3_geom_voronoiCell.prototype.prepare = function() {
+    var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge;
+    while (iHalfEdge--) {
+      edge = halfEdges[iHalfEdge].edge;
+      if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1);
+    }
+    halfEdges.sort(d3_geom_voronoiHalfEdgeOrder);
+    return halfEdges.length;
+  };
+  function d3_geom_voronoiCloseCells(extent) {
+    var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end;
+    while (iCell--) {
+      cell = cells[iCell];
+      if (!cell || !cell.prepare()) continue;
+      halfEdges = cell.edges;
+      nHalfEdges = halfEdges.length;
+      iHalfEdge = 0;
+      while (iHalfEdge < nHalfEdges) {
+        end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y;
+        start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y;
+        if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) {
+          halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? {
+            x: x0,
+            y: abs(x2 - x0) < ε ? y2 : y1
+          } : abs(y3 - y1) < ε && x1 - x3 > ε ? {
+            x: abs(y2 - y1) < ε ? x2 : x1,
+            y: y1
+          } : abs(x3 - x1) < ε && y3 - y0 > ε ? {
+            x: x1,
+            y: abs(x2 - x1) < ε ? y2 : y0
+          } : abs(y3 - y0) < ε && x3 - x0 > ε ? {
+            x: abs(y2 - y0) < ε ? x2 : x0,
+            y: y0
+          } : null), cell.site, null));
+          ++nHalfEdges;
+        }
+      }
+    }
+  }
+  function d3_geom_voronoiHalfEdgeOrder(a, b) {
+    return b.angle - a.angle;
+  }
+  function d3_geom_voronoiCircle() {
+    d3_geom_voronoiRedBlackNode(this);
+    this.x = this.y = this.arc = this.site = this.cy = null;
+  }
+  function d3_geom_voronoiAttachCircle(arc) {
+    var lArc = arc.P, rArc = arc.N;
+    if (!lArc || !rArc) return;
+    var lSite = lArc.site, cSite = arc.site, rSite = rArc.site;
+    if (lSite === rSite) return;
+    var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by;
+    var d = 2 * (ax * cy - ay * cx);
+    if (d >= -ε2) return;
+    var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by;
+    var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle();
+    circle.arc = arc;
+    circle.site = cSite;
+    circle.x = x + bx;
+    circle.y = cy + Math.sqrt(x * x + y * y);
+    circle.cy = cy;
+    arc.circle = circle;
+    var before = null, node = d3_geom_voronoiCircles._;
+    while (node) {
+      if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) {
+        if (node.L) node = node.L; else {
+          before = node.P;
+          break;
+        }
+      } else {
+        if (node.R) node = node.R; else {
+          before = node;
+          break;
+        }
+      }
+    }
+    d3_geom_voronoiCircles.insert(before, circle);
+    if (!before) d3_geom_voronoiFirstCircle = circle;
+  }
+  function d3_geom_voronoiDetachCircle(arc) {
+    var circle = arc.circle;
+    if (circle) {
+      if (!circle.P) d3_geom_voronoiFirstCircle = circle.N;
+      d3_geom_voronoiCircles.remove(circle);
+      d3_geom_voronoiCirclePool.push(circle);
+      d3_geom_voronoiRedBlackNode(circle);
+      arc.circle = null;
+    }
+  }
+  function d3_geom_voronoiClipEdges(extent) {
+    var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e;
+    while (i--) {
+      e = edges[i];
+      if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) {
+        e.a = e.b = null;
+        edges.splice(i, 1);
+      }
+    }
+  }
+  function d3_geom_voronoiConnectEdge(edge, extent) {
+    var vb = edge.b;
+    if (vb) return true;
+    var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb;
+    if (ry === ly) {
+      if (fx < x0 || fx >= x1) return;
+      if (lx > rx) {
+        if (!va) va = {
+          x: fx,
+          y: y0
+        }; else if (va.y >= y1) return;
+        vb = {
+          x: fx,
+          y: y1
+        };
+      } else {
+        if (!va) va = {
+          x: fx,
+          y: y1
+        }; else if (va.y < y0) return;
+        vb = {
+          x: fx,
+          y: y0
+        };
+      }
+    } else {
+      fm = (lx - rx) / (ry - ly);
+      fb = fy - fm * fx;
+      if (fm < -1 || fm > 1) {
+        if (lx > rx) {
+          if (!va) va = {
+            x: (y0 - fb) / fm,
+            y: y0
+          }; else if (va.y >= y1) return;
+          vb = {
+            x: (y1 - fb) / fm,
+            y: y1
+          };
+        } else {
+          if (!va) va = {
+            x: (y1 - fb) / fm,
+            y: y1
+          }; else if (va.y < y0) return;
+          vb = {
+            x: (y0 - fb) / fm,
+            y: y0
+          };
+        }
+      } else {
+        if (ly < ry) {
+          if (!va) va = {
+            x: x0,
+            y: fm * x0 + fb
+          }; else if (va.x >= x1) return;
+          vb = {
+            x: x1,
+            y: fm * x1 + fb
+          };
+        } else {
+          if (!va) va = {
+            x: x1,
+            y: fm * x1 + fb
+          }; else if (va.x < x0) return;
+          vb = {
+            x: x0,
+            y: fm * x0 + fb
+          };
+        }
+      }
+    }
+    edge.a = va;
+    edge.b = vb;
+    return true;
+  }
+  function d3_geom_voronoiEdge(lSite, rSite) {
+    this.l = lSite;
+    this.r = rSite;
+    this.a = this.b = null;
+  }
+  function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) {
+    var edge = new d3_geom_voronoiEdge(lSite, rSite);
+    d3_geom_voronoiEdges.push(edge);
+    if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va);
+    if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb);
+    d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite));
+    d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite));
+    return edge;
+  }
+  function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) {
+    var edge = new d3_geom_voronoiEdge(lSite, null);
+    edge.a = va;
+    edge.b = vb;
+    d3_geom_voronoiEdges.push(edge);
+    return edge;
+  }
+  function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) {
+    if (!edge.a && !edge.b) {
+      edge.a = vertex;
+      edge.l = lSite;
+      edge.r = rSite;
+    } else if (edge.l === rSite) {
+      edge.b = vertex;
+    } else {
+      edge.a = vertex;
+    }
+  }
+  function d3_geom_voronoiHalfEdge(edge, lSite, rSite) {
+    var va = edge.a, vb = edge.b;
+    this.edge = edge;
+    this.site = lSite;
+    this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y);
+  }
+  d3_geom_voronoiHalfEdge.prototype = {
+    start: function() {
+      return this.edge.l === this.site ? this.edge.a : this.edge.b;
+    },
+    end: function() {
+      return this.edge.l === this.site ? this.edge.b : this.edge.a;
+    }
+  };
+  function d3_geom_voronoiRedBlackTree() {
+    this._ = null;
+  }
+  function d3_geom_voronoiRedBlackNode(node) {
+    node.U = node.C = node.L = node.R = node.P = node.N = null;
+  }
+  d3_geom_voronoiRedBlackTree.prototype = {
+    insert: function(after, node) {
+      var parent, grandpa, uncle;
+      if (after) {
+        node.P = after;
+        node.N = after.N;
+        if (after.N) after.N.P = node;
+        after.N = node;
+        if (after.R) {
+          after = after.R;
+          while (after.L) after = after.L;
+          after.L = node;
+        } else {
+          after.R = node;
+        }
+        parent = after;
+      } else if (this._) {
+        after = d3_geom_voronoiRedBlackFirst(this._);
+        node.P = null;
+        node.N = after;
+        after.P = after.L = node;
+        parent = after;
+      } else {
+        node.P = node.N = null;
+        this._ = node;
+        parent = null;
+      }
+      node.L = node.R = null;
+      node.U = parent;
+      node.C = true;
+      after = node;
+      while (parent && parent.C) {
+        grandpa = parent.U;
+        if (parent === grandpa.L) {
+          uncle = grandpa.R;
+          if (uncle && uncle.C) {
+            parent.C = uncle.C = false;
+            grandpa.C = true;
+            after = grandpa;
+          } else {
+            if (after === parent.R) {
+              d3_geom_voronoiRedBlackRotateLeft(this, parent);
+              after = parent;
+              parent = after.U;
+            }
+            parent.C = false;
+            grandpa.C = true;
+            d3_geom_voronoiRedBlackRotateRight(this, grandpa);
+          }
+        } else {
+          uncle = grandpa.L;
+          if (uncle && uncle.C) {
+            parent.C = uncle.C = false;
+            grandpa.C = true;
+            after = grandpa;
+          } else {
+            if (after === parent.L) {
+              d3_geom_voronoiRedBlackRotateRight(this, parent);
+              after = parent;
+              parent = after.U;
+            }
+            parent.C = false;
+            grandpa.C = true;
+            d3_geom_voronoiRedBlackRotateLeft(this, grandpa);
+          }
+        }
+        parent = after.U;
+      }
+      this._.C = false;
+    },
+    remove: function(node) {
+      if (node.N) node.N.P = node.P;
+      if (node.P) node.P.N = node.N;
+      node.N = node.P = null;
+      var parent = node.U, sibling, left = node.L, right = node.R, next, red;
+      if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right);
+      if (parent) {
+        if (parent.L === node) parent.L = next; else parent.R = next;
+      } else {
+        this._ = next;
+      }
+      if (left && right) {
+        red = next.C;
+        next.C = node.C;
+        next.L = left;
+        left.U = next;
+        if (next !== right) {
+          parent = next.U;
+          next.U = node.U;
+          node = next.R;
+          parent.L = node;
+          next.R = right;
+          right.U = next;
+        } else {
+          next.U = parent;
+          parent = next;
+          node = next.R;
+        }
+      } else {
+        red = node.C;
+        node = next;
+      }
+      if (node) node.U = parent;
+      if (red) return;
+      if (node && node.C) {
+        node.C = false;
+        return;
+      }
+      do {
+        if (node === this._) break;
+        if (node === parent.L) {
+          sibling = parent.R;
+          if (sibling.C) {
+            sibling.C = false;
+            parent.C = true;
+            d3_geom_voronoiRedBlackRotateLeft(this, parent);
+            sibling = parent.R;
+          }
+          if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {
+            if (!sibling.R || !sibling.R.C) {
+              sibling.L.C = false;
+              sibling.C = true;
+              d3_geom_voronoiRedBlackRotateRight(this, sibling);
+              sibling = parent.R;
+            }
+            sibling.C = parent.C;
+            parent.C = sibling.R.C = false;
+            d3_geom_voronoiRedBlackRotateLeft(this, parent);
+            node = this._;
+            break;
+          }
+        } else {
+          sibling = parent.L;
+          if (sibling.C) {
+            sibling.C = false;
+            parent.C = true;
+            d3_geom_voronoiRedBlackRotateRight(this, parent);
+            sibling = parent.L;
+          }
+          if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {
+            if (!sibling.L || !sibling.L.C) {
+              sibling.R.C = false;
+              sibling.C = true;
+              d3_geom_voronoiRedBlackRotateLeft(this, sibling);
+              sibling = parent.L;
+            }
+            sibling.C = parent.C;
+            parent.C = sibling.L.C = false;
+            d3_geom_voronoiRedBlackRotateRight(this, parent);
+            node = this._;
+            break;
+          }
+        }
+        sibling.C = true;
+        node = parent;
+        parent = parent.U;
+      } while (!node.C);
+      if (node) node.C = false;
+    }
+  };
+  function d3_geom_voronoiRedBlackRotateLeft(tree, node) {
+    var p = node, q = node.R, parent = p.U;
+    if (parent) {
+      if (parent.L === p) parent.L = q; else parent.R = q;
+    } else {
+      tree._ = q;
+    }
+    q.U = parent;
+    p.U = q;
+    p.R = q.L;
+    if (p.R) p.R.U = p;
+    q.L = p;
+  }
+  function d3_geom_voronoiRedBlackRotateRight(tree, node) {
+    var p = node, q = node.L, parent = p.U;
+    if (parent) {
+      if (parent.L === p) parent.L = q; else parent.R = q;
+    } else {
+      tree._ = q;
+    }
+    q.U = parent;
+    p.U = q;
+    p.L = q.R;
+    if (p.L) p.L.U = p;
+    q.R = p;
+  }
+  function d3_geom_voronoiRedBlackFirst(node) {
+    while (node.L) node = node.L;
+    return node;
+  }
+  function d3_geom_voronoi(sites, bbox) {
+    var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle;
+    d3_geom_voronoiEdges = [];
+    d3_geom_voronoiCells = new Array(sites.length);
+    d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree();
+    d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree();
+    while (true) {
+      circle = d3_geom_voronoiFirstCircle;
+      if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) {
+        if (site.x !== x0 || site.y !== y0) {
+          d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site);
+          d3_geom_voronoiAddBeach(site);
+          x0 = site.x, y0 = site.y;
+        }
+        site = sites.pop();
+      } else if (circle) {
+        d3_geom_voronoiRemoveBeach(circle.arc);
+      } else {
+        break;
+      }
+    }
+    if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox);
+    var diagram = {
+      cells: d3_geom_voronoiCells,
+      edges: d3_geom_voronoiEdges
+    };
+    d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null;
+    return diagram;
+  }
+  function d3_geom_voronoiVertexOrder(a, b) {
+    return b.y - a.y || b.x - a.x;
+  }
+  d3.geom.voronoi = function(points) {
+    var x = d3_geom_pointX, y = d3_geom_pointY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent;
+    if (points) return voronoi(points);
+    function voronoi(data) {
+      var polygons = new Array(data.length), x0 = clipExtent[0][0], y0 = clipExtent[0][1], x1 = clipExtent[1][0], y1 = clipExtent[1][1];
+      d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) {
+        var edges = cell.edges, site = cell.site, polygon = polygons[i] = edges.length ? edges.map(function(e) {
+          var s = e.start();
+          return [ s.x, s.y ];
+        }) : site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [ [ x0, y1 ], [ x1, y1 ], [ x1, y0 ], [ x0, y0 ] ] : [];
+        polygon.point = data[i];
+      });
+      return polygons;
+    }
+    function sites(data) {
+      return data.map(function(d, i) {
+        return {
+          x: Math.round(fx(d, i) / ε) * ε,
+          y: Math.round(fy(d, i) / ε) * ε,
+          i: i
+        };
+      });
+    }
+    voronoi.links = function(data) {
+      return d3_geom_voronoi(sites(data)).edges.filter(function(edge) {
+        return edge.l && edge.r;
+      }).map(function(edge) {
+        return {
+          source: data[edge.l.i],
+          target: data[edge.r.i]
+        };
+      });
+    };
+    voronoi.triangles = function(data) {
+      var triangles = [];
+      d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) {
+        var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l;
+        while (++j < m) {
+          e0 = e1;
+          s0 = s1;
+          e1 = edges[j].edge;
+          s1 = e1.l === site ? e1.r : e1.l;
+          if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) {
+            triangles.push([ data[i], data[s0.i], data[s1.i] ]);
+          }
+        }
+      });
+      return triangles;
+    };
+    voronoi.x = function(_) {
+      return arguments.length ? (fx = d3_functor(x = _), voronoi) : x;
+    };
+    voronoi.y = function(_) {
+      return arguments.length ? (fy = d3_functor(y = _), voronoi) : y;
+    };
+    voronoi.clipExtent = function(_) {
+      if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent;
+      clipExtent = _ == null ? d3_geom_voronoiClipExtent : _;
+      return voronoi;
+    };
+    voronoi.size = function(_) {
+      if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1];
+      return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]);
+    };
+    return voronoi;
+  };
+  var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ];
+  function d3_geom_voronoiTriangleArea(a, b, c) {
+    return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y);
+  }
+  d3.geom.delaunay = function(vertices) {
+    return d3.geom.voronoi().triangles(vertices);
+  };
+  d3.geom.quadtree = function(points, x1, y1, x2, y2) {
+    var x = d3_geom_pointX, y = d3_geom_pointY, compat;
+    if (compat = arguments.length) {
+      x = d3_geom_quadtreeCompatX;
+      y = d3_geom_quadtreeCompatY;
+      if (compat === 3) {
+        y2 = y1;
+        x2 = x1;
+        y1 = x1 = 0;
+      }
+      return quadtree(points);
+    }
+    function quadtree(data) {
+      var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_;
+      if (x1 != null) {
+        x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2;
+      } else {
+        x2_ = y2_ = -(x1_ = y1_ = Infinity);
+        xs = [], ys = [];
+        n = data.length;
+        if (compat) for (i = 0; i < n; ++i) {
+          d = data[i];
+          if (d.x < x1_) x1_ = d.x;
+          if (d.y < y1_) y1_ = d.y;
+          if (d.x > x2_) x2_ = d.x;
+          if (d.y > y2_) y2_ = d.y;
+          xs.push(d.x);
+          ys.push(d.y);
+        } else for (i = 0; i < n; ++i) {
+          var x_ = +fx(d = data[i], i), y_ = +fy(d, i);
+          if (x_ < x1_) x1_ = x_;
+          if (y_ < y1_) y1_ = y_;
+          if (x_ > x2_) x2_ = x_;
+          if (y_ > y2_) y2_ = y_;
+          xs.push(x_);
+          ys.push(y_);
+        }
+      }
+      var dx = x2_ - x1_, dy = y2_ - y1_;
+      if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy;
+      function insert(n, d, x, y, x1, y1, x2, y2) {
+        if (isNaN(x) || isNaN(y)) return;
+        if (n.leaf) {
+          var nx = n.x, ny = n.y;
+          if (nx != null) {
+            if (abs(nx - x) + abs(ny - y) < .01) {
+              insertChild(n, d, x, y, x1, y1, x2, y2);
+            } else {
+              var nPoint = n.point;
+              n.x = n.y = n.point = null;
+              insertChild(n, nPoint, nx, ny, x1, y1, x2, y2);
+              insertChild(n, d, x, y, x1, y1, x2, y2);
+            }
+          } else {
+            n.x = x, n.y = y, n.point = d;
+          }
+        } else {
+          insertChild(n, d, x, y, x1, y1, x2, y2);
+        }
+      }
+      function insertChild(n, d, x, y, x1, y1, x2, y2) {
+        var xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym, i = below << 1 | right;
+        n.leaf = false;
+        n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode());
+        if (right) x1 = xm; else x2 = xm;
+        if (below) y1 = ym; else y2 = ym;
+        insert(n, d, x, y, x1, y1, x2, y2);
+      }
+      var root = d3_geom_quadtreeNode();
+      root.add = function(d) {
+        insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_);
+      };
+      root.visit = function(f) {
+        d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_);
+      };
+      root.find = function(point) {
+        return d3_geom_quadtreeFind(root, point[0], point[1], x1_, y1_, x2_, y2_);
+      };
+      i = -1;
+      if (x1 == null) {
+        while (++i < n) {
+          insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_);
+        }
+        --i;
+      } else data.forEach(root.add);
+      xs = ys = data = d = null;
+      return root;
+    }
+    quadtree.x = function(_) {
+      return arguments.length ? (x = _, quadtree) : x;
+    };
+    quadtree.y = function(_) {
+      return arguments.length ? (y = _, quadtree) : y;
+    };
+    quadtree.extent = function(_) {
+      if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ];
+      if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0], 
+      y2 = +_[1][1];
+      return quadtree;
+    };
+    quadtree.size = function(_) {
+      if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ];
+      if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1];
+      return quadtree;
+    };
+    return quadtree;
+  };
+  function d3_geom_quadtreeCompatX(d) {
+    return d.x;
+  }
+  function d3_geom_quadtreeCompatY(d) {
+    return d.y;
+  }
+  function d3_geom_quadtreeNode() {
+    return {
+      leaf: true,
+      nodes: [],
+      point: null,
+      x: null,
+      y: null
+    };
+  }
+  function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {
+    if (!f(node, x1, y1, x2, y2)) {
+      var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes;
+      if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy);
+      if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy);
+      if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2);
+      if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2);
+    }
+  }
+  function d3_geom_quadtreeFind(root, x, y, x0, y0, x3, y3) {
+    var minDistance2 = Infinity, closestPoint;
+    (function find(node, x1, y1, x2, y2) {
+      if (x1 > x3 || y1 > y3 || x2 < x0 || y2 < y0) return;
+      if (point = node.point) {
+        var point, dx = x - node.x, dy = y - node.y, distance2 = dx * dx + dy * dy;
+        if (distance2 < minDistance2) {
+          var distance = Math.sqrt(minDistance2 = distance2);
+          x0 = x - distance, y0 = y - distance;
+          x3 = x + distance, y3 = y + distance;
+          closestPoint = point;
+        }
+      }
+      var children = node.nodes, xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym;
+      for (var i = below << 1 | right, j = i + 4; i < j; ++i) {
+        if (node = children[i & 3]) switch (i & 3) {
+         case 0:
+          find(node, x1, y1, xm, ym);
+          break;
+
+         case 1:
+          find(node, xm, y1, x2, ym);
+          break;
+
+         case 2:
+          find(node, x1, ym, xm, y2);
+          break;
+
+         case 3:
+          find(node, xm, ym, x2, y2);
+          break;
+        }
+      }
+    })(root, x0, y0, x3, y3);
+    return closestPoint;
+  }
+  d3.interpolateRgb = d3_interpolateRgb;
+  function d3_interpolateRgb(a, b) {
+    a = d3.rgb(a);
+    b = d3.rgb(b);
+    var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab;
+    return function(t) {
+      return "#" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t));
+    };
+  }
+  d3.interpolateObject = d3_interpolateObject;
+  function d3_interpolateObject(a, b) {
+    var i = {}, c = {}, k;
+    for (k in a) {
+      if (k in b) {
+        i[k] = d3_interpolate(a[k], b[k]);
+      } else {
+        c[k] = a[k];
+      }
+    }
+    for (k in b) {
+      if (!(k in a)) {
+        c[k] = b[k];
+      }
+    }
+    return function(t) {
+      for (k in i) c[k] = i[k](t);
+      return c;
+    };
+  }
+  d3.interpolateNumber = d3_interpolateNumber;
+  function d3_interpolateNumber(a, b) {
+    a = +a, b = +b;
+    return function(t) {
+      return a * (1 - t) + b * t;
+    };
+  }
+  d3.interpolateString = d3_interpolateString;
+  function d3_interpolateString(a, b) {
+    var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = [];
+    a = a + "", b = b + "";
+    while ((am = d3_interpolate_numberA.exec(a)) && (bm = d3_interpolate_numberB.exec(b))) {
+      if ((bs = bm.index) > bi) {
+        bs = b.slice(bi, bs);
+        if (s[i]) s[i] += bs; else s[++i] = bs;
+      }
+      if ((am = am[0]) === (bm = bm[0])) {
+        if (s[i]) s[i] += bm; else s[++i] = bm;
+      } else {
+        s[++i] = null;
+        q.push({
+          i: i,
+          x: d3_interpolateNumber(am, bm)
+        });
+      }
+      bi = d3_interpolate_numberB.lastIndex;
+    }
+    if (bi < b.length) {
+      bs = b.slice(bi);
+      if (s[i]) s[i] += bs; else s[++i] = bs;
+    }
+    return s.length < 2 ? q[0] ? (b = q[0].x, function(t) {
+      return b(t) + "";
+    }) : function() {
+      return b;
+    } : (b = q.length, function(t) {
+      for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
+      return s.join("");
+    });
+  }
+  var d3_interpolate_numberA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, "g");
+  d3.interpolate = d3_interpolate;
+  function d3_interpolate(a, b) {
+    var i = d3.interpolators.length, f;
+    while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ;
+    return f;
+  }
+  d3.interpolators = [ function(a, b) {
+    var t = typeof b;
+    return (t === "string" ? d3_rgb_names.has(b.toLowerCase()) || /^(#|rgb\(|hsl\()/i.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_color ? d3_interpolateRgb : Array.isArray(b) ? d3_interpolateArray : t === "object" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b);
+  } ];
+  d3.interpolateArray = d3_interpolateArray;
+  function d3_interpolateArray(a, b) {
+    var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i;
+    for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i]));
+    for (;i < na; ++i) c[i] = a[i];
+    for (;i < nb; ++i) c[i] = b[i];
+    return function(t) {
+      for (i = 0; i < n0; ++i) c[i] = x[i](t);
+      return c;
+    };
+  }
+  var d3_ease_default = function() {
+    return d3_identity;
+  };
+  var d3_ease = d3.map({
+    linear: d3_ease_default,
+    poly: d3_ease_poly,
+    quad: function() {
+      return d3_ease_quad;
+    },
+    cubic: function() {
+      return d3_ease_cubic;
+    },
+    sin: function() {
+      return d3_ease_sin;
+    },
+    exp: function() {
+      return d3_ease_exp;
+    },
+    circle: function() {
+      return d3_ease_circle;
+    },
+    elastic: d3_ease_elastic,
+    back: d3_ease_back,
+    bounce: function() {
+      return d3_ease_bounce;
+    }
+  });
+  var d3_ease_mode = d3.map({
+    "in": d3_identity,
+    out: d3_ease_reverse,
+    "in-out": d3_ease_reflect,
+    "out-in": function(f) {
+      return d3_ease_reflect(d3_ease_reverse(f));
+    }
+  });
+  d3.ease = function(name) {
+    var i = name.indexOf("-"), t = i >= 0 ? name.slice(0, i) : name, m = i >= 0 ? name.slice(i + 1) : "in";
+    t = d3_ease.get(t) || d3_ease_default;
+    m = d3_ease_mode.get(m) || d3_identity;
+    return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1))));
+  };
+  function d3_ease_clamp(f) {
+    return function(t) {
+      return t <= 0 ? 0 : t >= 1 ? 1 : f(t);
+    };
+  }
+  function d3_ease_reverse(f) {
+    return function(t) {
+      return 1 - f(1 - t);
+    };
+  }
+  function d3_ease_reflect(f) {
+    return function(t) {
+      return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t));
+    };
+  }
+  function d3_ease_quad(t) {
+    return t * t;
+  }
+  function d3_ease_cubic(t) {
+    return t * t * t;
+  }
+  function d3_ease_cubicInOut(t) {
+    if (t <= 0) return 0;
+    if (t >= 1) return 1;
+    var t2 = t * t, t3 = t2 * t;
+    return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);
+  }
+  function d3_ease_poly(e) {
+    return function(t) {
+      return Math.pow(t, e);
+    };
+  }
+  function d3_ease_sin(t) {
+    return 1 - Math.cos(t * halfπ);
+  }
+  function d3_ease_exp(t) {
+    return Math.pow(2, 10 * (t - 1));
+  }
+  function d3_ease_circle(t) {
+    return 1 - Math.sqrt(1 - t * t);
+  }
+  function d3_ease_elastic(a, p) {
+    var s;
+    if (arguments.length < 2) p = .45;
+    if (arguments.length) s = p / τ * Math.asin(1 / a); else a = 1, s = p / 4;
+    return function(t) {
+      return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p);
+    };
+  }
+  function d3_ease_back(s) {
+    if (!s) s = 1.70158;
+    return function(t) {
+      return t * t * ((s + 1) * t - s);
+    };
+  }
+  function d3_ease_bounce(t) {
+    return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;
+  }
+  d3.interpolateHcl = d3_interpolateHcl;
+  function d3_interpolateHcl(a, b) {
+    a = d3.hcl(a);
+    b = d3.hcl(b);
+    var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al;
+    if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac;
+    if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;
+    return function(t) {
+      return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + "";
+    };
+  }
+  d3.interpolateHsl = d3_interpolateHsl;
+  function d3_interpolateHsl(a, b) {
+    a = d3.hsl(a);
+    b = d3.hsl(b);
+    var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al;
+    if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as;
+    if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;
+    return function(t) {
+      return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + "";
+    };
+  }
+  d3.interpolateLab = d3_interpolateLab;
+  function d3_interpolateLab(a, b) {
+    a = d3.lab(a);
+    b = d3.lab(b);
+    var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab;
+    return function(t) {
+      return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + "";
+    };
+  }
+  d3.interpolateRound = d3_interpolateRound;
+  function d3_interpolateRound(a, b) {
+    b -= a;
+    return function(t) {
+      return Math.round(a + b * t);
+    };
+  }
+  d3.transform = function(string) {
+    var g = d3_document.createElementNS(d3.ns.prefix.svg, "g");
+    return (d3.transform = function(string) {
+      if (string != null) {
+        g.setAttribute("transform", string);
+        var t = g.transform.baseVal.consolidate();
+      }
+      return new d3_transform(t ? t.matrix : d3_transformIdentity);
+    })(string);
+  };
+  function d3_transform(m) {
+    var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;
+    if (r0[0] * r1[1] < r1[0] * r0[1]) {
+      r0[0] *= -1;
+      r0[1] *= -1;
+      kx *= -1;
+      kz *= -1;
+    }
+    this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees;
+    this.translate = [ m.e, m.f ];
+    this.scale = [ kx, ky ];
+    this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0;
+  }
+  d3_transform.prototype.toString = function() {
+    return "translate(" + this.translate + ")rotate(" + this.rotate + ")skewX(" + this.skew + ")scale(" + this.scale + ")";
+  };
+  function d3_transformDot(a, b) {
+    return a[0] * b[0] + a[1] * b[1];
+  }
+  function d3_transformNormalize(a) {
+    var k = Math.sqrt(d3_transformDot(a, a));
+    if (k) {
+      a[0] /= k;
+      a[1] /= k;
+    }
+    return k;
+  }
+  function d3_transformCombine(a, b, k) {
+    a[0] += k * b[0];
+    a[1] += k * b[1];
+    return a;
+  }
+  var d3_transformIdentity = {
+    a: 1,
+    b: 0,
+    c: 0,
+    d: 1,
+    e: 0,
+    f: 0
+  };
+  d3.interpolateTransform = d3_interpolateTransform;
+  function d3_interpolateTransformPop(s) {
+    return s.length ? s.pop() + "," : "";
+  }
+  function d3_interpolateTranslate(ta, tb, s, q) {
+    if (ta[0] !== tb[0] || ta[1] !== tb[1]) {
+      var i = s.push("translate(", null, ",", null, ")");
+      q.push({
+        i: i - 4,
+        x: d3_interpolateNumber(ta[0], tb[0])
+      }, {
+        i: i - 2,
+        x: d3_interpolateNumber(ta[1], tb[1])
+      });
+    } else if (tb[0] || tb[1]) {
+      s.push("translate(" + tb + ")");
+    }
+  }
+  function d3_interpolateRotate(ra, rb, s, q) {
+    if (ra !== rb) {
+      if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360;
+      q.push({
+        i: s.push(d3_interpolateTransformPop(s) + "rotate(", null, ")") - 2,
+        x: d3_interpolateNumber(ra, rb)
+      });
+    } else if (rb) {
+      s.push(d3_interpolateTransformPop(s) + "rotate(" + rb + ")");
+    }
+  }
+  function d3_interpolateSkew(wa, wb, s, q) {
+    if (wa !== wb) {
+      q.push({
+        i: s.push(d3_interpolateTransformPop(s) + "skewX(", null, ")") - 2,
+        x: d3_interpolateNumber(wa, wb)
+      });
+    } else if (wb) {
+      s.push(d3_interpolateTransformPop(s) + "skewX(" + wb + ")");
+    }
+  }
+  function d3_interpolateScale(ka, kb, s, q) {
+    if (ka[0] !== kb[0] || ka[1] !== kb[1]) {
+      var i = s.push(d3_interpolateTransformPop(s) + "scale(", null, ",", null, ")");
+      q.push({
+        i: i - 4,
+        x: d3_interpolateNumber(ka[0], kb[0])
+      }, {
+        i: i - 2,
+        x: d3_interpolateNumber(ka[1], kb[1])
+      });
+    } else if (kb[0] !== 1 || kb[1] !== 1) {
+      s.push(d3_interpolateTransformPop(s) + "scale(" + kb + ")");
+    }
+  }
+  function d3_interpolateTransform(a, b) {
+    var s = [], q = [];
+    a = d3.transform(a), b = d3.transform(b);
+    d3_interpolateTranslate(a.translate, b.translate, s, q);
+    d3_interpolateRotate(a.rotate, b.rotate, s, q);
+    d3_interpolateSkew(a.skew, b.skew, s, q);
+    d3_interpolateScale(a.scale, b.scale, s, q);
+    a = b = null;
+    return function(t) {
+      var i = -1, n = q.length, o;
+      while (++i < n) s[(o = q[i]).i] = o.x(t);
+      return s.join("");
+    };
+  }
+  function d3_uninterpolateNumber(a, b) {
+    b = (b -= a = +a) || 1 / b;
+    return function(x) {
+      return (x - a) / b;
+    };
+  }
+  function d3_uninterpolateClamp(a, b) {
+    b = (b -= a = +a) || 1 / b;
+    return function(x) {
+      return Math.max(0, Math.min(1, (x - a) / b));
+    };
+  }
+  d3.layout = {};
+  d3.layout.bundle = function() {
+    return function(links) {
+      var paths = [], i = -1, n = links.length;
+      while (++i < n) paths.push(d3_layout_bundlePath(links[i]));
+      return paths;
+    };
+  };
+  function d3_layout_bundlePath(link) {
+    var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ];
+    while (start !== lca) {
+      start = start.parent;
+      points.push(start);
+    }
+    var k = points.length;
+    while (end !== lca) {
+      points.splice(k, 0, end);
+      end = end.parent;
+    }
+    return points;
+  }
+  function d3_layout_bundleAncestors(node) {
+    var ancestors = [], parent = node.parent;
+    while (parent != null) {
+      ancestors.push(node);
+      node = parent;
+      parent = parent.parent;
+    }
+    ancestors.push(node);
+    return ancestors;
+  }
+  function d3_layout_bundleLeastCommonAncestor(a, b) {
+    if (a === b) return a;
+    var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null;
+    while (aNode === bNode) {
+      sharedNode = aNode;
+      aNode = aNodes.pop();
+      bNode = bNodes.pop();
+    }
+    return sharedNode;
+  }
+  d3.layout.chord = function() {
+    var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords;
+    function relayout() {
+      var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j;
+      chords = [];
+      groups = [];
+      k = 0, i = -1;
+      while (++i < n) {
+        x = 0, j = -1;
+        while (++j < n) {
+          x += matrix[i][j];
+        }
+        groupSums.push(x);
+        subgroupIndex.push(d3.range(n));
+        k += x;
+      }
+      if (sortGroups) {
+        groupIndex.sort(function(a, b) {
+          return sortGroups(groupSums[a], groupSums[b]);
+        });
+      }
+      if (sortSubgroups) {
+        subgroupIndex.forEach(function(d, i) {
+          d.sort(function(a, b) {
+            return sortSubgroups(matrix[i][a], matrix[i][b]);
+          });
+        });
+      }
+      k = (τ - padding * n) / k;
+      x = 0, i = -1;
+      while (++i < n) {
+        x0 = x, j = -1;
+        while (++j < n) {
+          var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k;
+          subgroups[di + "-" + dj] = {
+            index: di,
+            subindex: dj,
+            startAngle: a0,
+            endAngle: a1,
+            value: v
+          };
+        }
+        groups[di] = {
+          index: di,
+          startAngle: x0,
+          endAngle: x,
+          value: groupSums[di]
+        };
+        x += padding;
+      }
+      i = -1;
+      while (++i < n) {
+        j = i - 1;
+        while (++j < n) {
+          var source = subgroups[i + "-" + j], target = subgroups[j + "-" + i];
+          if (source.value || target.value) {
+            chords.push(source.value < target.value ? {
+              source: target,
+              target: source
+            } : {
+              source: source,
+              target: target
+            });
+          }
+        }
+      }
+      if (sortChords) resort();
+    }
+    function resort() {
+      chords.sort(function(a, b) {
+        return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2);
+      });
+    }
+    chord.matrix = function(x) {
+      if (!arguments.length) return matrix;
+      n = (matrix = x) && matrix.length;
+      chords = groups = null;
+      return chord;
+    };
+    chord.padding = function(x) {
+      if (!arguments.length) return padding;
+      padding = x;
+      chords = groups = null;
+      return chord;
+    };
+    chord.sortGroups = function(x) {
+      if (!arguments.length) return sortGroups;
+      sortGroups = x;
+      chords = groups = null;
+      return chord;
+    };
+    chord.sortSubgroups = function(x) {
+      if (!arguments.length) return sortSubgroups;
+      sortSubgroups = x;
+      chords = null;
+      return chord;
+    };
+    chord.sortChords = function(x) {
+      if (!arguments.length) return sortChords;
+      sortChords = x;
+      if (chords) resort();
+      return chord;
+    };
+    chord.chords = function() {
+      if (!chords) relayout();
+      return chords;
+    };
+    chord.groups = function() {
+      if (!groups) relayout();
+      return groups;
+    };
+    return chord;
+  };
+  d3.layout.force = function() {
+    var force = {}, event = d3.dispatch("start", "tick", "end"), timer, size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, chargeDistance2 = d3_layout_forceChargeDistance2, gravity = .1, theta2 = .64, nodes = [], links = [], distances, strengths, charges;
+    function repulse(node) {
+      return function(quad, x1, _, x2) {
+        if (quad.point !== node) {
+          var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy;
+          if (dw * dw / theta2 < dn) {
+            if (dn < chargeDistance2) {
+              var k = quad.charge / dn;
+              node.px -= dx * k;
+              node.py -= dy * k;
+            }
+            return true;
+          }
+          if (quad.point && dn && dn < chargeDistance2) {
+            var k = quad.pointCharge / dn;
+            node.px -= dx * k;
+            node.py -= dy * k;
+          }
+        }
+        return !quad.charge;
+      };
+    }
+    force.tick = function() {
+      if ((alpha *= .99) < .005) {
+        timer = null;
+        event.end({
+          type: "end",
+          alpha: alpha = 0
+        });
+        return true;
+      }
+      var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y;
+      for (i = 0; i < m; ++i) {
+        o = links[i];
+        s = o.source;
+        t = o.target;
+        x = t.x - s.x;
+        y = t.y - s.y;
+        if (l = x * x + y * y) {
+          l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;
+          x *= l;
+          y *= l;
+          t.x -= x * (k = s.weight + t.weight ? s.weight / (s.weight + t.weight) : .5);
+          t.y -= y * k;
+          s.x += x * (k = 1 - k);
+          s.y += y * k;
+        }
+      }
+      if (k = alpha * gravity) {
+        x = size[0] / 2;
+        y = size[1] / 2;
+        i = -1;
+        if (k) while (++i < n) {
+          o = nodes[i];
+          o.x += (x - o.x) * k;
+          o.y += (y - o.y) * k;
+        }
+      }
+      if (charge) {
+        d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);
+        i = -1;
+        while (++i < n) {
+          if (!(o = nodes[i]).fixed) {
+            q.visit(repulse(o));
+          }
+        }
+      }
+      i = -1;
+      while (++i < n) {
+        o = nodes[i];
+        if (o.fixed) {
+          o.x = o.px;
+          o.y = o.py;
+        } else {
+          o.x -= (o.px - (o.px = o.x)) * friction;
+          o.y -= (o.py - (o.py = o.y)) * friction;
+        }
+      }
+      event.tick({
+        type: "tick",
+        alpha: alpha
+      });
+    };
+    force.nodes = function(x) {
+      if (!arguments.length) return nodes;
+      nodes = x;
+      return force;
+    };
+    force.links = function(x) {
+      if (!arguments.length) return links;
+      links = x;
+      return force;
+    };
+    force.size = function(x) {
+      if (!arguments.length) return size;
+      size = x;
+      return force;
+    };
+    force.linkDistance = function(x) {
+      if (!arguments.length) return linkDistance;
+      linkDistance = typeof x === "function" ? x : +x;
+      return force;
+    };
+    force.distance = force.linkDistance;
+    force.linkStrength = function(x) {
+      if (!arguments.length) return linkStrength;
+      linkStrength = typeof x === "function" ? x : +x;
+      return force;
+    };
+    force.friction = function(x) {
+      if (!arguments.length) return friction;
+      friction = +x;
+      return force;
+    };
+    force.charge = function(x) {
+      if (!arguments.length) return charge;
+      charge = typeof x === "function" ? x : +x;
+      return force;
+    };
+    force.chargeDistance = function(x) {
+      if (!arguments.length) return Math.sqrt(chargeDistance2);
+      chargeDistance2 = x * x;
+      return force;
+    };
+    force.gravity = function(x) {
+      if (!arguments.length) return gravity;
+      gravity = +x;
+      return force;
+    };
+    force.theta = function(x) {
+      if (!arguments.length) return Math.sqrt(theta2);
+      theta2 = x * x;
+      return force;
+    };
+    force.alpha = function(x) {
+      if (!arguments.length) return alpha;
+      x = +x;
+      if (alpha) {
+        if (x > 0) {
+          alpha = x;
+        } else {
+          timer.c = null, timer.t = NaN, timer = null;
+          event.end({
+            type: "end",
+            alpha: alpha = 0
+          });
+        }
+      } else if (x > 0) {
+        event.start({
+          type: "start",
+          alpha: alpha = x
+        });
+        timer = d3_timer(force.tick);
+      }
+      return force;
+    };
+    force.start = function() {
+      var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o;
+      for (i = 0; i < n; ++i) {
+        (o = nodes[i]).index = i;
+        o.weight = 0;
+      }
+      for (i = 0; i < m; ++i) {
+        o = links[i];
+        if (typeof o.source == "number") o.source = nodes[o.source];
+        if (typeof o.target == "number") o.target = nodes[o.target];
+        ++o.source.weight;
+        ++o.target.weight;
+      }
+      for (i = 0; i < n; ++i) {
+        o = nodes[i];
+        if (isNaN(o.x)) o.x = position("x", w);
+        if (isNaN(o.y)) o.y = position("y", h);
+        if (isNaN(o.px)) o.px = o.x;
+        if (isNaN(o.py)) o.py = o.y;
+      }
+      distances = [];
+      if (typeof linkDistance === "function") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance;
+      strengths = [];
+      if (typeof linkStrength === "function") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength;
+      charges = [];
+      if (typeof charge === "function") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge;
+      function position(dimension, size) {
+        if (!neighbors) {
+          neighbors = new Array(n);
+          for (j = 0; j < n; ++j) {
+            neighbors[j] = [];
+          }
+          for (j = 0; j < m; ++j) {
+            var o = links[j];
+            neighbors[o.source.index].push(o.target);
+            neighbors[o.target.index].push(o.source);
+          }
+        }
+        var candidates = neighbors[i], j = -1, l = candidates.length, x;
+        while (++j < l) if (!isNaN(x = candidates[j][dimension])) return x;
+        return Math.random() * size;
+      }
+      return force.resume();
+    };
+    force.resume = function() {
+      return force.alpha(.1);
+    };
+    force.stop = function() {
+      return force.alpha(0);
+    };
+    force.drag = function() {
+      if (!drag) drag = d3.behavior.drag().origin(d3_identity).on("dragstart.force", d3_layout_forceDragstart).on("drag.force", dragmove).on("dragend.force", d3_layout_forceDragend);
+      if (!arguments.length) return drag;
+      this.on("mouseover.force", d3_layout_forceMouseover).on("mouseout.force", d3_layout_forceMouseout).call(drag);
+    };
+    function dragmove(d) {
+      d.px = d3.event.x, d.py = d3.event.y;
+      force.resume();
+    }
+    return d3.rebind(force, event, "on");
+  };
+  function d3_layout_forceDragstart(d) {
+    d.fixed |= 2;
+  }
+  function d3_layout_forceDragend(d) {
+    d.fixed &= ~6;
+  }
+  function d3_layout_forceMouseover(d) {
+    d.fixed |= 4;
+    d.px = d.x, d.py = d.y;
+  }
+  function d3_layout_forceMouseout(d) {
+    d.fixed &= ~4;
+  }
+  function d3_layout_forceAccumulate(quad, alpha, charges) {
+    var cx = 0, cy = 0;
+    quad.charge = 0;
+    if (!quad.leaf) {
+      var nodes = quad.nodes, n = nodes.length, i = -1, c;
+      while (++i < n) {
+        c = nodes[i];
+        if (c == null) continue;
+        d3_layout_forceAccumulate(c, alpha, charges);
+        quad.charge += c.charge;
+        cx += c.charge * c.cx;
+        cy += c.charge * c.cy;
+      }
+    }
+    if (quad.point) {
+      if (!quad.leaf) {
+        quad.point.x += Math.random() - .5;
+        quad.point.y += Math.random() - .5;
+      }
+      var k = alpha * charges[quad.point.index];
+      quad.charge += quad.pointCharge = k;
+      cx += k * quad.point.x;
+      cy += k * quad.point.y;
+    }
+    quad.cx = cx / quad.charge;
+    quad.cy = cy / quad.charge;
+  }
+  var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity;
+  d3.layout.hierarchy = function() {
+    var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;
+    function hierarchy(root) {
+      var stack = [ root ], nodes = [], node;
+      root.depth = 0;
+      while ((node = stack.pop()) != null) {
+        nodes.push(node);
+        if ((childs = children.call(hierarchy, node, node.depth)) && (n = childs.length)) {
+          var n, childs, child;
+          while (--n >= 0) {
+            stack.push(child = childs[n]);
+            child.parent = node;
+            child.depth = node.depth + 1;
+          }
+          if (value) node.value = 0;
+          node.children = childs;
+        } else {
+          if (value) node.value = +value.call(hierarchy, node, node.depth) || 0;
+          delete node.children;
+        }
+      }
+      d3_layout_hierarchyVisitAfter(root, function(node) {
+        var childs, parent;
+        if (sort && (childs = node.children)) childs.sort(sort);
+        if (value && (parent = node.parent)) parent.value += node.value;
+      });
+      return nodes;
+    }
+    hierarchy.sort = function(x) {
+      if (!arguments.length) return sort;
+      sort = x;
+      return hierarchy;
+    };
+    hierarchy.children = function(x) {
+      if (!arguments.length) return children;
+      children = x;
+      return hierarchy;
+    };
+    hierarchy.value = function(x) {
+      if (!arguments.length) return value;
+      value = x;
+      return hierarchy;
+    };
+    hierarchy.revalue = function(root) {
+      if (value) {
+        d3_layout_hierarchyVisitBefore(root, function(node) {
+          if (node.children) node.value = 0;
+        });
+        d3_layout_hierarchyVisitAfter(root, function(node) {
+          var parent;
+          if (!node.children) node.value = +value.call(hierarchy, node, node.depth) || 0;
+          if (parent = node.parent) parent.value += node.value;
+        });
+      }
+      return root;
+    };
+    return hierarchy;
+  };
+  function d3_layout_hierarchyRebind(object, hierarchy) {
+    d3.rebind(object, hierarchy, "sort", "children", "value");
+    object.nodes = object;
+    object.links = d3_layout_hierarchyLinks;
+    return object;
+  }
+  function d3_layout_hierarchyVisitBefore(node, callback) {
+    var nodes = [ node ];
+    while ((node = nodes.pop()) != null) {
+      callback(node);
+      if ((children = node.children) && (n = children.length)) {
+        var n, children;
+        while (--n >= 0) nodes.push(children[n]);
+      }
+    }
+  }
+  function d3_layout_hierarchyVisitAfter(node, callback) {
+    var nodes = [ node ], nodes2 = [];
+    while ((node = nodes.pop()) != null) {
+      nodes2.push(node);
+      if ((children = node.children) && (n = children.length)) {
+        var i = -1, n, children;
+        while (++i < n) nodes.push(children[i]);
+      }
+    }
+    while ((node = nodes2.pop()) != null) {
+      callback(node);
+    }
+  }
+  function d3_layout_hierarchyChildren(d) {
+    return d.children;
+  }
+  function d3_layout_hierarchyValue(d) {
+    return d.value;
+  }
+  function d3_layout_hierarchySort(a, b) {
+    return b.value - a.value;
+  }
+  function d3_layout_hierarchyLinks(nodes) {
+    return d3.merge(nodes.map(function(parent) {
+      return (parent.children || []).map(function(child) {
+        return {
+          source: parent,
+          target: child
+        };
+      });
+    }));
+  }
+  d3.layout.partition = function() {
+    var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ];
+    function position(node, x, dx, dy) {
+      var children = node.children;
+      node.x = x;
+      node.y = node.depth * dy;
+      node.dx = dx;
+      node.dy = dy;
+      if (children && (n = children.length)) {
+        var i = -1, n, c, d;
+        dx = node.value ? dx / node.value : 0;
+        while (++i < n) {
+          position(c = children[i], x, d = c.value * dx, dy);
+          x += d;
+        }
+      }
+    }
+    function depth(node) {
+      var children = node.children, d = 0;
+      if (children && (n = children.length)) {
+        var i = -1, n;
+        while (++i < n) d = Math.max(d, depth(children[i]));
+      }
+      return 1 + d;
+    }
+    function partition(d, i) {
+      var nodes = hierarchy.call(this, d, i);
+      position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));
+      return nodes;
+    }
+    partition.size = function(x) {
+      if (!arguments.length) return size;
+      size = x;
+      return partition;
+    };
+    return d3_layout_hierarchyRebind(partition, hierarchy);
+  };
+  d3.layout.pie = function() {
+    var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = τ, padAngle = 0;
+    function pie(data) {
+      var n = data.length, values = data.map(function(d, i) {
+        return +value.call(pie, d, i);
+      }), a = +(typeof startAngle === "function" ? startAngle.apply(this, arguments) : startAngle), da = (typeof endAngle === "function" ? endAngle.apply(this, arguments) : endAngle) - a, p = Math.min(Math.abs(da) / n, +(typeof padAngle === "function" ? padAngle.apply(this, arguments) : padAngle)), pa = p * (da < 0 ? -1 : 1), sum = d3.sum(values), k = sum ? (da - n * pa) / sum : 0, index = d3.range(n), arcs = [], v;
+      if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) {
+        return values[j] - values[i];
+      } : function(i, j) {
+        return sort(data[i], data[j]);
+      });
+      index.forEach(function(i) {
+        arcs[i] = {
+          data: data[i],
+          value: v = values[i],
+          startAngle: a,
+          endAngle: a += v * k + pa,
+          padAngle: p
+        };
+      });
+      return arcs;
+    }
+    pie.value = function(_) {
+      if (!arguments.length) return value;
+      value = _;
+      return pie;
+    };
+    pie.sort = function(_) {
+      if (!arguments.length) return sort;
+      sort = _;
+      return pie;
+    };
+    pie.startAngle = function(_) {
+      if (!arguments.length) return startAngle;
+      startAngle = _;
+      return pie;
+    };
+    pie.endAngle = function(_) {
+      if (!arguments.length) return endAngle;
+      endAngle = _;
+      return pie;
+    };
+    pie.padAngle = function(_) {
+      if (!arguments.length) return padAngle;
+      padAngle = _;
+      return pie;
+    };
+    return pie;
+  };
+  var d3_layout_pieSortByValue = {};
+  d3.layout.stack = function() {
+    var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY;
+    function stack(data, index) {
+      if (!(n = data.length)) return data;
+      var series = data.map(function(d, i) {
+        return values.call(stack, d, i);
+      });
+      var points = series.map(function(d) {
+        return d.map(function(v, i) {
+          return [ x.call(stack, v, i), y.call(stack, v, i) ];
+        });
+      });
+      var orders = order.call(stack, points, index);
+      series = d3.permute(series, orders);
+      points = d3.permute(points, orders);
+      var offsets = offset.call(stack, points, index);
+      var m = series[0].length, n, i, j, o;
+      for (j = 0; j < m; ++j) {
+        out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);
+        for (i = 1; i < n; ++i) {
+          out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);
+        }
+      }
+      return data;
+    }
+    stack.values = function(x) {
+      if (!arguments.length) return values;
+      values = x;
+      return stack;
+    };
+    stack.order = function(x) {
+      if (!arguments.length) return order;
+      order = typeof x === "function" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault;
+      return stack;
+    };
+    stack.offset = function(x) {
+      if (!arguments.length) return offset;
+      offset = typeof x === "function" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero;
+      return stack;
+    };
+    stack.x = function(z) {
+      if (!arguments.length) return x;
+      x = z;
+      return stack;
+    };
+    stack.y = function(z) {
+      if (!arguments.length) return y;
+      y = z;
+      return stack;
+    };
+    stack.out = function(z) {
+      if (!arguments.length) return out;
+      out = z;
+      return stack;
+    };
+    return stack;
+  };
+  function d3_layout_stackX(d) {
+    return d.x;
+  }
+  function d3_layout_stackY(d) {
+    return d.y;
+  }
+  function d3_layout_stackOut(d, y0, y) {
+    d.y0 = y0;
+    d.y = y;
+  }
+  var d3_layout_stackOrders = d3.map({
+    "inside-out": function(data) {
+      var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) {
+        return max[a] - max[b];
+      }), top = 0, bottom = 0, tops = [], bottoms = [];
+      for (i = 0; i < n; ++i) {
+        j = index[i];
+        if (top < bottom) {
+          top += sums[j];
+          tops.push(j);
+        } else {
+          bottom += sums[j];
+          bottoms.push(j);
+        }
+      }
+      return bottoms.reverse().concat(tops);
+    },
+    reverse: function(data) {
+      return d3.range(data.length).reverse();
+    },
+    "default": d3_layout_stackOrderDefault
+  });
+  var d3_layout_stackOffsets = d3.map({
+    silhouette: function(data) {
+      var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = [];
+      for (j = 0; j < m; ++j) {
+        for (i = 0, o = 0; i < n; i++) o += data[i][j][1];
+        if (o > max) max = o;
+        sums.push(o);
+      }
+      for (j = 0; j < m; ++j) {
+        y0[j] = (max - sums[j]) / 2;
+      }
+      return y0;
+    },
+    wiggle: function(data) {
+      var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = [];
+      y0[0] = o = o0 = 0;
+      for (j = 1; j < m; ++j) {
+        for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];
+        for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {
+          for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {
+            s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;
+          }
+          s2 += s3 * data[i][j][1];
+        }
+        y0[j] = o -= s1 ? s2 / s1 * dx : 0;
+        if (o < o0) o0 = o;
+      }
+      for (j = 0; j < m; ++j) y0[j] -= o0;
+      return y0;
+    },
+    expand: function(data) {
+      var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = [];
+      for (j = 0; j < m; ++j) {
+        for (i = 0, o = 0; i < n; i++) o += data[i][j][1];
+        if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k;
+      }
+      for (j = 0; j < m; ++j) y0[j] = 0;
+      return y0;
+    },
+    zero: d3_layout_stackOffsetZero
+  });
+  function d3_layout_stackOrderDefault(data) {
+    return d3.range(data.length);
+  }
+  function d3_layout_stackOffsetZero(data) {
+    var j = -1, m = data[0].length, y0 = [];
+    while (++j < m) y0[j] = 0;
+    return y0;
+  }
+  function d3_layout_stackMaxIndex(array) {
+    var i = 1, j = 0, v = array[0][1], k, n = array.length;
+    for (;i < n; ++i) {
+      if ((k = array[i][1]) > v) {
+        j = i;
+        v = k;
+      }
+    }
+    return j;
+  }
+  function d3_layout_stackReduceSum(d) {
+    return d.reduce(d3_layout_stackSum, 0);
+  }
+  function d3_layout_stackSum(p, d) {
+    return p + d[1];
+  }
+  d3.layout.histogram = function() {
+    var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges;
+    function histogram(data, i) {
+      var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x;
+      while (++i < m) {
+        bin = bins[i] = [];
+        bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);
+        bin.y = 0;
+      }
+      if (m > 0) {
+        i = -1;
+        while (++i < n) {
+          x = values[i];
+          if (x >= range[0] && x <= range[1]) {
+            bin = bins[d3.bisect(thresholds, x, 1, m) - 1];
+            bin.y += k;
+            bin.push(data[i]);
+          }
+        }
+      }
+      return bins;
+    }
+    histogram.value = function(x) {
+      if (!arguments.length) return valuer;
+      valuer = x;
+      return histogram;
+    };
+    histogram.range = function(x) {
+      if (!arguments.length) return ranger;
+      ranger = d3_functor(x);
+      return histogram;
+    };
+    histogram.bins = function(x) {
+      if (!arguments.length) return binner;
+      binner = typeof x === "number" ? function(range) {
+        return d3_layout_histogramBinFixed(range, x);
+      } : d3_functor(x);
+      return histogram;
+    };
+    histogram.frequency = function(x) {
+      if (!arguments.length) return frequency;
+      frequency = !!x;
+      return histogram;
+    };
+    return histogram;
+  };
+  function d3_layout_histogramBinSturges(range, values) {
+    return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));
+  }
+  function d3_layout_histogramBinFixed(range, n) {
+    var x = -1, b = +range[0], m = (range[1] - b) / n, f = [];
+    while (++x <= n) f[x] = m * x + b;
+    return f;
+  }
+  function d3_layout_histogramRange(values) {
+    return [ d3.min(values), d3.max(values) ];
+  }
+  d3.layout.pack = function() {
+    var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius;
+    function pack(d, i) {
+      var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === "function" ? radius : function() {
+        return radius;
+      };
+      root.x = root.y = 0;
+      d3_layout_hierarchyVisitAfter(root, function(d) {
+        d.r = +r(d.value);
+      });
+      d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);
+      if (padding) {
+        var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2;
+        d3_layout_hierarchyVisitAfter(root, function(d) {
+          d.r += dr;
+        });
+        d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);
+        d3_layout_hierarchyVisitAfter(root, function(d) {
+          d.r -= dr;
+        });
+      }
+      d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h));
+      return nodes;
+    }
+    pack.size = function(_) {
+      if (!arguments.length) return size;
+      size = _;
+      return pack;
+    };
+    pack.radius = function(_) {
+      if (!arguments.length) return radius;
+      radius = _ == null || typeof _ === "function" ? _ : +_;
+      return pack;
+    };
+    pack.padding = function(_) {
+      if (!arguments.length) return padding;
+      padding = +_;
+      return pack;
+    };
+    return d3_layout_hierarchyRebind(pack, hierarchy);
+  };
+  function d3_layout_packSort(a, b) {
+    return a.value - b.value;
+  }
+  function d3_layout_packInsert(a, b) {
+    var c = a._pack_next;
+    a._pack_next = b;
+    b._pack_prev = a;
+    b._pack_next = c;
+    c._pack_prev = b;
+  }
+  function d3_layout_packSplice(a, b) {
+    a._pack_next = b;
+    b._pack_prev = a;
+  }
+  function d3_layout_packIntersects(a, b) {
+    var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r;
+    return .999 * dr * dr > dx * dx + dy * dy;
+  }
+  function d3_layout_packSiblings(node) {
+    if (!(nodes = node.children) || !(n = nodes.length)) return;
+    var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n;
+    function bound(node) {
+      xMin = Math.min(node.x - node.r, xMin);
+      xMax = Math.max(node.x + node.r, xMax);
+      yMin = Math.min(node.y - node.r, yMin);
+      yMax = Math.max(node.y + node.r, yMax);
+    }
+    nodes.forEach(d3_layout_packLink);
+    a = nodes[0];
+    a.x = -a.r;
+    a.y = 0;
+    bound(a);
+    if (n > 1) {
+      b = nodes[1];
+      b.x = b.r;
+      b.y = 0;
+      bound(b);
+      if (n > 2) {
+        c = nodes[2];
+        d3_layout_packPlace(a, b, c);
+        bound(c);
+        d3_layout_packInsert(a, c);
+        a._pack_prev = c;
+        d3_layout_packInsert(c, b);
+        b = a._pack_next;
+        for (i = 3; i < n; i++) {
+          d3_layout_packPlace(a, b, c = nodes[i]);
+          var isect = 0, s1 = 1, s2 = 1;
+          for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {
+            if (d3_layout_packIntersects(j, c)) {
+              isect = 1;
+              break;
+            }
+          }
+          if (isect == 1) {
+            for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {
+              if (d3_layout_packIntersects(k, c)) {
+                break;
+              }
+            }
+          }
+          if (isect) {
+            if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b);
+            i--;
+          } else {
+            d3_layout_packInsert(a, c);
+            b = c;
+            bound(c);
+          }
+        }
+      }
+    }
+    var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0;
+    for (i = 0; i < n; i++) {
+      c = nodes[i];
+      c.x -= cx;
+      c.y -= cy;
+      cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y));
+    }
+    node.r = cr;
+    nodes.forEach(d3_layout_packUnlink);
+  }
+  function d3_layout_packLink(node) {
+    node._pack_next = node._pack_prev = node;
+  }
+  function d3_layout_packUnlink(node) {
+    delete node._pack_next;
+    delete node._pack_prev;
+  }
+  function d3_layout_packTransform(node, x, y, k) {
+    var children = node.children;
+    node.x = x += k * node.x;
+    node.y = y += k * node.y;
+    node.r *= k;
+    if (children) {
+      var i = -1, n = children.length;
+      while (++i < n) d3_layout_packTransform(children[i], x, y, k);
+    }
+  }
+  function d3_layout_packPlace(a, b, c) {
+    var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y;
+    if (db && (dx || dy)) {
+      var da = b.r + c.r, dc = dx * dx + dy * dy;
+      da *= da;
+      db *= db;
+      var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);
+      c.x = a.x + x * dx + y * dy;
+      c.y = a.y + x * dy - y * dx;
+    } else {
+      c.x = a.x + db;
+      c.y = a.y;
+    }
+  }
+  d3.layout.tree = function() {
+    var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = null;
+    function tree(d, i) {
+      var nodes = hierarchy.call(this, d, i), root0 = nodes[0], root1 = wrapTree(root0);
+      d3_layout_hierarchyVisitAfter(root1, firstWalk), root1.parent.m = -root1.z;
+      d3_layout_hierarchyVisitBefore(root1, secondWalk);
+      if (nodeSize) d3_layout_hierarchyVisitBefore(root0, sizeNode); else {
+        var left = root0, right = root0, bottom = root0;
+        d3_layout_hierarchyVisitBefore(root0, function(node) {
+          if (node.x < left.x) left = node;
+          if (node.x > right.x) right = node;
+          if (node.depth > bottom.depth) bottom = node;
+        });
+        var tx = separation(left, right) / 2 - left.x, kx = size[0] / (right.x + separation(right, left) / 2 + tx), ky = size[1] / (bottom.depth || 1);
+        d3_layout_hierarchyVisitBefore(root0, function(node) {
+          node.x = (node.x + tx) * kx;
+          node.y = node.depth * ky;
+        });
+      }
+      return nodes;
+    }
+    function wrapTree(root0) {
+      var root1 = {
+        A: null,
+        children: [ root0 ]
+      }, queue = [ root1 ], node1;
+      while ((node1 = queue.pop()) != null) {
+        for (var children = node1.children, child, i = 0, n = children.length; i < n; ++i) {
+          queue.push((children[i] = child = {
+            _: children[i],
+            parent: node1,
+            children: (child = children[i].children) && child.slice() || [],
+            A: null,
+            a: null,
+            z: 0,
+            m: 0,
+            c: 0,
+            s: 0,
+            t: null,
+            i: i
+          }).a = child);
+        }
+      }
+      return root1.children[0];
+    }
+    function firstWalk(v) {
+      var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null;
+      if (children.length) {
+        d3_layout_treeShift(v);
+        var midpoint = (children[0].z + children[children.length - 1].z) / 2;
+        if (w) {
+          v.z = w.z + separation(v._, w._);
+          v.m = v.z - midpoint;
+        } else {
+          v.z = midpoint;
+        }
+      } else if (w) {
+        v.z = w.z + separation(v._, w._);
+      }
+      v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
+    }
+    function secondWalk(v) {
+      v._.x = v.z + v.parent.m;
+      v.m += v.parent.m;
+    }
+    function apportion(v, w, ancestor) {
+      if (w) {
+        var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;
+        while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {
+          vom = d3_layout_treeLeft(vom);
+          vop = d3_layout_treeRight(vop);
+          vop.a = v;
+          shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
+          if (shift > 0) {
+            d3_layout_treeMove(d3_layout_treeAncestor(vim, v, ancestor), v, shift);
+            sip += shift;
+            sop += shift;
+          }
+          sim += vim.m;
+          sip += vip.m;
+          som += vom.m;
+          sop += vop.m;
+        }
+        if (vim && !d3_layout_treeRight(vop)) {
+          vop.t = vim;
+          vop.m += sim - sop;
+        }
+        if (vip && !d3_layout_treeLeft(vom)) {
+          vom.t = vip;
+          vom.m += sip - som;
+          ancestor = v;
+        }
+      }
+      return ancestor;
+    }
+    function sizeNode(node) {
+      node.x *= size[0];
+      node.y = node.depth * size[1];
+    }
+    tree.separation = function(x) {
+      if (!arguments.length) return separation;
+      separation = x;
+      return tree;
+    };
+    tree.size = function(x) {
+      if (!arguments.length) return nodeSize ? null : size;
+      nodeSize = (size = x) == null ? sizeNode : null;
+      return tree;
+    };
+    tree.nodeSize = function(x) {
+      if (!arguments.length) return nodeSize ? size : null;
+      nodeSize = (size = x) == null ? null : sizeNode;
+      return tree;
+    };
+    return d3_layout_hierarchyRebind(tree, hierarchy);
+  };
+  function d3_layout_treeSeparation(a, b) {
+    return a.parent == b.parent ? 1 : 2;
+  }
+  function d3_layout_treeLeft(v) {
+    var children = v.children;
+    return children.length ? children[0] : v.t;
+  }
+  function d3_layout_treeRight(v) {
+    var children = v.children, n;
+    return (n = children.length) ? children[n - 1] : v.t;
+  }
+  function d3_layout_treeMove(wm, wp, shift) {
+    var change = shift / (wp.i - wm.i);
+    wp.c -= change;
+    wp.s += shift;
+    wm.c += change;
+    wp.z += shift;
+    wp.m += shift;
+  }
+  function d3_layout_treeShift(v) {
+    var shift = 0, change = 0, children = v.children, i = children.length, w;
+    while (--i >= 0) {
+      w = children[i];
+      w.z += shift;
+      w.m += shift;
+      shift += w.s + (change += w.c);
+    }
+  }
+  function d3_layout_treeAncestor(vim, v, ancestor) {
+    return vim.a.parent === v.parent ? vim.a : ancestor;
+  }
+  d3.layout.cluster = function() {
+    var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false;
+    function cluster(d, i) {
+      var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0;
+      d3_layout_hierarchyVisitAfter(root, function(node) {
+        var children = node.children;
+        if (children && children.length) {
+          node.x = d3_layout_clusterX(children);
+          node.y = d3_layout_clusterY(children);
+        } else {
+          node.x = previousNode ? x += separation(node, previousNode) : 0;
+          node.y = 0;
+          previousNode = node;
+        }
+      });
+      var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;
+      d3_layout_hierarchyVisitAfter(root, nodeSize ? function(node) {
+        node.x = (node.x - root.x) * size[0];
+        node.y = (root.y - node.y) * size[1];
+      } : function(node) {
+        node.x = (node.x - x0) / (x1 - x0) * size[0];
+        node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1];
+      });
+      return nodes;
+    }
+    cluster.separation = function(x) {
+      if (!arguments.length) return separation;
+      separation = x;
+      return cluster;
+    };
+    cluster.size = function(x) {
+      if (!arguments.length) return nodeSize ? null : size;
+      nodeSize = (size = x) == null;
+      return cluster;
+    };
+    cluster.nodeSize = function(x) {
+      if (!arguments.length) return nodeSize ? size : null;
+      nodeSize = (size = x) != null;
+      return cluster;
+    };
+    return d3_layout_hierarchyRebind(cluster, hierarchy);
+  };
+  function d3_layout_clusterY(children) {
+    return 1 + d3.max(children, function(child) {
+      return child.y;
+    });
+  }
+  function d3_layout_clusterX(children) {
+    return children.reduce(function(x, child) {
+      return x + child.x;
+    }, 0) / children.length;
+  }
+  function d3_layout_clusterLeft(node) {
+    var children = node.children;
+    return children && children.length ? d3_layout_clusterLeft(children[0]) : node;
+  }
+  function d3_layout_clusterRight(node) {
+    var children = node.children, n;
+    return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;
+  }
+  d3.layout.treemap = function() {
+    var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = "squarify", ratio = .5 * (1 + Math.sqrt(5));
+    function scale(children, k) {
+      var i = -1, n = children.length, child, area;
+      while (++i < n) {
+        area = (child = children[i]).value * (k < 0 ? 0 : k);
+        child.area = isNaN(area) || area <= 0 ? 0 : area;
+      }
+    }
+    function squarify(node) {
+      var children = node.children;
+      if (children && children.length) {
+        var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === "slice" ? rect.dx : mode === "dice" ? rect.dy : mode === "slice-dice" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n;
+        scale(remaining, rect.dx * rect.dy / node.value);
+        row.area = 0;
+        while ((n = remaining.length) > 0) {
+          row.push(child = remaining[n - 1]);
+          row.area += child.area;
+          if (mode !== "squarify" || (score = worst(row, u)) <= best) {
+            remaining.pop();
+            best = score;
+          } else {
+            row.area -= row.pop().area;
+            position(row, u, rect, false);
+            u = Math.min(rect.dx, rect.dy);
+            row.length = row.area = 0;
+            best = Infinity;
+          }
+        }
+        if (row.length) {
+          position(row, u, rect, true);
+          row.length = row.area = 0;
+        }
+        children.forEach(squarify);
+      }
+    }
+    function stickify(node) {
+      var children = node.children;
+      if (children && children.length) {
+        var rect = pad(node), remaining = children.slice(), child, row = [];
+        scale(remaining, rect.dx * rect.dy / node.value);
+        row.area = 0;
+        while (child = remaining.pop()) {
+          row.push(child);
+          row.area += child.area;
+          if (child.z != null) {
+            position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);
+            row.length = row.area = 0;
+          }
+        }
+        children.forEach(stickify);
+      }
+    }
+    function worst(row, u) {
+      var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length;
+      while (++i < n) {
+        if (!(r = row[i].area)) continue;
+        if (r < rmin) rmin = r;
+        if (r > rmax) rmax = r;
+      }
+      s *= s;
+      u *= u;
+      return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity;
+    }
+    function position(row, u, rect, flush) {
+      var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o;
+      if (u == rect.dx) {
+        if (flush || v > rect.dy) v = rect.dy;
+        while (++i < n) {
+          o = row[i];
+          o.x = x;
+          o.y = y;
+          o.dy = v;
+          x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0);
+        }
+        o.z = true;
+        o.dx += rect.x + rect.dx - x;
+        rect.y += v;
+        rect.dy -= v;
+      } else {
+        if (flush || v > rect.dx) v = rect.dx;
+        while (++i < n) {
+          o = row[i];
+          o.x = x;
+          o.y = y;
+          o.dx = v;
+          y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0);
+        }
+        o.z = false;
+        o.dy += rect.y + rect.dy - y;
+        rect.x += v;
+        rect.dx -= v;
+      }
+    }
+    function treemap(d) {
+      var nodes = stickies || hierarchy(d), root = nodes[0];
+      root.x = root.y = 0;
+      if (root.value) root.dx = size[0], root.dy = size[1]; else root.dx = root.dy = 0;
+      if (stickies) hierarchy.revalue(root);
+      scale([ root ], root.dx * root.dy / root.value);
+      (stickies ? stickify : squarify)(root);
+      if (sticky) stickies = nodes;
+      return nodes;
+    }
+    treemap.size = function(x) {
+      if (!arguments.length) return size;
+      size = x;
+      return treemap;
+    };
+    treemap.padding = function(x) {
+      if (!arguments.length) return padding;
+      function padFunction(node) {
+        var p = x.call(treemap, node, node.depth);
+        return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === "number" ? [ p, p, p, p ] : p);
+      }
+      function padConstant(node) {
+        return d3_layout_treemapPad(node, x);
+      }
+      var type;
+      pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === "function" ? padFunction : type === "number" ? (x = [ x, x, x, x ], 
+      padConstant) : padConstant;
+      return treemap;
+    };
+    treemap.round = function(x) {
+      if (!arguments.length) return round != Number;
+      round = x ? Math.round : Number;
+      return treemap;
+    };
+    treemap.sticky = function(x) {
+      if (!arguments.length) return sticky;
+      sticky = x;
+      stickies = null;
+      return treemap;
+    };
+    treemap.ratio = function(x) {
+      if (!arguments.length) return ratio;
+      ratio = x;
+      return treemap;
+    };
+    treemap.mode = function(x) {
+      if (!arguments.length) return mode;
+      mode = x + "";
+      return treemap;
+    };
+    return d3_layout_hierarchyRebind(treemap, hierarchy);
+  };
+  function d3_layout_treemapPadNull(node) {
+    return {
+      x: node.x,
+      y: node.y,
+      dx: node.dx,
+      dy: node.dy
+    };
+  }
+  function d3_layout_treemapPad(node, padding) {
+    var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2];
+    if (dx < 0) {
+      x += dx / 2;
+      dx = 0;
+    }
+    if (dy < 0) {
+      y += dy / 2;
+      dy = 0;
+    }
+    return {
+      x: x,
+      y: y,
+      dx: dx,
+      dy: dy
+    };
+  }
+  d3.random = {
+    normal: function(µ, σ) {
+      var n = arguments.length;
+      if (n < 2) σ = 1;
+      if (n < 1) µ = 0;
+      return function() {
+        var x, y, r;
+        do {
+          x = Math.random() * 2 - 1;
+          y = Math.random() * 2 - 1;
+          r = x * x + y * y;
+        } while (!r || r > 1);
+        return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r);
+      };
+    },
+    logNormal: function() {
+      var random = d3.random.normal.apply(d3, arguments);
+      return function() {
+        return Math.exp(random());
+      };
+    },
+    bates: function(m) {
+      var random = d3.random.irwinHall(m);
+      return function() {
+        return random() / m;
+      };
+    },
+    irwinHall: function(m) {
+      return function() {
+        for (var s = 0, j = 0; j < m; j++) s += Math.random();
+        return s;
+      };
+    }
+  };
+  d3.scale = {};
+  function d3_scaleExtent(domain) {
+    var start = domain[0], stop = domain[domain.length - 1];
+    return start < stop ? [ start, stop ] : [ stop, start ];
+  }
+  function d3_scaleRange(scale) {
+    return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());
+  }
+  function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {
+    var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]);
+    return function(x) {
+      return i(u(x));
+    };
+  }
+  function d3_scale_nice(domain, nice) {
+    var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx;
+    if (x1 < x0) {
+      dx = i0, i0 = i1, i1 = dx;
+      dx = x0, x0 = x1, x1 = dx;
+    }
+    domain[i0] = nice.floor(x0);
+    domain[i1] = nice.ceil(x1);
+    return domain;
+  }
+  function d3_scale_niceStep(step) {
+    return step ? {
+      floor: function(x) {
+        return Math.floor(x / step) * step;
+      },
+      ceil: function(x) {
+        return Math.ceil(x / step) * step;
+      }
+    } : d3_scale_niceIdentity;
+  }
+  var d3_scale_niceIdentity = {
+    floor: d3_identity,
+    ceil: d3_identity
+  };
+  function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {
+    var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1;
+    if (domain[k] < domain[0]) {
+      domain = domain.slice().reverse();
+      range = range.slice().reverse();
+    }
+    while (++j <= k) {
+      u.push(uninterpolate(domain[j - 1], domain[j]));
+      i.push(interpolate(range[j - 1], range[j]));
+    }
+    return function(x) {
+      var j = d3.bisect(domain, x, 1, k) - 1;
+      return i[j](u[j](x));
+    };
+  }
+  d3.scale.linear = function() {
+    return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false);
+  };
+  function d3_scale_linear(domain, range, interpolate, clamp) {
+    var output, input;
+    function rescale() {
+      var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;
+      output = linear(domain, range, uninterpolate, interpolate);
+      input = linear(range, domain, uninterpolate, d3_interpolate);
+      return scale;
+    }
+    function scale(x) {
+      return output(x);
+    }
+    scale.invert = function(y) {
+      return input(y);
+    };
+    scale.domain = function(x) {
+      if (!arguments.length) return domain;
+      domain = x.map(Number);
+      return rescale();
+    };
+    scale.range = function(x) {
+      if (!arguments.length) return range;
+      range = x;
+      return rescale();
+    };
+    scale.rangeRound = function(x) {
+      return scale.range(x).interpolate(d3_interpolateRound);
+    };
+    scale.clamp = function(x) {
+      if (!arguments.length) return clamp;
+      clamp = x;
+      return rescale();
+    };
+    scale.interpolate = function(x) {
+      if (!arguments.length) return interpolate;
+      interpolate = x;
+      return rescale();
+    };
+    scale.ticks = function(m) {
+      return d3_scale_linearTicks(domain, m);
+    };
+    scale.tickFormat = function(m, format) {
+      return d3_scale_linearTickFormat(domain, m, format);
+    };
+    scale.nice = function(m) {
+      d3_scale_linearNice(domain, m);
+      return rescale();
+    };
+    scale.copy = function() {
+      return d3_scale_linear(domain, range, interpolate, clamp);
+    };
+    return rescale();
+  }
+  function d3_scale_linearRebind(scale, linear) {
+    return d3.rebind(scale, linear, "range", "rangeRound", "interpolate", "clamp");
+  }
+  function d3_scale_linearNice(domain, m) {
+    d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));
+    d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));
+    return domain;
+  }
+  function d3_scale_linearTickRange(domain, m) {
+    if (m == null) m = 10;
+    var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step;
+    if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2;
+    extent[0] = Math.ceil(extent[0] / step) * step;
+    extent[1] = Math.floor(extent[1] / step) * step + step * .5;
+    extent[2] = step;
+    return extent;
+  }
+  function d3_scale_linearTicks(domain, m) {
+    return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));
+  }
+  function d3_scale_linearTickFormat(domain, m, format) {
+    var range = d3_scale_linearTickRange(domain, m);
+    if (format) {
+      var match = d3_format_re.exec(format);
+      match.shift();
+      if (match[8] === "s") {
+        var prefix = d3.formatPrefix(Math.max(abs(range[0]), abs(range[1])));
+        if (!match[7]) match[7] = "." + d3_scale_linearPrecision(prefix.scale(range[2]));
+        match[8] = "f";
+        format = d3.format(match.join(""));
+        return function(d) {
+          return format(prefix.scale(d)) + prefix.symbol;
+        };
+      }
+      if (!match[7]) match[7] = "." + d3_scale_linearFormatPrecision(match[8], range);
+      format = match.join("");
+    } else {
+      format = ",." + d3_scale_linearPrecision(range[2]) + "f";
+    }
+    return d3.format(format);
+  }
+  var d3_scale_linearFormatSignificant = {
+    s: 1,
+    g: 1,
+    p: 1,
+    r: 1,
+    e: 1
+  };
+  function d3_scale_linearPrecision(value) {
+    return -Math.floor(Math.log(value) / Math.LN10 + .01);
+  }
+  function d3_scale_linearFormatPrecision(type, range) {
+    var p = d3_scale_linearPrecision(range[2]);
+    return type in d3_scale_linearFormatSignificant ? Math.abs(p - d3_scale_linearPrecision(Math.max(abs(range[0]), abs(range[1])))) + +(type !== "e") : p - (type === "%") * 2;
+  }
+  d3.scale.log = function() {
+    return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]);
+  };
+  function d3_scale_log(linear, base, positive, domain) {
+    function log(x) {
+      return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base);
+    }
+    function pow(x) {
+      return positive ? Math.pow(base, x) : -Math.pow(base, -x);
+    }
+    function scale(x) {
+      return linear(log(x));
+    }
+    scale.invert = function(x) {
+      return pow(linear.invert(x));
+    };
+    scale.domain = function(x) {
+      if (!arguments.length) return domain;
+      positive = x[0] >= 0;
+      linear.domain((domain = x.map(Number)).map(log));
+      return scale;
+    };
+    scale.base = function(_) {
+      if (!arguments.length) return base;
+      base = +_;
+      linear.domain(domain.map(log));
+      return scale;
+    };
+    scale.nice = function() {
+      var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative);
+      linear.domain(niced);
+      domain = niced.map(pow);
+      return scale;
+    };
+    scale.ticks = function() {
+      var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base;
+      if (isFinite(j - i)) {
+        if (positive) {
+          for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k);
+          ticks.push(pow(i));
+        } else {
+          ticks.push(pow(i));
+          for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k);
+        }
+        for (i = 0; ticks[i] < u; i++) {}
+        for (j = ticks.length; ticks[j - 1] > v; j--) {}
+        ticks = ticks.slice(i, j);
+      }
+      return ticks;
+    };
+    scale.tickFormat = function(n, format) {
+      if (!arguments.length) return d3_scale_logFormat;
+      if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== "function") format = d3.format(format);
+      var k = Math.max(1, base * n / scale.ticks().length);
+      return function(d) {
+        var i = d / pow(Math.round(log(d)));
+        if (i * base < base - .5) i *= base;
+        return i <= k ? format(d) : "";
+      };
+    };
+    scale.copy = function() {
+      return d3_scale_log(linear.copy(), base, positive, domain);
+    };
+    return d3_scale_linearRebind(scale, linear);
+  }
+  var d3_scale_logFormat = d3.format(".0e"), d3_scale_logNiceNegative = {
+    floor: function(x) {
+      return -Math.ceil(-x);
+    },
+    ceil: function(x) {
+      return -Math.floor(-x);
+    }
+  };
+  d3.scale.pow = function() {
+    return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]);
+  };
+  function d3_scale_pow(linear, exponent, domain) {
+    var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent);
+    function scale(x) {
+      return linear(powp(x));
+    }
+    scale.invert = function(x) {
+      return powb(linear.invert(x));
+    };
+    scale.domain = function(x) {
+      if (!arguments.length) return domain;
+      linear.domain((domain = x.map(Number)).map(powp));
+      return scale;
+    };
+    scale.ticks = function(m) {
+      return d3_scale_linearTicks(domain, m);
+    };
+    scale.tickFormat = function(m, format) {
+      return d3_scale_linearTickFormat(domain, m, format);
+    };
+    scale.nice = function(m) {
+      return scale.domain(d3_scale_linearNice(domain, m));
+    };
+    scale.exponent = function(x) {
+      if (!arguments.length) return exponent;
+      powp = d3_scale_powPow(exponent = x);
+      powb = d3_scale_powPow(1 / exponent);
+      linear.domain(domain.map(powp));
+      return scale;
+    };
+    scale.copy = function() {
+      return d3_scale_pow(linear.copy(), exponent, domain);
+    };
+    return d3_scale_linearRebind(scale, linear);
+  }
+  function d3_scale_powPow(e) {
+    return function(x) {
+      return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);
+    };
+  }
+  d3.scale.sqrt = function() {
+    return d3.scale.pow().exponent(.5);
+  };
+  d3.scale.ordinal = function() {
+    return d3_scale_ordinal([], {
+      t: "range",
+      a: [ [] ]
+    });
+  };
+  function d3_scale_ordinal(domain, ranger) {
+    var index, range, rangeBand;
+    function scale(x) {
+      return range[((index.get(x) || (ranger.t === "range" ? index.set(x, domain.push(x)) : NaN)) - 1) % range.length];
+    }
+    function steps(start, step) {
+      return d3.range(domain.length).map(function(i) {
+        return start + step * i;
+      });
+    }
+    scale.domain = function(x) {
+      if (!arguments.length) return domain;
+      domain = [];
+      index = new d3_Map();
+      var i = -1, n = x.length, xi;
+      while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi));
+      return scale[ranger.t].apply(scale, ranger.a);
+    };
+    scale.range = function(x) {
+      if (!arguments.length) return range;
+      range = x;
+      rangeBand = 0;
+      ranger = {
+        t: "range",
+        a: arguments
+      };
+      return scale;
+    };
+    scale.rangePoints = function(x, padding) {
+      if (arguments.length < 2) padding = 0;
+      var start = x[0], stop = x[1], step = domain.length < 2 ? (start = (start + stop) / 2, 
+      0) : (stop - start) / (domain.length - 1 + padding);
+      range = steps(start + step * padding / 2, step);
+      rangeBand = 0;
+      ranger = {
+        t: "rangePoints",
+        a: arguments
+      };
+      return scale;
+    };
+    scale.rangeRoundPoints = function(x, padding) {
+      if (arguments.length < 2) padding = 0;
+      var start = x[0], stop = x[1], step = domain.length < 2 ? (start = stop = Math.round((start + stop) / 2), 
+      0) : (stop - start) / (domain.length - 1 + padding) | 0;
+      range = steps(start + Math.round(step * padding / 2 + (stop - start - (domain.length - 1 + padding) * step) / 2), step);
+      rangeBand = 0;
+      ranger = {
+        t: "rangeRoundPoints",
+        a: arguments
+      };
+      return scale;
+    };
+    scale.rangeBands = function(x, padding, outerPadding) {
+      if (arguments.length < 2) padding = 0;
+      if (arguments.length < 3) outerPadding = padding;
+      var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding);
+      range = steps(start + step * outerPadding, step);
+      if (reverse) range.reverse();
+      rangeBand = step * (1 - padding);
+      ranger = {
+        t: "rangeBands",
+        a: arguments
+      };
+      return scale;
+    };
+    scale.rangeRoundBands = function(x, padding, outerPadding) {
+      if (arguments.length < 2) padding = 0;
+      if (arguments.length < 3) outerPadding = padding;
+      var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding));
+      range = steps(start + Math.round((stop - start - (domain.length - padding) * step) / 2), step);
+      if (reverse) range.reverse();
+      rangeBand = Math.round(step * (1 - padding));
+      ranger = {
+        t: "rangeRoundBands",
+        a: arguments
+      };
+      return scale;
+    };
+    scale.rangeBand = function() {
+      return rangeBand;
+    };
+    scale.rangeExtent = function() {
+      return d3_scaleExtent(ranger.a[0]);
+    };
+    scale.copy = function() {
+      return d3_scale_ordinal(domain, ranger);
+    };
+    return scale.domain(domain);
+  }
+  d3.scale.category10 = function() {
+    return d3.scale.ordinal().range(d3_category10);
+  };
+  d3.scale.category20 = function() {
+    return d3.scale.ordinal().range(d3_category20);
+  };
+  d3.scale.category20b = function() {
+    return d3.scale.ordinal().range(d3_category20b);
+  };
+  d3.scale.category20c = function() {
+    return d3.scale.ordinal().range(d3_category20c);
+  };
+  var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString);
+  var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString);
+  var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString);
+  var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString);
+  d3.scale.quantile = function() {
+    return d3_scale_quantile([], []);
+  };
+  function d3_scale_quantile(domain, range) {
+    var thresholds;
+    function rescale() {
+      var k = 0, q = range.length;
+      thresholds = [];
+      while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);
+      return scale;
+    }
+    function scale(x) {
+      if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)];
+    }
+    scale.domain = function(x) {
+      if (!arguments.length) return domain;
+      domain = x.map(d3_number).filter(d3_numeric).sort(d3_ascending);
+      return rescale();
+    };
+    scale.range = function(x) {
+      if (!arguments.length) return range;
+      range = x;
+      return rescale();
+    };
+    scale.quantiles = function() {
+      return thresholds;
+    };
+    scale.invertExtent = function(y) {
+      y = range.indexOf(y);
+      return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ];
+    };
+    scale.copy = function() {
+      return d3_scale_quantile(domain, range);
+    };
+    return rescale();
+  }
+  d3.scale.quantize = function() {
+    return d3_scale_quantize(0, 1, [ 0, 1 ]);
+  };
+  function d3_scale_quantize(x0, x1, range) {
+    var kx, i;
+    function scale(x) {
+      return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];
+    }
+    function rescale() {
+      kx = range.length / (x1 - x0);
+      i = range.length - 1;
+      return scale;
+    }
+    scale.domain = function(x) {
+      if (!arguments.length) return [ x0, x1 ];
+      x0 = +x[0];
+      x1 = +x[x.length - 1];
+      return rescale();
+    };
+    scale.range = function(x) {
+      if (!arguments.length) return range;
+      range = x;
+      return rescale();
+    };
+    scale.invertExtent = function(y) {
+      y = range.indexOf(y);
+      y = y < 0 ? NaN : y / kx + x0;
+      return [ y, y + 1 / kx ];
+    };
+    scale.copy = function() {
+      return d3_scale_quantize(x0, x1, range);
+    };
+    return rescale();
+  }
+  d3.scale.threshold = function() {
+    return d3_scale_threshold([ .5 ], [ 0, 1 ]);
+  };
+  function d3_scale_threshold(domain, range) {
+    function scale(x) {
+      if (x <= x) return range[d3.bisect(domain, x)];
+    }
+    scale.domain = function(_) {
+      if (!arguments.length) return domain;
+      domain = _;
+      return scale;
+    };
+    scale.range = function(_) {
+      if (!arguments.length) return range;
+      range = _;
+      return scale;
+    };
+    scale.invertExtent = function(y) {
+      y = range.indexOf(y);
+      return [ domain[y - 1], domain[y] ];
+    };
+    scale.copy = function() {
+      return d3_scale_threshold(domain, range);
+    };
+    return scale;
+  }
+  d3.scale.identity = function() {
+    return d3_scale_identity([ 0, 1 ]);
+  };
+  function d3_scale_identity(domain) {
+    function identity(x) {
+      return +x;
+    }
+    identity.invert = identity;
+    identity.domain = identity.range = function(x) {
+      if (!arguments.length) return domain;
+      domain = x.map(identity);
+      return identity;
+    };
+    identity.ticks = function(m) {
+      return d3_scale_linearTicks(domain, m);
+    };
+    identity.tickFormat = function(m, format) {
+      return d3_scale_linearTickFormat(domain, m, format);
+    };
+    identity.copy = function() {
+      return d3_scale_identity(domain);
+    };
+    return identity;
+  }
+  d3.svg = {};
+  function d3_zero() {
+    return 0;
+  }
+  d3.svg.arc = function() {
+    var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, cornerRadius = d3_zero, padRadius = d3_svg_arcAuto, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle, padAngle = d3_svg_arcPadAngle;
+    function arc() {
+      var r0 = Math.max(0, +innerRadius.apply(this, arguments)), r1 = Math.max(0, +outerRadius.apply(this, arguments)), a0 = startAngle.apply(this, arguments) - halfπ, a1 = endAngle.apply(this, arguments) - halfπ, da = Math.abs(a1 - a0), cw = a0 > a1 ? 0 : 1;
+      if (r1 < r0) rc = r1, r1 = r0, r0 = rc;
+      if (da >= τε) return circleSegment(r1, cw) + (r0 ? circleSegment(r0, 1 - cw) : "") + "Z";
+      var rc, cr, rp, ap, p0 = 0, p1 = 0, x0, y0, x1, y1, x2, y2, x3, y3, path = [];
+      if (ap = (+padAngle.apply(this, arguments) || 0) / 2) {
+        rp = padRadius === d3_svg_arcAuto ? Math.sqrt(r0 * r0 + r1 * r1) : +padRadius.apply(this, arguments);
+        if (!cw) p1 *= -1;
+        if (r1) p1 = d3_asin(rp / r1 * Math.sin(ap));
+        if (r0) p0 = d3_asin(rp / r0 * Math.sin(ap));
+      }
+      if (r1) {
+        x0 = r1 * Math.cos(a0 + p1);
+        y0 = r1 * Math.sin(a0 + p1);
+        x1 = r1 * Math.cos(a1 - p1);
+        y1 = r1 * Math.sin(a1 - p1);
+        var l1 = Math.abs(a1 - a0 - 2 * p1) <= π ? 0 : 1;
+        if (p1 && d3_svg_arcSweep(x0, y0, x1, y1) === cw ^ l1) {
+          var h1 = (a0 + a1) / 2;
+          x0 = r1 * Math.cos(h1);
+          y0 = r1 * Math.sin(h1);
+          x1 = y1 = null;
+        }
+      } else {
+        x0 = y0 = 0;
+      }
+      if (r0) {
+        x2 = r0 * Math.cos(a1 - p0);
+        y2 = r0 * Math.sin(a1 - p0);
+        x3 = r0 * Math.cos(a0 + p0);
+        y3 = r0 * Math.sin(a0 + p0);
+        var l0 = Math.abs(a0 - a1 + 2 * p0) <= π ? 0 : 1;
+        if (p0 && d3_svg_arcSweep(x2, y2, x3, y3) === 1 - cw ^ l0) {
+          var h0 = (a0 + a1) / 2;
+          x2 = r0 * Math.cos(h0);
+          y2 = r0 * Math.sin(h0);
+          x3 = y3 = null;
+        }
+      } else {
+        x2 = y2 = 0;
+      }
+      if (da > ε && (rc = Math.min(Math.abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments))) > .001) {
+        cr = r0 < r1 ^ cw ? 0 : 1;
+        var rc1 = rc, rc0 = rc;
+        if (da < π) {
+          var oc = x3 == null ? [ x2, y2 ] : x1 == null ? [ x0, y0 ] : d3_geom_polygonIntersect([ x0, y0 ], [ x3, y3 ], [ x1, y1 ], [ x2, y2 ]), ax = x0 - oc[0], ay = y0 - oc[1], bx = x1 - oc[0], by = y1 - oc[1], kc = 1 / Math.sin(Math.acos((ax * bx + ay * by) / (Math.sqrt(ax * ax + ay * ay) * Math.sqrt(bx * bx + by * by))) / 2), lc = Math.sqrt(oc[0] * oc[0] + oc[1] * oc[1]);
+          rc0 = Math.min(rc, (r0 - lc) / (kc - 1));
+          rc1 = Math.min(rc, (r1 - lc) / (kc + 1));
+        }
+        if (x1 != null) {
+          var t30 = d3_svg_arcCornerTangents(x3 == null ? [ x2, y2 ] : [ x3, y3 ], [ x0, y0 ], r1, rc1, cw), t12 = d3_svg_arcCornerTangents([ x1, y1 ], [ x2, y2 ], r1, rc1, cw);
+          if (rc === rc1) {
+            path.push("M", t30[0], "A", rc1, ",", rc1, " 0 0,", cr, " ", t30[1], "A", r1, ",", r1, " 0 ", 1 - cw ^ d3_svg_arcSweep(t30[1][0], t30[1][1], t12[1][0], t12[1][1]), ",", cw, " ", t12[1], "A", rc1, ",", rc1, " 0 0,", cr, " ", t12[0]);
+          } else {
+            path.push("M", t30[0], "A", rc1, ",", rc1, " 0 1,", cr, " ", t12[0]);
+          }
+        } else {
+          path.push("M", x0, ",", y0);
+        }
+        if (x3 != null) {
+          var t03 = d3_svg_arcCornerTangents([ x0, y0 ], [ x3, y3 ], r0, -rc0, cw), t21 = d3_svg_arcCornerTangents([ x2, y2 ], x1 == null ? [ x0, y0 ] : [ x1, y1 ], r0, -rc0, cw);
+          if (rc === rc0) {
+            path.push("L", t21[0], "A", rc0, ",", rc0, " 0 0,", cr, " ", t21[1], "A", r0, ",", r0, " 0 ", cw ^ d3_svg_arcSweep(t21[1][0], t21[1][1], t03[1][0], t03[1][1]), ",", 1 - cw, " ", t03[1], "A", rc0, ",", rc0, " 0 0,", cr, " ", t03[0]);
+          } else {
+            path.push("L", t21[0], "A", rc0, ",", rc0, " 0 0,", cr, " ", t03[0]);
+          }
+        } else {
+          path.push("L", x2, ",", y2);
+        }
+      } else {
+        path.push("M", x0, ",", y0);
+        if (x1 != null) path.push("A", r1, ",", r1, " 0 ", l1, ",", cw, " ", x1, ",", y1);
+        path.push("L", x2, ",", y2);
+        if (x3 != null) path.push("A", r0, ",", r0, " 0 ", l0, ",", 1 - cw, " ", x3, ",", y3);
+      }
+      path.push("Z");
+      return path.join("");
+    }
+    function circleSegment(r1, cw) {
+      return "M0," + r1 + "A" + r1 + "," + r1 + " 0 1," + cw + " 0," + -r1 + "A" + r1 + "," + r1 + " 0 1," + cw + " 0," + r1;
+    }
+    arc.innerRadius = function(v) {
+      if (!arguments.length) return innerRadius;
+      innerRadius = d3_functor(v);
+      return arc;
+    };
+    arc.outerRadius = function(v) {
+      if (!arguments.length) return outerRadius;
+      outerRadius = d3_functor(v);
+      return arc;
+    };
+    arc.cornerRadius = function(v) {
+      if (!arguments.length) return cornerRadius;
+      cornerRadius = d3_functor(v);
+      return arc;
+    };
+    arc.padRadius = function(v) {
+      if (!arguments.length) return padRadius;
+      padRadius = v == d3_svg_arcAuto ? d3_svg_arcAuto : d3_functor(v);
+      return arc;
+    };
+    arc.startAngle = function(v) {
+      if (!arguments.length) return startAngle;
+      startAngle = d3_functor(v);
+      return arc;
+    };
+    arc.endAngle = function(v) {
+      if (!arguments.length) return endAngle;
+      endAngle = d3_functor(v);
+      return arc;
+    };
+    arc.padAngle = function(v) {
+      if (!arguments.length) return padAngle;
+      padAngle = d3_functor(v);
+      return arc;
+    };
+    arc.centroid = function() {
+      var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - halfπ;
+      return [ Math.cos(a) * r, Math.sin(a) * r ];
+    };
+    return arc;
+  };
+  var d3_svg_arcAuto = "auto";
+  function d3_svg_arcInnerRadius(d) {
+    return d.innerRadius;
+  }
+  function d3_svg_arcOuterRadius(d) {
+    return d.outerRadius;
+  }
+  function d3_svg_arcStartAngle(d) {
+    return d.startAngle;
+  }
+  function d3_svg_arcEndAngle(d) {
+    return d.endAngle;
+  }
+  function d3_svg_arcPadAngle(d) {
+    return d && d.padAngle;
+  }
+  function d3_svg_arcSweep(x0, y0, x1, y1) {
+    return (x0 - x1) * y0 - (y0 - y1) * x0 > 0 ? 0 : 1;
+  }
+  function d3_svg_arcCornerTangents(p0, p1, r1, rc, cw) {
+    var x01 = p0[0] - p1[0], y01 = p0[1] - p1[1], lo = (cw ? rc : -rc) / Math.sqrt(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x1 = p0[0] + ox, y1 = p0[1] + oy, x2 = p1[0] + ox, y2 = p1[1] + oy, x3 = (x1 + x2) / 2, y3 = (y1 + y2) / 2, dx = x2 - x1, dy = y2 - y1, d2 = dx * dx + dy * dy, r = r1 - rc, D = x1 * y2 - x2 * y1, d = (dy < 0 ? -1 : 1) * Math.sqrt(Math.max(0, r * r * d2 - D * D)), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, cy1 = (-D * dx + dy * d) / d2, dx0 = cx0 - x3, dy0 = cy0 - y3, dx1 = cx1 - x3, dy1 = cy1 - y3;
+    if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
+    return [ [ cx0 - ox, cy0 - oy ], [ cx0 * r1 / r, cy0 * r1 / r ] ];
+  }
+  function d3_svg_line(projection) {
+    var x = d3_geom_pointX, y = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7;
+    function line(data) {
+      var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y);
+      function segment() {
+        segments.push("M", interpolate(projection(points), tension));
+      }
+      while (++i < n) {
+        if (defined.call(this, d = data[i], i)) {
+          points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]);
+        } else if (points.length) {
+          segment();
+          points = [];
+        }
+      }
+      if (points.length) segment();
+      return segments.length ? segments.join("") : null;
+    }
+    line.x = function(_) {
+      if (!arguments.length) return x;
+      x = _;
+      return line;
+    };
+    line.y = function(_) {
+      if (!arguments.length) return y;
+      y = _;
+      return line;
+    };
+    line.defined = function(_) {
+      if (!arguments.length) return defined;
+      defined = _;
+      return line;
+    };
+    line.interpolate = function(_) {
+      if (!arguments.length) return interpolateKey;
+      if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;
+      return line;
+    };
+    line.tension = function(_) {
+      if (!arguments.length) return tension;
+      tension = _;
+      return line;
+    };
+    return line;
+  }
+  d3.svg.line = function() {
+    return d3_svg_line(d3_identity);
+  };
+  var d3_svg_lineInterpolators = d3.map({
+    linear: d3_svg_lineLinear,
+    "linear-closed": d3_svg_lineLinearClosed,
+    step: d3_svg_lineStep,
+    "step-before": d3_svg_lineStepBefore,
+    "step-after": d3_svg_lineStepAfter,
+    basis: d3_svg_lineBasis,
+    "basis-open": d3_svg_lineBasisOpen,
+    "basis-closed": d3_svg_lineBasisClosed,
+    bundle: d3_svg_lineBundle,
+    cardinal: d3_svg_lineCardinal,
+    "cardinal-open": d3_svg_lineCardinalOpen,
+    "cardinal-closed": d3_svg_lineCardinalClosed,
+    monotone: d3_svg_lineMonotone
+  });
+  d3_svg_lineInterpolators.forEach(function(key, value) {
+    value.key = key;
+    value.closed = /-closed$/.test(key);
+  });
+  function d3_svg_lineLinear(points) {
+    return points.length > 1 ? points.join("L") : points + "Z";
+  }
+  function d3_svg_lineLinearClosed(points) {
+    return points.join("L") + "Z";
+  }
+  function d3_svg_lineStep(points) {
+    var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ];
+    while (++i < n) path.push("H", (p[0] + (p = points[i])[0]) / 2, "V", p[1]);
+    if (n > 1) path.push("H", p[0]);
+    return path.join("");
+  }
+  function d3_svg_lineStepBefore(points) {
+    var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ];
+    while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]);
+    return path.join("");
+  }
+  function d3_svg_lineStepAfter(points) {
+    var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ];
+    while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]);
+    return path.join("");
+  }
+  function d3_svg_lineCardinalOpen(points, tension) {
+    return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, -1), d3_svg_lineCardinalTangents(points, tension));
+  }
+  function d3_svg_lineCardinalClosed(points, tension) {
+    return points.length < 3 ? d3_svg_lineLinearClosed(points) : points[0] + d3_svg_lineHermite((points.push(points[0]), 
+    points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension));
+  }
+  function d3_svg_lineCardinal(points, tension) {
+    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension));
+  }
+  function d3_svg_lineHermite(points, tangents) {
+    if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) {
+      return d3_svg_lineLinear(points);
+    }
+    var quad = points.length != tangents.length, path = "", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1;
+    if (quad) {
+      path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3) + "," + p[0] + "," + p[1];
+      p0 = points[1];
+      pi = 2;
+    }
+    if (tangents.length > 1) {
+      t = tangents[1];
+      p = points[pi];
+      pi++;
+      path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1]) + "," + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1];
+      for (var i = 2; i < tangents.length; i++, pi++) {
+        p = points[pi];
+        t = tangents[i];
+        path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1];
+      }
+    }
+    if (quad) {
+      var lp = points[pi];
+      path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) + "," + lp[0] + "," + lp[1];
+    }
+    return path;
+  }
+  function d3_svg_lineCardinalTangents(points, tension) {
+    var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length;
+    while (++i < n) {
+      p0 = p1;
+      p1 = p2;
+      p2 = points[i];
+      tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]);
+    }
+    return tangents;
+  }
+  function d3_svg_lineBasis(points) {
+    if (points.length < 3) return d3_svg_lineLinear(points);
+    var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, ",", y0, "L", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];
+    points.push(points[n - 1]);
+    while (++i <= n) {
+      pi = points[i];
+      px.shift();
+      px.push(pi[0]);
+      py.shift();
+      py.push(pi[1]);
+      d3_svg_lineBasisBezier(path, px, py);
+    }
+    points.pop();
+    path.push("L", pi);
+    return path.join("");
+  }
+  function d3_svg_lineBasisOpen(points) {
+    if (points.length < 4) return d3_svg_lineLinear(points);
+    var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ];
+    while (++i < 3) {
+      pi = points[i];
+      px.push(pi[0]);
+      py.push(pi[1]);
+    }
+    path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py));
+    --i;
+    while (++i < n) {
+      pi = points[i];
+      px.shift();
+      px.push(pi[0]);
+      py.shift();
+      py.push(pi[1]);
+      d3_svg_lineBasisBezier(path, px, py);
+    }
+    return path.join("");
+  }
+  function d3_svg_lineBasisClosed(points) {
+    var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = [];
+    while (++i < 4) {
+      pi = points[i % n];
+      px.push(pi[0]);
+      py.push(pi[1]);
+    }
+    path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];
+    --i;
+    while (++i < m) {
+      pi = points[i % n];
+      px.shift();
+      px.push(pi[0]);
+      py.shift();
+      py.push(pi[1]);
+      d3_svg_lineBasisBezier(path, px, py);
+    }
+    return path.join("");
+  }
+  function d3_svg_lineBundle(points, tension) {
+    var n = points.length - 1;
+    if (n) {
+      var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t;
+      while (++i <= n) {
+        p = points[i];
+        t = i / n;
+        p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx);
+        p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy);
+      }
+    }
+    return d3_svg_lineBasis(points);
+  }
+  function d3_svg_lineDot4(a, b) {
+    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
+  }
+  var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ];
+  function d3_svg_lineBasisBezier(path, x, y) {
+    path.push("C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y));
+  }
+  function d3_svg_lineSlope(p0, p1) {
+    return (p1[1] - p0[1]) / (p1[0] - p0[0]);
+  }
+  function d3_svg_lineFiniteDifferences(points) {
+    var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1);
+    while (++i < j) {
+      m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2;
+    }
+    m[i] = d;
+    return m;
+  }
+  function d3_svg_lineMonotoneTangents(points) {
+    var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1;
+    while (++i < j) {
+      d = d3_svg_lineSlope(points[i], points[i + 1]);
+      if (abs(d) < ε) {
+        m[i] = m[i + 1] = 0;
+      } else {
+        a = m[i] / d;
+        b = m[i + 1] / d;
+        s = a * a + b * b;
+        if (s > 9) {
+          s = d * 3 / Math.sqrt(s);
+          m[i] = s * a;
+          m[i + 1] = s * b;
+        }
+      }
+    }
+    i = -1;
+    while (++i <= j) {
+      s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i]));
+      tangents.push([ s || 0, m[i] * s || 0 ]);
+    }
+    return tangents;
+  }
+  function d3_svg_lineMonotone(points) {
+    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));
+  }
+  d3.svg.line.radial = function() {
+    var line = d3_svg_line(d3_svg_lineRadial);
+    line.radius = line.x, delete line.x;
+    line.angle = line.y, delete line.y;
+    return line;
+  };
+  function d3_svg_lineRadial(points) {
+    var point, i = -1, n = points.length, r, a;
+    while (++i < n) {
+      point = points[i];
+      r = point[0];
+      a = point[1] - halfπ;
+      point[0] = r * Math.cos(a);
+      point[1] = r * Math.sin(a);
+    }
+    return points;
+  }
+  function d3_svg_area(projection) {
+    var x0 = d3_geom_pointX, x1 = d3_geom_pointX, y0 = 0, y1 = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = "L", tension = .7;
+    function area(data) {
+      var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() {
+        return x;
+      } : d3_functor(x1), fy1 = y0 === y1 ? function() {
+        return y;
+      } : d3_functor(y1), x, y;
+      function segment() {
+        segments.push("M", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), "Z");
+      }
+      while (++i < n) {
+        if (defined.call(this, d = data[i], i)) {
+          points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]);
+          points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]);
+        } else if (points0.length) {
+          segment();
+          points0 = [];
+          points1 = [];
+        }
+      }
+      if (points0.length) segment();
+      return segments.length ? segments.join("") : null;
+    }
+    area.x = function(_) {
+      if (!arguments.length) return x1;
+      x0 = x1 = _;
+      return area;
+    };
+    area.x0 = function(_) {
+      if (!arguments.length) return x0;
+      x0 = _;
+      return area;
+    };
+    area.x1 = function(_) {
+      if (!arguments.length) return x1;
+      x1 = _;
+      return area;
+    };
+    area.y = function(_) {
+      if (!arguments.length) return y1;
+      y0 = y1 = _;
+      return area;
+    };
+    area.y0 = function(_) {
+      if (!arguments.length) return y0;
+      y0 = _;
+      return area;
+    };
+    area.y1 = function(_) {
+      if (!arguments.length) return y1;
+      y1 = _;
+      return area;
+    };
+    area.defined = function(_) {
+      if (!arguments.length) return defined;
+      defined = _;
+      return area;
+    };
+    area.interpolate = function(_) {
+      if (!arguments.length) return interpolateKey;
+      if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;
+      interpolateReverse = interpolate.reverse || interpolate;
+      L = interpolate.closed ? "M" : "L";
+      return area;
+    };
+    area.tension = function(_) {
+      if (!arguments.length) return tension;
+      tension = _;
+      return area;
+    };
+    return area;
+  }
+  d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;
+  d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;
+  d3.svg.area = function() {
+    return d3_svg_area(d3_identity);
+  };
+  d3.svg.area.radial = function() {
+    var area = d3_svg_area(d3_svg_lineRadial);
+    area.radius = area.x, delete area.x;
+    area.innerRadius = area.x0, delete area.x0;
+    area.outerRadius = area.x1, delete area.x1;
+    area.angle = area.y, delete area.y;
+    area.startAngle = area.y0, delete area.y0;
+    area.endAngle = area.y1, delete area.y1;
+    return area;
+  };
+  d3.svg.chord = function() {
+    var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;
+    function chord(d, i) {
+      var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i);
+      return "M" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + "Z";
+    }
+    function subgroup(self, f, d, i) {
+      var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) - halfπ, a1 = endAngle.call(self, subgroup, i) - halfπ;
+      return {
+        r: r,
+        a0: a0,
+        a1: a1,
+        p0: [ r * Math.cos(a0), r * Math.sin(a0) ],
+        p1: [ r * Math.cos(a1), r * Math.sin(a1) ]
+      };
+    }
+    function equals(a, b) {
+      return a.a0 == b.a0 && a.a1 == b.a1;
+    }
+    function arc(r, p, a) {
+      return "A" + r + "," + r + " 0 " + +(a > π) + ",1 " + p;
+    }
+    function curve(r0, p0, r1, p1) {
+      return "Q 0,0 " + p1;
+    }
+    chord.radius = function(v) {
+      if (!arguments.length) return radius;
+      radius = d3_functor(v);
+      return chord;
+    };
+    chord.source = function(v) {
+      if (!arguments.length) return source;
+      source = d3_functor(v);
+      return chord;
+    };
+    chord.target = function(v) {
+      if (!arguments.length) return target;
+      target = d3_functor(v);
+      return chord;
+    };
+    chord.startAngle = function(v) {
+      if (!arguments.length) return startAngle;
+      startAngle = d3_functor(v);
+      return chord;
+    };
+    chord.endAngle = function(v) {
+      if (!arguments.length) return endAngle;
+      endAngle = d3_functor(v);
+      return chord;
+    };
+    return chord;
+  };
+  function d3_svg_chordRadius(d) {
+    return d.radius;
+  }
+  d3.svg.diagonal = function() {
+    var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection;
+    function diagonal(d, i) {
+      var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, {
+        x: p0.x,
+        y: m
+      }, {
+        x: p3.x,
+        y: m
+      }, p3 ];
+      p = p.map(projection);
+      return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3];
+    }
+    diagonal.source = function(x) {
+      if (!arguments.length) return source;
+      source = d3_functor(x);
+      return diagonal;
+    };
+    diagonal.target = function(x) {
+      if (!arguments.length) return target;
+      target = d3_functor(x);
+      return diagonal;
+    };
+    diagonal.projection = function(x) {
+      if (!arguments.length) return projection;
+      projection = x;
+      return diagonal;
+    };
+    return diagonal;
+  };
+  function d3_svg_diagonalProjection(d) {
+    return [ d.x, d.y ];
+  }
+  d3.svg.diagonal.radial = function() {
+    var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection;
+    diagonal.projection = function(x) {
+      return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection;
+    };
+    return diagonal;
+  };
+  function d3_svg_diagonalRadialProjection(projection) {
+    return function() {
+      var d = projection.apply(this, arguments), r = d[0], a = d[1] - halfπ;
+      return [ r * Math.cos(a), r * Math.sin(a) ];
+    };
+  }
+  d3.svg.symbol = function() {
+    var type = d3_svg_symbolType, size = d3_svg_symbolSize;
+    function symbol(d, i) {
+      return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i));
+    }
+    symbol.type = function(x) {
+      if (!arguments.length) return type;
+      type = d3_functor(x);
+      return symbol;
+    };
+    symbol.size = function(x) {
+      if (!arguments.length) return size;
+      size = d3_functor(x);
+      return symbol;
+    };
+    return symbol;
+  };
+  function d3_svg_symbolSize() {
+    return 64;
+  }
+  function d3_svg_symbolType() {
+    return "circle";
+  }
+  function d3_svg_symbolCircle(size) {
+    var r = Math.sqrt(size / π);
+    return "M0," + r + "A" + r + "," + r + " 0 1,1 0," + -r + "A" + r + "," + r + " 0 1,1 0," + r + "Z";
+  }
+  var d3_svg_symbols = d3.map({
+    circle: d3_svg_symbolCircle,
+    cross: function(size) {
+      var r = Math.sqrt(size / 5) / 2;
+      return "M" + -3 * r + "," + -r + "H" + -r + "V" + -3 * r + "H" + r + "V" + -r + "H" + 3 * r + "V" + r + "H" + r + "V" + 3 * r + "H" + -r + "V" + r + "H" + -3 * r + "Z";
+    },
+    diamond: function(size) {
+      var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30;
+      return "M0," + -ry + "L" + rx + ",0" + " 0," + ry + " " + -rx + ",0" + "Z";
+    },
+    square: function(size) {
+      var r = Math.sqrt(size) / 2;
+      return "M" + -r + "," + -r + "L" + r + "," + -r + " " + r + "," + r + " " + -r + "," + r + "Z";
+    },
+    "triangle-down": function(size) {
+      var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;
+      return "M0," + ry + "L" + rx + "," + -ry + " " + -rx + "," + -ry + "Z";
+    },
+    "triangle-up": function(size) {
+      var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;
+      return "M0," + -ry + "L" + rx + "," + ry + " " + -rx + "," + ry + "Z";
+    }
+  });
+  d3.svg.symbolTypes = d3_svg_symbols.keys();
+  var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians);
+  d3_selectionPrototype.transition = function(name) {
+    var id = d3_transitionInheritId || ++d3_transitionId, ns = d3_transitionNamespace(name), subgroups = [], subgroup, node, transition = d3_transitionInherit || {
+      time: Date.now(),
+      ease: d3_ease_cubicInOut,
+      delay: 0,
+      duration: 250
+    };
+    for (var j = -1, m = this.length; ++j < m; ) {
+      subgroups.push(subgroup = []);
+      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
+        if (node = group[i]) d3_transitionNode(node, i, ns, id, transition);
+        subgroup.push(node);
+      }
+    }
+    return d3_transition(subgroups, ns, id);
+  };
+  d3_selectionPrototype.interrupt = function(name) {
+    return this.each(name == null ? d3_selection_interrupt : d3_selection_interruptNS(d3_transitionNamespace(name)));
+  };
+  var d3_selection_interrupt = d3_selection_interruptNS(d3_transitionNamespace());
+  function d3_selection_interruptNS(ns) {
+    return function() {
+      var lock, activeId, active;
+      if ((lock = this[ns]) && (active = lock[activeId = lock.active])) {
+        active.timer.c = null;
+        active.timer.t = NaN;
+        if (--lock.count) delete lock[activeId]; else delete this[ns];
+        lock.active += .5;
+        active.event && active.event.interrupt.call(this, this.__data__, active.index);
+      }
+    };
+  }
+  function d3_transition(groups, ns, id) {
+    d3_subclass(groups, d3_transitionPrototype);
+    groups.namespace = ns;
+    groups.id = id;
+    return groups;
+  }
+  var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit;
+  d3_transitionPrototype.call = d3_selectionPrototype.call;
+  d3_transitionPrototype.empty = d3_selectionPrototype.empty;
+  d3_transitionPrototype.node = d3_selectionPrototype.node;
+  d3_transitionPrototype.size = d3_selectionPrototype.size;
+  d3.transition = function(selection, name) {
+    return selection && selection.transition ? d3_transitionInheritId ? selection.transition(name) : selection : d3.selection().transition(selection);
+  };
+  d3.transition.prototype = d3_transitionPrototype;
+  d3_transitionPrototype.select = function(selector) {
+    var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnode, node;
+    selector = d3_selection_selector(selector);
+    for (var j = -1, m = this.length; ++j < m; ) {
+      subgroups.push(subgroup = []);
+      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
+        if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) {
+          if ("__data__" in node) subnode.__data__ = node.__data__;
+          d3_transitionNode(subnode, i, ns, id, node[ns][id]);
+          subgroup.push(subnode);
+        } else {
+          subgroup.push(null);
+        }
+      }
+    }
+    return d3_transition(subgroups, ns, id);
+  };
+  d3_transitionPrototype.selectAll = function(selector) {
+    var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnodes, node, subnode, transition;
+    selector = d3_selection_selectorAll(selector);
+    for (var j = -1, m = this.length; ++j < m; ) {
+      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
+        if (node = group[i]) {
+          transition = node[ns][id];
+          subnodes = selector.call(node, node.__data__, i, j);
+          subgroups.push(subgroup = []);
+          for (var k = -1, o = subnodes.length; ++k < o; ) {
+            if (subnode = subnodes[k]) d3_transitionNode(subnode, k, ns, id, transition);
+            subgroup.push(subnode);
+          }
+        }
+      }
+    }
+    return d3_transition(subgroups, ns, id);
+  };
+  d3_transitionPrototype.filter = function(filter) {
+    var subgroups = [], subgroup, group, node;
+    if (typeof filter !== "function") filter = d3_selection_filter(filter);
+    for (var j = 0, m = this.length; j < m; j++) {
+      subgroups.push(subgroup = []);
+      for (var group = this[j], i = 0, n = group.length; i < n; i++) {
+        if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {
+          subgroup.push(node);
+        }
+      }
+    }
+    return d3_transition(subgroups, this.namespace, this.id);
+  };
+  d3_transitionPrototype.tween = function(name, tween) {
+    var id = this.id, ns = this.namespace;
+    if (arguments.length < 2) return this.node()[ns][id].tween.get(name);
+    return d3_selection_each(this, tween == null ? function(node) {
+      node[ns][id].tween.remove(name);
+    } : function(node) {
+      node[ns][id].tween.set(name, tween);
+    });
+  };
+  function d3_transition_tween(groups, name, value, tween) {
+    var id = groups.id, ns = groups.namespace;
+    return d3_selection_each(groups, typeof value === "function" ? function(node, i, j) {
+      node[ns][id].tween.set(name, tween(value.call(node, node.__data__, i, j)));
+    } : (value = tween(value), function(node) {
+      node[ns][id].tween.set(name, value);
+    }));
+  }
+  d3_transitionPrototype.attr = function(nameNS, value) {
+    if (arguments.length < 2) {
+      for (value in nameNS) this.attr(value, nameNS[value]);
+      return this;
+    }
+    var interpolate = nameNS == "transform" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS);
+    function attrNull() {
+      this.removeAttribute(name);
+    }
+    function attrNullNS() {
+      this.removeAttributeNS(name.space, name.local);
+    }
+    function attrTween(b) {
+      return b == null ? attrNull : (b += "", function() {
+        var a = this.getAttribute(name), i;
+        return a !== b && (i = interpolate(a, b), function(t) {
+          this.setAttribute(name, i(t));
+        });
+      });
+    }
+    function attrTweenNS(b) {
+      return b == null ? attrNullNS : (b += "", function() {
+        var a = this.getAttributeNS(name.space, name.local), i;
+        return a !== b && (i = interpolate(a, b), function(t) {
+          this.setAttributeNS(name.space, name.local, i(t));
+        });
+      });
+    }
+    return d3_transition_tween(this, "attr." + nameNS, value, name.local ? attrTweenNS : attrTween);
+  };
+  d3_transitionPrototype.attrTween = function(nameNS, tween) {
+    var name = d3.ns.qualify(nameNS);
+    function attrTween(d, i) {
+      var f = tween.call(this, d, i, this.getAttribute(name));
+      return f && function(t) {
+        this.setAttribute(name, f(t));
+      };
+    }
+    function attrTweenNS(d, i) {
+      var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));
+      return f && function(t) {
+        this.setAttributeNS(name.space, name.local, f(t));
+      };
+    }
+    return this.tween("attr." + nameNS, name.local ? attrTweenNS : attrTween);
+  };
+  d3_transitionPrototype.style = function(name, value, priority) {
+    var n = arguments.length;
+    if (n < 3) {
+      if (typeof name !== "string") {
+        if (n < 2) value = "";
+        for (priority in name) this.style(priority, name[priority], value);
+        return this;
+      }
+      priority = "";
+    }
+    function styleNull() {
+      this.style.removeProperty(name);
+    }
+    function styleString(b) {
+      return b == null ? styleNull : (b += "", function() {
+        var a = d3_window(this).getComputedStyle(this, null).getPropertyValue(name), i;
+        return a !== b && (i = d3_interpolate(a, b), function(t) {
+          this.style.setProperty(name, i(t), priority);
+        });
+      });
+    }
+    return d3_transition_tween(this, "style." + name, value, styleString);
+  };
+  d3_transitionPrototype.styleTween = function(name, tween, priority) {
+    if (arguments.length < 3) priority = "";
+    function styleTween(d, i) {
+      var f = tween.call(this, d, i, d3_window(this).getComputedStyle(this, null).getPropertyValue(name));
+      return f && function(t) {
+        this.style.setProperty(name, f(t), priority);
+      };
+    }
+    return this.tween("style." + name, styleTween);
+  };
+  d3_transitionPrototype.text = function(value) {
+    return d3_transition_tween(this, "text", value, d3_transition_text);
+  };
+  function d3_transition_text(b) {
+    if (b == null) b = "";
+    return function() {
+      this.textContent = b;
+    };
+  }
+  d3_transitionPrototype.remove = function() {
+    var ns = this.namespace;
+    return this.each("end.transition", function() {
+      var p;
+      if (this[ns].count < 2 && (p = this.parentNode)) p.removeChild(this);
+    });
+  };
+  d3_transitionPrototype.ease = function(value) {
+    var id = this.id, ns = this.namespace;
+    if (arguments.length < 1) return this.node()[ns][id].ease;
+    if (typeof value !== "function") value = d3.ease.apply(d3, arguments);
+    return d3_selection_each(this, function(node) {
+      node[ns][id].ease = value;
+    });
+  };
+  d3_transitionPrototype.delay = function(value) {
+    var id = this.id, ns = this.namespace;
+    if (arguments.length < 1) return this.node()[ns][id].delay;
+    return d3_selection_each(this, typeof value === "function" ? function(node, i, j) {
+      node[ns][id].delay = +value.call(node, node.__data__, i, j);
+    } : (value = +value, function(node) {
+      node[ns][id].delay = value;
+    }));
+  };
+  d3_transitionPrototype.duration = function(value) {
+    var id = this.id, ns = this.namespace;
+    if (arguments.length < 1) return this.node()[ns][id].duration;
+    return d3_selection_each(this, typeof value === "function" ? function(node, i, j) {
+      node[ns][id].duration = Math.max(1, value.call(node, node.__data__, i, j));
+    } : (value = Math.max(1, value), function(node) {
+      node[ns][id].duration = value;
+    }));
+  };
+  d3_transitionPrototype.each = function(type, listener) {
+    var id = this.id, ns = this.namespace;
+    if (arguments.length < 2) {
+      var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId;
+      try {
+        d3_transitionInheritId = id;
+        d3_selection_each(this, function(node, i, j) {
+          d3_transitionInherit = node[ns][id];
+          type.call(node, node.__data__, i, j);
+        });
+      } finally {
+        d3_transitionInherit = inherit;
+        d3_transitionInheritId = inheritId;
+      }
+    } else {
+      d3_selection_each(this, function(node) {
+        var transition = node[ns][id];
+        (transition.event || (transition.event = d3.dispatch("start", "end", "interrupt"))).on(type, listener);
+      });
+    }
+    return this;
+  };
+  d3_transitionPrototype.transition = function() {
+    var id0 = this.id, id1 = ++d3_transitionId, ns = this.namespace, subgroups = [], subgroup, group, node, transition;
+    for (var j = 0, m = this.length; j < m; j++) {
+      subgroups.push(subgroup = []);
+      for (var group = this[j], i = 0, n = group.length; i < n; i++) {
+        if (node = group[i]) {
+          transition = node[ns][id0];
+          d3_transitionNode(node, i, ns, id1, {
+            time: transition.time,
+            ease: transition.ease,
+            delay: transition.delay + transition.duration,
+            duration: transition.duration
+          });
+        }
+        subgroup.push(node);
+      }
+    }
+    return d3_transition(subgroups, ns, id1);
+  };
+  function d3_transitionNamespace(name) {
+    return name == null ? "__transition__" : "__transition_" + name + "__";
+  }
+  function d3_transitionNode(node, i, ns, id, inherit) {
+    var lock = node[ns] || (node[ns] = {
+      active: 0,
+      count: 0
+    }), transition = lock[id], time, timer, duration, ease, tweens;
+    function schedule(elapsed) {
+      var delay = transition.delay;
+      timer.t = delay + time;
+      if (delay <= elapsed) return start(elapsed - delay);
+      timer.c = start;
+    }
+    function start(elapsed) {
+      var activeId = lock.active, active = lock[activeId];
+      if (active) {
+        active.timer.c = null;
+        active.timer.t = NaN;
+        --lock.count;
+        delete lock[activeId];
+        active.event && active.event.interrupt.call(node, node.__data__, active.index);
+      }
+      for (var cancelId in lock) {
+        if (+cancelId < id) {
+          var cancel = lock[cancelId];
+          cancel.timer.c = null;
+          cancel.timer.t = NaN;
+          --lock.count;
+          delete lock[cancelId];
+        }
+      }
+      timer.c = tick;
+      d3_timer(function() {
+        if (timer.c && tick(elapsed || 1)) {
+          timer.c = null;
+          timer.t = NaN;
+        }
+        return 1;
+      }, 0, time);
+      lock.active = id;
+      transition.event && transition.event.start.call(node, node.__data__, i);
+      tweens = [];
+      transition.tween.forEach(function(key, value) {
+        if (value = value.call(node, node.__data__, i)) {
+          tweens.push(value);
+        }
+      });
+      ease = transition.ease;
+      duration = transition.duration;
+    }
+    function tick(elapsed) {
+      var t = elapsed / duration, e = ease(t), n = tweens.length;
+      while (n > 0) {
+        tweens[--n].call(node, e);
+      }
+      if (t >= 1) {
+        transition.event && transition.event.end.call(node, node.__data__, i);
+        if (--lock.count) delete lock[id]; else delete node[ns];
+        return 1;
+      }
+    }
+    if (!transition) {
+      time = inherit.time;
+      timer = d3_timer(schedule, 0, time);
+      transition = lock[id] = {
+        tween: new d3_Map(),
+        time: time,
+        timer: timer,
+        delay: inherit.delay,
+        duration: inherit.duration,
+        ease: inherit.ease,
+        index: i
+      };
+      inherit = null;
+      ++lock.count;
+    }
+  }
+  d3.svg.axis = function() {
+    var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_;
+    function axis(g) {
+      g.each(function() {
+        var g = d3.select(this);
+        var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = scale.copy();
+        var ticks = tickValues == null ? scale1.ticks ? scale1.ticks.apply(scale1, tickArguments_) : scale1.domain() : tickValues, tickFormat = tickFormat_ == null ? scale1.tickFormat ? scale1.tickFormat.apply(scale1, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(".tick").data(ticks, scale1), tickEnter = tick.enter().insert("g", ".domain").attr("class", "tick").style("opacity", ε), tickExit = d3.transition(tick.exit()).style("opacity", ε).remove(), tickUpdate = d3.transition(tick.order()).style("opacity", 1), tickSpacing = Math.max(innerTickSize, 0) + tickPadding, tickTransform;
+        var range = d3_scaleRange(scale1), path = g.selectAll(".domain").data([ 0 ]), pathUpdate = (path.enter().append("path").attr("class", "domain"), 
+        d3.transition(path));
+        tickEnter.append("line");
+        tickEnter.append("text");
+        var lineEnter = tickEnter.select("line"), lineUpdate = tickUpdate.select("line"), text = tick.select("text").text(tickFormat), textEnter = tickEnter.select("text"), textUpdate = tickUpdate.select("text"), sign = orient === "top" || orient === "left" ? -1 : 1, x1, x2, y1, y2;
+        if (orient === "bottom" || orient === "top") {
+          tickTransform = d3_svg_axisX, x1 = "x", y1 = "y", x2 = "x2", y2 = "y2";
+          text.attr("dy", sign < 0 ? "0em" : ".71em").style("text-anchor", "middle");
+          pathUpdate.attr("d", "M" + range[0] + "," + sign * outerTickSize + "V0H" + range[1] + "V" + sign * outerTickSize);
+        } else {
+          tickTransform = d3_svg_axisY, x1 = "y", y1 = "x", x2 = "y2", y2 = "x2";
+          text.attr("dy", ".32em").style("text-anchor", sign < 0 ? "end" : "start");
+          pathUpdate.attr("d", "M" + sign * outerTickSize + "," + range[0] + "H0V" + range[1] + "H" + sign * outerTickSize);
+        }
+        lineEnter.attr(y2, sign * innerTickSize);
+        textEnter.attr(y1, sign * tickSpacing);
+        lineUpdate.attr(x2, 0).attr(y2, sign * innerTickSize);
+        textUpdate.attr(x1, 0).attr(y1, sign * tickSpacing);
+        if (scale1.rangeBand) {
+          var x = scale1, dx = x.rangeBand() / 2;
+          scale0 = scale1 = function(d) {
+            return x(d) + dx;
+          };
+        } else if (scale0.rangeBand) {
+          scale0 = scale1;
+        } else {
+          tickExit.call(tickTransform, scale1, scale0);
+        }
+        tickEnter.call(tickTransform, scale0, scale1);
+        tickUpdate.call(tickTransform, scale1, scale1);
+      });
+    }
+    axis.scale = function(x) {
+      if (!arguments.length) return scale;
+      scale = x;
+      return axis;
+    };
+    axis.orient = function(x) {
+      if (!arguments.length) return orient;
+      orient = x in d3_svg_axisOrients ? x + "" : d3_svg_axisDefaultOrient;
+      return axis;
+    };
+    axis.ticks = function() {
+      if (!arguments.length) return tickArguments_;
+      tickArguments_ = d3_array(arguments);
+      return axis;
+    };
+    axis.tickValues = function(x) {
+      if (!arguments.length) return tickValues;
+      tickValues = x;
+      return axis;
+    };
+    axis.tickFormat = function(x) {
+      if (!arguments.length) return tickFormat_;
+      tickFormat_ = x;
+      return axis;
+    };
+    axis.tickSize = function(x) {
+      var n = arguments.length;
+      if (!n) return innerTickSize;
+      innerTickSize = +x;
+      outerTickSize = +arguments[n - 1];
+      return axis;
+    };
+    axis.innerTickSize = function(x) {
+      if (!arguments.length) return innerTickSize;
+      innerTickSize = +x;
+      return axis;
+    };
+    axis.outerTickSize = function(x) {
+      if (!arguments.length) return outerTickSize;
+      outerTickSize = +x;
+      return axis;
+    };
+    axis.tickPadding = function(x) {
+      if (!arguments.length) return tickPadding;
+      tickPadding = +x;
+      return axis;
+    };
+    axis.tickSubdivide = function() {
+      return arguments.length && axis;
+    };
+    return axis;
+  };
+  var d3_svg_axisDefaultOrient = "bottom", d3_svg_axisOrients = {
+    top: 1,
+    right: 1,
+    bottom: 1,
+    left: 1
+  };
+  function d3_svg_axisX(selection, x0, x1) {
+    selection.attr("transform", function(d) {
+      var v0 = x0(d);
+      return "translate(" + (isFinite(v0) ? v0 : x1(d)) + ",0)";
+    });
+  }
+  function d3_svg_axisY(selection, y0, y1) {
+    selection.attr("transform", function(d) {
+      var v0 = y0(d);
+      return "translate(0," + (isFinite(v0) ? v0 : y1(d)) + ")";
+    });
+  }
+  d3.svg.brush = function() {
+    var event = d3_eventDispatch(brush, "brushstart", "brush", "brushend"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0];
+    function brush(g) {
+      g.each(function() {
+        var g = d3.select(this).style("pointer-events", "all").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)").on("mousedown.brush", brushstart).on("touchstart.brush", brushstart);
+        var background = g.selectAll(".background").data([ 0 ]);
+        background.enter().append("rect").attr("class", "background").style("visibility", "hidden").style("cursor", "crosshair");
+        g.selectAll(".extent").data([ 0 ]).enter().append("rect").attr("class", "extent").style("cursor", "move");
+        var resize = g.selectAll(".resize").data(resizes, d3_identity);
+        resize.exit().remove();
+        resize.enter().append("g").attr("class", function(d) {
+          return "resize " + d;
+        }).style("cursor", function(d) {
+          return d3_svg_brushCursor[d];
+        }).append("rect").attr("x", function(d) {
+          return /[ew]$/.test(d) ? -3 : null;
+        }).attr("y", function(d) {
+          return /^[ns]/.test(d) ? -3 : null;
+        }).attr("width", 6).attr("height", 6).style("visibility", "hidden");
+        resize.style("display", brush.empty() ? "none" : null);
+        var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range;
+        if (x) {
+          range = d3_scaleRange(x);
+          backgroundUpdate.attr("x", range[0]).attr("width", range[1] - range[0]);
+          redrawX(gUpdate);
+        }
+        if (y) {
+          range = d3_scaleRange(y);
+          backgroundUpdate.attr("y", range[0]).attr("height", range[1] - range[0]);
+          redrawY(gUpdate);
+        }
+        redraw(gUpdate);
+      });
+    }
+    brush.event = function(g) {
+      g.each(function() {
+        var event_ = event.of(this, arguments), extent1 = {
+          x: xExtent,
+          y: yExtent,
+          i: xExtentDomain,
+          j: yExtentDomain
+        }, extent0 = this.__chart__ || extent1;
+        this.__chart__ = extent1;
+        if (d3_transitionInheritId) {
+          d3.select(this).transition().each("start.brush", function() {
+            xExtentDomain = extent0.i;
+            yExtentDomain = extent0.j;
+            xExtent = extent0.x;
+            yExtent = extent0.y;
+            event_({
+              type: "brushstart"
+            });
+          }).tween("brush:brush", function() {
+            var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y);
+            xExtentDomain = yExtentDomain = null;
+            return function(t) {
+              xExtent = extent1.x = xi(t);
+              yExtent = extent1.y = yi(t);
+              event_({
+                type: "brush",
+                mode: "resize"
+              });
+            };
+          }).each("end.brush", function() {
+            xExtentDomain = extent1.i;
+            yExtentDomain = extent1.j;
+            event_({
+              type: "brush",
+              mode: "resize"
+            });
+            event_({
+              type: "brushend"
+            });
+          });
+        } else {
+          event_({
+            type: "brushstart"
+          });
+          event_({
+            type: "brush",
+            mode: "resize"
+          });
+          event_({
+            type: "brushend"
+          });
+        }
+      });
+    };
+    function redraw(g) {
+      g.selectAll(".resize").attr("transform", function(d) {
+        return "translate(" + xExtent[+/e$/.test(d)] + "," + yExtent[+/^s/.test(d)] + ")";
+      });
+    }
+    function redrawX(g) {
+      g.select(".extent").attr("x", xExtent[0]);
+      g.selectAll(".extent,.n>rect,.s>rect").attr("width", xExtent[1] - xExtent[0]);
+    }
+    function redrawY(g) {
+      g.select(".extent").attr("y", yExtent[0]);
+      g.selectAll(".extent,.e>rect,.w>rect").attr("height", yExtent[1] - yExtent[0]);
+    }
+    function brushstart() {
+      var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed("extent"), dragRestore = d3_event_dragSuppress(target), center, origin = d3.mouse(target), offset;
+      var w = d3.select(d3_window(target)).on("keydown.brush", keydown).on("keyup.brush", keyup);
+      if (d3.event.changedTouches) {
+        w.on("touchmove.brush", brushmove).on("touchend.brush", brushend);
+      } else {
+        w.on("mousemove.brush", brushmove).on("mouseup.brush", brushend);
+      }
+      g.interrupt().selectAll("*").interrupt();
+      if (dragging) {
+        origin[0] = xExtent[0] - origin[0];
+        origin[1] = yExtent[0] - origin[1];
+      } else if (resizing) {
+        var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing);
+        offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ];
+        origin[0] = xExtent[ex];
+        origin[1] = yExtent[ey];
+      } else if (d3.event.altKey) center = origin.slice();
+      g.style("pointer-events", "none").selectAll(".resize").style("display", null);
+      d3.select("body").style("cursor", eventTarget.style("cursor"));
+      event_({
+        type: "brushstart"
+      });
+      brushmove();
+      function keydown() {
+        if (d3.event.keyCode == 32) {
+          if (!dragging) {
+            center = null;
+            origin[0] -= xExtent[1];
+            origin[1] -= yExtent[1];
+            dragging = 2;
+          }
+          d3_eventPreventDefault();
+        }
+      }
+      function keyup() {
+        if (d3.event.keyCode == 32 && dragging == 2) {
+          origin[0] += xExtent[1];
+          origin[1] += yExtent[1];
+          dragging = 0;
+          d3_eventPreventDefault();
+        }
+      }
+      function brushmove() {
+        var point = d3.mouse(target), moved = false;
+        if (offset) {
+          point[0] += offset[0];
+          point[1] += offset[1];
+        }
+        if (!dragging) {
+          if (d3.event.altKey) {
+            if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ];
+            origin[0] = xExtent[+(point[0] < center[0])];
+            origin[1] = yExtent[+(point[1] < center[1])];
+          } else center = null;
+        }
+        if (resizingX && move1(point, x, 0)) {
+          redrawX(g);
+          moved = true;
+        }
+        if (resizingY && move1(point, y, 1)) {
+          redrawY(g);
+          moved = true;
+        }
+        if (moved) {
+          redraw(g);
+          event_({
+            type: "brush",
+            mode: dragging ? "move" : "resize"
+          });
+        }
+      }
+      function move1(point, scale, i) {
+        var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max;
+        if (dragging) {
+          r0 -= position;
+          r1 -= size + position;
+        }
+        min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i];
+        if (dragging) {
+          max = (min += position) + size;
+        } else {
+          if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min));
+          if (position < min) {
+            max = min;
+            min = position;
+          } else {
+            max = position;
+          }
+        }
+        if (extent[0] != min || extent[1] != max) {
+          if (i) yExtentDomain = null; else xExtentDomain = null;
+          extent[0] = min;
+          extent[1] = max;
+          return true;
+        }
+      }
+      function brushend() {
+        brushmove();
+        g.style("pointer-events", "all").selectAll(".resize").style("display", brush.empty() ? "none" : null);
+        d3.select("body").style("cursor", null);
+        w.on("mousemove.brush", null).on("mouseup.brush", null).on("touchmove.brush", null).on("touchend.brush", null).on("keydown.brush", null).on("keyup.brush", null);
+        dragRestore();
+        event_({
+          type: "brushend"
+        });
+      }
+    }
+    brush.x = function(z) {
+      if (!arguments.length) return x;
+      x = z;
+      resizes = d3_svg_brushResizes[!x << 1 | !y];
+      return brush;
+    };
+    brush.y = function(z) {
+      if (!arguments.length) return y;
+      y = z;
+      resizes = d3_svg_brushResizes[!x << 1 | !y];
+      return brush;
+    };
+    brush.clamp = function(z) {
+      if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null;
+      if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z;
+      return brush;
+    };
+    brush.extent = function(z) {
+      var x0, x1, y0, y1, t;
+      if (!arguments.length) {
+        if (x) {
+          if (xExtentDomain) {
+            x0 = xExtentDomain[0], x1 = xExtentDomain[1];
+          } else {
+            x0 = xExtent[0], x1 = xExtent[1];
+            if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);
+            if (x1 < x0) t = x0, x0 = x1, x1 = t;
+          }
+        }
+        if (y) {
+          if (yExtentDomain) {
+            y0 = yExtentDomain[0], y1 = yExtentDomain[1];
+          } else {
+            y0 = yExtent[0], y1 = yExtent[1];
+            if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);
+            if (y1 < y0) t = y0, y0 = y1, y1 = t;
+          }
+        }
+        return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ];
+      }
+      if (x) {
+        x0 = z[0], x1 = z[1];
+        if (y) x0 = x0[0], x1 = x1[0];
+        xExtentDomain = [ x0, x1 ];
+        if (x.invert) x0 = x(x0), x1 = x(x1);
+        if (x1 < x0) t = x0, x0 = x1, x1 = t;
+        if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ];
+      }
+      if (y) {
+        y0 = z[0], y1 = z[1];
+        if (x) y0 = y0[1], y1 = y1[1];
+        yExtentDomain = [ y0, y1 ];
+        if (y.invert) y0 = y(y0), y1 = y(y1);
+        if (y1 < y0) t = y0, y0 = y1, y1 = t;
+        if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ];
+      }
+      return brush;
+    };
+    brush.clear = function() {
+      if (!brush.empty()) {
+        xExtent = [ 0, 0 ], yExtent = [ 0, 0 ];
+        xExtentDomain = yExtentDomain = null;
+      }
+      return brush;
+    };
+    brush.empty = function() {
+      return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1];
+    };
+    return d3.rebind(brush, event, "on");
+  };
+  var d3_svg_brushCursor = {
+    n: "ns-resize",
+    e: "ew-resize",
+    s: "ns-resize",
+    w: "ew-resize",
+    nw: "nwse-resize",
+    ne: "nesw-resize",
+    se: "nwse-resize",
+    sw: "nesw-resize"
+  };
+  var d3_svg_brushResizes = [ [ "n", "e", "s", "w", "nw", "ne", "se", "sw" ], [ "e", "w" ], [ "n", "s" ], [] ];
+  var d3_time_format = d3_time.format = d3_locale_enUS.timeFormat;
+  var d3_time_formatUtc = d3_time_format.utc;
+  var d3_time_formatIso = d3_time_formatUtc("%Y-%m-%dT%H:%M:%S.%LZ");
+  d3_time_format.iso = Date.prototype.toISOString && +new Date("2000-01-01T00:00:00.000Z") ? d3_time_formatIsoNative : d3_time_formatIso;
+  function d3_time_formatIsoNative(date) {
+    return date.toISOString();
+  }
+  d3_time_formatIsoNative.parse = function(string) {
+    var date = new Date(string);
+    return isNaN(date) ? null : date;
+  };
+  d3_time_formatIsoNative.toString = d3_time_formatIso.toString;
+  d3_time.second = d3_time_interval(function(date) {
+    return new d3_date(Math.floor(date / 1e3) * 1e3);
+  }, function(date, offset) {
+    date.setTime(date.getTime() + Math.floor(offset) * 1e3);
+  }, function(date) {
+    return date.getSeconds();
+  });
+  d3_time.seconds = d3_time.second.range;
+  d3_time.seconds.utc = d3_time.second.utc.range;
+  d3_time.minute = d3_time_interval(function(date) {
+    return new d3_date(Math.floor(date / 6e4) * 6e4);
+  }, function(date, offset) {
+    date.setTime(date.getTime() + Math.floor(offset) * 6e4);
+  }, function(date) {
+    return date.getMinutes();
+  });
+  d3_time.minutes = d3_time.minute.range;
+  d3_time.minutes.utc = d3_time.minute.utc.range;
+  d3_time.hour = d3_time_interval(function(date) {
+    var timezone = date.getTimezoneOffset() / 60;
+    return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5);
+  }, function(date, offset) {
+    date.setTime(date.getTime() + Math.floor(offset) * 36e5);
+  }, function(date) {
+    return date.getHours();
+  });
+  d3_time.hours = d3_time.hour.range;
+  d3_time.hours.utc = d3_time.hour.utc.range;
+  d3_time.month = d3_time_interval(function(date) {
+    date = d3_time.day(date);
+    date.setDate(1);
+    return date;
+  }, function(date, offset) {
+    date.setMonth(date.getMonth() + offset);
+  }, function(date) {
+    return date.getMonth();
+  });
+  d3_time.months = d3_time.month.range;
+  d3_time.months.utc = d3_time.month.utc.range;
+  function d3_time_scale(linear, methods, format) {
+    function scale(x) {
+      return linear(x);
+    }
+    scale.invert = function(x) {
+      return d3_time_scaleDate(linear.invert(x));
+    };
+    scale.domain = function(x) {
+      if (!arguments.length) return linear.domain().map(d3_time_scaleDate);
+      linear.domain(x);
+      return scale;
+    };
+    function tickMethod(extent, count) {
+      var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target);
+      return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) {
+        return d / 31536e6;
+      }), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i];
+    }
+    scale.nice = function(interval, skip) {
+      var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === "number" && tickMethod(extent, interval);
+      if (method) interval = method[0], skip = method[1];
+      function skipped(date) {
+        return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length;
+      }
+      return scale.domain(d3_scale_nice(domain, skip > 1 ? {
+        floor: function(date) {
+          while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1);
+          return date;
+        },
+        ceil: function(date) {
+          while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1);
+          return date;
+        }
+      } : interval));
+    };
+    scale.ticks = function(interval, skip) {
+      var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === "number" ? tickMethod(extent, interval) : !interval.range && [ {
+        range: interval
+      }, skip ];
+      if (method) interval = method[0], skip = method[1];
+      return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip < 1 ? 1 : skip);
+    };
+    scale.tickFormat = function() {
+      return format;
+    };
+    scale.copy = function() {
+      return d3_time_scale(linear.copy(), methods, format);
+    };
+    return d3_scale_linearRebind(scale, linear);
+  }
+  function d3_time_scaleDate(t) {
+    return new Date(t);
+  }
+  var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ];
+  var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ];
+  var d3_time_scaleLocalFormat = d3_time_format.multi([ [ ".%L", function(d) {
+    return d.getMilliseconds();
+  } ], [ ":%S", function(d) {
+    return d.getSeconds();
+  } ], [ "%I:%M", function(d) {
+    return d.getMinutes();
+  } ], [ "%I %p", function(d) {
+    return d.getHours();
+  } ], [ "%a %d", function(d) {
+    return d.getDay() && d.getDate() != 1;
+  } ], [ "%b %d", function(d) {
+    return d.getDate() != 1;
+  } ], [ "%B", function(d) {
+    return d.getMonth();
+  } ], [ "%Y", d3_true ] ]);
+  var d3_time_scaleMilliseconds = {
+    range: function(start, stop, step) {
+      return d3.range(Math.ceil(start / step) * step, +stop, step).map(d3_time_scaleDate);
+    },
+    floor: d3_identity,
+    ceil: d3_identity
+  };
+  d3_time_scaleLocalMethods.year = d3_time.year;
+  d3_time.scale = function() {
+    return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);
+  };
+  var d3_time_scaleUtcMethods = d3_time_scaleLocalMethods.map(function(m) {
+    return [ m[0].utc, m[1] ];
+  });
+  var d3_time_scaleUtcFormat = d3_time_formatUtc.multi([ [ ".%L", function(d) {
+    return d.getUTCMilliseconds();
+  } ], [ ":%S", function(d) {
+    return d.getUTCSeconds();
+  } ], [ "%I:%M", function(d) {
+    return d.getUTCMinutes();
+  } ], [ "%I %p", function(d) {
+    return d.getUTCHours();
+  } ], [ "%a %d", function(d) {
+    return d.getUTCDay() && d.getUTCDate() != 1;
+  } ], [ "%b %d", function(d) {
+    return d.getUTCDate() != 1;
+  } ], [ "%B", function(d) {
+    return d.getUTCMonth();
+  } ], [ "%Y", d3_true ] ]);
+  d3_time_scaleUtcMethods.year = d3_time.year.utc;
+  d3_time.scale.utc = function() {
+    return d3_time_scale(d3.scale.linear(), d3_time_scaleUtcMethods, d3_time_scaleUtcFormat);
+  };
+  d3.text = d3_xhrType(function(request) {
+    return request.responseText;
+  });
+  d3.json = function(url, callback) {
+    return d3_xhr(url, "application/json", d3_json, callback);
+  };
+  function d3_json(request) {
+    return JSON.parse(request.responseText);
+  }
+  d3.html = function(url, callback) {
+    return d3_xhr(url, "text/html", d3_html, callback);
+  };
+  function d3_html(request) {
+    var range = d3_document.createRange();
+    range.selectNode(d3_document.body);
+    return range.createContextualFragment(request.responseText);
+  }
+  d3.xml = d3_xhrType(function(request) {
+    return request.responseXML;
+  });
+  if (typeof define === "function" && define.amd) this.d3 = d3, define(d3); else if (typeof module === "object" && module.exports) module.exports = d3; else this.d3 = d3;
+}();
diff --git a/doc/contributing.texi b/doc/contributing.texi
index 18d891db4e..9fc1eb54d8 100644
--- a/doc/contributing.texi
+++ b/doc/contributing.texi
@@ -187,9 +187,6 @@ facilities to directly operate on the syntax tree, such as raising an
 s-expression or wrapping it, swallowing or rejecting the following
 s-expression, etc.
 
-GNU Guix also comes with a minor mode that provides some additional
-functionality for Scheme buffers (@pxref{Emacs Development}).
-
 
 @node Coding Style
 @section Coding Style
@@ -240,6 +237,8 @@ especially when matching lists.
 @node Formatting Code
 @subsection Formatting Code
 
+@cindex formatting code
+@cindex coding style
 When writing Scheme code, we follow common wisdom among Scheme
 programmers.  In general, we follow the
 @url{http://mumble.net/~campbell/scheme/style.txt, Riastradh's Lisp
@@ -249,8 +248,20 @@ please do read it.
 
 Some special forms introduced in Guix, such as the @code{substitute*}
 macro, have special indentation rules.  These are defined in the
-@file{.dir-locals.el} file, which Emacs automatically uses.  If you do
-not use Emacs, please make sure to let your editor know the rules.
+@file{.dir-locals.el} file, which Emacs automatically uses.
+
+@cindex indentation, of code
+@cindex formatting, of code
+If you do not use Emacs, please make sure to let your editor knows these
+rules.  To automatically indent a package definition, you can also run:
+
+@example
+./etc/indent-package.el gnu/packages/@var{file}.scm @var{package}
+@end example
+
+@noindent
+This automatically indents the definition of @var{package} in
+@file{gnu/packages/@var{file}.scm} by running Emacs in batch mode.
 
 We require all top-level procedures to carry a docstring.  This
 requirement can be relaxed for simple private procedures in the
@@ -361,6 +372,11 @@ Bundling unrelated changes together makes reviewing harder and slower.
 Examples of unrelated changes include the addition of several packages,
 or a package update along with fixes to that package.
 
+@item
+Please follow our code formatting rules, possibly running the
+@command{etc/indent-package.el} script to do that automatically for you
+(@pxref{Formatting Code}).
+
 @end enumerate
 
 When posting a patch to the mailing list, use @samp{[PATCH] @dots{}} as
@@ -368,4 +384,4 @@ a subject.  You may use your email client or the @command{git
 send-email} command.  We prefer to get patches in plain text messages,
 either inline or as MIME attachments.  You are advised to pay attention if
 your email client changes anything like line breaks or indentation which
-could could potentially break the patches.
+could potentially break the patches.
diff --git a/doc/emacs.texi b/doc/emacs.texi
deleted file mode 100644
index 1ffb9f636e..0000000000
--- a/doc/emacs.texi
+++ /dev/null
@@ -1,881 +0,0 @@
-@node Emacs Interface
-@chapter Emacs Interface
-
-@cindex Emacs
-GNU Guix comes with several useful modules (known as ``guix.el'') for
-GNU@tie{}Emacs which are intended to make an Emacs user interaction with
-Guix convenient and fun.
-
-@menu
-* Initial Setup: Emacs Initial Setup.	Preparing @file{~/.emacs}.
-* Package Management: Emacs Package Management.	Managing packages and generations.
-* Licenses: Emacs Licenses.		Interface for licenses of Guix packages.
-* Package Source Locations: Emacs Package Locations.	Interface for package location files.
-* Popup Interface: Emacs Popup Interface.	Magit-like interface for guix commands.
-* Prettify Mode: Emacs Prettify.	Abbreviating @file{/gnu/store/@dots{}} file names.
-* Build Log Mode: Emacs Build Log.	Highlighting Guix build logs.
-* Completions: Emacs Completions.	Completing @command{guix} shell command.
-* Development: Emacs Development.	Tools for Guix developers.
-* Hydra: Emacs Hydra.			Interface for Guix build farm.
-@end menu
-
-
-@node Emacs Initial Setup
-@section Initial Setup
-
-On the Guix System Distribution (@pxref{GNU Distribution}), ``guix.el''
-is ready to use, provided Guix is installed system-wide, which is the
-case by default.  So if that is what you're using, you can happily skip
-this section and read about the fun stuff.
-
-If you're not yet a happy user of GuixSD, a little bit of setup is needed.
-To be able to use ``guix.el'', you need to install the following
-packages:
-
-@itemize
-@item
-@uref{http://www.gnu.org/software/emacs/, GNU Emacs}, version 24.3 or
-later;
-
-@item
-@uref{http://nongnu.org/geiser/, Geiser}, version 0.3 or later: it is
-used for interacting with the Guile process.
-
-@item
-@uref{https://github.com/magit/magit/, magit-popup library}.  You
-already have this library if you use Magit 2.1.0 or later.  This library
-is an optional dependency---it is required only for @kbd{M-x@tie{}guix}
-command (@pxref{Emacs Popup Interface}).
-
-@end itemize
-
-When it is done, ``guix.el'' may be configured by requiring
-@code{guix-autoloads} file.  If you install Guix in your user profile,
-this auto-loading is done automatically by our Emacs package
-(@pxref{Application Setup}), so a universal recipe for configuring
-``guix.el'' is: @command{guix package -i guix}.  If you do this, there
-is no need to read further.
-
-For the manual installation, you need to add the following code into
-your init file (@pxref{Init File,,, emacs, The GNU Emacs Manual}):
-
-@example
-(add-to-list 'load-path "/path/to/directory-with-guix.el")
-(require 'guix-autoloads nil t)
-@end example
-
-So the only thing you need to figure out is where the directory with
-elisp files for Guix is placed.  It depends on how you installed Guix:
-
-@itemize
-@item
-If it was installed by a package manager of your distribution or by a
-usual @code{./configure && make && make install} command sequence, then
-elisp files are placed in a standard directory with Emacs packages
-(usually it is @file{/usr/share/emacs/site-lisp/}), which is already in
-@code{load-path}, so there is no need to add that directory there.  Note
-that if you don't update this installation periodically, you may get an
-outdated Emacs code which does not work with the current Guile code of
-Guix.
-
-@item
-If you used a binary installation method (@pxref{Binary Installation}),
-then Guix is installed somewhere in the store, so the elisp files are
-placed in @file{/gnu/store/@dots{}-guix-0.8.2/share/emacs/site-lisp/} or
-alike.  However it is not recommended to refer directly to a store
-directory, as it may be garbage-collected one day.  So a better choice
-would be to install Guix using Guix itself with @command{guix package -i
-guix}.
-
-@item
-If you did not install Guix at all and prefer a hacking way
-(@pxref{Running Guix Before It Is Installed}), along with augmenting
-@code{load-path} you need to set @code{guix-load-path} variable to the
-same directory, so your final configuration will look like this:
-
-@example
-(let ((dir "/path/to/your-guix-git-tree/emacs"))
-  (add-to-list 'load-path dir)
-  (setq guix-load-path dir))
-(require 'guix-autoloads nil t)
-@end example
-@end itemize
-
-
-@node Emacs Package Management
-@section Package Management
-
-Once ``guix.el'' has been successfully configured, you should be able to
-use a visual interface for routine package management tasks, pretty much
-like the @command{guix package} command (@pxref{Invoking guix package}).
-Specifically, it makes it easy to:
-
-@itemize
-@item browse and display packages and generations;
-@item search, install, upgrade and remove packages;
-@item display packages from previous generations;
-@item do some other useful things.
-@end itemize
-
-@menu
-* Commands: Emacs Commands.			@kbd{M-x guix-@dots{}}
-* General information: Emacs General info.	Common for both interfaces.
-* ``List'' buffer: Emacs List buffer.		List-like interface.
-* ``Info'' buffer: Emacs Info buffer.		Help-like interface.
-* Configuration: Emacs Configuration.		Configuring the interface.
-@end menu
-
-@node Emacs Commands
-@subsection Commands
-
-All commands for displaying packages and generations use the current
-profile, which can be changed with
-@kbd{M-x@tie{}guix-set-current-profile}.  Alternatively, if you call any
-of these commands with prefix argument (@kbd{C-u}), you will be prompted
-for a profile just for that command.
-
-Commands for displaying packages:
-
-@table @kbd
-
-@item M-x guix-all-available-packages
-@itemx M-x guix-newest-available-packages
-Display all/newest available packages.
-
-@item M-x guix-installed-packages
-@itemx M-x guix-installed-user-packages
-@itemx M-x guix-installed-system-packages
-Display installed packages.  As described above, @kbd{M-x
-guix-installed-packages} uses an arbitrary profile that you can specify,
-while the other commands display packages installed in 2 special
-profiles: @file{~/.guix-profile} and @file{/run/current-system/profile}
-(only on GuixSD).
-
-@item M-x guix-obsolete-packages
-Display obsolete packages (the packages that are installed in a profile
-but cannot be found among available packages).
-
-@item M-x guix-packages-by-name
-Display package(s) with the specified name.
-
-@item M-x guix-packages-by-license
-Display package(s) with the specified license.
-
-@item M-x guix-packages-by-location
-Display package(s) located in the specified file.  These files usually
-have the following form: @file{gnu/packages/emacs.scm}, but don't type
-them manually!  Press @key{TAB} to complete the file name.
-
-@item M-x guix-package-from-file
-Display package that the code within the specified file evaluates to.
-@xref{Invoking guix package, @code{--install-from-file}}, for an example
-of what such a file may look like.
-
-@item M-x guix-search-by-regexp
-Search for packages by a specified regexp.  By default ``name'',
-``synopsis'' and ``description'' of the packages will be searched.  This
-can be changed by modifying @code{guix-package-search-params} variable.
-
-@item M-x guix-search-by-name
-Search for packages with names matching a specified regexp.  This
-command is the same as @code{guix-search-by-regexp}, except only a
-package ``name'' is searched.
-
-@end table
-
-By default, these commands display each output on a separate line.  If
-you prefer to see a list of packages---i.e., a list with a package per
-line, use the following setting:
-
-@example
-(setq guix-package-list-type 'package)
-@end example
-
-Commands for displaying generations:
-
-@table @kbd
-
-@item M-x guix-generations
-List all the generations.
-
-@item M-x guix-last-generations
-List the @var{N} last generations.  You will be prompted for the number
-of generations.
-
-@item M-x guix-generations-by-time
-List generations matching time period.  You will be prompted for the
-period using Org mode time prompt based on Emacs calendar (@pxref{The
-date/time prompt,,, org, The Org Manual}).
-
-@end table
-
-Analogously on GuixSD you can also display system generations:
-
-@table @kbd
-@item M-x guix-system-generations
-@item M-x guix-last-system-generations
-@item M-x guix-system-generations-by-time
-@end table
-
-You can also invoke the @command{guix pull} command (@pxref{Invoking
-guix pull}) from Emacs using:
-
-@table @kbd
-@item M-x guix-pull
-With @kbd{C-u}, make it verbose.
-@end table
-
-Once @command{guix pull} has succeeded, the Guix REPL is restarted.  This
-allows you to keep using the Emacs interface with the updated Guix.
-
-
-@node Emacs General info
-@subsection General information
-
-The following keys are available for both ``list'' and ``info'' types of
-buffers:
-
-@table @kbd
-@item l
-@itemx r
-Go backward/forward by the history of the displayed results (this
-history is similar to the history of the Emacs @code{help-mode} or
-@code{Info-mode}).
-
-@item g
-Revert current buffer: update information about the displayed
-packages/generations and redisplay it.
-
-@item R
-Redisplay current buffer (without updating information).
-
-@item M
-Apply manifest to the current profile or to a specified profile, if
-prefix argument is used.  This has the same meaning as @code{--manifest}
-option (@pxref{Invoking guix package}).
-
-@item C-c C-z
-@cindex REPL
-@cindex read-eval-print loop
-Go to the Guix REPL (@pxref{The REPL,,, geiser, Geiser User Manual}).
-
-@item h
-@itemx ?
-Describe current mode to see all available bindings.
-
-@end table
-
-@emph{Hint:} If you need several ``list'' or ``info'' buffers, you can
-simply @kbd{M-x clone-buffer} them, and each buffer will have its own
-history.
-
-@emph{Warning:} Name/version pairs cannot be used to identify packages
-(because a name is not necessarily unique), so ``guix.el'' uses special
-identifiers that live only during a guile session, so if the Guix REPL
-was restarted, you may want to revert ``list'' buffer (by pressing
-@kbd{g}).
-
-@node Emacs List buffer
-@subsection ``List'' buffer
-
-An interface of a ``list'' buffer is similar to the interface provided
-by ``package.el'' (@pxref{Package Menu,,, emacs, The GNU Emacs Manual}).
-
-Default key bindings available for both ``package-list'' and
-``generation-list'' buffers:
-
-@table @kbd
-@item m
-Mark the current entry (with prefix, mark all entries).
-@item u
-Unmark the current entry (with prefix, unmark all entries).
-@item @key{DEL}
-Unmark backward.
-@item S
-Sort entries by a specified column.
-@end table
-
-A ``package-list'' buffer additionally provides the following bindings:
-
-@table @kbd
-@item @key{RET}
-Describe marked packages (display available information in a
-``package-info'' buffer).
-@item i
-Mark the current package for installation.
-@item d
-Mark the current package for deletion.
-@item U
-Mark the current package for upgrading.
-@item ^
-Mark all obsolete packages for upgrading.
-@item e
-Edit the definition of the current package (go to its location).  This is
-similar to @command{guix edit} command (@pxref{Invoking guix edit}), but
-for opening a package recipe in the current Emacs instance.
-@item x
-Execute actions on the marked packages.
-@item B
-Display latest builds of the current package (@pxref{Emacs Hydra}).
-@end table
-
-A ``generation-list'' buffer additionally provides the following
-bindings:
-
-@table @kbd
-@item @key{RET}
-List packages installed in the current generation.
-@item i
-Describe marked generations (display available information in a
-``generation-info'' buffer).
-@item s
-Switch profile to the current generation.
-@item d
-Mark the current generation for deletion (with prefix, mark all
-generations).
-@item x
-Execute actions on the marked generations---i.e., delete generations.
-@item e
-Run Ediff (@pxref{Top,,, ediff, The Ediff Manual}) on package outputs
-installed in the 2 marked generations.  With prefix argument, run Ediff
-on manifests of the marked generations.
-@item D
-@itemx =
-Run Diff (@pxref{Diff Mode,,, emacs, The GNU Emacs Manual}) on package
-outputs installed in the 2 marked generations.  With prefix argument,
-run Diff on manifests of the marked generations.
-@item +
-List package outputs added to the latest marked generation comparing
-with another marked generation.
-@item -
-List package outputs removed from the latest marked generation comparing
-with another marked generation.
-@end table
-
-@node Emacs Info buffer
-@subsection ``Info'' buffer
-
-The interface of an ``info'' buffer is similar to the interface of
-@code{help-mode} (@pxref{Help Mode,,, emacs, The GNU Emacs Manual}).
-
-``Info'' buffer contains some buttons (as usual you may use @key{TAB} /
-@kbd{S-@key{TAB}} to move between buttons---@pxref{Mouse References,,,
-emacs, The GNU Emacs Manual}) which can be used to:
-
-@itemize @bullet
-@item (in a ``package-info'' buffer)
-
-@itemize @minus
-@item install/remove a package;
-@item jump to a package location;
-@item browse home page of a package;
-@item browse license URL;
-@item describe packages from ``Inputs'' fields.
-@end itemize
-
-@item (in a ``generation-info'' buffer)
-
-@itemize @minus
-@item remove a generation;
-@item switch to a generation;
-@item list packages installed in a generation;
-@item jump to a generation directory.
-@end itemize
-
-@end itemize
-
-It is also possible to copy a button label (a link to an URL or a file)
-by pressing @kbd{c} on a button.
-
-
-@node Emacs Configuration
-@subsection Configuration
-
-There are many variables you can modify to change the appearance or
-behavior of Emacs user interface.  Some of these variables are described
-in this section.  Also you can use Custom Interface (@pxref{Easy
-Customization,,, emacs, The GNU Emacs Manual}) to explore/set variables
-(not all) and faces.
-
-@menu
-* Guile and Build Options: Emacs Build Options.	Specifying how packages are built.
-* Buffer Names: Emacs Buffer Names.	Names of Guix buffers.
-* Keymaps: Emacs Keymaps.		Configuring key bindings.
-* Appearance: Emacs Appearance.		Settings for visual appearance.
-@end menu
-
-@node Emacs Build Options
-@subsubsection Guile and Build Options
-
-@table @code
-@item guix-guile-program
-If you have some special needs for starting a Guile process, you may set
-this variable, for example:
-
-@example
-(setq guix-guile-program '("/bin/guile" "--no-auto-compile"))
-@end example
-
-@item guix-use-substitutes
-If nil, has the same meaning as @code{--no-substitutes} option
-(@pxref{Invoking guix build}).
-
-@item guix-dry-run
-If non-nil, has the same meaning as @code{--dry-run} option
-(@pxref{Invoking guix build}).
-
-@end table
-
-@node Emacs Buffer Names
-@subsubsection Buffer Names
-
-Default names of ``guix.el'' buffers (``*Guix@tie{}@dots{}*'') may be
-changed with the following variables:
-
-@table @code
-@item guix-package-list-buffer-name
-@item guix-output-list-buffer-name
-@item guix-generation-list-buffer-name
-@item guix-package-info-buffer-name
-@item guix-output-info-buffer-name
-@item guix-generation-info-buffer-name
-@item guix-repl-buffer-name
-@item guix-internal-repl-buffer-name
-@end table
-
-By default, the name of a profile is also displayed in a ``list'' or
-``info'' buffer name.  To change this behavior, use
-@code{guix-ui-buffer-name-function} variable.
-
-For example, if you want to display all types of results in a single
-buffer (in such case you will probably use a history (@kbd{l}/@kbd{r})
-extensively), you may do it like this:
-
-@example
-(let ((name "Guix Universal"))
-  (setq
-   guix-package-list-buffer-name    name
-   guix-output-list-buffer-name     name
-   guix-generation-list-buffer-name name
-   guix-package-info-buffer-name    name
-   guix-output-info-buffer-name     name
-   guix-generation-info-buffer-name name))
-@end example
-
-@node Emacs Keymaps
-@subsubsection Keymaps
-
-If you want to change default key bindings, use the following keymaps
-(@pxref{Init Rebinding,,, emacs, The GNU Emacs Manual}):
-
-@table @code
-@item guix-buffer-map
-Parent keymap with general keys for any buffer type.
-
-@item guix-ui-map
-Parent keymap with general keys for buffers used for Guix package
-management (for packages, outputs and generations).
-
-@item guix-list-mode-map
-Parent keymap with general keys for ``list'' buffers.
-
-@item guix-package-list-mode-map
-Keymap with specific keys for ``package-list'' buffers.
-
-@item guix-output-list-mode-map
-Keymap with specific keys for ``output-list'' buffers.
-
-@item guix-generation-list-mode-map
-Keymap with specific keys for ``generation-list'' buffers.
-
-@item guix-info-mode-map
-Parent keymap with general keys for ``info'' buffers.
-
-@item guix-package-info-mode-map
-Keymap with specific keys for ``package-info'' buffers.
-
-@item guix-output-info-mode-map
-Keymap with specific keys for ``output-info'' buffers.
-
-@item guix-generation-info-mode-map
-Keymap with specific keys for ``generation-info'' buffers.
-
-@item guix-info-button-map
-Keymap with keys available when a point is placed on a button.
-
-@end table
-
-@node Emacs Appearance
-@subsubsection Appearance
-
-You can change almost any aspect of ``list'' / ``info'' buffers using
-the following variables (@dfn{ENTRY-TYPE} means @code{package},
-@code{output} or @code{generation}):
-
-@table @code
-@item guix-ENTRY-TYPE-list-format
-@itemx guix-ENTRY-TYPE-list-titles
-Specify the columns, their names, what and how is displayed in ``list''
-buffers.
-
-@item guix-ENTRY-TYPE-info-format
-@itemx guix-ENTRY-TYPE-info-titles
-@itemx guix-info-ignore-empty-values
-@itemx guix-info-param-title-format
-@itemx guix-info-multiline-prefix
-@itemx guix-info-indent
-@itemx guix-info-fill
-@itemx guix-info-delimiter
-Various settings for ``info'' buffers.
-
-@end table
-
-
-@node Emacs Licenses
-@section Licenses
-
-If you want to browse the URL of a particular license, or to look at a
-list of licenses, you may use the following commands:
-
-@table @kbd
-
-@item M-x guix-browse-license-url
-Choose a license from a completion list to browse its URL using
-@code{browse-url} function (@pxref{Browse-URL,,, emacs, The GNU Emacs
-Manual}).
-
-@item M-x guix-licenses
-Display a list of available licenses.  You can press @kbd{@key{RET}}
-there to display packages with this license in the same way as @kbd{M-x
-guix-packages-by-license} would do (@pxref{Emacs Commands}).
-
-@item M-x guix-find-license-definition
-Open @file{@dots{}/guix/licenses.scm} and move to the specified license.
-
-@end table
-
-
-@node Emacs Package Locations
-@section Package Source Locations
-
-As you know, package definitions are placed in Guile files, also known
-as @dfn{package locations}.  The following commands should help you not
-get lost in these locations:
-
-@table @kbd
-
-@item M-x guix-locations
-Display a list of package locations.  You can press @key{RET} there to
-display packages placed in the current location in the same way as
-@kbd{M-x guix-packages-by-location} would do (@pxref{Emacs Commands}).
-Note that when the point is on a location button, @key{RET} will open
-this location file.
-
-@item M-x guix-find-location
-Open the given package definition source file (press @key{TAB} to choose
-a location from a completion list).
-
-@item M-x guix-edit
-Find location of a specified package.  This is an Emacs analog of
-@command{guix edit} command (@pxref{Invoking guix edit}).  As with
-@kbd{M-x guix-packages-by-name}, you can press @key{TAB} to complete a
-package name.
-
-@end table
-
-If you are contributing to Guix, you may find it useful for @kbd{M-x
-guix-find-location} and @kbd{M-x guix-edit} to open locations from your
-Git checkout.  This can be done by setting @code{guix-directory}
-variable.  For example, after this:
-
-@example
-(setq guix-directory "~/src/guix")
-@end example
-
-@kbd{M-x guix-edit guix} opens
-@file{~/src/guix/gnu/packages/package-management.scm} file.
-
-Also you can use @kbd{C-u} prefix argument to specify a directory just
-for the current @kbd{M-x guix-find-location} or @kbd{M-x guix-edit}
-command.
-
-
-@node Emacs Popup Interface
-@section Popup Interface
-
-If you ever used Magit, you know what ``popup interface'' is
-(@pxref{Top,,, magit-popup, Magit-Popup User Manual}).  Even if you are
-not acquainted with Magit, there should be no worries as it is very
-intuitive.
-
-So @kbd{M-x@tie{}guix} command provides a top-level popup interface for
-all available guix commands.  When you select an option, you'll be
-prompted for a value in the minibuffer.  Many values have completions,
-so don't hesitate to press @key{TAB} key.  Multiple values (for example,
-packages or lint checkers) should be separated by commas.
-
-After specifying all options and switches for a command, you may choose
-one of the available actions.  The following default actions are
-available for all commands:
-
-@itemize
-
-@item
-Run the command in the Guix REPL.  It is faster than running
-@code{guix@tie{}@dots{}} command directly in shell, as there is no
-need to run another guile process and to load required modules there.
-
-@item
-Run the command in a shell buffer.  You can set
-@code{guix-run-in-shell-function} variable to fine tune the shell buffer
-you want to use.
-
-@item
-Add the command line to the kill ring (@pxref{Kill Ring,,, emacs, The
-GNU Emacs Manual}).
-
-@end itemize
-
-Several commands (@command{guix graph}, @command{guix system shepherd-graph}
-and @command{guix system extension-graph}) also have a ``View graph''
-action, which allows you to view a generated graph using @command{dot}
-command (specified by @code{guix-dot-program} variable).  By default a
-PNG file will be saved in @file{/tmp} directory and will be opened
-directly in Emacs.  This behavior may be changed with the following
-variables:
-
-@table @code
-
-@item guix-find-file-function
-Function used to open a generated graph.  If you want to open a graph in
-an external program, you can do it by modifying this variable---for
-example, you can use a functionality provided by the Org Mode
-(@pxref{Top,,, org, The Org Manual}):
-
-@example
-(setq guix-find-file-function 'org-open-file)
-(add-to-list 'org-file-apps '("\\.png\\'" . "sxiv %s"))
-@end example
-
-@item guix-dot-default-arguments
-Command line arguments to run @command{dot} command.  If you change an
-output format (for example, into @code{-Tpdf}), you also need to change
-the next variable.
-
-@item guix-dot-file-name-function
-Function used to define a name of the generated graph file.  Default
-name is @file{/tmp/guix-emacs-graph-XXXXXX.png}.
-
-@end table
-
-So, for example, if you want to generate and open a PDF file in your
-Emacs, you may change the settings like this:
-
-@example
-(defun my-guix-pdf-graph ()
-  "/tmp/my-current-guix-graph.pdf")
-
-(setq guix-dot-default-arguments '("-Tpdf")
-      guix-dot-file-name-function 'my-guix-pdf-graph)
-@end example
-
-
-@node Emacs Prettify
-@section Guix Prettify Mode
-
-GNU@tie{}Guix also comes with ``guix-prettify.el''.  It provides a minor
-mode for abbreviating store file names by replacing hash sequences of
-symbols with ``@dots{}'':
-
-@example
-/gnu/store/72f54nfp6g1hz873w8z3gfcah0h4nl9p-foo-0.1
-@result{} /gnu/store/…-foo-0.1
-@end example
-
-Once you set up ``guix.el'' (@pxref{Emacs Initial Setup}), the following
-commands become available:
-
-@table @kbd
-
-@item M-x guix-prettify-mode
-Enable/disable prettifying for the current buffer.
-
-@item M-x global-guix-prettify-mode
-Enable/disable prettifying globally.
-
-@end table
-
-To automatically enable @code{guix-prettify-mode} globally on Emacs
-start, add the following line to your init file:
-
-@example
-(global-guix-prettify-mode)
-@end example
-
-If you want to enable it only for specific major modes, add it to the
-mode hooks (@pxref{Hooks,,, emacs, The GNU Emacs Manual}), for example:
-
-@example
-(add-hook 'shell-mode-hook 'guix-prettify-mode)
-(add-hook 'dired-mode-hook 'guix-prettify-mode)
-@end example
-
-
-@node Emacs Build Log
-@section Build Log Mode
-
-GNU@tie{}Guix provides major and minor modes for highlighting build
-logs.  So when you have a file with a package build output---for
-example, a file returned by @command{guix build --log-file @dots{}}
-command (@pxref{Invoking guix build}), you may call @kbd{M-x
-guix-build-log-mode} command in the buffer with this file.  This major
-mode highlights some lines specific to build output and provides the
-following key bindings:
-
-@table @kbd
-
-@item M-n
-Move to the next build phase.
-
-@item M-p
-Move to the previous build phase.
-
-@item @key{TAB}
-Toggle (show/hide) the body of the current build phase.
-
-@item S-@key{TAB}
-Toggle (show/hide) the bodies of all build phases.
-
-@end table
-
-There is also @kbd{M-x guix-build-log-minor-mode} which also provides
-the same highlighting and the same key bindings as the major mode, but
-prefixed with @kbd{C-c}.  By default, this minor mode is enabled in
-shell buffers (@pxref{Interactive Shell,,, emacs, The GNU Emacs
-Manual}).  If you don't like it, set
-@code{guix-build-log-minor-mode-activate} to nil.
-
-
-@node Emacs Completions
-@section Shell Completions
-
-Another feature that becomes available after configuring Emacs interface
-(@pxref{Emacs Initial Setup}) is completing of @command{guix}
-subcommands, options, packages and other things in @code{shell}
-(@pxref{Interactive Shell,,, emacs, The GNU Emacs Manual}) and
-@code{eshell} (@pxref{Top,,, eshell, Eshell: The Emacs Shell}).
-
-It works the same way as other completions do.  Just press @key{TAB}
-when your intuition tells you.
-
-And here are some examples, where pressing @key{TAB} may complete
-something:
-
-@itemize @w{}
-
-@item @code{guix pa}@key{TAB}
-@item @code{guix package -}@key{TAB}
-@item @code{guix package --}@key{TAB}
-@item @code{guix package -i gei}@key{TAB}
-@item @code{guix build -L/tm}@key{TAB}
-@item @code{guix build --sy}@key{TAB}
-@item @code{guix build --system=i}@key{TAB}
-@item @code{guix system rec}@key{TAB}
-@item @code{guix lint --checkers=sy}@key{TAB}
-@item @code{guix lint --checkers=synopsis,des}@key{TAB}
-
-@end itemize
-
-
-@node Emacs Development
-@section Development
-
-By default, when you open a Scheme file, @code{guix-devel-mode} will be
-activated (if you don't want it, set @code{guix-devel-activate-mode} to
-nil).  This minor mode provides the following key bindings:
-
-@table @kbd
-
-@item C-c . k
-Copy the name of the current Guile module into kill ring
-(@code{guix-devel-copy-module-as-kill}).
-
-@item C-c . u
-Use the current Guile module.  Often after opening a Scheme file, you
-want to use a module it defines, so you switch to the Geiser REPL and
-write @code{,use (some module)} there.  You may just use this command
-instead (@code{guix-devel-use-module}).
-
-@item C-c . b
-Build a package defined by the current variable definition.  The
-building process is run in the current Geiser REPL.  If you modified the
-current package definition, don't forget to reevaluate it before calling
-this command---for example, with @kbd{C-M-x} (@pxref{To eval or not to
-eval,,, geiser, Geiser User Manual})
-(@code{guix-devel-build-package-definition}).
-
-@item C-c . s
-Build a source derivation of the package defined by the current variable
-definition.  This command has the same meaning as @code{guix build -S}
-shell command (@pxref{Invoking guix build})
-(@code{guix-devel-build-package-source}).
-
-@item C-c . l
-Lint (check) a package defined by the current variable definition
-(@pxref{Invoking guix lint}) (@code{guix-devel-lint-package}).
-
-@end table
-
-Unluckily, there is a limitation related to long-running REPL commands.
-When there is a running process in a Geiser REPL, you are not supposed
-to evaluate anything in a scheme buffer, because this will ``freeze''
-the REPL: it will stop producing any output (however, the evaluating
-process will continue---you will just not see any progress anymore).  Be
-aware: even moving the point in a scheme buffer may ``break'' the REPL
-if Autodoc (@pxref{Autodoc and friends,,, geiser, Geiser User Manual})
-is enabled (which is the default).
-
-So you have to postpone editing your scheme buffers until the running
-evaluation will be finished in the REPL.
-
-Alternatively, to avoid this limitation, you may just run another Geiser
-REPL, and while something is being evaluated in the previous REPL, you
-can continue editing a scheme file with the help of the current one.
-
-
-@node Emacs Hydra
-@section Hydra
-
-The continuous integration server at @code{hydra.gnu.org} builds all
-the distribution packages on the supported architectures and serves
-them as substitutes (@pxref{Substitutes}).  Continuous integration is
-currently orchestrated by @uref{https://nixos.org/hydra/, Hydra}.
-
-This section describes an Emacs interface to query Hydra to know the
-build status of specific packages, discover recent and ongoing builds,
-view build logs, and so on.  This interface is mostly the same as the
-``list''/``info'' interface for displaying packages and generations
-(@pxref{Emacs Package Management}).
-
-The following commands are available:
-
-@table @kbd
-
-@item M-x guix-hydra-latest-builds
-Display latest failed or successful builds (you will be prompted for a
-number of builds).  With @kbd{C-u}, you will also be prompted for other
-parameters (project, jobset, job and system).
-
-@item M-x guix-hydra-queued-builds
-Display scheduled or currently running builds (you will be prompted for
-a number of builds).
-
-@item M-x guix-hydra-jobsets
-Display available jobsets (you will be prompted for a project).
-
-@end table
-
-In a list of builds you can press @kbd{L} key to display a build log of
-the current build.  Also both a list of builds and a list of jobsets
-provide @kbd{B} key to display latest builds of the current job or
-jobset (don't forget about @kbd{C-u}).
diff --git a/doc/guix.texi b/doc/guix.texi
index 0cb1bc7665..c495e39f42 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -10,10 +10,10 @@
 @include version.texi
 
 @c Identifier of the OpenPGP key used to sign tarballs and such.
-@set OPENPGP-SIGNING-KEY-ID 3CE464558A84FDC69DB40CFB090B11993D9AEBB5
+@set OPENPGP-SIGNING-KEY-ID BCA689B636553801C3C62150197A5888235FACAC
 
 @copying
-Copyright @copyright{} 2012, 2013, 2014, 2015, 2016 Ludovic Courtès@*
+Copyright @copyright{} 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès@*
 Copyright @copyright{} 2013, 2014, 2016 Andreas Enge@*
 Copyright @copyright{} 2013 Nikita Karetnikov@*
 Copyright @copyright{} 2014, 2015, 2016 Alex Kost@*
@@ -29,7 +29,8 @@ Copyright @copyright{} 2016 John Darrington@*
 Copyright @copyright{} 2016 ng0@*
 Copyright @copyright{} 2016 Jan Nieuwenhuizen@*
 Copyright @copyright{} 2016 Julien Lepiller@*
-Copyright @copyright{} 2016 Alex ter Weele
+Copyright @copyright{} 2016 Alex ter Weele@*
+Copyright @copyright{} 2017 Clément Lassieur
 
 Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU Free Documentation License, Version 1.3 or
@@ -54,12 +55,6 @@ Documentation License''.
 * guix environment: (guix)Invoking guix environment. Building development environments with Guix.
 @end direntry
 
-@dircategory Emacs
-@direntry
-* Guix user interface: (guix)Emacs Interface. Package management from the comfort of Emacs.
-@end direntry
-
-
 @titlepage
 @title GNU Guix Reference Manual
 @subtitle Using the GNU Guix Functional Package Manager
@@ -86,7 +81,6 @@ package management tool written for the GNU system.
 * Introduction::                What is Guix about?
 * Installation::                Installing Guix.
 * Package Management::          Package installation, upgrade, etc.
-* Emacs Interface::             Using Guix from Emacs.
 * Programming Interface::       Using Guix in Scheme.
 * Utilities::                   Package management commands.
 * GNU Distribution::            Software for your friendly GNU system.
@@ -124,19 +118,6 @@ Package Management
 * Invoking guix pull::          Fetching the latest Guix and distribution.
 * Invoking guix archive::       Exporting and importing store files.
 
-Emacs Interface
-
-* Initial Setup: Emacs Initial Setup.	Preparing @file{~/.emacs}.
-* Package Management: Emacs Package Management.	Managing packages and generations.
-* Licenses: Emacs Licenses.		Interface for licenses of Guix packages.
-* Package Source Locations: Emacs Package Locations.	Interface for package location files.
-* Popup Interface: Emacs Popup Interface.	Magit-like interface for guix commands.
-* Prettify Mode: Emacs Prettify.	Abbreviating @file{/gnu/store/@dots{}} file names.
-* Build Log Mode: Emacs Build Log.	Highlighting Guix build logs.
-* Completions: Emacs Completions.	Completing @command{guix} shell command.
-* Development: Emacs Development.	Tools for Guix developers.
-* Hydra: Emacs Hydra.			Interface for Guix build farm.
-
 Programming Interface
 
 * Defining Packages::           Defining new packages.
@@ -165,12 +146,13 @@ Utilities
 * Invoking guix environment::   Setting up development environments.
 * Invoking guix publish::       Sharing substitutes.
 * Invoking guix challenge::     Challenging substitute servers.
+* Invoking guix copy::          Copying to and from a remote store.
 * Invoking guix container::     Process isolation.
 
 Invoking @command{guix build}
 
 * Common Build Options::        Build options for most commands.
-* Package Transformation Options::    Creating variants of packages.
+* Package Transformation Options::  Creating variants of packages.
 * Additional Build Options::    Options specific to 'guix build'.
 
 GNU Distribution
@@ -219,12 +201,15 @@ Services
 * Log Rotation::                The rottlog service.
 * Networking Services::         Network setup, SSH daemon, etc.
 * X Window::                    Graphical display.
+* Printing Services::           Local and remote printer support.
 * Desktop Services::            D-Bus and desktop services.
 * Database Services::           SQL databases.
 * Mail Services::               IMAP, POP3, SMTP, and all that.
+* Messaging Services::          Messaging services.
 * Kerberos Services::           Kerberos services.
 * Web Services::                Web servers.
 * Network File System::         NFS related services.
+* Continuous Integration::      The Cuirass service.
 * Miscellaneous Services::      Other services.
 
 Defining Services
@@ -278,8 +263,7 @@ assists with the creation and maintenance of software environments.
 @cindex user interfaces
 Guix provides a command-line package management interface
 (@pxref{Invoking guix package}), a set of command-line utilities
-(@pxref{Utilities}), a visual user interface in Emacs (@pxref{Emacs
-Interface}), as well as Scheme programming interfaces
+(@pxref{Utilities}), as well as Scheme programming interfaces
 (@pxref{Programming Interface}).
 @cindex build daemon
 Its @dfn{build daemon} is responsible for building packages on behalf of
@@ -359,6 +343,9 @@ without interference.  Its data lives exclusively in two directories,
 usually @file{/gnu/store} and @file{/var/guix}; other files on your
 system, such as @file{/etc}, are left untouched.
 
+Once installed, Guix can be updated by running @command{guix pull}
+(@pxref{Invoking guix pull}).
+
 @menu
 * Binary Installation::         Getting Guix running in no time!
 * Requirements::                Software needed to build and run Guix.
@@ -569,7 +556,8 @@ interest primarily for developers and not for casual users.
 
 @item
 @c Note: We need at least 0.10.2 for 'channel-send-eof'.
-Support for build offloading (@pxref{Daemon Offload Setup}) depends on
+Support for build offloading (@pxref{Daemon Offload Setup}) and
+@command{guix copy} (@pxref{Invoking guix copy}) depends on
 @uref{https://github.com/artyom-poptsov/guile-ssh, Guile-SSH},
 version 0.10.2 or later.
 
@@ -1411,10 +1399,14 @@ procedures or dependencies.  Guix also goes beyond this obvious set of
 features.
 
 This chapter describes the main features of Guix, as well as the package
-management tools it provides.  Two user interfaces are provided for
-routine package management tasks: A command-line interface described below
-(@pxref{Invoking guix package, @code{guix package}}), as well as a visual user
-interface in Emacs described in a subsequent chapter (@pxref{Emacs Interface}).
+management tools it provides.  Along with the command-line interface
+described below (@pxref{Invoking guix package, @code{guix package}}),
+you may also use Emacs Interface, after installing @code{emacs-guix}
+package (run @kbd{M-x guix-help} command to start with it):
+
+@example
+guix package -i emacs-guix
+@end example
 
 @menu
 * Features::                    How Guix will make your life brighter.
@@ -1431,9 +1423,7 @@ interface in Emacs described in a subsequent chapter (@pxref{Emacs Interface}).
 
 When using Guix, each package ends up in the @dfn{package store}, in its
 own directory---something that resembles
-@file{/gnu/store/xxx-package-1.2}, where @code{xxx} is a base32 string
-(note that Guix comes with an Emacs extension to shorten those file
-names, @pxref{Emacs Prettify}.)
+@file{/gnu/store/xxx-package-1.2}, where @code{xxx} is a base32 string.
 
 Instead of referring to these directories, users have their own
 @dfn{profile}, which points to the packages that they actually want to
@@ -1979,9 +1969,7 @@ also result from derivation builds, can be available as substitutes.
 
 The @code{hydra.gnu.org} server is a front-end to a build farm that
 builds packages from the GNU distribution continuously for some
-architectures, and makes them available as substitutes (@pxref{Emacs
-Hydra}, for information on how to query the continuous integration
-server).  This is the
+architectures, and makes them available as substitutes.  This is the
 default source of substitutes; it can be overridden by passing the
 @option{--substitute-urls} option either to @command{guix-daemon}
 (@pxref{daemon-substitute-urls,, @code{guix-daemon --substitute-urls}})
@@ -2308,6 +2296,7 @@ this option is primarily useful when the daemon was running with
 @section Invoking @command{guix pull}
 
 @cindex upgrading Guix
+@cindex updating Guix
 @cindex @command{guix pull}
 @cindex pull
 Packages are installed or upgraded to the latest version available in
@@ -2401,12 +2390,16 @@ However, note that, in both examples, all of @code{emacs} and the
 profile as well as all of their dependencies are transferred (due to
 @code{-r}), regardless of what is already available in the store on the
 target machine.  The @code{--missing} option can help figure out which
-items are missing from the target store.
-
-Archives are stored in the ``Nix archive'' or ``Nar'' format, which is
-comparable in spirit to `tar', but with a few noteworthy differences
+items are missing from the target store.  The @command{guix copy}
+command simplifies and optimizes this whole process, so this is probably
+what you should use in this case (@pxref{Invoking guix copy}).
+
+@cindex nar, archive format
+@cindex normalized archive (nar)
+By default archives are stored in the ``normalized archive'' or ``nar'' format, which is
+comparable in spirit to `tar', but with differences
 that make it more appropriate for our purposes.  First, rather than
-recording all Unix metadata for each file, the Nar format only mentions
+recording all Unix metadata for each file, the nar format only mentions
 the file type (regular, directory, or symbolic link); Unix permissions
 and owner/group are dismissed.  Second, the order in which directory
 entries are stored always follows the order of file names according to
@@ -2419,6 +2412,9 @@ verifies the signature and rejects the import in case of an invalid
 signature or if the signing key is not authorized.
 @c FIXME: Add xref to daemon doc about signatures.
 
+Optionally, archives can be exported as a Docker image in the tar
+archive format using @code{--format=docker}.
+
 The main options are:
 
 @table @code
@@ -2447,6 +2443,19 @@ Read a list of store file names from the standard input, one per line,
 and write on the standard output the subset of these files missing from
 the store.
 
+@item -f
+@item --format=@var{FMT}
+@cindex docker, export
+@cindex export format
+Specify the export format.  Acceptable arguments are @code{nar} and
+@code{docker}.  The default is the nar format.  When the format is
+@code{docker}, recursively export the specified store directory as a
+Docker image in tar archive format, as specified in
+@uref{https://github.com/docker/docker/blob/master/image/spec/v1.2.md,
+version 1.2.0 of the Docker Image Specification}.  Using
+@code{--format=docker} implies @code{--recursive}.  The generated
+archive can be loaded by Docker using @command{docker load}.
+
 @item --generate-key[=@var{parameters}]
 @cindex signing, archives
 Generate a new key pair for the daemon.  This is a prerequisite before
@@ -2504,9 +2513,6 @@ archive contents coming from possibly untrusted substitute servers.
 @end table
 
 @c *********************************************************************
-@include emacs.texi
-
-@c *********************************************************************
 @node Programming Interface
 @chapter Programming Interface
 
@@ -3185,6 +3191,19 @@ which file the system is defined in.
 
 @end defvr
 
+@defvr {Scheme Variable} cargo-build-system
+@cindex Rust programming language
+@cindex Cargo (Rust build system)
+This variable is exported by @code{(guix build-system cargo)}.  It
+supports builds of packages using Cargo, the build tool of the
+@uref{https://www.rust-lang.org, Rust programming language}.
+
+In its @code{configure} phase, this build system replaces dependencies
+specified in the @file{Carto.toml} file with inputs to the Guix package.
+The @code{install} phase installs the binaries, and it also installs the
+source code and @file{Cargo.toml} file.
+@end defvr
+
 @defvr {Scheme Variable} cmake-build-system
 This variable is exported by @code{(guix build-system cmake)}.  It
 implements the build procedure for packages using the
@@ -4420,6 +4439,7 @@ the Scheme programming interface of Guix in a convenient way.
 * Invoking guix environment::   Setting up development environments.
 * Invoking guix publish::       Sharing substitutes.
 * Invoking guix challenge::     Challenging substitute servers.
+* Invoking guix copy::          Copying to and from a remote store.
 * Invoking guix container::     Process isolation.
 @end menu
 
@@ -4472,7 +4492,7 @@ described in the subsections below.
 
 @menu
 * Common Build Options::        Build options for most commands.
-* Package Transformation Options::    Creating variants of packages.
+* Package Transformation Options::  Creating variants of packages.
 * Additional Build Options::    Options specific to 'guix build'.
 @end menu
 
@@ -4683,7 +4703,7 @@ procedure (@pxref{Defining Packages, @code{package-input-rewriting}}).
 
 @item --with-graft=@var{package}=@var{replacement}
 This is similar to @code{--with-input} but with an important difference:
-instead of rebuilding all the dependency chain, @var{replacement} is
+instead of rebuilding the whole dependency chain, @var{replacement} is
 built and then @dfn{grafted} onto the binaries that were initially
 referring to @var{package}.  @xref{Security Updates}, for more
 information on grafts.
@@ -4904,11 +4924,6 @@ have created your own packages on @code{GUIX_PACKAGE_PATH}
 recipes. Otherwise, you will be able to examine the read-only recipes
 for packages currently in the store.
 
-If you are using Emacs, note that the Emacs user interface provides the
-@kbd{M-x guix-edit} command and a similar functionality in the ``package
-info'' and ``package list'' buffers created by the @kbd{M-x
-guix-search-by-name} and similar commands (@pxref{Emacs Commands}).
-
 
 @node Invoking guix download
 @section Invoking @command{guix download}
@@ -5146,6 +5161,10 @@ R package:
 guix import cran Cairo
 @end example
 
+When @code{--recursive} is added, the importer will traverse the
+dependency graph of the given upstream package recursively and generate
+package expressions for all those packages that are not yet in Guix.
+
 When @code{--archive=bioconductor} is added, metadata is imported from
 @uref{http://www.bioconductor.org/, Bioconductor}, a repository of R
 packages for for the analysis and comprehension of high-throughput
@@ -5267,6 +5286,11 @@ signatures,, emacs, The GNU Emacs Manual}).
 identifier.
 @end itemize
 @end table
+
+@item crate
+@cindex crate
+Import metadata from the crates.io Rust package repository
+@uref{https://crates.io, crates.io}.
 @end table
 
 The structure of the @command{guix import} code is modular.  It would be
@@ -5383,6 +5407,8 @@ the updater for @uref{http://elpa.gnu.org/, ELPA} packages;
 the updater for @uref{http://cran.r-project.org/, CRAN} packages;
 @item bioconductor
 the updater for @uref{http://www.bioconductor.org/, Bioconductor} R packages;
+@item cpan
+the updater for @uref{http://www.cpan.org/, CPAN} packages;
 @item pypi
 the updater for @uref{https://pypi.python.org, PyPI} packages.
 @item gem
@@ -5391,6 +5417,8 @@ the updater for @uref{https://rubygems.org, RubyGems} packages.
 the updater for @uref{https://github.com, GitHub} packages.
 @item hackage
 the updater for @uref{https://hackage.haskell.org, Hackage} packages.
+@item crate
+the updater for @uref{https://crates.io, Crates} packages.
 @end table
 
 For instance, the following command only checks for updates of Emacs
@@ -5435,6 +5463,10 @@ end, display the fraction of packages covered by all these updaters.
 List top-level dependent packages that would need to be rebuilt as a
 result of upgrading one or more packages.
 
+@xref{Invoking guix graph, the @code{reverse-package} type of
+@command{guix graph}}, for information on how to visualize the list of
+dependents of a package.
+
 @end table
 
 Be aware that the @code{--list-dependent} option only
@@ -5698,11 +5730,13 @@ Consider packages for @var{system}---e.g., @code{x86_64-linux}.
 Packages and their dependencies form a @dfn{graph}, specifically a
 directed acyclic graph (DAG).  It can quickly become difficult to have a
 mental model of the package DAG, so the @command{guix graph} command
-provides a visual representation of the DAG.  @command{guix graph}
-emits a DAG representation in the input format of
+provides a visual representation of the DAG.  By default,
+@command{guix graph} emits a DAG representation in the input format of
 @uref{http://www.graphviz.org/, Graphviz}, so its output can be passed
-directly to the @command{dot} command of Graphviz.  The general
-syntax is:
+directly to the @command{dot} command of Graphviz.  It can also emit an
+HTML page with embedded JavaScript code to display a ``chord diagram''
+in a Web browser, using the @uref{https://d3js.org/, d3.js} library.
+The general syntax is:
 
 @example
 guix graph @var{options} @var{package}@dots{}
@@ -5734,6 +5768,20 @@ This is the default type used in the example above.  It shows the DAG of
 package objects, excluding implicit dependencies.  It is concise, but
 filters out many details.
 
+@item reverse-package
+This shows the @emph{reverse} DAG of packages.  For example:
+
+@example
+guix graph --type=reverse-package ocaml
+@end example
+
+... yields the graph of packages that depend on OCaml.
+
+Note that for core packages this can yield huge graphs.  If all you want
+is to know the number of packages that depend on a given package, use
+@command{guix refresh --list-dependent} (@pxref{Invoking guix refresh,
+@option{--list-dependent}}).
+
 @item bag-emerged
 This is the package DAG, @emph{including} implicit inputs.
 
@@ -5820,6 +5868,15 @@ the values listed above.
 @item --list-types
 List the supported graph types.
 
+@item --backend=@var{backend}
+@itemx -b @var{backend}
+Produce a graph using the selected @var{backend}.
+
+@item --list-backends
+List the supported graph backends.
+
+Currently, the available backends are Graphviz and d3.js.
+
 @item --expression=@var{expr}
 @itemx -e @var{expr}
 Consider the package @var{expr} evaluates to.
@@ -5954,6 +6011,21 @@ The @code{--container} option requires Linux-libre 3.19 or newer.
 The available options are summarized below.
 
 @table @code
+@item --root=@var{file}
+@itemx -r @var{file}
+@cindex persistent environment
+@cindex garbage collector root, for environments
+Make @var{file} a symlink to the profile for this environment, and
+register it as a garbage collector root.
+
+This is useful if you want to protect your environment from garbage
+collection, to make it ``persistent''.
+
+When this option is omitted, the environment is protected from garbage
+collection only for the duration of the @command{guix environment}
+session.  This means that next time you recreate the same environment,
+you could have to rebuild or re-download packages.
+
 @item --expression=@var{expr}
 @itemx -e @var{expr}
 Create an environment for the package or list of packages that
@@ -6342,6 +6414,68 @@ URLs to compare to.
 
 @end table
 
+@node Invoking guix copy
+@section Invoking @command{guix copy}
+
+@cindex copy, of store items, over SSH
+@cindex SSH, copy of store items
+@cindex sharing store items across machines
+@cindex transferring store items across machines
+The @command{guix copy} command copies items from the store of one
+machine to that of another machine over a secure shell (SSH)
+connection@footnote{This command is available only when Guile-SSH was
+found.  @xref{Requirements}, for details.}.  For example, the following
+command copies the @code{coreutils} package, the user's profile, and all
+their dependencies over to @var{host}, logged in as @var{user}:
+
+@example
+guix copy --to=@var{user}@@@var{host} \
+          coreutils `readlink -f ~/.guix-profile`
+@end example
+
+If some of the items to be copied are already present on @var{host},
+they are not actually sent.
+
+The command below retrieves @code{libreoffice} and @code{gimp} from
+@var{host}, assuming they are available there:
+
+@example
+guix copy --from=@var{host} libreoffice gimp
+@end example
+
+The SSH connection is established using the Guile-SSH client, which is
+compatible with OpenSSH: it honors @file{~/.ssh/known_hosts} and
+@file{~/.ssh/config}, and uses the SSH agent for authentication.
+
+The key used to sign items that are sent must be accepted by the remote
+machine.  Likewise, the key used by the remote machine to sign items you
+are retrieving must be in @file{/etc/guix/acl} so it is accepted by your
+own daemon.  @xref{Invoking guix archive}, for more information about
+store item authentication.
+
+The general syntax is:
+
+@example
+guix copy [--to=@var{spec}|--from=@var{spec}] @var{items}@dots{}
+@end example
+
+You must always specify one of the following options:
+
+@table @code
+@item --to=@var{spec}
+@itemx --from=@var{spec}
+Specify the host to send to or receive from.  @var{spec} must be an SSH
+spec such as @code{example.org}, @code{charlie@@example.org}, or
+@code{charlie@@example.org:2222}.
+@end table
+
+The @var{items} can be either package names, such as @code{gimp}, or
+store items, such as @file{/gnu/store/@dots{}-idutils-4.6}.
+
+When specifying the name of a package to send, it is first built if
+needed, unless @option{--dry-run} was specified.  Common build options
+are supported (@pxref{Common Build Options}).
+
 
 @node Invoking guix container
 @section Invoking @command{guix container}
@@ -6785,9 +6919,9 @@ cfdisk
 
 Once you are done partitioning the target hard disk drive, you have to
 create a file system on the relevant partition(s)@footnote{Currently
-GuixSD pretty much assumes an ext4 file system.  In particular, code
-that reads partition UUIDs and labels only works with ext4.  This will
-be fixed in the future.}.
+GuixSD only supports ext4 and btrfs file systems.  In particular, code
+that reads partition UUIDs and labels only works for these file system
+types.}.
 
 Preferably, assign partitions a label so that you can easily and
 reliably refer to them in @code{file-system} declarations (@pxref{File
@@ -6829,6 +6963,7 @@ swap partition on @file{/dev/sda2}, you would run:
 
 @example
 mkswap /dev/sda2
+swapon /dev/sda2
 @end example
 
 @node Proceeding with the Installation
@@ -6909,6 +7044,14 @@ initialized by running the @command{passwd} command as @code{root},
 unless your configuration specifies otherwise
 (@pxref{user-account-password, user account passwords}).
 
+@cindex upgrading GuixSD
+From then on, you can update GuixSD whenever you want by running
+@command{guix pull} as @code{root} (@pxref{Invoking guix pull}), and
+then running @command{guix system reconfigure} to build a new system
+generation with the latest packages and services (@pxref{Invoking guix
+system}).  We recommend doing that regularly so that your system
+includes the latest security updates (@pxref{Security Updates}).
+
 Join us on @code{#guix} on the Freenode IRC network or on
 @file{guix-devel@@gnu.org} to share your experience---good or not so
 good.
@@ -7591,7 +7734,7 @@ for RAID-4, RAID-5 or RAID-6, or @code{raid10} for RAID-10.
 @cindex LUKS
 The following example specifies a mapping from @file{/dev/sda3} to
 @file{/dev/mapper/home} using LUKS---the
-@url{http://code.google.com/p/cryptsetup,Linux Unified Key Setup}, a
+@url{https://gitlab.com/cryptsetup/cryptsetup,Linux Unified Key Setup}, a
 standard mechanism for disk encryption.
 The @file{/dev/mapper/home}
 device can then be used as the @code{device} of a @code{file-system}
@@ -7969,6 +8112,7 @@ declaration.
 * Desktop Services::            D-Bus and desktop services.
 * Database Services::           SQL databases.
 * Mail Services::               IMAP, POP3, SMTP, and all that.
+* Messaging Services::          Messaging services.
 * Kerberos Services::           Kerberos services.
 * Web Services::                Web servers.
 * Network File System::         NFS related services.
@@ -8247,9 +8391,12 @@ The list of URLs where to look for substitutes by default.
 @item @code{extra-options} (default: @code{'()})
 List of extra command-line options for @command{guix-daemon}.
 
+@item @code{log-file} (default: @code{"/var/log/guix-daemon.log"})
+File where @command{guix-daemon}'s standard output and standard error
+are written.
+
 @item @code{lsof} (default: @var{lsof})
-@itemx @code{lsh} (default: @var{lsh})
-The lsof and lsh packages to use.
+The lsof package to use.
 
 @end table
 @end deftp
@@ -10150,13 +10297,14 @@ Users need to be in the @code{lp} group to access the D-Bus service.
 The @code{(gnu services databases)} module provides the following services.
 
 @deffn {Scheme Procedure} postgresql-service [#:postgresql postgresql] @
-       [#:config-file] [#:data-directory ``/var/lib/postgresql/data'']
+       [#:config-file] [#:data-directory ``/var/lib/postgresql/data''] @
+       [#:port 5432] [#:locale ``en_US.utf8'']
 Return a service that runs @var{postgresql}, the PostgreSQL database
 server.
 
-The PostgreSQL daemon loads its runtime configuration from
-@var{config-file} and stores the database cluster in
-@var{data-directory}.
+The PostgreSQL daemon loads its runtime configuration from @var{config-file},
+creates a database cluster with @var{locale} as the default
+locale, stored in @var{data-directory}.  It then listens on @var{port}.
 @end deffn
 
 @deffn {Scheme Procedure} mysql-service [#:config (mysql-configuration)]
@@ -10177,6 +10325,33 @@ or @var{mysql}.
 
 For MySQL, a temporary root password will be displayed at activation time.
 For MariaDB, the root password is empty.
+
+@item @code{port} (default: @code{3306})
+TCP port on which the database server listens for incoming connections.
+@end table
+@end deftp
+
+@defvr {Scheme Variable} redis-service-type
+This is the service type for the @uref{https://redis.io/, Redis}
+key/value store, whose value is a @code{redis-configuration} object.
+@end defvr
+
+@deftp {Data Type} redis-configuration
+Data type representing the configuration of redis.
+
+@table @asis
+@item @code{redis} (default: @code{redis})
+The Redis package to use.
+
+@item @code{bind} (default: @code{"127.0.0.1"})
+Network interface on which to listen.
+
+@item @code{port} (default: @code{6379})
+Port on which to accept connections on, a value of 0 will disable
+listining on a TCP socket.
+
+@item @code{working-directory} (default: @code{"/var/lib/redis"})
+Directory in which to store the database and related files.
 @end table
 @end deftp
 
@@ -11576,6 +11751,394 @@ remote servers.  Run @command{man smtpd.conf} for more information.
 @end table
 @end deftp
 
+@node Messaging Services
+@subsubsection Messaging Services
+
+@cindex messaging
+@cindex jabber
+@cindex XMPP
+The @code{(gnu services messaging)} module provides Guix service
+definitions for messaging services: currently only Prosody is supported.
+
+@subsubheading Prosody Service
+
+@deffn {Scheme Variable} prosody-service-type
+This is the type for the @uref{http://prosody.im, Prosody XMPP
+communication server}.  Its value must be a @code{prosody-configuration}
+record as in this example:
+
+@example
+(service prosody-service-type
+         (prosody-configuration
+          (modules-enabled (cons "groups" %default-modules-enabled))
+          (int-components
+           (list
+            (int-component-configuration
+             (hostname "conference.example.net")
+             (plugin "muc")
+             (mod-muc (mod-muc-configuration)))))
+          (virtualhosts
+           (list
+            (virtualhost-configuration
+             (domain "example.net"))))))
+@end example
+
+See below for details about @code{prosody-configuration}.
+
+@end deffn
+
+By default, Prosody does not need much configuration.  Only one
+@code{virtualhosts} field is needed: it specifies the domain you wish
+Prosody to serve.
+
+Prosodyctl will help you generate X.509 certificates and keys:
+
+@example
+prosodyctl cert request example.net
+@end example
+
+The available configuration parameters follow.  Each parameter
+definition is preceded by its type; for example, @samp{string-list foo}
+indicates that the @code{foo} parameter should be specified as a list of
+strings.  Types starting with @code{maybe-} denote parameters that won't
+show up in @code{prosody.cfg.lua} when their value is @code{'disabled}.
+
+There is also a way to specify the configuration as a string, if you
+have an old @code{prosody.cfg.lua} file that you want to port over from
+some other system; see the end for more details.
+
+@c The following documentation was initially generated by
+@c (generate-documentation) in (gnu services messaging).  Manually maintained
+@c documentation is better, so we shouldn't hesitate to edit below as
+@c needed.  However if the change you want to make to this documentation
+@c can be done in an automated way, it's probably easier to change
+@c (generate-documentation) than to make it below and have to deal with
+@c the churn as Prosody updates.
+
+Available @code{prosody-configuration} fields are:
+
+@deftypevr {@code{prosody-configuration} parameter} package prosody
+The Prosody package.
+@end deftypevr
+
+@deftypevr {@code{prosody-configuration} parameter} file-name data-path
+Location of the Prosody data storage directory.  See
+@url{http://prosody.im/doc/configure}.
+Defaults to @samp{"/var/lib/prosody"}.
+@end deftypevr
+
+@deftypevr {@code{prosody-configuration} parameter} file-name-list plugin-paths
+Additional plugin directories.  They are searched in all the specified
+paths in order.  See @url{http://prosody.im/doc/plugins_directory}.
+Defaults to @samp{()}.
+@end deftypevr
+
+@deftypevr {@code{prosody-configuration} parameter} string-list admins
+This is a list of accounts that are admins for the server.  Note that you
+must create the accounts separately.  See @url{http://prosody.im/doc/admins} and
+@url{http://prosody.im/doc/creating_accounts}.
+Example: @code{(admins '("user1@@example.com" "user2@@example.net"))}
+Defaults to @samp{()}.
+@end deftypevr
+
+@deftypevr {@code{prosody-configuration} parameter} boolean use-libevent?
+Enable use of libevent for better performance under high load.  See
+@url{http://prosody.im/doc/libevent}.
+Defaults to @samp{#f}.
+@end deftypevr
+
+@deftypevr {@code{prosody-configuration} parameter} module-list modules-enabled
+This is the list of modules Prosody will load on startup.  It looks for
+@code{mod_modulename.lua} in the plugins folder, so make sure that exists too.
+Documentation on modules can be found at: @url{http://prosody.im/doc/modules}.
+Defaults to @samp{%default-modules-enabled}.
+@end deftypevr
+
+@deftypevr {@code{prosody-configuration} parameter} string-list modules-disabled
+@samp{"offline"}, @samp{"c2s"} and @samp{"s2s"} are auto-loaded, but
+should you want to disable them then add them to this list.
+Defaults to @samp{()}.
+@end deftypevr
+
+@deftypevr {@code{prosody-configuration} parameter} file-name groups-file
+Path to a text file where the shared groups are defined.  If this path is
+empty then @samp{mod_groups} does nothing.  See
+@url{http://prosody.im/doc/modules/mod_groups}.
+Defaults to @samp{"/var/lib/prosody/sharedgroups.txt"}.
+@end deftypevr
+
+@deftypevr {@code{prosody-configuration} parameter} boolean allow-registration?
+Disable account creation by default, for security.  See
+@url{http://prosody.im/doc/creating_accounts}.
+Defaults to @samp{#f}.
+@end deftypevr
+
+@deftypevr {@code{prosody-configuration} parameter} maybe-ssl-configuration ssl
+These are the SSL/TLS-related settings.  Most of them are disabled so to
+use Prosody's defaults.  If you do not completely understand these options, do
+not add them to your config, it is easy to lower the security of your server
+using them.  See @url{http://prosody.im/doc/advanced_ssl_config}.
+
+Available @code{ssl-configuration} fields are:
+
+@deftypevr {@code{ssl-configuration} parameter} maybe-string protocol
+This determines what handshake to use.
+@end deftypevr
+
+@deftypevr {@code{ssl-configuration} parameter} file-name key
+Path to your private key file, relative to @code{/etc/prosody}.
+Defaults to @samp{"/etc/prosody/certs/key.pem"}.
+@end deftypevr
+
+@deftypevr {@code{ssl-configuration} parameter} file-name certificate
+Path to your certificate file, relative to @code{/etc/prosody}.
+Defaults to @samp{"/etc/prosody/certs/cert.pem"}.
+@end deftypevr
+
+@deftypevr {@code{ssl-configuration} parameter} file-name capath
+Path to directory containing root certificates that you wish Prosody to
+trust when verifying the certificates of remote servers.
+Defaults to @samp{"/etc/ssl/certs"}.
+@end deftypevr
+
+@deftypevr {@code{ssl-configuration} parameter} maybe-file-name cafile
+Path to a file containing root certificates that you wish Prosody to trust.
+Similar to @code{capath} but with all certificates concatenated together.
+@end deftypevr
+
+@deftypevr {@code{ssl-configuration} parameter} maybe-string-list verify
+A list of verification options (these mostly map to OpenSSL's
+@code{set_verify()} flags).
+@end deftypevr
+
+@deftypevr {@code{ssl-configuration} parameter} maybe-string-list options
+A list of general options relating to SSL/TLS.  These map to OpenSSL's
+@code{set_options()}.  For a full list of options available in LuaSec, see the
+LuaSec source.
+@end deftypevr
+
+@deftypevr {@code{ssl-configuration} parameter} maybe-non-negative-integer depth
+How long a chain of certificate authorities to check when looking for a
+trusted root certificate.
+@end deftypevr
+
+@deftypevr {@code{ssl-configuration} parameter} maybe-string ciphers
+An OpenSSL cipher string.  This selects what ciphers Prosody will offer to
+clients, and in what order.
+@end deftypevr
+
+@deftypevr {@code{ssl-configuration} parameter} maybe-file-name dhparam
+A path to a file containing parameters for Diffie-Hellman key exchange.  You
+can create such a file with:
+@code{openssl dhparam -out /etc/prosody/certs/dh-2048.pem 2048}
+@end deftypevr
+
+@deftypevr {@code{ssl-configuration} parameter} maybe-string curve
+Curve for Elliptic curve Diffie-Hellman. Prosody's default is
+@samp{"secp384r1"}.
+@end deftypevr
+
+@deftypevr {@code{ssl-configuration} parameter} maybe-string-list verifyext
+A list of "extra" verification options.
+@end deftypevr
+
+@deftypevr {@code{ssl-configuration} parameter} maybe-string password
+Password for encrypted private keys.
+@end deftypevr
+
+@end deftypevr
+
+@deftypevr {@code{prosody-configuration} parameter} boolean c2s-require-encryption?
+Whether to force all client-to-server connections to be encrypted or not.
+See @url{http://prosody.im/doc/modules/mod_tls}.
+Defaults to @samp{#f}.
+@end deftypevr
+
+@deftypevr {@code{prosody-configuration} parameter} boolean s2s-require-encryption?
+Whether to force all server-to-server connections to be encrypted or not.
+See @url{http://prosody.im/doc/modules/mod_tls}.
+Defaults to @samp{#f}.
+@end deftypevr
+
+@deftypevr {@code{prosody-configuration} parameter} boolean s2s-secure-auth?
+Whether to require encryption and certificate authentication.  This
+provides ideal security, but requires servers you communicate with to support
+encryption AND present valid, trusted certificates.  See
+@url{http://prosody.im/doc/s2s#security}.
+Defaults to @samp{#f}.
+@end deftypevr
+
+@deftypevr {@code{prosody-configuration} parameter} string-list s2s-insecure-domains
+Many servers don't support encryption or have invalid or self-signed
+certificates.  You can list domains here that will not be required to
+authenticate using certificates.  They will be authenticated using DNS.  See
+@url{http://prosody.im/doc/s2s#security}.
+Defaults to @samp{()}.
+@end deftypevr
+
+@deftypevr {@code{prosody-configuration} parameter} string-list s2s-secure-domains
+Even if you leave @code{s2s-secure-auth?} disabled, you can still require
+valid certificates for some domains by specifying a list here.  See
+@url{http://prosody.im/doc/s2s#security}.
+Defaults to @samp{()}.
+@end deftypevr
+
+@deftypevr {@code{prosody-configuration} parameter} string authentication
+Select the authentication backend to use.  The default provider stores
+passwords in plaintext and uses Prosody's configured data storage to store the
+authentication data.  If you do not trust your server please see
+@url{http://prosody.im/doc/modules/mod_auth_internal_hashed} for information
+about using the hashed backend.  See also
+@url{http://prosody.im/doc/authentication}
+Defaults to @samp{"internal_plain"}.
+@end deftypevr
+
+@deftypevr {@code{prosody-configuration} parameter} maybe-string log
+Set logging options.  Advanced logging configuration is not yet supported
+by the GuixSD Prosody Service.  See @url{http://prosody.im/doc/logging}.
+Defaults to @samp{"*syslog"}.
+@end deftypevr
+
+@deftypevr {@code{prosody-configuration} parameter} file-name pidfile
+File to write pid in.  See @url{http://prosody.im/doc/modules/mod_posix}.
+Defaults to @samp{"/var/run/prosody/prosody.pid"}.
+@end deftypevr
+
+@deftypevr {@code{prosody-configuration} parameter} virtualhost-configuration-list virtualhosts
+A host in Prosody is a domain on which user accounts can be created.  For
+example if you want your users to have addresses like
+@samp{"john.smith@@example.com"} then you need to add a host
+@samp{"example.com"}.  All options in this list will apply only to this host.
+
+Note: the name "virtual" host is used in configuration to avoid confusion with
+the actual physical host that Prosody is installed on.  A single Prosody
+instance can serve many domains, each one defined as a VirtualHost entry in
+Prosody's configuration.  Conversely a server that hosts a single domain would
+have just one VirtualHost entry.
+
+See @url{http://prosody.im/doc/configure#virtual_host_settings}.
+
+Available @code{virtualhost-configuration} fields are:
+
+all these @code{prosody-configuration} fields: @code{admins}, @code{use-libevent?}, @code{modules-enabled}, @code{modules-disabled}, @code{groups-file}, @code{allow-registration?}, @code{ssl}, @code{c2s-require-encryption?}, @code{s2s-require-encryption?}, @code{s2s-secure-auth?}, @code{s2s-insecure-domains}, @code{s2s-secure-domains}, @code{authentication}, @code{log}, plus:
+@deftypevr {@code{virtualhost-configuration} parameter} string domain
+Domain you wish Prosody to serve.
+@end deftypevr
+
+@end deftypevr
+
+@deftypevr {@code{prosody-configuration} parameter} int-component-configuration-list int-components
+Components are extra services on a server which are available to clients,
+usually on a subdomain of the main server (such as
+@samp{"mycomponent.example.com"}).  Example components might be chatroom
+servers, user directories, or gateways to other protocols.
+
+Internal components are implemented with Prosody-specific plugins.  To add an
+internal component, you simply fill the hostname field, and the plugin you wish
+to use for the component.
+
+See @url{http://prosody.im/doc/components}.
+Defaults to @samp{()}.
+
+Available @code{int-component-configuration} fields are:
+
+all these @code{prosody-configuration} fields: @code{admins}, @code{use-libevent?}, @code{modules-enabled}, @code{modules-disabled}, @code{groups-file}, @code{allow-registration?}, @code{ssl}, @code{c2s-require-encryption?}, @code{s2s-require-encryption?}, @code{s2s-secure-auth?}, @code{s2s-insecure-domains}, @code{s2s-secure-domains}, @code{authentication}, @code{log}, plus:
+@deftypevr {@code{int-component-configuration} parameter} string hostname
+Hostname of the component.
+@end deftypevr
+
+@deftypevr {@code{int-component-configuration} parameter} string plugin
+Plugin you wish to use for the component.
+@end deftypevr
+
+@deftypevr {@code{int-component-configuration} parameter} maybe-mod-muc-configuration mod-muc
+Multi-user chat (MUC) is Prosody's module for allowing you to create
+hosted chatrooms/conferences for XMPP users.
+
+General information on setting up and using multi-user chatrooms can be found
+in the "Chatrooms" documentation (@url{http://prosody.im/doc/chatrooms}),
+which you should read if you are new to XMPP chatrooms.
+
+See also @url{http://prosody.im/doc/modules/mod_muc}.
+
+Available @code{mod-muc-configuration} fields are:
+
+@deftypevr {@code{mod-muc-configuration} parameter} string name
+The name to return in service discovery responses.
+Defaults to @samp{"Prosody Chatrooms"}.
+@end deftypevr
+
+@deftypevr {@code{mod-muc-configuration} parameter} string-or-boolean restrict-room-creation
+If @samp{#t}, this will only allow admins to create new chatrooms.
+Otherwise anyone can create a room.  The value @samp{"local"} restricts room
+creation to users on the service's parent domain.  E.g. @samp{user@@example.com}
+can create rooms on @samp{rooms.example.com}.  The value @samp{"admin"}
+restricts to service administrators only.
+Defaults to @samp{#f}.
+@end deftypevr
+
+@deftypevr {@code{mod-muc-configuration} parameter} non-negative-integer max-history-messages
+Maximum number of history messages that will be sent to the member that has
+just joined the room.
+Defaults to @samp{20}.
+@end deftypevr
+
+@end deftypevr
+
+@end deftypevr
+
+@deftypevr {@code{prosody-configuration} parameter} ext-component-configuration-list ext-components
+External components use XEP-0114, which most standalone components
+support.  To add an external component, you simply fill the hostname field.  See
+@url{http://prosody.im/doc/components}.
+Defaults to @samp{()}.
+
+Available @code{ext-component-configuration} fields are:
+
+all these @code{prosody-configuration} fields: @code{admins}, @code{use-libevent?}, @code{modules-enabled}, @code{modules-disabled}, @code{groups-file}, @code{allow-registration?}, @code{ssl}, @code{c2s-require-encryption?}, @code{s2s-require-encryption?}, @code{s2s-secure-auth?}, @code{s2s-insecure-domains}, @code{s2s-secure-domains}, @code{authentication}, @code{log}, plus:
+@deftypevr {@code{ext-component-configuration} parameter} string component-secret
+Password which the component will use to log in.
+@end deftypevr
+
+@deftypevr {@code{ext-component-configuration} parameter} string hostname
+Hostname of the component.
+@end deftypevr
+
+@end deftypevr
+
+@deftypevr {@code{prosody-configuration} parameter} non-negative-integer-list component-ports
+Port(s) Prosody listens on for component connections.
+@end deftypevr
+
+@deftypevr {@code{prosody-configuration} parameter} string component-interface
+Interface Prosody listens on for component connections.
+Defaults to @samp{"127.0.0.1"}.
+@end deftypevr
+
+It could be that you just want to get a @code{prosody.cfg.lua}
+up and running.  In that case, you can pass an
+@code{opaque-prosody-configuration} record as the value of
+@code{prosody-service-type}.  As its name indicates, an opaque configuration
+does not have easy reflective capabilities.
+Available @code{opaque-prosody-configuration} fields are:
+
+@deftypevr {@code{opaque-prosody-configuration} parameter} package prosody
+The prosody package.
+@end deftypevr
+
+@deftypevr {@code{opaque-prosody-configuration} parameter} string prosody.cfg.lua
+The contents of the @code{prosody.cfg.lua} to use.
+@end deftypevr
+
+For example, if your @code{prosody.cfg.lua} is just the empty
+string, you could instantiate a prosody service like this:
+
+@example
+(service prosody-service-type
+         (opaque-prosody-configuration
+          (prosody.cfg.lua "")))
+@end example
+
 @node Kerberos Services
 @subsubsection Kerberos Services
 @cindex Kerberos
@@ -11713,8 +12276,8 @@ The @code{(gnu services web)} module provides the following service:
 @deffn {Scheme Procedure} nginx-service [#:nginx nginx] @
        [#:log-directory ``/var/log/nginx''] @
        [#:run-directory ``/var/run/nginx''] @
-       [#:vhost-list (list (nginx-vhost-configuration))] @
-       [#:config-file]
+       [#:server-list '()] @
+       [#:config-file @code{#f}]
 
 Return a service that runs @var{nginx}, the nginx web server.
 
@@ -11724,32 +12287,46 @@ files are written to @var{run-directory}.  For proper operation, these
 arguments should match what is in @var{config-file} to ensure that the
 directories are created when the service is activated.
 
-As an alternative to using a @var{config-file}, @var{vhost-list} can be
-used to specify the list of @dfn{virtual hosts} required on the host.  For
+As an alternative to using a @var{config-file}, @var{server-list} can be
+used to specify the list of @dfn{server blocks} required on the host.  For
 this to work, use the default value for @var{config-file}.
 
 @end deffn
 
-@deftp {Data Type} nginx-vhost-configuration
-Data type representing the configuration of an nginx virtual host.
+@deffn {Scheme Variable} nginx-service-type
+This is type for the nginx web server.
+
+This service can be extended to add server blocks in addition to the
+default one, as in this example:
+
+@example
+(simple-service 'my-extra-server nginx-service-type
+                (list (nginx-server-configuration
+                        (https-port #f)
+                        (root "/srv/http/extra-website"))))
+@end example
+@end deffn
+
+@deftp {Data Type} nginx-server-configuration
+Data type representing the configuration of an nginx server block.
 This type has the following parameters:
 
 @table @asis
 @item @code{http-port} (default: @code{80})
 Nginx will listen for HTTP connection on this port.  Set it at @code{#f} if
 nginx should not listen for HTTP (non secure) connection for this
-@dfn{virtual host}.
+@dfn{server block}.
 
 @item @code{https-port} (default: @code{443})
 Nginx will listen for HTTPS connection on this port.  Set it at @code{#f} if
-nginx should not listen for HTTPS (secure) connection for this @dfn{virtual host}.
+nginx should not listen for HTTPS (secure) connection for this @dfn{server block}.
 
 Note that nginx can listen for HTTP and HTTPS connections in the same
-@dfn{virtual host}.
+@dfn{server block}.
 
 @item @code{server-name} (default: @code{(list 'default)})
-A list of server names this vhost represents. @code{'default} represents the
-default vhost for connections matching no other vhost.
+A list of server names this server represents. @code{'default} represents the
+default server for connections matching no other server.
 
 @item @code{root} (default: @code{"/srv/http"})
 Root of the website nginx will serve.
@@ -11897,36 +12474,38 @@ providing substitutes to others (@pxref{Substitutes}).
 
 The @code{(gnu services cuirass)} module provides the following service.
 
-@deffn {Scheme Procedure} cuirass-service @
-       [#:config @code{(cuirass-configuration)}]
-Return a service that runs @command{cuirass}.
-
-The @var{#:config} keyword argument specifies the configuration for
-@command{cuirass}, which must be a @code{<cuirass-configuration>}
-object, by default it doesn't provide any build job.  If you want to
-provide your own configuration you will most likely use the
-@code{cuirass-configuration} special form which returns such objects.
-@end deffn
+@defvr {Scheme Procedure} cuirass-service-type
+The type of the Cuirass service.  Its value must be a
+@code{cuirass-configuration} object, as described below.
+@end defvr
 
-In order to add build jobs you will have to set the
-@code{specifications} field.  Here is an example of a cuirass service
-defining a build job based on a specification that can be found in
-Cuirass source tree.
+To add build jobs, you have to set the @code{specifications} field of
+the configuration.  Here is an example of a service defining a build job
+based on a specification that can be found in Cuirass source tree.  This
+service polls the Guix repository and builds a subset of the Guix
+packages, as prescribed in the @file{gnu-system.scm} example spec:
 
 @example
-(let ((spec `((#:name . "guix")
-              (#:url . "git://git.savannah.gnu.org/guix.git")
-              (#:load-path . ".")
-              ;; Adapt to a valid absolute file name.
-              (#:file . "/.../cuirass/tests/gnu-system.scm")
-              (#:proc . hydra-jobs)
-              (#:arguments (subset . "hello"))
-              (#:branch . "master"))))
-  (cuirass-service #:config (cuirass-configuration
-                             (specifications (list spec)))))
+(let ((spec #~((#:name . "guix")
+               (#:url . "git://git.savannah.gnu.org/guix.git")
+               (#:load-path . ".")
+
+               ;; Here we must provide an absolute file name.
+               ;; We take jobs from one of the examples provided
+               ;; by Cuirass.
+               (#:file . #$(file-append
+                            cuirass
+                            "/tests/gnu-system.scm"))
+
+               (#:proc . hydra-jobs)
+               (#:arguments (subset . "hello"))
+               (#:branch . "master"))))
+  (service cuirass-service-type
+           (cuirass-configuration
+            (specifications #~(list #$spec)))))
 @end example
 
-While information related to build jobs are located directly in the
+While information related to build jobs is located directly in the
 specifications, global settings for the @command{cuirass} process are
 accessible in other @code{cuirass-configuration} fields.
 
@@ -11934,7 +12513,10 @@ accessible in other @code{cuirass-configuration} fields.
 Data type representing the configuration of Cuirass.
 
 @table @asis
-@item @code{cache-directory} (default: @code{""})
+@item @code{log-file} (default: @code{"/var/log/cuirass.log"})
+Location of the log file.
+
+@item @code{cache-directory} (default: @code{"/var/cache/cuirass"})
 Location of the repository cache.
 
 @item @code{user} (default: @code{"cuirass"})
@@ -11951,8 +12533,9 @@ Cuirass jobs.
 Location of sqlite database which contains the build results and previously
 added specifications.
 
-@item @code{specifications} (default: @code{'()})
-A list of specifications, where a specification is an association list
+@item @code{specifications} (default: @code{#~'()})
+A gexp (@pxref{G-Expressions}) that evaluates to a list of specifications,
+where a specification is an association list
 (@pxref{Associations Lists,,, guile, GNU Guile Reference Manual}) whose
 keys are keywords (@code{#:keyword-example}) as shown in the example
 above.
@@ -11963,6 +12546,9 @@ from source.
 
 @item @code{one-shot?} (default: @code{#f})
 Only evaluate specifications and build derivations once.
+
+@item @code{cuirass} (default: @code{cuirass})
+The Cuirass package to use.
 @end table
 @end deftp
 
@@ -12506,6 +13092,9 @@ The number of seconds to wait for keyboard input before booting.  Set to
 
 @item @code{theme} (default: @var{%default-theme})
 The @code{grub-theme} object describing the theme to use.
+
+@item @code{grub} (default: @code{grub})
+The GRUB package to use.
 @end table
 
 @end deftp
diff --git a/doc/htmlxref.cnf b/doc/htmlxref.cnf
index bd2eb5f147..93e214fcc5 100644
--- a/doc/htmlxref.cnf
+++ b/doc/htmlxref.cnf
@@ -219,6 +219,8 @@ emacs		node	${EMACS}/html_node/emacs/
 easejs		mono	${GS}/easejs/manual/easejs.html
 easejs		node	${GS}/easejs/manual/
 
+emacs-guix	mono	https://notabug.org/alezost/emacs-guix
+
 emacs-muse	node	${GS}/emacs-muse/manual/muse.html
 emacs-muse	node	${GS}/emacs-muse/manual/html_node/
 
diff --git a/doc/images/bootstrap-packages.dot b/doc/images/bootstrap-packages.dot
index 3d64521edf..8b2df068a8 100644
--- a/doc/images/bootstrap-packages.dot
+++ b/doc/images/bootstrap-packages.dot
@@ -1,105 +1,111 @@
 digraph "Guix bag" {
-  "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" [label = "glibc-intermediate-2.22", shape = box, fontname = Helvetica];
-  "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" [color = red];
-  "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" [color = red];
-  "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" [color = red];
-  "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" [color = red];
-  "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red];
-  "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [color = red];
-  "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" [color = red];
-  "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" [color = red];
-  "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red];
-  "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red];
-  "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
-  "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
-  "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red];
-  "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
-  "/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" [color = red];
-  "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" [label = "texinfo-6.0", shape = box, fontname = Helvetica];
-  "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red];
-  "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [color = red];
-  "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" [color = red];
-  "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" [color = red];
-  "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red];
-  "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red];
-  "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red];
-  "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
-  "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
-  "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" [color = red];
-  "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [label = "make-boot0-4.1", shape = box, fontname = Helvetica];
-  "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red];
-  "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red];
-  "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red];
-  "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
-  "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
-  "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [label = "glibc-bootstrap-0", shape = box, fontname = Helvetica];
-  "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [label = "gcc-bootstrap-0", shape = box, fontname = Helvetica];
-  "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red];
-  "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [label = "binutils-bootstrap-0", shape = box, fontname = Helvetica];
-  "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [label = "bootstrap-binaries-0", shape = box, fontname = Helvetica];
-  "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [label = "diffutils-boot0-3.3", shape = box, fontname = Helvetica];
-  "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red];
-  "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red];
-  "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red];
-  "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red];
-  "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
-  "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
-  "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" [label = "findutils-boot0-4.6.0", shape = box, fontname = Helvetica];
-  "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red];
-  "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" -> "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [color = red];
-  "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red];
-  "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red];
-  "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red];
-  "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
-  "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
-  "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" [label = "file-boot0-5.25", shape = box, fontname = Helvetica];
-  "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red];
-  "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red];
-  "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red];
-  "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red];
-  "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
-  "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
-  "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" [label = "perl-boot0-5.22.0", shape = box, fontname = Helvetica];
-  "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red];
-  "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [color = red];
-  "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" [color = red];
-  "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" [color = red];
-  "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red];
-  "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red];
-  "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red];
-  "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
-  "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
-  "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" [label = "gcc-cross-boot0-4.9.3", shape = box, fontname = Helvetica];
-  "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" [color = red];
-  "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red];
-  "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red];
-  "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [color = red];
-  "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" [color = red];
-  "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" [color = red];
-  "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red];
-  "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red];
-  "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
-  "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
-  "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" [label = "binutils-cross-boot0-2.25.1", shape = box, fontname = Helvetica];
-  "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red];
-  "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [color = red];
-  "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" [color = red];
-  "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" [color = red];
-  "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red];
-  "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red];
-  "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red];
-  "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
-  "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
-  "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" [label = "linux-libre-headers-3.14.37", shape = box, fontname = Helvetica];
-  "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" [color = red];
-  "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red];
-  "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [color = red];
-  "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" [color = red];
-  "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" [color = red];
-  "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red];
-  "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red];
-  "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red];
-  "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
-  "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
+  "/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" [label = "glibc-intermediate-2.24", shape = box, fontname = Helvetica];
+  "/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" [color = magenta];
+  "/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" [color = magenta];
+  "/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" [color = magenta];
+  "/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/72snmrnjphwjxffknjhzm3xg38wd08al-ld-wrapper-x86_64-guix-linux-gnu-0.drv" [color = magenta];
+  "/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" [color = magenta];
+  "/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" [color = magenta];
+  "/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" [color = magenta];
+  "/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" [color = magenta];
+  "/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" [color = magenta];
+  "/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [color = magenta];
+  "/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [color = magenta];
+  "/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = magenta];
+  "/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = magenta];
+  "/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [color = magenta];
+  "/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = magenta];
+  "/gnu/store/aymf6jlxxpwgr71rkiz24m646nqsyii6-glibc-intermediate-2.24.drv" -> "/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" [color = magenta];
+  "/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" [label = "texinfo-6.3", shape = box, fontname = Helvetica];
+  "/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" -> "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" [color = cyan3];
+  "/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" -> "/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" [color = cyan3];
+  "/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" -> "/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" [color = cyan3];
+  "/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" -> "/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" [color = cyan3];
+  "/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" -> "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [color = cyan3];
+  "/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" -> "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [color = cyan3];
+  "/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" -> "/gnu/store/wv8sf8h4n9s5cdya223iy2wp3alr92x8-binutils-bootstrap-0.drv" [color = cyan3];
+  "/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = cyan3];
+  "/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = cyan3];
+  "/gnu/store/wx8ifbb7x22cl4998fyldsr24fcv18j3-texinfo-6.3.drv" -> "/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" [color = cyan3];
+  "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" [label = "make-boot0-4.2.1", shape = box, fontname = Helvetica];
+  "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" -> "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [color = dimgrey];
+  "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" -> "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [color = dimgrey];
+  "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" -> "/gnu/store/wv8sf8h4n9s5cdya223iy2wp3alr92x8-binutils-bootstrap-0.drv" [color = dimgrey];
+  "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = dimgrey];
+  "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = dimgrey];
+  "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [label = "glibc-bootstrap-0", shape = box, fontname = Helvetica];
+  "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [label = "gcc-bootstrap-0", shape = box, fontname = Helvetica];
+  "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" -> "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [color = darkseagreen];
+  "/gnu/store/wv8sf8h4n9s5cdya223iy2wp3alr92x8-binutils-bootstrap-0.drv" [label = "binutils-bootstrap-0", shape = box, fontname = Helvetica];
+  "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [label = "bootstrap-binaries-0", shape = box, fontname = Helvetica];
+  "/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" [label = "diffutils-boot0-3.5", shape = box, fontname = Helvetica];
+  "/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" -> "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" [color = blue];
+  "/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" -> "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [color = blue];
+  "/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" -> "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [color = blue];
+  "/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" -> "/gnu/store/wv8sf8h4n9s5cdya223iy2wp3alr92x8-binutils-bootstrap-0.drv" [color = blue];
+  "/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = blue];
+  "/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = blue];
+  "/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" [label = "findutils-boot0-4.6.0", shape = box, fontname = Helvetica];
+  "/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" -> "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" [color = blue];
+  "/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" -> "/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" [color = blue];
+  "/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" -> "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [color = blue];
+  "/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" -> "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [color = blue];
+  "/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" -> "/gnu/store/wv8sf8h4n9s5cdya223iy2wp3alr92x8-binutils-bootstrap-0.drv" [color = blue];
+  "/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = blue];
+  "/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = blue];
+  "/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" [label = "file-boot0-5.28", shape = box, fontname = Helvetica];
+  "/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" -> "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" [color = darkgoldenrod];
+  "/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" -> "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [color = darkgoldenrod];
+  "/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" -> "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [color = darkgoldenrod];
+  "/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" -> "/gnu/store/wv8sf8h4n9s5cdya223iy2wp3alr92x8-binutils-bootstrap-0.drv" [color = darkgoldenrod];
+  "/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = darkgoldenrod];
+  "/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = darkgoldenrod];
+  "/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" [label = "perl-boot0-5.24.0", shape = box, fontname = Helvetica];
+  "/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" -> "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" [color = peachpuff4];
+  "/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" -> "/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" [color = peachpuff4];
+  "/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" -> "/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" [color = peachpuff4];
+  "/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" -> "/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" [color = peachpuff4];
+  "/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" -> "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [color = peachpuff4];
+  "/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" -> "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [color = peachpuff4];
+  "/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" -> "/gnu/store/wv8sf8h4n9s5cdya223iy2wp3alr92x8-binutils-bootstrap-0.drv" [color = peachpuff4];
+  "/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = peachpuff4];
+  "/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = peachpuff4];
+  "/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" [label = "gcc-cross-boot0-4.9.4", shape = box, fontname = Helvetica];
+  "/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" -> "/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" [color = darkseagreen];
+  "/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" -> "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [color = darkseagreen];
+  "/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" -> "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" [color = darkseagreen];
+  "/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" -> "/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" [color = darkseagreen];
+  "/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" -> "/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" [color = darkseagreen];
+  "/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" -> "/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" [color = darkseagreen];
+  "/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" -> "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [color = darkseagreen];
+  "/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" -> "/gnu/store/wv8sf8h4n9s5cdya223iy2wp3alr92x8-binutils-bootstrap-0.drv" [color = darkseagreen];
+  "/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = darkseagreen];
+  "/gnu/store/w9adgzgdqkwz0w13zxf2fn363v9wcllc-gcc-cross-boot0-4.9.4.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = darkseagreen];
+  "/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" [label = "binutils-cross-boot0-2.27", shape = box, fontname = Helvetica];
+  "/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" -> "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" [color = dimgrey];
+  "/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" -> "/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" [color = dimgrey];
+  "/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" -> "/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" [color = dimgrey];
+  "/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" -> "/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" [color = dimgrey];
+  "/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" -> "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [color = dimgrey];
+  "/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" -> "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [color = dimgrey];
+  "/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" -> "/gnu/store/wv8sf8h4n9s5cdya223iy2wp3alr92x8-binutils-bootstrap-0.drv" [color = dimgrey];
+  "/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = dimgrey];
+  "/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = dimgrey];
+  "/gnu/store/72snmrnjphwjxffknjhzm3xg38wd08al-ld-wrapper-x86_64-guix-linux-gnu-0.drv" [label = "ld-wrapper-x86_64-guix-linux-gnu-0", shape = box, fontname = Helvetica];
+  "/gnu/store/72snmrnjphwjxffknjhzm3xg38wd08al-ld-wrapper-x86_64-guix-linux-gnu-0.drv" -> "/gnu/store/v1v7jp438hc5rpgriwpjp04x049vh0g4-binutils-cross-boot0-2.27.drv" [color = dimgrey];
+  "/gnu/store/72snmrnjphwjxffknjhzm3xg38wd08al-ld-wrapper-x86_64-guix-linux-gnu-0.drv" -> "/gnu/store/af19ma2vm3qhvh3rw6cdivyp98s18bj3-guile-bootstrap-2.0.drv" [color = dimgrey];
+  "/gnu/store/72snmrnjphwjxffknjhzm3xg38wd08al-ld-wrapper-x86_64-guix-linux-gnu-0.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = dimgrey];
+  "/gnu/store/af19ma2vm3qhvh3rw6cdivyp98s18bj3-guile-bootstrap-2.0.drv" [label = "guile-bootstrap-2.0", shape = box, fontname = Helvetica];
+  "/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" [label = "linux-libre-headers-4.4.18", shape = box, fontname = Helvetica];
+  "/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" -> "/gnu/store/ccj3as3258l70lmphi48hs7n017wv75s-perl-boot0-5.24.0.drv" [color = blue];
+  "/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" -> "/gnu/store/1jpld53g41rzv2bmjp6v9mckmyw75vs3-make-boot0-4.2.1.drv" [color = blue];
+  "/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" -> "/gnu/store/zpphawi07xidhfs2dja3w7hmnfp99j02-diffutils-boot0-3.5.drv" [color = blue];
+  "/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" -> "/gnu/store/m4900ip34w4rcgn5620iqdi1wv198d9s-findutils-boot0-4.6.0.drv" [color = blue];
+  "/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" -> "/gnu/store/nwzyr3xskw0ms8cndffsfvhvm5xz96pc-file-boot0-5.28.drv" [color = blue];
+  "/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" -> "/gnu/store/wda0p45jlbzg6w9j8zxw2sd11n2a4pbv-glibc-bootstrap-0.drv" [color = blue];
+  "/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" -> "/gnu/store/jxlg2pb4bhxjld9kimc0vgc1pvgifzag-gcc-bootstrap-0.drv" [color = blue];
+  "/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" -> "/gnu/store/wv8sf8h4n9s5cdya223iy2wp3alr92x8-binutils-bootstrap-0.drv" [color = blue];
+  "/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = blue];
+  "/gnu/store/5syba2bxhh8z79jhq83fzy8fxcx5xb4s-linux-libre-headers-4.4.18.drv" -> "/gnu/store/pmvh852v0x1zbl4r37pcpdqnq6m3bwfk-bootstrap-binaries-0.drv" [color = blue];
 
 }
diff --git a/doc/images/coreutils-bag-graph.dot b/doc/images/coreutils-bag-graph.dot
index 422c719282..7c90db65d4 100644
--- a/doc/images/coreutils-bag-graph.dot
+++ b/doc/images/coreutils-bag-graph.dot
@@ -1,215 +1,215 @@
 digraph "Guix bag-emerged" {
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" [label = "coreutils-8.24", shape = box, fontname = Helvetica];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" [color = red];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" [color = red];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" [color = red];
-  "/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" [color = red];
-  "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" [label = "perl-5.16.1", shape = box, fontname = Helvetica];
-  "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
-  "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
-  "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
-  "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
-  "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
-  "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
-  "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
-  "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
-  "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
-  "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
-  "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
-  "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
-  "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
-  "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
-  "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
-  "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
-  "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
-  "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
-  "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
-  "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [label = "tar-1.28", shape = box, fontname = Helvetica];
-  "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [label = "gzip-1.6", shape = box, fontname = Helvetica];
-  "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [label = "bzip2-1.0.6", shape = box, fontname = Helvetica];
-  "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [label = "xz-5.0.4", shape = box, fontname = Helvetica];
-  "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [label = "file-5.22", shape = box, fontname = Helvetica];
-  "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [label = "diffutils-3.3", shape = box, fontname = Helvetica];
-  "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [label = "patch-2.7.5", shape = box, fontname = Helvetica];
-  "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [label = "sed-4.2.2", shape = box, fontname = Helvetica];
-  "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [label = "findutils-4.4.2", shape = box, fontname = Helvetica];
-  "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [label = "gawk-4.1.3", shape = box, fontname = Helvetica];
-  "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [label = "grep-2.21", shape = box, fontname = Helvetica];
-  "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [label = "coreutils-8.24", shape = box, fontname = Helvetica];
-  "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [label = "make-4.1", shape = box, fontname = Helvetica];
-  "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [label = "bash-4.3.39", shape = box, fontname = Helvetica];
-  "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [label = "ld-wrapper-0", shape = box, fontname = Helvetica];
-  "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [label = "binutils-2.25.1", shape = box, fontname = Helvetica];
-  "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [label = "gcc-4.9.3", shape = box, fontname = Helvetica];
-  "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [label = "glibc-2.22", shape = box, fontname = Helvetica];
-  "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [label = "glibc-utf8-locales-2.22", shape = box, fontname = Helvetica];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" [label = "acl-2.2.52", shape = box, fontname = Helvetica];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" [color = red];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" [color = red];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
-  "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" [color = red];
-  "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" [label = "gettext-0.19.6", shape = box, fontname = Helvetica];
-  "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
-  "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
-  "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
-  "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
-  "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
-  "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
-  "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
-  "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
-  "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
-  "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
-  "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
-  "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
-  "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
-  "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
-  "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
-  "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
-  "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
-  "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
-  "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
-  "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" [color = red];
-  "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" [label = "expat-2.1.0", shape = box, fontname = Helvetica];
-  "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
-  "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
-  "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
-  "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
-  "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
-  "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
-  "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
-  "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
-  "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
-  "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
-  "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
-  "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
-  "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
-  "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
-  "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
-  "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
-  "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
-  "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
-  "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
-  "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" [label = "attr-2.4.46", shape = box, fontname = Helvetica];
-  "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" [color = red];
-  "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
-  "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
-  "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
-  "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
-  "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
-  "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
-  "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
-  "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
-  "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
-  "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
-  "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
-  "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
-  "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
-  "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
-  "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
-  "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
-  "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
-  "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
-  "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
-  "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" [color = red];
-  "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" [label = "gmp-6.0.0a", shape = box, fontname = Helvetica];
-  "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" [color = red];
-  "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
-  "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
-  "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
-  "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
-  "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
-  "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
-  "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
-  "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
-  "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
-  "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
-  "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
-  "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
-  "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
-  "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
-  "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
-  "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
-  "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
-  "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
-  "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
-  "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" [label = "m4-1.4.17", shape = box, fontname = Helvetica];
-  "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
-  "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
-  "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
-  "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
-  "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
-  "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
-  "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
-  "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
-  "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
-  "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
-  "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
-  "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
-  "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
-  "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
-  "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
-  "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
-  "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
-  "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
-  "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
-  "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" [label = "libcap-2.24", shape = box, fontname = Helvetica];
-  "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" [color = red];
-  "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
-  "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
-  "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
-  "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
-  "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
-  "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
-  "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
-  "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
-  "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
-  "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
-  "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
-  "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
-  "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
-  "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
-  "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
-  "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
-  "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
-  "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
-  "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
-  "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" [color = red];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" [label = "coreutils-8.25", shape = box, fontname = Helvetica];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" [color = cyan3];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/7ijl8lybdx95kndajavdrpz05jdiwy9g-tar-1.29.drv" [color = cyan3];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/0ykf3p023pzfcg2bw8ahjc7cvmc12zjq-gzip-1.8.drv" [color = cyan3];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/xx3hiqhqn0d94zz7b46hgggwsz3wjiiw-bzip2-1.0.6.drv" [color = cyan3];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/kz8rzasivw4aflsv4rll3m539xybf226-xz-5.2.2.drv" [color = cyan3];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/3pwrlsd23k2h104akxfj3cxhqcp973g9-file-5.28.drv" [color = cyan3];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/f1ww5vh5abnvr8b24llipm5dl89s5lq2-diffutils-3.5.drv" [color = cyan3];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/0cbgdhhyh7hsgwq1x54n9vnq99rfjch9-patch-2.7.5.drv" [color = cyan3];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/8xjnm44dfwwxp90hxq6zhb6qvia7rb3l-sed-4.2.2.drv" [color = cyan3];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/54wjl6dp6rp47r67f4nyfqyv8nh456yc-findutils-4.6.0.drv" [color = cyan3];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/k951w49yw74ikg19l4mmlwfrq9w7a7zd-gawk-4.1.4.drv" [color = cyan3];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/n48xdjkvhlhj5mgdzy59n0dpb9vn0v78-grep-2.25.drv" [color = cyan3];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/i52csyja3036ns0zj6z85lkgz3wfyym7-coreutils-8.25.drv" [color = cyan3];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/nv4mnbz3mpd4gv80djk7762wyvxpccqk-make-4.2.1.drv" [color = cyan3];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/2c60vlcvpj5dvmgklajkp7cpynhcqixr-bash-4.4.0.drv" [color = cyan3];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/zhc5c4s0xvzizpgpq2za6x84vxv57iy6-ld-wrapper-0.drv" [color = cyan3];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/9k1js0kalh4s6q4hf0rgg2n0zdyrwi69-binutils-2.27.drv" [color = cyan3];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/hv3dl3my12mq0gkwvckmnqccnckn39l0-gcc-4.9.4.drv" [color = cyan3];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/qbfynm50snyn31w2c3paiw2n6wvzksg8-glibc-2.24.drv" [color = cyan3];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/ir0lq2x7h64g2z5mlqvnlysjk2bc9xka-glibc-utf8-locales-2.24.drv" [color = cyan3];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" [color = cyan3];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" [color = cyan3];
+  "/gnu/store/yv2r96w2dvbb0sjrf9f2imybpnyd616b-coreutils-8.25.drv" -> "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" [color = cyan3];
+  "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" [label = "perl-5.24.0", shape = box, fontname = Helvetica];
+  "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/7ijl8lybdx95kndajavdrpz05jdiwy9g-tar-1.29.drv" [color = blue];
+  "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/0ykf3p023pzfcg2bw8ahjc7cvmc12zjq-gzip-1.8.drv" [color = blue];
+  "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/xx3hiqhqn0d94zz7b46hgggwsz3wjiiw-bzip2-1.0.6.drv" [color = blue];
+  "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/kz8rzasivw4aflsv4rll3m539xybf226-xz-5.2.2.drv" [color = blue];
+  "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/3pwrlsd23k2h104akxfj3cxhqcp973g9-file-5.28.drv" [color = blue];
+  "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/f1ww5vh5abnvr8b24llipm5dl89s5lq2-diffutils-3.5.drv" [color = blue];
+  "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/0cbgdhhyh7hsgwq1x54n9vnq99rfjch9-patch-2.7.5.drv" [color = blue];
+  "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/8xjnm44dfwwxp90hxq6zhb6qvia7rb3l-sed-4.2.2.drv" [color = blue];
+  "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/54wjl6dp6rp47r67f4nyfqyv8nh456yc-findutils-4.6.0.drv" [color = blue];
+  "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/k951w49yw74ikg19l4mmlwfrq9w7a7zd-gawk-4.1.4.drv" [color = blue];
+  "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/n48xdjkvhlhj5mgdzy59n0dpb9vn0v78-grep-2.25.drv" [color = blue];
+  "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/i52csyja3036ns0zj6z85lkgz3wfyym7-coreutils-8.25.drv" [color = blue];
+  "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/nv4mnbz3mpd4gv80djk7762wyvxpccqk-make-4.2.1.drv" [color = blue];
+  "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/2c60vlcvpj5dvmgklajkp7cpynhcqixr-bash-4.4.0.drv" [color = blue];
+  "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/zhc5c4s0xvzizpgpq2za6x84vxv57iy6-ld-wrapper-0.drv" [color = blue];
+  "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/9k1js0kalh4s6q4hf0rgg2n0zdyrwi69-binutils-2.27.drv" [color = blue];
+  "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/hv3dl3my12mq0gkwvckmnqccnckn39l0-gcc-4.9.4.drv" [color = blue];
+  "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/qbfynm50snyn31w2c3paiw2n6wvzksg8-glibc-2.24.drv" [color = blue];
+  "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" -> "/gnu/store/ir0lq2x7h64g2z5mlqvnlysjk2bc9xka-glibc-utf8-locales-2.24.drv" [color = blue];
+  "/gnu/store/7ijl8lybdx95kndajavdrpz05jdiwy9g-tar-1.29.drv" [label = "tar-1.29", shape = box, fontname = Helvetica];
+  "/gnu/store/0ykf3p023pzfcg2bw8ahjc7cvmc12zjq-gzip-1.8.drv" [label = "gzip-1.8", shape = box, fontname = Helvetica];
+  "/gnu/store/xx3hiqhqn0d94zz7b46hgggwsz3wjiiw-bzip2-1.0.6.drv" [label = "bzip2-1.0.6", shape = box, fontname = Helvetica];
+  "/gnu/store/kz8rzasivw4aflsv4rll3m539xybf226-xz-5.2.2.drv" [label = "xz-5.2.2", shape = box, fontname = Helvetica];
+  "/gnu/store/3pwrlsd23k2h104akxfj3cxhqcp973g9-file-5.28.drv" [label = "file-5.28", shape = box, fontname = Helvetica];
+  "/gnu/store/f1ww5vh5abnvr8b24llipm5dl89s5lq2-diffutils-3.5.drv" [label = "diffutils-3.5", shape = box, fontname = Helvetica];
+  "/gnu/store/0cbgdhhyh7hsgwq1x54n9vnq99rfjch9-patch-2.7.5.drv" [label = "patch-2.7.5", shape = box, fontname = Helvetica];
+  "/gnu/store/8xjnm44dfwwxp90hxq6zhb6qvia7rb3l-sed-4.2.2.drv" [label = "sed-4.2.2", shape = box, fontname = Helvetica];
+  "/gnu/store/54wjl6dp6rp47r67f4nyfqyv8nh456yc-findutils-4.6.0.drv" [label = "findutils-4.6.0", shape = box, fontname = Helvetica];
+  "/gnu/store/k951w49yw74ikg19l4mmlwfrq9w7a7zd-gawk-4.1.4.drv" [label = "gawk-4.1.4", shape = box, fontname = Helvetica];
+  "/gnu/store/n48xdjkvhlhj5mgdzy59n0dpb9vn0v78-grep-2.25.drv" [label = "grep-2.25", shape = box, fontname = Helvetica];
+  "/gnu/store/i52csyja3036ns0zj6z85lkgz3wfyym7-coreutils-8.25.drv" [label = "coreutils-8.25", shape = box, fontname = Helvetica];
+  "/gnu/store/nv4mnbz3mpd4gv80djk7762wyvxpccqk-make-4.2.1.drv" [label = "make-4.2.1", shape = box, fontname = Helvetica];
+  "/gnu/store/2c60vlcvpj5dvmgklajkp7cpynhcqixr-bash-4.4.0.drv" [label = "bash-4.4.0", shape = box, fontname = Helvetica];
+  "/gnu/store/zhc5c4s0xvzizpgpq2za6x84vxv57iy6-ld-wrapper-0.drv" [label = "ld-wrapper-0", shape = box, fontname = Helvetica];
+  "/gnu/store/9k1js0kalh4s6q4hf0rgg2n0zdyrwi69-binutils-2.27.drv" [label = "binutils-2.27", shape = box, fontname = Helvetica];
+  "/gnu/store/hv3dl3my12mq0gkwvckmnqccnckn39l0-gcc-4.9.4.drv" [label = "gcc-4.9.4", shape = box, fontname = Helvetica];
+  "/gnu/store/qbfynm50snyn31w2c3paiw2n6wvzksg8-glibc-2.24.drv" [label = "glibc-2.24", shape = box, fontname = Helvetica];
+  "/gnu/store/ir0lq2x7h64g2z5mlqvnlysjk2bc9xka-glibc-utf8-locales-2.24.drv" [label = "glibc-utf8-locales-2.24", shape = box, fontname = Helvetica];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" [label = "acl-2.2.52", shape = box, fontname = Helvetica];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" [color = darkgoldenrod];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" [color = darkgoldenrod];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/7ijl8lybdx95kndajavdrpz05jdiwy9g-tar-1.29.drv" [color = darkgoldenrod];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/0ykf3p023pzfcg2bw8ahjc7cvmc12zjq-gzip-1.8.drv" [color = darkgoldenrod];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/xx3hiqhqn0d94zz7b46hgggwsz3wjiiw-bzip2-1.0.6.drv" [color = darkgoldenrod];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/kz8rzasivw4aflsv4rll3m539xybf226-xz-5.2.2.drv" [color = darkgoldenrod];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/3pwrlsd23k2h104akxfj3cxhqcp973g9-file-5.28.drv" [color = darkgoldenrod];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/f1ww5vh5abnvr8b24llipm5dl89s5lq2-diffutils-3.5.drv" [color = darkgoldenrod];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/0cbgdhhyh7hsgwq1x54n9vnq99rfjch9-patch-2.7.5.drv" [color = darkgoldenrod];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/8xjnm44dfwwxp90hxq6zhb6qvia7rb3l-sed-4.2.2.drv" [color = darkgoldenrod];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/54wjl6dp6rp47r67f4nyfqyv8nh456yc-findutils-4.6.0.drv" [color = darkgoldenrod];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/k951w49yw74ikg19l4mmlwfrq9w7a7zd-gawk-4.1.4.drv" [color = darkgoldenrod];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/n48xdjkvhlhj5mgdzy59n0dpb9vn0v78-grep-2.25.drv" [color = darkgoldenrod];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/i52csyja3036ns0zj6z85lkgz3wfyym7-coreutils-8.25.drv" [color = darkgoldenrod];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/nv4mnbz3mpd4gv80djk7762wyvxpccqk-make-4.2.1.drv" [color = darkgoldenrod];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/2c60vlcvpj5dvmgklajkp7cpynhcqixr-bash-4.4.0.drv" [color = darkgoldenrod];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/zhc5c4s0xvzizpgpq2za6x84vxv57iy6-ld-wrapper-0.drv" [color = darkgoldenrod];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/9k1js0kalh4s6q4hf0rgg2n0zdyrwi69-binutils-2.27.drv" [color = darkgoldenrod];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/hv3dl3my12mq0gkwvckmnqccnckn39l0-gcc-4.9.4.drv" [color = darkgoldenrod];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/qbfynm50snyn31w2c3paiw2n6wvzksg8-glibc-2.24.drv" [color = darkgoldenrod];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/ir0lq2x7h64g2z5mlqvnlysjk2bc9xka-glibc-utf8-locales-2.24.drv" [color = darkgoldenrod];
+  "/gnu/store/ywmblv73pqa8lqqz368g46ysz65pnm0v-acl-2.2.52.drv" -> "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" [color = darkgoldenrod];
+  "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" [label = "gettext-minimal-0.19.8.1", shape = box, fontname = Helvetica];
+  "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/7ijl8lybdx95kndajavdrpz05jdiwy9g-tar-1.29.drv" [color = dimgrey];
+  "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/0ykf3p023pzfcg2bw8ahjc7cvmc12zjq-gzip-1.8.drv" [color = dimgrey];
+  "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/xx3hiqhqn0d94zz7b46hgggwsz3wjiiw-bzip2-1.0.6.drv" [color = dimgrey];
+  "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/kz8rzasivw4aflsv4rll3m539xybf226-xz-5.2.2.drv" [color = dimgrey];
+  "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/3pwrlsd23k2h104akxfj3cxhqcp973g9-file-5.28.drv" [color = dimgrey];
+  "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/f1ww5vh5abnvr8b24llipm5dl89s5lq2-diffutils-3.5.drv" [color = dimgrey];
+  "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/0cbgdhhyh7hsgwq1x54n9vnq99rfjch9-patch-2.7.5.drv" [color = dimgrey];
+  "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/8xjnm44dfwwxp90hxq6zhb6qvia7rb3l-sed-4.2.2.drv" [color = dimgrey];
+  "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/54wjl6dp6rp47r67f4nyfqyv8nh456yc-findutils-4.6.0.drv" [color = dimgrey];
+  "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/k951w49yw74ikg19l4mmlwfrq9w7a7zd-gawk-4.1.4.drv" [color = dimgrey];
+  "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/n48xdjkvhlhj5mgdzy59n0dpb9vn0v78-grep-2.25.drv" [color = dimgrey];
+  "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/i52csyja3036ns0zj6z85lkgz3wfyym7-coreutils-8.25.drv" [color = dimgrey];
+  "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/nv4mnbz3mpd4gv80djk7762wyvxpccqk-make-4.2.1.drv" [color = dimgrey];
+  "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/2c60vlcvpj5dvmgklajkp7cpynhcqixr-bash-4.4.0.drv" [color = dimgrey];
+  "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/zhc5c4s0xvzizpgpq2za6x84vxv57iy6-ld-wrapper-0.drv" [color = dimgrey];
+  "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/9k1js0kalh4s6q4hf0rgg2n0zdyrwi69-binutils-2.27.drv" [color = dimgrey];
+  "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/hv3dl3my12mq0gkwvckmnqccnckn39l0-gcc-4.9.4.drv" [color = dimgrey];
+  "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/qbfynm50snyn31w2c3paiw2n6wvzksg8-glibc-2.24.drv" [color = dimgrey];
+  "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/ir0lq2x7h64g2z5mlqvnlysjk2bc9xka-glibc-utf8-locales-2.24.drv" [color = dimgrey];
+  "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" -> "/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" [color = dimgrey];
+  "/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" [label = "expat-2.2.0", shape = box, fontname = Helvetica];
+  "/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/7ijl8lybdx95kndajavdrpz05jdiwy9g-tar-1.29.drv" [color = darkviolet];
+  "/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/0ykf3p023pzfcg2bw8ahjc7cvmc12zjq-gzip-1.8.drv" [color = darkviolet];
+  "/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/xx3hiqhqn0d94zz7b46hgggwsz3wjiiw-bzip2-1.0.6.drv" [color = darkviolet];
+  "/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/kz8rzasivw4aflsv4rll3m539xybf226-xz-5.2.2.drv" [color = darkviolet];
+  "/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/3pwrlsd23k2h104akxfj3cxhqcp973g9-file-5.28.drv" [color = darkviolet];
+  "/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/f1ww5vh5abnvr8b24llipm5dl89s5lq2-diffutils-3.5.drv" [color = darkviolet];
+  "/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/0cbgdhhyh7hsgwq1x54n9vnq99rfjch9-patch-2.7.5.drv" [color = darkviolet];
+  "/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/8xjnm44dfwwxp90hxq6zhb6qvia7rb3l-sed-4.2.2.drv" [color = darkviolet];
+  "/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/54wjl6dp6rp47r67f4nyfqyv8nh456yc-findutils-4.6.0.drv" [color = darkviolet];
+  "/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/k951w49yw74ikg19l4mmlwfrq9w7a7zd-gawk-4.1.4.drv" [color = darkviolet];
+  "/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/n48xdjkvhlhj5mgdzy59n0dpb9vn0v78-grep-2.25.drv" [color = darkviolet];
+  "/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/i52csyja3036ns0zj6z85lkgz3wfyym7-coreutils-8.25.drv" [color = darkviolet];
+  "/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/nv4mnbz3mpd4gv80djk7762wyvxpccqk-make-4.2.1.drv" [color = darkviolet];
+  "/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/2c60vlcvpj5dvmgklajkp7cpynhcqixr-bash-4.4.0.drv" [color = darkviolet];
+  "/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/zhc5c4s0xvzizpgpq2za6x84vxv57iy6-ld-wrapper-0.drv" [color = darkviolet];
+  "/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/9k1js0kalh4s6q4hf0rgg2n0zdyrwi69-binutils-2.27.drv" [color = darkviolet];
+  "/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/hv3dl3my12mq0gkwvckmnqccnckn39l0-gcc-4.9.4.drv" [color = darkviolet];
+  "/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/qbfynm50snyn31w2c3paiw2n6wvzksg8-glibc-2.24.drv" [color = darkviolet];
+  "/gnu/store/4dql1pzyivg87jwyfmmkwc6jll1vnizc-expat-2.2.0.drv" -> "/gnu/store/ir0lq2x7h64g2z5mlqvnlysjk2bc9xka-glibc-utf8-locales-2.24.drv" [color = darkviolet];
+  "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" [label = "attr-2.4.47", shape = box, fontname = Helvetica];
+  "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/nw68wjvbw505klgpsavq7dk195wg8ffj-gettext-minimal-0.19.8.1.drv" [color = peachpuff4];
+  "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/7ijl8lybdx95kndajavdrpz05jdiwy9g-tar-1.29.drv" [color = peachpuff4];
+  "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/0ykf3p023pzfcg2bw8ahjc7cvmc12zjq-gzip-1.8.drv" [color = peachpuff4];
+  "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/xx3hiqhqn0d94zz7b46hgggwsz3wjiiw-bzip2-1.0.6.drv" [color = peachpuff4];
+  "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/kz8rzasivw4aflsv4rll3m539xybf226-xz-5.2.2.drv" [color = peachpuff4];
+  "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/3pwrlsd23k2h104akxfj3cxhqcp973g9-file-5.28.drv" [color = peachpuff4];
+  "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/f1ww5vh5abnvr8b24llipm5dl89s5lq2-diffutils-3.5.drv" [color = peachpuff4];
+  "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/0cbgdhhyh7hsgwq1x54n9vnq99rfjch9-patch-2.7.5.drv" [color = peachpuff4];
+  "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/8xjnm44dfwwxp90hxq6zhb6qvia7rb3l-sed-4.2.2.drv" [color = peachpuff4];
+  "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/54wjl6dp6rp47r67f4nyfqyv8nh456yc-findutils-4.6.0.drv" [color = peachpuff4];
+  "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/k951w49yw74ikg19l4mmlwfrq9w7a7zd-gawk-4.1.4.drv" [color = peachpuff4];
+  "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/n48xdjkvhlhj5mgdzy59n0dpb9vn0v78-grep-2.25.drv" [color = peachpuff4];
+  "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/i52csyja3036ns0zj6z85lkgz3wfyym7-coreutils-8.25.drv" [color = peachpuff4];
+  "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/nv4mnbz3mpd4gv80djk7762wyvxpccqk-make-4.2.1.drv" [color = peachpuff4];
+  "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/2c60vlcvpj5dvmgklajkp7cpynhcqixr-bash-4.4.0.drv" [color = peachpuff4];
+  "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/zhc5c4s0xvzizpgpq2za6x84vxv57iy6-ld-wrapper-0.drv" [color = peachpuff4];
+  "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/9k1js0kalh4s6q4hf0rgg2n0zdyrwi69-binutils-2.27.drv" [color = peachpuff4];
+  "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/hv3dl3my12mq0gkwvckmnqccnckn39l0-gcc-4.9.4.drv" [color = peachpuff4];
+  "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/qbfynm50snyn31w2c3paiw2n6wvzksg8-glibc-2.24.drv" [color = peachpuff4];
+  "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/ir0lq2x7h64g2z5mlqvnlysjk2bc9xka-glibc-utf8-locales-2.24.drv" [color = peachpuff4];
+  "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" -> "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" [color = peachpuff4];
+  "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" [label = "gmp-6.1.1", shape = box, fontname = Helvetica];
+  "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" [color = darkgoldenrod];
+  "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/7ijl8lybdx95kndajavdrpz05jdiwy9g-tar-1.29.drv" [color = darkgoldenrod];
+  "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/0ykf3p023pzfcg2bw8ahjc7cvmc12zjq-gzip-1.8.drv" [color = darkgoldenrod];
+  "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/xx3hiqhqn0d94zz7b46hgggwsz3wjiiw-bzip2-1.0.6.drv" [color = darkgoldenrod];
+  "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/kz8rzasivw4aflsv4rll3m539xybf226-xz-5.2.2.drv" [color = darkgoldenrod];
+  "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/3pwrlsd23k2h104akxfj3cxhqcp973g9-file-5.28.drv" [color = darkgoldenrod];
+  "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/f1ww5vh5abnvr8b24llipm5dl89s5lq2-diffutils-3.5.drv" [color = darkgoldenrod];
+  "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/0cbgdhhyh7hsgwq1x54n9vnq99rfjch9-patch-2.7.5.drv" [color = darkgoldenrod];
+  "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/8xjnm44dfwwxp90hxq6zhb6qvia7rb3l-sed-4.2.2.drv" [color = darkgoldenrod];
+  "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/54wjl6dp6rp47r67f4nyfqyv8nh456yc-findutils-4.6.0.drv" [color = darkgoldenrod];
+  "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/k951w49yw74ikg19l4mmlwfrq9w7a7zd-gawk-4.1.4.drv" [color = darkgoldenrod];
+  "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/n48xdjkvhlhj5mgdzy59n0dpb9vn0v78-grep-2.25.drv" [color = darkgoldenrod];
+  "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/i52csyja3036ns0zj6z85lkgz3wfyym7-coreutils-8.25.drv" [color = darkgoldenrod];
+  "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/nv4mnbz3mpd4gv80djk7762wyvxpccqk-make-4.2.1.drv" [color = darkgoldenrod];
+  "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/2c60vlcvpj5dvmgklajkp7cpynhcqixr-bash-4.4.0.drv" [color = darkgoldenrod];
+  "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/zhc5c4s0xvzizpgpq2za6x84vxv57iy6-ld-wrapper-0.drv" [color = darkgoldenrod];
+  "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/9k1js0kalh4s6q4hf0rgg2n0zdyrwi69-binutils-2.27.drv" [color = darkgoldenrod];
+  "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/hv3dl3my12mq0gkwvckmnqccnckn39l0-gcc-4.9.4.drv" [color = darkgoldenrod];
+  "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/qbfynm50snyn31w2c3paiw2n6wvzksg8-glibc-2.24.drv" [color = darkgoldenrod];
+  "/gnu/store/7gqg2kmrm1bjgphnd70ps5c11gqml571-gmp-6.1.1.drv" -> "/gnu/store/ir0lq2x7h64g2z5mlqvnlysjk2bc9xka-glibc-utf8-locales-2.24.drv" [color = darkgoldenrod];
+  "/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" [label = "m4-1.4.17", shape = box, fontname = Helvetica];
+  "/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/7ijl8lybdx95kndajavdrpz05jdiwy9g-tar-1.29.drv" [color = cyan3];
+  "/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/0ykf3p023pzfcg2bw8ahjc7cvmc12zjq-gzip-1.8.drv" [color = cyan3];
+  "/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/xx3hiqhqn0d94zz7b46hgggwsz3wjiiw-bzip2-1.0.6.drv" [color = cyan3];
+  "/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/kz8rzasivw4aflsv4rll3m539xybf226-xz-5.2.2.drv" [color = cyan3];
+  "/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/3pwrlsd23k2h104akxfj3cxhqcp973g9-file-5.28.drv" [color = cyan3];
+  "/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/f1ww5vh5abnvr8b24llipm5dl89s5lq2-diffutils-3.5.drv" [color = cyan3];
+  "/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/0cbgdhhyh7hsgwq1x54n9vnq99rfjch9-patch-2.7.5.drv" [color = cyan3];
+  "/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/8xjnm44dfwwxp90hxq6zhb6qvia7rb3l-sed-4.2.2.drv" [color = cyan3];
+  "/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/54wjl6dp6rp47r67f4nyfqyv8nh456yc-findutils-4.6.0.drv" [color = cyan3];
+  "/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/k951w49yw74ikg19l4mmlwfrq9w7a7zd-gawk-4.1.4.drv" [color = cyan3];
+  "/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/n48xdjkvhlhj5mgdzy59n0dpb9vn0v78-grep-2.25.drv" [color = cyan3];
+  "/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/i52csyja3036ns0zj6z85lkgz3wfyym7-coreutils-8.25.drv" [color = cyan3];
+  "/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/nv4mnbz3mpd4gv80djk7762wyvxpccqk-make-4.2.1.drv" [color = cyan3];
+  "/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/2c60vlcvpj5dvmgklajkp7cpynhcqixr-bash-4.4.0.drv" [color = cyan3];
+  "/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/zhc5c4s0xvzizpgpq2za6x84vxv57iy6-ld-wrapper-0.drv" [color = cyan3];
+  "/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/9k1js0kalh4s6q4hf0rgg2n0zdyrwi69-binutils-2.27.drv" [color = cyan3];
+  "/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/hv3dl3my12mq0gkwvckmnqccnckn39l0-gcc-4.9.4.drv" [color = cyan3];
+  "/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/qbfynm50snyn31w2c3paiw2n6wvzksg8-glibc-2.24.drv" [color = cyan3];
+  "/gnu/store/d1n7i55s1zcwzi21pnsxhamk3b1zf61d-m4-1.4.17.drv" -> "/gnu/store/ir0lq2x7h64g2z5mlqvnlysjk2bc9xka-glibc-utf8-locales-2.24.drv" [color = cyan3];
+  "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" [label = "libcap-2.24", shape = box, fontname = Helvetica];
+  "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/jxcx1jcvzxb17dc69sfwb352vgwyr108-perl-5.24.0.drv" [color = blue];
+  "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/7ijl8lybdx95kndajavdrpz05jdiwy9g-tar-1.29.drv" [color = blue];
+  "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/0ykf3p023pzfcg2bw8ahjc7cvmc12zjq-gzip-1.8.drv" [color = blue];
+  "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/xx3hiqhqn0d94zz7b46hgggwsz3wjiiw-bzip2-1.0.6.drv" [color = blue];
+  "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/kz8rzasivw4aflsv4rll3m539xybf226-xz-5.2.2.drv" [color = blue];
+  "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/3pwrlsd23k2h104akxfj3cxhqcp973g9-file-5.28.drv" [color = blue];
+  "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/f1ww5vh5abnvr8b24llipm5dl89s5lq2-diffutils-3.5.drv" [color = blue];
+  "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/0cbgdhhyh7hsgwq1x54n9vnq99rfjch9-patch-2.7.5.drv" [color = blue];
+  "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/8xjnm44dfwwxp90hxq6zhb6qvia7rb3l-sed-4.2.2.drv" [color = blue];
+  "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/54wjl6dp6rp47r67f4nyfqyv8nh456yc-findutils-4.6.0.drv" [color = blue];
+  "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/k951w49yw74ikg19l4mmlwfrq9w7a7zd-gawk-4.1.4.drv" [color = blue];
+  "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/n48xdjkvhlhj5mgdzy59n0dpb9vn0v78-grep-2.25.drv" [color = blue];
+  "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/i52csyja3036ns0zj6z85lkgz3wfyym7-coreutils-8.25.drv" [color = blue];
+  "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/nv4mnbz3mpd4gv80djk7762wyvxpccqk-make-4.2.1.drv" [color = blue];
+  "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/2c60vlcvpj5dvmgklajkp7cpynhcqixr-bash-4.4.0.drv" [color = blue];
+  "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/zhc5c4s0xvzizpgpq2za6x84vxv57iy6-ld-wrapper-0.drv" [color = blue];
+  "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/9k1js0kalh4s6q4hf0rgg2n0zdyrwi69-binutils-2.27.drv" [color = blue];
+  "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/hv3dl3my12mq0gkwvckmnqccnckn39l0-gcc-4.9.4.drv" [color = blue];
+  "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/qbfynm50snyn31w2c3paiw2n6wvzksg8-glibc-2.24.drv" [color = blue];
+  "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/ir0lq2x7h64g2z5mlqvnlysjk2bc9xka-glibc-utf8-locales-2.24.drv" [color = blue];
+  "/gnu/store/ijv3y5l1fbbzwb77lc867r1qbsf147i8-libcap-2.24.drv" -> "/gnu/store/gplx9i7c01f2r6qvm6d5w60iam73zmin-attr-2.4.47.drv" [color = blue];
 
 }
diff --git a/doc/images/coreutils-graph.dot b/doc/images/coreutils-graph.dot
index cb0622a427..920e5f2358 100644
--- a/doc/images/coreutils-graph.dot
+++ b/doc/images/coreutils-graph.dot
@@ -1,25 +1,25 @@
 digraph "Guix package" {
-  "70481600" [label = "coreutils-8.24", shape = box, fontname = Helvetica];
-  "70481600" -> "50717824" [color = red];
-  "70481600" -> "57499200" [color = red];
-  "70481600" -> "57496320" [color = red];
-  "70481600" -> "69877504" [color = red];
-  "50717824" [label = "perl-5.16.1", shape = box, fontname = Helvetica];
-  "57499200" [label = "acl-2.2.52", shape = box, fontname = Helvetica];
-  "57499200" -> "70563904" [color = red];
-  "57499200" -> "50717824" [color = red];
-  "57499200" -> "70563520" [color = red];
-  "70563904" [label = "gettext-0.19.6", shape = box, fontname = Helvetica];
-  "70563904" -> "69316352" [color = red];
-  "69316352" [label = "expat-2.1.0", shape = box, fontname = Helvetica];
-  "70563520" [label = "attr-2.4.46", shape = box, fontname = Helvetica];
-  "70563520" -> "70563904" [color = red];
-  "70563520" -> "50717824" [color = red];
-  "57496320" [label = "gmp-6.0.0a", shape = box, fontname = Helvetica];
-  "57496320" -> "57498432" [color = red];
-  "57498432" [label = "m4-1.4.17", shape = box, fontname = Helvetica];
-  "69877504" [label = "libcap-2.24", shape = box, fontname = Helvetica];
-  "69877504" -> "50717824" [color = red];
-  "69877504" -> "70563520" [color = red];
+  "72851008" [label = "coreutils-8.25", shape = box, fontname = Helvetica];
+  "72851008" -> "49728512" [color = darkseagreen];
+  "72851008" -> "74872512" [color = darkseagreen];
+  "72851008" -> "53180864" [color = darkseagreen];
+  "72851008" -> "75199232" [color = darkseagreen];
+  "49728512" [label = "perl-5.24.0", shape = box, fontname = Helvetica];
+  "74872512" [label = "acl-2.2.52", shape = box, fontname = Helvetica];
+  "74872512" -> "74873280" [color = red];
+  "74872512" -> "49728512" [color = red];
+  "74872512" -> "74872704" [color = red];
+  "74873280" [label = "gettext-minimal-0.19.8.1", shape = box, fontname = Helvetica];
+  "74873280" -> "41550784" [color = cyan3];
+  "41550784" [label = "expat-2.2.0", shape = box, fontname = Helvetica];
+  "74872704" [label = "attr-2.4.47", shape = box, fontname = Helvetica];
+  "74872704" -> "74873280" [color = cyan3];
+  "74872704" -> "49728512" [color = cyan3];
+  "53180864" [label = "gmp-6.1.1", shape = box, fontname = Helvetica];
+  "53180864" -> "50262784" [color = darkgoldenrod];
+  "50262784" [label = "m4-1.4.17", shape = box, fontname = Helvetica];
+  "75199232" [label = "libcap-2.24", shape = box, fontname = Helvetica];
+  "75199232" -> "49728512" [color = blue];
+  "75199232" -> "74872704" [color = blue];
 
 }
diff --git a/doc/images/shepherd-graph.dot b/doc/images/shepherd-graph.dot
index cc9aa441a1..35b2794689 100644
--- a/doc/images/shepherd-graph.dot
+++ b/doc/images/shepherd-graph.dot
@@ -1,75 +1,71 @@
 digraph "Guix shepherd-service" {
   "user-file-systems" [label = "user-file-systems", shape = box, fontname = Helvetica];
-  "user-processes" -> "user-file-systems" [color = red];
+  "user-processes" -> "user-file-systems" [color = cyan3];
   "user-processes" [label = "user-processes", shape = box, fontname = Helvetica];
-  "nscd" -> "user-processes" [color = red];
-  "guix-daemon" -> "user-processes" [color = red];
-  "syslogd" -> "user-processes" [color = red];
-  "term-tty6" -> "user-processes" [color = red];
+  "nscd" -> "user-processes" [color = magenta];
+  "guix-daemon" -> "user-processes" [color = blue];
+  "urandom-seed" -> "user-processes" [color = dimgrey];
+  "syslogd" -> "user-processes" [color = darkgoldenrod];
+  "term-tty6" -> "user-processes" [color = magenta];
   "term-tty5" -> "user-processes" [color = red];
-  "term-tty4" -> "user-processes" [color = red];
-  "term-tty3" -> "user-processes" [color = red];
-  "term-tty2" -> "user-processes" [color = red];
-  "term-tty1" -> "user-processes" [color = red];
-  "networking" -> "user-processes" [color = red];
+  "term-tty4" -> "user-processes" [color = darkgoldenrod];
+  "term-tty3" -> "user-processes" [color = dimgrey];
+  "term-tty2" -> "user-processes" [color = darkviolet];
+  "term-tty1" -> "user-processes" [color = peachpuff4];
+  "networking" -> "user-processes" [color = dimgrey];
   "nscd" [label = "nscd", shape = box, fontname = Helvetica];
   "guix-daemon" [label = "guix-daemon", shape = box, fontname = Helvetica];
+  "urandom-seed" [label = "urandom-seed", shape = box, fontname = Helvetica];
   "syslogd" [label = "syslogd", shape = box, fontname = Helvetica];
-  "ssh-daemon" -> "syslogd" [color = red];
+  "ssh-daemon" -> "syslogd" [color = darkgoldenrod];
   "ssh-daemon" [label = "ssh-daemon", shape = box, fontname = Helvetica];
   "term-tty6" [label = "term-tty6", shape = box, fontname = Helvetica];
-  "console-font-tty6" -> "term-tty6" [color = red];
+  "console-font-tty6" -> "term-tty6" [color = darkgoldenrod];
   "console-font-tty6" [label = "console-font-tty6", shape = box, fontname = Helvetica];
   "term-tty5" [label = "term-tty5", shape = box, fontname = Helvetica];
-  "console-font-tty5" -> "term-tty5" [color = red];
+  "console-font-tty5" -> "term-tty5" [color = dimgrey];
   "console-font-tty5" [label = "console-font-tty5", shape = box, fontname = Helvetica];
   "term-tty4" [label = "term-tty4", shape = box, fontname = Helvetica];
-  "console-font-tty4" -> "term-tty4" [color = red];
+  "console-font-tty4" -> "term-tty4" [color = darkviolet];
   "console-font-tty4" [label = "console-font-tty4", shape = box, fontname = Helvetica];
   "term-tty3" [label = "term-tty3", shape = box, fontname = Helvetica];
-  "console-font-tty3" -> "term-tty3" [color = red];
+  "console-font-tty3" -> "term-tty3" [color = peachpuff4];
   "console-font-tty3" [label = "console-font-tty3", shape = box, fontname = Helvetica];
   "term-tty2" [label = "term-tty2", shape = box, fontname = Helvetica];
-  "console-font-tty2" -> "term-tty2" [color = red];
+  "console-font-tty2" -> "term-tty2" [color = darkseagreen];
   "console-font-tty2" [label = "console-font-tty2", shape = box, fontname = Helvetica];
   "term-tty1" [label = "term-tty1", shape = box, fontname = Helvetica];
-  "console-font-tty1" -> "term-tty1" [color = red];
+  "console-font-tty1" -> "term-tty1" [color = cyan3];
   "console-font-tty1" [label = "console-font-tty1", shape = box, fontname = Helvetica];
   "networking" [label = "networking", shape = box, fontname = Helvetica];
-  "ssh-daemon" -> "networking" [color = red];
+  "ssh-daemon" -> "networking" [color = darkgoldenrod];
   "root-file-system" [label = "root-file-system", shape = box, fontname = Helvetica];
-  "file-system-/run/user" -> "root-file-system" [color = red];
-  "file-system-/run/systemd" -> "root-file-system" [color = red];
-  "file-system-/gnu/store" -> "root-file-system" [color = red];
-  "file-system-/dev/shm" -> "root-file-system" [color = red];
-  "file-system-/dev/pts" -> "root-file-system" [color = red];
-  "user-processes" -> "root-file-system" [color = red];
-  "udev" -> "root-file-system" [color = red];
-  "file-system-/run/user" [label = "file-system-/run/user", shape = box, fontname = Helvetica];
-  "user-processes" -> "file-system-/run/user" [color = red];
-  "file-system-/run/systemd" [label = "file-system-/run/systemd", shape = box, fontname = Helvetica];
-  "user-processes" -> "file-system-/run/systemd" [color = red];
-  "file-system-/gnu/store" [label = "file-system-/gnu/store", shape = box, fontname = Helvetica];
-  "user-processes" -> "file-system-/gnu/store" [color = red];
-  "file-system-/dev/shm" [label = "file-system-/dev/shm", shape = box, fontname = Helvetica];
-  "user-processes" -> "file-system-/dev/shm" [color = red];
+  "file-system-/dev/pts" -> "root-file-system" [color = peachpuff4];
+  "file-system-/dev/shm" -> "root-file-system" [color = darkgoldenrod];
+  "file-system-/gnu/store" -> "root-file-system" [color = blue];
+  "user-processes" -> "root-file-system" [color = cyan3];
+  "udev" -> "root-file-system" [color = darkseagreen];
   "file-system-/dev/pts" [label = "file-system-/dev/pts", shape = box, fontname = Helvetica];
-  "user-processes" -> "file-system-/dev/pts" [color = red];
+  "user-processes" -> "file-system-/dev/pts" [color = cyan3];
+  "file-system-/dev/shm" [label = "file-system-/dev/shm", shape = box, fontname = Helvetica];
+  "user-processes" -> "file-system-/dev/shm" [color = cyan3];
+  "file-system-/gnu/store" [label = "file-system-/gnu/store", shape = box, fontname = Helvetica];
+  "user-processes" -> "file-system-/gnu/store" [color = cyan3];
   "udev" [label = "udev", shape = box, fontname = Helvetica];
-  "term-tty6" -> "udev" [color = red];
+  "term-tty6" -> "udev" [color = magenta];
   "term-tty5" -> "udev" [color = red];
-  "term-tty4" -> "udev" [color = red];
-  "term-tty3" -> "udev" [color = red];
-  "term-tty2" -> "udev" [color = red];
-  "term-tty1" -> "udev" [color = red];
-  "networking" -> "udev" [color = red];
+  "term-tty4" -> "udev" [color = darkgoldenrod];
+  "term-tty3" -> "udev" [color = dimgrey];
+  "term-tty2" -> "udev" [color = darkviolet];
+  "term-tty1" -> "udev" [color = peachpuff4];
+  "networking" -> "udev" [color = dimgrey];
   "host-name" [label = "host-name", shape = box, fontname = Helvetica];
-  "term-tty6" -> "host-name" [color = red];
+  "term-tty6" -> "host-name" [color = magenta];
   "term-tty5" -> "host-name" [color = red];
-  "term-tty4" -> "host-name" [color = red];
-  "term-tty3" -> "host-name" [color = red];
-  "term-tty2" -> "host-name" [color = red];
-  "term-tty1" -> "host-name" [color = red];
+  "term-tty4" -> "host-name" [color = darkgoldenrod];
+  "term-tty3" -> "host-name" [color = dimgrey];
+  "term-tty2" -> "host-name" [color = darkviolet];
+  "term-tty1" -> "host-name" [color = peachpuff4];
   "loopback" [label = "loopback", shape = box, fontname = Helvetica];
 
 }
diff --git a/doc/local.mk b/doc/local.mk
index 64bd2a5169..dc48fc22bf 100644
--- a/doc/local.mk
+++ b/doc/local.mk
@@ -1,6 +1,6 @@
 # GNU Guix --- Functional package management for GNU
 # Copyright © 2016 Eric Bavier <bavier@member.fsf.org>
-# Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+# Copyright © 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 # Copyright © 2013 Andreas Enge <andreas@enge.fr>
 # Copyright © 2016 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
 # Copyright © 2016 Mathieu Lirzin <mthl@gnu.org>
@@ -37,7 +37,6 @@ DOT_VECTOR_GRAPHICS =				\
 EXTRA_DIST +=					\
   %D%/htmlxref.cnf				\
   %D%/contributing.texi				\
-  %D%/emacs.texi				\
   %D%/fdl-1.3.texi				\
   $(DOT_FILES)					\
   $(DOT_VECTOR_GRAPHICS)			\
diff --git a/emacs/guix-about.el b/emacs/guix-about.el
deleted file mode 100644
index 27a79fe162..0000000000
--- a/emacs/guix-about.el
+++ /dev/null
@@ -1,37 +0,0 @@
-;;; guix-about.el --- Various info about Guix
-
-;; Copyright © 2016 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public Location as published by
-;; the Free Software Foundation, either version 3 of the Location, 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 Location for more details.
-
-;; You should have received a copy of the GNU General Public Location
-;; along with this program.  If not, see <http://www.gnu.org/locations/>.
-
-;;; Commentary:
-
-;; This file provides the code to display various info about Guix (e.g., its
-;; version).
-
-;;; Code:
-
-(require 'guix-config)
-
-;;;###autoload
-(defun guix-version ()
-  "Display Guix version in the echo area."
-  (interactive)
-  (message "%s %s" guix-config-name guix-config-version))
-
-(provide 'guix-about)
-
-;;; guix-about.el ends here
diff --git a/emacs/guix-backend.el b/emacs/guix-backend.el
deleted file mode 100644
index 6341aacae1..0000000000
--- a/emacs/guix-backend.el
+++ /dev/null
@@ -1,393 +0,0 @@
-;;; guix-backend.el --- Making and using Guix REPL
-
-;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides the code for interacting with Guile using Guix REPL
-;; (Geiser REPL with some guix-specific additions).
-
-;; By default (if `guix-use-guile-server' is non-nil) 2 Guix REPLs are
-;; started.  The main one (with "guile --listen" process) is used for
-;; "interacting" with a user - for showing a progress of
-;; installing/deleting Guix packages.  The second (internal) REPL is
-;; used for synchronous evaluating, e.g. when information about
-;; packages/generations should be received for a list/info buffer.
-;;
-;; This "2 REPLs concept" makes it possible to have a running process of
-;; installing/deleting packages and to continue to search/list/get info
-;; about other packages at the same time.  If you prefer to use a single
-;; Guix REPL, do not try to receive any information while there is a
-;; running code in the REPL (see
-;; <https://github.com/jaor/geiser/issues/28>).
-;;
-;; Guix REPLs (unlike the usual Geiser REPLs) are not added to
-;; `geiser-repl--repls' variable, and thus cannot be used for evaluating
-;; while editing scm-files.  The only purpose of Guix REPLs is to be an
-;; intermediate between "Guix/Guile level" and "Emacs interface level".
-;; That being said you can still want to use a Guix REPL while hacking
-;; auxiliary scheme-files for "guix.el".  You can just use
-;; `geiser-connect-local' command with `guix-repl-current-socket' to
-;; have a usual Geiser REPL with all stuff defined by "guix.el" package.
-
-;;; Code:
-
-(require 'geiser-mode)
-(require 'geiser-guile)
-(require 'guix-geiser)
-(require 'guix-config)
-(require 'guix-external)
-(require 'guix-emacs)
-(require 'guix-profiles)
-
-(defvar guix-load-path guix-config-emacs-interface-directory
-  "Directory with scheme files for \"guix.el\" package.")
-
-(defvar guix-helper-file
-  (expand-file-name "guix-helper.scm" guix-load-path)
-  "Auxiliary scheme file for loading.")
-
-
-;;; REPL
-
-(defgroup guix-repl nil
-  "Settings for Guix REPLs."
-  :prefix "guix-repl-"
-  :group 'guix)
-
-(defcustom guix-repl-startup-time 30000
-  "Time, in milliseconds, to wait for Guix REPL to startup.
-Same as `geiser-repl-startup-time' but is used for Guix REPL.
-If you have a slow system, try to increase this time."
-  :type 'integer
-  :group 'guix-repl)
-
-(defcustom guix-repl-buffer-name "*Guix REPL*"
-  "Default name of a Geiser REPL buffer used for Guix."
-  :type 'string
-  :group 'guix-repl)
-
-(defcustom guix-after-start-repl-hook '(guix-set-directory)
-  "Hook called after Guix REPL is started."
-  :type 'hook
-  :group 'guix-repl)
-
-(defcustom guix-use-guile-server t
-  "If non-nil, start guile with '--listen' argument.
-This allows to receive information about packages using an additional
-REPL while some packages are being installed/removed in the main REPL."
-  :type 'boolean
-  :group 'guix-repl)
-
-(defcustom guix-repl-socket-file-name-function
-  #'guix-repl-socket-file-name
-  "Function used to define a socket file name used by Guix REPL.
-The function is called without arguments."
-  :type '(choice (function-item guix-repl-socket-file-name)
-                 (function :tag "Other function"))
-  :group 'guix-repl)
-
-(defcustom guix-emacs-activate-after-operation t
-  "Activate Emacs packages after installing.
-If nil, do not load autoloads of the Emacs packages after
-they are successfully installed."
-  :type 'boolean
-  :group 'guix-repl)
-
-(defvar guix-repl-current-socket nil
-  "Name of a socket file used by the current Guix REPL.")
-
-(defvar guix-repl-buffer nil
-  "Main Geiser REPL buffer used for communicating with Guix.
-This REPL is used for processing package actions and for
-receiving information if `guix-use-guile-server' is nil.")
-
-(defvar guix-internal-repl-buffer nil
-  "Additional Geiser REPL buffer used for communicating with Guix.
-This REPL is used for receiving information only if
-`guix-use-guile-server' is non-nil.")
-
-(defvar guix-internal-repl-buffer-name "*Guix Internal REPL*"
-  "Default name of an internal Guix REPL buffer.")
-
-(defvar guix-before-repl-operation-hook nil
-  "Hook run before executing an operation in Guix REPL.")
-
-(defvar guix-after-repl-operation-hook
-  '(guix-repl-autoload-emacs-packages-maybe
-    guix-repl-operation-success-message)
-  "Hook run after executing successful operation in Guix REPL.")
-
-(defvar guix-repl-operation-p nil
-  "Non-nil, if current operation is performed by `guix-eval-in-repl'.
-This internal variable is used to distinguish Guix operations
-from operations performed in Guix REPL by a user.")
-
-(defvar guix-repl-operation-type nil
-  "Type of the current operation performed by `guix-eval-in-repl'.
-This internal variable is used to define what actions should be
-executed after the current operation succeeds.
-See `guix-eval-in-repl' for details.")
-
-(defun guix-repl-autoload-emacs-packages-maybe ()
-  "Load autoloads for Emacs packages if needed.
-See `guix-emacs-activate-after-operation' for details."
-  (and guix-emacs-activate-after-operation
-       ;; FIXME Since a user can work with a non-current profile (using
-       ;; C-u before `guix-search-by-name' and other commands), emacs
-       ;; packages can be installed to another profile, and the
-       ;; following code will not work (i.e., the autoloads for this
-       ;; profile will not be loaded).
-       (guix-emacs-autoload-packages guix-current-profile)))
-
-(defun guix-repl-operation-success-message ()
-  "Message telling about successful Guix operation."
-  (message "Guix operation has been performed."))
-
-(defun guix-get-guile-program (&optional socket)
-  "Return a value suitable for `geiser-guile-binary'."
-  (if (null socket)
-      guix-guile-program
-    (append (if (listp guix-guile-program)
-                guix-guile-program
-              (list guix-guile-program))
-            (list (concat "--listen=" socket)))))
-
-(defun guix-repl-socket-file-name ()
-  "Return a name of a socket file used by Guix REPL."
-  (make-temp-name
-   (concat (file-name-as-directory temporary-file-directory)
-           "guix-repl-")))
-
-(defun guix-repl-delete-socket-maybe ()
-  "Delete `guix-repl-current-socket' file if it exists."
-  (and guix-repl-current-socket
-       (file-exists-p guix-repl-current-socket)
-       (delete-file guix-repl-current-socket)))
-
-(add-hook 'kill-emacs-hook 'guix-repl-delete-socket-maybe)
-
-(defun guix-start-process-maybe (&optional start-msg end-msg)
-  "Start Geiser REPL configured for Guix if needed.
-START-MSG and END-MSG are strings displayed in the minibuffer in
-the beginning and in the end of the starting process.  If nil,
-display default messages."
-  (guix-start-repl-maybe nil
-                         (or start-msg "Starting Guix REPL ...")
-                         (or end-msg "Guix REPL has been started."))
-  (if guix-use-guile-server
-      (guix-start-repl-maybe 'internal)
-    (setq guix-internal-repl-buffer guix-repl-buffer)))
-
-(defun guix-start-repl-maybe (&optional internal start-msg end-msg)
-  "Start Guix REPL if needed.
-If INTERNAL is non-nil, start an internal REPL.
-
-START-MSG and END-MSG are strings displayed in the minibuffer in
-the beginning and in the end of the process.  If nil, do not
-display messages."
-  (let* ((repl-var (guix-get-repl-buffer-variable internal))
-         (repl (symbol-value repl-var)))
-    (unless (and (buffer-live-p repl)
-                 (get-buffer-process repl))
-      (and start-msg (message start-msg))
-      (setq guix-repl-operation-p nil)
-      (unless internal
-        ;; Guile leaves socket file after exit, so remove it if it
-        ;; exists (after the REPL restart).
-        (guix-repl-delete-socket-maybe)
-        (setq guix-repl-current-socket
-              (and guix-use-guile-server
-                   (or guix-repl-current-socket
-                       (funcall guix-repl-socket-file-name-function)))))
-      (let ((geiser-guile-binary (guix-get-guile-program
-                                  (unless internal
-                                    guix-repl-current-socket)))
-            (geiser-guile-init-file (unless internal guix-helper-file))
-            (repl (get-buffer-create
-                   (guix-get-repl-buffer-name internal))))
-        (guix-start-repl repl (and internal guix-repl-current-socket))
-        (set repl-var repl)
-        (and end-msg (message end-msg))
-        (unless internal
-          (run-hooks 'guix-after-start-repl-hook))))))
-
-(defun guix-start-repl (buffer &optional address)
-  "Start Guix REPL in BUFFER.
-If ADDRESS is non-nil, connect to a remote guile process using
-this address (it should be defined by
-`geiser-repl--read-address')."
-  ;; A mix of the code from `geiser-repl--start-repl' and
-  ;; `geiser-repl--to-repl-buffer'.
-  (let ((impl 'guile)
-        (geiser-guile-load-path (cons (expand-file-name guix-load-path)
-                                      geiser-guile-load-path))
-        (geiser-repl-startup-time guix-repl-startup-time))
-    (with-current-buffer buffer
-      (geiser-repl-mode)
-      (geiser-impl--set-buffer-implementation impl)
-      (geiser-repl--autodoc-mode -1)
-      (goto-char (point-max))
-      (let ((prompt (geiser-con--combined-prompt
-                     geiser-guile--prompt-regexp
-                     geiser-guile--debugger-prompt-regexp)))
-        (geiser-repl--save-remote-data address)
-        (geiser-repl--start-scheme impl address prompt)
-        (geiser-repl--quit-setup)
-        (geiser-repl--history-setup)
-        (setq-local geiser-repl--repls (list buffer))
-        (geiser-repl--set-this-buffer-repl buffer)
-        (setq geiser-repl--connection
-              (geiser-con--make-connection
-               (get-buffer-process (current-buffer))
-               geiser-guile--prompt-regexp
-               geiser-guile--debugger-prompt-regexp))
-        (geiser-repl--startup impl address)
-        (geiser-repl--autodoc-mode 1)
-        (geiser-company--setup geiser-repl-company-p)
-        (add-hook 'comint-output-filter-functions
-                  'guix-repl-output-filter
-                  nil t)
-        (set-process-query-on-exit-flag
-         (get-buffer-process (current-buffer))
-         geiser-repl-query-on-kill-p)))))
-
-(defun guix-repl-output-filter (str)
-  "Filter function suitable for `comint-output-filter-functions'.
-This is a replacement for `geiser-repl--output-filter'."
-  (cond
-   ((string-match-p geiser-guile--prompt-regexp str)
-    (geiser-autodoc--disinhibit-autodoc)
-    (when guix-repl-operation-p
-      (setq guix-repl-operation-p nil)
-      (run-hooks 'guix-after-repl-operation-hook)
-      ;; Run hooks specific to the current operation type.
-      (when guix-repl-operation-type
-        (let ((type-hook (intern
-                          (concat "guix-after-"
-                                  (symbol-name guix-repl-operation-type)
-                                  "-hook"))))
-          (setq guix-repl-operation-type nil)
-          (and (boundp type-hook)
-               (run-hooks type-hook))))))
-   ((string-match geiser-guile--debugger-prompt-regexp str)
-    (setq guix-repl-operation-p nil)
-    (geiser-con--connection-set-debugging geiser-repl--connection
-                                          (match-beginning 0))
-    (geiser-autodoc--disinhibit-autodoc))))
-
-(defun guix-repl-exit (&optional internal no-wait)
-  "Exit the current Guix REPL.
-If INTERNAL is non-nil, exit the internal REPL.
-If NO-WAIT is non-nil, do not wait for the REPL process to exit:
-send a kill signal to it and return immediately."
-  (let ((repl (symbol-value (guix-get-repl-buffer-variable internal))))
-    (when (get-buffer-process repl)
-      (with-current-buffer repl
-        (geiser-con--connection-deactivate geiser-repl--connection t)
-        (comint-kill-subjob)
-        (unless no-wait
-          (while (get-buffer-process repl)
-            (sleep-for 0.1)))))))
-
-(defun guix-get-repl-buffer (&optional internal)
-  "Return Guix REPL buffer; start REPL if needed.
-If INTERNAL is non-nil, return an additional internal REPL."
-  (guix-start-process-maybe)
-  (let ((repl (symbol-value (guix-get-repl-buffer-variable internal))))
-    ;; If a new Geiser REPL is started, `geiser-repl--repl' variable may
-    ;; be set to the new value in a Guix REPL, so set it back to a
-    ;; proper value here.
-    (with-current-buffer repl
-      (geiser-repl--set-this-buffer-repl repl))
-    repl))
-
-(defun guix-get-repl-buffer-variable (&optional internal)
-  "Return the name of a variable with a REPL buffer."
-  (if internal
-      'guix-internal-repl-buffer
-    'guix-repl-buffer))
-
-(defun guix-get-repl-buffer-name (&optional internal)
-  "Return the name of a REPL buffer."
-  (if internal
-      guix-internal-repl-buffer-name
-    guix-repl-buffer-name))
-
-(defun guix-switch-to-repl (&optional internal)
-  "Switch to Guix REPL.
-If INTERNAL is non-nil (interactively with prefix), switch to the
-additional internal REPL if it exists."
-  (interactive "P")
-  (geiser-repl--switch-to-buffer (guix-get-repl-buffer internal)))
-
-
-;;; Guix directory
-
-(defvar guix-directory nil
-  "Default directory with Guix source.
-If it is not set by a user, it is set after starting Guile REPL.
-This directory is used to define package locations.")
-
-(defun guix-read-directory ()
-  "Return `guix-directory' or prompt for it.
-This function is intended for using in `interactive' forms."
-  (if current-prefix-arg
-      (read-directory-name "Directory with Guix modules: "
-                           guix-directory)
-    guix-directory))
-
-(defun guix-set-directory ()
-  "Set `guix-directory' if needed."
-  (or guix-directory
-      (setq guix-directory
-            (guix-eval-read "%guix-dir"))))
-
-
-;;; Evaluating expressions
-
-(defvar guix-operation-buffer nil
-  "Buffer from which the latest Guix operation was performed.")
-
-(defun guix-eval (str)
-  "Evaluate STR with guile expression using Guix REPL.
-See `guix-geiser-eval' for details."
-  (guix-geiser-eval str (guix-get-repl-buffer 'internal)))
-
-(defun guix-eval-read (str)
-  "Evaluate STR with guile expression using Guix REPL.
-See `guix-geiser-eval-read' for details."
-  (guix-geiser-eval-read str (guix-get-repl-buffer 'internal)))
-
-(defun guix-eval-in-repl (str &optional operation-buffer operation-type)
-  "Switch to Guix REPL and evaluate STR with guile expression there.
-If OPERATION-BUFFER is non-nil, it should be a buffer from which
-the current operation was performed.
-
-If OPERATION-TYPE is non-nil, it should be a symbol.  After
-successful executing of the current operation,
-`guix-after-OPERATION-TYPE-hook' is called."
-  (run-hooks 'guix-before-repl-operation-hook)
-  (setq guix-repl-operation-p t
-        guix-repl-operation-type operation-type
-        guix-operation-buffer operation-buffer)
-  (guix-geiser-eval-in-repl str (guix-get-repl-buffer)))
-
-(provide 'guix-backend)
-
-;;; guix-backend.el ends here
diff --git a/emacs/guix-base.el b/emacs/guix-base.el
deleted file mode 100644
index 658cfdb5fa..0000000000
--- a/emacs/guix-base.el
+++ /dev/null
@@ -1,377 +0,0 @@
-;;; guix-base.el --- Common definitions   -*- lexical-binding: t -*-
-
-;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides some base and common definitions for guix.el
-;; package.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'guix-backend)
-(require 'guix-guile)
-(require 'guix-read)
-(require 'guix-utils)
-(require 'guix-ui)
-(require 'guix-profiles)
-
-(defgroup guix nil
-  "Settings for Guix package manager and friends."
-  :prefix "guix-"
-  :group 'external)
-
-(defgroup guix-faces nil
-  "Guix faces."
-  :group 'guix
-  :group 'faces)
-
-(defun guix-package-name-specification (name version &optional output)
-  "Return Guix package specification by its NAME, VERSION and OUTPUT."
-  (concat name "@" version
-          (when output (concat ":" output))))
-
-
-;;; Location of profiles and manifests
-
-(defun guix-generation-file (profile generation)
-  "Return the file name of a PROFILE's GENERATION."
-  (format "%s-%s-link" profile generation))
-
-(defun guix-packages-profile (profile &optional generation system?)
-  "Return a directory where packages are installed for the
-PROFILE's GENERATION.
-
-If SYSTEM? is non-nil, then PROFILE is considered to be a system
-profile.  Unlike usual profiles, for a system profile, packages
-are placed in 'profile' subdirectory."
-  (let ((profile (if generation
-                     (guix-generation-file profile generation)
-                   profile)))
-    (if system?
-        (expand-file-name "profile" profile)
-      profile)))
-
-(defun guix-manifest-file (profile &optional generation system?)
-  "Return the file name of a PROFILE's manifest.
-See `guix-packages-profile'."
-  (expand-file-name "manifest"
-                    (guix-packages-profile profile generation system?)))
-
-
-;;; Actions on packages and generations
-
-(defface guix-operation-option-key
-  '((t :inherit font-lock-warning-face))
-  "Face used for the keys of operation options."
-  :group 'guix-faces)
-
-(defcustom guix-operation-confirm t
-  "If nil, do not prompt to confirm an operation."
-  :type 'boolean
-  :group 'guix)
-
-(defcustom guix-use-substitutes t
-  "If non-nil, use substitutes for the Guix packages."
-  :type 'boolean
-  :group 'guix)
-
-(defvar guix-dry-run nil
-  "If non-nil, do not perform the real actions, just simulate.")
-
-(defvar guix-temp-buffer-name " *Guix temp*"
-  "Name of a buffer used for displaying info before executing operation.")
-
-(defvar guix-operation-option-true-string "yes"
-  "String displayed in the mode-line when operation option is t.")
-
-(defvar guix-operation-option-false-string "no "
-  "String displayed in the mode-line when operation option is nil.")
-
-(defvar guix-operation-option-separator "  |  "
-  "String used in the mode-line to separate operation options.")
-
-(defvar guix-operation-options
-  '((?s "substitutes" guix-use-substitutes)
-    (?d "dry-run"     guix-dry-run))
-  "List of available operation options.
-Each element of the list has a form:
-
-  (KEY NAME VARIABLE)
-
-KEY is a character that may be pressed during confirmation to
-toggle the option.
-NAME is a string displayed in the mode-line.
-VARIABLE is a name of an option variable.")
-
-(defun guix-operation-option-by-key (key)
-  "Return operation option by KEY (character)."
-  (assq key guix-operation-options))
-
-(defun guix-operation-option-key (option)
-  "Return key (character) of the operation OPTION."
-  (car option))
-
-(defun guix-operation-option-name (option)
-  "Return name of the operation OPTION."
-  (nth 1 option))
-
-(defun guix-operation-option-variable (option)
-  "Return name of the variable of the operation OPTION."
-  (nth 2 option))
-
-(defun guix-operation-option-value (option)
-  "Return boolean value of the operation OPTION."
-  (symbol-value (guix-operation-option-variable option)))
-
-(defun guix-operation-option-string-value (option)
-  "Convert boolean value of the operation OPTION to string and return it."
-  (if (guix-operation-option-value option)
-      guix-operation-option-true-string
-    guix-operation-option-false-string))
-
-(defun guix-operation-prompt (&optional prompt)
-  "Prompt a user for continuing the current operation.
-Return non-nil, if the operation should be continued; nil otherwise.
-Ask a user with PROMPT for continuing an operation."
-  (let* ((option-keys (mapcar #'guix-operation-option-key
-                              guix-operation-options))
-         (keys (append '(?y ?n) option-keys))
-         (prompt (concat (propertize (or prompt "Continue operation?")
-                                     'face 'minibuffer-prompt)
-                         " ("
-                         (mapconcat
-                          (lambda (key)
-                            (propertize (string key)
-                                        'face 'guix-operation-option-key))
-                          keys
-                          ", ")
-                         ") ")))
-    (let ((mode-line mode-line-format))
-      (prog1 (guix-operation-prompt-1 prompt keys)
-        (setq mode-line-format mode-line)
-        ;; Clear the minibuffer after prompting.
-        (message "")))))
-
-(defun guix-operation-prompt-1 (prompt keys)
-  "This function is internal for `guix-operation-prompt'."
-  (guix-operation-set-mode-line)
-  (let ((key (read-char-choice prompt (cons ?\C-g keys) t)))
-    (cl-case key
-      (?y t)
-      ((?n ?\C-g) nil)
-      (t (let* ((option (guix-operation-option-by-key key))
-                (var (guix-operation-option-variable option)))
-           (set var (not (symbol-value var)))
-           (guix-operation-prompt-1 prompt keys))))))
-
-(defun guix-operation-set-mode-line ()
-  "Display operation options in the mode-line of the current buffer."
-  (setq mode-line-format
-        (concat (propertize " Options:   "
-                            'face 'mode-line-buffer-id)
-                (mapconcat
-                 (lambda (option)
-                   (let ((key  (guix-operation-option-key option))
-                         (name (guix-operation-option-name option))
-                         (val  (guix-operation-option-string-value option)))
-                     (concat name
-                             " ("
-                             (propertize (string key)
-                                         'face 'guix-operation-option-key)
-                             "): " val)))
-                 guix-operation-options
-                 guix-operation-option-separator)))
-  (force-mode-line-update))
-
-(defun guix-package-source-path (package-id)
-  "Return a store file path to a source of a package PACKAGE-ID."
-  (message "Calculating the source derivation ...")
-  (guix-eval-read
-   (guix-make-guile-expression
-    'package-source-path package-id)))
-
-(defun guix-package-store-path (package-id)
-  "Return a list of store directories of outputs of package PACKAGE-ID."
-  (message "Calculating the package derivation ...")
-  (guix-eval-read
-   (guix-make-guile-expression
-    'package-store-path package-id)))
-
-(defvar guix-after-source-download-hook nil
-  "Hook run after successful performing a 'source-download' operation.")
-
-(defun guix-package-source-build-derivation (package-id &optional prompt)
-  "Build source derivation of a package PACKAGE-ID.
-Ask a user with PROMPT for continuing an operation."
-  (when (or (not guix-operation-confirm)
-            (guix-operation-prompt (or prompt
-                                       "Build the source derivation?")))
-    (guix-eval-in-repl
-     (guix-make-guile-expression
-      'package-source-build-derivation
-      package-id
-      :use-substitutes? (or guix-use-substitutes 'f)
-      :dry-run? (or guix-dry-run 'f))
-     nil 'source-download)))
-
-(defun guix-build-package (package-id &optional prompt)
-  "Build package with PACKAGE-ID.
-Ask a user with PROMPT for continuing the build operation."
-  (when (or (not guix-operation-confirm)
-            (guix-operation-prompt (or prompt "Build package?")))
-    (guix-eval-in-repl
-     (format (concat ",run-in-store "
-                     "(build-package (package-by-id %d)"
-                     " #:use-substitutes? %s"
-                     " #:dry-run? %s)")
-             package-id
-             (guix-guile-boolean guix-use-substitutes)
-             (guix-guile-boolean guix-dry-run)))))
-
-;;;###autoload
-(defun guix-apply-manifest (profile file &optional operation-buffer)
-  "Apply manifest from FILE to PROFILE.
-This function has the same meaning as 'guix package --manifest' command.
-See Info node `(guix) Invoking guix package' for details.
-
-Interactively, use the current profile and prompt for manifest
-FILE.  With a prefix argument, also prompt for PROFILE."
-  (interactive
-   (let* ((current-profile (guix-ui-current-profile))
-          (profile (if current-prefix-arg
-                       (guix-profile-prompt)
-                     (or current-profile guix-current-profile)))
-          (file (read-file-name "File with manifest: "))
-          (buffer (and current-profile (current-buffer))))
-     (list profile file buffer)))
-  (when (or (not guix-operation-confirm)
-            (y-or-n-p (format "Apply manifest from '%s' to profile '%s'? "
-                              file profile)))
-    (guix-eval-in-repl
-     (guix-make-guile-expression
-      'guix-command
-      "package"
-      (concat "--profile="  (expand-file-name profile))
-      (concat "--manifest=" (expand-file-name file)))
-     operation-buffer)))
-
-
-;;; Executing guix commands
-
-(defcustom guix-run-in-shell-function #'guix-run-in-shell
-  "Function used to run guix command.
-The function is called with a single argument - a command line string."
-  :type '(choice (function-item guix-run-in-shell)
-                 (function-item guix-run-in-eshell)
-                 (function :tag "Other function"))
-  :group 'guix)
-
-(defcustom guix-shell-buffer-name "*shell*"
-  "Default name of a shell buffer used for running guix commands."
-  :type 'string
-  :group 'guix)
-
-(declare-function comint-send-input "comint" t)
-
-(defun guix-run-in-shell (string)
-  "Run command line STRING in `guix-shell-buffer-name' buffer."
-  (shell guix-shell-buffer-name)
-  (goto-char (point-max))
-  (insert string)
-  (comint-send-input))
-
-(declare-function eshell-send-input "esh-mode" t)
-
-(defun guix-run-in-eshell (string)
-  "Run command line STRING in eshell buffer."
-  (eshell)
-  (goto-char (point-max))
-  (insert string)
-  (eshell-send-input))
-
-(defun guix-run-command-in-shell (args)
-  "Execute 'guix ARGS ...' command in a shell buffer."
-  (funcall guix-run-in-shell-function
-           (guix-command-string args)))
-
-(defun guix-run-command-in-repl (args)
-  "Execute 'guix ARGS ...' command in Guix REPL."
-  (guix-eval-in-repl
-   (apply #'guix-make-guile-expression
-          'guix-command args)))
-
-(defun guix-command-output (args)
-  "Return string with 'guix ARGS ...' output."
-  (cl-multiple-value-bind (output error)
-      (guix-eval (apply #'guix-make-guile-expression
-                        'guix-command-output args))
-    ;; Remove trailing new space from the error string.
-    (message (replace-regexp-in-string "\n\\'" "" (read error)))
-    (read output)))
-
-(defun guix-help-string (&optional commands)
-  "Return string with 'guix COMMANDS ... --help' output."
-  (guix-eval-read
-   (apply #'guix-make-guile-expression
-          'help-string commands)))
-
-
-;;; Pull
-
-(defcustom guix-update-after-pull t
-  "If non-nil, update Guix buffers after performing \\[guix-pull]."
-  :type 'boolean
-  :group 'guix)
-
-(defvar guix-after-pull-hook
-  '(guix-restart-repl-after-pull guix-update-buffers-maybe-after-pull)
-  "Hook run after successful performing `guix-pull' operation.")
-
-(defun guix-restart-repl-after-pull ()
-  "Restart Guix REPL after `guix-pull' operation."
-  (guix-repl-exit)
-  (guix-start-process-maybe
-   "Restarting Guix REPL after pull operation ..."))
-
-(defun guix-update-buffers-maybe-after-pull ()
-  "Update buffers depending on `guix-update-after-pull'."
-  (when guix-update-after-pull
-    (mapc #'guix-ui-update-buffer
-          ;; No need to update "generation" buffers.
-          (guix-ui-buffers '(guix-package-list-mode
-                             guix-package-info-mode
-                             guix-output-list-mode
-                             guix-output-info-mode)))
-    (message "Guix buffers have been updated.")))
-
-;;;###autoload
-(defun guix-pull (&optional verbose)
-  "Run Guix pull operation.
-If VERBOSE is non-nil (with prefix argument), produce verbose output."
-  (interactive "P")
-  (let ((args (and verbose '("--verbose"))))
-    (guix-eval-in-repl
-     (apply #'guix-make-guile-expression
-            'guix-command "pull" args)
-     nil 'pull)))
-
-(provide 'guix-base)
-
-;;; guix-base.el ends here
diff --git a/emacs/guix-buffer.el b/emacs/guix-buffer.el
deleted file mode 100644
index 4cefe9989e..0000000000
--- a/emacs/guix-buffer.el
+++ /dev/null
@@ -1,624 +0,0 @@
-;;; guix-buffer.el --- Buffer interface for displaying data  -*- lexical-binding: t -*-
-
-;; Copyright © 2014, 2015 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides a general 'buffer' interface for displaying an
-;; arbitrary data.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'guix-history)
-(require 'guix-utils)
-
-(defvar guix-buffer-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map (kbd "l") 'guix-history-back)
-    (define-key map (kbd "r") 'guix-history-forward)
-    (define-key map (kbd "g") 'revert-buffer)
-    (define-key map (kbd "R") 'guix-buffer-redisplay)
-    map)
-  "Parent keymap for Guix buffer modes.")
-
-
-;;; Buffer item
-
-(cl-defstruct (guix-buffer-item
-               (:constructor nil)
-               (:constructor guix-buffer-make-item
-                             (entries buffer-type entry-type args))
-               (:copier      nil))
-  entries buffer-type entry-type args)
-
-(defvar-local guix-buffer-item nil
-  "Data (structure) for the current Guix buffer.
-The structure consists of the following elements:
-
-- `entries': list of the currently displayed entries.
-
-  Each element of the list is an alist with an entry data of the
-  following form:
-
-    ((PARAM . VAL) ...)
-
-  PARAM is a name of the entry parameter.
-  VAL is a value of this parameter.
-
-- `entry-type': type of the currently displayed entries.
-
-- `buffer-type': type of the current buffer.
-
-- `args': search arguments used to get the current entries.")
-(put 'guix-buffer-item 'permanent-local t)
-
-(defmacro guix-buffer-with-item (item &rest body)
-  "Evaluate BODY using buffer ITEM.
-The following local variables are available inside BODY:
-`%entries', `%buffer-type', `%entry-type', `%args'.
-See `guix-buffer-item' for details."
-  (declare (indent 1) (debug t))
-  (let ((item-var (make-symbol "item")))
-    `(let ((,item-var ,item))
-       (let ((%entries     (guix-buffer-item-entries     ,item-var))
-             (%buffer-type (guix-buffer-item-buffer-type ,item-var))
-             (%entry-type  (guix-buffer-item-entry-type  ,item-var))
-             (%args        (guix-buffer-item-args        ,item-var)))
-         ,@body))))
-
-(defmacro guix-buffer-with-current-item (&rest body)
-  "Evaluate BODY using `guix-buffer-item'.
-See `guix-buffer-with-item' for details."
-  (declare (indent 0) (debug t))
-  `(guix-buffer-with-item guix-buffer-item
-     ,@body))
-
-(defmacro guix-buffer-define-current-item-accessor (name)
-  "Define `guix-buffer-current-NAME' function to access NAME
-element of `guix-buffer-item' structure.
-NAME should be a symbol."
-  (let* ((name-str (symbol-name name))
-         (accessor (intern (concat "guix-buffer-item-" name-str)))
-         (fun-name (intern (concat "guix-buffer-current-" name-str)))
-         (doc      (format "\
-Return '%s' of the current Guix buffer.
-See `guix-buffer-item' for details."
-                           name-str)))
-    `(defun ,fun-name ()
-       ,doc
-       (and guix-buffer-item
-            (,accessor guix-buffer-item)))))
-
-(defmacro guix-buffer-define-current-item-accessors (&rest names)
-  "Define `guix-buffer-current-NAME' functions for NAMES.
-See `guix-buffer-define-current-item-accessor' for details."
-  `(progn
-     ,@(mapcar (lambda (name)
-                 `(guix-buffer-define-current-item-accessor ,name))
-               names)))
-
-(guix-buffer-define-current-item-accessors
- entries entry-type buffer-type args)
-
-(defmacro guix-buffer-define-current-args-accessor (n prefix name)
-  "Define `PREFIX-NAME' function to access Nth element of 'args'
-field of `guix-buffer-item' structure.
-PREFIX and NAME should be strings."
-  (let ((fun-name (intern (concat prefix "-" name)))
-        (doc      (format "\
-Return '%s' of the current Guix buffer.
-'%s' is the element number %d in 'args' of `guix-buffer-item'."
-                          name name n)))
-    `(defun ,fun-name ()
-       ,doc
-       (nth ,n (guix-buffer-current-args)))))
-
-(defmacro guix-buffer-define-current-args-accessors (prefix &rest names)
-  "Define `PREFIX-NAME' functions for NAMES.
-See `guix-buffer-define-current-args-accessor' for details."
-  `(progn
-     ,@(cl-loop for name in names
-                for i from 0
-                collect `(guix-buffer-define-current-args-accessor
-                          ,i ,prefix ,name))))
-
-
-;;; Wrappers for defined variables
-
-(defvar guix-buffer-data nil
-  "Alist with 'buffer' data.
-This alist is filled by `guix-buffer-define-interface' macro.")
-
-(defun guix-buffer-value (buffer-type entry-type symbol)
-  "Return SYMBOL's value for BUFFER-TYPE/ENTRY-TYPE from `guix-buffer-data'."
-  (symbol-value
-   (guix-assq-value guix-buffer-data buffer-type entry-type symbol)))
-
-(defun guix-buffer-get-entries (buffer-type entry-type args)
-  "Return ENTRY-TYPE entries.
-Call an appropriate 'get-entries' function from `guix-buffer'
-using ARGS as its arguments."
-  (apply (guix-buffer-value buffer-type entry-type 'get-entries)
-         args))
-
-(defun guix-buffer-mode-enable (buffer-type entry-type)
-  "Turn on major mode to display ENTRY-TYPE ENTRIES in BUFFER-TYPE buffer."
-  (funcall (guix-buffer-value buffer-type entry-type 'mode)))
-
-(defun guix-buffer-mode-initialize (buffer-type entry-type)
-  "Set up the current BUFFER-TYPE buffer to display ENTRY-TYPE entries."
-  (let ((fun (guix-buffer-value buffer-type entry-type 'mode-init)))
-    (when fun
-      (funcall fun))))
-
-(defun guix-buffer-insert-entries (entries buffer-type entry-type)
-  "Show ENTRY-TYPE ENTRIES in the current BUFFER-TYPE buffer."
-  (funcall (guix-buffer-value buffer-type entry-type 'insert-entries)
-           entries))
-
-(defun guix-buffer-show-entries-default (entries buffer-type entry-type)
-  "Show ENTRY-TYPE ENTRIES in the current BUFFER-TYPE buffer."
-  (let ((inhibit-read-only t))
-    (erase-buffer)
-    (guix-buffer-mode-enable buffer-type entry-type)
-    (guix-buffer-insert-entries entries buffer-type entry-type)
-    (goto-char (point-min))))
-
-(defun guix-buffer-show-entries (entries buffer-type entry-type)
-  "Show ENTRY-TYPE ENTRIES in the current BUFFER-TYPE buffer."
-  (funcall (guix-buffer-value buffer-type entry-type 'show-entries)
-           entries))
-
-(defun guix-buffer-message (entries buffer-type entry-type args)
-  "Display a message for BUFFER-ITEM after showing entries."
-  (let ((fun (guix-buffer-value buffer-type entry-type 'message)))
-    (when fun
-      (apply fun entries args))))
-
-(defun guix-buffer-name (buffer-type entry-type args)
-  "Return name of BUFFER-TYPE buffer for displaying ENTRY-TYPE entries."
-  (let ((str-or-fun (guix-buffer-value buffer-type entry-type
-                                       'buffer-name)))
-    (if (stringp str-or-fun)
-        str-or-fun
-      (apply str-or-fun args))))
-
-(defun guix-buffer-param-title (buffer-type entry-type param)
-  "Return PARAM title for BUFFER-TYPE/ENTRY-TYPE."
-  (or (guix-assq-value (guix-buffer-value buffer-type entry-type 'titles)
-                       param)
-      ;; Fallback to a title defined in 'info' interface.
-      (unless (eq buffer-type 'info)
-        (guix-assq-value (guix-buffer-value 'info entry-type 'titles)
-                         param))
-      (guix-symbol-title param)))
-
-(defun guix-buffer-history-size (buffer-type entry-type)
-  "Return history size for BUFFER-TYPE/ENTRY-TYPE."
-  (guix-buffer-value buffer-type entry-type 'history-size))
-
-(defun guix-buffer-revert-confirm? (buffer-type entry-type)
-  "Return 'revert-confirm' value for BUFFER-TYPE/ENTRY-TYPE."
-  (guix-buffer-value buffer-type entry-type 'revert-confirm))
-
-
-;;; Displaying entries
-
-(defun guix-buffer-display (buffer)
-  "Switch to a Guix BUFFER."
-  (pop-to-buffer buffer
-                 '((display-buffer-reuse-window
-                    display-buffer-same-window))))
-
-(defun guix-buffer-history-item (buffer-item)
-  "Make and return a history item for displaying BUFFER-ITEM."
-  (list #'guix-buffer-set buffer-item))
-
-(defun guix-buffer-set (buffer-item &optional history)
-  "Set up the current buffer for displaying BUFFER-ITEM.
-HISTORY should be one of the following:
-
-  `nil' - do not save BUFFER-ITEM in history,
-
-  `add' - add it to history,
-
-  `replace' - replace the current history item."
-  (guix-buffer-with-item buffer-item
-    (when %entries
-      ;; Set buffer item before showing entries, so that its value can
-      ;; be used by the code for displaying entries.
-      (setq guix-buffer-item buffer-item)
-      (guix-buffer-show-entries %entries %buffer-type %entry-type)
-      (when history
-        (funcall (cl-ecase history
-                   (add     #'guix-history-add)
-                   (replace #'guix-history-replace))
-                 (guix-buffer-history-item buffer-item))))
-    (guix-buffer-message %entries %buffer-type %entry-type %args)))
-
-(defun guix-buffer-display-entries-current
-    (entries buffer-type entry-type args &optional history)
-  "Show ENTRIES in the current Guix buffer.
-See `guix-buffer-item' for the meaning of BUFFER-TYPE, ENTRY-TYPE
-and ARGS, and `guix-buffer-set' for the meaning of HISTORY."
-  (let ((item (guix-buffer-make-item entries buffer-type
-                                     entry-type args)))
-    (guix-buffer-set item history)))
-
-(defun guix-buffer-get-display-entries-current
-    (buffer-type entry-type args &optional history)
-  "Search for entries and show them in the current Guix buffer.
-See `guix-buffer-display-entries-current' for details."
-  (guix-buffer-display-entries-current
-   (guix-buffer-get-entries buffer-type entry-type args)
-   buffer-type entry-type args history))
-
-(defun guix-buffer-display-entries
-    (entries buffer-type entry-type args &optional history)
-  "Show ENTRIES in a BUFFER-TYPE buffer.
-See `guix-buffer-display-entries-current' for details."
-  (let ((buffer (get-buffer-create
-                 (guix-buffer-name buffer-type entry-type args))))
-    (with-current-buffer buffer
-      (guix-buffer-display-entries-current
-       entries buffer-type entry-type args history))
-    (when entries
-      (guix-buffer-display buffer))))
-
-(defun guix-buffer-get-display-entries
-    (buffer-type entry-type args &optional history)
-  "Search for entries and show them in a BUFFER-TYPE buffer.
-See `guix-buffer-display-entries-current' for details."
-  (guix-buffer-display-entries
-   (guix-buffer-get-entries buffer-type entry-type args)
-   buffer-type entry-type args history))
-
-(defun guix-buffer-revert (_ignore-auto noconfirm)
-  "Update the data in the current Guix buffer.
-This function is suitable for `revert-buffer-function'.
-See `revert-buffer' for the meaning of NOCONFIRM."
-  (guix-buffer-with-current-item
-    (when (or noconfirm
-              (not (guix-buffer-revert-confirm? %buffer-type %entry-type))
-              (y-or-n-p "Update the current buffer? "))
-      (guix-buffer-get-display-entries-current
-       %buffer-type %entry-type %args 'replace))))
-
-(defvar guix-buffer-after-redisplay-hook nil
-  "Hook run by `guix-buffer-redisplay'.
-This hook is called before seting up a window position.")
-
-(defun guix-buffer-redisplay ()
-  "Redisplay the current Guix buffer.
-Restore the point and window positions after redisplaying.
-
-This function does not update the buffer data, use
-'\\[revert-buffer]' if you want the full update."
-  (interactive)
-  (let* ((old-point (point))
-         ;; For simplicity, ignore an unlikely case when multiple
-         ;; windows display the same buffer.
-         (window (car (get-buffer-window-list (current-buffer) nil t)))
-         (window-start (and window (window-start window))))
-    (guix-buffer-set guix-buffer-item)
-    (goto-char old-point)
-    (run-hooks 'guix-buffer-after-redisplay-hook)
-    (when window
-      (set-window-point window (point))
-      (set-window-start window window-start))))
-
-(defun guix-buffer-redisplay-goto-button ()
-  "Redisplay the current buffer and go to the next button, if needed."
-  (let ((guix-buffer-after-redisplay-hook
-         (cons (lambda ()
-                 (unless (button-at (point))
-                   (forward-button 1)))
-               guix-buffer-after-redisplay-hook)))
-    (guix-buffer-redisplay)))
-
-
-;;; Interface definers
-
-(defmacro guix-define-groups (type &rest args)
-  "Define `guix-TYPE' and `guix-TYPE-faces' custom groups.
-Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ...
-
-Optional keywords:
-
-  - `:parent-group' - name of a parent custom group.
-
-  - `:parent-faces-group' - name of a parent custom faces group.
-
-  - `:group-doc' - docstring of a `guix-TYPE' group.
-
-  - `:faces-group-doc' - docstring of a `guix-TYPE-faces' group."
-  (declare (indent 1))
-  (let* ((type-str           (symbol-name type))
-         (prefix             (concat "guix-" type-str))
-         (group              (intern prefix))
-         (faces-group        (intern (concat prefix "-faces"))))
-    (guix-keyword-args-let args
-        ((parent-group       :parent-group 'guix)
-         (parent-faces-group :parent-faces-group 'guix-faces)
-         (group-doc          :group-doc
-                             (format "Settings for '%s' buffers."
-                                     type-str))
-         (faces-group-doc    :faces-group-doc
-                             (format "Faces for '%s' buffers."
-                                     type-str)))
-      `(progn
-         (defgroup ,group nil
-           ,group-doc
-           :group ',parent-group)
-
-         (defgroup ,faces-group nil
-           ,faces-group-doc
-           :group ',group
-           :group ',parent-faces-group)))))
-
-(defmacro guix-define-entry-type (entry-type &rest args)
-  "Define general code for ENTRY-TYPE.
-See `guix-define-groups'."
-  (declare (indent 1))
-  `(guix-define-groups ,entry-type
-     ,@args))
-
-(defmacro guix-define-buffer-type (buffer-type &rest args)
-  "Define general code for BUFFER-TYPE.
-See `guix-define-groups'."
-  (declare (indent 1))
-  `(guix-define-groups ,buffer-type
-     ,@args))
-
-(defmacro guix-buffer-define-interface (buffer-type entry-type &rest args)
-  "Define BUFFER-TYPE interface for displaying ENTRY-TYPE entries.
-Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ...
-In the following description TYPE means ENTRY-TYPE-BUFFER-TYPE.
-
-Required keywords:
-
-  - `:buffer-name' - default value of the generated
-    `guix-TYPE-buffer-name' variable.
-
-  - `:get-entries-function' - default value of the generated
-    `guix-TYPE-get-function' variable.
-
-  - `:show-entries-function' - default value of the generated
-    `guix-TYPE-show-function' variable.
-
-  Alternatively, if `:show-entries-function' is not specified, a
-  default `guix-TYPE-show-entries' will be generated, and the
-  following keyword should be specified instead:
-
-  - `:insert-entries-function' - default value of the generated
-    `guix-TYPE-insert-function' variable.
-
-Optional keywords:
-
-  - `:message-function' - default value of the generated
-    `guix-TYPE-message-function' variable.
-
-  - `:titles' - default value of the generated
-    `guix-TYPE-titles' variable.
-
-  - `:history-size' - default value of the generated
-    `guix-TYPE-history-size' variable.
-
-  - `:revert-confirm?' - default value of the generated
-    `guix-TYPE-revert-confirm' variable.
-
-  - `:mode-name' - name (a string appeared in the mode-line) of
-     the generated `guix-TYPE-mode'.
-
-  - `:mode-init-function' - default value of the generated
-    `guix-TYPE-mode-initialize-function' variable.
-
-  - `:reduced?' - if non-nil, generate only group, faces group
-    and titles variable (if specified); all keywords become
-    optional."
-  (declare (indent 2))
-  (let* ((entry-type-str     (symbol-name entry-type))
-         (buffer-type-str    (symbol-name buffer-type))
-         (prefix             (concat "guix-" entry-type-str "-"
-                                     buffer-type-str))
-         (group              (intern prefix))
-         (faces-group        (intern (concat prefix "-faces")))
-         (get-entries-var    (intern (concat prefix "-get-function")))
-         (show-entries-var   (intern (concat prefix "-show-function")))
-         (show-entries-fun   (intern (concat prefix "-show-entries")))
-         (message-var        (intern (concat prefix "-message-function")))
-         (buffer-name-var    (intern (concat prefix "-buffer-name")))
-         (titles-var         (intern (concat prefix "-titles")))
-         (history-size-var   (intern (concat prefix "-history-size")))
-         (revert-confirm-var (intern (concat prefix "-revert-confirm"))))
-    (guix-keyword-args-let args
-        ((get-entries-val    :get-entries-function)
-         (show-entries-val   :show-entries-function)
-         (insert-entries-val :insert-entries-function)
-         (mode-name          :mode-name (capitalize prefix))
-         (mode-init-val      :mode-init-function)
-         (message-val        :message-function)
-         (buffer-name-val    :buffer-name)
-         (titles-val         :titles)
-         (history-size-val   :history-size 20)
-         (revert-confirm-val :revert-confirm? t)
-         (reduced?           :reduced?))
-      `(progn
-         (defgroup ,group nil
-           ,(format "Displaying '%s' entries in '%s' buffer."
-                    entry-type-str buffer-type-str)
-           :group ',(intern (concat "guix-" entry-type-str))
-           :group ',(intern (concat "guix-" buffer-type-str)))
-
-         (defgroup ,faces-group nil
-           ,(format "Faces for displaying '%s' entries in '%s' buffer."
-                    entry-type-str buffer-type-str)
-           :group ',group
-           :group ',(intern (concat "guix-" entry-type-str "-faces"))
-           :group ',(intern (concat "guix-" buffer-type-str "-faces")))
-
-         (defcustom ,titles-var ,titles-val
-           ,(format "Alist of titles of '%s' parameters."
-                    entry-type-str)
-           :type '(alist :key-type symbol :value-type string)
-           :group ',group)
-
-         ,(unless reduced?
-            `(progn
-               (defvar ,get-entries-var ,get-entries-val
-                 ,(format "\
-Function used to receive '%s' entries for '%s' buffer."
-                          entry-type-str buffer-type-str))
-
-               (defvar ,show-entries-var
-                 ,(or show-entries-val `',show-entries-fun)
-                 ,(format "\
-Function used to show '%s' entries in '%s' buffer."
-                          entry-type-str buffer-type-str))
-
-               (defvar ,message-var ,message-val
-                 ,(format "\
-Function used to display a message after showing '%s' entries.
-If nil, do not display messages."
-                          entry-type-str))
-
-               (defcustom ,buffer-name-var ,buffer-name-val
-                 ,(format "\
-Default name of '%s' buffer for displaying '%s' entries.
-May be a string or a function returning a string.  The function
-is called with the same arguments as `%S'."
-                          buffer-type-str entry-type-str get-entries-var)
-                 :type '(choice string function)
-                 :group ',group)
-
-               (defcustom ,history-size-var ,history-size-val
-                 ,(format "\
-Maximum number of items saved in history of `%S' buffer.
-If 0, the history is disabled."
-                          buffer-name-var)
-                 :type 'integer
-                 :group ',group)
-
-               (defcustom ,revert-confirm-var ,revert-confirm-val
-                 ,(format "\
-If non-nil, ask to confirm for reverting `%S' buffer."
-                          buffer-name-var)
-                 :type 'boolean
-                 :group ',group)
-
-               (guix-alist-put!
-                '((get-entries    . ,get-entries-var)
-                  (show-entries   . ,show-entries-var)
-                  (message        . ,message-var)
-                  (buffer-name    . ,buffer-name-var)
-                  (history-size   . ,history-size-var)
-                  (revert-confirm . ,revert-confirm-var))
-                'guix-buffer-data ',buffer-type ',entry-type)
-
-               ,(unless show-entries-val
-                  `(defun ,show-entries-fun (entries)
-                     ,(format "\
-Show '%s' ENTRIES in the current '%s' buffer."
-                              entry-type-str buffer-type-str)
-                     (guix-buffer-show-entries-default
-                      entries ',buffer-type ',entry-type)))
-
-               ,(when (or insert-entries-val
-                          (null show-entries-val))
-                  (let ((insert-entries-var
-                         (intern (concat prefix "-insert-function"))))
-                    `(progn
-                       (defvar ,insert-entries-var ,insert-entries-val
-                         ,(format "\
-Function used to print '%s' entries in '%s' buffer."
-                                  entry-type-str buffer-type-str))
-
-                       (guix-alist-put!
-                        ',insert-entries-var 'guix-buffer-data
-                        ',buffer-type ',entry-type
-                        'insert-entries))))
-
-               ,(when (or mode-name
-                          mode-init-val
-                          (null show-entries-val))
-                  (let* ((mode-str      (concat prefix "-mode"))
-                         (mode-map-str  (concat mode-str "-map"))
-                         (mode          (intern mode-str))
-                         (parent-mode   (intern
-                                         (concat "guix-" buffer-type-str
-                                                 "-mode")))
-                         (mode-var      (intern
-                                         (concat mode-str "-function")))
-                         (mode-init-var (intern
-                                         (concat mode-str
-                                                 "-initialize-function"))))
-                    `(progn
-                       (defvar ,mode-var ',mode
-                         ,(format "\
-Major mode for displaying '%s' entries in '%s' buffer."
-                                  entry-type-str buffer-type-str))
-
-                       (defvar ,mode-init-var ,mode-init-val
-                         ,(format "\
-Function used to set up '%s' buffer for displaying '%s' entries."
-                                  buffer-type-str entry-type-str))
-
-                       (define-derived-mode ,mode ,parent-mode ,mode-name
-                         ,(format "\
-Major mode for displaying '%s' entries in '%s' buffer.
-
-\\{%s}"
-                                  entry-type-str buffer-type-str mode-map-str)
-                         (setq-local revert-buffer-function
-                                     'guix-buffer-revert)
-                         (setq-local guix-history-size
-                                     (guix-buffer-history-size
-                                      ',buffer-type ',entry-type))
-                         (guix-buffer-mode-initialize
-                          ',buffer-type ',entry-type))
-
-                       (guix-alist-put!
-                        ',mode-var 'guix-buffer-data
-                        ',buffer-type ',entry-type 'mode)
-                       (guix-alist-put!
-                        ',mode-init-var 'guix-buffer-data
-                        ',buffer-type ',entry-type
-                        'mode-init))))))
-
-         (guix-alist-put!
-          ',titles-var 'guix-buffer-data
-          ',buffer-type ',entry-type 'titles)))))
-
-
-(defvar guix-buffer-font-lock-keywords
-  (eval-when-compile
-    `((,(rx "(" (group (or "guix-buffer-with-item"
-                           "guix-buffer-with-current-item"
-                           "guix-buffer-define-interface"
-                           "guix-define-groups"
-                           "guix-define-entry-type"
-                           "guix-define-buffer-type"))
-            symbol-end)
-       . 1))))
-
-(font-lock-add-keywords 'emacs-lisp-mode guix-buffer-font-lock-keywords)
-
-(provide 'guix-buffer)
-
-;;; guix-buffer.el ends here
diff --git a/emacs/guix-build-log.el b/emacs/guix-build-log.el
deleted file mode 100644
index f67be16326..0000000000
--- a/emacs/guix-build-log.el
+++ /dev/null
@@ -1,381 +0,0 @@
-;;; guix-build-log.el --- Major and minor modes for build logs   -*- lexical-binding: t -*-
-
-;; Copyright © 2015 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides a major mode (`guix-build-log-mode') and a minor mode
-;; (`guix-build-log-minor-mode') for highlighting Guix build logs.
-
-;;; Code:
-
-(require 'guix-utils)
-
-(defgroup guix-build-log nil
-  "Settings for `guix-build-log-mode'."
-  :group 'guix)
-
-(defgroup guix-build-log-faces nil
-  "Faces for `guix-build-log-mode'."
-  :group 'guix-build-log
-  :group 'guix-faces)
-
-(defface guix-build-log-title-head
-  '((t :inherit font-lock-keyword-face))
-  "Face for '@' symbol of a log title."
-  :group 'guix-build-log-faces)
-
-(defface guix-build-log-title-start
-  '((t :inherit guix-build-log-title-head))
-  "Face for a log title denoting a start of a process."
-  :group 'guix-build-log-faces)
-
-(defface guix-build-log-title-success
-  '((t :inherit guix-build-log-title-head))
-  "Face for a log title denoting a successful end of a process."
-  :group 'guix-build-log-faces)
-
-(defface guix-build-log-title-fail
-  '((t :inherit error))
-  "Face for a log title denoting a failed end of a process."
-  :group 'guix-build-log-faces)
-
-(defface guix-build-log-title-end
-  '((t :inherit guix-build-log-title-head))
-  "Face for a log title denoting an undefined end of a process."
-  :group 'guix-build-log-faces)
-
-(defface guix-build-log-phase-name
-  '((t :inherit font-lock-function-name-face))
-  "Face for a phase name."
-  :group 'guix-build-log-faces)
-
-(defface guix-build-log-phase-start
-  '((default :weight bold)
-    (((class grayscale) (background light)) :foreground "Gray90")
-    (((class grayscale) (background dark))  :foreground "DimGray")
-    (((class color) (min-colors 16) (background light))
-     :foreground "DarkGreen")
-    (((class color) (min-colors 16) (background dark))
-     :foreground "LimeGreen")
-    (((class color) (min-colors 8)) :foreground "green"))
-  "Face for the start line of a phase."
-  :group 'guix-build-log-faces)
-
-(defface guix-build-log-phase-end
-  '((((class grayscale) (background light)) :foreground "Gray90")
-    (((class grayscale) (background dark))  :foreground "DimGray")
-    (((class color) (min-colors 16) (background light))
-     :foreground "ForestGreen")
-    (((class color) (min-colors 16) (background dark))
-     :foreground "LightGreen")
-    (((class color) (min-colors 8)) :foreground "green")
-    (t :weight bold))
-  "Face for the end line of a phase."
-  :group 'guix-build-log-faces)
-
-(defface guix-build-log-phase-success
-  '((t))
-  "Face for the 'succeeded' word of a phase line."
-  :group 'guix-build-log-faces)
-
-(defface guix-build-log-phase-fail
-  '((t :inherit error))
-  "Face for the 'failed' word of a phase line."
-  :group 'guix-build-log-faces)
-
-(defface guix-build-log-phase-seconds
-  '((t :inherit font-lock-constant-face))
-  "Face for the number of seconds for a phase."
-  :group 'guix-build-log-faces)
-
-(defcustom guix-build-log-minor-mode-activate t
-  "If non-nil, then `guix-build-log-minor-mode' is automatically
-activated in `shell-mode' buffers."
-  :type 'boolean
-  :group 'guix-build-log)
-
-(defcustom guix-build-log-mode-hook '()
-  "Hook run after `guix-build-log-mode' is entered."
-  :type 'hook
-  :group 'guix-build-log)
-
-(defvar guix-build-log-phase-name-regexp "`\\([^']+\\)'"
-  "Regexp for a phase name.")
-
-(defvar guix-build-log-phase-start-regexp
-  (concat "^starting phase " guix-build-log-phase-name-regexp)
-  "Regexp for the start line of a 'build' phase.")
-
-(defun guix-build-log-title-regexp (&optional state)
-  "Return regexp for the log title.
-STATE is a symbol denoting a state of the title.  It should be
-`start', `fail', `success' or `nil' (for a regexp matching any
-state)."
-  (let* ((word-rx (rx (1+ (any word "-"))))
-         (state-rx (cond ((eq state 'start)   (concat word-rx "started"))
-                         ((eq state 'success) (concat word-rx "succeeded"))
-                         ((eq state 'fail)    (concat word-rx "failed"))
-                         (t word-rx))))
-    (rx-to-string
-     `(and bol (group "@") " " (group (regexp ,state-rx)))
-     t)))
-
-(defun guix-build-log-phase-end-regexp (&optional state)
-  "Return regexp for the end line of a 'build' phase.
-STATE is a symbol denoting how a build phase was ended.  It should be
-`fail', `success' or `nil' (for a regexp matching any state)."
-  (let ((state-rx (cond ((eq state 'success) "succeeded")
-                        ((eq state 'fail)    "failed")
-                        (t (regexp-opt '("succeeded" "failed"))))))
-    (rx-to-string
-     `(and bol "phase " (regexp ,guix-build-log-phase-name-regexp)
-           " " (group (regexp ,state-rx)) " after "
-           (group (1+ (or digit "."))) " seconds")
-     t)))
-
-(defvar guix-build-log-phase-end-regexp
-  ;; For efficiency, it is better to have a regexp for the general line
-  ;; of the phase end, then to call the function all the time.
-  (guix-build-log-phase-end-regexp)
-  "Regexp for the end line of a 'build' phase.")
-
-(defvar guix-build-log-font-lock-keywords
-  `((,(guix-build-log-title-regexp 'start)
-     (1 'guix-build-log-title-head)
-     (2 'guix-build-log-title-start))
-    (,(guix-build-log-title-regexp 'success)
-     (1 'guix-build-log-title-head)
-     (2 'guix-build-log-title-success))
-    (,(guix-build-log-title-regexp 'fail)
-     (1 'guix-build-log-title-head)
-     (2 'guix-build-log-title-fail))
-    (,(guix-build-log-title-regexp)
-     (1 'guix-build-log-title-head)
-     (2 'guix-build-log-title-end))
-    (,guix-build-log-phase-start-regexp
-     (0 'guix-build-log-phase-start)
-     (1 'guix-build-log-phase-name prepend))
-    (,(guix-build-log-phase-end-regexp 'success)
-     (0 'guix-build-log-phase-end)
-     (1 'guix-build-log-phase-name prepend)
-     (2 'guix-build-log-phase-success prepend)
-     (3 'guix-build-log-phase-seconds prepend))
-    (,(guix-build-log-phase-end-regexp 'fail)
-     (0 'guix-build-log-phase-end)
-     (1 'guix-build-log-phase-name prepend)
-     (2 'guix-build-log-phase-fail prepend)
-     (3 'guix-build-log-phase-seconds prepend)))
-  "A list of `font-lock-keywords' for `guix-build-log-mode'.")
-
-(defvar guix-build-log-common-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map (kbd "M-n") 'guix-build-log-next-phase)
-    (define-key map (kbd "M-p") 'guix-build-log-previous-phase)
-    (define-key map (kbd "TAB") 'guix-build-log-phase-toggle)
-    (define-key map (kbd "<tab>") 'guix-build-log-phase-toggle)
-    (define-key map (kbd "<backtab>") 'guix-build-log-phase-toggle-all)
-    (define-key map [(shift tab)] 'guix-build-log-phase-toggle-all)
-    map)
-  "Parent keymap for 'build-log' buffers.
-For `guix-build-log-mode' this map is used as is.
-For `guix-build-log-minor-mode' this map is prefixed with 'C-c'.")
-
-(defvar guix-build-log-mode-map
-  (let ((map (make-sparse-keymap)))
-    (set-keymap-parent
-     map (make-composed-keymap (list guix-build-log-common-map)
-                               special-mode-map))
-    (define-key map (kbd "c") 'compilation-shell-minor-mode)
-    (define-key map (kbd "v") 'view-mode)
-    map)
-  "Keymap for `guix-build-log-mode' buffers.")
-
-(defvar guix-build-log-minor-mode-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map (kbd "C-c") guix-build-log-common-map)
-    map)
-  "Keymap for `guix-build-log-minor-mode' buffers.")
-
-(defun guix-build-log-phase-start (&optional with-header?)
-  "Return the start point of the current build phase.
-If WITH-HEADER? is non-nil, do not skip 'starting phase ...' header.
-Return nil, if there is no phase start before the current point."
-  (save-excursion
-    (end-of-line)
-    (when (re-search-backward guix-build-log-phase-start-regexp nil t)
-      (unless with-header? (end-of-line))
-      (point))))
-
-(defun guix-build-log-phase-end ()
-  "Return the end point of the current build phase."
-  (save-excursion
-    (beginning-of-line)
-    (when (re-search-forward guix-build-log-phase-end-regexp nil t)
-      (point))))
-
-(defun guix-build-log-phase-hide ()
-  "Hide the body of the current build phase."
-  (interactive)
-  (let ((beg (guix-build-log-phase-start))
-        (end (guix-build-log-phase-end)))
-    (when (and beg end)
-      ;; If not on the header line, move to it.
-      (when (and (> (point) beg)
-                 (< (point) end))
-        (goto-char (guix-build-log-phase-start t)))
-      (remove-overlays beg end 'invisible t)
-      (let ((o (make-overlay beg end)))
-        (overlay-put o 'evaporate t)
-        (overlay-put o 'invisible t)))))
-
-(defun guix-build-log-phase-show ()
-  "Show the body of the current build phase."
-  (interactive)
-  (let ((beg (guix-build-log-phase-start))
-        (end (guix-build-log-phase-end)))
-    (when (and beg end)
-      (remove-overlays beg end 'invisible t))))
-
-(defun guix-build-log-phase-hidden-p ()
-  "Return non-nil, if the body of the current build phase is hidden."
-  (let ((beg (guix-build-log-phase-start)))
-    (and beg
-         (cl-some (lambda (o)
-                    (overlay-get o 'invisible))
-                  (overlays-at beg)))))
-
-(defun guix-build-log-phase-toggle-function ()
-  "Return a function to toggle the body of the current build phase."
-  (if (guix-build-log-phase-hidden-p)
-      #'guix-build-log-phase-show
-    #'guix-build-log-phase-hide))
-
-(defun guix-build-log-phase-toggle ()
-  "Show/hide the body of the current build phase."
-  (interactive)
-  (funcall (guix-build-log-phase-toggle-function)))
-
-(defun guix-build-log-phase-toggle-all ()
-  "Show/hide the bodies of all build phases."
-  (interactive)
-  (save-excursion
-    ;; Some phases may be hidden, and some shown.  Whether to hide or to
-    ;; show them, it is determined by the state of the first phase here.
-    (goto-char (point-min))
-    (let ((fun (save-excursion
-                 (re-search-forward guix-build-log-phase-start-regexp nil t)
-                 (guix-build-log-phase-toggle-function))))
-      (while (re-search-forward guix-build-log-phase-start-regexp nil t)
-        (funcall fun)))))
-
-(defun guix-build-log-next-phase (&optional arg)
-  "Move to the next build phase.
-With ARG, do it that many times.  Negative ARG means move
-backward."
-  (interactive "^p")
-  (if arg
-      (when (zerop arg) (user-error "Try again"))
-    (setq arg 1))
-  (let ((search-fun (if (> arg 0)
-                        #'re-search-forward
-                      #'re-search-backward))
-        (n (abs arg))
-        found last-found)
-    (save-excursion
-      (end-of-line (if (> arg 0) 1 0))  ; skip the current line
-      (while (and (not (zerop n))
-                  (setq found
-                        (funcall search-fun
-                                 guix-build-log-phase-start-regexp
-                                 nil t)))
-        (setq n (1- n)
-              last-found found)))
-    (when last-found
-      (goto-char last-found)
-      (forward-line 0))
-    (or found
-        (user-error (if (> arg 0)
-                        "No next build phase"
-                      "No previous build phase")))))
-
-(defun guix-build-log-previous-phase (&optional arg)
-  "Move to the previous build phase.
-With ARG, do it that many times.  Negative ARG means move
-forward."
-  (interactive "^p")
-  (guix-build-log-next-phase (- (or arg 1))))
-
-;;;###autoload
-(define-derived-mode guix-build-log-mode special-mode
-  "Guix-Build-Log"
-  "Major mode for viewing Guix build logs.
-
-\\{guix-build-log-mode-map}"
-  (setq font-lock-defaults '(guix-build-log-font-lock-keywords t)))
-
-;;;###autoload
-(define-minor-mode guix-build-log-minor-mode
-  "Toggle Guix Build Log minor mode.
-
-With a prefix argument ARG, enable Guix Build Log minor mode if
-ARG is positive, and disable it otherwise.  If called from Lisp,
-enable the mode if ARG is omitted or nil.
-
-When Guix Build Log minor mode is enabled, it highlights build
-log in the current buffer.  This mode can be enabled
-programmatically using hooks:
-
-  (add-hook 'shell-mode-hook 'guix-build-log-minor-mode)
-
-\\{guix-build-log-minor-mode-map}"
-  :init-value nil
-  :lighter " Guix-Build-Log"
-  :keymap guix-build-log-minor-mode-map
-  :group 'guix-build-log
-  (if guix-build-log-minor-mode
-      (font-lock-add-keywords nil guix-build-log-font-lock-keywords)
-    (font-lock-remove-keywords nil guix-build-log-font-lock-keywords))
-  (when font-lock-mode
-    (font-lock-fontify-buffer)))
-
-;;;###autoload
-(defun guix-build-log-minor-mode-activate-maybe ()
-  "Activate `guix-build-log-minor-mode' depending on
-`guix-build-log-minor-mode-activate' variable."
-  (when guix-build-log-minor-mode-activate
-    (guix-build-log-minor-mode)))
-
-(defun guix-build-log-find-file (file-or-url)
-  "Open FILE-OR-URL in `guix-build-log-mode'."
-  (guix-find-file-or-url file-or-url)
-  (guix-build-log-mode))
-
-;;;###autoload
-(add-hook 'shell-mode-hook 'guix-build-log-minor-mode-activate-maybe)
-
-;;;###autoload
-(add-to-list 'auto-mode-alist
-             ;; Regexp for log files (usually placed in /var/log/guix/...)
-             (cons (rx "/guix/drvs/" (= 2 alnum) "/" (= 30 alnum)
-                       "-" (+ (any alnum "-+.")) ".drv" string-end)
-                   'guix-build-log-mode))
-
-(provide 'guix-build-log)
-
-;;; guix-build-log.el ends here
diff --git a/emacs/guix-command.el b/emacs/guix-command.el
deleted file mode 100644
index 7069c51649..0000000000
--- a/emacs/guix-command.el
+++ /dev/null
@@ -1,830 +0,0 @@
-;;; guix-command.el --- Popup interface for guix commands  -*- lexical-binding: t -*-
-
-;; Copyright © 2015, 2016 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides a magit-like popup interface for running guix
-;; commands in Guix REPL.  The entry point is "M-x guix".  When it is
-;; called the first time, "guix --help" output is parsed and
-;; `guix-COMMAND-action' functions are generated for each available guix
-;; COMMAND.  Then a window with these commands is popped up.  When a
-;; particular COMMAND is called, "guix COMMAND --help" output is parsed,
-;; and a user get a new popup window with available options for this
-;; command and so on.
-
-;; To avoid hard-coding all guix options, actions, etc., as much data is
-;; taken from "guix ... --help" outputs as possible.  But this data is
-;; still incomplete: not all long options have short analogs, also
-;; special readers should be used for some options (for example, to
-;; complete package names while prompting for a package).  So after
-;; parsing --help output, the arguments are "improved".  All arguments
-;; (switches, options and actions) are `guix-command-argument'
-;; structures.
-
-;; Only "M-x guix" command is available after this file is loaded.  The
-;; rest commands/actions/popups are generated on the fly only when they
-;; are needed (that's why there is a couple of `eval'-s in this file).
-
-;; COMMANDS argument is used by many functions in this file.  It means a
-;; list of guix commands without "guix" itself, e.g.: ("build"),
-;; ("import" "gnu").  The empty list stands for the plain "guix" without
-;; subcommands.
-
-;; All actions in popup windows are divided into 2 groups:
-;;
-;; - 'Popup' actions - used to pop up another window.  For example, every
-;;   action in the 'guix' or 'guix import' window is a popup action.  They
-;;   are defined by `guix-command-define-popup-action' macro.
-;;
-;; - 'Execute' actions - used to do something with the command line (to
-;;   run a command in Guix REPL or to copy it into kill-ring) constructed
-;;   with the current popup.  They are defined by
-;;   `guix-command-define-execute-action' macro.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'guix-popup)
-(require 'guix-utils)
-(require 'guix-help-vars)
-(require 'guix-read)
-(require 'guix-base)
-(require 'guix-build-log)
-(require 'guix-guile)
-(require 'guix-external)
-
-(defgroup guix-commands nil
-  "Settings for guix popup windows."
-  :group 'guix)
-
-(defvar guix-command-complex-with-shared-arguments
-  '("system")
-  "List of guix commands which have subcommands with shared options.
-I.e., 'guix foo --help' is the same as 'guix foo bar --help'.")
-
-(defun guix-command-action-name (&optional commands &rest name-parts)
-  "Return name of action function for guix COMMANDS."
-  (guix-command-symbol (append commands name-parts (list "action"))))
-
-
-;;; Command arguments
-
-(cl-defstruct (guix-command-argument
-               (:constructor guix-command-make-argument)
-               (:copier      guix-command-copy-argument))
-  name char doc fun switch? option? action?)
-
-(cl-defun guix-command-modify-argument
-    (argument &key
-              (name    nil name-bound?)
-              (char    nil char-bound?)
-              (doc     nil doc-bound?)
-              (fun     nil fun-bound?)
-              (switch? nil switch?-bound?)
-              (option? nil option?-bound?)
-              (action? nil action?-bound?))
-  "Return a modified version of ARGUMENT."
-  (declare (indent 1))
-  (let ((copy (guix-command-copy-argument argument)))
-    (and name-bound?    (setf (guix-command-argument-name    copy) name))
-    (and char-bound?    (setf (guix-command-argument-char    copy) char))
-    (and doc-bound?     (setf (guix-command-argument-doc     copy) doc))
-    (and fun-bound?     (setf (guix-command-argument-fun     copy) fun))
-    (and switch?-bound? (setf (guix-command-argument-switch? copy) switch?))
-    (and option?-bound? (setf (guix-command-argument-option? copy) option?))
-    (and action?-bound? (setf (guix-command-argument-action? copy) action?))
-    copy))
-
-(defun guix-command-modify-argument-from-alist (argument alist)
-  "Return a modified version of ARGUMENT or nil if it wasn't modified.
-Each assoc from ALIST have a form (NAME . PLIST).  NAME is an
-argument name.  PLIST is a property list of argument parameters
-to be modified."
-  (let* ((name  (guix-command-argument-name argument))
-         (plist (guix-assoc-value alist name)))
-    (when plist
-      (apply #'guix-command-modify-argument
-             argument plist))))
-
-(defmacro guix-command-define-argument-improver (name alist)
-  "Define NAME variable and function to modify an argument from ALIST."
-  (declare (indent 1))
-  `(progn
-     (defvar ,name ,alist)
-     (defun ,name (argument)
-       (guix-command-modify-argument-from-alist argument ,name))))
-
-(guix-command-define-argument-improver
-    guix-command-improve-action-argument
-  '(("container"   :char ?C)
-    ("graph"       :char ?G)
-    ("environment" :char ?E)
-    ("publish"     :char ?u)
-    ("pull"        :char ?P)
-    ("size"        :char ?z)))
-
-(guix-command-define-argument-improver
-    guix-command-improve-common-argument
-  '(("--help"    :switch? nil)
-    ("--version" :switch? nil)))
-
-(guix-command-define-argument-improver
-    guix-command-improve-target-argument
-  '(("--target" :char ?T)))
-
-(guix-command-define-argument-improver
-    guix-command-improve-system-type-argument
-  '(("--system" :fun guix-read-system-type)))
-
-(guix-command-define-argument-improver
-    guix-command-improve-load-path-argument
-  '(("--load-path" :fun read-directory-name)))
-
-(guix-command-define-argument-improver
-    guix-command-improve-search-paths-argument
-  '(("--search-paths" :char ?P)))
-
-(guix-command-define-argument-improver
-    guix-command-improve-substitute-urls-argument
-  '(("--substitute-urls" :char ?U)))
-
-(guix-command-define-argument-improver
-    guix-command-improve-hash-argument
-  '(("--format" :fun guix-read-hash-format)))
-
-(guix-command-define-argument-improver
-    guix-command-improve-key-policy-argument
-  '(("--key-download" :fun guix-read-key-policy)))
-
-(defvar guix-command-improve-common-build-argument
-  '(("--no-substitutes"  :char ?s)
-    ("--no-build-hook"   :char ?h)
-    ("--max-silent-time" :char ?x)
-    ("--rounds"          :char ?R :fun read-number)
-    ("--with-input"      :char ?W)))
-
-(defun guix-command-improve-common-build-argument (argument)
-  (guix-command-modify-argument-from-alist
-   argument
-   (append guix-command-improve-load-path-argument
-           guix-command-improve-substitute-urls-argument
-           guix-command-improve-common-build-argument)))
-
-(guix-command-define-argument-improver
-    guix-command-improve-archive-argument
-  '(("--generate-key" :char ?k)))
-
-(guix-command-define-argument-improver
-    guix-command-improve-build-argument
-  '(("--no-grafts"   :char ?g)
-    ("--file"        :fun guix-read-file-name)
-    ("--root"        :fun guix-read-file-name)
-    ("--sources"     :char ?S :fun guix-read-source-type :switch? nil)
-    ("--with-source" :fun guix-read-file-name)))
-
-(guix-command-define-argument-improver
-    guix-command-improve-environment-argument
-  '(("--ad-hoc"
-     :name "--ad-hoc " :fun guix-read-package-names-string
-     :switch? nil :option? t)
-    ("--expose" :char ?E)
-    ("--share" :char ?S)
-    ("--load" :fun guix-read-file-name)))
-
-(guix-command-define-argument-improver
-    guix-command-improve-gc-argument
-  '(("--list-dead" :char ?D)
-    ("--list-live" :char ?L)
-    ("--referrers" :char ?f)
-    ("--verify"    :fun guix-read-verify-options-string)))
-
-(guix-command-define-argument-improver
-    guix-command-improve-graph-argument
-  '(("--type" :fun guix-read-graph-type)))
-
-(guix-command-define-argument-improver
-    guix-command-improve-import-argument
-  '(("cran" :char ?r)))
-
-(guix-command-define-argument-improver
-    guix-command-improve-import-elpa-argument
-  '(("--archive" :fun guix-read-elpa-archive)))
-
-(guix-command-define-argument-improver
-    guix-command-improve-lint-argument
-  '(("--checkers" :fun guix-read-lint-checker-names-string)))
-
-(guix-command-define-argument-improver
-    guix-command-improve-package-argument
-  ;; Unlike all other options, --install/--remove do not have a form
-  ;; '--install=foo,bar' but '--install foo bar' instead, so we need
-  ;; some tweaks.
-  '(("--install"
-     :name "--install " :fun guix-read-package-names-string
-     :switch? nil :option? t)
-    ("--remove"
-     :name "--remove "  :fun guix-read-package-names-string
-     :switch? nil :option? t)
-    ("--install-from-file" :fun guix-read-file-name)
-    ("--manifest"       :fun guix-read-file-name)
-    ("--profile"        :fun guix-read-file-name)
-    ("--do-not-upgrade" :char ?U)
-    ("--roll-back"      :char ?R)
-    ("--show"           :char ?w :fun guix-read-package-name)))
-
-(guix-command-define-argument-improver
-    guix-command-improve-refresh-argument
-  '(("--select"     :fun guix-read-refresh-subset)
-    ("--type"       :fun guix-read-refresh-updater-names-string)
-    ("--key-server" :char ?S)))
-
-(guix-command-define-argument-improver
-    guix-command-improve-size-argument
-  '(("--map-file" :fun guix-read-file-name)))
-
-(guix-command-define-argument-improver
-    guix-command-improve-system-argument
-  '(("disk-image"  :char ?D)
-    ("vm-image"    :char ?V)
-    ("--on-error"  :char ?E)
-    ("--no-grub"   :char ?g)
-    ("--full-boot" :char ?b)))
-
-(defvar guix-command-argument-improvers
-  '((()
-     guix-command-improve-action-argument)
-    (("archive")
-     guix-command-improve-common-build-argument
-     guix-command-improve-target-argument
-     guix-command-improve-system-type-argument
-     guix-command-improve-archive-argument)
-    (("build")
-     guix-command-improve-common-build-argument
-     guix-command-improve-target-argument
-     guix-command-improve-system-type-argument
-     guix-command-improve-build-argument)
-    (("download")
-     guix-command-improve-hash-argument)
-    (("hash")
-     guix-command-improve-hash-argument)
-    (("environment")
-     guix-command-improve-common-build-argument
-     guix-command-improve-search-paths-argument
-     guix-command-improve-system-type-argument
-     guix-command-improve-environment-argument)
-    (("gc")
-     guix-command-improve-gc-argument)
-    (("graph")
-     guix-command-improve-graph-argument)
-    (("import")
-     guix-command-improve-import-argument)
-    (("import" "gnu")
-     guix-command-improve-key-policy-argument)
-    (("import" "elpa")
-     guix-command-improve-import-elpa-argument)
-    (("lint")
-     guix-command-improve-lint-argument)
-    (("package")
-     guix-command-improve-common-build-argument
-     guix-command-improve-search-paths-argument
-     guix-command-improve-package-argument)
-    (("refresh")
-     guix-command-improve-key-policy-argument
-     guix-command-improve-refresh-argument)
-    (("size")
-     guix-command-improve-system-type-argument
-     guix-command-improve-substitute-urls-argument
-     guix-command-improve-size-argument)
-    (("system")
-     guix-command-improve-common-build-argument
-     guix-command-improve-system-argument))
-  "Alist of guix commands and argument improvers for them.")
-
-(defun guix-command-improve-argument (argument improvers)
-  "Return ARGUMENT modified with IMPROVERS."
-  (or (cl-some (lambda (improver)
-                 (funcall improver argument))
-               improvers)
-      argument))
-
-(defun guix-command-improve-arguments (arguments commands)
-  "Return ARGUMENTS for 'guix COMMANDS ...' modified for popup interface."
-  (let ((improvers (cons 'guix-command-improve-common-argument
-                         (guix-assoc-value guix-command-argument-improvers
-                                           commands))))
-    (mapcar (lambda (argument)
-              (guix-command-improve-argument argument improvers))
-            arguments)))
-
-(defun guix-command-parse-arguments (&optional commands)
-  "Return a list of parsed 'guix COMMANDS ...' arguments."
-  (with-temp-buffer
-    (insert (guix-help-string commands))
-    (let (args)
-      (guix-while-search guix-help-parse-option-regexp
-        (let* ((short (match-string-no-properties 1))
-               (name  (match-string-no-properties 2))
-               (arg   (match-string-no-properties 3))
-               (doc   (match-string-no-properties 4))
-               (char  (if short
-                          (elt short 1) ; short option letter
-                        (elt name 2))) ; first letter of the long option
-               ;; If "--foo=bar" or "--foo[=bar]" then it is 'option'.
-               (option? (not (string= "" arg)))
-               ;; If "--foo" or "--foo[=bar]" then it is 'switch'.
-               (switch? (or (string= "" arg)
-                            (eq ?\[ (elt arg 0)))))
-          (push (guix-command-make-argument
-                 :name    name
-                 :char    char
-                 :doc     doc
-                 :switch? switch?
-                 :option? option?)
-                args)))
-      (guix-while-search guix-help-parse-command-regexp
-        (let* ((name (match-string-no-properties 1))
-               (char (elt name 0)))
-          (push (guix-command-make-argument
-                 :name    name
-                 :char    char
-                 :fun     (guix-command-action-name commands name)
-                 :action? t)
-                args)))
-      args)))
-
-(defun guix-command-rest-argument (&optional commands)
-  "Return '--' argument for COMMANDS."
-  (cl-flet ((argument (&rest args)
-              (apply #'guix-command-make-argument
-                     :name "-- " :char ?= :option? t args)))
-    (let ((command (car commands)))
-      (cond
-       ((member command
-                '("archive" "build" "challenge" "edit"
-                  "graph" "lint" "refresh"))
-        (argument :doc "Packages" :fun 'guix-read-package-names-string))
-       ((equal commands '("container" "exec"))
-        (argument :doc "PID Command [Args...]"))
-       ((string= command "download")
-        (argument :doc "URL"))
-       ((string= command "environment")
-        (argument :doc "Command [Args...]" :fun 'read-shell-command))
-       ((string= command "gc")
-        (argument :doc "Paths" :fun 'guix-read-file-name))
-       ((member command '("hash" "system"))
-        (argument :doc "File" :fun 'guix-read-file-name))
-       ((string= command "size")
-        (argument :doc "Package" :fun 'guix-read-package-name))
-       ((equal commands '("import" "nix"))
-        (argument :doc "Nixpkgs Attribute"))
-       ;; Other 'guix import' subcommands, but not 'import' itself.
-       ((and (cdr commands)
-             (string= command "import"))
-        (argument :doc "Package name"))))))
-
-(defvar guix-command-additional-arguments
-  `((("environment")
-     ,(guix-command-make-argument
-       :name "++packages " :char ?p :option? t
-       :doc "build inputs of the specified packages"
-       :fun 'guix-read-package-names-string)))
-  "Alist of guix commands and additional arguments for them.
-These are 'fake' arguments that are not presented in 'guix' shell
-commands.")
-
-(defun guix-command-additional-arguments (&optional commands)
-  "Return additional arguments for COMMANDS."
-  (let ((rest-arg (guix-command-rest-argument commands)))
-    (append (guix-assoc-value guix-command-additional-arguments
-                              commands)
-            (and rest-arg (list rest-arg)))))
-
-;; Ideally only `guix-command-arguments' function should exist with the
-;; contents of `guix-command-all-arguments', but we need to make a
-;; special case for `guix-command-complex-with-shared-arguments' commands.
-
-(defun guix-command-all-arguments (&optional commands)
-  "Return list of all arguments for 'guix COMMANDS ...'."
-  (let ((parsed (guix-command-parse-arguments commands)))
-    (append (guix-command-improve-arguments parsed commands)
-            (guix-command-additional-arguments commands))))
-
-(guix-memoized-defalias guix-command-all-arguments-memoize
-  guix-command-all-arguments)
-
-(defun guix-command-arguments (&optional commands)
-  "Return list of arguments for 'guix COMMANDS ...'."
-  (let ((command (car commands)))
-    (if (member command
-                guix-command-complex-with-shared-arguments)
-        ;; Take actions only for 'guix system', and switches+options for
-        ;; 'guix system foo'.
-        (funcall (if (null (cdr commands))
-                     #'cl-remove-if-not
-                   #'cl-remove-if)
-                 #'guix-command-argument-action?
-                 (guix-command-all-arguments-memoize (list command)))
-      (guix-command-all-arguments commands))))
-
-(defun guix-command-switch->popup-switch (switch)
-  "Return popup switch from command SWITCH argument."
-  (list (guix-command-argument-char switch)
-        (or (guix-command-argument-doc switch)
-            "Unknown")
-        (guix-command-argument-name switch)))
-
-(defun guix-command-option->popup-option (option)
-  "Return popup option from command OPTION argument."
-  (list (guix-command-argument-char option)
-        (or (guix-command-argument-doc option)
-            "Unknown")
-        (let ((name (guix-command-argument-name option)))
-          (if (string-match-p " \\'" name) ; ends with space
-              name
-            (concat name "=")))
-        (or (guix-command-argument-fun option)
-            'read-from-minibuffer)))
-
-(defun guix-command-action->popup-action (action)
-  "Return popup action from command ACTION argument."
-  (list (guix-command-argument-char action)
-        (or (guix-command-argument-doc action)
-            (guix-command-argument-name action)
-            "Unknown")
-        (guix-command-argument-fun action)))
-
-(defun guix-command-sort-arguments (arguments)
-  "Sort ARGUMENTS by name in alphabetical order."
-  (sort arguments
-        (lambda (a1 a2)
-          (let ((name1 (guix-command-argument-name a1))
-                (name2 (guix-command-argument-name a2)))
-            (cond ((null name1) nil)
-                  ((null name2) t)
-                  (t (string< name1 name2)))))))
-
-(defun guix-command-switches (arguments)
-  "Return switches from ARGUMENTS."
-  (cl-remove-if-not #'guix-command-argument-switch? arguments))
-
-(defun guix-command-options (arguments)
-  "Return options from ARGUMENTS."
-  (cl-remove-if-not #'guix-command-argument-option? arguments))
-
-(defun guix-command-actions (arguments)
-  "Return actions from ARGUMENTS."
-  (cl-remove-if-not #'guix-command-argument-action? arguments))
-
-
-;;; Post processing popup arguments
-
-(defvar guix-command-post-processors
-  '(("environment"
-     guix-command-post-process-environment-packages
-     guix-command-post-process-environment-ad-hoc
-     guix-command-post-process-rest-multiple-leave)
-    ("hash"
-     guix-command-post-process-rest-single)
-    ("package"
-     guix-command-post-process-package-args)
-    ("system"
-     guix-command-post-process-rest-single))
-  "Alist of guix commands and functions for post-processing
-a list of arguments returned from popup interface.
-Each function is called on the returned arguments in turn.")
-
-(defvar guix-command-rest-arg-regexp
-  (rx string-start "-- " (group (+ any)))
-  "Regexp to match a string with the 'rest' arguments.")
-
-(defun guix-command-replace-args (args predicate modifier)
-  "Replace arguments matching PREDICATE from ARGS.
-Call MODIFIER on each argument matching PREDICATE and append the
-returned list of strings to the end of ARGS.  Remove the original
-arguments."
-  (let* ((rest nil)
-         (args (mapcar (lambda (arg)
-                         (if (funcall predicate arg)
-                             (progn
-                               (push (funcall modifier arg) rest)
-                               nil)
-                           arg))
-                       args)))
-    (if rest
-        (apply #'append (delq nil args) rest)
-      args)))
-
-(cl-defun guix-command-post-process-matching-args (args regexp
-                                                   &key group split?)
-  "Modify arguments from ARGS matching REGEXP by moving them to
-the end of ARGS list.  If SPLIT? is non-nil, split matching
-arguments into multiple subarguments."
-  (guix-command-replace-args
-   args
-   (lambda (arg)
-     (string-match regexp arg))
-   (lambda (arg)
-     (let ((val (match-string (or group 0) arg))
-           (fun (if split? #'split-string #'list)))
-       (funcall fun val)))))
-
-(defun guix-command-post-process-rest-single (args)
-  "Modify ARGS by moving '-- ARG' argument to the end of ARGS list."
-  (guix-command-post-process-matching-args
-   args guix-command-rest-arg-regexp
-   :group 1))
-
-(defun guix-command-post-process-rest-multiple (args)
-  "Modify ARGS by splitting '-- ARG ...' into multiple subarguments
-and moving them to the end of ARGS list.
-Remove '-- ' string."
-  (guix-command-post-process-matching-args
-   args guix-command-rest-arg-regexp
-   :group 1
-   :split? t))
-
-(defun guix-command-post-process-rest-multiple-leave (args)
-  "Modify ARGS by splitting '-- ARG ...' into multiple subarguments
-and moving them to the end of ARGS list.
-Leave '--' string as a separate argument."
-  (guix-command-post-process-matching-args
-   args guix-command-rest-arg-regexp
-   :split? t))
-
-(defun guix-command-post-process-package-args (args)
-  "Adjust popup ARGS for 'guix package' command."
-  (guix-command-post-process-matching-args
-   args (rx string-start (or "--install " "--remove ") (+ any))
-   :split? t))
-
-(defun guix-command-post-process-environment-packages (args)
-  "Adjust popup ARGS for specified packages of 'guix environment'
-command."
-  (guix-command-post-process-matching-args
-   args (rx string-start "++packages " (group (+ any)))
-   :group 1
-   :split? t))
-
-(defun guix-command-post-process-environment-ad-hoc (args)
-  "Adjust popup ARGS for '--ad-hoc' argument of 'guix environment'
-command."
-  (guix-command-post-process-matching-args
-   args (rx string-start "--ad-hoc " (+ any))
-   :split? t))
-
-(defun guix-command-post-process-args (commands args)
-  "Adjust popup ARGS for guix COMMANDS."
-  (let* ((command (car commands))
-         (processors
-          (append (guix-assoc-value guix-command-post-processors commands)
-                  (guix-assoc-value guix-command-post-processors command))))
-    (guix-modify args
-                 (or processors
-                     (list #'guix-command-post-process-rest-multiple)))))
-
-
-;;; 'Execute' actions
-
-(defvar guix-command-default-execute-arguments
-  (list
-   (guix-command-make-argument
-    :name "repl"  :char ?r :doc "Run in Guix REPL")
-   (guix-command-make-argument
-    :name "shell" :char ?s :doc "Run in shell")
-   (guix-command-make-argument
-    :name "copy"  :char ?c :doc "Copy command line"))
-  "List of default 'execute' action arguments.")
-
-(defvar guix-command-additional-execute-arguments
-  (let ((graph-arg (guix-command-make-argument
-                    :name "view" :char ?v :doc "View graph")))
-    `((("build")
-       ,(guix-command-make-argument
-         :name "log" :char ?l :doc "View build log"))
-      (("graph") ,graph-arg)
-      (("size")
-       ,(guix-command-make-argument
-         :name "view" :char ?v :doc "View map"))
-      (("system" "shepherd-graph") ,graph-arg)
-      (("system" "extension-graph") ,graph-arg)))
-  "Alist of guix commands and additional 'execute' action arguments.")
-
-(defun guix-command-execute-arguments (commands)
-  "Return a list of 'execute' action arguments for COMMANDS."
-  (mapcar (lambda (arg)
-            (guix-command-modify-argument arg
-              :action? t
-              :fun (guix-command-action-name
-                    commands (guix-command-argument-name arg))))
-          (append guix-command-default-execute-arguments
-                  (guix-assoc-value
-                   guix-command-additional-execute-arguments commands))))
-
-(defvar guix-command-special-executors
-  '((("environment")
-     ("repl" . guix-run-environment-command-in-repl))
-    (("pull")
-     ("repl" . guix-run-pull-command-in-repl))
-    (("build")
-     ("log" . guix-run-view-build-log))
-    (("graph")
-     ("view" . guix-run-view-graph))
-    (("size")
-     ("view" . guix-run-view-size-map))
-    (("system" "shepherd-graph")
-     ("view" . guix-run-view-graph))
-    (("system" "extension-graph")
-     ("view" . guix-run-view-graph)))
-  "Alist of guix commands and alists of special executers for them.
-See also `guix-command-default-executors'.")
-
-(defvar guix-command-default-executors
-  '(("repl"  . guix-run-command-in-repl)
-    ("shell" . guix-run-command-in-shell)
-    ("copy"  . guix-copy-command-as-kill))
-  "Alist of default executers for action names.")
-
-(defun guix-command-executor (commands name)
-  "Return function to run command line arguments for guix COMMANDS."
-  (or (guix-assoc-value guix-command-special-executors commands name)
-      (guix-assoc-value guix-command-default-executors name)))
-
-(defun guix-run-environment-command-in-repl (args)
-  "Run 'guix ARGS ...' environment command in Guix REPL."
-  ;; As 'guix environment' usually tries to run another process, it may
-  ;; be fun but not wise to run this command in Geiser REPL.
-  (when (or (member "--dry-run" args)
-            (member "--search-paths" args)
-            (when (y-or-n-p
-                   (format "'%s' command will spawn an external process.
-Do you really want to execute this command in Geiser REPL? "
-                           (guix-command-string args)))
-              (message "May \"M-x shell-mode\" be with you!")
-              t))
-    (guix-run-command-in-repl args)))
-
-(defun guix-run-pull-command-in-repl (args)
-  "Run 'guix ARGS ...' pull command in Guix REPL.
-Perform pull-specific actions after operation, see
-`guix-after-pull-hook' and `guix-update-after-pull'."
-  (guix-eval-in-repl
-   (apply #'guix-make-guile-expression 'guix-command args)
-   nil 'pull))
-
-(defun guix-run-view-build-log (args)
-  "Add --log-file to ARGS, run 'guix ARGS ...' build command, and
-open the log file(s)."
-  (let* ((args (if (member "--log-file" args)
-                   args
-                 (cl-list* (car args) "--log-file" (cdr args))))
-         (output (guix-command-output args))
-         (files  (split-string output "\n" t)))
-    (dolist (file files)
-      (guix-build-log-find-file file))))
-
-(defun guix-run-view-graph (args)
-  "Run 'guix ARGS ...' graph command, make the image and open it."
-  (let* ((graph-file (guix-dot-file-name))
-         (dot-args   (guix-dot-arguments graph-file)))
-    (if (guix-eval-read (guix-make-guile-expression
-                         'pipe-guix-output args dot-args))
-        (guix-find-file graph-file)
-      (error "Couldn't create a graph"))))
-
-(defun guix-run-view-size-map (args)
-  "Run 'guix ARGS ...' size command, and open the map file."
-  (let* ((wished-map-file
-          (cl-some (lambda (arg)
-                     (and (string-match "--map-file=\\(.+\\)" arg)
-                          (match-string 1 arg)))
-                   args))
-         (map-file (or wished-map-file (guix-png-file-name)))
-         (args (if wished-map-file
-                   args
-                 (cl-list* (car args)
-                           (concat "--map-file=" map-file)
-                           (cdr args)))))
-    (guix-command-output args)
-    (guix-find-file map-file)))
-
-
-;;; Generating popups, actions, etc.
-
-(defmacro guix-command-define-popup-action (name &optional commands)
-  "Define NAME function to generate (if needed) and run popup for COMMANDS."
-  (declare (indent 1) (debug t))
-  (let* ((popup-fun (guix-command-symbol `(,@commands "popup")))
-         (doc (format "Call `%s' (generate it if needed)."
-                      popup-fun)))
-    `(defun ,name (&optional arg)
-       ,doc
-       (interactive "P")
-       (unless (fboundp ',popup-fun)
-         (guix-command-generate-popup ',popup-fun ',commands))
-       (,popup-fun arg))))
-
-(defmacro guix-command-define-execute-action (name executor
-                                                   &optional commands)
-  "Define NAME function to execute the current action for guix COMMANDS.
-EXECUTOR function is called with the current command line arguments."
-  (declare (indent 1) (debug t))
-  (let* ((arguments-fun (guix-command-symbol `(,@commands "arguments")))
-         (doc (format "Call `%s' with the current popup arguments."
-                      executor)))
-    `(defun ,name (&rest args)
-       ,doc
-       (interactive (,arguments-fun))
-       (,executor (append ',commands
-                          (guix-command-post-process-args
-                           ',commands args))))))
-
-(defun guix-command-generate-popup-actions (actions &optional commands)
-  "Generate 'popup' commands from ACTIONS arguments for guix COMMANDS."
-  (dolist (action actions)
-    (let ((fun (guix-command-argument-fun action)))
-      (unless (fboundp fun)
-        (eval `(guix-command-define-popup-action ,fun
-                 ,(append commands
-                          (list (guix-command-argument-name action)))))))))
-
-(defun guix-command-generate-execute-actions (actions &optional commands)
-  "Generate 'execute' commands from ACTIONS arguments for guix COMMANDS."
-  (dolist (action actions)
-    (let ((fun (guix-command-argument-fun action)))
-      (unless (fboundp fun)
-        (eval `(guix-command-define-execute-action ,fun
-                 ,(guix-command-executor
-                   commands (guix-command-argument-name action))
-                 ,commands))))))
-
-(defun guix-command-generate-popup (name &optional commands)
-  "Define NAME popup with 'guix COMMANDS ...' interface."
-  (let* ((command  (car commands))
-         (man-page (concat "guix" (and command (concat "-" command))))
-         (doc      (format "Popup window for '%s' command."
-                           (guix-concat-strings (cons "guix" commands)
-                                                " ")))
-         (args     (guix-command-arguments commands))
-         (switches (guix-command-sort-arguments
-                    (guix-command-switches args)))
-         (options  (guix-command-sort-arguments
-                    (guix-command-options args)))
-         (popup-actions (guix-command-sort-arguments
-                         (guix-command-actions args)))
-         (execute-actions (unless popup-actions
-                            (guix-command-execute-arguments commands)))
-         (actions (or popup-actions execute-actions)))
-    (if popup-actions
-        (guix-command-generate-popup-actions popup-actions commands)
-      (guix-command-generate-execute-actions execute-actions commands))
-    (eval
-     `(guix-define-popup ,name
-        ,doc
-        'guix-commands
-        :man-page ,man-page
-        :switches ',(mapcar #'guix-command-switch->popup-switch switches)
-        :options  ',(mapcar #'guix-command-option->popup-option options)
-        :actions  ',(mapcar #'guix-command-action->popup-action actions)
-        :max-action-columns 4))))
-
-;;;###autoload (autoload 'guix "guix-command" "Popup window for 'guix'." t)
-(guix-command-define-popup-action guix)
-
-(defalias 'guix-edit-action #'guix-edit)
-
-
-(defvar guix-command-font-lock-keywords
-  (eval-when-compile
-    `((,(rx "("
-            (group "guix-command-define-"
-                   (or "popup-action"
-                       "execute-action"
-                       "argument-improver"))
-            symbol-end
-            (zero-or-more blank)
-            (zero-or-one
-             (group (one-or-more (or (syntax word) (syntax symbol))))))
-       (1 font-lock-keyword-face)
-       (2 font-lock-function-name-face nil t)))))
-
-(font-lock-add-keywords 'emacs-lisp-mode guix-command-font-lock-keywords)
-
-(provide 'guix-command)
-
-;;; guix-command.el ends here
diff --git a/emacs/guix-config.el.in b/emacs/guix-config.el.in
deleted file mode 100644
index c09c2fe86a..0000000000
--- a/emacs/guix-config.el.in
+++ /dev/null
@@ -1,44 +0,0 @@
-;;; guix-config.el --- Compile-time configuration of Guix.
-
-;; Copyright © 2015 Mathieu Lirzin <mthl@openmailbox.org>
-;; Copyright © 2015, 2016 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Code:
-
-(defconst guix-config-name "@PACKAGE_NAME@"
-  "Guix full name.")
-
-(defconst guix-config-version "@PACKAGE_VERSION@"
-  "Guix version.")
-
-(defconst guix-config-emacs-interface-directory
-  (replace-regexp-in-string "${prefix}" "@prefix@" "@emacsuidir@"))
-
-(defconst guix-config-state-directory
-  ;; This must match `NIX_STATE_DIR' as defined in `nix/local.mk'.
-  (or (getenv "NIX_STATE_DIR") "@guix_localstatedir@/guix"))
-
-(defconst guix-config-guile-program "@GUILE@"
-  "Name of the 'guile' executable defined at configure time.")
-
-(defconst guix-config-dot-program "@DOT_USER_PROGRAM@"
-  "Name of the 'dot' executable defined at configure time.")
-
-(provide 'guix-config)
-
-;;; guix-config.el ends here
diff --git a/emacs/guix-devel.el b/emacs/guix-devel.el
deleted file mode 100644
index b71670cdfb..0000000000
--- a/emacs/guix-devel.el
+++ /dev/null
@@ -1,382 +0,0 @@
-;;; guix-devel.el --- Development tools   -*- lexical-binding: t -*-
-
-;; Copyright © 2015 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides commands useful for developing Guix (or even
-;; arbitrary Guile code) with Geiser.
-
-;;; Code:
-
-(require 'lisp-mode)
-(require 'guix-guile)
-(require 'guix-geiser)
-(require 'guix-utils)
-(require 'guix-base)
-
-(defgroup guix-devel nil
-  "Settings for Guix development utils."
-  :group 'guix)
-
-(defgroup guix-devel-faces nil
-  "Faces for `guix-devel-mode'."
-  :group 'guix-devel
-  :group 'guix-faces)
-
-(defface guix-devel-modify-phases-keyword
-  '((t :inherit font-lock-preprocessor-face))
-  "Face for a `modify-phases' keyword ('delete', 'replace', etc.)."
-  :group 'guix-devel-faces)
-
-(defface guix-devel-gexp-symbol
-  '((t :inherit font-lock-keyword-face))
-  "Face for gexp symbols ('#~', '#$', etc.).
-See Info node `(guix) G-Expressions'."
-  :group 'guix-devel-faces)
-
-(defcustom guix-devel-activate-mode t
-  "If non-nil, then `guix-devel-mode' is automatically activated
-in Scheme buffers."
-  :type 'boolean
-  :group 'guix-devel)
-
-(defun guix-devel-use-modules (&rest modules)
-  "Use guile MODULES."
-  (apply #'guix-geiser-call "use-modules" modules))
-
-(defun guix-devel-use-module (&optional module)
-  "Use guile MODULE in the current Geiser REPL.
-MODULE is a string with the module name - e.g., \"(ice-9 match)\".
-Interactively, use the module defined by the current scheme file."
-  (interactive (list (guix-guile-current-module)))
-  (guix-devel-use-modules module)
-  (message "Using %s module." module))
-
-(defun guix-devel-copy-module-as-kill ()
-  "Put the name of the current guile module into `kill-ring'."
-  (interactive)
-  (guix-copy-as-kill (guix-guile-current-module)))
-
-(defun guix-devel-setup-repl (&optional repl)
-  "Setup REPL for using `guix-devel-...' commands."
-  (guix-devel-use-modules "(guix monad-repl)"
-                          "(guix scripts)"
-                          "(guix store)"
-                          "(guix ui)")
-  ;; Without this workaround, the warning/build output disappears.  See
-  ;; <https://github.com/jaor/geiser/issues/83> for details.
-  (guix-geiser-eval-in-repl-synchronously
-   "(begin
-      (guix-warning-port (current-warning-port))
-      (current-build-output-port (current-error-port)))"
-   repl 'no-history 'no-display))
-
-(defvar guix-devel-repl-processes nil
-  "List of REPL processes configured by `guix-devel-setup-repl'.")
-
-(defun guix-devel-setup-repl-maybe (&optional repl)
-  "Setup (if needed) REPL for using `guix-devel-...' commands."
-  (let ((process (get-buffer-process (or repl (guix-geiser-repl)))))
-    (when (and process
-               (not (memq process guix-devel-repl-processes)))
-      (guix-devel-setup-repl repl)
-      (push process guix-devel-repl-processes))))
-
-(defmacro guix-devel-with-definition (def-var &rest body)
-  "Run BODY with the current guile definition bound to DEF-VAR.
-Bind DEF-VAR variable to the name of the current top-level
-definition, setup the current REPL, use the current module, and
-run BODY."
-  (declare (indent 1) (debug (symbolp body)))
-  `(let ((,def-var (guix-guile-current-definition)))
-     (guix-devel-setup-repl-maybe)
-     (guix-devel-use-modules (guix-guile-current-module))
-     ,@body))
-
-(defun guix-devel-build-package-definition ()
-  "Build a package defined by the current top-level variable definition."
-  (interactive)
-  (guix-devel-with-definition def
-    (when (or (not guix-operation-confirm)
-              (guix-operation-prompt (format "Build '%s'?" def)))
-      (guix-geiser-eval-in-repl
-       (concat ",run-in-store "
-               (guix-guile-make-call-expression
-                "build-package" def
-                "#:use-substitutes?" (guix-guile-boolean
-                                      guix-use-substitutes)
-                "#:dry-run?" (guix-guile-boolean guix-dry-run)))))))
-
-(defun guix-devel-build-package-source ()
-  "Build the source of the current package definition."
-  (interactive)
-  (guix-devel-with-definition def
-    (when (or (not guix-operation-confirm)
-              (guix-operation-prompt
-               (format "Build '%s' package source?" def)))
-      (guix-geiser-eval-in-repl
-       (concat ",run-in-store "
-               (guix-guile-make-call-expression
-                "build-package-source" def
-                "#:use-substitutes?" (guix-guile-boolean
-                                      guix-use-substitutes)
-                "#:dry-run?" (guix-guile-boolean guix-dry-run)))))))
-
-(defun guix-devel-lint-package ()
-  "Check the current package.
-See Info node `(guix) Invoking guix lint' for details."
-  (interactive)
-  (guix-devel-with-definition def
-    (guix-devel-use-modules "(guix scripts lint)")
-    (when (or (not guix-operation-confirm)
-              (y-or-n-p (format "Lint '%s' package?" def)))
-      (guix-geiser-eval-in-repl
-       (format "(run-checkers %s)" def)))))
-
-
-;;; Font-lock
-
-(defvar guix-devel-modify-phases-keyword-regexp
-  (rx (+ word))
-  "Regexp for a 'modify-phases' keyword ('delete', 'replace', etc.).")
-
-(defun guix-devel-modify-phases-font-lock-matcher (limit)
-  "Find a 'modify-phases' keyword.
-This function is used as a MATCHER for `font-lock-keywords'."
-  (ignore-errors
-    (down-list)
-    (or (re-search-forward guix-devel-modify-phases-keyword-regexp
-                           limit t)
-        (set-match-data nil))
-    (up-list)
-    t))
-
-(defun guix-devel-modify-phases-font-lock-pre ()
-  "Skip the next sexp, and return the end point of the current list.
-This function is used as a PRE-MATCH-FORM for `font-lock-keywords'
-to find 'modify-phases' keywords."
-  (let ((in-comment? (nth 4 (syntax-ppss))))
-    ;; If 'modify-phases' is commented, do not try to search for its
-    ;; keywords.
-    (unless in-comment?
-      (ignore-errors (forward-sexp))
-      (save-excursion (up-list) (point)))))
-
-(defconst guix-devel-keywords
-  '("call-with-compressed-output-port"
-    "call-with-container"
-    "call-with-decompressed-port"
-    "call-with-derivation-narinfo"
-    "call-with-derivation-substitute"
-    "call-with-error-handling"
-    "call-with-temporary-directory"
-    "call-with-temporary-output-file"
-    "define-enumerate-type"
-    "define-gexp-compiler"
-    "define-lift"
-    "define-monad"
-    "define-operation"
-    "define-record-type*"
-    "emacs-substitute-sexps"
-    "emacs-substitute-variables"
-    "mbegin"
-    "mlet"
-    "mlet*"
-    "modify-services"
-    "munless"
-    "mwhen"
-    "run-with-state"
-    "run-with-store"
-    "signature-case"
-    "substitute*"
-    "substitute-keyword-arguments"
-    "test-assertm"
-    "use-package-modules"
-    "use-service-modules"
-    "use-system-modules"
-    "with-atomic-file-output"
-    "with-atomic-file-replacement"
-    "with-derivation-narinfo"
-    "with-derivation-substitute"
-    "with-directory-excursion"
-    "with-error-handling"
-    "with-imported-modules"
-    "with-monad"
-    "with-mutex"
-    "with-store"))
-
-(defvar guix-devel-font-lock-keywords
-  `((,(rx (or "#~" "#$" "#$@" "#+" "#+@")) .
-     'guix-devel-gexp-symbol)
-    (,(guix-guile-keyword-regexp (regexp-opt guix-devel-keywords))
-     (1 'font-lock-keyword-face))
-    (,(guix-guile-keyword-regexp "modify-phases")
-     (1 'font-lock-keyword-face)
-     (guix-devel-modify-phases-font-lock-matcher
-      (guix-devel-modify-phases-font-lock-pre)
-      nil
-      (0 'guix-devel-modify-phases-keyword nil t))))
-  "A list of `font-lock-keywords' for `guix-devel-mode'.")
-
-
-;;; Indentation
-
-(defmacro guix-devel-scheme-indent (&rest rules)
-  "Set `scheme-indent-function' according to RULES.
-Each rule should have a form (SYMBOL VALUE).  See `put' for details."
-  (declare (indent 0))
-  `(progn
-     ,@(mapcar (lambda (rule)
-                 `(put ',(car rule) 'scheme-indent-function ,(cadr rule)))
-               rules)))
-
-(defun guix-devel-indent-package (state indent-point normal-indent)
-  "Indentation rule for 'package' form."
-  (let* ((package-eol (line-end-position))
-         (count (if (and (ignore-errors (down-list) t)
-                         (< (point) package-eol)
-                         (looking-at "inherit\\>"))
-                    1
-                  0)))
-    (lisp-indent-specform count state indent-point normal-indent)))
-
-(defun guix-devel-indent-modify-phases-keyword (count)
-  "Return indentation function for 'modify-phases' keywords."
-  (lambda (state indent-point normal-indent)
-    (when (ignore-errors
-            (goto-char (nth 1 state))   ; start of keyword sexp
-            (backward-up-list)
-            (looking-at "(modify-phases\\>"))
-      (lisp-indent-specform count state indent-point normal-indent))))
-
-(defalias 'guix-devel-indent-modify-phases-keyword-1
-  (guix-devel-indent-modify-phases-keyword 1))
-(defalias 'guix-devel-indent-modify-phases-keyword-2
-  (guix-devel-indent-modify-phases-keyword 2))
-
-(guix-devel-scheme-indent
-  (bag 0)
-  (build-system 0)
-  (call-with-compressed-output-port 2)
-  (call-with-container 1)
-  (call-with-decompressed-port 2)
-  (call-with-error-handling 0)
-  (container-excursion 1)
-  (emacs-batch-edit-file 1)
-  (emacs-batch-eval 0)
-  (emacs-substitute-sexps 1)
-  (emacs-substitute-variables 1)
-  (file-system 0)
-  (graft 0)
-  (manifest-entry 0)
-  (manifest-pattern 0)
-  (mbegin 1)
-  (mlet 2)
-  (mlet* 2)
-  (modify-phases 1)
-  (modify-services 1)
-  (munless 1)
-  (mwhen 1)
-  (operating-system 0)
-  (origin 0)
-  (package 'guix-devel-indent-package)
-  (run-with-state 1)
-  (run-with-store 1)
-  (signature-case 1)
-  (substitute* 1)
-  (substitute-keyword-arguments 1)
-  (test-assertm 1)
-  (with-atomic-file-output 1)
-  (with-derivation-narinfo 1)
-  (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)
-  (wrap-program 1)
-
-  ;; 'modify-phases' keywords:
-  (replace    'guix-devel-indent-modify-phases-keyword-1)
-  (add-after  'guix-devel-indent-modify-phases-keyword-2)
-  (add-before 'guix-devel-indent-modify-phases-keyword-2))
-
-
-(defvar guix-devel-keys-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map (kbd "b") 'guix-devel-build-package-definition)
-    (define-key map (kbd "s") 'guix-devel-build-package-source)
-    (define-key map (kbd "l") 'guix-devel-lint-package)
-    (define-key map (kbd "k") 'guix-devel-copy-module-as-kill)
-    (define-key map (kbd "u") 'guix-devel-use-module)
-    map)
-  "Keymap with subkeys for `guix-devel-mode-map'.")
-
-(defvar guix-devel-mode-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map (kbd "C-c .") guix-devel-keys-map)
-    map)
-  "Keymap for `guix-devel-mode'.")
-
-;;;###autoload
-(define-minor-mode guix-devel-mode
-  "Minor mode for `scheme-mode' buffers.
-
-With a prefix argument ARG, enable the mode if ARG is positive,
-and disable it otherwise.  If called from Lisp, enable the mode
-if ARG is omitted or nil.
-
-When Guix Devel mode is enabled, it provides the following key
-bindings:
-
-\\{guix-devel-mode-map}"
-  :init-value nil
-  :lighter " Guix"
-  :keymap guix-devel-mode-map
-  (if guix-devel-mode
-      (progn
-        (setq-local font-lock-multiline t)
-        (font-lock-add-keywords nil guix-devel-font-lock-keywords))
-    (setq-local font-lock-multiline nil)
-    (font-lock-remove-keywords nil guix-devel-font-lock-keywords))
-  (when font-lock-mode
-    (font-lock-fontify-buffer)))
-
-;;;###autoload
-(defun guix-devel-activate-mode-maybe ()
-  "Activate `guix-devel-mode' depending on
-`guix-devel-activate-mode' variable."
-  (when guix-devel-activate-mode
-    (guix-devel-mode)))
-
-;;;###autoload
-(add-hook 'scheme-mode-hook 'guix-devel-activate-mode-maybe)
-
-
-(defvar guix-devel-emacs-font-lock-keywords
-  (eval-when-compile
-    `((,(rx "(" (group "guix-devel-with-definition") symbol-end) . 1))))
-
-(font-lock-add-keywords 'emacs-lisp-mode
-                        guix-devel-emacs-font-lock-keywords)
-
-(provide 'guix-devel)
-
-;;; guix-devel.el ends here
diff --git a/emacs/guix-entry.el b/emacs/guix-entry.el
deleted file mode 100644
index 5eed2ed015..0000000000
--- a/emacs/guix-entry.el
+++ /dev/null
@@ -1,59 +0,0 @@
-;;; guix-entry.el --- 'Entry' type  -*- lexical-binding: t -*-
-
-;; Copyright © 2015 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides an API for 'entry' type which is just an alist of
-;; KEY/VALUE pairs (KEY should be a symbol) with the required 'id' KEY.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'guix-utils)
-
-(defalias 'guix-entry-value #'guix-assq-value)
-
-(defun guix-entry-id (entry)
-  "Return ENTRY ID."
-  (guix-entry-value entry 'id))
-
-(defun guix-entry-by-id (id entries)
-  "Return an entry from ENTRIES by its ID."
-  (cl-find-if (lambda (entry)
-                (equal (guix-entry-id entry) id))
-              entries))
-
-(defun guix-entries-by-ids (ids entries)
-  "Return entries with IDS (a list of identifiers) from ENTRIES."
-  (cl-remove-if-not (lambda (entry)
-                      (member (guix-entry-id entry) ids))
-                    entries))
-
-(defun guix-replace-entry (id new-entry entries)
-  "Replace an entry with ID from ENTRIES by NEW-ENTRY.
-Return a list of entries with the replaced entry."
-  (cl-substitute-if new-entry
-                    (lambda (entry)
-                      (equal id (guix-entry-id entry)))
-                    entries
-                    :count 1))
-
-(provide 'guix-entry)
-
-;;; guix-entry.el ends here
diff --git a/emacs/guix-external.el b/emacs/guix-external.el
deleted file mode 100644
index f571ffd845..0000000000
--- a/emacs/guix-external.el
+++ /dev/null
@@ -1,88 +0,0 @@
-;;; guix-external.el --- External programs  -*- lexical-binding: t -*-
-
-;; Copyright © 2015 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides auxiliary code for running external programs.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'guix-config)
-
-(defgroup guix-external nil
-  "Settings for external programs."
-  :group 'guix)
-
-(defcustom guix-guile-program guix-config-guile-program
-  "Name of the 'guile' executable used for Guix REPL.
-May be either a string (the name of the executable) or a list of
-strings of the form:
-
-  (NAME . ARGS)
-
-Where ARGS is a list of arguments to the guile program."
-  :type 'string
-  :group 'guix-external)
-
-(defcustom guix-dot-program
-  (if (file-name-absolute-p guix-config-dot-program)
-      guix-config-dot-program
-    (executable-find "dot"))
-  "Name of the 'dot' executable."
-  :type 'string
-  :group 'guix-external)
-
-(defcustom guix-dot-default-arguments
-  '("-Tpng")
-  "Default arguments for 'dot' program."
-  :type '(repeat string)
-  :group 'guix-external)
-
-(defcustom guix-dot-file-name-function #'guix-png-file-name
-  "Function used to define a file name of a temporary 'dot' file.
-The function is called without arguments."
-  :type '(choice (function-item guix-png-file-name)
-                 (function :tag "Other function"))
-  :group 'guix-external)
-
-(defun guix-dot-arguments (output-file &rest args)
-  "Return a list of dot arguments for writing a graph into OUTPUT-FILE.
-If ARGS is nil, use `guix-dot-default-arguments'."
-  (or guix-dot-program
-      (error (concat "Couldn't find 'dot'.\n"
-                     "Set guix-dot-program to a proper value")))
-  (cl-list* guix-dot-program
-            (concat "-o" output-file)
-            (or args guix-dot-default-arguments)))
-
-(defun guix-dot-file-name ()
-  "Call `guix-dot-file-name-function'."
-  (funcall guix-dot-file-name-function))
-
-(defun guix-png-file-name ()
-  "Return '.png' file name in the `temporary-file-directory'."
-  (concat (make-temp-name
-           (concat (file-name-as-directory temporary-file-directory)
-                   "guix-emacs-graph-"))
-          ".png"))
-
-(provide 'guix-external)
-
-;;; guix-external.el ends here
diff --git a/emacs/guix-geiser.el b/emacs/guix-geiser.el
deleted file mode 100644
index 833f5bb2b3..0000000000
--- a/emacs/guix-geiser.el
+++ /dev/null
@@ -1,126 +0,0 @@
-;;; guix-geiser.el --- Interacting with Geiser   -*- lexical-binding: t -*-
-
-;; Copyright © 2015 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides functions to evaluate guile code using Geiser.
-
-;;; Code:
-
-(require 'geiser-mode)
-(require 'guix-guile)
-
-(defun guix-geiser-repl ()
-  "Return the current Geiser REPL."
-  (or geiser-repl--repl
-      (geiser-repl--repl/impl 'guile)
-      (error "Geiser REPL not found")))
-
-(defun guix-geiser-eval (str &optional repl)
-  "Evaluate STR with guile expression using Geiser REPL.
-If REPL is nil, use the current Geiser REPL.
-Return a list of strings with result values of evaluation."
-  (with-current-buffer (or repl (guix-geiser-repl))
-    (let ((res (geiser-eval--send/wait `(:eval (:scm ,str)))))
-      (if (geiser-eval--retort-error res)
-          (error "Error in evaluating guile expression: %s"
-                 (geiser-eval--retort-output res))
-        (cdr (assq 'result res))))))
-
-(defun guix-geiser-eval-read (str &optional repl)
-  "Evaluate STR with guile expression using Geiser REPL.
-Return elisp expression of the first result value of evaluation."
-  ;; The goal is to convert a string with scheme expression into elisp
-  ;; expression.
-  (let ((result (car (guix-geiser-eval str repl))))
-    (cond
-     ((or (string= result "#f")
-          (string= result "#<unspecified>"))
-      nil)
-     ((string= result "#t")
-      t)
-     (t
-      (read (replace-regexp-in-string
-             "[ (]\\(#f\\)" "nil"
-             (replace-regexp-in-string
-              "[ (]\\(#t\\)" "t"
-              result
-              nil nil 1)
-             nil nil 1))))))
-
-(defun guix-repl-send (cmd &optional save-history)
-  "Send CMD input string to the current REPL buffer.
-This is the same as `geiser-repl--send', but with SAVE-HISTORY
-argument.  If SAVE-HISTORY is non-nil, save CMD in the REPL
-history."
-  (when (and cmd (eq major-mode 'geiser-repl-mode))
-    (geiser-repl--prepare-send)
-    (goto-char (point-max))
-    (comint-kill-input)
-    (insert cmd)
-    (let ((comint-input-filter (if save-history
-                                   comint-input-filter
-                                 'ignore)))
-      (comint-send-input nil t))))
-
-(defun guix-geiser-eval-in-repl (str &optional repl no-history no-display)
-  "Switch to Geiser REPL and evaluate STR with guile expression there.
-If NO-HISTORY is non-nil, do not save STR in the REPL history.
-If NO-DISPLAY is non-nil, do not switch to the REPL buffer."
-  (let ((repl (or repl (guix-geiser-repl))))
-    (with-current-buffer repl
-      ;; XXX Since Geiser 0.8, `geiser-repl--send' has SAVE-HISTORY
-      ;; argument, so use this function eventually and remove
-      ;; `guix-repl-send'.
-      (guix-repl-send str (not no-history)))
-    (unless no-display
-      (geiser-repl--switch-to-buffer repl))))
-
-(defun guix-geiser-eval-in-repl-synchronously (str &optional repl
-                                                   no-history no-display)
-  "Evaluate STR in Geiser REPL synchronously, i.e. wait until the
-REPL operation will be finished.
-See `guix-geiser-eval-in-repl' for the meaning of arguments."
-  (let* ((repl (if repl (get-buffer repl) (guix-geiser-repl)))
-         (running? nil)
-         (filter (lambda (output)
-                   (setq running?
-                         (and (get-buffer-process repl)
-                              (not (guix-guile-prompt? output))))))
-         (comint-output-filter-functions
-          (cons filter comint-output-filter-functions)))
-    (guix-geiser-eval-in-repl str repl no-history no-display)
-    (while running?
-      (sleep-for 0.1))))
-
-(defun guix-geiser-call (proc &rest args)
-  "Call (PROC ARGS ...) synchronously using the current Geiser REPL.
-PROC and ARGS should be strings."
-  (guix-geiser-eval
-   (apply #'guix-guile-make-call-expression proc args)))
-
-(defun guix-geiser-call-in-repl (proc &rest args)
-  "Call (PROC ARGS ...) in the current Geiser REPL.
-PROC and ARGS should be strings."
-  (guix-geiser-eval-in-repl
-   (apply #'guix-guile-make-call-expression proc args)))
-
-(provide 'guix-geiser)
-
-;;; guix-geiser.el ends here
diff --git a/emacs/guix-guile.el b/emacs/guix-guile.el
deleted file mode 100644
index 792f825ca5..0000000000
--- a/emacs/guix-guile.el
+++ /dev/null
@@ -1,98 +0,0 @@
-;;; guix-guile.el --- Auxiliary tools for working with guile code   -*- lexical-binding: t -*-
-
-;; Copyright © 2015 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides functions for parsing guile code, making guile
-;; expressions, etc.
-
-;;; Code:
-
-(require 'geiser-guile)
-
-(defvar guix-guile-definition-regexp
-  (rx bol "(define"
-      (zero-or-one "*")
-      (zero-or-one "-public")
-      (one-or-more space)
-      (zero-or-one "(")
-      (group (one-or-more (or word (syntax symbol)))))
-  "Regexp used to find the guile definition.")
-
-(defun guix-guile-current-definition ()
-  "Return string with name of the current top-level guile definition."
-  (save-excursion
-    (beginning-of-defun)
-    (if (looking-at guix-guile-definition-regexp)
-        (match-string-no-properties 1)
-      (error "Couldn't find the current definition"))))
-
-(defun guix-guile-current-module ()
-  "Return a string with the current guile module.
-Return nil, if current buffer does not define a module."
-  ;; Modified version of `geiser-guile--get-module'.
-  (save-excursion
-    (geiser-syntax--pop-to-top)
-    (when (or (re-search-backward geiser-guile--module-re nil t)
-              (looking-at geiser-guile--library-re)
-              (re-search-forward geiser-guile--module-re nil t))
-      (match-string-no-properties 1))))
-
-(defun guix-guile-boolean (arg)
-  "Return a string with guile boolean value.
-Transform elisp ARG (nil or non-nil) to the guile boolean (#f or #t)."
-  (if arg "#t" "#f"))
-
-(defun guix-guile-keyword-regexp (keyword)
-  "Return regexp to find guile KEYWORD."
-  (format "(\\(%s\\)\\_>" keyword))
-
-(defun guix-guile-make-call-expression (proc &rest args)
-  "Return \"(PROC ARGS ...)\" string.
-PROC and ARGS should be strings."
-  (format "(%s %s)"
-          proc
-          (mapconcat #'identity args " ")))
-
-(defun guix-make-guile-expression (fun &rest args)
-  "Return string containing a guile expression for calling FUN with ARGS."
-  (format "(%S %s)" fun
-          (mapconcat
-           (lambda (arg)
-             (cond
-              ((null arg) "'()")
-              ((or (eq arg t)
-                   ;; An ugly hack to separate 'false' from nil.
-                   (equal arg 'f)
-                   (keywordp arg))
-               (concat "#" (prin1-to-string arg t)))
-              ((or (symbolp arg) (listp arg))
-               (concat "'" (prin1-to-string arg)))
-              (t (prin1-to-string arg))))
-           args
-           " ")))
-
-(defun guix-guile-prompt? (string)
-  "Return non-nil, if STRING contains a Guile prompt."
-  (or (string-match-p geiser-guile--prompt-regexp string)
-      (string-match-p geiser-guile--debugger-prompt-regexp string)))
-
-(provide 'guix-guile)
-
-;;; guix-guile.el ends here
diff --git a/emacs/guix-help-vars.el b/emacs/guix-help-vars.el
deleted file mode 100644
index 8117d28f3e..0000000000
--- a/emacs/guix-help-vars.el
+++ /dev/null
@@ -1,108 +0,0 @@
-;;; guix-help-vars.el --- Variables related to --help output
-
-;; Copyright © 2015 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides regular expressions to parse various "guix
-;; ... --help" outputs and lists of non-receivable items (system types,
-;; hash formats, etc.).
-
-;;; Code:
-
-
-;;; Regexps for parsing "guix ..." outputs
-
-(defvar guix-help-parse-option-regexp
-  (rx bol "  "
-      (zero-or-one (group "-" (not (any "- ")))
-                   ",")
-      (one-or-more " ")
-      (group "--" (one-or-more (or wordchar "-")))
-      (group (zero-or-one "[")
-             (zero-or-one "="))
-      (zero-or-more (not space))
-      (one-or-more space)
-      (group (one-or-more any)))
-  "Common regexp used to find command options.")
-
-(defvar guix-help-parse-command-regexp
-  (rx bol "   "
-      (group wordchar (one-or-more (or wordchar "-"))))
-  "Regexp used to find guix commands.
-'Command' means any option not prefixed with '-'.  For example,
-guix subcommand, system action, importer, etc.")
-
-(defvar guix-help-parse-long-option-regexp
-  (rx (or "  " ", ")
-      (group "--" (one-or-more (or wordchar "-"))
-             (zero-or-one "=")))
-  "Regexp used to find long options.")
-
-(defvar guix-help-parse-short-option-regexp
-  (rx bol (one-or-more blank)
-      "-" (group (not (any "- "))))
-  "Regexp used to find short options.")
-
-(defvar guix-help-parse-package-regexp
-  (rx bol (group (one-or-more (not blank))))
-  "Regexp used to find names of the packages.")
-
-(defvar guix-help-parse-list-regexp
-  (rx bol (zero-or-more blank) "- "
-      (group (one-or-more (or wordchar "-"))))
-  "Regexp used to find various lists (lint checkers, graph types).")
-
-(defvar guix-help-parse-regexp-group 1
-  "Parenthesized expression of regexps used to find commands and
-options.")
-
-
-;;; Non-receivable lists of system types, hash formats, etc.
-
-(defvar guix-help-system-types
-  '("x86_64-linux" "i686-linux" "armhf-linux" "mips64el-linux")
-  "List of supported systems.")
-
-(defvar guix-help-source-types
-  '("package" "all" "transitive")
-  "List of supported sources types.")
-
-(defvar guix-help-hash-formats
-  '("nix-base32" "base32" "base16" "hex" "hexadecimal")
-  "List of supported hash formats.")
-
-(defvar guix-help-refresh-subsets
-  '("core" "non-core")
-  "List of supported 'refresh' subsets.")
-
-(defvar guix-help-key-policies
-  '("interactive" "always" "never")
-  "List of supported key download policies.")
-
-(defvar guix-help-verify-options
-  '("repair" "contents")
-  "List of supported 'verify' options")
-
-(defvar guix-help-elpa-archives
-  '("gnu" "melpa" "melpa-stable")
-  "List of supported ELPA archives.")
-
-(provide 'guix-help-vars)
-
-;;; guix-help-vars.el ends here
diff --git a/emacs/guix-helper.scm.in b/emacs/guix-helper.scm.in
deleted file mode 100644
index 0bbd36be21..0000000000
--- a/emacs/guix-helper.scm.in
+++ /dev/null
@@ -1,65 +0,0 @@
-;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014 Alex Kost <alezost@gmail.com>
-;;;
-;;; This file is part of GNU Guix.
-;;;
-;;; GNU Guix is free software; you can redistribute it and/or modify it
-;;; under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 3 of the License, or (at
-;;; your option) any later version.
-;;;
-;;; GNU Guix is distributed in the hope that it will be useful, but
-;;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This is an auxiliary file for the Emacs UI.  It is used to add Guix
-;; directories to path variables and to load the main code.
-
-;;; Code:
-
-(use-modules (ice-9 regex)
-             (srfi srfi-26))
-
-(define %guix-dir)
-
-;; The code is taken from ‘guix’ executable script
-(define (set-paths!)
-  (define-syntax-rule (push! elt v) (set! v (cons elt v)))
-
-  (define config-lookup
-    (let ((config '(("prefix"         . "@prefix@")
-                    ("guilemoduledir" . "@guilemoduledir@")))
-          (var-ref-regexp (make-regexp "\\$\\{([a-z]+)\\}")))
-      (define (expand-var-ref match)
-        (lookup (match:substring match 1)))
-      (define (expand str)
-        (regexp-substitute/global #f var-ref-regexp str
-                                  'pre expand-var-ref 'post))
-      (define (lookup name)
-        (expand (assoc-ref config name)))
-      lookup))
-
-  (let ((module-dir (config-lookup "guilemoduledir"))
-        (updates-dir (and=> (or (getenv "XDG_CONFIG_HOME")
-                                (and=> (getenv "HOME")
-                                       (cut string-append <> "/.config")))
-                            (cut string-append <> "/guix/latest"))))
-    (push! module-dir %load-path)
-    (push! module-dir %load-compiled-path)
-    (if (and updates-dir (file-exists? updates-dir))
-        (begin
-          (set! %guix-dir updates-dir)
-          (push! updates-dir %load-path)
-          (push! updates-dir %load-compiled-path))
-        (set! %guix-dir module-dir))))
-
-(set-paths!)
-
-(load-from-path "guix-main")
-
diff --git a/emacs/guix-history.el b/emacs/guix-history.el
deleted file mode 100644
index 5d301a689e..0000000000
--- a/emacs/guix-history.el
+++ /dev/null
@@ -1,92 +0,0 @@
-;;; guix-history.el --- History of buffer information
-
-;; Copyright © 2014 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides support for history of buffers similar to the
-;; history of a `help-mode' buffer.
-
-;;; Code:
-
-(require 'cl-macs)
-
-(defvar-local guix-history-stack-item nil
-  "Current item of the history.
-A list of the form (FUNCTION [ARGS ...]).
-The item is used by calling (apply FUNCTION ARGS).")
-(put 'guix-history-stack-item 'permanent-local t)
-
-(defvar-local guix-history-back-stack nil
-  "Stack (list) of visited items.
-Each element of the list has a form of `guix-history-stack-item'.")
-(put 'guix-history-back-stack 'permanent-local t)
-
-(defvar-local guix-history-forward-stack nil
-  "Stack (list) of items visited with `guix-history-back'.
-Each element of the list has a form of `guix-history-stack-item'.")
-(put 'guix-history-forward-stack 'permanent-local t)
-
-(defvar guix-history-size 0
-  "Maximum number of items saved in history.
-If 0, the history is disabled.")
-
-(defun guix-history-add (item)
-  "Add ITEM to history."
-  (and guix-history-stack-item
-       (push guix-history-stack-item guix-history-back-stack))
-  (setq guix-history-forward-stack nil
-        guix-history-stack-item item)
-  (when (>= (length guix-history-back-stack)
-            guix-history-size)
-    (setq guix-history-back-stack
-          (cl-loop for elt in guix-history-back-stack
-                   for i from 1 to guix-history-size
-                   collect elt))))
-
-(defun guix-history-replace (item)
-  "Replace current item in history with ITEM."
-  (setq guix-history-stack-item item))
-
-(defun guix-history-goto (item)
-  "Go to the ITEM of history.
-ITEM should have the form of `guix-history-stack-item'."
-  (or (listp item)
-      (error "Wrong value of history element"))
-  (setq guix-history-stack-item item)
-  (apply (car item) (cdr item)))
-
-(defun guix-history-back ()
-  "Go back to the previous element of history in the current buffer."
-  (interactive)
-  (or guix-history-back-stack
-      (user-error "No previous element in history"))
-  (push guix-history-stack-item guix-history-forward-stack)
-  (guix-history-goto (pop guix-history-back-stack)))
-
-(defun guix-history-forward ()
-  "Go forward to the next element of history in the current buffer."
-  (interactive)
-  (or guix-history-forward-stack
-      (user-error "No next element in history"))
-  (push guix-history-stack-item guix-history-back-stack)
-  (guix-history-goto (pop guix-history-forward-stack)))
-
-(provide 'guix-history)
-
-;;; guix-history.el ends here
diff --git a/emacs/guix-hydra-build.el b/emacs/guix-hydra-build.el
deleted file mode 100644
index 232221e773..0000000000
--- a/emacs/guix-hydra-build.el
+++ /dev/null
@@ -1,362 +0,0 @@
-;;; guix-hydra-build.el --- Interface for Hydra builds  -*- lexical-binding: t -*-
-
-;; Copyright © 2015 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides an interface for displaying Hydra builds in
-;; 'list' and 'info' buffers.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'guix-buffer)
-(require 'guix-list)
-(require 'guix-info)
-(require 'guix-hydra)
-(require 'guix-build-log)
-(require 'guix-utils)
-
-(guix-hydra-define-entry-type hydra-build
-  :search-types '((latest . guix-hydra-build-latest-api-url)
-                  (queue  . guix-hydra-build-queue-api-url))
-  :filters '(guix-hydra-build-filter-status)
-  :filter-names '((nixname . name)
-                  (buildstatus . build-status)
-                  (timestamp . time))
-  :filter-boolean-params '(finished busy))
-
-(defun guix-hydra-build-get-display (search-type &rest args)
-  "Search for Hydra builds and show results."
-  (apply #'guix-list-get-display-entries
-         'hydra-build search-type args))
-
-(cl-defun guix-hydra-build-latest-prompt-args (&key project jobset
-                                                    job system)
-  "Prompt for and return a list of 'latest builds' arguments."
-  (let* ((number      (read-number "Number of latest builds: "))
-         (project     (if current-prefix-arg
-                          (guix-hydra-read-project nil project)
-                        project))
-         (jobset      (if current-prefix-arg
-                          (guix-hydra-read-jobset nil jobset)
-                        jobset))
-         (job-or-name (if current-prefix-arg
-                          (guix-hydra-read-job nil job)
-                        job))
-         (job         (and job-or-name
-                           (string-match-p guix-hydra-job-regexp
-                                           job-or-name)
-                           job-or-name))
-         (system      (if (and (not job)
-                               (or current-prefix-arg
-                                   (and job-or-name (not system))))
-                          (if job-or-name
-                              (guix-while-null
-                                (guix-hydra-read-system
-                                 (concat job-or-name ".") system))
-                            (guix-hydra-read-system nil system))
-                        system))
-         (job         (or job
-                          (and job-or-name
-                               (concat job-or-name "." system)))))
-    (list number
-          :project project
-          :jobset  jobset
-          :job     job
-          :system  system)))
-
-(defun guix-hydra-build-view-log (id)
-  "View build log of a hydra build ID."
-  (guix-build-log-find-file (guix-hydra-build-log-url id)))
-
-
-;;; Defining URLs
-
-(defun guix-hydra-build-url (id)
-  "Return Hydra URL of a build ID."
-  (guix-hydra-url "build/" (number-to-string id)))
-
-(defun guix-hydra-build-log-url (id)
-  "Return Hydra URL of the log file of a build ID."
-  (concat (guix-hydra-build-url id) "/log/raw"))
-
-(cl-defun guix-hydra-build-latest-api-url
-    (number &key project jobset job system)
-  "Return Hydra API URL to receive latest NUMBER of builds."
-  (guix-hydra-api-url "latestbuilds"
-    `(("nr" . ,number)
-      ("project" . ,project)
-      ("jobset" . ,jobset)
-      ("job" . ,job)
-      ("system" . ,system))))
-
-(defun guix-hydra-build-queue-api-url (number)
-  "Return Hydra API URL to receive the NUMBER of queued builds."
-  (guix-hydra-api-url "queue"
-    `(("nr" . ,number))))
-
-
-;;; Filters for processing raw entries
-
-(defun guix-hydra-build-filter-status (entry)
-  "Add 'status' parameter to 'hydra-build' ENTRY."
-  (let ((status (if (guix-entry-value entry 'finished)
-                    (guix-hydra-build-status-number->name
-                     (guix-entry-value entry 'build-status))
-                  (if (guix-entry-value entry 'busy)
-                      'running
-                    'scheduled))))
-    (cons `(status . ,status)
-          entry)))
-
-
-;;; Build status
-
-(defface guix-hydra-build-status-running
-  '((t :inherit bold))
-  "Face used if hydra build is not finished."
-  :group 'guix-hydra-build-faces)
-
-(defface guix-hydra-build-status-scheduled
-  '((t))
-  "Face used if hydra build is scheduled."
-  :group 'guix-hydra-build-faces)
-
-(defface guix-hydra-build-status-succeeded
-  '((t :inherit success))
-  "Face used if hydra build succeeded."
-  :group 'guix-hydra-build-faces)
-
-(defface guix-hydra-build-status-cancelled
-  '((t :inherit warning))
-  "Face used if hydra build was cancelled."
-  :group 'guix-hydra-build-faces)
-
-(defface guix-hydra-build-status-failed
-  '((t :inherit error))
-  "Face used if hydra build failed."
-  :group 'guix-hydra-build-faces)
-
-(defvar guix-hydra-build-status-alist
-  '((0 . succeeded)
-    (1 . failed-build)
-    (2 . failed-dependency)
-    (3 . failed-other)
-    (4 . cancelled))
-  "Alist of hydra build status numbers and status names.
-Status numbers are returned by Hydra API, names (symbols) are
-used internally by the elisp code of this package.")
-
-(defun guix-hydra-build-status-number->name (number)
-  "Convert build status number to a name.
-See `guix-hydra-build-status-alist'."
-  (guix-assq-value guix-hydra-build-status-alist number))
-
-(defun guix-hydra-build-status-string (status)
-  "Return a human readable string for build STATUS."
-  (cl-case status
-    (scheduled
-     (guix-get-string "Scheduled" 'guix-hydra-build-status-scheduled))
-    (running
-     (guix-get-string "Running" 'guix-hydra-build-status-running))
-    (succeeded
-     (guix-get-string "Succeeded" 'guix-hydra-build-status-succeeded))
-    (cancelled
-     (guix-get-string "Cancelled" 'guix-hydra-build-status-cancelled))
-    (failed-build
-     (guix-hydra-build-status-fail-string))
-    (failed-dependency
-     (guix-hydra-build-status-fail-string "dependency"))
-    (failed-other
-     (guix-hydra-build-status-fail-string "other"))))
-
-(defun guix-hydra-build-status-fail-string (&optional reason)
-  "Return a string for a failed build."
-  (let ((base (guix-get-string "Failed" 'guix-hydra-build-status-failed)))
-    (if reason
-        (concat base " (" reason ")")
-      base)))
-
-(defun guix-hydra-build-finished? (entry)
-  "Return non-nil, if hydra build was finished."
-  (guix-entry-value entry 'finished))
-
-(defun guix-hydra-build-running? (entry)
-  "Return non-nil, if hydra build is running."
-  (eq (guix-entry-value entry 'status)
-      'running))
-
-(defun guix-hydra-build-scheduled? (entry)
-  "Return non-nil, if hydra build is scheduled."
-  (eq (guix-entry-value entry 'status)
-      'scheduled))
-
-(defun guix-hydra-build-succeeded? (entry)
-  "Return non-nil, if hydra build succeeded."
-  (eq (guix-entry-value entry 'status)
-      'succeeded))
-
-(defun guix-hydra-build-cancelled? (entry)
-  "Return non-nil, if hydra build was cancelled."
-  (eq (guix-entry-value entry 'status)
-      'cancelled))
-
-(defun guix-hydra-build-failed? (entry)
-  "Return non-nil, if hydra build failed."
-  (memq (guix-entry-value entry 'status)
-        '(failed-build failed-dependency failed-other)))
-
-
-;;; Hydra build 'info'
-
-(guix-hydra-info-define-interface hydra-build
-  :mode-name "Hydra-Build-Info"
-  :buffer-name "*Guix Hydra Build Info*"
-  :format '((name ignore (simple guix-info-heading))
-            ignore
-            guix-hydra-build-info-insert-url
-            (time     format (time))
-            (status   format guix-hydra-build-info-insert-status)
-            (project  format (format guix-hydra-build-project))
-            (jobset   format (format guix-hydra-build-jobset))
-            (job      format (format guix-hydra-build-job))
-            (system   format (format guix-hydra-build-system))
-            (priority format (format))))
-
-(defface guix-hydra-build-info-project
-  '((t :inherit link))
-  "Face for project names."
-  :group 'guix-hydra-build-info-faces)
-
-(defface guix-hydra-build-info-jobset
-  '((t :inherit link))
-  "Face for jobsets."
-  :group 'guix-hydra-build-info-faces)
-
-(defface guix-hydra-build-info-job
-  '((t :inherit link))
-  "Face for jobs."
-  :group 'guix-hydra-build-info-faces)
-
-(defface guix-hydra-build-info-system
-  '((t :inherit link))
-  "Face for system names."
-  :group 'guix-hydra-build-info-faces)
-
-(defmacro guix-hydra-build-define-button (name)
-  "Define `guix-hydra-build-NAME' button."
-  (let* ((name-str    (symbol-name name))
-         (button-name (intern (concat "guix-hydra-build-" name-str)))
-         (face-name   (intern (concat "guix-hydra-build-info-" name-str)))
-         (keyword     (intern (concat ":" name-str))))
-    `(define-button-type ',button-name
-       :supertype 'guix
-       'face ',face-name
-       'help-echo ,(format "\
-Show latest builds for this %s (with prefix, prompt for all parameters)"
-                           name-str)
-       'action (lambda (btn)
-                 (let ((args (guix-hydra-build-latest-prompt-args
-                              ,keyword (button-label btn))))
-                   (apply #'guix-hydra-build-get-display
-                          'latest args))))))
-
-(guix-hydra-build-define-button project)
-(guix-hydra-build-define-button jobset)
-(guix-hydra-build-define-button job)
-(guix-hydra-build-define-button system)
-
-(defun guix-hydra-build-info-insert-url (entry)
-  "Insert Hydra URL for the build ENTRY."
-  (guix-insert-button (guix-hydra-build-url (guix-entry-id entry))
-                      'guix-url)
-  (when (guix-hydra-build-finished? entry)
-    (guix-info-insert-indent)
-    (guix-info-insert-action-button
-     "Build log"
-     (lambda (btn)
-       (guix-hydra-build-view-log (button-get btn 'id)))
-     "View build log"
-     'id (guix-entry-id entry))))
-
-(defun guix-hydra-build-info-insert-status (status &optional _)
-  "Insert a string with build STATUS."
-  (insert (guix-hydra-build-status-string status)))
-
-
-;;; Hydra build 'list'
-
-(guix-hydra-list-define-interface hydra-build
-  :mode-name "Hydra-Build-List"
-  :buffer-name "*Guix Hydra Build List*"
-  :format '((name nil 30 t)
-            (system nil 16 t)
-            (status guix-hydra-build-list-get-status 20 t)
-            (project nil 10 t)
-            (jobset nil 17 t)
-            (time guix-list-get-time 20 t)))
-
-(let ((map guix-hydra-build-list-mode-map))
-  (define-key map (kbd "B") 'guix-hydra-build-list-latest-builds)
-  (define-key map (kbd "L") 'guix-hydra-build-list-view-log))
-
-(defun guix-hydra-build-list-get-status (status &optional _)
-  "Return a string for build STATUS."
-  (guix-hydra-build-status-string status))
-
-(defun guix-hydra-build-list-latest-builds (number &rest args)
-  "Display latest NUMBER of Hydra builds of the current job.
-Interactively, prompt for NUMBER.  With prefix argument, prompt
-for all ARGS."
-  (interactive
-   (let ((entry (guix-list-current-entry)))
-     (guix-hydra-build-latest-prompt-args
-      :project (guix-entry-value entry 'project)
-      :jobset  (guix-entry-value entry 'name)
-      :job     (guix-entry-value entry 'job)
-      :system  (guix-entry-value entry 'system))))
-  (apply #'guix-hydra-latest-builds number args))
-
-(defun guix-hydra-build-list-view-log ()
-  "View build log of the current Hydra build."
-  (interactive)
-  (guix-hydra-build-view-log (guix-list-current-id)))
-
-
-;;; Interactive commands
-
-;;;###autoload
-(defun guix-hydra-latest-builds (number &rest args)
-  "Display latest NUMBER of Hydra builds.
-ARGS are the same arguments as for `guix-hydra-build-latest-api-url'.
-Interactively, prompt for NUMBER.  With prefix argument, prompt
-for all ARGS."
-  (interactive (guix-hydra-build-latest-prompt-args))
-  (apply #'guix-hydra-build-get-display
-         'latest number args))
-
-;;;###autoload
-(defun guix-hydra-queued-builds (number)
-  "Display the NUMBER of queued Hydra builds."
-  (interactive "NNumber of queued builds: ")
-  (guix-hydra-build-get-display 'queue number))
-
-(provide 'guix-hydra-build)
-
-;;; guix-hydra-build.el ends here
diff --git a/emacs/guix-hydra-jobset.el b/emacs/guix-hydra-jobset.el
deleted file mode 100644
index a4a55a36f2..0000000000
--- a/emacs/guix-hydra-jobset.el
+++ /dev/null
@@ -1,162 +0,0 @@
-;;; guix-hydra-jobset.el --- Interface for Hydra jobsets  -*- lexical-binding: t -*-
-
-;; Copyright © 2015 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides an interface for displaying Hydra jobsets in
-;; 'list' and 'info' buffers.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'guix-buffer)
-(require 'guix-list)
-(require 'guix-info)
-(require 'guix-hydra)
-(require 'guix-hydra-build)
-(require 'guix-utils)
-
-(guix-hydra-define-entry-type hydra-jobset
-  :search-types '((project . guix-hydra-jobset-api-url))
-  :filters '(guix-hydra-jobset-filter-id)
-  :filter-names '((nrscheduled . scheduled)
-                  (nrsucceeded . succeeded)
-                  (nrfailed . failed)
-                  (nrtotal . total)))
-
-(defun guix-hydra-jobset-get-display (search-type &rest args)
-  "Search for Hydra builds and show results."
-  (apply #'guix-list-get-display-entries
-         'hydra-jobset search-type args))
-
-
-;;; Defining URLs
-
-(defun guix-hydra-jobset-url (project jobset)
-  "Return Hydra URL of a PROJECT's JOBSET."
-  (guix-hydra-url "jobset/" project "/" jobset))
-
-(defun guix-hydra-jobset-api-url (project)
-  "Return Hydra API URL for jobsets by PROJECT."
-  (guix-hydra-api-url "jobsets"
-    `(("project" . ,project))))
-
-
-;;; Filters for processing raw entries
-
-(defun guix-hydra-jobset-filter-id (entry)
-  "Add 'ID' parameter to 'hydra-jobset' ENTRY."
-  (cons `(id . ,(guix-entry-value entry 'name))
-        entry))
-
-
-;;; Hydra jobset 'info'
-
-(guix-hydra-info-define-interface hydra-jobset
-  :mode-name "Hydra-Jobset-Info"
-  :buffer-name "*Guix Hydra Jobset Info*"
-  :format '((name ignore (simple guix-info-heading))
-            ignore
-            guix-hydra-jobset-info-insert-url
-            (project   format guix-hydra-jobset-info-insert-project)
-            (scheduled format (format guix-hydra-jobset-info-scheduled))
-            (succeeded format (format guix-hydra-jobset-info-succeeded))
-            (failed    format (format guix-hydra-jobset-info-failed))
-            (total     format (format guix-hydra-jobset-info-total))))
-
-(defface guix-hydra-jobset-info-scheduled
-  '((t))
-  "Face used for the number of scheduled builds."
-  :group 'guix-hydra-jobset-info-faces)
-
-(defface guix-hydra-jobset-info-succeeded
-  '((t :inherit guix-hydra-build-status-succeeded))
-  "Face used for the number of succeeded builds."
-  :group 'guix-hydra-jobset-info-faces)
-
-(defface guix-hydra-jobset-info-failed
-  '((t :inherit guix-hydra-build-status-failed))
-  "Face used for the number of failed builds."
-  :group 'guix-hydra-jobset-info-faces)
-
-(defface guix-hydra-jobset-info-total
-  '((t))
-  "Face used for the total number of builds."
-  :group 'guix-hydra-jobset-info-faces)
-
-(defun guix-hydra-jobset-info-insert-project (project entry)
-  "Insert PROJECT button for the jobset ENTRY."
-  (let ((jobset (guix-entry-value entry 'name)))
-    (guix-insert-button
-     project 'guix-hydra-build-project
-     'action (lambda (btn)
-               (let ((args (guix-hydra-build-latest-prompt-args
-                            :project (button-get btn 'project)
-                            :jobset  (button-get btn 'jobset))))
-                 (apply #'guix-hydra-build-get-display
-                        'latest args)))
-     'project project
-     'jobset jobset)))
-
-(defun guix-hydra-jobset-info-insert-url (entry)
-  "Insert Hydra URL for the jobset ENTRY."
-  (guix-insert-button (guix-hydra-jobset-url
-                       (guix-entry-value entry 'project)
-                       (guix-entry-value entry 'name))
-                      'guix-url))
-
-
-;;; Hydra jobset 'list'
-
-(guix-hydra-list-define-interface hydra-jobset
-  :mode-name "Hydra-Jobset-List"
-  :buffer-name "*Guix Hydra Jobset List*"
-  :format '((name nil 25 t)
-            (project nil 10 t)
-            (scheduled nil 12 t)
-            (succeeded nil 12 t)
-            (failed nil 9 t)
-            (total nil 10 t)))
-
-(let ((map guix-hydra-jobset-list-mode-map))
-  (define-key map (kbd "B") 'guix-hydra-jobset-list-latest-builds))
-
-(defun guix-hydra-jobset-list-latest-builds (number &rest args)
-  "Display latest NUMBER of Hydra builds of the current jobset.
-Interactively, prompt for NUMBER.  With prefix argument, prompt
-for all ARGS."
-  (interactive
-   (let ((entry (guix-list-current-entry)))
-     (guix-hydra-build-latest-prompt-args
-      :project (guix-entry-value entry 'project)
-      :jobset  (guix-entry-value entry 'name))))
-  (apply #'guix-hydra-latest-builds number args))
-
-
-;;; Interactive commands
-
-;;;###autoload
-(defun guix-hydra-jobsets (project)
-  "Display jobsets of PROJECT."
-  (interactive (list (guix-hydra-read-project)))
-  (guix-hydra-jobset-get-display 'project project))
-
-(provide 'guix-hydra-jobset)
-
-;;; guix-hydra-jobset.el ends here
diff --git a/emacs/guix-hydra.el b/emacs/guix-hydra.el
deleted file mode 100644
index 9f876e7eea..0000000000
--- a/emacs/guix-hydra.el
+++ /dev/null
@@ -1,367 +0,0 @@
-;;; guix-hydra.el --- Common code for interacting with Hydra  -*- lexical-binding: t -*-
-
-;; Copyright © 2015 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides some general code for 'list'/'info' interfaces for
-;; Hydra (Guix build farm).
-
-;;; Code:
-
-(require 'json)
-(require 'guix-buffer)
-(require 'guix-entry)
-(require 'guix-utils)
-(require 'guix-help-vars)
-
-(guix-define-groups hydra)
-
-(defvar guix-hydra-job-regexp
-  (concat ".*\\." (regexp-opt guix-help-system-types) "\\'")
-  "Regexp matching a full name of Hydra job (including system).")
-
-(defun guix-hydra-job-name-specification (name version)
-  "Return Hydra's job name specification by NAME and VERSION."
-  (concat name "-" version))
-
-(defun guix-hydra-message (entries search-type &rest _)
-  "Display a message after showing Hydra ENTRIES."
-  ;; XXX Add more messages maybe.
-  (when (null entries)
-    (if (eq search-type 'fake)
-        (message "The update is impossible due to lack of Hydra API.")
-      (message "Hydra has returned no results."))))
-
-(defun guix-hydra-list-describe (ids)
-  "Describe 'hydra' entries with IDS (list of identifiers)."
-  (guix-buffer-display-entries
-   (guix-entries-by-ids ids (guix-buffer-current-entries))
-   'info (guix-buffer-current-entry-type)
-   ;; Hydra does not provide an API to receive builds/jobsets by
-   ;; IDs/names, so we use a 'fake' search type.
-   '(fake)
-   'add))
-
-
-;;; Readers
-
-(defvar guix-hydra-projects
-  '("gnu" "guix")
-  "List of available Hydra projects.")
-
-(guix-define-readers
- :completions-var guix-hydra-projects
- :single-reader guix-hydra-read-project
- :single-prompt "Project: ")
-
-(guix-define-readers
- :single-reader guix-hydra-read-jobset
- :single-prompt "Jobset: ")
-
-(guix-define-readers
- :single-reader guix-hydra-read-job
- :single-prompt "Job: ")
-
-(guix-define-readers
- :completions-var guix-help-system-types
- :single-reader guix-hydra-read-system
- :single-prompt "System: ")
-
-
-;;; Defining URLs
-
-(defvar guix-hydra-url "http://hydra.gnu.org"
-  "URL of the Hydra build farm.")
-
-(defun guix-hydra-url (&rest url-parts)
-  "Return Hydra URL."
-  (apply #'concat guix-hydra-url "/" url-parts))
-
-(defun guix-hydra-api-url (type args)
-  "Return URL for receiving data using Hydra API.
-TYPE is the name of an allowed method.
-ARGS is alist of (KEY . VALUE) pairs.
-Skip ARG, if VALUE is nil or an empty string."
-  (declare (indent 1))
-  (let* ((fields (mapcar
-                  (lambda (arg)
-                    (pcase arg
-                      (`(,key . ,value)
-                       (unless (or (null value)
-                                   (equal "" value))
-                         (concat (guix-hexify key) "="
-                                 (guix-hexify value))))
-                      (_ (error "Wrong argument '%s'" arg))))
-                  args))
-         (fields (mapconcat #'identity (delq nil fields) "&")))
-    (guix-hydra-url "api/" type "?" fields)))
-
-
-;;; Receiving data from Hydra
-
-(defun guix-hydra-receive-data (url)
-  "Return output received from URL and processed with `json-read'."
-  (with-temp-buffer
-    (url-insert-file-contents url)
-    (goto-char (point-min))
-    (let ((json-key-type 'symbol)
-          (json-array-type 'list)
-          (json-object-type 'alist))
-      (json-read))))
-
-(defun guix-hydra-get-entries (entry-type search-type &rest args)
-  "Receive ENTRY-TYPE entries from Hydra.
-SEARCH-TYPE is one of the types defined by `guix-hydra-define-interface'."
-  (unless (eq search-type 'fake)
-    (let* ((url         (apply #'guix-hydra-search-url
-                               entry-type search-type args))
-           (raw-entries (guix-hydra-receive-data url))
-           (entries     (guix-hydra-filter-entries
-                         raw-entries
-                         (guix-hydra-filters entry-type))))
-      entries)))
-
-
-;;; Filters for processing raw entries
-
-(defun guix-hydra-filter-entries (entries filters)
-  "Filter ENTRIES using FILTERS.
-Call `guix-modify' on each entry from ENTRIES."
-  (mapcar (lambda (entry)
-            (guix-modify entry filters))
-          entries))
-
-(defun guix-hydra-filter-names (entry name-alist)
-  "Replace names of ENTRY parameters using NAME-ALIST.
-Each element of NAME-ALIST is (OLD-NAME . NEW-NAME) pair."
-  (mapcar (lambda (param)
-            (pcase param
-              (`(,name . ,val)
-               (let ((new-name (guix-assq-value name-alist name)))
-                 (if new-name
-                     (cons new-name val)
-                   param)))))
-          entry))
-
-(defun guix-hydra-filter-boolean (entry params)
-  "Convert number PARAMS (0/1) of ENTRY to boolean values (nil/t)."
-  (mapcar (lambda (param)
-            (pcase param
-              (`(,name . ,val)
-               (if (memq name params)
-                   (cons name (guix-number->bool val))
-                 param))))
-          entry))
-
-
-;;; Wrappers for defined variables
-
-(defvar guix-hydra-entry-type-data nil
-  "Alist with hydra entry type data.
-This alist is filled by `guix-hydra-define-entry-type' macro.")
-
-(defun guix-hydra-entry-type-value (entry-type symbol)
-  "Return SYMBOL's value for ENTRY-TYPE from `guix-hydra'."
-  (symbol-value (guix-assq-value guix-hydra-entry-type-data
-                                 entry-type symbol)))
-
-(defun guix-hydra-search-url (entry-type search-type &rest args)
-  "Return URL to receive ENTRY-TYPE entries from Hydra."
-  (apply (guix-assq-value (guix-hydra-entry-type-value
-                           entry-type 'search-types)
-                          search-type)
-         args))
-
-(defun guix-hydra-filters (entry-type)
-  "Return a list of filters for ENTRY-TYPE."
-  (guix-hydra-entry-type-value entry-type 'filters))
-
-
-;;; Interface definers
-
-(defmacro guix-hydra-define-entry-type (entry-type &rest args)
-  "Define general code for ENTRY-TYPE.
-Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ...
-
-Required keywords:
-
-  - `:search-types' - default value of the generated
-    `guix-ENTRY-TYPE-search-types' variable.
-
-Optional keywords:
-
-  - `:filters' - default value of the generated
-    `guix-ENTRY-TYPE-filters' variable.
-
-  - `:filter-names' - if specified, a generated
-    `guix-ENTRY-TYPE-filter-names' function for filtering these
-    names will be added to `guix-ENTRY-TYPE-filters' variable.
-
-  - `:filter-boolean-params' - if specified, a generated
-    `guix-ENTRY-TYPE-filter-boolean' function for filtering these
-    names will be added to `guix-ENTRY-TYPE-filters' variable.
-
-The rest keyword arguments are passed to
-`guix-define-entry-type' macro."
-  (declare (indent 1))
-  (let* ((entry-type-str     (symbol-name entry-type))
-         (prefix             (concat "guix-" entry-type-str))
-         (search-types-var   (intern (concat prefix "-search-types")))
-         (filters-var        (intern (concat prefix "-filters")))
-         (get-fun            (intern (concat prefix "-get-entries"))))
-    (guix-keyword-args-let args
-        ((search-types-val   :search-types)
-         (filters-val        :filters)
-         (filter-names-val   :filter-names)
-         (filter-bool-val    :filter-boolean-params))
-      `(progn
-         (defvar ,search-types-var ,search-types-val
-           ,(format "\
-Alist of search types and according URL functions.
-Functions are used to define URL to receive '%s' entries."
-                    entry-type-str))
-
-         (defvar ,filters-var ,filters-val
-           ,(format "\
-List of filters for '%s' parameters.
-Each filter is a function that should take an entry as a single
-argument, and should also return an entry."
-                    entry-type-str))
-
-         ,(when filter-bool-val
-            (let ((filter-bool-var (intern (concat prefix
-                                                   "-filter-boolean-params")))
-                  (filter-bool-fun (intern (concat prefix
-                                                   "-filter-boolean"))))
-              `(progn
-                 (defvar ,filter-bool-var ,filter-bool-val
-                   ,(format "\
-List of '%s' parameters that should be transformed to boolean values."
-                            entry-type-str))
-
-                 (defun ,filter-bool-fun (entry)
-                   ,(format "\
-Run `guix-hydra-filter-boolean' with `%S' variable."
-                            filter-bool-var)
-                   (guix-hydra-filter-boolean entry ,filter-bool-var))
-
-                 (setq ,filters-var
-                       (cons ',filter-bool-fun ,filters-var)))))
-
-         ;; Do not move this clause up!: name filtering should be
-         ;; performed before any other filtering, so this filter should
-         ;; be consed after the boolean filter.
-         ,(when filter-names-val
-            (let* ((filter-names-var (intern (concat prefix
-                                                     "-filter-names")))
-                   (filter-names-fun filter-names-var))
-              `(progn
-                 (defvar ,filter-names-var ,filter-names-val
-                   ,(format "\
-Alist of '%s' parameter names returned by Hydra API and names
-used internally by the elisp code of this package."
-                            entry-type-str))
-
-                 (defun ,filter-names-fun (entry)
-                   ,(format "\
-Run `guix-hydra-filter-names' with `%S' variable."
-                            filter-names-var)
-                   (guix-hydra-filter-names entry ,filter-names-var))
-
-                 (setq ,filters-var
-                       (cons ',filter-names-fun ,filters-var)))))
-
-         (defun ,get-fun (search-type &rest args)
-           ,(format "\
-Receive '%s' entries.
-See `guix-hydra-get-entries' for details."
-                    entry-type-str)
-           (apply #'guix-hydra-get-entries
-                  ',entry-type search-type args))
-
-         (guix-alist-put!
-          '((search-types . ,search-types-var)
-            (filters      . ,filters-var))
-          'guix-hydra-entry-type-data ',entry-type)
-
-         (guix-define-entry-type ,entry-type
-           :parent-group guix-hydra
-           :parent-faces-group guix-hydra-faces
-           ,@%foreign-args)))))
-
-(defmacro guix-hydra-define-interface (buffer-type entry-type &rest args)
-  "Define BUFFER-TYPE interface for displaying ENTRY-TYPE entries.
-
-This macro should be called after calling
-`guix-hydra-define-entry-type' with the same ENTRY-TYPE.
-
-ARGS are passed to `guix-BUFFER-TYPE-define-interface' macro."
-  (declare (indent 2))
-  (let* ((entry-type-str  (symbol-name entry-type))
-         (buffer-type-str (symbol-name buffer-type))
-         (get-fun         (intern (concat "guix-" entry-type-str
-                                          "-get-entries")))
-         (definer         (intern (concat "guix-" buffer-type-str
-                                          "-define-interface"))))
-    `(,definer ,entry-type
-       :get-entries-function ',get-fun
-       :message-function 'guix-hydra-message
-       ,@args)))
-
-(defmacro guix-hydra-info-define-interface (entry-type &rest args)
-  "Define 'info' interface for displaying ENTRY-TYPE entries.
-See `guix-hydra-define-interface'."
-  (declare (indent 1))
-  `(guix-hydra-define-interface info ,entry-type
-     ,@args))
-
-(defmacro guix-hydra-list-define-interface (entry-type &rest args)
-  "Define 'list' interface for displaying ENTRY-TYPE entries.
-Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ...
-
-Optional keywords:
-
-  - `:describe-function' - default value of the generated
-    `guix-ENTRY-TYPE-list-describe-function' variable (if not
-    specified, use `guix-hydra-list-describe').
-
-The rest keyword arguments are passed to
-`guix-hydra-define-interface' macro."
-  (declare (indent 1))
-  (guix-keyword-args-let args
-      ((describe-val :describe-function))
-    `(guix-hydra-define-interface list ,entry-type
-       :describe-function ,(or describe-val ''guix-hydra-list-describe)
-       ,@args)))
-
-
-(defvar guix-hydra-font-lock-keywords
-  (eval-when-compile
-    `((,(rx "(" (group (or "guix-hydra-define-entry-type"
-                           "guix-hydra-define-interface"
-                           "guix-hydra-info-define-interface"
-                           "guix-hydra-list-define-interface"))
-            symbol-end)
-       . 1))))
-
-(font-lock-add-keywords 'emacs-lisp-mode guix-hydra-font-lock-keywords)
-
-(provide 'guix-hydra)
-
-;;; guix-hydra.el ends here
diff --git a/emacs/guix-info.el b/emacs/guix-info.el
deleted file mode 100644
index 6aefd2f3f6..0000000000
--- a/emacs/guix-info.el
+++ /dev/null
@@ -1,482 +0,0 @@
-;;; guix-info.el --- 'Info' buffer interface for displaying data  -*- lexical-binding: t -*-
-
-;; Copyright © 2014, 2015 Alex Kost <alezost@gmail.com>
-;; Copyright © 2015 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 this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides 'info' (help-like) buffer interface for displaying
-;; an arbitrary data.
-
-;;; Code:
-
-(require 'guix-buffer)
-(require 'guix-entry)
-(require 'guix-utils)
-
-(guix-define-buffer-type info)
-
-(defface guix-info-heading
-  '((((type tty pc) (class color)) :weight bold)
-    (t :height 1.6 :weight bold :inherit variable-pitch))
-  "Face for headings."
-  :group 'guix-info-faces)
-
-(defface guix-info-param-title
-  '((t :inherit font-lock-type-face))
-  "Face used for titles of parameters."
-  :group 'guix-info-faces)
-
-(defface guix-info-file-name
-  '((t :inherit link))
-  "Face used for file names."
-  :group 'guix-info-faces)
-
-(defface guix-info-url
-  '((t :inherit link))
-  "Face used for URLs."
-  :group 'guix-info-faces)
-
-(defface guix-info-time
-  '((t :inherit font-lock-constant-face))
-  "Face used for timestamps."
-  :group 'guix-info-faces)
-
-(defface guix-info-action-button
-  '((((type x w32 ns) (class color))
-     :box (:line-width 2 :style released-button)
-     :background "lightgrey" :foreground "black")
-    (t :inherit button))
-  "Face used for action buttons."
-  :group 'guix-info-faces)
-
-(defface guix-info-action-button-mouse
-  '((((type x w32 ns) (class color))
-     :box (:line-width 2 :style released-button)
-     :background "grey90" :foreground "black")
-    (t :inherit highlight))
-  "Mouse face used for action buttons."
-  :group 'guix-info-faces)
-
-(defcustom guix-info-ignore-empty-values nil
-  "If non-nil, do not display parameters with nil values."
-  :type 'boolean
-  :group 'guix-info)
-
-(defcustom guix-info-fill t
-  "If non-nil, fill string parameters to fit the window.
-If nil, insert text parameters (like synopsis or description) in
-a raw form."
-  :type 'boolean
-  :group 'guix-info)
-
-(defvar guix-info-param-title-format "%-18s: "
-  "String used to format a title of a parameter.
-It should be a '%s'-sequence.  After inserting a title formatted
-with this string, a value of the parameter is inserted.
-This string is used by `guix-info-insert-title-format'.")
-
-(defvar guix-info-multiline-prefix
-  (make-string (length (format guix-info-param-title-format " "))
-               ?\s)
-  "String used to format multi-line parameter values.
-If a value occupies more than one line, this string is inserted
-in the beginning of each line after the first one.
-This string is used by `guix-info-insert-value-format'.")
-
-(defvar guix-info-indent 2
-  "Number of spaces used to indent various parts of inserted text.")
-
-(defvar guix-info-delimiter "\n\f\n"
-  "String used to separate entries.")
-
-
-;;; Wrappers for 'info' variables
-
-(defvar guix-info-data nil
-  "Alist with 'info' data.
-This alist is filled by `guix-info-define-interface' macro.")
-
-(defun guix-info-value (entry-type symbol)
-  "Return SYMBOL's value for ENTRY-TYPE from `guix-info-data'."
-  (symbol-value (guix-assq-value guix-info-data entry-type symbol)))
-
-(defun guix-info-param-title (entry-type param)
-  "Return a title of an ENTRY-TYPE parameter PARAM."
-  (guix-buffer-param-title 'info entry-type param))
-
-(defun guix-info-format (entry-type)
-  "Return 'info' format for ENTRY-TYPE."
-  (guix-info-value entry-type 'format))
-
-(defun guix-info-displayed-params (entry-type)
-  "Return a list of ENTRY-TYPE parameters that should be displayed."
-  (delq nil
-        (mapcar (lambda (spec)
-                  (pcase spec
-                    (`(,param . ,_) param)))
-                (guix-info-format entry-type))))
-
-
-;;; Inserting entries
-
-(defvar guix-info-title-aliases
-  '((format . guix-info-insert-title-format)
-    (simple . guix-info-insert-title-simple))
-  "Alist of aliases and functions to insert titles.")
-
-(defvar guix-info-value-aliases
-  '((format . guix-info-insert-value-format)
-    (indent . guix-info-insert-value-indent)
-    (simple . guix-info-insert-value-simple)
-    (time   . guix-info-insert-time))
-  "Alist of aliases and functions to insert values.")
-
-(defun guix-info-title-function (fun-or-alias)
-  "Convert FUN-OR-ALIAS into a function to insert a title."
-  (or (guix-assq-value guix-info-title-aliases fun-or-alias)
-      fun-or-alias))
-
-(defun guix-info-value-function (fun-or-alias)
-  "Convert FUN-OR-ALIAS into a function to insert a value."
-  (or (guix-assq-value guix-info-value-aliases fun-or-alias)
-      fun-or-alias))
-
-(defun guix-info-title-method->function (method)
-  "Convert title METHOD into a function to insert a title."
-  (pcase method
-    ((pred null) #'ignore)
-    ((pred symbolp) (guix-info-title-function method))
-    (`(,fun-or-alias . ,rest-args)
-     (lambda (title)
-       (apply (guix-info-title-function fun-or-alias)
-              title rest-args)))
-    (_ (error "Unknown title method '%S'" method))))
-
-(defun guix-info-value-method->function (method)
-  "Convert value METHOD into a function to insert a value."
-  (pcase method
-    ((pred null) #'ignore)
-    ((pred functionp) method)
-    (`(,fun-or-alias . ,rest-args)
-     (lambda (value _)
-       (apply (guix-info-value-function fun-or-alias)
-              value rest-args)))
-    (_ (error "Unknown value method '%S'" method))))
-
-(defun guix-info-fill-column ()
-  "Return fill column for the current window."
-  (min (window-width) fill-column))
-
-(defun guix-info-get-indent (&optional level)
-  "Return `guix-info-indent' \"multiplied\" by LEVEL spaces.
-LEVEL is 1 by default."
-  (make-string (* guix-info-indent (or level 1)) ?\s))
-
-(defun guix-info-insert-indent (&optional level)
-  "Insert `guix-info-indent' spaces LEVEL times (1 by default)."
-  (insert (guix-info-get-indent level)))
-
-(defun guix-info-insert-entries (entries entry-type)
-  "Display ENTRY-TYPE ENTRIES in the current info buffer."
-  (guix-mapinsert (lambda (entry)
-                    (guix-info-insert-entry entry entry-type))
-                  entries
-                  guix-info-delimiter))
-
-(defun guix-info-insert-entry (entry entry-type &optional indent-level)
-  "Insert ENTRY of ENTRY-TYPE into the current info buffer.
-If INDENT-LEVEL is non-nil, indent displayed data by this number
-of `guix-info-indent' spaces."
-  (guix-with-indent (* (or indent-level 0)
-                       guix-info-indent)
-    (dolist (spec (guix-info-format entry-type))
-      (guix-info-insert-entry-unit spec entry entry-type))))
-
-(defun guix-info-insert-entry-unit (format-spec entry entry-type)
-  "Insert title and value of a PARAM at point.
-ENTRY is alist with parameters and their values.
-ENTRY-TYPE is a type of ENTRY."
-  (pcase format-spec
-    ((pred functionp)
-     (funcall format-spec entry)
-     (insert "\n"))
-    (`(,param ,title-method ,value-method)
-     (let ((value (guix-entry-value entry param)))
-       (unless (and guix-info-ignore-empty-values (null value))
-         (let ((title        (guix-info-param-title entry-type param))
-               (insert-title (guix-info-title-method->function title-method))
-               (insert-value (guix-info-value-method->function value-method)))
-           (funcall insert-title title)
-           (funcall insert-value value entry)
-           (insert "\n")))))
-    (_ (error "Unknown format specification '%S'" format-spec))))
-
-(defun guix-info-insert-title-simple (title &optional face)
-  "Insert \"TITLE: \" string at point.
-If FACE is nil, use `guix-info-param-title'."
-  (guix-format-insert title
-                      (or face 'guix-info-param-title)
-                      "%s: "))
-
-(defun guix-info-insert-title-format (title &optional face)
-  "Insert TITLE using `guix-info-param-title-format' at point.
-If FACE is nil, use `guix-info-param-title'."
-  (guix-format-insert title
-                      (or face 'guix-info-param-title)
-                      guix-info-param-title-format))
-
-(defun guix-info-insert-value-simple (value &optional button-or-face indent)
-  "Format and insert parameter VALUE at point.
-
-VALUE may be split into several short lines to fit the current
-window, depending on `guix-info-fill', and each line is indented
-with INDENT number of spaces.
-
-If BUTTON-OR-FACE is a button type symbol, transform VALUE into
-this (these) button(s) and insert each one on a new line.  If it
-is a face symbol, propertize inserted line(s) with this face."
-  (or indent (setq indent 0))
-  (guix-with-indent indent
-    (let* ((button?  (guix-button-type? button-or-face))
-           (face     (unless button? button-or-face))
-           (fill-col (unless (or button?
-                                 (and (stringp value)
-                                      (not guix-info-fill)))
-                       (- (guix-info-fill-column) indent)))
-           (value    (if (and value button?)
-                         (guix-buttonize value button-or-face "\n")
-                       value)))
-      (guix-split-insert value face fill-col "\n"))))
-
-(defun guix-info-insert-value-indent (value &optional button-or-face)
-  "Format and insert parameter VALUE at point.
-
-This function is intended to be called after inserting a title
-with `guix-info-insert-title-simple'.
-
-VALUE may be split into several short lines to fit the current
-window, depending on `guix-info-fill', and each line is indented
-with `guix-info-indent'.
-
-For the meaning of BUTTON-OR-FACE, see `guix-info-insert-value-simple'."
-  (when value (insert "\n"))
-  (guix-info-insert-value-simple value button-or-face guix-info-indent))
-
-(defun guix-info-insert-value-format (value &optional button-or-face
-                                            &rest button-properties)
-  "Format and insert parameter VALUE at point.
-
-This function is intended to be called after inserting a title
-with `guix-info-insert-title-format'.
-
-VALUE may be split into several short lines to fit the current
-window, depending on `guix-info-fill' and
-`guix-info-multiline-prefix'.  If VALUE is a list, its elements
-will be separated with `guix-list-separator'.
-
-If BUTTON-OR-FACE is a button type symbol, transform VALUE into
-this (these) button(s).  If it is a face symbol, propertize
-inserted line(s) with this face.
-
-BUTTON-PROPERTIES are passed to `guix-buttonize' (only if
-BUTTON-OR-FACE is a button type)."
-  (let* ((button?  (guix-button-type? button-or-face))
-         (face     (unless button? button-or-face))
-         (fill-col (when (or button?
-                             guix-info-fill
-                             (not (stringp value)))
-                     (- (guix-info-fill-column)
-                        (length guix-info-multiline-prefix))))
-         (value    (if (and value button?)
-                       (apply #'guix-buttonize
-                              value button-or-face guix-list-separator
-                              button-properties)
-                     value)))
-    (guix-split-insert value face fill-col
-                       (concat "\n" guix-info-multiline-prefix))))
-
-(defun guix-info-insert-time (seconds &optional face)
-  "Insert formatted time string using SECONDS at point."
-  (guix-format-insert (guix-get-time-string seconds)
-                      (or face 'guix-info-time)))
-
-
-;;; Buttons
-
-(defvar guix-info-button-map
-  (let ((map (make-sparse-keymap)))
-    (set-keymap-parent map button-map)
-    (define-key map (kbd "c") 'guix-info-button-copy-label)
-    map)
-  "Keymap for buttons in info buffers.")
-
-(define-button-type 'guix
-  'keymap guix-info-button-map
-  'follow-link t)
-
-(define-button-type 'guix-action
-  :supertype 'guix
-  'face 'guix-info-action-button
-  'mouse-face 'guix-info-action-button-mouse)
-
-(define-button-type 'guix-file
-  :supertype 'guix
-  'face 'guix-info-file-name
-  'help-echo "Find file"
-  'action (lambda (btn)
-            (guix-find-file (button-label btn))))
-
-(define-button-type 'guix-url
-  :supertype 'guix
-  'face 'guix-info-url
-  'help-echo "Browse URL"
-  'action (lambda (btn)
-            (browse-url (button-label btn))))
-
-(defun guix-info-button-copy-label (&optional pos)
-  "Copy a label of the button at POS into kill ring.
-If POS is nil, use the current point position."
-  (interactive)
-  (let ((button (button-at (or pos (point)))))
-    (when button
-      (guix-copy-as-kill (button-label button)))))
-
-(defun guix-info-insert-action-button (label action &optional message
-                                             &rest properties)
-  "Make action button with LABEL and insert it at point.
-ACTION is a function called when the button is pressed.  It
-should accept button as the argument.
-MESSAGE is a button message.
-See `insert-text-button' for the meaning of PROPERTIES."
-  (apply #'guix-insert-button
-         label 'guix-action
-         'action action
-         'help-echo message
-         properties))
-
-
-;;; Major mode and interface definer
-
-(defvar guix-info-mode-map
-  (let ((map (make-sparse-keymap)))
-    (set-keymap-parent
-     map (make-composed-keymap (list guix-buffer-map button-buffer-map)
-                               special-mode-map))
-    map)
-  "Keymap for `guix-info-mode' buffers.")
-
-(define-derived-mode guix-info-mode special-mode "Guix-Info"
-  "Parent mode for displaying data in 'info' form."
-  (setq-local revert-buffer-function 'guix-buffer-revert))
-
-(defun guix-info-mode-initialize ()
-  "Set up the current 'info' buffer."
-  ;; Without this, syntactic fontification is performed, and it may
-  ;; break our highlighting.  For example, description of "emacs-typo"
-  ;; package contains a single " (double-quote) character, so the
-  ;; default syntactic fontification highlights the rest text after it
-  ;; as a string.  See (info "(elisp) Font Lock Basics") for details.
-  (setq font-lock-defaults '(nil t)))
-
-(defmacro guix-info-define-interface (entry-type &rest args)
-  "Define 'info' interface for displaying ENTRY-TYPE entries.
-Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ...
-
-Required keywords:
-
-  - `:format' - default value of the generated
-    `guix-ENTRY-TYPE-info-format' variable.
-
-The rest keyword arguments are passed to
-`guix-buffer-define-interface' macro."
-  (declare (indent 1))
-  (let* ((entry-type-str     (symbol-name entry-type))
-         (prefix             (concat "guix-" entry-type-str "-info"))
-         (group              (intern prefix))
-         (format-var         (intern (concat prefix "-format"))))
-    (guix-keyword-args-let args
-        ((show-entries-val   :show-entries-function)
-         (format-val         :format))
-      `(progn
-         (defcustom ,format-var ,format-val
-           ,(format "\
-List of methods for inserting '%s' entry.
-Each METHOD should be either a function or should have the
-following form:
-
-  (PARAM INSERT-TITLE INSERT-VALUE)
-
-If METHOD is a function, it is called with an entry as argument.
-
-PARAM is a name of '%s' entry parameter.
-
-INSERT-TITLE may be either a symbol or a list.  If it is a
-symbol, it should be a function or an alias from
-`guix-info-title-aliases', in which case it is called with title
-as argument.  If it is a list, it should have a
-form (FUN-OR-ALIAS [ARGS ...]), in which case FUN-OR-ALIAS is
-called with title and ARGS as arguments.
-
-INSERT-VALUE may be either a symbol or a list.  If it is a
-symbol, it should be a function or an alias from
-`guix-info-value-aliases', in which case it is called with value
-and entry as arguments.  If it is a list, it should have a
-form (FUN-OR-ALIAS [ARGS ...]), in which case FUN-OR-ALIAS is
-called with value and ARGS as arguments.
-
-Parameters are inserted in the same order as defined by this list.
-After calling each METHOD, a new line is inserted."
-                    entry-type-str entry-type-str)
-           :type 'sexp
-           :group ',group)
-
-         (guix-alist-put!
-          '((format . ,format-var))
-          'guix-info-data ',entry-type)
-
-         ,(if show-entries-val
-              `(guix-buffer-define-interface info ,entry-type
-                 :show-entries-function ,show-entries-val
-                 ,@%foreign-args)
-
-            (let ((insert-fun (intern (concat prefix "-insert-entries"))))
-              `(progn
-                 (defun ,insert-fun (entries)
-                   ,(format "\
-Print '%s' ENTRIES in the current 'info' buffer."
-                            entry-type-str)
-                   (guix-info-insert-entries entries ',entry-type))
-
-                 (guix-buffer-define-interface info ,entry-type
-                   :insert-entries-function ',insert-fun
-                   :mode-init-function 'guix-info-mode-initialize
-                   ,@%foreign-args))))))))
-
-
-(defvar guix-info-font-lock-keywords
-  (eval-when-compile
-    `((,(rx "(" (group "guix-info-define-interface")
-            symbol-end)
-       . 1))))
-
-(font-lock-add-keywords 'emacs-lisp-mode guix-info-font-lock-keywords)
-
-(provide 'guix-info)
-
-;;; guix-info.el ends here
diff --git a/emacs/guix-init.el b/emacs/guix-init.el
deleted file mode 100644
index bd75e54e03..0000000000
--- a/emacs/guix-init.el
+++ /dev/null
@@ -1,3 +0,0 @@
-(require 'guix-autoloads)
-(message "(require 'guix-init) is obsolete, use (require 'guix-autoloads) instead.")
-(provide 'guix-init)
diff --git a/emacs/guix-license.el b/emacs/guix-license.el
deleted file mode 100644
index 6003a21aac..0000000000
--- a/emacs/guix-license.el
+++ /dev/null
@@ -1,65 +0,0 @@
-;;; guix-license.el --- Licenses
-
-;; Copyright © 2016 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides the code to work with licenses of Guix packages.
-
-;;; Code:
-
-(require 'guix-read)
-(require 'guix-backend)
-(require 'guix-guile)
-
-(defun guix-license-file (&optional directory)
-  "Return name of the file with license definitions.
-DIRECTORY is a directory with Guix source (`guix-directory' by default)."
-  (expand-file-name "guix/licenses.scm"
-                    (or directory guix-directory)))
-
-(defun guix-lookup-license-url (license)
-  "Return URL of a LICENSE."
-  (or (guix-eval-read (guix-make-guile-expression
-                       'lookup-license-uri license))
-      (error "Hm, I don't know URL of '%s' license" license)))
-
-;;;###autoload
-(defun guix-find-license-definition (license &optional directory)
-  "Open licenses file from DIRECTORY and move to the LICENSE definition.
-See `guix-license-file' for the meaning of DIRECTORY.
-Interactively, with prefix argument, prompt for DIRECTORY."
-  (interactive
-   (list (guix-read-license-name)
-         (guix-read-directory)))
-  (find-file (guix-license-file directory))
-  (goto-char (point-min))
-  (when (re-search-forward (concat "\"" (regexp-quote license) "\"")
-                           nil t)
-    (beginning-of-defun)
-    (recenter 1)))
-
-;;;###autoload
-(defun guix-browse-license-url (license)
-  "Browse URL of a LICENSE."
-  (interactive (list (guix-read-license-name)))
-  (browse-url (guix-lookup-license-url license)))
-
-(provide 'guix-license)
-
-;;; guix-license.el ends here
diff --git a/emacs/guix-list.el b/emacs/guix-list.el
deleted file mode 100644
index c91c67cb29..0000000000
--- a/emacs/guix-list.el
+++ /dev/null
@@ -1,585 +0,0 @@
-;;; guix-list.el --- 'List' buffer interface for displaying data  -*- lexical-binding: t -*-
-
-;; Copyright © 2014, 2015 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides 'list' buffer interface for displaying an arbitrary
-;; data.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'tabulated-list)
-(require 'guix-buffer)
-(require 'guix-info)
-(require 'guix-entry)
-(require 'guix-utils)
-
-(guix-define-buffer-type list)
-
-(defface guix-list-file-name
-  '((t :inherit guix-info-file-name))
-  "Face used for file names."
-  :group 'guix-list-faces)
-
-(defface guix-list-url
-  '((t :inherit guix-info-url))
-  "Face used for URLs."
-  :group 'guix-list-faces)
-
-(defface guix-list-time
-  '((t :inherit guix-info-time))
-  "Face used for time stamps."
-  :group 'guix-list-faces)
-
-(defun guix-list-describe (&optional mark-names)
-  "Describe entries marked with a general mark.
-'Describe' means display entries in 'info' buffer.
-If no entries are marked, describe the current entry.
-With prefix argument, describe entries marked with any mark."
-  (interactive (list (unless current-prefix-arg '(general))))
-  (let* ((ids        (or (apply #'guix-list-get-marked-id-list mark-names)
-                         (list (guix-list-current-id))))
-         (count      (length ids))
-         (entry-type (guix-buffer-current-entry-type)))
-    (when (or (<= count (guix-list-describe-warning-count entry-type))
-              (y-or-n-p (format "Do you really want to describe %d entries? "
-                                count)))
-      (guix-list-describe-entries entry-type ids))))
-
-
-;;; Wrappers for 'list' variables
-
-(defvar guix-list-data nil
-  "Alist with 'list' data.
-This alist is filled by `guix-list-define-interface' macro.")
-
-(defun guix-list-value (entry-type symbol)
-  "Return SYMBOL's value for ENTRY-TYPE from `guix-list-data'."
-  (symbol-value (guix-assq-value guix-list-data entry-type symbol)))
-
-(defun guix-list-param-title (entry-type param)
-  "Return column title of an ENTRY-TYPE parameter PARAM."
-  (guix-buffer-param-title 'list entry-type param))
-
-(defun guix-list-format (entry-type)
-  "Return column format for ENTRY-TYPE."
-  (guix-list-value entry-type 'format))
-
-(defun guix-list-displayed-params (entry-type)
-  "Return a list of ENTRY-TYPE parameters that should be displayed."
-  (mapcar #'car (guix-list-format entry-type)))
-
-(defun guix-list-sort-key (entry-type)
-  "Return sort key for ENTRY-TYPE."
-  (guix-list-value entry-type 'sort-key))
-
-(defun guix-list-additional-marks (entry-type)
-  "Return alist of additional marks for ENTRY-TYPE."
-  (guix-list-value entry-type 'marks))
-
-(defun guix-list-single-entry? (entry-type)
-  "Return non-nil, if a single entry of ENTRY-TYPE should be listed."
-  (guix-list-value entry-type 'list-single))
-
-(defun guix-list-describe-warning-count (entry-type)
-  "Return the maximum number of ENTRY-TYPE entries to describe."
-  (guix-list-value entry-type 'describe-count))
-
-(defun guix-list-describe-entries (entry-type ids)
-  "Describe ENTRY-TYPE entries with IDS in 'info' buffer"
-  (funcall (guix-list-value entry-type 'describe)
-           ids))
-
-
-;;; Tabulated list internals
-
-(defun guix-list-sort-numerically (column a b)
-  "Compare COLUMN of tabulated entries A and B numerically.
-This function is used for sort predicates for `tabulated-list-format'.
-Return non-nil, if B is bigger than A."
-  (cl-flet ((num (entry)
-              (string-to-number (aref (cadr entry) column))))
-    (> (num b) (num a))))
-
-(defmacro guix-list-define-numerical-sorter (column)
-  "Define numerical sort predicate for COLUMN.
-See `guix-list-sort-numerically' for details."
-  (let ((name (intern (format "guix-list-sort-numerically-%d" column)))
-        (doc  (format "\
-Predicate to sort tabulated list by column %d numerically.
-See `guix-list-sort-numerically' for details."
-                      column)))
-    `(defun ,name (a b)
-       ,doc
-       (guix-list-sort-numerically ,column a b))))
-
-(defmacro guix-list-define-numerical-sorters (n)
-  "Define numerical sort predicates for columns from 0 to N.
-See `guix-list-define-numerical-sorter' for details."
-  `(progn
-     ,@(mapcar (lambda (i)
-                 `(guix-list-define-numerical-sorter ,i))
-               (number-sequence 0 n))))
-
-(guix-list-define-numerical-sorters 9)
-
-(defun guix-list-tabulated-sort-key (entry-type)
-  "Return ENTRY-TYPE sort key for `tabulated-list-sort-key'."
-  (let ((sort-key (guix-list-sort-key entry-type)))
-    (and sort-key
-         (cons (guix-list-param-title entry-type (car sort-key))
-               (cdr sort-key)))))
-
-(defun guix-list-tabulated-vector (entry-type fun)
-  "Call FUN on each column specification for ENTRY-TYPE.
-
-FUN is applied to column specification as arguments (see
-`guix-list-format').
-
-Return a vector made of values of FUN calls."
-  (apply #'vector
-         (mapcar (lambda (col-spec)
-                   (apply fun col-spec))
-                 (guix-list-format entry-type))))
-
-(defun guix-list-tabulated-format (entry-type)
-  "Return ENTRY-TYPE list specification for `tabulated-list-format'."
-  (guix-list-tabulated-vector
-   entry-type
-   (lambda (param _ &rest rest-spec)
-     (cons (guix-list-param-title entry-type param)
-           rest-spec))))
-
-(defun guix-list-tabulated-entries (entries entry-type)
-  "Return a list of ENTRY-TYPE values for `tabulated-list-entries'."
-  (mapcar (lambda (entry)
-            (list (guix-entry-id entry)
-                  (guix-list-tabulated-entry entry entry-type)))
-          entries))
-
-(defun guix-list-tabulated-entry (entry entry-type)
-  "Return array of values for `tabulated-list-entries'.
-Parameters are taken from ENTRY-TYPE ENTRY."
-  (guix-list-tabulated-vector
-   entry-type
-   (lambda (param fun &rest _)
-     (let ((val (guix-entry-value entry param)))
-       (if fun
-           (funcall fun val entry)
-         (guix-get-string val))))))
-
-
-;;; Displaying entries
-
-(defun guix-list-get-display-entries (entry-type &rest args)
-  "Search for entries and show them in a 'list' buffer preferably."
-  (let ((entries (guix-buffer-get-entries 'list entry-type args)))
-    (if (or (null entries)      ; = 0
-            (cdr entries)       ; > 1
-            (guix-list-single-entry? entry-type)
-            (null (guix-buffer-value 'info entry-type 'show-entries)))
-        (guix-buffer-display-entries entries 'list entry-type args 'add)
-      (if (equal (guix-buffer-value 'info entry-type 'get-entries)
-                 (guix-buffer-value 'list entry-type 'get-entries))
-          (guix-buffer-display-entries entries 'info entry-type args 'add)
-        (guix-buffer-get-display-entries 'info entry-type args 'add)))))
-
-(defun guix-list-insert-entries (entries entry-type)
-  "Print ENTRY-TYPE ENTRIES in the current buffer."
-  (setq tabulated-list-entries
-        (guix-list-tabulated-entries entries entry-type))
-  (tabulated-list-print))
-
-(defun guix-list-get-one-line (val &optional _)
-  "Return one-line string from a multi-line string VAL.
-VAL may be nil."
-  (if val
-      (guix-get-one-line val)
-    (guix-get-string nil)))
-
-(defun guix-list-get-time (seconds &optional _)
-  "Return formatted time string from SECONDS."
-  (guix-get-string (guix-get-time-string seconds)
-                   'guix-list-time))
-
-(defun guix-list-get-file-name (file-name &optional _)
-  "Return FILE-NAME button specification for `tabulated-list-entries'."
-  (list file-name
-        'face 'guix-list-file-name
-        'action (lambda (btn) (find-file (button-label btn)))
-        'follow-link t
-        'help-echo "Find file"))
-
-(defun guix-list-get-url (url &optional _)
-  "Return URL button specification for `tabulated-list-entries'."
-  (list url
-        'face 'guix-list-url
-        'action (lambda (btn) (browse-url (button-label btn)))
-        'follow-link t
-        'help-echo "Browse URL"))
-
-
-;;; 'List' lines
-
-(defun guix-list-current-id ()
-  "Return ID of the entry at point."
-  (or (tabulated-list-get-id)
-      (user-error "No entry here")))
-
-(defun guix-list-current-entry ()
-  "Return entry at point."
-  (guix-entry-by-id (guix-list-current-id)
-                    (guix-buffer-current-entries)))
-
-(defun guix-list-for-each-line (fun &rest args)
-  "Call FUN with ARGS for each entry line."
-  (or (derived-mode-p 'guix-list-mode)
-      (error "The current buffer is not in Guix List mode"))
-  (save-excursion
-    (goto-char (point-min))
-    (while (not (eobp))
-      (apply fun args)
-      (forward-line))))
-
-(defun guix-list-fold-lines (fun init)
-  "Fold over entry lines in the current list buffer.
-Call FUN with RESULT as argument for each line, using INIT as
-the initial value of RESULT.  Return the final result."
-  (let ((res init))
-    (guix-list-for-each-line
-     (lambda () (setq res (funcall fun res))))
-    res))
-
-
-;;; Marking and sorting
-
-(defvar-local guix-list-marked nil
-  "List of the marked entries.
-Each element of the list has a form:
-
-  (ID MARK-NAME . ARGS)
-
-ID is an entry ID.
-MARK-NAME is a symbol from `guix-list-marks'.
-ARGS is a list of additional values.")
-
-(defvar-local guix-list-marks nil
-  "Alist of available mark names and mark characters.")
-
-(defvar guix-list-default-marks
-  '((empty   . ?\s)
-    (general . ?*))
-  "Alist of default mark names and mark characters.")
-
-(defun guix-list-marks (entry-type)
-  "Return alist of available marks for ENTRY-TYPE."
-  (append guix-list-default-marks
-          (guix-list-additional-marks entry-type)))
-
-(defun guix-list-get-mark (name)
-  "Return mark character by its NAME."
-  (or (guix-assq-value guix-list-marks name)
-      (error "Mark '%S' not found" name)))
-
-(defun guix-list-get-mark-string (name)
-  "Return mark string by its NAME."
-  (string (guix-list-get-mark name)))
-
-(defun guix-list-current-mark ()
-  "Return mark character of the current line."
-  (char-after (line-beginning-position)))
-
-(defun guix-list-get-marked (&rest mark-names)
-  "Return list of specs of entries marked with any mark from MARK-NAMES.
-Entry specs are elements from `guix-list-marked' list.
-If MARK-NAMES are not specified, use all marks from
-`guix-list-marks' except the `empty' one."
-  (or mark-names
-      (setq mark-names
-            (delq 'empty
-                  (mapcar #'car guix-list-marks))))
-  (cl-remove-if-not (lambda (assoc)
-                      (memq (cadr assoc) mark-names))
-                    guix-list-marked))
-
-(defun guix-list-get-marked-args (mark-name)
-  "Return list of (ID . ARGS) elements from lines marked with MARK-NAME.
-See `guix-list-marked' for the meaning of ARGS."
-  (mapcar (lambda (spec)
-            (let ((id (car spec))
-                  (args (cddr spec)))
-              (cons id args)))
-          (guix-list-get-marked mark-name)))
-
-(defun guix-list-get-marked-id-list (&rest mark-names)
-  "Return list of IDs of entries marked with any mark from MARK-NAMES.
-See `guix-list-get-marked' for details."
-  (mapcar #'car (apply #'guix-list-get-marked mark-names)))
-
-(defun guix-list--mark (mark-name &optional advance &rest args)
-  "Put a mark on the current line.
-Also add the current entry to `guix-list-marked' using its ID and ARGS.
-MARK-NAME is a symbol from `guix-list-marks'.
-If ADVANCE is non-nil, move forward by one line after marking."
-  (let ((id (guix-list-current-id)))
-    (if (eq mark-name 'empty)
-        (setq guix-list-marked (assq-delete-all id guix-list-marked))
-      (let ((assoc (assq id guix-list-marked))
-            (val (cons mark-name args)))
-        (if assoc
-            (setcdr assoc val)
-          (push (cons id val) guix-list-marked)))))
-  (tabulated-list-put-tag (guix-list-get-mark-string mark-name)
-                          advance))
-
-(defun guix-list-mark (&optional arg)
-  "Mark the current line and move to the next line.
-With ARG, mark all lines."
-  (interactive "P")
-  (if arg
-      (guix-list-mark-all)
-    (guix-list--mark 'general t)))
-
-(defun guix-list-mark-all (&optional mark-name)
-  "Mark all lines with MARK-NAME mark.
-MARK-NAME is a symbol from `guix-list-marks'.
-Interactively, put a general mark on all lines."
-  (interactive)
-  (or mark-name (setq mark-name 'general))
-  (guix-list-for-each-line #'guix-list--mark mark-name))
-
-(defun guix-list-unmark (&optional arg)
-  "Unmark the current line and move to the next line.
-With ARG, unmark all lines."
-  (interactive "P")
-  (if arg
-      (guix-list-unmark-all)
-    (guix-list--mark 'empty t)))
-
-(defun guix-list-unmark-backward ()
-  "Move up one line and unmark it."
-  (interactive)
-  (forward-line -1)
-  (guix-list--mark 'empty))
-
-(defun guix-list-unmark-all ()
-  "Unmark all lines."
-  (interactive)
-  (guix-list-mark-all 'empty))
-
-(defun guix-list-restore-marks ()
-  "Put marks according to `guix-list-marked'."
-  (guix-list-for-each-line
-   (lambda ()
-     (let ((mark-name (car (guix-assq-value guix-list-marked
-                                            (guix-list-current-id)))))
-       (tabulated-list-put-tag
-        (guix-list-get-mark-string (or mark-name 'empty)))))))
-
-(defun guix-list-sort (&optional n)
-  "Sort guix list entries by the column at point.
-With a numeric prefix argument N, sort the Nth column.
-Same as `tabulated-list-sort', but also restore marks after sorting."
-  (interactive "P")
-  (tabulated-list-sort n)
-  (guix-list-restore-marks))
-
-
-;;; Major mode and interface definer
-
-(defvar guix-list-mode-map
-  (let ((map (make-sparse-keymap)))
-    (set-keymap-parent
-     map (make-composed-keymap guix-buffer-map
-                               tabulated-list-mode-map))
-    (define-key map (kbd "RET") 'guix-list-describe)
-    (define-key map (kbd "i")   'guix-list-describe)
-    (define-key map (kbd "m")   'guix-list-mark)
-    (define-key map (kbd "*")   'guix-list-mark)
-    (define-key map (kbd "u")   'guix-list-unmark)
-    (define-key map (kbd "DEL") 'guix-list-unmark-backward)
-    (define-key map [remap tabulated-list-sort] 'guix-list-sort)
-    map)
-  "Keymap for `guix-list-mode' buffers.")
-
-(define-derived-mode guix-list-mode tabulated-list-mode "Guix-List"
-  "Parent mode for displaying data in 'list' form.")
-
-(defun guix-list-mode-initialize (entry-type)
-  "Set up the current 'list' buffer for displaying ENTRY-TYPE entries."
-  (setq tabulated-list-padding  2
-        tabulated-list-format   (guix-list-tabulated-format entry-type)
-        tabulated-list-sort-key (guix-list-tabulated-sort-key entry-type))
-  (setq-local guix-list-marks   (guix-list-marks entry-type))
-  (tabulated-list-init-header))
-
-(defmacro guix-list-define-interface (entry-type &rest args)
-  "Define 'list' interface for displaying ENTRY-TYPE entries.
-Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ...
-
-Required keywords:
-
-  - `:format' - default value of the generated
-    `guix-ENTRY-TYPE-list-format' variable.
-
-Optional keywords:
-
-  - `:sort-key' - default value of the generated
-    `guix-ENTRY-TYPE-list-sort-key' variable.
-
-  - `:describe-function' - default value of the generated
-    `guix-ENTRY-TYPE-describe-function' variable.
-
-  - `:list-single?' - default value of the generated
-    `guix-ENTRY-TYPE-list-single' variable.
-
-  - `:marks' - default value of the generated
-    `guix-ENTRY-TYPE-list-marks' variable.
-
-The rest keyword arguments are passed to
-`guix-buffer-define-interface' macro."
-  (declare (indent 1))
-  (let* ((entry-type-str     (symbol-name entry-type))
-         (prefix             (concat "guix-" entry-type-str "-list"))
-         (group              (intern prefix))
-         (describe-var       (intern (concat prefix "-describe-function")))
-         (describe-count-var (intern (concat prefix
-                                             "-describe-warning-count")))
-         (format-var         (intern (concat prefix "-format")))
-         (sort-key-var       (intern (concat prefix "-sort-key")))
-         (list-single-var    (intern (concat prefix "-single")))
-         (marks-var          (intern (concat prefix "-marks"))))
-    (guix-keyword-args-let args
-        ((show-entries-val   :show-entries-function)
-         (describe-val       :describe-function)
-         (describe-count-val :describe-count 10)
-         (format-val         :format)
-         (sort-key-val       :sort-key)
-         (list-single-val    :list-single?)
-         (marks-val          :marks))
-      `(progn
-         (defcustom ,format-var ,format-val
-           ,(format "\
-List of format values of the displayed columns.
-Each element of the list has a form:
-
-  (PARAM VALUE-FUN WIDTH SORT . PROPS)
-
-PARAM is a name of '%s' entry parameter.
-
-VALUE-FUN may be either nil or a function returning a value that
-will be inserted.  The function is called with 2 arguments: the
-first one is the value of the parameter; the second one is an
-entry (alist of parameter names and values).
-
-For the meaning of WIDTH, SORT and PROPS, see
-`tabulated-list-format'."
-                    entry-type-str)
-           :type 'sexp
-           :group ',group)
-
-         (defcustom ,sort-key-var ,sort-key-val
-           ,(format "\
-Default sort key for 'list' buffer with '%s' entries.
-Should be nil (no sort) or have a form:
-
-  (PARAM . FLIP)
-
-PARAM is the name of '%s' entry parameter.  For the meaning of
-FLIP, see `tabulated-list-sort-key'."
-                    entry-type-str entry-type-str)
-           :type '(choice (const :tag "No sort" nil)
-                          (cons symbol boolean))
-           :group ',group)
-
-         (defvar ,marks-var ,marks-val
-           ,(format "\
-Alist of additional marks for 'list' buffer with '%s' entries.
-Marks from this list are used along with `guix-list-default-marks'."
-                    entry-type-str))
-
-         (defcustom ,list-single-var ,list-single-val
-           ,(format "\
-If non-nil, list '%s' entry even if it is the only matching result.
-If nil, show a single '%s' entry in the 'info' buffer."
-                    entry-type-str entry-type-str)
-           :type 'boolean
-           :group ',group)
-
-         (defcustom ,describe-count-var ,describe-count-val
-           ,(format "\
-The maximum number of '%s' entries to describe without a warning.
-If a user wants to describe more than this number of marked
-entries, he will be prompted for confirmation.
-See also `guix-list-describe'."
-                    entry-type-str)
-           :type 'integer
-           :group ',group)
-
-         (defvar ,describe-var ,describe-val
-           ,(format "Function used to describe '%s' entries."
-                    entry-type-str))
-
-         (guix-alist-put!
-          '((describe       . ,describe-var)
-            (describe-count . ,describe-count-var)
-            (format         . ,format-var)
-            (sort-key       . ,sort-key-var)
-            (list-single    . ,list-single-var)
-            (marks          . ,marks-var))
-          'guix-list-data ',entry-type)
-
-         ,(if show-entries-val
-              `(guix-buffer-define-interface list ,entry-type
-                 :show-entries-function ,show-entries-val
-                 ,@%foreign-args)
-
-            (let ((insert-fun    (intern (concat prefix "-insert-entries")))
-                  (mode-init-fun (intern (concat prefix "-mode-initialize"))))
-              `(progn
-                 (defun ,insert-fun (entries)
-                   ,(format "\
-Print '%s' ENTRIES in the current 'list' buffer."
-                            entry-type-str)
-                   (guix-list-insert-entries entries ',entry-type))
-
-                 (defun ,mode-init-fun ()
-                   ,(format "\
-Set up the current 'list' buffer for displaying '%s' entries."
-                            entry-type-str)
-                   (guix-list-mode-initialize ',entry-type))
-
-                 (guix-buffer-define-interface list ,entry-type
-                   :insert-entries-function ',insert-fun
-                   :mode-init-function ',mode-init-fun
-                   ,@%foreign-args))))))))
-
-
-(defvar guix-list-font-lock-keywords
-  (eval-when-compile
-    `((,(rx "(" (group "guix-list-define-interface")
-            symbol-end)
-       . 1))))
-
-(font-lock-add-keywords 'emacs-lisp-mode guix-list-font-lock-keywords)
-
-(provide 'guix-list)
-
-;;; guix-list.el ends here
diff --git a/emacs/guix-location.el b/emacs/guix-location.el
deleted file mode 100644
index 81396b4017..0000000000
--- a/emacs/guix-location.el
+++ /dev/null
@@ -1,79 +0,0 @@
-;;; guix-location.el --- Package locations
-
-;; Copyright © 2016 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public Location as published by
-;; the Free Software Foundation, either version 3 of the Location, 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 Location for more details.
-
-;; You should have received a copy of the GNU General Public Location
-;; along with this program.  If not, see <http://www.gnu.org/locations/>.
-
-;;; Commentary:
-
-;; This file provides the code to work with locations of Guix packages.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'guix-backend)
-(require 'guix-read)
-(require 'guix-guile)
-
-(defun guix-package-location (id-or-name)
-  "Return location of a package with ID-OR-NAME.
-For the meaning of location, see `guix-find-location'."
-  (guix-eval-read (guix-make-guile-expression
-                   'package-location-string id-or-name)))
-
-;;;###autoload
-(defun guix-find-location (location &optional directory)
-  "Go to LOCATION of a package.
-LOCATION is a string of the form:
-
-  \"FILE:LINE:COLUMN\"
-
-If FILE is relative, it is considered to be relative to
-DIRECTORY (`guix-directory' by default).
-
-Interactively, prompt for LOCATION.  With prefix argument, prompt
-for DIRECTORY as well."
-  (interactive
-   (list (guix-read-package-location)
-         (guix-read-directory)))
-  (cl-multiple-value-bind (file line column)
-      (split-string location ":")
-    (find-file (expand-file-name file (or directory guix-directory)))
-    (when (and line column)
-      (let ((line   (string-to-number line))
-            (column (string-to-number column)))
-        (goto-char (point-min))
-        (forward-line (- line 1))
-        (move-to-column column)
-        (recenter 1)))))
-
-;;;###autoload
-(defun guix-edit (id-or-name &optional directory)
-  "Edit (go to location of) package with ID-OR-NAME.
-See `guix-find-location' for the meaning of package location and
-DIRECTORY.
-Interactively, with prefix argument, prompt for DIRECTORY."
-  (interactive
-   (list (guix-read-package-name)
-         (guix-read-directory)))
-  (let ((loc (guix-package-location id-or-name)))
-    (if loc
-        (guix-find-location loc directory)
-      (message "Couldn't find package location."))))
-
-(provide 'guix-location)
-
-;;; guix-location.el ends here
diff --git a/emacs/guix-main.scm b/emacs/guix-main.scm
deleted file mode 100644
index 040932f307..0000000000
--- a/emacs/guix-main.scm
+++ /dev/null
@@ -1,1163 +0,0 @@
-;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
-;;;
-;;; This file is part of GNU Guix.
-;;;
-;;; GNU Guix is free software; you can redistribute it and/or modify it
-;;; under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 3 of the License, or (at
-;;; your option) any later version.
-;;;
-;;; GNU Guix is distributed in the hope that it will be useful, but
-;;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; Information about packages and generations is passed to the elisp
-;; side in the form of alists of parameters (such as ‘name’ or
-;; ‘version’) and their values.
-
-;; ‘entries’ procedure is the “entry point” for the elisp side to get
-;; information about packages and generations.
-
-;; Since name/version pair is not necessarily unique, we use
-;; `object-address' to identify a package (for ‘id’ parameter), if
-;; possible.  However for the obsolete packages (that can be found in
-;; installed manifest but not in a package directory), ‘id’ parameter is
-;; still "name-version" string.  So ‘id’ package parameter in the code
-;; below is either an object-address number or a full-name string.
-
-;;; Code:
-
-(use-modules
- (ice-9 vlist)
- (ice-9 match)
- (ice-9 popen)
- (srfi srfi-1)
- (srfi srfi-2)
- (srfi srfi-11)
- (srfi srfi-19)
- (srfi srfi-26)
- (guix)
- (guix combinators)
- (guix git-download)
- (guix grafts)
- (guix packages)
- (guix profiles)
- (guix licenses)
- (guix utils)
- (guix ui)
- (guix scripts)
- (guix scripts package)
- (gnu packages)
- (gnu system))
-
-(define-syntax-rule (first-or-false lst)
-  (and (not (null? lst))
-       (first lst)))
-
-(define (list-maybe obj)
-  (if (list? obj) obj (list obj)))
-
-(define (output+error thunk)
-  "Call THUNK and return 2 values: output and error output as strings."
-  (let ((output-port (open-output-string))
-        (error-port  (open-output-string)))
-    (with-output-to-port output-port
-      (lambda () (with-error-to-port error-port thunk)))
-    (let ((strings (list (get-output-string output-port)
-                         (get-output-string error-port))))
-      (close-output-port output-port)
-      (close-output-port error-port)
-      (apply values strings))))
-
-(define (full-name->name+version spec)
-  "Given package specification SPEC with or without output,
-return two values: name and version.  For example, for SPEC
-\"foo@0.9.1b:lib\", return \"foo\" and \"0.9.1b\"."
-  (let-values (((name version output)
-                (package-specification->name+version+output spec)))
-    (values name version)))
-
-(define (name+version->full-name name version)
-  (string-append name "@" version))
-
-(define* (make-package-specification name #:optional version output)
-  (let ((full-name (if version
-                       (name+version->full-name name version)
-                       name)))
-    (if output
-        (string-append full-name ":" output)
-        full-name)))
-
-(define (manifest-entry->name+version+output entry)
-  (values
-   (manifest-entry-name    entry)
-   (manifest-entry-version entry)
-   (manifest-entry-output  entry)))
-
-(define (manifest-entry->package-specification entry)
-  (call-with-values
-      (lambda () (manifest-entry->name+version+output entry))
-    make-package-specification))
-
-(define (manifest-entries->package-specifications entries)
-  (map manifest-entry->package-specification entries))
-
-(define (profile-package-specifications profile)
-  "Return a list of package specifications for PROFILE."
-  (let ((manifest (profile-manifest profile)))
-    (manifest-entries->package-specifications
-     (manifest-entries manifest))))
-
-(define (profile->specifications+paths profile)
-  "Return a list of package specifications and paths for PROFILE.
-Each element of the list is a list of the package specification and its path."
-  (let ((manifest (profile-manifest profile)))
-    (map (lambda (entry)
-           (list (manifest-entry->package-specification entry)
-                 (manifest-entry-item entry)))
-         (manifest-entries manifest))))
-
-(define (profile-difference profile1 profile2)
-  "Return a list of package specifications for outputs installed in PROFILE1
-and not installed in PROFILE2."
-  (let ((specs1 (profile-package-specifications profile1))
-        (specs2 (profile-package-specifications profile2)))
-    (lset-difference string=? specs1 specs2)))
-
-(define (manifest-entries->hash-table entries)
-  "Return a hash table of name keys and lists of matching manifest ENTRIES."
-  (let ((table (make-hash-table (length entries))))
-    (for-each (lambda (entry)
-                (let* ((key (manifest-entry-name entry))
-                       (ref (hash-ref table key)))
-                  (hash-set! table key
-                             (if ref (cons entry ref) (list entry)))))
-              entries)
-    table))
-
-(define (manifest=? m1 m2)
-  (or (eq? m1 m2)
-      (equal? m1 m2)))
-
-(define manifest->hash-table
-  (let ((current-manifest #f)
-        (current-table #f))
-    (lambda (manifest)
-      "Return a hash table of name keys and matching MANIFEST entries."
-      (unless (manifest=? manifest current-manifest)
-        (set! current-manifest manifest)
-        (set! current-table (manifest-entries->hash-table
-                             (manifest-entries manifest))))
-      current-table)))
-
-(define* (manifest-entries-by-name manifest name #:optional version output)
-  "Return a list of MANIFEST entries matching NAME, VERSION and OUTPUT."
-  (let ((entries (or (hash-ref (manifest->hash-table manifest) name)
-                     '())))
-    (if (or version output)
-        (filter (lambda (entry)
-                  (and (or (not version)
-                           (equal? version (manifest-entry-version entry)))
-                       (or (not output)
-                           (equal? output  (manifest-entry-output entry)))))
-                entries)
-        entries)))
-
-(define (manifest-entry-by-output entries output)
-  "Return a manifest entry from ENTRIES matching OUTPUT."
-  (find (lambda (entry)
-          (string= output (manifest-entry-output entry)))
-        entries))
-
-(define (fold-manifest-by-name manifest proc init)
-  "Fold over MANIFEST entries.
-Call (PROC NAME VERSION ENTRIES RESULT), using INIT as the initial value
-of RESULT.  ENTRIES is a list of manifest entries with NAME/VERSION."
-  (hash-fold (lambda (name entries res)
-               (proc name (manifest-entry-version (car entries))
-                     entries res))
-             init
-             (manifest->hash-table manifest)))
-
-(define* (object-transformer param-alist #:optional (params '()))
-  "Return procedure transforming objects into alist of parameter/value pairs.
-
-PARAM-ALIST is alist of available parameters (symbols) and procedures
-returning values of these parameters.  Each procedure is applied to
-objects.
-
-PARAMS is list of parameters from PARAM-ALIST that should be returned by
-a resulting procedure.  If PARAMS is not specified or is an empty list,
-use all available parameters.
-
-Example:
-
-  (let* ((alist `((plus1 . ,1+) (minus1 . ,1-) (mul2 . ,(cut * 2 <>))))
-         (number->alist (object-transformer alist '(plus1 mul2))))
-    (number->alist 8))
-  =>
-  ((plus1 . 9) (mul2 . 16))
-"
-  (let* ((use-all-params (null? params))
-         (alist (filter-map (match-lambda
-                             ((param . proc)
-                              (and (or use-all-params
-                                       (memq param params))
-                                   (cons param proc)))
-                             (_ #f))
-                            param-alist)))
-    (lambda objects
-      (map (match-lambda
-            ((param . proc)
-             (cons param (apply proc objects))))
-           alist))))
-
-(define %manifest-entry-param-alist
-  `((output       . ,manifest-entry-output)
-    (path         . ,manifest-entry-item)
-    (dependencies . ,manifest-entry-dependencies)))
-
-(define manifest-entry->sexp
-  (object-transformer %manifest-entry-param-alist))
-
-(define (manifest-entries->sexps entries)
-  (map manifest-entry->sexp entries))
-
-(define (package-inputs-names inputs)
-  "Return a list of full names of the packages from package INPUTS."
-  (filter-map (match-lambda
-               ((_ (? package? package))
-                (make-package-specification (package-name package)
-                                            (package-version package)))
-               ((_ (? package? package) output)
-                (make-package-specification (package-name package)
-                                            (package-version package)
-                                            output))
-               (_ #f))
-              inputs))
-
-(define (package-license-names package)
-  "Return a list of license names of the PACKAGE."
-  (filter-map (lambda (license)
-                (and (license? license)
-                     (license-name license)))
-              (list-maybe (package-license package))))
-
-(define (package-source-names package)
-  "Return a list of source names (URLs) of the PACKAGE."
-  (let ((source (package-source package)))
-    (and (origin? source)
-         (filter-map (lambda (uri)
-                       (cond ((string? uri)
-                              uri)
-                             ((git-reference? uri)
-                              (git-reference-url uri))
-                             (else "Unknown source type")))
-                     (list-maybe (origin-uri source))))))
-
-(define (package-unique? package)
-  "Return #t if PACKAGE is a single package with such name/version."
-  (match (packages-by-name (package-name package)
-                           (package-version package))
-    ((package) #t)
-    (_ #f)))
-
-(define %package-param-alist
-  `((id                . ,object-address)
-    (package-id        . ,object-address)
-    (name              . ,package-name)
-    (version           . ,package-version)
-    (license           . ,package-license-names)
-    (source            . ,package-source-names)
-    (synopsis          . ,package-synopsis)
-    (description       . ,package-description-string)
-    (home-url          . ,package-home-page)
-    (outputs           . ,package-outputs)
-    (systems           . ,package-supported-systems)
-    (non-unique        . ,(negate package-unique?))
-    (inputs            . ,(lambda (pkg)
-                            (package-inputs-names
-                             (package-inputs pkg))))
-    (native-inputs     . ,(lambda (pkg)
-                            (package-inputs-names
-                             (package-native-inputs pkg))))
-    (propagated-inputs . ,(lambda (pkg)
-                            (package-inputs-names
-                             (package-propagated-inputs pkg))))
-    (location          . ,(lambda (pkg)
-                            (location->string (package-location pkg))))))
-
-(define (package-param package param)
-  "Return a value of a PACKAGE PARAM."
-  (and=> (assq-ref %package-param-alist param)
-         (cut <> package)))
-
-
-;;; Finding packages.
-
-(define-values (package-by-address
-                register-package)
-  (let ((table (delay (fold-packages
-                       (lambda (package table)
-                         (vhash-consq (object-address package)
-                                      package table))
-                       vlist-null))))
-    (values
-     (lambda (address)
-       "Return package by its object ADDRESS."
-       (match (vhash-assq address (force table))
-         ((_ . package) package)
-         (_ #f)))
-     (lambda (package)
-       "Register PACKAGE by its 'object-address', so that later
-'package-by-address' can be used to access it."
-       (let ((table* (force table)))
-         (set! table
-               (delay (vhash-consq (object-address package)
-                                   package table*))))))))
-
-(define packages-by-name+version
-  (let ((table (delay (fold-packages
-                       (lambda (package table)
-                         (let ((file (location-file
-                                      (package-location package))))
-                           (vhash-cons (cons (package-name package)
-                                             (package-version package))
-                                       package table)))
-                       vlist-null))))
-    (lambda (name version)
-      "Return packages matching NAME and VERSION."
-      (vhash-fold* cons '() (cons name version) (force table)))))
-
-(define (packages-by-full-name full-name)
-  (call-with-values
-      (lambda () (full-name->name+version full-name))
-    packages-by-name+version))
-
-(define (packages-by-id id)
-  (if (integer? id)
-      (let ((pkg (package-by-address id)))
-        (if pkg (list pkg) '()))
-      (packages-by-full-name id)))
-
-(define (id->name+version id)
-  (if (integer? id)
-      (and=> (package-by-address id)
-             (lambda (pkg)
-               (values (package-name pkg)
-                       (package-version pkg))))
-      (full-name->name+version id)))
-
-(define (package-by-id id)
-  (first-or-false (packages-by-id id)))
-
-(define (newest-package-by-id id)
-  (and=> (id->name+version id)
-         (lambda (name)
-           (first-or-false (find-best-packages-by-name name #f)))))
-
-(define (matching-packages predicate)
-  (fold-packages (lambda (pkg res)
-                   (if (predicate pkg)
-                       (cons pkg res)
-                       res))
-                 '()))
-
-(define (filter-packages-by-output packages output)
-  (filter (lambda (package)
-            (member output (package-outputs package)))
-          packages))
-
-(define* (packages-by-name name #:optional version output)
-  "Return a list of packages matching NAME, VERSION and OUTPUT."
-  (let ((packages (if version
-                      (packages-by-name+version name version)
-                      (matching-packages
-                       (lambda (pkg) (string=? name (package-name pkg)))))))
-    (if output
-        (filter-packages-by-output packages output)
-        packages)))
-
-(define (manifest-entry->packages entry)
-  (call-with-values
-      (lambda () (manifest-entry->name+version+output entry))
-    packages-by-name))
-
-(define (packages-by-regexp regexp match-params)
-  "Return a list of packages matching REGEXP string.
-MATCH-PARAMS is a list of parameters that REGEXP can match."
-  (define (package-match? package regexp)
-    (any (lambda (param)
-           (let ((val (package-param package param)))
-             (and (string? val) (regexp-exec regexp val))))
-         match-params))
-
-  (let ((re (make-regexp regexp regexp/icase)))
-    (matching-packages (cut package-match? <> re))))
-
-(define (packages-by-license license)
-  "Return a list of packages with LICENSE."
-  (matching-packages
-   (lambda (package)
-     (memq license (list-maybe (package-license package))))))
-
-(define (all-available-packages)
-  "Return a list of all available packages."
-  (matching-packages (const #t)))
-
-(define (newest-available-packages)
-  "Return a list of the newest available packages."
-  (vhash-fold (lambda (name elem res)
-                (match elem
-                  ((_ newest pkgs ...)
-                   (cons newest res))))
-              '()
-              (find-newest-available-packages)))
-
-(define (packages-from-file file)
-  "Return a list of packages from FILE."
-  (let ((package (load (canonicalize-path file))))
-    (if (package? package)
-        (begin
-          (register-package package)
-          (list package))
-        '())))
-
-
-;;; Making package/output patterns.
-
-(define (specification->package-pattern specification)
-  (call-with-values
-      (lambda ()
-        (full-name->name+version specification))
-    list))
-
-(define (specification->output-pattern specification)
-  (call-with-values
-      (lambda ()
-        (package-specification->name+version+output specification #f))
-    list))
-
-(define (id->package-pattern id)
-  (if (integer? id)
-      (package-by-address id)
-      (specification->package-pattern id)))
-
-(define (id->output-pattern id)
-  "Return an output pattern by output ID.
-ID should be '<package-address>:<output>' or '<name>-<version>:<output>'."
-  (let-values (((name version output)
-                (package-specification->name+version+output id)))
-    (if version
-        (list name version output)
-        (list (package-by-address (string->number name))
-              output))))
-
-(define (specifications->package-patterns . specifications)
-  (map specification->package-pattern specifications))
-
-(define (specifications->output-patterns . specifications)
-  (map specification->output-pattern specifications))
-
-(define (ids->package-patterns . ids)
-  (map id->package-pattern ids))
-
-(define (ids->output-patterns . ids)
-  (map id->output-pattern ids))
-
-(define* (manifest-patterns-result packages res obsolete-pattern
-                                   #:optional installed-pattern)
-  "Auxiliary procedure for 'manifest-package-patterns' and
-'manifest-output-patterns'."
-  (if (null? packages)
-      (cons (obsolete-pattern) res)
-      (if installed-pattern
-          ;; We don't need duplicates for a list of installed packages,
-          ;; so just take any (car) package.
-          (cons (installed-pattern (car packages)) res)
-          res)))
-
-(define* (manifest-package-patterns manifest #:optional obsolete-only?)
-  "Return a list of package patterns for MANIFEST entries.
-If OBSOLETE-ONLY? is #f, use all entries, otherwise make patterns only
-for obsolete packages."
-  (fold-manifest-by-name
-   manifest
-   (lambda (name version entries res)
-     (manifest-patterns-result (packages-by-name name version)
-                               res
-                               (lambda () (list name version entries))
-                               (and (not obsolete-only?)
-                                    (cut list <> entries))))
-   '()))
-
-(define* (manifest-output-patterns manifest #:optional obsolete-only?)
-  "Return a list of output patterns for MANIFEST entries.
-If OBSOLETE-ONLY? is #f, use all entries, otherwise make patterns only
-for obsolete packages."
-  (fold (lambda (entry res)
-          (manifest-patterns-result (manifest-entry->packages entry)
-                                    res
-                                    (lambda () entry)
-                                    (and (not obsolete-only?)
-                                         (cut list <> entry))))
-        '()
-        (manifest-entries manifest)))
-
-(define (obsolete-package-patterns manifest)
-  (manifest-package-patterns manifest #t))
-
-(define (obsolete-output-patterns manifest)
-  (manifest-output-patterns manifest #t))
-
-
-;;; Transforming package/output patterns into alists.
-
-(define (obsolete-package-sexp name version entries)
-  "Return an alist with information about obsolete package.
-ENTRIES is a list of installed manifest entries."
-  `((id        . ,(name+version->full-name name version))
-    (name      . ,name)
-    (version   . ,version)
-    (outputs   . ,(map manifest-entry-output entries))
-    (obsolete  . #t)
-    (installed . ,(manifest-entries->sexps entries))))
-
-(define (package-pattern-transformer manifest params)
-  "Return 'package-pattern->package-sexps' procedure."
-  (define package->sexp
-    (object-transformer %package-param-alist params))
-
-  (define* (sexp-by-package package #:optional
-                            (entries (manifest-entries-by-name
-                                      manifest
-                                      (package-name package)
-                                      (package-version package))))
-    (cons (cons 'installed (manifest-entries->sexps entries))
-          (package->sexp package)))
-
-  (define (->sexps pattern)
-    (match pattern
-      ((? package? package)
-       (list (sexp-by-package package)))
-      (((? package? package) entries)
-       (list (sexp-by-package package entries)))
-      ((name version entries)
-       (list (obsolete-package-sexp
-              name version entries)))
-      ((name version)
-       (let ((packages (packages-by-name name version)))
-         (if (null? packages)
-             (let ((entries (manifest-entries-by-name
-                             manifest name version)))
-               (if (null? entries)
-                   '()
-                   (list (obsolete-package-sexp
-                          name version entries))))
-             (map sexp-by-package packages))))
-      (_ '())))
-
-  ->sexps)
-
-(define (output-pattern-transformer manifest params)
-  "Return 'output-pattern->output-sexps' procedure."
-  (define package->sexp
-    (object-transformer (alist-delete 'id %package-param-alist)
-                        params))
-
-  (define manifest-entry->sexp
-    (object-transformer (alist-delete 'output %manifest-entry-param-alist)
-                        params))
-
-  (define* (output-sexp pkg-alist pkg-address output
-                        #:optional entry)
-    (let ((entry-alist (if entry
-                           (manifest-entry->sexp entry)
-                           '()))
-          (base `((id        . ,(string-append
-                                 (number->string pkg-address)
-                                 ":" output))
-                  (output    . ,output)
-                  (installed . ,(->bool entry)))))
-      (append entry-alist base pkg-alist)))
-
-  (define (obsolete-output-sexp entry)
-    (let-values (((name version output)
-                  (manifest-entry->name+version+output entry)))
-      (let ((base `((id         . ,(make-package-specification
-                                    name version output))
-                    (package-id . ,(name+version->full-name name version))
-                    (name       . ,name)
-                    (version    . ,version)
-                    (output     . ,output)
-                    (obsolete   . #t)
-                    (installed  . #t))))
-        (append (manifest-entry->sexp entry) base))))
-
-  (define* (sexps-by-package package #:optional output
-                             (entries (manifest-entries-by-name
-                                       manifest
-                                       (package-name package)
-                                       (package-version package))))
-    ;; Assuming that PACKAGE has this OUTPUT.
-    (let ((pkg-alist (package->sexp package))
-          (address (object-address package))
-          (outputs (if output
-                       (list output)
-                       (package-outputs package))))
-      (map (lambda (output)
-             (output-sexp pkg-alist address output
-                          (manifest-entry-by-output entries output)))
-           outputs)))
-
-  (define* (sexps-by-manifest-entry entry #:optional
-                                    (packages (manifest-entry->packages
-                                               entry)))
-    (if (null? packages)
-        (list (obsolete-output-sexp entry))
-        (map (lambda (package)
-               (output-sexp (package->sexp package)
-                            (object-address package)
-                            (manifest-entry-output entry)
-                            entry))
-             packages)))
-
-  (define (->sexps pattern)
-    (match pattern
-      ((? package? package)
-       (sexps-by-package package))
-      ((package (? string? output))
-       (sexps-by-package package output))
-      ((? manifest-entry? entry)
-       (list (obsolete-output-sexp entry)))
-      ((package entry)
-       (sexps-by-manifest-entry entry (list package)))
-      ((name version output)
-       (let ((packages (packages-by-name name version output)))
-         (if (null? packages)
-             (let ((entries (manifest-entries-by-name
-                             manifest name version output)))
-               (append-map (cut sexps-by-manifest-entry <>)
-                           entries))
-             (append-map (cut sexps-by-package <> output)
-                         packages))))
-      (_ '())))
-
-  ->sexps)
-
-(define (entry-type-error entry-type)
-  (error (format #f "Wrong entry-type '~a'" entry-type)))
-
-(define (search-type-error entry-type search-type)
-  (error (format #f "Wrong search type '~a' for entry-type '~a'"
-                 search-type entry-type)))
-
-(define %pattern-transformers
-  `((package . ,package-pattern-transformer)
-    (output  . ,output-pattern-transformer)))
-
-(define (pattern-transformer entry-type)
-  (assq-ref %pattern-transformers entry-type))
-
-;; All procedures from inner alists are called with (MANIFEST . SEARCH-VALS)
-;; as arguments; see `package/output-sexps'.
-(define %patterns-makers
-  (let* ((apply-to-rest         (lambda (proc)
-                                  (lambda (_ . rest) (apply proc rest))))
-         (apply-to-first        (lambda (proc)
-                                  (lambda (first . _) (proc first))))
-         (manifest-package-proc (apply-to-first manifest-package-patterns))
-         (manifest-output-proc  (apply-to-first manifest-output-patterns))
-         (regexp-proc           (lambda (_ regexp params . __)
-                                  (packages-by-regexp regexp params)))
-         (license-proc          (lambda (_ license-name)
-                                  (packages-by-license
-                                   (lookup-license license-name))))
-         (location-proc         (lambda (_ location)
-                                  (packages-by-location-file location)))
-         (file-proc             (lambda (_ file)
-                                  (packages-from-file file)))
-         (all-proc              (lambda _ (all-available-packages)))
-         (newest-proc           (lambda _ (newest-available-packages))))
-    `((package
-       (id               . ,(apply-to-rest ids->package-patterns))
-       (name             . ,(apply-to-rest specifications->package-patterns))
-       (installed        . ,manifest-package-proc)
-       (obsolete         . ,(apply-to-first obsolete-package-patterns))
-       (regexp           . ,regexp-proc)
-       (license          . ,license-proc)
-       (location         . ,location-proc)
-       (from-file        . ,file-proc)
-       (all-available    . ,all-proc)
-       (newest-available . ,newest-proc))
-      (output
-       (id               . ,(apply-to-rest ids->output-patterns))
-       (name             . ,(apply-to-rest specifications->output-patterns))
-       (installed        . ,manifest-output-proc)
-       (obsolete         . ,(apply-to-first obsolete-output-patterns))
-       (regexp           . ,regexp-proc)
-       (license          . ,license-proc)
-       (location         . ,location-proc)
-       (from-file        . ,file-proc)
-       (all-available    . ,all-proc)
-       (newest-available . ,newest-proc)))))
-
-(define (patterns-maker entry-type search-type)
-  (or (and=> (assq-ref %patterns-makers entry-type)
-             (cut assq-ref <> search-type))
-      (search-type-error entry-type search-type)))
-
-(define (package/output-sexps profile params entry-type
-                              search-type search-vals)
-  "Return information about packages or package outputs.
-See 'entry-sexps' for details."
-  (let* ((manifest (profile-manifest profile))
-         (patterns (if (and (eq? entry-type 'output)
-                            (eq? search-type 'profile-diff))
-                       (match search-vals
-                         ((p1 p2)
-                          (map specification->output-pattern
-                               (profile-difference p1 p2)))
-                         (_ '()))
-                       (apply (patterns-maker entry-type search-type)
-                              manifest search-vals)))
-         (->sexps ((pattern-transformer entry-type) manifest params)))
-    (append-map ->sexps patterns)))
-
-
-;;; Getting information about generations.
-
-(define (generation-param-alist profile)
-  "Return an alist of generation parameters and procedures for PROFILE."
-  (let ((current (generation-number profile)))
-    `((id          . ,identity)
-      (number      . ,identity)
-      (prev-number . ,(cut previous-generation-number profile <>))
-      (current     . ,(cut = current <>))
-      (path        . ,(cut generation-file-name profile <>))
-      (time        . ,(lambda (gen)
-                        (time-second (generation-time profile gen)))))))
-
-(define (matching-generations profile predicate)
-  "Return a list of PROFILE generations matching PREDICATE."
-  (filter predicate (profile-generations profile)))
-
-(define (last-generations profile number)
-  "Return a list of last NUMBER generations.
-If NUMBER is 0 or less, return all generations."
-  (let ((generations (profile-generations profile))
-        (number (if (<= number 0) +inf.0 number)))
-    (if (> (length generations) number)
-        (list-head  (reverse generations) number)
-        generations)))
-
-(define (find-generations profile search-type search-vals)
-  "Find PROFILE's generations matching SEARCH-TYPE and SEARCH-VALS."
-  (case search-type
-    ((id)
-     (matching-generations profile (cut memq <> search-vals)))
-    ((last)
-     (last-generations profile (car search-vals)))
-    ((all)
-     (last-generations profile +inf.0))
-    ((time)
-     (match search-vals
-       ((from to)
-        (matching-generations
-         profile
-         (lambda (gen)
-           (let ((time (time-second (generation-time profile gen))))
-             (< from time to)))))
-       (_ '())))
-    (else (search-type-error "generation" search-type))))
-
-(define (generation-sexps profile params search-type search-vals)
-  "Return information about generations.
-See 'entry-sexps' for details."
-  (let ((generations (find-generations profile search-type search-vals))
-        (->sexp (object-transformer (generation-param-alist profile)
-                                    params)))
-    (map ->sexp generations)))
-
-(define system-generation-boot-parameters
-  (memoize
-   (lambda (profile generation)
-     "Return boot parameters for PROFILE's system GENERATION."
-     (let* ((gen-file   (generation-file-name profile generation))
-            (param-file (string-append gen-file "/parameters")))
-       (call-with-input-file param-file read-boot-parameters)))))
-
-(define (system-generation-param-alist profile)
-  "Return an alist of system generation parameters and procedures for
-PROFILE."
-  (append (generation-param-alist profile)
-          `((label       . ,(lambda (gen)
-                              (boot-parameters-label
-                               (system-generation-boot-parameters
-                                profile gen))))
-            (root-device . ,(lambda (gen)
-                              (boot-parameters-root-device
-                               (system-generation-boot-parameters
-                                profile gen))))
-            (kernel      . ,(lambda (gen)
-                              (boot-parameters-kernel
-                               (system-generation-boot-parameters
-                                profile gen)))))))
-
-(define (system-generation-sexps profile params search-type search-vals)
-  "Return an alist with information about system generations."
-  (let ((generations (find-generations profile search-type search-vals))
-        (->sexp (object-transformer (system-generation-param-alist profile)
-                                    params)))
-    (map ->sexp generations)))
-
-
-;;; Getting package/output/generation entries (alists).
-
-(define (entries profile params entry-type search-type search-vals)
-  "Return information about entries.
-
-ENTRY-TYPE is a symbol defining a type of returning information.  Should
-be: 'package', 'output' or 'generation'.
-
-SEARCH-TYPE and SEARCH-VALS define how to get the information.
-SEARCH-TYPE should be one of the following symbols:
-
-- If ENTRY-TYPE is 'package' or 'output':
-  'id', 'name', 'regexp', 'all-available', 'newest-available',
-  'installed', 'obsolete', 'generation'.
-
-- If ENTRY-TYPE is 'generation':
-  'id', 'last', 'all', 'time'.
-
-PARAMS is a list of parameters for receiving.  If it is an empty list,
-get information with all available parameters, which are:
-
-- If ENTRY-TYPE is 'package':
-  'id', 'name', 'version', 'outputs', 'license', 'synopsis',
-  'description', 'home-url', 'inputs', 'native-inputs',
-  'propagated-inputs', 'location', 'installed'.
-
-- If ENTRY-TYPE is 'output':
-  'id', 'package-id', 'name', 'version', 'output', 'license',
-  'synopsis', 'description', 'home-url', 'inputs', 'native-inputs',
-  'propagated-inputs', 'location', 'installed', 'path', 'dependencies'.
-
-- If ENTRY-TYPE is 'generation':
-  'id', 'number', 'prev-number', 'path', 'time'.
-
-Returning value is a list of alists.  Each alist consists of
-parameter/value pairs."
-  (case entry-type
-    ((package output)
-     (package/output-sexps profile params entry-type
-                           search-type search-vals))
-    ((generation)
-     (generation-sexps profile params
-                       search-type search-vals))
-    ((system-generation)
-     (system-generation-sexps profile params
-                              search-type search-vals))
-    (else (entry-type-error entry-type))))
-
-
-;;; Package actions.
-
-(define* (package->manifest-entry* package #:optional output)
-  (and package
-       (package->manifest-entry package output)))
-
-(define* (make-install-manifest-entries id #:optional output)
-  (package->manifest-entry* (package-by-id id) output))
-
-(define* (make-upgrade-manifest-entries id #:optional output)
-  (package->manifest-entry* (newest-package-by-id id) output))
-
-(define* (make-manifest-pattern id #:optional output)
-  "Make manifest pattern from a package ID and OUTPUT."
-  (let-values (((name version)
-                (id->name+version id)))
-    (and name version
-         (manifest-pattern
-          (name name)
-          (version version)
-          (output output)))))
-
-(define (convert-action-pattern pattern proc)
-  "Convert action PATTERN into a list of objects returned by PROC.
-PROC is called: (PROC ID) or (PROC ID OUTPUT)."
-  (match pattern
-    ((id . outputs)
-     (if (null? outputs)
-         (let ((obj (proc id)))
-           (if obj (list obj) '()))
-         (filter-map (cut proc id <>)
-                     outputs)))
-    (_ '())))
-
-(define (convert-action-patterns patterns proc)
-  (append-map (cut convert-action-pattern <> proc)
-              patterns))
-
-(define* (process-package-actions
-          profile #:key (install '()) (upgrade '()) (remove '())
-          (use-substitutes? #t) dry-run?)
-  "Perform package actions.
-
-INSTALL, UPGRADE, REMOVE are lists of 'package action patterns'.
-Each pattern should have the following form:
-
-  (ID . OUTPUTS)
-
-ID is an object address or a full-name of a package.
-OUTPUTS is a list of package outputs (may be an empty list)."
-  (format #t "The process begins ...~%")
-  (let* ((install (append
-                   (convert-action-patterns
-                    install make-install-manifest-entries)
-                   (convert-action-patterns
-                    upgrade make-upgrade-manifest-entries)))
-         (remove (convert-action-patterns remove make-manifest-pattern))
-         (transaction (manifest-transaction (install install)
-                                            (remove remove)))
-         (manifest (profile-manifest profile))
-         (new-manifest (manifest-perform-transaction
-                        manifest transaction)))
-    (unless (and (null? install) (null? remove))
-      (parameterize ((%graft? (not dry-run?)))
-        (with-store store
-          (set-build-options store
-                             #:print-build-trace #f
-                             #:use-substitutes? use-substitutes?)
-          (show-manifest-transaction store manifest transaction
-                                     #:dry-run? dry-run?)
-          (build-and-use-profile store profile new-manifest
-                                 #:use-substitutes? use-substitutes?
-                                 #:dry-run? dry-run?))))))
-
-(define (delete-generations* profile generations)
-  "Delete GENERATIONS from PROFILE.
-GENERATIONS is a list of generation numbers."
-  (with-store store
-    (delete-generations store profile generations)))
-
-(define (package-location-string id-or-name)
-  "Return a location string of a package with ID-OR-NAME."
-  (and=> (or (package-by-id id-or-name)
-             (match (packages-by-name id-or-name)
-               (()              #f)
-               ((package _ ...) package)))
-         (compose location->string package-location)))
-
-(define (package-store-path package-id)
-  "Return a list of store directories of outputs of package PACKAGE-ID."
-  (match (package-by-id package-id)
-    (#f '())
-    (package
-      (with-store store
-        (map (match-lambda
-               ((_ . drv)
-                (derivation-output-path drv)))
-             (derivation-outputs (package-derivation store package)))))))
-
-(define (package-source-derivation->store-path derivation)
-  "Return a store path of the package source DERIVATION."
-  (match (derivation-outputs derivation)
-    ;; Source derivation is always (("out" . derivation)).
-    (((_ . output-drv))
-     (derivation-output-path output-drv))
-    (_ #f)))
-
-(define (package-source-path package-id)
-  "Return a store file path to a source of a package PACKAGE-ID."
-  (and-let* ((package (package-by-id package-id))
-             (source  (package-source package)))
-    (with-store store
-      (package-source-derivation->store-path
-       (package-source-derivation store source)))))
-
-(define* (package-source-build-derivation package-id #:key dry-run?
-                                          (use-substitutes? #t))
-  "Build source derivation of a package PACKAGE-ID."
-  (and-let* ((package (package-by-id package-id))
-             (source  (package-source package)))
-    (with-store store
-      (let* ((derivation  (package-source-derivation store source))
-             (derivations (list derivation)))
-        (set-build-options store
-                           #:print-build-trace #f
-                           #:use-substitutes? use-substitutes?)
-        (show-what-to-build store derivations
-                            #:use-substitutes? use-substitutes?
-                            #:dry-run? dry-run?)
-        (unless dry-run?
-          (build-derivations store derivations))
-        (format #t "The source store path: ~a~%"
-                (package-source-derivation->store-path derivation))))))
-
-(define (package-build-log-file package-id)
-  "Return the build log file of a package PACKAGE-ID.
-Return #f if the build log is not found."
-  (and-let* ((package (package-by-id package-id)))
-    (with-store store
-      (let* ((derivation (package-derivation store package))
-             (file       (derivation-file-name derivation)))
-        (or (log-file store file)
-            ((@@ (guix scripts build) log-url) store file))))))
-
-
-;;; Executing guix commands
-
-(define (guix-command . args)
-  "Run 'guix ARGS ...' command."
-  (catch 'quit
-    (lambda () (apply run-guix args))
-    (const #t)))
-
-(define (guix-command-output . args)
-  "Return 2 strings with 'guix ARGS ...' output and error output."
-  (output+error
-   (lambda ()
-     (parameterize ((guix-warning-port (current-error-port)))
-       (apply guix-command args)))))
-
-(define (help-string . commands)
-  "Return string with 'guix COMMANDS ... --help' output."
-  (apply guix-command-output `(,@commands "--help")))
-
-(define (pipe-guix-output guix-args command-args)
-  "Run 'guix GUIX-ARGS ...' command and pipe its output to a shell command
-defined by COMMAND-ARGS.
-Return #t if the shell command was executed successfully."
-  (let ((pipe (apply open-pipe* OPEN_WRITE command-args)))
-    (with-output-to-port pipe
-      (lambda () (apply guix-command guix-args)))
-    (zero? (status:exit-val (close-pipe pipe)))))
-
-
-;;; Lists of packages, lint checkers, etc.
-
-(define (graph-type-names)
-  "Return a list of names of available graph node types."
-  (map (@ (guix graph) node-type-name)
-       (@ (guix scripts graph) %node-types)))
-
-(define (refresh-updater-names)
-  "Return a list of names of available refresh updater types."
-  (map (@ (guix upstream) upstream-updater-name)
-       (@ (guix scripts refresh) %updaters)))
-
-(define (lint-checker-names)
-  "Return a list of names of available lint checkers."
-  (map (lambda (checker)
-         (symbol->string ((@ (guix scripts lint) lint-checker-name)
-                          checker)))
-       (@ (guix scripts lint) %checkers)))
-
-(define (package-names)
-  "Return a list of names of available packages."
-  (delete-duplicates
-   (fold-packages (lambda (pkg res)
-                    (cons (package-name pkg) res))
-                  '())))
-
-;; See the comment to 'guix-package-names' function in "guix-popup.el".
-(define (package-names-lists)
-  (map list (package-names)))
-
-
-;;; Licenses
-
-(define %licenses
-  (delay
-    (filter license?
-            (module-map (lambda (_ var)
-                          (variable-ref var))
-                        (resolve-interface '(guix licenses))))))
-
-(define (licenses)
-  (force %licenses))
-
-(define (license-names)
-  "Return a list of names of available licenses."
-  (map license-name (licenses)))
-
-(define lookup-license
-  (memoize
-   (lambda (name)
-     "Return a license by its name."
-     (find (lambda (l)
-             (string=? name (license-name l)))
-           (licenses)))))
-
-(define (lookup-license-uri name)
-  "Return a license URI by its name."
-  (and=> (lookup-license name)
-         license-uri))
-
-(define %license-param-alist
-  `((id      . ,license-name)
-    (name    . ,license-name)
-    (url     . ,license-uri)
-    (comment . ,license-comment)))
-
-(define license->sexp
-  (object-transformer %license-param-alist))
-
-(define (find-licenses search-type . search-values)
-  "Return a list of licenses depending on SEARCH-TYPE and SEARCH-VALUES."
-  (case search-type
-    ((id name)
-     (let ((names search-values))
-       (filter-map lookup-license names)))
-    ((all)
-     (licenses))))
-
-(define (license-entries search-type . search-values)
-  (map license->sexp
-       (apply find-licenses search-type search-values)))
-
-
-;;; Package locations
-
-(define-values (packages-by-location-file
-                package-location-files)
-  (let* ((table (delay (fold-packages
-                        (lambda (package table)
-                          (let ((file (location-file
-                                       (package-location package))))
-                            (vhash-cons file package table)))
-                        vlist-null)))
-         (files (delay (vhash-fold
-                        (lambda (file _ result)
-                          (if (member file result)
-                              result
-                              (cons file result)))
-                        '()
-                        (force table)))))
-    (values
-     (lambda (file)
-       "Return the (possibly empty) list of packages defined in location FILE."
-       (vhash-fold* cons '() file (force table)))
-     (lambda ()
-       "Return the list of file names of all package locations."
-       (force files)))))
-
-(define %package-location-param-alist
-  `((id       . ,identity)
-    (location . ,identity)
-    (number-of-packages . ,(lambda (location)
-                             (length (packages-by-location-file location))))))
-
-(define package-location->sexp
-  (object-transformer %package-location-param-alist))
-
-(define (package-location-entries)
-  (map package-location->sexp (package-location-files)))
diff --git a/emacs/guix-messages.el b/emacs/guix-messages.el
deleted file mode 100644
index 52436af9e4..0000000000
--- a/emacs/guix-messages.el
+++ /dev/null
@@ -1,247 +0,0 @@
-;;; guix-messages.el --- Minibuffer messages
-
-;; Copyright © 2014, 2015 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides `guix-result-message' function used to show a
-;; minibuffer message after displaying packages/generations in a
-;; list/info buffer.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'guix-utils)
-
-(defvar guix-messages
-  `((package
-     (id
-      ,(lambda (_ entries ids)
-         (guix-message-packages-by-id entries 'package ids)))
-     (name
-      ,(lambda (_ entries names)
-         (guix-message-packages-by-name entries 'package names)))
-     (license
-      ,(lambda (_ entries licenses)
-         (apply #'guix-message-packages-by-license
-                entries 'package licenses)))
-     (location
-      ,(lambda (_ entries locations)
-         (apply #'guix-message-packages-by-location
-                entries 'package locations)))
-     (from-file
-      (0 "No package in file '%s'." val)
-      (1 "Package from file '%s'." val))
-     (regexp
-      (0 "No packages matching '%s'." val)
-      (1 "A single package matching '%s'." val)
-      (many "%d packages matching '%s'." count val))
-     (all-available
-      (0 "No packages are available for some reason.")
-      (1 "A single available package (that's strange).")
-      (many "%d available packages." count))
-     (newest-available
-      (0 "No packages are available for some reason.")
-      (1 "A single newest available package (that's strange).")
-      (many "%d newest available packages." count))
-     (installed
-      (0 "No packages installed in profile '%s'." profile)
-      (1 "A single package installed in profile '%s'." profile)
-      (many "%d packages installed in profile '%s'." count profile))
-     (obsolete
-      (0 "No obsolete packages in profile '%s'." profile)
-      (1 "A single obsolete package in profile '%s'." profile)
-      (many "%d obsolete packages in profile '%s'." count profile)))
-
-    (output
-     (id
-      ,(lambda (_ entries ids)
-         (guix-message-packages-by-id entries 'output ids)))
-     (name
-      ,(lambda (_ entries names)
-         (guix-message-packages-by-name entries 'output names)))
-     (license
-      ,(lambda (_ entries licenses)
-         (apply #'guix-message-packages-by-license
-                entries 'output licenses)))
-     (location
-      ,(lambda (_ entries locations)
-         (apply #'guix-message-packages-by-location
-                entries 'output locations)))
-     (from-file
-      (0 "No package in file '%s'." val)
-      (1 "Package from file '%s'." val)
-      (many "Package outputs from file '%s'." val))
-     (regexp
-      (0 "No package outputs matching '%s'." val)
-      (1 "A single package output matching '%s'." val)
-      (many "%d package outputs matching '%s'." count val))
-     (all-available
-      (0 "No package outputs are available for some reason.")
-      (1 "A single available package output (that's strange).")
-      (many "%d available package outputs." count))
-     (newest-available
-      (0 "No package outputs are available for some reason.")
-      (1 "A single newest available package output (that's strange).")
-      (many "%d newest available package outputs." count))
-     (installed
-      (0 "No package outputs installed in profile '%s'." profile)
-      (1 "A single package output installed in profile '%s'." profile)
-      (many "%d package outputs installed in profile '%s'." count profile))
-     (obsolete
-      (0 "No obsolete package outputs in profile '%s'." profile)
-      (1 "A single obsolete package output in profile '%s'." profile)
-      (many "%d obsolete package outputs in profile '%s'." count profile))
-     (profile-diff
-      guix-message-outputs-by-diff))
-
-    (generation
-     (id
-      (0 "Generations not found.")
-      (1 "")
-      (many "%d generations." count))
-     (last
-      (0 "No generations in profile '%s'." profile)
-      (1 "The last generation of profile '%s'." profile)
-      (many "%d last generations of profile '%s'." count profile))
-     (all
-      (0 "No generations in profile '%s'." profile)
-      (1 "A single generation available in profile '%s'." profile)
-      (many "%d generations available in profile '%s'." count profile))
-     (time
-      guix-message-generations-by-time))))
-
-(defun guix-message-string-name (name)
-  "Return a quoted name string."
-  (concat "'" name "'"))
-
-(defun guix-message-string-entry-type (entry-type &optional plural)
-  "Return a string denoting an ENTRY-TYPE."
-  (cl-ecase entry-type
-    (package
-     (if plural "packages" "package"))
-    (output
-     (if plural "package outputs" "package output"))
-    (generation
-     (if plural "generations" "generation"))))
-
-(defun guix-message-string-entries (count entry-type)
-  "Return a string denoting the COUNT of ENTRY-TYPE entries."
-  (cl-case count
-    (0 (concat "No "
-               (guix-message-string-entry-type
-                entry-type 'plural)))
-    (1 (concat "A single "
-               (guix-message-string-entry-type
-                entry-type)))
-    (t (format "%d %s"
-               count
-               (guix-message-string-entry-type
-                entry-type 'plural)))))
-
-(defun guix-message-packages-by-id (entries entry-type ids)
-  "Display a message for packages or outputs searched by IDS."
-  (let* ((count (length entries))
-         (str-beg (guix-message-string-entries count entry-type))
-         (str-end (if (> count 1)
-                      (concat "with the following IDs: "
-                              (mapconcat #'guix-get-string ids ", "))
-                    (concat "with ID " (guix-get-string (car ids))))))
-    (if (zerop count)
-        (message "%s %s.
-Most likely, Guix REPL was restarted, so IDs are not actual
-anymore, because they live only during the REPL process.
-Try \"M-x guix-search-by-name\"."
-                 str-beg str-end)
-      (message "%s %s." str-beg str-end))))
-
-(defun guix-message-packages-by-name (entries entry-type names)
-  "Display a message for packages or outputs searched by NAMES."
-  (let* ((count (length entries))
-         (str-beg (guix-message-string-entries count entry-type))
-         (str-end (if (cdr names)
-                      (concat "matching the following names: "
-                              (mapconcat #'guix-message-string-name
-                                         names ", "))
-                    (concat "with name "
-                            (guix-message-string-name (car names))))))
-    (message "%s %s." str-beg str-end)))
-
-(defun guix-message-packages-by-license (entries entry-type license)
-  "Display a message for packages or outputs searched by LICENSE."
-  (let* ((count (length entries))
-         (str-beg (guix-message-string-entries count entry-type))
-         (str-end (format "with license '%s'" license)))
-    (message "%s %s." str-beg str-end)))
-
-(defun guix-message-packages-by-location (entries entry-type location)
-  "Display a message for packages or outputs searched by LOCATION."
-  (let* ((count   (length entries))
-         (str-beg (guix-message-string-entries count entry-type))
-         (str-end (format "placed in '%s'" location)))
-    (message "%s %s." str-beg str-end)))
-
-(defun guix-message-generations-by-time (profile entries times)
-  "Display a message for generations searched by TIMES."
-  (let* ((count (length entries))
-         (str-beg (guix-message-string-entries count 'generation))
-         (time-beg (guix-get-time-string (car  times)))
-         (time-end (guix-get-time-string (cadr times))))
-    (message (concat "%s of profile '%s'\n"
-                     "matching time period '%s' - '%s'.")
-             str-beg profile time-beg time-end)))
-
-(defun guix-message-outputs-by-diff (_ entries profiles)
-  "Display a message for outputs searched by PROFILES difference."
-  (let* ((count (length entries))
-         (str-beg (guix-message-string-entries count 'output))
-         (profile1 (car  profiles))
-         (profile2 (cadr profiles)))
-    (cl-multiple-value-bind (new old str-action)
-        (if (string-lessp profile2 profile1)
-            (list profile1 profile2 "added to")
-          (list profile2 profile1 "removed from"))
-      (message "%s %s profile '%s' comparing with profile '%s'."
-               str-beg str-action new old))))
-
-(defun guix-result-message (profile entries entry-type
-                            search-type search-vals)
-  "Display an appropriate message after displaying ENTRIES."
-  (let* ((type-spec (guix-assq-value guix-messages
-                                     (if (eq entry-type 'system-generation)
-                                         'generation
-                                       entry-type)
-                                     search-type))
-         (fun-or-count-spec (car type-spec)))
-    (if (functionp fun-or-count-spec)
-        (funcall fun-or-count-spec profile entries search-vals)
-      (let* ((count     (length entries))
-             (count-key (if (> count 1) 'many count))
-             (msg-spec  (guix-assq-value type-spec count-key))
-             (msg       (car msg-spec))
-             (args      (cdr msg-spec)))
-        (mapc (lambda (subst)
-                (setq args (cl-substitute (cdr subst) (car subst) args)))
-              `((count   . ,count)
-                (val     . ,(car search-vals))
-                (profile . ,profile)))
-        (apply #'message msg args)))))
-
-(provide 'guix-messages)
-
-;;; guix-messages.el ends here
diff --git a/emacs/guix-pcomplete.el b/emacs/guix-pcomplete.el
deleted file mode 100644
index 785e54ef6d..0000000000
--- a/emacs/guix-pcomplete.el
+++ /dev/null
@@ -1,370 +0,0 @@
-;;; guix-pcomplete.el --- Functions for completing guix commands  -*- lexical-binding: t -*-
-
-;; Copyright © 2015 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides completions for "guix" command that may be used in
-;; `shell', `eshell' and wherever `pcomplete' works.
-
-;;; Code:
-
-(require 'pcomplete)
-(require 'pcmpl-unix)
-(require 'cl-lib)
-(require 'guix-utils)
-(require 'guix-help-vars)
-
-
-;;; Interacting with guix
-
-(defcustom guix-pcomplete-guix-program (executable-find "guix")
-  "Name of the 'guix' program.
-It is used to find guix commands, options, packages, etc."
-  :type 'file
-  :group 'pcomplete
-  :group 'guix)
-
-(defun guix-pcomplete-run-guix (&rest args)
-  "Run `guix-pcomplete-guix-program' with ARGS.
-Insert the output to the current buffer."
-  (apply #'call-process
-         guix-pcomplete-guix-program nil t nil args))
-
-(defun guix-pcomplete-run-guix-and-search (regexp &optional group
-                                                  &rest args)
-  "Run `guix-pcomplete-guix-program' with ARGS and search for matches.
-Return a list of strings matching REGEXP.
-GROUP specifies a parenthesized expression used in REGEXP."
-  (with-temp-buffer
-    (apply #'guix-pcomplete-run-guix args)
-    (let (result)
-      (guix-while-search regexp
-        (push (match-string-no-properties group) result))
-      (nreverse result))))
-
-(defmacro guix-pcomplete-define-options-finder (name docstring regexp
-                                                     &optional filter)
-  "Define function NAME to receive guix options and commands.
-
-The defined function takes an optional COMMAND argument.  This
-function will run 'guix COMMAND --help' (or 'guix --help' if
-COMMAND is nil) using `guix-pcomplete-run-guix-and-search' and
-return its result.
-
-If FILTER is specified, it should be a function.  The result is
-passed to this FILTER as argument and the result value of this
-function call is returned."
-  (declare (doc-string 2) (indent 1))
-  `(guix-memoized-defun ,name (&optional command)
-     ,docstring
-     (let* ((args '("--help"))
-            (args (if command (cons command args) args))
-            (res (apply #'guix-pcomplete-run-guix-and-search
-                        ,regexp guix-help-parse-regexp-group args)))
-       ,(if filter
-            `(funcall ,filter res)
-          'res))))
-
-(guix-pcomplete-define-options-finder guix-pcomplete-commands
-  "If COMMAND is nil, return a list of available guix commands.
-If COMMAND is non-nil (it should be a string), return available
-subcommands, actions, etc. for this guix COMMAND."
-  guix-help-parse-command-regexp)
-
-(guix-pcomplete-define-options-finder guix-pcomplete-long-options
-  "Return a list of available long options for guix COMMAND."
-  guix-help-parse-long-option-regexp)
-
-(guix-pcomplete-define-options-finder guix-pcomplete-short-options
-  "Return a string with available short options for guix COMMAND."
-  guix-help-parse-short-option-regexp
-  (lambda (list)
-    (guix-concat-strings list "")))
-
-(guix-memoized-defun guix-pcomplete-all-packages ()
-  "Return a list of all available Guix packages."
-  (guix-pcomplete-run-guix-and-search
-   guix-help-parse-package-regexp
-   guix-help-parse-regexp-group
-   "package" "--list-available"))
-
-(guix-memoized-defun guix-pcomplete-installed-packages (&optional profile)
-  "Return a list of Guix packages installed in PROFILE."
-  (let* ((args (and profile
-                    (list (concat "--profile=" profile))))
-         (args (append '("package" "--list-installed") args)))
-    (apply #'guix-pcomplete-run-guix-and-search
-           guix-help-parse-package-regexp
-           guix-help-parse-regexp-group
-           args)))
-
-(guix-memoized-defun guix-pcomplete-lint-checkers ()
-  "Return a list of all available lint checkers."
-  (guix-pcomplete-run-guix-and-search
-   guix-help-parse-list-regexp
-   guix-help-parse-regexp-group
-   "lint" "--list-checkers"))
-
-(guix-memoized-defun guix-pcomplete-graph-types ()
-  "Return a list of all available graph types."
-  (guix-pcomplete-run-guix-and-search
-   guix-help-parse-list-regexp
-   guix-help-parse-regexp-group
-   "graph" "--list-types"))
-
-(guix-memoized-defun guix-pcomplete-refresh-updaters ()
-  "Return a list of all available refresh updater types."
-  (guix-pcomplete-run-guix-and-search
-   guix-help-parse-list-regexp
-   guix-help-parse-regexp-group
-   "refresh" "--list-updaters"))
-
-
-;;; Completing
-
-(defvar guix-pcomplete-option-regexp (rx string-start "-")
-  "Regexp to match an option.")
-
-(defvar guix-pcomplete-long-option-regexp (rx string-start "--")
-  "Regexp to match a long option.")
-
-(defvar guix-pcomplete-long-option-with-arg-regexp
-  (rx string-start
-      (group "--" (one-or-more any)) "="
-      (group (zero-or-more any)))
-  "Regexp to match a long option with its argument.
-The first parenthesized group defines the option and the second
-group - the argument.")
-
-(defvar guix-pcomplete-short-option-with-arg-regexp
-  (rx string-start
-      (group "-" (not (any "-")))
-      (group (zero-or-more any)))
-  "Regexp to match a short option with its argument.
-The first parenthesized group defines the option and the second
-group - the argument.")
-
-(defun guix-pcomplete-match-option ()
-  "Return non-nil, if the current argument is an option."
-  (pcomplete-match guix-pcomplete-option-regexp 0))
-
-(defun guix-pcomplete-match-long-option ()
-  "Return non-nil, if the current argument is a long option."
-  (pcomplete-match guix-pcomplete-long-option-regexp 0))
-
-(defun guix-pcomplete-match-long-option-with-arg ()
-  "Return non-nil, if the current argument is a long option with value."
-  (pcomplete-match guix-pcomplete-long-option-with-arg-regexp 0))
-
-(defun guix-pcomplete-match-short-option-with-arg ()
-  "Return non-nil, if the current argument is a short option with value."
-  (pcomplete-match guix-pcomplete-short-option-with-arg-regexp 0))
-
-(defun guix-pcomplete-long-option-arg (option args)
-  "Return a long OPTION's argument from a list of arguments ARGS."
-  (let* ((re (concat "\\`" option "=\\(.*\\)"))
-         (args (cl-member-if (lambda (arg)
-                               (string-match re arg))
-                             args))
-         (cur (car args)))
-    (when cur
-      (match-string-no-properties 1 cur))))
-
-(defun guix-pcomplete-short-option-arg (option args)
-  "Return a short OPTION's argument from a list of arguments ARGS."
-  (let* ((re (concat "\\`" option "\\(.*\\)"))
-         (args (cl-member-if (lambda (arg)
-                               (string-match re arg))
-                             args))
-         (cur (car args)))
-    (when cur
-      (let ((arg (match-string-no-properties 1 cur)))
-        (if (string= "" arg)
-            (cadr args)                 ; take the next arg
-          arg)))))
-
-(defun guix-pcomplete-complete-comma-args (entries)
-  "Complete comma separated arguments using ENTRIES."
-  (let ((index pcomplete-index))
-    (while (= index pcomplete-index)
-      (let* ((args (if (or (guix-pcomplete-match-long-option-with-arg)
-                           (guix-pcomplete-match-short-option-with-arg))
-                       (pcomplete-match-string 2 0)
-                     (pcomplete-arg 0)))
-             (input (if (string-match ".*,\\(.*\\)" args)
-                        (match-string-no-properties 1 args)
-                      args)))
-        (pcomplete-here* entries input)))))
-
-(defun guix-pcomplete-complete-command-arg (command)
-  "Complete argument for guix COMMAND."
-  (cond
-   ((member command
-            '("archive" "build" "challenge" "edit" "environment"
-              "graph" "lint" "refresh" "size"))
-    (while t
-      (pcomplete-here (guix-pcomplete-all-packages))))
-   (t (pcomplete-here* (pcomplete-entries)))))
-
-(defun guix-pcomplete-complete-option-arg (command option &optional input)
-  "Complete argument for COMMAND's OPTION.
-INPUT is the current partially completed string."
-  (cl-flet ((option? (short long)
-              (or (string= option short)
-                  (string= option long)))
-            (command? (&rest commands)
-              (member command commands))
-            (complete (entries)
-              (pcomplete-here entries input nil t))
-            (complete* (entries)
-              (pcomplete-here* entries input t)))
-    (cond
-     ((option? "-L" "--load-path")
-      (complete* (pcomplete-dirs)))
-     ((string= "--key-download" option)
-      (complete* guix-help-key-policies))
-
-     ((command? "package")
-      (cond
-       ;; For '--install[=]' and '--remove[=]', try to complete a package
-       ;; name (INPUT) after the "=" sign, and then the rest packages
-       ;; separated with spaces.
-       ((option? "-i" "--install")
-        (complete (guix-pcomplete-all-packages))
-        (while (not (guix-pcomplete-match-option))
-          (pcomplete-here (guix-pcomplete-all-packages))))
-       ((option? "-r" "--remove")
-        (let* ((profile (or (guix-pcomplete-short-option-arg
-                             "-p" pcomplete-args)
-                            (guix-pcomplete-long-option-arg
-                             "--profile" pcomplete-args)))
-               (profile (and profile (expand-file-name profile))))
-          (complete (guix-pcomplete-installed-packages profile))
-          (while (not (guix-pcomplete-match-option))
-            (pcomplete-here (guix-pcomplete-installed-packages profile)))))
-       ((string= "--show" option)
-        (complete (guix-pcomplete-all-packages)))
-       ((option? "-p" "--profile")
-        (complete* (pcomplete-dirs)))
-       ((or (option? "-f" "--install-from-file")
-            (option? "-m" "--manifest"))
-        (complete* (pcomplete-entries)))))
-
-     ((and (command? "archive" "build" "size")
-           (option? "-s" "--system"))
-      (complete* guix-help-system-types))
-
-     ((and (command? "build")
-           (or (option? "-f" "--file")
-               (option? "-r" "--root")
-               (string= "--with-source" option)))
-      (complete* (pcomplete-entries)))
-
-     ((and (command? "graph")
-           (option? "-t" "--type"))
-      (complete* (guix-pcomplete-graph-types)))
-
-     ((and (command? "environment")
-           (option? "-l" "--load"))
-      (complete* (pcomplete-entries)))
-
-     ((and (command? "hash" "download")
-           (option? "-f" "--format"))
-      (complete* guix-help-hash-formats))
-
-     ((and (command? "lint")
-           (option? "-c" "--checkers"))
-      (guix-pcomplete-complete-comma-args
-       (guix-pcomplete-lint-checkers)))
-
-     ((and (command? "publish")
-           (option? "-u" "--user"))
-      (complete* (pcmpl-unix-user-names)))
-
-     ((command? "refresh")
-      (cond
-       ((option? "-s" "--select")
-        (complete* guix-help-refresh-subsets))
-       ((option? "-t" "--type")
-        (guix-pcomplete-complete-comma-args
-         (guix-pcomplete-refresh-updaters)))))
-
-     ((and (command? "size")
-           (option? "-m" "--map-file"))
-      (complete* (pcomplete-entries))))))
-
-(defun guix-pcomplete-complete-options (command)
-  "Complete options (with their arguments) for guix COMMAND."
-  (while (guix-pcomplete-match-option)
-    (let ((index pcomplete-index))
-      (if (guix-pcomplete-match-long-option)
-
-          ;; Long options.
-          (if (guix-pcomplete-match-long-option-with-arg)
-              (let ((option (pcomplete-match-string 1 0))
-                    (arg    (pcomplete-match-string 2 0)))
-                (guix-pcomplete-complete-option-arg
-                 command option arg))
-
-            (pcomplete-here* (guix-pcomplete-long-options command))
-            ;; We support '--opt arg' style (along with '--opt=arg'),
-            ;; because 'guix package --install/--remove' may be used this
-            ;; way.  So try to complete an argument after the option has
-            ;; been completed.
-            (unless (guix-pcomplete-match-option)
-              (guix-pcomplete-complete-option-arg
-               command (pcomplete-arg 0 -1))))
-
-        ;; Short options.
-        (let ((arg (pcomplete-arg 0)))
-          (if (> (length arg) 2)
-              ;; Support specifying an argument after a short option without
-              ;; spaces (for example, '-L/tmp/foo').
-              (guix-pcomplete-complete-option-arg
-               command
-               (substring-no-properties arg 0 2)
-               (substring-no-properties arg 2))
-            (pcomplete-opt (guix-pcomplete-short-options command))
-            (guix-pcomplete-complete-option-arg
-             command (pcomplete-arg 0 -1)))))
-
-      ;; If there were no completions, move to the next argument and get
-      ;; out if the last argument is achieved.
-      (when (= index pcomplete-index)
-        (if (= pcomplete-index pcomplete-last)
-            (throw 'pcompleted nil)
-          (pcomplete-next-arg))))))
-
-;;;###autoload
-(defun pcomplete/guix ()
-  "Completion for `guix'."
-  (let ((commands (guix-pcomplete-commands)))
-    (pcomplete-here* (cons "--help" commands))
-    (let ((command (pcomplete-arg 'first 1)))
-      (when (member command commands)
-        (guix-pcomplete-complete-options command)
-        (let ((subcommands (guix-pcomplete-commands command)))
-          (when subcommands
-            (pcomplete-here* subcommands)))
-        (guix-pcomplete-complete-options command)
-        (guix-pcomplete-complete-command-arg command)))))
-
-(provide 'guix-pcomplete)
-
-;;; guix-pcomplete.el ends here
diff --git a/emacs/guix-popup.el b/emacs/guix-popup.el
deleted file mode 100644
index 59e98a352e..0000000000
--- a/emacs/guix-popup.el
+++ /dev/null
@@ -1,48 +0,0 @@
-;;; guix-popup.el --- Popup windows library
-
-;; Copyright © 2015 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides `guix-define-popup' macro which is just an alias
-;; to `magit-define-popup'.  According to the manual (info
-;; "(magit-popup) Defining prefix and suffix commands") `magit-popup'
-;; library will eventually be superseded by a more general library.
-
-;;; Code:
-
-(require 'magit-popup)
-
-(defalias 'guix-define-popup 'magit-define-popup)
-
-(defvar guix-popup-font-lock-keywords
-  (eval-when-compile
-    `((,(rx "("
-            (group "guix-define-popup")
-            symbol-end
-            (zero-or-more blank)
-            (zero-or-one
-             (group (one-or-more (or (syntax word) (syntax symbol))))))
-       (1 font-lock-keyword-face)
-       (2 font-lock-function-name-face nil t)))))
-
-(font-lock-add-keywords 'emacs-lisp-mode guix-popup-font-lock-keywords)
-
-(provide 'guix-popup)
-
-;;; guix-popup.el ends here
diff --git a/emacs/guix-prettify.el b/emacs/guix-prettify.el
deleted file mode 100644
index 38d72e860b..0000000000
--- a/emacs/guix-prettify.el
+++ /dev/null
@@ -1,210 +0,0 @@
-;;; guix-prettify.el --- Prettify Guix store file names
-
-;; Copyright © 2014, 2015 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This package provides minor-mode for prettifying Guix store file
-;; names — i.e., after enabling `guix-prettify-mode',
-;; '/gnu/store/72f54nfp6g1hz873w8z3gfcah0h4nl9p-foo-0.1' names will be
-;; replaced with '/gnu/store/…-foo-0.1' in the current buffer.  There is
-;; also `global-guix-prettify-mode' for global prettifying.
-
-;; To install, add the following to your emacs init file:
-;;
-;;   (add-to-list 'load-path "/path/to/dir-with-guix-prettify")
-;;   (autoload 'guix-prettify-mode "guix-prettify" nil t)
-;;   (autoload 'global-guix-prettify-mode "guix-prettify" nil t)
-
-;; If you want to enable/disable composition after "M-x font-lock-mode",
-;; use the following setting:
-;;
-;;   (setq font-lock-extra-managed-props
-;;         (cons 'composition font-lock-extra-managed-props))
-
-;; Credits:
-;;
-;; Thanks to Ludovic Courtès for the idea of this package.
-;;
-;; Thanks to the authors of `prettify-symbols-mode' (part of Emacs 24.4)
-;; and "pretty-symbols.el" <http://github.com/drothlis/pretty-symbols>
-;; for the code.  It helped to write this package.
-
-;;; Code:
-
-(require 'guix-utils)
-
-(defgroup guix-prettify nil
-  "Prettify Guix store file names."
-  :prefix "guix-prettify-"
-  :group 'guix
-  :group 'font-lock
-  :group 'convenience)
-
-(defcustom guix-prettify-char ?…
-  "Character used for prettifying."
-  :type 'character
-  :group 'guix-prettify)
-
-(defcustom guix-prettify-decompose-force nil
-  "If non-nil, remove any composition.
-
-By default, after disabling `guix-prettify-mode',
-compositions (prettifying names with `guix-prettify-char') are
-removed only from strings matching `guix-prettify-regexp', so
-that compositions created by other modes are left untouched.
-
-Set this variable to non-nil, if you want to remove any
-composition unconditionally (like `prettify-symbols-mode' does).
-Most likely it will do no harm and will make the process of
-disabling `guix-prettify-mode' a little faster."
-  :type 'boolean
-  :group 'guix-prettify)
-
-(defcustom guix-prettify-regexp
-  ;; The following file names / URLs should be abbreviated:
-
-  ;; /gnu/store/…-foo-0.1
-  ;; /nix/store/…-foo-0.1
-  ;; http://hydra.gnu.org/nar/…-foo-0.1
-  ;; http://hydra.gnu.org/log/…-foo-0.1
-
-  (rx "/" (or "store" "nar" "log") "/"
-      ;; Hash-parts do not include "e", "o", "u" and "t".  See base32Chars
-      ;; at <https://github.com/NixOS/nix/blob/master/src/libutil/hash.cc>
-      (group (= 32 (any "0-9" "a-d" "f-n" "p-s" "v-z"))))
-  "Regexp matching file names for prettifying.
-
-Disable `guix-prettify-mode' before modifying this variable and
-make sure to modify `guix-prettify-regexp-group' if needed.
-
-Example of a \"deeper\" prettifying:
-
-  (setq guix-prettify-regexp \"store/[[:alnum:]]\\\\\\={32\\\\}\"
-        guix-prettify-regexp-group 0)
-
-This will transform
-'/gnu/store/72f54nfp6g1hz873w8z3gfcah0h4nl9p-foo-0.1' into
-'/gnu/…-foo-0.1'"
-  :type 'regexp
-  :group 'guix-prettify)
-
-(defcustom guix-prettify-regexp-group 1
-  "Regexp group in `guix-prettify-regexp' for prettifying."
-  :type 'integer
-  :group 'guix-prettify)
-
-(defvar guix-prettify-special-modes
-  '(guix-info-mode ibuffer-mode)
-  "List of special modes that support font-locking.
-
-By default, \\[global-guix-prettify-mode] enables prettifying in
-all buffers except the ones where `font-lock-defaults' is
-nil (see Info node `(elisp) Font Lock Basics'), because it may
-break the existing highlighting.
-
-Modes from this list and all derived modes are exceptions
-\(`global-guix-prettify-mode' enables prettifying there).")
-
-(defvar guix-prettify-flush-function
-  (cond ((fboundp 'font-lock-flush) #'font-lock-flush)
-        ((fboundp 'jit-lock-refontify) #'jit-lock-refontify))
-  "Function used to refontify buffer.
-This function is called without arguments after
-enabling/disabling `guix-prettify-mode'.  If nil, do nothing.")
-
-(defun guix-prettify-compose ()
-  "Compose matching region in the current buffer."
-  (let ((beg (match-beginning guix-prettify-regexp-group))
-        (end (match-end       guix-prettify-regexp-group)))
-    (compose-region beg end guix-prettify-char 'decompose-region))
-  ;; Return nil because we're not adding any face property.
-  nil)
-
-(defun guix-prettify-decompose-buffer ()
-  "Remove file names compositions from the current buffer."
-  (with-silent-modifications
-    (let ((inhibit-read-only t))
-      (if guix-prettify-decompose-force
-          (remove-text-properties (point-min)
-                                  (point-max)
-                                  '(composition nil))
-        (guix-while-search guix-prettify-regexp
-          (remove-text-properties
-           (match-beginning guix-prettify-regexp-group)
-           (match-end       guix-prettify-regexp-group)
-           '(composition nil)))))))
-
-;;;###autoload
-(define-minor-mode guix-prettify-mode
-  "Toggle Guix Prettify mode.
-
-With a prefix argument ARG, enable Guix Prettify mode if ARG is
-positive, and disable it otherwise.  If called from Lisp, enable
-the mode if ARG is omitted or nil.
-
-When Guix Prettify mode is enabled, hash-parts of the Guix store
-file names (see `guix-prettify-regexp') are prettified,
-i.e. displayed as `guix-prettify-char' character.  This mode can
-be enabled programmatically using hooks:
-
-  (add-hook 'shell-mode-hook 'guix-prettify-mode)
-
-It is possible to enable the mode in any buffer, however not any
-buffer's highlighting may survive after adding new elements to
-`font-lock-keywords' (see `guix-prettify-special-modes' for
-details).
-
-Also you can use `global-guix-prettify-mode' to enable Guix
-Prettify mode for all modes that support font-locking."
-  :init-value nil
-  :lighter " …"
-  (let ((keywords `((,guix-prettify-regexp
-                     (,guix-prettify-regexp-group
-                      (guix-prettify-compose))))))
-    (if guix-prettify-mode
-        ;; Turn on.
-        (font-lock-add-keywords nil keywords)
-      ;; Turn off.
-      (font-lock-remove-keywords nil keywords)
-      (guix-prettify-decompose-buffer))
-    (and guix-prettify-flush-function
-         (funcall guix-prettify-flush-function))))
-
-(defun guix-prettify-supported-p ()
-  "Return non-nil, if the mode can be harmlessly enabled in current buffer."
-  (or font-lock-defaults
-      (apply #'derived-mode-p guix-prettify-special-modes)))
-
-(defun guix-prettify-turn-on ()
-  "Enable `guix-prettify-mode' in the current buffer if needed.
-See `guix-prettify-special-modes' for details."
-  (and (not guix-prettify-mode)
-       (guix-prettify-supported-p)
-       (guix-prettify-mode)))
-
-;;;###autoload
-(define-globalized-minor-mode global-guix-prettify-mode
-  guix-prettify-mode guix-prettify-turn-on)
-
-;;;###autoload
-(defalias 'guix-prettify-global-mode 'global-guix-prettify-mode)
-
-(provide 'guix-prettify)
-
-;;; guix-prettify.el ends here
diff --git a/emacs/guix-profiles.el b/emacs/guix-profiles.el
deleted file mode 100644
index 12cf46dbf8..0000000000
--- a/emacs/guix-profiles.el
+++ /dev/null
@@ -1,77 +0,0 @@
-;;; guix-profiles.el --- Guix profiles
-
-;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
-;; Copyright © 2015 Mathieu Lirzin <mthl@openmailbox.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 this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Code:
-
-(require 'guix-config)
-
-(defvar guix-user-profile
-  (expand-file-name "~/.guix-profile")
-  "User profile.")
-
-(defvar guix-system-profile
-  (concat guix-config-state-directory "/profiles/system")
-  "System profile.")
-
-(defvar guix-default-profile
-  (concat guix-config-state-directory
-          "/profiles/per-user/"
-          (getenv "USER")
-          "/guix-profile")
-  "Default Guix profile.")
-
-(defvar guix-current-profile guix-default-profile
-  "Current profile.")
-
-(defvar guix-system-profile-regexp
-  (concat "\\`" (regexp-quote guix-system-profile))
-  "Regexp matching system profiles.")
-
-(defun guix-system-profile? (profile)
-  "Return non-nil, if PROFILE is a system one."
-  (string-match-p guix-system-profile-regexp profile))
-
-(defun guix-profile-prompt (&optional default)
-  "Prompt for profile and return it.
-Use DEFAULT as a start directory.  If it is nil, use
-`guix-current-profile'."
-  (let* ((path (read-file-name "Profile: "
-                               (file-name-directory
-                                (or default guix-current-profile))))
-         (path (directory-file-name (expand-file-name path))))
-    (if (string= path guix-user-profile)
-        guix-default-profile
-      path)))
-
-(defun guix-set-current-profile (path)
-  "Set `guix-current-profile' to PATH.
-Interactively, prompt for PATH.  With prefix, use
-`guix-default-profile'."
-  (interactive
-   (list (if current-prefix-arg
-             guix-default-profile
-           (guix-profile-prompt))))
-  (setq guix-current-profile path)
-  (message "Current profile has been set to '%s'."
-           guix-current-profile))
-
-(provide 'guix-profiles)
-
-;;; guix-profiles.el ends here
diff --git a/emacs/guix-read.el b/emacs/guix-read.el
deleted file mode 100644
index 5423c9bcfa..0000000000
--- a/emacs/guix-read.el
+++ /dev/null
@@ -1,147 +0,0 @@
-;;; guix-read.el --- Minibuffer readers
-
-;; Copyright © 2015, 2016 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides functions to prompt a user for packages, system
-;; types, hash formats and other guix related stuff.
-
-;;; Code:
-
-(require 'guix-help-vars)
-(require 'guix-utils)
-(require 'guix-backend)
-(require 'guix-guile)
-
-
-;;; Receivable lists of packages, lint checkers, etc.
-
-(guix-memoized-defun guix-graph-type-names ()
-  "Return a list of names of available graph node types."
-  (guix-eval-read (guix-make-guile-expression 'graph-type-names)))
-
-(guix-memoized-defun guix-refresh-updater-names ()
-  "Return a list of names of available refresh updater types."
-  (guix-eval-read (guix-make-guile-expression 'refresh-updater-names)))
-
-(guix-memoized-defun guix-lint-checker-names ()
-  "Return a list of names of available lint checkers."
-  (guix-eval-read (guix-make-guile-expression 'lint-checker-names)))
-
-(guix-memoized-defun guix-package-names ()
-  "Return a list of names of available packages."
-  (sort
-   ;; Work around <https://github.com/jaor/geiser/issues/64>:
-   ;; list of strings is parsed much slower than list of lists,
-   ;; so we use 'package-names-lists' instead of 'package-names'.
-
-   ;; (guix-eval-read (guix-make-guile-expression 'package-names))
-
-   (mapcar #'car
-           (guix-eval-read (guix-make-guile-expression
-                            'package-names-lists)))
-   #'string<))
-
-(guix-memoized-defun guix-license-names ()
-  "Return a list of names of available licenses."
-  (guix-eval-read (guix-make-guile-expression 'license-names)))
-
-(guix-memoized-defun guix-package-locations ()
-  "Return a list of available package locations."
-  (sort (guix-eval-read (guix-make-guile-expression
-                         'package-location-files))
-        #'string<))
-
-
-;;; Readers
-
-(guix-define-readers
- :completions-var guix-help-system-types
- :single-reader guix-read-system-type
- :single-prompt "System type: ")
-
-(guix-define-readers
- :completions-var guix-help-source-types
- :single-reader guix-read-source-type
- :single-prompt "Source type: ")
-
-(guix-define-readers
- :completions-var guix-help-hash-formats
- :single-reader guix-read-hash-format
- :single-prompt "Hash format: ")
-
-(guix-define-readers
- :completions-var guix-help-refresh-subsets
- :single-reader guix-read-refresh-subset
- :single-prompt "Refresh subset: ")
-
-(guix-define-readers
- :completions-getter guix-refresh-updater-names
- :multiple-reader guix-read-refresh-updater-names
- :multiple-prompt "Refresh updater,s: "
- :multiple-separator ",")
-
-(guix-define-readers
- :completions-var guix-help-key-policies
- :single-reader guix-read-key-policy
- :single-prompt "Key policy: ")
-
-(guix-define-readers
- :completions-var guix-help-elpa-archives
- :single-reader guix-read-elpa-archive
- :single-prompt "ELPA archive: ")
-
-(guix-define-readers
- :completions-var guix-help-verify-options
- :multiple-reader guix-read-verify-options
- :multiple-prompt "Verify option,s: "
- :multiple-separator ",")
-
-(guix-define-readers
- :completions-getter guix-graph-type-names
- :single-reader guix-read-graph-type
- :single-prompt "Graph node type: ")
-
-(guix-define-readers
- :completions-getter guix-lint-checker-names
- :multiple-reader guix-read-lint-checker-names
- :multiple-prompt "Linter,s: "
- :multiple-separator ",")
-
-(guix-define-readers
- :completions-getter guix-package-names
- :single-reader guix-read-package-name
- :single-prompt "Package: "
- :multiple-reader guix-read-package-names
- :multiple-prompt "Package,s: "
- :multiple-separator " ")
-
-(guix-define-readers
- :completions-getter guix-license-names
- :single-reader guix-read-license-name
- :single-prompt "License: ")
-
-(guix-define-readers
- :completions-getter guix-package-locations
- :single-reader guix-read-package-location
- :single-prompt "Location: ")
-
-(provide 'guix-read)
-
-;;; guix-read.el ends here
diff --git a/emacs/guix-ui-generation.el b/emacs/guix-ui-generation.el
deleted file mode 100644
index 67cf6294fb..0000000000
--- a/emacs/guix-ui-generation.el
+++ /dev/null
@@ -1,456 +0,0 @@
-;;; guix-ui-generation.el --- Interface for displaying generations  -*- lexical-binding: t -*-
-
-;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides an interface for displaying profile generations in
-;; 'list' and 'info' buffers, and commands for working with them.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'guix-buffer)
-(require 'guix-list)
-(require 'guix-info)
-(require 'guix-ui)
-(require 'guix-ui-package)
-(require 'guix-base)
-(require 'guix-backend)
-(require 'guix-guile)
-(require 'guix-entry)
-(require 'guix-utils)
-(require 'guix-profiles)
-
-(guix-ui-define-entry-type generation)
-
-(defun guix-generation-get-display (profile search-type &rest search-values)
-  "Search for generations and show results.
-
-If PROFILE is nil, use `guix-current-profile'.
-
-See `guix-ui-get-entries' for the meaning of SEARCH-TYPE and
-SEARCH-VALUES."
-  (apply #'guix-list-get-display-entries
-         'generation
-         (or profile guix-current-profile)
-         search-type search-values))
-
-(defun guix-delete-generations (profile generations
-                                &optional operation-buffer)
-  "Delete GENERATIONS from PROFILE.
-Each element from GENERATIONS is a generation number."
-  (when (or (not guix-operation-confirm)
-            (y-or-n-p
-             (let ((count (length generations)))
-               (if (> count 1)
-                   (format "Delete %d generations from profile '%s'? "
-                           count profile)
-                 (format "Delete generation %d from profile '%s'? "
-                         (car generations) profile)))))
-    (guix-eval-in-repl
-     (guix-make-guile-expression
-      'delete-generations* profile generations)
-     operation-buffer)))
-
-(defun guix-switch-to-generation (profile generation
-                                  &optional operation-buffer)
-  "Switch PROFILE to GENERATION."
-  (when (or (not guix-operation-confirm)
-            (y-or-n-p (format "Switch profile '%s' to generation %d? "
-                              profile generation)))
-    (guix-eval-in-repl
-     (guix-make-guile-expression
-      'switch-to-generation* profile generation)
-     operation-buffer)))
-
-(defun guix-system-generation? ()
-  "Return non-nil, if current generation is a system one."
-  (eq (guix-buffer-current-entry-type)
-      'system-generation))
-
-(defun guix-generation-current-packages-profile (&optional generation)
-  "Return a directory where packages are installed for the
-current profile's GENERATION."
-  (guix-packages-profile (guix-ui-current-profile)
-                         generation
-                         (guix-system-generation?)))
-
-
-;;; Generation 'info'
-
-(guix-ui-info-define-interface generation
-  :buffer-name "*Guix Generation Info*"
-  :format '((number format guix-generation-info-insert-number)
-            (prev-number format (format))
-            (current format guix-generation-info-insert-current)
-            (path simple (indent guix-file))
-            (time format (time)))
-  :titles '((path . "File name")
-            (prev-number . "Previous number")))
-
-(defface guix-generation-info-number
-  '((t :inherit font-lock-keyword-face))
-  "Face used for a number of a generation."
-  :group 'guix-generation-info-faces)
-
-(defface guix-generation-info-current
-  '((t :inherit guix-package-info-installed-outputs))
-  "Face used if a generation is the current one."
-  :group 'guix-generation-info-faces)
-
-(defface guix-generation-info-not-current
-  '((t nil))
-  "Face used if a generation is not the current one."
-  :group 'guix-generation-info-faces)
-
-(defun guix-generation-info-insert-number (number &optional _)
-  "Insert generation NUMBER and action buttons."
-  (guix-info-insert-value-format number 'guix-generation-info-number)
-  (guix-info-insert-indent)
-  (guix-info-insert-action-button
-   "Packages"
-   (lambda (btn)
-     (guix-buffer-get-display-entries
-      'list guix-package-list-type
-      (list (guix-generation-current-packages-profile
-             (button-get btn 'number))
-            'installed)
-      'add))
-   "Show installed packages for this generation"
-   'number number)
-  (guix-info-insert-indent)
-  (guix-info-insert-action-button
-   "Delete"
-   (lambda (btn)
-     (guix-delete-generations (guix-ui-current-profile)
-                              (list (button-get btn 'number))
-                              (current-buffer)))
-   "Delete this generation"
-   'number number))
-
-(defun guix-generation-info-insert-current (val entry)
-  "Insert boolean value VAL showing whether this generation is current."
-  (if val
-      (guix-info-insert-value-format "Yes" 'guix-generation-info-current)
-    (guix-info-insert-value-format "No" 'guix-generation-info-not-current)
-    (guix-info-insert-indent)
-    (guix-info-insert-action-button
-     "Switch"
-     (lambda (btn)
-       (guix-switch-to-generation (guix-ui-current-profile)
-                                  (button-get btn 'number)
-                                  (current-buffer)))
-     "Switch to this generation (make it the current one)"
-     'number (guix-entry-value entry 'number))))
-
-
-;;; Generation 'list'
-
-(guix-ui-list-define-interface generation
-  :buffer-name "*Guix Generation List*"
-  :format '((number nil 5 guix-list-sort-numerically-0 :right-align t)
-            (current guix-generation-list-get-current 10 t)
-            (time guix-list-get-time 20 t)
-            (path guix-list-get-file-name 30 t))
-  :titles '((number . "N."))
-  :sort-key '(number . t)
-  :marks '((delete . ?D)))
-
-(let ((map guix-generation-list-mode-map))
-  (define-key map (kbd "RET") 'guix-generation-list-show-packages)
-  (define-key map (kbd "+")   'guix-generation-list-show-added-packages)
-  (define-key map (kbd "-")   'guix-generation-list-show-removed-packages)
-  (define-key map (kbd "=")   'guix-generation-list-diff)
-  (define-key map (kbd "D")   'guix-generation-list-diff)
-  (define-key map (kbd "e")   'guix-generation-list-ediff)
-  (define-key map (kbd "x")   'guix-generation-list-execute)
-  (define-key map (kbd "s")   'guix-generation-list-switch)
-  (define-key map (kbd "c")   'guix-generation-list-switch)
-  (define-key map (kbd "d")   'guix-generation-list-mark-delete))
-
-(defun guix-generation-list-get-current (val &optional _)
-  "Return string from VAL showing whether this generation is current.
-VAL is a boolean value."
-  (if val "(current)" ""))
-
-(defun guix-generation-list-switch ()
-  "Switch current profile to the generation at point."
-  (interactive)
-  (let* ((entry   (guix-list-current-entry))
-         (current (guix-entry-value entry 'current))
-         (number  (guix-entry-value entry 'number)))
-    (if current
-        (user-error "This generation is already the current one")
-      (guix-switch-to-generation (guix-ui-current-profile)
-                                 number (current-buffer)))))
-
-(defun guix-generation-list-show-packages ()
-  "List installed packages for the generation at point."
-  (interactive)
-  (guix-package-get-display
-   (guix-generation-current-packages-profile (guix-list-current-id))
-   'installed))
-
-(defun guix-generation-list-generations-to-compare ()
-  "Return a sorted list of 2 marked generations for comparing."
-  (let ((numbers (guix-list-get-marked-id-list 'general)))
-    (if (/= (length numbers) 2)
-        (user-error "2 generations should be marked for comparing")
-      (sort numbers #'<))))
-
-(defun guix-generation-list-profiles-to-compare ()
-  "Return a sorted list of 2 marked generation profiles for comparing."
-  (mapcar #'guix-generation-current-packages-profile
-          (guix-generation-list-generations-to-compare)))
-
-(defun guix-generation-list-show-added-packages ()
-  "List package outputs added to the latest marked generation.
-If 2 generations are marked with \\[guix-list-mark], display
-outputs installed in the latest marked generation that were not
-installed in the other one."
-  (interactive)
-  (guix-buffer-get-display-entries
-   'list 'output
-   (cl-list* (guix-ui-current-profile)
-             'profile-diff
-             (reverse (guix-generation-list-profiles-to-compare)))
-   'add))
-
-(defun guix-generation-list-show-removed-packages ()
-  "List package outputs removed from the latest marked generation.
-If 2 generations are marked with \\[guix-list-mark], display
-outputs not installed in the latest marked generation that were
-installed in the other one."
-  (interactive)
-  (guix-buffer-get-display-entries
-   'list 'output
-   (cl-list* (guix-ui-current-profile)
-             'profile-diff
-             (guix-generation-list-profiles-to-compare))
-   'add))
-
-(defun guix-generation-list-compare (diff-fun gen-fun)
-  "Run GEN-FUN on the 2 marked generations and run DIFF-FUN on the results."
-  (cl-multiple-value-bind (gen1 gen2)
-      (guix-generation-list-generations-to-compare)
-    (funcall diff-fun
-             (funcall gen-fun gen1)
-             (funcall gen-fun gen2))))
-
-(defun guix-generation-list-ediff-manifests ()
-  "Run Ediff on manifests of the 2 marked generations."
-  (interactive)
-  (guix-generation-list-compare
-   #'ediff-files
-   #'guix-profile-generation-manifest-file))
-
-(defun guix-generation-list-diff-manifests ()
-  "Run Diff on manifests of the 2 marked generations."
-  (interactive)
-  (guix-generation-list-compare
-   #'guix-diff
-   #'guix-profile-generation-manifest-file))
-
-(defun guix-generation-list-ediff-packages ()
-  "Run Ediff on package outputs installed in the 2 marked generations."
-  (interactive)
-  (guix-generation-list-compare
-   #'ediff-buffers
-   #'guix-profile-generation-packages-buffer))
-
-(defun guix-generation-list-diff-packages ()
-  "Run Diff on package outputs installed in the 2 marked generations."
-  (interactive)
-  (guix-generation-list-compare
-   #'guix-diff
-   #'guix-profile-generation-packages-buffer))
-
-(defun guix-generation-list-ediff (arg)
-  "Run Ediff on package outputs installed in the 2 marked generations.
-With ARG, run Ediff on manifests of the marked generations."
-  (interactive "P")
-  (if arg
-      (guix-generation-list-ediff-manifests)
-    (guix-generation-list-ediff-packages)))
-
-(defun guix-generation-list-diff (arg)
-  "Run Diff on package outputs installed in the 2 marked generations.
-With ARG, run Diff on manifests of the marked generations."
-  (interactive "P")
-  (if arg
-      (guix-generation-list-diff-manifests)
-    (guix-generation-list-diff-packages)))
-
-(defun guix-generation-list-mark-delete (&optional arg)
-  "Mark the current generation for deletion and move to the next line.
-With ARG, mark all generations for deletion."
-  (interactive "P")
-  (if arg
-      (guix-list-mark-all 'delete)
-    (guix-list--mark 'delete t)))
-
-(defun guix-generation-list-execute ()
-  "Delete marked generations."
-  (interactive)
-  (let ((marked (guix-list-get-marked-id-list 'delete)))
-    (or marked
-        (user-error "No generations marked for deletion"))
-    (guix-delete-generations (guix-ui-current-profile)
-                             marked (current-buffer))))
-
-
-;;; Inserting packages to compare generations
-
-(defcustom guix-generation-packages-buffer-name-function
-  #'guix-generation-packages-buffer-name-default
-  "Function used to define name of a buffer with generation packages.
-This function is called with 2 arguments: PROFILE (string) and
-GENERATION (number)."
-  :type '(choice (function-item guix-generation-packages-buffer-name-default)
-                 (function-item guix-generation-packages-buffer-name-long)
-                 (function :tag "Other function"))
-  :group 'guix-generation)
-
-(defcustom guix-generation-packages-update-buffer t
-  "If non-nil, always update list of packages during comparing generations.
-If nil, generation packages are received only once.  So when you
-compare generation 1 and generation 2, the packages for both
-generations will be received.  Then if you compare generation 1
-and generation 3, only the packages for generation 3 will be
-received.  Thus if you use comparing of different generations a
-lot, you may set this variable to nil to improve the
-performance."
-  :type 'boolean
-  :group 'guix-generation)
-
-(defvar guix-generation-output-name-width 30
-  "Width of an output name \"column\".
-This variable is used in auxiliary buffers for comparing generations.")
-
-(defun guix-generation-packages (profile)
-  "Return a list of sorted packages installed in PROFILE.
-Each element of the list is a list of the package specification
-and its store path."
-  (let ((names+paths (guix-eval-read
-                      (guix-make-guile-expression
-                       'profile->specifications+paths profile))))
-    (sort names+paths
-          (lambda (a b)
-            (string< (car a) (car b))))))
-
-(defun guix-generation-packages-buffer-name-default (profile generation)
-  "Return name of a buffer for displaying GENERATION's package outputs.
-Use base name of PROFILE file name."
-  (let ((profile-name (file-name-base (directory-file-name profile))))
-    (format "*Guix %s: generation %s*"
-            profile-name generation)))
-
-(defun guix-generation-packages-buffer-name-long (profile generation)
-  "Return name of a buffer for displaying GENERATION's package outputs.
-Use the full PROFILE file name."
-  (format "*Guix generation %s (%s)*"
-          generation profile))
-
-(defun guix-generation-packages-buffer-name (profile generation)
-  "Return name of a buffer for displaying GENERATION's package outputs."
-  (funcall guix-generation-packages-buffer-name-function
-           profile generation))
-
-(defun guix-generation-insert-package (name path)
-  "Insert package output NAME and store PATH at point."
-  (insert name)
-  (indent-to guix-generation-output-name-width 2)
-  (insert path "\n"))
-
-(defun guix-generation-insert-packages (buffer profile)
-  "Insert package outputs installed in PROFILE in BUFFER."
-  (with-current-buffer buffer
-    (setq buffer-read-only nil
-          indent-tabs-mode nil)
-    (erase-buffer)
-    (mapc (lambda (name+path)
-            (guix-generation-insert-package
-             (car name+path) (cadr name+path)))
-          (guix-generation-packages profile))))
-
-(defun guix-generation-packages-buffer (profile generation &optional system?)
-  "Return buffer with package outputs installed in PROFILE's GENERATION.
-Create the buffer if needed."
-  (let ((buf-name (guix-generation-packages-buffer-name
-                   profile generation)))
-    (or (and (null guix-generation-packages-update-buffer)
-             (get-buffer buf-name))
-        (let ((buf (get-buffer-create buf-name)))
-          (guix-generation-insert-packages
-           buf
-           (guix-packages-profile profile generation system?))
-          buf))))
-
-(defun guix-profile-generation-manifest-file (generation)
-  "Return the file name of a GENERATION's manifest.
-GENERATION is a generation number of the current profile."
-  (guix-manifest-file (guix-ui-current-profile)
-                      generation
-                      (guix-system-generation?)))
-
-(defun guix-profile-generation-packages-buffer (generation)
-  "Insert GENERATION's package outputs in a buffer and return it.
-GENERATION is a generation number of the current profile."
-  (guix-generation-packages-buffer (guix-ui-current-profile)
-                                   generation
-                                   (guix-system-generation?)))
-
-
-;;; Interactive commands
-
-;;;###autoload
-(defun guix-generations (&optional profile)
-  "Display information about all generations.
-If PROFILE is nil, use `guix-current-profile'.
-Interactively with prefix, prompt for PROFILE."
-  (interactive (list (guix-ui-read-profile)))
-  (guix-generation-get-display profile 'all))
-
-;;;###autoload
-(defun guix-last-generations (number &optional profile)
-  "Display information about last NUMBER generations.
-If PROFILE is nil, use `guix-current-profile'.
-Interactively with prefix, prompt for PROFILE."
-  (interactive
-   (list (read-number "The number of last generations: ")
-         (guix-ui-read-profile)))
-  (guix-generation-get-display profile 'last number))
-
-;;;###autoload
-(defun guix-generations-by-time (from to &optional profile)
-  "Display information about generations created between FROM and TO.
-FROM and TO should be time values.
-If PROFILE is nil, use `guix-current-profile'.
-Interactively with prefix, prompt for PROFILE."
-  (interactive
-   (list (guix-read-date "Find generations (from): ")
-         (guix-read-date "Find generations (to): ")
-         (guix-ui-read-profile)))
-  (guix-generation-get-display profile 'time
-                               (float-time from)
-                               (float-time to)))
-
-(provide 'guix-ui-generation)
-
-;;; guix-ui-generation.el ends here
diff --git a/emacs/guix-ui-license.el b/emacs/guix-ui-license.el
deleted file mode 100644
index cf1b5cd357..0000000000
--- a/emacs/guix-ui-license.el
+++ /dev/null
@@ -1,150 +0,0 @@
-;;; guix-ui-license.el --- Interface for displaying licenses
-
-;; Copyright © 2016 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides 'list'/'info' interface for displaying licenses of
-;; Guix packages.
-
-;;; Code:
-
-(require 'guix-buffer)
-(require 'guix-list)
-(require 'guix-info)
-(require 'guix-backend)
-(require 'guix-guile)
-(require 'guix-license)
-
-(guix-define-entry-type license)
-
-(defun guix-license-get-entries (search-type &rest args)
-  "Receive 'license' entries.
-SEARCH-TYPE may be one of the following symbols: `all', `id', `name'."
-  (guix-eval-read
-   (apply #'guix-make-guile-expression
-          'license-entries search-type args)))
-
-(defun guix-license-get-display (search-type &rest args)
-  "Search for licenses and show results."
-  (apply #'guix-list-get-display-entries
-         'license search-type args))
-
-(defun guix-license-message (entries search-type &rest args)
-  "Display a message after showing license ENTRIES."
-  ;; Some objects in (guix licenses) module are procedures (e.g.,
-  ;; 'non-copyleft' or 'x11-style').  Such licenses cannot be "described".
-  (when (null entries)
-    (if (cdr args)
-        (message "Unknown licenses.")
-      (message "Unknown license."))))
-
-
-;;; License 'info'
-
-(guix-info-define-interface license
-  :buffer-name "*Guix License Info*"
-  :get-entries-function 'guix-license-get-entries
-  :message-function 'guix-license-message
-  :format '((name ignore (simple guix-info-heading))
-            ignore
-            guix-license-insert-packages-button
-            (url ignore (simple guix-url))
-            guix-license-insert-comment
-            ignore
-            guix-license-insert-file)
-  :titles '((url . "URL")))
-
-(declare-function guix-packages-by-license "guix-ui-package")
-
-(defun guix-license-insert-packages-button (entry)
-  "Insert button to display packages by license ENTRY."
-  (let ((license (guix-entry-value entry 'name)))
-    (guix-info-insert-action-button
-     "Packages"
-     (lambda (btn)
-       (guix-packages-by-license (button-get btn 'license)))
-     (format "Display packages with license '%s'" license)
-     'license license)))
-
-(defun guix-license-insert-comment (entry)
-  "Insert 'comment' of a license ENTRY."
-  (let ((comment (guix-entry-value entry 'comment)))
-    (if (and comment
-             (string-match-p "^http" comment))
-        (guix-info-insert-value-simple comment 'guix-url)
-      (guix-info-insert-title-simple
-       (guix-info-param-title 'license 'comment))
-      (guix-info-insert-value-indent comment))))
-
-(defun guix-license-insert-file (entry)
-  "Insert button to open license definition."
-  (let ((license (guix-entry-value entry 'name)))
-    (guix-insert-button
-     (guix-license-file) 'guix-file
-     'help-echo (format "Open definition of license '%s'" license)
-     'action (lambda (btn)
-               (guix-find-license-definition (button-get btn 'license)))
-     'license license)))
-
-
-;;; License 'list'
-
-(guix-list-define-interface license
-  :buffer-name "*Guix Licenses*"
-  :get-entries-function 'guix-license-get-entries
-  :describe-function 'guix-license-list-describe
-  :message-function 'guix-license-message
-  :format '((name nil 40 t)
-            (url guix-list-get-url 50 t))
-  :titles '((name . "License"))
-  :sort-key '(name))
-
-(let ((map guix-license-list-mode-map))
-  (define-key map (kbd "e")   'guix-license-list-edit)
-  (define-key map (kbd "RET") 'guix-license-list-show-packages))
-
-(defun guix-license-list-describe (ids)
-  "Describe licenses with IDS (list of identifiers)."
-  (guix-buffer-display-entries
-   (guix-entries-by-ids ids (guix-buffer-current-entries))
-   'info 'license (cl-list* 'id ids) 'add))
-
-(defun guix-license-list-show-packages ()
-  "Display packages with the license at point."
-  (interactive)
-  (guix-packages-by-license (guix-list-current-id)))
-
-(defun guix-license-list-edit (&optional directory)
-  "Go to the location of the current license definition.
-See `guix-license-file' for the meaning of DIRECTORY."
-  (interactive (list (guix-read-directory)))
-  (guix-find-license-definition (guix-list-current-id) directory))
-
-
-;;; Interactive commands
-
-;;;###autoload
-(defun guix-licenses ()
-  "Display licenses of the Guix packages."
-  (interactive)
-  (guix-license-get-display 'all))
-
-(provide 'guix-ui-license)
-
-;;; guix-ui-license.el ends here
diff --git a/emacs/guix-ui-location.el b/emacs/guix-ui-location.el
deleted file mode 100644
index 0027c1fba8..0000000000
--- a/emacs/guix-ui-location.el
+++ /dev/null
@@ -1,83 +0,0 @@
-;;; guix-ui-location.el --- Interface for displaying package locations
-
-;; Copyright © 2016 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public Location as published by
-;; the Free Software Foundation, either version 3 of the Location, 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 Location for more details.
-
-;; You should have received a copy of the GNU General Public Location
-;; along with this program.  If not, see <http://www.gnu.org/locations/>.
-
-;;; Commentary:
-
-;; This file provides a 'list' interface for displaying locations of Guix
-;; packages.
-
-;;; Code:
-
-(require 'guix-buffer)
-(require 'guix-list)
-(require 'guix-location)
-(require 'guix-backend)
-
-(guix-define-entry-type location)
-
-(defun guix-location-get-entries ()
-  "Receive 'package location' entries."
-  (guix-eval-read "(package-location-entries)"))
-
-
-;;; Location 'list'
-
-(guix-list-define-interface location
-  :buffer-name "*Guix Package Locations*"
-  :get-entries-function 'guix-location-get-entries
-  :format '((location guix-location-list-file-name-specification 50 t)
-            (number-of-packages nil 10 guix-list-sort-numerically-1
-                                :right-align t))
-  :sort-key '(location))
-
-(let ((map guix-location-list-mode-map))
-  (define-key map (kbd "RET") 'guix-location-list-show-packages)
-  ;; "Location Info" buffer is not defined (it would be useless), so
-  ;; unbind "i" key (by default, it is used to display Info buffer).
-  (define-key map (kbd "i") nil))
-
-(defun guix-location-list-file-name-specification (location &optional _)
-  "Return LOCATION button specification for `tabulated-list-entries'."
-  (list location
-        'face 'guix-list-file-name
-        'action (lambda (btn)
-                  (guix-find-location (button-get btn 'location)))
-        'follow-link t
-        'help-echo (concat "Find location: " location)
-        'location location))
-
-(declare-function guix-packages-by-location "guix-ui-package")
-
-(defun guix-location-list-show-packages ()
-  "Display packages placed in the location at point."
-  (interactive)
-  (guix-packages-by-location (guix-list-current-id)))
-
-
-;;; Interactive commands
-
-;;;###autoload
-(defun guix-locations ()
-  "Display locations of the Guix packages."
-  (interactive)
-  (guix-list-get-display-entries 'location))
-
-(provide 'guix-ui-location)
-
-;;; guix-ui-location.el ends here
diff --git a/emacs/guix-ui-package.el b/emacs/guix-ui-package.el
deleted file mode 100644
index 4280246bb8..0000000000
--- a/emacs/guix-ui-package.el
+++ /dev/null
@@ -1,1191 +0,0 @@
-;;; guix-ui-package.el --- Interface for displaying packages  -*- lexical-binding: t -*-
-
-;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides an interface for displaying packages and outputs
-;; in 'list' and 'info' buffers, and commands for working with them.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'guix-buffer)
-(require 'guix-list)
-(require 'guix-info)
-(require 'guix-ui)
-(require 'guix-base)
-(require 'guix-backend)
-(require 'guix-guile)
-(require 'guix-entry)
-(require 'guix-utils)
-(require 'guix-hydra)
-(require 'guix-hydra-build)
-(require 'guix-read)
-(require 'guix-license)
-(require 'guix-location)
-(require 'guix-profiles)
-
-(guix-ui-define-entry-type package)
-(guix-ui-define-entry-type output)
-
-(defcustom guix-package-list-type 'output
-  "Define how to display packages in 'list' buffer.
-Should be a symbol `package' or `output' (if `output', display each
-output on a separate line; if `package', display each package on
-a separate line)."
-  :type '(choice (const :tag "List of packages" package)
-                 (const :tag "List of outputs" output))
-  :group 'guix-package)
-
-(defcustom guix-package-info-type 'package
-  "Define how to display packages in 'info' buffer.
-Should be a symbol `package' or `output' (if `output', display
-each output separately; if `package', display outputs inside
-package data)."
-  :type '(choice (const :tag "Display packages" package)
-                 (const :tag "Display outputs" output))
-  :group 'guix-package)
-
-(defun guix-package-get-display (profile search-type &rest search-values)
-  "Search for packages/outputs and show results.
-
-If PROFILE is nil, use `guix-current-profile'.
-
-See `guix-ui-get-entries' for the meaning of SEARCH-TYPE and
-SEARCH-VALUES.
-
-Results are displayed in the list buffer, unless a single package
-is found and `guix-package-list-single' is nil."
-  (let* ((args    (cl-list* (or profile guix-current-profile)
-                            search-type search-values))
-         (entries (guix-buffer-get-entries
-                   'list guix-package-list-type args)))
-    (if (or guix-package-list-single
-            (null entries)
-            (cdr entries))
-        (guix-buffer-display-entries
-         entries 'list guix-package-list-type args 'add)
-      (guix-buffer-get-display-entries
-       'info guix-package-info-type args 'add))))
-
-(defun guix-package-entry->name-specification (entry &optional output)
-  "Return name specification of the package ENTRY and OUTPUT."
-  (guix-package-name-specification
-   (guix-entry-value entry 'name)
-   (guix-entry-value entry 'version)
-   (or output (guix-entry-value entry 'output))))
-
-(defun guix-package-entries->name-specifications (entries)
-  "Return name specifications by the package or output ENTRIES."
-  (cl-remove-duplicates (mapcar #'guix-package-entry->name-specification
-                                entries)
-                        :test #'string=))
-
-(defun guix-package-installed-outputs (entry)
-  "Return a list of installed outputs for the package ENTRY."
-  (mapcar (lambda (installed-entry)
-            (guix-entry-value installed-entry 'output))
-          (guix-entry-value entry 'installed)))
-
-(defun guix-package-id-and-output-by-output-id (output-id)
-  "Return a list (PACKAGE-ID OUTPUT) by OUTPUT-ID."
-  (cl-multiple-value-bind (package-id-str output)
-      (split-string output-id ":")
-    (let ((package-id (string-to-number package-id-str)))
-      (list (if (= 0 package-id) package-id-str package-id)
-            output))))
-
-(defun guix-package-build-log-file (id)
-  "Return build log file name of a package defined by ID."
-  (guix-eval-read
-   (guix-make-guile-expression 'package-build-log-file id)))
-
-(defun guix-package-find-build-log (id)
-  "Show build log of a package defined by ID."
-  (require 'guix-build-log)
-  (let ((file (guix-package-build-log-file id)))
-    (if file
-        (guix-build-log-find-file file)
-      (message "Couldn't find the package build log."))))
-
-
-;;; Processing package actions
-
-(defun guix-process-package-actions (profile actions
-                                     &optional operation-buffer)
-  "Process package ACTIONS on PROFILE.
-Each action is a list of the form:
-
-  (ACTION-TYPE PACKAGE-SPEC ...)
-
-ACTION-TYPE is one of the following symbols: `install',
-`upgrade', `remove'/`delete'.
-PACKAGE-SPEC should have the following form: (ID [OUTPUT] ...)."
-  (let (install upgrade remove)
-    (mapc (lambda (action)
-            (let ((action-type (car action))
-                  (specs (cdr action)))
-              (cl-case action-type
-                (install (setq install (append install specs)))
-                (upgrade (setq upgrade (append upgrade specs)))
-                ((remove delete) (setq remove (append remove specs))))))
-          actions)
-    (when (guix-continue-package-operation-p
-           profile
-           :install install :upgrade upgrade :remove remove)
-      (guix-eval-in-repl
-       (guix-make-guile-expression
-        'process-package-actions profile
-        :install install :upgrade upgrade :remove remove
-        :use-substitutes? (or guix-use-substitutes 'f)
-        :dry-run? (or guix-dry-run 'f))
-       (and (not guix-dry-run) operation-buffer)))))
-
-(cl-defun guix-continue-package-operation-p (profile
-                                             &key install upgrade remove)
-  "Return non-nil if a package operation should be continued.
-Ask a user if needed (see `guix-operation-confirm').
-INSTALL, UPGRADE, REMOVE are 'package action specifications'.
-See `guix-process-package-actions' for details."
-  (or (null guix-operation-confirm)
-      (let* ((entries (guix-ui-get-entries
-                       profile 'package 'id
-                       (append (mapcar #'car install)
-                               (mapcar #'car upgrade)
-                               (mapcar #'car remove))
-                       '(id name version location)))
-             (install-strings (guix-get-package-strings install entries))
-             (upgrade-strings (guix-get-package-strings upgrade entries))
-             (remove-strings  (guix-get-package-strings remove entries)))
-        (if (or install-strings upgrade-strings remove-strings)
-            (let ((buf (get-buffer-create guix-temp-buffer-name)))
-              (with-current-buffer buf
-                (setq-local cursor-type nil)
-                (setq buffer-read-only nil)
-                (erase-buffer)
-                (insert "Profile: " profile "\n\n")
-                (guix-insert-package-strings install-strings "install")
-                (guix-insert-package-strings upgrade-strings "upgrade")
-                (guix-insert-package-strings remove-strings "remove")
-                (let ((win (temp-buffer-window-show
-                            buf
-                            '((display-buffer-reuse-window
-                               display-buffer-at-bottom)
-                              (window-height . fit-window-to-buffer)))))
-                  (prog1 (guix-operation-prompt)
-                    (quit-window nil win)))))
-          (message "Nothing to be done.
-If Guix REPL was restarted, the data is not up-to-date.")
-          nil))))
-
-(defun guix-get-package-strings (specs entries)
-  "Return short package descriptions for performing package actions.
-See `guix-process-package-actions' for the meaning of SPECS.
-ENTRIES is a list of package entries to get info about packages."
-  (delq nil
-        (mapcar
-         (lambda (spec)
-           (let* ((id (car spec))
-                  (outputs (cdr spec))
-                  (entry (guix-entry-by-id id entries)))
-             (when entry
-               (let ((location (guix-entry-value entry 'location)))
-                 (concat (guix-package-entry->name-specification entry)
-                         (when outputs
-                           (concat ":"
-                                   (guix-concat-strings outputs ",")))
-                         (when location
-                           (concat "\t(" location ")")))))))
-         specs)))
-
-(defun guix-insert-package-strings (strings action)
-  "Insert information STRINGS at point for performing package ACTION."
-  (when strings
-    (insert "Package(s) to " (propertize action 'face 'bold) ":\n")
-    (mapc (lambda (str)
-            (insert "  " str "\n"))
-          strings)
-    (insert "\n")))
-
-
-;;; Package 'info'
-
-(guix-ui-info-define-interface package
-  :buffer-name "*Guix Package Info*"
-  :format '(guix-package-info-insert-heading
-            ignore
-            (synopsis ignore (simple guix-package-info-synopsis))
-            ignore
-            (description ignore (simple guix-package-info-description))
-            ignore
-            (outputs simple guix-package-info-insert-outputs)
-            guix-package-info-insert-misc
-            (source simple guix-package-info-insert-source)
-            (location simple guix-package-info-insert-location)
-            (home-url format (format guix-url))
-            (license format (format guix-package-license))
-            (systems format guix-package-info-insert-systems)
-            (inputs format (format guix-package-input))
-            (native-inputs format (format guix-package-native-input))
-            (propagated-inputs format
-                               (format guix-package-propagated-input)))
-  :titles '((home-url . "Home page")
-            (systems . "Supported systems"))
-  :required '(id name version installed non-unique))
-
-(guix-info-define-interface installed-output
-  :format '((path simple (indent guix-file))
-            (dependencies simple (indent guix-file)))
-  :titles '((path . "Store directory"))
-  :reduced? t)
-
-(defface guix-package-info-heading
-  '((t :inherit guix-info-heading))
-  "Face for package name and version headings."
-  :group 'guix-package-info-faces)
-
-(defface guix-package-info-name
-  '((t :inherit font-lock-keyword-face))
-  "Face used for a name of a package."
-  :group 'guix-package-info-faces)
-
-(defface guix-package-info-name-button
-  '((t :inherit button))
-  "Face used for a full name that can be used to describe a package."
-  :group 'guix-package-info-faces)
-
-(defface guix-package-info-version
-  '((t :inherit font-lock-builtin-face))
-  "Face used for a version of a package."
-  :group 'guix-package-info-faces)
-
-(defface guix-package-info-synopsis
-  '((((type tty pc) (class color)) :weight bold)
-    (t :height 1.1 :weight bold :inherit variable-pitch))
-  "Face used for a synopsis of a package."
-  :group 'guix-package-info-faces)
-
-(defface guix-package-info-description
-  '((t))
-  "Face used for a description of a package."
-  :group 'guix-package-info-faces)
-
-(defface guix-package-info-license
-  '((t :inherit font-lock-string-face))
-  "Face used for a license of a package."
-  :group 'guix-package-info-faces)
-
-(defface guix-package-info-location
-  '((t :inherit link))
-  "Face used for a location of a package."
-  :group 'guix-package-info-faces)
-
-(defface guix-package-info-source
-  '((t :inherit link :underline nil))
-  "Face used for a source URL of a package."
-  :group 'guix-package-info-faces)
-
-(defface guix-package-info-installed-outputs
-  '((default :weight bold)
-    (((class color) (min-colors 88) (background light))
-     :foreground "ForestGreen")
-    (((class color) (min-colors 88) (background dark))
-     :foreground "PaleGreen")
-    (((class color) (min-colors 8))
-     :foreground "green")
-    (t :underline t))
-  "Face used for installed outputs of a package."
-  :group 'guix-package-info-faces)
-
-(defface guix-package-info-uninstalled-outputs
-  '((t :weight bold))
-  "Face used for uninstalled outputs of a package."
-  :group 'guix-package-info-faces)
-
-(defface guix-package-info-obsolete
-  '((t :inherit error))
-  "Face used if a package is obsolete."
-  :group 'guix-package-info-faces)
-
-(defcustom guix-package-info-auto-find-package t
-  "If non-nil, open store directory after pressing \"Show\" package button.
-If nil, just display the store directory (or directories) without finding."
-  :type 'boolean
-  :group 'guix-package-info)
-
-(defcustom guix-package-info-auto-find-source nil
-  "If non-nil, open source file after pressing \"Show\" source button.
-If nil, just display the source file name without finding."
-  :type 'boolean
-  :group 'guix-package-info)
-
-(defcustom guix-package-info-auto-download-source t
-  "If nil, do not automatically download a source file if it doesn't exist.
-After pressing a \"Show\" button, a derivation of the package
-source is calculated and a store file path is displayed.  If this
-variable is non-nil and the source file does not exist in the
-store, it will be automatically downloaded (with a possible
-prompt depending on `guix-operation-confirm' variable)."
-  :type 'boolean
-  :group 'guix-package-info)
-
-(defcustom guix-package-info-button-functions
-  '(guix-package-info-insert-build-button
-    guix-package-info-insert-build-log-button)
-  "List of functions used to insert package buttons in Info buffer.
-Each function is called with 2 arguments: package ID and full name."
-  :type '(repeat function)
-  :group 'guix-package-info)
-
-(defvar guix-package-info-download-buffer nil
-  "Buffer from which a current download operation was performed.")
-
-(defvar guix-package-info-output-format "%-10s"
-  "String used to format output names of the packages.
-It should be a '%s'-sequence.  After inserting an output name
-formatted with this string, an action button is inserted.")
-
-(defvar guix-package-info-obsolete-string "(This package is obsolete)"
-  "String used if a package is obsolete.")
-
-(define-button-type 'guix-package-location
-  :supertype 'guix
-  'face 'guix-package-info-location
-  'help-echo "Find location of this package"
-  'action (lambda (btn)
-            (guix-find-location (button-label btn))))
-
-(define-button-type 'guix-package-license
-  :supertype 'guix
-  'face 'guix-package-info-license
-  'help-echo "Display license info"
-  'action (lambda (btn)
-            (require 'guix-ui-license)
-            (guix-buffer-get-display-entries
-             'info 'license
-             (list 'name (button-label btn))
-             'add)))
-
-(define-button-type 'guix-package-name
-  :supertype 'guix
-  'face 'guix-package-info-name-button
-  'help-echo "Describe this package"
-  'action (lambda (btn)
-            (guix-buffer-get-display-entries-current
-             'info guix-package-info-type
-             (list (guix-ui-current-profile)
-                   'name (or (button-get btn 'spec)
-                             (button-label btn)))
-             'add)))
-
-(define-button-type 'guix-package-heading
-  :supertype 'guix-package-name
-  'face 'guix-package-info-heading)
-
-(define-button-type 'guix-package-source
-  :supertype 'guix
-  'face 'guix-package-info-source
-  'help-echo ""
-  'action (lambda (_)
-            ;; As a source may not be a real URL (e.g., "mirror://..."),
-            ;; no action is bound to a source button.
-            (message "Yes, this is the source URL. What did you expect?")))
-
-(defun guix-package-info-insert-heading (entry)
-  "Insert package ENTRY heading (name and version) at point."
-  (guix-insert-button
-   (concat (guix-entry-value entry 'name) " "
-           (guix-entry-value entry 'version))
-   'guix-package-heading
-   'spec (guix-package-entry->name-specification entry)))
-
-(defun guix-package-info-insert-location (location &optional _)
-  "Insert package LOCATION at point."
-  (if (null location)
-      (guix-format-insert nil)
-    (let ((location-file (car (split-string location ":"))))
-      (guix-info-insert-value-indent location 'guix-package-location)
-      ;; Do not show "Packages" button if a package 'from file' is displayed.
-      (unless (eq (guix-ui-current-search-type) 'from-file)
-        (guix-info-insert-indent)
-        (guix-info-insert-action-button
-         "Packages"
-         (lambda (btn)
-           (guix-package-get-display (guix-ui-current-profile)
-                                     'location
-                                     (button-get btn 'location)))
-         (format "Display packages from location '%s'" location-file)
-         'location location-file)))))
-
-(defun guix-package-info-insert-systems (systems entry)
-  "Insert supported package SYSTEMS at point."
-  (guix-info-insert-value-format
-   systems 'guix-hydra-build-system
-   'action (lambda (btn)
-             (let ((args (guix-hydra-build-latest-prompt-args
-                          :job (button-get btn 'job-name)
-                          :system (button-label btn))))
-               (apply #'guix-hydra-build-get-display
-                      'latest args)))
-   'job-name (guix-hydra-job-name-specification
-              (guix-entry-value entry 'name)
-              (guix-entry-value entry 'version))))
-
-(defmacro guix-package-info-define-insert-inputs (&optional type)
-  "Define a face and a function for inserting package inputs.
-TYPE is a type of inputs.
-Function name is `guix-package-info-insert-TYPE-inputs'.
-Face name is `guix-package-info-TYPE-inputs'."
-  (let* ((type-str (symbol-name type))
-         (type-name (and type (concat type-str "-")))
-         (type-desc (and type (concat type-str " ")))
-         (face (intern (concat "guix-package-info-" type-name "inputs")))
-         (btn  (intern (concat "guix-package-" type-name "input"))))
-    `(progn
-       (defface ,face
-         '((t :inherit guix-package-info-name-button))
-         ,(concat "Face used for " type-desc "inputs of a package.")
-         :group 'guix-package-info-faces)
-
-       (define-button-type ',btn
-         :supertype 'guix-package-name
-         'face ',face))))
-
-(guix-package-info-define-insert-inputs)
-(guix-package-info-define-insert-inputs native)
-(guix-package-info-define-insert-inputs propagated)
-
-(defun guix-package-info-insert-outputs (outputs entry)
-  "Insert OUTPUTS from package ENTRY at point."
-  (and (guix-entry-value entry 'obsolete)
-       (guix-package-info-insert-obsolete-text))
-  (and (guix-entry-value entry 'non-unique)
-       (guix-entry-value entry 'installed)
-       (guix-package-info-insert-non-unique-text
-        (guix-package-entry->name-specification entry)))
-  (insert "\n")
-  (dolist (output outputs)
-    (guix-package-info-insert-output output entry)))
-
-(defun guix-package-info-insert-obsolete-text ()
-  "Insert a message about obsolete package at point."
-  (guix-info-insert-indent)
-  (guix-format-insert guix-package-info-obsolete-string
-                      'guix-package-info-obsolete))
-
-(defun guix-package-info-insert-non-unique-text (full-name)
-  "Insert a message about non-unique package with FULL-NAME at point."
-  (insert "\n")
-  (guix-info-insert-indent)
-  (insert "Installed outputs are displayed for a non-unique ")
-  (guix-insert-button full-name 'guix-package-name)
-  (insert " package."))
-
-(defun guix-package-info-insert-output (output entry)
-  "Insert OUTPUT at point.
-Make some fancy text with buttons and additional stuff if the
-current OUTPUT is installed (if there is such output in
-`installed' parameter of a package ENTRY)."
-  (let* ((installed (guix-entry-value entry 'installed))
-         (obsolete  (guix-entry-value entry 'obsolete))
-         (installed-entry (cl-find-if
-                           (lambda (entry)
-                             (string= (guix-entry-value entry 'output)
-                                      output))
-                           installed))
-         (action-type (if installed-entry 'delete 'install))
-         (profile (guix-ui-current-profile)))
-    (guix-info-insert-indent)
-    (guix-format-insert output
-                        (if installed-entry
-                            'guix-package-info-installed-outputs
-                          'guix-package-info-uninstalled-outputs)
-                        guix-package-info-output-format)
-    ;; Do not allow a user to install/delete anything to/from a system
-    ;; profile, so add action buttons only for non-system profiles.
-    (when (and profile
-               (not (guix-system-profile? profile)))
-      (guix-package-info-insert-action-button action-type entry output)
-      (when obsolete
-        (guix-info-insert-indent)
-        (guix-package-info-insert-action-button 'upgrade entry output)))
-    (insert "\n")
-    (when installed-entry
-      (guix-info-insert-entry installed-entry 'installed-output 2))))
-
-(defun guix-package-info-insert-action-button (type entry output)
-  "Insert button to process an action on a package OUTPUT at point.
-TYPE is one of the following symbols: `install', `delete', `upgrade'.
-ENTRY is an alist with package info."
-  (let ((type-str  (capitalize (symbol-name type)))
-        (full-name (guix-package-entry->name-specification entry output)))
-    (guix-info-insert-action-button
-     type-str
-     (lambda (btn)
-       (guix-process-package-actions
-        (guix-ui-current-profile)
-        `((,(button-get btn 'action-type) (,(button-get btn 'id)
-                                           ,(button-get btn 'output))))
-        (current-buffer)))
-     (concat type-str " '" full-name "'")
-     'action-type type
-     'id (or (guix-entry-value entry 'package-id)
-             (guix-entry-id entry))
-     'output output)))
-
-(defun guix-package-info-show-store-path (entry-id package-id)
-  "Show store directories of the package outputs in the current buffer.
-ENTRY-ID is an ID of the current entry (package or output).
-PACKAGE-ID is an ID of the package which store path to show."
-  (let* ((entries (guix-buffer-current-entries))
-         (entry   (guix-entry-by-id entry-id entries))
-         (dirs    (guix-package-store-path package-id)))
-    (or dirs
-        (error "Couldn't define store directory of the package"))
-    (let* ((new-entry (cons (cons 'store-path dirs)
-                            entry))
-           (new-entries (guix-replace-entry entry-id new-entry entries)))
-      (setf (guix-buffer-item-entries guix-buffer-item)
-            new-entries)
-      (guix-buffer-redisplay-goto-button)
-      (let ((dir (car dirs)))
-        (if (file-exists-p dir)
-            (if guix-package-info-auto-find-package
-                (find-file dir)
-              (message nil))
-          (message "'%s' does not exist.\nTry to build this package."
-                   dir))))))
-
-(defun guix-package-info-insert-misc (entry)
-  "Insert various buttons and other info for package ENTRY at point."
-  (if (guix-entry-value entry 'obsolete)
-      (guix-format-insert nil)
-    (let* ((entry-id   (guix-entry-id entry))
-           (package-id (or (guix-entry-value entry 'package-id)
-                           entry-id))
-           (full-name  (guix-package-entry->name-specification entry))
-           (store-path (guix-entry-value entry 'store-path)))
-      (guix-info-insert-title-simple "Package")
-      (if store-path
-          (guix-info-insert-value-indent store-path 'guix-file)
-        (guix-info-insert-action-button
-         "Show"
-         (lambda (btn)
-           (guix-package-info-show-store-path
-            (button-get btn 'entry-id)
-            (button-get btn 'package-id)))
-         "Show the store directory of the current package"
-         'entry-id entry-id
-         'package-id package-id))
-      (when guix-package-info-button-functions
-        (insert "\n")
-        (guix-mapinsert (lambda (fun)
-                          (funcall fun package-id full-name))
-                        guix-package-info-button-functions
-                        (guix-info-get-indent)
-                        :indent guix-info-indent
-                        :column (guix-info-fill-column))))))
-
-(defun guix-package-info-insert-build-button (id full-name)
-  "Insert button to build a package defined by ID."
-  (guix-info-insert-action-button
-   "Build"
-   (lambda (btn)
-     (guix-build-package (button-get btn 'id)
-                         (format "Build '%s' package?" full-name)))
-   (format "Build the current package")
-   'id id))
-
-(defun guix-package-info-insert-build-log-button (id _name)
-  "Insert button to show build log of a package defined by ID."
-  (guix-info-insert-action-button
-   "Build Log"
-   (lambda (btn)
-     (guix-package-find-build-log (button-get btn 'id)))
-   "View build log of the current package"
-   'id id))
-
-(defun guix-package-info-show-source (entry-id package-id)
-  "Show file name of a package source in the current info buffer.
-Find the file if needed (see `guix-package-info-auto-find-source').
-ENTRY-ID is an ID of the current entry (package or output).
-PACKAGE-ID is an ID of the package which source to show."
-  (let* ((entries (guix-buffer-current-entries))
-         (entry   (guix-entry-by-id entry-id entries))
-         (file    (guix-package-source-path package-id)))
-    (or file
-        (error "Couldn't define file name of the package source"))
-    (let* ((new-entry (cons (cons 'source-file file)
-                            entry))
-           (new-entries (guix-replace-entry entry-id new-entry entries)))
-      (setf (guix-buffer-item-entries guix-buffer-item)
-            new-entries)
-      (guix-buffer-redisplay-goto-button)
-      (if (file-exists-p file)
-          (if guix-package-info-auto-find-source
-              (guix-find-file file)
-            (message "The source store path is displayed."))
-        (if guix-package-info-auto-download-source
-            (guix-package-info-download-source package-id)
-          (message "The source does not exist in the store."))))))
-
-(defun guix-package-info-download-source (package-id)
-  "Download a source of the package PACKAGE-ID."
-  (setq guix-package-info-download-buffer (current-buffer))
-  (guix-package-source-build-derivation
-   package-id
-   "The source does not exist in the store. Download it?"))
-
-(defun guix-package-info-insert-source (source entry)
-  "Insert SOURCE from package ENTRY at point.
-SOURCE is a list of URLs."
-  (if (null source)
-      (guix-format-insert nil)
-    (let* ((source-file (guix-entry-value entry 'source-file))
-           (entry-id    (guix-entry-id entry))
-           (package-id  (or (guix-entry-value entry 'package-id)
-                            entry-id)))
-      (if (null source-file)
-          (guix-info-insert-action-button
-           "Show"
-           (lambda (btn)
-             (guix-package-info-show-source (button-get btn 'entry-id)
-                                            (button-get btn 'package-id)))
-           "Show the source store directory of the current package"
-           'entry-id entry-id
-           'package-id package-id)
-        (unless (file-exists-p source-file)
-          (guix-info-insert-action-button
-           "Download"
-           (lambda (btn)
-             (guix-package-info-download-source
-              (button-get btn 'package-id)))
-           "Download the source into the store"
-           'package-id package-id))
-        (guix-info-insert-value-indent source-file 'guix-file))
-      (guix-info-insert-value-indent source 'guix-package-source))))
-
-(defun guix-package-info-redisplay-after-download ()
-  "Redisplay an 'info' buffer after downloading the package source.
-This function is used to hide a \"Download\" button if needed."
-  (when (buffer-live-p guix-package-info-download-buffer)
-    (with-current-buffer guix-package-info-download-buffer
-      (guix-buffer-redisplay-goto-button))
-    (setq guix-package-info-download-buffer nil)))
-
-(add-hook 'guix-after-source-download-hook
-          'guix-package-info-redisplay-after-download)
-
-
-;;; Package 'list'
-
-(guix-ui-list-define-interface package
-  :buffer-name "*Guix Package List*"
-  :format '((name guix-package-list-get-name 20 t)
-            (version nil 10 nil)
-            (outputs nil 13 t)
-            (installed guix-package-list-get-installed-outputs 13 t)
-            (synopsis guix-list-get-one-line 30 nil))
-  :sort-key '(name)
-  :marks '((install . ?I)
-           (upgrade . ?U)
-           (delete  . ?D)))
-
-(let ((map guix-package-list-mode-map))
-  (define-key map (kbd "B")   'guix-package-list-latest-builds)
-  (define-key map (kbd "e")   'guix-package-list-edit)
-  (define-key map (kbd "x")   'guix-package-list-execute)
-  (define-key map (kbd "i")   'guix-package-list-mark-install)
-  (define-key map (kbd "d")   'guix-package-list-mark-delete)
-  (define-key map (kbd "U")   'guix-package-list-mark-upgrade)
-  (define-key map (kbd "^")   'guix-package-list-mark-upgrades))
-
-(defface guix-package-list-installed
-  '((t :inherit guix-package-info-installed-outputs))
-  "Face used if there are installed outputs for the current package."
-  :group 'guix-package-list-faces)
-
-(defface guix-package-list-obsolete
-  '((t :inherit guix-package-info-obsolete))
-  "Face used if a package is obsolete."
-  :group 'guix-package-list-faces)
-
-(defcustom guix-package-list-generation-marking-enabled nil
-  "If non-nil, allow putting marks in a list with 'generation packages'.
-
-By default this is disabled, because it may be confusing.  For
-example, a package is installed in some generation, so a user can
-mark it for deletion in the list of packages from this
-generation, but the package may not be installed in the latest
-generation, so actually it cannot be deleted.
-
-If you managed to understand the explanation above or if you
-really know what you do or if you just don't care, you can set
-this variable to t.  It should not do much harm anyway (most
-likely)."
-  :type 'boolean
-  :group 'guix-package-list)
-
-(defun guix-package-list-get-name (name entry)
-  "Return NAME of the package ENTRY.
-Colorize it with `guix-package-list-installed' or
-`guix-package-list-obsolete' if needed."
-  (guix-get-string name
-                   (cond ((guix-entry-value entry 'obsolete)
-                          'guix-package-list-obsolete)
-                         ((guix-entry-value entry 'installed)
-                          'guix-package-list-installed))))
-
-(defun guix-package-list-get-installed-outputs (installed &optional _)
-  "Return string with outputs from INSTALLED entries."
-  (guix-get-string
-   (mapcar (lambda (entry)
-             (guix-entry-value entry 'output))
-           installed)))
-
-(defun guix-package-list-marking-check ()
-  "Signal an error if marking is disabled for the current buffer."
-  (when (and (not guix-package-list-generation-marking-enabled)
-             (or (derived-mode-p 'guix-package-list-mode)
-                 (derived-mode-p 'guix-output-list-mode))
-             (eq (guix-ui-current-search-type) 'generation))
-    (error "Action marks are disabled for lists of 'generation packages'")))
-
-(defun guix-package-list-mark-outputs (mark default
-                                       &optional prompt available)
-  "Mark the current package with MARK and move to the next line.
-If PROMPT is non-nil, use it to ask a user for outputs from
-AVAILABLE list, otherwise mark all DEFAULT outputs."
-  (let ((outputs (if prompt
-                     (guix-completing-read-multiple
-                      prompt available nil t)
-                   default)))
-    (apply #'guix-list--mark mark t outputs)))
-
-(defun guix-package-list-mark-install (&optional arg)
-  "Mark the current package for installation and move to the next line.
-With ARG, prompt for the outputs to install (several outputs may
-be separated with \",\")."
-  (interactive "P")
-  (guix-package-list-marking-check)
-  (let* ((entry     (guix-list-current-entry))
-         (all       (guix-entry-value entry 'outputs))
-         (installed (guix-package-installed-outputs entry))
-         (available (cl-set-difference all installed :test #'string=)))
-    (or available
-        (user-error "This package is already installed"))
-    (guix-package-list-mark-outputs
-     'install '("out")
-     (and arg "Output(s) to install: ")
-     available)))
-
-(defun guix-package-list-mark-delete (&optional arg)
-  "Mark the current package for deletion and move to the next line.
-With ARG, prompt for the outputs to delete (several outputs may
-be separated with \",\")."
-  (interactive "P")
-  (guix-package-list-marking-check)
-  (let* ((entry (guix-list-current-entry))
-         (installed (guix-package-installed-outputs entry)))
-    (or installed
-        (user-error "This package is not installed"))
-    (guix-package-list-mark-outputs
-     'delete installed
-     (and arg "Output(s) to delete: ")
-     installed)))
-
-(defun guix-package-list-mark-upgrade (&optional arg)
-  "Mark the current package for upgrading and move to the next line.
-With ARG, prompt for the outputs to upgrade (several outputs may
-be separated with \",\")."
-  (interactive "P")
-  (guix-package-list-marking-check)
-  (let* ((entry (guix-list-current-entry))
-         (installed (guix-package-installed-outputs entry)))
-    (or installed
-        (user-error "This package is not installed"))
-    (when (or (guix-entry-value entry 'obsolete)
-              (y-or-n-p "This package is not obsolete.  Try to upgrade it anyway? "))
-      (guix-package-list-mark-outputs
-       'upgrade installed
-       (and arg "Output(s) to upgrade: ")
-       installed))))
-
-(defun guix-package-mark-upgrades (fun)
-  "Mark all obsolete packages for upgrading.
-Use FUN to perform marking of the current line.  FUN should
-take an entry as argument."
-  (guix-package-list-marking-check)
-  (let ((obsolete (cl-remove-if-not
-                   (lambda (entry)
-                     (guix-entry-value entry 'obsolete))
-                   (guix-buffer-current-entries))))
-    (guix-list-for-each-line
-     (lambda ()
-       (let* ((id (guix-list-current-id))
-              (entry (cl-find-if
-                      (lambda (entry)
-                        (equal id (guix-entry-id entry)))
-                      obsolete)))
-         (when entry
-           (funcall fun entry)))))))
-
-(defun guix-package-list-mark-upgrades ()
-  "Mark all obsolete packages for upgrading."
-  (interactive)
-  (guix-package-mark-upgrades
-   (lambda (entry)
-     (apply #'guix-list--mark
-            'upgrade nil
-            (guix-package-installed-outputs entry)))))
-
-(defun guix-package-assert-non-system-profile ()
-  "Verify that the current profile is not a system one.
-The current profile is the one used by the current buffer."
-  (let ((profile (guix-ui-current-profile)))
-    (and profile
-         (guix-system-profile? profile)
-         (user-error "Packages cannot be installed or removed to/from \
-profile '%s'.
-Use 'guix system reconfigure' shell command to modify a system profile."
-                     profile))))
-
-(defun guix-package-execute-actions (fun)
-  "Perform actions on the marked packages.
-Use FUN to define actions suitable for `guix-process-package-actions'.
-FUN should take action-type as argument."
-  (guix-package-assert-non-system-profile)
-  (let ((actions (delq nil
-                       (mapcar fun '(install delete upgrade)))))
-    (if actions
-        (guix-process-package-actions (guix-ui-current-profile)
-                                      actions (current-buffer))
-      (user-error "No operations specified"))))
-
-(defun guix-package-list-execute ()
-  "Perform actions on the marked packages."
-  (interactive)
-  (guix-package-execute-actions #'guix-package-list-make-action))
-
-(defun guix-package-list-make-action (action-type)
-  "Return action specification for the packages marked with ACTION-TYPE.
-Return nil, if there are no packages marked with ACTION-TYPE.
-The specification is suitable for `guix-process-package-actions'."
-  (let ((specs (guix-list-get-marked-args action-type)))
-    (and specs (cons action-type specs))))
-
-(defun guix-package-list-edit (&optional directory)
-  "Go to the location of the current package.
-See `guix-find-location' for the meaning of DIRECTORY."
-  (interactive (list (guix-read-directory)))
-  (guix-edit (guix-list-current-id) directory))
-
-(defun guix-package-list-latest-builds (number &rest args)
-  "Display latest NUMBER of Hydra builds of the current package.
-Interactively, prompt for NUMBER.  With prefix argument, prompt
-for all ARGS."
-  (interactive
-   (let ((entry (guix-list-current-entry)))
-     (guix-hydra-build-latest-prompt-args
-      :job (guix-hydra-job-name-specification
-            (guix-entry-value entry 'name)
-            (guix-entry-value entry 'version)))))
-  (apply #'guix-hydra-latest-builds number args))
-
-
-;;; Output 'info'
-
-(guix-ui-info-define-interface output
-  :buffer-name "*Guix Package Info*"
-  :format '((name format (format guix-package-info-name))
-            (version format guix-output-info-insert-version)
-            (output format guix-output-info-insert-output)
-            (synopsis simple (indent guix-package-info-synopsis))
-            guix-package-info-insert-misc
-            (source simple guix-package-info-insert-source)
-            (path simple (indent guix-file))
-            (dependencies simple (indent guix-file))
-            (location simple guix-package-info-insert-location)
-            (home-url format (format guix-url))
-            (license format (format guix-package-license))
-            (systems format guix-package-info-insert-systems)
-            (inputs format (format guix-package-input))
-            (native-inputs format (format guix-package-native-input))
-            (propagated-inputs format
-                               (format guix-package-propagated-input))
-            (description simple (indent guix-package-info-description)))
-  :titles guix-package-info-titles
-  :required '(id package-id installed non-unique))
-
-(defun guix-output-info-insert-version (version entry)
-  "Insert output VERSION and obsolete text if needed at point."
-  (guix-info-insert-value-format version
-                                 'guix-package-info-version)
-  (and (guix-entry-value entry 'obsolete)
-       (guix-package-info-insert-obsolete-text)))
-
-(defun guix-output-info-insert-output (output entry)
-  "Insert OUTPUT and action buttons at point."
-  (let* ((installed   (guix-entry-value entry 'installed))
-         (obsolete    (guix-entry-value entry 'obsolete))
-         (action-type (if installed 'delete 'install)))
-    (guix-info-insert-value-format
-     output
-     (if installed
-         'guix-package-info-installed-outputs
-       'guix-package-info-uninstalled-outputs))
-    (guix-info-insert-indent)
-    (guix-package-info-insert-action-button action-type entry output)
-    (when obsolete
-      (guix-info-insert-indent)
-      (guix-package-info-insert-action-button 'upgrade entry output))))
-
-
-;;; Output 'list'
-
-(guix-ui-list-define-interface output
-  :buffer-name "*Guix Package List*"
-  :describe-function 'guix-output-list-describe
-  :format '((name guix-package-list-get-name 20 t)
-            (version nil 10 nil)
-            (output nil 9 t)
-            (installed nil 12 t)
-            (synopsis guix-list-get-one-line 30 nil))
-  :required '(id package-id)
-  :sort-key '(name)
-  :marks '((install . ?I)
-           (upgrade . ?U)
-           (delete  . ?D)))
-
-(let ((map guix-output-list-mode-map))
-  (define-key map (kbd "B")   'guix-package-list-latest-builds)
-  (define-key map (kbd "e")   'guix-output-list-edit)
-  (define-key map (kbd "x")   'guix-output-list-execute)
-  (define-key map (kbd "i")   'guix-output-list-mark-install)
-  (define-key map (kbd "d")   'guix-output-list-mark-delete)
-  (define-key map (kbd "U")   'guix-output-list-mark-upgrade)
-  (define-key map (kbd "^")   'guix-output-list-mark-upgrades))
-
-(defun guix-output-list-mark-install ()
-  "Mark the current output for installation and move to the next line."
-  (interactive)
-  (guix-package-list-marking-check)
-  (let* ((entry     (guix-list-current-entry))
-         (installed (guix-entry-value entry 'installed)))
-    (if installed
-        (user-error "This output is already installed")
-      (guix-list--mark 'install t))))
-
-(defun guix-output-list-mark-delete ()
-  "Mark the current output for deletion and move to the next line."
-  (interactive)
-  (guix-package-list-marking-check)
-  (let* ((entry     (guix-list-current-entry))
-         (installed (guix-entry-value entry 'installed)))
-    (if installed
-        (guix-list--mark 'delete t)
-      (user-error "This output is not installed"))))
-
-(defun guix-output-list-mark-upgrade ()
-  "Mark the current output for upgrading and move to the next line."
-  (interactive)
-  (guix-package-list-marking-check)
-  (let* ((entry     (guix-list-current-entry))
-         (installed (guix-entry-value entry 'installed)))
-    (or installed
-        (user-error "This output is not installed"))
-    (when (or (guix-entry-value entry 'obsolete)
-              (y-or-n-p "This output is not obsolete.  Try to upgrade it anyway? "))
-      (guix-list--mark 'upgrade t))))
-
-(defun guix-output-list-mark-upgrades ()
-  "Mark all obsolete package outputs for upgrading."
-  (interactive)
-  (guix-package-mark-upgrades
-   (lambda (_) (guix-list--mark 'upgrade))))
-
-(defun guix-output-list-execute ()
-  "Perform actions on the marked outputs."
-  (interactive)
-  (guix-package-execute-actions #'guix-output-list-make-action))
-
-(defun guix-output-list-make-action (action-type)
-  "Return action specification for the outputs marked with ACTION-TYPE.
-Return nil, if there are no outputs marked with ACTION-TYPE.
-The specification is suitable for `guix-process-output-actions'."
-  (let ((ids (guix-list-get-marked-id-list action-type)))
-    (and ids (cons action-type
-                   (mapcar #'guix-package-id-and-output-by-output-id
-                           ids)))))
-
-(defun guix-output-list-describe (ids)
-  "Describe outputs with IDS (list of output identifiers).
-See `guix-package-info-type'."
-  (if (eq guix-package-info-type 'output)
-      (guix-buffer-get-display-entries
-       'info 'output
-       (cl-list* (guix-ui-current-profile) 'id ids)
-       'add)
-    (let ((pids (mapcar (lambda (oid)
-                          (car (guix-package-id-and-output-by-output-id
-                                oid)))
-                        ids)))
-      (guix-buffer-get-display-entries
-       'info 'package
-       (cl-list* (guix-ui-current-profile)
-                 'id (cl-remove-duplicates pids))
-       'add))))
-
-(defun guix-output-list-edit (&optional directory)
-  "Go to the location of the current package.
-See `guix-find-location' for the meaning of DIRECTORY."
-  (interactive (list (guix-read-directory)))
-  (guix-edit (guix-entry-value (guix-list-current-entry)
-                               'package-id)
-             directory))
-
-
-;;; Interactive commands
-
-(defvar guix-package-search-params '(name synopsis description)
-  "Default list of package parameters for searching by regexp.")
-
-(defvar guix-package-search-history nil
-  "A history of minibuffer prompts.")
-
-;;;###autoload
-(defun guix-packages-by-name (name &optional profile)
-  "Display Guix packages with NAME.
-NAME is a string with name specification.  It may optionally contain
-a version number.  Examples: \"guile\", \"guile@2.0.11\".
-
-If PROFILE is nil, use `guix-current-profile'.
-Interactively with prefix, prompt for PROFILE."
-  (interactive
-   (list (guix-read-package-name)
-         (guix-ui-read-profile)))
-  (guix-package-get-display profile 'name name))
-
-;;;###autoload
-(defun guix-packages-by-license (license &optional profile)
-  "Display Guix packages with LICENSE.
-LICENSE is a license name string.
-If PROFILE is nil, use `guix-current-profile'.
-Interactively with prefix, prompt for PROFILE."
-  (interactive
-   (list (guix-read-license-name)
-         (guix-ui-read-profile)))
-  (guix-package-get-display profile 'license license))
-
-;;;###autoload
-(defun guix-packages-by-location (location &optional profile)
-  "Display Guix packages placed in LOCATION file.
-If PROFILE is nil, use `guix-current-profile'.
-Interactively with prefix, prompt for PROFILE."
-  (interactive
-   (list (guix-read-package-location)
-         (guix-ui-read-profile)))
-  (guix-package-get-display profile 'location location))
-
-;;;###autoload
-(defun guix-package-from-file (file &optional profile)
-  "Display Guix package that the code from FILE evaluates to.
-If PROFILE is nil, use `guix-current-profile'.
-Interactively with prefix, prompt for PROFILE."
-  (interactive
-   (list (read-file-name "File with package: ")
-         (guix-ui-read-profile)))
-  (guix-buffer-get-display-entries
-   'info 'package
-   (list (or profile guix-current-profile) 'from-file file)
-   'add))
-
-;;;###autoload
-(defun guix-search-by-regexp (regexp &optional params profile)
-  "Search for Guix packages by REGEXP.
-PARAMS are package parameters that should be searched.
-If PARAMS are not specified, use `guix-package-search-params'.
-
-If PROFILE is nil, use `guix-current-profile'.
-Interactively with prefix, prompt for PROFILE."
-  (interactive
-   (list (read-regexp "Regexp: " nil 'guix-package-search-history)
-         nil (guix-ui-read-profile)))
-  (guix-package-get-display profile 'regexp regexp
-                            (or params guix-package-search-params)))
-
-;;;###autoload
-(defun guix-search-by-name (regexp &optional profile)
-  "Search for Guix packages matching REGEXP in a package name.
-If PROFILE is nil, use `guix-current-profile'.
-Interactively with prefix, prompt for PROFILE."
-  (interactive
-   (list (read-string "Package name by regexp: "
-                      nil 'guix-package-search-history)
-         (guix-ui-read-profile)))
-  (guix-search-by-regexp regexp '(name) profile))
-
-;;;###autoload
-(defun guix-installed-packages (&optional profile)
-  "Display information about installed Guix packages.
-If PROFILE is nil, use `guix-current-profile'.
-Interactively with prefix, prompt for PROFILE."
-  (interactive (list (guix-ui-read-profile)))
-  (guix-package-get-display profile 'installed))
-
-;;;###autoload
-(defun guix-installed-user-packages ()
-  "Display information about Guix packages installed in a user profile."
-  (interactive)
-  (guix-installed-packages guix-user-profile))
-
-;;;###autoload
-(defun guix-installed-system-packages ()
-  "Display information about Guix packages installed in a system profile."
-  (interactive)
-  (guix-installed-packages
-   (guix-packages-profile guix-system-profile nil t)))
-
-;;;###autoload
-(defun guix-obsolete-packages (&optional profile)
-  "Display information about obsolete Guix packages.
-If PROFILE is nil, use `guix-current-profile'.
-Interactively with prefix, prompt for PROFILE."
-  (interactive (list (guix-ui-read-profile)))
-  (guix-package-get-display profile 'obsolete))
-
-;;;###autoload
-(defun guix-all-available-packages (&optional profile)
-  "Display information about all available Guix packages.
-If PROFILE is nil, use `guix-current-profile'.
-Interactively with prefix, prompt for PROFILE."
-  (interactive (list (guix-ui-read-profile)))
-  (guix-package-get-display profile 'all-available))
-
-;;;###autoload
-(defun guix-newest-available-packages (&optional profile)
-  "Display information about the newest available Guix packages.
-If PROFILE is nil, use `guix-current-profile'.
-Interactively with prefix, prompt for PROFILE."
-  (interactive (list (guix-ui-read-profile)))
-  (guix-package-get-display profile 'newest-available))
-
-(provide 'guix-ui-package)
-
-;;; guix-ui-package.el ends here
diff --git a/emacs/guix-ui-system-generation.el b/emacs/guix-ui-system-generation.el
deleted file mode 100644
index 7f4d76d489..0000000000
--- a/emacs/guix-ui-system-generation.el
+++ /dev/null
@@ -1,105 +0,0 @@
-;;; guix-ui-system-generation.el --- Interface for displaying system generations  -*- lexical-binding: t -*-
-
-;; Copyright © 2016 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides an interface for displaying system generations
-;; in 'list' and 'info' buffers, and commands for working with them.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'guix-list)
-(require 'guix-ui)
-(require 'guix-ui-generation)
-(require 'guix-profiles)
-
-(guix-ui-define-entry-type system-generation)
-
-(defun guix-system-generation-get-display (search-type &rest search-values)
-  "Search for system generations and show results.
-See `guix-ui-get-entries' for the meaning of SEARCH-TYPE and
-SEARCH-VALUES."
-  (apply #'guix-list-get-display-entries
-         'system-generation
-         guix-system-profile
-         search-type search-values))
-
-
-;;; System generation 'info'
-
-(guix-ui-info-define-interface system-generation
-  :buffer-name "*Guix Generation Info*"
-  :format '((number format guix-generation-info-insert-number)
-            (label format (format))
-            (prev-number format (format))
-            (current format guix-generation-info-insert-current)
-            (path format (format guix-file))
-            (time format (time))
-            (root-device format (format))
-            (kernel format (format guix-file)))
-  :titles guix-generation-info-titles)
-
-
-;;; System generation 'list'
-
-;; FIXME It is better to make `guix-generation-list-shared-map' with
-;; common keys for both usual and system generations.
-(defvar guix-system-generation-list-mode-map
-  (copy-keymap guix-generation-list-mode-map)
-  "Keymap for `guix-system-generation-list-mode' buffers.")
-
-(guix-ui-list-define-interface system-generation
-  :buffer-name "*Guix Generation List*"
-  :format '((number nil 5 guix-list-sort-numerically-0 :right-align t)
-            (current guix-generation-list-get-current 10 t)
-            (label nil 40 t)
-            (time guix-list-get-time 20 t)
-            (path guix-list-get-file-name 30 t))
-  :titles guix-generation-list-titles
-  :sort-key '(number . t)
-  :marks '((delete . ?D)))
-
-
-;;; Interactive commands
-
-;;;###autoload
-(defun guix-system-generations ()
-  "Display information about system generations."
-  (interactive)
-  (guix-system-generation-get-display 'all))
-
-;;;###autoload
-(defun guix-last-system-generations (number)
-  "Display information about last NUMBER of system generations."
-  (interactive "nThe number of last generations: ")
-  (guix-system-generation-get-display 'last number))
-
-;;;###autoload
-(defun guix-system-generations-by-time (from to)
-  "Display information about system generations created between FROM and TO."
-  (interactive
-   (list (guix-read-date "Find generations (from): ")
-         (guix-read-date "Find generations (to): ")))
-  (guix-system-generation-get-display
-   'time (float-time from) (float-time to)))
-
-(provide 'guix-ui-system-generation)
-
-;;; guix-ui-system-generation.el ends here
diff --git a/emacs/guix-ui.el b/emacs/guix-ui.el
deleted file mode 100644
index 1b696314cd..0000000000
--- a/emacs/guix-ui.el
+++ /dev/null
@@ -1,323 +0,0 @@
-;;; guix-ui.el --- Common code for Guix package management interface  -*- lexical-binding: t -*-
-
-;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides some general code for 'list'/'info' interfaces for
-;; packages and generations.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'guix-backend)
-(require 'guix-buffer)
-(require 'guix-guile)
-(require 'guix-utils)
-(require 'guix-messages)
-(require 'guix-profiles)
-
-(guix-define-groups ui
-  :group-doc "\
-Settings for 'ui' (Guix package management) buffers.
-This group includes settings for displaying packages, outputs and
-generations in 'list' and 'info' buffers.")
-
-(defvar guix-ui-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map (kbd "M") 'guix-apply-manifest)
-    (define-key map (kbd "C-c C-z") 'guix-switch-to-repl)
-    map)
-  "Parent keymap for Guix package/generation buffers.")
-
-(guix-buffer-define-current-args-accessors
- "guix-ui-current" "profile" "search-type" "search-values")
-
-(defun guix-ui-read-profile ()
-  "Return `guix-current-profile' or prompt for it.
-This function is intended for using in `interactive' forms."
-  (if current-prefix-arg
-      (guix-profile-prompt)
-    guix-current-profile))
-
-(defun guix-ui-get-entries (profile entry-type search-type search-values
-                                    &optional params)
-  "Receive ENTRY-TYPE entries for PROFILE.
-Call an appropriate scheme procedure and return a list of entries.
-
-ENTRY-TYPE should be one of the following symbols: `package',
-`output' or `generation'.
-
-SEARCH-TYPE may be one of the following symbols:
-
-- If ENTRY-TYPE is `package' or `output': `id', `name', `regexp',
-  `all-available', `newest-available', `installed', `obsolete',
-  `generation'.
-
-- If ENTRY-TYPE is `generation': `id', `last', `all', `time'.
-
-PARAMS is a list of parameters for receiving.  If nil, get data
-with all available parameters."
-  (guix-eval-read
-   (guix-make-guile-expression
-    'entries
-    profile params entry-type search-type search-values)))
-
-(defun guix-ui-list-describe (ids)
-  "Describe 'ui' entries with IDS (list of identifiers)."
-  (guix-buffer-get-display-entries
-   'info (guix-buffer-current-entry-type)
-   (cl-list* (guix-ui-current-profile) 'id ids)
-   'add))
-
-
-;;; Buffers and auto updating
-
-(defcustom guix-ui-update-after-operation 'current
-  "Define what kind of data to update after executing an operation.
-
-After successful executing an operation in the Guix REPL (for
-example after installing a package), the data in Guix buffers
-will or will not be automatically updated depending on a value of
-this variable.
-
-If nil, update nothing (do not revert any buffer).
-If `current', update the buffer from which an operation was performed.
-If `all', update all Guix buffers (not recommended)."
-  :type '(choice (const :tag "Do nothing" nil)
-                 (const :tag "Update operation buffer" current)
-                 (const :tag "Update all Guix buffers" all))
-  :group 'guix-ui)
-
-(defcustom guix-ui-buffer-name-function
-  #'guix-ui-buffer-name-full
-  "Function used to define a name of a Guix buffer.
-The function is called with 2 arguments: BASE-NAME and PROFILE."
-  :type '(choice (function-item guix-ui-buffer-name-full)
-                 (function-item guix-ui-buffer-name-short)
-                 (function-item guix-ui-buffer-name-simple)
-                 (function :tag "Other function"))
-  :group 'guix-ui)
-
-(defun guix-ui-buffer-name-simple (base-name &rest _)
-  "Return BASE-NAME."
-  base-name)
-
-(defun guix-ui-buffer-name-short (base-name profile)
-  "Return buffer name by appending BASE-NAME and PROFILE's base file name."
-  (guix-compose-buffer-name base-name
-                            (file-name-base (directory-file-name profile))))
-
-(defun guix-ui-buffer-name-full (base-name profile)
-  "Return buffer name by appending BASE-NAME and PROFILE's full name."
-  (guix-compose-buffer-name base-name profile))
-
-(defun guix-ui-buffer-name (base-name profile)
-  "Return Guix buffer name based on BASE-NAME and profile.
-See `guix-ui-buffer-name-function' for details."
-  (funcall guix-ui-buffer-name-function
-           base-name profile))
-
-(defun guix-ui-buffer? (&optional buffer modes)
-  "Return non-nil if BUFFER mode is derived from any of the MODES.
-If BUFFER is nil, check current buffer.
-If MODES is nil, use `guix-list-mode' and `guix-info-mode'."
-  (with-current-buffer (or buffer (current-buffer))
-    (apply #'derived-mode-p
-           (or modes '(guix-list-mode guix-info-mode)))))
-
-(defun guix-ui-buffers (&optional modes)
-  "Return a list of all buffers with major modes derived from MODES.
-If MODES is nil, return list of all Guix 'list' and 'info' buffers."
-  (cl-remove-if-not (lambda (buf)
-                      (guix-ui-buffer? buf modes))
-                    (buffer-list)))
-
-(defun guix-ui-update-buffer (buffer)
-  "Update data in a 'list' or 'info' BUFFER."
-  (with-current-buffer buffer
-    (guix-buffer-revert nil t)))
-
-(defun guix-ui-update-buffers-after-operation ()
-  "Update buffers after Guix operation if needed.
-See `guix-ui-update-after-operation' for details."
-  (let ((to-update
-         (and guix-operation-buffer
-              (cl-case guix-ui-update-after-operation
-                (current (and (buffer-live-p guix-operation-buffer)
-                              (guix-ui-buffer? guix-operation-buffer)
-                              (list guix-operation-buffer)))
-                (all     (guix-ui-buffers))))))
-    (setq guix-operation-buffer nil)
-    (mapc #'guix-ui-update-buffer to-update)))
-
-(add-hook 'guix-after-repl-operation-hook
-          'guix-ui-update-buffers-after-operation)
-
-
-;;; Interface definers
-
-(defmacro guix-ui-define-entry-type (entry-type &rest args)
-  "Define general code for ENTRY-TYPE.
-Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ...
-
-The rest keyword arguments are passed to
-`guix-define-entry-type' macro."
-  (declare (indent 1))
-  `(guix-define-entry-type ,entry-type
-     :parent-group guix-ui
-     :parent-faces-group guix-ui-faces
-     ,@args))
-
-(defmacro guix-ui-define-interface (buffer-type entry-type &rest args)
-  "Define BUFFER-TYPE interface for displaying ENTRY-TYPE entries.
-Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ...
-In the following description TYPE means ENTRY-TYPE-BUFFER-TYPE.
-
-Required keywords:
-
-  - `:buffer-name' - base part of a buffer name.  It is used in a
-    generated `guix-TYPE-buffer-name' function; see
-    `guix-ui-buffer-name' for details.
-
-Optional keywords:
-
-  - `:required' - default value of the generated
-    `guix-TYPE-required-params' variable.
-
-The rest keyword arguments are passed to
-`guix-BUFFER-TYPE-define-interface' macro.
-
-Along with the mentioned definitions, this macro also defines:
-
-  - `guix-TYPE-mode-map' - keymap based on `guix-ui-map' and
-    `guix-BUFFER-TYPE-mode-map'.
-
-  - `guix-TYPE-get-entries' - a wrapper around `guix-ui-get-entries'.
-
-  - `guix-TYPE-message' - a wrapper around `guix-result-message'."
-  (declare (indent 2))
-  (let* ((entry-type-str  (symbol-name entry-type))
-         (buffer-type-str (symbol-name buffer-type))
-         (prefix          (concat "guix-" entry-type-str "-"
-                                  buffer-type-str))
-         (mode-str        (concat prefix "-mode"))
-         (mode-map        (intern (concat mode-str "-map")))
-         (parent-map      (intern (format "guix-%s-mode-map"
-                                          buffer-type-str)))
-         (required-var    (intern (concat prefix "-required-params")))
-         (buffer-name-fun (intern (concat prefix "-buffer-name")))
-         (get-fun         (intern (concat prefix "-get-entries")))
-         (message-fun     (intern (concat prefix "-message")))
-         (displayed-fun   (intern (format "guix-%s-displayed-params"
-                                          buffer-type-str)))
-         (definer         (intern (format "guix-%s-define-interface"
-                                          buffer-type-str))))
-    (guix-keyword-args-let args
-        ((buffer-name-val :buffer-name)
-         (required-val    :required ''(id)))
-      `(progn
-         (defvar ,mode-map
-           (let ((map (make-sparse-keymap)))
-             (set-keymap-parent
-              map (make-composed-keymap ,parent-map guix-ui-map))
-             map)
-           ,(format "Keymap for `%s' buffers." mode-str))
-
-         (defvar ,required-var ,required-val
-           ,(format "\
-List of the required '%s' parameters.
-These parameters are received by `%S'
-along with the displayed parameters.
-
-Do not remove `id' from this list as it is required for
-identifying an entry."
-                    entry-type-str get-fun))
-
-         (defun ,buffer-name-fun (profile &rest _)
-           ,(format "\
-Return a name of '%s' buffer for displaying '%s' entries.
-See `guix-ui-buffer-name' for details."
-                    buffer-type-str entry-type-str)
-           (guix-ui-buffer-name ,buffer-name-val profile))
-
-         (defun ,get-fun (profile search-type &rest search-values)
-           ,(format "\
-Receive '%s' entries for displaying them in '%s' buffer.
-See `guix-ui-get-entries' for details."
-                    entry-type-str buffer-type-str)
-           (guix-ui-get-entries
-            profile ',entry-type search-type search-values
-            (cl-union ,required-var
-                      (,displayed-fun ',entry-type))))
-
-         (defun ,message-fun (entries profile search-type
-                                      &rest search-values)
-           ,(format "\
-Display a message after showing '%s' entries."
-                    entry-type-str)
-           (guix-result-message
-            profile entries ',entry-type search-type search-values))
-
-         (,definer ,entry-type
-           :get-entries-function ',get-fun
-           :message-function ',message-fun
-           :buffer-name ',buffer-name-fun
-           ,@%foreign-args)))))
-
-(defmacro guix-ui-info-define-interface (entry-type &rest args)
-  "Define 'info' interface for displaying ENTRY-TYPE entries.
-See `guix-ui-define-interface'."
-  (declare (indent 1))
-  `(guix-ui-define-interface info ,entry-type
-     ,@args))
-
-(defmacro guix-ui-list-define-interface (entry-type &rest args)
-  "Define 'list' interface for displaying ENTRY-TYPE entries.
-Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ...
-
-Optional keywords:
-
-  - `:describe-function' - default value of the generated
-    `guix-ENTRY-TYPE-list-describe-function' variable (if not
-    specified, use `guix-ui-list-describe').
-
-The rest keyword arguments are passed to
-`guix-ui-define-interface' macro."
-  (declare (indent 1))
-  (guix-keyword-args-let args
-      ((describe-val :describe-function))
-    `(guix-ui-define-interface list ,entry-type
-       :describe-function ,(or describe-val ''guix-ui-list-describe)
-       ,@args)))
-
-
-(defvar guix-ui-font-lock-keywords
-  (eval-when-compile
-    `((,(rx "(" (group (or "guix-ui-define-entry-type"
-                           "guix-ui-define-interface"
-                           "guix-ui-info-define-interface"
-                           "guix-ui-list-define-interface"))
-            symbol-end)
-       . 1))))
-
-(font-lock-add-keywords 'emacs-lisp-mode guix-ui-font-lock-keywords)
-
-(provide 'guix-ui)
-
-;;; guix-ui.el ends here
diff --git a/emacs/guix-utils.el b/emacs/guix-utils.el
deleted file mode 100644
index 3e4ecc36ab..0000000000
--- a/emacs/guix-utils.el
+++ /dev/null
@@ -1,609 +0,0 @@
-;;; guix-utils.el --- General utility functions  -*- lexical-binding: t -*-
-
-;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
-
-;; This file is part of GNU Guix.
-
-;; GNU Guix is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Guix is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file provides auxiliary general functions for guix.el package.
-
-;;; Code:
-
-(require 'cl-lib)
-
-(defvar guix-true-string "Yes")
-(defvar guix-false-string "–")
-(defvar guix-list-separator ", ")
-
-(defvar guix-time-format "%F %T"
-  "String used to format time values.
-For possible formats, see `format-time-string'.")
-
-(defun guix-get-string (val &optional face)
-  "Convert VAL into a string and return it.
-
-VAL can be an expression of any type.
-If VAL is t/nil, it is replaced with
-`guix-true-string'/`guix-false-string'.
-If VAL is list, its elements are concatenated using
-`guix-list-separator'.
-
-If FACE is non-nil, propertize returned string with this FACE."
-  (let ((str (cond
-              ((stringp val) val)
-              ((null val) guix-false-string)
-              ((eq t val) guix-true-string)
-              ((numberp val) (number-to-string val))
-              ((listp val) (mapconcat #'guix-get-string
-                                      val guix-list-separator))
-              (t (prin1-to-string val)))))
-    (if (and val face)
-        (propertize str 'font-lock-face face)
-      str)))
-
-(defun guix-get-time-string (seconds)
-  "Return formatted time string from SECONDS.
-Use `guix-time-format'."
-  (format-time-string guix-time-format (seconds-to-time seconds)))
-
-(defun guix-get-one-line (str)
-  "Return one-line string from a multi-line STR."
-  (replace-regexp-in-string "\n" " " str))
-
-(defmacro guix-with-indent (indent &rest body)
-  "Evaluate BODY and indent inserted text by INDENT number of spaces."
-  (declare (indent 1) (debug t))
-  (let ((region-beg-var (make-symbol "region-beg"))
-        (indent-var     (make-symbol "indent")))
-    `(let ((,region-beg-var (point))
-           (,indent-var     ,indent))
-       ,@body
-       (unless (zerop ,indent-var)
-         (indent-rigidly ,region-beg-var (point) ,indent-var)))))
-
-(defun guix-format-insert (val &optional face format)
-  "Convert VAL into a string and insert it at point.
-If FACE is non-nil, propertize VAL with FACE.
-If FORMAT is non-nil, format VAL with FORMAT."
-  (let ((str (guix-get-string val face)))
-    (insert (if format
-                (format format str)
-              str))))
-
-(cl-defun guix-mapinsert (function sequence separator &key indent column)
-  "Like `mapconcat' but for inserting text.
-Apply FUNCTION to each element of SEQUENCE, and insert SEPARATOR
-at point between each FUNCTION call.
-
-If INDENT is non-nil, it should be a number of spaces used to
-indent each line of the inserted text.
-
-If COLUMN is non-nil, it should be a column number which
-shouldn't be exceeded by the inserted text."
-  (pcase sequence
-    (`(,first . ,rest)
-     (let* ((indent (or indent 0))
-            (max-column (and column (- column indent))))
-       (guix-with-indent indent
-         (funcall function first)
-         (dolist (element rest)
-           (let ((before-sep-pos (and column (point))))
-             (insert separator)
-             (let ((after-sep-pos (and column (point))))
-               (funcall function element)
-               (when (and column
-                          (> (current-column) max-column))
-                 (save-excursion
-                   (delete-region before-sep-pos after-sep-pos)
-                   (goto-char before-sep-pos)
-                   (insert "\n")))))))))))
-
-(defun guix-insert-button (label &optional type &rest properties)
-  "Make button of TYPE with LABEL and insert it at point.
-See `insert-text-button' for the meaning of PROPERTIES."
-  (if (null label)
-      (guix-format-insert nil)
-    (apply #'insert-text-button label
-           :type (or type 'button)
-           properties)))
-
-(defun guix-buttonize (value button-type separator &rest properties)
-  "Make BUTTON-TYPE button(s) from VALUE.
-Return a string with button(s).
-
-VALUE should be a string or a list of strings.  If it is a list
-of strings, buttons are separated with SEPARATOR string.
-
-PROPERTIES are passed to `guix-insert-button'."
-  (with-temp-buffer
-    (let ((labels (if (listp value) value (list value))))
-      (guix-mapinsert (lambda (label)
-                        (apply #'guix-insert-button
-                               label button-type properties))
-                      labels
-                      separator))
-    (buffer-substring (point-min) (point-max))))
-
-(defun guix-button-type? (symbol)
-  "Return non-nil, if SYMBOL is a button type."
-  (and symbol
-       (get symbol 'button-category-symbol)))
-
-(defun guix-split-insert (val &optional face col separator)
-  "Convert VAL into a string, split it and insert at point.
-
-If FACE is non-nil, propertize returned string with this FACE.
-
-If COL is non-nil and result string is a one-line string longer
-than COL, split it into several short lines.
-
-Separate inserted lines with SEPARATOR."
-  (if (null val)
-      (guix-format-insert nil)
-    (let ((strings (guix-split-string (guix-get-string val) col)))
-      (guix-mapinsert (lambda (str) (guix-format-insert str face))
-                      strings
-                      (or separator "")))))
-
-(defun guix-split-string (str &optional col)
-  "Split string STR by lines and return list of result strings.
-If COL is non-nil, fill STR to this column."
-  (let ((str (if col
-                 (guix-get-filled-string str col)
-               str)))
-    (split-string str "\n *" t)))
-
-(defun guix-get-filled-string (str col)
-  "Return string by filling STR to column COL."
-  (with-temp-buffer
-    (insert str)
-    (let ((fill-column col))
-      (fill-region (point-min) (point-max)))
-    (buffer-string)))
-
-(defun guix-concat-strings (strings separator &optional location)
-  "Return new string by concatenating STRINGS with SEPARATOR.
-If LOCATION is a symbol `head', add another SEPARATOR to the
-beginning of the returned string; if `tail' - add SEPARATOR to
-the end of the string; if nil, do not add SEPARATOR; otherwise
-add both to the end and to the beginning."
-  (let ((str (mapconcat #'identity strings separator)))
-    (cond ((null location)
-           str)
-          ((eq location 'head)
-           (concat separator str))
-          ((eq location 'tail)
-           (concat str separator))
-          (t
-           (concat separator str separator)))))
-
-(defun guix-hexify (value)
-  "Convert VALUE to string and hexify it."
-  (url-hexify-string (guix-get-string value)))
-
-(defun guix-number->bool (number)
-  "Convert NUMBER to boolean value.
-Return nil, if NUMBER is 0; return t otherwise."
-  (not (zerop number)))
-
-(defun guix-shell-quote-argument (argument)
-  "Quote shell command ARGUMENT.
-This function is similar to `shell-quote-argument', but less strict."
-  (if (equal argument "")
-      "''"
-    (replace-regexp-in-string
-     "\n" "'\n'"
-     (replace-regexp-in-string
-      (rx (not (any alnum "-=,./\n"))) "\\\\\\&" argument))))
-
-(defun guix-symbol-title (symbol)
-  "Return SYMBOL's name, a string.
-This is like `symbol-name', but fancier."
-  (if (eq symbol 'id)
-      "ID"
-    (let ((str (replace-regexp-in-string "-" " " (symbol-name symbol))))
-      (concat (capitalize (substring str 0 1))
-              (substring str 1)))))
-
-(defun guix-command-symbol (&optional args)
-  "Return symbol by concatenating 'guix' and ARGS (strings)."
-  (intern (guix-concat-strings (cons "guix" args) "-")))
-
-(defun guix-command-string (&optional args)
-  "Return 'guix ARGS ...' string with quoted shell arguments."
-  (let ((args (mapcar #'guix-shell-quote-argument args)))
-    (guix-concat-strings (cons "guix" args) " ")))
-
-(defun guix-copy-as-kill (string &optional no-message?)
-  "Put STRING into `kill-ring'.
-If NO-MESSAGE? is non-nil, do not display a message about it."
-  (kill-new string)
-  (unless no-message?
-    (message "'%s' has been added to kill ring." string)))
-
-(defun guix-copy-command-as-kill (args &optional no-message?)
-  "Put 'guix ARGS ...' string into `kill-ring'.
-See also `guix-copy-as-kill'."
-  (guix-copy-as-kill (guix-command-string args) no-message?))
-
-(defun guix-compose-buffer-name (base-name postfix)
-  "Return buffer name by appending BASE-NAME and POSTFIX.
-
-In a simple case the result is:
-
-  BASE-NAME: POSTFIX
-
-If BASE-NAME is wrapped by '*', then the result is:
-
-  *BASE-NAME: POSTFIX*"
-  (let ((re (rx string-start
-                (group (? "*"))
-                (group (*? any))
-                (group (? "*"))
-                string-end)))
-    (or (string-match re base-name)
-        (error "Unexpected error in defining buffer name"))
-    (let ((first*    (match-string 1 base-name))
-          (name-body (match-string 2 base-name))
-          (last*     (match-string 3 base-name)))
-      ;; Handle the case when buffer name is wrapped by '*'.
-      (if (and (string= "*" first*)
-               (string= "*" last*))
-          (concat "*" name-body ": " postfix "*")
-        (concat base-name ": " postfix)))))
-
-(defun guix-completing-read (prompt table &optional predicate
-                             require-match initial-input
-                             hist def inherit-input-method)
-  "Same as `completing-read' but return nil instead of an empty string."
-  (let ((res (completing-read prompt table predicate
-                              require-match initial-input
-                              hist def inherit-input-method)))
-    (unless (string= "" res) res)))
-
-(defun guix-completing-read-multiple (prompt table &optional predicate
-                                      require-match initial-input
-                                      hist def inherit-input-method)
-  "Same as `completing-read-multiple' but remove duplicates in result."
-  (cl-remove-duplicates
-   (completing-read-multiple prompt table predicate
-                             require-match initial-input
-                             hist def inherit-input-method)
-   :test #'string=))
-
-(declare-function org-read-date "org" t)
-
-(defun guix-read-date (prompt)
-  "Prompt for a date or time using `org-read-date'.
-Return time value."
-  (require 'org)
-  (org-read-date nil t nil prompt))
-
-(defun guix-read-file-name (prompt &optional dir default-filename
-                                   mustmatch initial predicate)
-  "Read file name.
-This function is similar to `read-file-name' except it also
-expands the file name."
-  (expand-file-name (read-file-name prompt dir default-filename
-                                    mustmatch initial predicate)))
-
-(defcustom guix-find-file-function #'find-file
-  "Function used to find a file.
-The function is called by `guix-find-file' with a file name as a
-single argument."
-  :type '(choice (function-item find-file)
-                 (function-item org-open-file)
-                 (function :tag "Other function"))
-  :group 'guix)
-
-(defun guix-find-file (file)
-  "Find FILE if it exists."
-  (if (file-exists-p file)
-      (funcall guix-find-file-function file)
-    (message "File '%s' does not exist." file)))
-
-(defvar url-handler-regexp)
-
-(defun guix-find-file-or-url (file-or-url)
-  "Find FILE-OR-URL."
-  (require 'url-handlers)
-  (let ((file-name-handler-alist
-         (cons (cons url-handler-regexp 'url-file-handler)
-               file-name-handler-alist)))
-    (find-file file-or-url)))
-
-(defmacro guix-while-search (regexp &rest body)
-  "Evaluate BODY after each search for REGEXP in the current buffer."
-  (declare (indent 1) (debug t))
-  `(save-excursion
-     (goto-char (point-min))
-     (while (re-search-forward ,regexp nil t)
-       ,@body)))
-
-(defmacro guix-while-null (&rest body)
-  "Evaluate BODY until its result becomes non-nil."
-  (declare (indent 0) (debug t))
-  (let ((result-var (make-symbol "result")))
-    `(let (,result-var)
-       (while (null ,result-var)
-         (setq ,result-var ,@body))
-       ,result-var)))
-
-(defun guix-modify (object modifiers)
-  "Apply MODIFIERS to OBJECT.
-OBJECT is passed as an argument to the first function from
-MODIFIERS list, the returned result is passed to the second
-function from the list and so on.  Return result of the last
-modifier call."
-  (if (null modifiers)
-      object
-    (guix-modify (funcall (car modifiers) object)
-                 (cdr modifiers))))
-
-(defmacro guix-keyword-args-let (args varlist &rest body)
-  "Parse ARGS, bind variables from VARLIST and eval BODY.
-
-Find keyword values in ARGS, bind them to variables according to
-VARLIST, then evaluate BODY.
-
-ARGS is a keyword/value property list.
-
-Each element of VARLIST has a form:
-
-  (SYMBOL KEYWORD [DEFAULT-VALUE])
-
-SYMBOL is a varible name.  KEYWORD is a symbol that will be
-searched in ARGS for an according value.  If the value of KEYWORD
-does not exist, bind SYMBOL to DEFAULT-VALUE or nil.
-
-The rest arguments (that present in ARGS but not in VARLIST) will
-be bound to `%foreign-args' variable.
-
-Example:
-
-  (guix-keyword-args-let '(:two 8 :great ! :guix is)
-      ((one :one 1)
-       (two :two 2)
-       (foo :smth))
-    (list one two foo %foreign-args))
-
-  => (1 8 nil (:guix is :great !))"
-  (declare (indent 2))
-  (let ((args-var (make-symbol "args")))
-    `(let (,@(mapcar (lambda (spec)
-                       (pcase-let ((`(,name ,_ ,val) spec))
-                         (list name val)))
-                     varlist)
-           (,args-var ,args)
-           %foreign-args)
-       (while ,args-var
-         (pcase ,args-var
-           (`(,key ,val . ,rest-args)
-            (cl-case key
-              ,@(mapcar (lambda (spec)
-                          (pcase-let ((`(,name ,key ,_) spec))
-                            `(,key (setq ,name val))))
-                        varlist)
-              (t (setq %foreign-args
-                       (cl-list* key val %foreign-args))))
-            (setq ,args-var rest-args))))
-       ,@body)))
-
-
-;;; Alist procedures
-
-(defmacro guix-define-alist-accessor (name assoc-fun)
-  "Define NAME function to access alist values using ASSOC-FUN."
-  `(defun ,name (alist &rest keys)
-     ,(format "Return value from ALIST by KEYS using `%s'.
-ALIST is alist of alists of alists ... which can be consecutively
-accessed with KEYS."
-              assoc-fun)
-     (if (or (null alist) (null keys))
-         alist
-       (apply #',name
-              (cdr (,assoc-fun (car keys) alist))
-              (cdr keys)))))
-
-(guix-define-alist-accessor guix-assq-value assq)
-(guix-define-alist-accessor guix-assoc-value assoc)
-
-(defun guix-alist-put (value alist &rest keys)
-  "Put (add or replace if exists) VALUE to ALIST using KEYS.
-Return the new alist.
-
-ALIST is alist of alists of alists ... which can be consecutively
-accessed with KEYS.
-
-Example:
-
-  (guix-alist-put
-   'foo
-   '((one (a . 1) (b . 2))
-     (two (m . 7) (n . 8)))
-   'one 'b)
-
-  => ((one (a . 1) (b . foo))
-      (two (m . 7) (n . 8)))"
-  (or keys (error "Keys should be specified"))
-  (guix-alist-put-1 value alist keys))
-
-(defun guix-alist-put-1 (value alist keys)
-  "Subroutine of `guix-alist-put'."
-  (cond
-   ((null keys)
-    value)
-   ((null alist)
-    (list (cons (car keys)
-                (guix-alist-put-1 value nil (cdr keys)))))
-   ((eq (car keys) (caar alist))
-    (cons (cons (car keys)
-                (guix-alist-put-1 value (cdar alist) (cdr keys)))
-          (cdr alist)))
-   (t
-    (cons (car alist)
-          (guix-alist-put-1 value (cdr alist) keys)))))
-
-(defun guix-alist-put! (value variable &rest keys)
-  "Modify alist VARIABLE (symbol) by putting VALUE using KEYS.
-See `guix-alist-put' for details."
-  (set variable
-       (apply #'guix-alist-put value (symbol-value variable) keys)))
-
-
-;;; Diff
-
-(defvar guix-diff-switches "-u"
-  "A string or list of strings specifying switches to be passed to diff.")
-
-(defun guix-diff (old new &optional switches no-async)
-  "Same as `diff', but use `guix-diff-switches' as default."
-  (diff old new (or switches guix-diff-switches) no-async))
-
-
-;;; Completing readers definers
-
-(defmacro guix-define-reader (name read-fun completions prompt)
-  "Define NAME function to read from minibuffer.
-READ-FUN may be `completing-read', `completing-read-multiple' or
-another function with the same arguments."
-  `(defun ,name (&optional prompt initial-contents)
-     (,read-fun ,(if prompt
-                     `(or prompt ,prompt)
-                   'prompt)
-                ,completions nil nil initial-contents)))
-
-(defmacro guix-define-readers (&rest args)
-  "Define reader functions.
-
-ARGS should have a form [KEYWORD VALUE] ...  The following
-keywords are available:
-
-  - `completions-var' - variable used to get completions.
-
-  - `completions-getter' - function used to get completions.
-
-  - `single-reader', `single-prompt' - name of a function to read
-    a single value, and a prompt for it.
-
-  - `multiple-reader', `multiple-prompt' - name of a function to
-    read multiple values, and a prompt for it.
-
-  - `multiple-separator' - if specified, another
-    `<multiple-reader-name>-string' function returning a string
-    of multiple values separated the specified separator will be
-    defined."
-  (guix-keyword-args-let args
-      ((completions-var    :completions-var)
-       (completions-getter :completions-getter)
-       (single-reader      :single-reader)
-       (single-prompt      :single-prompt)
-       (multiple-reader    :multiple-reader)
-       (multiple-prompt    :multiple-prompt)
-       (multiple-separator :multiple-separator))
-    (let ((completions
-           (cond ((and completions-var completions-getter)
-                  `(or ,completions-var
-                       (setq ,completions-var
-                             (funcall ',completions-getter))))
-                 (completions-var
-                  completions-var)
-                 (completions-getter
-                  `(funcall ',completions-getter)))))
-      `(progn
-         ,(when (and completions-var
-                     (not (boundp completions-var)))
-            `(defvar ,completions-var nil))
-
-         ,(when single-reader
-            `(guix-define-reader ,single-reader guix-completing-read
-                                 ,completions ,single-prompt))
-
-         ,(when multiple-reader
-            `(guix-define-reader ,multiple-reader completing-read-multiple
-                                 ,completions ,multiple-prompt))
-
-         ,(when (and multiple-reader multiple-separator)
-            (let ((name (intern (concat (symbol-name multiple-reader)
-                                        "-string"))))
-              `(defun ,name (&optional prompt initial-contents)
-                 (guix-concat-strings
-                  (,multiple-reader prompt initial-contents)
-                  ,multiple-separator))))))))
-
-
-;;; Memoizing
-
-(defun guix-memoize (function)
-  "Return a memoized version of FUNCTION."
-  (let ((cache (make-hash-table :test 'equal)))
-    (lambda (&rest args)
-      (let ((result (gethash args cache 'not-found)))
-        (if (eq result 'not-found)
-            (let ((result (apply function args)))
-              (puthash args result cache)
-              result)
-          result)))))
-
-(defmacro guix-memoized-defun (name arglist docstring &rest body)
-  "Define a memoized function NAME.
-See `defun' for the meaning of arguments."
-  (declare (doc-string 3) (indent 2))
-  `(defalias ',name
-     (guix-memoize (lambda ,arglist ,@body))
-     ;; Add '(name args ...)' string with real arglist to the docstring,
-     ;; because *Help* will display '(name &rest ARGS)' for a defined
-     ;; function (since `guix-memoize' returns a lambda with '(&rest
-     ;; args)').
-     ,(format "(%S %s)\n\n%s"
-              name
-              (mapconcat #'symbol-name arglist " ")
-              docstring)))
-
-(defmacro guix-memoized-defalias (symbol definition &optional docstring)
-  "Set SYMBOL's function definition to memoized version of DEFINITION."
-  (declare (doc-string 3) (indent 1))
-  `(defalias ',symbol
-     (guix-memoize #',definition)
-     ,(or docstring
-          (format "Memoized version of `%S'." definition))))
-
-
-(defvar guix-utils-font-lock-keywords
-  (eval-when-compile
-    `((,(rx "(" (group (or "guix-define-reader"
-                           "guix-define-readers"
-                           "guix-keyword-args-let"
-                           "guix-while-null"
-                           "guix-while-search"
-                           "guix-with-indent"))
-            symbol-end)
-       . 1)
-      (,(rx "("
-            (group "guix-memoized-" (or "defun" "defalias"))
-            symbol-end
-            (zero-or-more blank)
-            (zero-or-one
-             (group (one-or-more (or (syntax word) (syntax symbol))))))
-       (1 font-lock-keyword-face)
-       (2 font-lock-function-name-face nil t)))))
-
-(font-lock-add-keywords 'emacs-lisp-mode guix-utils-font-lock-keywords)
-
-(provide 'guix-utils)
-
-;;; guix-utils.el ends here
diff --git a/emacs/local.mk b/emacs/local.mk
deleted file mode 100644
index 959ec2dd34..0000000000
--- a/emacs/local.mk
+++ /dev/null
@@ -1,77 +0,0 @@
-# GNU Guix --- Functional package management for GNU
-# Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
-# Copyright © 2016 Mathieu Lirzin <mthl@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/>.
-
-AUTOLOADS = %D%/guix-autoloads.el
-
-ELFILES =					\
-  %D%/guix-about.el				\
-  %D%/guix-backend.el				\
-  %D%/guix-base.el				\
-  %D%/guix-build-log.el				\
-  %D%/guix-buffer.el				\
-  %D%/guix-command.el				\
-  %D%/guix-devel.el				\
-  %D%/guix-emacs.el				\
-  %D%/guix-entry.el				\
-  %D%/guix-external.el				\
-  %D%/guix-geiser.el				\
-  %D%/guix-guile.el				\
-  %D%/guix-help-vars.el				\
-  %D%/guix-history.el				\
-  %D%/guix-hydra.el				\
-  %D%/guix-hydra-build.el			\
-  %D%/guix-hydra-jobset.el			\
-  %D%/guix-info.el				\
-  %D%/guix-init.el				\
-  %D%/guix-license.el				\
-  %D%/guix-list.el				\
-  %D%/guix-location.el				\
-  %D%/guix-messages.el				\
-  %D%/guix-pcomplete.el				\
-  %D%/guix-popup.el				\
-  %D%/guix-prettify.el				\
-  %D%/guix-profiles.el				\
-  %D%/guix-read.el				\
-  %D%/guix-ui.el				\
-  %D%/guix-ui-license.el			\
-  %D%/guix-ui-location.el			\
-  %D%/guix-ui-package.el			\
-  %D%/guix-ui-generation.el			\
-  %D%/guix-ui-system-generation.el		\
-  %D%/guix-utils.el
-
-if HAVE_EMACS
-
-dist_lisp_DATA = $(ELFILES)
-
-nodist_lisp_DATA = 		\
-  %D%/guix-config.el		\
-  $(AUTOLOADS)
-
-$(AUTOLOADS): $(ELFILES)
-	$(AM_V_EMACS)$(EMACS) --batch --eval				\
-	  "(let ((backup-inhibited t)					\
-	         (generated-autoload-file				\
-	          (expand-file-name \"$(AUTOLOADS)\" \"$(builddir)\")))	\
-	     (update-directory-autoloads				\
-	      (expand-file-name \"emacs\" \"$(srcdir)\")))"
-
-CLEANFILES += $(AUTOLOADS)
-
-endif HAVE_EMACS
diff --git a/etc/git/pre-push b/etc/git/pre-push
new file mode 100755
index 0000000000..c894c5a9ec
--- /dev/null
+++ b/etc/git/pre-push
@@ -0,0 +1,57 @@
+#!/bin/sh
+
+# This hook script prevents the user from pushing to Savannah if any of the new
+# commits' OpenPGP signatures cannot be verified.
+
+# Called by "git push" after it has checked the remote status, but before
+# anything has been pushed.  If this script exits with a non-zero status nothing
+# will be pushed.
+#
+# This hook is called with the following parameters:
+#
+# $1 -- Name of the remote to which the push is being done
+# $2 -- URL to which the push is being done
+#
+# If pushing without using a named remote those arguments will be equal.
+#
+# Information about the commits which are being pushed is supplied as lines to
+# the standard input in the form:
+#
+#   <local ref> <local sha1> <remote ref> <remote sha1>
+
+z40=0000000000000000000000000000000000000000
+
+# Only use the hook when pushing to Savannah.
+case "$2" in
+*git.sv.gnu.org*)
+	break
+	;;
+*)
+	exit 0
+	;;
+esac
+
+while read local_ref local_sha remote_ref remote_sha
+do
+	if [ "$local_sha" = $z40 ]
+	then
+		# Handle delete
+		:
+	else
+		if [ "$remote_sha" = $z40 ]
+		then
+			# New branch, examine all commits
+			range="$local_sha"
+		else
+			# Update to existing branch, examine new commits
+			range="$remote_sha..$local_sha"
+		fi
+
+		# Verify the signatures of all commits being pushed.
+		git verify-commit $(git rev-list $range) >/dev/null 2>&1
+
+		exit $?
+	fi
+done
+
+exit 0
diff --git a/etc/indent-package.el.in b/etc/indent-package.el.in
new file mode 100755
index 0000000000..3188809f0b
--- /dev/null
+++ b/etc/indent-package.el.in
@@ -0,0 +1,53 @@
+#!@EMACS@ --script
+;;; indent-package.el --- Run Emacs to indent a package definition.
+
+;; Copyright © 2017 Alex Kost <alezost@gmail.com>
+
+;; This file is part of GNU Guix.
+
+;; GNU Guix is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Guix is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This scripts indents the given package definition in the specified file
+;; using Emacs.
+
+;;; Code:
+
+;; Load Scheme indentation rules from the current directory.
+(with-temp-buffer
+  (scheme-mode)
+  (let ((default-directory (file-name-as-directory "."))
+        (enable-local-variables :all))
+    (hack-dir-local-variables)
+    (hack-local-variables-apply)))
+
+(pcase command-line-args-left
+  (`(,file-name ,package-name)
+   (find-file file-name)
+   (goto-char (point-min))
+   (if (re-search-forward (concat "^(define\\(-public\\) +"
+                                  package-name)
+                          nil t)
+       (let ((indent-tabs-mode nil))
+         (beginning-of-defun)
+         (indent-sexp)
+         (save-buffer)
+         (message "Done!"))
+     (error "Package '%s' not found in '%s'"
+            package-name file-name)))
+  (x
+   (error "Usage: indent-package.el FILE PACKAGE")))
+
+;;; indent-package.el ends here
diff --git a/gnu/build/file-systems.scm b/gnu/build/file-systems.scm
index 431b287d0c..6e5c6aaf15 100644
--- a/gnu/build/file-systems.scm
+++ b/gnu/build/file-systems.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2016, 2017 David Craven <david@craven.ch>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -71,67 +72,114 @@
   "Bind-mount SOURCE at TARGET."
   (mount source target "" MS_BIND))
 
+(define (read-superblock device offset size magic?)
+  "Read a superblock of SIZE from OFFSET and DEVICE.  Return the raw
+superblock on success, and #f if no valid superblock was found.  MAGIC?
+takes a bytevector and returns #t when it's a valid superblock."
+  (call-with-input-file device
+    (lambda (port)
+      (seek port offset SEEK_SET)
+
+      (let ((block (make-bytevector size)))
+        (match (get-bytevector-n! port block 0 (bytevector-length block))
+          ((? eof-object?)
+           #f)
+          ((? number? len)
+           (and (= len (bytevector-length block))
+                (and (magic? block)
+                     block))))))))
+
+(define (sub-bytevector bv start size)
+  "Return a copy of the SIZE bytes of BV starting from offset START."
+  (let ((result (make-bytevector size)))
+    (bytevector-copy! bv start result 0 size)
+    result))
+
+(define (null-terminated-latin1->string bv)
+  "Return the volume name of SBLOCK as a string of at most 256 characters, or
+#f if SBLOCK has no volume name."
+    ;; This is a Latin-1, nul-terminated string.
+    (let ((bytes (take-while (negate zero?) (bytevector->u8-list bv))))
+      (if (null? bytes)
+          #f
+          (list->string (map integer->char bytes)))))
+
 
 ;;;
 ;;; Ext2 file systems.
 ;;;
 
+;; <http://www.nongnu.org/ext2-doc/ext2.html#DEF-SUPERBLOCK>.
+;; TODO: Use "packed structs" from Guile-OpenGL or similar.
+
 (define-syntax %ext2-endianness
   ;; Endianness of ext2 file systems.
   (identifier-syntax (endianness little)))
 
-;; Offset in bytes of interesting parts of an ext2 superblock.  See
-;; <http://www.nongnu.org/ext2-doc/ext2.html#DEF-SUPERBLOCK>.
-;; TODO: Use "packed structs" from Guile-OpenGL or similar.
-(define-syntax %ext2-sblock-magic       (identifier-syntax 56))
-(define-syntax %ext2-sblock-creator-os  (identifier-syntax 72))
-(define-syntax %ext2-sblock-uuid        (identifier-syntax 104))
-(define-syntax %ext2-sblock-volume-name (identifier-syntax 120))
+(define (ext2-superblock? sblock)
+  "Return #t when SBLOCK is an ext2 superblock."
+  (let ((magic (bytevector-u16-ref sblock 56 %ext2-endianness)))
+    (= magic #xef53)))
 
 (define (read-ext2-superblock device)
   "Return the raw contents of DEVICE's ext2 superblock as a bytevector, or #f
 if DEVICE does not contain an ext2 file system."
-  (define %ext2-magic
-    ;; The magic bytes that identify an ext2 file system.
-    #xef53)
-
-  (define superblock-size
-    ;; Size of the interesting part of an ext2 superblock.
-    264)
-
-  (define block
-    ;; The superblock contents.
-    (make-bytevector superblock-size))
-
-  (call-with-input-file device
-    (lambda (port)
-      (seek port 1024 SEEK_SET)
-
-      ;; Note: work around <http://bugs.gnu.org/17466>.
-      (and (eqv? superblock-size (get-bytevector-n! port block 0
-                                                    superblock-size))
-           (let ((magic (bytevector-u16-ref block %ext2-sblock-magic
-                                            %ext2-endianness)))
-             (and (= magic %ext2-magic)
-                  block))))))
+  (read-superblock device 1024 264 ext2-superblock?))
 
 (define (ext2-superblock-uuid sblock)
   "Return the UUID of ext2 superblock SBLOCK as a 16-byte bytevector."
-  (let ((uuid (make-bytevector 16)))
-    (bytevector-copy! sblock %ext2-sblock-uuid uuid 0 16)
-    uuid))
+  (sub-bytevector sblock 104 16))
 
 (define (ext2-superblock-volume-name sblock)
   "Return the volume name of SBLOCK as a string of at most 16 characters, or
 #f if SBLOCK has no volume name."
-  (let ((bv (make-bytevector 16)))
-    (bytevector-copy! sblock %ext2-sblock-volume-name bv 0 16)
+  (null-terminated-latin1->string (sub-bytevector sblock 120 16)))
 
-    ;; This is a Latin-1, nul-terminated string.
-    (let ((bytes (take-while (negate zero?) (bytevector->u8-list bv))))
-      (if (null? bytes)
-          #f
-          (list->string (map integer->char bytes))))))
+(define (check-ext2-file-system device)
+  "Return the health of an ext2 file system on DEVICE."
+  (match (status:exit-val
+          (system* "e2fsck" "-v" "-p" "-C" "0" device))
+    (0 'pass)
+    (1 'errors-corrected)
+    (2 'reboot-required)
+    (_ 'fatal-error)))
+
+
+;;;
+;;; Btrfs file systems.
+;;;
+
+;; <https://btrfs.wiki.kernel.org/index.php/On-disk_Format#Superblock>.
+
+(define-syntax %btrfs-endianness
+  ;; Endianness of btrfs file systems.
+  (identifier-syntax (endianness little)))
+
+(define (btrfs-superblock? sblock)
+  "Return #t when SBLOCK is a btrfs superblock."
+  (bytevector=? (sub-bytevector sblock 64 8)
+                (string->utf8 "_BHRfS_M")))
+
+(define (read-btrfs-superblock device)
+  "Return the raw contents of DEVICE's btrfs superblock as a bytevector, or #f
+if DEVICE does not contain a btrfs file system."
+  (read-superblock device 65536 4096 btrfs-superblock?))
+
+(define (btrfs-superblock-uuid sblock)
+  "Return the UUID of a btrfs superblock SBLOCK as a 16-byte bytevector."
+  (sub-bytevector sblock 32 16))
+
+(define (btrfs-superblock-volume-name sblock)
+  "Return the volume name of SBLOCK as a string of at most 256 characters, or
+#f if SBLOCK has no volume name."
+  (null-terminated-latin1->string (sub-bytevector sblock 299 256)))
+
+(define (check-btrfs-file-system device)
+  "Return the health of a btrfs file system on DEVICE."
+  (match (status:exit-val
+          (system* "btrfs" "device" "scan"))
+    (0 'pass)
+    (_ 'fatal-error)))
 
 
 ;;;
@@ -146,37 +194,22 @@ if DEVICE does not contain an ext2 file system."
   ;; Endianness of LUKS headers.
   (identifier-syntax (endianness big)))
 
-(define-syntax %luks-header-size
-  ;; Size in bytes of the LUKS header, including key slots.
-  (identifier-syntax 592))
-
-(define %luks-magic
-  ;; The 'LUKS_MAGIC' constant.
-  (u8-list->bytevector (append (map char->integer (string->list "LUKS"))
-                               (list #xba #xbe))))
-
-(define (sub-bytevector bv start size)
-  "Return a copy of the SIZE bytes of BV starting from offset START."
-  (let ((result (make-bytevector size)))
-    (bytevector-copy! bv start result 0 size)
-    result))
+(define (luks-superblock? sblock)
+  "Return #t when SBLOCK is a luks superblock."
+  (define %luks-magic
+    ;; The 'LUKS_MAGIC' constant.
+    (u8-list->bytevector (append (map char->integer (string->list "LUKS"))
+                                 (list #xba #xbe))))
+  (let ((magic   (sub-bytevector sblock 0 6))
+        (version (bytevector-u16-ref sblock 6 %luks-endianness)))
+    (and (bytevector=? magic %luks-magic)
+         (= version 1))))
 
 (define (read-luks-header file)
   "Read a LUKS header from FILE.  Return the raw header on success, and #f if
 not valid header was found."
-  (call-with-input-file file
-    (lambda (port)
-      (let ((header (make-bytevector %luks-header-size)))
-        (match (get-bytevector-n! port header 0 (bytevector-length header))
-          ((? eof-object?)
-           #f)
-          ((? number? len)
-           (and (= len (bytevector-length header))
-                (let ((magic   (sub-bytevector header 0 6)) ;XXX: inefficient
-                      (version (bytevector-u16-ref header 6 %luks-endianness)))
-                  (and (bytevector=? magic %luks-magic)
-                       (= version 1)
-                       header)))))))))
+  ;; Size in bytes of the LUKS header, including key slots.
+  (read-superblock file 0 592 luks-superblock?))
 
 (define (luks-header-uuid header)
   "Return the LUKS UUID from HEADER, as a 16-byte bytevector."
@@ -242,56 +275,77 @@ warning and #f as the result."
                 (else
                  (apply throw args))))))))
 
-(define (partition-predicate read field =)
+(define (partition-field-reader read field)
+  "Return a procedure that takes a device and returns the value of a FIELD in
+the partition superblock or #f."
+  (let ((read (ENOENT-safe read)))
+    (lambda (device)
+      (let ((sblock (read device)))
+        (and sblock
+             (field sblock))))))
+
+(define (read-partition-field device partition-field-readers)
+  "Returns the value of a FIELD in the partition superblock of DEVICE or #f. It
+takes a list of PARTITION-FIELD-READERS and returns the result of the first
+partition field reader that returned a value."
+  (match (filter-map (cut apply <> (list device)) partition-field-readers)
+    ((field . _) field)
+    (_ #f)))
+
+(define %partition-label-readers
+  (list (partition-field-reader read-ext2-superblock
+                                ext2-superblock-volume-name)
+        (partition-field-reader read-btrfs-superblock
+                                btrfs-superblock-volume-name)))
+
+(define %partition-uuid-readers
+  (list (partition-field-reader read-ext2-superblock
+                                ext2-superblock-uuid)
+        (partition-field-reader read-btrfs-superblock
+                                btrfs-superblock-uuid)))
+
+(define read-partition-label
+  (cut read-partition-field <> %partition-label-readers))
+
+(define read-partition-uuid
+  (cut read-partition-field <> %partition-uuid-readers))
+
+(define (partition-predicate reader =)
   "Return a predicate that returns true if the FIELD of partition header that
 was READ is = to the given value."
-  (let ((read (ENOENT-safe read)))
-    (lambda (expected)
-      "Return a procedure that, when applied to a partition name such as \"sda1\",
-returns #t if that partition's volume name is LABEL."
-      (lambda (part)
-        (let* ((device (string-append "/dev/" part))
-               (sblock (read device)))
-          (and sblock
-               (let ((actual (field sblock)))
-                 (and actual
-                      (= actual expected)))))))))
+  (lambda (expected)
+    (lambda (device)
+      (let ((actual (reader device)))
+        (and actual
+             (= actual expected))))))
 
 (define partition-label-predicate
-  (partition-predicate read-ext2-superblock
-                       ext2-superblock-volume-name
-                       string=?))
+  (partition-predicate read-partition-label string=?))
 
 (define partition-uuid-predicate
-  (partition-predicate read-ext2-superblock
-                       ext2-superblock-uuid
-                       bytevector=?))
+  (partition-predicate read-partition-uuid bytevector=?))
 
-(define partition-luks-uuid-predicate
-  (partition-predicate read-luks-header
-                       luks-header-uuid
-                       bytevector=?))
+(define luks-partition-uuid-predicate
+  (partition-predicate
+   (partition-field-reader read-luks-header luks-header-uuid)
+   bytevector=?))
 
-(define (find-partition-by-label label)
-  "Return the first partition found whose volume name is LABEL, or #f if none
+(define (find-partition predicate)
+  "Return the first partition found that matches PREDICATE, or #f if none
 were found."
-  (and=> (find (partition-label-predicate label)
-               (disk-partitions))
-         (cut string-append "/dev/" <>)))
-
-(define (find-partition-by-uuid uuid)
-  "Return the first partition whose unique identifier is UUID (a bytevector),
-or #f if none was found."
-  (and=> (find (partition-uuid-predicate uuid)
-               (disk-partitions))
-         (cut string-append "/dev/" <>)))
-
-(define (find-partition-by-luks-uuid uuid)
-  "Return the first LUKS partition whose unique identifier is UUID (a bytevector),
-or #f if none was found."
-  (and=> (find (partition-luks-uuid-predicate uuid)
-               (disk-partitions))
-         (cut string-append "/dev/" <>)))
+  (lambda (expected)
+    (find (predicate expected)
+          (map (cut string-append "/dev/" <>)
+               (disk-partitions)))))
+
+(define find-partition-by-label
+  (find-partition partition-label-predicate))
+
+(define find-partition-by-uuid
+  (find-partition partition-uuid-predicate))
+
+(define find-partition-by-luks-uuid
+  (find-partition luks-partition-uuid-predicate))
 
 
 ;;;
@@ -412,26 +466,34 @@ the following:
 
 (define (check-file-system device type)
   "Run a file system check of TYPE on DEVICE."
-  (define fsck
-    (string-append "fsck." type))
-
-  (let ((status (system* fsck "-v" "-p" "-C" "0" device)))
-    (match (status:exit-val status)
-      (0
-       #t)
-      (1
-       (format (current-error-port) "'~a' corrected errors on ~a; continuing~%"
-               fsck device))
-      (2
-       (format (current-error-port) "'~a' corrected errors on ~a; rebooting~%"
-               fsck device)
-       (sleep 3)
-       (reboot))
-      (code
-       (format (current-error-port) "'~a' exited with code ~a on ~a; \
-spawning Bourne-like REPL~%"
-               fsck code device)
-       (start-repl %bournish-language)))))
+  (define check-procedure
+    (cond
+     ((string-prefix? "ext" type) check-ext2-file-system)
+     ((string-prefix? "btrfs" type) check-btrfs-file-system)
+     (else #f)))
+
+  (if check-procedure
+      (match (check-procedure device)
+        ('pass
+         #t)
+        ('errors-corrected
+         (format (current-error-port)
+                 "File system check corrected errors on ~a; continuing~%"
+                 device))
+        ('reboot-required
+         (format (current-error-port)
+                 "File system check corrected errors on ~a; rebooting~%"
+                 device)
+         (sleep 3)
+         (reboot))
+        ('fatal-error
+         (format (current-error-port)
+                 "File system check on ~a failed; spawning Bourne-like REPL~%"
+                 device)
+         (start-repl %bournish-language)))
+      (format (current-error-port)
+              "No file system check procedure for ~a; skipping~%"
+              device)))
 
 (define (mount-flags->bit-mask flags)
   "Return the number suitable for the 'flags' argument of 'mount' that
diff --git a/gnu/local.mk b/gnu/local.mk
index 89d1e83b4b..2f852b5da0 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -7,7 +7,7 @@
 # Copyright © 2016 Kei Kebreau <kei@openmailbox.org>
 # Copyright © 2016 Rene Saavedra <rennes@openmailbox.org>
 # Copyright © 2016 Adonay "adfeno" Felipe Nogueira <https://libreplanet.org/wiki/User:Adfeno> <adfeno@openmailbox.org>
-# Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
+# Copyright © 2016, 2017 Ricardo Wurmus <rekado@elephly.net>
 # Copyright © 2016 Ben Woodcroft <donttrustben@gmail.com>
 #
 # This file is part of GNU Guix.
@@ -183,6 +183,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/packages/hurd.scm				\
   %D%/packages/ibus.scm				\
   %D%/packages/icu4c.scm			\
+  %D%/packages/idris.scm			\
   %D%/packages/idutils.scm			\
   %D%/packages/image.scm			\
   %D%/packages/image-viewers.scm	\
@@ -271,6 +272,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/packages/networking.scm			\
   %D%/packages/nfs.scm                          \
   %D%/packages/nickle.scm                       \
+  %D%/packages/nim.scm  			\
   %D%/packages/ninja.scm			\
   %D%/packages/node.scm				\
   %D%/packages/noweb.scm			\
@@ -321,6 +323,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/packages/rsync.scm			\
   %D%/packages/ruby.scm				\
   %D%/packages/rush.scm				\
+  %D%/packages/rust.scm				\
   %D%/packages/samba.scm			\
   %D%/packages/sawfish.scm			\
   %D%/packages/scanner.scm			\
@@ -412,6 +415,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/services/lirc.scm				\
   %D%/services/mail.scm				\
   %D%/services/mcron.scm			\
+  %D%/services/messaging.scm			\
   %D%/services/networking.scm			\
   %D%/services/nfs.scm			\
   %D%/services/shepherd.scm			\
@@ -450,6 +454,7 @@ GNU_SYSTEM_MODULES =				\
 						\
   %D%/tests.scm					\
   %D%/tests/base.scm				\
+  %D%/tests/nfs.scm				\
   %D%/tests/install.scm				\
   %D%/tests/mail.scm				\
   %D%/tests/ssh.scm
@@ -495,6 +500,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/calibre-drop-unrar.patch			\
   %D%/packages/patches/calibre-no-updates-dialog.patch		\
   %D%/packages/patches/cdparanoia-fpic.patch			\
+  %D%/packages/patches/chicken-CVE-2016-6830+CVE-2016-6831.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		\
@@ -505,6 +511,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/cpio-CVE-2016-2037.patch			\
   %D%/packages/patches/cpufrequtils-fix-aclocal.patch		\
   %D%/packages/patches/cracklib-CVE-2016-6318.patch		\
+  %D%/packages/patches/cracklib-fix-buffer-overflow.patch	\
   %D%/packages/patches/crda-optional-gcrypt.patch		\
   %D%/packages/patches/crossmap-allow-system-pysam.patch	\
   %D%/packages/patches/csound-header-ordering.patch		\
@@ -586,6 +593,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/gmp-faulty-test.patch			\
   %D%/packages/patches/gnome-tweak-tool-search-paths.patch	\
   %D%/packages/patches/gnucash-price-quotes-perl.patch		\
+  %D%/packages/patches/gnupg-test-segfault-on-32bit-arch.patch	\
   %D%/packages/patches/gobject-introspection-absolute-shlib-path.patch \
   %D%/packages/patches/gobject-introspection-cc.patch		\
   %D%/packages/patches/gobject-introspection-girepository.patch	\
@@ -633,10 +641,11 @@ dist_patch_DATA =						\
   %D%/packages/patches/icu4c-CVE-2015-4760.patch		\
   %D%/packages/patches/id3lib-CVE-2007-4460.patch			\
   %D%/packages/patches/ilmbase-fix-tests.patch			\
-  %D%/packages/patches/inkscape-drop-wait-for-targets.patch	\
   %D%/packages/patches/isl-0.11.1-aarch64-support.patch	\
   %D%/packages/patches/jbig2dec-ignore-testtest.patch		\
   %D%/packages/patches/jq-CVE-2015-8863.patch			\
+  %D%/packages/patches/kdbusaddons-kinit-file-name.patch	\
+  %D%/packages/patches/khal-disable-failing-tests.patch		\
   %D%/packages/patches/khmer-use-libraries.patch                \
   %D%/packages/patches/kmod-module-directory.patch		\
   %D%/packages/patches/kobodeluxe-paths.patch			\
@@ -671,12 +680,29 @@ dist_patch_DATA =						\
   %D%/packages/patches/libmad-armv7-thumb-pt2.patch		\
   %D%/packages/patches/libmad-frame-length.patch		\
   %D%/packages/patches/libmad-mips-newgcc.patch			\
+  %D%/packages/patches/libpng-CVE-2016-10087.patch		\
   %D%/packages/patches/libssh-0.6.5-CVE-2016-0739.patch		\
   %D%/packages/patches/libtar-CVE-2013-4420.patch \
   %D%/packages/patches/libtheora-config-guess.patch		\
+  %D%/packages/patches/libtiff-CVE-2016-10092.patch		\
+  %D%/packages/patches/libtiff-CVE-2016-10093.patch		\
+  %D%/packages/patches/libtiff-CVE-2016-10094.patch		\
+  %D%/packages/patches/libtiff-assertion-failure.patch		\
+  %D%/packages/patches/libtiff-divide-by-zero-ojpeg.patch	\
+  %D%/packages/patches/libtiff-divide-by-zero-tiffcp.patch	\
+  %D%/packages/patches/libtiff-divide-by-zero-tiffcrop.patch	\
+  %D%/packages/patches/libtiff-divide-by-zero.patch		\
+  %D%/packages/patches/libtiff-heap-overflow-pixarlog-luv.patch	\
+  %D%/packages/patches/libtiff-heap-overflow-tif-dirread.patch	\
+  %D%/packages/patches/libtiff-heap-overflow-tiffcp.patch	\
+  %D%/packages/patches/libtiff-heap-overflow-tiffcrop.patch	\
+  %D%/packages/patches/libtiff-invalid-read.patch		\
+  %D%/packages/patches/libtiff-null-dereference.patch		\
+  %D%/packages/patches/libtiff-tiffcp-underflow.patch		\
   %D%/packages/patches/libtool-skip-tests2.patch		\
   %D%/packages/patches/libunwind-CVE-2015-3239.patch		\
   %D%/packages/patches/libupnp-CVE-2016-6255.patch		\
+  %D%/packages/patches/libupnp-CVE-2016-8863.patch		\
   %D%/packages/patches/libvpx-CVE-2016-2818.patch		\
   %D%/packages/patches/libwebp-CVE-2016-9085.patch		\
   %D%/packages/patches/libwmf-CAN-2004-0941.patch		\
@@ -691,6 +717,8 @@ dist_patch_DATA =						\
   %D%/packages/patches/libwmf-CVE-2015-0848+CVE-2015-4588.patch	\
   %D%/packages/patches/libwmf-CVE-2015-4695.patch		\
   %D%/packages/patches/libwmf-CVE-2015-4696.patch		\
+  %D%/packages/patches/libxml2-CVE-2016-4658.patch		\
+  %D%/packages/patches/libxml2-CVE-2016-5131.patch		\
   %D%/packages/patches/libxslt-generated-ids.patch		\
   %D%/packages/patches/libxslt-CVE-2016-4738.patch		\
   %D%/packages/patches/linux-pam-no-setfsuid.patch		\
@@ -722,6 +750,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/mpc123-initialize-ao.patch		\
   %D%/packages/patches/mplayer2-theora-fix.patch		\
   %D%/packages/patches/module-init-tools-moduledir.patch	\
+  %D%/packages/patches/multiqc-fix-git-subprocess-error.patch	\
   %D%/packages/patches/mumps-build-parallelism.patch		\
   %D%/packages/patches/mupdf-build-with-openjpeg-2.1.patch	\
   %D%/packages/patches/mupen64plus-ui-console-notice.patch	\
@@ -740,7 +769,10 @@ dist_patch_DATA =						\
   %D%/packages/patches/nvi-assume-preserve-path.patch		\
   %D%/packages/patches/nvi-dbpagesize-binpower.patch		\
   %D%/packages/patches/nvi-db4.patch				\
+  %D%/packages/patches/ocaml-bisect-fix-camlp4-in-another-directory.patch	\
+  %D%/packages/patches/ocaml-bitstring-fix-configure.patch \
   %D%/packages/patches/ocaml-CVE-2015-8869.patch		\
+  %D%/packages/patches/ocaml-Add-a-.file-directive.patch	\
   %D%/packages/patches/ocaml-findlib-make-install.patch	\
   %D%/packages/patches/ola-readdir-r.patch			\
   %D%/packages/patches/openexr-missing-samples.patch		\
@@ -749,7 +781,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/openjpeg-CVE-2016-9850-CVE-2016-9851.patch		\
   %D%/packages/patches/openjpeg-use-after-free-fix.patch	\
   %D%/packages/patches/openocd-nrf52.patch			\
-  %D%/packages/patches/openssh-memory-exhaustion.patch		\
   %D%/packages/patches/openssl-runpath.patch			\
   %D%/packages/patches/openssl-1.1.0-c-rehash-in.patch		\
   %D%/packages/patches/openssl-c-rehash-in.patch		\
@@ -806,7 +837,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/python-3-search-paths.patch		\
   %D%/packages/patches/python-3.4-fix-tests.patch		\
   %D%/packages/patches/python-3.5-fix-tests.patch		\
-  %D%/packages/patches/python-dendropy-exclude-failing-tests.patch \
   %D%/packages/patches/python-file-double-encoding-bug.patch	\
   %D%/packages/patches/python-fix-tests.patch			\
   %D%/packages/patches/python-parse-too-many-fields.patch	\
@@ -816,10 +846,9 @@ dist_patch_DATA =						\
   %D%/packages/patches/python-paste-remove-website-test.patch	\
   %D%/packages/patches/python-paste-remove-timing-test.patch	\
   %D%/packages/patches/python-pyopenssl-skip-network-test.patch	\
+  %D%/packages/patches/python-pycrypto-CVE-2013-7459.patch	\
   %D%/packages/patches/python2-pygobject-2-gi-info-type-error-domain.patch \
-  %D%/packages/patches/qemu-CVE-2016-8576.patch			\
-  %D%/packages/patches/qemu-CVE-2016-8577.patch			\
-  %D%/packages/patches/qemu-CVE-2016-8578.patch			\
+  %D%/packages/patches/python-pygpgme-fix-pinentry-tests.patch	\
   %D%/packages/patches/qt4-ldflags.patch			\
   %D%/packages/patches/quickswitch-fix-dmenu-check.patch	\
   %D%/packages/patches/rapicorn-isnan.patch			\
@@ -834,7 +863,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/ruby-puma-ignore-broken-test.patch       \
   %D%/packages/patches/ruby-rack-ignore-failing-test.patch      \
   %D%/packages/patches/ruby-tzinfo-data-ignore-broken-test.patch\
-  %D%/packages/patches/ruby-yard-fix-skip-of-markdown-tests.patch \
   %D%/packages/patches/sed-hurd-path-max.patch			\
   %D%/packages/patches/scheme48-tests.patch			\
   %D%/packages/patches/scotch-test-threading.patch		\
@@ -847,7 +875,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/slim-sigusr1.patch			\
   %D%/packages/patches/slim-reset.patch				\
   %D%/packages/patches/slim-login.patch				\
-  %D%/packages/patches/slock-CVE-2016-6866.patch		\
   %D%/packages/patches/slurm-configure-remove-nonfree-contribs.patch \
   %D%/packages/patches/soprano-find-clucene.patch		\
   %D%/packages/patches/steghide-fixes.patch			\
@@ -875,6 +902,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/tophat-build-with-later-seqan.patch	\
   %D%/packages/patches/totem-debug-format-fix.patch		\
   %D%/packages/patches/tuxpaint-stamps-path.patch		\
+  %D%/packages/patches/unrtf-CVE-2016-10091.patch		\
   %D%/packages/patches/unzip-CVE-2014-8139.patch		\
   %D%/packages/patches/unzip-CVE-2014-8140.patch		\
   %D%/packages/patches/unzip-CVE-2014-8141.patch		\
diff --git a/gnu/packages/abiword.scm b/gnu/packages/abiword.scm
index 8e89bb2f52..514ac0ceb5 100644
--- a/gnu/packages/abiword.scm
+++ b/gnu/packages/abiword.scm
@@ -22,6 +22,7 @@
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix build-system gnu)
+  #:use-module (guix build-system glib-or-gtk)
   #:use-module (gnu packages)
   #:use-module (gnu packages autotools)
   #:use-module (gnu packages boost)
@@ -52,11 +53,17 @@
                          "/source/" name "-" version ".tar.gz"))
         (sha256
           (base32 "1ik591rx15nn3n1297cwykl8wvrlgj78i528id9wbidgy3xzd570"))
+        (modules '((guix build utils)))
+        (snippet
+         ;; Ensure reproducibility.
+         '(substitute* "src/wp/main/xp/abi_ver.cpp"
+            (("__DATE__") "\"2017\"")
+            (("__TIME__") "\"00:00\"")))
         (patches
          (search-patches "abiword-wmf-version-lookup-fix.patch"
                          "abiword-explictly-cast-bools.patch"))))
 
-    (build-system gnu-build-system)
+    (build-system glib-or-gtk-build-system)
     (arguments                   ;; NOTE: rsvg is disabled, since Abiword
       `(#:configure-flags        ;; supports it directly, and its BS is broken.
         (list
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index 6e913d2cd0..687cfad970 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -9,7 +9,7 @@
 ;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2016 Pjotr Prins <pjotr.guix@thebird.nl>
 ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
-;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016, 2017 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Peter Feigl <peter.feigl@nexoid.at>
 ;;; Copyright © 2016 John J. Foerch <jjfoerch@earthlink.net>
 ;;; Coypright © 2016 ng0 <ng0@we.make.ritual.n0.is>
@@ -362,7 +362,7 @@ login, passwd, su, groupadd, and useradd.")
        #:tests? #f))                              ; no tests
     (inputs `(("shadow" ,shadow)))
 
-    (home-page "http://sourceforge.net/projects/mingetty")
+    (home-page "https://sourceforge.net/projects/mingetty")
     (synopsis "Getty for the text console")
     (description
      "Small console getty that is started on the Linux text console,
@@ -471,7 +471,7 @@ connection alive.")
          (bind-minor-version "9")
          (bind-patch-version "9")
          (bind-release-type "-P")         ; for patch release, use "-P"
-         (bind-release-version "4")      ; for patch release, e.g. "4"
+         (bind-release-version "5")      ; for patch release, e.g. "4"
          (bind-version (string-append bind-major-version
                                       "."
                                       bind-minor-version
@@ -587,7 +587,7 @@ connection alive.")
                                         "/bind-" bind-version ".tar.gz"))
                     (sha256
                      (base32
-                      "1qpi23lrs6jfxqx8dakbqfyg3hvrzq5ldchg6my19xcvx8515mgx"))))
+                      "1yn15chkfqf4d7961ip2x10jm27a9wqymz2xqh0a2g89arrirkaw"))))
 
                 ;; When cross-compiling, we need the cross Coreutils and sed.
                 ;; Otherwise just use those from %FINAL-INPUTS.
@@ -717,7 +717,7 @@ by bandwidth they use.")
              `("PERL5LIB" ":" prefix (,x11-inc ,tk-inc)))))
         %standard-phases)))
     ;; The clusterssh.sourceforge.net address requires login to view
-    (home-page "http://sourceforge.net/projects/clusterssh/")
+    (home-page "https://sourceforge.net/projects/clusterssh/")
     (synopsis "Secure concurrent multi-server terminal control")
     (description
      "ClusterSSH controls a number of xterm windows via a single graphical
@@ -790,7 +790,7 @@ system administrator.")
 (define-public sudo
   (package
     (name "sudo")
-    (version "1.8.17p1")
+    (version "1.8.19p1")
     (source (origin
               (method url-fetch)
               (uri
@@ -800,7 +800,7 @@ system administrator.")
                                     version ".tar.gz")))
               (sha256
                (base32
-                "1k2mn65l1kmsxm8wh0gjxy496xhbpiimbpm6yv6kw6snzc3xg466"))))
+                "14pwdwl03kdbbyjkvxrfx409x3c1fjqz8aqz2wgwddinhz7v3bxq"))))
     (build-system gnu-build-system)
     (arguments
      `(#:configure-flags
@@ -1568,14 +1568,14 @@ done with the @code{auditctl} utility.")
 (define-public nmap
   (package
     (name "nmap")
-    (version "7.31")
+    (version "7.40")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://nmap.org/dist/nmap-" version
                                   ".tar.bz2"))
               (sha256
                (base32
-                "0hiqb28950kn4bjsmw0ksfyss7j2qdmgrj3xsjf7073pq01lx7yb"))
+                "121i9mgyc28ra2825akd0ix5qyssv4xc2qlx296mam6hzxgnc54y"))
               (modules '((guix build utils)))
               (snippet
                '(map delete-file-recursively
diff --git a/gnu/packages/algebra.scm b/gnu/packages/algebra.scm
index 8e3327eafe..b859da0e7e 100644
--- a/gnu/packages/algebra.scm
+++ b/gnu/packages/algebra.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2012, 2013, 2014, 2015, 2016 Andreas Enge <andreas@enge.fr>
-;;; Copyright © 2013, 2015 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2015, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2016 Nicolas Goaziou <mail@nicolasgoaziou.fr>
 ;;; Copyright © 2014 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
@@ -577,22 +577,6 @@ cosine/ sine transforms or DCT/DST).")
      (string-append (package-description fftw)
                     "  Single-precision version."))))
 
-;; FIXME: These packages are used temporarily by packages like Ardour until
-;; "--enable-flags" is added to the fftw and fftwf packages.
-(define-public fftw-with-threads
-  (package (inherit fftw)
-    (arguments
-     (substitute-keyword-arguments (package-arguments fftw)
-       ((#:configure-flags flags)
-        `(cons "--enable-threads" ,flags))))))
-
-(define-public fftwf-with-threads
-  (package (inherit fftwf)
-    (arguments
-     (substitute-keyword-arguments (package-arguments fftwf)
-       ((#:configure-flags flags)
-        `(cons "--enable-threads" ,flags))))))
-
 (define-public fftw-openmpi
   (package (inherit fftw)
     (name "fftw-openmpi")
diff --git a/gnu/packages/aspell.scm b/gnu/packages/aspell.scm
index f39205714c..188e91d1e1 100644
--- a/gnu/packages/aspell.scm
+++ b/gnu/packages/aspell.scm
@@ -4,6 +4,7 @@
 ;;; Copyright © 2016 John Darrington <jmd@gnu.org>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Christopher Andersson <christopher@8bits.nu>
+;;; Copyright © 2016 Theodoros Foradis <theodoros.for@openmailbox.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -65,7 +66,8 @@ dictionaries, including personal ones.")
 ;;;
 ;;; Dictionaries.
 ;;;
-;;; Use 'export ASPELL_CONF="dict-dir $HOME/.guix-profile/lib/aspell"' to use them.
+;;; Use 'export ASPELL_CONF="dict-dir $HOME/.guix-profile/lib/aspell"' to use
+;;; them.
 ;;;
 
 (define* (aspell-dictionary dict-name full-name
@@ -81,16 +83,17 @@ dictionaries, including personal ones.")
               (sha256 sha256)))
     (build-system gnu-build-system)
     (arguments
-     `(#:phases (alist-replace
-                 'configure
-                 (lambda* (#:key outputs #:allow-other-keys)
-                   (let ((out (assoc-ref outputs "out")))
-                     (zero? (system* "./configure"))))
-                 %standard-phases)
-                #:make-flags (let ((out (assoc-ref %outputs "out")))
-                               (list (string-append "dictdir=" out "/lib/aspell")
-                                     (string-append "datadir=" out "/lib/aspell")))
-                #:tests? #f))
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'configure
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (zero? (system* "./configure"))))))
+       #:make-flags
+       (let ((out (assoc-ref %outputs "out")))
+         (list (string-append "dictdir=" out "/lib/aspell")
+               (string-append "datadir=" out "/lib/aspell")))
+       #:tests? #f))
     (native-inputs `(("aspell" ,aspell)
                      ("which" ,which)))
     (synopsis (string-append full-name " dictionary for GNU Aspell")) ; XXX: i18n
@@ -172,3 +175,18 @@ dictionaries, including personal ones.")
                      #:sha256
                      (base32
                       "02jwkjhr32kvyibnyzgx3smbnm576jwdzg3avdf6zxwckhy5fw4v")))
+
+(define-public aspell-dict-el
+  (aspell-dictionary "el" "Greek"
+                     #:version "0.08-0"
+                     #:prefix "aspell6-"
+                     #:sha256
+                     (base32
+                      "1ljcc30zg2v2h3w5h5jr5im41mw8jbsgvvhdd2cii2yzi8d0zxja")))
+
+(define-public aspell-dict-grc
+  (aspell-dictionary "grc" "Ancient Greek"
+                     #:version "0.02-0"
+                     #:sha256
+                     (base32
+                      "1zxr8958v37v260fkqd4pg37ns5h5kyqm54hn1hg70wq5cz8h512")))
diff --git a/gnu/packages/audio.scm b/gnu/packages/audio.scm
index 641d44cea7..5e22c1f221 100644
--- a/gnu/packages/audio.scm
+++ b/gnu/packages/audio.scm
@@ -5,7 +5,7 @@
 ;;; Copyright © 2015 Alex Kost <alezost@gmail.com>
 ;;; Copyright © 2015, 2016 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
-;;; Copyright © 2016 Alex Griffin <a@ajgrf.com>
+;;; Copyright © 2016, 2017 Alex Griffin <a@ajgrf.com>
 ;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is>
 ;;; Copyright © 2016 Lukas Gradl <lgradl@openmailbox.org>
 ;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr>
@@ -223,6 +223,7 @@ namespace ARDOUR { const char* revision = \"" version "\" ; }")))))
        ("boost" ,boost)
        ("atkmm" ,atkmm)
        ("cairomm" ,cairomm)
+       ("eudev" ,eudev)
        ("gtkmm" ,gtkmm-2)
        ("glibmm" ,glibmm)
        ("libart-lgpl" ,libart-lgpl)
@@ -238,8 +239,8 @@ namespace ARDOUR { const char* revision = \"" version "\" ; }")))))
        ("lv2" ,lv2)
        ("vamp" ,vamp)
        ("curl" ,curl)
-       ("fftw" ,fftw-with-threads)
-       ("fftwf" ,fftwf-with-threads)
+       ("fftw" ,fftw)
+       ("fftwf" ,fftwf)
        ("jack" ,jack-1)
        ("serd" ,serd)
        ("sord" ,sord)
@@ -1448,7 +1449,7 @@ connections between them.")
     (build-system gnu-build-system)
     (native-inputs `(("pkg-config" ,pkg-config)))
     (inputs `(("libsndfile" ,libsndfile)))
-    (home-page "http://sourceforge.net/projects/bs2b/")
+    (home-page "https://sourceforge.net/projects/bs2b/")
     (synopsis "Bauer stereophonic-to-binaural DSP")
     (description
      "The Bauer stereophonic-to-binaural DSP (bs2b) library and plugins is
@@ -2279,7 +2280,7 @@ can play and record audio files.")
         (base32 "1hmadwqfpg15vhwq9pa1sl5xslibrjpk6hpq2s9hfmx1s5l6ihfw"))))
     (build-system cmake-build-system)
     (arguments '(#:tests? #f))          ;no 'check' target
-    (home-page "http://sourceforge.net/p/soxr/wiki/Home/")
+    (home-page "https://sourceforge.net/p/soxr/wiki/Home/")
     (synopsis "One-dimensional sample-rate conversion library")
     (description
      "The SoX Resampler library (libsoxr) performs one-dimensional sample-rate
@@ -2699,7 +2700,7 @@ with support for HD extensions.")
 (define-public bs1770gain
   (package
     (name "bs1770gain")
-    (version "0.4.11")
+    (version "0.4.12")
     (source
      (origin
        (method url-fetch)
@@ -2707,7 +2708,7 @@ with support for HD extensions.")
                            version "/bs1770gain-" version ".tar.gz"))
        (sha256
         (base32
-         "0j765drdb7h3y5ipjv9sg1a0if6zh8cksbv3rdk5ppd7kxcrjnlb"))))
+         "0n9skdap1vnl6w52fx0gsrjlk7w3xgdwi62ycyf96h29rx059z6a"))))
     (build-system gnu-build-system)
     (inputs `(("ffmpeg" ,ffmpeg)
               ("sox" ,sox)))
diff --git a/gnu/packages/backup.scm b/gnu/packages/backup.scm
index 6f88dae789..8cfe470ec6 100644
--- a/gnu/packages/backup.scm
+++ b/gnu/packages/backup.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2014, 2015 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2014 Ian Denhardt <ian@zenhack.net>
 ;;; Copyright © 2015, 2016 Leo Famulari <leo@famulari.name>
+;;; Copyright © 2017 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -404,13 +405,13 @@ detection, and lossless compression.")
 (define-public borg
   (package
     (name "borg")
-    (version "1.0.8")
+    (version "1.0.9")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "borgbackup" version))
               (sha256
                (base32
-                "1fdfi0yzzdrrlml6780n4fh61sqm7pw6fcd1y67kfkvw8hy5c0k9"))
+                "1ciwp9yilcibk0x82y5nn8ps95jrm8rxvff8mjrlp7a2w100i1im"))
               (modules '((guix build utils)))
               (snippet
                '(for-each
@@ -439,25 +440,26 @@ detection, and lossless compression.")
            (lambda* (#:key inputs outputs #:allow-other-keys)
              ;; Make the installed package available for the test suite.
              (add-installed-pythonpath inputs outputs)
-             (zero?
-               (system* "py.test" "-v" "--pyargs" "borg.testsuite" "-k"
-                        (string-append
-                          ;; These tests need to write to '/var'.
-                          "not test_get_cache_dir "
-                          "and not test_get_keys_dir "
-                          ;; These tests assume there is a root user in
-                          ;; '/etc/passwd'.
-                          "and not test_access_acl "
-                          "and not test_default_acl "
-                          "and not test_non_ascii_acl "
-                          ;; This test needs the unpackaged pytest-benchmark.
-                          "and not benchmark "
-                          ;; These tests assume the kernel supports FUSE. They
-                          ;; were skipped using the "old" Python build system,
-                          ;; before commit
-                          ;; 7db40bce58e149ecb541d295e01cfbfe953d39a3.
-                          "and not test_fuse "
-                          "and not test_fuse_allow_damaged_files")))))
+             ;; The tests should be run in an empty directory.
+             (mkdir-p "tests")
+             (with-directory-excursion "tests"
+               (zero?
+                 (system* "py.test" "-v" "--pyargs" "borg.testsuite" "-k"
+                          (string-append
+                            ;; These tests need to write to '/var'.
+                            "not test_get_cache_dir "
+                            "and not test_get_keys_dir "
+                            "and not test_get_security_dir "
+                            ;; These tests assume there is a root user in
+                            ;; '/etc/passwd'.
+                            "and not test_access_acl "
+                            "and not test_default_acl "
+                            "and not test_non_ascii_acl "
+                            ;; This test needs the unpackaged pytest-benchmark.
+                            "and not benchmark "
+                            ;; These tests assume the kernel supports FUSE.
+                            "and not test_fuse "
+                            "and not test_fuse_allow_damaged_files"))))))
          (add-after 'install 'install-doc
            (lambda* (#:key outputs #:allow-other-keys)
              (let* ((out (assoc-ref outputs "out"))
@@ -543,3 +545,37 @@ changes are stored.")
     (home-page "https://attic-backup.org/")
     (license license:bsd-3)
     (properties `((superseded . ,borg)))))
+
+(define-public wimlib
+  (package
+    (name "wimlib")
+    (version "1.10.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://wimlib.net/downloads/"
+                                  name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "0mbz03smlc054i2m9q2sbqymml9m897kfs84q7g81i26y811p6wq"))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (inputs
+     `(("fuse" ,fuse)
+       ("libxml2" ,libxml2)
+       ("ntfs-3g" ,ntfs-3g)
+       ("openssl" ,openssl)))
+    (arguments
+     `(#:configure-flags (list "--enable-test-support")))
+    (home-page "https://wimlib.net/")
+    (synopsis "WIM file manipulation library and utilities")
+    (description "wimlib is a C library and set of command-line utilities for
+creating, modifying, extracting, and mounting archives in the Windows Imaging
+Format (@dfn{WIM files}).  It can capture and apply WIMs directly from and to
+NTFS volumes using @code{ntfs-3g}, preserving NTFS-specific attributes.")
+    ;; wimlib is dual-licenced under version 3 or later of either the GPL or
+    ;; LGPL, except those files explicitly marked as being released into the
+    ;; public domain (CC0) in their headers.
+    (license (list license:gpl3+
+                   license:lgpl3+
+                   license:cc0))))
diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm
index c2430f656f..c75e038289 100644
--- a/gnu/packages/base.scm
+++ b/gnu/packages/base.scm
@@ -679,14 +679,14 @@ with the Linux kernel.")
   ;; The Hurd's libc variant.
   (package (inherit glibc/linux)
     (name "glibc-hurd")
-    (version "2.19")
+    (version "2.23")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://alpha.gnu.org/gnu/hurd/glibc-"
-                                  version "-hurd+libpthread-20160518" ".tar.gz"))
+                                  version "-hurd+libpthread-20161218" ".tar.gz"))
               (sha256
                (base32
-                "12zmdjviybpsdb2kq4cg98rds7909f0cc96fzdahdfrzlxx1q0px"))))
+                "0vpdv05j6j3ria5bw8gp468i64gij94cslxkxj9xkfgi6p615b8p"))))
 
     ;; Libc provides <hurd.h>, which includes a bunch of Hurd and Mach headers,
     ;; so both should be propagated.
@@ -722,6 +722,9 @@ with the Linux kernel.")
                        ;; We need this to get a working openpty() function.
                        "--enable-pt_chown"
 
+                       ;; <https://lists.gnu.org/archive/html/bug-hurd/2016-10/msg00033.html>
+                       "--disable-werror"
+
                        ;; nscd fails to build for GNU/Hurd:
                        ;; <https://lists.gnu.org/archive/html/bug-hurd/2014-07/msg00006.html>.
                        ;; Disable it.
diff --git a/gnu/packages/bioinformatics.scm b/gnu/packages/bioinformatics.scm
index 50b0bfaa03..c930099179 100644
--- a/gnu/packages/bioinformatics.scm
+++ b/gnu/packages/bioinformatics.scm
@@ -1,11 +1,12 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014, 2015, 2016 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2014, 2015, 2016, 2017 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2015, 2016 Ben Woodcroft <donttrustben@gmail.com>
 ;;; Copyright © 2015, 2016 Pjotr Prins <pjotr.guix@thebird.nl>
 ;;; Copyright © 2015 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2016 Roel Janssen <roel@gnu.org>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Marius Bakke <mbakke@fastmail.com>
+;;; Copyright © 2016 Raoul Bonnal <ilpuccio.febo@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1098,7 +1099,7 @@ confidence to have in an alignment.")
        ("pigz" ,pigz)
        ("zlib" ,zlib)))
     (supported-systems '("x86_64-linux"))
-    (home-page "http://sourceforge.net/p/bless-ec/wiki/Home/")
+    (home-page "https://sourceforge.net/p/bless-ec/wiki/Home/")
     (synopsis "Bloom-filter-based error correction tool for NGS reads")
     (description
      "@dfn{Bloom-filter-based error correction solution for high-throughput
@@ -1479,15 +1480,15 @@ high-throughput sequencing data – with an emphasis on simplicity.")
 (define-public cd-hit
   (package
     (name "cd-hit")
-    (version "4.6.5")
+    (version "4.6.6")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/weizhongli/cdhit"
                                   "/releases/download/V" version
-                                  "/cd-hit-v" version "-2016-0304.tar.gz"))
+                                  "/cd-hit-v" version "-2016-0711.tar.gz"))
               (sha256
                (base32
-                "15db0hq38yyifwqx9b6l34z14jcq576dmjavhj8a426c18lvnhp3"))))
+                "1w8hd4fszgg29nqiz569fldwy012la77nljcmlhglgicws56z54p"))))
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f ; there are no tests
@@ -1806,7 +1807,7 @@ preparation protocols.")
 (define-public cutadapt
   (package
     (name "cutadapt")
-    (version "1.8")
+    (version "1.12")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1815,27 +1816,30 @@ preparation protocols.")
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "161bp87y6gd6r5bmvjpn2b1k942i3fizfpa139f0jn6jv1wcp5h5"))))
+                "19smhh6444ikn4jlmyhvffw4m5aw7yg07rqsk7arg8dkwyga1i4v"))))
     (build-system python-build-system)
     (arguments
-     ;; tests must be run after install
-     `(#:phases (alist-cons-after
-                 'install 'check
-                 (lambda* (#:key inputs outputs #:allow-other-keys)
-                   (setenv "PYTHONPATH"
-                           (string-append
-                            (getenv "PYTHONPATH")
-                            ":" (assoc-ref outputs "out")
-                            "/lib/python"
-                            (string-take (string-take-right
-                                          (assoc-ref inputs "python") 5) 3)
-                            "/site-packages"))
-                   (zero? (system* "nosetests" "-P" "tests")))
-                 (alist-delete 'check %standard-phases))))
+     `(#:phases
+       (modify-phases %standard-phases
+         ;; The tests must be run after installation.
+         (delete 'check)
+         (add-after 'install 'check
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (setenv "PYTHONPATH"
+                     (string-append
+                      (getenv "PYTHONPATH")
+                      ":" (assoc-ref outputs "out")
+                      "/lib/python"
+                      (string-take (string-take-right
+                                    (assoc-ref inputs "python") 5) 3)
+                      "/site-packages"))
+             (zero? (system* "nosetests" "-P" "tests")))))))
+    (inputs
+     `(("python-xopen" ,python-xopen)))
     (native-inputs
      `(("python-cython" ,python-cython)
        ("python-nose" ,python-nose)))
-    (home-page "https://code.google.com/p/cutadapt/")
+    (home-page "https://cutadapt.readthedocs.io/en/stable/")
     (synopsis "Remove adapter sequences from nucleotide sequencing reads")
     (description
      "Cutadapt finds and removes adapter sequences, primers, poly-A tails and
@@ -1929,19 +1933,14 @@ accessing bigWig files.")
 (define-public python-dendropy
   (package
     (name "python-dendropy")
-    (version "4.1.0")
+    (version "4.2.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"))))
+         "15c7s3d5gf19ljsxvq5advaa752wfi7pwrdjyhzmg85hccyvp47p"))))
     (build-system python-build-system)
     (home-page "http://packages.python.org/DendroPy/")
     (synopsis "Library for phylogenetics and phylogenetic computing")
@@ -1956,15 +1955,6 @@ trees (phylogenies) and characters.")
   (let ((base (package-with-python2 (strip-python2-variant python-dendropy))))
     (package
       (inherit base)
-      ;; Do not use same source as 'python-dendropy' because the patched
-      ;; failing tests do not occur on Python 2.
-      (source
-       (origin
-         (method url-fetch)
-         (uri (pypi-uri "DendroPy" (package-version base)))
-         (sha256
-          (base32
-           "1jfz7gp18wph311w1yygbvjanb3n5mdqal439bb6myw41dwb5m63"))))
       (arguments
        `(#:python ,python-2
          #:phases
@@ -2020,7 +2010,7 @@ identify enrichments with functional annotations of the genome.")
 (define-public diamond
   (package
     (name "diamond")
-    (version "0.8.29")
+    (version "0.8.31")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2029,7 +2019,7 @@ identify enrichments with functional annotations of the genome.")
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "1mnhj7y13pk2bhfichjma5aw8ssdiqyria61ip1kps6facqlal3z"))))
+                "0nh79f4rpgq8vmlga743r7vd0z0ik6spy34f7vfq0v9lcmvfr7xq"))))
     (build-system cmake-build-system)
     (arguments
      '(#:tests? #f ; no "check" target
@@ -4252,7 +4242,7 @@ viewer.")
        `(("perl" ,perl)
          ("zlib" ,zlib)))
       (supported-systems '("x86_64-linux"))
-      (home-page "https://code.google.com/p/mosaik-aligner/")
+      (home-page "https://github.com/wanpinglee/MOSAIK")
       (synopsis "Map nucleotide sequence reads to reference genomes")
       (description
        "MOSAIK is a program for mapping second and third-generation sequencing
@@ -4913,7 +4903,7 @@ application of SortMeRNA is filtering rRNA from metatranscriptomic data.")
 (define-public star
   (package
     (name "star")
-    (version "2.5.2a")
+    (version "2.5.2b")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/alexdobin/STAR/archive/"
@@ -4921,7 +4911,7 @@ application of SortMeRNA is filtering rRNA from metatranscriptomic data.")
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "0xjlsm4p9flln111hv4xx7xy94c2nl53zvdvbk9winmiradjsdra"))
+                "1na6np880r1zaamiy00hy8bid5anpy0kgf63587v2yl080krk2zq"))
               (modules '((guix build utils)))
               (snippet
                '(begin
@@ -4930,6 +4920,7 @@ application of SortMeRNA is filtering rRNA from metatranscriptomic data.")
                   ;; Remove pre-built binaries and bundled htslib sources.
                   (delete-file-recursively "bin/MacOSX_x86_64")
                   (delete-file-recursively "bin/Linux_x86_64")
+                  (delete-file-recursively "bin/Linux_x86_64_static")
                   (delete-file-recursively "source/htslib")
                   #t))))
     (build-system gnu-build-system)
@@ -5211,20 +5202,21 @@ data types as well.")
 (define-public r-annotate
   (package
     (name "r-annotate")
-    (version "1.52.0")
+    (version "1.52.1")
     (source
      (origin
        (method url-fetch)
        (uri (bioconductor-uri "annotate" version))
        (sha256
         (base32
-         "1fd2csq7dcs2gwndgwdx2nwkymz8gsmlnqqzv3p0vjjsvvq5n2a8"))))
+         "0yymz8qxgnbybvfhqrgkd1hh9dhwxdii1yxkhr1zicjgb35xixxb"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-annotationdbi" ,r-annotationdbi)
        ("r-biobase" ,r-biobase)
        ("r-biocgenerics" ,r-biocgenerics)
        ("r-dbi" ,r-dbi)
+       ("r-rcurl" ,r-rcurl)
        ("r-xml" ,r-xml)
        ("r-xtable" ,r-xtable)))
     (home-page
@@ -5288,14 +5280,14 @@ high-throughput sequencing experiments.")
 (define-public r-deseq2
   (package
     (name "r-deseq2")
-    (version "1.14.0")
+    (version "1.14.1")
     (source
      (origin
        (method url-fetch)
        (uri (bioconductor-uri "DESeq2" version))
        (sha256
         (base32
-         "0kq06jy4xg5ii3a9l62f17kirsfx0gsiwq6mhiy985cqzpdn893g"))))
+         "1walwkqryn1gnwz7zryr5764a0p6ia7ag4w6w9n8fskg8dkg0fqs"))))
     (properties `((upstream-name . "DESeq2")))
     (build-system r-build-system)
     (arguments
@@ -5805,14 +5797,14 @@ generate FASTA, JSON, YAML, RDF, JSON-LD, HTML, CSV, tabular output etc.")
 (define-public bioruby
   (package
     (name "bioruby")
-    (version "1.5.0")
+    (version "1.5.1")
     (source
      (origin
        (method url-fetch)
        (uri (rubygems-uri "bio" version))
        (sha256
         (base32
-         "01k2fyjl5fpx4zn8g6gqiqvsg2j1fgixrs9p03vzxckynxdq3wmc"))))
+         "0hdl0789c9n4mprnx5pgd46bfwl8d000rqpamj5h6kkjgspijv49"))))
     (build-system ruby-build-system)
     (propagated-inputs
      `(("ruby-libxml" ,ruby-libxml)))
@@ -5941,13 +5933,13 @@ also known as views, in a controlled vocabulary.")
 (define-public r-biocstyle
   (package
    (name "r-biocstyle")
-   (version "2.2.0")
+   (version "2.2.1")
     (source (origin
               (method url-fetch)
               (uri (bioconductor-uri "BiocStyle" version))
               (sha256
                (base32
-                "0qbk23fz8cn260isd9xlh9lxfj4adar6iqzai01c4kz0p31f45za"))))
+                "0sl99xw940ixrm6v24lgaw3ljh56g59a6rdz7g160hx84z9f8n2n"))))
     (properties
      `((upstream-name . "BiocStyle")))
     (build-system r-build-system)
@@ -6076,13 +6068,13 @@ abnormal copy number.")
 (define-public r-s4vectors
   (package
     (name "r-s4vectors")
-    (version "0.12.0")
+    (version "0.12.1")
     (source (origin
               (method url-fetch)
               (uri (bioconductor-uri "S4Vectors" version))
               (sha256
                (base32
-                "0m0npc0vhmcwcxws7v2f8k4hvvrjvnlrsr94klxf4a8m4xw2xzzk"))))
+                "0i36y3w36h3d8rmazxcrip4gvn54rd9av1wz4lygsprrjmylfhcc"))))
     (properties
      `((upstream-name . "S4Vectors")))
     (build-system r-build-system)
@@ -6128,13 +6120,13 @@ utilities for sequence data management under the ACNUC system.")
 (define-public r-iranges
   (package
     (name "r-iranges")
-    (version "2.8.0")
+    (version "2.8.1")
     (source (origin
               (method url-fetch)
               (uri (bioconductor-uri "IRanges" version))
               (sha256
                (base32
-                "0cdl1sfd3cvf93lnz91fdk64fbg1mnd5g958dwh1il8r358hqq3f"))))
+                "0cryqnpqb3p6l9jjw27hyqd550sxlljls3ka7b9rb38hkji7b5hw"))))
     (properties
      `((upstream-name . "IRanges")))
     (build-system r-build-system)
@@ -6157,13 +6149,13 @@ possible.")
 (define-public r-genomeinfodb
   (package
     (name "r-genomeinfodb")
-    (version "1.10.0")
+    (version "1.10.2")
     (source (origin
               (method url-fetch)
               (uri (bioconductor-uri "GenomeInfoDb" version))
               (sha256
                (base32
-                "0nhg4bk38gzvf3mvnbqgisbbhfv1kzjld27z1z9knnlkplkiyyyv"))))
+                "0zh894qd1sgpjbn0wfvq6hs2dzn7y1pyicvzk2aa48y3zbidanv7"))))
     (properties
      `((upstream-name . "GenomeInfoDb")))
     (build-system r-build-system)
@@ -6183,13 +6175,13 @@ names in their natural, rather than lexicographic, order.")
 (define-public r-edger
   (package
     (name "r-edger")
-    (version "3.16.1")
+    (version "3.16.5")
     (source (origin
               (method url-fetch)
               (uri (bioconductor-uri "edgeR" version))
               (sha256
                (base32
-                "1r6hhwkqp13m022hjajzr1lnjsbai0yjhykwn0kp1f0la990a808"))))
+                "04vpa0a6dkkjyvvfbkmfjyaxf2ldkagi66g028qpaszd8jsk8yiv"))))
     (properties `((upstream-name . "edgeR")))
     (build-system r-build-system)
     (propagated-inputs
@@ -6209,13 +6201,13 @@ CAGE.")
 (define-public r-variantannotation
   (package
     (name "r-variantannotation")
-    (version "1.20.0")
+    (version "1.20.2")
     (source (origin
               (method url-fetch)
               (uri (bioconductor-uri "VariantAnnotation" version))
               (sha256
                (base32
-                "1lwzfgahz8ipwli73kcfqb18y6adi129hap1gnycnj3980m54i8q"))))
+                "165wda1d2jagd907pnra4m3sla66icyqxvd60xpv09jl5agd5mn9"))))
     (properties
      `((upstream-name . "VariantAnnotation")))
     (inputs
@@ -6247,13 +6239,13 @@ coding changes and predict coding outcomes.")
 (define-public r-limma
   (package
     (name "r-limma")
-    (version "3.30.2")
+    (version "3.30.7")
     (source (origin
               (method url-fetch)
               (uri (bioconductor-uri "limma" version))
               (sha256
                (base32
-                "04jris7wk2lxksrrvrjsysznsdb2k04lfgrnp18ic49sazva0hfy"))))
+                "1xg9w4lmn9n4hwyflxiwi6g969lcy569cg4z1x47crwwg7z7qdka"))))
     (build-system r-build-system)
     (home-page "http://bioinf.wehi.edu.au/limma")
     (synopsis "Package for linear models for microarray and RNA-seq data")
@@ -6302,13 +6294,13 @@ different technologies, including microarrays, RNA-seq, and quantitative PCR.")
 (define-public r-genomicranges
   (package
     (name "r-genomicranges")
-    (version "1.26.1")
+    (version "1.26.2")
     (source (origin
               (method url-fetch)
               (uri (bioconductor-uri "GenomicRanges" version))
               (sha256
                (base32
-                "039nxccg9i2an8q2wni79x8dr9p1fcfcqvih9hg9w243pczg2g3c"))))
+                "0if5dswkp77lyqppd0z2iyvnwag9h1gsr03707s8npcx13mzpsia"))))
     (properties
      `((upstream-name . "GenomicRanges")))
     (build-system r-build-system)
@@ -6434,13 +6426,13 @@ objects.")
 (define-public r-biostrings
   (package
     (name "r-biostrings")
-    (version "2.42.0")
+    (version "2.42.1")
     (source (origin
               (method url-fetch)
               (uri (bioconductor-uri "Biostrings" version))
               (sha256
                (base32
-                "08z8lkz3axa94wkf144a931ry6vf6cc25avi1ywr84ln2k5czz9f"))))
+                "0vqgd9i6y3wj4zviqwgvwgd4qj6033fg01rmx1cw9bw5i8ans42d"))))
     (properties
      `((upstream-name . "Biostrings")))
     (build-system r-build-system)
@@ -6611,13 +6603,13 @@ as well as query and modify the browser state, such as the current viewport.")
 (define-public r-genomicfeatures
   (package
     (name "r-genomicfeatures")
-    (version "1.26.0")
+    (version "1.26.2")
     (source (origin
               (method url-fetch)
               (uri (bioconductor-uri "GenomicFeatures" version))
               (sha256
                (base32
-                "0z8spi2knwzwi10c38vr7xlvi3ah9faj7m1lka880mmxkl9cai4k"))))
+                "1ybi6r3bax07wlv2qcd34y5qjdvcqcfayfvlrjc39ifrkk65wv4f"))))
     (properties
      `((upstream-name . "GenomicFeatures")))
     (build-system r-build-system)
@@ -7097,6 +7089,41 @@ musculus (Mouse) as provided by UCSC (mm10, December 2011) and stored
 in Biostrings objects.")
     (license license:artistic2.0)))
 
+(define-public r-txdb-mmusculus-ucsc-mm10-knowngene
+  (package
+    (name "r-txdb-mmusculus-ucsc-mm10-knowngene")
+    (version "3.4.0")
+    (source (origin
+              (method url-fetch)
+              ;; We cannot use bioconductor-uri here because this tarball is
+              ;; located under "data/annotation/" instead of "bioc/".
+              (uri (string-append "http://www.bioconductor.org/packages/"
+                                  "release/data/annotation/src/contrib/"
+                                  "TxDb.Mmusculus.UCSC.mm10.knownGene_"
+                                  version ".tar.gz"))
+              (sha256
+               (base32
+                "08gava9wsvpcqz51k2sni3pj03n5155v32d9riqbf305nbirqbkb"))))
+    (properties
+     `((upstream-name . "TxDb.Mmusculus.UCSC.mm10.knownGene")))
+    (build-system r-build-system)
+    ;; As this package provides little more than a very large data file it
+    ;; doesn't make sense to build substitutes.
+    (arguments `(#:substitutable? #f))
+    (propagated-inputs
+     `(("r-bsgenome" ,r-bsgenome)
+       ("r-genomicfeatures" ,r-genomicfeatures)
+       ("r-annotationdbi" ,r-annotationdbi)))
+    (home-page
+     "http://bioconductor.org/packages/TxDb.Mmusculus.UCSC.mm10.knownGene/")
+    (synopsis "Annotation package for TxDb knownGene object(s) for Mouse")
+    (description
+     "This package loads a TxDb object, which is an R interface to
+prefabricated databases contained in this package.  This package provides
+the TxDb object of Mouse data as provided by UCSC (mm10, December 2011)
+based on the knownGene track.")
+    (license license:artistic2.0)))
+
 (define-public r-bsgenome-celegans-ucsc-ce6
   (package
     (name "r-bsgenome-celegans-ucsc-ce6")
@@ -7223,7 +7250,7 @@ throughput genetic sequencing data sets using regression methods.")
 (define-public r-qtl
  (package
   (name "r-qtl")
-  (version "1.39-5")
+  (version "1.40-8")
   (source
    (origin
     (method url-fetch)
@@ -7231,7 +7258,7 @@ throughput genetic sequencing data sets using regression methods.")
                         version ".tar.gz"))
     (sha256
      (base32
-      "1grwgvyv7x0dgay1858bg7qf4wk47gpnq7qkqpcda9cn0h970d6f"))))
+      "05bj1x2ry0i7yqiydlswb3d2h4pxg70z8w1072az1mrv1m54k8sp"))))
   (build-system r-build-system)
   (home-page "http://rqtl.org/")
   (synopsis "R package for analyzing QTL experiments in genetics")
@@ -7347,7 +7374,7 @@ paired-end data.")
 (define-public r-rcas
   (package
     (name "r-rcas")
-    (version "1.0.0")
+    (version "1.1.1")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/BIMSBbioinfo/RCAS/archive/v"
@@ -7355,7 +7382,7 @@ paired-end data.")
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "1h7di822ihgkhmmmlfbfz3c2dkjyjxl307i6mx8w0cwjqbna1kp6"))))
+                "1hd0r66556bxbdd82ksjklq7nfli36l4k6y88ic7kkg9873wa1nw"))))
     (build-system r-build-system)
     (native-inputs
      `(("r-knitr" ,r-knitr)
@@ -7377,6 +7404,7 @@ paired-end data.")
        ("r-topgo" ,r-topgo)
        ("r-dt" ,r-dt)
        ("r-plotly" ,r-plotly)
+       ("r-plotrix" ,r-plotrix)
        ("r-motifrg" ,r-motifrg)
        ("r-genomation" ,r-genomation)
        ("r-genomicfeatures" ,r-genomicfeatures)
@@ -7796,7 +7824,7 @@ may optionally be provided to further inform the peak-calling process.")
      `(("python2-numpy" ,python2-numpy)
        ("python2-scipy" ,python2-scipy)
        ("python2-pysam" ,python2-pysam)))
-    (home-page "https://code.google.com/p/pepr-chip-seq/")
+    (home-page "https://github.com/shawnzhangyx/PePr")
     (synopsis "Peak-calling and prioritization pipeline for ChIP-Seq data")
     (description
      "PePr is a ChIP-Seq peak calling or differential binding analysis tool
@@ -7837,17 +7865,20 @@ replacement for strverscmp.")
 (define-public multiqc
   (package
     (name "multiqc")
-    (version "0.6")
+    (version "0.9")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "multiqc" version))
        (sha256
         (base32
-         "0avw11h63ldpxy5pizc3wl1wa01ha7q10wb240nggsjz3jaqvyiy"))))
+         "12gs1jw2jrxrij529rnl5kaqxfcqn15yzcsggxkfhdx634ml0cny"))
+       (patches (search-patches "multiqc-fix-git-subprocess-error.patch"))))
     (build-system python-build-system)
-    (native-inputs
-     `(("python-nose" ,python-nose)))
+    (arguments
+     ;; Tests are to be introduced in the next version, see
+     ;; https://github.com/ewels/MultiQC/issues/376
+     `(#:tests? #f))
     (propagated-inputs
      `(("python-jinja2" ,python-jinja2)
        ("python-simplejson" ,python-simplejson)
@@ -7862,3 +7893,94 @@ replacement for strverscmp.")
 samples into a single report.  It contains modules for a large number of
 common bioinformatics tools.")
     (license license:gpl3)))
+
+(define-public r-chipseq
+  (package
+    (name "r-chipseq")
+    (version "1.24.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "chipseq" version))
+       (sha256
+        (base32
+         "115ayp82rs99iaswrx45skw1i5iacgwzz5k8rzijbp5qic0554n0"))))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-biocgenerics" ,r-biocgenerics)
+       ("r-genomicranges" ,r-genomicranges)
+       ("r-iranges" ,r-iranges)
+       ("r-s4vectors" ,r-s4vectors)
+       ("r-shortread" ,r-shortread)))
+    (home-page "http://bioconductor.org/packages/chipseq")
+    (synopsis "Package for analyzing ChIPseq data")
+    (description
+     "This package provides tools for processing short read data from ChIPseq
+experiments.")
+    (license license:artistic2.0)))
+
+(define-public r-copyhelper
+  (package
+    (name "r-copyhelper")
+    (version "1.6.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "http://bioconductor.org/packages/release/"
+                           "data/experiment/src/contrib/CopyhelpeR_"
+                           version ".tar.gz"))
+       (sha256
+        (base32
+         "0x7cyynjmxls9as2gg0iyp9x5fpalxmdjq914ss7i84i9zyk5bhq"))))
+    (properties `((upstream-name . "CopyhelpeR")))
+    (build-system r-build-system)
+    (home-page "http://bioconductor.org/packages/CopyhelpeR/")
+    (synopsis "Helper files for CopywriteR")
+    (description
+     "This package contains the helper files that are required to run the
+Bioconductor package CopywriteR.  It contains pre-assembled 1kb bin GC-content
+and mappability files for the reference genomes hg18, hg19, hg38, mm9 and
+mm10.  In addition, it contains a blacklist filter to remove regions that
+display copy number variation.  Files are stored as GRanges objects from the
+GenomicRanges Bioconductor package.")
+    (license license:gpl2)))
+
+(define-public r-copywriter
+  (package
+    (name "r-copywriter")
+    (version "2.6.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "CopywriteR" version))
+       (sha256
+        (base32
+         "1bwwnsyk7cpgwkagsnn5mv6fv233b0rkhjvbadrh70h8m4anawfj"))))
+    (properties `((upstream-name . "CopywriteR")))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-biocparallel" ,r-biocparallel)
+       ("r-chipseq" ,r-chipseq)
+       ("r-copyhelper" ,r-copyhelper)
+       ("r-data-table" ,r-data-table)
+       ("r-dnacopy" ,r-dnacopy)
+       ("r-futile-logger" ,r-futile-logger)
+       ("r-genomeinfodb" ,r-genomeinfodb)
+       ("r-genomicalignments" ,r-genomicalignments)
+       ("r-genomicranges" ,r-genomicranges)
+       ("r-gtools" ,r-gtools)
+       ("r-iranges" ,r-iranges)
+       ("r-matrixstats" ,r-matrixstats)
+       ("r-rsamtools" ,r-rsamtools)
+       ("r-s4vectors" ,r-s4vectors)))
+    (home-page "https://github.com/PeeperLab/CopywriteR")
+    (synopsis "Copy number information from targeted sequencing")
+    (description
+     "CopywriteR extracts DNA copy number information from targeted sequencing
+by utilizing off-target reads.  It allows for extracting uniformly distributed
+copy number information, can be used without reference, and can be applied to
+sequencing data obtained from various techniques including chromatin
+immunoprecipitation and target enrichment on small gene panels.  Thereby,
+CopywriteR constitutes a widely applicable alternative to available copy
+number detection tools.")
+    (license license:gpl2)))
diff --git a/gnu/packages/bittorrent.scm b/gnu/packages/bittorrent.scm
index 76c48353bd..43ec087bf5 100644
--- a/gnu/packages/bittorrent.scm
+++ b/gnu/packages/bittorrent.scm
@@ -2,7 +2,7 @@
 ;;; Copyright © 2014 Taylan Ulrich Bayirli/Kammer <taylanbayirli@gmail.com>
 ;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
-;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016, 2017 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Tomáš Čech <sleep_walker@gnu.org>
 ;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;;
@@ -214,7 +214,7 @@ interface, for the Transmission BitTorrent daemon.")
 (define-public aria2
   (package
     (name "aria2")
-    (version "1.29.0")
+    (version "1.30.0")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/tatsuhiro-t/aria2/"
@@ -222,7 +222,7 @@ interface, for the Transmission BitTorrent daemon.")
                                   name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0bn8j6yhjnsxlxr1cdxw39gphvsrk3qhvvq92rsirxjvwwix0r0s"))))
+                "1xiiqk4yiqr0c4hf05zkma9if13lp3wh37z1r0w60ahxs5k56v5z"))))
     (build-system gnu-build-system)
     (arguments
      `(#:configure-flags (list "--enable-libaria2"
@@ -237,7 +237,8 @@ interface, for the Transmission BitTorrent daemon.")
                 (string-append "// " text)))
              (substitute* "test/LpdMessageReceiverTest.cc"
                (("CPPUNIT_TEST_SUITE_REGISTRATION\\(LpdMessageReceiverTest\\);" text)
-                (string-append "// " text))))))))
+                (string-append "// " text)))
+             #t)))))
     (native-inputs
      `(("cppunit" ,cppunit) ; for the tests
        ("pkg-config" ,pkg-config)))
diff --git a/gnu/packages/boost.scm b/gnu/packages/boost.scm
index ab31fa8c5c..e6abf4d5e3 100644
--- a/gnu/packages/boost.scm
+++ b/gnu/packages/boost.scm
@@ -120,7 +120,7 @@ across a broad spectrum of applications.")
     (build-system gnu-build-system)
     (propagated-inputs
       `(("boost" ,boost))) ; inclusion of header files
-    (home-page "https://code.google.com/p/multidimalgorithm/")
+    (home-page "https://gitlab.com/mdds/mdds")
     (synopsis "Multi-dimensional C++ data structures and indexing algorithms")
     (description "Mdds (multi-dimensional data structure) provides a
 collection of multi-dimensional data structures and indexing algorithms
diff --git a/gnu/packages/bootstrap.scm b/gnu/packages/bootstrap.scm
index f6faba3188..dd922c3ae4 100644
--- a/gnu/packages/bootstrap.scm
+++ b/gnu/packages/bootstrap.scm
@@ -174,6 +174,7 @@ successful, or false to signal an error."
         ((string=? system "arm-eabi") "no-ld.so")
         ((string=? system "xtensa-elf") "no-ld.so")
         ((string=? system "avr") "no-ld.so")
+        ((string=? system "propeller-elf") "no-ld.so")
         ((string=? system "i686-mingw") "no-ld.so")
 
         (else (error "dynamic linker name not known for this system"
@@ -287,7 +288,8 @@ $out/bin/guile --version~%"
 
 (define %bootstrap-base-urls
   ;; This is where the initial binaries come from.
-  '("http://alpha.gnu.org/gnu/guix/bootstrap"
+  '("ftp://alpha.gnu.org/gnu/guix/bootstrap"
+    "http://alpha.gnu.org/gnu/guix/bootstrap"
     "http://www.fdn.fr/~lcourtes/software/guix/packages"))
 
 (define %bootstrap-coreutils&co
diff --git a/gnu/packages/busybox.scm b/gnu/packages/busybox.scm
index ecbdd6f939..988154eed4 100644
--- a/gnu/packages/busybox.scm
+++ b/gnu/packages/busybox.scm
@@ -30,7 +30,7 @@
 (define-public busybox
   (package
     (name "busybox")
-    (version "1.25.0")
+    (version "1.26.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -38,7 +38,7 @@
                     version ".tar.bz2"))
               (sha256
                (base32
-                "1z52mh6prhd6v47qryz4rvng5r1z0am6masrnigq06zfhmlf03ss"))))
+                "0k0g3hk58m99c2sfq97ngnixb2rv2wzyhv3z00lxaw78bqvjglis"))))
     (build-system gnu-build-system)
     (arguments
      `(#:phases
@@ -65,14 +65,6 @@
            (substitute* "testsuite/pidof.tests"
                (("-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\""))
-
            ;; This test cannot possibly pass.
            ;; It is trying to test that "which ls" returns "/bin/ls" when PATH is not set.
            ;; However, this relies on /bin/ls existing.  Which it does not in guix.
diff --git a/gnu/packages/c.scm b/gnu/packages/c.scm
index 4b9791348e..d5b6631506 100644
--- a/gnu/packages/c.scm
+++ b/gnu/packages/c.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2016, 2017 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -24,6 +24,8 @@
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system trivial)
   #:use-module (gnu packages bootstrap)
+  #:use-module (gnu packages bison)
+  #:use-module (gnu packages flex)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages texinfo)
   #:use-module (gnu packages guile))
@@ -128,3 +130,33 @@ standard.")
              (chmod port #o777)))
          #t)))
     (synopsis "Wrapper providing the 'cc' command for TCC")))
+
+(define-public pcc
+  (package
+    (name "pcc")
+    (version "20170109")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://pcc.ludd.ltu.se/ftp/pub/pcc/pcc-"
+                                  version ".tgz"))
+              (sha256
+               (base32
+                "1p34w496095mi0473f815w6wbi57zxil106mg7pj6sg6gzpjcgww"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (zero? (system* "make" "-C" "cc/cpp" "test")))))))
+    (native-inputs
+     `(("bison" ,bison)
+       ("flex" ,flex)))
+    (synopsis "Portable C compiler")
+    (description
+     "PCC is a portable C compiler.  The project goal is to write a C99
+compiler while still keeping it small, simple, fast and understandable.")
+    (home-page "http://pcc.ludd.ltu.se")
+    ;; PCC incorporates code under various BSD licenses; for new code bsd-2 is
+    ;; preferred.  See http://pcc.ludd.ltu.se/licenses/ for more details.
+    (license (list license:bsd-2 license:bsd-3))))
diff --git a/gnu/packages/calendar.scm b/gnu/packages/calendar.scm
index 00e908109b..a2ab5d299f 100644
--- a/gnu/packages/calendar.scm
+++ b/gnu/packages/calendar.scm
@@ -88,6 +88,7 @@ data units.")
     (source (origin
              (method url-fetch)
              (uri (pypi-uri "khal" version))
+             (patches (search-patches "khal-disable-failing-tests.patch"))
              (sha256
               (base32
                "03vy4dp9n43w51mwqjjy08dr5nj7wxqnb085visz3j43vzm42p1f"))))
diff --git a/gnu/packages/cdrom.scm b/gnu/packages/cdrom.scm
index 829156a7c8..44f4eb035a 100644
--- a/gnu/packages/cdrom.scm
+++ b/gnu/packages/cdrom.scm
@@ -28,14 +28,19 @@
   #:use-module ((guix licenses) #:select (lgpl2.1+ gpl2 gpl2+ gpl3+))
   #:use-module (guix build-system cmake)
   #:use-module (guix build-system gnu)
+  #:use-module (guix build-system glib-or-gtk)
+  #:use-module (guix gexp)
   #:use-module (gnu packages)
   #:use-module (gnu packages acl)
+  #:use-module (gnu packages audio)
   #:use-module (gnu packages bison)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages flex)
   #:use-module (gnu packages gettext)
   #:use-module (gnu packages gtk)
+  #:use-module (gnu packages glib)
   #:use-module (gnu packages man)
+  #:use-module (gnu packages mp3)
   #:use-module (gnu packages ncurses)
   #:use-module (gnu packages elf)
   #:use-module (gnu packages pkg-config)
@@ -328,12 +333,14 @@ from an audio CD.")
                    (parano (assoc-ref inputs "cdparanoia"))
                    (which  (assoc-ref inputs "which"))
                    (discid (assoc-ref inputs "cd-discid"))
+                   (flac   (assoc-ref inputs "flac"))
                    (out    (assoc-ref outputs "out")))
                (define (wrap file)
                  (wrap-program file
                                `("PATH" ":" prefix
                                  (,(string-append out "/bin:"
                                                   wget "/bin:"
+                                                  flac "/bin:"
                                                   which "/bin:"
                                                   vorbis "/bin:"
                                                   discid "/bin:"
@@ -349,6 +356,7 @@ from an audio CD.")
               ("cdparanoia" ,cdparanoia)
               ("cd-discid" ,cd-discid)
               ("vorbis-tools" ,vorbis-tools)
+              ("flac" ,flac)
 
               ;; A couple of Python and Perl scripts are included.
               ("python" ,python)
@@ -395,3 +403,96 @@ for bootable CD-ROMs.
 Image data is written to standard output by default and all other
 information is written to standard error.")
     (license gpl2+)))
+
+(define-public asunder
+  (package
+    (name "asunder")
+    (version "2.8")
+    (source (origin
+              (method url-fetch)
+              (uri
+               (string-append "http://www.littlesvr.ca/asunder/releases/asunder-"
+                              version
+                              ".tar.bz2"))
+              (sha256
+               (base32
+                "1nq9kd4rd4k2kibf57gdbm0zw2gxa234vvvdhxkm8g5bhx5h3iyq"))))
+    (build-system glib-or-gtk-build-system)
+    (arguments
+     '(#:out-of-source? #f
+       #:phases (modify-phases %standard-phases
+                  (add-after 'install 'wrap
+                    (lambda* (#:key inputs outputs #:allow-other-keys)
+                      (let ((program (string-append (assoc-ref outputs "out")
+                                                    "/bin/asunder")))
+                        (define (bin-directory input-name)
+                          (string-append (assoc-ref inputs input-name) "/bin"))
+                        (wrap-program program
+                          `("PATH" ":" prefix
+                            ,(map bin-directory (list "cdparanoia"
+                                                      "lame"
+                                                      "vorbis-tools"
+                                                      "flac"
+                                                      "opus-tools"
+                                                      "wavpack"))))))))))
+    (native-inputs `(("intltool" ,intltool)
+                     ("pkg-config" ,pkg-config)))
+    ;; TODO: Add the necessary packages for Musepack encoding.
+    (inputs `(("gtk+-2" ,gtk+-2)
+              ("glib" ,glib)
+              ("libcddb" ,libcddb)
+              ("cdparanoia" ,cdparanoia)
+              ("lame" ,lame)
+              ("vorbis-tools" ,vorbis-tools)
+              ("flac" ,flac)
+              ("opus-tools" ,opus-tools)
+              ("wavpack" ,wavpack)))
+    (home-page "http://www.littlesvr.ca/asunder/")
+    (synopsis "Graphical audio CD ripper and encoder")
+    (description
+     "Asunder is a graphical audio CD ripper and encoder.  It can save audio
+tracks as WAV, MP3, Ogg Vorbis, FLAC, Opus, Wavpack, and Musepack.  It can use
+CDDB to name and tag each track automatically, and it allows for each track to
+be by a different artist.  Asunder can encode to multiple formats in one
+session, and it can create M3U playlists.")
+    (license gpl2)))
+
+(define-public ripit
+  (package
+    (name "ripit")
+    (version "3.9.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://www.suwald.com/ripit/ripit-"
+                                  version ".tar.gz"))
+              (sha256
+               (base32
+                "0ap71x477jy9c4jiqazb3y45hxdxm3jbq24x05g3vjyqzigi4x1b"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f ; No test suite.
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure)
+         (add-after 'unpack 'patch-usr-bin-install
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (substitute* "Makefile"
+               (("/usr/bin/install") (string-append
+                                      (assoc-ref inputs "coreutils")
+                                      "/bin/install"))
+               (("\\$\\(DESTDIR\\)/usr/local") (assoc-ref outputs "out"))
+               (("../../etc") "etc")))))))
+    (native-inputs
+     `(("coreutils" ,coreutils)))
+    (inputs
+     `(("perl" ,perl)))
+    (propagated-inputs
+     `(("cdparanoia" ,cdparanoia)
+       ("flac" ,flac)
+       ("vorbis-tools" ,vorbis-tools)
+       ("wavpack" ,wavpack)
+       ("perl-cddb-get" ,perl-cddb-get)))
+    (home-page "http://www.suwald.com/ripit/about.php")
+    (synopsis "Command-line program to extract audio CDs")
+    (description "RipIT is used to extract audio from CDs.")
+    (license gpl2)))
diff --git a/gnu/packages/check.scm b/gnu/packages/check.scm
index b394571d6f..f0a6ff4d1c 100644
--- a/gnu/packages/check.scm
+++ b/gnu/packages/check.scm
@@ -180,13 +180,13 @@ format.")
 (define-public cppcheck
   (package
     (name "cppcheck")
-    (version "1.76")
+    (version "1.76.1")
     (source (origin
       (method url-fetch)
       (uri (string-append "https://github.com/danmar/cppcheck/archive/"
                           version ".tar.gz"))
       (sha256
-       (base32 "14d0ikcmq1xcqy9f1vq1jbn5ifl0jiy3rycqdcg7v8hil48m59z8"))
+       (base32 "08pcawg36h850n4i794b2158jcv49f8a54dg3dikdkc1cwknwgjz"))
       (file-name (string-append name "-" version ".tar.gz"))))
     (build-system cmake-build-system)
     (home-page "http://cppcheck.sourceforge.net")
diff --git a/gnu/packages/ci.scm b/gnu/packages/ci.scm
index f07e75ad4e..15a94c5ee3 100644
--- a/gnu/packages/ci.scm
+++ b/gnu/packages/ci.scm
@@ -1,7 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
-;;; Copyright © 2016 Mathieu Lirzin <mthl@gnu.org>
+;;; Copyright © 2016, 2017 Mathieu Lirzin <mthl@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -34,6 +34,7 @@
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages tls)
+  #:use-module (gnu packages texinfo)
   #:use-module (gnu packages version-control)
   #:use-module (gnu packages web)
   #:use-module (gnu packages xml)
@@ -185,8 +186,8 @@ their dependencies.")
       (license l:gpl3+))))
 
 (define-public cuirass
-  (let ((commit "7248c0038f3d0bfcf6c469d534efb4a13952c112")
-        (revision "1"))
+  (let ((commit "d0a5801e397335bb44d8033e5deddf02c1cc99c2")
+        (revision "3"))
     (package
       (name "cuirass")
       (version (string-append "0.0.1-" revision "." (string-take commit 7)))
@@ -198,12 +199,18 @@ their dependencies.")
                 (file-name (string-append name "-" version))
                 (sha256
                  (base32
-                  "0hkwh2pcz3wzg1n533ch2w7vwr97yr369q4ki0yqk99wfipjrydw"))))
+                  "0sa94dgp9w6av7i0a570fv9a9yq03jkxdrm5d75h6szsp1kiyw2i"))))
       (build-system gnu-build-system)
       (arguments
        '(#:phases
          (modify-phases %standard-phases
-           (add-after 'unpack 'bootstrap
+           (add-after 'unpack 'disable-repo-tests
+             (λ _
+               ;; Disable tests that use a connection to the Guix daemon.
+               (substitute* "Makefile.am"
+                 (("tests/repo.scm \\\\") "\\"))
+               #t))
+           (add-before 'configure 'bootstrap
              (lambda _ (zero? (system* "sh" "bootstrap"))))
            (add-after 'install 'wrap-program
              (lambda* (#:key inputs outputs #:allow-other-keys)
@@ -211,22 +218,30 @@ their dependencies.")
                (let* ((out    (assoc-ref outputs "out"))
                       (json   (assoc-ref inputs "guile-json"))
                       (sqlite (assoc-ref inputs "guile-sqlite3"))
+                      (git    (assoc-ref inputs "git"))
                       (guix   (assoc-ref inputs "guix"))
                       (mods   (string-append json "/share/guile/site/2.0:"
                                              sqlite "/share/guile/site/2.0:"
                                              guix "/share/guile/site/2.0")))
+                 ;; Make sure 'cuirass' can find the 'git' and 'evaluate'
+                 ;; commands, as well as the relevant Guile modules.
                  (wrap-program (string-append out "/bin/cuirass")
+                   `("PATH" ":" prefix (,(string-append out "/bin")
+                                        ,(string-append git "/bin")))
                    `("GUILE_LOAD_PATH" ":" prefix (,mods))
-                   `("GUILE_LOAD_COMPILED_PATH" ":" prefix (,mods)))))))))
+                   `("GUILE_LOAD_COMPILED_PATH" ":" prefix (,mods)))
+                 #t))))))
       (inputs
        `(("guile" ,guile-2.0)
          ("guile-json" ,guile-json)
          ("guile-sqlite3" ,guile-sqlite3)
-         ("guix" ,guix)))
+         ("guix" ,guix)
+         ("git" ,git)))
       (native-inputs
        `(("autoconf" ,autoconf)
          ("automake" ,automake)
-         ("pkg-config" ,pkg-config)))
+         ("pkg-config" ,pkg-config)
+         ("texinfo" ,texinfo)))
       (synopsis "Continuous integration system")
       (description
        "Cuirass is a continuous integration tool using GNU Guix.  It is
diff --git a/gnu/packages/code.scm b/gnu/packages/code.scm
index baa9861622..f5aa7f4faf 100644
--- a/gnu/packages/code.scm
+++ b/gnu/packages/code.scm
@@ -92,14 +92,14 @@ highlighting your own code that seemed comprehensible when you wrote it.")
 (define-public global                             ; a global variable
   (package
     (name "global")
-    (version "6.5.5")
+    (version "6.5.6")
     (source (origin
              (method url-fetch)
              (uri (string-append "mirror://gnu/global/global-"
                                  version ".tar.gz"))
              (sha256
               (base32
-               "0yyg91qw8399lnxfai4bxkh9yq71qdwp9kvadgzp05cdqni44nxw"))))
+               "018m536k5y6lks1a6gqn3bsp7r8zk017znqj9kva1nm8d7x9lbqj"))))
     (build-system gnu-build-system)
     (inputs `(("ncurses" ,ncurses)
               ("libltdl" ,libltdl)
diff --git a/gnu/packages/commencement.scm b/gnu/packages/commencement.scm
index 2431babcad..7df1d3fca9 100644
--- a/gnu/packages/commencement.scm
+++ b/gnu/packages/commencement.scm
@@ -474,7 +474,7 @@ the bootstrap environment."
                  (unsetenv "CPATH")
 
                  ;; Tell 'libpthread' where to find 'libihash' on Hurd systems.
-                 ,@(if (string-match "i586-gnu" (%current-system))
+                 ,@(if (hurd-triplet? (%current-system))
                        `((substitute* "libpthread/Makefile"
                            (("LDLIBS-pthread.so =.*")
                             (string-append "LDLIBS-pthread.so = "
@@ -499,7 +499,7 @@ the bootstrap environment."
         ,@%boot1-inputs
 
         ;; A native MiG is needed to build Glibc on Hurd.
-        ,@(if (string-match "i586-gnu" (%current-system))
+        ,@(if (hurd-triplet? (%current-system))
               `(("mig" ,mig-boot0))
               '())
 
@@ -783,6 +783,7 @@ exec ~a/bin/~a-~a -B~a/lib -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%"
 (define bash-final
   ;; Link with `-static-libgcc' to make sure we don't retain a reference
   ;; to the bootstrap GCC.
+  ;; FIXME: This depends on 'bootstrap-binaries' via Makefile.in.
   (package-with-bootstrap-guile
    (package-with-explicit-inputs (static-libgcc-package bash)
                                  %boot3-inputs
diff --git a/gnu/packages/compression.scm b/gnu/packages/compression.scm
index bdf87562e4..2e4de8173e 100644
--- a/gnu/packages/compression.scm
+++ b/gnu/packages/compression.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, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
@@ -57,8 +57,8 @@
       (method url-fetch)
       (uri (list (string-append "http://zlib.net/zlib-"
                                  version ".tar.gz")
-                 (string-append "mirror://sourceforge/libpng/zlib-"
-                                 version ".tar.gz")))
+                 (string-append "mirror://sourceforge/libpng/zlib/"
+                                version "/zlib-" version ".tar.gz")))
       (sha256
        (base32
         "039agw5rqvqny92cpkrfn243x2gd4xn13hs3xi6isk55d2vqqr9n"))))
diff --git a/gnu/packages/connman.scm b/gnu/packages/connman.scm
index 6b061db58a..0fced0be79 100644
--- a/gnu/packages/connman.scm
+++ b/gnu/packages/connman.scm
@@ -1,5 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2017 Mathieu OTHACEHE <m.othacehe@gmail.com>
+;;; Copyright © 2017 Clément Lassieur <clement@lassieur.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -28,7 +30,9 @@
   #:use-module (gnu packages glib)
   #:use-module (gnu packages linux)
   #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages polkit)
   #:use-module (gnu packages python)
+  #:use-module (gnu packages qt)
   #:use-module (gnu packages readline)
   #:use-module (gnu packages samba)
   #:use-module (gnu packages tls)
@@ -50,7 +54,7 @@
     (arguments
      `(#:configure-flags
        (list "--enable-nmcompat"
-             ;; "--enable-polkit"
+             "--enable-polkit"
              "--enable-openconnect"
              "--enable-openvpn"
              "--enable-vpnc"
@@ -71,7 +75,7 @@
        ("glib" ,glib)
        ("gnutls" ,gnutls)
        ("iptables" ,iptables)
-       ;; ("polkit" ,polkit) ; pkg-config cannot find polkit.pc
+       ("polkit" ,polkit)        ;so connman can be used by unprivileged users
        ("readline" ,readline)
        ;; These inputs are needed for connman to include the interface to
        ;; these technologies so IF they are installed they can be used.
@@ -120,9 +124,50 @@ sharing) to clients via USB, ethernet, WiFi, cellular and Bluetooth.")
     (inputs
      `(("efl" ,efl)
        ("python-2" ,python-2)
+       ("python2-dbus" ,python2-dbus)
        ("python2-efl" ,python2-efl)))
     (home-page "https://www.enlightenment.org")
     (synopsis "Connman User Interface written using the EFL")
     (description
      "An EFL user interface for the @code{connman} connection manager.")
     (license lgpl3)))
+
+(define-public cmst
+  (package
+    (name "cmst")
+    (version "2016.10.03")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://github.com/andrew-bibb/cmst/releases/download/cmst-"
+             version "/cmst-" version ".tar.gz"))
+       (sha256
+        (base32 "1xpn4sqnxzpsjjwh9hva9sn55xlryiz2f2mwpyj2l31janj7a082"))))
+    (inputs
+     `(("qt" ,qt)))
+    (native-inputs
+     `(("qmake" ,qt)))
+    (build-system gnu-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (replace 'configure
+           (lambda* (#:key outputs #:allow-other-keys)
+             (zero?
+              (system* "qmake"
+                       (string-append "PREFIX="
+                                      (assoc-ref outputs "out"))))))
+         (add-before 'install 'fix-Makefiles
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (substitute* (find-files "." "Makefile")
+                 (("INSTALL_ROOT)")
+                  (string-append "INSTALL_ROOT)" out))
+                 (("/usr/bin") "/bin"))))))))
+    (home-page "https://github.com/andrew-bibb/cmst")
+    (synopsis "Qt frontend for Connman")
+    (description
+     "Cmst is a Qt based frontend for the @code{connman} connection manager.
+This package also provides a systemtray icon.")
+    (license x11)))
diff --git a/gnu/packages/cross-base.scm b/gnu/packages/cross-base.scm
index 763bbf50e2..a3dfb8f477 100644
--- a/gnu/packages/cross-base.scm
+++ b/gnu/packages/cross-base.scm
@@ -468,7 +468,7 @@ XBINUTILS and the cross tool chain."
 
           (native-inputs `(("cross-gcc" ,xgcc)
                            ("cross-binutils" ,xbinutils)
-                           ,@(if (string-match (or "i586-pc-gnu" "i586-gnu") target)
+                           ,@(if (hurd-triplet? target)
                                  `(("cross-mig"
                                     ,@(assoc-ref (package-native-inputs xheaders)
                                                  "cross-mig")))
diff --git a/gnu/packages/cups.scm b/gnu/packages/cups.scm
index 0a8a10ecb4..ca16958352 100644
--- a/gnu/packages/cups.scm
+++ b/gnu/packages/cups.scm
@@ -51,7 +51,7 @@
 (define-public cups-filters
   (package
     (name "cups-filters")
-    (version "1.11.5")
+    (version "1.13.1")
     (source(origin
               (method url-fetch)
               (uri
@@ -59,7 +59,7 @@
                               "cups-filters-" version ".tar.xz"))
               (sha256
                (base32
-                "1hcp1cfx1a71aa6fyayajjh7vw1ia7zya6981gz73vsy2pdb23qf"))
+                "0s7hylp2lcvc1vrqpywpv7lspkrh4xf7cyi4nbg10cf38rshj474"))
               (modules '((guix build utils)))
               (snippet
                ;; install backends, banners and filters to cups-filters output
@@ -85,12 +85,16 @@
     (arguments
      `(#:make-flags (list (string-append "PREFIX=" %output))
        #:configure-flags
-       `(,(string-append "--with-test-font-path="
+       `("--disable-driverless" ; TODO: enable this
+         ,(string-append "--with-test-font-path="
                          (assoc-ref %build-inputs "font-dejavu")
                          "/share/fonts/truetype/DejaVuSans.ttf")
          ,(string-append "--with-gs-path="
                          (assoc-ref %build-inputs "ghostscript")
                          "/bin/gsc")
+         ,(string-append "--with-shell="
+                         (assoc-ref %build-inputs "bash")
+                         "/bin/bash")
          ,(string-append "--with-rcdir="
                          (assoc-ref %outputs "out") "/etc/rc.d"))))
     (native-inputs
@@ -100,12 +104,12 @@
      `(("avahi"        ,avahi)
        ("fontconfig"   ,fontconfig)
        ("freetype"     ,freetype)
-       ("font-dejavu"  ,font-dejavu) ;needed by test suite
+       ("font-dejavu"  ,font-dejavu) ; also needed by test suite
        ("ghostscript"  ,(force ghostscript/cups))
        ("ijs"          ,ijs)
        ("dbus"         ,dbus)
        ("lcms"         ,lcms)
-       ("libjpeg-8"    ,libjpeg-8)
+       ("libjpeg"      ,libjpeg)
        ("libpng"       ,libpng)
        ("libtiff"      ,libtiff)
        ("mupdf"        ,mupdf)
@@ -416,7 +420,7 @@ device-specific programs to convert and print many types of files.")
     (inputs `(("libjpeg" ,libjpeg)
               ("cups-minimal" ,cups-minimal)
               ("libusb" ,libusb)
-              ("sane-backends" ,sane-backends)
+              ("sane-backends" ,sane-backends-minimal)
               ("dbus" ,dbus)
               ("python-wrapper" ,python-wrapper)
               ("python" ,python)
diff --git a/gnu/packages/curl.scm b/gnu/packages/curl.scm
index 790f542a52..7329d870de 100644
--- a/gnu/packages/curl.scm
+++ b/gnu/packages/curl.scm
@@ -40,7 +40,7 @@
 (define-public curl
   (package
    (name "curl")
-   (replacement curl-7.51.0)
+   (replacement curl-7.52.1)
    (version "7.50.3")
    (source (origin
             (method url-fetch)
@@ -119,17 +119,17 @@ authentication (Basic, Digest, NTLM, Negotiate, kerberos...), proxy
 tunneling, and so on.")
    (license (license:non-copyleft "file://COPYING"
                                   "See COPYING in the distribution."))
-   (home-page "http://curl.haxx.se/")))
+   (home-page "https://curl.haxx.se/")))
 
-(define curl-7.51.0
+(define curl-7.52.1
   (package
     (inherit curl)
     (source
-      (let ((version "7.51.0"))
+      (let ((version "7.52.1"))
         (origin
           (method url-fetch)
           (uri (string-append "https://curl.haxx.se/download/curl-"
                               version ".tar.lzma"))
           (sha256
            (base32
-            "0605f28m2kxjcxrcfcv1ja353gv167lwyxjc3xizqbwppdmmzvwy")))))))
+            "0r937wplchjxifxqqcjxd9rzp6l9rqqdfjn41x1y4djrh95nsa24")))))))
diff --git a/gnu/packages/databases.scm b/gnu/packages/databases.scm
index b70cca0471..e05a337e47 100644
--- a/gnu/packages/databases.scm
+++ b/gnu/packages/databases.scm
@@ -210,7 +210,7 @@ SQL, Key/Value, XML/XQuery or Java Object storage for their data model.")
 (define-public mysql
   (package
     (name "mysql")
-    (version "5.7.16")
+    (version "5.7.17")
     (source (origin
              (method url-fetch)
              (uri (list (string-append
@@ -222,7 +222,7 @@ SQL, Key/Value, XML/XQuery or Java Object storage for their data model.")
                           name "-" version ".tar.gz")))
              (sha256
               (base32
-               "198qhd9bdm0fnpp307mgby2aar92yzya0937kxi7bcpdfjcvada9"))))
+               "0lcn9cm36n14g22bcppq5vf4nxbrl3khvlsp9hsixqdfb3l27gyf"))))
     (build-system cmake-build-system)
     (arguments
      `(#:configure-flags
@@ -285,7 +285,7 @@ Language.")
 (define-public mariadb
   (package
     (name "mariadb")
-    (version "10.1.19")
+    (version "10.1.20")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://downloads.mariadb.org/f/"
@@ -293,7 +293,7 @@ Language.")
                                   name "-" version ".tar.gz"))
               (sha256
                (base32
-                "108s4mimdbmgmmn5pcr9a405j70cyny9adzv49s75lg22krp74sv"))))
+                "1fd0kfw94iyprf0466kjw5mwmj4ky0i997lz6499jkb79pr86kn2"))))
     (build-system cmake-build-system)
     (arguments
      '(#:configure-flags
diff --git a/gnu/packages/dav.scm b/gnu/packages/dav.scm
index 985a2e071e..dd03d8964b 100644
--- a/gnu/packages/dav.scm
+++ b/gnu/packages/dav.scm
@@ -54,13 +54,13 @@ clients.")
 (define-public vdirsyncer
   (package
     (name "vdirsyncer")
-    (version "0.14.0")
+    (version "0.14.1")
     (source (origin
              (method url-fetch)
              (uri (pypi-uri name version))
              (sha256
               (base32
-               "1mbh2gykx9sqsnyfa962ifxksx4afl2lb9rcsbd6rsh3gj2il898"))))
+               "044f01fjd8dpz4y9dm3qcc1a8cihcxxbr1sz6y6fkvglpb6k85y5"))))
     (build-system python-build-system)
     (arguments
       `(#:phases (modify-phases %standard-phases
diff --git a/gnu/packages/disk.scm b/gnu/packages/disk.scm
index 4afd2c2df3..a4bb0be134 100644
--- a/gnu/packages/disk.scm
+++ b/gnu/packages/disk.scm
@@ -6,6 +6,7 @@
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2016 Roel Janssen <roel@gnu.org>
+;;; Copyright © 2016 Marius Bakke <mbakke@fastmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -27,6 +28,7 @@
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix build-system gnu)
+  #:use-module (guix build-system trivial)
   #:use-module (gnu packages)
   #:use-module (gnu packages base)
   #:use-module (gnu packages docbook)
@@ -197,6 +199,40 @@ to recover data more efficiently by only reading the necessary blocks.")
 which respectively make and check MS-DOS FAT file systems.")
     (license license:gpl3+)))
 
+(define dosfstools/static
+  (static-package
+   (package (inherit dosfstools))))
+
+(define-public fatfsck/static
+  (package
+    (name "fatfsck-static")
+    (version (package-version dosfstools))
+    (build-system trivial-build-system)
+    (source #f)
+    (arguments
+     `(#:modules ((guix build utils))
+       #:builder
+       (begin
+         (use-modules (guix build utils))
+         (let ((src (string-append (assoc-ref %build-inputs "dosfstools")
+                                   "/sbin"))
+               (exe "fsck.fat")
+               (bin (string-append (assoc-ref %outputs "out") "/sbin")))
+           (mkdir-p bin)
+           (with-directory-excursion bin
+             (copy-file (string-append src "/" exe) exe)
+             (remove-store-references exe)
+             (chmod exe #o555)
+             ;; Add fsck.vfat symlink to match the Linux driver name.
+             (symlink exe "fsck.vfat")
+             #t)))))
+    (inputs `(("dosfstools" ,dosfstools/static)))
+    (home-page (package-home-page dosfstools))
+    (synopsis "Statically linked fsck.fat from dosfstools")
+    (description "This package provides a statically-linked @command{fsck.fat}
+and a @command{fsck.vfat} compatibility symlink for use in an initrd.")
+    (license (package-license dosfstools))))
+
 (define-public sdparm
   (package
     (name "sdparm")
diff --git a/gnu/packages/display-managers.scm b/gnu/packages/display-managers.scm
index 0eca94550b..80b45af103 100644
--- a/gnu/packages/display-managers.scm
+++ b/gnu/packages/display-managers.scm
@@ -235,7 +235,7 @@ create smooth, animated user interfaces.")
        #:tests? #f))
 
     ;; This used to be at <http://slim.berlios.de/>.
-    (home-page "http://sourceforge.net/projects/slim.berlios/")
+    (home-page "https://sourceforge.net/projects/slim.berlios/")
     (synopsis "Desktop-independent graphical login manager for X11")
     (description
      "SLiM is a Desktop-independent graphical login manager for X11, derived
diff --git a/gnu/packages/dns.scm b/gnu/packages/dns.scm
index 16e2220c90..9a4f4e108e 100644
--- a/gnu/packages/dns.scm
+++ b/gnu/packages/dns.scm
@@ -76,7 +76,7 @@ and BOOTP/TFTP for network booting of diskless machines.")
 (define-public bind
   (package
     (name "bind")
-    (version "9.10.4-P4")
+    (version "9.10.4-P5")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -84,7 +84,7 @@ and BOOTP/TFTP for network booting of diskless machines.")
                     version ".tar.gz"))
               (sha256
                (base32
-                "11lxkb7d79c75scrs28q4xmr0ii2li69zj1c650al3qxir8yf754"))))
+                "1sqg7wg05h66vdjc8j215r04f8pg7lphkb93nsqxvzhk6r0ppi49"))))
     (build-system gnu-build-system)
     (outputs `("out" "utils"))
     (inputs
@@ -140,7 +140,7 @@ high-volume and high-reliability applications. The name BIND stands for
 (define-public dnscrypt-proxy
   (package
     (name "dnscrypt-proxy")
-    (version "1.7.0")
+    (version "1.8.1")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -148,7 +148,7 @@ high-volume and high-reliability applications. The name BIND stands for
                     "dnscrypt-proxy-" version ".tar.bz2"))
               (sha256
                (base32
-                "1qw2nib0d5ia8581lbdnjxgn9c7pf2qw8vhpnnh1wjcjj3gpgbqx"))
+                "1dz0knslf7ysc2xx33ljrdlqyr4b0fpm9ifrwvwgcjaxgh94l7m8"))
               (modules '((guix build utils)))
               (snippet
                ;; Delete bundled libltdl. XXX: This package also bundles
@@ -261,15 +261,17 @@ asynchronous fashion.")
 (define-public yadifa
   (package
     (name "yadifa")
-    (version "2.2.1-6281")
+    (version "2.2.3")
     (source
-     (origin
-       (method url-fetch)
-       (uri (string-append "http://cdn.yadifa.eu/sites/default/files/releases/"
-                           name "-" version ".tar.gz"))
-       (sha256
-        (base32
-         "0vj71z7i9lfbnp93k28aplwldp5mfli0kvrbwmha6fjha6kcr910"))))
+     (let ((revision "6711"))
+       (origin
+         (method url-fetch)
+         (uri
+          (string-append "http://cdn.yadifa.eu/sites/default/files/releases/"
+                         name "-" version "-" revision ".tar.gz"))
+         (sha256
+          (base32
+           "0ikfm40gx0zjw3gnxsw3rn1k4wb8jacgklja3ygcj1knq6hy2zaa")))))
     (build-system gnu-build-system)
     (native-inputs
      `(("which" ,which)))
@@ -283,6 +285,8 @@ asynchronous fashion.")
        #:configure-flags (list "--sysconfdir=/etc"      "--localstatedir=/var"
                                "--enable-shared"        "--disable-static"
                                "--enable-messages"      "--enable-ctrl"
+                               "--enable-nsec"          "--enable-nsec3"
+                               "--enable-tsig"          "--enable-caching"
                                ;; NSID is a rarely-used debugging aid, that also
                                ;; causes the build to fail. Just disable it.
                                "--disable-nsid")))
diff --git a/gnu/packages/ebook.scm b/gnu/packages/ebook.scm
index 1a030ce4e0..0a53e6ca99 100644
--- a/gnu/packages/ebook.scm
+++ b/gnu/packages/ebook.scm
@@ -1,7 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015, 2016 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
-;;; Copyright © 2016 Alex Griffin <a@ajgrf.com>
+;;; Copyright © 2016, 2017 Alex Griffin <a@ajgrf.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -61,7 +61,7 @@
 (define-public calibre
   (package
     (name "calibre")
-    (version "2.74.0")
+    (version "2.76.0")
     (source
       (origin
         (method url-fetch)
@@ -70,7 +70,7 @@
                             version ".tar.xz"))
         (sha256
          (base32
-          "1dpz1682zd8anvgafk2m5m123dxy1bc07ysj0z1my7zqaq1cyrm3"))
+          "1xfm586n6gm44mkyn25mbiyhj6w9ji9yl6fvmnr4zk1q6qcga3v8"))
         ;; 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 5e6b99ff2f..50cea76855 100644
--- a/gnu/packages/emacs.scm
+++ b/gnu/packages/emacs.scm
@@ -2,7 +2,7 @@
 ;;; Copyright © 2014 Taylan Ulrich Bayirli/Kammer <taylanbayirli@gmail.com>
 ;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org>
-;;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
+;;; Copyright © 2014, 2015, 2016, 2017 Alex Kost <alezost@gmail.com>
 ;;; Copyright © 2015 Federico Beffa <beffa@fbengineering.ch>
 ;;; Copyright © 2015, 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com>
@@ -398,7 +398,7 @@ configuration files, such as .gitattributes, .gitignore, and .git/config.")
 (define-public emacs-with-editor
   (package
     (name "emacs-with-editor")
-    (version "2.5.8")
+    (version "2.5.9")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -407,7 +407,7 @@ configuration files, such as .gitattributes, .gitignore, and .git/config.")
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "1dghd0m5zwayv553g4cr990s4ig5lyh0b52qfdv5rbqnndpj3cjn"))))
+                "0znfznyqr360ryi7za9szbz1l5236v2cig25s4k7kkw0w8828xzh"))))
     (build-system emacs-build-system)
     (propagated-inputs
      `(("emacs-dash" ,emacs-dash)))
@@ -423,7 +423,7 @@ on stdout instead of using a socket as the Emacsclient does.")
 (define-public magit
   (package
     (name "magit")
-    (version "2.8.0")
+    (version "2.10.0")
     (source (origin
              (method url-fetch)
              (uri (string-append
@@ -431,7 +431,7 @@ on stdout instead of using a socket as the Emacsclient does.")
                    version "/" name "-" version ".tar.gz"))
              (sha256
               (base32
-               "1znvb7inwinrhifqzwp4lp9j6yp1l25j7riczc0zmvcjbpl5yhfq"))))
+               "1w74vy46z922kfs7gjkrng7wjpi481calpasqmjzpn3hqvgsd5d1"))))
     (build-system gnu-build-system)
     (native-inputs `(("texinfo" ,texinfo)
                      ("emacs" ,emacs-minimal)))
@@ -559,7 +559,7 @@ support for Git-SVN.")
               (file-name (string-append "magit-popup-" version ".el"))
               (sha256
                (base32
-                "0lmw824zp8c0vhikfkiay9wn4nmaksz6mfy0fldvy4wlx5c26yh3"))))
+                "0s04jnskmggwn69ln05qfwwa32va0q5ri7dwx917wkqz17w5zi62"))))
     (build-system emacs-build-system)
     (propagated-inputs
      `(("emacs-dash" ,emacs-dash)))
@@ -1245,6 +1245,83 @@ and stored in memory.")
     (description "This package provides a modern list API library for Emacs.")
     (license license:gpl3+)))
 
+(define-public emacs-bui
+  (package
+    (name "emacs-bui")
+    (version "1.1.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://github.com/alezost/bui.el/archive/v"
+                    version ".tar.gz"))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "112k0mq6xpy0r47vk66miw7rxbkv3d06pv3pd0vcmrhcnhnnk486"))))
+    (build-system emacs-build-system)
+    (propagated-inputs
+     `(("dash" ,emacs-dash)))
+    (home-page "https://github.com/alezost/bui.el")
+    (synopsis "Buffer interface library for Emacs")
+    (description
+     "BUI (Buffer User Interface) is a library for making @code{list} and
+@code{info} interfaces to display an arbitrary data of the same
+type, for example: packages, buffers, files, etc.")
+    (license license:gpl3+)))
+
+(define-public emacs-guix
+  (package
+    (name "emacs-guix")
+    (version "0.2.2")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/alezost/guix.el"
+                                  "/releases/download/v" version
+                                  "/emacs-guix-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1i47yh24xvgmnc778765g3j9ip0xb2y85v6w83r4qmkigk9rl2ck"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:configure-flags
+       (let ((guix        (assoc-ref %build-inputs "guix"))
+             (geiser      (assoc-ref %build-inputs "geiser"))
+             (dash        (assoc-ref %build-inputs "dash"))
+             (bui         (assoc-ref %build-inputs "bui"))
+             (magit-popup (assoc-ref %build-inputs "magit-popup"))
+             (site-lisp   "/share/emacs/site-lisp"))
+         (list (string-append "--with-guix-site-dir="
+                              guix "/share/guile/site/2.0")
+               (string-append "--with-geiser-lispdir=" geiser site-lisp)
+               (string-append "--with-dash-lispdir="
+                              dash site-lisp "/guix.d/dash-"
+                              ,(package-version emacs-dash))
+               (string-append "--with-bui-lispdir="
+                              bui site-lisp "/guix.d/bui-"
+                              ,(package-version emacs-bui))
+               (string-append "--with-popup-lispdir="
+                              magit-popup site-lisp "/guix.d/magit-popup-"
+                              ,(package-version emacs-magit-popup))))))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)
+       ("emacs" ,emacs-minimal)))
+    (inputs
+     `(("guile" ,guile-2.0)
+       ("guix" ,guix)))
+    (propagated-inputs
+     `(("geiser" ,geiser)
+       ("dash" ,emacs-dash)
+       ("bui" ,emacs-bui)
+       ("magit-popup" ,emacs-magit-popup)))
+    (home-page "https://github.com/alezost/guix.el")
+    (synopsis "Emacs interface for GNU Guix")
+    (description
+     "Emacs-Guix provides a visual interface, tools and features for the GNU
+Guix package manager.  Particularly, it allows you to do various package
+management tasks from Emacs.  To begin with, run @code{M-x guix-about} or
+@code{M-x guix-help} command.")
+    (license license:gpl3+)))
+
 (define-public emacs-d-mode
   (package
     (name "emacs-d-mode")
@@ -1337,6 +1414,32 @@ strings.")
 files and directories.")
     (license license:gpl3+)))
 
+(define-public emacs-git-gutter
+  (package
+    (name "emacs-git-gutter")
+    (version "0.90")
+    (source (origin
+             (method url-fetch)
+             (uri (string-append
+                   "https://github.com/syohex/" name "/archive/"
+                   version ".tar.gz"))
+             (file-name (string-append name "-" version ".tar.gz"))
+             (sha256
+              (base32
+               "1nmhvhpq1l56mj2yq3ag23rw3x4xgnsy8szp30s26l0yjnkhc4qg"))))
+    (build-system emacs-build-system)
+    (home-page "https://github.com/syohex/emacs-git-gutter")
+    (synopsis "See and manage hunks of text in a version control system")
+    (description
+     "This package is an Emacs minor mode for displaying and interacting with
+hunks of text managed in a version control system.  Added modified and deleted
+areas can be indicated with symbols on the edge of the buffer, and commands
+can be used to move between and perform actions on these hunks.
+
+Git, Mercurial, Subversion and Bazaar are supported, and many parts of the
+display and behaviour is easily customisable.")
+    (license license:gpl3+)))
+
 (define-public emacs-el-mock
   (package
     (name "emacs-el-mock")
@@ -2226,7 +2329,7 @@ dark background.")
 (define-public emacs-smartparens
   (package
     (name "emacs-smartparens")
-    (version "1.8.0")
+    (version "1.9.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2235,7 +2338,7 @@ dark background.")
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "0xsqiklg0q4w6gj0js1hvsz4lkypvcx6c9kzb1mz232gwlqx1azw"))))
+                "12065r7h1s9v8lnq5mk3654dkw4cq60ky8aniqq5n2ivv6qd2d4q"))))
     (build-system emacs-build-system)
     (propagated-inputs `(("emacs-dash" ,emacs-dash)))
     (home-page "https://github.com/Fuco1/smartparens")
@@ -3189,14 +3292,14 @@ passive voice.")
 (define-public emacs-org
   (package
     (name "emacs-org")
-    (version "20161118")
+    (version "20161224")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://elpa.gnu.org/packages/org-"
                                   version ".tar"))
               (sha256
                (base32
-                "1w9g8r08kaiw9f4fjsj0hbffzq85rj734j5lxvbaafbnz7dbklk1"))))
+                "0b10bjypn0w5ja776f8sxl1qpvb61iyz1n3c74jx6fqwypv7dmgi"))))
     (build-system emacs-build-system)
     (home-page "http://orgmode.org/")
     (synopsis "Outline-based notes management and organizer")
diff --git a/gnu/packages/embedded.scm b/gnu/packages/embedded.scm
index bd064e618f..70de5e53b8 100644
--- a/gnu/packages/embedded.scm
+++ b/gnu/packages/embedded.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2016, 2017 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016 Theodoros Foradis <theodoros.for@openmailbox.org>
 ;;; Copyright © 2016 David Craven <david@craven.ch>
 ;;;
@@ -30,7 +30,9 @@
   #:use-module (guix build utils)
   #:use-module (gnu packages)
   #:use-module (gnu packages autotools)
+  #:use-module (gnu packages bison)
   #:use-module (gnu packages cross-base)
+  #:use-module (gnu packages dejagnu)
   #:use-module (gnu packages flex)
   #:use-module (gnu packages gcc)
   #:use-module (gnu packages gdb)
@@ -369,3 +371,351 @@ language.")
       (description "OpenOCD provides on-chip programming and debugging support
 with a layered architecture of JTAG interface and TAP support.")
       (license license:gpl2+))))
+
+;; The commits for all propeller tools are the latest versions as published
+;; here: https://github.com/dbetz/propeller-gcc
+
+(define propeller-binutils
+  (let ((xbinutils (cross-binutils "propeller-elf"))
+        (commit "3bfba30076f8ce160a2f42914fdb68f24445fd44")
+        (revision "1"))
+    (package
+      (inherit xbinutils)
+      (name "propeller-binutils")
+      (version (string-append "0.0.0-" revision "." (string-take commit 9)))
+      (source (origin (inherit (package-source xbinutils))
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/totalspectrum/binutils-propeller.git")
+                      (commit commit)))
+                (file-name (string-append name "-" commit "-checkout"))
+                (sha256
+                 (base32
+                  "1v3rgxwj7b8817wy5ccf8621v75qcxvcxygk4acr3hbc6yqybr8h"))))
+      (arguments
+       `(;; FIXME: For some reason there are many test failures.  Some of them
+         ;; appear to be due to regular expression mismatch, but it's not
+         ;; obvious how to fix the failures.
+         #:tests? #f
+         #:phases
+         (modify-phases %standard-phases
+           (add-after 'unpack 'patch-/bin/sh-in-tests
+             (lambda _
+               (substitute* '("sim/testsuite/Makefile.in"
+                              "sim/testsuite/mips64el-elf/Makefile.in"
+                              "sim/testsuite/d10v-elf/Makefile.in"
+                              "sim/testsuite/sim/cris/asm/badarch1.ms")
+                 (("/bin/sh") (which "sh")))
+               #t)))
+         ,@(package-arguments xbinutils)))
+      (native-inputs
+       `(("bison" ,bison)
+         ("flex" ,flex)
+         ("texinfo" ,texinfo)
+         ("dejagnu" ,dejagnu)
+         ,@(package-native-inputs xbinutils))))))
+
+(define-public propeller-gcc
+  (let ((xgcc (cross-gcc "propeller-elf"
+                         propeller-binutils))
+        (commit "b4f45a4725e0b6d0af59e594c4e3e35ca4105867")
+        (revision "1"))
+    (package (inherit xgcc)
+      (name "propeller-gcc")
+      (version (string-append "6.0.0-" revision "." (string-take commit 9)))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/totalspectrum/gcc-propeller.git")
+                      (commit commit)))
+                (file-name (string-append name "-" commit "-checkout"))
+                (sha256
+                 (base32
+                  "0d9kdxm2fzanjqa7q5850kzbsfl0fqyaahxn74h6nkxxacwa11zb"))
+                (patches
+                 (append
+                  (origin-patches (package-source gcc-6))
+                  (search-patches "gcc-cross-environment-variables.patch")))))
+      (native-inputs
+       `(("flex" ,flex)
+         ,@(package-native-inputs xgcc)))
+      ;; All headers and cross libraries of the propeller toolchain are
+      ;; installed under the "propeller-elf" prefix.
+      (native-search-paths
+       (list (search-path-specification
+              (variable "CROSS_C_INCLUDE_PATH")
+              (files '("propeller-elf/include")))
+             (search-path-specification
+              (variable "CROSS_LIBRARY_PATH")
+              (files '("propeller-elf/lib")))))
+      (home-page "https://github.com/totalspectrum/gcc-propeller")
+      (synopsis "GCC for the Parallax Propeller"))))
+
+;; There is no release, so we take the latest version as referenced from here:
+;; https://github.com/dbetz/propeller-gcc
+(define-public proplib
+  (let ((commit "844741fe0ceb140ab2fdf9d0667f68c1c39c31da")
+        (revision "1"))
+    (package
+      (name "proplib")
+      (version (string-append "0.0.0-" revision "." (string-take commit 9)))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/totalspectrum/proplib.git")
+                      (commit commit)))
+                (file-name (string-append name "-" commit "-checkout"))
+                (sha256
+                 (base32
+                  "0q7irf1x8iqx07n7lzksax9armrdkizs49swsz76nbks0mw67wiv"))))
+      (build-system gnu-build-system)
+      (arguments
+       `(#:tests? #f ; no tests
+         #:make-flags
+         (list (string-append "PREFIX=" (assoc-ref %outputs "out"))
+               (string-append "BUILD="  (getcwd) "/build"))
+         #:phases
+         (modify-phases %standard-phases
+           (delete 'configure)
+           (add-after 'unpack 'fix-Makefile
+             (lambda _
+               (substitute* "Makefile"
+                 ;; The GCC sources are not part of this package, so we cannot
+                 ;; install the out-of-tree license file.
+                 (("cp \\.\\..*") "")
+                 ;; Control the installation time of the headers.
+                 ((" install-includes") ""))
+               #t))
+           ;; The Makefile does not separate building from installation, so we
+           ;; have to create the target directories at build time.
+           (add-before 'build 'create-target-directories
+             (lambda* (#:key make-flags #:allow-other-keys)
+               (zero? (apply system* "make" "install-dirs" make-flags))))
+           (add-before 'build 'set-cross-environment-variables
+             (lambda* (#:key outputs #:allow-other-keys)
+               (setenv "CROSS_LIBRARY_PATH"
+                       (string-append (assoc-ref outputs "out")
+                                      "/propeller-elf/lib:"
+                                      (or (getenv "CROSS_LIBRARY_PATH") "")))
+               (setenv "CROSS_C_INCLUDE_PATH"
+                       (string-append (assoc-ref outputs "out")
+                                      "/propeller-elf/include:"
+                                      (or (getenv "CROSS_C_INCLUDE_PATH") "")))
+               #t))
+           (add-after 'build 'build-tiny
+             (lambda* (#:key make-flags #:allow-other-keys)
+               (zero? (apply system* "make" "tiny" make-flags))))
+           ;; The build of the tiny libraries depends on the includes to be
+           ;; available.  Since we set CROSS_C_INCLUDE_PATH to the output
+           ;; directory, we have to install the includes first.
+           (add-before 'build-tiny 'install-includes
+             (lambda* (#:key make-flags #:allow-other-keys)
+               (zero? (apply system* "make" "install-includes" make-flags))))
+           (add-after 'install 'install-tiny
+             (lambda* (#:key make-flags #:allow-other-keys)
+               (zero? (apply system* "make" "install-tiny" make-flags)))))))
+      (native-inputs
+       `(("propeller-gcc" ,propeller-gcc)
+         ("propeller-binutils" ,propeller-binutils)
+         ("perl" ,perl)))
+      (home-page "https://github.com/totalspectrum/proplib")
+      (synopsis "C library for the Parallax Propeller")
+      (description "This is a C library for the Parallax Propeller
+micro-controller.")
+      ;; Most of the code is released under the Expat license.  Some of the
+      ;; included code is public domain and some changes are BSD licensed.
+      (license license:expat))))
+
+(define-public propeller-toolchain
+  (package
+    (name "propeller-toolchain")
+    (version (package-version propeller-gcc))
+    (source #f)
+    (build-system trivial-build-system)
+    (arguments '(#:builder (mkdir %output)))
+    (propagated-inputs
+     `(("binutils" ,propeller-binutils)
+       ("libc" ,proplib)
+       ("gcc" ,propeller-gcc)))
+    (synopsis "Complete GCC tool chain for Propeller micro-controllers")
+    (description "This package provides a complete GCC tool chain for
+Propeller micro-controller development.")
+    (home-page (package-home-page propeller-gcc))
+    (license (package-license propeller-gcc))))
+
+(define-public openspin
+  (package
+    (name "openspin")
+    (version "1.00.78")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/parallaxinc/"
+                                  "OpenSpin/archive/" version ".tar.gz"))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1k2dbz1v604g4r2d9qhckg2m8dnhiya760mbsqfsg4waxal87yb7"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f ; no tests
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure)
+         (add-after 'unpack 'remove-timestamp
+           (lambda _
+             (substitute* "SpinSource/openspin.cpp"
+               ((" Compiled on.*$") "\\n\");"))
+             #t))
+         ;; Makefile does not include "install" target
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((bin (string-append (assoc-ref outputs "out")
+                                       "/bin")))
+               (mkdir-p bin)
+               (install-file "build/openspin" bin)
+               #t))))))
+    (home-page "https://github.com/parallaxinc/OpenSpin")
+    (synopsis "Spin/PASM compiler for the Parallax Propeller")
+    (description "OpenSpin is a compiler for the Spin/PASM language of the
+Parallax Propeller.  It was ported from Chip Gracey's original x86 assembler
+code.")
+    (license license:expat)))
+
+(define-public propeller-load
+  (let ((commit "ba9c0a7251cf751d8d292ae19ffa03132097c0c0")
+        (revision "1"))
+    (package
+      (name "propeller-load")
+      (version "3.4.0")
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/dbetz/propeller-load.git")
+                      (commit commit)))
+                (file-name (string-append name "-" commit "-checkout"))
+                (sha256
+                 (base32
+                  "1qv3xaapl9fmj3zn58b60sprp4rnvnlpci8ci0pdrzkw6fhvx3pg"))))
+      (build-system gnu-build-system)
+      (arguments
+       `(#:tests? #f ; no tests
+         #:make-flags
+         (list "OS=linux"
+               (string-append "TARGET=" (assoc-ref %outputs "out")))
+         #:phases
+         (modify-phases %standard-phases
+           (delete 'configure))))
+      (native-inputs
+       `(("openspin" ,openspin)
+         ("propeller-toolchain" ,propeller-toolchain)))
+      (home-page "https://github.com/dbetz/propeller-load")
+      (synopsis "Loader for Parallax Propeller micro-controllers")
+      (description "This package provides the tool @code{propeller-load} to
+upload binaries to a Parallax Propeller micro-controller.")
+      (license license:expat))))
+
+(define-public spin2cpp
+  (package
+    (name "spin2cpp")
+    (version "3.4.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/totalspectrum/spin2cpp/"
+                                  "archive/v" version ".tar.gz"))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "00i8i0dspd5115ggkv5vx2xqb21l6y38wz0bakgby8n3b4k9xnk0"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f ;; The tests assume that a micro-controller is connected.
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure)
+         (add-before 'build 'set-cross-environment-variables
+           (lambda* (#:key inputs #:allow-other-keys)
+             (setenv "CROSS_LIBRARY_PATH"
+                     (string-append (assoc-ref inputs "propeller-toolchain")
+                                    "/propeller-elf/lib"))
+             (setenv "CROSS_C_INCLUDE_PATH"
+                     (string-append (assoc-ref inputs "propeller-toolchain")
+                                    "/propeller-elf/include"))
+             #t))
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((bin (string-append (assoc-ref outputs "out")
+                                       "/bin")))
+               (for-each (lambda (file)
+                           (install-file (string-append "build/" file)
+                                         bin))
+                         '("testlex" "spin2cpp" "fastspin")))
+             #t)))))
+    (native-inputs
+     `(("bison" ,bison)
+       ("propeller-load" ,propeller-load)
+       ("propeller-toolchain" ,propeller-toolchain)))
+    (home-page "https://github.com/totalspectrum/spin2cpp")
+    (synopsis "Convert Spin code to C, C++, or PASM code")
+    (description "This is a set of tools for converting the Spin language for
+the Parallax Propeller micro-controller into C or C++ code, into PASM, or even
+directly into an executable binary.  The binaries produced use LMM PASM, so
+they are much faster than regular Spin bytecodes (but also quite a bit
+larger).")
+    (license license:expat)))
+
+(define-public spinsim
+  (let ((commit "66915a7ad1a3a2cf990a725bb341fab8d11eb620")
+        (revision "1"))
+    (package
+      (name "spinsim")
+      (version (string-append "0.75-" revision "." (string-take commit 9)))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/parallaxinc/spinsim.git")
+                      (commit commit)))
+                (file-name (string-append name "-" commit "-checkout"))
+                (sha256
+                 (base32
+                  "1n9kdhlxsdx7bz6c80w8dhi96zp633gd6qs0x9i4ii8qv4i7sj5k"))))
+      (build-system gnu-build-system)
+      (arguments
+       `(#:tests? #f ; no tests
+         #:phases
+         (modify-phases %standard-phases
+           (delete 'configure)
+           (replace 'install
+             (lambda* (#:key outputs #:allow-other-keys)
+               (let ((bin (string-append (assoc-ref outputs "out")
+                                         "/bin")))
+                 (install-file "build/spinsim" bin))
+               #t)))))
+      (home-page "https://github.com/parallaxinc/spinsim")
+      (synopsis "Spin simulator")
+      (description "This package provides the tool @code{spinsim}, a simulator
+and simple debugger for Spin programs written for a Parallax Propeller
+micro-controller.  Spinsim supports execution from cog memory and hub
+execution, but it does not support multi-tasking.  It supports about
+two-thirds of the opcodes in the P2 instruction set.")
+      (license license:expat))))
+
+(define-public propeller-development-suite
+  (package
+    (name "propeller-development-suite")
+    (version (package-version propeller-gcc))
+    (source #f)
+    (build-system trivial-build-system)
+    (arguments '(#:builder (mkdir %output)))
+    (propagated-inputs
+     `(("toolchain" ,propeller-toolchain)
+       ("openspin" ,openspin)
+       ("propeller-load" ,propeller-load)
+       ("spin2cpp" ,spin2cpp)
+       ("spinsim" ,spinsim)))
+    (synopsis "Complete development suite for Propeller micro-controllers")
+    (description "This meta-package provides a complete environment for the
+development with Parallax Propeller micro-controllers.  It includes the GCC
+toolchain, the loader, the Openspin compiler, the Spin2cpp tool, and the Spin
+simulator.")
+    (home-page (package-home-page propeller-gcc))
+    (license (package-license propeller-gcc))))
diff --git a/gnu/packages/engineering.scm b/gnu/packages/engineering.scm
index 831e63beda..b147764a7d 100644
--- a/gnu/packages/engineering.scm
+++ b/gnu/packages/engineering.scm
@@ -3,7 +3,7 @@
 ;;; Copyright © 2015 Federico Beffa <beffa@fbengineering.ch>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 David Thompson <davet@gnu.org>
-;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2016 Theodoros Foradis <theodoros.for@openmailbox.org>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -545,7 +545,7 @@ as well as pick-place files.")
                                         (getenv "CPLUS_INCLUDE_PATH")))
                  #t)))
            (add-after 'install 'install-guile-bindings
-             (lambda* (#:key outputs #:allow-other-keys)
+             (lambda* (#:key inputs outputs #:allow-other-keys)
                ;; Install the Guile bindings (the build system only installs
                ;; libao.so.)
                (let* ((out    (assoc-ref outputs "out"))
@@ -574,6 +574,14 @@ as well as pick-place files.")
 
                    (install-file "bin/ao-guile"
                                  (string-append out "/bin"))
+
+                   ;; Allow Ao to dlopen the relevant GL libraries.  Otherwise
+                   ;; it fails with:
+                   ;;   Couldn't find current GLX or EGL context.
+                   (let ((mesa (assoc-ref inputs "mesa")))
+                     (wrap-program (string-append out "/bin/ao-guile")
+                       `("LD_LIBRARY_PATH" ":" prefix
+                         (,(string-append mesa "/lib")))))
                    #t)))))))
       (native-inputs
        `(("pkg-config" ,pkg-config)))
@@ -583,6 +591,7 @@ as well as pick-place files.")
          ("libpng" ,libpng)
          ("glfw" ,glfw)
          ("libepoxy" ,libepoxy)
+         ("mesa" ,mesa)
          ("eigen" ,eigen)
          ("glm" ,glm)
          ("guile" ,guile-2.0)))
diff --git a/gnu/packages/enlightenment.scm b/gnu/packages/enlightenment.scm
index 5ec3ec5a88..d60e97922c 100644
--- a/gnu/packages/enlightenment.scm
+++ b/gnu/packages/enlightenment.scm
@@ -197,7 +197,7 @@ Libraries with some extra bells and whistles.")
 (define-public enlightenment
   (package
     (name "enlightenment")
-    (version "0.21.4")
+    (version "0.21.5")
     (source (origin
               (method url-fetch)
               (uri
@@ -205,7 +205,7 @@ Libraries with some extra bells and whistles.")
                               name "/" name "-" version ".tar.xz"))
               (sha256
                (base32
-                "085zn6vdy904fxa9krx7ljv61yg96b2xk56g0bx2lyq1d33sgl8f"))))
+                "1fslq70z4s6v9ipahnk8s5fgqnqq4njv4rlqv951r1bh1xk5lx7h"))))
     (build-system gnu-build-system)
     (arguments
      `(#:configure-flags '("--enable-mount-eeze")))
diff --git a/gnu/packages/fonts.scm b/gnu/packages/fonts.scm
index f385559f7e..35ee8dbd69 100644
--- a/gnu/packages/fonts.scm
+++ b/gnu/packages/fonts.scm
@@ -7,13 +7,14 @@
 ;;; Copyright © 2015 Eric Dvorsak <eric@dvorsak.fr>
 ;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2015, 2016 Leo Famulari <leo@famulari.name>
-;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is>
+;;; Copyright © 2016, 2017 ng0 <ng0@libertad.pw>
 ;;; Copyright © 2016 Jookia <166291@gmail.com>
 ;;; Copyright © 2016 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2016 Dmitry Nikolaev <cameltheman@gmail.com>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Marius Bakke <mbakke@fastmail.com>
 ;;; Copyright © 2016 Toni Reina <areina@riseup.net>
+;;; Copyright © 2017 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -108,12 +109,10 @@ in print.  With attention to detail for high resolution rendering.")
                      (mkdir-p doc-dir)
                      (chdir (string-append "ubuntu-font-family-" ,version))
                      (for-each (lambda (ttf)
-                                 (copy-file ttf
-                                            (string-append font-dir "/" ttf)))
+                                 (install-file ttf font-dir))
                                (find-files "." "\\.ttf$"))
                      (for-each (lambda (doc)
-                                 (copy-file doc
-                                            (string-append doc-dir "/" doc)))
+                                 (install-file doc doc-dir))
                                (find-files "." "\\.txt$"))))))
     (native-inputs `(("source" ,source)
                      ("unzip" ,unzip)))
@@ -165,19 +164,13 @@ TrueType (TTF) files.")
                      (mkdir-p doc-dir)
                      (chdir (string-append "dejavu-fonts-ttf-" ,version))
                      (for-each (lambda (ttf)
-                                 (copy-file ttf
-                                            (string-append font-dir "/"
-                                                           (basename ttf))))
+                                 (install-file ttf font-dir))
                                (find-files "ttf" "\\.ttf$"))
                      (for-each (lambda (conf)
-                                 (copy-file conf
-                                            (string-append conf-dir "/"
-                                                           (basename conf))))
+                                 (install-file conf conf-dir))
                                (find-files "fontconfig" "\\.conf$"))
                      (for-each (lambda (doc)
-                                 (copy-file doc
-                                            (string-append doc-dir "/"
-                                                           (basename doc))))
+                                 (install-file doc doc-dir))
                                (find-files "." "\\.txt$|^[A-Z][A-Z]*$"))))))
     (native-inputs `(("source" ,source)
                      ("tar" ,tar)
@@ -186,7 +179,7 @@ TrueType (TTF) files.")
     (synopsis "Vera font family derivate with additional characters")
     (description "DejaVu provides an expanded version of the Vera font family
 aiming for quality and broader Unicode coverage while retaining the original
-Vera style.  DejaVu currently works towards conformance with the Multilingual
+Vera style.  DejaVu currently works towards conformance to the Multilingual
 European Standards (MES-1 and MES-2) for Unicode coverage.  The DejaVu fonts
 provide serif, sans and monospaced variants.")
     (license
@@ -229,12 +222,10 @@ provide serif, sans and monospaced variants.")
                      (mkdir-p doc-dir)
                      (chdir (string-append "ttf-bitstream-vera-" ,version))
                      (for-each (lambda (ttf)
-                                 (copy-file ttf
-                                            (string-append font-dir "/" ttf)))
+                                 (install-file ttf font-dir))
                                (find-files "." "\\.ttf$"))
                      (for-each (lambda (doc)
-                                 (copy-file doc
-                                            (string-append doc-dir "/" doc)))
+                                 (install-file doc doc-dir))
                                (find-files "." "\\.TXT$"))))))
     (native-inputs `(("source" ,source)
                      ("tar" ,tar)
@@ -294,9 +285,7 @@ sans-serif designed for on-screen reading.  It is used by GNOME@tie{}3.")
                        (system* "make" "ttftar")
                        (mkdir-p font-dir)
                        (for-each (lambda (file)
-                                   (copy-file file
-                                              (string-append font-dir "/"
-                                                             (basename file))))
+                                   (install-file file font-dir))
                                  (filter
                                    (lambda (file) (string-suffix? "ttf" file))
                                    (find-files "." "")))))))
@@ -348,14 +337,10 @@ sans-serif designed for on-screen reading.  It is used by GNOME@tie{}3.")
            (mkdir-p doc-dir)
            (chdir (string-append "liberation-fonts-ttf-" ,version))
            (for-each (lambda (ttf)
-                       (copy-file ttf
-                                  (string-append font-dir "/"
-                                                 (basename ttf))))
+                       (install-file ttf font-dir))
                      (find-files "." "\\.ttf$"))
            (for-each (lambda (doc)
-                       (copy-file doc
-                                  (string-append doc-dir "/"
-                                                 (basename doc))))
+                       (install-file doc doc-dir))
                      '("AUTHORS" "ChangeLog" "LICENSE" "README" "TODO"))))))
     (native-inputs
      `(("source" ,source)
@@ -367,17 +352,16 @@ sans-serif designed for on-screen reading.  It is used by GNOME@tie{}3.")
     (description
      "The Liberation font family aims at metric compatibility with
 Arial, Times New Roman, and Courier New.
-
 There are three sets:
 
-- Sans (a substitute for Arial, Albany, Helvetica, Nimbus Sans L, and
+@enumerate
+@item Sans (a substitute for Arial, Albany, Helvetica, Nimbus Sans L, and
 Bitstream Vera Sans);
-
-- Serif (a substitute for Times New Roman, Thorndale, Nimbus Roman, and
+@item Serif (a substitute for Times New Roman, Thorndale, Nimbus Roman, and
 Bitstream Vera Serif);
-
-- Mono (a substitute for Courier New, Cumberland, Courier, Nimbus Mono L,
+@item Mono (a substitute for Courier New, Cumberland, Courier, Nimbus Mono L,
 and Bitstream Vera Sans Mono).
+@end enumerate
 
 The Liberation Fonts are sponsored by Red Hat.")
     (license license:silofl1.1)))
@@ -414,8 +398,8 @@ The Liberation Fonts are sponsored by Red Hat.")
        #:tests? #f)) ;; No test target in tarball
     (home-page "http://terminus-font.sourceforge.net/")
     (synopsis "Simple bitmap programming font")
-    (description "Terminus Font is a clean, fixed width bitmap font, designed
-for long (8 and more hours per day) work with computers.")
+    (description "Terminus Font is a clean, fixed-width bitmap font, designed
+for long periods of working with computers (8 or more hours per day).")
     (license license:silofl1.1)))
 
 (define-public font-adobe-source-han-sans
@@ -501,8 +485,7 @@ text in Simplified Chinese, Traditional Chinese, Japanese, and Korean.")
            (mkdir-p font-dir)
            (system* "tar" "xvf" (assoc-ref %build-inputs "source"))
            (chdir "wqy-zenhei")
-           (copy-file "wqy-zenhei.ttc"
-                      (string-append font-dir "wqy-zenhei.ttc"))))))
+           (install-file "wqy-zenhei.ttc" font-dir)))))
     (native-inputs
      `(("gzip" ,gzip)
        ("tar" ,tar)))
@@ -512,12 +495,12 @@ text in Simplified Chinese, Traditional Chinese, Japanese, and Korean.")
      "WenQuanYi Zen Hei is a Hei-Ti style (sans-serif type) Chinese outline
 font.  It is designed for general purpose text formatting and on-screen
 display of Chinese characters and symbols from many other languages.
-WenQuanYi Zen Hei provides a rather complete coverage to Chinese Hanzi glyphs,
+WenQuanYi Zen Hei provides a rather complete coverage of Chinese Hanzi glyphs,
 including both simplified and traditional forms.  The total glyph number in
 this font is over 35,000, including over 21,000 Chinese Hanzi.  This font has
-full coverage to GBK(CP936) charset, CJK Unified Ideographs, as well as the
-code-points needed for zh_cn, zh_sg, zh_tw, zh_hk, zh_mo, ja (Japanese) and
-ko (Korean) locales for fontconfig.")
+full coverage of the GBK (CP936) charset, CJK Unified Ideographs, as well as
+the code-points needed for zh_cn, zh_sg, zh_tw, zh_hk, zh_mo, ja (Japanese) and
+ko (Korean) locales for @code{fontconfig}.")
     ;; GPLv2 with font embedding exception
     (license license:gpl2)))
 
@@ -585,12 +568,10 @@ Heros, Pagella, Schola, Termes.")
            (mkdir-p doc-dir)
            (chdir (string-append "AnonymousPro-" ,version ".001"))
            (for-each (lambda (ttf)
-                       (copy-file ttf
-                                  (string-append font-dir "/" ttf)))
+                       (install-file ttf font-dir))
                      (find-files "." "\\.ttf$"))
            (for-each (lambda (doc)
-                       (copy-file doc
-                                  (string-append doc-dir "/" doc)))
+                       (install-file doc doc-dir))
                      (find-files "." "\\.txt$"))))))
     (native-inputs
      `(("unzip" ,unzip)))
@@ -605,7 +586,7 @@ languages, plus Greek and Cyrillic.")
 (define-public font-gnu-unifont
   (package
     (name "font-gnu-unifont")
-    (version "9.0.02")
+    (version "9.0.06")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -613,7 +594,7 @@ languages, plus Greek and Cyrillic.")
                     version ".tar.gz"))
               (sha256
                (base32
-                "1ss6cp2bs8mzz3jqjbmmi877jfdb1jjcd29dvyk3i8qy7r0d44qm"))))
+                "0ybyraxi8pngibazfq4zlsqmg8kn5xlhvaiwnxb11znhfi61vi87"))))
     (build-system gnu-build-system)
     (outputs '("out" ; TrueType version
                "pcf" ; PCF (bitmap) version
@@ -625,9 +606,9 @@ languages, plus Greek and Cyrillic.")
        #:tests? #f          ; no check target
        #:phases
        (modify-phases %standard-phases
-         (replace 'configure
-                  (lambda _
-                    (setenv "CC" "gcc")))
+         (replace
+          'configure
+          (lambda _ (setenv "CC" "gcc") #t))
          (replace
           'install
           (lambda* (#:key outputs #:allow-other-keys)
@@ -688,21 +669,62 @@ utilities to ease adding new glyphs to the font.")
 
                      (mkdir-p font-dir)
                      (for-each (lambda (ttf)
-                                 (copy-file ttf
-                                            (string-append font-dir "/" ttf)))
+                                 (install-file ttf font-dir))
                                (find-files "." "\\.ttf$"))
                      (for-each (lambda (otf)
-                                 (copy-file otf
-                                            (string-append font-dir "/" otf)))
+                                 (install-file otf font-dir))
                                (find-files "." "\\.otf$"))))))
     (native-inputs `(("unzip" ,unzip)))
     (home-page "https://www.google.com/get/noto/")
-    (synopsis "Fonts aimed to cover all languages")
-    (description "Googe Noto Fonts is a family of fonts aimed to support all
-languages with a consistent look and aesthetic.  It's goal is to have no Unicode
-symbols unable to be displayed properly.")
+    (synopsis "Fonts to cover all languages")
+    (description "Google Noto Fonts is a family of fonts designed to support
+all languages with a consistent look and aesthetic.  Its goal is to properly
+display all Unicode symbols.")
     (license license:silofl1.1)))
 
+(define-public font-google-roboto
+  (package
+    (name "font-google-roboto")
+    (version "2.136")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/google/roboto/releases/download/"
+                           "v" version "/roboto-hinted.zip"))
+       (file-name (string-append name "-" version ".zip"))
+       (sha256
+        (base32
+         "0spscx08fad7i8qs7icns96iwcapniq8lwwqqvbf7bamvs8qfln4"))))
+    (native-inputs `(("unzip" ,unzip)))
+    (build-system trivial-build-system)
+    (arguments
+     `(#:modules ((guix build utils))
+       #:builder (begin
+                   (use-modules (guix build utils)
+                                (srfi srfi-26))
+
+                   (let ((PATH (string-append (assoc-ref %build-inputs
+                                                         "unzip")
+                                              "/bin"))
+                         (font-dir (string-append %output
+                                                  "/share/fonts/truetype")))
+                     (setenv "PATH" PATH)
+                     (system* "unzip" (assoc-ref %build-inputs "source"))
+
+                     (mkdir-p font-dir)
+                     (chdir "roboto-hinted")
+                     (for-each (lambda (ttf)
+                                 (copy-file ttf
+                                            (string-append font-dir "/" ttf)))
+                               (find-files "." "\\.ttf$"))))))
+    (home-page "https://github.com/google/roboto")
+    (synopsis "The Roboto family of fonts")
+    (description
+     "Roboto is Google’s signature family of fonts, the default font on Android
+and Chrome OS, and the recommended font for the
+visual language \"Material Design\".")
+    (license license:asl2.0)))
+
 (define-public font-un
   (package
     (name "font-un")
@@ -735,14 +757,10 @@ symbols unable to be displayed properly.")
            (mkdir-p doc-dir)
            (chdir (string-append "un-fonts"))
            (for-each (lambda (ttf)
-                       (copy-file ttf
-                                  (string-append font-dir "/"
-                                                 (basename ttf))))
+                       (install-file ttf font-dir))
                      (find-files "." "\\.ttf$"))
            (for-each (lambda (doc)
-                       (copy-file doc
-                                  (string-append doc-dir "/"
-                                                 (basename doc))))
+                       (install-file doc doc-dir))
                      '("COPYING" "README"))))))
     (native-inputs
      `(("tar" ,tar)
@@ -840,18 +858,17 @@ glyph designs, not just an added slant.")
 
                      (mkdir-p font-dir)
                      (for-each (lambda (ttf)
-                                 (copy-file ttf
-                                            (string-append font-dir "/" ttf)))
+                                 (install-file ttf font-dir))
                                (find-files "." "\\.ttf$"))))))
     (native-inputs
      `(("source" ,source)
        ("unzip" ,unzip)))
     (home-page "https://sourcefoundry.org/hack/")
-    (synopsis "Typeface designed for sourcecode")
+    (synopsis "Typeface designed for source code")
     (description
-     "Hack is designed to be a workhorse typeface for code, it expands upon
-the Bitstream Vera & DejaVu projects, provides 1561 glyphs including
-powerline support.")
+     "Hack is designed to be a workhorse typeface for code.  It expands upon
+the Bitstream Vera & DejaVu projects, provides 1561 glyphs, and includes
+Powerline support.")
     (license (license:x11-style
               "https://github.com/chrissimpkins/Hack/blob/master/LICENSE.md"
               "Hack Open Font License v2.0"))))
diff --git a/gnu/packages/fpga.scm b/gnu/packages/fpga.scm
index bb199096dc..f65eae8673 100644
--- a/gnu/packages/fpga.scm
+++ b/gnu/packages/fpga.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2016 Danny Milosavljevic <dannym@scratchpost.org>
+;;; Copyright © 2016 Theodoros Foradis <theodoros.for@openmailbox.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -31,7 +32,9 @@
   #:use-module (gnu packages bison)
   #:use-module (gnu packages flex)
   #:use-module (gnu packages gtk)
+  #:use-module (gnu packages graphviz)
   #:use-module (gnu packages libffi)
+  #:use-module (gnu packages linux)
   #:use-module (gnu packages zip)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages ghostscript)
@@ -114,7 +117,7 @@ For synthesis, the compiler generates netlists in the desired format.")
 (define-public yosys
   (package
     (name "yosys")
-    (version "0.6")
+    (version "0.7")
     (source (origin
               (method url-fetch)
               (uri
@@ -122,7 +125,7 @@ For synthesis, the compiler generates netlists in the desired format.")
                               name "-" version ".tar.gz"))
               (sha256
                 (base32
-                   "02j0c0m9dfyjccynalf0aggj6gy20k7iphpkg5cn6sdirlkv8gmx"))
+                   "0vkfdn4phvkjqlnpqlr6q5f97bgjc3312vj5jf0vf85zqv88dy9x"))
               (file-name (string-append name "-" version "-checkout.tar.gz"))
               (modules '((guix build utils)))
               (snippet
@@ -136,6 +139,13 @@ For synthesis, the compiler generates netlists in the desired format.")
                           (string-append "PREFIX=" %output))
        #:phases
        (modify-phases %standard-phases
+         (add-before 'configure 'fix-paths
+           (lambda _
+             (substitute* "./passes/cmds/show.cc"
+               (("exec xdot") (string-append "exec " (which "xdot")))
+               (("dot -") (string-append (which "dot") " -"))
+               (("fuser") (which "fuser")))
+             #t))
          (replace 'configure
            (lambda* (#:key inputs (make-flags '()) #:allow-other-keys)
              (zero? (apply system* "make" "config-gcc" make-flags))))
@@ -172,7 +182,6 @@ For synthesis, the compiler generates netlists in the desired format.")
                         (("iverilog_bin=\".*\"") (string-append "iverilog_bin=\""
                                                                 iverilog "\"")))
                      #t))))))
-    ;; TODO add xdot [patch the path to it here] as soon as I find out where it is.
     (native-inputs
      `(("pkg-config" ,pkg-config)
        ("python" ,python)
@@ -185,6 +194,9 @@ For synthesis, the compiler generates netlists in the desired format.")
      `(("tcl" ,tcl)
        ("readline" ,readline)
        ("libffi" ,libffi)
+       ("graphviz" ,graphviz)
+       ("psmisc" ,psmisc)
+       ("xdot" ,xdot)
        ("abc" ,abc)))
     (home-page "http://www.clifford.at/yosys/")
     (synopsis "FPGA Verilog RTL synthesizer")
diff --git a/gnu/packages/freedesktop.scm b/gnu/packages/freedesktop.scm
index 37707796e4..66060eaa64 100644
--- a/gnu/packages/freedesktop.scm
+++ b/gnu/packages/freedesktop.scm
@@ -2,7 +2,7 @@
 ;;; Copyright © 2015 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com>
 ;;; Copyright © 2015 Andy Wingo <wingo@pobox.com>
-;;; Copyright © 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2015 David Hashe <david.hashe@dhashe.com>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
@@ -42,11 +42,13 @@
   #:use-module (gnu packages gl)
   #:use-module (gnu packages glib)                ;intltool
   #:use-module (gnu packages gnome)
+  #:use-module (gnu packages gnuzilla)
   #:use-module (gnu packages gperf)
   #:use-module (gnu packages graphviz)
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages libffi)
   #:use-module (gnu packages libunwind)
+  #:use-module (gnu packages libusb)
   #:use-module (gnu packages linux)
   #:use-module (gnu packages m4)
   #:use-module (gnu packages polkit)
@@ -85,14 +87,14 @@ freedesktop.org project.")
 (define-public libinput
   (package
     (name "libinput")
-    (version "1.5.1")
+    (version "1.5.3")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://freedesktop.org/software/libinput/"
                                   name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1n1dispg63z1qiy8c1af3l9c4a9dks8y7xasff8xcywnn0rkkxnl"))))
+                "1qx623nyr49sxv49ilb0j85skgk1dhkr82vd577ywyjf7d96q84i"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("cairo" ,cairo)
@@ -211,7 +213,8 @@ the freedesktop.org XDG Base Directory specification.")
        ("shepherd" ,shepherd)                ;for 'halt' and 'reboot', invoked
                                              ;when pressing the power button
        ("dbus" ,dbus)
-       ("eudev" ,eudev)))
+       ("eudev" ,eudev)
+       ("acl" ,acl)))           ;to add individual users to ACLs on /dev nodes
     (home-page "https://github.com/wingo/elogind")
     (synopsis "User, seat, and session management service")
     (description "Elogind is the systemd project's \"logind\" service,
@@ -804,3 +807,77 @@ share connections to real-time communication services without conflicting.")
 useful for both applications which need colour management and applications that
 wish to perform colour calibration.")
     (license license:lgpl2.1+)))
+
+(define-public libfprint
+  (package
+    (name "libfprint")
+    (version "0.6.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://people.freedesktop.org/~hadess/"
+                                  name "-" version ".tar.xz"))
+              (sha256
+               (base32
+                "1giwh2z63mn45galsjb59rhyrvgwcy01hvvp4g01iaa2snvzr0r5"))))
+    (build-system gnu-build-system)
+    (arguments
+     '(#:configure-flags (list (string-append "--with-udev-rules-dir="
+                                              (assoc-ref %outputs "out")
+                                              "/lib/udev/rules.d"))))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (inputs
+     `(("libusb" ,libusb)
+       ("nss" ,nss)
+       ("glib" ,glib)
+       ("eudev" ,eudev)
+       ("pixman" ,pixman)))
+    (home-page "https://www.freedesktop.org/wiki/Software/fprint/libfprint/")
+    (synopsis "Library to access fingerprint readers")
+    (description
+     "libfprint is a library designed to make it easy for application
+developers to add support for consumer fingerprint readers to their
+software.")
+    (license license:lgpl2.1+)))
+
+(define-public fprintd
+  (package
+    (name "fprintd")
+    (version "0.7.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://people.freedesktop.org/~hadess/fprintd-"
+                    version ".tar.xz"))
+              (sha256
+               (base32
+                "05915i0bv7q62fqrs5diqwr8dz3pwqa1c1ivcgggkjyw0xk4ldp5"))))
+    (build-system gnu-build-system)
+    (arguments
+     '(#:phases (modify-phases %standard-phases
+                  (add-before 'build 'set-sysconfdir
+                    (lambda* (#:key outputs #:allow-other-keys)
+                      ;; Work around a bug whereby the 'SYSCONFDIR' macro
+                      ;; expands literally to '${prefix}/etc'.
+                      (let ((out (assoc-ref outputs "out")))
+                        (substitute* "src/main.c"
+                          (("SYSCONFDIR, \"fprintd.conf\"")
+                           (string-append "\"" out "/etc\", "
+                                          "\"fprintd.conf\"")))
+                        #t))))))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)
+       ("intltool" ,intltool)))
+    (inputs
+     `(("libfprint" ,libfprint)
+       ("dbus-glib" ,dbus-glib)
+       ("polkit" ,polkit)
+       ("linux-pam" ,linux-pam)))                 ;for pam_fprintd
+    (home-page "https://www.freedesktop.org/wiki/Software/fprint/fprintd/")
+    (synopsis "D-Bus daemon that exposes fingerprint reader functionality")
+    (description
+     "fprintd is a D-Bus daemon that offers functionality of libfprint, a
+library to access fingerprint readers, over the D-Bus interprocess
+communication bus.  This daemon layer above libfprint solves problems related
+to applications simultaneously competing for fingerprint readers.")
+    (license license:gpl2+)))
diff --git a/gnu/packages/game-development.scm b/gnu/packages/game-development.scm
index e83294d9c4..619c2f1bc2 100644
--- a/gnu/packages/game-development.scm
+++ b/gnu/packages/game-development.scm
@@ -140,7 +140,7 @@ provide connectivity for client applications written in any language.")
 (define-public tiled
   (package
     (name "tiled")
-    (version "0.17.0")
+    (version "0.18.0")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/bjorn/tiled/archive/v"
@@ -148,7 +148,7 @@ provide connectivity for client applications written in any language.")
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "0c9gykxmq0sk0yyfdq81g9psd922scqzn5asskjydj84d80f5z7p"))))
+                "0csrwf7k3fxv6bv580w6wxjk1q2j9mj9k0xba3nb1ms6jiz1bvzk"))))
     (build-system gnu-build-system)
     (inputs `(("qt" ,qt)
               ("zlib" ,zlib)))
diff --git a/gnu/packages/games.scm b/gnu/packages/games.scm
index 8b1d80dda7..c449f59549 100644
--- a/gnu/packages/games.scm
+++ b/gnu/packages/games.scm
@@ -649,7 +649,7 @@ match, cannon keep, and grave-itation pit.")
 (define minetest-data
   (package
     (name "minetest-data")
-    (version "0.4.14")
+    (version "0.4.15")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -658,7 +658,7 @@ match, cannon keep, and grave-itation pit.")
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "11fzdh4icx2yvjfz1skdql0d0wxpzdr006k993v33x72s0q2ig7f"))))
+                "12kxklcd1b5n0f369zf3xxhvkrizxj4d9xv0dh8crfqiymaym0zm"))))
     (build-system trivial-build-system)
     (native-inputs
      `(("source" ,source)
@@ -690,7 +690,7 @@ match, cannon keep, and grave-itation pit.")
 (define-public minetest
   (package
     (name "minetest")
-    (version "0.4.14")
+    (version "0.4.15")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -699,7 +699,7 @@ match, cannon keep, and grave-itation pit.")
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "0m3hhk5icx4y4gd970z7ya2013fq4vvqbjljmck62ik03baf8g90"))))
+                "1ag3jcj7kpq3ph12zirk1c0mj9i0g50wmw932f8gi11liq8yd12n"))))
     (build-system cmake-build-system)
     (arguments
      '(#:configure-flags
@@ -968,7 +968,7 @@ Collect herrings and other goodies while sliding down the hill, but avoid fish
 bones.
 
 This game is based on the GPL version of the famous game TuxRacer.")
-    (home-page "http://sourceforge.net/projects/extremetuxracer/")
+    (home-page "https://sourceforge.net/projects/extremetuxracer/")
     (license license:gpl2+)))
 
 (define-public supertuxkart
@@ -1254,7 +1254,7 @@ is programmed in Haskell.")
 (define-public manaplus
   (package
     (name "manaplus")
-    (version "1.6.8.14")
+    (version "1.6.12.24")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1262,7 +1262,7 @@ is programmed in Haskell.")
                     version "/manaplus-" version ".tar.xz"))
               (sha256
                (base32
-                "1mah4w6ng0j76cjzbw8y9m2ds5f1w5ka9b1k3gzgvxh4yaphqnff"))))
+                "1g64pid26vcv1ay002bzz6ymabwrmy3wmklywpcgpvrhynm6f2cq"))))
     (build-system gnu-build-system)
     (arguments
      '(#:configure-flags
@@ -2753,7 +2753,7 @@ with the \"Stamp\" tool within Tux Paint.")
 (define-public supertux
   (package
    (name "supertux")
-   (version "0.5.0")
+   (version "0.5.1")
    (source (origin
             (method url-fetch)
             (uri (string-append "https://github.com/SuperTux/supertux/"
@@ -2761,7 +2761,7 @@ with the \"Stamp\" tool within Tux Paint.")
                                 version "-Source.tar.gz"))
             (sha256
              (base32
-              "0fx7c7m6mfanqy7kln7yf6abb5l3r68picf32js2yls11jj0vbng"))))
+              "1i8avad7w7ikj870z519j383ldy29r6f956bs38cbr8wk513pp69"))))
    (arguments
     '(#:tests? #f
       #:configure-flags '("-DINSTALL_SUBDIR_BIN=bin"
diff --git a/gnu/packages/gcc.scm b/gnu/packages/gcc.scm
index 72e2309c33..cfd33f85ab 100644
--- a/gnu/packages/gcc.scm
+++ b/gnu/packages/gcc.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2014, 2015, 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2015 Andreas Enge <andreas@enge.fr>
@@ -364,14 +364,14 @@ Go.  It also includes runtime support libraries for these languages.")
 (define-public gcc-6
   (package
     (inherit gcc-5)
-    (version "6.2.0")
+    (version "6.3.0")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://gnu/gcc/gcc-"
                                   version "/gcc-" version ".tar.bz2"))
               (sha256
                (base32
-                "1idpf43988v1a6i8lw9ak1r7igcfg1bm5kn011iydlr2qygmhi4r"))
+                "17xjz30jb65hcf714vn9gcxvrrji8j20xm7n33qg1ywhyzryfsph"))
               (patches (search-patches "gcc-strmov-store-file-names.patch"
                                        "gcc-5.0-libvtv-runpath.patch"))))))
 
@@ -494,8 +494,11 @@ as the 'native-search-paths' field."
               %generic-search-paths))
 
 (define-public gfortran
-  (custom-gcc gcc "gfortran" '("fortran")
-              %generic-search-paths))
+  ;; Note: Update this when GCC changes!  We cannot use
+  ;; (custom-gcc gcc "fortran" …) because that would lead to a package object
+  ;; that is not 'eq?' with GFORTRAN-4.9, and thus 'fold-packages' would
+  ;; report two gfortran@4.9 that are in fact identical.
+  gfortran-4.9)
 
 (define-public gfortran-5
   (custom-gcc gcc-5 "gfortran" '("fortran")
diff --git a/gnu/packages/ghostscript.scm b/gnu/packages/ghostscript.scm
index b254b80782..46b8c51299 100644
--- a/gnu/packages/ghostscript.scm
+++ b/gnu/packages/ghostscript.scm
@@ -293,7 +293,7 @@ architecture.")
     "Ghostscript fonts provides fonts and font metrics customarily distributed with
 Ghostscript.  It currently includes the 35 standard PostScript fonts.")
    (license license:gpl2)
-   (home-page "http://sourceforge.net/projects/gs-fonts/")))
+   (home-page "https://sourceforge.net/projects/gs-fonts/")))
 
 (define-public libspectre
   (package
diff --git a/gnu/packages/gimp.scm b/gnu/packages/gimp.scm
index 6540990b36..169183db62 100644
--- a/gnu/packages/gimp.scm
+++ b/gnu/packages/gimp.scm
@@ -35,6 +35,7 @@
   #:use-module (gnu packages ghostscript)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages xml)
+  #:use-module (gnu packages pdf)
   #:use-module (gnu packages photo)
   #:use-module (gnu packages python)
   #:use-module (gnu packages xorg)
@@ -168,6 +169,7 @@ buffers.")
        ("exif" ,libexif)                         ;optional, EXIF + XMP support
        ("lcms" ,lcms)                            ;optional, color management
        ("librsvg" ,librsvg)                      ;optional, SVG support
+       ("poppler", poppler)             ; optional, PDF support
        ("python" ,python-2)                      ;optional, Python support
        ("python2-pygtk" ,python2-pygtk)          ;optional, Python support
        ("gegl" ,gegl)))
diff --git a/gnu/packages/gl.scm b/gnu/packages/gl.scm
index 0e9b5ddb5f..9a484b7126 100644
--- a/gnu/packages/gl.scm
+++ b/gnu/packages/gl.scm
@@ -5,6 +5,7 @@
 ;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is>
 ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2016 David Thompson <davet@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -249,6 +250,9 @@ also known as DXTn or DXTC) for Mesa.")
          "--enable-gles2"
          "--enable-gbm"
          "--enable-shared-glapi"
+         ;; Without floating point texture support, drivers such as Nouveau
+         ;; are stuck at OpenGL 2.1 instead of OpenGL 3.0+.
+         "--enable-texture-float"
 
          ;; on non-intel systems, drop i915 and i965
          ;; from the default dri drivers
diff --git a/gnu/packages/gnome.scm b/gnu/packages/gnome.scm
index 1762381cf0..2d97f228f1 100644
--- a/gnu/packages/gnome.scm
+++ b/gnu/packages/gnome.scm
@@ -2648,9 +2648,7 @@ services for numerous locations.")
          "1rvqisrh3lridsb8rvm7spvncyq206ly0245zgpbm8swi5fhfjp8"))))
     (build-system glib-or-gtk-build-system)
     (arguments
-     `(;; Network manager not yet packaged.
-       #:configure-flags '("--disable-network-manager")
-       ;; Color management test can't reach the colord system service.
+     `(;; Color management test can't reach the colord system service.
        #:tests? #f))
     (native-inputs
      `(("pkg-config" ,pkg-config)
@@ -2679,7 +2677,8 @@ services for numerous locations.")
        ("gsettings-desktop-schemas" ,gsettings-desktop-schemas)
        ("libwacom" ,libwacom)
        ("librsvg" ,librsvg)
-       ("xf86-input-wacom" ,xf86-input-wacom)))
+       ("xf86-input-wacom" ,xf86-input-wacom)
+       ("network-manager" ,network-manager)))
     (home-page "http://www.gnome.org")
     (synopsis "GNOME settings daemon")
     (description
@@ -3867,7 +3866,7 @@ metadata in photo and video files of various formats.")
 (define-public shotwell
   (package
     (name "shotwell")
-    (version "0.25.0.1")
+    (version "0.25.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://gnome/sources/" name "/"
@@ -3875,7 +3874,7 @@ metadata in photo and video files of various formats.")
                                   name "-" version ".tar.xz"))
               (sha256
                (base32
-                "19h0ckrgv0c6sj85m6ankyqkmy453ph9kq6zhf7ys2k5xsrrd776"))))
+                "1bih5hr3pvpkx3fck55bnhngn4fl92ryjizc34wb8pwigbkxnaj1"))))
     (build-system glib-or-gtk-build-system)
     (propagated-inputs
      `(("dconf" ,dconf)))
@@ -4399,7 +4398,19 @@ users.")
                                   "NetworkManager-" version ".tar.xz"))
               (sha256
                (base32
-                "016jc21mwjxvnfiblp5lji55sr8aq6w8a08fsjmqvnpnvm3y6r58"))))
+                "016jc21mwjxvnfiblp5lji55sr8aq6w8a08fsjmqvnpnvm3y6r58"))
+              (snippet
+              '(begin
+                 (use-modules (guix build utils))
+                 (substitute* "configure"
+                   ;; Replace libsystemd-login with libelogind.
+                   (("libsystemd-login") "libelogind"))
+                 (substitute* "src/devices/wwan/nm-modem-manager.c"
+                   (("systemd") "elogind"))
+                 (substitute* "src/nm-session-monitor.c"
+                   (("systemd") "elogind"))
+                 (substitute* "./src/nm-logging.c"
+                   (("systemd") "elogind"))))))
     (build-system gnu-build-system)
     (outputs '("out"
                "doc")) ; 8 MiB of gtk-doc HTML
@@ -4409,7 +4420,9 @@ users.")
              (doc      (assoc-ref %outputs "doc"))
              (dhclient (string-append (assoc-ref %build-inputs "isc-dhcp")
                                       "/sbin/dhclient")))
-         (list "--with-crypto=gnutls"
+         (list "--with-systemd-logind=yes" ;In GuixSD, this is provided by elogind.
+               "--with-consolekit=no"
+               "--with-crypto=gnutls"
                "--disable-config-plugin-ibft"
                "--sysconfdir=/etc"
                "--localstatedir=/var"
@@ -4474,7 +4487,8 @@ users.")
        ("polkit" ,polkit)
        ("ppp" ,ppp)
        ("readline" ,readline)
-       ("util-linux" ,util-linux)))
+       ("util-linux" ,util-linux)
+       ("elogind" ,elogind)))
     (synopsis "Network connection manager")
     (home-page "http://www.gnome.org/projects/NetworkManager/")
     (description
@@ -5274,13 +5288,20 @@ existing databases over the internet.")
               (sha256
                (base32
                 "1fj6wjvnjygzm9br3sw9gya6d18yly1rm69yaiar9spfbkvv4wai"))))
-    (build-system gnu-build-system)
+    (build-system glib-or-gtk-build-system)
     (arguments
      `(#:configure-flags '("--localstatedir=/tmp"
                            "--sysconfdir=/tmp")
        #:imported-modules ((guix build python-build-system)
-                           ,@%gnu-build-system-modules)
+                           ,@%glib-or-gtk-build-system-modules)
        #:phases (modify-phases %standard-phases
+                  (add-after 'install 'wrap-program
+                    (lambda* (#:key outputs #:allow-other-keys)
+                      (let ((out               (assoc-ref outputs "out"))
+                            (gi-typelib-path   (getenv "GI_TYPELIB_PATH")))
+                        (wrap-program (string-append out "/bin/gnome-tweak-tool")
+                          `("GI_TYPELIB_PATH" ":" prefix (,gi-typelib-path))))
+                      #t))
                   (add-after 'install 'wrap
                     (@@ (guix build python-build-system) wrap)))))
     (native-inputs
@@ -5288,9 +5309,10 @@ existing databases over the internet.")
        ("pkg-config" ,pkg-config)))
     (inputs
      `(("python" ,python-2)
-       ("python2-pygobject" ,python2-pygobject)))
-    (propagated-inputs
-     `(("libnotify" ,libnotify)
+       ("python2-pygobject" ,python2-pygobject)
+       ("gnome-desktop" ,gnome-desktop)
+       ("libsoup" ,libsoup)
+       ("libnotify" ,libnotify)
        ("gobject-introspection" ,gobject-introspection)
        ("gsettings-desktop-schemas" ,gsettings-desktop-schemas)
        ("gtk+" ,gtk+)))
@@ -5333,7 +5355,7 @@ functionality and behavior.")
 (define-public arc-theme
   (package
     (name "arc-theme")
-    (version "20160605")
+    (version "20161119")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/horst3180/arc-theme"
@@ -5341,7 +5363,7 @@ functionality and behavior.")
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "0sq2031xda8jn2ws0x2bvhq77jfh7xy0c3kg86v6vm2kbrrss7y6"))))
+                "1kbhaxmydyip3vdw4kf8rk776jcd9wf0w7z6h2i4naxdn4rsnw54"))))
     (build-system gnu-build-system)
     (arguments
      '(#:phases
diff --git a/gnu/packages/gnucash.scm b/gnu/packages/gnucash.scm
index 97a4818be3..83096d66e0 100644
--- a/gnu/packages/gnucash.scm
+++ b/gnu/packages/gnucash.scm
@@ -122,8 +122,7 @@ financial calculations or scheduled transactions.")
      (origin
        (method url-fetch)
        (uri (string-append "http://www.aquamaniac.de/sites/download/download.php?"
-                           "package=01&release=201&file=01&dummy=gwenhywfar-"
-                           version ".tar.gz"))
+                           "package=01&release=201&file=01"))
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
         (base32
@@ -157,17 +156,16 @@ applications and libraries.  It is used by AqBanking.")
 (define-public aqbanking
   (package
     (name "aqbanking")
-    (version "5.6.10")
+    (version "5.6.12")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "http://www.aquamaniac.de/sites/download/download.php?"
-                           "package=03&release=206&file=01&dummy=aqbanking-"
-                           version ".tar.gz"))
+                           "package=03&release=208&file=01"))
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
         (base32
-         "1x0isvpk43rq2zlyyb9p0kgjmqv7yq07vgkiprw3f5sjkykvxw6d"))))
+         "08jbwmiv6f3v8iqdr44x4szna496fqcjfi6mlx04cnbx91m70lh6"))))
     (build-system gnu-build-system)
     (arguments
      `(;; Parallel building fails because aqhbci is required before it's
diff --git a/gnu/packages/gnunet.scm b/gnu/packages/gnunet.scm
index 5d1baa834e..27e1ffb4e0 100644
--- a/gnu/packages/gnunet.scm
+++ b/gnu/packages/gnunet.scm
@@ -5,7 +5,7 @@
 ;;; Copyright © 2015 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016 Mark H Weaver <mhw@netris.org>
-;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is>
+;;; Copyright © 2016 ng0 <ng0@libertad.pw>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -162,7 +162,7 @@ and support for SSL3 and TLS.")
 (define-public gnurl
   (package
    (name "gnurl")
-   (version "7.51.0")
+   (version "7.52.1")
    (source (origin
             (method url-fetch)
             (uri (let ((version-with-underscores
@@ -171,13 +171,18 @@ and support for SSL3 and TLS.")
                                   name "-" version-with-underscores ".tar.bz2")))
             (sha256
              (base32
-              "1rgl4agrzghvyfz1afk1p5ryq4b9cz28lavx8ikrav6aiv9h00ig"))))
+              "1gn6mvab2vhfj9637ykg1zjzb23fngfnyd24wlgxmjhf49pn334h"))))
    (build-system gnu-build-system)
+   (outputs '("out"
+              "doc"))                             ; 1.5 MiB of man3 pages
    (inputs `(("gnutls" ,gnutls)
              ("libidn" ,libidn)
              ("zlib" ,zlib)))
    (native-inputs
-    `(("groff" ,groff)
+    `(("autoconf" ,autoconf)
+      ("automake" ,automake)
+      ("libtool" ,libtool)
+      ("groff" ,groff)
       ("perl" ,perl)
       ("pkg-config" ,pkg-config)
       ("python" ,python-2)))
@@ -198,10 +203,30 @@ and support for SSL3 and TLS.")
       #:phases
       ;; We have to patch runtests.pl in tests/ directory
       (modify-phases %standard-phases
-        (add-before 'check 'patch-runtests
+        (add-after 'install 'move-man3-pages
+          (lambda* (#:key outputs #:allow-other-keys)
+            ;; Move section 3 man pages to "doc".
+            (let ((out (assoc-ref outputs "out"))
+                  (doc (assoc-ref outputs "doc")))
+              (mkdir-p (string-append doc "/share/man"))
+              (rename-file (string-append out "/share/man/man3")
+                           (string-append doc "/share/man/man3"))
+              #t)))
+        (add-before 'configure 'autoconf
+          ;; Clear artifacts left (shebangs) from release preparation.
+          (lambda _
+            (zero? (system* "./buildconf"))))
+        (replace 'check
           (lambda _
+            ;; It is unclear why test1026 fails, however the content of it
+            ;; suggests that it is not vital for gnurl.
+            (delete-file "tests/data/test1026")
+
             (substitute* "tests/runtests.pl"
               (("/bin/sh") (which "sh")))
+
+            ;; Make test output more verbose.
+            (zero? (system* "make" "-C" "tests" "test"))
             #t)))))
    (synopsis "Microfork of cURL with support for the HTTP/HTTPS/GnuTLS subset of cURL")
    (description
diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm
index 1e9d814889..dc801a6a4f 100644
--- a/gnu/packages/gnupg.scm
+++ b/gnu/packages/gnupg.scm
@@ -10,6 +10,8 @@
 ;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is>
 ;;; Copyright © 2016 Christopher Baines <mail@cbaines.net>
 ;;; Copyright © 2016 Mike Gerwitz <mtg@gnu.org>
+;;; Copyright © 2016 Troy Sankey <sankeytms@gmail.com>
+;;; Copyright © 2017 Leo Famulari <leo@famulari.name>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -45,9 +47,11 @@
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages ncurses)
   #:use-module (gnu packages security-token)
+  #:use-module (gnu packages swig)
   #:use-module (gnu packages tls)
   #:use-module (guix packages)
   #:use-module (guix download)
+  #:use-module (guix git-download)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system python))
 
@@ -188,7 +192,7 @@ specifications are building blocks of S/MIME and TLS.")
 (define-public npth
   (package
     (name "npth")
-    (version "1.2")
+    (version "1.3")
     (source
      (origin
       (method url-fetch)
@@ -197,7 +201,7 @@ specifications are building blocks of S/MIME and TLS.")
             version ".tar.bz2"))
       (sha256
        (base32
-        "12n0nvhw4fzwp0k7gjv3rc6pdml0qiinbbfiz4ilg6pl5kdxvnvd"))))
+        "0am86vblapwz84254qpmhz0chk70g6qzh3wdxcs0gvba8d01ka5w"))))
     (build-system gnu-build-system)
     (home-page "https://www.gnupg.org")
     (synopsis "Non-preemptive thread library")
@@ -213,20 +217,23 @@ compatible to GNU Pth.")
 (define-public gnupg
   (package
     (name "gnupg")
-    (version "2.1.16")
+    (version "2.1.17")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://gnupg/gnupg/gnupg-" version
                                   ".tar.bz2"))
               (sha256
                (base32
-                "0i483m9q032a0s50f1izb213g4h5i7pcgn395m6hvl3sg2kadfa9"))))
+                "1js308b46ifx1gim0c9nivr5yxhans7iq1yvkf7zl2928gdm9p65"))
+              (patches
+               ;; This fixes a test failure on 32bit. Remove for next version.
+               ;; https://lists.gnu.org/archive/html/guix-devel/2016-12/msg00869.html
+               (search-patches "gnupg-test-segfault-on-32bit-arch.patch"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)))
     (inputs
-     `(("adns" ,adns)
-       ("bzip2" ,bzip2)
+     `(("bzip2" ,bzip2)
        ("curl" ,curl)
        ("gnutls" ,gnutls)
        ("libassuan" ,libassuan)
@@ -347,7 +354,7 @@ libskba (working with X.509 certificates and CMS data).")
 (define-public gpgme
   (package
     (name "gpgme")
-    (version "1.6.0")
+    (version "1.8.0")
     (source
      (origin
       (method url-fetch)
@@ -355,7 +362,7 @@ libskba (working with X.509 certificates and CMS data).")
                           ".tar.bz2"))
       (sha256
        (base32
-        "17892sclz3yg45wbyqqrzzpq3l0icbnfl28f101b3062g8cy97dh"))))
+        "0csx3qnycwm0n90ql6gs65if5xi4gqyzzy21fxs2xqicghjrfq2r"))))
     (build-system gnu-build-system)
     (propagated-inputs
      ;; Needs to be propagated because gpgme.h includes gpg-error.h.
@@ -363,7 +370,15 @@ libskba (working with X.509 certificates and CMS data).")
     (inputs
      `(("gnupg" ,gnupg-2.0)
        ("libassuan" ,libassuan)))
-    (arguments '(#:make-flags '("GPG=gpg2")))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'configure 'patch-cmake-file
+           (lambda _
+             ;; Work around <https://bugs.gnupg.org/gnupg/issue2877>.
+             (substitute* "lang/cpp/src/GpgmeppConfig.cmake.in"
+               (("@libsuffix@") ".so"))
+             #t)))))
     (home-page "https://www.gnupg.org/related_software/gpgme/")
     (synopsis "Library providing simplified access to GnuPG functionality")
     (description
@@ -378,6 +393,33 @@ instead.  This way bug fixes or improvements can be done at a central place
 and every application benefits from this.")
     (license license:lgpl2.1+)))
 
+(define-public python-gpg
+  (package
+    (name "python-gpg")
+    (version (package-version gpgme))
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "gpg" version))
+              (sha256
+               (base32
+                "1x74i6q713c0bckls7rdm8kgsmllf9qvy9x62jghszlhgjkyh9nd"))))
+    (build-system python-build-system)
+    (arguments
+     '(#:tests? #f)) ; No test suite.
+    (inputs
+     `(("gpgme" ,gpgme)))
+    (native-inputs
+     `(("swig" ,swig)))
+    (home-page (package-home-page gpgme))
+    (synopsis "Python bindings for GPGME GnuPG cryptography library")
+    (description "This package provides Python bindings to the GPGME GnuPG
+cryptographic library.  It is developed in the GPGME source code, and then
+distributed separately.")
+    (license license:lgpl2.1+)))
+
+(define-public python2-gpg
+  (package-with-python2 python-gpg))
+
 (define-public python-pygpgme
   (package
     (name "python-pygpgme")
@@ -392,7 +434,8 @@ and every application benefits from this.")
        ;; Unfortunately, we have to disable some tests due to some gpg-agent
        ;; goofiness... see:
        ;;   https://bugs.launchpad.net/pygpgme/+bug/999949
-       (patches (search-patches "pygpgme-disable-problematic-tests.patch"))))
+       (patches (search-patches "pygpgme-disable-problematic-tests.patch"
+                                "python-pygpgme-fix-pinentry-tests.patch"))))
     (arguments
      `(#:phases
        (modify-phases %standard-phases
@@ -457,35 +500,43 @@ and signature functionality from Python programs.")
   (package-with-python2 python-gnupg))
 
 (define-public pius
-  (package
-   (name "pius")
-   (version "2.2.2")
-   (source (origin
-            (method url-fetch)
-            (uri (string-append
-                  "https://github.com/jaymzh/pius/releases/download/v"
-                  version "/pius-" version ".tar.bz2"))
-            (sha256
-             (base32
-              "0k94mlr7l12mplph7pdgjbampqha47d8mfjq69n4xm80qwbn1rq1"))))
-   (build-system python-build-system)
-   (inputs `(("perl" ,perl)                ;for 'pius-party-worksheet'
-             ("gpg" ,gnupg-2.0)))          ;2.1 fails to talk to gpg-agent 2.0
-   (arguments
-    `(#:tests? #f
-      #:python ,python-2                     ;uses the Python 2 'print' syntax
-      #:phases
-      (modify-phases %standard-phases
-        (add-before
-         'build 'set-gpg-file-name
-         (lambda* (#:key inputs outputs #:allow-other-keys)
-           (let* ((gpg (string-append (assoc-ref inputs "gpg")
-                                      "/bin/gpg")))
-             (substitute* "libpius/constants.py"
-               (("/usr/bin/gpg2") gpg))))))))
-   (synopsis "Programs to simplify GnuPG key signing")
-   (description
-    "Pius (PGP Individual UID Signer) helps attendees of PGP keysigning
+  ;; pius 2.2.2 does not work with gpg-agent 2.1, so we take a newer
+  ;; commit.  When a new pius (> 2.2.2) is released, update this package
+  ;; and delete this message.
+  ;; More info: https://github.com/jaymzh/pius/issues/46
+  (let ((commit "891687ccb3d232a1fc0e7da7d22572c0318644cb")
+        (base-version "2.2.2"))     ; i.e. there were no releases
+                                    ; between BASE-VERSION and COMMIT
+    (package
+     (name "pius")
+     (version (string-append base-version "-0."
+                             (string-take commit 7)))
+     (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/jaymzh/pius.git")
+                    (commit commit)))
+              (sha256
+               (base32
+                "0m2na4bnf1rv0zpf404l9ga6pwyf7ijldp4lw5irgh7gkmpllxr3"))))
+     (build-system python-build-system)
+     (inputs `(("perl" ,perl)                ;for 'pius-party-worksheet'
+               ("gpg" ,gnupg)))
+     (arguments
+      `(#:tests? #f
+        #:python ,python-2                     ;uses the Python 2 'print' syntax
+        #:phases
+        (modify-phases %standard-phases
+          (add-before
+           'build 'set-gpg-file-name
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let* ((gpg (string-append (assoc-ref inputs "gpg")
+                                        "/bin/gpg")))
+               (substitute* "libpius/constants.py"
+                 (("/usr/bin/gpg2") gpg))))))))
+     (synopsis "Programs to simplify GnuPG key signing")
+     (description
+      "Pius (PGP Individual UID Signer) helps attendees of PGP keysigning
 parties.  It is the main utility and makes it possible to quickly and easily
 sign each UID on a set of PGP keys.  It is designed to take the pain out of
 the sign-all-the-keys part of PGP Keysigning Party while adding security
@@ -493,8 +544,8 @@ to the process.
 
 pius-keyring-mgr and pius-party-worksheet help organisers of
 PGP keysigning parties.")
-   (license license:gpl2)
-   (home-page "https://www.phildev.net/pius/index.shtml")))
+     (license license:gpl2)
+     (home-page "https://www.phildev.net/pius/index.shtml"))))
 
 (define-public signing-party
   (package
@@ -585,14 +636,14 @@ including tools for signing keys, keyring analysis, and party preparation.
 (define-public pinentry-tty
   (package
     (name "pinentry-tty")
-    (version "0.9.7")
+    (version "1.0.0")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://gnupg/pinentry/pinentry-"
                                   version ".tar.bz2"))
               (sha256
                (base32
-                "1cp7wjqr6nx31mdclr61s2h84ijqjl0ph99kgj4vyawpjj1j1633"))))
+                "0ni7g4plq6x78p32al7m8h2zsakvg1rhfz0qbc3kdc7yq7nw4whn"))))
     (build-system gnu-build-system)
     (arguments
      `(#:configure-flags '("--enable-pinentry-tty")))
diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm
index 5f7e45183b..e92d78c88a 100644
--- a/gnu/packages/gnuzilla.scm
+++ b/gnu/packages/gnuzilla.scm
@@ -1,7 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013, 2015 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2014, 2015, 2016, 2017 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Alex Griffin <a@ajgrf.com>
@@ -317,35 +317,44 @@ standards.")
        (list
         (search-patch "icecat-avoid-bundled-libraries.patch")
         (search-patch "icecat-binutils.patch")
-        (mozilla-patch "icecat-bug-1301381.patch"       "2e5438a92617" "0pyjbzyy04759ldpcar8q8cccv67j1jkxsg46rkq7a3rbhmwmw4p")
-        (mozilla-patch "icecat-bug-1317409.patch"       "7391f60fb790" "1hydggpmmm2cs9lb15micnkxn4wl4cda9g74hkn3zmks805vjz3h")
-        (mozilla-patch "icecat-bug-1309834.patch"       "744e01001e6e" "0z2fq765kap3ll9as5rvjpnbj3pw26074alw7df0zi215qz47nxr")
-        (mozilla-patch "icecat-bug-1317936-pt1.patch"   "8ae673f34a5b" "1rlbihckl9afa0y91lqs7gpnv6a7zxzrmxjv95y3yrl03kibqp76")
-        (mozilla-patch "icecat-bug-1317936-pt2.patch"   "409c23c144fe" "05kgs16y8s5pxmg2dxp93247zagnj6zgj3209qpm5hz3an7gr13h")
-        (mozilla-patch "icecat-bug-1319122.patch"       "994d9bd0e28d" "007wifyx3b2ln4fwv1i8n24yz5ngjf4mkzd7sqr5bpd3q88ff293")
-        (mozilla-patch "icecat-bug-1312609.patch"       "0fc43af8982e" "0pc8q9knzq2knj723mwkay1lnzbzysb07ygxnc16mcb6f7vl2mw8")
-        (mozilla-patch "icecat-bug-1319524.patch"       "19f9a4643d77" "0w5yxj1l0hvs66q9agjp4m5sfby7fj05lx33gaqf899bw4hn4vcf")
-        (mozilla-patch "icecat-bug-1312548.patch"       "c58442c414f5" "1z1w1v8xagkhrwgp51ij1k2gx0ripslia09vm78812n7gcwddaas")
-        (mozilla-patch "icecat-bug-1314442.patch"       "5054047b7328" "0xlw8irymfp3bcaa5jpf7clf7bq6qxp3i8zapp8jya8lzr1nf868")
-        (mozilla-patch "icecat-bug-881832-pt1.patch"    "1123263318a3" "1qkxwva3zrcs1zhga8ncmndq03988dx75i896g53gbvpskj06915")
-        (mozilla-patch "icecat-bug-881832-pt2.patch"    "dc87c0a39adf" "01rapf14f3r2wk0cjd16dn1rll4ipgs33cnjmjck48nvk67ikz6h")
-        (mozilla-patch "icecat-bug-881832-pt3.patch"    "f20e5f488368" "15ql9ywifb3gm2g1057k63f821dbs3wqsh3zhndprzf3dn6aha4i")
-        (mozilla-patch "icecat-bug-881832-pt4.patch"    "7950c4d5bd7c" "0jhkg5hq5yfy7rh21k1mpbsbr81ql85aazym30zy3n2cf28xxhd7")
-        (mozilla-patch "icecat-bug-881832-pt5.patch"    "972734ec21b6" "073i4v1f1ydy49i57pvzscz95sjr5bbk9s5sajxvmmcsmwhpjdfy")
-        (mozilla-patch "icecat-bug-1293985-pt1.patch"   "aebd3687e05e" "1qz6hdgflcrqyg7fv66cbg23v4b7q5bc2yxzrgjxs4j1d7jy1s0s")
-        (mozilla-patch "icecat-bug-1293985-pt2.patch"   "63d8e5cd27cb" "11fsgyngy7v59ma30xdbmycwf4izwikzvaljngm3ks4534inpl4a")
-        (mozilla-patch "icecat-bug-1279202.patch"       "e560997291af" "1hn35slasfcj3ryka4fsarx4l9r99z0iwj67fmbv6zxz4z133kks")
-        (mozilla-patch "icecat-bug-1320039.patch"       "21c615b65048" "0ibgsxa36x9ajn2jqbhxxvrfvj6x6iyspsmzzn4brdz11n93skhr")
-        (mozilla-patch "icecat-bug-1320057.patch"       "c15e5afc0430" "17gj32agqs94548z8lvz0l6zz3kbwajn8as0y4iw5nb6jsll4c66")
-        (mozilla-patch "icecat-bug-1163212.patch"       "46163fb1cb34" "1yikayczfgfla3aka0159apq3149d52sgvlca0sivx4myd0lvjm7")
-        (mozilla-patch "icecat-bug-1317805.patch"       "cde2a37100f5" "100abggnhwyw84almxrkxqfpyfkd4pqkcrh5y9g4d3jd2h16asvl")
-        (mozilla-patch "icecat-bug-1298773-pt1.patch"   "9b78ab1e6d07" "19ib6bp96xk000ll40b8qxvizkncyzclz2rsb9w5fa42qs9978ff")
-        (mozilla-patch "icecat-bug-1298773-pt2.patch"   "78ebf9c9dfb0" "1shgr4rk6r2zxr1qqk1j3qnnqzqxnbi093qhlrfh8q5q1ivqf6k1")
-        (mozilla-patch "icecat-bug-1299098.patch"       "a46a9f16823c" "0dwkyz3kcqnfcbhbfh2lss7s0yh87rgzb871qxx3x4ynyqph9mnz")
-        (mozilla-patch "icecat-bug-1311687.patch"       "6bc7cc7a33a6" "1wggcqv84n8mp7xps7hy4rwy61fkh45imfqzc0b46s3w5hyhypn2")
-        (mozilla-patch "icecat-bug-1287912.patch"       "778f65148b40" "0j2a153sk0654vv2lnxjib4lwml3mlqn6vs46c2pp82iba8nyfrm")
-        (mozilla-patch "icecat-bug-1312272.patch"       "94bd2b43c766" "10h0qpr6m9cqyqxxnkbb6mzb3cagavzlynkxgd7a4izyq1bv28rk")
-        (mozilla-patch "icecat-bug-1315631.patch"       "893de7431d51" "11gyik8mwipl6ipypkvdq519pw7ccbg0g0bnvxb7271n44cqqcq5")))
+        (mozilla-patch "icecat-CVE-2016-9897.patch"      "2e5438a92617" "0pyjbzyy04759ldpcar8q8cccv67j1jkxsg46rkq7a3rbhmwmw4p")
+        (mozilla-patch "icecat-CVE-2016-9899.patch"      "7391f60fb790" "1hydggpmmm2cs9lb15micnkxn4wl4cda9g74hkn3zmks805vjz3h")
+        (mozilla-patch "icecat-CVE-2016-9893-pt1.patch"  "744e01001e6e" "0z2fq765kap3ll9as5rvjpnbj3pw26074alw7df0zi215qz47nxr")
+        (mozilla-patch "icecat-CVE-2016-9904-pt1.patch"  "8ae673f34a5b" "1rlbihckl9afa0y91lqs7gpnv6a7zxzrmxjv95y3yrl03kibqp76")
+        (mozilla-patch "icecat-CVE-2016-9904-pt2.patch"  "409c23c144fe" "05kgs16y8s5pxmg2dxp93247zagnj6zgj3209qpm5hz3an7gr13h")
+        (mozilla-patch "icecat-CVE-2016-9900.patch"      "994d9bd0e28d" "007wifyx3b2ln4fwv1i8n24yz5ngjf4mkzd7sqr5bpd3q88ff293")
+        (mozilla-patch "icecat-CVE-2016-9893-pt2.patch"  "0fc43af8982e" "0pc8q9knzq2knj723mwkay1lnzbzysb07ygxnc16mcb6f7vl2mw8")
+        (mozilla-patch "icecat-CVE-2016-9893-pt3.patch"  "19f9a4643d77" "0w5yxj1l0hvs66q9agjp4m5sfby7fj05lx33gaqf899bw4hn4vcf")
+        (mozilla-patch "icecat-CVE-2016-9893-pt4.patch"  "c58442c414f5" "1z1w1v8xagkhrwgp51ij1k2gx0ripslia09vm78812n7gcwddaas")
+        (mozilla-patch "icecat-CVE-2016-9898.patch"      "5054047b7328" "0xlw8irymfp3bcaa5jpf7clf7bq6qxp3i8zapp8jya8lzr1nf868")
+        (mozilla-patch "icecat-bug-881832-pt1.patch"     "1123263318a3" "1qkxwva3zrcs1zhga8ncmndq03988dx75i896g53gbvpskj06915")
+        (mozilla-patch "icecat-bug-881832-pt2.patch"     "dc87c0a39adf" "01rapf14f3r2wk0cjd16dn1rll4ipgs33cnjmjck48nvk67ikz6h")
+        (mozilla-patch "icecat-bug-881832-pt3.patch"     "f20e5f488368" "15ql9ywifb3gm2g1057k63f821dbs3wqsh3zhndprzf3dn6aha4i")
+        (mozilla-patch "icecat-bug-881832-pt4.patch"     "7950c4d5bd7c" "0jhkg5hq5yfy7rh21k1mpbsbr81ql85aazym30zy3n2cf28xxhd7")
+        (mozilla-patch "icecat-bug-881832-pt5.patch"     "972734ec21b6" "073i4v1f1ydy49i57pvzscz95sjr5bbk9s5sajxvmmcsmwhpjdfy")
+        (mozilla-patch "icecat-CVE-2016-9905-pt1.patch"  "aebd3687e05e" "1qz6hdgflcrqyg7fv66cbg23v4b7q5bc2yxzrgjxs4j1d7jy1s0s")
+        (mozilla-patch "icecat-CVE-2016-9905-pt2.patch"  "63d8e5cd27cb" "11fsgyngy7v59ma30xdbmycwf4izwikzvaljngm3ks4534inpl4a")
+        (mozilla-patch "icecat-bug-1279202.patch"        "e560997291af" "1hn35slasfcj3ryka4fsarx4l9r99z0iwj67fmbv6zxz4z133kks")
+        (mozilla-patch "icecat-CVE-2016-9902.patch"      "21c615b65048" "0ibgsxa36x9ajn2jqbhxxvrfvj6x6iyspsmzzn4brdz11n93skhr")
+        (mozilla-patch "icecat-CVE-2016-9901.patch"      "c15e5afc0430" "17gj32agqs94548z8lvz0l6zz3kbwajn8as0y4iw5nb6jsll4c66")
+        (mozilla-patch "icecat-CVE-2016-9893-pt5.patch"  "46163fb1cb34" "1yikayczfgfla3aka0159apq3149d52sgvlca0sivx4myd0lvjm7")
+        (mozilla-patch "icecat-CVE-2016-9893-pt6.patch"  "cde2a37100f5" "100abggnhwyw84almxrkxqfpyfkd4pqkcrh5y9g4d3jd2h16asvl")
+        (mozilla-patch "icecat-CVE-2016-9893-pt7.patch"  "9b78ab1e6d07" "19ib6bp96xk000ll40b8qxvizkncyzclz2rsb9w5fa42qs9978ff")
+        (mozilla-patch "icecat-CVE-2016-9893-pt8.patch"  "78ebf9c9dfb0" "1shgr4rk6r2zxr1qqk1j3qnnqzqxnbi093qhlrfh8q5q1ivqf6k1")
+        (mozilla-patch "icecat-CVE-2016-9893-pt9.patch"  "a46a9f16823c" "0dwkyz3kcqnfcbhbfh2lss7s0yh87rgzb871qxx3x4ynyqph9mnz")
+        (mozilla-patch "icecat-bug-1311687.patch"        "6bc7cc7a33a6" "1wggcqv84n8mp7xps7hy4rwy61fkh45imfqzc0b46s3w5hyhypn2")
+        (mozilla-patch "icecat-CVE-2016-9893-pt10.patch" "778f65148b40" "0j2a153sk0654vv2lnxjib4lwml3mlqn6vs46c2pp82iba8nyfrm")
+        (mozilla-patch "icecat-CVE-2016-9895.patch"      "94bd2b43c766" "10h0qpr6m9cqyqxxnkbb6mzb3cagavzlynkxgd7a4izyq1bv28rk")
+        (mozilla-patch "icecat-CVE-2016-9893-pt11.patch" "893de7431d51" "11gyik8mwipl6ipypkvdq519pw7ccbg0g0bnvxb7271n44cqqcq5")
+        (mozilla-patch "icecat-bug-1323338.patch"        "b21dee058b2c" "005khpimffqzas7slajid4dd2c15nyk7rjk6fsps87bgnx0gx0s4")
+        (mozilla-patch "icecat-bug-1258410-pt1.patch"    "cd23c5d74be8" "1myzkpzg6pmjacjz8az06m9kz84in1mwsiaw5sgx47pm02598wm5")
+        (mozilla-patch "icecat-bug-1258410-pt2.patch"    "b83594617d15" "171cqflc9jh47az96im1whwhyq4ayicspqsczsmn2x5ll9lqw5fq")
+        (mozilla-patch "icecat-bug-1322107.patch"        "d6c6f5e4e641" "10x9f46ylm2q3i669hj1csd6agdm8w7xa0iln691z8ayg2hcrxdz")
+        (mozilla-patch "icecat-bug-1285833.patch"        "122f5fbfc563" "05pp2f4pg4j8a8pdgjhfrc8g2chhkhsarn9n8sbyag0fy3ig1cvd")
+        (mozilla-patch "icecat-bug-1297361.patch"        "297c675ddadc" "1jc1b5i69vq1fvz3qfnnv52c9cj17bjbmfyzmqlw5ywna0wfvabz")
+        (mozilla-patch "icecat-bug-1325877.patch"        "3cff736e3bb6" "1nxqwnl9zksvkfkmis7zica4xrhwfndjyy2sxc1dvrh9rshk1swq")
+        (mozilla-patch "icecat-bug-1285960.patch"        "2732280adabc" "0zrpq3aybaw2yy38vs6883a4nw01x4kxn3lfqn9yhcgjvngmmyia")
+        (mozilla-patch "icecat-bug-1325938.patch"        "81c9fdbd96e8" "0scv1zyi4vbsjdsyj4w70n5jd50baq0dzw3qpxqf1n69nfb9k214")))
       (modules '((guix build utils)))
       (snippet
        '(begin
diff --git a/gnu/packages/graphviz.scm b/gnu/packages/graphviz.scm
index 610bd16beb..d47d45e527 100644
--- a/gnu/packages/graphviz.scm
+++ b/gnu/packages/graphviz.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013, 2015 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2015 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016 Theodoros Foradis <theodoros.for@openmailbox.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -20,6 +21,7 @@
 (define-module (gnu packages graphviz)
   #:use-module (guix packages)
   #:use-module (guix build-system gnu)
+  #:use-module (guix build-system python)
   #:use-module (guix download)
   #:use-module (gnu packages xorg)
   #:use-module (gnu packages gtk)
@@ -30,11 +32,14 @@
   #:use-module (gnu packages image)
   #:use-module (gnu packages autotools)
   #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages glib)
+  #:use-module (gnu packages gtk)
+  #:use-module (gnu packages gnome)
   #:use-module (gnu packages fontutils)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages gd)
   #:use-module (gnu packages swig)
-  #:use-module ((guix licenses) #:select (lgpl2.0+ epl1.0)))
+  #:use-module ((guix licenses) #:select (lgpl2.0+ epl1.0 lgpl3+)))
 
 (define-public graphviz
   (package
@@ -148,3 +153,46 @@ interfaces for other technical domains.")
      "Library intended to provide a set of useful functions to deal with
 3D surfaces meshed with interconnected triangles.")
     (license lgpl2.0+)))
+
+(define-public xdot
+  (package
+    (name "xdot")
+    (version "0.7")
+    (source
+     (origin
+      (method url-fetch)
+      (uri (pypi-uri "xdot" version))
+      (sha256
+       (base32
+        "1q0f3pskb09saw1qkd2s6vmk80rq5zjhq8l93dfr2x6r04r0q46j"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         ;; We wrap xdot, so that we don't propagate gtk+ and graphviz
+         (add-after 'install 'wrap
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (wrap-program (string-append (assoc-ref outputs "out") "/bin/xdot")
+               `("GI_TYPELIB_PATH" ":" prefix
+                 (,(string-append
+                    (assoc-ref inputs "gtk+") "/lib/girepository-1.0"
+                    ":" (assoc-ref inputs "pango") "/lib/girepository-1.0"
+                    ":" (assoc-ref inputs "gdk-pixbuf") "/lib/girepository-1.0"
+                    ":" (assoc-ref inputs "atk") "/lib/girepository-1.0")))
+               `("PATH" ":" prefix
+                 (,(string-append (assoc-ref inputs "graphviz") "/bin"))))
+             #t)))))
+    (inputs
+     `(("atk" ,atk)
+       ("gdk-pixbuf" ,gdk-pixbuf+svg)
+       ("graphviz" ,graphviz)
+       ("gtk+" ,gtk+)
+       ("python-pycairo" ,python-pycairo)
+       ("python-pygobject" ,python-pygobject)))
+    (home-page "https://pypi.python.org/pypi/xdot")
+    (synopsis "Interactive viewer for graphviz dot files")
+    (description "Xdot is an interactive viewer for graphs written in
+@code{graphviz}’s dot language.  Internally, it uses the xdot output format as
+an intermediate format,and @code{gtk} and @code{cairo} for rendering.  Xdot can
+be used either as a standalone application, or as a python library.")
+    (license lgpl3+)))
diff --git a/gnu/packages/groff.scm b/gnu/packages/groff.scm
index 93d0380595..e7a6fbda15 100644
--- a/gnu/packages/groff.scm
+++ b/gnu/packages/groff.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2014 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -21,6 +22,7 @@
   #: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 bison)
@@ -56,3 +58,42 @@ formatted output based on formatting commands contained within the text.  It
 is usually the formatter of \"man\" documentation pages.")
    (license gpl3+)
    (home-page "http://www.gnu.org/software/groff/")))
+
+;; There are no releases, so we take the latest commit.
+(define-public roffit
+  (let ((commit "e5228388e3faf2b7f1ae5bd048ad46ed565304c6")
+        (revision "1"))
+    (package
+      (name "roffit")
+      (version (string-append "0.11-" revision "." (string-take commit 9)))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/bagder/roffit.git")
+                      (commit commit)))
+                (file-name (string-append "roffit-" commit "-checkout"))
+                (sha256
+                 (base32
+                  "1y7ndbqciy7h0khlpi1bv4v1614vhybnmm4jysj6fwxkw9cwv1nc"))))
+      (build-system gnu-build-system)
+      (arguments
+       `(#:test-target "test"
+         #:make-flags
+         (list (string-append "INSTALLDIR="
+                              (assoc-ref %outputs "out") "/bin"))
+         #:phases
+         (modify-phases %standard-phases
+           (delete 'configure)
+           (add-before 'install 'pre-install
+             (lambda* (#:key outputs #:allow-other-keys)
+               (mkdir-p (string-append (assoc-ref outputs "out")
+                                       "/bin"))
+               #t)))))
+      (inputs
+       `(("perl" ,perl)))
+      (home-page "https://daniel.haxx.se/projects/roffit/")
+      (synopsis "Convert nroff files to HTML")
+      (description
+       "Roffit is a program that reads an nroff file and outputs an HTML file.
+It is typically used to display man pages on a web site.")
+      (license expat))))
diff --git a/gnu/packages/grub.scm b/gnu/packages/grub.scm
index ef7395e95e..3658f221ce 100644
--- a/gnu/packages/grub.scm
+++ b/gnu/packages/grub.scm
@@ -36,38 +36,7 @@
   #:use-module (gnu packages man)
   #:use-module (gnu packages texinfo)
   #:use-module (gnu packages ncurses)
-  #:use-module (gnu packages cdrom)
-  #:use-module (srfi srfi-1))
-
-(define qemu-for-tests
-  ;; Newer QEMU versions, such as 1.5.1, no longer support the 'shutdown'
-  ;; instruction.  This leads to test hangs, as reported at
-  ;; <https://bugs.launchpad.net/bugs/947597> and fixed at
-  ;; <http://bzr.savannah.gnu.org/lh/grub/trunk/grub/revision/4828>.
-  ;; Work around it by using an older QEMU.
-  (package (inherit qemu-minimal)
-    (version "1.3.1")
-    (source (origin
-             (method url-fetch)
-             (uri (string-append "http://wiki.qemu-project.org/download/qemu-"
-                                 version ".tar.bz2"))
-             (sha256
-              (base32
-               "1bqfrb5dlsxm8gxhkksz8qzi5fhj3xqhxyfwbqcphhcv1kpyfwip"))))
-
-    ;; With recent GLib versions, we get a test failure:
-    ;;   ERROR:tests/rtc-test.c:176:check_time: assertion failed (ABS(t - s) <= wiggle): (382597824 <= 2)
-    ;; Simply disable the tests.
-    (arguments `(#:tests? #f
-                 ,@(substitute-keyword-arguments (package-arguments qemu-minimal)
-                     ((#:phases phases)
-                      ;; We disable the tests so we also skip the phase disabling
-                      ;; the qga test, which fails due to changes in QEMU
-                      `(modify-phases ,phases
-                         (delete 'disable-test-qga))))))
-
-    ;; The manual fails to build with Texinfo 5.x.
-    (native-inputs (alist-delete "texinfo" (package-native-inputs qemu)))))
+  #:use-module (gnu packages cdrom))
 
 (define unifont
   ;; GNU Unifont, <http://gnu.org/s/unifont>.
@@ -151,7 +120,7 @@
        ;; Dependencies for the test suite.  The "real" QEMU is needed here,
        ;; because several targets are used.
        ("parted" ,parted)
-       ("qemu" ,qemu-for-tests)
+       ("qemu" ,qemu-minimal)
        ("xorriso" ,xorriso)))
     (home-page "https://www.gnu.org/software/grub/")
     (synopsis "GRand Unified Boot loader")
@@ -164,3 +133,29 @@ on the same computer; upon booting the computer, the user is presented with a
 menu to select one of the installed operating systems.")
     (license gpl3+)
     (properties '((cpe-name . "grub2")))))
+
+(define-public grub-efi
+  (package
+    (inherit grub)
+    (name "grub-efi")
+    (synopsis "GRand Unified Boot loader (UEFI version)")
+    (inputs
+     `(("efibootmgr" ,efibootmgr)
+       ,@(package-inputs grub)))
+    (arguments
+     `(;; TODO: Tests need a UEFI firmware for qemu. There is one at
+       ;; https://github.com/tianocore/edk2/tree/master/OvmfPkg .
+       ;; Search for 'OVMF' in "tests/util/grub-shell.in".
+       #:tests? #f
+       ,@(substitute-keyword-arguments (package-arguments grub)
+           ((#:configure-flags flags) `(cons* "--with-platform=efi"
+                                              ,flags))
+           ((#:phases phases)
+            `(modify-phases ,phases
+               (add-after 'patch-stuff 'use-absolute-efibootmgr-path
+                 (lambda* (#:key inputs #:allow-other-keys)
+                   (substitute* "grub-core/osdep/unix/platform.c"
+                     (("efibootmgr")
+                      (string-append (assoc-ref inputs "efibootmgr")
+                                     "/sbin/efibootmgr")))
+                   #t)))))))))
diff --git a/gnu/packages/gtk.scm b/gnu/packages/gtk.scm
index fc4677c247..b2882b5e98 100644
--- a/gnu/packages/gtk.scm
+++ b/gnu/packages/gtk.scm
@@ -1,7 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2014, 2015, 2017 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2015 Federico Beffa <beffa@fbengineering.ch>
 ;;; Copyright © 2015 Paul van der Walt <paul@denknerd.org>
@@ -102,14 +102,14 @@ tools have full access to view and control running applications.")
 (define-public cairo
   (package
    (name "cairo")
-   (version "1.14.6")
+   (version "1.14.8")
    (source (origin
             (method url-fetch)
-            (uri (string-append "http://cairographics.org/releases/cairo-"
+            (uri (string-append "https://cairographics.org/releases/cairo-"
                                 version ".tar.xz"))
             (sha256
              (base32
-              "0lmjlzmghmr27y615px9hkm552x7ap6pmq9mfbzr6smp8y2b6g31"))
+              "082ypjlh03ss5616amgjp9ap3xwwccyh2knyyrj1a4d4x65dkwni"))
             (patches (search-patches "cairo-CVE-2016-9082.patch"))))
    (build-system gnu-build-system)
    (propagated-inputs
@@ -150,7 +150,7 @@ Bézier splines, transforming and compositing translucent images, and
 antialiased text rendering.  All drawing operations can be transformed by any
 affine transformation (scale, rotation, shear, etc.).")
    (license license:lgpl2.1) ; or Mozilla Public License 1.1
-   (home-page "http://cairographics.org/")))
+   (home-page "https://cairographics.org/")))
 
 (define-public cairo-xcb
   (package
@@ -168,7 +168,7 @@ affine transformation (scale, rotation, shear, etc.).")
 (define-public harfbuzz
   (package
    (name "harfbuzz")
-   (version "1.3.3")
+   (version "1.3.4")
    (source (origin
              (method url-fetch)
              (uri (string-append "https://www.freedesktop.org/software/"
@@ -176,7 +176,7 @@ affine transformation (scale, rotation, shear, etc.).")
                                  version ".tar.bz2"))
              (sha256
               (base32
-               "1jdkdjvci5d6r26vimsz24hz3xqqrk5xq40n693jn4m42mqrh816"))))
+               "0ava7y24797k5ps3ghq2ccjjds97ri1gx32v6546a6pgmpyad2ki"))))
    (build-system gnu-build-system)
    (outputs '("out"
               "bin")) ; 160K, only hb-view depend on cairo
@@ -426,6 +426,7 @@ highlighting and other features typical of a source code editor.")
   (package
    (name "gdk-pixbuf")
    (version "2.34.0")
+   (replacement gdk-pixbuf/fixed)
    (source (origin
             (method url-fetch)
             (uri (string-append "mirror://gnome/sources/" name "/"
@@ -474,11 +475,35 @@ in the GNOME project.")
    (license license:lgpl2.0+)
    (home-page "https://developer.gnome.org/gdk-pixbuf/")))
 
+(define gdk-pixbuf/fixed
+  (package (inherit gdk-pixbuf)
+    (name "gdk-pixbuf")
+    (version "2.36.3")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://gnome/sources/" name "/"
+                                  (version-major+minor version)  "/"
+                                  name "-" version ".tar.xz"))
+              (sha256
+               (base32
+                "1v1rssjd8p5s3lymsfhiq5mbs2pc0h1r6jd0asrwdbrign7i68sj"))))
+    (replacement #f)))
+
+(define-syntax-rule (package/inherit p overrides ...)
+  "Like (package (inherit P) OVERRIDES ...), except that the same
+transformation is done to the package replacement, if any.  P must be a bare
+identifier, and will be bound to either P or its replacement when evaluating
+OVERRIDES."
+  (let loop ((p p))
+    (package (inherit p)
+      overrides ...
+      (replacement (and=> (package-replacement p) loop)))))
+
 ;; To build gdk-pixbuf with SVG support, we need librsvg, and librsvg depends
 ;; on gdk-pixbuf, so this new varibale.  Also, librsvg adds 90MiB to the
 ;; closure size.
 (define-public gdk-pixbuf+svg
-  (package (inherit gdk-pixbuf)
+  (package/inherit gdk-pixbuf
     (name "gdk-pixbuf+svg")
     (inputs
      `(("librsvg" ,librsvg)
@@ -929,15 +954,14 @@ guile-gnome-platform (GNOME developer libraries), and guile-gtksourceview.")
 (define-public cairomm
   (package
     (name "cairomm")
-    (version "1.12.0")
+    (version "1.12.2")
     (source (origin
               (method url-fetch)
-              (uri (string-append "mirror://gnome/sources/cairomm/"
-                                  (version-major+minor version) "/"
-                                  name "-" version ".tar.xz"))
+              (uri (string-append "https://www.cairographics.org/releases/"
+                                  name "-" version ".tar.gz"))
               (sha256
                (base32
-                "1rmgs6zjj2vaxh9hsa0944m23fdn1psycqh7bi984qd8jj1xljm5"))))
+                "16fmigxsaz85c3lgcls7biwyz8zy8c8h3jndfm54cxxas3a7zi25"))))
     (build-system gnu-build-system)
     (arguments
      ;; The examples lack -lcairo.
@@ -948,7 +972,7 @@ guile-gnome-platform (GNOME developer libraries), and guile-gtksourceview.")
        ("freetype" ,freetype)
        ("fontconfig" ,fontconfig)
        ("cairo" ,cairo)))
-    (home-page "http://cairographics.org/")
+    (home-page "https://cairographics.org/")
     (synopsis "C++ bindings to the Cairo 2D graphics library")
     (description
      "Cairomm provides a C++ programming interface to the Cairo 2D graphics
diff --git a/gnu/packages/guile.scm b/gnu/packages/guile.scm
index 1c1b35c34b..7ce6683681 100644
--- a/gnu/packages/guile.scm
+++ b/gnu/packages/guile.scm
@@ -1,7 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
-;;; Copyright © 2015 Christopher Allan Webber <cwebber@dustycloud.org>
+;;; Copyright © 2015, 2017 Christopher Allan Webber <cwebber@dustycloud.org>
 ;;; Copyright © 2016 Alex Sassmannshausen <alex@pompo.co>
 ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016 Erik Edrosa <erik.edrosa@gmail.com>
@@ -9,6 +9,7 @@
 ;;; Copyright © 2016 Alex Kost <alezost@gmail.com>
 ;;; Copyright © 2016 Adonay "adfeno" Felipe Nogueira <https://libreplanet.org/wiki/User:Adfeno> <adfeno@openmailbox.org>
 ;;; Copyright © 2016 Amirouche <amirouche@hypermove.net>
+;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -230,7 +231,7 @@ without requiring the source code to be rewritten.")
 (define-public guile-next
   (package (inherit guile-2.0)
     (name "guile-next")
-    (version "2.1.4")
+    (version "2.1.5")
     (replacement #f)
     (source (origin
               (method url-fetch)
@@ -238,7 +239,7 @@ without requiring the source code to be rewritten.")
                                   version ".tar.xz"))
               (sha256
                (base32
-                "1w8kyy8nz6489d092fix6lvgjrk0bww7i0c2k67ym4hq0kjl0r1j"))
+                "0r9y4hw17dlxahik4zsccfb2f3p2a07wqndfm251bgmam9hln6gi"))
               (modules '((guix build utils)))
 
               ;; Remove the pre-built object files.  Instead, build everything
@@ -247,7 +248,10 @@ without requiring the source code to be rewritten.")
               (snippet '(for-each delete-file
                                   (find-files "prebuilt" "\\.go$")))))
     (synopsis "Snapshot of what will become version 2.2 of GNU Guile")
-    (properties '((timeout . 72000)))  ; 20 hours
+    (properties '((timeout . 72000)               ;20 hours
+                  (upstream-name . "guile")
+                  (ftp-server . "alpha.gnu.org")
+                  (ftp-directory . "/gnu/guile")))
     (native-search-paths
      (list (search-path-specification
             (variable "GUILE_LOAD_PATH")
@@ -428,16 +432,20 @@ many readers as needed).")
                                "--with-gnu-filesystem-hierarchy")
        #:phases
        (modify-phases %standard-phases
-         (add-after 'install 'post-install
+         (add-before 'build 'fix-libguile-ncurses-file-name
            (lambda* (#:key outputs #:allow-other-keys)
-             (let* ((out   (assoc-ref outputs "out"))
-                    (dir   (string-append out "/share/guile/site/"))
-                    (files (find-files dir ".scm")))
-               (substitute* files
-                 (("\"libguile-ncurses\"")
-                  (format #f "\"~a/lib/guile/2.0/libguile-ncurses\""
-                          out)))
-               #t))))))
+             (and (zero? (system* "make" "install"
+                                  "-C" "src/ncurses"
+                                  "-j" (number->string
+                                        (parallel-job-count))))
+                  (let* ((out   (assoc-ref outputs "out"))
+                         (dir   "src/ncurses")
+                         (files (find-files dir ".scm")))
+                    (substitute* files
+                      (("\"libguile-ncurses\"")
+                       (format #f "\"~a/lib/guile/2.0/libguile-ncurses\""
+                               out)))
+                    #t)))))))
     (home-page "https://www.gnu.org/software/guile-ncurses/")
     (synopsis "Guile bindings to ncurses")
     (description
@@ -518,6 +526,46 @@ format is also supported.")
                                    (,modules)))
                                #t))))))))))))
 
+(define-public guile-ics
+  (package
+    (name "guile-ics")
+    (version "0.1.1")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/artyom-poptsov/guile-ics")
+                    (commit "v0.1.1")))
+              (file-name (string-append name "-" version "-checkout"))
+              (sha256
+               (base32
+                "1pvg6j48inpbq47hq00yh5hhl2qd2srvrx5yjl7w7ky1jsjadp86"))))
+    (build-system gnu-build-system)
+    (arguments
+     '(#:phases (modify-phases %standard-phases
+                  (add-before 'configure 'autoreconf
+                              (lambda _
+                                ;; Repository comes with a broken symlink
+                                (delete-file "README")
+                                (symlink "README.org" "README")
+                                (zero? (system* "autoreconf" "-fi")))))))
+    (native-inputs
+     `(("autoconf" ,(autoconf-wrapper))
+       ("automake" ,automake)
+       ("texinfo" ,texinfo)
+       ;; Gettext brings 'AC_LIB_LINKFLAGS_FROM_LIBS'.
+       ("gettext" ,gettext-minimal)
+       ("pkg-config" ,pkg-config)))
+    (inputs `(("guile" ,guile-2.0) ("which" ,which)))
+    (propagated-inputs `(("guile-lib" ,guile-lib)))
+    (home-page "https://github.com/artyom-poptsov/guile-ics")
+    (synopsis "Guile parser library for the iCalendar format")
+    (description
+     "Guile-ICS is an iCalendar (RFC5545) format parser library written in
+pure Scheme.  The library can be used to read and write iCalendar data.
+
+The library is shipped with documentation in Info format and usage examples.")
+    (license gpl3+)))
+
 (define-public guile-lib
   (package
     (name "guile-lib")
@@ -689,7 +737,7 @@ See http://minikanren.org/ for more on miniKanren generally.")
 (define-public guile-irregex
   (package
     (name "guile-irregex")
-    (version "0.9.4")
+    (version "0.9.6")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -697,7 +745,7 @@ See http://minikanren.org/ for more on miniKanren generally.")
                     version ".tar.gz"))
               (sha256
                (base32
-                "0cmaqvqvyarcnnsyrl2p6vwyv1r3k1q7qw8p9zrlnz1vpbj7vb90"))))
+                "1ia3m7dp3lcxa048q0gqbiwwsyvn99baw6xkhb4bhhzn4k7bwyqq"))))
     (build-system gnu-build-system)
     (arguments
      `(#:modules ((guix build utils)
@@ -1419,4 +1467,107 @@ type system, elevating types to first-class status.")
 dictionary and suggesting spelling corrections.")
     (license gpl3+)))
 
+(define-public guile-bash
+  ;; This project is currently retired.  It was initially announced here:
+  ;; <https://lists.gnu.org/archive/html/guile-user/2015-02/msg00003.html>.
+  (let ((commit "1eabc563ca5692b3e08d84f1f0e6fd2283284469")
+        (revision "0"))
+    (package
+      (name "guile-bash")
+      (version (string-append "0.1.6-" revision "." (string-take commit 7)))
+      (home-page
+       "https://anonscm.debian.org/cgit/users/kaction-guest/retired/dev.guile-bash.git")
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (commit commit)
+                      (url home-page)))
+                (sha256
+                 (base32
+                  "097vny990wp2qpjij6a5a5gwc6fxzg5wk56inhy18iki5v6pif1p"))
+                (file-name (string-append name "-" version "-checkout"))))
+      (build-system gnu-build-system)
+      (arguments
+       '(#:phases (modify-phases %standard-phases
+                    (add-after 'unpack 'bootstrap
+                      (lambda _
+                        (zero? (system* "sh" "bootstrap")))))
+
+         #:configure-flags
+         ;; Add -I to match 'bash.pc' of Bash 4.4.
+         (list (string-append "CPPFLAGS=-I"
+                              (assoc-ref %build-inputs "bash:include")
+                              "/include/bash/include")
+
+               ;; The '.a' file is useless.
+               "--disable-static"
+
+               ;; Install 'lib/bash' as Bash 4.4 expects.
+               (string-append "--libdir=" (assoc-ref %outputs "out")
+                              "/lib/bash"))))
+      (native-inputs `(("pkg-config" ,pkg-config)
+                       ("autoconf" ,(autoconf-wrapper))
+                       ("automake" ,automake)
+                       ("libtool" ,libtool)
+                       ;; Gettext brings 'AC_LIB_LINKFLAGS_FROM_LIBS'.
+                       ("gettext" ,gettext-minimal)))
+      (inputs `(("guile" ,guile-2.0)
+                ("bash:include" ,bash "include")))
+      (synopsis "Extend Bash using Guile")
+      (description
+       "Guile-Bash provides a shared library and set of Guile modules,
+allowing you to extend Bash in Scheme.  Scheme interfaces allow you to access
+the following aspects of Bash:
+
+@itemize
+@item aliases;
+@item setting and getting Bash variables;
+@item creating dynamic variables;
+@item creating Bash functions with a Scheme implementation;
+@item reader macro for output capturing;
+@item reader macro for evaluating raw Bash commands.
+@end itemize
+
+To enable it, run:
+
+@example
+enable -f ~/.guix-profile/lib/bash/libguile-bash.so scm
+@end example
+
+and then run @command{scm example.scm}.")
+      (license gpl3+))))
+
+(define-public guile-8sync
+  (package
+    (name "guile-8sync")
+    (version "0.4.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://gnu/8sync/8sync-" version
+                                  ".tar.gz"))
+              (sha256
+               (base32
+                "1fvf8d2s3vvg4nyskbqaiqmlm2x571hv7hizcnmny45zvalydr9h"))))
+    (build-system gnu-build-system)
+    (native-inputs `(("autoconf" ,autoconf)
+                     ("automake" ,automake)
+                     ("guile" ,guile-next)
+                     ("pkg-config" ,pkg-config)
+                     ("texinfo" ,texinfo)))
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+                  (add-before 'configure 'setenv
+                    (lambda _
+                      ;; quiet warnings
+                      (setenv "GUILE_AUTO_COMPILE" "0")
+                      #t)))))
+    (home-page "https://gnu.org/s/8sync/")
+    (synopsis "Asynchronous actor model library for Guile")
+    (description
+     "GNU 8sync (pronounced \"eight-sync\") is an asynchronous programming
+library for GNU Guile based on the actor model.
+
+Note that 8sync is only available for Guile 2.2 (guile-next in Guix).")
+    (license lgpl3+)))
+
 ;;; guile.scm ends here
diff --git a/gnu/packages/gv.scm b/gnu/packages/gv.scm
index e1e86a83a6..446b2946b5 100644
--- a/gnu/packages/gv.scm
+++ b/gnu/packages/gv.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
-;;; Copyright © 2013, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -40,8 +40,25 @@
             (sha256 (base32
                      "0q8s43z14vxm41pfa8s5h9kyyzk1fkwjhkiwbf2x70alm6rv6qi1"))))
    (build-system gnu-build-system)
-   (propagated-inputs `(("ghostscript" ,ghostscript/x)))
-   (inputs `(("libx11" ,libx11)
+   (arguments
+    '(#:phases (modify-phases %standard-phases
+                 (add-before 'configure 'set-gs-file-name
+                   (lambda* (#:key inputs #:allow-other-keys)
+                     ;; Set the value of 'GV.gsInterpreter' in the generated
+                     ;; 'gv_system.ad' file.
+                     (let ((gs (assoc-ref inputs "ghostscript")))
+                       (with-fluids ((%default-port-encoding "ISO-8859-1"))
+                        (substitute* "src/Makefile.in"
+                          (("GV\\.gsInterpreter:([[:blank:]]+)gs" _ blank)
+                           (string-append "GV.gsInterpreter:" blank
+                                          gs "/bin/gs"))
+                          (("GV\\.gsCmd([[:alpha:]]+):([[:blank:]]+)gs" _
+                            command blank)
+                           (string-append "GV.gsCmd" command ":"
+                                          blank gs "/bin/gs"))))
+                       #t))))))
+   (inputs `(("ghostscript" ,ghostscript/x)
+             ("libx11" ,libx11)
              ("libxaw3d" ,libxaw3d)
              ("libxinerama" ,libxinerama)
              ("libxpm" ,libxpm)
diff --git a/gnu/packages/haskell.scm b/gnu/packages/haskell.scm
index 8e5927a00b..b26234d405 100644
--- a/gnu/packages/haskell.scm
+++ b/gnu/packages/haskell.scm
@@ -7,7 +7,8 @@
 ;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2015, 2016 Ricardo Wurmus <rekado@elephly.net>
-;;; Copyright © 2016 David Craven <david@craven.ch>
+;;; Copyright © 2016, 2017 David Craven <david@craven.ch>
+;;; Copyright © 2017 Danny Milosavljevic <dannym@scratchpost.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -25,33 +26,34 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu packages haskell)
-  #:use-module (ice-9 regex)
-  #:use-module ((guix licenses) #:prefix license:)
-  #:use-module (guix packages)
-  #:use-module (guix download)
-  #:use-module (guix utils)
-  #:use-module (guix build-system gnu)
-  #:use-module (guix build-system haskell)
-  #:use-module (gnu packages pkg-config)
-  #:use-module (gnu packages perl)
+  #:use-module (gnu packages bootstrap)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages elf)
-  #:use-module (gnu packages gl)
-  #:use-module (gnu packages sdl)
-  #:use-module (gnu packages bootstrap)
-  #:use-module (gnu packages zip)
   #:use-module (gnu packages gcc)
   #:use-module (gnu packages ghostscript)
-  #:use-module (gnu packages libffi)
+  #:use-module (gnu packages gl)
   #:use-module (gnu packages libedit)
+  #:use-module (gnu packages libffi)
   #:use-module (gnu packages lua)
   #:use-module (gnu packages maths)
   #:use-module (gnu packages multiprecision)
   #:use-module (gnu packages ncurses)
-  #:use-module (gnu packages python)
   #:use-module (gnu packages pcre)
+  #:use-module (gnu packages perl)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages python)
+  #:use-module (gnu packages sdl)
   #:use-module (gnu packages xml)
-  #:use-module (gnu packages xorg))
+  #:use-module (gnu packages xorg)
+  #:use-module (gnu packages zip)
+  #:use-module (guix build-system gnu)
+  #:use-module (guix build-system haskell)
+  #:use-module (guix download)
+  #:use-module (guix git-download)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix packages)
+  #:use-module (guix utils)
+  #:use-module (ice-9 regex))
 
 (define ghc-bootstrap-x86_64-7.8.4
   (origin
@@ -2200,7 +2202,7 @@ removed.  Both IPv4 and IPv6 are supported.")
     (inputs
      `(("ghc-mtl" ,ghc-mtl)))
     (home-page
-     "http://sourceforge.net/projects/lazy-regex")
+     "https://sourceforge.net/projects/lazy-regex")
     (synopsis "Replaces/Enhances Text.Regex")
     (description "@code{Text.Regex.Base} provides the interface API for
 regex-posix, regex-pcre, regex-parsec, regex-tdfa, regex-dfa.")
@@ -2223,7 +2225,7 @@ regex-posix, regex-pcre, regex-parsec, regex-tdfa, regex-dfa.")
     (build-system haskell-build-system)
     (inputs
      `(("ghc-regex-base" ,ghc-regex-base)))
-    (home-page "http://sourceforge.net/projects/lazy-regex")
+    (home-page "https://sourceforge.net/projects/lazy-regex")
     (synopsis "POSIX regular expressions for Haskell")
     (description "This library provides the POSIX regex backend used by the
 Haskell library @code{regex-base}.")
@@ -2247,7 +2249,7 @@ Haskell library @code{regex-base}.")
     (inputs
      `(("ghc-regex-base" ,ghc-regex-base)
        ("ghc-regex-posix" ,ghc-regex-posix)))
-    (home-page "http://sourceforge.net/projects/lazy-regex")
+    (home-page "https://sourceforge.net/projects/lazy-regex")
     (synopsis "Replaces/Enhances Text.Regex")
     (description "This library provides one module layer over
 @code{regex-posix} to replace @code{Text.Regex}.")
@@ -3050,7 +3052,7 @@ use HUnit assertions as QuickCheck properties.")
 (define-public ghc-quickcheck
   (package
     (name "ghc-quickcheck")
-    (version "2.8.1")
+    (version "2.8.2")
     (outputs '("out" "doc"))
     (source
      (origin
@@ -3061,7 +3063,7 @@ use HUnit assertions as QuickCheck properties.")
              ".tar.gz"))
        (sha256
         (base32
-         "0fvnfl30fxmj5q920l13641ar896d53z0z6z66m7c1366lvalwvh"))))
+         "1ai6k5v0bibaxq8xffcblc6rwmmk6gf8vjyd9p2h3y6vwbhlvilq"))))
     (build-system haskell-build-system)
     (arguments
      `(#:tests? #f  ; FIXME: currently missing libraries used for tests.
@@ -4571,7 +4573,7 @@ just a @code{Semigroup} are added.")
 (define-public ghc-semigroups
   (package
     (name "ghc-semigroups")
-    (version "0.17.0.1")
+    (version "0.18.2")
     (source
      (origin
        (method url-fetch)
@@ -4581,7 +4583,7 @@ just a @code{Semigroup} are added.")
              ".tar.gz"))
        (sha256
         (base32
-         "0gvpfi7s6ys4qha3y9a1zl1a15gf9cgg33wjb94ghg82ivcxnc3r"))))
+         "1r6hsn3am3dpf4rprrj4m04d9318v9iq02bin0pl29dg4a3gzjax"))))
     (build-system haskell-build-system)
     (inputs
      `(("ghc-nats" ,ghc-nats)
@@ -6669,87 +6671,6 @@ constant-time:
 @end enumerate\n")
     (license license:bsd-3)))
 
-(define-public idris
-  ;; TODO: IDRIS_LIBRARY_PATH only accepts a single path and not a colon
-  ;; separated list.
-  ;; TODO: When installing idris the location of the standard libraries
-  ;; cannot be specified.
-  ;; NOTE: Creating an idris build system:
-  ;; Idris packages can be packaged and installed using a trivial
-  ;; build system.
-  ;; (zero? (system* (string-append idris "/bin/idris")
-  ;;                                "--ibcsubdir"
-  ;;                                (string-append out "/idris/libs/lightyear")
-  ;;                                "--install" "lightyear.ipkg")
-  ;; (native-search-paths
-  ;;   (list (search-path-specification
-  ;;          (variable "IDRIS_LIBRARY_PATH")
-  ;;          (files '("idris/libs")))))
-  (package
-    (name "idris")
-    (version "0.12.3")
-    (source (origin
-              (method url-fetch)
-              (uri (string-append
-                    "https://hackage.haskell.org/package/"
-                    "idris-" version "/idris-" version ".tar.gz"))
-              (sha256
-               (base32
-                "1ijrbgzaahw9aagn4al55nqcggrg9ajlrkq2fjc1saq3xdd3v7rs"))))
-    (build-system haskell-build-system)
-    (arguments
-     `(;; FIXME: runhaskell Setup.hs test doesn't set paths required by test
-       ;; suite.
-       #:tests? #f
-       #:phases
-       (modify-phases %standard-phases
-         (add-before 'configure 'patch-cc-command
-           (lambda _
-             (setenv "CC" "gcc"))))))
-    (inputs
-     `(("gmp" ,gmp)
-       ("ncurses" ,ncurses)
-       ("ghc-aeson" ,ghc-aeson)
-       ("ghc-async" ,ghc-async)
-       ("ghc-annotated-wl-pprint" ,ghc-annotated-wl-pprint)
-       ("ghc-ansi-terminal" ,ghc-ansi-terminal)
-       ("ghc-ansi-wl-pprint" ,ghc-ansi-wl-pprint)
-       ("ghc-base64-bytestring" ,ghc-base64-bytestring)
-       ("ghc-blaze-html" ,ghc-blaze-html)
-       ("ghc-blaze-markup" ,ghc-blaze-markup)
-       ("ghc-cheapskate" ,ghc-cheapskate)
-       ("ghc-fingertree" ,ghc-fingertree)
-       ("ghc-fsnotify" ,ghc-fsnotify)
-       ("ghc-ieee754" ,ghc-ieee754)
-       ("ghc-mtl" ,ghc-mtl)
-       ("ghc-network" ,ghc-network)
-       ("ghc-optparse-applicative" ,ghc-optparse-applicative)
-       ("ghc-parsers" ,ghc-parsers)
-       ("ghc-regex-tdfa" ,ghc-regex-tdfa)
-       ("ghc-safe" ,ghc-safe)
-       ("ghc-split" ,ghc-split)
-       ("ghc-tasty" ,ghc-tasty)
-       ("ghc-tasty-golden" ,ghc-tasty-golden)
-       ("ghc-tasty-rerun" ,ghc-tasty-rerun)
-       ("ghc-terminal-size" ,ghc-terminal-size)
-       ("ghc-text" ,ghc-text)
-       ("ghc-trifecta" ,ghc-trifecta)
-       ("ghc-uniplate" ,ghc-uniplate)
-       ("ghc-unordered-containers" ,ghc-unordered-containers)
-       ("ghc-utf8-string" ,ghc-utf8-string)
-       ("ghc-vector-binary-instances" ,ghc-vector-binary-instances)
-       ("ghc-vector" ,ghc-vector)
-       ("ghc-zip-archive" ,ghc-zip-archive)
-       ("ghc-zlib" ,ghc-zlib)))
-    (home-page "http://www.idris-lang.org")
-    (synopsis "General purpose language with full dependent types")
-    (description "Idris is a general purpose language with full dependent
-types.  It is compiled, with eager evaluation.  Dependent types allow types to
-be predicated on values, meaning that some aspects of a program's behaviour
-can be specified precisely in the type.  The language is closely related to
-Epigram and Agda.")
-    (license license:bsd-3)))
-
 (define-public ghc-base16-bytestring
   (package
     (name "ghc-base16-bytestring")
@@ -8129,4 +8050,116 @@ for general types.")
 dependency.")
     (license license:bsd-3)))
 
+(define-public ghc-language-c
+  (package
+    (name "ghc-language-c")
+    (version "0.5.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://hackage.haskell.org/package/"
+                           "language-c/language-c-" version ".tar.gz"))
+       (sha256
+        (base32
+         "08i2bl7jmmymn2sldzlbz6ig7lx3wfwhlpadzibs3fx72z08pmc6"))))
+    (build-system haskell-build-system)
+    (inputs `(("ghc-syb" ,ghc-syb)))
+    (native-inputs
+     `(("ghc-happy" ,ghc-happy)
+       ("ghc-alex" ,ghc-alex)))
+    (home-page "http://visq.github.io/language-c/")
+    (synopsis "Analysis and generation of C code")
+    (description
+     "Language C is a Haskell library for the analysis and generation of C code.
+It features a complete, well-tested parser and pretty printer for all of C99
+and a large set of GNU extensions.")
+    (license license:bsd-3)))
+
+(define-public ghc-markdown-unlit
+  (package
+    (name "ghc-markdown-unlit")
+    (version "0.4.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "mirror://hackage/package/markdown-unlit/"
+                    "markdown-unlit-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1kj2bffl7ndd8ygwwa3r1mbpwbxbfhyfgnbla8k8g9i6ffp0qrbw"))))
+    (build-system haskell-build-system)
+    (inputs
+     `(("ghc-base-compat" ,ghc-base-compat)
+       ("ghc-hspec" ,ghc-hspec)
+       ("ghc-quickcheck" ,ghc-quickcheck)
+       ("ghc-silently" ,ghc-silently)
+       ("ghc-stringbuilder" ,ghc-stringbuilder)
+       ("ghc-temporary" ,ghc-temporary)
+       ("hspec-discover" ,hspec-discover)))
+    (home-page "https://github.com/sol/markdown-unlit#readme")
+    (synopsis "Literate Haskell support for Markdown")
+    (description "This package allows you to have a README.md that at the
+same time is a literate Haskell program.")
+    (license license:expat)))
+
+(define-public corrode
+  (let ((commit "b6699fb2fa552a07c6091276285a44133e5c9789"))
+    (package
+      (name "corrode")
+      (version (string-append "0.0.1-" (string-take commit 7)))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/jameysharp/corrode.git")
+               (commit "b6699fb2fa552a07c6091276285a44133e5c9789")))
+         (file-name
+          (string-append name "-" version "-checkout"))
+         (sha256
+          (base32 "02v0yyj6sk4gpg2222wzsdqjxn8w66scbnf6b20x0kbmc69qcz4r"))))
+      (build-system haskell-build-system)
+      (inputs
+       `(("ghc-language-c" ,ghc-language-c)
+         ("ghc-markdown-unlit" ,ghc-markdown-unlit)))
+      (home-page "https://github.com/jameysharp/corrode")
+      (synopsis "Automatic semantics-preserving translation from C to Rust")
+      (description
+       "This program reads a C source file and prints an equivalent module in
+Rust syntax.  It is intended to be useful for two different purposes:
+
+@enumerate
+@item Partial automation for migrating legacy code that was implemented in C.
+@item A new, complementary approach to static analysis for C programs.
+@end enumerate\n")
+      (license license:gpl2+))))
+
+(define-public ghc-wave
+  (package
+    (name "ghc-wave")
+    (version "0.1.4")
+    (source (origin
+      (method url-fetch)
+      (uri (string-append
+             "https://hackage.haskell.org/package/wave/wave-"
+             version
+             ".tar.gz"))
+      (sha256
+        (base32
+          "1g5nmqfk6p25v9ismwz4i66ay91bd1qh39xwj0hm4z6a5mw8frk8"))))
+    (build-system haskell-build-system)
+    (inputs
+     `(("ghc-cereal" ,ghc-cereal)
+       ("ghc-data-default-class"
+        ,ghc-data-default-class)
+       ("ghc-quickcheck" ,ghc-quickcheck)
+       ("ghc-temporary" ,ghc-temporary)))
+    (native-inputs
+     `(("hspec-discover" ,hspec-discover)
+       ("ghc-hspec" ,ghc-hspec)))
+    (home-page "https://github.com/mrkkrp/wave")
+    (synopsis "Work with WAVE and RF64 files in Haskell")
+    (description "This package allows you to work with WAVE and RF64
+files in Haskell.")
+    (license license:bsd-3)))
+
 ;;; haskell.scm ends here
diff --git a/gnu/packages/hurd.scm b/gnu/packages/hurd.scm
index a4c0296b04..557091d055 100644
--- a/gnu/packages/hurd.scm
+++ b/gnu/packages/hurd.scm
@@ -28,12 +28,17 @@
   #:use-module (gnu packages bison)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages base)
-  #:use-module (guix git-download))
+  #:use-module (guix git-download)
+  #:export (hurd-triplet?))
+
+(define (hurd-triplet? triplet)
+  (and (string-suffix? "-gnu" triplet)
+       (not (string-contains triplet "linux"))))
 
 (define-public gnumach-headers
   (package
     (name "gnumach-headers")
-    (version "1.7")
+    (version "1.8")
     (source
      (origin
       (method url-fetch)
@@ -41,7 +46,7 @@
                           version ".tar.gz"))
       (sha256
        (base32
-        "1vd0bykshf6ilr55792b5lf6yd5ywlkp1wqz00dcsx7fq3rfadz2"))))
+        "02hygsfpd2dljl5lg1vjjg9pizi9jyxd4aiiqzjshz6jax62jm9f"))))
     (build-system gnu-build-system)
     (arguments
     `(#:phases (alist-replace
@@ -71,7 +76,7 @@
 (define-public mig
   (package
     (name "mig")
-    (version "1.7")
+    (version "1.8")
     (source
      (origin
       (method url-fetch)
@@ -79,7 +84,7 @@
                           version ".tar.gz"))
       (sha256
        (base32
-        "1hxqd8p14pgamgavmbmziswvd1zvwqx7lgc9qga805q9jrs93q2b"))))
+        "1gyda8sq6b379nx01hkpbd85lz39irdvz2b9wbr63gicicx8i706"))))
     (build-system gnu-build-system)
     ;; Flex is needed both at build and run time.
     (inputs `(("gnumach-headers" ,gnumach-headers)
@@ -102,14 +107,14 @@ communication.")
 (define-public hurd-headers
   (package
     (name "hurd-headers")
-    (version "0.8")
+    (version "0.9")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://gnu/hurd/hurd-"
                                   version ".tar.gz"))
               (sha256
                (base32
-                "1pbc4aqgzxvkgivw80ghp3w755cl0fwxmg357vq7chimj64jk78d"))))
+                "1nw9gly0n7pyv3cpfm4mmxy4yccrx4g0lyrvd3vk2vil26jpbggw"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("mig" ,mig)))
diff --git a/gnu/packages/idris.scm b/gnu/packages/idris.scm
new file mode 100644
index 0000000000..02198a5a7d
--- /dev/null
+++ b/gnu/packages/idris.scm
@@ -0,0 +1,256 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2015 Paul van der Walt <paul@denknerd.org>
+;;; Copyright © 2016, 2017 David Craven <david@craven.ch>
+;;;
+;;; 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 idris)
+  #:use-module (gnu packages haskell)
+  #:use-module (gnu packages multiprecision)
+  #:use-module (gnu packages ncurses)
+  #:use-module (guix build-system gnu)
+  #:use-module (guix build-system haskell)
+  #:use-module (guix download)
+  #:use-module (guix git-download)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix packages))
+
+(define-public idris
+  (package
+    (name "idris")
+    (version "0.99")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://hackage.haskell.org/package/"
+                    "idris-" version "/idris-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1sd4vy5rx0mp32xj99qijhknkgw4d2rxvz6wiy3pym6kaqmc497i"))))
+    (build-system haskell-build-system)
+    (inputs
+     `(("gmp" ,gmp)
+       ("ncurses" ,ncurses)
+       ("ghc-aeson" ,ghc-aeson)
+       ("ghc-async" ,ghc-async)
+       ("ghc-annotated-wl-pprint" ,ghc-annotated-wl-pprint)
+       ("ghc-ansi-terminal" ,ghc-ansi-terminal)
+       ("ghc-ansi-wl-pprint" ,ghc-ansi-wl-pprint)
+       ("ghc-base64-bytestring" ,ghc-base64-bytestring)
+       ("ghc-blaze-html" ,ghc-blaze-html)
+       ("ghc-blaze-markup" ,ghc-blaze-markup)
+       ("ghc-cheapskate" ,ghc-cheapskate)
+       ("ghc-fingertree" ,ghc-fingertree)
+       ("ghc-fsnotify" ,ghc-fsnotify)
+       ("ghc-ieee754" ,ghc-ieee754)
+       ("ghc-mtl" ,ghc-mtl)
+       ("ghc-network" ,ghc-network)
+       ("ghc-optparse-applicative" ,ghc-optparse-applicative)
+       ("ghc-parsers" ,ghc-parsers)
+       ("ghc-regex-tdfa" ,ghc-regex-tdfa)
+       ("ghc-safe" ,ghc-safe)
+       ("ghc-split" ,ghc-split)
+       ("ghc-tasty" ,ghc-tasty)
+       ("ghc-tasty-golden" ,ghc-tasty-golden)
+       ("ghc-tasty-rerun" ,ghc-tasty-rerun)
+       ("ghc-terminal-size" ,ghc-terminal-size)
+       ("ghc-text" ,ghc-text)
+       ("ghc-trifecta" ,ghc-trifecta)
+       ("ghc-uniplate" ,ghc-uniplate)
+       ("ghc-unordered-containers" ,ghc-unordered-containers)
+       ("ghc-utf8-string" ,ghc-utf8-string)
+       ("ghc-vector-binary-instances" ,ghc-vector-binary-instances)
+       ("ghc-vector" ,ghc-vector)
+       ("ghc-zip-archive" ,ghc-zip-archive)
+       ("ghc-zlib" ,ghc-zlib)))
+    (arguments
+     `(#:tests? #f ; FIXME: Test suite doesn't run in a sandbox.
+       #:configure-flags
+       (list (string-append "--datasubdir="
+                            (assoc-ref %outputs "out") "/lib/idris"))
+       #:phases
+       (modify-phases %standard-phases
+         (add-before 'configure 'set-cc-command
+           (lambda _
+             (setenv "CC" "gcc")
+             #t))
+         (add-after 'install 'fix-libs-install-location
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (lib (string-append out "/lib/idris"))
+                    (modules (string-append lib "/libs")))
+               (for-each
+                (lambda (module)
+                  (symlink (string-append modules "/" module)
+                           (string-append lib "/" module)))
+                '("prelude" "base" "contrib" "effects" "pruviloj"))))))))
+    (native-search-paths
+     (list (search-path-specification
+            (variable "IDRIS_LIBRARY_PATH")
+            (files '("lib/idris")))))
+    (home-page "http://www.idris-lang.org")
+    (synopsis "General purpose language with full dependent types")
+    (description "Idris is a general purpose language with full dependent
+types.  It is compiled, with eager evaluation.  Dependent types allow types to
+be predicated on values, meaning that some aspects of a program's behaviour
+can be specified precisely in the type.  The language is closely related to
+Epigram and Agda.")
+    (license license:bsd-3)))
+
+;; Idris modules use the gnu-build-system so that the IDRIS_LIBRARY_PATH is set.
+(define (idris-default-arguments name)
+  `(#:modules ((guix build gnu-build-system)
+               (guix build utils)
+               (ice-9 ftw)
+               (ice-9 match))
+    #:phases
+    (modify-phases %standard-phases
+      (delete 'configure)
+      (delete 'build)
+      (delete 'check)
+      (replace 'install
+        (lambda* (#:key inputs outputs #:allow-other-keys)
+          (let* ((out (assoc-ref outputs "out"))
+                 (idris (assoc-ref inputs "idris"))
+                 (idris-bin (string-append idris "/bin/idris"))
+                 (idris-libs (string-append idris "/lib/idris/libs"))
+                 (module-name (and (string-prefix? "idris-" ,name)
+                                   (substring ,name 6)))
+                 (ibcsubdir (string-append out "/lib/idris/" module-name))
+                 (ipkg (string-append module-name ".ipkg"))
+                 (idris-library-path (getenv "IDRIS_LIBRARY_PATH"))
+                 (idris-path (string-split idris-library-path #\:))
+                 (idris-path-files (apply append
+                                          (map (lambda (path)
+                                                 (map (lambda (dir)
+                                                        (string-append path "/" dir))
+                                                      (scandir path))) idris-path)))
+                 (idris-path-subdirs (filter (lambda (path)
+                                               (and path (match (stat:type (stat path))
+                                                           ('directory #t)
+                                                           (_ #f))))
+                                                    idris-path-files))
+                 (install-cmd (cons* idris-bin
+                                     "--ibcsubdir" ibcsubdir
+                                     "--install" ipkg
+                                     (apply append (map (lambda (path)
+                                                          (list "--idrispath"
+                                                                path))
+                                                        idris-path-subdirs)))))
+            (setenv "IDRIS_LIBRARY_PATH" idris-libs)
+            ;; FIXME: Seems to be a bug in idris that causes a dubious failure.
+            (apply system* install-cmd)
+            #t))))))
+
+(define-public idris-lightyear
+  (let ((commit "6d65ad111b4bed2bc131396f8385528fc6b3678a"))
+    (package
+      (name "idris-lightyear")
+      (version (git-version "0.1" "1" commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/ziman/lightyear")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "1pkxnn3ryr0v0cin4nasw7kgkc9dnnpja1nfbj466mf3qv5s98af"))))
+      (build-system gnu-build-system)
+      (native-inputs
+       `(("idris" ,idris)))
+      (arguments (idris-default-arguments name))
+      (home-page "https://github.com/ziman/lightyear")
+      (synopsis "Lightweight parser combinator library for Idris")
+      (description "Lightweight parser combinator library for Idris, inspired
+by Parsec.  This package is used (almost) the same way as Parsec, except for one
+difference: backtracking.")
+      (license license:bsd-2))))
+
+(define-public idris-wl-pprint
+  (let ((commit "1d365fcf4ba075859844dbc5eb96a90f57b9f338"))
+    (package
+      (name "idris-wl-pprint")
+      (version (git-version "0.1" "1" commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/shayan-najd/wl-pprint")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "0g7c3y9smifdz4sivi3qmvymhdr7v9kfq45fmfmmvkqcrix0spzn"))))
+      (build-system gnu-build-system)
+      (native-inputs
+       `(("idris" ,idris)))
+      (arguments (idris-default-arguments name))
+      (home-page "https://github.com/shayan-najd/wl-pprint")
+      (synopsis "Pretty printing library")
+      (description "A pretty printing library for Idris based on Phil Wadler's
+paper A Prettier Printer and on Daan Leijen's extensions in the Haskell
+wl-pprint library.")
+      (license license:bsd-2))))
+
+(define-public idris-bifunctors
+  (let ((commit "53d06a6ccfe70c49c9ae8c8a4135981dd2173202"))
+    (package
+      (name "idris-bifunctors")
+      (version (git-version "0.1" "1" commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/HuwCampbell/Idris-Bifunctors")
+                      (commit commit)))
+                (file-name (string-append name "-" version "-checkout"))
+                (sha256
+                 (base32
+                  "02vbsd3rmgnj0l1qq787709qcxjbr9890cbad4ykn27f77jk81h4"))))
+      (build-system gnu-build-system)
+      (native-inputs
+       `(("idris" ,idris)))
+      (arguments (idris-default-arguments name))
+      (home-page "https://github.com/HuwCampbell/Idris-Bifunctors")
+      (synopsis "Bifunctor library")
+      (description "This is a bifunctor library for Idris based off the
+excellent Haskell Bifunctors package from Edward Kmett.")
+      (license license:bsd-3))))
+
+(define-public idris-lens
+  (let ((commit "26f012005f6849806cea630afe317e42cae97f29"))
+    (package
+      (name "idris-lens")
+      (version (git-version "0.1" "1" commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/HuwCampbell/idris-lens")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "06jzfj6rad08rk92w8jk5byi79svmyg0mrcqhibgx8rkjjy6vmai"))))
+      (build-system gnu-build-system)
+      (native-inputs
+       `(("idris" ,idris)))
+      (propagated-inputs
+       `(("idris-bifunctors" ,idris-bifunctors)))
+      (arguments (idris-default-arguments name))
+      (home-page "https://github.com/HuwCampbell/idris-lens")
+      (synopsis "Van Laarhoven lenses for Idris")
+      (description "Lenses are composable functional references.  They allow
+accessing and modifying data within a structure.")
+      (license license:bsd-3))))
diff --git a/gnu/packages/image-viewers.scm b/gnu/packages/image-viewers.scm
index 11cead6b36..bc56041f84 100644
--- a/gnu/packages/image-viewers.scm
+++ b/gnu/packages/image-viewers.scm
@@ -3,6 +3,7 @@
 ;;; Copyright © 2014 Ian Denhardt <ian@zenhack.net>
 ;;; Copyright © 2015, 2016 Alex Kost <alezost@gmail.com>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2017 Alex Griffin <a@ajgrf.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -39,7 +40,7 @@
 (define-public feh
   (package
     (name "feh")
-    (version "2.14.1")
+    (version "2.18")
     (home-page "https://feh.finalrewind.org/")
     (source (origin
               (method url-fetch)
@@ -47,7 +48,7 @@
                                   name "-" version ".tar.bz2"))
               (sha256
                (base32
-                "1hlzgr0masgbm1vdn085vz81s9kpnah8kjkb1w1xfsxr1b99x8f0"))))
+                "036lgv81d0vmrnmh1z1x360nr5avb2sk5jb1h3g5n6jijm8vzblx"))))
     (build-system gnu-build-system)
     (arguments
       '(#:phases (alist-delete 'configure %standard-phases)
diff --git a/gnu/packages/image.scm b/gnu/packages/image.scm
index 487635de15..a9bbf192cc 100644
--- a/gnu/packages/image.scm
+++ b/gnu/packages/image.scm
@@ -8,7 +8,8 @@
 ;;; Copyright © 2015 Amirouche Boubekki <amirouche@hypermove.net>
 ;;; Copyright © 2014 John Darrington <jmd@gnu.org>
 ;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
-;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016, 2017 Leo Famulari <leo@famulari.name>
+;;; Copyright © 2016, 2017 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2016 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2016 Arun Isaac <arunisaac@systemreboot.net>
@@ -64,6 +65,7 @@
 (define-public libpng
   (package
    (name "libpng")
+   (replacement libpng/fixed)
    (version "1.6.25")
    (source (origin
             (method url-fetch)
@@ -88,10 +90,19 @@ library.  It supports almost all PNG features and is extensible.")
    (license license:zlib)
    (home-page "http://www.libpng.org/pub/png/libpng.html")))
 
+(define libpng/fixed
+  (package
+    (inherit libpng)
+    (source
+      (origin
+        (inherit (package-source libpng))
+        (patches (search-patches "libpng-CVE-2016-10087.patch"))))))
+
 (define-public libpng-1.2
   (package
     (inherit libpng)
-    (version "1.2.56")
+    (replacement #f)
+    (version "1.2.57")
     (source
      (origin
        (method url-fetch)
@@ -102,7 +113,7 @@ library.  It supports almost all PNG features and is extensible.")
                    "ftp://ftp.simplesystems.org/pub/libpng/png/src"
                    "/libpng12/libpng-" version ".tar.xz")))
        (sha256
-        (base32 "1ghd03p353x0vi4dk83n1nlldg11w7vqdk3f99rkgfb82ic59ki4"))))))
+        (base32 "1n2lrzjkm5jhfg2bs10q398lkwbbx742fi27zgdgx0x23zhj0ihg"))))))
 
 (define-public libjpeg
   (package
@@ -248,6 +259,7 @@ extracting icontainer icon files.")
 (define-public libtiff
   (package
    (name "libtiff")
+   (replacement libtiff/fixed)
    (version "4.0.7")
    (source (origin
             (method url-fetch)
@@ -280,6 +292,28 @@ collection of tools for doing simple manipulations of TIFF images.")
                                   "See COPYRIGHT in the distribution."))
    (home-page "http://www.simplesystems.org/libtiff/")))
 
+(define libtiff/fixed
+  (package
+    (inherit libtiff)
+    (source
+      (origin
+        (inherit (package-source libtiff))
+        (patches (search-patches "libtiff-heap-overflow-tiffcp.patch"
+                                 "libtiff-null-dereference.patch"
+                                 "libtiff-heap-overflow-tif-dirread.patch"
+                                 "libtiff-heap-overflow-pixarlog-luv.patch"
+                                 "libtiff-divide-by-zero.patch"
+                                 "libtiff-divide-by-zero-ojpeg.patch"
+                                 "libtiff-tiffcp-underflow.patch"
+                                 "libtiff-invalid-read.patch"
+                                 "libtiff-CVE-2016-10092.patch"
+                                 "libtiff-heap-overflow-tiffcrop.patch"
+                                 "libtiff-divide-by-zero-tiffcrop.patch"
+                                 "libtiff-CVE-2016-10093.patch"
+                                 "libtiff-divide-by-zero-tiffcp.patch"
+                                 "libtiff-assertion-failure.patch"
+                                 "libtiff-CVE-2016-10094.patch"))))))
+
 (define-public libwmf
   (package
     (name "libwmf")
@@ -329,28 +363,23 @@ the W3C's XML-based Scaleable Vector Graphic (SVG) format.")
 (define-public leptonica
   (package
     (name "leptonica")
-    (version "1.72")
+    (version "1.74.0")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "http://www.leptonica.com/source/leptonica-"
-                           version ".tar.gz"))
+       (uri (string-append
+             "https://github.com/DanBloomberg/leptonica/archive/" version
+             ".tar.gz"))
+       (file-name (string-append "leptonica-" version ".tar.gz"))
        (sha256
-        (base32 "0mhzvqs0im04y1cpcc1yma70hgdac1frf33h73m9z3356bfymmbr"))
-       (modules '((guix build utils)))
-       ;; zlib and openjpg should be under Libs, not Libs.private.  See:
-       ;; https://code.google.com/p/tesseract-ocr/issues/detail?id=1436
-       (snippet
-        '(substitute* "lept.pc.in"
-           (("^(Libs\\.private: .*)@ZLIB_LIBS@(.*)" all pre post)
-            (string-append pre post))
-           (("^(Libs\\.private: .*)@JPEG_LIBS@(.*)" all pre post)
-            (string-append pre post))
-           (("^Libs: .*" all)
-            (string-append all " @ZLIB_LIBS@ @JPEG_LIBS@"))))))
+        (base32 "0i2a4vx9gizki0wgmv03xjz8j9d8agkvbag1a8m4kcw4asd4p87g"))))
     (build-system gnu-build-system)
     (native-inputs
-     `(("gnuplot" ,gnuplot)))           ;needed for test suite
+     `(("gnuplot" ,gnuplot)             ;needed for test suite
+       ("autoconf" ,autoconf)
+       ("automake" ,automake)
+       ("libtool" ,libtool)
+       ("pkg-config" ,pkg-config)))
     (inputs
      `(("giflib" ,giflib)
        ("libjpeg" ,libjpeg)
@@ -358,31 +387,22 @@ the W3C's XML-based Scaleable Vector Graphic (SVG) format.")
        ("libtiff" ,libtiff)
        ("libwebp" ,libwebp)))
     (propagated-inputs
+     ;; Linking a program with leptonica also requires these.
      `(("openjpeg" ,openjpeg)
        ("zlib" ,zlib)))
     (arguments
-     '(#:parallel-tests? #f ; XXX: cause fpix1_reg to fail
-       #:phases
+     '(#:phases
        (modify-phases %standard-phases
-         ;; Prevent make from trying to regenerate config.h.in.
-         (add-after
-          'unpack 'set-config-h-in-file-time
-          (lambda _
-            (set-file-time "config/config.h.in" (stat "configure"))))
-         (add-after
-          'unpack 'patch-reg-wrapper
-          (lambda _
-            (substitute* "prog/reg_wrapper.sh"
-              ((" /bin/sh ")
-               (string-append " " (which "sh") " "))
-              (("which gnuplot") (which "gnuplot")))))
-         (add-before
-          'check 'disable-failing-tests
-          ;; XXX: 2 of 9 tests from webpio_reg fails.
-          (lambda _
-            (substitute* "prog/webpio_reg.c"
-              ((".*DoWebpTest2.* 90.*") "")
-              ((".*DoWebpTest2.* 100.*") "")))))))
+         (add-after 'unpack 'autogen
+           (lambda _
+             (zero? (system* "sh" "autobuild"))))
+         (add-after 'unpack 'patch-reg-wrapper
+           (lambda _
+             (substitute* "prog/reg_wrapper.sh"
+               ((" /bin/sh ")
+                (string-append " " (which "sh") " "))
+               (("which gnuplot")
+                "true")))))))
     (home-page "http://www.leptonica.com/")
     (synopsis "Library and tools for image processing and analysis")
     (description
@@ -584,7 +604,7 @@ compose, and analyze GIF images.")
        ("libtiff" ,libtiff)
        ("giflib" ,giflib)
        ("bzip2" ,bzip2)))
-    (home-page "http://sourceforge.net/projects/enlightenment/")
+    (home-page "https://sourceforge.net/projects/enlightenment/")
     (synopsis
      "Loading, saving, rendering and manipulating image files")
     (description
@@ -879,14 +899,14 @@ convert, manipulate, filter and display a wide variety of image formats.")
 (define-public jasper
   (package
     (name "jasper")
-    (version "2.0.6")
+    (version "2.0.10")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://www.ece.uvic.ca/~frodo/jasper"
                                   "/software/jasper-" version ".tar.gz"))
               (sha256
                (base32
-                "0g6fl8rrbspa9vpswixmpxrg71l19kqgc2b5cak7vmwxphj01wbk"))))
+                "1s022mfxyw8jw60fgyj60lbm9h6bc4nk2751b0in8qsjwcl59n2l"))))
     (build-system cmake-build-system)
     (inputs `(("libjpeg" ,libjpeg)))
     (synopsis "JPEG-2000 library")
diff --git a/gnu/packages/imagemagick.scm b/gnu/packages/imagemagick.scm
index 6f450a373b..d654c3be2e 100644
--- a/gnu/packages/imagemagick.scm
+++ b/gnu/packages/imagemagick.scm
@@ -43,14 +43,17 @@
 (define-public imagemagick
   (package
     (name "imagemagick")
-    (version "6.9.6-7")
+    ;; The 7 release series has an incompatible API, while the 6 series is still
+    ;; maintained. Don't update to 7 until we've made sure that the ImageMagick
+    ;; users are ready for the 7-series API.
+    (version "6.9.7-3")
     (source (origin
              (method url-fetch)
              (uri (string-append "mirror://imagemagick/ImageMagick-"
                                  version ".tar.xz"))
              (sha256
               (base32
-               "1ls3g4gpdh094n03szr9arpr0rfwd1krv2s9gnck8j0ab10ccgs5"))))
+               "18cibh5rmxddwpsrpzjd4sbim80g5w36zhl8bw582nw39cs6f5w0"))))
     (build-system gnu-build-system)
     (arguments
      `(#:configure-flags '("--with-frozenpaths" "--without-gcc-arch")
diff --git a/gnu/packages/inkscape.scm b/gnu/packages/inkscape.scm
index d98a4cd7a9..e20ca666bd 100644
--- a/gnu/packages/inkscape.scm
+++ b/gnu/packages/inkscape.scm
@@ -23,7 +23,7 @@
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix utils)
-  #:use-module (guix build-system gnu)
+  #:use-module (guix build-system cmake)
   #:use-module (gnu packages)
   #:use-module (gnu packages aspell)
   #:use-module (gnu packages bdw-gc)
@@ -44,20 +44,16 @@
 (define-public inkscape
   (package
     (name "inkscape")
-    (version "0.91")
+    (version "0.92.0")
     (source (origin
               (method url-fetch)
-              (uri (string-append "https://launchpad.net/inkscape/"
-                                  (version-major+minor version) ".x/"
-                                  version "/+download/inkscape-"
-                                  version ".tar.gz"))
+              (uri (string-append "https://media.inkscape.org/dl/"
+                                  "resources/file/"
+                                  "inkscape-" version ".tar.bz2"))
               (sha256
                (base32
-                "086v01jy896dj86bq7plrf6si4p6gh6ga2v5417llgmminycz8rc"))
-              (patch-flags '("-p0"))
-              (patches
-               (search-patches "inkscape-drop-wait-for-targets.patch"))))
-    (build-system gnu-build-system)
+                "0mmssxnxsvb3bpm7ck5pqvwyacrz1nkyacs571jx8j04l1cw3d5q"))))
+    (build-system cmake-build-system)
     (inputs
      `(("aspell" ,aspell)
        ("gtkmm" ,gtkmm-2)
@@ -75,19 +71,11 @@
        ("boost" ,boost)))
     (native-inputs
      `(("intltool" ,intltool)
+       ("glib" ,glib "bin")
        ("perl" ,perl)
        ("pkg-config" ,pkg-config)))
-    (arguments
-     `(;; Add '-std=c++11', required by recent versions of GLibmm & co.
-       ;; Use '-g0' to reduce disk usage during the build.
-       #:configure-flags '("CXXFLAGS=-g0 -O2 -fopenmp -std=c++11")
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'fix-test-includes
-           (lambda _
-             (substitute* "src/cxxtests.cpp"
-               (("\\.\\./\\.\\./src") "../src"))
-             #t)))))
+    ;; FIXME: tests require gmock
+    (arguments `(#:tests? #f))
     (home-page "http://inkscape.org/")
     (synopsis "Vector graphics editor")
     (description "Inkscape is a vector graphics editor.  What sets Inkscape
diff --git a/gnu/packages/irc.scm b/gnu/packages/irc.scm
index 913259006c..44e21af7d6 100644
--- a/gnu/packages/irc.scm
+++ b/gnu/packages/irc.scm
@@ -100,7 +100,7 @@ irssi, but graphical.")
 (define-public irssi
   (package
     (name "irssi")
-    (version "0.8.20")
+    (version "1.0.0")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://github.com/irssi/irssi/"
@@ -108,31 +108,29 @@ irssi, but graphical.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "0njh43xmpad9h5g6fp1805hrix1mwbbnk7p6qmlw9apm47lc90kq"))))
+               "1f2gmr5nynagwi4wx3yprhzfpg4ww6r7ff395b0a48d0qqgkr2ka"))))
     (build-system gnu-build-system)
     (arguments
      `(#:phases
        (modify-phases %standard-phases
          (replace 'configure
            (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let ((out (assoc-ref outputs "out"))
-                   (ncurses (assoc-ref inputs "ncurses")))
+             (let ((out (assoc-ref outputs "out")))
                (setenv "CONFIG_SHELL" (which "bash"))
                (zero?
                 (system* "./configure"
                          (string-append "--prefix=" out)
-                         (string-append "--with-ncurses=" ncurses)
                          (string-append "--with-proxy")
                          (string-append "--with-socks")
                          (string-append "--with-bot")))))))))
     (inputs
      `(("glib" ,glib)
        ("ncurses" ,ncurses)
-       ("openssl" ,openssl)))
-    (native-inputs
-     `(("pkg-config" ,pkg-config)
+       ("openssl" ,openssl)
        ("perl" ,perl)))
-    (home-page "http://www.irssi.org/")
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (home-page "https://irssi.org/")
     (synopsis "Terminal-based IRC client")
     (description
      "Irssi is a terminal based IRC client for UNIX systems.  It also supports
@@ -146,10 +144,10 @@ SILC and ICB protocols via plugins.")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://weechat.org/files/src/weechat-"
-                                  version ".tar.gz"))
+                                  version ".tar.xz"))
               (sha256
                (base32
-                "0lyqrymdjdvkzg8510l46c4zw8mjagnmri2i6m9y9qz0c1sfaq9h"))
+                "1qqnb9bdi15l30378rnmhf26ndacwi5hmq5vpz4lfyihk17xnryn"))
               (patches (search-patches "weechat-python.patch"))))
     (build-system gnu-build-system)
     (native-inputs `(("autoconf" ,autoconf)
diff --git a/gnu/packages/java.scm b/gnu/packages/java.scm
index df8a970e0c..3a08fd83a8 100644
--- a/gnu/packages/java.scm
+++ b/gnu/packages/java.scm
@@ -783,7 +783,7 @@ build process and its dependencies, whereas Make uses Makefile format.")
     (license license:gpl2+)))
 
 (define-public icedtea-7
-  (let* ((version "2.6.7")
+  (let* ((version "2.6.8")
          (drop (lambda (name hash)
                  (origin
                    (method url-fetch)
@@ -800,7 +800,7 @@ build process and its dependencies, whereas Make uses Makefile format.")
                       version ".tar.xz"))
                 (sha256
                  (base32
-                  "1r4y1afjdm72j4lkd1jsim595zy5s3hvc3dnl13f5a7wrxp2v4nh"))
+                  "0p95402viz6dnfkhhn18hrvm7wqfvij0xnxvp9nqj3aq3gzk0h45"))
                 (modules '((guix build utils)))
                 (snippet
                  '(substitute* "Makefile.in"
@@ -927,25 +927,25 @@ build process and its dependencies, whereas Make uses Makefile format.")
       (native-inputs
        `(("openjdk-src"
           ,(drop "openjdk"
-                 "0y38vgvzw2xggfg0nlalv42amy5sv6vzvjxik8bvkm1sajzazb2w"))
+                 "1qscircx5z9rnyx4k6lzxbrl5q6f9shag962zl0f52cyrcma5gp6"))
          ("corba-drop"
           ,(drop "corba"
-                 "0r778nhmzcnf6jkl50f6f279vbzh96rcwr74vb0930wgl2g46j80"))
+                 "0f25l1db5v9ib4v5wb32wjblb2zzx8f8qgr2g84yg26aq2m8swig"))
          ("jaxp-drop"
           ,(drop "jaxp"
-                 "02y7zaw4irjvbihpr4pbrl64pxjx5anfxms3i24rp1q6aj2n1gcz"))
+                 "1z4i404i3rrf5zmch8z2rslqm7vs1wzjhvjf6kgkdvnrka7a86xs"))
          ("jaxws-drop"
           ,(drop "jaxws"
-                 "1xrhdgykpi7amyyirzchp4mjrx2j3xm6nqg4bbfy2kxv7daw3z69"))
+                 "06h49jgf76408j1qhhkksly8fbyw1wisyvgi1csvj2f63bkr6c3m"))
          ("jdk-drop"
           ,(drop "jdk"
-                 "108d560iabk334lcifr5xf1w075a6c918smpbcaccsrln8qd6g79"))
+                 "0qg76gjlnyrjskzz019fi47vqdxpa51sdhcyx4lsa25j5vsih4gc"))
          ("langtools-drop"
           ,(drop "langtools"
-                 "1r5llvhxzdihyz6rmr6ri9wz8zvbw4gmlllhb340p86liqqh1rqk"))
+                 "04w82l34z83n8cd901bvmlrdk825nw5ijgny5cn1idnhplzcckh0"))
          ("hotspot-drop"
           ,(drop "hotspot"
-                 "0p3arg01jfdnbx856qfhhzp7s9yzmqwa1fspk5spmmxb9m7mj4h4"))
+                 "153i1panv3mzwh39dc8rxr9hj5920y86a4m8djxsk6qnyd4gamfa"))
          ,@(fold alist-delete (package-native-inputs icedtea-6)
                  '("openjdk6-src"))))
       (inputs
@@ -953,7 +953,7 @@ build process and its dependencies, whereas Make uses Makefile format.")
          ,@(package-inputs icedtea-6))))))
 
 (define-public icedtea-8
-  (let* ((version "3.1.0")
+  (let* ((version "3.2.0")
          (drop (lambda (name hash)
                  (origin
                    (method url-fetch)
@@ -962,7 +962,7 @@ build process and its dependencies, whereas Make uses Makefile format.")
                          "/icedtea8/" version "/" name ".tar.xz"))
                    (sha256 (base32 hash))))))
     (package (inherit icedtea-7)
-      (version "3.1.0")
+      (version "3.2.0")
       (source (origin
                 (method url-fetch)
                 (uri (string-append
@@ -970,7 +970,7 @@ build process and its dependencies, whereas Make uses Makefile format.")
                       version ".tar.xz"))
                 (sha256
                  (base32
-                  "1d1kj8a6jbvcbzhmfrx2pca7pinsvpxd7zij9h93g13dmm0ncqbm"))
+                  "104g2x5nhnqqvx6x29phx5vlrhlqy7qax83b9bqj1y619irrg8gj"))
                 (modules '((guix build utils)))
                 (snippet
                  '(substitute* "Makefile.am"
@@ -985,6 +985,8 @@ build process and its dependencies, whereas Make uses Makefile format.")
                "--enable-bootstrap"
                "--enable-nss"
                "--disable-downloading"
+               "--disable-system-pcsc"
+               "--disable-system-sctp"
                "--disable-tests"      ;they are run in the check phase instead
                "--with-openjdk-src-dir=./openjdk.src"
                ,(string-append "--with-jdk-home=" jdk))))
@@ -1038,31 +1040,31 @@ build process and its dependencies, whereas Make uses Makefile format.")
        `(("jdk" ,icedtea-7 "jdk")
          ("openjdk-src"
           ,(drop "openjdk"
-                 "1p6xgf00w754y3xdrccs67gjhb0181q49dk67h5v43aixkx7z7y1"))
+                 "093r3vlmbdx78w9s6d8lv4q65i0s9wq6an6i2g2d1zaf0js4043c"))
          ("corba-drop"
           ,(drop "corba"
-                 "088wnyfdhqkvc41pl3swnynbxx7x5lha6qg7q0biai6ya114scsy"))
+                 "11r3h9snnj7m5bqnzc5ryd85igdv7xlwzs0zy24p9ii6gsc0f9lh"))
          ("jaxp-drop"
           ,(drop "jaxp"
-                 "18xc4sib85z2zhz4k5lvi5b4vn88zqjpa3wi8gav81vz5gyysn3d"))
+                 "1mp6ps15jk8v4nnvkmbvkk7g35icdjv7892q2a4f7b268yjcgmk1"))
          ("jaxws-drop"
           ,(drop "jaxws"
-                 "1my72q2zjly4imn834zgf4rysn48gbr8i81rxzrfdqgzzinxf6l1"))
+                 "1fb5hikzzx8292nhdbp0snqn66fwnnv4rkjsk1zsjvrv4z5vk18j"))
          ("jdk-drop"
           ,(drop "jdk"
-                 "1ab2h7pppph82h3xhh1m5dha77j3wnhksq7c7f8yfcsyhr5hm243"))
+                 "1if9c5grp0km7pyn4mhfwi2ynh3ix20l1fqbfcy68sl2py7psmcj"))
          ("langtools-drop"
           ,(drop "langtools"
-                 "07bzcw2ml4apjfd0ydc3v44fnnwinwri114fig2mdcn1n388szra"))
+                 "0kbah4h4pllk0gf50mp5f6720f5ci0ixqylccppb484hp95pblcl"))
          ("hotspot-drop"
           ,(drop "hotspot"
-                 "0x5ic8cz3w9s8m8ynh31qlf47c6nwc512bp8ddwgmvsdxyiiwn1k"))
+                 "1gqz9qqsi61838dj08s01sa51zlnkvrk3hy721211dhnmkvlzmwx"))
          ("nashorn-drop"
           ,(drop "nashorn"
-                 "0zyd8pyv1il8c9npw7wz1mwxhlq510ill20nhc7i8fq7gignzcsn"))
+                 "04697l95g6y6n5dvy55k2040c6qp5hfz16qaibwzs594m3gzwwjz"))
          ("shenandoah-drop"
           ,(drop "shenandoah"
-                 "1shisljn60zw9j4nahh07vw85gj25gfiy7z196fdw0pi95va6qwk"))
+                 "0k6h7jk5i98jnld2ivy4bhydmkzrp25c3l6gwhvczvrhn7mlbnfx"))
          ,@(fold alist-delete (package-native-inputs icedtea-7)
                  '("gcj" "openjdk-src" "corba-drop" "jaxp-drop" "jaxws-drop"
                    "jdk-drop" "langtools-drop" "hotspot-drop")))))))
diff --git a/gnu/packages/kde-frameworks.scm b/gnu/packages/kde-frameworks.scm
index 8b841330b8..36c2851567 100644
--- a/gnu/packages/kde-frameworks.scm
+++ b/gnu/packages/kde-frameworks.scm
@@ -25,6 +25,7 @@
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
   #:use-module (guix utils)
+  #:use-module (gnu packages)
   #:use-module (gnu packages acl)
   #:use-module (gnu packages admin)
   #:use-module (gnu packages attr)
@@ -50,7 +51,8 @@
   #:use-module (gnu packages version-control)
   #:use-module (gnu packages web)
   #:use-module (gnu packages xml)
-  #:use-module (gnu packages xorg))
+  #:use-module (gnu packages xorg)
+  #:use-module (srfi srfi-1))
 
 (define-public extra-cmake-modules
   (package
@@ -516,7 +518,8 @@ many more.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "07mzb1xr8wyiid25p8kg6mjp6vq8ngvv1ikhq75zvd2cbax530c8"))))
+                "07mzb1xr8wyiid25p8kg6mjp6vq8ngvv1ikhq75zvd2cbax530c8"))
+              (patches (search-patches "kdbusaddons-kinit-file-name.patch"))))
     (build-system cmake-build-system)
     (native-inputs
      `(("extra-cmake-modules" ,extra-cmake-modules)
@@ -524,10 +527,18 @@ many more.")
        ("qttools" ,qttools)))
     (inputs
      `(("qtbase" ,qtbase)
-       ("qtx11extras" ,qtx11extras)))
+       ("qtx11extras" ,qtx11extras)
+       ("kinit" ,kinit-bootstrap))) ;; kinit-bootstrap: kinit package which does not depend on kdbusaddons.
     (arguments
      `(#:phases
        (modify-phases %standard-phases
+         (add-before
+          'configure 'patch-source
+          (lambda* (#:key inputs #:allow-other-keys)
+            ;; look for the kdeinit5 executable in kinit's store directory,
+            ;; instead of the current application's directory:
+            (substitute* "src/kdeinitinterface.cpp"
+              (("@SUBSTITUTEME@") (assoc-ref inputs "kinit")))))
          (replace 'check
            (lambda _
              (setenv "DBUS_FATAL_WARNINGS" "0")
@@ -1289,8 +1300,8 @@ integrated it into your application's other widgets.")
          (add-before 'check 'start-xorg-server
            (lambda* (#:key inputs #:allow-other-keys)
              ;; The test suite requires a running X server.
-             (system (string-append (assoc-ref inputs "xorg-server")
-                                    "/bin/Xvfb :1 &"))
+             (system "Xvfb :1 &")
+             (sleep 2)              ;XXX: give the server enough time to start
              (setenv "DISPLAY" ":1")
              #t)))))
     (home-page "https://community.kde.org/Frameworks")
@@ -2866,3 +2877,22 @@ setUrl, setUserAgent and call.")
 script engines.")
     ;; dual licensed
     (license (list license:gpl2+ license:lgpl2.1+))))
+
+;; This version of kdbusaddons does not use kinit as an input, and is used to
+;; build kinit-bootstrap, as well as bootstrap versions of all kinit
+;; dependencies which also rely on kdbusaddons.
+(define kdbusaddons-bootstrap
+  (package
+    (inherit kdbusaddons)
+    (source (origin
+              (inherit (package-source kdbusaddons))
+              (patches '())))
+    (inputs (alist-delete "kinit" (package-inputs kdbusaddons)))
+    (arguments
+     (substitute-keyword-arguments (package-arguments kdbusaddons)
+       ((#:phases phases)
+        `(modify-phases ,phases
+           (delete 'patch-source)))))))
+
+(define kinit-bootstrap
+  ((package-input-rewriting `((,kdbusaddons . ,kdbusaddons-bootstrap))) kinit))
diff --git a/gnu/packages/kde.scm b/gnu/packages/kde.scm
index 9099c5f84a..db8609a645 100644
--- a/gnu/packages/kde.scm
+++ b/gnu/packages/kde.scm
@@ -23,12 +23,101 @@
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
   #:use-module (guix utils)
+  #:use-module (gnu packages apr)
+  #:use-module (gnu packages boost)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages documentation)
+  #:use-module (gnu packages gl)
+  #:use-module (gnu packages gnome)
   #:use-module (gnu packages kde-frameworks)
+  #:use-module (gnu packages llvm)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages tls)
-  #:use-module (gnu packages qt))
+  #:use-module (gnu packages qt)
+  #:use-module (gnu packages version-control))
+
+(define-public kdevelop
+  (package
+    (name "kdevelop")
+    (version "5.0.2")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (string-append "mirror://kde/stable/kdevelop"
+                            "/" version "/src/kdevelop-"
+                            version ".tar.xz"))
+        (sha256
+         (base32
+          "0rl6csmzf14gf0r0mk7z2lj7cq8fggf5qmlbxq6j68vp2q0pj0cv"))))
+    (build-system cmake-build-system)
+    (native-inputs
+     `(("extra-cmake-modules" ,extra-cmake-modules)
+       ("pkg-config" ,pkg-config)
+       ("qttools" ,qttools)))
+    (inputs
+     `(("kdevplatform" ,kdevplatform)
+       ("kdevelop-pg-qt" ,kdevelop-pg-qt)
+       ("qtbase" ,qtbase)
+       ("qtdeclarative" ,qtdeclarative)
+       ("qtquickcontrols" ,qtquickcontrols)
+       ("qtwebkit" ,qtwebkit)
+       ("karchive" ,karchive)
+       ("kcmutils" ,kcmutils)
+       ("kconfig" ,kconfig)
+       ("kdeclarative" ,kdeclarative)
+       ("kdoctools" ,kdoctools)
+       ("kguiaddons" ,kguiaddons)
+       ("ki18n" ,ki18n)
+       ("kio" ,kio)
+       ("kiconthemes" ,kiconthemes)
+       ("kitemmodels" ,kitemmodels)
+       ("kitemviews" ,kitemviews)
+       ("kjobwidgets" ,kjobwidgets)
+       ("knotifyconfig" ,knotifyconfig)
+       ("knotifications" ,knotifications)
+       ("kparts" ,kparts)
+       ("kcrash" ,kcrash)
+       ("knewstuff" ,knewstuff)
+       ("krunner" ,krunner)
+       ("kxmlgui" ,kxmlgui)
+       ("libksysguard" ,libksysguard)
+       ("threadweaver" ,threadweaver)
+       ("ktexteditor" ,ktexteditor)
+       ("kwindowsystem" ,kwindowsystem)
+       ("plasma" ,plasma-framework)
+       ("grantlee" ,grantlee)
+       ("libepoxy" ,libepoxy)
+       ("clang" ,clang)
+       ("shared-mime-info" ,shared-mime-info)))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (delete 'check) ;; there are some issues with the test suite
+         (add-after 'install 'wrap-executable
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let* ((out  (assoc-ref outputs "out"))
+                    (kdevplatform (assoc-ref inputs "kdevplatform"))
+                    (kio (assoc-ref inputs "kio"))
+                    (qtquickcontrols (assoc-ref inputs "qtquickcontrols"))
+                    (qtdeclarative (assoc-ref inputs "qtdeclarative"))
+                    (plugins "/lib/plugins")
+                    (qml "/qml"))
+               (wrap-program (string-append out "/bin/kdevelop")
+                 `("QT_PLUGIN_PATH" ":" prefix
+                   (,(string-append out plugins)
+                    ,(string-append kdevplatform plugins)
+                    ,(string-append kio plugins)))
+                 `("QML2_IMPORT_PATH" ":" prefix
+                   (,(string-append qtquickcontrols qml)
+                    ,(string-append qtdeclarative qml))))))))))
+    (home-page "https://kdevelop.org")
+    (synopsis "IDE for C, C++, Python, Javascript and PHP")
+    (description "The KDevelop IDE provides semantic syntax highlighting, as
+well as code navigation and completion for C, C++ (using Clang/LLVM), QML,
+JavaScript, Python and PHP.  It also integrates with a debugger, different
+build systems (CMake, QMake, custom Makefiles) and version control
+software (Git, Subversion, Mercurial, CVS and Bazaar).")
+    (license license:lgpl2.1+)))
 
 (define-public kdevelop-pg-qt
   (package
@@ -53,6 +142,79 @@
 for some KDevelop language plugins (Ruby, PHP, CSS...).")
     (license license:lgpl2.0+)))
 
+(define-public kdevplatform
+  (package
+    (name "kdevplatform")
+    (version "5.0.2")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/KDE/kdevplatform/archive/v"
+                                  version ".tar.gz"))
+              (sha256
+               (base32
+                "1m8c0ixv91diyy9bvq53d4jik4zrnf7bix7clad4ywxnlpcs4ahr"))
+              (file-name (string-append name "-" version ".tar.gz"))))
+    (build-system cmake-build-system)
+    (native-inputs
+     `(("extra-cmake-modules" ,extra-cmake-modules)
+       ("pkg-config" ,pkg-config)))
+    (inputs
+     `(("apr" ,apr)
+       ("apr-util" ,apr-util)
+       ("boost" ,boost)
+       ("karchive" ,karchive)
+       ("kconfigwidgets" ,kconfigwidgets)
+       ("kcmutils" ,kcmutils)
+       ("kiconthemes" ,kiconthemes)
+       ("kdeclarative" ,kdeclarative)
+       ("kdoctools" ,kdoctools)
+       ("kguiaddons" ,kguiaddons)
+       ("kinit" ,kinit)
+       ("kitemmodels" ,kitemmodels)
+       ("knewstuff" ,knewstuff)
+       ("knotifications" ,knotifications)
+       ("knotifyconfig" ,knotifyconfig)
+       ("kwindowsystem" ,kwindowsystem)
+       ("kio" ,kio)
+       ("ki18n" ,ki18n)
+       ("kparts" ,kparts)
+       ("kservice" ,kservice)
+       ("grantlee" ,grantlee)
+       ("libkomparediff2" ,libkomparediff2)
+       ("sonnet" ,sonnet)
+       ("threadweaver" ,threadweaver)
+       ("ktexteditor" ,ktexteditor)
+       ("qtbase" ,qtbase)
+       ("qtdeclarative" ,qtdeclarative)
+       ("qtscript" ,qtscript)
+       ("qtwebkit" ,qtwebkit)
+       ("qtx11extras" ,qtx11extras)
+       ("plasma" ,plasma-framework)
+       ("subversion" ,subversion)
+       ("zlib" ,zlib)))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (delete 'check)
+         (add-after 'install 'check ;; add-after 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (setenv "CTEST_OUTPUT_ON_FAILURE" "1")
+               (setenv "QT_PLUGIN_PATH"
+                       (string-append out "/lib/plugins:"
+                                      (getenv "QT_PLUGIN_PATH")))
+               (setenv "XDG_DATA_DIRS"
+                       (string-append out "/share:"
+                                      (getenv "XDG_DATA_DIRS")))
+               (zero?
+                (system* "ctest" "-R" ;; almost all tests require a display
+                         "filteringstrategy|kdevvarlengtharray|kdevhash"))))))))
+    (home-page "https://github.com/KDE/kdevplatform")
+    (synopsis "Framework to build integrated development environments (IDEs)")
+    (description "KDevPlatform is the basis of KDevelop and contains some
+plugins, as well as code to create plugins, or complete applications.")
+    (license license:gpl3+)))
+
 (define-public libkomparediff2
   (package
     (name "libkomparediff2")
@@ -105,14 +267,13 @@ used in KDE development tools Kompare and KDevelop.")
     (inputs
      `(("kconfigwidgets" ,kconfigwidgets)
        ("kiconthemes" ,kiconthemes)
-       ("kdbusaddons" ,kdbusaddons)
-       ("kdoctools" ,kdoctools)
-       ("kinit" ,kinit)
-       ("knewstuff" ,knewstuff)
-       ("knotifications" ,knotifications)
        ("kwindowsystem" ,kwindowsystem)
-       ("kio" ,kio)
        ("ki18n" ,ki18n)
+       ("kauth" ,kauth)
+       ("kcompletion" ,kcompletion)
+       ("kconfig" ,kconfig)
+       ("kcoreaddons" ,kcoreaddons)
+       ("kwidgetsaddons" ,kwidgetsaddons)
        ("kservice" ,kservice)
        ("qtbase" ,qtbase)
        ("qtscript" ,qtscript)
diff --git a/gnu/packages/libreoffice.scm b/gnu/packages/libreoffice.scm
index 279e8e2d22..a962d9a301 100644
--- a/gnu/packages/libreoffice.scm
+++ b/gnu/packages/libreoffice.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2014 John Darrington <jmd@gnu.org>
 ;;; Copyright © 2015 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2017 Alex Griffin <a@ajgrf.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -144,7 +145,7 @@ CSV, CSS and XML.")
      `(#:configure-flags '("--disable-werror"
                            ;; Avoid undefined library references
                            "LDFLAGS=-lboost_system")))
-    (home-page "http://sourceforge.net/p/libwpd/wiki/librevenge/")
+    (home-page "https://sourceforge.net/p/libwpd/wiki/librevenge/")
     (synopsis "Document importer for office suites")
     (description "Librevenge is a base library for writing document import
 filters.  It has interfaces for text documents, vector graphics,
@@ -275,7 +276,7 @@ working with graphics in the WPG (WordPerfect Graphics) format.")
           ;; fails without the following flag.
           (string-append "--with-boost="
                          (assoc-ref %build-inputs "boost")))))
-    (home-page "http://sourceforge.net/projects/libcmis/")
+    (home-page "https://sourceforge.net/projects/libcmis/")
     (synopsis "CMIS client library")
     (description "LibCMIS is a C++ client library for the CMIS interface.  It
 allows C++ applications to connect to any ECM behaving as a CMIS server such
@@ -561,7 +562,7 @@ Microsoft Visio documents of all versions.")
     (arguments
      ;; avoid triggering configure errors by simple inclusion of boost headers
      `(#:configure-flags '("--disable-werror")))
-    (home-page "http://sourceforge.net/p/libwpd/wiki/libodfgen/")
+    (home-page "https://sourceforge.net/p/libwpd/wiki/libodfgen/")
     (synopsis "ODF (Open Document Format) library")
     (description "Libodfgen is a library for generating documents in the
 Open Document Format (ODF).  It provides generator implementations for all
@@ -592,7 +593,7 @@ text documents, vector drawings, presentations and spreadsheets.")
     (arguments
      ;; avoid triggering configure errors by simple inclusion of boost headers
      `(#:configure-flags '("--disable-werror")))
-    (home-page "http://sourceforge.net/p/libmwaw/wiki/Home/")
+    (home-page "https://sourceforge.net/p/libmwaw/wiki/Home/")
     (synopsis "Import library for some old Macintosh text documents")
     (description "Libmwaw contains some import filters for old Macintosh
 text documents (MacWrite, ClarisWorks, ... ) and for some graphics and
@@ -631,21 +632,24 @@ Works word processor file format.")
 (define-public hunspell
   (package
     (name "hunspell")
-    (version "1.3.3")
+    (version "1.5.4")
     (source
      (origin
       (method url-fetch)
-      (uri (string-append "mirror://sourceforge/" name "/Hunspell/" version "/"
-                          name "-" version ".tar.gz"))
+      (uri (string-append "https://github.com/hunspell/hunspell/archive/v"
+                          version ".tar.gz"))
       (sha256 (base32
-               "0v14ff9s37vkh45diaddndcrj0hmn67arh8xh8k79q9c1vgc1cm7"))))
+               "0ngwk18dwd8p5a5f20h2jlgrz9wbc1k189mmmprb2zmqwfi02b45"))
+      (file-name (string-append name "-" version ".tar.gz"))))
     (build-system gnu-build-system)
+    (inputs
+     `(("perl" ,perl)))
     (home-page "http://hunspell.sourceforge.net/")
     (synopsis "Spell checker")
     (description "Hunspell is a spell checker and morphological analyzer
 library and program designed for languages with rich morphology and complex
 word compounding or character encoding.")
-    ;; triple license, including "mpl1.1 or later"
+    ;; Triple license, including "mpl1.1 or later".
     (license (list mpl1.1 gpl2+ lgpl2.1+))))
 
 (define-public hyphen
@@ -710,7 +714,7 @@ and to return information on pronunciations, meanings and synonyms.")
 (define-public libreoffice
   (package
     (name "libreoffice")
-    (version "5.1.5.2")
+    (version "5.1.6.2")
     (source
      (origin
       (method url-fetch)
@@ -719,7 +723,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
-               "1qg0dj0zwh5ifhmvv4k771nmyqddz4ifn75s9mr1p0nyix8zks8x"))))
+               "150xb76pc3889gfy4jrnq8sidymm1aihkm5pzy8b1fdy51zip804"))))
     (build-system gnu-build-system)
     (native-inputs
      `(;; autoreconf is run by the LibreOffice build system, since after
diff --git a/gnu/packages/libupnp.scm b/gnu/packages/libupnp.scm
index b9209bf04b..ea4d1bd25e 100644
--- a/gnu/packages/libupnp.scm
+++ b/gnu/packages/libupnp.scm
@@ -32,7 +32,8 @@
       (method url-fetch)
       (uri (string-append "mirror://sourceforge/pupnp/pupnp/libUPnP%20"
                           version "/" name "-" version ".tar.bz2"))
-      (patches (search-patches "libupnp-CVE-2016-6255.patch"))
+      (patches (search-patches "libupnp-CVE-2016-6255.patch"
+                               "libupnp-CVE-2016-8863.patch"))
       (sha256
        (base32
         "0qrsdsb1qm85hc4jy04qph895613d148f0x1mmk6z99y3q43fdgf"))))
diff --git a/gnu/packages/linux-libre-4.8-i686.conf b/gnu/packages/linux-libre-4.9-i686.conf
index 75c9824cb1..4f3a9f9271 100644
--- a/gnu/packages/linux-libre-4.8-i686.conf
+++ b/gnu/packages/linux-libre-4.9-i686.conf
@@ -1,6 +1,6 @@
 #
 # Automatically generated file; DO NOT EDIT.
-# Linux/x86 4.8.0-gnu Kernel Configuration
+# Linux/x86 4.9.0-gnu Kernel Configuration
 #
 # CONFIG_64BIT is not set
 CONFIG_X86_32=y
@@ -43,6 +43,7 @@ CONFIG_PGTABLE_LEVELS=3
 CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 CONFIG_IRQ_WORK=y
 CONFIG_BUILDTIME_EXTABLE_SORT=y
+CONFIG_THREAD_INFO_IN_TASK=y
 
 #
 # General setup
@@ -281,6 +282,7 @@ CONFIG_SECCOMP_FILTER=y
 CONFIG_HAVE_GCC_PLUGINS=y
 CONFIG_GCC_PLUGINS=y
 # CONFIG_GCC_PLUGIN_CYC_COMPLEXITY is not set
+# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set
 CONFIG_HAVE_CC_STACKPROTECTOR=y
 CONFIG_CC_STACKPROTECTOR=y
 # CONFIG_CC_STACKPROTECTOR_NONE is not set
@@ -302,6 +304,7 @@ CONFIG_CLONE_BACKWARDS=y
 CONFIG_OLD_SIGSUSPEND3=y
 CONFIG_OLD_SIGACTION=y
 # CONFIG_CPU_NO_EFFICIENT_FFS is not set
+# CONFIG_HAVE_ARCH_VMAP_STACK is not set
 
 #
 # GCOV-based kernel profiling
@@ -353,6 +356,7 @@ CONFIG_KARMA_PARTITION=y
 CONFIG_EFI_PARTITION=y
 CONFIG_SYSV68_PARTITION=y
 CONFIG_CMDLINE_PARTITION=y
+CONFIG_BLK_MQ_PCI=y
 
 #
 # IO Schedulers
@@ -686,6 +690,7 @@ CONFIG_ACPI_APEI_PCIEAER=y
 CONFIG_ACPI_APEI_EINJ=m
 # CONFIG_ACPI_APEI_ERST_DEBUG is not set
 CONFIG_DPTF_POWER=m
+CONFIG_ACPI_WATCHDOG=y
 CONFIG_ACPI_EXTLOG=m
 # CONFIG_PMIC_OPREGION is not set
 CONFIG_ACPI_CONFIGFS=m
@@ -717,7 +722,7 @@ CONFIG_CPU_FREQ_GOV_POWERSAVE=y
 CONFIG_CPU_FREQ_GOV_USERSPACE=y
 CONFIG_CPU_FREQ_GOV_ONDEMAND=y
 CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
-CONFIG_CPU_FREQ_GOV_SCHEDUTIL=m
+CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y
 
 #
 # CPU frequency scaling drivers
@@ -784,6 +789,7 @@ CONFIG_PCIEASPM_DEFAULT=y
 # CONFIG_PCIEASPM_PERFORMANCE is not set
 CONFIG_PCIE_PME=y
 CONFIG_PCIE_DPC=y
+CONFIG_PCIE_PTM=y
 CONFIG_PCI_BUS_ADDR_T_64BIT=y
 CONFIG_PCI_MSI=y
 CONFIG_PCI_MSI_IRQ_DOMAIN=y
@@ -879,7 +885,6 @@ CONFIG_BINFMT_MISC=m
 CONFIG_COREDUMP=y
 CONFIG_HAVE_ATOMIC_IOMAP=y
 CONFIG_PMC_ATOM=y
-# CONFIG_VMD is not set
 CONFIG_NET=y
 CONFIG_NET_INGRESS=y
 CONFIG_NET_EGRESS=y
@@ -954,6 +959,7 @@ CONFIG_TCP_CONG_YEAH=m
 CONFIG_TCP_CONG_ILLINOIS=m
 CONFIG_TCP_CONG_DCTCP=m
 CONFIG_TCP_CONG_CDG=m
+CONFIG_TCP_CONG_BBR=m
 CONFIG_DEFAULT_CUBIC=y
 # CONFIG_DEFAULT_RENO is not set
 CONFIG_DEFAULT_TCP_CONG="cubic"
@@ -1049,9 +1055,10 @@ CONFIG_NF_TABLES_INET=m
 CONFIG_NF_TABLES_NETDEV=m
 CONFIG_NFT_EXTHDR=m
 CONFIG_NFT_META=m
+CONFIG_NFT_NUMGEN=m
 CONFIG_NFT_CT=m
-CONFIG_NFT_RBTREE=m
-CONFIG_NFT_HASH=m
+CONFIG_NFT_SET_RBTREE=m
+CONFIG_NFT_SET_HASH=m
 CONFIG_NFT_COUNTER=m
 CONFIG_NFT_LOG=m
 CONFIG_NFT_LIMIT=m
@@ -1059,9 +1066,11 @@ CONFIG_NFT_MASQ=m
 CONFIG_NFT_REDIR=m
 CONFIG_NFT_NAT=m
 CONFIG_NFT_QUEUE=m
+CONFIG_NFT_QUOTA=m
 CONFIG_NFT_REJECT=m
 CONFIG_NFT_REJECT_INET=m
 CONFIG_NFT_COMPAT=m
+CONFIG_NFT_HASH=m
 CONFIG_NF_DUP_NETDEV=m
 CONFIG_NFT_DUP_NETDEV=m
 CONFIG_NFT_FWD_NETDEV=m
@@ -1487,9 +1496,12 @@ CONFIG_NET_ACT_CSUM=m
 CONFIG_NET_ACT_VLAN=m
 CONFIG_NET_ACT_BPF=m
 CONFIG_NET_ACT_CONNMARK=m
+CONFIG_NET_ACT_SKBMOD=m
 CONFIG_NET_ACT_IFE=m
+CONFIG_NET_ACT_TUNNEL_KEY=m
 CONFIG_NET_IFE_SKBMARK=m
 CONFIG_NET_IFE_SKBPRIO=m
+CONFIG_NET_IFE_SKBTCINDEX=m
 # CONFIG_NET_CLS_IND is not set
 CONFIG_NET_SCH_FIFO=y
 CONFIG_DCB=y
@@ -1500,6 +1512,7 @@ CONFIG_BATMAN_ADV_BLA=y
 CONFIG_BATMAN_ADV_DAT=y
 CONFIG_BATMAN_ADV_NC=y
 CONFIG_BATMAN_ADV_MCAST=y
+CONFIG_BATMAN_ADV_DEBUGFS=y
 # CONFIG_BATMAN_ADV_DEBUG is not set
 CONFIG_OPENVSWITCH=m
 CONFIG_OPENVSWITCH_GRE=m
@@ -1704,6 +1717,7 @@ CONFIG_BT_HCIUART_INTEL=y
 CONFIG_BT_HCIUART_BCM=y
 CONFIG_BT_HCIUART_QCA=y
 CONFIG_BT_HCIUART_AG6XX=y
+CONFIG_BT_HCIUART_MRVL=y
 CONFIG_BT_HCIBCM203X=m
 CONFIG_BT_HCIBPA10X=m
 CONFIG_BT_HCIBFUSB=m
@@ -1717,9 +1731,12 @@ CONFIG_BT_MRVL_SDIO=m
 CONFIG_BT_ATH3K=m
 CONFIG_BT_WILINK=m
 CONFIG_AF_RXRPC=m
+CONFIG_AF_RXRPC_IPV6=y
+# CONFIG_AF_RXRPC_INJECT_LOSS is not set
 # CONFIG_AF_RXRPC_DEBUG is not set
 # CONFIG_RXKAD is not set
 CONFIG_AF_KCM=m
+CONFIG_STREAM_PARSER=m
 CONFIG_FIB_RULES=y
 CONFIG_WIRELESS=y
 CONFIG_WIRELESS_EXT=y
@@ -1843,6 +1860,7 @@ CONFIG_ALLOW_DEV_COREDUMP=y
 CONFIG_DEV_COREDUMP=y
 # CONFIG_DEBUG_DRIVER is not set
 # CONFIG_DEBUG_DEVRES is not set
+# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set
 CONFIG_SYS_HYPERVISOR=y
 # CONFIG_GENERIC_CPU_DEVICES is not set
 CONFIG_GENERIC_CPU_AUTOPROBE=y
@@ -2124,9 +2142,6 @@ CONFIG_HMC6352=m
 CONFIG_DS1682=m
 CONFIG_TI_DAC7512=m
 CONFIG_VMWARE_BALLOON=m
-CONFIG_BMP085=m
-CONFIG_BMP085_I2C=m
-CONFIG_BMP085_SPI=m
 CONFIG_PCH_PHUB=m
 CONFIG_USB_SWITCH_FSA9480=m
 CONFIG_LATTICE_ECP3_CONFIG=m
@@ -2253,7 +2268,6 @@ CONFIG_BLK_DEV_3W_XXXX_RAID=m
 CONFIG_SCSI_HPSA=m
 CONFIG_SCSI_3W_9XXX=m
 CONFIG_SCSI_3W_SAS=m
-CONFIG_SCSI_7000FASST=m
 CONFIG_SCSI_ACARD=m
 CONFIG_SCSI_AHA152X=m
 CONFIG_SCSI_AHA1542=m
@@ -2279,7 +2293,6 @@ CONFIG_SCSI_MVSAS=m
 CONFIG_SCSI_MVUMI=m
 CONFIG_SCSI_DPT_I2O=m
 CONFIG_SCSI_ADVANSYS=m
-CONFIG_SCSI_IN2000=m
 CONFIG_SCSI_ARCMSR=m
 CONFIG_SCSI_ESAS2R=m
 CONFIG_MEGARAID_NEWGEN=y
@@ -2291,6 +2304,7 @@ CONFIG_SCSI_MPT3SAS=m
 CONFIG_SCSI_MPT2SAS_MAX_SGE=128
 CONFIG_SCSI_MPT3SAS_MAX_SGE=128
 CONFIG_SCSI_MPT2SAS=m
+CONFIG_SCSI_SMARTPQI=m
 CONFIG_SCSI_UFSHCD=m
 CONFIG_SCSI_UFSHCD_PCI=m
 # CONFIG_SCSI_UFS_DWC_TC_PCI is not set
@@ -2309,7 +2323,6 @@ CONFIG_FCOE_FNIC=m
 CONFIG_SCSI_SNIC=m
 # CONFIG_SCSI_SNIC_DEBUG_FS is not set
 CONFIG_SCSI_DMX3191D=m
-CONFIG_SCSI_DTC3280=m
 CONFIG_SCSI_EATA=m
 CONFIG_SCSI_EATA_TAGGED_QUEUE=y
 CONFIG_SCSI_EATA_LINKED_COMMANDS=y
@@ -2336,7 +2349,6 @@ CONFIG_SCSI_SYM53C8XX_MMIO=y
 CONFIG_SCSI_IPR=m
 CONFIG_SCSI_IPR_TRACE=y
 CONFIG_SCSI_IPR_DUMP=y
-CONFIG_SCSI_PAS16=m
 CONFIG_SCSI_QLOGIC_FAS=m
 CONFIG_SCSI_QLOGIC_1280=m
 CONFIG_SCSI_QLA_FC=m
@@ -2349,12 +2361,6 @@ CONFIG_SCSI_SIM710=m
 CONFIG_SCSI_SYM53C416=m
 CONFIG_SCSI_DC395x=m
 CONFIG_SCSI_AM53C974=m
-CONFIG_SCSI_T128=m
-CONFIG_SCSI_U14_34F=m
-CONFIG_SCSI_U14_34F_TAGGED_QUEUE=y
-CONFIG_SCSI_U14_34F_LINKED_COMMANDS=y
-CONFIG_SCSI_U14_34F_MAX_TAGS=8
-CONFIG_SCSI_ULTRASTOR=m
 CONFIG_SCSI_NSP32=m
 CONFIG_SCSI_WD719X=m
 CONFIG_SCSI_DEBUG=m
@@ -2663,6 +2669,8 @@ CONFIG_NET_VENDOR_ALTEON=y
 CONFIG_ACENIC=m
 # CONFIG_ACENIC_OMIT_TIGON_I is not set
 CONFIG_ALTERA_TSE=m
+CONFIG_NET_VENDOR_AMAZON=y
+CONFIG_ENA_ETHERNET=m
 CONFIG_NET_VENDOR_AMD=y
 CONFIG_AMD8111_ETH=m
 CONFIG_LANCE=m
@@ -2825,6 +2833,7 @@ CONFIG_QED=m
 CONFIG_QED_SRIOV=y
 CONFIG_QEDE=m
 CONFIG_NET_VENDOR_QUALCOMM=y
+CONFIG_QCOM_EMAC=m
 CONFIG_NET_VENDOR_REALTEK=y
 CONFIG_ATP=m
 CONFIG_8139CP=m
@@ -2897,37 +2906,43 @@ CONFIG_PHYLIB=y
 CONFIG_SWPHY=y
 
 #
+# MDIO bus device drivers
+#
+CONFIG_MDIO_BCM_UNIMAC=m
+CONFIG_MDIO_BITBANG=m
+CONFIG_MDIO_GPIO=m
+
+#
 # MII PHY device drivers
 #
+CONFIG_AMD_PHY=m
 CONFIG_AQUANTIA_PHY=m
 CONFIG_AT803X_PHY=m
-CONFIG_AMD_PHY=m
-CONFIG_MARVELL_PHY=m
-CONFIG_DAVICOM_PHY=m
-CONFIG_QSEMI_PHY=m
-CONFIG_LXT_PHY=m
-CONFIG_CICADA_PHY=m
-CONFIG_VITESSE_PHY=m
-CONFIG_TERANETICS_PHY=m
-CONFIG_SMSC_PHY=m
-CONFIG_BCM_NET_PHYLIB=m
-CONFIG_BROADCOM_PHY=m
 CONFIG_BCM7XXX_PHY=m
 CONFIG_BCM87XX_PHY=m
-CONFIG_ICPLUS_PHY=m
-CONFIG_REALTEK_PHY=m
-CONFIG_NATIONAL_PHY=m
-CONFIG_STE10XP=m
-CONFIG_LSI_ET1011C_PHY=m
-CONFIG_MICREL_PHY=m
+CONFIG_BCM_NET_PHYLIB=m
+CONFIG_BROADCOM_PHY=m
+CONFIG_CICADA_PHY=m
+CONFIG_DAVICOM_PHY=m
 CONFIG_DP83848_PHY=m
 CONFIG_DP83867_PHY=m
-CONFIG_MICROCHIP_PHY=m
 CONFIG_FIXED_PHY=y
-CONFIG_MDIO_BITBANG=m
-CONFIG_MDIO_GPIO=m
-CONFIG_MDIO_BCM_UNIMAC=m
+CONFIG_ICPLUS_PHY=m
 CONFIG_INTEL_XWAY_PHY=m
+CONFIG_LSI_ET1011C_PHY=m
+CONFIG_LXT_PHY=m
+CONFIG_MARVELL_PHY=m
+CONFIG_MICREL_PHY=m
+CONFIG_MICROCHIP_PHY=m
+CONFIG_MICROSEMI_PHY=m
+CONFIG_NATIONAL_PHY=m
+CONFIG_QSEMI_PHY=m
+CONFIG_REALTEK_PHY=m
+CONFIG_SMSC_PHY=m
+CONFIG_STE10XP=m
+CONFIG_TERANETICS_PHY=m
+CONFIG_VITESSE_PHY=m
+CONFIG_XILINX_GMII2RGMII=m
 CONFIG_MICREL_KS8995MA=m
 CONFIG_PLIP=m
 CONFIG_PPP=y
@@ -3458,6 +3473,7 @@ CONFIG_INPUT_EVDEV=y
 # Input Device Drivers
 #
 CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ADC=m
 CONFIG_KEYBOARD_ADP5520=m
 CONFIG_KEYBOARD_ADP5588=m
 CONFIG_KEYBOARD_ADP5589=m
@@ -3559,6 +3575,7 @@ CONFIG_TOUCHSCREEN_AD7879=m
 CONFIG_TOUCHSCREEN_AD7879_I2C=m
 CONFIG_TOUCHSCREEN_AD7879_SPI=m
 CONFIG_TOUCHSCREEN_ATMEL_MXT=m
+# CONFIG_TOUCHSCREEN_ATMEL_MXT_T37 is not set
 CONFIG_TOUCHSCREEN_AUO_PIXCIR=m
 CONFIG_TOUCHSCREEN_BU21013=m
 CONFIG_TOUCHSCREEN_CY8CTMG110=m
@@ -3574,11 +3591,11 @@ CONFIG_TOUCHSCREEN_DYNAPRO=m
 CONFIG_TOUCHSCREEN_HAMPSHIRE=m
 CONFIG_TOUCHSCREEN_EETI=m
 CONFIG_TOUCHSCREEN_EGALAX_SERIAL=m
-CONFIG_TOUCHSCREEN_FT6236=m
 CONFIG_TOUCHSCREEN_FUJITSU=m
 CONFIG_TOUCHSCREEN_GOODIX=m
 CONFIG_TOUCHSCREEN_ILI210X=m
 CONFIG_TOUCHSCREEN_GUNZE=m
+CONFIG_TOUCHSCREEN_EKTF2127=m
 CONFIG_TOUCHSCREEN_ELAN=m
 CONFIG_TOUCHSCREEN_ELO=m
 CONFIG_TOUCHSCREEN_WACOM_W8001=m
@@ -3662,6 +3679,7 @@ CONFIG_INPUT_APANEL=m
 CONFIG_INPUT_GP2A=m
 CONFIG_INPUT_GPIO_BEEPER=m
 CONFIG_INPUT_GPIO_TILT_POLLED=m
+CONFIG_INPUT_GPIO_DECODER=m
 CONFIG_INPUT_WISTRON_BTNS=m
 CONFIG_INPUT_ATLAS_BTNS=m
 CONFIG_INPUT_ATI_REMOTE2=m
@@ -3708,6 +3726,7 @@ CONFIG_RMI4_2D_SENSOR=y
 CONFIG_RMI4_F11=y
 CONFIG_RMI4_F12=y
 CONFIG_RMI4_F30=y
+# CONFIG_RMI4_F54 is not set
 
 #
 # Hardware I/O ports
@@ -3790,6 +3809,7 @@ CONFIG_SERIAL_8250_RSA=y
 # CONFIG_SERIAL_8250_FSL is not set
 CONFIG_SERIAL_8250_DW=m
 CONFIG_SERIAL_8250_RT288X=y
+CONFIG_SERIAL_8250_LPSS=m
 CONFIG_SERIAL_8250_MID=m
 CONFIG_SERIAL_8250_MOXA=m
 
@@ -4078,7 +4098,6 @@ CONFIG_PINCTRL_INTEL=m
 CONFIG_PINCTRL_BROXTON=m
 CONFIG_PINCTRL_SUNRISEPOINT=m
 CONFIG_GPIOLIB=y
-CONFIG_GPIO_DEVRES=y
 CONFIG_GPIO_ACPI=y
 CONFIG_GPIOLIB_IRQCHIP=y
 # CONFIG_DEBUG_GPIO is not set
@@ -4090,11 +4109,13 @@ CONFIG_GPIO_MAX730X=m
 # Memory mapped GPIO drivers
 #
 CONFIG_GPIO_AMDPT=m
+CONFIG_GPIO_AXP209=m
 CONFIG_GPIO_DWAPB=m
 CONFIG_GPIO_GENERIC_PLATFORM=m
 CONFIG_GPIO_ICH=m
 CONFIG_GPIO_LYNXPOINT=y
 CONFIG_GPIO_MENZ127=m
+# CONFIG_GPIO_MOCKUP is not set
 CONFIG_GPIO_VX855=m
 CONFIG_GPIO_ZX=y
 
@@ -4105,6 +4126,7 @@ CONFIG_GPIO_104_DIO_48E=m
 CONFIG_GPIO_104_IDIO_16=m
 CONFIG_GPIO_104_IDI_48=m
 CONFIG_GPIO_F7188X=m
+CONFIG_GPIO_GPIO_MM=m
 CONFIG_GPIO_IT87=m
 CONFIG_GPIO_SCH=m
 CONFIG_GPIO_SCH311X=m
@@ -4120,6 +4142,7 @@ CONFIG_GPIO_PCA953X=m
 CONFIG_GPIO_PCF857X=m
 CONFIG_GPIO_SX150X=y
 CONFIG_GPIO_TPIC2810=m
+CONFIG_GPIO_TS4900=m
 
 #
 # MFD GPIO expanders
@@ -4134,6 +4157,7 @@ CONFIG_GPIO_DLN2=m
 CONFIG_GPIO_JANZ_TTL=m
 CONFIG_GPIO_KEMPLD=m
 CONFIG_GPIO_LP3943=m
+CONFIG_GPIO_LP873X=m
 CONFIG_GPIO_MSIC=y
 CONFIG_GPIO_PALMAS=y
 CONFIG_GPIO_RC5T583=y
@@ -4146,6 +4170,7 @@ CONFIG_GPIO_TPS65912=m
 CONFIG_GPIO_TWL4030=m
 CONFIG_GPIO_TWL6040=m
 CONFIG_GPIO_UCB1400=m
+CONFIG_GPIO_WHISKEY_COVE=m
 CONFIG_GPIO_WM831X=m
 CONFIG_GPIO_WM8350=m
 CONFIG_GPIO_WM8994=m
@@ -4205,6 +4230,9 @@ CONFIG_W1_SLAVE_DS2780=m
 CONFIG_W1_SLAVE_DS2781=m
 CONFIG_W1_SLAVE_DS28E04=m
 CONFIG_W1_SLAVE_BQ27000=m
+CONFIG_POWER_AVS=y
+CONFIG_POWER_RESET=y
+CONFIG_POWER_RESET_RESTART=y
 CONFIG_POWER_SUPPLY=y
 # CONFIG_POWER_SUPPLY_DEBUG is not set
 CONFIG_PDA_POWER=m
@@ -4258,9 +4286,6 @@ CONFIG_BATTERY_GAUGE_LTC2941=m
 CONFIG_BATTERY_RT5033=m
 CONFIG_CHARGER_RT9455=m
 CONFIG_AXP20X_POWER=m
-CONFIG_POWER_RESET=y
-CONFIG_POWER_RESET_RESTART=y
-CONFIG_POWER_AVS=y
 CONFIG_HWMON=y
 CONFIG_HWMON_VID=m
 # CONFIG_HWMON_DEBUG_CHIP is not set
@@ -4428,6 +4453,7 @@ CONFIG_SENSORS_W83627HF=m
 CONFIG_SENSORS_W83627EHF=m
 CONFIG_SENSORS_WM831X=m
 CONFIG_SENSORS_WM8350=m
+CONFIG_SENSORS_XGENE=m
 
 #
 # ACPI drivers
@@ -4458,6 +4484,7 @@ CONFIG_INTEL_SOC_DTS_THERMAL=m
 CONFIG_INT340X_THERMAL=m
 CONFIG_ACPI_THERMAL_REL=m
 CONFIG_INT3406_THERMAL=m
+CONFIG_INTEL_BXT_PMIC_THERMAL=m
 CONFIG_INTEL_PCH_THERMAL=m
 CONFIG_GENERIC_ADC_THERMAL=m
 CONFIG_WATCHDOG=y
@@ -4474,6 +4501,7 @@ CONFIG_DA9055_WATCHDOG=m
 CONFIG_DA9063_WATCHDOG=m
 CONFIG_DA9062_WATCHDOG=m
 CONFIG_MENF21BMC_WATCHDOG=m
+CONFIG_WDAT_WDT=m
 CONFIG_WM831X_WATCHDOG=m
 CONFIG_WM8350_WATCHDOG=m
 CONFIG_XILINX_WATCHDOG=m
@@ -4544,6 +4572,11 @@ CONFIG_WDTPCI=m
 # USB-based Watchdog Cards
 #
 CONFIG_USBPCWATCHDOG=m
+
+#
+# Watchdog Pretimeout Governors
+#
+# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set
 CONFIG_SSB_POSSIBLE=y
 
 #
@@ -4603,6 +4636,7 @@ CONFIG_MFD_DA9062=m
 CONFIG_MFD_DA9063=y
 CONFIG_MFD_DA9150=m
 CONFIG_MFD_DLN2=m
+CONFIG_MFD_EXYNOS_LPASS=m
 CONFIG_MFD_MC13XXX=m
 CONFIG_MFD_MC13XXX_SPI=m
 CONFIG_MFD_MC13XXX_I2C=m
@@ -4662,6 +4696,7 @@ CONFIG_TPS6507X=m
 CONFIG_MFD_TPS65086=m
 CONFIG_MFD_TPS65090=y
 CONFIG_MFD_TPS65217=m
+CONFIG_MFD_TI_LP873X=m
 CONFIG_MFD_TPS65218=m
 CONFIG_MFD_TPS6586X=y
 CONFIG_MFD_TPS65910=y
@@ -4725,6 +4760,7 @@ CONFIG_REGULATOR_LP872X=m
 CONFIG_REGULATOR_LP8755=m
 CONFIG_REGULATOR_LP8788=m
 CONFIG_REGULATOR_LTC3589=m
+CONFIG_REGULATOR_LTC3676=m
 CONFIG_REGULATOR_MAX14577=m
 CONFIG_REGULATOR_MAX1586=m
 CONFIG_REGULATOR_MAX8649=m
@@ -4793,6 +4829,7 @@ CONFIG_VIDEO_V4L2_SUBDEV_API=y
 CONFIG_VIDEO_V4L2=m
 # CONFIG_VIDEO_ADV_DEBUG is not set
 # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
+# CONFIG_VIDEO_PCI_SKELETON is not set
 CONFIG_VIDEO_TUNER=m
 CONFIG_V4L2_MEM2MEM_DEV=m
 CONFIG_V4L2_FLASH_LED_CLASS=m
@@ -4948,6 +4985,7 @@ CONFIG_VIDEO_TM6000_DVB=m
 #
 CONFIG_DVB_USB=m
 # CONFIG_DVB_USB_DEBUG is not set
+CONFIG_DVB_USB_DIB3000MC=m
 CONFIG_DVB_USB_A800=m
 CONFIG_DVB_USB_DIBUSB_MB=m
 # CONFIG_DVB_USB_DIBUSB_MB_FAULTY is not set
@@ -5015,6 +5053,7 @@ CONFIG_MEDIA_PCI_SUPPORT=y
 #
 CONFIG_VIDEO_MEYE=m
 CONFIG_VIDEO_SOLO6X10=m
+CONFIG_VIDEO_TW5864=m
 CONFIG_VIDEO_TW68=m
 CONFIG_VIDEO_TW686X=m
 CONFIG_VIDEO_ZORAN=m
@@ -5170,7 +5209,7 @@ CONFIG_SMS_SIANO_DEBUGFS=y
 CONFIG_VIDEO_V4L2_TPG=m
 
 #
-# Media ancillary drivers (tuners, sensors, i2c, frontends)
+# Media ancillary drivers (tuners, sensors, i2c, spi, frontends)
 #
 CONFIG_MEDIA_SUBDRV_AUTOSELECT=y
 CONFIG_MEDIA_ATTACH=y
@@ -5236,6 +5275,7 @@ CONFIG_VIDEO_ADV7511=m
 #
 CONFIG_VIDEO_OV7640=m
 CONFIG_VIDEO_OV7670=m
+CONFIG_VIDEO_MT9M111=m
 CONFIG_VIDEO_MT9V011=m
 
 #
@@ -5393,6 +5433,7 @@ CONFIG_DVB_RTL2832=m
 CONFIG_DVB_RTL2832_SDR=m
 CONFIG_DVB_SI2168=m
 CONFIG_DVB_AS102_FE=m
+CONFIG_DVB_GP8PSK_FE=m
 
 #
 # DVB-C (cable) frontends
@@ -5498,15 +5539,13 @@ CONFIG_DRM_TTM=m
 CONFIG_DRM_I2C_CH7006=m
 CONFIG_DRM_I2C_SIL164=m
 CONFIG_DRM_I2C_NXP_TDA998X=m
-CONFIG_DRM_TDFX=m
-CONFIG_DRM_R128=m
 CONFIG_DRM_RADEON=m
 # CONFIG_DRM_RADEON_USERPTR is not set
 CONFIG_DRM_AMDGPU=m
+# CONFIG_DRM_AMDGPU_SI is not set
 # CONFIG_DRM_AMDGPU_CIK is not set
 CONFIG_DRM_AMDGPU_USERPTR=y
 # CONFIG_DRM_AMDGPU_GART_DEBUGFS is not set
-# CONFIG_DRM_AMD_POWERPLAY is not set
 
 #
 # ACP (Audio CoProcessor) Configuration
@@ -5516,7 +5555,6 @@ CONFIG_DRM_NOUVEAU=m
 CONFIG_NOUVEAU_DEBUG=5
 CONFIG_NOUVEAU_DEBUG_DEFAULT=3
 CONFIG_DRM_NOUVEAU_BACKLIGHT=y
-CONFIG_DRM_I810=m
 CONFIG_DRM_I915=m
 # CONFIG_DRM_I915_PRELIMINARY_HW_SUPPORT is not set
 CONFIG_DRM_I915_USERPTR=y
@@ -5527,10 +5565,6 @@ CONFIG_DRM_I915_USERPTR=y
 #
 # CONFIG_DRM_I915_WERROR is not set
 # CONFIG_DRM_I915_DEBUG is not set
-CONFIG_DRM_MGA=m
-CONFIG_DRM_SIS=m
-CONFIG_DRM_VIA=m
-CONFIG_DRM_SAVAGE=m
 CONFIG_DRM_VGEM=m
 CONFIG_DRM_VMWGFX=m
 CONFIG_DRM_VMWGFX_FBCON=y
@@ -5556,6 +5590,7 @@ CONFIG_DRM_BRIDGE=y
 # Display Interface Bridges
 #
 CONFIG_DRM_ANALOGIX_ANX78XX=m
+# CONFIG_DRM_LEGACY is not set
 
 #
 # Frame buffer Devices
@@ -5747,6 +5782,7 @@ CONFIG_SND=m
 CONFIG_SND_TIMER=m
 CONFIG_SND_PCM=m
 CONFIG_SND_PCM_ELD=y
+CONFIG_SND_PCM_IEC958=y
 CONFIG_SND_DMAENGINE_PCM=m
 CONFIG_SND_HWDEP=m
 CONFIG_SND_RAWMIDI=m
@@ -6012,12 +6048,6 @@ CONFIG_SND_SOC_INTEL_SKYLAKE=m
 CONFIG_SND_SOC_INTEL_SKL_RT286_MACH=m
 CONFIG_SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH=m
 CONFIG_SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH=m
-
-#
-# Allwinner SoC Audio support
-#
-CONFIG_SND_SUN4I_CODEC=m
-CONFIG_SND_SUN4I_I2S=m
 CONFIG_SND_SOC_XTFPGA_I2S=m
 CONFIG_SND_SOC_I2C_AND_SPI=m
 
@@ -6052,6 +6082,7 @@ CONFIG_SND_SOC_CS4349=m
 CONFIG_SND_SOC_CS53L30=m
 CONFIG_SND_SOC_DA7219=m
 CONFIG_SND_SOC_DMIC=m
+CONFIG_SND_SOC_HDMI_CODEC=m
 CONFIG_SND_SOC_ES8328=m
 CONFIG_SND_SOC_GTM601=m
 CONFIG_SND_SOC_HDAC_HDMI=m
@@ -6079,6 +6110,7 @@ CONFIG_SND_SOC_RT5631=m
 CONFIG_SND_SOC_RT5640=m
 CONFIG_SND_SOC_RT5645=m
 CONFIG_SND_SOC_RT5651=m
+CONFIG_SND_SOC_RT5663=m
 CONFIG_SND_SOC_RT5670=m
 # CONFIG_SND_SOC_RT5677_SPI is not set
 CONFIG_SND_SOC_SGTL5000=m
@@ -6127,6 +6159,7 @@ CONFIG_SND_SOC_WM8962=m
 CONFIG_SND_SOC_WM8974=m
 CONFIG_SND_SOC_WM8978=m
 CONFIG_SND_SOC_WM8985=m
+CONFIG_SND_SOC_NAU8810=m
 CONFIG_SND_SOC_NAU8825=m
 CONFIG_SND_SOC_TPA6130A2=m
 CONFIG_SND_SIMPLE_CARD_UTILS=m
@@ -6270,7 +6303,7 @@ CONFIG_USB_DYNAMIC_MINORS=y
 # CONFIG_USB_OTG is not set
 # CONFIG_USB_OTG_WHITELIST is not set
 # CONFIG_USB_OTG_BLACKLIST_HUB is not set
-CONFIG_USB_ULPI_BUS=m
+CONFIG_USB_LEDS_TRIGGER_USBPORT=m
 CONFIG_USB_MON=m
 CONFIG_USB_WUSB=m
 CONFIG_USB_WUSB_CBAF=m
@@ -6348,6 +6381,8 @@ CONFIG_USB_MDC800=m
 CONFIG_USB_MICROTEK=m
 CONFIG_USBIP_CORE=m
 CONFIG_USBIP_VHCI_HCD=m
+CONFIG_USBIP_VHCI_HC_PORTS=8
+CONFIG_USBIP_VHCI_NR_HCS=1
 CONFIG_USBIP_HOST=m
 CONFIG_USBIP_VUDC=m
 # CONFIG_USBIP_DEBUG is not set
@@ -6491,6 +6526,7 @@ CONFIG_USB_ISIGHTFW=m
 CONFIG_USB_YUREX=m
 CONFIG_USB_EZUSB_FX2=m
 CONFIG_USB_HSIC_USB3503=m
+CONFIG_USB_HSIC_USB4604=m
 CONFIG_USB_LINK_LAYER_TEST=m
 CONFIG_USB_CHAOSKEY=m
 CONFIG_UCSI=m
@@ -6609,6 +6645,7 @@ CONFIG_USB_G_DBGP=m
 CONFIG_USB_G_DBGP_SERIAL=y
 CONFIG_USB_G_WEBCAM=m
 CONFIG_USB_LED_TRIG=y
+CONFIG_USB_ULPI_BUS=m
 CONFIG_UWB=m
 CONFIG_UWB_HWA=m
 CONFIG_UWB_WHCI=m
@@ -6816,6 +6853,7 @@ CONFIG_RTC_DRV_ABB5ZES3=m
 CONFIG_RTC_DRV_ABX80X=m
 CONFIG_RTC_DRV_DS1307=m
 CONFIG_RTC_DRV_DS1307_HWMON=y
+# CONFIG_RTC_DRV_DS1307_CENTURY is not set
 CONFIG_RTC_DRV_DS1374=m
 CONFIG_RTC_DRV_DS1374_WDT=y
 CONFIG_RTC_DRV_DS1672=m
@@ -6828,7 +6866,6 @@ CONFIG_RTC_DRV_MAX8997=m
 CONFIG_RTC_DRV_RS5C372=m
 CONFIG_RTC_DRV_ISL1208=m
 CONFIG_RTC_DRV_ISL12022=m
-CONFIG_RTC_DRV_ISL12057=m
 CONFIG_RTC_DRV_X1205=m
 CONFIG_RTC_DRV_PCF8523=m
 CONFIG_RTC_DRV_PCF85063=m
@@ -6961,6 +6998,7 @@ CONFIG_KS0108_PORT=0x378
 CONFIG_KS0108_DELAY=2
 CONFIG_CFAG12864B=m
 CONFIG_CFAG12864B_RATE=20
+CONFIG_IMG_ASCII_LCD=m
 CONFIG_UIO=m
 CONFIG_UIO_CIF=m
 CONFIG_UIO_PDRV_GENIRQ=m
@@ -7179,9 +7217,6 @@ CONFIG_RTL8192E=m
 CONFIG_R8712U=m
 CONFIG_R8188EU=m
 CONFIG_88EU_AP_MODE=y
-CONFIG_R8723AU=m
-CONFIG_8723AU_AP_MODE=y
-CONFIG_8723AU_BT_COEXIST=y
 CONFIG_RTS5208=m
 CONFIG_VT6655=m
 CONFIG_VT6656=m
@@ -7317,7 +7352,6 @@ CONFIG_MTD_SPINAND_ONDIEECC=y
 CONFIG_LNET=m
 CONFIG_LNET_MAX_PAYLOAD=1048576
 # CONFIG_LNET_SELFTEST is not set
-CONFIG_LNET_XPRT_IB=m
 # CONFIG_LUSTRE_FS is not set
 CONFIG_DGNC=m
 CONFIG_GS_FPGABOOT=m
@@ -7376,6 +7410,7 @@ CONFIG_ISDN_DRV_ICN=m
 CONFIG_ISDN_DRV_PCBIT=m
 CONFIG_ISDN_DRV_ACT2000=m
 CONFIG_KS7010=m
+# CONFIG_GREYBUS is not set
 CONFIG_X86_PLATFORM_DEVICES=y
 CONFIG_ACER_WMI=m
 CONFIG_ACERHDF=m
@@ -7469,7 +7504,6 @@ CONFIG_COMMON_CLK_PALMAS=m
 CONFIG_COMMON_CLK_PWM=m
 # CONFIG_COMMON_CLK_PXA is not set
 # CONFIG_COMMON_CLK_PIC32 is not set
-# CONFIG_SUNXI_CCU is not set
 
 #
 # Hardware Spinlock drivers
@@ -7553,6 +7587,7 @@ CONFIG_EXTCON_MAX77693=m
 CONFIG_EXTCON_MAX77843=m
 CONFIG_EXTCON_MAX8997=m
 CONFIG_EXTCON_PALMAS=m
+CONFIG_EXTCON_QCOM_SPMI_MISC=m
 CONFIG_EXTCON_RT8973A=m
 CONFIG_EXTCON_SM5502=m
 CONFIG_EXTCON_USB_GPIO=m
@@ -7577,12 +7612,16 @@ CONFIG_BMA220=m
 CONFIG_BMC150_ACCEL=m
 CONFIG_BMC150_ACCEL_I2C=m
 CONFIG_BMC150_ACCEL_SPI=m
+CONFIG_DMARD09=m
 CONFIG_HID_SENSOR_ACCEL_3D=m
 CONFIG_IIO_ST_ACCEL_3AXIS=m
 CONFIG_IIO_ST_ACCEL_I2C_3AXIS=m
 CONFIG_IIO_ST_ACCEL_SPI_3AXIS=m
 CONFIG_KXSD9=m
+CONFIG_KXSD9_SPI=m
+CONFIG_KXSD9_I2C=m
 CONFIG_KXCJK1013=m
+CONFIG_MC3230=m
 CONFIG_MMA7455=m
 CONFIG_MMA7455_I2C=m
 CONFIG_MMA7455_SPI=m
@@ -7615,6 +7654,7 @@ CONFIG_DA9150_GPADC=m
 CONFIG_HI8435=m
 CONFIG_INA2XX_ADC=m
 CONFIG_LP8788_ADC=m
+CONFIG_LTC2485=m
 CONFIG_MAX1027=m
 CONFIG_MAX1363=m
 CONFIG_MCP320X=m
@@ -7624,9 +7664,12 @@ CONFIG_NAU7802=m
 CONFIG_PALMAS_GPADC=m
 CONFIG_QCOM_SPMI_IADC=m
 CONFIG_QCOM_SPMI_VADC=m
+CONFIG_STX104=m
 CONFIG_TI_ADC081C=m
 CONFIG_TI_ADC0832=m
+CONFIG_TI_ADC12138=m
 CONFIG_TI_ADC128S052=m
+CONFIG_TI_ADC161S626=m
 CONFIG_TI_ADS1015=m
 CONFIG_TI_AM335X_ADC=m
 CONFIG_TWL4030_MADC=m
@@ -7681,11 +7724,12 @@ CONFIG_AD5761=m
 CONFIG_AD5764=m
 CONFIG_AD5791=m
 CONFIG_AD7303=m
+CONFIG_CIO_DAC=m
+CONFIG_AD8801=m
 CONFIG_M62332=m
 CONFIG_MAX517=m
 CONFIG_MCP4725=m
 CONFIG_MCP4922=m
-CONFIG_STX104=m
 
 #
 # IIO dummy driver
@@ -7786,6 +7830,7 @@ CONFIG_LTR501=m
 CONFIG_MAX44000=m
 CONFIG_OPT3001=m
 CONFIG_PA12203001=m
+CONFIG_SI1145=m
 CONFIG_STK3310=m
 CONFIG_TCS3414=m
 CONFIG_TCS3472=m
@@ -7839,6 +7884,9 @@ CONFIG_TPL0102=m
 #
 # Pressure sensors
 #
+CONFIG_BMP280=m
+CONFIG_BMP280_I2C=m
+CONFIG_BMP280_SPI=m
 CONFIG_HID_SENSOR_PRESS=m
 CONFIG_HP03=m
 CONFIG_MPL115=m
@@ -7854,6 +7902,9 @@ CONFIG_IIO_ST_PRESS_I2C=m
 CONFIG_IIO_ST_PRESS_SPI=m
 CONFIG_T5403=m
 CONFIG_HP206C=m
+CONFIG_ZPA2326=m
+CONFIG_ZPA2326_I2C=m
+CONFIG_ZPA2326_SPI=m
 
 #
 # Lightning sensors
@@ -7869,6 +7920,7 @@ CONFIG_SX9500=m
 #
 # Temperature sensors
 #
+CONFIG_MAXIM_THERMOCOUPLE=m
 CONFIG_MLX90614=m
 CONFIG_TMP006=m
 CONFIG_TSYS01=m
@@ -7885,6 +7937,7 @@ CONFIG_VME_BUS=y
 #
 CONFIG_VME_CA91CX42=m
 CONFIG_VME_TSI148=m
+# CONFIG_VME_FAKE is not set
 
 #
 # VME Board Drivers
@@ -7912,7 +7965,16 @@ CONFIG_IPACK_BUS=m
 CONFIG_BOARD_TPCI200=m
 CONFIG_SERIAL_IPOCTAL=m
 CONFIG_RESET_CONTROLLER=y
+# CONFIG_RESET_ATH79 is not set
+# CONFIG_RESET_BERLIN is not set
+# CONFIG_RESET_LPC18XX is not set
+# CONFIG_RESET_MESON is not set
+# CONFIG_RESET_PISTACHIO is not set
+# CONFIG_RESET_SOCFPGA is not set
+# CONFIG_RESET_STM32 is not set
+# CONFIG_RESET_SUNXI is not set
 CONFIG_TI_SYSCON_RESET=m
+# CONFIG_RESET_ZYNQ is not set
 CONFIG_FMC=m
 CONFIG_FMC_FAKEDEV=m
 CONFIG_FMC_TRIVIAL=m
@@ -7935,6 +7997,7 @@ CONFIG_POWERCAP=y
 CONFIG_INTEL_RAPL=m
 CONFIG_MCB=m
 CONFIG_MCB_PCI=m
+CONFIG_MCB_LPC=m
 
 #
 # Performance monitor support
@@ -7954,6 +8017,7 @@ CONFIG_ND_CLAIM=y
 CONFIG_ND_BTT=m
 CONFIG_BTT=y
 CONFIG_DEV_DAX=m
+CONFIG_NR_DEV_DAX=32768
 CONFIG_NVMEM=m
 CONFIG_STM=m
 CONFIG_STM_DUMMY=m
@@ -7971,7 +8035,6 @@ CONFIG_INTEL_TH_PTI=m
 # FPGA Configuration Support
 #
 CONFIG_FPGA=m
-CONFIG_FPGA_MGR_ZYNQ_FPGA=m
 
 #
 # Firmware Drivers
@@ -8003,6 +8066,7 @@ CONFIG_EFI_RUNTIME_MAP=y
 CONFIG_EFI_RUNTIME_WRAPPERS=y
 CONFIG_EFI_BOOTLOADER_CONTROL=m
 # CONFIG_EFI_CAPSULE_LOADER is not set
+# CONFIG_EFI_TEST is not set
 CONFIG_UEFI_CPER=y
 
 #
@@ -8477,7 +8541,6 @@ CONFIG_USER_STACKTRACE_SUPPORT=y
 CONFIG_NOP_TRACER=y
 CONFIG_HAVE_FUNCTION_TRACER=y
 CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
-CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y
 CONFIG_HAVE_DYNAMIC_FTRACE=y
 CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y
 CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
@@ -8497,6 +8560,7 @@ CONFIG_FUNCTION_TRACER=y
 CONFIG_FUNCTION_GRAPH_TRACER=y
 # CONFIG_IRQSOFF_TRACER is not set
 CONFIG_SCHED_TRACER=y
+# CONFIG_HWLAT_TRACER is not set
 CONFIG_FTRACE_SYSCALLS=y
 CONFIG_TRACER_SNAPSHOT=y
 # CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set
@@ -8563,6 +8627,7 @@ CONFIG_KDB_DEFAULT_ENABLE=0x1
 CONFIG_KDB_KEYBOARD=y
 CONFIG_KDB_CONTINUE_CATASTROPHIC=0
 CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y
+# CONFIG_ARCH_WANTS_UBSAN_NO_NULL is not set
 # CONFIG_UBSAN is not set
 CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y
 CONFIG_STRICT_DEVMEM=y
@@ -8628,10 +8693,10 @@ CONFIG_SECURITY_SELINUX_DISABLE=y
 CONFIG_SECURITY_SELINUX_DEVELOP=y
 CONFIG_SECURITY_SELINUX_AVC_STATS=y
 CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1
-# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set
 CONFIG_SECURITY_SMACK=y
 # CONFIG_SECURITY_SMACK_BRINGUP is not set
 CONFIG_SECURITY_SMACK_NETFILTER=y
+# CONFIG_SECURITY_SMACK_APPEND_SIGNALS is not set
 CONFIG_SECURITY_TOMOYO=y
 CONFIG_SECURITY_TOMOYO_MAX_ACCEPT_ENTRY=2048
 CONFIG_SECURITY_TOMOYO_MAX_AUDIT_LOG=1024
@@ -8843,6 +8908,7 @@ CONFIG_CRYPTO_DEV_QAT_C62X=m
 CONFIG_CRYPTO_DEV_QAT_DH895xCCVF=m
 CONFIG_CRYPTO_DEV_QAT_C3XXXVF=m
 CONFIG_CRYPTO_DEV_QAT_C62XVF=m
+CONFIG_CRYPTO_DEV_CHELSIO=m
 CONFIG_ASYMMETRIC_KEY_TYPE=y
 CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
 CONFIG_X509_CERTIFICATE_PARSER=y
@@ -8960,7 +9026,6 @@ CONFIG_DQL=y
 CONFIG_GLOB=y
 # CONFIG_GLOB_SELFTEST is not set
 CONFIG_NLATTR=y
-CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y
 CONFIG_LRU_CACHE=m
 CONFIG_CLZ_TAB=y
 CONFIG_CORDIC=m
@@ -8978,3 +9043,4 @@ CONFIG_FONT_8x16=y
 CONFIG_SG_POOL=y
 CONFIG_ARCH_HAS_SG_CHAIN=y
 CONFIG_ARCH_HAS_MMIO_FLUSH=y
+CONFIG_SBITMAP=y
diff --git a/gnu/packages/linux-libre-4.8-x86_64.conf b/gnu/packages/linux-libre-4.9-x86_64.conf
index bbddf58861..ca0fcded61 100644
--- a/gnu/packages/linux-libre-4.8-x86_64.conf
+++ b/gnu/packages/linux-libre-4.9-x86_64.conf
@@ -1,6 +1,6 @@
 #
 # Automatically generated file; DO NOT EDIT.
-# Linux/x86 4.8.0-gnu Kernel Configuration
+# Linux/x86 4.9.0-gnu Kernel Configuration
 #
 CONFIG_64BIT=y
 CONFIG_X86_64=y
@@ -46,6 +46,7 @@ CONFIG_PGTABLE_LEVELS=4
 CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 CONFIG_IRQ_WORK=y
 CONFIG_BUILDTIME_EXTABLE_SORT=y
+CONFIG_THREAD_INFO_IN_TASK=y
 
 #
 # General setup
@@ -291,6 +292,7 @@ CONFIG_SECCOMP_FILTER=y
 CONFIG_HAVE_GCC_PLUGINS=y
 CONFIG_GCC_PLUGINS=y
 # CONFIG_GCC_PLUGIN_CYC_COMPLEXITY is not set
+# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set
 CONFIG_HAVE_CC_STACKPROTECTOR=y
 CONFIG_CC_STACKPROTECTOR=y
 # CONFIG_CC_STACKPROTECTOR_NONE is not set
@@ -318,6 +320,8 @@ CONFIG_HAVE_STACK_VALIDATION=y
 CONFIG_OLD_SIGSUSPEND3=y
 CONFIG_COMPAT_OLD_SIGACTION=y
 # CONFIG_CPU_NO_EFFICIENT_FFS is not set
+CONFIG_HAVE_ARCH_VMAP_STACK=y
+CONFIG_VMAP_STACK=y
 
 #
 # GCOV-based kernel profiling
@@ -369,6 +373,7 @@ CONFIG_EFI_PARTITION=y
 CONFIG_SYSV68_PARTITION=y
 CONFIG_CMDLINE_PARTITION=y
 CONFIG_BLOCK_COMPAT=y
+CONFIG_BLK_MQ_PCI=y
 
 #
 # IO Schedulers
@@ -415,6 +420,7 @@ CONFIG_X86_NUMACHIP=y
 # CONFIG_X86_UV is not set
 # CONFIG_X86_GOLDFISH is not set
 # CONFIG_X86_INTEL_MID is not set
+# CONFIG_MLX_PLATFORM is not set
 CONFIG_X86_INTEL_LPSS=y
 CONFIG_X86_AMD_PLATFORM_DEVICE=y
 CONFIG_IOSF_MBI=y
@@ -700,6 +706,7 @@ CONFIG_ACPI_APEI_MEMORY_FAILURE=y
 CONFIG_ACPI_APEI_EINJ=m
 # CONFIG_ACPI_APEI_ERST_DEBUG is not set
 CONFIG_DPTF_POWER=m
+CONFIG_ACPI_WATCHDOG=y
 CONFIG_ACPI_EXTLOG=m
 # CONFIG_PMIC_OPREGION is not set
 CONFIG_ACPI_CONFIGFS=m
@@ -724,7 +731,7 @@ CONFIG_CPU_FREQ_GOV_POWERSAVE=y
 CONFIG_CPU_FREQ_GOV_USERSPACE=y
 CONFIG_CPU_FREQ_GOV_ONDEMAND=y
 CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
-CONFIG_CPU_FREQ_GOV_SCHEDUTIL=m
+CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y
 
 #
 # CPU frequency scaling drivers
@@ -779,6 +786,7 @@ CONFIG_PCIEASPM_DEFAULT=y
 # CONFIG_PCIEASPM_PERFORMANCE is not set
 CONFIG_PCIE_PME=y
 CONFIG_PCIE_DPC=y
+CONFIG_PCIE_PTM=y
 CONFIG_PCI_BUS_ADDR_T_64BIT=y
 CONFIG_PCI_MSI=y
 CONFIG_PCI_MSI_IRQ_DOMAIN=y
@@ -805,6 +813,7 @@ CONFIG_HOTPLUG_PCI_SHPC=m
 # PCI host controller drivers
 #
 # CONFIG_PCIE_DW_PLAT is not set
+# CONFIG_VMD is not set
 # CONFIG_ISA_BUS is not set
 CONFIG_ISA_DMA_API=y
 CONFIG_AMD_NB=y
@@ -865,7 +874,6 @@ CONFIG_SYSVIPC_COMPAT=y
 CONFIG_KEYS_COMPAT=y
 CONFIG_X86_DEV_DMA_OPS=y
 CONFIG_PMC_ATOM=y
-# CONFIG_VMD is not set
 CONFIG_NET=y
 CONFIG_COMPAT_NETLINK_MESSAGES=y
 CONFIG_NET_INGRESS=y
@@ -941,6 +949,7 @@ CONFIG_TCP_CONG_YEAH=m
 CONFIG_TCP_CONG_ILLINOIS=m
 CONFIG_TCP_CONG_DCTCP=m
 CONFIG_TCP_CONG_CDG=m
+CONFIG_TCP_CONG_BBR=m
 CONFIG_DEFAULT_CUBIC=y
 # CONFIG_DEFAULT_RENO is not set
 CONFIG_DEFAULT_TCP_CONG="cubic"
@@ -1036,9 +1045,10 @@ CONFIG_NF_TABLES_INET=m
 CONFIG_NF_TABLES_NETDEV=m
 CONFIG_NFT_EXTHDR=m
 CONFIG_NFT_META=m
+CONFIG_NFT_NUMGEN=m
 CONFIG_NFT_CT=m
-CONFIG_NFT_RBTREE=m
-CONFIG_NFT_HASH=m
+CONFIG_NFT_SET_RBTREE=m
+CONFIG_NFT_SET_HASH=m
 CONFIG_NFT_COUNTER=m
 CONFIG_NFT_LOG=m
 CONFIG_NFT_LIMIT=m
@@ -1046,9 +1056,11 @@ CONFIG_NFT_MASQ=m
 CONFIG_NFT_REDIR=m
 CONFIG_NFT_NAT=m
 CONFIG_NFT_QUEUE=m
+CONFIG_NFT_QUOTA=m
 CONFIG_NFT_REJECT=m
 CONFIG_NFT_REJECT_INET=m
 CONFIG_NFT_COMPAT=m
+CONFIG_NFT_HASH=m
 CONFIG_NF_DUP_NETDEV=m
 CONFIG_NFT_DUP_NETDEV=m
 CONFIG_NFT_FWD_NETDEV=m
@@ -1470,9 +1482,12 @@ CONFIG_NET_ACT_CSUM=m
 CONFIG_NET_ACT_VLAN=m
 CONFIG_NET_ACT_BPF=m
 CONFIG_NET_ACT_CONNMARK=m
+CONFIG_NET_ACT_SKBMOD=m
 CONFIG_NET_ACT_IFE=m
+CONFIG_NET_ACT_TUNNEL_KEY=m
 CONFIG_NET_IFE_SKBMARK=m
 CONFIG_NET_IFE_SKBPRIO=m
+CONFIG_NET_IFE_SKBTCINDEX=m
 # CONFIG_NET_CLS_IND is not set
 CONFIG_NET_SCH_FIFO=y
 CONFIG_DCB=y
@@ -1483,6 +1498,7 @@ CONFIG_BATMAN_ADV_BLA=y
 CONFIG_BATMAN_ADV_DAT=y
 CONFIG_BATMAN_ADV_NC=y
 CONFIG_BATMAN_ADV_MCAST=y
+CONFIG_BATMAN_ADV_DEBUGFS=y
 # CONFIG_BATMAN_ADV_DEBUG is not set
 CONFIG_OPENVSWITCH=m
 CONFIG_OPENVSWITCH_GRE=m
@@ -1681,6 +1697,7 @@ CONFIG_BT_HCIUART_INTEL=y
 CONFIG_BT_HCIUART_BCM=y
 CONFIG_BT_HCIUART_QCA=y
 CONFIG_BT_HCIUART_AG6XX=y
+CONFIG_BT_HCIUART_MRVL=y
 CONFIG_BT_HCIBCM203X=m
 CONFIG_BT_HCIBPA10X=m
 CONFIG_BT_HCIBFUSB=m
@@ -1694,9 +1711,12 @@ CONFIG_BT_MRVL_SDIO=m
 CONFIG_BT_ATH3K=m
 CONFIG_BT_WILINK=m
 CONFIG_AF_RXRPC=m
+CONFIG_AF_RXRPC_IPV6=y
+# CONFIG_AF_RXRPC_INJECT_LOSS is not set
 # CONFIG_AF_RXRPC_DEBUG is not set
 # CONFIG_RXKAD is not set
 CONFIG_AF_KCM=m
+CONFIG_STREAM_PARSER=m
 CONFIG_FIB_RULES=y
 CONFIG_WIRELESS=y
 CONFIG_WIRELESS_EXT=y
@@ -1821,6 +1841,7 @@ CONFIG_ALLOW_DEV_COREDUMP=y
 CONFIG_DEV_COREDUMP=y
 # CONFIG_DEBUG_DRIVER is not set
 # CONFIG_DEBUG_DEVRES is not set
+# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set
 CONFIG_SYS_HYPERVISOR=y
 # CONFIG_GENERIC_CPU_DEVICES is not set
 CONFIG_GENERIC_CPU_AUTOPROBE=y
@@ -2095,9 +2116,6 @@ CONFIG_HMC6352=m
 CONFIG_DS1682=m
 CONFIG_TI_DAC7512=m
 CONFIG_VMWARE_BALLOON=m
-CONFIG_BMP085=m
-CONFIG_BMP085_I2C=m
-CONFIG_BMP085_SPI=m
 CONFIG_USB_SWITCH_FSA9480=m
 CONFIG_LATTICE_ECP3_CONFIG=m
 CONFIG_SRAM=y
@@ -2266,6 +2284,7 @@ CONFIG_SCSI_MPT3SAS=m
 CONFIG_SCSI_MPT2SAS_MAX_SGE=128
 CONFIG_SCSI_MPT3SAS_MAX_SGE=128
 CONFIG_SCSI_MPT2SAS=m
+CONFIG_SCSI_SMARTPQI=m
 CONFIG_SCSI_UFSHCD=m
 CONFIG_SCSI_UFSHCD_PCI=m
 # CONFIG_SCSI_UFS_DWC_TC_PCI is not set
@@ -2611,6 +2630,8 @@ CONFIG_NET_VENDOR_ALTEON=y
 CONFIG_ACENIC=m
 # CONFIG_ACENIC_OMIT_TIGON_I is not set
 CONFIG_ALTERA_TSE=m
+CONFIG_NET_VENDOR_AMAZON=y
+CONFIG_ENA_ETHERNET=m
 CONFIG_NET_VENDOR_AMD=y
 CONFIG_AMD8111_ETH=m
 CONFIG_PCNET32=m
@@ -2645,6 +2666,7 @@ CONFIG_NET_VENDOR_CAVIUM=y
 CONFIG_THUNDER_NIC_PF=m
 CONFIG_THUNDER_NIC_VF=m
 CONFIG_THUNDER_NIC_BGX=m
+CONFIG_THUNDER_NIC_RGX=m
 CONFIG_LIQUIDIO=m
 CONFIG_NET_VENDOR_CHELSIO=y
 CONFIG_CHELSIO_T1=m
@@ -2768,9 +2790,12 @@ CONFIG_QLCNIC_HWMON=y
 CONFIG_QLGE=m
 CONFIG_NETXEN_NIC=m
 CONFIG_QED=m
+CONFIG_QED_LL2=y
 CONFIG_QED_SRIOV=y
 CONFIG_QEDE=m
+CONFIG_QED_RDMA=y
 CONFIG_NET_VENDOR_QUALCOMM=y
+CONFIG_QCOM_EMAC=m
 CONFIG_NET_VENDOR_REALTEK=y
 CONFIG_ATP=m
 CONFIG_8139CP=m
@@ -2842,40 +2867,46 @@ CONFIG_PHYLIB=y
 CONFIG_SWPHY=y
 
 #
+# MDIO bus device drivers
+#
+CONFIG_MDIO_BCM_UNIMAC=m
+CONFIG_MDIO_BITBANG=m
+CONFIG_MDIO_CAVIUM=m
+CONFIG_MDIO_GPIO=m
+CONFIG_MDIO_OCTEON=m
+CONFIG_MDIO_THUNDER=m
+
+#
 # MII PHY device drivers
 #
+CONFIG_AMD_PHY=m
 CONFIG_AQUANTIA_PHY=m
 CONFIG_AT803X_PHY=m
-CONFIG_AMD_PHY=m
-CONFIG_MARVELL_PHY=m
-CONFIG_DAVICOM_PHY=m
-CONFIG_QSEMI_PHY=m
-CONFIG_LXT_PHY=m
-CONFIG_CICADA_PHY=m
-CONFIG_VITESSE_PHY=m
-CONFIG_TERANETICS_PHY=m
-CONFIG_SMSC_PHY=m
-CONFIG_BCM_NET_PHYLIB=m
-CONFIG_BROADCOM_PHY=m
 CONFIG_BCM7XXX_PHY=m
 CONFIG_BCM87XX_PHY=m
-CONFIG_ICPLUS_PHY=m
-CONFIG_REALTEK_PHY=m
-CONFIG_NATIONAL_PHY=m
-CONFIG_STE10XP=m
-CONFIG_LSI_ET1011C_PHY=m
-CONFIG_MICREL_PHY=m
+CONFIG_BCM_NET_PHYLIB=m
+CONFIG_BROADCOM_PHY=m
+CONFIG_CICADA_PHY=m
+CONFIG_DAVICOM_PHY=m
 CONFIG_DP83848_PHY=m
 CONFIG_DP83867_PHY=m
-CONFIG_MICROCHIP_PHY=m
 CONFIG_FIXED_PHY=y
-CONFIG_MDIO_BITBANG=m
-CONFIG_MDIO_GPIO=m
-CONFIG_MDIO_CAVIUM=m
-CONFIG_MDIO_OCTEON=m
-CONFIG_MDIO_THUNDER=m
-CONFIG_MDIO_BCM_UNIMAC=m
+CONFIG_ICPLUS_PHY=m
 CONFIG_INTEL_XWAY_PHY=m
+CONFIG_LSI_ET1011C_PHY=m
+CONFIG_LXT_PHY=m
+CONFIG_MARVELL_PHY=m
+CONFIG_MICREL_PHY=m
+CONFIG_MICROCHIP_PHY=m
+CONFIG_MICROSEMI_PHY=m
+CONFIG_NATIONAL_PHY=m
+CONFIG_QSEMI_PHY=m
+CONFIG_REALTEK_PHY=m
+CONFIG_SMSC_PHY=m
+CONFIG_STE10XP=m
+CONFIG_TERANETICS_PHY=m
+CONFIG_VITESSE_PHY=m
+CONFIG_XILINX_GMII2RGMII=m
 CONFIG_MICREL_KS8995MA=m
 CONFIG_PLIP=m
 CONFIG_PPP=y
@@ -3388,6 +3419,7 @@ CONFIG_INPUT_EVDEV=y
 # Input Device Drivers
 #
 CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ADC=m
 CONFIG_KEYBOARD_ADP5520=m
 CONFIG_KEYBOARD_ADP5588=m
 CONFIG_KEYBOARD_ADP5589=m
@@ -3486,6 +3518,7 @@ CONFIG_TOUCHSCREEN_AD7879=m
 CONFIG_TOUCHSCREEN_AD7879_I2C=m
 CONFIG_TOUCHSCREEN_AD7879_SPI=m
 CONFIG_TOUCHSCREEN_ATMEL_MXT=m
+# CONFIG_TOUCHSCREEN_ATMEL_MXT_T37 is not set
 CONFIG_TOUCHSCREEN_AUO_PIXCIR=m
 CONFIG_TOUCHSCREEN_BU21013=m
 CONFIG_TOUCHSCREEN_CY8CTMG110=m
@@ -3501,11 +3534,11 @@ CONFIG_TOUCHSCREEN_DYNAPRO=m
 CONFIG_TOUCHSCREEN_HAMPSHIRE=m
 CONFIG_TOUCHSCREEN_EETI=m
 CONFIG_TOUCHSCREEN_EGALAX_SERIAL=m
-CONFIG_TOUCHSCREEN_FT6236=m
 CONFIG_TOUCHSCREEN_FUJITSU=m
 CONFIG_TOUCHSCREEN_GOODIX=m
 CONFIG_TOUCHSCREEN_ILI210X=m
 CONFIG_TOUCHSCREEN_GUNZE=m
+CONFIG_TOUCHSCREEN_EKTF2127=m
 CONFIG_TOUCHSCREEN_ELAN=m
 CONFIG_TOUCHSCREEN_ELO=m
 CONFIG_TOUCHSCREEN_WACOM_W8001=m
@@ -3587,6 +3620,7 @@ CONFIG_INPUT_APANEL=m
 CONFIG_INPUT_GP2A=m
 CONFIG_INPUT_GPIO_BEEPER=m
 CONFIG_INPUT_GPIO_TILT_POLLED=m
+CONFIG_INPUT_GPIO_DECODER=m
 CONFIG_INPUT_ATLAS_BTNS=m
 CONFIG_INPUT_ATI_REMOTE2=m
 CONFIG_INPUT_KEYSPAN_REMOTE=m
@@ -3632,6 +3666,7 @@ CONFIG_RMI4_2D_SENSOR=y
 CONFIG_RMI4_F11=y
 CONFIG_RMI4_F12=y
 CONFIG_RMI4_F30=y
+# CONFIG_RMI4_F54 is not set
 
 #
 # Hardware I/O ports
@@ -3709,6 +3744,7 @@ CONFIG_SERIAL_8250_RSA=y
 # CONFIG_SERIAL_8250_FSL is not set
 CONFIG_SERIAL_8250_DW=m
 CONFIG_SERIAL_8250_RT288X=y
+CONFIG_SERIAL_8250_LPSS=m
 CONFIG_SERIAL_8250_MID=m
 CONFIG_SERIAL_8250_MOXA=m
 
@@ -3983,7 +4019,6 @@ CONFIG_PINCTRL_INTEL=m
 CONFIG_PINCTRL_BROXTON=m
 CONFIG_PINCTRL_SUNRISEPOINT=m
 CONFIG_GPIOLIB=y
-CONFIG_GPIO_DEVRES=y
 CONFIG_GPIO_ACPI=y
 CONFIG_GPIOLIB_IRQCHIP=y
 # CONFIG_DEBUG_GPIO is not set
@@ -3995,11 +4030,13 @@ CONFIG_GPIO_MAX730X=m
 # Memory mapped GPIO drivers
 #
 CONFIG_GPIO_AMDPT=m
+CONFIG_GPIO_AXP209=m
 CONFIG_GPIO_DWAPB=m
 CONFIG_GPIO_GENERIC_PLATFORM=m
 CONFIG_GPIO_ICH=m
 CONFIG_GPIO_LYNXPOINT=y
 CONFIG_GPIO_MENZ127=m
+# CONFIG_GPIO_MOCKUP is not set
 CONFIG_GPIO_VX855=m
 CONFIG_GPIO_ZX=y
 
@@ -4021,6 +4058,7 @@ CONFIG_GPIO_PCA953X=m
 CONFIG_GPIO_PCF857X=m
 CONFIG_GPIO_SX150X=y
 CONFIG_GPIO_TPIC2810=m
+# CONFIG_GPIO_TS4900 is not set
 
 #
 # MFD GPIO expanders
@@ -4034,6 +4072,7 @@ CONFIG_GPIO_DLN2=m
 CONFIG_GPIO_JANZ_TTL=m
 CONFIG_GPIO_KEMPLD=m
 CONFIG_GPIO_LP3943=m
+CONFIG_GPIO_LP873X=m
 CONFIG_GPIO_PALMAS=y
 CONFIG_GPIO_RC5T583=y
 CONFIG_GPIO_TPS65086=m
@@ -4044,6 +4083,7 @@ CONFIG_GPIO_TPS65912=m
 CONFIG_GPIO_TWL4030=m
 CONFIG_GPIO_TWL6040=m
 CONFIG_GPIO_UCB1400=m
+CONFIG_GPIO_WHISKEY_COVE=m
 CONFIG_GPIO_WM831X=m
 CONFIG_GPIO_WM8350=m
 CONFIG_GPIO_WM8994=m
@@ -4100,6 +4140,9 @@ CONFIG_W1_SLAVE_DS2780=m
 CONFIG_W1_SLAVE_DS2781=m
 CONFIG_W1_SLAVE_DS28E04=m
 CONFIG_W1_SLAVE_BQ27000=m
+CONFIG_POWER_AVS=y
+CONFIG_POWER_RESET=y
+CONFIG_POWER_RESET_RESTART=y
 CONFIG_POWER_SUPPLY=y
 # CONFIG_POWER_SUPPLY_DEBUG is not set
 CONFIG_PDA_POWER=m
@@ -4152,9 +4195,6 @@ CONFIG_BATTERY_GAUGE_LTC2941=m
 CONFIG_BATTERY_RT5033=m
 CONFIG_CHARGER_RT9455=m
 CONFIG_AXP20X_POWER=m
-CONFIG_POWER_RESET=y
-CONFIG_POWER_RESET_RESTART=y
-CONFIG_POWER_AVS=y
 CONFIG_HWMON=y
 CONFIG_HWMON_VID=m
 # CONFIG_HWMON_DEBUG_CHIP is not set
@@ -4322,6 +4362,7 @@ CONFIG_SENSORS_W83627HF=m
 CONFIG_SENSORS_W83627EHF=m
 CONFIG_SENSORS_WM831X=m
 CONFIG_SENSORS_WM8350=m
+CONFIG_SENSORS_XGENE=m
 
 #
 # ACPI drivers
@@ -4352,6 +4393,7 @@ CONFIG_INTEL_SOC_DTS_THERMAL=m
 CONFIG_INT340X_THERMAL=m
 CONFIG_ACPI_THERMAL_REL=m
 CONFIG_INT3406_THERMAL=m
+CONFIG_INTEL_BXT_PMIC_THERMAL=m
 CONFIG_INTEL_PCH_THERMAL=m
 CONFIG_GENERIC_ADC_THERMAL=m
 CONFIG_WATCHDOG=y
@@ -4368,6 +4410,7 @@ CONFIG_DA9055_WATCHDOG=m
 CONFIG_DA9063_WATCHDOG=m
 CONFIG_DA9062_WATCHDOG=m
 CONFIG_MENF21BMC_WATCHDOG=m
+CONFIG_WDAT_WDT=m
 CONFIG_WM831X_WATCHDOG=m
 CONFIG_WM8350_WATCHDOG=m
 CONFIG_XILINX_WATCHDOG=m
@@ -4425,6 +4468,13 @@ CONFIG_WDTPCI=m
 # USB-based Watchdog Cards
 #
 CONFIG_USBPCWATCHDOG=m
+
+#
+# Watchdog Pretimeout Governors
+#
+# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set
+# CONFIG_WATCHDOG_PRETIMEOUT_DEFAULT_GOV_NOOP is not set
+# CONFIG_WATCHDOG_PRETIMEOUT_DEFAULT_GOV_PANIC is not set
 CONFIG_SSB_POSSIBLE=y
 
 #
@@ -4483,6 +4533,7 @@ CONFIG_MFD_DA9062=m
 CONFIG_MFD_DA9063=y
 CONFIG_MFD_DA9150=m
 CONFIG_MFD_DLN2=m
+CONFIG_MFD_EXYNOS_LPASS=m
 CONFIG_MFD_MC13XXX=m
 CONFIG_MFD_MC13XXX_SPI=m
 CONFIG_MFD_MC13XXX_I2C=m
@@ -4541,6 +4592,7 @@ CONFIG_TPS6507X=m
 CONFIG_MFD_TPS65086=m
 CONFIG_MFD_TPS65090=y
 CONFIG_MFD_TPS65217=m
+CONFIG_MFD_TI_LP873X=m
 CONFIG_MFD_TPS65218=m
 CONFIG_MFD_TPS6586X=y
 CONFIG_MFD_TPS65910=y
@@ -4603,6 +4655,7 @@ CONFIG_REGULATOR_LP872X=m
 CONFIG_REGULATOR_LP8755=m
 CONFIG_REGULATOR_LP8788=m
 CONFIG_REGULATOR_LTC3589=m
+CONFIG_REGULATOR_LTC3676=m
 CONFIG_REGULATOR_MAX14577=m
 CONFIG_REGULATOR_MAX1586=m
 CONFIG_REGULATOR_MAX8649=m
@@ -4671,6 +4724,7 @@ CONFIG_VIDEO_V4L2_SUBDEV_API=y
 CONFIG_VIDEO_V4L2=m
 # CONFIG_VIDEO_ADV_DEBUG is not set
 # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
+# CONFIG_VIDEO_PCI_SKELETON is not set
 CONFIG_VIDEO_TUNER=m
 CONFIG_V4L2_MEM2MEM_DEV=m
 CONFIG_V4L2_FLASH_LED_CLASS=m
@@ -4826,6 +4880,7 @@ CONFIG_VIDEO_TM6000_DVB=m
 #
 CONFIG_DVB_USB=m
 # CONFIG_DVB_USB_DEBUG is not set
+CONFIG_DVB_USB_DIB3000MC=m
 CONFIG_DVB_USB_A800=m
 CONFIG_DVB_USB_DIBUSB_MB=m
 # CONFIG_DVB_USB_DIBUSB_MB_FAULTY is not set
@@ -4893,6 +4948,7 @@ CONFIG_MEDIA_PCI_SUPPORT=y
 #
 CONFIG_VIDEO_MEYE=m
 CONFIG_VIDEO_SOLO6X10=m
+CONFIG_VIDEO_TW5864=m
 CONFIG_VIDEO_TW68=m
 CONFIG_VIDEO_TW686X=m
 CONFIG_VIDEO_ZORAN=m
@@ -5033,7 +5089,7 @@ CONFIG_SMS_SIANO_DEBUGFS=y
 CONFIG_VIDEO_V4L2_TPG=m
 
 #
-# Media ancillary drivers (tuners, sensors, i2c, frontends)
+# Media ancillary drivers (tuners, sensors, i2c, spi, frontends)
 #
 CONFIG_MEDIA_SUBDRV_AUTOSELECT=y
 CONFIG_MEDIA_ATTACH=y
@@ -5099,6 +5155,7 @@ CONFIG_VIDEO_ADV7511=m
 #
 CONFIG_VIDEO_OV7640=m
 CONFIG_VIDEO_OV7670=m
+CONFIG_VIDEO_MT9M111=m
 CONFIG_VIDEO_MT9V011=m
 
 #
@@ -5256,6 +5313,7 @@ CONFIG_DVB_RTL2832=m
 CONFIG_DVB_RTL2832_SDR=m
 CONFIG_DVB_SI2168=m
 CONFIG_DVB_AS102_FE=m
+CONFIG_DVB_GP8PSK_FE=m
 
 #
 # DVB-C (cable) frontends
@@ -5355,15 +5413,13 @@ CONFIG_DRM_TTM=m
 CONFIG_DRM_I2C_CH7006=m
 CONFIG_DRM_I2C_SIL164=m
 CONFIG_DRM_I2C_NXP_TDA998X=m
-CONFIG_DRM_TDFX=m
-CONFIG_DRM_R128=m
 CONFIG_DRM_RADEON=m
 # CONFIG_DRM_RADEON_USERPTR is not set
 CONFIG_DRM_AMDGPU=m
+# CONFIG_DRM_AMDGPU_SI is not set
 # CONFIG_DRM_AMDGPU_CIK is not set
 CONFIG_DRM_AMDGPU_USERPTR=y
 # CONFIG_DRM_AMDGPU_GART_DEBUGFS is not set
-# CONFIG_DRM_AMD_POWERPLAY is not set
 
 #
 # ACP (Audio CoProcessor) Configuration
@@ -5373,7 +5429,6 @@ CONFIG_DRM_NOUVEAU=m
 CONFIG_NOUVEAU_DEBUG=5
 CONFIG_NOUVEAU_DEBUG_DEFAULT=3
 CONFIG_DRM_NOUVEAU_BACKLIGHT=y
-CONFIG_DRM_I810=m
 CONFIG_DRM_I915=m
 # CONFIG_DRM_I915_PRELIMINARY_HW_SUPPORT is not set
 CONFIG_DRM_I915_USERPTR=y
@@ -5384,10 +5439,6 @@ CONFIG_DRM_I915_USERPTR=y
 #
 # CONFIG_DRM_I915_WERROR is not set
 # CONFIG_DRM_I915_DEBUG is not set
-CONFIG_DRM_MGA=m
-CONFIG_DRM_SIS=m
-CONFIG_DRM_VIA=m
-CONFIG_DRM_SAVAGE=m
 CONFIG_DRM_VGEM=m
 CONFIG_DRM_VMWGFX=m
 CONFIG_DRM_VMWGFX_FBCON=y
@@ -5413,6 +5464,7 @@ CONFIG_DRM_BRIDGE=y
 #
 CONFIG_DRM_ANALOGIX_ANX78XX=m
 CONFIG_HSA_AMD=m
+# CONFIG_DRM_LEGACY is not set
 
 #
 # Frame buffer Devices
@@ -5597,6 +5649,7 @@ CONFIG_SND=m
 CONFIG_SND_TIMER=m
 CONFIG_SND_PCM=m
 CONFIG_SND_PCM_ELD=y
+CONFIG_SND_PCM_IEC958=y
 CONFIG_SND_DMAENGINE_PCM=m
 CONFIG_SND_HWDEP=m
 CONFIG_SND_RAWMIDI=m
@@ -5805,12 +5858,6 @@ CONFIG_SND_SOC_INTEL_SKYLAKE=m
 CONFIG_SND_SOC_INTEL_SKL_RT286_MACH=m
 CONFIG_SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH=m
 CONFIG_SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH=m
-
-#
-# Allwinner SoC Audio support
-#
-CONFIG_SND_SUN4I_CODEC=m
-CONFIG_SND_SUN4I_I2S=m
 CONFIG_SND_SOC_XTFPGA_I2S=m
 CONFIG_SND_SOC_I2C_AND_SPI=m
 
@@ -5845,6 +5892,7 @@ CONFIG_SND_SOC_CS4349=m
 CONFIG_SND_SOC_CS53L30=m
 CONFIG_SND_SOC_DA7219=m
 CONFIG_SND_SOC_DMIC=m
+CONFIG_SND_SOC_HDMI_CODEC=m
 CONFIG_SND_SOC_ES8328=m
 CONFIG_SND_SOC_GTM601=m
 CONFIG_SND_SOC_HDAC_HDMI=m
@@ -5872,6 +5920,7 @@ CONFIG_SND_SOC_RT5631=m
 CONFIG_SND_SOC_RT5640=m
 CONFIG_SND_SOC_RT5645=m
 CONFIG_SND_SOC_RT5651=m
+CONFIG_SND_SOC_RT5663=m
 CONFIG_SND_SOC_RT5670=m
 # CONFIG_SND_SOC_RT5677_SPI is not set
 CONFIG_SND_SOC_SGTL5000=m
@@ -5919,6 +5968,7 @@ CONFIG_SND_SOC_WM8962=m
 CONFIG_SND_SOC_WM8974=m
 CONFIG_SND_SOC_WM8978=m
 CONFIG_SND_SOC_WM8985=m
+CONFIG_SND_SOC_NAU8810=m
 CONFIG_SND_SOC_NAU8825=m
 CONFIG_SND_SOC_TPA6130A2=m
 CONFIG_SND_SIMPLE_CARD_UTILS=m
@@ -6047,6 +6097,11 @@ CONFIG_USB_MOUSE=m
 # I2C HID support
 #
 CONFIG_I2C_HID=m
+
+#
+# Intel ISH HID support
+#
+CONFIG_INTEL_ISH_HID=m
 CONFIG_USB_OHCI_LITTLE_ENDIAN=y
 CONFIG_USB_SUPPORT=y
 CONFIG_USB_COMMON=y
@@ -6062,7 +6117,7 @@ CONFIG_USB_DYNAMIC_MINORS=y
 # CONFIG_USB_OTG is not set
 # CONFIG_USB_OTG_WHITELIST is not set
 # CONFIG_USB_OTG_BLACKLIST_HUB is not set
-CONFIG_USB_ULPI_BUS=m
+CONFIG_USB_LEDS_TRIGGER_USBPORT=m
 CONFIG_USB_MON=m
 CONFIG_USB_WUSB=m
 CONFIG_USB_WUSB_CBAF=m
@@ -6140,6 +6195,8 @@ CONFIG_USB_MDC800=m
 CONFIG_USB_MICROTEK=m
 CONFIG_USBIP_CORE=m
 CONFIG_USBIP_VHCI_HCD=m
+CONFIG_USBIP_VHCI_HC_PORTS=8
+CONFIG_USBIP_VHCI_NR_HCS=1
 CONFIG_USBIP_HOST=m
 CONFIG_USBIP_VUDC=m
 # CONFIG_USBIP_DEBUG is not set
@@ -6283,6 +6340,7 @@ CONFIG_USB_ISIGHTFW=m
 CONFIG_USB_YUREX=m
 CONFIG_USB_EZUSB_FX2=m
 CONFIG_USB_HSIC_USB3503=m
+CONFIG_USB_HSIC_USB4604=m
 CONFIG_USB_LINK_LAYER_TEST=m
 CONFIG_USB_CHAOSKEY=m
 CONFIG_UCSI=m
@@ -6401,6 +6459,7 @@ CONFIG_USB_G_DBGP=m
 CONFIG_USB_G_DBGP_SERIAL=y
 CONFIG_USB_G_WEBCAM=m
 CONFIG_USB_LED_TRIG=y
+CONFIG_USB_ULPI_BUS=m
 CONFIG_UWB=m
 CONFIG_UWB_HWA=m
 CONFIG_UWB_WHCI=m
@@ -6505,6 +6564,7 @@ CONFIG_LEDS_MENF21BMC=m
 # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM)
 #
 CONFIG_LEDS_BLINKM=m
+CONFIG_LEDS_MLXCPLD=m
 
 #
 # LED Triggers
@@ -6561,6 +6621,7 @@ CONFIG_INFINIBAND_HFI1=m
 # CONFIG_HFI1_DEBUG_SDMA_ORDER is not set
 CONFIG_HFI1_VERBS_31BIT_PSN=y
 # CONFIG_SDMA_VERBOSITY is not set
+CONFIG_INFINIBAND_QEDR=m
 CONFIG_EDAC_ATOMIC_SCRUB=y
 CONFIG_EDAC_SUPPORT=y
 CONFIG_EDAC=y
@@ -6610,6 +6671,7 @@ CONFIG_RTC_DRV_ABB5ZES3=m
 CONFIG_RTC_DRV_ABX80X=m
 CONFIG_RTC_DRV_DS1307=m
 CONFIG_RTC_DRV_DS1307_HWMON=y
+# CONFIG_RTC_DRV_DS1307_CENTURY is not set
 CONFIG_RTC_DRV_DS1374=m
 CONFIG_RTC_DRV_DS1374_WDT=y
 CONFIG_RTC_DRV_DS1672=m
@@ -6622,7 +6684,6 @@ CONFIG_RTC_DRV_MAX8997=m
 CONFIG_RTC_DRV_RS5C372=m
 CONFIG_RTC_DRV_ISL1208=m
 CONFIG_RTC_DRV_ISL12022=m
-CONFIG_RTC_DRV_ISL12057=m
 CONFIG_RTC_DRV_X1205=m
 CONFIG_RTC_DRV_PCF8523=m
 CONFIG_RTC_DRV_PCF85063=m
@@ -6755,6 +6816,7 @@ CONFIG_KS0108_PORT=0x378
 CONFIG_KS0108_DELAY=2
 CONFIG_CFAG12864B=m
 CONFIG_CFAG12864B_RATE=20
+CONFIG_IMG_ASCII_LCD=m
 CONFIG_UIO=m
 CONFIG_UIO_CIF=m
 CONFIG_UIO_PDRV_GENIRQ=m
@@ -6974,9 +7036,6 @@ CONFIG_RTL8192E=m
 CONFIG_R8712U=m
 CONFIG_R8188EU=m
 CONFIG_88EU_AP_MODE=y
-CONFIG_R8723AU=m
-CONFIG_8723AU_AP_MODE=y
-CONFIG_8723AU_BT_COEXIST=y
 CONFIG_RTS5208=m
 CONFIG_VT6655=m
 CONFIG_VT6656=m
@@ -7108,7 +7167,6 @@ CONFIG_MTD_SPINAND_ONDIEECC=y
 CONFIG_LNET=m
 CONFIG_LNET_MAX_PAYLOAD=1048576
 # CONFIG_LNET_SELFTEST is not set
-CONFIG_LNET_XPRT_IB=m
 # CONFIG_LUSTRE_FS is not set
 CONFIG_DGNC=m
 CONFIG_GS_FPGABOOT=m
@@ -7170,6 +7228,7 @@ CONFIG_HDM_USB=m
 # Old ISDN4Linux (deprecated)
 #
 CONFIG_KS7010=m
+# CONFIG_GREYBUS is not set
 CONFIG_X86_PLATFORM_DEVICES=y
 CONFIG_ACER_WMI=m
 CONFIG_ACERHDF=m
@@ -7258,7 +7317,6 @@ CONFIG_COMMON_CLK_PALMAS=m
 CONFIG_COMMON_CLK_PWM=m
 # CONFIG_COMMON_CLK_PXA is not set
 # CONFIG_COMMON_CLK_PIC32 is not set
-# CONFIG_SUNXI_CCU is not set
 
 #
 # Hardware Spinlock drivers
@@ -7343,6 +7401,7 @@ CONFIG_EXTCON_MAX77693=m
 CONFIG_EXTCON_MAX77843=m
 CONFIG_EXTCON_MAX8997=m
 CONFIG_EXTCON_PALMAS=m
+CONFIG_EXTCON_QCOM_SPMI_MISC=m
 CONFIG_EXTCON_RT8973A=m
 CONFIG_EXTCON_SM5502=m
 CONFIG_EXTCON_USB_GPIO=m
@@ -7367,12 +7426,16 @@ CONFIG_BMA220=m
 CONFIG_BMC150_ACCEL=m
 CONFIG_BMC150_ACCEL_I2C=m
 CONFIG_BMC150_ACCEL_SPI=m
+CONFIG_DMARD09=m
 CONFIG_HID_SENSOR_ACCEL_3D=m
 CONFIG_IIO_ST_ACCEL_3AXIS=m
 CONFIG_IIO_ST_ACCEL_I2C_3AXIS=m
 CONFIG_IIO_ST_ACCEL_SPI_3AXIS=m
 CONFIG_KXSD9=m
+CONFIG_KXSD9_SPI=m
+CONFIG_KXSD9_I2C=m
 CONFIG_KXCJK1013=m
+CONFIG_MC3230=m
 CONFIG_MMA7455=m
 CONFIG_MMA7455_I2C=m
 CONFIG_MMA7455_SPI=m
@@ -7405,6 +7468,7 @@ CONFIG_DA9150_GPADC=m
 CONFIG_HI8435=m
 CONFIG_INA2XX_ADC=m
 CONFIG_LP8788_ADC=m
+CONFIG_LTC2485=m
 CONFIG_MAX1027=m
 CONFIG_MAX1363=m
 CONFIG_MCP320X=m
@@ -7416,7 +7480,9 @@ CONFIG_QCOM_SPMI_IADC=m
 CONFIG_QCOM_SPMI_VADC=m
 CONFIG_TI_ADC081C=m
 CONFIG_TI_ADC0832=m
+CONFIG_TI_ADC12138=m
 CONFIG_TI_ADC128S052=m
+CONFIG_TI_ADC161S626=m
 CONFIG_TI_ADS1015=m
 CONFIG_TI_AM335X_ADC=m
 CONFIG_TWL4030_MADC=m
@@ -7471,6 +7537,7 @@ CONFIG_AD5761=m
 CONFIG_AD5764=m
 CONFIG_AD5791=m
 CONFIG_AD7303=m
+CONFIG_AD8801=m
 CONFIG_M62332=m
 CONFIG_MAX517=m
 CONFIG_MCP4725=m
@@ -7575,6 +7642,7 @@ CONFIG_LTR501=m
 CONFIG_MAX44000=m
 CONFIG_OPT3001=m
 CONFIG_PA12203001=m
+CONFIG_SI1145=m
 CONFIG_STK3310=m
 CONFIG_TCS3414=m
 CONFIG_TCS3472=m
@@ -7628,6 +7696,9 @@ CONFIG_TPL0102=m
 #
 # Pressure sensors
 #
+CONFIG_BMP280=m
+CONFIG_BMP280_I2C=m
+CONFIG_BMP280_SPI=m
 CONFIG_HID_SENSOR_PRESS=m
 CONFIG_HP03=m
 CONFIG_MPL115=m
@@ -7643,6 +7714,9 @@ CONFIG_IIO_ST_PRESS_I2C=m
 CONFIG_IIO_ST_PRESS_SPI=m
 CONFIG_T5403=m
 CONFIG_HP206C=m
+CONFIG_ZPA2326=m
+CONFIG_ZPA2326_I2C=m
+CONFIG_ZPA2326_SPI=m
 
 #
 # Lightning sensors
@@ -7658,6 +7732,7 @@ CONFIG_SX9500=m
 #
 # Temperature sensors
 #
+CONFIG_MAXIM_THERMOCOUPLE=m
 CONFIG_MLX90614=m
 CONFIG_TMP006=m
 CONFIG_TSYS01=m
@@ -7676,6 +7751,7 @@ CONFIG_VME_BUS=y
 #
 CONFIG_VME_CA91CX42=m
 CONFIG_VME_TSI148=m
+# CONFIG_VME_FAKE is not set
 
 #
 # VME Board Drivers
@@ -7703,7 +7779,16 @@ CONFIG_IPACK_BUS=m
 CONFIG_BOARD_TPCI200=m
 CONFIG_SERIAL_IPOCTAL=m
 CONFIG_RESET_CONTROLLER=y
+# CONFIG_RESET_ATH79 is not set
+# CONFIG_RESET_BERLIN is not set
+# CONFIG_RESET_LPC18XX is not set
+# CONFIG_RESET_MESON is not set
+# CONFIG_RESET_PISTACHIO is not set
+# CONFIG_RESET_SOCFPGA is not set
+# CONFIG_RESET_STM32 is not set
+# CONFIG_RESET_SUNXI is not set
 CONFIG_TI_SYSCON_RESET=m
+# CONFIG_RESET_ZYNQ is not set
 CONFIG_FMC=m
 CONFIG_FMC_FAKEDEV=m
 CONFIG_FMC_TRIVIAL=m
@@ -7726,6 +7811,7 @@ CONFIG_POWERCAP=y
 CONFIG_INTEL_RAPL=m
 CONFIG_MCB=m
 CONFIG_MCB_PCI=m
+CONFIG_MCB_LPC=m
 
 #
 # Performance monitor support
@@ -7749,6 +7835,7 @@ CONFIG_NVDIMM_PFN=y
 CONFIG_NVDIMM_DAX=y
 CONFIG_DEV_DAX=m
 CONFIG_DEV_DAX_PMEM=m
+CONFIG_NR_DEV_DAX=32768
 CONFIG_NVMEM=m
 CONFIG_STM=m
 CONFIG_STM_DUMMY=m
@@ -7766,7 +7853,6 @@ CONFIG_INTEL_TH_PTI=m
 # FPGA Configuration Support
 #
 CONFIG_FPGA=m
-CONFIG_FPGA_MGR_ZYNQ_FPGA=m
 
 #
 # Firmware Drivers
@@ -7798,6 +7884,7 @@ CONFIG_EFI_RUNTIME_MAP=y
 CONFIG_EFI_RUNTIME_WRAPPERS=y
 CONFIG_EFI_BOOTLOADER_CONTROL=m
 # CONFIG_EFI_CAPSULE_LOADER is not set
+# CONFIG_EFI_TEST is not set
 CONFIG_UEFI_CPER=y
 
 #
@@ -7933,6 +8020,7 @@ CONFIG_TMPFS_POSIX_ACL=y
 CONFIG_TMPFS_XATTR=y
 CONFIG_HUGETLBFS=y
 CONFIG_HUGETLB_PAGE=y
+CONFIG_ARCH_HAS_GIGANTIC_PAGE=y
 CONFIG_CONFIGFS_FS=m
 CONFIG_EFIVAR_FS=y
 CONFIG_MISC_FILESYSTEMS=y
@@ -8277,7 +8365,6 @@ CONFIG_USER_STACKTRACE_SUPPORT=y
 CONFIG_NOP_TRACER=y
 CONFIG_HAVE_FUNCTION_TRACER=y
 CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
-CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y
 CONFIG_HAVE_DYNAMIC_FTRACE=y
 CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y
 CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
@@ -8298,6 +8385,7 @@ CONFIG_FUNCTION_TRACER=y
 CONFIG_FUNCTION_GRAPH_TRACER=y
 # CONFIG_IRQSOFF_TRACER is not set
 CONFIG_SCHED_TRACER=y
+# CONFIG_HWLAT_TRACER is not set
 CONFIG_FTRACE_SYSCALLS=y
 CONFIG_TRACER_SNAPSHOT=y
 # CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set
@@ -8364,6 +8452,7 @@ CONFIG_KDB_DEFAULT_ENABLE=0x1
 CONFIG_KDB_KEYBOARD=y
 CONFIG_KDB_CONTINUE_CATASTROPHIC=0
 CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y
+# CONFIG_ARCH_WANTS_UBSAN_NO_NULL is not set
 # CONFIG_UBSAN is not set
 CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y
 CONFIG_STRICT_DEVMEM=y
@@ -8430,10 +8519,10 @@ CONFIG_SECURITY_SELINUX_DISABLE=y
 CONFIG_SECURITY_SELINUX_DEVELOP=y
 CONFIG_SECURITY_SELINUX_AVC_STATS=y
 CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1
-# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set
 CONFIG_SECURITY_SMACK=y
 # CONFIG_SECURITY_SMACK_BRINGUP is not set
 CONFIG_SECURITY_SMACK_NETFILTER=y
+# CONFIG_SECURITY_SMACK_APPEND_SIGNALS is not set
 CONFIG_SECURITY_TOMOYO=y
 CONFIG_SECURITY_TOMOYO_MAX_ACCEPT_ENTRY=2048
 CONFIG_SECURITY_TOMOYO_MAX_AUDIT_LOG=1024
@@ -8665,6 +8754,7 @@ CONFIG_CRYPTO_DEV_QAT_C62X=m
 CONFIG_CRYPTO_DEV_QAT_DH895xCCVF=m
 CONFIG_CRYPTO_DEV_QAT_C3XXXVF=m
 CONFIG_CRYPTO_DEV_QAT_C62XVF=m
+CONFIG_CRYPTO_DEV_CHELSIO=m
 CONFIG_ASYMMETRIC_KEY_TYPE=y
 CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
 CONFIG_X509_CERTIFICATE_PARSER=y
@@ -8782,7 +8872,6 @@ CONFIG_DQL=y
 CONFIG_GLOB=y
 # CONFIG_GLOB_SELFTEST is not set
 CONFIG_NLATTR=y
-CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y
 CONFIG_LRU_CACHE=m
 CONFIG_CLZ_TAB=y
 CONFIG_CORDIC=m
@@ -8801,3 +8890,4 @@ CONFIG_SG_POOL=y
 CONFIG_ARCH_HAS_SG_CHAIN=y
 CONFIG_ARCH_HAS_PMEM_API=y
 CONFIG_ARCH_HAS_MMIO_FLUSH=y
+CONFIG_SBITMAP=y
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 5d96364892..5b6466c848 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -1,13 +1,13 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2013, 2014, 2015, 2016 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2012 Nikita Karetnikov <nikita@karetnikov.org>
-;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2014, 2015, 2016, 2017 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 Federico Beffa <beffa@fbengineering.ch>
 ;;; 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 <me@tobias.gr>
+;;; Copyright © 2016, 2017 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>
@@ -17,6 +17,8 @@
 ;;; Copyright © 2016 John Darrington <jmd@gnu.org>
 ;;; Copyright © 2016 Marius Bakke <mbakke@fastmail.com>
 ;;; Copyright © 2016 Rene Saavedra <rennes@openmailbox.org>
+;;; Copyright © 2016 ng0 <ng0@libertad.pw>
+;;; Copyright © 2017 Leo Famulari <leo@famulari.name>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -72,6 +74,8 @@
   #:use-module (gnu packages slang)
   #:use-module (gnu packages texinfo)
   #:use-module (gnu packages tls)
+  #:use-module (gnu packages video)
+  #:use-module (gnu packages xiph)
   #:use-module (gnu packages xml)
   #:use-module (gnu packages xdisorg)
   #:use-module (gnu packages xorg)
@@ -242,13 +246,15 @@ for ARCH and optionally VARIANT, or #f if there is no such configuration."
        ("bc" ,bc)
        ("openssl" ,openssl)
        ("kmod" ,kmod)
-       ,@(if configuration-file
-             `(("kconfig" ,(configuration-file
-                            (system->linux-architecture
-                             (or (%current-target-system)
-                                 (%current-system)))
-                            #:variant (version-major+minor version))))
-             '())))
+       ,@(match (and configuration-file
+                     (configuration-file
+                      (system->linux-architecture
+                       (or (%current-target-system) (%current-system)))
+                      #:variant (version-major+minor version)))
+           (#f                                    ;no config for this platform
+            '())
+           ((? string? config)
+            `(("kconfig" ,config))))))
     (arguments
      `(#:modules ((guix build gnu-build-system)
                   (guix build utils)
@@ -327,26 +333,26 @@ It has been modified to remove all non-free binary blobs.")
 (define %intel-compatible-systems '("x86_64-linux" "i686-linux"))
 
 (define-public linux-libre
-  (make-linux-libre "4.8.14"
-                    "06rh1j2m4x6kv7prgg2pakw81b7w75dxrl31ch1psf44yqy51q6q"
+  (make-linux-libre "4.9.3"
+                    "1jd2rz58lcha9ac35glr26lc6hfi49fvpiwshgpd6ygf4irrs82w"
                     %intel-compatible-systems
                     #:configuration-file kernel-config))
 
 (define-public linux-libre-4.4
-  (make-linux-libre "4.4.38"
-                    "038mzv5dj7cj5vywiafniai2f56wh7k2yirv0ac61nvg2v25r2jk"
+  (make-linux-libre "4.4.42"
+                    "1jd43yvycizgqdmwp9rpj7gpjy37mah8jlqaiskjb0hivyk495yz"
                     %intel-compatible-systems
                     #:configuration-file kernel-config))
 
 (define-public linux-libre-4.1
-  (make-linux-libre "4.1.36"
-                    "0wy7xpqjwn1aprbzrbqgjskcg8qj2mczkv3rcisxf8gcdifz61qh"
+  (make-linux-libre "4.1.37"
+                    "0q79cxmrz0j5wh7z1dc103q6q6qf7rqgjl7ka8lvn4vl32pr0kq1"
                     %intel-compatible-systems
                     #:configuration-file kernel-config))
 
 ;; Avoid rebuilding kernel variants when there is a minor version bump.
-(define %linux-libre-version "4.8.14")
-(define %linux-libre-hash "06rh1j2m4x6kv7prgg2pakw81b7w75dxrl31ch1psf44yqy51q6q")
+(define %linux-libre-version "4.9.3")
+(define %linux-libre-hash "1jd2rz58lcha9ac35glr26lc6hfi49fvpiwshgpd6ygf4irrs82w")
 
 (define-public linux-libre-arm-generic
   (make-linux-libre %linux-libre-version
@@ -579,7 +585,7 @@ slabtop, and skill.")
 (define-public usbutils
   (package
     (name "usbutils")
-    (version "006")
+    (version "008")
     (source
      (origin
       (method url-fetch)
@@ -587,10 +593,11 @@ slabtop, and skill.")
                           "usbutils-" version ".tar.xz"))
       (sha256
        (base32
-        "03pd57vv8c6x0hgjqcbrxnzi14h8hcghmapg89p8k5zpwpkvbdfr"))))
+        "132clk14j4nm8crln2jymdbbc2vhzar2j2hnxyh05m79pbq1lx24"))))
     (build-system gnu-build-system)
     (inputs
-     `(("libusb" ,libusb)))
+     `(("libusb" ,libusb)
+       ("eudev" ,eudev-with-hwdb)))
     (native-inputs
      `(("pkg-config" ,pkg-config)))
     (home-page "http://www.linux-usb.org/")
@@ -615,9 +622,15 @@ slabtop, and skill.")
                "1ix0b83zgw5n0p2grh2961c6796m92yr2jqc2sbr23x3lfsp8r71"))
              (modules '((guix build utils)))
              (snippet
-              '(substitute* "MCONFIG.in"
-                 (("INSTALL_SYMLINK = /bin/sh")
-                  "INSTALL_SYMLINK = sh")))))
+              '(begin
+                 (substitute* "MCONFIG.in"
+                   (("INSTALL_SYMLINK = /bin/sh")
+                    "INSTALL_SYMLINK = sh"))
+
+                 ;; Do not include a timestamp in libext2fs.info.gz.
+                 (substitute* "doc/Makefile.in"
+                   (("gzip -9")
+                    "gzip -9n"))))))
     (build-system gnu-build-system)
     (inputs `(("util-linux" ,util-linux)))
     (native-inputs `(("pkg-config" ,pkg-config)
@@ -634,6 +647,11 @@ slabtop, and skill.")
                            "--disable-libuuid" "--disable-uuidd"
                            "--disable-fsck"
 
+                           ;; Use symlinks instead of hard links for
+                           ;; 'fsck.extN' etc.  This makes the resulting nar
+                           ;; smaller and is preserved across copies.
+                           "--enable-symlink-install"
+
                            ;; Install libext2fs et al.
                            "--enable-elf-shlibs")
 
@@ -699,6 +717,8 @@ slabtop, and skill.")
     (version (package-version e2fsprogs))
     (build-system trivial-build-system)
     (source #f)
+    (inputs
+     `(("e2fsprogs" ,e2fsprogs/static)))
     (arguments
      `(#:modules ((guix build utils))
        #:builder
@@ -707,23 +727,18 @@ slabtop, and skill.")
                       (ice-9 ftw)
                       (srfi srfi-26))
 
-         (let ((source (string-append (assoc-ref %build-inputs "e2fsprogs")
-                                      "/sbin"))
+         (let ((e2fsck (string-append (assoc-ref %build-inputs "e2fsprogs")
+                                      "/sbin/e2fsck"))
                (bin    (string-append (assoc-ref %outputs "out") "/sbin")))
            (mkdir-p bin)
            (with-directory-excursion bin
-             (for-each (lambda (file)
-                         (copy-file (string-append source "/" file)
-                                    file)
-                         (remove-store-references file)
-                         (chmod file #o555))
-                       (scandir source (cut string-prefix? "fsck." <>))))))))
-    (inputs `(("e2fsprogs" ,e2fsprogs/static)))
-    (synopsis "Statically-linked fsck.* commands from e2fsprogs")
-    (description
-     "This package provides statically-linked command of fsck.ext[234] taken
-from the e2fsprogs package.  It is meant to be used in initrds.")
+             (copy-file e2fsck "e2fsck")
+             (remove-store-references "e2fsck")
+             (chmod "e2fsck" #o555))))))
     (home-page (package-home-page e2fsprogs))
+    (synopsis "Statically-linked e2fsck command from e2fsprogs")
+    (description "This package provides statically-linked e2fsck command taken
+from the e2fsprogs package.  It is meant to be used in initrds.")
     (license (package-license e2fsprogs))))
 
 (define-public extundelete
@@ -850,14 +865,14 @@ MIDI functionality to the Linux-based operating system.")
 (define-public alsa-utils
   (package
     (name "alsa-utils")
-    (version "1.1.2")
+    (version "1.1.3")
     (source (origin
              (method url-fetch)
              (uri (string-append "ftp://ftp.alsa-project.org/pub/utils/"
                                  name "-" version ".tar.bz2"))
              (sha256
               (base32
-               "0wcha78c2sm8qqk5r3w83cvm8fp6fb1zpd35kmcm24kxhz007xks"))))
+               "0z0nnqp1707bm02dys2d16m88lsg5nd26bqaf14rl3za9sjifwhj"))))
     (build-system gnu-build-system)
     (arguments
      ;; XXX: Disable man page creation until we have DocBook.
@@ -876,7 +891,8 @@ MIDI functionality to the Linux-based operating system.")
              ;; Don't try to mkdir /var/lib/alsa.
              (substitute* "Makefile"
                (("\\$\\(MKDIR_P\\) .*ASOUND_STATE_DIR.*")
-                "true\n")))))))
+                "true\n"))
+             #t)))))
     (inputs
      `(("libsamplerate" ,libsamplerate)
        ("ncurses" ,ncurses)
@@ -893,6 +909,68 @@ MIDI functionality to the Linux-based operating system.")
     ;; GPLv2-only.
     (license license:gpl2)))
 
+(define-public alsa-plugins
+  (package
+    (name "alsa-plugins")
+    (version "1.1.1")
+    (source (origin
+             (method url-fetch)
+             (uri (string-append "ftp://ftp.alsa-project.org/pub/plugins/"
+                                 name "-" version ".tar.bz2"))
+             (sha256
+              (base32
+               "1w81z5jlwqhd1l2m7qrq69lc4k9dnrg1wn52jsl2hrf3hbhd394f"))))
+    (build-system gnu-build-system)
+    ;; TODO: Split libavcodec and speex if possible. It looks like they can not
+    ;; be split, there are references to both in files.
+    ;; TODO: Remove OSS related plugins, they add support to run native
+    ;; ALSA applications on OSS however we do not offer OSS and OSS is
+    ;; obsolete.
+    (outputs '("out" "pulseaudio"))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'install 'split
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             ;; Distribute the binaries to the various outputs.
+             (let* ((out (assoc-ref outputs "out"))
+                    (pua (assoc-ref outputs "pulseaudio"))
+                    (pualib (string-append pua "/lib/alsa-lib"))
+                    (puaconf (string-append pua "/share/alsa/alsa.conf.d")))
+               (mkdir-p puaconf)
+               (mkdir-p pualib)
+               (chdir (string-append out "/share"))
+               (for-each (lambda (file)
+                           (rename-file file (string-append puaconf "/" (basename file))))
+                         (find-files out "\\.(conf|example)"))
+               (for-each (lambda (file)
+                           (rename-file file (string-append pualib "/" (basename file))))
+                         (find-files out ".*pulse\\.(la|so)"))
+               (chdir "..")
+               ;; We have moved the files to output pulsaudio, the
+               ;; directory is now empty.
+               (delete-file-recursively (string-append out "/share"))
+               #t))))))
+    (inputs
+     `(("alsa-lib" ,alsa-lib)
+       ("speex" ,speex) ; libspeexdsp resampling plugin
+       ("libsamplerate" ,libsamplerate) ; libsamplerate resampling plugin
+       ("ffmpeg" ,ffmpeg) ; libavcodec resampling plugin, a52 plugin
+       ("pulseaudio" ,pulseaudio))) ; PulseAudio plugin
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (home-page "http://www.alsa-project.org/")
+    (synopsis "Plugins for the Advanced Linux Sound Architecture (ALSA)")
+    (description
+     "The Advanced Linux Sound Architecture (ALSA) provides audio and
+MIDI functionality to the Linux-based operating system.  This package enhances ALSA
+by providing additional plugins which include: upmixing, downmixing, jackd and
+pulseaudio support for native alsa applications, format conversion (s16 to a52), and
+external rate conversion.")
+    (license (list license:gpl2+
+                   ;; `rate/rate_samplerate.c': LGPL v2.1 or later.
+                   license:lgpl2.1+))))
+
 (define-public iptables
   (package
     (name "iptables")
@@ -1589,7 +1667,7 @@ to use Linux' inotify mechanism, which allows file accesses to be monitored.")
 (define-public kmod
   (package
     (name "kmod")
-    (version "22")
+    (version "23")
     (source (origin
               (method url-fetch)
               (uri
@@ -1597,7 +1675,7 @@ to use Linux' inotify mechanism, which allows file accesses to be monitored.")
                               "kmod-" version ".tar.xz"))
               (sha256
                (base32
-                "10lzfkmnpq6a43a3gkx7x633njh216w0bjwz31rv8a1jlgg1sfxs"))
+                "0mc12sx06p8il1ym3hdmgxxb37apn9yv7xij26gddjdfkx8xa0yk"))
               (patches (search-patches "kmod-module-directory.patch"))))
     (build-system gnu-build-system)
     (native-inputs
@@ -1662,6 +1740,21 @@ device nodes from /dev/, handles hotplug events and loads drivers at boot
 time.")
     (license license:gpl2+)))
 
+(define-public eudev-with-hwdb
+  ;; TODO: Merge with 'eudev'.
+  (package
+    (inherit eudev)
+    (name "eudev-with-hwdb")
+    (arguments
+     '(#:phases (modify-phases %standard-phases
+                  (add-after 'install 'build-hwdb
+                    (lambda* (#:key outputs #:allow-other-keys)
+                      ;; Build OUT/etc/udev/hwdb.bin.  This allows 'lsusb' and
+                      ;; similar tools to display product names.
+                      (let ((out (assoc-ref outputs "out")))
+                        (zero? (system* (string-append out "/bin/udevadm")
+                                        "hwdb" "--update"))))))))))
+
 (define-public lvm2
   (package
     (name "lvm2")
@@ -1866,7 +1959,7 @@ compliance.")
 (define-public wireless-regdb
   (package
     (name "wireless-regdb")
-    (version "2016.05.02")
+    (version "2016.06.10")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1874,7 +1967,7 @@ compliance.")
                     "wireless-regdb-" version ".tar.xz"))
               (sha256
                (base32
-                "07n6gcwfbddz3awbdflv3dhxjszsqq2lrdwih0a0ahcliac4qry9"))
+                "1dxqy7a7zpzya30ff00s8k1qgrlndrwys99gc0r8yg0vab1z3vfg"))
 
               ;; We're building 'regulatory.bin' by ourselves.
               (snippet '(delete-file "regulatory.bin"))))
@@ -2147,7 +2240,7 @@ thanks to the use of namespaces.")
                             "CC=gcc"))
        #:phases (alist-delete 'configure %standard-phases)
        #:tests? #f))  ; no test suite
-    (home-page "http://sourceforge.net/projects/hdparm/")
+    (home-page "https://sourceforge.net/projects/hdparm/")
     (synopsis "Tune hard disk parameters for high performance")
     (description
      "Get/set device parameters for Linux SATA/IDE drives.  It's primary use
@@ -2213,7 +2306,7 @@ about ACPI devices.")
                (base32
                 "1vl7c6vc724v4jwki17czgj6lnrknnj1a6llm8gkl32i2gnam5j3"))))
     (build-system gnu-build-system)
-    (home-page "http://sourceforge.net/projects/acpid2/")
+    (home-page "https://sourceforge.net/projects/acpid2/")
     (synopsis "Daemon for delivering ACPI events to user-space programs")
     (description
      "acpid is designed to notify user-space programs of Advanced
@@ -2302,7 +2395,7 @@ capabilities of the Linux kernel.")
 (define-public libraw1394
   (package
     (name "libraw1394")
-    (version "2.1.0")
+    (version "2.1.2")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2310,7 +2403,7 @@ capabilities of the Linux kernel.")
                     name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0kwnf4ha45c04mhc4yla672aqmvqqihxix1gvblns5cd2pc2cc8b"))))
+                "0pm5b415j1qdzyw38wdv8h7ff4yx20831z1727mpsb6jc6bwdk03"))))
     (build-system gnu-build-system)
     (home-page "https://ieee1394.wiki.kernel.org/index.php/Main_Page")
     (synopsis "Interface library for the Linux IEEE1394 drivers")
@@ -2338,7 +2431,7 @@ protocol in question.")
      `(("pkg-config" ,pkg-config)))
     (propagated-inputs
      `(("libraw1394" ,libraw1394))) ; required by libavc1394.pc
-    (home-page "http://sourceforge.net/projects/libavc1394/")
+    (home-page "https://sourceforge.net/projects/libavc1394/")
     (synopsis "AV/C protocol library for IEEE 1394")
     (description
      "Libavc1394 is a programming interface to the AV/C specification from
@@ -2630,7 +2723,7 @@ and copy/paste text in the console and in xterm.")
 (define-public btrfs-progs
   (package
     (name "btrfs-progs")
-    (version "4.8.5")
+    (version "4.9")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://kernel.org/linux/kernel/"
@@ -2638,7 +2731,7 @@ and copy/paste text in the console and in xterm.")
                                   "btrfs-progs-v" version ".tar.xz"))
               (sha256
                (base32
-                "1vq83a8sz8dnshbyaghacqvcwv2n1kh53yjv87rxx9dc4b0b2iyj"))))
+                "18y88avadn4wb3xmczd6pfcjr7ik62dw4phk6fmkms2j8vmvl9z2"))))
     (build-system gnu-build-system)
     (outputs '("out"
                "static"))      ; static versions of binaries in "out" (~16MiB!)
@@ -2665,11 +2758,11 @@ and copy/paste text in the console and in xterm.")
     (native-inputs `(("pkg-config" ,pkg-config)
                      ("asciidoc" ,asciidoc)
                      ("xmlto" ,xmlto)
-                     ;; For building documentation
+                     ;; For building documentation.
                      ("libxml2" ,libxml2)
                      ("docbook-xml" ,docbook-xml)
                      ("docbook-xsl" ,docbook-xsl)
-                     ;; For tests
+                     ;; For tests.
                      ("which" ,which)))
     (home-page "https://btrfs.wiki.kernel.org/")
     (synopsis "Create and manage btrfs copy-on-write file systems")
@@ -2680,6 +2773,36 @@ easy administration.")
     ;; GPL2: Everything else.
     (license (list license:gpl2 license:gpl2+))))
 
+(define-public btrfs-progs/static
+  (package
+    (name "btrfs-progs-static")
+    (version (package-version btrfs-progs))
+    (source #f)
+    (build-system trivial-build-system)
+    (inputs
+     `(("btrfs-progs:static" ,btrfs-progs "static")))
+    (arguments
+     `(#:modules ((guix build utils))
+       #:builder
+       (begin
+         (use-modules (guix build utils)
+                      (ice-9 ftw)
+                      (srfi srfi-26))
+
+         (let* ((btrfs  (assoc-ref %build-inputs "btrfs-progs:static"))
+                (out    (assoc-ref %outputs "out"))
+                (source (string-append btrfs "/bin/btrfs.static"))
+                (target (string-append out "/bin/btrfs")))
+           (mkdir-p (dirname target))
+           (copy-file source target)
+           (remove-store-references target)
+           (chmod target #o555)))))
+    (home-page (package-home-page btrfs-progs))
+    (synopsis "Statically-linked btrfs command from btrfsprogs")
+    (description "This package provides statically-linked command of btrfs taken
+from the btrfsprogs package.  It is meant to be used in initrds.")
+    (license (package-license btrfs-progs))))
+
 (define-public freefall
   (package
     (name "freefall")
@@ -2819,7 +2942,7 @@ The package provides additional NTFS tools.")
     (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")
+    (home-page "https://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+))))
@@ -2993,14 +3116,14 @@ the default @code{nsswitch} and the experimental @code{umich_ldap}.")
 (define-public mcelog
   (package
     (name "mcelog")
-    (version "144")
+    (version "147")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://git.kernel.org/cgit/utils/cpu/mce/"
                                   "mcelog.git/snapshot/v" version ".tar.gz"))
               (sha256
                (base32
-                "03jyhsl0s59sfqykj5p6gkb03k4w1h9ay31yxym1dnzis5sq99pa"))
+                "10xxmqpd348ifbs7w8j0m53agp28r6imv237ha3kmhp632hmyf1d"))
               (file-name (string-append name "-" version ".tar.gz"))
               (modules '((guix build utils)))
               (snippet
@@ -3202,3 +3325,40 @@ Extensible Firmware Interface (EFI) Boot Manager.  This application can
 create and destroy boot entries, change the boot order, change the next
 running boot option, and more.")
     (license license:gpl2+)))
+
+(define-public sysstat
+  (package
+    (name "sysstat")
+    (version "11.4.2")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://perso.orange.fr/sebastien.godard/"
+                                  "sysstat-" version ".tar.xz"))
+              (sha256
+               (base32
+                "0f8gk1hma3bk198ziwrhh5jhisnbbgc1v4rxhny58n0zjzw0gm0z"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f ; No test suite.
+       ;; Without this flag, it tries to install the man pages with group 'root'
+       ;; and fails because /etc/passwd lacks an entry for the root user.
+       #:configure-flags
+       (list "--disable-file-attr"
+             (string-append "conf_dir=" (assoc-ref %outputs "out") "/etc"))
+       #:phases
+       (modify-phases %standard-phases
+         ;; The build process tries to create '/var/lib/sa', so we skip that
+         ;; instruction.
+         (add-after 'build 'skip-touching-var
+           (lambda _
+             (substitute* "Makefile"
+               (("mkdir -p \\$\\(DESTDIR\\)\\$\\(SA_DIR\\)")
+                ""))
+             #t)))))
+    (home-page "http://sebastien.godard.pagesperso-orange.fr/")
+    (synopsis "Performance monitoring tools for Linux")
+    (description "The sysstat utilities are a collection of performance
+monitoring tools for Linux.  These include @code{mpstat}, @code{iostat},
+@code{tapestat}, @code{cifsiostat}, @code{pidstat}, @code{sar}, @code{sadc},
+@code{sadf} and @code{sa}.")
+    (license license:gpl2+)))
diff --git a/gnu/packages/lisp.scm b/gnu/packages/lisp.scm
index ec0bdaaa53..e226443626 100644
--- a/gnu/packages/lisp.scm
+++ b/gnu/packages/lisp.scm
@@ -5,6 +5,7 @@
 ;;; Copyright © 2016 Federico Beffa <beffa@fbengineering.ch>
 ;;; Copyright © 2016 ng0 <ngillmann@runbox.com>
 ;;; Copyright © 2016 Andy Patterson <ajpatter@uwaterloo.ca>
+;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -207,24 +208,29 @@ supporting ASDF, Sockets, Gray streams, MOP, and other useful components.")
        ;; --build=<triplet>.
        #:build #f
        #:phases
-       (alist-cons-after
-        'unpack 'patch-sh-and-pwd
-        (lambda _
-          ;; The package is very messy with its references to "/bin/sh" and
-          ;; some other absolute paths to traditional tools.  These appear in
-          ;; many places where our automatic patching misses them.  Therefore
-          ;; we do the following, in this early (post-unpack) phase, to solve
-          ;; the problem from its root.
-          (substitute* (find-files "." "configure|Makefile")
-            (("/bin/sh") "sh"))
-          (substitute* '("src/clisp-link.in")
-            (("/bin/pwd") "pwd")))
-        (alist-cons-before
-         'build 'chdir-to-source
-         (lambda _
-           ;; We are supposed to call make under the src sub-directory.
-           (chdir "src"))
-         %standard-phases))
+       (modify-phases %standard-phases
+         (add-after 'unpack 'patch-sh-and-pwd
+           (lambda _
+             ;; The package is very messy with its references to "/bin/sh" and
+             ;; some other absolute paths to traditional tools.  These appear in
+             ;; many places where our automatic patching misses them.  Therefore
+             ;; we do the following, in this early (post-unpack) phase, to solve
+             ;; the problem from its root.
+             (substitute* (find-files "." "configure|Makefile")
+               (("/bin/sh") "sh"))
+             (substitute* '("src/clisp-link.in")
+               (("/bin/pwd") "pwd"))
+             #t))
+         (add-after 'unpack 'remove-timestamps
+           (lambda _
+             (substitute* "src/constobj.d"
+               (("__DATE__ __TIME__") "\"1\""))
+             #t))
+         (add-before 'build 'chdir-to-source
+           (lambda _
+             ;; We are supposed to call make under the src sub-directory.
+             (chdir "src")
+             #t)))
        ;; Makefiles seem to have race conditions.
        #:parallel-build? #f))
     (home-page "http://www.clisp.org/")
diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm
index 96679bf97b..04a2b39af9 100644
--- a/gnu/packages/llvm.scm
+++ b/gnu/packages/llvm.scm
@@ -1,7 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; 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 © 2015, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2016 Dennis Mungai <dmngaie@gmail.com>
 ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;;
@@ -60,7 +60,8 @@
      `(#:configure-flags '("-DCMAKE_SKIP_BUILD_RPATH=FALSE"
                            "-DCMAKE_BUILD_WITH_INSTALL_RPATH=FALSE"
                            "-DBUILD_SHARED_LIBS:BOOL=TRUE"
-                           "-DLLVM_ENABLE_FFI:BOOL=TRUE")
+                           "-DLLVM_ENABLE_FFI:BOOL=TRUE"
+                           "-DLLVM_INSTALL_UTILS=ON") ; Needed for rustc.
 
        ;; Don't use '-g' during the build, to save space.
        #:build-type "Release"
@@ -282,6 +283,7 @@ code analysis tools.")
 
 (define-public llvm-for-extempore
   (package (inherit llvm-3.7)
+    (name "llvm-for-extempore")
     (source
      (origin
        (inherit (package-source llvm-3.7))
diff --git a/gnu/packages/lynx.scm b/gnu/packages/lynx.scm
index 6e4ed6cd13..b212dca388 100644
--- a/gnu/packages/lynx.scm
+++ b/gnu/packages/lynx.scm
@@ -34,7 +34,7 @@
 (define-public lynx
   (package
     (name "lynx")
-    (version "2.8.9dev.9")
+    (version "2.8.9dev.11")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -42,7 +42,7 @@
                     "/lynx" version ".tar.bz2"))
               (sha256
                (base32
-                "1m72ga89hywm097kazcm8w6sqrfjnl83gh31pkbhk4zhzhfpzxgh"))))
+                "1cqm1i7d209brkrpzaqqf2x951ra3l67dw8x9yg10vz7rpr9441a"))))
     (build-system gnu-build-system)
     (native-inputs `(("pkg-config" ,pkg-config)
                      ("perl" ,perl)))
diff --git a/gnu/packages/mail.scm b/gnu/packages/mail.scm
index 4b8e07cd11..2060557514 100644
--- a/gnu/packages/mail.scm
+++ b/gnu/packages/mail.scm
@@ -103,53 +103,54 @@
 (define-public mailutils
   (package
     (name "mailutils")
-    (version "3.0")
+    (version "3.1.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "mirror://gnu/mailutils/mailutils-"
                                  version ".tar.bz2"))
              (sha256
               (base32
-               "0h7cx4cd3niycx7pl0p2358cx2smwm5sb3l9bpb8czkdl6v115c8"))))
+               "1dpylyg79avi7brpkcmzaq7bqqkz45flp0ws6f2c8b1gyz4hdnzm"))))
     (build-system gnu-build-system)
     (arguments
-     '(;; TODO: Add `--with-sql'.
-       #:phases (alist-cons-before
-                 'build 'pre-build
-                 (lambda _
-                   ;; Use the right file name for `cat'.
-                   (substitute* "testsuite/lib/mailutils.exp"
-                     (("/bin/cat")
-                      (which "cat")))
-
-                   ;; Tests try to invoke 'maidag' such that it looks up the
-                   ;; 'root' user, which does not exist in the build
-                   ;; environment.
-                   (substitute* "maidag/tests/testsuite"
-                     (("root <")         "nobody <")
-                     (("spool/root")     "spool/nobody")
-                     (("root@localhost") "nobody@localhost"))
-
-                   ;; The 'pipeact.at' tests generate a shell script; make
-                   ;; sure it uses the right shell.
-                   (substitute* '("sieve/tests/testsuite"
-                                  "mh/tests/testsuite")
-                     (("#! /bin/sh")
-                      (string-append "#!" (which "sh"))))
-
-                   (substitute* "mh/tests/testsuite"
-                     (("moreproc: /bin/cat")
-                      (string-append "moreproc: " (which "cat"))))
-
-                   ;; XXX: The comsatd tests rely on being able to open
-                   ;; /dev/tty, but that gives ENODEV in the build
-                   ;; environment.  Thus, ignore test failures here.
-                   (substitute* "comsat/tests/Makefile.in"
-                     (("\\$\\(SHELL\\) \\$\\(TESTSUITE\\)" all)
-                      (string-append "-" all)))
-
-                   #t)
-                 %standard-phases)
+     '(#:phases
+       (modify-phases %standard-phases
+         (add-before 'build 'pre-build
+           (lambda _
+             ;; Use the right file name for `cat'.
+             (substitute* "testsuite/lib/mailutils.exp"
+               (("/bin/cat")
+                (which "cat")))
+
+             ;; Tests try to invoke 'maidag' such that it looks up the
+             ;; 'root' user, which does not exist in the build
+             ;; environment.
+             (substitute* "maidag/tests/testsuite"
+               (("root <")         "nobody <")
+               (("spool/root")     "spool/nobody")
+               (("root@localhost") "nobody@localhost"))
+
+             ;; The 'pipeact.at' tests generate a shell script; make
+             ;; sure it uses the right shell.
+             (substitute* '("sieve/tests/testsuite"
+                            "mh/tests/testsuite")
+               (("#! /bin/sh")
+                (string-append "#!" (which "sh"))))
+
+             (substitute* "mh/tests/testsuite"
+               (("moreproc: /bin/cat")
+                (string-append "moreproc: " (which "cat"))))
+
+             ;; XXX: The comsatd tests rely on being able to open
+             ;; /dev/tty, but that gives ENODEV in the build
+             ;; environment.  Thus, ignore test failures here.
+             (substitute* "comsat/tests/Makefile.in"
+               (("\\$\\(SHELL\\) \\$\\(TESTSUITE\\)" all)
+                (string-append "-" all)))
+
+             #t)))
+       ;; TODO: Add `--with-sql'.
+       #:configure-flags '("--sysconfdir=/etc")
        #:parallel-tests? #f))
     (inputs
      `(("dejagnu" ,dejagnu)
@@ -158,15 +159,11 @@
        ("guile" ,guile-2.0)
        ("gnutls" ,gnutls)
        ("ncurses" ,ncurses)
-
-       ;; With Readline 6.3, examples/pop3client.c fails to build because it
-       ;; uses the now undefined 'CPPFunction' type.
-       ("readline" ,readline-6.2)
-
+       ("readline" ,readline)
        ("linux-pam" ,linux-pam)
        ("libltdl" ,libltdl)
        ("gdbm" ,gdbm)))
-    (home-page "http://www.gnu.org/software/mailutils/")
+    (home-page "https://www.gnu.org/software/mailutils/")
     (synopsis "Utilities and library for reading and serving mail")
     (description
      "GNU Mailutils is a collection of programs for managing, viewing and
@@ -214,14 +211,14 @@ aliasing facilities to work just as they would on normal mail.")
 (define-public mutt
   (package
     (name "mutt")
-    (version "1.7.1")
+    (version "1.7.2")
     (source (origin
              (method url-fetch)
              (uri (string-append "ftp://ftp.mutt.org/pub/mutt/mutt-"
                                  version ".tar.gz"))
              (sha256
               (base32
-               "1pyns0xw52s4yma1a93pdcl4dirs55q2m1hd7w1r11nlhf7giip9"))
+               "1yazrl82s9fxmamnlvwmsxhwrxnwv6kwakgfmawda8ndhwb50lqm"))
              (patches (search-patches "mutt-store-references.patch"))))
     (build-system gnu-build-system)
     (inputs
@@ -308,13 +305,14 @@ Extension (MIME).")
                 "1d56n2m9inm8gnzm88aa27xl2a7sp7aff3484vmflpqkinjqf0p1"))))
     (build-system gnu-build-system)
     (arguments
-     '(#:phases (alist-cons-before
-                 'check 'pre-check
-                 (lambda _
-                   (substitute* "src/tests/t.frame"
-                     (("GREP=/bin/grep")
-                      (string-append "GREP=" (which "grep") "\n"))))
-                 %standard-phases)))
+     '(#:phases
+       (modify-phases %standard-phases
+         (add-before 'check 'pre-check
+           (lambda _
+             (substitute* "src/tests/t.frame"
+               (("GREP=/bin/grep")
+                (string-append "GREP=" (which "grep") "\n")))
+             #t)))))
     (native-inputs `(("flex" ,flex)))
     (inputs `(("bdb" ,bdb)))
     (home-page "http://bogofilter.sourceforge.net/")
@@ -382,24 +380,20 @@ repository and Maildir/IMAP as LOCAL repository.")
 (define-public mu
   (package
     (name "mu")
-    (version "0.9.16")
+    (version "0.9.18")
     (source (origin
               (method url-fetch)
-              (uri (string-append "https://github.com/djcb/mu/archive/v"
+              (uri (string-append "https://github.com/djcb/mu/releases/"
+                                  "download/" version "/mu-"
                                   version ".tar.gz"))
-              (file-name (string-append "mu-" version ".tar.gz"))
               (sha256
                (base32
-                "0p7hqri1r1x6750x138cc29mh81kdav2dcim26y58s8an206h25g"))))
+                "02g82zvxfgn17wzy846bfxj0izjj7yklhwdnhwxy1y2kin4fqnb5"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)
        ("glib" ,glib "bin")             ; for gtester
-       ("autoconf" ,autoconf)
-       ("automake" ,automake)
-       ("emacs" ,emacs-minimal)
-       ("libtool" ,libtool)
-       ("texinfo" ,texinfo)))
+       ("emacs" ,emacs-minimal)))
     ;; TODO: Add webkit and gtk to build the mug GUI.
     (inputs
      `(("xapian" ,xapian)
@@ -415,18 +409,15 @@ repository and Maildir/IMAP as LOCAL repository.")
                            (guix build emacs-utils))
        #:phases
        (modify-phases %standard-phases
-         (add-after 'unpack 'patch-configure.ac
+         (add-after 'unpack 'patch-configure
            ;; By default, elisp code goes to "share/emacs/site-lisp/mu4e",
            ;; so our Emacs package can't find it.  Setting "--with-lispdir"
            ;; configure flag doesn't help because "mu4e" will be added to
            ;; the lispdir anyway, so we have to modify "configure.ac".
            (lambda _
-             (substitute* "configure.ac"
-               (("^ +lispdir=.*") ""))
+             (substitute* "configure"
+               (("^ +lispdir=\"\\$\\{lispdir\\}/mu4e/\".*") ""))
              #t))
-         (add-after 'patch-configure.ac 'autoreconf
-           (lambda _
-             (zero? (system* "autoreconf" "-vi"))))
          (add-before 'check 'check-tz-setup
            (lambda* (#:key inputs #:allow-other-keys)
              ;; For mu/test/test-mu-query.c
@@ -537,14 +528,14 @@ invoking @command{notifymuch} from the post-new hook.")
 (define-public notmuch
   (package
     (name "notmuch")
-    (version "0.23.3")
+    (version "0.23.5")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://notmuchmail.org/releases/notmuch-"
                                   version ".tar.gz"))
               (sha256
                (base32
-                "10hqjnl5aavf9clfmx3y832jyz58fplmc3f58pip9dq30b7sap8g"))))
+                "0ry2k9sdwd1vw8cf6svch8wk98523s07mwxvsf7b8kghqnrr89n6"))))
     (build-system gnu-build-system)
     (arguments
      '(#:make-flags (list "V=1") ; Verbose test output.
@@ -675,7 +666,7 @@ and search library.")
 (define-public getmail
   (package
     (name "getmail")
-    (version "4.49.0")
+    (version "4.52.0")
     (source
      (origin
        (method url-fetch)
@@ -683,7 +674,7 @@ and search library.")
                            name "-" version ".tar.gz"))
        (sha256
         (base32
-         "1m0yzxd05fklwbmjj1n2q4sx397c1j5qi9a0r5fv3h8pplz4lv0w"))))
+         "0pzplrlxwbxydvfw4kkwn60l40hk1h5sxawaa6pi0k75c220k4ni"))))
     (build-system python-build-system)
     (arguments
      `(#:tests? #f ; no tests
@@ -799,7 +790,7 @@ which can add many functionalities to the base client.")
 (define-public msmtp
   (package
     (name "msmtp")
-    (version "1.6.5")
+    (version "1.6.6")
     (source
      (origin
        (method url-fetch)
@@ -807,7 +798,7 @@ which can add many functionalities to the base client.")
                            "/msmtp-" version ".tar.xz"))
        (sha256
         (base32
-         "01jh9ba49bih8zsh40myw6qq1ll210q1vw0jg865vrn7jc3dd83n"))))
+         "0ppvww0sb09bnsrpqnvlrn8vx231r24xn2iiwpy020mxc8gxn5fs"))))
     (build-system gnu-build-system)
     (inputs
      `(("libidn" ,libidn)
@@ -845,7 +836,7 @@ delivery.")
 (define-public exim
   (package
     (name "exim")
-    (version "4.87")
+    (version "4.87.1")
     (source
      (origin
        (method url-fetch)
@@ -855,7 +846,7 @@ delivery.")
                                  version ".tar.bz2")))
        (sha256
         (base32
-         "1jbxn13shq90kpn0s73qpjnx5xm8jrpwhcwwgqw5s6sdzw6iwsbl"))))
+         "050m2gjzpc6vyik458h1j0vi8bxplkzjsyndkyd2y394i569kdyl"))))
     (build-system gnu-build-system)
     (inputs
      `(("bdb" ,bdb)
@@ -1260,7 +1251,7 @@ program's primary purpose.")
        ("libtool" ,libtool)))
     (inputs
      `(("libesmtp" ,libesmtp)))
-    (home-page "http://sourceforge.net/projects/esmtp/")
+    (home-page "https://sourceforge.net/projects/esmtp/")
     (synopsis "Relay-only mail transfer agent (MTA)")
     (description "Esmtp is a simple relay-only mail transfer agent built using
 libESMTP.  It sends e-mail via a remote SMTP server using credentials from the
@@ -1351,36 +1342,27 @@ maintained.")
 (define-public khard
   (package
     (name "khard")
-    (version "0.9.0")
+    (version "0.11.3")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri name version))
               (sha256
                (base32
-                "0y83rji4f270hbb41m4jpr0z3yzvpvbsl32mpg9d38hlydw8fk1s"))))
+                "1v66khq5w17xdbkpb00pf9xbl84dlzx4lq286fvzskb949b3y4yn"))))
     (build-system python-build-system)
     (arguments
-      `(#:python ,python-2 ; only python-2 is supported.
-        #:phases
+      `(#:phases
         (modify-phases %standard-phases
-          (add-before 'build 'disable-egg-compression
-            ;; Do not compress the egg.
-            (lambda _
-              (let ((port (open-file "setup.cfg" "a")))
-                (display "\n[easy_install]\nzip_ok = 0\n"
-                         port)
-                (close-port port)
-                #t)))
           (add-after 'install 'install-doc
             (lambda* (#:key outputs #:allow-other-keys)
               (let* ((out (assoc-ref outputs "out"))
                      (doc (string-append out "/share/doc/khard")))
                 (copy-recursively "misc/khard" doc)))))))
     (propagated-inputs
-     `(("python2-vobject" ,python2-vobject)
-       ("python2-pyyaml" ,python2-pyyaml)
-       ("python2-atomicwrites" ,python2-atomicwrites)
-       ("python2-configobj" ,python2-configobj)))
+     `(("python-vobject" ,python-vobject)
+       ("python-pyyaml" ,python-pyyaml)
+       ("python-atomicwrites" ,python-atomicwrites)
+       ("python-configobj" ,python-configobj)))
     (synopsis "Console address book using CardDAV")
     (description "Khard is an address book for the console.  It creates, reads,
 modifies and removes CardDAV address book entries at your local machine.  For
diff --git a/gnu/packages/make-bootstrap.scm b/gnu/packages/make-bootstrap.scm
index 44a7fd3a16..e5c614cee7 100644
--- a/gnu/packages/make-bootstrap.scm
+++ b/gnu/packages/make-bootstrap.scm
@@ -337,10 +337,6 @@ for `sh' in $PATH, and without nscd, and with static NSS modules."
   ;; GNU libc's essential shared libraries, dynamic linker, and headers,
   ;; with all references to store directories stripped.  As a result,
   ;; libc.so is unusable and need to be patched for proper relocation.
-  (define (hurd-triplet? triplet)
-    (and (string-suffix? "-gnu" triplet)
-         (not (string-contains triplet "linux"))))
-
   (let ((glibc (glibc-for-bootstrap)))
     (package (inherit glibc)
       (name "glibc-stripped")
diff --git a/gnu/packages/man.scm b/gnu/packages/man.scm
index 2d99438420..69c560c1b0 100644
--- a/gnu/packages/man.scm
+++ b/gnu/packages/man.scm
@@ -134,7 +134,7 @@ the traditional flat-text whatis databases.")
 (define-public man-pages
   (package
     (name "man-pages")
-    (version "4.08")
+    (version "4.09")
     (source (origin
               (method url-fetch)
               (uri
@@ -147,7 +147,7 @@ the traditional flat-text whatis databases.")
                     "man-pages-" version ".tar.xz")))
               (sha256
                (base32
-                "1d32ki8nkwd2xiln619jihqn7s15ydrg7386n4hxq530sys7svic"))))
+                "1740gq9sq28dp5a5sjn1ya7cvrv8mbky6knb7734v8k29a7a0x55"))))
     (build-system gnu-build-system)
     (arguments
      '(#:phases (alist-delete 'configure %standard-phases)
diff --git a/gnu/packages/maths.scm b/gnu/packages/maths.scm
index ce7eecfa7d..c1c7a24aa0 100644
--- a/gnu/packages/maths.scm
+++ b/gnu/packages/maths.scm
@@ -425,40 +425,35 @@ singular value problems.")
                                 "See LICENSE in the distribution."))))
 
 (define-public gnuplot
-  ;; Gnuplot version 5.0.4 was updated in-place, resulting in a hash mismatch.
-  ;; This can be removed at the next version update.
-  (let ((upstream-version "5.0.4")
-        (guix-revision "1"))
-    (package
-      (name "gnuplot")
-      (version (string-append upstream-version "-" guix-revision))
-      (source
-       (origin
-        (method url-fetch)
-        (uri (string-append "mirror://sourceforge/gnuplot/gnuplot/"
-                            upstream-version "/gnuplot-"
-                            upstream-version ".tar.gz"))
-        (sha256
-         (base32
-          "07n3w12dkcxjnhsvsliaqnkhajhi818v6q8mkpmpbplbf92vh70m"))))
-      (build-system gnu-build-system)
-      (inputs `(("readline" ,readline)
-                ("cairo" ,cairo)
-                ("pango" ,pango)
-                ("gd" ,gd)))
-      (native-inputs `(("pkg-config" ,pkg-config)
-                       ("texlive" ,texlive-minimal)))
-      (home-page "http://www.gnuplot.info")
-      (synopsis "Command-line driven graphing utility")
-      (description "Gnuplot is a portable command-line driven graphing
+  (package
+    (name "gnuplot")
+    (version "5.0.5")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://sourceforge/gnuplot/gnuplot/"
+                                  version "/gnuplot-"
+                                  version ".tar.gz"))
+       (sha256
+        (base32
+         "0lr065qdlgss8lmy31l7hkmnk9fp4lvqq9qgb1f1209f36zy1wr5"))))
+    (build-system gnu-build-system)
+    (inputs `(("readline" ,readline)
+              ("cairo" ,cairo)
+              ("pango" ,pango)
+              ("gd" ,gd)))
+    (native-inputs `(("pkg-config" ,pkg-config)
+                     ("texlive" ,texlive-minimal)))
+    (home-page "http://www.gnuplot.info")
+    (synopsis "Command-line driven graphing utility")
+    (description "Gnuplot is a portable command-line driven graphing
 utility.  It was originally created to allow scientists and students to
 visualize mathematical functions and data interactively, but has grown to
 support many non-interactive uses such as web scripting.  It is also used as a
 plotting engine by third-party applications like Octave.")
-      ;;  X11 Style with the additional restriction that derived works may only be
-      ;;  distributed as patches to the original.
-      (license (license:fsf-free
-                "http://gnuplot.cvs.sourceforge.net/gnuplot/gnuplot/Copyright")))))
+    ;;  X11 Style with the additional restriction that derived works may only be
+    ;;  distributed as patches to the original.
+    (license (license:fsf-free
+              "http://gnuplot.cvs.sourceforge.net/gnuplot/gnuplot/Copyright"))))
 
 (define-public gctp
   (package
@@ -489,14 +484,14 @@ computations.")
 (define-public hdf4
   (package
     (name "hdf4")
-    (version "4.2.11")
+    (version "4.2.12")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://support.hdfgroup.org/ftp/HDF/releases/HDF"
                            version "/src/hdf-" version ".tar.bz2"))
        (sha256
-        (base32 "16yr50j845zlfx20skmw3y75ww77akk9gg0affjqkg66ih5r03mv"))
+        (base32 "020jh563sjyxsgml8l809d2i1d4ms9shivwj3gbm7n0ilxbll8id"))
        (patches (search-patches "hdf4-architectures.patch"
                                 "hdf4-reproducibility.patch"
                                 "hdf4-shared-fortran.patch"))))
@@ -731,10 +726,12 @@ HDF5 file is encoded according to the HDF File Format Specification.")
        ("doxygen" ,doxygen)
        ("graphviz" ,graphviz)))
     (inputs
-     `(("hdf5" ,hdf5)
-       ("zlib" ,zlib)))
+     `(("hdf4" ,hdf4-alt)
+       ("hdf5" ,hdf5)
+       ("zlib" ,zlib)
+       ("libjpeg" ,libjpeg)))
     (arguments
-     `(#:configure-flags '("--enable-doxygen" "--enable-dot")
+     `(#:configure-flags '("--enable-doxygen" "--enable-dot" "--enable-hdf4")
        #:parallel-tests? #f))           ;various race conditions
     (home-page "http://www.unidata.ucar.edu/software/netcdf/")
     (synopsis "Library for scientific data")
@@ -1857,7 +1854,7 @@ to BMP, JPEG or PNG image formats.")
 (define-public maxima
   (package
     (name "maxima")
-    (version "5.38.1")
+    (version "5.39.0")
     (source
      (origin
        (method url-fetch)
@@ -1865,7 +1862,7 @@ to BMP, JPEG or PNG image formats.")
                            version "-source/" name "-" version ".tar.gz"))
        (sha256
         (base32
-         "1p6646rvq43hk09msyp0dk50cqpkh07mf4x0bc2fqisqmcv6b1hf"))
+         "1cvignn5y6qzrby6qb885yc8zdcdqdr1d50vcvc3gapw2f0gk3zm"))
        (patches (search-patches "maxima-defsystem-mkdir.patch"))))
     (build-system gnu-build-system)
     (inputs
@@ -1937,7 +1934,7 @@ point numbers.")
 (define-public wxmaxima
   (package
     (name "wxmaxima")
-    (version "16.04.2")
+    (version "16.12.0")
     (source
      (origin
        (method url-fetch)
@@ -1945,7 +1942,7 @@ point numbers.")
                            version "/" name "-" version ".tar.gz"))
        (sha256
         (base32
-         "1fpqzk1921isiqrpgpf433ldq41924qs9sy99fl1zn5661b2l73n"))))
+         "01kas9viqabw5id6crbhz8ahjimmv78gqzizs5hgnj9kngrgrm1h"))))
     (build-system gnu-build-system)
     (inputs
      `(("wxwidgets" ,wxwidgets)
@@ -1995,14 +1992,14 @@ full text searching.")
 (define-public armadillo
   (package
     (name "armadillo")
-    (version "7.500.0")
+    (version "7.600.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://sourceforge/arma/armadillo-"
                                   version ".tar.xz"))
               (sha256
                (base32
-                "1x98d32cgxbzbbma2ak6c37wnbpq13xxyxyd6jjvflv748mzi9ks"))))
+                "0bac9y46m61zxinj51l82w06v01ra9vw7a9j6rrwdjhznkkdb437"))))
     (build-system cmake-build-system)
     (arguments `(#:tests? #f)) ;no test target
     (inputs
@@ -2023,14 +2020,14 @@ associated functions (eg. contiguous and non-contiguous submatrix views).")
 
 (define-public armadillo-for-rcpparmadillo
   (package (inherit armadillo)
-    (version "7.500.0")
+    (version "7.600.1")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://sourceforge/arma/armadillo-"
                                   version ".tar.xz"))
               (sha256
                (base32
-                "1x98d32cgxbzbbma2ak6c37wnbpq13xxyxyd6jjvflv748mzi9ks"))))))
+                "1dxgfd2r9lbh24nszvqm2lag439s0srxaf1l86f6ww6waqm5r8zk"))))))
 
 (define-public muparser
   ;; When switching download sites, muparser re-issued a 2.2.5 release with a
diff --git a/gnu/packages/mc.scm b/gnu/packages/mc.scm
index 43dab8ff41..3cdc542157 100644
--- a/gnu/packages/mc.scm
+++ b/gnu/packages/mc.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016 ng0 <ng0@libertad.pw>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -53,7 +54,18 @@
               ("check" ,check)))
     (arguments
      `(#:configure-flags
-       '("--with-screen=ncurses" "--enable-aspell")))
+       '("--with-screen=ncurses" "--enable-aspell")
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'patch-source-shebangs 'fix-absolutism
+           (lambda _
+             ;; Modify files that contain absolute file names.
+             (substitute* "misc/mcedit.menu.in"
+               (("#! /bin/sh") (string-append "#!" (which "sh")))
+               (("/bin/bash") (which "bash")))
+             (substitute* "misc/ext.d/misc.sh.in"
+               (("/bin/cat") "cat"))
+             #t)))))
     (home-page "http://www.midnight-commander.org")
     (synopsis "Graphical file manager")
     (description
diff --git a/gnu/packages/messaging.scm b/gnu/packages/messaging.scm
index 8660915bb0..2be3b09695 100644
--- a/gnu/packages/messaging.scm
+++ b/gnu/packages/messaging.scm
@@ -7,7 +7,7 @@
 ;;; Copyright © 2015 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 ng0 <ng0@libertad.pw>
 ;;; Copyright © 2016 Andy Patterson <ajpatter@uwaterloo.ca>
-;;; Copyright © 2016 Clément Lassieur <clement@lassieur.org>
+;;; Copyright © 2016, 2017 Clément Lassieur <clement@lassieur.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -34,10 +34,12 @@
   #:use-module (guix build-system glib-or-gtk)
   #:use-module (guix build-system python)
   #:use-module (guix build-system perl)
+  #:use-module (guix build-system cmake)
   #:use-module (gnu packages)
   #:use-module (gnu packages aidc)
   #:use-module (gnu packages autotools)
   #:use-module (gnu packages avahi)
+  #:use-module (gnu packages base)
   #:use-module (gnu packages check)
   #:use-module (gnu packages crypto)
   #:use-module (gnu packages cyrus-sasl)
@@ -399,14 +401,14 @@ compromised.")
 (define-public znc
   (package
     (name "znc")
-    (version "1.6.3")
+    (version "1.6.4")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://znc.in/releases/archive/znc-"
                                   version ".tar.gz"))
               (sha256
                (base32
-                "09xqi5fs40x6nj9gq99bnw1a7saq96bvqxknxx0ilq7yfvg4c733"))))
+                "070d6b1i3jy66m4ci4ypxkg4pbwqbzbzss1y1ycgq2w62zmrf423"))))
     (build-system gnu-build-system)
     (arguments
      '(#:tests? #f ; tries to download GoogleTest with wget
@@ -534,6 +536,14 @@ end-to-end encryption support; XML console.")
              (substitute* "configure"
                (("exit 1") ""))
              #t))
+         (add-after 'unpack 'fix-makefile
+           (lambda _
+             (substitute* "Makefile"
+               ;; prosodyctl needs to read the configuration file.
+               (("^INSTALLEDCONFIG =.*") "INSTALLEDCONFIG = /etc/prosody\n")
+               ;; prosodyctl needs a place to put auto-generated certificates.
+               (("^INSTALLEDDATA =.*") "INSTALLEDDATA = /var/lib/prosody\n"))
+             #t))
          (add-after 'install 'wrap-programs
            (lambda* (#:key inputs outputs #:allow-other-keys)
              ;; Make sure all executables in "bin" find the required Lua
@@ -545,22 +555,30 @@ end-to-end encryption support; XML console.")
                                               (if (string-prefix? "lua" label)
                                                   directory #f)))
                                            inputs)))
-                    (path  (string-join
-                            (map (lambda (path)
-                                   (string-append path "/share/lua/5.1/?.lua;"
-                                                  path "/share/lua/5.1/?/?.lua"))
-                                 (cons out deps))
-                            ";"))
-                    (cpath (string-join
-                            (map (lambda (path)
-                                   (string-append path "/lib/lua/5.1/?.so;"
-                                                  path "/lib/lua/5.1/?/?.so"))
-                                 (cons out deps))
-                            ";")))
+                    (lua-path (string-join
+                               (map (lambda (path)
+                                      (string-append
+                                       path "/share/lua/5.1/?.lua;"
+                                       path "/share/lua/5.1/?/?.lua"))
+                                    (cons out deps))
+                               ";"))
+                    (lua-cpath (string-join
+                                (map (lambda (path)
+                                       (string-append
+                                        path "/lib/lua/5.1/?.so;"
+                                        path "/lib/lua/5.1/?/?.so"))
+                                     (cons out deps))
+                                ";"))
+                    (openssl (assoc-ref inputs "openssl"))
+                    (coreutils (assoc-ref inputs "coreutils"))
+                    (path (map (lambda (dir)
+                                 (string-append dir "/bin"))
+                               (list openssl coreutils))))
                (for-each (lambda (file)
                            (wrap-program file
-                             `("LUA_PATH"  ";" = (,path))
-                             `("LUA_CPATH" ";" = (,cpath))))
+                             `("LUA_PATH"  ";" = (,lua-path))
+                             `("LUA_CPATH" ";" = (,lua-cpath))
+                             `("PATH" ":" prefix ,path)))
                          (find-files bin ".*"))
                #t))))))
     (inputs
@@ -622,49 +640,98 @@ protocols.")
       (license license:gpl3+)
       (home-page "https://tox.chat"))))
 
+;; Some tox clients move to c-toxcore, which seems to be where all the
+;; recent development happens. It is run by the same developers as toxcore,
+;; forked into a group namespace.
+(define-public c-toxcore
+  (package
+    (name "c-toxcore")
+    (version "0.1.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/TokTok/c-toxcore/archive/v"
+                           version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "0dybpz44pi0zm8djppjna0r8yh5wvl3l885dv2f1wp5366bk59n3"))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("autoconf" ,autoconf)
+       ("automake" ,automake)
+       ("libtool" ,libtool)
+       ("check" ,check)
+       ("pkg-config" ,pkg-config)))
+    (inputs
+     `(("libsodium" ,libsodium)
+       ("opus" ,opus)
+       ("libvpx" ,libvpx)))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'autoconf
+           ;; The tarball source is not bootstrapped.
+           (lambda _
+             (zero? (system* "autoreconf" "-vfi")))))
+       #:tests? #f)) ; FIXME: Testsuite fails, needs internet connection.
+    (synopsis "Library for the Tox encrypted messenger protocol")
+    (description
+     "Official fork of the C library implementation of the Tox
+encrypted messenger protocol.")
+    (license license:gpl3+)
+    (home-page "https://tox.chat")))
+
 (define-public utox
   (package
    (name "utox")
-   (version "0.9.8")
+   (version "0.11.0")
    (source
     (origin
      (method url-fetch)
-     (uri (string-append "https://github.com/GrayHatter/uTox/archive/v"
+     (uri (string-append "https://github.com/uTox/uTox/archive/v"
                          version ".tar.gz"))
      (file-name (string-append name "-" version ".tar.gz"))
      (sha256
       (base32
-       "13hfqbwzcgvfbvf9yjm62aqsvxnpqppb50c88sys43m7022yqcsy"))))
-   (build-system gnu-build-system)
+       "15s4iwjk1s0kihjqn0f07c9618clbphpr827mds3xddkiwnjz37v"))))
+   (build-system cmake-build-system)
    (arguments
-    '(#:make-flags (list (string-append "PREFIX=" %output)
-                         "CC=gcc")
-      #:tests? #f ; No tests
+    '(#:tests? #f ; No test phase.
       #:phases
       (modify-phases %standard-phases
-        ;; No configure script
-        (delete 'configure))))
+        (add-after 'unpack 'fix-freetype-include
+          (lambda _
+            (substitute* "CMakeLists.txt"
+              (("/usr/include/freetype2")
+               (string-append (assoc-ref %build-inputs "freetype")
+                              "/include/freetype2")))))
+        (add-before 'install 'patch-cmake-find-utox
+          (lambda _
+            (substitute* "../build/cmake_install.cmake"
+              (("/uTox-0.11.0/utox")
+               "/build/utox")))))))
    (inputs
+    ;; TODO: Fix the file chooser dialog; which input does it need?
     `(("dbus" ,dbus)
       ("filteraudio" ,filteraudio)
       ("fontconfig" ,fontconfig)
       ("freetype" ,freetype)
       ("libsodium" ,libsodium)
-      ("libtoxcore" ,libtoxcore)
+      ("c-toxcore" ,c-toxcore)
       ("libvpx" ,libvpx)
       ("libx11" ,libx11)
       ("libxext" ,libxext)
       ("libxrender" ,libxrender)
       ("openal" ,openal)
       ("v4l-utils" ,v4l-utils)))
-   (native-inputs
-    `(("pkg-config" ,pkg-config)))
    (synopsis "Lightweight Tox client")
-   (description "A  lightweight Tox client.  Tox is a distributed and secure
+   (description
+    "Utox is a lightweight Tox client.  Tox is a distributed and secure
 instant messenger with audio and video chat capabilities.")
    (home-page "http://utox.org/")
    (license license:gpl3)))
- 
+
 (define-public qtox
   (package
     (name "qtox")
diff --git a/gnu/packages/monitoring.scm b/gnu/packages/monitoring.scm
index db2139b0aa..ac80a6bb9d 100644
--- a/gnu/packages/monitoring.scm
+++ b/gnu/packages/monitoring.scm
@@ -24,16 +24,17 @@
   #:use-module (guix build-system gnu)
   #:use-module (gnu packages base)
   #:use-module (gnu packages compression)
-  #:use-module (gnu packages perl)
-  #:use-module (gnu packages mail)
   #:use-module (gnu packages gd)
-  #:use-module (gnu packages image))
+  #:use-module (gnu packages image)
+  #:use-module (gnu packages mail)
+  #:use-module (gnu packages perl)
+  #:use-module (gnu packages zip))
 
 (define-public nagios
   (package
     (name "nagios")
-    (version "4.0.8")
-    ;; XXX: Newer versions such as 4.2.3 bundle a copy of AngularJS.
+    (version "4.2.4")
+    ;; XXX: Nagios 4.2.x and later bundle a copy of AngularJS.
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -41,7 +42,7 @@
                     version "/nagios-" version ".tar.gz"))
               (sha256
                (base32
-                "0jyad39wa318613awlnpczrrakvjcipz8qp1mdsig1cp1hjqs9lb"))
+                "0w0blbwiw0ps04b7gkyyk89qkgwsxh6gydhmggbm1kl3ar3mq1dh"))
               (modules '((guix build utils)))
               (snippet
                ;; Ensure reproducibility.
@@ -49,6 +50,8 @@
                   (("__DATE__") "\"1970-01-01\"")
                   (("__TIME__") "\"00:00:00\"")))))
     (build-system gnu-build-system)
+    (native-inputs
+     `(("unzip" ,unzip)))
     (inputs
      `(("zlib" ,zlib)
        ("libpng-apng" ,libpng)
diff --git a/gnu/packages/moreutils.scm b/gnu/packages/moreutils.scm
index 79ab9bbc9a..965876b971 100644
--- a/gnu/packages/moreutils.scm
+++ b/gnu/packages/moreutils.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -29,43 +30,42 @@
 (define-public moreutils
   (package
     (name "moreutils")
-    (version "0.58")
-    (source (origin
-              (method url-fetch)
-              (uri (list
-                     (string-append
-                       "mirror://debian/pool/main/m/moreutils/moreutils_"
-                       version ".orig.tar.gz")
-                     ;; The main Debian mirrors only hold the current packages
-                     (string-append
-                       "http://snapshot.debian.org/archive/debian/20160304T165744Z"
-                       "/pool/main/m/moreutils/moreutils_0.58.orig.tar.gz")))
-              (sha256
-               (base32
-                "02n00vqp6jxbxr5v3rdjxmzp6kxxjdkjgcclam6wrw8qamsbljww"))))
+    (version "0.59")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (list
+             (string-append
+              "mirror://debian/pool/main/m/moreutils/moreutils_"
+              version ".orig.tar.gz")
+             ;; The main Debian mirrors only hold the current packages.
+             (string-append
+              "http://snapshot.debian.org/archive/debian/20161223T212806Z"
+              "/pool/main/m/moreutils/moreutils_0.59.orig.tar.gz")))
+       (sha256
+        (base32
+         "1d6ik3j4lwp90vb93p7yv60k6vk2chz448d1z9xrmxvv371i33m4"))))
     (build-system gnu-build-system)
-    (inputs `(("perl" ,perl)
-              ("libxml2" ,libxml2)
-              ("libxslt" ,libxslt)
-              ("docbook-xml" ,docbook-xml-4.4)
-              ("docbook-xsl" ,docbook-xsl)))
+    ;; For building the manual pages.
+    (native-inputs
+     `(("docbook-xml" ,docbook-xml-4.4)
+       ("docbook-xsl" ,docbook-xsl)
+       ("libxml2" ,libxml2)
+       ("libxslt" ,libxslt)))
+    (inputs
+     `(("perl" ,perl)))
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         (replace 'configure
-           (lambda* (#:key inputs #:allow-other-keys)
-             (use-modules (srfi srfi-1))
-             (substitute* "Makefile"
-               (("/usr/share/xml/.*/docbook.xsl")
-                (let* ((docbook-xsl (assoc-ref inputs "docbook-xsl"))
-                       (files (find-files docbook-xsl "^docbook\\.xsl$")))
-                  (find (lambda (file)
-                          (string-suffix? "/manpages/docbook.xsl" file))
-                        files)))))))
+         (delete 'configure))           ; no configure script
        #:make-flags
        (list (string-append "PREFIX=" (assoc-ref %outputs "out"))
+             (string-append "DOCBOOKXSL="
+                            (assoc-ref %build-inputs "docbook-xsl") "/xml/xsl/"
+                            ,(package-name docbook-xsl) "-"
+                            ,(package-version docbook-xsl))
              "CC=gcc")))
-    (home-page "http://joeyh.name/code/moreutils/")
+    (home-page "https://joeyh.name/code/moreutils/")
     (synopsis "Miscellaneous general-purpose command-line tools")
     (description
      "Moreutils is a collection of general-purpose command-line tools to
diff --git a/gnu/packages/mp3.scm b/gnu/packages/mp3.scm
index 057c3d72df..e60bd5c5c1 100644
--- a/gnu/packages/mp3.scm
+++ b/gnu/packages/mp3.scm
@@ -392,7 +392,7 @@ Ogg, MP3, or FLAC formats.  Its goal is to be easy to use, requiring only
 a few mouse clicks to convert an entire album.  It supports CDDB lookups
 for album and track information.")
    (license license:gpl2)
-   (home-page "http://sourceforge.net/projects/ripperx/")))
+   (home-page "https://sourceforge.net/projects/ripperx/")))
 
 (define-public libmpcdec
   (package
@@ -458,7 +458,7 @@ compression format (.mpc files).")
 (define-public eyed3
   (package
     (name "eyed3")
-    (version "0.7.9")
+    (version "0.7.10")
     (source (origin
              (method url-fetch)
              (uri (string-append
@@ -466,7 +466,7 @@ compression format (.mpc files).")
                   version ".tar.gz"))
              (sha256
               (base32
-               "08mzhqg3k63d244cgwd0y1xrb8x9m6b99ykyskpnwyxl4wxrgrzp"))))
+               "0wjicszs64ksj2y5jbk09yjd08znc1qnarlq8ssmx13f2d4x59wq"))))
     (build-system python-build-system)
     (arguments
      `(#:python ,python-2))
diff --git a/gnu/packages/mpd.scm b/gnu/packages/mpd.scm
index 7b77c11835..5231c3f7f7 100644
--- a/gnu/packages/mpd.scm
+++ b/gnu/packages/mpd.scm
@@ -74,7 +74,7 @@ interfacing MPD in the C, C++ & Objective C languages.")
 (define-public mpd
   (package
     (name "mpd")
-    (version "0.19.19")
+    (version "0.19.21")
     (source (origin
               (method url-fetch)
               (uri
@@ -83,8 +83,19 @@ interfacing MPD in the C, C++ & Objective C languages.")
                               "/mpd-" version ".tar.xz"))
               (sha256
                (base32
-                "07af1m2lgblyiq0gcs26zv8n22wrhrpmf49xsm338h1n87d6r1dw"))))
+                "0c0p61p3jfh89pnqwd9nrw55krfvvnzhkpdq53g6njvg0aybh1c3"))))
     (build-system gnu-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'install 'install-service-files
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (systemd (string-append out "/etc/systemd/system"))
+                    (systemd-user (string-append out "/etc/systemd/user")))
+               (install-file "systemd/system/mpd.service" systemd)
+               (install-file "systemd/user/mpd.service" systemd-user)
+               #t))))))
     (inputs `(("ao" ,ao)
               ("alsa-lib" ,alsa-lib)
               ("avahi" ,avahi)
diff --git a/gnu/packages/mtools.scm b/gnu/packages/mtools.scm
index 947c606853..34bcb5d803 100644
--- a/gnu/packages/mtools.scm
+++ b/gnu/packages/mtools.scm
@@ -21,8 +21,7 @@
   #:use-module (guix licenses)
   #:use-module (guix packages)
   #:use-module (guix download)
-  #:use-module (guix build-system gnu)
-  #:use-module (gnu packages python))
+  #:use-module (guix build-system gnu))
 
 (define-public mtools
   (package
diff --git a/gnu/packages/music.scm b/gnu/packages/music.scm
index 8b1644ca4c..f34abbce77 100644
--- a/gnu/packages/music.scm
+++ b/gnu/packages/music.scm
@@ -1623,7 +1623,7 @@ capabilities, custom envelopes, effects, etc.")
 (define-public yoshimi
   (package
     (name "yoshimi")
-    (version "1.4.1")
+    (version "1.5.0")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://sourceforge/yoshimi/"
@@ -1631,7 +1631,7 @@ capabilities, custom envelopes, effects, etc.")
                                   "/yoshimi-" version ".tar.bz2"))
               (sha256
                (base32
-                "133sx42wb66g803pcrgdwph40wh94knvab3yfqkgm0001jv4v14y"))))
+                "10s1i18xlmvqfrnr0zn2mj2b28i7p62dlqzzzkmpaapqj1gsgpz5"))))
     (build-system cmake-build-system)
     (arguments
      `(#:tests? #f ; there are no tests
@@ -1889,8 +1889,8 @@ analogue-like user interface.")
                #t)))))
       (inputs
        `(("lilv" ,lilv)
-         ("fftw" ,fftw-with-threads)
-         ("fftwf" ,fftwf-with-threads)
+         ("fftw" ,fftw)
+         ("fftwf" ,fftwf)
          ("lv2" ,lv2)
          ("jack" ,jack-1)
          ("readline" ,readline)))
@@ -1941,13 +1941,13 @@ event-based scripts for scrobbling, notifications, etc.")
 (define-public python-mutagen
   (package
     (name "python-mutagen")
-    (version "1.35.1")
+    (version "1.36")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "mutagen" version))
               (sha256
                (base32
-                "0klk68c1n3285vvm2xzk8ii7mlqp1dxii04askan0gi1wlpagka9"))))
+                "1kabb9b81hgvpd3wcznww549vss12b1xlvpnxg1r6n4c7gikgvnp"))))
     (build-system python-build-system)
     (native-inputs
      `(("python-pytest" ,python-pytest)))
@@ -2058,48 +2058,42 @@ websites such as Libre.fm.")
 (define-public beets
   (package
     (name "beets")
-    (version "1.4.1")
+    (version "1.4.3")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "beets" version))
               (sha256
                (base32
-                "14yn88xrcinpdg3ic285ar0wmwldzyjfd3ll6clmp3z3r4iqffip"))))
+                "0r743a2pv1iyw50jsdl01v2ml3pdkhdp920a5d1wsacak48vwgxr"))))
     (build-system python-build-system)
     (arguments
-     `(;; Python 3 support is still "alpha", and the upstream maintainers ask
-       ;; packagers not to use it yet:
-       ;; https://github.com/beetbox/beets/releases/tag/v1.4.1
-       ;; TODO Check this again for the next release.
-       #:python ,python-2
-       #:phases
+     `(#:phases
        (modify-phases %standard-phases
          (add-after 'unpack 'set-HOME
            (lambda _ (setenv "HOME" (string-append (getcwd) "/tmp"))))
          (replace 'check
            (lambda _ (zero? (system* "nosetests" "-v")))))))
     (native-inputs
-     `(("python2-beautifulsoup4" ,python2-beautifulsoup4)
-       ("python2-flask" ,python2-flask)
-       ("python2-mock" ,python2-mock)
-       ("python2-mpd2" ,python2-mpd2)
-       ("python2-nose" ,python2-nose)
-       ("python2-pathlib" ,python2-pathlib)
-       ("python2-pyxdg" ,python2-pyxdg)
-       ("python2-pyechonest" ,python2-pyechonest)
-       ("python2-pylast" ,python2-pylast)
-       ("python2-rarfile" ,python2-rarfile)
-       ("python2-responses" ,python2-responses)))
+     `(("python-beautifulsoup4" ,python-beautifulsoup4)
+       ("python-flask" ,python-flask)
+       ("python-mock" ,python-mock)
+       ("python-mpd2" ,python-mpd2)
+       ("python-nose" ,python-nose)
+       ("python-pathlib" ,python-pathlib)
+       ("python-pyxdg" ,python-pyxdg)
+       ("python-pylast" ,python-pylast)
+       ("python-rarfile" ,python-rarfile)
+       ("python-responses" ,python-responses)))
     ;; TODO: Install optional plugins and dependencies.
     (inputs
-     `(("python2-discogs-client" ,python2-discogs-client)
-       ("python2-enum34" ,python2-enum34)
-       ("python2-jellyfish" ,python2-jellyfish)
-       ("python2-munkres" ,python2-munkres)
-       ("python2-musicbrainzngs" ,python2-musicbrainzngs)
-       ("python2-mutagen" ,python2-mutagen)
-       ("python2-pyyaml" ,python2-pyyaml)
-       ("python2-unidecode" ,python2-unidecode)))
+     `(("python-discogs-client" ,python-discogs-client)
+       ("python-enum34" ,python-enum34)
+       ("python-jellyfish" ,python-jellyfish)
+       ("python-munkres" ,python-munkres)
+       ("python-musicbrainzngs" ,python-musicbrainzngs)
+       ("python-mutagen" ,python-mutagen)
+       ("python-pyyaml" ,python-pyyaml)
+       ("python-unidecode" ,python-unidecode)))
     (home-page "http://beets.io")
     (synopsis "Music organizer")
     (description "The purpose of beets is to get your music collection right
@@ -2187,7 +2181,7 @@ with a number of bugfixes and changes to improve IT playback.")
 (define-public moc
   (package
     (name "moc")
-    (version "2.5.1")
+    (version "2.5.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://ftp.daper.net/pub/soft/"
@@ -2195,7 +2189,13 @@ with a number of bugfixes and changes to improve IT playback.")
                                   name "-" version ".tar.bz2"))
               (sha256
                (base32
-                "1wn4za08z64bhsgfhr9c0crfyvy8c3b6a337wx7gz19am5srqh8v"))))
+                "026v977kwb0wbmlmf6mnik328plxg8wykfx9ryvqhirac0aq39pk"))
+              (modules '((guix build utils)))
+              (snippet
+               ;; Remove use of __DATE__ and __TIME__ for reproducibility.
+               '(substitute* "main.c"
+                  (("printf \\(\"            Built : %s\", __DATE__\\);") "")
+                  (("printf \\(\" %s\", __TIME__\\);") "")))))
     (build-system gnu-build-system)
     (inputs
      `(("alsa-lib" ,alsa-lib)
diff --git a/gnu/packages/nano.scm b/gnu/packages/nano.scm
index 771fa522e2..5fafe78e2e 100644
--- a/gnu/packages/nano.scm
+++ b/gnu/packages/nano.scm
@@ -29,7 +29,7 @@
 (define-public nano
   (package
     (name "nano")
-    (version "2.7.2")
+    (version "2.7.4")
     (source
      (origin
       (method url-fetch)
@@ -37,7 +37,7 @@
                           version ".tar.gz"))
       (sha256
        (base32
-        "0g1mf28gjfjqqca5plgfcrnwywlrd91v7q8ld8kvfvqccgflbk49"))))
+        "135wzlv77p9za8679j2jpfkpvainvyagrhkdxngp71ynabgc5zr3"))))
     (build-system gnu-build-system)
     (inputs
      `(("gettext" ,gettext-minimal)
diff --git a/gnu/packages/networking.scm b/gnu/packages/networking.scm
index de7aaf0680..8258b39671 100644
--- a/gnu/packages/networking.scm
+++ b/gnu/packages/networking.scm
@@ -2,13 +2,13 @@
 ;;; Copyright © 2014 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2015, 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
-;;; Copyright © 2015 Stefan Reichör <stefan@xsteve.at>
+;;; Copyright © 2015, 2016 Stefan Reichör <stefan@xsteve.at>
 ;;; Copyright © 2016 Raimon Grau <raimonster@gmail.com>
 ;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2016 John Darrington <jmd@gnu.org>
 ;;; Copyright © 2016 Nicolas Goaziou <mail@nicolasgoaziou.fr>
 ;;; Copyright © 2016 Eric Bavier <bavier@member.fsf.org>
-;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is>
+;;; Copyright © 2016, 2017 ng0 <ng0@libertad.pw>
 ;;; Copyright © 2016 Arun Isaac <arunisaac@systemreboot.net>
 ;;; Copyright © 2016 Benz Schenk <benz.schenk@uzh.ch>
 ;;;
@@ -34,6 +34,7 @@
   #:use-module (guix download)
   #:use-module (guix build-system glib-or-gtk)
   #:use-module (guix build-system gnu)
+  #:use-module (guix build-system python)
   #:use-module (gnu packages)
   #:use-module (gnu packages admin)
   #:use-module (gnu packages adns)
@@ -43,6 +44,7 @@
   #:use-module (gnu packages check)
   #:use-module (gnu packages code)
   #:use-module (gnu packages compression)
+  #:use-module (gnu packages curl)
   #:use-module (gnu packages databases)
   #:use-module (gnu packages flex)
   #:use-module (gnu packages gettext)
@@ -301,14 +303,14 @@ receiving NDP messages.")
 (define-public ethtool
   (package
     (name "ethtool")
-    (version "4.0")
+    (version "4.8")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://kernel.org/software/network/"
                                   name "/" name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1zzcwn6pk8qfasalqkxg8vrhacksfa50xsq4xifw7yfjqyn8fj4h"))))
+                "0hsaxcka0ks76k23sb65c46i53hjm465sgxyn3m3301diqlgwga0"))))
     (build-system gnu-build-system)
     (home-page "https://www.kernel.org/pub/software/network/ethtool/")
     (synopsis "Display or change Ethernet device settings")
@@ -428,7 +430,7 @@ and up to 1 Mbit/s downstream.")
 (define-public whois
   (package
     (name "whois")
-    (version "5.2.13")
+    (version "5.2.14")
     (source
      (origin
        (method url-fetch)
@@ -436,7 +438,7 @@ and up to 1 Mbit/s downstream.")
                            name "_" version ".tar.xz"))
        (sha256
         (base32
-         "0r3bbxpwsxssa99d8dcjnp79mw1cjwqxgmqjm1537q277jwsk0yc"))))
+         "1lmh7168yby1ma8r1svgvmv9hbgjyniy9c64r6lby3zdmd0sy7d4"))))
     (build-system gnu-build-system)
     ;; TODO: unbundle mkpasswd binary + its po files.
     (arguments
@@ -467,7 +469,7 @@ which can be used to encrypt a password with @code{crypt(3)}.")
 (define-public wireshark
   (package
     (name "wireshark")
-    (version "2.2.2")
+    (version "2.2.3")
     (synopsis "Network traffic analyzer")
     (source
      (origin
@@ -476,7 +478,7 @@ which can be used to encrypt a password with @code{crypt(3)}.")
                            version ".tar.bz2"))
        (sha256
         (base32
-         "1csm035ayfzn1xzzsmzcjk2ixx39d70aykr4nh0a88chk9gfzb7r"))))
+         "0fsrvl6sp772g2q2j24h10h9lfda6q67x7wahjjm8849i2gciflp"))))
     (build-system glib-or-gtk-build-system)
     (inputs `(("bison" ,bison)
               ("c-ares" ,c-ares)
@@ -549,6 +551,38 @@ by firewalls or when you want to monitor the response time of the actual web
 application stack itself.")
     (license license:gpl2)))        ; with permission to link with OpenSSL
 
+(define-public httpstat
+  (package
+    (name "httpstat")
+    (version "1.2.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "httpstat" version))
+       (sha256
+        (base32
+         "1chw2nk56vaq87aba012a270k9na06hfx1pfbsrc3jfvlc2kb9hb"))))
+    (build-system python-build-system)
+    (inputs `(("curl" ,curl)))
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (add-before 'build 'fix-curl-path
+           (lambda* (#:key inputs #:allow-other-keys)
+             (substitute* "httpstat.py"
+               (("ENV_CURL_BIN.get\\('curl'\\)")
+                (string-append "ENV_CURL_BIN.get('"
+                               (assoc-ref inputs "curl")
+                               "/bin/curl')"))))))))
+    (home-page "https://github.com/reorx/httpstat")
+    (synopsis "Visualize curl statistics")
+    (description
+     "@command{httpstat} is a tool to visualize statistics from the
+@command{curl} HTTP client.  It acts as a wrapper for @command{curl} and
+prints timing information for each step of the HTTP request (DNS lookup,
+TCP connection, TLS handshake and so on) in the terminal.")
+    (license license:expat)))
+
 (define-public bwm-ng
   (package
     (name "bwm-ng")
diff --git a/gnu/packages/nim.scm b/gnu/packages/nim.scm
new file mode 100644
index 0000000000..c249e2be93
--- /dev/null
+++ b/gnu/packages/nim.scm
@@ -0,0 +1,59 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2017 José Miguel Sánchez García <jmi2k@openmailbox.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 nim)
+  #:use-module (guix build-system gnu)
+  #:use-module (guix download)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix packages))
+
+(define-public nim
+  (package
+    (name "nim")
+    (version "0.16.0")
+    (source
+     (origin
+      (method url-fetch)
+      (uri (string-append "http://nim-lang.org/download/"
+                          name "-" version ".tar.xz"))
+      (sha256
+       (base32
+        "0rsibhkc5n548bn9yyb9ycrdgaph5kq84sfxc9gabjs7pqirh6cy"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f ; No tests.
+       #:phases
+         (modify-phases %standard-phases
+           (delete 'configure)
+           (add-after 'unpack 'patch-installer
+             (lambda* (#:key outputs #:allow-other-keys)
+               (let ((out (assoc-ref outputs "out")))
+                 (substitute* "install.sh"
+                   (("1/nim") "1"))
+                 #t)))
+           (replace 'install
+             (lambda* (#:key outputs #:allow-other-keys)
+               (let ((out (assoc-ref outputs "out")))
+                 (zero? (system* "./install.sh" out))))))))
+    (home-page "http://nim-lang.org")
+    (synopsis "Statically-typed, imperative programming language")
+    (description "Nim (formerly known as Nimrod) is a statically-typed,
+imperative programming language that tries to give the programmer ultimate power
+without compromises on runtime efficiency.  This means it focuses on compile-time
+mechanisms in all their various forms.")
+    (license license:expat)))
diff --git a/gnu/packages/ocaml.scm b/gnu/packages/ocaml.scm
index 61d51074e7..93020f1c06 100644
--- a/gnu/packages/ocaml.scm
+++ b/gnu/packages/ocaml.scm
@@ -6,6 +6,7 @@
 ;;; Copyright © 2016 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016, 2017 Julien Lepiller <julien@lepiller.eu>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -23,31 +24,43 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu packages ocaml)
-  #:use-module ((guix licenses) #:hide (zlib))
-  #:use-module (guix packages)
-  #:use-module (guix download)
-  #:use-module (guix svn-download)
-  #:use-module (guix utils)
-  #:use-module (guix build-system gnu)
   #:use-module (gnu packages)
-  #:use-module (gnu packages gcc)
-  #:use-module (gnu packages gnome)
-  #:use-module (gnu packages gtk)
+  #:use-module (gnu packages autotools)
   #:use-module (gnu packages base)
-  #:use-module (gnu packages emacs)
-  #:use-module (gnu packages texinfo)
-  #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages compression)
-  #:use-module (gnu packages xorg)
-  #:use-module (gnu packages tex)
+  #:use-module (gnu packages curl)
+  #:use-module (gnu packages emacs)
+  #:use-module (gnu packages gcc)
   #:use-module (gnu packages ghostscript)
+  #:use-module (gnu packages gnome)
+  #:use-module (gnu packages gtk)
   #:use-module (gnu packages lynx)
-  #:use-module (gnu packages perl)
-  #:use-module (gnu packages python)
   #:use-module (gnu packages m4)
+  #:use-module (gnu packages multiprecision)
   #:use-module (gnu packages ncurses)
+  #:use-module (gnu packages perl)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages python)
+  #:use-module (gnu packages tex)
+  #:use-module (gnu packages texinfo)
+  #:use-module (gnu packages time)
   #:use-module (gnu packages version-control)
-  #:use-module (gnu packages curl))
+  #:use-module (gnu packages xml)
+  #:use-module (gnu packages xorg)
+  #:use-module (guix build-system gnu)
+  #:use-module (guix build-system ocaml)
+  #:use-module (guix download)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix packages)
+  #:use-module (guix svn-download)
+  #:use-module (guix utils))
+
+;; A shortcut for files from ocaml forge. Downloaded files are computed from
+;; their number, not their name.
+(define (ocaml-forge-uri name version file-number)
+  (string-append "https://forge.ocamlcore.org/frs/download.php/"
+                 (number->string file-number) "/" name "-" version
+                 ".tar.gz"))
 
 (define-public ocaml
   (package
@@ -62,12 +75,18 @@
               (sha256
                (base32
                 "1qwwvy8nzd87hk8rd9sm667nppakiapnx4ypdwcrlnav2dz6kil3"))
-              (patches (search-patches "ocaml-CVE-2015-8869.patch"))))
+              (patches
+               (search-patches
+                "ocaml-CVE-2015-8869.patch"
+                "ocaml-Add-a-.file-directive.patch"))))
     (build-system gnu-build-system)
     (native-search-paths
      (list (search-path-specification
             (variable "OCAMLPATH")
-            (files (list (string-append "lib/ocaml"))))))
+            (files (list "lib/ocaml" "lib/ocaml/site-lib")))
+           (search-path-specification
+            (variable "CAML_LD_LIBRARY_PATH")
+            (files (list "lib/ocaml/site-lib/stubslibs")))))
     (native-inputs
      `(("perl" ,perl)
        ("pkg-config" ,pkg-config)))
@@ -83,58 +102,59 @@
        #:phases
        (modify-phases %standard-phases
          (add-after 'unpack 'patch-/bin/sh-references
-                    (lambda* (#:key inputs #:allow-other-keys)
-                      (let* ((sh (string-append (assoc-ref inputs "bash")
-                                                "/bin/sh"))
-                             (quoted-sh (string-append "\"" sh "\"")))
-                        (with-fluids ((%default-port-encoding #f))
-                          (for-each (lambda (file)
-                                      (substitute* file
-                                        (("\"/bin/sh\"")
-                                         (begin
-                                           (format (current-error-port) "\
+           (lambda* (#:key inputs #:allow-other-keys)
+             (let* ((sh (string-append (assoc-ref inputs "bash")
+                                       "/bin/sh"))
+                    (quoted-sh (string-append "\"" sh "\"")))
+               (with-fluids ((%default-port-encoding #f))
+                 (for-each
+                  (lambda (file)
+                    (substitute* file
+                      (("\"/bin/sh\"")
+                       (begin
+                         (format (current-error-port) "\
 patch-/bin/sh-references: ~a: changing `\"/bin/sh\"' to `~a'~%"
-                                                   file quoted-sh)
-                                           quoted-sh))))
-                                    (find-files "." "\\.ml$"))
-                          #t))))
+                                 file quoted-sh)
+                         quoted-sh))))
+                  (find-files "." "\\.ml$"))
+                 #t))))
          (replace 'configure
-                  (lambda* (#:key outputs #:allow-other-keys)
-                    (let* ((out (assoc-ref outputs "out"))
-                           (mandir (string-append out "/share/man")))
-                      ;; Custom configure script doesn't recognize
-                      ;; --prefix=<PREFIX> syntax (with equals sign).
-                      (zero? (system* "./configure"
-                                      "--prefix" out
-                                      "--mandir" mandir)))))
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (mandir (string-append out "/share/man")))
+               ;; Custom configure script doesn't recognize
+               ;; --prefix=<PREFIX> syntax (with equals sign).
+               (zero? (system* "./configure"
+                               "--prefix" out
+                               "--mandir" mandir)))))
          (replace 'build
-                  (lambda _
-                    (zero? (system* "make" "-j" (number->string
-                                                 (parallel-job-count))
-                                    "world.opt"))))
+           (lambda _
+             (zero? (system* "make" "-j" (number->string
+                                          (parallel-job-count))
+                             "world.opt"))))
          (delete 'check)
          (add-after 'install 'check
-                    (lambda _
-                      (with-directory-excursion "testsuite"
-                        (zero? (system* "make" "all")))))
+           (lambda _
+             (with-directory-excursion "testsuite"
+               (zero? (system* "make" "all")))))
          (add-before 'check 'prepare-socket-test
-                     (lambda _
-                       (format (current-error-port)
-                               "Spawning local test web server on port 8080~%")
-                       (when (zero? (primitive-fork))
-                         (run-server (lambda (request request-body)
-                                       (values '((content-type . (text/plain)))
-                                               "Hello!"))
-                                     'http '(#:port 8080)))
-                       (let ((file "testsuite/tests/lib-threads/testsocket.ml"))
-                         (format (current-error-port)
-                                 "Patching ~a to use localhost port 8080~%"
-                                 file)
-                         (substitute* file
-                           (("caml.inria.fr") "localhost")
-                           (("80") "8080")
-                           (("HTTP1.0") "HTTP/1.0"))
-                         #t))))))
+           (lambda _
+             (format (current-error-port)
+                     "Spawning local test web server on port 8080~%")
+             (when (zero? (primitive-fork))
+               (run-server (lambda (request request-body)
+                             (values '((content-type . (text/plain)))
+                                     "Hello!"))
+                           'http '(#:port 8080)))
+             (let ((file "testsuite/tests/lib-threads/testsocket.ml"))
+               (format (current-error-port)
+                       "Patching ~a to use localhost port 8080~%"
+                       file)
+               (substitute* file
+                 (("caml.inria.fr") "localhost")
+                 (("80") "8080")
+                 (("HTTP1.0") "HTTP/1.0"))
+               #t))))))
     (home-page "https://ocaml.org/")
     (synopsis "The OCaml programming language")
     (description
@@ -145,7 +165,7 @@ functional, imperative and object-oriented styles of programming.")
     ;; The compiler is distributed under qpl1.0 with a change to choice of
     ;; law: the license is governed by the laws of France.  The library is
     ;; distributed under lgpl2.0.
-    (license (list qpl lgpl2.0))))
+    (license (list license:qpl license:lgpl2.0))))
 
 (define-public opam
   (package
@@ -210,7 +230,7 @@ simultaneous compiler installations, flexible package constraints, and a
 Git-friendly development workflow.")
 
     ;; The 'LICENSE' file waives some requirements compared to LGPLv3.
-    (license lgpl3)))
+    (license license:lgpl3)))
 
 (define-public camlp4
   (package
@@ -230,6 +250,10 @@ Git-friendly development workflow.")
     (inputs `(("ocaml" ,ocaml)))
     (arguments
      '(#:tests? #f                                ;no documented test target
+       ;; a race-condition will lead byte and native targets to  mkdir _build
+       ;; which  fails on the second attempt.
+       #:parallel-build? #f
+       #:make-flags '("all")
        #:phases (modify-phases %standard-phases
                   (replace
                    'configure
@@ -237,9 +261,19 @@ Git-friendly development workflow.")
                      ;; This is a home-made 'configure' script.
                      (let ((out (assoc-ref outputs "out")))
                        (zero? (system* "./configure"
-                                       (string-append "--libdir=" out "/lib")
+                                       (string-append "--libdir=" out
+                                                      "/lib/ocaml/site-lib")
                                        (string-append "--bindir=" out "/bin")
-                                       (string-append "--pkgdir=" out)))))))))
+                                       (string-append "--pkgdir=" out
+                                                      "/lib/ocaml/site-lib"))))))
+                  (add-after 'install 'install-meta
+                    (lambda* (#:key outputs #:allow-other-keys)
+                      (let ((out (assoc-ref outputs "out")))
+                        (substitute* "camlp4/META.in"
+                          (("directory = .*")
+                            (string-append "directory = \"" out
+                                           "/lib/ocaml/site-lib/camlp4\"\n")))
+                        (zero? (system* "make" "install-META"))))))))
     (home-page "https://github.com/ocaml/camlp4")
     (synopsis "Write parsers in OCaml")
     (description
@@ -252,7 +286,7 @@ syntax of OCaml.")
 
     ;; This is LGPLv2 with an exception that allows packages statically-linked
     ;; against the library to be released under any terms.
-    (license lgpl2.0)))
+    (license license:lgpl2.0)))
 
 (define-public camlp5
   (package
@@ -293,7 +327,7 @@ syntax of OCaml.")
 tools for syntax (Stream Parsers and Grammars) and the ability to modify the
 concrete syntax of the language (Quotations, Syntax Extensions).")
     ;; Most files are distributed under bsd-3, but ocaml_stuff/* is under qpl.
-    (license (list bsd-3 qpl))))
+    (license (list license:bsd-3 license:qpl))))
 
 (define-public hevea
   (package
@@ -324,7 +358,7 @@ concrete syntax of the language (Quotations, Syntax Extensions).")
     (description
      "HeVeA is a LaTeX to HTML translator that generates modern HTML 5.  It is
 written in Objective Caml.")
-    (license qpl)))
+    (license license:qpl)))
 
 (define-public coq
   (package
@@ -340,9 +374,11 @@ written in Objective Caml.")
     (build-system gnu-build-system)
     (native-inputs
      `(("texlive" ,texlive)
+       ("findlib" ,ocaml-findlib)
        ("hevea" ,hevea)))
     (inputs
      `(("ocaml" ,ocaml)
+       ("lablgtk" ,lablgtk)
        ("camlp5" ,camlp5)))
     (arguments
      `(#:phases
@@ -355,7 +391,8 @@ written in Objective Caml.")
                (zero? (system* "./configure"
                                "-prefix" out
                                "-mandir" mandir
-                               "-browser" browser)))))
+                               "-browser" browser
+                               "-coqide" "opt")))))
          (replace 'build
            (lambda _
              (zero? (system* "make" "-j" (number->string
@@ -374,7 +411,7 @@ development of computer programs consistent with their formal specification.
 It is developed using Objective Caml and Camlp5.")
     ;; The code is distributed under lgpl2.1.
     ;; Some of the documentation is distributed under opl1.0+.
-    (license (list lgpl2.1 opl1.0+))))
+    (license (list license:lgpl2.1 license:opl1.0+))))
 
 (define-public proof-general
   (package
@@ -452,7 +489,7 @@ It is developed using Objective Caml and Camlp5.")
      "Proof General is a major mode to turn Emacs into an interactive proof
 assistant to write formal mathematical proofs using a variety of theorem
 provers.")
-    (license gpl2+)))
+    (license license:gpl2+)))
 
 (define-public ocaml-menhir
   (package
@@ -488,24 +525,23 @@ Knuth’s LR(1) parser construction technique.")
     ;; The file src/standard.mly and all files listed in src/mnehirLib.mlpack
     ;; that have an *.ml or *.mli extension are GPL licensed. All other files
     ;; are QPL licensed.
-    (license (list gpl2+ qpl))))
+    (license (list license:gpl2+ license:qpl))))
 
 (define-public lablgtk
   (package
     (name "lablgtk")
-    (version "2.18.3")
-    (source
-      (origin
-        (method url-fetch)
-          (uri (string-append "https://forge.ocamlcore.org/frs/download.php/"
-                              "1479/lablgtk-2.18.3.tar.gz"))
-          (sha256
-            (base32
-              "1bybn3jafxf4cx25zvn8h2xj9agn1xjbn7j3ywxxqx6az7rfnnwp"))))
+    (version "2.18.5")
+    (source (origin
+              (method url-fetch)
+              (uri (ocaml-forge-uri name version 1627))
+              (sha256
+               (base32
+                "0cyj6sfdvzx8hw7553lhgwc0krlgvlza0ph3dk9gsxy047dm3wib"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("camlp4" ,camlp4)
        ("ocaml" ,ocaml)
+       ("findlib" ,ocaml-findlib)
        ("pkg-config" ,pkg-config)))
     ;; FIXME: Add inputs gtkgl-2.0, libpanelapplet-2.0, gtkspell-2.0,
     ;; and gtk+-quartz-2.0 once available.
@@ -520,21 +556,24 @@ Knuth’s LR(1) parser construction technique.")
      `(#:tests? #f ; no check target
 
        ;; opt: also install cmxa files
-       #:make-flags (list "all" "opt")
+       #:make-flags (list "all" "opt"
+                          (string-append "FINDLIBDIR="
+                                         (assoc-ref %outputs "out")
+                                         "/lib/ocaml"))
        ;; Occasionally we would get "Error: Unbound module GtkThread" when
        ;; compiling 'gtkThInit.ml', with 'make -j'.  So build sequentially.
        #:parallel-build? #f
 
        #:phases
          (modify-phases %standard-phases
-           (replace 'install
+           (add-before 'install 'prepare-install
              (lambda* (#:key inputs outputs #:allow-other-keys)
                (let ((out (assoc-ref outputs "out"))
                      (ocaml (assoc-ref inputs "ocaml")))
                  ;; Install into the output and not the ocaml directory.
+                 (mkdir-p (string-append out "/lib/ocaml"))
                  (substitute* "config.make"
                    ((ocaml) out))
-                 (system* "make" "old-install")
                  #t))))))
     (home-page "http://lablgtk.forge.ocamlcore.org/")
     (synopsis "GTK+ bindings for OCaml")
@@ -547,7 +586,7 @@ gdk-pixbuf, the GLArea widget (in combination with LablGL), gnomecanvas,
 gnomeui, gtksourceview, gtkspell,
 libglade (and it an generate OCaml code from .glade files),
 libpanel, librsvg and quartz.")
-    (license lgpl2.1)))
+    (license license:lgpl2.1)))
 
 (define-public unison
   (package
@@ -668,7 +707,7 @@ a collection of files and directories to be stored on different hosts
 (or different disks on the same host), modified separately, and then
 brought up to date by propagating the changes in each replica
 to the other.")
-    (license gpl3+)))
+    (license license:gpl3+)))
 
 (define-public ocaml-findlib
   (package
@@ -702,7 +741,12 @@ to the other.")
                         "-config" (string-append out "/etc/ocamfind.conf")
                         "-mandir" (string-append out "/share/man")
                         "-sitelib" (string-append out "/lib/ocaml/site-lib")
-                        "-with-toolbox")))))))
+                        "-with-toolbox"))))
+                  (add-after 'install 'remove-camlp4
+                    (lambda* (#:key outputs #:allow-other-keys)
+                      (let ((out (assoc-ref outputs "out")))
+                        (delete-file-recursively
+                          (string-append out "/lib/ocaml/site-lib/camlp4"))))))))
     (home-page "http://projects.camlcity.org/projects/findlib.html")
     (synopsis "Management tool for OCaml libraries")
     (description
@@ -716,4 +760,461 @@ dependency information about multiple packages.  There is also a tool that
 allows the user to enter queries on the command-line.  In order to simplify
 compilation and linkage, there are new frontends of the various OCaml
 compilers that can directly deal with packages.")
-    (license x11)))
+    (license license:x11)))
+
+;; note that some tests may hang for no obvious reason.
+(define-public ocaml-ounit
+  (package
+    (name "ocaml-ounit")
+    (version "2.0.0")
+    (source (origin
+              (method url-fetch)
+              (uri (ocaml-forge-uri "ounit" version 1258))
+              (sha256
+               (base32
+                "118xsadrx84pif9vaq13hv4yh22w9kmr0ypvhrs0viir1jr0ajjd"))))
+    (build-system ocaml-build-system)
+    (native-inputs
+     `(("libxml2" ,libxml2))) ; for xmllint
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         ;; Tests are done during build.
+         (delete 'check))))
+    (home-page "http://ounit.forge.ocamlcore.org")
+    (synopsis "Unit testing framework for OCaml")
+    (description "Unit testing framework for OCaml.  It is similar to JUnit and
+other XUnit testing frameworks.")
+    (license license:expat)))
+
+(define-public camlzip
+  (package
+    (name "camlzip")
+    (version "1.0.6")
+    (source (origin
+              (method url-fetch)
+              (uri (ocaml-forge-uri name version 1616))
+              (sha256
+               (base32
+                "0m6gyjw46w3qnhxfsyqyag42znl5lwargks7w7rfchr9jzwpff68"))))
+    (build-system ocaml-build-system)
+    (inputs
+     `(("zlib" ,zlib)))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (delete 'configure)
+         (add-before 'install 'fix-install-name
+           (lambda* (#:key #:allow-other-keys)
+             (substitute* "Makefile"
+               (("install zip") "install camlzip")))))
+       #:install-target "install-findlib"
+       #:make-flags
+       (list "all" "allopt"
+             (string-append "INSTALLDIR=" (assoc-ref %outputs "out")
+                            "/lib/ocaml"))))
+    (home-page "http://forge.ocamlcore.org/projects/camlzip")
+    (synopsis "Provides easy access to compressed files")
+    (description "Provides easy access to compressed files in ZIP, GZIP and
+JAR format.  It provides functions for reading from and writing to compressed
+files in these formats.")
+    (license license:lgpl2.1+)))
+
+(define-public ocamlmod
+  (package
+    (name "ocamlmod")
+    (version "0.0.8")
+    (source (origin
+              (method url-fetch)
+              (uri (ocaml-forge-uri name version 1544))
+              (sha256
+               (base32
+                "1w0w8lfyymvk300dv13gvhrddpcyknvyp4g2yvq2vaw7khkhjs9g"))))
+    (build-system ocaml-build-system)
+    (native-inputs
+     `(("ounit" ,ocaml-ounit)))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         ;; Tests are done during build.
+         (delete 'check))))
+    (home-page "https://forge.ocamlcore.org/projects/ocamlmod")
+    (synopsis "Generate modules from OCaml source files")
+    (description "Generate modules from OCaml source files.")
+    (license license:lgpl2.1+))) ; with an exception
+
+(define-public ocaml-zarith
+  (package
+    (name "ocaml-zarith")
+    (version "1.4.1")
+    (source (origin
+              (method url-fetch)
+              (uri (ocaml-forge-uri "zarith" version 1574))
+              (sha256
+               (base32
+                "0l36hzmfbvdai2kcgynh13vfdim5x2grnaw61fxqalyjm90c3di3"))))
+    (build-system ocaml-build-system)
+    (native-inputs
+     `(("perl" ,perl)))
+    (inputs
+     `(("gmp" ,gmp)))
+    (arguments
+     `(#:tests? #f ; no test target
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'configure
+           (lambda* (#:key #:allow-other-keys)
+             (zero? (system* "./configure")))))))
+    (home-page "https://forge.ocamlcore.org/projects/zarith/")
+    (synopsis "Implements arbitrary-precision integers")
+    (description "Implements arithmetic and logical operations over
+arbitrary-precision integers.  It uses GMP to efficiently implement arithmetic
+over big integers. Small integers are represented as Caml unboxed integers,
+for speed and space economy.")
+    (license license:lgpl2.1+))) ; with an exception
+
+(define-public ocaml-frontc
+  (package
+    (name "ocaml-frontc")
+    (version "3.4")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://www.irit.fr/recherches/ARCHI/MARCH/"
+                                  "frontc/Frontc-" version ".tgz"))
+              (sha256
+               (base32
+                "16dz153s92dgbw1rrfwbhscy73did87kfmjwyh3qpvs748h1sc4g"))))
+    (build-system ocaml-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (delete 'configure)
+         (add-after 'install 'install-meta
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (with-output-to-file
+                   (string-append out "/lib/ocaml/frontc/META")
+                 (lambda _
+                   (display
+                    (string-append
+                     "description = \"Parser for the C language\"
+version = \"" ,version "\"
+requires = \"unix\"
+archive(byte) = \"frontc.cma\"
+archive(native) = \"frontc.cmxa\""))))
+               (symlink (string-append out "/lib/ocaml/frontc")
+                        (string-append out "/lib/ocaml/FrontC"))))))
+       #:make-flags (list (string-append "PREFIX="
+                                         (assoc-ref %outputs "out"))
+                          "OCAML_SITE=$(LIB_DIR)/ocaml/")))
+    (home-page "https://www.irit.fr/FrontC")
+    (synopsis "C parser and lexer library")
+    (description "FrontC is an OCAML library providing a C parser and lexer.
+The result is a syntactic tree easy to process with usual OCAML tree management.
+It provides support for ANSI C syntax, old-C K&R style syntax and the standard
+GNU CC attributes.  It provides also a C pretty printer as an example of use.")
+    (license license:lgpl2.1)))
+
+(define-public ocaml-qtest
+  (package
+    (name "ocaml-qtest")
+    (version "2.3")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/vincent-hugot/iTeML/"
+                                  "archive/v" version ".tar.gz"))
+              (sha256
+               (base32
+                "1n7x5l6h4j44f75wzgzjsjkq349i4gj707w1hr7fx84igxxfr6vl"))))
+    (build-system ocaml-build-system)
+    (native-inputs
+     `(("findlib" ,ocaml-findlib)))
+    (propagated-inputs
+     `(("ounit" ,ocaml-ounit)))
+    (arguments
+     `(#:tests? #f ; No test target.
+       #:make-flags
+       (list (string-append "BIN=" (assoc-ref %outputs "out") "/bin"))
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure))))
+    (home-page "https://github.com/vincent-hugot/iTeML")
+    (synopsis "Inline (Unit) Tests for OCaml")
+    (description "Qtest extracts inline unit tests written using a special
+syntax in comments.  Those tests are then run using the oUnit framework and the
+qcheck library.  The possibilities range from trivial tests -- extremely simple
+to use -- to sophisticated random generation of test cases.")
+    (license license:lgpl3+)))
+
+(define-public ocaml-stringext
+  (package
+    (name "ocaml-stringext")
+    (version "1.4.3")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/rgrinberg/stringext"
+                                  "/archive/v" version ".tar.gz"))
+              (sha256
+               (base32
+                "19g6lfn03iki9f8h91hi0yiqn0b3wkxyq08b3y23wgv6jw6mssfh"))))
+    (build-system ocaml-build-system)
+    (native-inputs
+     `(("qtest" ,ocaml-qtest)))
+    (home-page "https://github.com/rgrinberg/stringext")
+    (synopsis "Extra string functions for OCaml")
+    (description "Provides a single module named Stringext that provides a grab
+bag of often used but missing string functions from the stdlib.  E.g, split,
+full_split, cut, rcut, etc..")
+    ;; the only mention of a license in this project is in its `opam' file
+    ;; where it says `mit'.
+    (license license:expat)))
+
+
+(define-public ocaml-bisect
+  (package
+    (name "ocaml-bisect")
+    (version "1.3")
+    (source (origin
+              (method url-fetch)
+              (uri (ocaml-forge-uri "bisect" version 1051))
+              (sha256
+               (base32
+                "0kcg2rh0qlkfpbv3nhcb75n62b04gbrz0zasq15ynln91zd5qrg0"))
+              (patches
+               (search-patches
+                "ocaml-bisect-fix-camlp4-in-another-directory.patch"))))
+    (build-system ocaml-build-system)
+    (native-inputs
+     `(("camlp4" ,camlp4)
+       ("libxml2" ,libxml2)
+       ("which" ,which)))
+    (propagated-inputs
+     `(("camlp4" ,camlp4)))
+    (arguments
+     `(#:test-target "tests"
+       #:make-flags
+       (list "all" (string-append "CAMLP4_LIBDIR="
+                                  (assoc-ref %build-inputs "camlp4")
+                                  "/lib/ocaml/site-lib/camlp4"))
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'configure
+           (lambda* (#:key outputs #:allow-other-keys)
+             (zero? (system* "./configure" "-prefix"
+                             (assoc-ref outputs "out"))))))))
+    (home-page "http://bisect.x9c.fr")
+    (synopsis "Code coverage tool for the OCaml language")
+    (description "Bisect is a code coverage tool for the OCaml language.  It is
+a camlp4-based tool that allows to instrument your application before running
+tests.  After application execution, it is possible to generate a report in HTML
+format that is the replica of the application source code annotated with code
+coverage information.")
+    (license license:gpl3+)))
+
+(define-public ocaml-bitstring
+  (package
+    (name "ocaml-bitstring")
+    (version "2.1.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/xguerin/bitstring"
+                                  "/archive/v" version ".tar.gz"))
+              (sha256
+               (base32
+                "0miw4banfpmx4kxrckpqr57b1fcmsqdmspyjx6gqjd4kghm4l7xj"))
+              (patches (search-patches "ocaml-bitstring-fix-configure.patch"))))
+    (build-system ocaml-build-system)
+    (native-inputs
+     `(("camlp4" ,camlp4)
+       ("time" ,time)
+       ("autoconf" ,autoconf)
+       ("automake" ,automake)
+       ("bisect" ,ocaml-bisect)))
+    (propagated-inputs
+     `(("camlp4" ,camlp4)))
+    (arguments
+     `(#:configure-flags
+       (list "CAMLP4OF=camlp4of" "--enable-coverage")
+       #:make-flags
+       (list (string-append "BISECTLIB="
+                            (assoc-ref %build-inputs "bisect")
+                            "/lib/ocaml/site-lib")
+             (string-append "OCAMLCFLAGS=-g -I "
+                            (assoc-ref %build-inputs "camlp4")
+                            "/lib/ocaml/site-lib/camlp4 -I "
+                            "$(BISECTLIB)/bisect")
+             (string-append "OCAMLOPTFLAGS=-g -I "
+                            (assoc-ref %build-inputs "camlp4")
+                            "/lib/ocaml/site-lib/camlp4 -I "
+                            "$(BISECTLIB)/bisect"))
+       #:phases
+       (modify-phases %standard-phases
+         (add-before 'configure 'fix-configure
+           (lambda* (#:key inputs #:allow-other-keys)
+             (substitute* "Makefile.in"
+               (("@abs_top_builddir@")
+                (string-append "@abs_top_builddir@:" (getenv "LIBRARY_PATH"))))
+             (substitute* "configure"
+               (("-/bin/sh") (string-append "-" (assoc-ref inputs "bash")
+                                            "/bin/sh")))))
+         (add-after 'install 'link-lib
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (stubs (string-append out
+                                          "/lib/ocaml/site-lib/stubslibs"))
+                    (lib (string-append out
+                                        "/lib/ocaml/site-lib/bitstring")))
+               (mkdir-p stubs)
+               (symlink (string-append lib "/dllbitstring.so")
+                        (string-append stubs "/dllbitstring.so"))))))))
+    (home-page "https://github.com/xguerin/bitstring")
+    (synopsis "Bitstrings and bitstring matching for OCaml")
+    (description "Adds Erlang-style bitstrings and matching over bitstrings as
+a syntax extension and library for OCaml.  You can use this module to both parse
+and generate binary formats, files and protocols.  Bitstring handling is added
+as primitives to the language, making it exceptionally simple to use and very
+powerful.")
+    (license license:isc)))
+
+(define-public ocaml-result
+  (package
+    (name "ocaml-result")
+    (version "1.2")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/janestreet/result"
+                                  "/archive/" version ".tar.gz"))
+              (sha256
+               (base32
+                "1pgpfsgvhxnh0i37fkvp9j8nadns9hz9iqgabj4dr519j2gr1xvw"))))
+    (build-system ocaml-build-system)
+    (arguments
+     `(#:tests? #f
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure))))
+    (home-page "https://github.com/janestreet/result")
+    (synopsis "Compatibility Result module")
+    (description "Uses the new result type defined in OCaml >= 4.03 while
+staying compatible with older version of OCaml should use the Result module
+defined in this library.")
+    (license license:bsd-3)))
+
+(define-public ocaml-topkg
+  (package
+    (name "ocaml-topkg")
+    (version "0.8.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://erratique.ch/software/topkg/releases/"
+                                  "topkg-" version ".tbz"))
+              (sha256
+               (base32
+                "18rrh6fmf708z7dd30amljmcgaypj3kk49jrmrj68r4wnw8004j8"))))
+    (build-system ocaml-build-system)
+    (native-inputs
+     `(("opam" ,opam)))
+    (propagated-inputs
+     `(("result" ,ocaml-result)))
+    (arguments
+     `(#:tests? #f
+       #:build-flags '("build")
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure))))
+    (home-page "http://erratique.ch/software/topkg")
+    (synopsis "Transitory OCaml software packager")
+    (description "Topkg is a packager for distributing OCaml software. It
+provides an API to describe the files a package installs in a given build
+configuration and to specify information about the package's distribution,
+creation and publication procedures.")
+    (license license:isc)))
+
+(define-public ocaml-rresult
+  (package
+    (name "ocaml-rresult")
+    (version "0.5.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://erratique.ch/software/rresult/releases/"
+                                  "rresult-" version ".tbz"))
+              (sha256
+               (base32
+                "1xxycxhdhaq8p9vhwi93s2mlxjwgm44fcxybx5vghzgbankz9yhm"))))
+    (build-system ocaml-build-system)
+    (native-inputs
+     `(("opam" ,opam)))
+    (propagated-inputs
+     `(("topkg" ,ocaml-topkg)))
+    (arguments
+     `(#:tests? #f
+       #:build-flags '("build")
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure))))
+    (home-page "http://erratique.ch/software/rresult")
+    (synopsis "Result value combinators for OCaml")
+    (description "Handle computation results and errors in an explicit and
+declarative manner, without resorting to exceptions.  It defines combinators
+to operate on the result type available from OCaml 4.03 in the standard
+library.")
+    (license license:isc)))
+
+(define-public ocaml-mtime
+  (package
+    (name "ocaml-mtime")
+    (version "0.8.3")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://erratique.ch/software/mtime/releases/"
+                                  "mtime-" version ".tbz"))
+              (sha256
+               (base32
+                "1hfx4ny2dkw6jf3jppz0640dafl5xgn8r2si9kpwzhmibal8qrah"))))
+    (build-system ocaml-build-system)
+    (native-inputs
+     `(("opam" ,opam)))
+    (propagated-inputs
+     `(("topkg" ,ocaml-topkg)))
+    (arguments
+     `(#:tests? #f
+       #:build-flags
+       '("native=true" "native-dynlink=true" "jsoo=false")
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure))))
+    (home-page "http://erratique.ch/software/mtime")
+    (synopsis "Monotonic wall-clock time for OCaml")
+    (description "Access monotonic wall-clock time.  It allows to measure time
+spans without being subject to operating system calendar time adjustments.")
+    (license license:isc)))
+
+(define-public ocaml-cmdliner
+  (package
+    (name "ocaml-cmdliner")
+    (version "0.9.8")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://erratique.ch/software/cmdliner/releases/"
+                                  "cmdliner-" version ".tbz"))
+              (sha256
+               (base32
+                "0hdxlkgiwjml9dpaa80282a8350if7mc1m6yz2mrd7gci3fszykx"))))
+    (build-system ocaml-build-system)
+    (native-inputs
+     `(("opam" ,opam)))
+    (arguments
+     `(#:tests? #f
+       #:build-flags '("native=true" "native-dynlink=true")
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure))))
+    (home-page "http://erratique.ch/software/cmdliner")
+    (synopsis "Declarative definition of command line interfaces for OCaml")
+    (description "Cmdliner is a module for the declarative definition of command
+line interfaces.  It provides a simple and compositional mechanism to convert
+command line arguments to OCaml values and pass them to your functions.  The
+module automatically handles syntax errors, help messages and UNIX man page
+generation. It supports programs with single or multiple commands and respects
+most of the POSIX and GNU conventions.")
+    (license license:bsd-3)))
diff --git a/gnu/packages/onc-rpc.scm b/gnu/packages/onc-rpc.scm
index 8ef3e9f112..5353846ece 100644
--- a/gnu/packages/onc-rpc.scm
+++ b/gnu/packages/onc-rpc.scm
@@ -55,7 +55,7 @@
              ;; 'patch-source-shebangs' file tree traversal.
              (delete-file "INSTALL"))))))
     (inputs `(("mit-krb5" ,mit-krb5)))
-    (home-page "http://sourceforge.net/projects/libtirpc/")
+    (home-page "https://sourceforge.net/projects/libtirpc/")
     (synopsis "Transport-independent Sun/ONC RPC implementation")
     (description
      "This package provides a library that implements the Sun/ONC RPC (remote
diff --git a/gnu/packages/package-management.scm b/gnu/packages/package-management.scm
index 7083a1664c..673e5f0fb2 100644
--- a/gnu/packages/package-management.scm
+++ b/gnu/packages/package-management.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2015, 2017 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -44,14 +44,15 @@
   #:use-module (gnu packages curl)
   #:use-module (gnu packages web)
   #:use-module (gnu packages man)
-  #:use-module (gnu packages emacs)
   #:use-module (gnu packages bdw-gc)
+  #:use-module (gnu packages patchutils)
   #:use-module (gnu packages python)
   #:use-module (gnu packages popt)
   #:use-module (gnu packages gnuzilla)
   #:use-module (gnu packages cpio)
   #:use-module (gnu packages tls)
   #:use-module (gnu packages ssh)
+  #:use-module (gnu packages vim)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-26)
   #:use-module (ice-9 popen)
@@ -68,17 +69,17 @@
                      arch "-linux"
                      "/20131110/guile-2.0.9.tar.xz")))
 
-(define-public guix-0.11.0
+(define-public guix-0.12.0
   (package
     (name "guix")
-    (version "0.11.0")
+    (version "0.12.0")
     (source (origin
              (method url-fetch)
              (uri (string-append "ftp://alpha.gnu.org/gnu/guix/guix-"
                                  version ".tar.gz"))
              (sha256
               (base32
-               "1cwrbpv4dq7aczwksmcfw9w8r2bzrb5ld9zvjcr90i804hjpcb93"))))
+               "1jgy5mlygmhxdqhrp6vr8w83ndcm5mk64xfravr8l2d7hq8y40b2"))))
     (build-system gnu-build-system)
     (arguments
      `(#:configure-flags (list
@@ -121,7 +122,7 @@
                    ;; XXX FIXME: These tests fail within the build container.
                    (lambda _
                      (substitute* "tests/syscalls.scm"
-                       (("^\\(test-assert \"(clone|setns|pivot-root)\"" all)
+                       (("^\\(test-(assert|equal) \"(clone|setns|pivot-root)\"" all)
                         (string-append "(test-skip 1)\n" all)))
                      (substitute* "tests/containers.scm"
                        (("^\\(test-(assert|equal)" all)
@@ -162,7 +163,6 @@
 
                        #t))))))
     (native-inputs `(("pkg-config" ,pkg-config)
-                     ("emacs" ,emacs-minimal)     ;for guix.el
 
                      ;; XXX: Keep the development inputs here even though
                      ;; they're unnecessary, just so that 'guix environment
@@ -206,9 +206,7 @@
     (propagated-inputs
      `(("gnutls" ,gnutls)                         ;for 'guix download' & co.
        ("guile-json" ,guile-json)
-       ("guile-ssh" ,guile-ssh)
-       ("geiser" ,geiser)                         ;for guix.el
-       ("emacs-magit-popup" ,emacs-magit-popup))) ;for "M-x guix" command
+       ("guile-ssh" ,guile-ssh)))
 
     (home-page "http://www.gnu.org/software/guix")
     (synopsis "Functional package manager for installed software packages and versions")
@@ -226,9 +224,9 @@ the Nix package manager.")
   ;;
   ;; Note: use a very short commit id; with a longer one, the limit on
   ;; hash-bang lines would be exceeded while running the tests.
-  (let ((commit "8d125cfc2e5cb0825bb40893ec3e940f85f1b235"))
-    (package (inherit guix-0.11.0)
-      (version (string-append "0.11.0-8." (string-take commit 4)))
+  (let ((commit "eefd042e60d9fc1d092b44bf80ecbfe65b291e46"))
+    (package (inherit guix-0.12.0)
+      (version (string-append "0.12.0-3." (string-take commit 4)))
       (source (origin
                 (method git-fetch)
                 (uri (git-reference
@@ -238,10 +236,10 @@ the Nix package manager.")
                       (commit commit)))
                 (sha256
                  (base32
-                  "0h73m1zad67qqn7ygypcqscicvqj31wwkxsr85d5lr77v6bx7b6z"))
+                  "1g0042x80q73pb9y39aqbkajl4bacls5c0im9aljmjnsb80fsh8d"))
                 (file-name (string-append "guix-" version "-checkout"))))
       (arguments
-       (substitute-keyword-arguments (package-arguments guix-0.11.0)
+       (substitute-keyword-arguments (package-arguments guix-0.12.0)
          ((#:configure-flags flags)
           ;; Set 'DOT_USER_PROGRAM' to the empty string so we don't keep a
           ;; reference to Graphviz, whose closure is pretty big (too big for
@@ -498,12 +496,29 @@ transactions from C or Python.")
                   (add-after 'unpack 'dependency-on-python-magic
                     (lambda _
                       (substitute* "setup.py"
-                        (("'python-magic',") "")))))))
+                        (("'python-magic',") ""))))
+                  (add-after 'unpack 'embed-tool-references
+                    (lambda* (#:key inputs #:allow-other-keys)
+                      (substitute* "diffoscope/difference.py"
+                        (("@tool_required\\('colordiff'\\)") "")
+                        (("\\[\"colordiff\"")
+                         (string-append "[\"" (which "colordiff") "\"")))
+                      (substitute* "diffoscope/comparators/utils.py"
+                        (("@tool_required\\('xxd'\\)") "")
+                        (("\\['xxd',")
+                         (string-append "['" (which "xxd") "',")))
+                      (substitute* "diffoscope/comparators/elf.py"
+                        (("@tool_required\\('readelf'\\)") "")
+                        (("\\['readelf',")
+                         (string-append "['" (which "readelf") "',")))
+                      #t)))))
     (inputs `(("rpm" ,rpm)                        ;for rpm-python
               ("python-file" ,python-file)
               ("python-debian" ,python-debian)
               ("python-libarchive-c" ,python-libarchive-c)
               ("python-tlsh" ,python-tlsh)
+              ("colordiff" ,colordiff)
+              ("xxd" ,vim)
 
               ;; Below are modules used for tests.
               ("python-pytest" ,python-pytest)
diff --git a/gnu/packages/parallel.scm b/gnu/packages/parallel.scm
index 1a4ea8a036..097e4e182b 100644
--- a/gnu/packages/parallel.scm
+++ b/gnu/packages/parallel.scm
@@ -45,7 +45,7 @@
 (define-public parallel
   (package
     (name "parallel")
-    (version "20161122")
+    (version "20161222")
     (source
      (origin
       (method url-fetch)
@@ -53,7 +53,7 @@
                           version ".tar.bz2"))
       (sha256
        (base32
-        "0z5c4r35d926ac04ilaivx67cmflr1rsvmjb2ci7hmab948m0ng2"))))
+        "1chgr3csyc7hbq2wq4jnwnbsr3ix8rzsk2lf4vdnvkjpd6dvw517"))))
     (build-system gnu-build-system)
     (arguments
      `(#:phases
diff --git a/gnu/packages/password-utils.scm b/gnu/packages/password-utils.scm
index 8f6210880c..cb8dacc3ea 100644
--- a/gnu/packages/password-utils.scm
+++ b/gnu/packages/password-utils.scm
@@ -7,6 +7,7 @@
 ;;; Copyright © 2016 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2016 Lukas Gradl <lgradl@openmailbox.org>
 ;;; Copyright © 2016 Alex Griffin <a@ajgrf.com>
+;;; Copyright © 2017 Leo Famulari <leo@famulari.name>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -33,8 +34,8 @@
   #:use-module (gnu packages admin)
   #:use-module (gnu packages base)
   #:use-module (gnu packages compression)
+  #:use-module (gnu packages glib)
   #:use-module (gnu packages gnupg)
-  #:use-module (gnu packages gtk)
   #:use-module (gnu packages guile)
   #:use-module (gnu packages linux)
   #:use-module (gnu packages man)
@@ -172,7 +173,8 @@ and vice versa.")
               (uri (string-append "https://github.com/cracklib/cracklib/"
                                   "releases/download/" name "-" version "/"
                                   name "-" version ".tar.gz"))
-              (patches (search-patches "cracklib-CVE-2016-6318.patch"))
+              (patches (search-patches "cracklib-CVE-2016-6318.patch"
+                                       "cracklib-fix-buffer-overflow.patch"))
               (sha256
                (base32
                 "0hrkb0prf7n92w6rxgq0ilzkk6rkhpys2cfqkrbzswp27na7dkqp"))))
@@ -216,7 +218,7 @@ random passwords that pass the checks.")
 (define-public assword
   (package
     (name "assword")
-    (version "0.8")
+    (version "0.10")
     (source (origin
               (method url-fetch)
               (uri (list
@@ -225,10 +227,9 @@ random passwords that pass the checks.")
                      "assword_" version ".orig.tar.gz")))
               (sha256
                (base32
-                "0dl4wizbi0r21wxzykm8s445xbvqim5nabi799dmpkdnnh8i546i"))))
+                "0l6170y6my1gprqkazvzabgjkrkr9v2q7z48vjflna4r323yqira"))))
     (arguments
-     `(#:python ,python-2
-       ;; irritatingly, tests do run but not there are two problems:
+     `(;; irritatingly, tests do run but not there are two problems:
        ;;  - "import gtk" fails for unknown reasons here despite it the
        ;;    program working (indeed, I've found I have to do a logout and log
        ;;    back in in after an install order for some mumbo jumbo environment
@@ -242,17 +243,21 @@ random passwords that pass the checks.")
          (add-after 'install 'manpage
            (lambda* (#:key outputs #:allow-other-keys)
              (and
+              ;; Without this substitution, it fails with
+              ;; ImportError: No module named 'gpg'
+              (substitute* "Makefile"
+                (("PYTHONPATH=.") ""))
               (zero? (system* "make" "assword.1"))
               (install-file
                "assword.1"
                (string-append (assoc-ref outputs "out") "/share/man/man1"))))))))
     (build-system python-build-system)
     (native-inputs
-     `(("help2man" ,help2man)))
+     `(("txt2man" ,txt2man)))
     (inputs
-     `(("python2-xdo" ,python2-xdo)
-       ("python2-pygpgme" ,python2-pygpgme)
-       ("python2-pygtk" ,python2-pygtk)))
+     `(("python-xdo" ,python-xdo)
+       ("python-gpg" ,python-gpg)
+       ("python-pygobject" ,python-pygobject)))
     (propagated-inputs
      `(("xclip" ,xclip)))
     (home-page "https://finestructure.net/assword/")
@@ -317,18 +322,17 @@ through the pass command.")
 (define-public argon2
   (package
     (name "argon2")
-    (version "20160406")
+    (version "20161029")
     (source
      (origin
        (method url-fetch)
        (uri
-        (string-append
-         "https://codeload.github.com/P-H-C/phc-winner-"
-         name "/tar.gz/" version))
+        (string-append "https://github.com/P-H-C/phc-winner-argon2/archive/"
+                       version ".tar.gz"))
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
         (base32
-         "0g6wa94sh639xl1qc8z21q43r1mp8y77r1zf8nwx5pfsxd8fmyzv"))))
+         "1rymikbysasdadm325jx69i0q19d9srqkny69jwmhswlidr4j07y"))))
     (build-system gnu-build-system)
     (arguments
      `(#:test-target "test"
diff --git a/gnu/packages/patches/awesome-reproducible-png.patch b/gnu/packages/patches/awesome-reproducible-png.patch
index 0fae65bc71..d8e92c70f9 100644
--- a/gnu/packages/patches/awesome-reproducible-png.patch
+++ b/gnu/packages/patches/awesome-reproducible-png.patch
@@ -7,8 +7,8 @@ See <https://wiki.debian.org/ReproducibleBuilds/TimestampsInPNG>.
          set(ALL_ICONS ${ALL_ICONS} ${output})
  
          add_custom_command(
--            COMMAND ${CONVERT_EXECUTABLE} ${input} ${ARGN} ${output}
-+            COMMAND ${CONVERT_EXECUTABLE} +set date:create +set date:modify -define png:exclude-chunk=time ${input} ${ARGN} ${output}
+-            COMMAND ${CONVERT_EXECUTABLE} ${input} -strip ${ARGN} ${output}
++            COMMAND ${CONVERT_EXECUTABLE} +set date:create +set date:modify -define png:exclude-chunk=time ${input} -strip ${ARGN} ${output}
              OUTPUT  ${output}
              DEPENDS ${input}
              VERBATIM)
diff --git a/gnu/packages/patches/chicken-CVE-2016-6830+CVE-2016-6831.patch b/gnu/packages/patches/chicken-CVE-2016-6830+CVE-2016-6831.patch
new file mode 100644
index 0000000000..59decde0e9
--- /dev/null
+++ b/gnu/packages/patches/chicken-CVE-2016-6830+CVE-2016-6831.patch
@@ -0,0 +1,81 @@
+diff -ur a/irregex-core.scm b/irregex-core.scm
+--- a/irregex-core.scm	2016-09-11 19:03:00.000000000 -0400
++++ b/irregex-core.scm	2017-01-01 22:24:08.000000000 -0500
+@@ -30,6 +30,8 @@
+ 
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;;;; History
++;; 0.9.6: 2016/12/05 - fixed exponential memory use of + in compilation
++;;                     of backtracking matcher.
+ ;; 0.9.5: 2016/09/10 - fixed a bug in irregex-fold handling of bow
+ ;; 0.9.4: 2015/12/14 - performance improvement for {n,m} matches
+ ;; 0.9.3: 2014/07/01 - R7RS library
+@@ -3170,16 +3172,7 @@
+               ((sre-empty? (sre-sequence (cdr sre)))
+                (error "invalid sre: empty *" sre))
+               (else
+-               (letrec
+-                   ((body
+-                     (lp (sre-sequence (cdr sre))
+-                         n
+-                         flags
+-                         (lambda (cnk init src str i end matches fail)
+-                           (body cnk init src str i end matches
+-                                 (lambda ()
+-                                   (next cnk init src str i end matches fail)
+-                                   ))))))
++               (let ((body (rec (list '+ (sre-sequence (cdr sre))))))
+                  (lambda (cnk init src str i end matches fail)
+                    (body cnk init src str i end matches
+                          (lambda ()
+@@ -3204,10 +3197,21 @@
+                          (lambda ()
+                            (body cnk init src str i end matches fail))))))))
+             ((+)
+-             (lp (sre-sequence (cdr sre))
+-                 n
+-                 flags
+-                 (rec (list '* (sre-sequence (cdr sre))))))
++             (cond
++              ((sre-empty? (sre-sequence (cdr sre)))
++               (error "invalid sre: empty +" sre))
++              (else
++               (letrec
++                   ((body
++                     (lp (sre-sequence (cdr sre))
++                         n
++                         flags
++                         (lambda (cnk init src str i end matches fail)
++                           (body cnk init src str i end matches
++                                 (lambda ()
++                                   (next cnk init src str i end matches fail)
++                                   ))))))
++                 body))))
+             ((=)
+              (rec `(** ,(cadr sre) ,(cadr sre) ,@(cddr sre))))
+             ((>=)
+diff -ur a/irregex-utils.scm b/irregex-utils.scm
+--- a/irregex-utils.scm	2016-09-11 19:03:00.000000000 -0400
++++ b/irregex-utils.scm	2017-01-01 22:25:25.000000000 -0500
+@@ -89,7 +89,7 @@
+         (case (car x)
+           ((: seq)
+            (cond
+-            ((and (pair? (cddr x)) (pair? (cddr x)) (not (eq? x obj)))
++            ((and (pair? (cdr x)) (pair? (cddr x)) (not (eq? x obj)))
+              (display "(?:" out) (for-each lp (cdr x)) (display ")" out))
+             (else (for-each lp (cdr x)))))
+           ((submatch)
+diff -ur "a/manual-html/Unit irregex.html" "b/manual-html/Unit irregex.html"
+--- "a/manual-html/Unit irregex.html"	2016-09-11 19:10:47.000000000 -0400
++++ "b/manual-html/Unit irregex.html"	2017-01-01 22:26:05.000000000 -0500
+@@ -353,6 +353,6 @@
+ <dd class="defsig"><p>Returns an optimized SRE matching any of the literal strings in the list, like Emacs' <tt>regexp-opt</tt>.  Note this optimization doesn't help when irregex is able to build a DFA.</p></dd>
+ </dl>
+ <h5 id="sec:sre-.3estring"><a href="#sec:sre-.3estring">sre-&gt;string</a></h5><dl class="defsig"><dt class="defsig" id="def:sre-.3estring"><span class="sig"><tt>(sre-&gt;string &lt;sre&gt;)</tt></span> <span class="type">procedure</span></dt>
+-<dd class="defsig"><p>Convert an SRE to a POSIX-style regular expression string, if possible.</p></dd>
++<dd class="defsig"><p>Convert an SRE to a PCRE-style regular expression string, if possible.</p></dd>
+ </dl>
+-<hr /><p>Previous: <a href="Unit%20extras.html">Unit extras</a></p><p>Next: <a href="Unit%20srfi-1.html">Unit srfi-1</a></p></div></div></body>
+\ No newline at end of file
++<hr /><p>Previous: <a href="Unit%20extras.html">Unit extras</a></p><p>Next: <a href="Unit%20srfi-1.html">Unit srfi-1</a></p></div></div></body>
diff --git a/gnu/packages/patches/cracklib-fix-buffer-overflow.patch b/gnu/packages/patches/cracklib-fix-buffer-overflow.patch
new file mode 100644
index 0000000000..b1c990f282
--- /dev/null
+++ b/gnu/packages/patches/cracklib-fix-buffer-overflow.patch
@@ -0,0 +1,39 @@
+Fix buffer overflow processing long words in Mangle().
+
+Patch adpated from upstream commit, omitting changes to 'NEWS':
+
+https://github.com/cracklib/cracklib/commit/33d7fa4585247cd2247a1ffa032ad245836c6edb
+
+From 33d7fa4585247cd2247a1ffa032ad245836c6edb Mon Sep 17 00:00:00 2001
+From: Jan Dittberner <jan@dittberner.info>
+Date: Thu, 25 Aug 2016 17:17:53 +0200
+Subject: [PATCH] Fix a buffer overflow processing long words
+
+A buffer overflow processing long words has been discovered. This commit
+applies the patch from
+https://build.opensuse.org/package/view_file/Base:System/cracklib/0004-overflow-processing-long-words.patch
+by Howard Guo.
+
+See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=835386 and
+http://www.openwall.com/lists/oss-security/2016/08/23/8
+---
+ src/NEWS        | 1 +
+ src/lib/rules.c | 5 ++---
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/src/lib/rules.c b/src/lib/rules.c
+index d193cc0..3a2aa46 100644
+--- a/lib/rules.c
++++ b/lib/rules.c
+@@ -434,9 +434,8 @@ Mangle(input, control)		/* returns a pointer to a controlled Mangle */
+ {
+     int limit;
+     register char *ptr;
+-    static char area[STRINGSIZE];
+-    char area2[STRINGSIZE];
+-    area[0] = '\0';
++    static char area[STRINGSIZE * 2] = {0};
++    char area2[STRINGSIZE * 2] = {0};
+     strcpy(area, input);
+ 
+     for (ptr = control; *ptr; ptr++)
diff --git a/gnu/packages/patches/gnupg-test-segfault-on-32bit-arch.patch b/gnu/packages/patches/gnupg-test-segfault-on-32bit-arch.patch
new file mode 100644
index 0000000000..79bb41caaa
--- /dev/null
+++ b/gnu/packages/patches/gnupg-test-segfault-on-32bit-arch.patch
@@ -0,0 +1,40 @@
+This fixes a segfault on 32-bit architectures. Upstream discussion:
+
+https://lists.gnupg.org/pipermail/gnupg-devel/2016-December/032364.html
+
+Guix thread: https://lists.gnu.org/archive/html/guix-devel/2016-12/msg00631.html
+
+Patch copied from upstream source repository:
+
+https://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=commitdiff;h=6e96cdd41a0e55b672309431062f37c4a4a9f485
+
+From 6e96cdd41a0e55b672309431062f37c4a4a9f485 Mon Sep 17 00:00:00 2001
+From: Justus Winter <justus@g10code.com>
+Date: Wed, 21 Dec 2016 16:14:45 +0100
+Subject: [PATCH] gpgscm: Guard use of union member.
+
+* tests/gpgscm/scheme.c (opexe_5): Check that we have a file port
+before accessing filename.  Fixes a crash on 32-bit architectures.
+
+Fixes-commit: e7429b1ced0c69fa7901f888f8dc25f00fc346a4
+Signed-off-by: Justus Winter <justus@g10code.com>
+---
+ tests/gpgscm/scheme.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tests/gpgscm/scheme.c b/tests/gpgscm/scheme.c
+index a5b7691..2844545 100644
+--- a/tests/gpgscm/scheme.c
++++ b/tests/gpgscm/scheme.c
+@@ -4838,7 +4838,7 @@ static pointer opexe_5(scheme *sc, enum scheme_opcodes op) {
+                } else {
+                     sc->nesting_stack[sc->file_i]++;
+ #if USE_TAGS && SHOW_ERROR_LINE
+-		    {
++		    if (sc->load_stack[sc->file_i].kind & port_file) {
+ 		      const char *filename =
+ 			sc->load_stack[sc->file_i].rep.stdio.filename;
+ 		      int lineno =
+-- 
+2.8.0.rc3
+
diff --git a/gnu/packages/patches/inkscape-drop-wait-for-targets.patch b/gnu/packages/patches/inkscape-drop-wait-for-targets.patch
deleted file mode 100644
index 3dbe6641e2..0000000000
--- a/gnu/packages/patches/inkscape-drop-wait-for-targets.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-Copied from Fedora.
-
-http://pkgs.fedoraproject.org/cgit/rpms/inkscape.git/plain/inkscape-0.91-drop-wait-for-targets.patch?id=eb5340800b563d6b05aa5f11a2f24f2cc0d8c80e
-
-=== modified file 'src/ui/clipboard.cpp'
---- src/ui/clipboard.cpp	2016-04-02 15:15:43 +0000
-+++ src/ui/clipboard.cpp	2016-04-07 16:30:32 +0000
-@@ -146,8 +146,6 @@
-     void _setClipboardColor(guint32);
-     void _userWarn(SPDesktop *, char const *);
- 
--    void _inkscape_wait_for_targets(std::list<Glib::ustring> &);
--
-     // private properites
-     SPDocument *_clipboardSPDoc; ///< Document that stores the clipboard until someone requests it
-     Inkscape::XML::Node *_defs; ///< Reference to the clipboard document's defs node
-@@ -1302,9 +1300,7 @@
-  */
- Glib::ustring ClipboardManagerImpl::_getBestTarget()
- {
--    // GTKmm's wait_for_targets() is broken, see the comment in _inkscape_wait_for_targets()
--    std::list<Glib::ustring> targets; // = _clipboard->wait_for_targets();
--    _inkscape_wait_for_targets(targets);
-+    std::list<Glib::ustring> targets = _clipboard->wait_for_targets();
- 
-     // clipboard target debugging snippet
-     /*
-@@ -1456,39 +1452,6 @@
-     desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, msg);
- }
- 
--
--// GTKMM's clipboard::wait_for_targets is buggy and might return bogus, see
--//
--// https://bugs.launchpad.net/inkscape/+bug/296778
--// http://mail.gnome.org/archives/gtk-devel-list/2009-June/msg00062.html
--//
--// for details. Until this has been fixed upstream we will use our own implementation
--// of this method, as copied from /gtkmm-2.16.0/gtk/gtkmm/clipboard.cc.
--void ClipboardManagerImpl::_inkscape_wait_for_targets(std::list<Glib::ustring> &listTargets)
--{
--    //Get a newly-allocated array of atoms:
--    GdkAtom* targets = NULL;
--    gint n_targets = 0;
--    gboolean test = gtk_clipboard_wait_for_targets( gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), &targets, &n_targets );
--    if (!test || (targets == NULL)) {
--        return;
--    }
--
--    //Add the targets to the C++ container:
--    for (int i = 0; i < n_targets; i++)
--    {
--        //Convert the atom to a string:
--        gchar* const atom_name = gdk_atom_name(targets[i]);
--
--        Glib::ustring target;
--        if (atom_name) {
--            target = Glib::ScopedPtr<char>(atom_name).get(); //This frees the gchar*.
--        }
--
--        listTargets.push_back(target);
--    }
--}
--
- /* #######################################
-           ClipboardManager class
-    ####################################### */
-
diff --git a/gnu/packages/patches/kdbusaddons-kinit-file-name.patch b/gnu/packages/patches/kdbusaddons-kinit-file-name.patch
new file mode 100644
index 0000000000..ffed88e043
--- /dev/null
+++ b/gnu/packages/patches/kdbusaddons-kinit-file-name.patch
@@ -0,0 +1,15 @@
+Add placeholder for kinit's store file name.
+
+diff --git a/src/kdeinitinterface.cpp b/src/kdeinitinterface.cpp
+index 22fa5e5..3d40937 100644
+--- a/src/kdeinitinterface.cpp
++++ b/src/kdeinitinterface.cpp
+@@ -52,7 +52,7 @@ void KDEInitInterface::ensureKdeinitRunning()
+     // If not found in system paths, search other paths
+     if (srv.isEmpty()) {
+         const QStringList searchPaths = QStringList()
+-            << QCoreApplication::applicationDirPath() // then look where our application binary is located
++            << QString::fromUtf8("@SUBSTITUTEME@/bin") // using QStringLiteral would be more efficient, but breaks guix store reference detection.
+             << QLibraryInfo::location(QLibraryInfo::BinariesPath); // look where exec path is (can be set in qt.conf)
+         srv = QStandardPaths::findExecutable(QStringLiteral("kdeinit5"), searchPaths);
+         if (srv.isEmpty()) {
diff --git a/gnu/packages/patches/khal-disable-failing-tests.patch b/gnu/packages/patches/khal-disable-failing-tests.patch
new file mode 100644
index 0000000000..e2c65df8ce
--- /dev/null
+++ b/gnu/packages/patches/khal-disable-failing-tests.patch
@@ -0,0 +1,33 @@
+Disable some tests that are known to fail:
+
+https://github.com/pimutils/khal/issues/546
+https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=844081
+
+diff --git a/tests/khalendar_test.py b/tests/khalendar_test.py
+index fd8dcc6..17732bf 100644
+--- a/tests/khalendar_test.py
++++ b/tests/khalendar_test.py
+@@ -65,6 +65,7 @@ class TestCalendar(object):
+                 else:
+                     mtimes[cal] = mtime
+ 
++    @pytest.mark.xfail
+     def test_db_needs_update(self, coll_vdirs):
+         coll, vdirs = coll_vdirs
+ 
+@@ -321,6 +322,7 @@ class TestDbCreation(object):
+             CalendarCollection(calendars, dbpath=dbpath, locale=aux.locale)
+ 
+ 
++@pytest.mark.xfail
+ def test_default_calendar(coll_vdirs):
+     """test if an update to the vdir is detected by the CalendarCollection"""
+     coll, vdirs = coll_vdirs
+@@ -341,6 +343,7 @@ def test_default_calendar(coll_vdirs):
+     assert len(list(coll.get_events_on(today))) == 0
+ 
+ 
++@pytest.mark.xfail
+ def test_only_update_old_event(coll_vdirs, monkeypatch):
+     coll, vdirs = coll_vdirs
+ 
diff --git a/gnu/packages/patches/libpng-CVE-2016-10087.patch b/gnu/packages/patches/libpng-CVE-2016-10087.patch
new file mode 100644
index 0000000000..8093b3e448
--- /dev/null
+++ b/gnu/packages/patches/libpng-CVE-2016-10087.patch
@@ -0,0 +1,37 @@
+Fix CVE-2016-10087, a null pointer dereference in png_set_text_2():
+
+https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10087
+http://seclists.org/oss-sec/2016/q4/777
+
+Patch adapted from upstream source repository:
+
+https://sourceforge.net/p/libpng/code/ci/812768d7a9c973452222d454634496b25ed415eb/
+
+From 812768d7a9c973452222d454634496b25ed415eb Mon Sep 17 00:00:00 2001
+From: Glenn Randers-Pehrson <glennrp at users.sourceforge.net>
+Date: Thu, 29 Dec 2016 07:51:33 -0600
+Subject: [PATCH] [libpng16] Fixed a potential null pointer dereference in
+ png_set_text_2()
+
+(bug report and patch by Patrick Keshishian).
+---
+ ANNOUNCE | 2 ++
+ CHANGES  | 2 ++
+ png.c    | 1 +
+ 3 files changed, 5 insertions(+)
+
+diff --git a/png.c b/png.c
+index 8afc28fc2..2e05de159 100644
+--- a/png.c
++++ b/png.c
+@@ -477,6 +477,7 @@ png_free_data(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 mask,
+          png_free(png_ptr, info_ptr->text);
+          info_ptr->text = NULL;
+          info_ptr->num_text = 0;
++         info_ptr->max_text = 0;
+       }
+    }
+ #endif
+-- 
+2.11.0
+
diff --git a/gnu/packages/patches/libtiff-CVE-2016-10092.patch b/gnu/packages/patches/libtiff-CVE-2016-10092.patch
new file mode 100644
index 0000000000..d5fd796169
--- /dev/null
+++ b/gnu/packages/patches/libtiff-CVE-2016-10092.patch
@@ -0,0 +1,42 @@
+Fix CVE-2016-10092:
+
+http://bugzilla.maptools.org/show_bug.cgi?id=2620
+https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10092
+https://security-tracker.debian.org/tracker/CVE-2016-10092
+
+2016-12-03 Even Rouault <even.rouault at spatialys.com>
+
+        * tools/tiffcrop.c: fix readContigStripsIntoBuffer() in -i (ignore)
+	mode so that the output buffer is correctly incremented to avoid write
+	outside bounds.
+        Reported by Agostino Sarubbo.
+        Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2620
+
+/cvs/maptools/cvsroot/libtiff/ChangeLog,v  <--  ChangeLog
+new revision: 1.1178; previous revision: 1.1177
+/cvs/maptools/cvsroot/libtiff/tools/tiffcrop.c,v  <--  tools/tiffcrop.c
+new revision: 1.47; previous revision: 1.46
+
+Index: libtiff/tools/tiffcrop.c
+===================================================================
+RCS file: /cvs/maptools/cvsroot/libtiff/tools/tiffcrop.c,v
+retrieving revision 1.46
+retrieving revision 1.47
+diff -u -r1.46 -r1.47
+--- libtiff/tools/tiffcrop.c	18 Nov 2016 14:58:46 -0000	1.46
++++ libtiff/tools/tiffcrop.c	3 Dec 2016 11:35:56 -0000	1.47
+@@ -1,4 +1,4 @@
+-/* $Id: tiffcrop.c,v 1.46 2016-11-18 14:58:46 erouault Exp $ */
++/* $Id: tiffcrop.c,v 1.47 2016-12-03 11:35:56 erouault Exp $ */
+ 
+ /* tiffcrop.c -- a port of tiffcp.c extended to include manipulations of
+  * the image data through additional options listed below
+@@ -3698,7 +3698,7 @@
+                                   (unsigned long) strip, (unsigned long)rows);
+                         return 0;
+                 }
+-                bufp += bytes_read;
++                bufp += stripsize;
+         }
+ 
+         return 1;
diff --git a/gnu/packages/patches/libtiff-CVE-2016-10093.patch b/gnu/packages/patches/libtiff-CVE-2016-10093.patch
new file mode 100644
index 0000000000..5897ec1029
--- /dev/null
+++ b/gnu/packages/patches/libtiff-CVE-2016-10093.patch
@@ -0,0 +1,53 @@
+Fix CVE-2016-10093:
+
+http://bugzilla.maptools.org/show_bug.cgi?id=2610
+https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10093
+https://security-tracker.debian.org/tracker/CVE-2016-10093
+
+2016-12-03 Even Rouault <even.rouault at spatialys.com>
+
+        * tools/tiffcp.c: fix uint32 underflow/overflow that can cause
+	heap-based buffer overflow.
+        Reported by Agostino Sarubbo.
+        Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2610
+
+/cvs/maptools/cvsroot/libtiff/ChangeLog,v  <--  ChangeLog
+new revision: 1.1187; previous revision: 1.1186
+/cvs/maptools/cvsroot/libtiff/tools/tiffcp.c,v  <--  tools/tiffcp.c
+new revision: 1.59; previous revision: 1.58
+
+Index: libtiff/tools/tiffcp.c
+===================================================================
+RCS file: /cvs/maptools/cvsroot/libtiff/tools/tiffcp.c,v
+retrieving revision 1.58
+retrieving revision 1.59
+diff -u -r1.58 -r1.59
+--- libtiff/tools/tiffcp.c	3 Dec 2016 15:44:15 -0000	1.58
++++ libtiff/tools/tiffcp.c	3 Dec 2016 16:40:01 -0000	1.59
+@@ -1163,7 +1163,7 @@
+ 
+ static void
+ cpStripToTile(uint8* out, uint8* in,
+-    uint32 rows, uint32 cols, int outskew, int inskew)
++    uint32 rows, uint32 cols, int outskew, int64 inskew)
+ {
+ 	while (rows-- > 0) {
+ 		uint32 j = cols;
+@@ -1320,7 +1320,7 @@
+ 	tdata_t tilebuf;
+ 	uint32 imagew = TIFFScanlineSize(in);
+ 	uint32 tilew  = TIFFTileRowSize(in);
+-	int iskew = imagew - tilew;
++	int64 iskew = (int64)imagew - (int64)tilew;
+ 	uint8* bufp = (uint8*) buf;
+ 	uint32 tw, tl;
+ 	uint32 row;
+@@ -1348,7 +1348,7 @@
+ 				status = 0;
+ 				goto done;
+ 			}
+-			if (colb + tilew > imagew) {
++			if (colb > iskew) {
+ 				uint32 width = imagew - colb;
+ 				uint32 oskew = tilew - width;
+ 				cpStripToTile(bufp + colb,
diff --git a/gnu/packages/patches/libtiff-CVE-2016-10094.patch b/gnu/packages/patches/libtiff-CVE-2016-10094.patch
new file mode 100644
index 0000000000..9018773565
--- /dev/null
+++ b/gnu/packages/patches/libtiff-CVE-2016-10094.patch
@@ -0,0 +1,34 @@
+Fix CVE-2016-10094:
+
+http://bugzilla.maptools.org/show_bug.cgi?id=2640
+https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10094
+https://security-tracker.debian.org/tracker/CVE-2016-10094
+
+2016-12-20 Even Rouault <even.rouault at spatialys.com>
+
+        * tools/tiff2pdf.c: avoid potential heap-based overflow in
+        t2p_readwrite_pdf_image_tile().
+        Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2640
+
+/cvs/maptools/cvsroot/libtiff/ChangeLog,v  <--  ChangeLog
+new revision: 1.1199; previous revision: 1.1198
+/cvs/maptools/cvsroot/libtiff/tools/tiff2pdf.c,v  <--  tools/tiff2pdf.c
+new revision: 1.101; previous revision: 1.100
+
+Index: libtiff/tools/tiff2pdf.c
+===================================================================
+RCS file: /cvs/maptools/cvsroot/libtiff/tools/tiff2pdf.c,v
+retrieving revision 1.100
+retrieving revision 1.101
+diff -u -r1.100 -r1.101
+--- libtiff/tools/tiff2pdf.c	20 Dec 2016 17:24:35 -0000	1.100
++++ libtiff/tools/tiff2pdf.c	20 Dec 2016 17:28:17 -0000	1.101
+@@ -2895,7 +2895,7 @@
+ 				return(0);
+ 			}
+ 			if(TIFFGetField(input, TIFFTAG_JPEGTABLES, &count, &jpt) != 0) {
+-				if (count >= 4) {
++				if (count > 4) {
+                                         int retTIFFReadRawTile;
+                     /* Ignore EOI marker of JpegTables */
+ 					_TIFFmemcpy(buffer, jpt, count - 2);
diff --git a/gnu/packages/patches/libtiff-assertion-failure.patch b/gnu/packages/patches/libtiff-assertion-failure.patch
new file mode 100644
index 0000000000..ef747fbdd7
--- /dev/null
+++ b/gnu/packages/patches/libtiff-assertion-failure.patch
@@ -0,0 +1,60 @@
+Fix assertion failure in readSeparateTilesIntoBuffer():
+
+http://bugzilla.maptools.org/show_bug.cgi?id=2605
+
+2016-12-03 Even Rouault <even.rouault at spatialys.com>
+
+        * tools/tiffcp.c: replace assert( (bps % 8) == 0 ) by a non assert
+check.
+        Reported by Agostino Sarubbo.
+        Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2605
+
+/cvs/maptools/cvsroot/libtiff/ChangeLog,v  <--  ChangeLog
+new revision: 1.1188; previous revision: 1.1187
+/cvs/maptools/cvsroot/libtiff/tools/tiffcp.c,v  <--  tools/tiffcp.c
+new revision: 1.60; previous revision: 1.59
+
+Index: libtiff/tools/tiffcp.c
+===================================================================
+RCS file: /cvs/maptools/cvsroot/libtiff/tools/tiffcp.c,v
+retrieving revision 1.59
+retrieving revision 1.60
+diff -u -r1.59 -r1.60
+--- libtiff/tools/tiffcp.c	3 Dec 2016 16:40:01 -0000	1.59
++++ libtiff/tools/tiffcp.c	3 Dec 2016 16:50:02 -0000	1.60
+@@ -45,7 +45,6 @@
+ #include <string.h>
+ 
+ #include <ctype.h>
+-#include <assert.h>
+ 
+ #ifdef HAVE_UNISTD_H
+ # include <unistd.h>
+@@ -1393,7 +1392,12 @@
+             status = 0;
+             goto done;
+         }
+-	assert( bps % 8 == 0 );
++        if( (bps % 8) != 0 )
++        {
++            TIFFError(TIFFFileName(in), "Error, cannot handle BitsPerSample that is not a multiple of 8");
++            status = 0;
++            goto done;
++        }
+ 	bytes_per_sample = bps/8;
+ 
+ 	for (row = 0; row < imagelength; row += tl) {
+@@ -1584,7 +1588,12 @@
+             _TIFFfree(obuf);
+             return 0;
+         }
+-	assert( bps % 8 == 0 );
++        if( (bps % 8) != 0 )
++        {
++            TIFFError(TIFFFileName(out), "Error, cannot handle BitsPerSample that is not a multiple of 8");
++            _TIFFfree(obuf);
++            return 0;
++        }
+ 	bytes_per_sample = bps/8;
+ 
+ 	for (row = 0; row < imagelength; row += tl) {
diff --git a/gnu/packages/patches/libtiff-divide-by-zero-ojpeg.patch b/gnu/packages/patches/libtiff-divide-by-zero-ojpeg.patch
new file mode 100644
index 0000000000..2a96b68521
--- /dev/null
+++ b/gnu/packages/patches/libtiff-divide-by-zero-ojpeg.patch
@@ -0,0 +1,63 @@
+Fix divide-by-zero in OJPEGDecodeRaw():
+
+http://bugzilla.maptools.org/show_bug.cgi?id=2611
+
+2016-12-03 Even Rouault <even.rouault at spatialys.com>
+
+        * libtiff/tif_ojpeg.c: make OJPEGDecode() early exit in case of failure
+in
+        OJPEGPreDecode(). This will avoid a divide by zero, and potential other
+issues.
+        Reported by Agostino Sarubbo.
+        Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2611
+
+/cvs/maptools/cvsroot/libtiff/ChangeLog,v  <--  ChangeLog
+new revision: 1.1177; previous revision: 1.1176
+/cvs/maptools/cvsroot/libtiff/libtiff/tif_ojpeg.c,v  <--  libtiff/tif_ojpeg.c
+new revision: 1.66; previous revision: 1.65
+
+Index: libtiff/libtiff/tif_ojpeg.c
+===================================================================
+RCS file: /cvs/maptools/cvsroot/libtiff/libtiff/tif_ojpeg.c,v
+retrieving revision 1.65
+retrieving revision 1.66
+diff -u -r1.65 -r1.66
+--- libtiff/libtiff/tif_ojpeg.c	4 Sep 2016 21:32:56 -0000	1.65
++++ libtiff/libtiff/tif_ojpeg.c	3 Dec 2016 11:15:18 -0000	1.66
+@@ -1,4 +1,4 @@
+-/* $Id: tif_ojpeg.c,v 1.65 2016-09-04 21:32:56 erouault Exp $ */
++/* $Id: tif_ojpeg.c,v 1.66 2016-12-03 11:15:18 erouault Exp $ */
+ 
+ /* WARNING: The type of JPEG encapsulation defined by the TIFF Version 6.0
+    specification is now totally obsolete and deprecated for new applications and
+@@ -244,6 +244,7 @@
+ 
+ typedef struct {
+ 	TIFF* tif;
++        int decoder_ok;
+ 	#ifndef LIBJPEG_ENCAP_EXTERNAL
+ 	JMP_BUF exit_jmpbuf;
+ 	#endif
+@@ -722,6 +723,7 @@
+ 		}
+ 		sp->write_curstrile++;
+ 	}
++	sp->decoder_ok = 1;
+ 	return(1);
+ }
+ 
+@@ -784,8 +786,14 @@
+ static int
+ OJPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
+ {
++        static const char module[]="OJPEGDecode";
+ 	OJPEGState* sp=(OJPEGState*)tif->tif_data;
+ 	(void)s;
++        if( !sp->decoder_ok )
++        {
++            TIFFErrorExt(tif->tif_clientdata,module,"Cannot decode: decoder not correctly initialized");
++            return 0;
++        }
+ 	if (sp->libjpeg_jpeg_query_style==0)
+ 	{
+ 		if (OJPEGDecodeRaw(tif,buf,cc)==0)
diff --git a/gnu/packages/patches/libtiff-divide-by-zero-tiffcp.patch b/gnu/packages/patches/libtiff-divide-by-zero-tiffcp.patch
new file mode 100644
index 0000000000..d3f1c2b60e
--- /dev/null
+++ b/gnu/packages/patches/libtiff-divide-by-zero-tiffcp.patch
@@ -0,0 +1,104 @@
+Fix two divide-by-zero bugs in readSeparateTilesIntoBuffer():
+
+http://bugzilla.maptools.org/show_bug.cgi?id=2597
+http://bugzilla.maptools.org/show_bug.cgi?id=2607
+
+2016-12-03 Even Rouault <even.rouault at spatialys.com>
+
+        * tools/tiffcp.c: avoid potential division by zero is BitsPerSamples
+tag is
+        missing.
+        Reported by Agostino sarubbo.
+        Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2597
+
+/cvs/maptools/cvsroot/libtiff/ChangeLog,v  <--  ChangeLog
+new revision: 1.1183; previous revision: 1.1182
+/cvs/maptools/cvsroot/libtiff/tools/tiffcp.c,v  <--  tools/tiffcp.c
+new revision: 1.57; previous revision: 1.56
+
+Index: libtiff/tools/tiffcp.c
+===================================================================
+RCS file: /cvs/maptools/cvsroot/libtiff/tools/tiffcp.c,v
+retrieving revision 1.56
+retrieving revision 1.57
+diff -u -r1.56 -r1.57
+--- libtiff/tools/tiffcp.c	2 Dec 2016 22:13:32 -0000	1.56
++++ libtiff/tools/tiffcp.c	3 Dec 2016 14:42:40 -0000	1.57
+@@ -1,4 +1,4 @@
+-/* $Id: tiffcp.c,v 1.56 2016-12-02 22:13:32 erouault Exp $ */
++/* $Id: tiffcp.c,v 1.57 2016-12-03 14:42:40 erouault Exp $ */
+ 
+ /*
+  * Copyright (c) 1988-1997 Sam Leffler
+@@ -1378,7 +1378,7 @@
+ 	uint8* bufp = (uint8*) buf;
+ 	uint32 tw, tl;
+ 	uint32 row;
+-	uint16 bps, bytes_per_sample;
++	uint16 bps = 0, bytes_per_sample;
+ 
+ 	tilebuf = _TIFFmalloc(tilesize);
+ 	if (tilebuf == 0)
+@@ -1387,6 +1387,12 @@
+ 	(void) TIFFGetField(in, TIFFTAG_TILEWIDTH, &tw);
+ 	(void) TIFFGetField(in, TIFFTAG_TILELENGTH, &tl);
+ 	(void) TIFFGetField(in, TIFFTAG_BITSPERSAMPLE, &bps);
++        if( bps == 0 )
++        {
++            TIFFError(TIFFFileName(in), "Error, cannot read BitsPerSample");
++            status = 0;
++            goto done;
++        }
+ 	assert( bps % 8 == 0 );
+ 	bytes_per_sample = bps/8;
+
+2016-12-03 Even Rouault <even.rouault at spatialys.com>
+
+        * tools/tiffcp.c: avoid potential division by zero is BitsPerSamples
+tag is
+        missing.
+        Reported by Agostino Sarubbo.
+        Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2607
+
+
+/cvs/maptools/cvsroot/libtiff/ChangeLog,v  <--  ChangeLog
+new revision: 1.1186; previous revision: 1.1185
+/cvs/maptools/cvsroot/libtiff/tools/tiffcp.c,v  <--  tools/tiffcp.c
+new revision: 1.58; previous revision: 1.57
+ 
+Index: libtiff/tools/tiffcp.c
+===================================================================
+RCS file: /cvs/maptools/cvsroot/libtiff/tools/tiffcp.c,v
+retrieving revision 1.57
+retrieving revision 1.58
+diff -u -r1.57 -r1.58
+--- libtiff/tools/tiffcp.c	3 Dec 2016 14:42:40 -0000	1.57
++++ libtiff/tools/tiffcp.c	3 Dec 2016 15:44:15 -0000	1.58
+@@ -1,4 +1,4 @@
+-/* $Id: tiffcp.c,v 1.57 2016-12-03 14:42:40 erouault Exp $ */
++/* $Id: tiffcp.c,v 1.58 2016-12-03 15:44:15 erouault Exp $ */
+ 
+ /*
+  * Copyright (c) 1988-1997 Sam Leffler
+@@ -1569,7 +1569,7 @@
+ 	uint8* bufp = (uint8*) buf;
+ 	uint32 tl, tw;
+ 	uint32 row;
+-	uint16 bps, bytes_per_sample;
++	uint16 bps = 0, bytes_per_sample;
+ 
+ 	obuf = _TIFFmalloc(TIFFTileSize(out));
+ 	if (obuf == NULL)
+@@ -1578,6 +1578,12 @@
+ 	(void) TIFFGetField(out, TIFFTAG_TILELENGTH, &tl);
+ 	(void) TIFFGetField(out, TIFFTAG_TILEWIDTH, &tw);
+ 	(void) TIFFGetField(out, TIFFTAG_BITSPERSAMPLE, &bps);
++        if( bps == 0 )
++        {
++            TIFFError(TIFFFileName(out), "Error, cannot read BitsPerSample");
++            _TIFFfree(obuf);
++            return 0;
++        }
+ 	assert( bps % 8 == 0 );
+ 	bytes_per_sample = bps/8;
+ 
diff --git a/gnu/packages/patches/libtiff-divide-by-zero-tiffcrop.patch b/gnu/packages/patches/libtiff-divide-by-zero-tiffcrop.patch
new file mode 100644
index 0000000000..823293f1cf
--- /dev/null
+++ b/gnu/packages/patches/libtiff-divide-by-zero-tiffcrop.patch
@@ -0,0 +1,57 @@
+Fix divide-by-zero in readSeparateStripsIntoBuffer():
+
+http://bugzilla.maptools.org/show_bug.cgi?id=2619
+
+2016-12-03 Even Rouault <even.rouault at spatialys.com>
+
+        * tools/tiffcrop.c: fix integer division by zero when BitsPerSample is
+missing.
+        Reported by Agostina Sarubo.
+        Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2619
+
+/cvs/maptools/cvsroot/libtiff/ChangeLog,v  <--  ChangeLog
+new revision: 1.1180; previous revision: 1.1179
+/cvs/maptools/cvsroot/libtiff/tools/tiffcrop.c,v  <--  tools/tiffcrop.c
+new revision: 1.49; previous revision: 1.48
+
+Index: libtiff/tools/tiffcrop.c
+===================================================================
+RCS file: /cvs/maptools/cvsroot/libtiff/tools/tiffcrop.c,v
+retrieving revision 1.48
+retrieving revision 1.49
+diff -u -r1.48 -r1.49
+--- libtiff/tools/tiffcrop.c	3 Dec 2016 12:19:32 -0000	1.48
++++ libtiff/tools/tiffcrop.c	3 Dec 2016 13:00:04 -0000	1.49
+@@ -1,4 +1,4 @@
+-/* $Id: tiffcrop.c,v 1.48 2016-12-03 12:19:32 erouault Exp $ */
++/* $Id: tiffcrop.c,v 1.49 2016-12-03 13:00:04 erouault Exp $ */
+ 
+ /* tiffcrop.c -- a port of tiffcp.c extended to include manipulations of
+  * the image data through additional options listed below
+@@ -1164,7 +1164,7 @@
+   tdata_t  obuf;
+ 
+   (void) TIFFGetFieldDefaulted(out, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
+-  (void) TIFFGetField(out, TIFFTAG_BITSPERSAMPLE, &bps);
++  (void) TIFFGetFieldDefaulted(out, TIFFTAG_BITSPERSAMPLE, &bps);
+   bytes_per_sample = (bps + 7) / 8;
+   if( width == 0 ||
+       (uint32)bps * (uint32)spp > TIFF_UINT32_MAX / width ||
+@@ -4760,7 +4760,7 @@
+   int i, bytes_per_sample, bytes_per_pixel, shift_width, result = 1;
+   uint32 j;
+   int32  bytes_read = 0;
+-  uint16 bps, planar;
++  uint16 bps = 0, planar;
+   uint32 nstrips;
+   uint32 strips_per_sample;
+   uint32 src_rowsize, dst_rowsize, rows_processed, rps;
+@@ -4780,7 +4780,7 @@
+     }
+ 
+   memset (srcbuffs, '\0', sizeof(srcbuffs));
+-  TIFFGetField(in, TIFFTAG_BITSPERSAMPLE, &bps);
++  TIFFGetFieldDefaulted(in, TIFFTAG_BITSPERSAMPLE, &bps);
+   TIFFGetFieldDefaulted(in, TIFFTAG_PLANARCONFIG, &planar);
+   TIFFGetFieldDefaulted(in, TIFFTAG_ROWSPERSTRIP, &rps);
+   if (rps > length)
diff --git a/gnu/packages/patches/libtiff-divide-by-zero.patch b/gnu/packages/patches/libtiff-divide-by-zero.patch
new file mode 100644
index 0000000000..6dbd4666cd
--- /dev/null
+++ b/gnu/packages/patches/libtiff-divide-by-zero.patch
@@ -0,0 +1,67 @@
+Fix an integer overflow in TIFFReadEncodedStrip() that led to division-by-zero:
+
+http://bugzilla.maptools.org/show_bug.cgi?id=2596
+
+2016-12-02 Even Rouault <even.rouault at spatialys.com>
+
+        * libtiff/tif_read.c, libtiff/tiffiop.h: fix uint32 overflow in
+        TIFFReadEncodedStrip() that caused an integer division by zero.
+        Reported by Agostino Sarubbo.
+        Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2596
+
+
+/cvs/maptools/cvsroot/libtiff/ChangeLog,v  <--  ChangeLog
+new revision: 1.1173; previous revision: 1.1172
+/cvs/maptools/cvsroot/libtiff/libtiff/tif_read.c,v  <--  libtiff/tif_read.c
+new revision: 1.50; previous revision: 1.49
+/cvs/maptools/cvsroot/libtiff/libtiff/tiffiop.h,v  <--  libtiff/tiffiop.h
+new revision: 1.90; previous revision: 1.89
+
+Index: libtiff/libtiff/tif_read.c
+===================================================================
+RCS file: /cvs/maptools/cvsroot/libtiff/libtiff/tif_read.c,v
+retrieving revision 1.49
+retrieving revision 1.50
+diff -u -r1.49 -r1.50
+--- libtiff/libtiff/tif_read.c	10 Jul 2016 18:00:21 -0000	1.49
++++ libtiff/libtiff/tif_read.c	2 Dec 2016 21:56:56 -0000	1.50
+@@ -1,4 +1,4 @@
+-/* $Id: tif_read.c,v 1.49 2016-07-10 18:00:21 erouault Exp $ */
++/* $Id: tif_read.c,v 1.50 2016-12-02 21:56:56 erouault Exp $ */
+ 
+ /*
+  * Copyright (c) 1988-1997 Sam Leffler
+@@ -346,7 +346,7 @@
+ 	rowsperstrip=td->td_rowsperstrip;
+ 	if (rowsperstrip>td->td_imagelength)
+ 		rowsperstrip=td->td_imagelength;
+-	stripsperplane=((td->td_imagelength+rowsperstrip-1)/rowsperstrip);
++	stripsperplane= TIFFhowmany_32_maxuint_compat(td->td_imagelength, rowsperstrip);
+ 	stripinplane=(strip%stripsperplane);
+ 	plane=(uint16)(strip/stripsperplane);
+ 	rows=td->td_imagelength-stripinplane*rowsperstrip;
+Index: libtiff/libtiff/tiffiop.h
+===================================================================
+RCS file: /cvs/maptools/cvsroot/libtiff/libtiff/tiffiop.h,v
+retrieving revision 1.89
+retrieving revision 1.90
+diff -u -r1.89 -r1.90
+--- libtiff/libtiff/tiffiop.h	23 Jan 2016 21:20:34 -0000	1.89
++++ libtiff/libtiff/tiffiop.h	2 Dec 2016 21:56:56 -0000	1.90
+@@ -1,4 +1,4 @@
+-/* $Id: tiffiop.h,v 1.89 2016-01-23 21:20:34 erouault Exp $ */
++/* $Id: tiffiop.h,v 1.90 2016-12-02 21:56:56 erouault Exp $ */
+ 
+ /*
+  * Copyright (c) 1988-1997 Sam Leffler
+@@ -250,6 +250,10 @@
+ #define TIFFhowmany_32(x, y) (((uint32)x < (0xffffffff - (uint32)(y-1))) ? \
+ 			   ((((uint32)(x))+(((uint32)(y))-1))/((uint32)(y))) : \
+ 			   0U)
++/* Variant of TIFFhowmany_32() that doesn't return 0 if x close to MAXUINT. */
++/* Caution: TIFFhowmany_32_maxuint_compat(x,y)*y might overflow */
++#define TIFFhowmany_32_maxuint_compat(x, y) \
++			   (((uint32)(x) / (uint32)(y)) + ((((uint32)(x) % (uint32)(y)) != 0) ? 1 : 0))
+ #define TIFFhowmany8_32(x) (((x)&0x07)?((uint32)(x)>>3)+1:(uint32)(x)>>3)
+ #define TIFFroundup_32(x, y) (TIFFhowmany_32(x,y)*(y))
+ #define TIFFhowmany_64(x, y) ((((uint64)(x))+(((uint64)(y))-1))/((uint64)(y)))
diff --git a/gnu/packages/patches/libtiff-heap-overflow-pixarlog-luv.patch b/gnu/packages/patches/libtiff-heap-overflow-pixarlog-luv.patch
new file mode 100644
index 0000000000..2d5e23586d
--- /dev/null
+++ b/gnu/packages/patches/libtiff-heap-overflow-pixarlog-luv.patch
@@ -0,0 +1,131 @@
+Fix heap-based buffer overflow in _TIFFmemcpy():
+
+http://bugzilla.maptools.org/show_bug.cgi?id=2604
+
+2016-12-03 Even Rouault <even.rouault at spatialys.com>
+
+        * libtiff/tif_pixarlog.c, libtiff/tif_luv.c: fix heap-based buffer
+        overflow on generation of PixarLog / LUV compressed files, with
+        ColorMap, TransferFunction attached and nasty plays with bitspersample.
+        The fix for LUV has not been tested, but suffers from the same kind
+        of issue of PixarLog.
+        Reported by Agostino Sarubbo.
+        Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2604
+
+/cvs/maptools/cvsroot/libtiff/ChangeLog,v  <--  ChangeLog
+new revision: 1.1175; previous revision: 1.1174
+/cvs/maptools/cvsroot/libtiff/libtiff/tif_luv.c,v  <--  libtiff/tif_luv.c
+new revision: 1.44; previous revision: 1.43
+/cvs/maptools/cvsroot/libtiff/libtiff/tif_pixarlog.c,v  <-- 
+libtiff/tif_pixarlog.c
+new revision: 1.49; previous revision: 1.48
+
+Index: libtiff/libtiff/tif_luv.c
+===================================================================
+RCS file: /cvs/maptools/cvsroot/libtiff/libtiff/tif_luv.c,v
+retrieving revision 1.43
+retrieving revision 1.44
+diff -u -r1.43 -r1.44
+--- libtiff/libtiff/tif_luv.c	4 Sep 2016 21:32:56 -0000	1.43
++++ libtiff/libtiff/tif_luv.c	2 Dec 2016 23:05:51 -0000	1.44
+@@ -1,4 +1,4 @@
+-/* $Id: tif_luv.c,v 1.43 2016-09-04 21:32:56 erouault Exp $ */
++/* $Id: tif_luv.c,v 1.44 2016-12-02 23:05:51 erouault Exp $ */
+ 
+ /*
+  * Copyright (c) 1997 Greg Ward Larson
+@@ -158,6 +158,7 @@
+ typedef struct logLuvState LogLuvState;
+ 
+ struct logLuvState {
++        int                     encoder_state;  /* 1 if encoder correctly initialized */
+ 	int                     user_datafmt;   /* user data format */
+ 	int                     encode_meth;    /* encoding method */
+ 	int                     pixel_size;     /* bytes per pixel */
+@@ -1552,6 +1553,7 @@
+ 		    td->td_photometric, "must be either LogLUV or LogL");
+ 		break;
+ 	}
++	sp->encoder_state = 1;
+ 	return (1);
+ notsupported:
+ 	TIFFErrorExt(tif->tif_clientdata, module,
+@@ -1563,19 +1565,27 @@
+ static void
+ LogLuvClose(TIFF* tif)
+ {
++        LogLuvState* sp = (LogLuvState*) tif->tif_data;
+ 	TIFFDirectory *td = &tif->tif_dir;
+ 
++	assert(sp != 0);
+ 	/*
+ 	 * For consistency, we always want to write out the same
+ 	 * bitspersample and sampleformat for our TIFF file,
+ 	 * regardless of the data format being used by the application.
+ 	 * Since this routine is called after tags have been set but
+ 	 * before they have been recorded in the file, we reset them here.
++         * Note: this is really a nasty approach. See PixarLogClose
+ 	 */
+-	td->td_samplesperpixel =
+-	    (td->td_photometric == PHOTOMETRIC_LOGL) ? 1 : 3;
+-	td->td_bitspersample = 16;
+-	td->td_sampleformat = SAMPLEFORMAT_INT;
++        if( sp->encoder_state )
++        {
++            /* See PixarLogClose. Might avoid issues with tags whose size depends
++             * on those below, but not completely sure this is enough. */
++            td->td_samplesperpixel =
++                (td->td_photometric == PHOTOMETRIC_LOGL) ? 1 : 3;
++            td->td_bitspersample = 16;
++            td->td_sampleformat = SAMPLEFORMAT_INT;
++        }
+ }
+ 
+ static void
+Index: libtiff/libtiff/tif_pixarlog.c
+===================================================================
+RCS file: /cvs/maptools/cvsroot/libtiff/libtiff/tif_pixarlog.c,v
+retrieving revision 1.48
+retrieving revision 1.49
+diff -u -r1.48 -r1.49
+--- libtiff/libtiff/tif_pixarlog.c	23 Sep 2016 22:12:18 -0000	1.48
++++ libtiff/libtiff/tif_pixarlog.c	2 Dec 2016 23:05:51 -0000	1.49
+@@ -1,4 +1,4 @@
+-/* $Id: tif_pixarlog.c,v 1.48 2016-09-23 22:12:18 erouault Exp $ */
++/* $Id: tif_pixarlog.c,v 1.49 2016-12-02 23:05:51 erouault Exp $ */
+ 
+ /*
+  * Copyright (c) 1996-1997 Sam Leffler
+@@ -1233,8 +1233,10 @@
+ static void
+ PixarLogClose(TIFF* tif)
+ {
++        PixarLogState* sp = (PixarLogState*) tif->tif_data;
+ 	TIFFDirectory *td = &tif->tif_dir;
+ 
++	assert(sp != 0);
+ 	/* In a really sneaky (and really incorrect, and untruthful, and
+ 	 * troublesome, and error-prone) maneuver that completely goes against
+ 	 * the spirit of TIFF, and breaks TIFF, on close, we covertly
+@@ -1243,8 +1245,19 @@
+ 	 * readers that don't know about PixarLog, or how to set
+ 	 * the PIXARLOGDATFMT pseudo-tag.
+ 	 */
+-	td->td_bitspersample = 8;
+-	td->td_sampleformat = SAMPLEFORMAT_UINT;
++
++        if (sp->state&PLSTATE_INIT) {
++            /* We test the state to avoid an issue such as in
++             * http://bugzilla.maptools.org/show_bug.cgi?id=2604
++             * What appends in that case is that the bitspersample is 1 and
++             * a TransferFunction is set. The size of the TransferFunction
++             * depends on 1<<bitspersample. So if we increase it, an access
++             * out of the buffer will happen at directory flushing.
++             * Another option would be to clear those targs. 
++             */
++            td->td_bitspersample = 8;
++            td->td_sampleformat = SAMPLEFORMAT_UINT;
++        }
+ }
+ 
+ static void
diff --git a/gnu/packages/patches/libtiff-heap-overflow-tif-dirread.patch b/gnu/packages/patches/libtiff-heap-overflow-tif-dirread.patch
new file mode 100644
index 0000000000..68889b121b
--- /dev/null
+++ b/gnu/packages/patches/libtiff-heap-overflow-tif-dirread.patch
@@ -0,0 +1,132 @@
+Fix heap-based buffer overflow in TIFFFillStrip():
+
+http://bugzilla.maptools.org/show_bug.cgi?id=2608
+
+2016-12-03 Even Rouault <even.rouault at spatialys.com>
+
+        * libtiff/tif_dirread.c: modify ChopUpSingleUncompressedStrip() to
+        instanciate compute ntrips as TIFFhowmany_32(td->td_imagelength,
+rowsperstrip),
+        instead of a logic based on the total size of data. Which is faulty is
+        the total size of data is not sufficient to fill the whole image, and
+thus
+        results in reading outside of the StripByCounts/StripOffsets arrays
+when
+        using TIFFReadScanline().
+        Reported by Agostino Sarubbo.
+        Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2608.
+
+        * libtiff/tif_strip.c: revert the change in TIFFNumberOfStrips() done
+        for http://bugzilla.maptools.org/show_bug.cgi?id=2587 / CVE-2016-9273
+since
+        the above change is a better fix that makes it unnecessary.
+
+/cvs/maptools/cvsroot/libtiff/ChangeLog,v  <--  ChangeLog
+new revision: 1.1176; previous revision: 1.1175
+/cvs/maptools/cvsroot/libtiff/libtiff/tif_dirread.c,v  <-- 
+libtiff/tif_dirread.c
+new revision: 1.205; previous revision: 1.204
+/cvs/maptools/cvsroot/libtiff/libtiff/tif_strip.c,v  <--  libtiff/tif_strip.c
+new revision: 1.38; previous revision: 1.37
+
+Index: libtiff/libtiff/tif_dirread.c
+===================================================================
+RCS file: /cvs/maptools/cvsroot/libtiff/libtiff/tif_dirread.c,v
+retrieving revision 1.204
+retrieving revision 1.205
+diff -u -r1.204 -r1.205
+--- libtiff/libtiff/tif_dirread.c	16 Nov 2016 15:14:15 -0000	1.204
++++ libtiff/libtiff/tif_dirread.c	3 Dec 2016 11:02:15 -0000	1.205
+@@ -1,4 +1,4 @@
+-/* $Id: tif_dirread.c,v 1.204 2016-11-16 15:14:15 erouault Exp $ */
++/* $Id: tif_dirread.c,v 1.205 2016-12-03 11:02:15 erouault Exp $ */
+ 
+ /*
+  * Copyright (c) 1988-1997 Sam Leffler
+@@ -5502,8 +5502,7 @@
+ 	uint64 rowblockbytes;
+ 	uint64 stripbytes;
+ 	uint32 strip;
+-	uint64 nstrips64;
+-	uint32 nstrips32;
++	uint32 nstrips;
+ 	uint32 rowsperstrip;
+ 	uint64* newcounts;
+ 	uint64* newoffsets;
+@@ -5534,18 +5533,17 @@
+ 	    return;
+ 
+ 	/*
+-	 * never increase the number of strips in an image
++	 * never increase the number of rows per strip
+ 	 */
+ 	if (rowsperstrip >= td->td_rowsperstrip)
+ 		return;
+-	nstrips64 = TIFFhowmany_64(bytecount, stripbytes);
+-	if ((nstrips64==0)||(nstrips64>0xFFFFFFFF)) /* something is wonky, do nothing. */
+-	    return;
+-	nstrips32 = (uint32)nstrips64;
++        nstrips = TIFFhowmany_32(td->td_imagelength, rowsperstrip);
++        if( nstrips == 0 )
++            return;
+ 
+-	newcounts = (uint64*) _TIFFCheckMalloc(tif, nstrips32, sizeof (uint64),
++	newcounts = (uint64*) _TIFFCheckMalloc(tif, nstrips, sizeof (uint64),
+ 				"for chopped \"StripByteCounts\" array");
+-	newoffsets = (uint64*) _TIFFCheckMalloc(tif, nstrips32, sizeof (uint64),
++	newoffsets = (uint64*) _TIFFCheckMalloc(tif, nstrips, sizeof (uint64),
+ 				"for chopped \"StripOffsets\" array");
+ 	if (newcounts == NULL || newoffsets == NULL) {
+ 		/*
+@@ -5562,18 +5560,18 @@
+ 	 * Fill the strip information arrays with new bytecounts and offsets
+ 	 * that reflect the broken-up format.
+ 	 */
+-	for (strip = 0; strip < nstrips32; strip++) {
++	for (strip = 0; strip < nstrips; strip++) {
+ 		if (stripbytes > bytecount)
+ 			stripbytes = bytecount;
+ 		newcounts[strip] = stripbytes;
+-		newoffsets[strip] = offset;
++		newoffsets[strip] = stripbytes ? offset : 0;
+ 		offset += stripbytes;
+ 		bytecount -= stripbytes;
+ 	}
+ 	/*
+ 	 * Replace old single strip info with multi-strip info.
+ 	 */
+-	td->td_stripsperimage = td->td_nstrips = nstrips32;
++	td->td_stripsperimage = td->td_nstrips = nstrips;
+ 	TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rowsperstrip);
+ 
+ 	_TIFFfree(td->td_stripbytecount);
+Index: libtiff/libtiff/tif_strip.c
+===================================================================
+RCS file: /cvs/maptools/cvsroot/libtiff/libtiff/tif_strip.c,v
+retrieving revision 1.37
+retrieving revision 1.38
+diff -u -r1.37 -r1.38
+--- libtiff/libtiff/tif_strip.c	9 Nov 2016 23:00:49 -0000	1.37
++++ libtiff/libtiff/tif_strip.c	3 Dec 2016 11:02:15 -0000	1.38
+@@ -1,4 +1,4 @@
+-/* $Id: tif_strip.c,v 1.37 2016-11-09 23:00:49 erouault Exp $ */
++/* $Id: tif_strip.c,v 1.38 2016-12-03 11:02:15 erouault Exp $ */
+ 
+ /*
+  * Copyright (c) 1991-1997 Sam Leffler
+@@ -63,15 +63,6 @@
+ 	TIFFDirectory *td = &tif->tif_dir;
+ 	uint32 nstrips;
+ 
+-    /* If the value was already computed and store in td_nstrips, then return it,
+-       since ChopUpSingleUncompressedStrip might have altered and resized the
+-       since the td_stripbytecount and td_stripoffset arrays to the new value
+-       after the initial affectation of td_nstrips = TIFFNumberOfStrips() in
+-       tif_dirread.c ~line 3612.
+-       See http://bugzilla.maptools.org/show_bug.cgi?id=2587 */
+-    if( td->td_nstrips )
+-        return td->td_nstrips;
+-
+ 	nstrips = (td->td_rowsperstrip == (uint32) -1 ? 1 :
+ 	     TIFFhowmany_32(td->td_imagelength, td->td_rowsperstrip));
+ 	if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
diff --git a/gnu/packages/patches/libtiff-heap-overflow-tiffcp.patch b/gnu/packages/patches/libtiff-heap-overflow-tiffcp.patch
new file mode 100644
index 0000000000..f0fef08bf3
--- /dev/null
+++ b/gnu/packages/patches/libtiff-heap-overflow-tiffcp.patch
@@ -0,0 +1,67 @@
+Fix heap buffer overflow in tiffcp when parsing number of inks:
+
+http://bugzilla.maptools.org/show_bug.cgi?id=2599
+
+2016-12-03 Even Rouault <even.rouault at spatialys.com>
+
+        * tools/tif_dir.c: when TIFFGetField(, TIFFTAG_NUMBEROFINKS, ) is
+called,
+        limit the return number of inks to SamplesPerPixel, so that code that
+parses
+        ink names doesn't go past the end of the buffer.
+        Reported by Agostino Sarubbo.
+        Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2599
+
+
+/cvs/maptools/cvsroot/libtiff/ChangeLog,v  <--  ChangeLog
+new revision: 1.1184; previous revision: 1.1183
+/cvs/maptools/cvsroot/libtiff/libtiff/tif_dir.c,v  <--  libtiff/tif_dir.c
+new revision: 1.128; previous revision: 1.127
+
+Index: libtiff/libtiff/tif_dir.c
+===================================================================
+RCS file: /cvs/maptools/cvsroot/libtiff/libtiff/tif_dir.c,v
+retrieving revision 1.127
+retrieving revision 1.128
+diff -u -r1.127 -r1.128
+--- libtiff/libtiff/tif_dir.c	25 Oct 2016 21:35:15 -0000	1.127
++++ libtiff/libtiff/tif_dir.c	3 Dec 2016 15:30:31 -0000	1.128
+@@ -1,4 +1,4 @@
+-/* $Id: tif_dir.c,v 1.127 2016-10-25 21:35:15 erouault Exp $ */
++/* $Id: tif_dir.c,v 1.128 2016-12-03 15:30:31 erouault Exp $ */
+ 
+ /*
+  * Copyright (c) 1988-1997 Sam Leffler
+@@ -854,6 +854,32 @@
+ 	if( fip == NULL ) /* cannot happen since TIFFGetField() already checks it */
+ 	    return 0;
+ 	
++        if( tag == TIFFTAG_NUMBEROFINKS )
++        {
++            int i;
++            for (i = 0; i < td->td_customValueCount; i++) {
++                uint16 val;
++                TIFFTagValue *tv = td->td_customValues + i;
++                if (tv->info->field_tag != tag)
++                    continue;
++                val = *(uint16 *)tv->value;
++                /* Truncate to SamplesPerPixel, since the */
++                /* setting code for INKNAMES assume that there are SamplesPerPixel */
++                /* inknames. */
++                /* Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2599 */
++                if( val > td->td_samplesperpixel )
++                {
++                    TIFFWarningExt(tif->tif_clientdata,"_TIFFVGetField",
++                                   "Truncating NumberOfInks from %u to %u",
++                                   val, td->td_samplesperpixel);
++                    val = td->td_samplesperpixel;
++                }
++                *va_arg(ap, uint16*) = val;
++                return 1;
++            }
++            return 0;
++        }
++
+ 	/*
+ 	 * We want to force the custom code to be used for custom
+ 	 * fields even if the tag happens to match a well known 
diff --git a/gnu/packages/patches/libtiff-heap-overflow-tiffcrop.patch b/gnu/packages/patches/libtiff-heap-overflow-tiffcrop.patch
new file mode 100644
index 0000000000..8166c55758
--- /dev/null
+++ b/gnu/packages/patches/libtiff-heap-overflow-tiffcrop.patch
@@ -0,0 +1,60 @@
+Fix heap-based buffer overflow in combineSeparateSamples16bits():
+
+http://bugzilla.maptools.org/show_bug.cgi?id=2621
+
+2016-12-03 Even Rouault <even.rouault at spatialys.com>
+
+        * tools/tiffcrop.c: add 3 extra bytes at end of strip buffer in
+        readSeparateStripsIntoBuffer() to avoid read outside of heap allocated
+buffer.
+        Reported by Agostina Sarubo.
+        Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2621
+
+/cvs/maptools/cvsroot/libtiff/ChangeLog,v  <--  ChangeLog
+new revision: 1.1179; previous revision: 1.1178
+/cvs/maptools/cvsroot/libtiff/tools/tiffcrop.c,v  <--  tools/tiffcrop.c
+new revision: 1.48; previous revision: 1.47
+
+Index: libtiff/tools/tiffcrop.c
+===================================================================
+RCS file: /cvs/maptools/cvsroot/libtiff/tools/tiffcrop.c,v
+retrieving revision 1.47
+retrieving revision 1.48
+diff -u -r1.47 -r1.48
+--- libtiff/tools/tiffcrop.c	3 Dec 2016 11:35:56 -0000	1.47
++++ libtiff/tools/tiffcrop.c	3 Dec 2016 12:19:32 -0000	1.48
+@@ -1,4 +1,4 @@
+-/* $Id: tiffcrop.c,v 1.47 2016-12-03 11:35:56 erouault Exp $ */
++/* $Id: tiffcrop.c,v 1.48 2016-12-03 12:19:32 erouault Exp $ */
+ 
+ /* tiffcrop.c -- a port of tiffcp.c extended to include manipulations of
+  * the image data through additional options listed below
+@@ -4815,10 +4815,17 @@
+   nstrips = TIFFNumberOfStrips(in);
+   strips_per_sample = nstrips /spp;
+ 
++  /* Add 3 padding bytes for combineSeparateSamples32bits */
++  if( (size_t) stripsize > 0xFFFFFFFFU - 3U )
++  {
++      TIFFError("readSeparateStripsIntoBuffer", "Integer overflow when calculating buffer size.");
++      exit(-1);
++  }
++
+   for (s = 0; (s < spp) && (s < MAX_SAMPLES); s++)
+     {
+     srcbuffs[s] = NULL;
+-    buff = _TIFFmalloc(stripsize);
++    buff = _TIFFmalloc(stripsize + 3);
+     if (!buff)
+       {
+       TIFFError ("readSeparateStripsIntoBuffer", 
+@@ -4827,6 +4834,9 @@
+         _TIFFfree (srcbuffs[i]);
+       return 0;
+       }
++    buff[stripsize] = 0;
++    buff[stripsize+1] = 0;
++    buff[stripsize+2] = 0;
+     srcbuffs[s] = buff;
+     }
+ 
diff --git a/gnu/packages/patches/libtiff-invalid-read.patch b/gnu/packages/patches/libtiff-invalid-read.patch
new file mode 100644
index 0000000000..92742d8757
--- /dev/null
+++ b/gnu/packages/patches/libtiff-invalid-read.patch
@@ -0,0 +1,64 @@
+Fix invalid read in t2p_writeproc():
+
+http://bugzilla.maptools.org/show_bug.cgi?id=2639
+
+2016-12-20 Even Rouault <even.rouault at spatialys.com>
+
+        * tools/tiff2pdf.c: avoid potential invalid memory read in
+        t2p_writeproc.
+        Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2639
+
+
+/cvs/maptools/cvsroot/libtiff/ChangeLog,v  <--  ChangeLog
+new revision: 1.1198; previous revision: 1.1197
+/cvs/maptools/cvsroot/libtiff/tools/tiff2pdf.c,v  <--  tools/tiff2pdf.c
+new revision: 1.100; previous revision: 1.99
+
+Index: libtiff/tools/tiff2pdf.c
+===================================================================
+RCS file: /cvs/maptools/cvsroot/libtiff/tools/tiff2pdf.c,v
+retrieving revision 1.99
+retrieving revision 1.100
+diff -u -r1.99 -r1.100
+--- libtiff/tools/tiff2pdf.c	20 Dec 2016 17:13:26 -0000	1.99
++++ libtiff/tools/tiff2pdf.c	20 Dec 2016 17:24:35 -0000	1.100
+@@ -2896,6 +2896,7 @@
+ 			}
+ 			if(TIFFGetField(input, TIFFTAG_JPEGTABLES, &count, &jpt) != 0) {
+ 				if (count >= 4) {
++                                        int retTIFFReadRawTile;
+                     /* Ignore EOI marker of JpegTables */
+ 					_TIFFmemcpy(buffer, jpt, count - 2);
+ 					bufferoffset += count - 2;
+@@ -2903,22 +2904,23 @@
+ 					table_end[0] = buffer[bufferoffset-2];
+ 					table_end[1] = buffer[bufferoffset-1];
+ 					xuint32 = bufferoffset;
+-                    bufferoffset -= 2;
+-					bufferoffset += TIFFReadRawTile(
++                                        bufferoffset -= 2;
++                                        retTIFFReadRawTile= TIFFReadRawTile(
+ 						input, 
+ 						tile, 
+ 						(tdata_t) &(((unsigned char*)buffer)[bufferoffset]), 
+ 						-1);
++                                        if( retTIFFReadRawTile < 0 )
++                                        {
++                                            _TIFFfree(buffer);
++                                            t2p->t2p_error = T2P_ERR_ERROR;
++                                            return(0);
++                                        }
++					bufferoffset += retTIFFReadRawTile;
+                     /* Overwrite SOI marker of image scan with previously */
+                     /* saved end of JpegTables */
+ 					buffer[xuint32-2]=table_end[0];
+ 					buffer[xuint32-1]=table_end[1];
+-				} else {
+-					bufferoffset += TIFFReadRawTile(
+-						input, 
+-						tile, 
+-						(tdata_t) &(((unsigned char*)buffer)[bufferoffset]), 
+-						-1);
+ 				}
+ 			}
+ 			t2pWriteFile(output, (tdata_t) buffer, bufferoffset);
diff --git a/gnu/packages/patches/libtiff-null-dereference.patch b/gnu/packages/patches/libtiff-null-dereference.patch
new file mode 100644
index 0000000000..8c6345b804
--- /dev/null
+++ b/gnu/packages/patches/libtiff-null-dereference.patch
@@ -0,0 +1,42 @@
+Fix NULL pointer dereference in TIFFReadRawData():
+
+http://bugzilla.maptools.org/show_bug.cgi?id=2594
+
+
+2016-12-03 Even Rouault <even.rouault at spatialys.com>
+
+        * tools/tiffinfo.c: fix null pointer dereference in -r mode when
+        * the
+image has
+        no StripByteCount tag.
+        Reported by Agostino Sarubbo.
+        Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2594
+
+/cvs/maptools/cvsroot/libtiff/ChangeLog,v  <--  ChangeLog
+new revision: 1.1182; previous revision: 1.1181
+/cvs/maptools/cvsroot/libtiff/tools/tiffinfo.c,v  <--  tools/tiffinfo.c
+new revision: 1.26; previous revision: 1.25
+
+Index: libtiff/tools/tiffinfo.c
+===================================================================
+RCS file: /cvs/maptools/cvsroot/libtiff/tools/tiffinfo.c,v
+retrieving revision 1.25
+retrieving revision 1.26
+diff -u -r1.25 -r1.26
+--- libtiff/tools/tiffinfo.c	12 Nov 2016 20:06:05 -0000	1.25
++++ libtiff/tools/tiffinfo.c	3 Dec 2016 14:18:49 -0000	1.26
+@@ -1,4 +1,4 @@
+-/* $Id: tiffinfo.c,v 1.25 2016-11-12 20:06:05 bfriesen Exp $ */
++/* $Id: tiffinfo.c,v 1.26 2016-12-03 14:18:49 erouault Exp $ */
+ 
+ /*
+  * Copyright (c) 1988-1997 Sam Leffler
+@@ -417,7 +417,7 @@
+ 	uint64* stripbc=NULL;
+ 
+ 	TIFFGetField(tif, TIFFTAG_STRIPBYTECOUNTS, &stripbc);
+-	if (nstrips > 0) {
++	if (stripbc != NULL && nstrips > 0) {
+ 		uint32 bufsize = (uint32) stripbc[0];
+ 		tdata_t buf = _TIFFmalloc(bufsize);
+ 		tstrip_t s;
diff --git a/gnu/packages/patches/libtiff-tiffcp-underflow.patch b/gnu/packages/patches/libtiff-tiffcp-underflow.patch
new file mode 100644
index 0000000000..5615cbb3e1
--- /dev/null
+++ b/gnu/packages/patches/libtiff-tiffcp-underflow.patch
@@ -0,0 +1,41 @@
+Fix a integer underflow in tiffcp that led to heap overflows in
+TIFFReverseBits():
+
+http://bugzilla.maptools.org/show_bug.cgi?id=2598
+
+2016-12-02 Even Rouault <even.rouault at spatialys.com>
+
+        * tools/tiffcp.c: avoid uint32 underflow in cpDecodedStrips that 
+        can cause various issues, such as buffer overflows in the library.
+        Reported by Agostino Sarubbo.
+        Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2598
+
+
+/cvs/maptools/cvsroot/libtiff/ChangeLog,v  <--  ChangeLog
+new revision: 1.1174; previous revision: 1.1173
+/cvs/maptools/cvsroot/libtiff/tools/tiffcp.c,v  <--  tools/tiffcp.c
+new revision: 1.56; previous revision: 1.55
+
+Index: libtiff/tools/tiffcp.c
+===================================================================
+RCS file: /cvs/maptools/cvsroot/libtiff/tools/tiffcp.c,v
+retrieving revision 1.55
+retrieving revision 1.56
+diff -u -r1.55 -r1.56
+--- libtiff/tools/tiffcp.c	8 Oct 2016 15:54:57 -0000	1.55
++++ libtiff/tools/tiffcp.c	2 Dec 2016 22:13:32 -0000	1.56
+@@ -1,4 +1,4 @@
+-/* $Id: tiffcp.c,v 1.55 2016-10-08 15:54:57 erouault Exp $ */
++/* $Id: tiffcp.c,v 1.56 2016-12-02 22:13:32 erouault Exp $ */
+ 
+ /*
+  * Copyright (c) 1988-1997 Sam Leffler
+@@ -985,7 +985,7 @@
+ 		tstrip_t s, ns = TIFFNumberOfStrips(in);
+ 		uint32 row = 0;
+ 		_TIFFmemset(buf, 0, stripsize);
+-		for (s = 0; s < ns; s++) {
++		for (s = 0; s < ns && row < imagelength; s++) {
+ 			tsize_t cc = (row + rowsperstrip > imagelength) ?
+ 			    TIFFVStripSize(in, imagelength - row) : stripsize;
+ 			if (TIFFReadEncodedStrip(in, s, buf, cc) < 0
diff --git a/gnu/packages/patches/libupnp-CVE-2016-8863.patch b/gnu/packages/patches/libupnp-CVE-2016-8863.patch
new file mode 100644
index 0000000000..9978b39487
--- /dev/null
+++ b/gnu/packages/patches/libupnp-CVE-2016-8863.patch
@@ -0,0 +1,72 @@
+Fix CVE-2016-8863:
+
+https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-8863
+https://sourceforge.net/p/pupnp/bugs/133/
+
+Patch copied from upstream source repository:
+
+https://sourceforge.net/p/pupnp/code/ci/9c099c2923ab4d98530ab5204af1738be5bddba7/
+
+From 9c099c2923ab4d98530ab5204af1738be5bddba7 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= <ukleinek@debian.org>
+Date: Thu, 8 Dec 2016 17:11:53 +0100
+Subject: [PATCH] Fix out-of-bound access in create_url_list() (CVE-2016-8863)
+
+If there is an invalid URL in URLS->buf after a valid one, uri_parse is
+called with out pointing after the allocated memory. As uri_parse writes
+to *out before returning an error the loop in create_url_list must be
+stopped early to prevent an out-of-bound access
+
+Bug: https://sourceforge.net/p/pupnp/bugs/133/
+Bug-CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-8863
+Bug-Debian: https://bugs.debian.org/842093
+Bug-Redhat: https://bugzilla.redhat.com/show_bug.cgi?id=1388771
+(cherry picked from commit a0f6e719bc03c4d2fe6a4a42ef6b8761446f520b)
+---
+ upnp/src/gena/gena_device.c | 17 ++++++++++++-----
+ 1 file changed, 12 insertions(+), 5 deletions(-)
+
+diff --git a/upnp/src/gena/gena_device.c b/upnp/src/gena/gena_device.c
+index fb04a29..245c56b 100644
+--- a/upnp/src/gena/gena_device.c
++++ b/upnp/src/gena/gena_device.c
+@@ -1113,7 +1113,7 @@ static int create_url_list(
+ 	/*! [out] . */
+ 	URL_list *out)
+ {
+-    size_t URLcount = 0;
++    size_t URLcount = 0, URLcount2 = 0;
+     size_t i;
+     int return_code = 0;
+     uri_type temp;
+@@ -1155,16 +1155,23 @@ static int create_url_list(
+         }
+         memcpy( out->URLs, URLS->buff, URLS->size );
+         out->URLs[URLS->size] = 0;
+-        URLcount = 0;
+         for( i = 0; i < URLS->size; i++ ) {
+             if( ( URLS->buff[i] == '<' ) && ( i + 1 < URLS->size ) ) {
+                 if( ( ( return_code =
+                         parse_uri( &out->URLs[i + 1], URLS->size - i + 1,
+-                                   &out->parsedURLs[URLcount] ) ) ==
++                                   &out->parsedURLs[URLcount2] ) ) ==
+                       HTTP_SUCCESS )
+-                    && ( out->parsedURLs[URLcount].hostport.text.size !=
++                    && ( out->parsedURLs[URLcount2].hostport.text.size !=
+                          0 ) ) {
+-                    URLcount++;
++                    URLcount2++;
++                    if (URLcount2 >= URLcount)
++                        /*
++                         * break early here in case there is a bogus URL that
++                         * was skipped above. This prevents to access
++                         * out->parsedURLs[URLcount] which is beyond the
++                         * allocation.
++                         */
++                        break;
+                 } else {
+                     if( return_code == UPNP_E_OUTOF_MEMORY ) {
+                         free( out->URLs );
+-- 
+2.11.0
+
diff --git a/gnu/packages/patches/libxml2-CVE-2016-4658.patch b/gnu/packages/patches/libxml2-CVE-2016-4658.patch
new file mode 100644
index 0000000000..a4e1f31fae
--- /dev/null
+++ b/gnu/packages/patches/libxml2-CVE-2016-4658.patch
@@ -0,0 +1,257 @@
+Fix CVE-2016-4658:
+
+https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-4658
+
+Patch copied from upstream source repository:
+
+https://git.gnome.org/browse/libxml2/commit/?id=c1d1f7121194036608bf555f08d3062a36fd344b
+
+From c1d1f7121194036608bf555f08d3062a36fd344b Mon Sep 17 00:00:00 2001
+From: Nick Wellnhofer <wellnhofer@aevum.de>
+Date: Tue, 28 Jun 2016 18:34:52 +0200
+Subject: [PATCH] Disallow namespace nodes in XPointer ranges
+
+Namespace nodes must be copied to avoid use-after-free errors.
+But they don't necessarily have a physical representation in a
+document, so simply disallow them in XPointer ranges.
+
+Found with afl-fuzz.
+
+Fixes CVE-2016-4658.
+---
+ xpointer.c | 149 +++++++++++++++++++++++--------------------------------------
+ 1 file changed, 56 insertions(+), 93 deletions(-)
+
+diff --git a/xpointer.c b/xpointer.c
+index a7b03fbd..694d120e 100644
+--- a/xpointer.c
++++ b/xpointer.c
+@@ -320,6 +320,45 @@ xmlXPtrRangesEqual(xmlXPathObjectPtr range1, xmlXPathObjectPtr range2) {
+ }
+ 
+ /**
++ * xmlXPtrNewRangeInternal:
++ * @start:  the starting node
++ * @startindex:  the start index
++ * @end:  the ending point
++ * @endindex:  the ending index
++ *
++ * Internal function to create a new xmlXPathObjectPtr of type range
++ *
++ * Returns the newly created object.
++ */
++static xmlXPathObjectPtr
++xmlXPtrNewRangeInternal(xmlNodePtr start, int startindex,
++                        xmlNodePtr end, int endindex) {
++    xmlXPathObjectPtr ret;
++
++    /*
++     * Namespace nodes must be copied (see xmlXPathNodeSetDupNs).
++     * Disallow them for now.
++     */
++    if ((start != NULL) && (start->type == XML_NAMESPACE_DECL))
++	return(NULL);
++    if ((end != NULL) && (end->type == XML_NAMESPACE_DECL))
++	return(NULL);
++
++    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
++    if (ret == NULL) {
++        xmlXPtrErrMemory("allocating range");
++	return(NULL);
++    }
++    memset(ret, 0, sizeof(xmlXPathObject));
++    ret->type = XPATH_RANGE;
++    ret->user = start;
++    ret->index = startindex;
++    ret->user2 = end;
++    ret->index2 = endindex;
++    return(ret);
++}
++
++/**
+  * xmlXPtrNewRange:
+  * @start:  the starting node
+  * @startindex:  the start index
+@@ -344,17 +383,7 @@ xmlXPtrNewRange(xmlNodePtr start, int startindex,
+     if (endindex < 0)
+ 	return(NULL);
+ 
+-    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
+-    if (ret == NULL) {
+-        xmlXPtrErrMemory("allocating range");
+-	return(NULL);
+-    }
+-    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
+-    ret->type = XPATH_RANGE;
+-    ret->user = start;
+-    ret->index = startindex;
+-    ret->user2 = end;
+-    ret->index2 = endindex;
++    ret = xmlXPtrNewRangeInternal(start, startindex, end, endindex);
+     xmlXPtrRangeCheckOrder(ret);
+     return(ret);
+ }
+@@ -381,17 +410,8 @@ xmlXPtrNewRangePoints(xmlXPathObjectPtr start, xmlXPathObjectPtr end) {
+     if (end->type != XPATH_POINT)
+ 	return(NULL);
+ 
+-    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
+-    if (ret == NULL) {
+-        xmlXPtrErrMemory("allocating range");
+-	return(NULL);
+-    }
+-    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
+-    ret->type = XPATH_RANGE;
+-    ret->user = start->user;
+-    ret->index = start->index;
+-    ret->user2 = end->user;
+-    ret->index2 = end->index;
++    ret = xmlXPtrNewRangeInternal(start->user, start->index, end->user,
++                                  end->index);
+     xmlXPtrRangeCheckOrder(ret);
+     return(ret);
+ }
+@@ -416,17 +436,7 @@ xmlXPtrNewRangePointNode(xmlXPathObjectPtr start, xmlNodePtr end) {
+     if (start->type != XPATH_POINT)
+ 	return(NULL);
+ 
+-    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
+-    if (ret == NULL) {
+-        xmlXPtrErrMemory("allocating range");
+-	return(NULL);
+-    }
+-    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
+-    ret->type = XPATH_RANGE;
+-    ret->user = start->user;
+-    ret->index = start->index;
+-    ret->user2 = end;
+-    ret->index2 = -1;
++    ret = xmlXPtrNewRangeInternal(start->user, start->index, end, -1);
+     xmlXPtrRangeCheckOrder(ret);
+     return(ret);
+ }
+@@ -453,17 +463,7 @@ xmlXPtrNewRangeNodePoint(xmlNodePtr start, xmlXPathObjectPtr end) {
+     if (end->type != XPATH_POINT)
+ 	return(NULL);
+ 
+-    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
+-    if (ret == NULL) {
+-        xmlXPtrErrMemory("allocating range");
+-	return(NULL);
+-    }
+-    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
+-    ret->type = XPATH_RANGE;
+-    ret->user = start;
+-    ret->index = -1;
+-    ret->user2 = end->user;
+-    ret->index2 = end->index;
++    ret = xmlXPtrNewRangeInternal(start, -1, end->user, end->index);
+     xmlXPtrRangeCheckOrder(ret);
+     return(ret);
+ }
+@@ -486,17 +486,7 @@ xmlXPtrNewRangeNodes(xmlNodePtr start, xmlNodePtr end) {
+     if (end == NULL)
+ 	return(NULL);
+ 
+-    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
+-    if (ret == NULL) {
+-        xmlXPtrErrMemory("allocating range");
+-	return(NULL);
+-    }
+-    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
+-    ret->type = XPATH_RANGE;
+-    ret->user = start;
+-    ret->index = -1;
+-    ret->user2 = end;
+-    ret->index2 = -1;
++    ret = xmlXPtrNewRangeInternal(start, -1, end, -1);
+     xmlXPtrRangeCheckOrder(ret);
+     return(ret);
+ }
+@@ -516,17 +506,7 @@ xmlXPtrNewCollapsedRange(xmlNodePtr start) {
+     if (start == NULL)
+ 	return(NULL);
+ 
+-    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
+-    if (ret == NULL) {
+-        xmlXPtrErrMemory("allocating range");
+-	return(NULL);
+-    }
+-    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
+-    ret->type = XPATH_RANGE;
+-    ret->user = start;
+-    ret->index = -1;
+-    ret->user2 = NULL;
+-    ret->index2 = -1;
++    ret = xmlXPtrNewRangeInternal(start, -1, NULL, -1);
+     return(ret);
+ }
+ 
+@@ -541,6 +521,8 @@ xmlXPtrNewCollapsedRange(xmlNodePtr start) {
+  */
+ xmlXPathObjectPtr
+ xmlXPtrNewRangeNodeObject(xmlNodePtr start, xmlXPathObjectPtr end) {
++    xmlNodePtr endNode;
++    int endIndex;
+     xmlXPathObjectPtr ret;
+ 
+     if (start == NULL)
+@@ -549,7 +531,12 @@ xmlXPtrNewRangeNodeObject(xmlNodePtr start, xmlXPathObjectPtr end) {
+ 	return(NULL);
+     switch (end->type) {
+ 	case XPATH_POINT:
++	    endNode = end->user;
++	    endIndex = end->index;
++	    break;
+ 	case XPATH_RANGE:
++	    endNode = end->user2;
++	    endIndex = end->index2;
+ 	    break;
+ 	case XPATH_NODESET:
+ 	    /*
+@@ -557,39 +544,15 @@ xmlXPtrNewRangeNodeObject(xmlNodePtr start, xmlXPathObjectPtr end) {
+ 	     */
+ 	    if (end->nodesetval->nodeNr <= 0)
+ 		return(NULL);
++	    endNode = end->nodesetval->nodeTab[end->nodesetval->nodeNr - 1];
++	    endIndex = -1;
+ 	    break;
+ 	default:
+ 	    /* TODO */
+ 	    return(NULL);
+     }
+ 
+-    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
+-    if (ret == NULL) {
+-        xmlXPtrErrMemory("allocating range");
+-	return(NULL);
+-    }
+-    memset(ret, 0 , (size_t) sizeof(xmlXPathObject));
+-    ret->type = XPATH_RANGE;
+-    ret->user = start;
+-    ret->index = -1;
+-    switch (end->type) {
+-	case XPATH_POINT:
+-	    ret->user2 = end->user;
+-	    ret->index2 = end->index;
+-	    break;
+-	case XPATH_RANGE:
+-	    ret->user2 = end->user2;
+-	    ret->index2 = end->index2;
+-	    break;
+-	case XPATH_NODESET: {
+-	    ret->user2 = end->nodesetval->nodeTab[end->nodesetval->nodeNr - 1];
+-	    ret->index2 = -1;
+-	    break;
+-	}
+-	default:
+-	    STRANGE
+-	    return(NULL);
+-    }
++    ret = xmlXPtrNewRangeInternal(start, -1, endNode, endIndex);
+     xmlXPtrRangeCheckOrder(ret);
+     return(ret);
+ }
+-- 
+2.11.0
+
diff --git a/gnu/packages/patches/libxml2-CVE-2016-5131.patch b/gnu/packages/patches/libxml2-CVE-2016-5131.patch
new file mode 100644
index 0000000000..38938c8e3e
--- /dev/null
+++ b/gnu/packages/patches/libxml2-CVE-2016-5131.patch
@@ -0,0 +1,218 @@
+Fix CVE-2016-5131:
+
+https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-5131
+
+Patches copied from upstream source repository (the test suite fails
+without the 2nd patch):
+
+https://git.gnome.org/browse/libxml2/commit/?id=9ab01a277d71f54d3143c2cf333c5c2e9aaedd9e
+https://git.gnome.org/browse/libxml2/commit/?id=a005199330b86dada19d162cae15ef9bdcb6baa8
+
+From 9ab01a277d71f54d3143c2cf333c5c2e9aaedd9e Mon Sep 17 00:00:00 2001
+From: Nick Wellnhofer <wellnhofer@aevum.de>
+Date: Tue, 28 Jun 2016 14:22:23 +0200
+Subject: [PATCH] Fix XPointer paths beginning with range-to
+
+The old code would invoke the broken xmlXPtrRangeToFunction. range-to
+isn't really a function but a special kind of location step. Remove
+this function and always handle range-to in the XPath code.
+
+The old xmlXPtrRangeToFunction could also be abused to trigger a
+use-after-free error with the potential for remote code execution.
+
+Found with afl-fuzz.
+
+Fixes CVE-2016-5131.
+---
+ result/XPath/xptr/vidbase | 13 ++++++++
+ test/XPath/xptr/vidbase   |  1 +
+ xpath.c                   |  7 ++++-
+ xpointer.c                | 76 ++++-------------------------------------------
+ 4 files changed, 26 insertions(+), 71 deletions(-)
+
+diff --git a/result/XPath/xptr/vidbase b/result/XPath/xptr/vidbase
+index 8b9e92d6..f19193e7 100644
+--- a/result/XPath/xptr/vidbase
++++ b/result/XPath/xptr/vidbase
+@@ -17,3 +17,16 @@ Object is a Location Set:
+   To node
+     ELEMENT p
+ 
++
++========================
++Expression: xpointer(range-to(id('chapter2')))
++Object is a Location Set:
++1 :   Object is a range :
++  From node
++     /
++  To node
++    ELEMENT chapter
++      ATTRIBUTE id
++        TEXT
++          content=chapter2
++
+diff --git a/test/XPath/xptr/vidbase b/test/XPath/xptr/vidbase
+index b1463830..884b1065 100644
+--- a/test/XPath/xptr/vidbase
++++ b/test/XPath/xptr/vidbase
+@@ -1,2 +1,3 @@
+ xpointer(id('chapter1')/p)
+ xpointer(id('chapter1')/p[1]/range-to(following-sibling::p[2]))
++xpointer(range-to(id('chapter2')))
+diff --git a/xpath.c b/xpath.c
+index d992841e..5a01b1b3 100644
+--- a/xpath.c
++++ b/xpath.c
+@@ -10691,13 +10691,18 @@ xmlXPathCompPathExpr(xmlXPathParserContextPtr ctxt) {
+ 		    lc = 1;
+ 		    break;
+ 		} else if ((NXT(len) == '(')) {
+-		    /* Note Type or Function */
++		    /* Node Type or Function */
+ 		    if (xmlXPathIsNodeType(name)) {
+ #ifdef DEBUG_STEP
+ 		        xmlGenericError(xmlGenericErrorContext,
+ 				"PathExpr: Type search\n");
+ #endif
+ 			lc = 1;
++#ifdef LIBXML_XPTR_ENABLED
++                    } else if (ctxt->xptr &&
++                               xmlStrEqual(name, BAD_CAST "range-to")) {
++                        lc = 1;
++#endif
+ 		    } else {
+ #ifdef DEBUG_STEP
+ 		        xmlGenericError(xmlGenericErrorContext,
+diff --git a/xpointer.c b/xpointer.c
+index 676c5105..d74174a3 100644
+--- a/xpointer.c
++++ b/xpointer.c
+@@ -1332,8 +1332,6 @@ xmlXPtrNewContext(xmlDocPtr doc, xmlNodePtr here, xmlNodePtr origin) {
+     ret->here = here;
+     ret->origin = origin;
+ 
+-    xmlXPathRegisterFunc(ret, (xmlChar *)"range-to",
+-	                 xmlXPtrRangeToFunction);
+     xmlXPathRegisterFunc(ret, (xmlChar *)"range",
+ 	                 xmlXPtrRangeFunction);
+     xmlXPathRegisterFunc(ret, (xmlChar *)"range-inside",
+@@ -2243,76 +2241,14 @@ xmlXPtrRangeInsideFunction(xmlXPathParserContextPtr ctxt, int nargs) {
+  * @nargs:  the number of args
+  *
+  * Implement the range-to() XPointer function
++ *
++ * Obsolete. range-to is not a real function but a special type of location
++ * step which is handled in xpath.c.
+  */
+ void
+-xmlXPtrRangeToFunction(xmlXPathParserContextPtr ctxt, int nargs) {
+-    xmlXPathObjectPtr range;
+-    const xmlChar *cur;
+-    xmlXPathObjectPtr res, obj;
+-    xmlXPathObjectPtr tmp;
+-    xmlLocationSetPtr newset = NULL;
+-    xmlNodeSetPtr oldset;
+-    int i;
+-
+-    if (ctxt == NULL) return;
+-    CHECK_ARITY(1);
+-    /*
+-     * Save the expression pointer since we will have to evaluate
+-     * it multiple times. Initialize the new set.
+-     */
+-    CHECK_TYPE(XPATH_NODESET);
+-    obj = valuePop(ctxt);
+-    oldset = obj->nodesetval;
+-    ctxt->context->node = NULL;
+-
+-    cur = ctxt->cur;
+-    newset = xmlXPtrLocationSetCreate(NULL);
+-
+-    for (i = 0; i < oldset->nodeNr; i++) {
+-	ctxt->cur = cur;
+-
+-	/*
+-	 * Run the evaluation with a node list made of a single item
+-	 * in the nodeset.
+-	 */
+-	ctxt->context->node = oldset->nodeTab[i];
+-	tmp = xmlXPathNewNodeSet(ctxt->context->node);
+-	valuePush(ctxt, tmp);
+-
+-	xmlXPathEvalExpr(ctxt);
+-	CHECK_ERROR;
+-
+-	/*
+-	 * The result of the evaluation need to be tested to
+-	 * decided whether the filter succeeded or not
+-	 */
+-	res = valuePop(ctxt);
+-	range = xmlXPtrNewRangeNodeObject(oldset->nodeTab[i], res);
+-	if (range != NULL) {
+-	    xmlXPtrLocationSetAdd(newset, range);
+-	}
+-
+-	/*
+-	 * Cleanup
+-	 */
+-	if (res != NULL)
+-	    xmlXPathFreeObject(res);
+-	if (ctxt->value == tmp) {
+-	    res = valuePop(ctxt);
+-	    xmlXPathFreeObject(res);
+-	}
+-
+-	ctxt->context->node = NULL;
+-    }
+-
+-    /*
+-     * The result is used as the new evaluation set.
+-     */
+-    xmlXPathFreeObject(obj);
+-    ctxt->context->node = NULL;
+-    ctxt->context->contextSize = -1;
+-    ctxt->context->proximityPosition = -1;
+-    valuePush(ctxt, xmlXPtrWrapLocationSet(newset));
++xmlXPtrRangeToFunction(xmlXPathParserContextPtr ctxt,
++                       int nargs ATTRIBUTE_UNUSED) {
++    XP_ERROR(XPATH_EXPR_ERROR);
+ }
+ 
+ /**
+-- 
+2.11.0
+
+From a005199330b86dada19d162cae15ef9bdcb6baa8 Mon Sep 17 00:00:00 2001
+From: Nick Wellnhofer <wellnhofer@aevum.de>
+Date: Tue, 28 Jun 2016 14:19:58 +0200
+Subject: [PATCH] Fix comparison with root node in xmlXPathCmpNodes
+
+This change has already been made in xmlXPathCmpNodesExt but not in
+xmlXPathCmpNodes.
+---
+ xpath.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/xpath.c b/xpath.c
+index 751665b8..d992841e 100644
+--- a/xpath.c
++++ b/xpath.c
+@@ -3342,13 +3342,13 @@ xmlXPathCmpNodes(xmlNodePtr node1, xmlNodePtr node2) {
+      * compute depth to root
+      */
+     for (depth2 = 0, cur = node2;cur->parent != NULL;cur = cur->parent) {
+-	if (cur == node1)
++	if (cur->parent == node1)
+ 	    return(1);
+ 	depth2++;
+     }
+     root = cur;
+     for (depth1 = 0, cur = node1;cur->parent != NULL;cur = cur->parent) {
+-	if (cur == node2)
++	if (cur->parent == node2)
+ 	    return(-1);
+ 	depth1++;
+     }
+-- 
+2.11.0
+
diff --git a/gnu/packages/patches/libxt-guix-search-paths.patch b/gnu/packages/patches/libxt-guix-search-paths.patch
new file mode 100644
index 0000000000..c618f48da5
--- /dev/null
+++ b/gnu/packages/patches/libxt-guix-search-paths.patch
@@ -0,0 +1,126 @@
+--- libXt-1.1.5/src/Intrinsic.c	2015-05-01 07:36:20.000000000 +0200
++++ Intrinsic.c	2016-12-12 00:42:16.567388450 +0100
+@@ -1303,21 +1303,101 @@
+     } else (void) strcpy(*rest, string);
+ }
+ 
+-/*
+- * default path used if environment variable XFILESEARCHPATH
+- * is not defined.  Also substitued for %D.
+- * The exact value should be documented in the implementation
+- * notes for any Xt implementation.
++
++
++/* 
++   Return the default search path for the function
++   XtResolvePathname to use if XFILESEARCHPATH is 
++   not defined.
++
++   It returns the combination the set of values which are the 6 "stems" below,
++   prepended with "/run/current-system/profile", and $GUIX_PROFILE and 
++   "$HOME/.guix-profile"
++
++   These values provide the default paths where Guix/GuixSD  can expect
++   to find resources for installed packages.
+  */
+-static const char *implementation_default_path(void)
++static const char *guix_default_path(void)
+ {
+-#if defined(WIN32)
+-    static char xfilesearchpath[] = "";
+-
+-    return xfilesearchpath;
+-#else
+-    return XFILESEARCHPATHDEFAULT;
+-#endif
++  static const char *search_path_default_stem[] = {
++    "/lib/X11/%L/%T/%N%C%S",
++    "/lib/X11/%l/%T/%N%C%S",
++    "/lib/X11/%T/%N%C%S",
++    "/lib/X11/%L/%T/%N%S",
++    "/lib/X11/%l/%T/%N%S",
++    "/lib/X11/%T/%N%S"
++  };
++
++#define SIZEOF_STEMS  (strlen (search_path_default_stem[0])	\
++		       + strlen (search_path_default_stem[1])	\
++		       + strlen (search_path_default_stem[2])	\
++		       + strlen (search_path_default_stem[3])	\
++		       + strlen (search_path_default_stem[4])	\
++		       + strlen (search_path_default_stem[5]))
++
++
++  int i;
++  const char *current_profile = "/run/current-system/profile";
++  char *home = getenv ("HOME");
++  char *guix_profile = getenv ("GUIX_PROFILE");
++
++  size_t bytesAllocd = SIZEOF_STEMS + 1; 
++
++  /* This function is evaluated multiple times and the calling
++     code assumes that it is idempotent. So we must not allow
++     (say) a changed environment variable to cause it to return
++     something different. */
++  static char *path = NULL;
++  if (path)
++    return path;
++
++  bytesAllocd += 6 * (1 + strlen (current_profile));
++
++  if (guix_profile != NULL)
++    {
++      bytesAllocd += SIZEOF_STEMS;
++      bytesAllocd += 6 * (1 + strlen (guix_profile));
++    }
++
++  if (home != NULL)
++    {
++      bytesAllocd += SIZEOF_STEMS;
++      bytesAllocd += 6 * (1 + strlen(home) + strlen ("/.guix-profile"));
++    }
++
++  path = XtMalloc(bytesAllocd);
++  if (path == NULL) _XtAllocError(NULL);
++
++  memset (path, 0, bytesAllocd);
++  
++  for (i = 0 ; i < 6 ; ++i)
++    {
++      strcat (path, current_profile);
++      strcat (path, search_path_default_stem[i]);
++      strcat (path, ":");
++    }
++
++  if (guix_profile != NULL)
++    for (i = 0 ; i < 6 ; ++i)
++      {
++	strcat (path, guix_profile);
++	strcat (path, search_path_default_stem[i]);
++	strcat (path, ":");
++      }
++
++  if (home != NULL)
++    for (i = 0 ; i < 6 ; ++i)
++      {
++	strcat (path, home);
++	strcat (path, "/.guix-profile");
++	strcat (path, search_path_default_stem[i]);
++	strcat (path, ":");
++      }
++
++  /* Remove final : */
++  path[strlen(path) - 1] = '\0';
++  
++  return path;
+ }
+ 
+ 
+@@ -1345,7 +1425,7 @@
+ {
+     XtPerDisplay pd;
+     static const char *defaultPath = NULL;
+-    const char *impl_default = implementation_default_path();
++    const char *impl_default = guix_default_path();
+     int idef_len = strlen(impl_default);
+     char *massagedPath;
+     int bytesAllocd, bytesLeft;
diff --git a/gnu/packages/patches/mcrypt-CVE-2012-4409.patch b/gnu/packages/patches/mcrypt-CVE-2012-4409.patch
index 60cf8e0430..3089f962f7 100644
--- a/gnu/packages/patches/mcrypt-CVE-2012-4409.patch
+++ b/gnu/packages/patches/mcrypt-CVE-2012-4409.patch
@@ -3,30 +3,17 @@ From: Tom Callaway <spot@fedoraproject.org>
 Date: Fri, 7 Sep 2012 11:39:29 -0400
 Subject: apply fix for CVE-2012-4409 (thanks to Raphael Geissert)
 
----
- mcrypt-CVE-2012-4409.patch | 12 ++++++++++++
- mcrypt.spec                | 10 +++++++++-
- 2 files changed, 21 insertions(+), 1 deletion(-)
- create mode 100644 mcrypt-CVE-2012-4409.patch
-
-diff --git a/mcrypt-CVE-2012-4409.patch b/mcrypt-CVE-2012-4409.patch
-new file mode 100644
-index 0000000..747f428
---- /dev/null
-+++ b/mcrypt-CVE-2012-4409.patch
-@@ -0,0 +1,12 @@
-+diff -up mcrypt-2.6.8/src/extra.c.CVE-2012-4409 mcrypt-2.6.8/src/extra.c
-+--- mcrypt-2.6.8/src/extra.c.CVE-2012-4409	2012-09-07 11:00:55.906870746 -0400
-++++ mcrypt-2.6.8/src/extra.c	2012-09-07 11:00:27.967858365 -0400
-+@@ -242,6 +242,8 @@ int check_file_head(FILE * fstream, char
-+ 			if (m_getbit(0, sflag) != 0) { /* if the first bit is set */
-+ 				*salt_size = m_setbit(0, sflag, 0);
-+ 				if (*salt_size > 0) {
-++					if (*salt_size > sizeof(tmp_buf))
-++						err_quit(_("Salt is too long\n"));
-+ 					fread(tmp_buf, 1, *salt_size,
-+ 					      fstream);
-+ 					memmove(salt, tmp_buf, *salt_size);
+--- mcrypt-2.6.8/src/extra.c.CVE-2012-4409	2012-09-07 11:00:55.906870746 -0400
++++ mcrypt-2.6.8/src/extra.c	2012-09-07 11:00:27.967858365 -0400
+@@ -242,6 +242,8 @@ int check_file_head(FILE * fstream, char
+ 			if (m_getbit(0, sflag) != 0) { /* if the first bit is set */
+ 				*salt_size = m_setbit(0, sflag, 0);
+ 				if (*salt_size > 0) {
++					if (*salt_size > sizeof(tmp_buf))
++						err_quit(_("Salt is too long\n"));
+ 					fread(tmp_buf, 1, *salt_size,
+ 					      fstream);
+ 					memmove(salt, tmp_buf, *salt_size);
  
 -- 
 cgit v0.12
diff --git a/gnu/packages/patches/mcrypt-CVE-2012-4527.patch b/gnu/packages/patches/mcrypt-CVE-2012-4527.patch
index d931dd174b..dfbf048583 100644
--- a/gnu/packages/patches/mcrypt-CVE-2012-4527.patch
+++ b/gnu/packages/patches/mcrypt-CVE-2012-4527.patch
@@ -3,109 +3,97 @@ From: Tom Callaway <spot@fedoraproject.org>
 Date: Tue, 30 Oct 2012 15:39:24 -0400
 Subject: apply workaround to CVE-2012-4527
 
----
- mcrypt-CVE-2012-4527-80-width-patch | 91 +++++++++++++++++++++++++++++++++++++
- mcrypt.spec                         | 10 +++-
- 2 files changed, 100 insertions(+), 1 deletion(-)
- create mode 100644 mcrypt-CVE-2012-4527-80-width-patch
-
-diff --git a/mcrypt-CVE-2012-4527-80-width-patch b/mcrypt-CVE-2012-4527-80-width-patch
-new file mode 100644
-index 0000000..0eb94d8
---- /dev/null
-+++ b/mcrypt-CVE-2012-4527-80-width-patch
-@@ -0,0 +1,91 @@
-+--- mcrypt-2.6.8.orig/src/mcrypt.c
-++++ mcrypt-2.6.8/src/mcrypt.c
-+@@ -41,6 +41,8 @@
-+ # include <time.h>
-+ #endif
-+ 
-++#define WIDTH 80
-++
-+ static char rcsid[] =
-+     "$Id: mcrypt.c,v 1.2 2007/11/07 17:10:21 nmav Exp $";
-+ 
-+@@ -482,7 +484,7 @@
-+ #ifdef HAVE_STAT
-+       if (stream_flag == FALSE) {
-+ 	 if (is_normal_file(file[i]) == FALSE) {
-+-	    sprintf(tmperr,
-++	    snprintf(tmperr, WIDTH,
-+ 		    _
-+ 		    ("%s: %s is not a regular file. Skipping...\n"),
-+ 		    program_name, file[i]);
-+@@ -501,7 +503,7 @@
-+ 	    dinfile = file[i];
-+ 	 if ((isatty(fileno((FILE *) (stdin))) == 1)
-+ 	     && (stream_flag == TRUE) && (force == 0)) {	/* not a tty */
-+-	    sprintf(tmperr,
-++	    snprintf(tmperr, WIDTH,
-+ 		    _
-+ 		    ("%s: Encrypted data will not be read from a terminal.\n"),
-+ 		    program_name);
-+@@ -520,7 +522,7 @@
-+ 	    einfile = file[i];
-+ 	 if ((isatty(fileno((FILE *) (stdout))) == 1)
-+ 	     && (stream_flag == TRUE) && (force == 0)) {	/* not a tty */
-+-	    sprintf(tmperr,
-++	    snprintf(tmperr, WIDTH,
-+ 		    _
-+ 		    ("%s: Encrypted data will not be written to a terminal.\n"),
-+ 		    program_name);
-+@@ -544,7 +546,7 @@
-+ 	    strcpy(outfile, einfile);
-+ 	    /* if file has already the .nc ignore it */
-+ 	    if (strstr(outfile, ".nc") != NULL) {
-+-	       sprintf(tmperr,
-++	       snprintf(tmperr, WIDTH,
-+ 		       _
-+ 		       ("%s: file %s has the .nc suffix... skipping...\n"),
-+ 		       program_name, outfile);
-+@@ -590,10 +592,10 @@
-+ 
-+ 	 if (x == 0) {
-+ 	    if (stream_flag == FALSE) {
-+-	       sprintf(tmperr, _("File %s was decrypted.\n"), dinfile);
-++	       snprintf(tmperr, WIDTH, _("File %s was decrypted.\n"), dinfile);
-+ 	       err_warn(tmperr);
-+ 	    } else {
-+-	       sprintf(tmperr, _("Stdin was decrypted.\n"));
-++	       snprintf(tmperr, WIDTH, _("Stdin was decrypted.\n"));
-+ 	       err_warn(tmperr);
-+ 	    }
-+ #ifdef HAVE_STAT
-+@@ -610,7 +612,7 @@
-+ 
-+ 	 } else {
-+ 	    if (stream_flag == FALSE) {
-+-	       sprintf(tmperr,
-++	       snprintf(tmperr, WIDTH,
-+ 		       _
-+ 		       ("File %s was NOT decrypted successfully.\n"),
-+ 		       dinfile);
-+@@ -636,10 +638,10 @@
-+ 
-+ 	 if (x == 0) {
-+ 	    if (stream_flag == FALSE) {
-+-	       sprintf(tmperr, _("File %s was encrypted.\n"), einfile);
-++	       snprintf(tmperr, WIDTH, _("File %s was encrypted.\n"), einfile);
-+ 	       err_warn(tmperr);
-+ 	    } else {
-+-	       sprintf(tmperr, _("Stdin was encrypted.\n"));
-++	       snprintf(tmperr, WIDTH, _("Stdin was encrypted.\n"));
-+ 	       err_warn(tmperr);
-+ 	    }
-+ #ifdef HAVE_STAT
-+@@ -655,7 +657,7 @@
-+ 
-+ 	 } else {
-+ 	    if (stream_flag == FALSE) {
-+-	       sprintf(tmperr,
-++	       snprintf(tmperr, WIDTH,
-+ 		       _
-+ 		       ("File %s was NOT encrypted successfully.\n"),
-+ 		       einfile);
--- 
-cgit v0.12
+--- mcrypt-2.6.8.orig/src/mcrypt.c
++++ mcrypt-2.6.8/src/mcrypt.c
+@@ -41,6 +41,8 @@
+ # include <time.h>
+ #endif
+ 
++#define WIDTH 80
++
+ static char rcsid[] =
+     "$Id: mcrypt.c,v 1.2 2007/11/07 17:10:21 nmav Exp $";
+ 
+@@ -482,7 +484,7 @@
+ #ifdef HAVE_STAT
+       if (stream_flag == FALSE) {
+ 	 if (is_normal_file(file[i]) == FALSE) {
+-	    sprintf(tmperr,
++	    snprintf(tmperr, WIDTH,
+ 		    _
+ 		    ("%s: %s is not a regular file. Skipping...\n"),
+ 		    program_name, file[i]);
+@@ -501,7 +503,7 @@
+ 	    dinfile = file[i];
+ 	 if ((isatty(fileno((FILE *) (stdin))) == 1)
+ 	     && (stream_flag == TRUE) && (force == 0)) {	/* not a tty */
+-	    sprintf(tmperr,
++	    snprintf(tmperr, WIDTH,
+ 		    _
+ 		    ("%s: Encrypted data will not be read from a terminal.\n"),
+ 		    program_name);
+@@ -520,7 +522,7 @@
+ 	    einfile = file[i];
+ 	 if ((isatty(fileno((FILE *) (stdout))) == 1)
+ 	     && (stream_flag == TRUE) && (force == 0)) {	/* not a tty */
+-	    sprintf(tmperr,
++	    snprintf(tmperr, WIDTH,
+ 		    _
+ 		    ("%s: Encrypted data will not be written to a terminal.\n"),
+ 		    program_name);
+@@ -544,7 +546,7 @@
+ 	    strcpy(outfile, einfile);
+ 	    /* if file has already the .nc ignore it */
+ 	    if (strstr(outfile, ".nc") != NULL) {
+-	       sprintf(tmperr,
++	       snprintf(tmperr, WIDTH,
+ 		       _
+ 		       ("%s: file %s has the .nc suffix... skipping...\n"),
+ 		       program_name, outfile);
+@@ -590,10 +592,10 @@
+ 
+ 	 if (x == 0) {
+ 	    if (stream_flag == FALSE) {
+-	       sprintf(tmperr, _("File %s was decrypted.\n"), dinfile);
++	       snprintf(tmperr, WIDTH, _("File %s was decrypted.\n"), dinfile);
+ 	       err_warn(tmperr);
+ 	    } else {
+-	       sprintf(tmperr, _("Stdin was decrypted.\n"));
++	       snprintf(tmperr, WIDTH, _("Stdin was decrypted.\n"));
+ 	       err_warn(tmperr);
+ 	    }
+ #ifdef HAVE_STAT
+@@ -610,7 +612,7 @@
+ 
+ 	 } else {
+ 	    if (stream_flag == FALSE) {
+-	       sprintf(tmperr,
++	       snprintf(tmperr, WIDTH,
+ 		       _
+ 		       ("File %s was NOT decrypted successfully.\n"),
+ 		       dinfile);
+@@ -636,10 +638,10 @@
+ 
+ 	 if (x == 0) {
+ 	    if (stream_flag == FALSE) {
+-	       sprintf(tmperr, _("File %s was encrypted.\n"), einfile);
++	       snprintf(tmperr, WIDTH, _("File %s was encrypted.\n"), einfile);
+ 	       err_warn(tmperr);
+ 	    } else {
+-	       sprintf(tmperr, _("Stdin was encrypted.\n"));
++	       snprintf(tmperr, WIDTH, _("Stdin was encrypted.\n"));
+ 	       err_warn(tmperr);
+ 	    }
+ #ifdef HAVE_STAT
+@@ -655,7 +657,7 @@
+ 
+ 	 } else {
+ 	    if (stream_flag == FALSE) {
+-	       sprintf(tmperr,
++	       snprintf(tmperr, WIDTH,
+ 		       _
+ 		       ("File %s was NOT encrypted successfully.\n"),
+ 		       einfile);
+- 
+git v0.12
 
diff --git a/gnu/packages/patches/multiqc-fix-git-subprocess-error.patch b/gnu/packages/patches/multiqc-fix-git-subprocess-error.patch
new file mode 100644
index 0000000000..87be6142f4
--- /dev/null
+++ b/gnu/packages/patches/multiqc-fix-git-subprocess-error.patch
@@ -0,0 +1,16 @@
+Without this patch, the incorrect exception is caught when 'git' is not in
+PATH.  See https://github.com/ewels/MultiQC/pull/377.
+
+diff --git a/multiqc/utils/config.py b/multiqc/utils/config.py
+index 01fa554..4a11793 100755
+--- a/multiqc/utils/config.py
++++ b/multiqc/utils/config.py
+@@ -28,7 +28,7 @@ try:
+     git_hash = subprocess.check_output(['git', 'rev-parse', 'HEAD'], stderr=subprocess.STDOUT)
+     git_hash_short = git_hash[:7]
+     version = '{} ({})'.format(version, git_hash_short)
+-except subprocess.CalledProcessError:
++except (subprocess.CalledProcessError, FileNotFoundError):
+     pass
+ os.chdir(cwd)
+ 
diff --git a/gnu/packages/patches/ocaml-Add-a-.file-directive.patch b/gnu/packages/patches/ocaml-Add-a-.file-directive.patch
new file mode 100644
index 0000000000..07842e9c32
--- /dev/null
+++ b/gnu/packages/patches/ocaml-Add-a-.file-directive.patch
@@ -0,0 +1,96 @@
+From: Stephane Glondu <steph@glondu.net>
+Date: Sun, 16 Aug 2015 20:59:14 +0200
+Subject: Add a .file directive to generated .s files
+
+When no .file directive is given, the toolchain records the filename
+of the .o file, which is sometimes random, making generated objects
+non-deterministic.
+
+We use Location.input_name for adding .file directives to assembly
+files. Note: when the file is preprocessed, this reference holds the
+name of the temporary file. Hence, files compiled with -pp are still
+not deterministic.
+
+Bug-Debian: https://bugs.debian.org/795784
+Bug-Debian: https://bugs.debian.org/796336
+---
+ asmcomp/amd64/emit.mlp | 1 +
+ asmcomp/arm/emit.mlp   | 1 +
+ asmcomp/arm64/emit.mlp | 1 +
+ asmcomp/i386/emit.mlp  | 1 +
+ asmcomp/power/emit.mlp | 1 +
+ asmcomp/sparc/emit.mlp | 1 +
+ 6 files changed, 6 insertions(+)
+
+diff --git a/asmcomp/amd64/emit.mlp b/asmcomp/amd64/emit.mlp
+index d56d0f5..4d7aa30 100644
+--- a/asmcomp/amd64/emit.mlp
++++ b/asmcomp/amd64/emit.mlp
+@@ -794,6 +794,7 @@ let data l =
+ let begin_assembly() =
+   reset_debug_info();                   (* PR#5603 *)
+   float_constants := [];
++  `	.file \"{emit_string (String.escaped !Location.input_name)}\"\n`;
+   if !Clflags.dlcode then begin
+     (* from amd64.S; could emit these constants on demand *)
+     if macosx then
+diff --git a/asmcomp/arm/emit.mlp b/asmcomp/arm/emit.mlp
+index 4948fb2..6f30fba 100644
+--- a/asmcomp/arm/emit.mlp
++++ b/asmcomp/arm/emit.mlp
+@@ -892,6 +892,7 @@ let data l =
+
+ let begin_assembly() =
+   reset_debug_info();
++  `	.file \"{emit_string (String.escaped !Location.input_name)}\"\n`;
+   `	.syntax	unified\n`;
+   begin match !arch with
+   | ARMv4   -> `	.arch	armv4t\n`
+diff --git a/asmcomp/arm64/emit.mlp b/asmcomp/arm64/emit.mlp
+index 750c2b2..5afbb8a 100644
+--- a/asmcomp/arm64/emit.mlp
++++ b/asmcomp/arm64/emit.mlp
+@@ -942,6 +942,7 @@ let data l =
+
+ let begin_assembly() =
+   reset_debug_info();
++  `	.file \"{emit_string (String.escaped !Location.input_name)}\"\n`;
+   let lbl_begin = Compilenv.make_symbol (Some "data_begin") in
+   `	.data\n`;
+   `	.globl	{emit_symbol lbl_begin}\n`;
+diff --git a/asmcomp/i386/emit.mlp b/asmcomp/i386/emit.mlp
+index 98df5f9..531150f 100644
+--- a/asmcomp/i386/emit.mlp
++++ b/asmcomp/i386/emit.mlp
+@@ -986,6 +986,7 @@ let data l =
+ let begin_assembly() =
+   reset_debug_info();                   (* PR#5603 *)
+   float_constants := [];
++  `	.file \"{emit_string (String.escaped !Location.input_name)}\"\n`;
+   let lbl_begin = Compilenv.make_symbol (Some "data_begin") in
+   `	.data\n`;
+   `	.globl	{emit_symbol lbl_begin}\n`;
+diff --git a/asmcomp/power/emit.mlp b/asmcomp/power/emit.mlp
+index 4344085..343132b 100644
+--- a/asmcomp/power/emit.mlp
++++ b/asmcomp/power/emit.mlp
+@@ -887,6 +887,7 @@ let data l =
+ let begin_assembly() =
+   defined_functions := StringSet.empty;
+   external_functions := StringSet.empty;
++  `	.file \"{emit_string (String.escaped !Location.input_name)}\"\n`;
+   (* Emit the beginning of the segments *)
+   let lbl_begin = Compilenv.make_symbol (Some "data_begin") in
+   emit_string data_space;
+diff --git a/asmcomp/sparc/emit.mlp b/asmcomp/sparc/emit.mlp
+index 877a3d5..7b041e9 100644
+--- a/asmcomp/sparc/emit.mlp
++++ b/asmcomp/sparc/emit.mlp
+@@ -727,6 +727,7 @@ let data l =
+ (* Beginning / end of an assembly file *)
+
+ let begin_assembly() =
++  `	.file \"{emit_string (String.escaped !Location.input_name)}\"\n`;
+   let lbl_begin = Compilenv.make_symbol (Some "data_begin") in
+   `	.data\n`;
+   `	.global	{emit_symbol lbl_begin}\n`;
diff --git a/gnu/packages/patches/ocaml-bisect-fix-camlp4-in-another-directory.patch b/gnu/packages/patches/ocaml-bisect-fix-camlp4-in-another-directory.patch
new file mode 100644
index 0000000000..2056b42356
--- /dev/null
+++ b/gnu/packages/patches/ocaml-bisect-fix-camlp4-in-another-directory.patch
@@ -0,0 +1,125 @@
+From 26cac62fe0154cf65c06faaee10805531e9dade8 Mon Sep 17 00:00:00 2001
+From: Julien Lepiller <julien@lepiller.eu>
+Date: Wed, 14 Dec 2016 14:14:59 +0100
+Subject: [PATCH] fix camlp4 in another directory
+
+---
+ Makefile        | 11 ++++++-----
+ configure       | 13 ++++++++++++-
+ myocamlbuild.ml |  2 +-
+ 3 files changed, 19 insertions(+), 7 deletions(-)
+
+diff --git a/Makefile b/Makefile
+index 4a8ce17..d94a6d5 100644
+--- a/Makefile
++++ b/Makefile
+@@ -25,7 +25,7 @@ PATH_BUILD=$(PATH_BASE)/_build
+ PATH_OCAMLDOC=$(PATH_BASE)/ocamldoc
+ PATH_SRC=$(PATH_BASE)/src
+ PATH_TESTS=$(PATH_BASE)/tests
+-PATH_INSTALL=$(PATH_OCAML_PREFIX)/lib/ocaml/bisect
++PATH_INSTALL=$(PREFIX)/lib/ocaml/bisect
+
+
+ # DEFINITIONS
+@@ -33,7 +33,8 @@ PATH_INSTALL=$(PATH_OCAML_PREFIX)/lib/ocaml/bisect
+ PROJECT_NAME=bisect
+ OCAMLBUILD=$(PATH_OCAML_PREFIX)/bin/ocamlbuild
+ OCAMLBUILD_ENV=WARNINGS=$(WARNINGS) PATH_OCAML_PREFIX=$(PATH_OCAML_PREFIX)
+-OCAMLBUILD_FLAGS=-classic-display -no-links
++CAMLP4_INCLUDE=$(shell test -z $(CAMLP4_LIBDIR) || echo "-cflags -I,$(CAMLP4_LIBDIR)")
++OCAMLBUILD_FLAGS=-classic-display -no-links $(CAMLP4_INCLUDE)
+ MODULES_ODOCL=$(PROJECT_NAME).odocl
+ MODULES_MLPACK=$(PROJECT_NAME).mlpack
+ MODULES_MLPACK_PP=$(PROJECT_NAME)_pp.mlpack
+@@ -80,11 +81,11 @@ veryclean: clean
+	rm -f $(PATH_OCAMLDOC)/*.html $(PATH_OCAMLDOC)/*.css
+
+ install: FORCE
+-	cp $(PATH_BUILD)/src/report/report.byte $(PATH_OCAML_PREFIX)/bin/bisect-report; \
++	cp $(PATH_BUILD)/src/report/report.byte $(PREFIX)/bin/bisect-report; \
+	if [ "$(PPX)" = "TRUE" ]; then \
+-	  cp $(PATH_BUILD)/src/syntax/bisect_ppx.byte $(PATH_OCAML_PREFIX)/bin; \
++	  cp $(PATH_BUILD)/src/syntax/bisect_ppx.byte $(PREFIX)/bin; \
+	fi; \
+-	(test -x $(PATH_OCAML_PREFIX)/bin/ocamlopt && cp $(PATH_BUILD)/src/report/report.native $(PATH_OCAML_PREFIX)/bin/bisect-report.opt || true); \
++	(test -x $(PATH_OCAML_PREFIX)/bin/ocamlopt && cp $(PATH_BUILD)/src/report/report.native $(PREFIX)/bin/bisect-report.opt || true); \
+	if [ -x "$(PATH_OCAMLFIND)" ]; then \
+	  $(PATH_OCAMLFIND) query $(PROJECT_NAME) && $(PATH_OCAMLFIND) remove $(PROJECT_NAME) || true; \
+	  $(PATH_OCAMLFIND) install $(PROJECT_NAME) META -optional \
+diff --git a/configure b/configure
+index bb7ebf4..61a3095 100755
+--- a/configure
++++ b/configure
+@@ -21,7 +21,9 @@
+ # default values
+ ocamlbuild=`which ocamlbuild || echo '/usr/local/bin/ocamlbuild'`
+ bin_path=`dirname $ocamlbuild`
++prefix=''
+ ocaml_prefix=`dirname $bin_path`
++camlp4_prefix=`dirname $(dirname $(which camlp4of))`
+ ocamlfind=`which ocamlfind 2> /dev/null || echo ''`
+ native_dynlink='TRUE'
+ devel='FALSE'
+@@ -32,8 +34,12 @@ ppx='FALSE'
+ while [ $# -gt 0 ]
+ do
+     case "$1" in
++        -prefix)
++            prefix="$2"; shift;;
+         -ocaml-prefix)
+             ocaml_prefix="$2"; shift;;
++        -camlp4-prefix)
++            camlp4_prefix="$2"; shift;;
+         -ocamlfind)
+             ocamlfind="$2"; shift;;
+         -no-native-dynlink)
+@@ -45,7 +51,7 @@ do
+         -ppx)
+             ppx='TRUE';;
+         *)
+-            echo "usage: $0 [-ocaml-prefix <path>] [-ocamlfind <path>] [-no-native-dynlink] [-devel]";
++            echo "usage: $0 [-prefix <path>] [-ocaml-prefix <path>] [-ocamlfind <path>] [-no-native-dynlink] [-devel]";
+             exit 1;;
+         esac
+         shift
+@@ -57,6 +63,9 @@ if [ "$no_camlp4" = "TRUE" -a "$ppx" = "FALSE" ]; then
+   exit 1
+ fi
+
++# prefix default value
++test -z $prefix && prefix=$ocaml_prefix
++
+ # make options
+ make_quiet=`make -f - <<EOF
+ default: gnumake
+@@ -67,11 +76,13 @@ EOF`
+ # file creation
+ echo "# timestamp: `date`" > Makefile.config
+ echo "PATH_OCAML_PREFIX=$ocaml_prefix" >> Makefile.config
++echo "PATH_CAMLP4_PREFIX=$camlp4_prefix" >> Makefile.config
+ echo "PATH_OCAMLFIND=$ocamlfind" >> Makefile.config
+ echo "NATIVE_DYNLINK=$native_dynlink" >> Makefile.config
+ echo "WARNINGS=$devel" >> Makefile.config
+ echo "NO_CAMLP4=$no_camlp4" >> Makefile.config
+ echo "PPX=$ppx" >> Makefile.config
+ echo "MAKE_QUIET=$make_quiet" >> Makefile.config
++echo "PREFIX=$prefix" >> Makefile.config
+ echo "" >> Makefile.config
+ echo 'Makefile.config successfully created'
+diff --git a/myocamlbuild.ml b/myocamlbuild.ml
+index 8aa25fd..09a7d48 100644
+--- a/myocamlbuild.ml
++++ b/myocamlbuild.ml
+@@ -70,7 +70,7 @@ let () =
+     | After_rules ->
+         let camlp4of =
+           try
+-            let path_bin = Filename.concat (Sys.getenv "PATH_OCAML_PREFIX") "bin" in
++            let path_bin = Filename.concat (Sys.getenv "PATH_CAMLP4_PREFIX") "bin" in
+             Filename.concat path_bin "camlp4of"
+           with _ -> "camlp4of" in
+         flag ["ocaml"; "compile"; "pp_camlp4of"] (S[A"-pp"; A camlp4of]);
+--
+2.7.4
+
diff --git a/gnu/packages/patches/ocaml-bitstring-fix-configure.patch b/gnu/packages/patches/ocaml-bitstring-fix-configure.patch
new file mode 100644
index 0000000000..c358bf3d6b
--- /dev/null
+++ b/gnu/packages/patches/ocaml-bitstring-fix-configure.patch
@@ -0,0 +1,53 @@
+From 0aaddfceeea3e89df196ab1846da54d09713a512 Mon Sep 17 00:00:00 2001
+From: Julien Lepiller <julien@lepiller.eu>
+Date: Thu, 15 Dec 2016 21:17:31 +0100
+Subject: [PATCH] fix configure
+
+---
+ Makefile.in | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/Makefile.in b/Makefile.in
+index d040f4c..85e0b38 100644
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -32,6 +32,7 @@ BISECT_REPORT	= @BISECT_REPORT@
+ BYTESWAP_H	= @BYTESWAP_H@
+
+ OCAMLLIB	= @OCAMLLIB@
++BISECTLIB	= $(shell if test -z $${BISECTLIB}; then echo $(OCAMLLIB); else echo $${BISECTLIB}; fi)
+ top_srcdir	= @top_srcdir@
+
+ pkg_cil		= @OCAML_PKG_cil@
+@@ -47,9 +48,9 @@ OCAMLOPTPACKAGES = $(OCAMLCPACKAGES)
+ OCAMLOPTLIBS	= -linkpkg
+
+ ifneq ($(enable_coverage),no)
+-OCAMLCFLAGS     += -I +bisect -pp 'camlp4o $(OCAMLLIB)/bisect/instrument.cma'
++OCAMLCFLAGS     += -I +bisect -pp 'camlp4o $(BISECTLIB)/bisect/instrument.cma'
+ OCAMLCLIBS	+= -I +bisect bisect.cma
+-OCAMLOPTFLAGS   += -I +bisect -pp 'camlp4o $(OCAMLLIB)/bisect/instrument.cma'
++OCAMLOPTFLAGS   += -I +bisect -pp 'camlp4o $(BISECTLIB)/bisect/instrument.cma'
+ OCAMLOPTLIBS	+= -I +bisect bisect.cmxa
+ endif
+
+@@ -110,7 +111,7 @@ bitstring_persistent.cmi: bitstring_persistent.mli
+	  -I +camlp4 -pp camlp4of -c $<
+
+ pa_bitstring.cmo: pa_bitstring.ml bitstring.cma bitstring_persistent.cma
+-	$(OCAMLFIND) ocamlc bitstring.cma -I +camlp4 dynlink.cma camlp4lib.cma \
++	$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) bitstring.cma -I +camlp4 dynlink.cma camlp4lib.cma \
+	  -pp camlp4of -c $< -o $@
+
+ bitstring-objinfo: bitstring_objinfo.cmo bitstring.cma bitstring_persistent.cma
+@@ -133,7 +134,7 @@ byteswap.h: byteswap.in.h
+ ifeq ($(enable_coverage),no)
+ PP	= -pp 'camlp4o bitstring.cma bitstring_persistent.cma pa_bitstring.cmo'
+ else
+-PP	= -pp 'camlp4o $(OCAMLLIB)/bisect/bisect.cma bitstring.cma bitstring_persistent.cma pa_bitstring.cmo'
++PP	= -pp 'camlp4o $(BISECTLIB)/bisect/bisect.cma bitstring.cma bitstring_persistent.cma pa_bitstring.cmo'
+ endif
+
+ check: test
+--
+2.11.0
diff --git a/gnu/packages/patches/openssh-memory-exhaustion.patch b/gnu/packages/patches/openssh-memory-exhaustion.patch
deleted file mode 100644
index 91fe294ca4..0000000000
--- a/gnu/packages/patches/openssh-memory-exhaustion.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-Fix a memory exhaustion bug in the key exchange, whereby an unauthenticated user
-could potentially consume 38400 MB of memory on the server:
-
-http://seclists.org/oss-sec/2016/q4/185
-
-Patch adapted from upstream source repository:
-
-https://github.com/openssh/openssh-portable/commit/ec165c392ca54317dbe3064a8c200de6531e89ad
-
-From ec165c392ca54317dbe3064a8c200de6531e89ad Mon Sep 17 00:00:00 2001
-From: "markus@openbsd.org" <markus@openbsd.org>
-Date: Mon, 10 Oct 2016 19:28:48 +0000
-Subject: [PATCH] upstream commit
-
-Unregister the KEXINIT handler after message has been
-received. Otherwise an unauthenticated peer can repeat the KEXINIT and cause
-allocation of up to 128MB -- until the connection is closed. Reported by
-shilei-c at 360.cn
-
-Upstream-ID: 43649ae12a27ef94290db16d1a98294588b75c05
----
- kex.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/kex.c b/kex.c
-index 3f97f8c..6a94bc5 100644
---- a/kex.c
-+++ b/kex.c
-@@ -481,6 +481,7 @@ kex_input_kexinit(int type, u_int32_t seq, void *ctxt)
- 	if (kex == NULL)
- 		return SSH_ERR_INVALID_ARGUMENT;
- 
-+	ssh_dispatch_set(ssh, SSH2_MSG_KEXINIT, NULL);
- 	ptr = sshpkt_ptr(ssh, &dlen);
- 	if ((r = sshbuf_put(kex->peer, ptr, dlen)) != 0)
- 		return r;
--- 
-2.10.1
-
diff --git a/gnu/packages/patches/python-dendropy-exclude-failing-tests.patch b/gnu/packages/patches/python-dendropy-exclude-failing-tests.patch
deleted file mode 100644
index 288a58b06f..0000000000
--- a/gnu/packages/patches/python-dendropy-exclude-failing-tests.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-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/python-pycrypto-CVE-2013-7459.patch b/gnu/packages/patches/python-pycrypto-CVE-2013-7459.patch
new file mode 100644
index 0000000000..3570b94e9b
--- /dev/null
+++ b/gnu/packages/patches/python-pycrypto-CVE-2013-7459.patch
@@ -0,0 +1,97 @@
+Fix CVE-2013-7459:
+
+https://github.com/dlitz/pycrypto/issues/176
+https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-7459
+
+Copied from Debian:
+
+https://anonscm.debian.org/cgit/collab-maint/python-crypto.git/commit/?id=0de2243837ed369a086f15c50cca2be85bdfab9d
+
+Debian adapts this upstream commit:
+
+https://github.com/dlitz/pycrypto/commit/8dbe0dc3eea5c689d4f76b37b93fe216cf1f00d4
+
+From 8dbe0dc3eea5c689d4f76b37b93fe216cf1f00d4 Mon Sep 17 00:00:00 2001
+From: Legrandin <helderijs@gmail.com>
+Date: Sun, 22 Dec 2013 22:24:46 +0100
+Subject: [PATCH] Throw exception when IV is used with ECB or CTR
+
+The IV parameter is currently ignored when initializing
+a cipher in ECB or CTR mode.
+
+For CTR mode, it is confusing: it takes some time to see
+that a different parameter is needed (the counter).
+
+For ECB mode, it is outright dangerous.
+
+This patch forces an exception to be raised.
+---
+ lib/Crypto/SelfTest/Cipher/common.py | 31 +++++++++++++++++++++++--------
+ src/block_template.c                 | 11 +++++++++++
+ 2 files changed, 34 insertions(+), 8 deletions(-)
+
+--- a/lib/Crypto/SelfTest/Cipher/common.py
++++ b/lib/Crypto/SelfTest/Cipher/common.py
+@@ -239,19 +239,34 @@ class RoundtripTest(unittest.TestCase):
+         return """%s .decrypt() output of .encrypt() should not be garbled""" % (self.module_name,)
+ 
+     def runTest(self):
+-        for mode in (self.module.MODE_ECB, self.module.MODE_CBC, self.module.MODE_CFB, self.module.MODE_OFB, self.module.MODE_OPENPGP):
++
++        ## ECB mode
++        mode = self.module.MODE_ECB
++        encryption_cipher = self.module.new(a2b_hex(self.key), mode)
++        ciphertext = encryption_cipher.encrypt(self.plaintext)
++        decryption_cipher = self.module.new(a2b_hex(self.key), mode)
++        decrypted_plaintext = decryption_cipher.decrypt(ciphertext)
++        self.assertEqual(self.plaintext, decrypted_plaintext)
++
++        ## OPENPGP mode
++        mode = self.module.MODE_OPENPGP
++        encryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv)
++        eiv_ciphertext = encryption_cipher.encrypt(self.plaintext)
++        eiv = eiv_ciphertext[:self.module.block_size+2]
++        ciphertext = eiv_ciphertext[self.module.block_size+2:]
++        decryption_cipher = self.module.new(a2b_hex(self.key), mode, eiv)
++        decrypted_plaintext = decryption_cipher.decrypt(ciphertext)
++        self.assertEqual(self.plaintext, decrypted_plaintext)
++
++        ## All other non-AEAD modes (but CTR)
++        for mode in (self.module.MODE_CBC, self.module.MODE_CFB, self.module.MODE_OFB):
+             encryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv)
+             ciphertext = encryption_cipher.encrypt(self.plaintext)
+-            
+-            if mode != self.module.MODE_OPENPGP:
+-                decryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv)
+-            else:
+-                eiv = ciphertext[:self.module.block_size+2]
+-                ciphertext = ciphertext[self.module.block_size+2:]
+-                decryption_cipher = self.module.new(a2b_hex(self.key), mode, eiv)
++            decryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv)
+             decrypted_plaintext = decryption_cipher.decrypt(ciphertext)
+             self.assertEqual(self.plaintext, decrypted_plaintext)
+ 
++
+ class PGPTest(unittest.TestCase):
+     def __init__(self, module, params):
+         unittest.TestCase.__init__(self)
+--- a/src/block_template.c
++++ b/src/block_template.c
+@@ -170,6 +170,17 @@ ALGnew(PyObject *self, PyObject *args, P
+ 				"Key cannot be the null string");
+ 		return NULL;
+ 	}
++	if (IVlen != 0 && mode == MODE_ECB)
++	{
++		PyErr_Format(PyExc_ValueError, "ECB mode does not use IV");
++		return NULL;
++	}
++	if (IVlen != 0 && mode == MODE_CTR)
++	{
++		PyErr_Format(PyExc_ValueError,
++			"CTR mode needs counter parameter, not IV");
++		return NULL;
++	}
+ 	if (IVlen != BLOCK_SIZE && mode != MODE_ECB && mode != MODE_CTR)
+ 	{
+ 		PyErr_Format(PyExc_ValueError,
diff --git a/gnu/packages/patches/python-pygpgme-fix-pinentry-tests.patch b/gnu/packages/patches/python-pygpgme-fix-pinentry-tests.patch
new file mode 100644
index 0000000000..1f7a4cadb7
--- /dev/null
+++ b/gnu/packages/patches/python-pygpgme-fix-pinentry-tests.patch
@@ -0,0 +1,69 @@
+Fix test failure of test_XXX caused by upgrade of gpgme from 1.6.0 to
+1.8.0:
+
+======================================================================
+FAIL: test_encrypt_to_signonly (tests.test_encrypt_decrypt.EncryptDecryptTestCase)
+----------------------------------------------------------------------
+Traceback (most recent call last):
+  File "/tmp/guix-build-python2-pygpgme-0.3.drv-0/pygpgme-0.3/tests/test_encrypt_decrypt.py", line 185, in test_encrypt_to_signonly
+    self.assertEqual(exc.args[0], gpgme.ERR_SOURCE_UNKNOWN)
+AssertionError: 7 != 0
+
+----------------------------------------------------------------------
+
+Patch copied from the Debian package pygpgme-0.3-1.2:
+
+https://sources.debian.net/src/pygpgme/0.3-1.2/debian/patches/0005-Fix-test-failures-with-pinentry.patch/
+
+From: "Dr. Tobias Quathamer" <toddy@debian.org>
+Date: Thu, 24 Nov 2016 12:20:54 +0100
+Subject: Fix test failures with pinentry
+
+---
+ tests/test_encrypt_decrypt.py | 5 +++--
+ tests/test_passphrase.py      | 2 ++
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/tests/test_encrypt_decrypt.py b/tests/test_encrypt_decrypt.py
+index 21ae83e..05707e1 100644
+--- a/tests/test_encrypt_decrypt.py
++++ b/tests/test_encrypt_decrypt.py
+@@ -132,6 +132,7 @@ class EncryptDecryptTestCase(GpgHomeTestCase):
+             os.write(fd, b'Symmetric passphrase\n')
+         ctx = gpgme.Context()
+         ctx.armor = True
++        ctx.pinentry_mode = gpgme.PINENTRY_MODE_LOOPBACK
+         ctx.passphrase_cb = passphrase
+         ctx.encrypt(None, 0, plaintext, ciphertext)
+         self.assertTrue(
+@@ -182,8 +183,8 @@ class EncryptDecryptTestCase(GpgHomeTestCase):
+             ctx.encrypt([recipient], gpgme.ENCRYPT_ALWAYS_TRUST,
+                         plaintext, ciphertext)
+         except gpgme.GpgmeError as exc:
+-            self.assertEqual(exc.args[0], gpgme.ERR_SOURCE_UNKNOWN)
+-            self.assertEqual(exc.args[1], gpgme.ERR_GENERAL)
++            self.assertEqual(exc.args[0], gpgme.ERR_SOURCE_GPGME)
++            self.assertEqual(exc.args[1], gpgme.ERR_UNUSABLE_PUBKEY)
+         else:
+             self.fail('gpgme.GpgmeError not raised')
+ 
+diff --git a/tests/test_passphrase.py b/tests/test_passphrase.py
+index 35b3c59..05e6811 100644
+--- a/tests/test_passphrase.py
++++ b/tests/test_passphrase.py
+@@ -34,6 +34,7 @@ class PassphraseTestCase(GpgHomeTestCase):
+         ctx = gpgme.Context()
+         key = ctx.get_key('EFB052B4230BBBC51914BCBB54DCBBC8DBFB9EB3')
+         ctx.signers = [key]
++        ctx.pinentry_mode = gpgme.PINENTRY_MODE_LOOPBACK
+         plaintext = BytesIO(b'Hello World\n')
+         signature = BytesIO()
+ 
+@@ -55,6 +56,7 @@ class PassphraseTestCase(GpgHomeTestCase):
+         ctx = gpgme.Context()
+         key = ctx.get_key('EFB052B4230BBBC51914BCBB54DCBBC8DBFB9EB3')
+         ctx.signers = [key]
++        ctx.pinentry_mode = gpgme.PINENTRY_MODE_LOOPBACK
+         ctx.passphrase_cb = self.passphrase_cb
+         plaintext = BytesIO(b'Hello World\n')
+         signature = BytesIO()
diff --git a/gnu/packages/patches/qemu-CVE-2016-8576.patch b/gnu/packages/patches/qemu-CVE-2016-8576.patch
deleted file mode 100644
index 5031b59d81..0000000000
--- a/gnu/packages/patches/qemu-CVE-2016-8576.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-From 20009bdaf95d10bf748fa69b104672d3cfaceddf Mon Sep 17 00:00:00 2001
-From: Gerd Hoffmann <kraxel@redhat.com>
-Date: Fri, 7 Oct 2016 10:15:29 +0200
-Subject: [PATCH] xhci: limit the number of link trbs we are willing to process
-
-Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
----
- hw/usb/hcd-xhci.c | 10 ++++++++++
- 1 file changed, 10 insertions(+)
-
-diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
-index 726435c..ee4fa48 100644
---- a/hw/usb/hcd-xhci.c
-+++ b/hw/usb/hcd-xhci.c
-@@ -54,6 +54,8 @@
-  * to the specs when it gets them */
- #define ER_FULL_HACK
- 
-+#define TRB_LINK_LIMIT  4
-+
- #define LEN_CAP         0x40
- #define LEN_OPER        (0x400 + 0x10 * MAXPORTS)
- #define LEN_RUNTIME     ((MAXINTRS + 1) * 0x20)
-@@ -1000,6 +1002,7 @@ static TRBType xhci_ring_fetch(XHCIState *xhci, XHCIRing *ring, XHCITRB *trb,
-                                dma_addr_t *addr)
- {
-     PCIDevice *pci_dev = PCI_DEVICE(xhci);
-+    uint32_t link_cnt = 0;
- 
-     while (1) {
-         TRBType type;
-@@ -1026,6 +1029,9 @@ static TRBType xhci_ring_fetch(XHCIState *xhci, XHCIRing *ring, XHCITRB *trb,
-             ring->dequeue += TRB_SIZE;
-             return type;
-         } else {
-+            if (++link_cnt > TRB_LINK_LIMIT) {
-+                return 0;
-+            }
-             ring->dequeue = xhci_mask64(trb->parameter);
-             if (trb->control & TRB_LK_TC) {
-                 ring->ccs = !ring->ccs;
-@@ -1043,6 +1049,7 @@ static int xhci_ring_chain_length(XHCIState *xhci, const XHCIRing *ring)
-     bool ccs = ring->ccs;
-     /* hack to bundle together the two/three TDs that make a setup transfer */
-     bool control_td_set = 0;
-+    uint32_t link_cnt = 0;
- 
-     while (1) {
-         TRBType type;
-@@ -1058,6 +1065,9 @@ static int xhci_ring_chain_length(XHCIState *xhci, const XHCIRing *ring)
-         type = TRB_TYPE(trb);
- 
-         if (type == TR_LINK) {
-+            if (++link_cnt > TRB_LINK_LIMIT) {
-+                return -length;
-+            }
-             dequeue = xhci_mask64(trb.parameter);
-             if (trb.control & TRB_LK_TC) {
-                 ccs = !ccs;
--- 
-1.8.3.1
-
diff --git a/gnu/packages/patches/qemu-CVE-2016-8577.patch b/gnu/packages/patches/qemu-CVE-2016-8577.patch
deleted file mode 100644
index c4132d2fb1..0000000000
--- a/gnu/packages/patches/qemu-CVE-2016-8577.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-Subject: [Qemu-devel] [PATCH] 9pfs: fix potential host memory leak in v9fs_read
-From: Li Qiang <liq3ea@gmail.com>
-
-In 9pfs read dispatch function, it doesn't free two QEMUIOVector
-object thus causing potential memory leak. This patch avoid this.
-
-Signed-off-by: Li Qiang <liq3ea@gmail.com>
----
- hw/9pfs/9p.c | 5 +++--
-  1 file changed, 3 insertions(+), 2 deletions(-)
-
-diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c
-index 119ee58..543a791 100644
---- a/hw/9pfs/9p.c
-+++ b/hw/9pfs/9p.c
-@@ -1826,14 +1826,15 @@ static void v9fs_read(void *opaque)
-             if (len < 0) {
-                 /* IO error return the error */
-                 err = len;
--                goto out;
-+                goto out_free_iovec;
-             }
-         } while (count < max_count && len > 0);
-         err = pdu_marshal(pdu, offset, "d", count);
-         if (err < 0) {
--            goto out;
-+            goto out_free_iovec;
-         }
-         err += offset + count;
-+out_free_iovec:
-         qemu_iovec_destroy(&qiov);
-         qemu_iovec_destroy(&qiov_full);
-     } else if (fidp->fid_type == P9_FID_XATTR) {
--- 
-1.8.3.1
-
diff --git a/gnu/packages/patches/qemu-CVE-2016-8578.patch b/gnu/packages/patches/qemu-CVE-2016-8578.patch
deleted file mode 100644
index 92ba365727..0000000000
--- a/gnu/packages/patches/qemu-CVE-2016-8578.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From: Li Qiang <liq3ea@gmail.com>
-
-In 9pfs function v9fs_iov_vunmarshal, it will not allocate space
-for empty string. This will cause several NULL pointer dereference
-issues. this patch fix this issue.
-
-Signed-off-by: Li Qiang <liq3ea@gmail.com>
----
- fsdev/9p-iov-marshal.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/fsdev/9p-iov-marshal.c b/fsdev/9p-iov-marshal.c
-index 663cad5..1d16f8d 100644
---- a/fsdev/9p-iov-marshal.c
-+++ b/fsdev/9p-iov-marshal.c
-@@ -125,7 +125,7 @@ ssize_t v9fs_iov_vunmarshal(struct iovec *out_sg, int out_num, size_t offset,
-                 str->data = g_malloc(str->size + 1);
-                 copied = v9fs_unpack(str->data, out_sg, out_num, offset,
-                                      str->size);
--                if (copied > 0) {
-+                if (copied >= 0) {
-                     str->data[str->size] = 0;
-                 } else {
-                     v9fs_string_free(str);
--- 
-1.8.3.1
-
diff --git a/gnu/packages/patches/ruby-yard-fix-skip-of-markdown-tests.patch b/gnu/packages/patches/ruby-yard-fix-skip-of-markdown-tests.patch
deleted file mode 100644
index f592f5cd51..0000000000
--- a/gnu/packages/patches/ruby-yard-fix-skip-of-markdown-tests.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-The tests currently fail due to use of 'skip' rather than 'pending' to skip a
-test usually not skipped by upstream.  This patch has been proposed upstream
-at https://github.com/lsegal/yard/pull/1033
-
-diff --git a/spec/templates/helpers/html_helper_spec.rb b/spec/templates/helpers/html_helper_spec.rb
-index 84624c3..9c4fc2b 100644
---- a/spec/templates/helpers/html_helper_spec.rb
-+++ b/spec/templates/helpers/html_helper_spec.rb
-@@ -184,7 +184,7 @@ describe YARD::Templates::Helpers::HtmlHelper do
-     it "creates tables (markdown specific)" do
-       log.enter_level(Logger::FATAL) do
-         unless markup_class(:markdown).to_s == "RedcarpetCompat"
--          skip "This test depends on a markdown engine that supports tables"
-+          pending "This test depends on a markdown engine that supports tables"
-         end
-       end
- 
diff --git a/gnu/packages/patches/slock-CVE-2016-6866.patch b/gnu/packages/patches/slock-CVE-2016-6866.patch
deleted file mode 100644
index 2f94b8c1a9..0000000000
--- a/gnu/packages/patches/slock-CVE-2016-6866.patch
+++ /dev/null
@@ -1,51 +0,0 @@
-Fix CVE-2016-6866.
-
-https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-6866
-https://security-tracker.debian.org/tracker/CVE-2016-6866
-
-Copied from upstream source repository:
-http://git.suckless.org/slock/commit/?id=d8bec0f6fdc8a246d78cb488a0068954b46fcb29
-
-From d8bec0f6fdc8a246d78cb488a0068954b46fcb29 Mon Sep 17 00:00:00 2001
-From: Markus Teich <markus.teich@stusta.mhn.de>
-Date: Tue, 30 Aug 2016 22:59:06 +0000
-Subject: fix CVE-2016-6866
-
----
-diff --git a/slock.c b/slock.c
-index 847b328..8ed59ca 100644
---- a/slock.c
-+++ b/slock.c
-@@ -123,7 +123,7 @@ readpw(Display *dpy)
- readpw(Display *dpy, const char *pws)
- #endif
- {
--	char buf[32], passwd[256];
-+	char buf[32], passwd[256], *encrypted;
- 	int num, screen;
- 	unsigned int len, color;
- 	KeySym ksym;
-@@ -159,7 +159,11 @@ readpw(Display *dpy, const char *pws)
- #ifdef HAVE_BSD_AUTH
- 				running = !auth_userokay(getlogin(), NULL, "auth-slock", passwd);
- #else
--				running = !!strcmp(crypt(passwd, pws), pws);
-+				errno = 0;
-+				if (!(encrypted = crypt(passwd, pws)))
-+					fprintf(stderr, "slock: crypt: %s\n", strerror(errno));
-+				else
-+					running = !!strcmp(encrypted, pws);
- #endif
- 				if (running) {
- 					XBell(dpy, 100);
-@@ -312,6 +316,8 @@ main(int argc, char **argv) {
- 
- #ifndef HAVE_BSD_AUTH
- 	pws = getpw();
-+	if (strlen(pws) < 2)
-+		die("slock: failed to get user password hash.\n");
- #endif
- 
- 	if (!(dpy = XOpenDisplay(NULL)))
---
-cgit v0.9.0.3-65-g4555
diff --git a/gnu/packages/patches/unrtf-CVE-2016-10091.patch b/gnu/packages/patches/unrtf-CVE-2016-10091.patch
new file mode 100644
index 0000000000..badd1b8ed6
--- /dev/null
+++ b/gnu/packages/patches/unrtf-CVE-2016-10091.patch
@@ -0,0 +1,189 @@
+Fix CVE-2016-10091 (stack-based buffer overflows in cmd_* functions):
+
+https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10091
+https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=849705
+http://seclists.org/oss-sec/2016/q4/787
+
+Patch adapted from Debian:
+
+https://anonscm.debian.org/cgit/collab-maint/unrtf.git/commit/?h=jessie&id=7500a48fb0fbad3ab963fb17560b2f90a8a485c8
+
+The Debian patch adapts this upstream commit so that it can be applied
+to the 0.21.9 release tarball:
+
+http://hg.savannah.gnu.org/hgweb/unrtf/rev/3b16893a6406
+
+From 7dd568ed8a6a5acb6c04f2b40f457d63a00435f3 Mon Sep 17 00:00:00 2001
+From: Willi Mann <willi@debian.org>
+Date: Sat, 31 Dec 2016 20:31:38 +0100
+Subject: [PATCH] Add patch from upstream to fix CVE-2016-10091 (buffer
+ overflow in various cmd_ functions)
+
+diff --git a/src/attr.c b/src/attr.c
+index 02b5c81..e2951ea 100644
+--- a/src/attr.c
++++ b/src/attr.c
+@@ -746,7 +746,7 @@ char *
+ assemble_string(char *string, int nr)
+ {
+ 
+-	char *s, tmp[12];/* Number of characters that can be in int type (including '\0') - AF */
++	char *s, tmp[20];
+ 	int i = 0, j = 0;
+ 
+ 	if (string == NULL)
+@@ -762,7 +762,7 @@ assemble_string(char *string, int nr)
+ 		}
+ 
+ 		if (string[i] != '\0') {
+-			sprintf(tmp, "%d", nr);
++			snprintf(tmp, 20, "%d", nr);
+ 			strcpy(&s[j], tmp);
+ 			j = j + strlen(tmp);
+ 		}
+diff --git a/src/convert.c b/src/convert.c
+index c76d7d6..8eacdcb 100644
+--- a/src/convert.c
++++ b/src/convert.c
+@@ -472,7 +472,7 @@ static const int fcharsetparmtocp(int parm)
+ }
+ 
+ // Translate code page to encoding name hopefully suitable as iconv input
+-static char *cptoencoding(parm)
++static char *cptoencoding(int parm)
+ {
+     // Note that CP0 is supposed to mean current system default, which does
+     // not make any sense as a stored value, we don't handle it.
+@@ -964,7 +964,7 @@ cmd_cf (Word *w, int align, char has_param, int num)
+ 	}
+ 	else
+ 	{
+-		sprintf(str,"#%02x%02x%02x",
++		snprintf(str, 40, "#%02x%02x%02x",
+ 			color_table[num].r,
+ 			color_table[num].g,
+ 			color_table[num].b);
+@@ -993,7 +993,7 @@ cmd_cb (Word *w, int align, char has_param, int num)
+ 	}
+ 	else
+ 	{
+-		sprintf(str,"#%02x%02x%02x",
++		snprintf(str, 40, "#%02x%02x%02x",
+ 			color_table[num].r,
+ 			color_table[num].g,
+ 			color_table[num].b);
+@@ -1018,7 +1018,7 @@ cmd_fs (Word *w, int align, char has_param, int points) {
+ 	/* Note, fs20 means 10pt */
+ 	points /= 2;
+ 
+-	sprintf(str,"%d",points);
++	snprintf(str, 20, "%d", points);
+ 	attr_push(ATTR_FONTSIZE,str);
+ 
+ 	return FALSE;
+@@ -1166,7 +1166,7 @@ cmd_f (Word *w, int align, char has_param, int num)
+         {
+             // TOBEDONE: WHAT'S THIS ???
+             name = my_malloc(12);
+-            sprintf(name, "%d", num);
++			snprintf(name, 12, "%d", num);
+         }
+ 
+         /* we are going to output entities, so should not output font */
+@@ -1218,7 +1218,7 @@ cmd_highlight (Word *w, int align, char has_param, int num)
+ 	}
+ 	else
+ 	{
+-		sprintf(str,"#%02x%02x%02x",
++		snprintf(str, 40, "#%02x%02x%02x",
+ 			color_table[num].r,
+ 			color_table[num].g,
+ 			color_table[num].b);
+@@ -1373,9 +1373,9 @@ cmd_ftech (Word *w, int align, char has_param, int param) {
+ 
+ static int 
+ cmd_expand (Word *w, int align, char has_param, int param) {
+-	char str[10];
++	char str[20];
+ 	if (has_param) {
+-		sprintf(str, "%d", param/4);
++		snprintf(str, 20, "%d", param / 4);
+ 		if (!param) 
+ 			attr_pop(ATTR_EXPAND);
+ 		else 
+@@ -1394,7 +1394,7 @@ cmd_expand (Word *w, int align, char has_param, int param) {
+ 
+ static int 
+ cmd_emboss (Word *w, int align, char has_param, int param) {
+-	char str[10];
++	char str[20];
+ 	if (has_param && !param)
+ #ifdef SUPPORT_UNNESTED
+ 		attr_find_pop(ATTR_EMBOSS);
+@@ -1403,7 +1403,7 @@ cmd_emboss (Word *w, int align, char has_param, int param) {
+ #endif
+ 	else
+ 	{
+-		sprintf(str, "%d", param);
++		snprintf(str, 20, "%d", param);
+ 		attr_push(ATTR_EMBOSS, str);
+ 	}
+ 	return FALSE;
+@@ -1419,12 +1419,12 @@ cmd_emboss (Word *w, int align, char has_param, int param) {
+ 
+ static int 
+ cmd_engrave (Word *w, int align, char has_param, int param) {
+-	char str[10];
++	char str[20];
+ 	if (has_param && !param) 
+ 		attr_pop(ATTR_ENGRAVE);
+ 	else
+ 	{
+-		sprintf(str, "%d", param);
++		snprintf(str, 20, "%d", param);
+ 		attr_push(ATTR_ENGRAVE, str);
+ 	}
+ 	return FALSE;
+@@ -1976,7 +1976,7 @@ static int cmd_u (Word *w, int align, char has_param, int param) {
+ 
+ 	short	done=0;
+ 	long unicode_number = (long) param; /* On 16bit architectures int is too small to store unicode characters. - AF */
+-	char tmp[12]; /* Number of characters that can be in int type (including '\0'). If int size is greater than 4 bytes change this value. - AF */
++	char tmp[20]; /* Number of characters that can be in int type (including '\0'). If int size is greater than 4 bytes change this value. - AF */
+ 	const char *alias;
+ #define DEBUG 0
+ #if DEBUG
+@@ -2006,7 +2006,7 @@ static int cmd_u (Word *w, int align, char has_param, int param) {
+                             /* RTF spec: Unicode values beyond 32767 are represented by negative numbers */
+ 				unicode_number += 65536;
+ 			}
+-			sprintf(tmp, "%ld", unicode_number);
++			snprintf(tmp, 20, "%ld", unicode_number);
+ 
+ 			if (safe_printf(1, op->unisymbol_print, tmp)) fprintf(stderr, TOO_MANY_ARGS, "unisymbol_print");
+ 			done++;
+diff --git a/src/output.c b/src/output.c
+index 86d8b5c..4cdbfa6 100644
+--- a/src/output.c
++++ b/src/output.c
+@@ -320,7 +320,7 @@ op_begin_std_fontsize (OutputPersonality *op, int size)
+ 	if (!found_std_expr) {
+ 		if (op->fontsize_begin) {
+ 			char expr[16];
+-			sprintf (expr, "%d", size);
++			snprintf(expr, 16, "%d", size);
+ 			if (safe_printf (1, op->fontsize_begin, expr)) fprintf(stderr, TOO_MANY_ARGS, "fontsize_begin");
+ 		} else {
+ 			/* If we cannot write out a change for the exact
+@@ -440,7 +440,7 @@ op_end_std_fontsize (OutputPersonality *op, int size)
+ 	if (!found_std_expr) {
+ 		if (op->fontsize_end) {
+ 			char expr[16];
+-			sprintf (expr, "%d", size);
++			snprintf(expr, 16, "%d", size);
+ 			if (safe_printf(1, op->fontsize_end, expr)) fprintf(stderr, TOO_MANY_ARGS, "fontsize_end");
+ 		} else {
+ 			/* If we cannot write out a change for the exact
+- 
+.11.0
+
diff --git a/gnu/packages/pdf.scm b/gnu/packages/pdf.scm
index 1c04824ea6..b86647d4ee 100644
--- a/gnu/packages/pdf.scm
+++ b/gnu/packages/pdf.scm
@@ -72,14 +72,14 @@
 (define-public poppler
   (package
    (name "poppler")
-   (version "0.47.0")
+   (version "0.50.0")
    (source (origin
             (method url-fetch)
             (uri (string-append "https://poppler.freedesktop.org/poppler-"
                                 version ".tar.xz"))
             (sha256
              (base32
-              "0hnjkcqqk87dw3hlda4gh4l7brkslniax9a79g772jn3iwiffwmq"))))
+              "0dmwnh59m75vhii6dw63x8l0qa0ha733pb8bdqzr7lw9nwc37jf9"))))
    (build-system gnu-build-system)
    ;; FIXME:
    ;;  use libcurl:        no
@@ -89,7 +89,7 @@
              ("libpng" ,libpng)
              ("libtiff" ,libtiff)
              ("lcms" ,lcms)
-             ("openjpeg-1" ,openjpeg-1)
+             ("openjpeg-1" ,openjpeg-1) ; prefers openjpeg-1
              ("zlib" ,zlib)
 
              ;; To build poppler-glib (as needed by Evince), we need Cairo and
@@ -117,7 +117,8 @@
             (setenv "CPATH"
                     (string-append (assoc-ref %build-inputs "openjpeg-1")
                                    "/include/openjpeg-1.5"
-                                   ":" (or (getenv "CPATH") ""))))))))
+                                   ":" (or (getenv "CPATH") "")))
+            #t)))))
    (synopsis "PDF rendering library")
    (description
     "Poppler is a PDF rendering library based on the xpdf-3.0 code base.")
diff --git a/gnu/packages/perl.scm b/gnu/packages/perl.scm
index 6b4370dbf2..09278f4251 100644
--- a/gnu/packages/perl.scm
+++ b/gnu/packages/perl.scm
@@ -12,6 +12,7 @@
 ;;; Copyright © 2016 Roel Janssen <roel@gnu.org>
 ;;; Copyright © 2016 Ben Woodcroft <donttrustben@gmail.com>
 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
+;;; Copyright © 2017 Raoul J.P. Bonnal <ilpuccio.febo@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -626,6 +627,25 @@ cases where the clan modules are not classes derived from each other, and thus
 the Carp.pm module doesn't help.")
     (license (package-license perl))))
 
+(define-public perl-cddb-get
+  (package
+    (name "perl-cddb-get")
+    (version "2.28")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "mirror://cpan/authors/id/F/FO/FONKIE/CDDB_get-"
+                    version ".tar.gz"))
+              (sha256
+               (base32
+                "1jfrwvfasylcafbvb0jjm94ad4v6k99a7rf5i4qwzhg4m0gvmk5x"))))
+    (build-system perl-build-system)
+    (home-page "http://search.cpan.org/dist/CDDB_get")
+    (synopsis "Read the CDDB entry for an audio CD in your drive")
+    (description "This module can retrieve information from the CDDB.")
+    ;; Either GPLv2 or the "Artistic" license.
+    (license (list gpl2 artistic2.0))))
+
 (define-public perl-class-accessor
   (package
     (name "perl-class-accessor")
@@ -1303,7 +1323,7 @@ Password Generator\".")
                                              ,(package-version perl)
                                              "/czplib/"))
             #t)))))
-    (home-page "http://sourceforge.net/projects/czplib/")
+    (home-page "https://sourceforge.net/projects/czplib/")
     (synopsis "Library for genomic analysis")
     (description "Chaolin Zhang's Perl Library (czplib) contains assorted
 functions and data structures for processing and analysing genomic and
@@ -4995,6 +5015,30 @@ show those variables which are in scope at the point of the call.  PadWalker
 is particularly useful for debugging.")
     (license (package-license perl))))
 
+(define-public perl-parallel-forkmanager
+  (package
+    (name "perl-parallel-forkmanager")
+    (version "1.19")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://cpan/authors/id/Y/YA/YANICK/Parallel-ForkManager-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "0wm4wp6p3ah5z212jl12728z68nmxmfr0f03z1jpvdzffnc2xppi"))))
+    (build-system perl-build-system)
+    (native-inputs
+     `(("perl-test-warn" ,perl-test-warn)))
+    (home-page "http://search.cpan.org/dist/Parallel-ForkManager")
+    (synopsis "Simple parallel processing fork manager")
+    (description "@code{Parallel::ForkManager} is intended for use in
+operations that can be done in parallel where the number of
+processes to be forked off should be limited.")
+    (license (package-license perl))))
+
 (define-public perl-params-util
   (package
     (name "perl-params-util")
diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm
index 9388534c98..bfd003ba3e 100644
--- a/gnu/packages/python.scm
+++ b/gnu/packages/python.scm
@@ -11,7 +11,7 @@
 ;;; Copyright © 2015, 2016 Christopher Allan Webber <cwebber@dustycloud.org>
 ;;; Copyright © 2015 Eric Dvorsak <eric@dvorsak.fr>
 ;;; Copyright © 2015, 2016 David Thompson <davet@gnu.org>
-;;; Copyright © 2015, 2016 Leo Famulari <leo@famulari.name>
+;;; Copyright © 2015, 2016, 2017 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2015 Ben Woodcroft <donttrustben@gmail.com>
 ;;; Copyright © 2015, 2016 Erik Edrosa <erik.edrosa@gmail.com>
 ;;; Copyright © 2015, 2016 Efraim Flashner <efraim@flashner.co.il>
@@ -32,7 +32,8 @@
 ;;; Copyright © 2016 Alex Vong <alexvong1995@gmail.com>
 ;;; Copyright © 2016 Arun Isaac <arunisaac@systemreboot.net>
 ;;; Copyright © 2016 Julien Lepiller <julien@lepiller.eu>
-;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2016, 2017 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2016 Thomas Danckaert <post@thomasdanckaert.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -651,14 +652,14 @@ on localhost.")
 (define-public python-pytz
   (package
     (name "python-pytz")
-    (version "2016.3")
+    (version "2016.10")
     (source
      (origin
       (method url-fetch)
       (uri (pypi-uri "pytz" version ".tar.bz2"))
       (sha256
        (base32
-        "1mjmrkk4vc5xzppw7fm0pli1nnbj57cvqv7jjv5whcmccyhxz4y1"))))
+        "0az099cyp6p5xbsvfcdacj4hvxncbwm2ayn3h55mcp07zb2b45kh"))))
     (build-system python-build-system)
     (arguments `(#:tests? #f)) ; no test target
     (home-page "http://pythonhosted.org/pytz")
@@ -675,14 +676,14 @@ using Python 2.4 or higher and provides access to the Olson timezone database.")
 (define-public python-babel
   (package
     (name "python-babel")
-    (version "2.3.2")
+    (version "2.3.4")
     (source
      (origin
       (method url-fetch)
       (uri (pypi-uri "Babel" version))
       (sha256
        (base32
-        "0k43pi0p1dwpds2w0km3fw92wixzxv2vw7p09capxmjz5cfh23lw"))))
+        "0x98qqqw35xllpcama013a9788ly84z8dm1w2wwfpxh2710c8df5"))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-pytz" ,python-pytz)))
@@ -728,6 +729,51 @@ certificate returned by the server to which a connection has been established,
 and verifies that it matches the intended target hostname.")
     (license license:psfl)))
 
+(define-public python-hdf4
+  (package
+   (name "python-hdf4")
+   (version "0.9")
+   (source
+    (origin
+      (method url-fetch)
+      (uri (pypi-uri name version))
+      (sha256
+       (base32
+        "1hjiyrxvxk9817qyqky3nar4y3fs4z8wxz0n884zzb5wi6skrjks"))))
+   (build-system python-build-system)
+   (native-inputs `(("nose" ,python-nose)))
+   (propagated-inputs `(("numpy" ,python-numpy)))
+   (inputs
+    `(("hdf4" ,hdf4)
+      ("libjpeg" ,libjpeg)
+      ("zlib" ,zlib)))
+   (arguments
+    `(#:phases
+      (modify-phases %standard-phases
+        (replace 'check
+          (lambda _
+            ;; The 'runexamples' script sets PYTHONPATH to CWD, then goes
+            ;; on to import numpy. Somehow this works on their CI system.
+            ;; Let's just manage PYTHONPATH here instead.
+            (substitute* "runexamples.sh"
+              (("export PYTHONPATH=.*") ""))
+            (setenv "PYTHONPATH"
+                    (string-append (getcwd) ":"
+                                   (getenv "PYTHONPATH")))
+            (and (zero? (system* "./runexamples.sh"))
+                 (zero? (system* "nosetests" "-v"))))))))
+   (home-page "https://github.com/fhs/python-hdf4")
+   (synopsis "Python interface to the NCSA HDF4 library")
+   (description
+    "Python-HDF4 is a python wrapper around the NCSA HDF version 4 library,
+which implements the SD (Scientific Dataset), VS (Vdata) and V (Vgroup) API’s.
+NetCDF files can also be read and modified.  Python-HDF4 is a fork of
+@url{http://hdfeos.org/software/pyhdf.php,pyhdf}.")
+   (license license:expat)))
+
+(define-public python2-hdf4
+  (package-with-python2 python-hdf4))
+
 (define-public python-h5py
   (package
     (name "python-h5py")
@@ -777,6 +823,57 @@ concepts.")
 (define-public python2-h5py
   (package-with-python2 python-h5py))
 
+(define-public python-netcdf4
+  (package
+    (name "python-netcdf4")
+    (version "1.2.6")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "netCDF4" version))
+       (sha256
+        (base32
+         "1qcymsfxsdfr4sx0vl7ih5d14z66k6c9sjy4gb6rjaksk5387zvg"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-cython" ,python-cython)))
+    (propagated-inputs
+     `(("python-numpy" ,python-numpy)))
+    (inputs
+     `(("netcdf" ,netcdf)
+       ("hdf4" ,hdf4)
+       ("hdf5" ,hdf5)))
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (setenv "NO_NET" "1") ; disable opendap tests
+             (with-directory-excursion "test"
+               (setenv "PYTHONPATH" ; find and add the library we just built
+                       (string-append
+                        (car (find-files "../build" "lib.*"
+                                         #:directories? #:t
+                                         #:fail-on-error? #:t))
+                        ":" (getenv "PYTHONPATH")))
+               (zero? (system* "python" "run_all.py"))))))))
+    (home-page
+     "https://github.com/Unidata/netcdf4-python")
+    (synopsis "Python/numpy interface to the netCDF library")
+    (description "Netcdf4-python is a Python interface to the netCDF C
+library.  netCDF version 4 has many features not found in earlier
+versions of the library and is implemented on top of HDF5.  This module
+can read and write files in both the new netCDF 4 and the old netCDF 3
+format, and can create files that are readable by HDF5 clients.  The
+API is modelled after @code{Scientific.IO.NetCDF}, and should be familiar
+to users of that module.")
+    ;; The software is mainly ISC, but includes some files covered
+    ;; by the Expat license.
+    (license (list license:isc license:expat))))
+
+(define-public python2-netcdf4
+  (package-with-python2 python-netcdf4))
+
 (define-public python-lockfile
   (package
     (name "python-lockfile")
@@ -810,14 +907,13 @@ API for locking files.")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "https://pypi.python.org/packages/source/m/mock/"
-                           "mock-" version ".tar.gz"))
+       (uri (pypi-uri "mock" version))
        (sha256
         (base32
          "0kzlsbki6q0awf89rc287f3aj8x431lrajf160a70z0ikhnxsfdq"))))
     (build-system python-build-system)
     (arguments '(#:test-target "check"))
-    (home-page "http://code.google.com/p/mock/")
+    (home-page "https://github.com/testing-cabal/mock")
     (synopsis "Python mocking and patching library for testing")
     (description
      "Mock is a library for testing in Python.  It allows you to replace parts
@@ -875,7 +971,11 @@ Python 3 support.")
 (define-public python2-setuptools
   (package-with-python2 python-setuptools))
 
-
+;;; Pycrypto is abandoned upstream:
+;;;
+;;; https://github.com/dlitz/pycrypto/issues/173
+;;;
+;;; TODO Remove this package from GNU Guix.
 (define-public python-pycrypto
   (package
     (name "python-pycrypto")
@@ -883,8 +983,8 @@ Python 3 support.")
     (source
      (origin
       (method url-fetch)
-      (uri (string-append "https://pypi.python.org/packages/source/p/"
-                          "pycrypto/pycrypto-" version ".tar.gz"))
+      (uri (pypi-uri "pycrypto" version))
+      (patches (search-patches "python-pycrypto-CVE-2013-7459.patch"))
       (sha256
        (base32
         "0g0ayql5b9mkjam8hym6zyg6bv77lbh66rv1fyvgqb17kfc1xkpj"))))
@@ -1176,15 +1276,14 @@ Python 3.3+.")
 (define-public python-pyicu
   (package
     (name "python-pyicu")
-    (version "1.9.2")
+    (version "1.9.5")
     (source
      (origin
       (method url-fetch)
-      (uri (string-append "https://pypi.python.org/packages/source/P/PyICU/PyICU-"
-                          version ".tar.gz"))
+      (uri (pypi-uri "PyICU" version))
       (sha256
        (base32
-        "1diba0g8md614fvm9yf50paiwdkhj6rd7xwf1rg9mc0pxc0hhn4v"))))
+        "16rmxy9y0qhqqna2v49i7nzwm09as699rbyvh4raw7w602w55c3k"))))
     (build-system python-build-system)
     (inputs
      `(("icu4c" ,icu4c)))
@@ -2292,14 +2391,14 @@ is used by the Requests library to verify HTTPS requests.")
 (define-public python-click
   (package
     (name "python-click")
-    (version "6.6")
+    (version "6.7")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "click" version))
        (sha256
         (base32
-         "1sggipyz52crrybwbr9xvwxd4aqigvplf53k9w3ygxmzivd1jsnc"))))
+         "02qkfpykbq35id8glfgwc38yc430427yd05z1wc5cnld8zgicmgi"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -2462,6 +2561,34 @@ version numbers.")
              (propagated-inputs
               `(("python2-functools32" ,python2-functools32))))))
 
+(define-public python-kitchen
+  (package
+    (name "python-kitchen")
+    (version "1.2.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "kitchen" version))
+       (sha256
+        (base32
+         "0ggv3p4x8jvmmzhp0xm00h6pvh1g0gmycw71rjwagnrj8n23vxrq"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-chardet" ,python-chardet)))
+    (home-page "https://fedorahosted.org/kitchen")
+    (synopsis "Python API for snippets")
+    (description "@code{kitchen} module provides a python API for all sorts of
+little useful snippets of code that everybody ends up writing for their projects
+but never seem big enough to build an independent release.  Use kitchen and stop
+cutting and pasting that code over and over.")
+    (license (list license:lgpl2.1+
+                   ;; subprocess.py, test_subprocess.py,
+                   ;; kitchen/pycompat25/defaultdict.py:
+                   license:psfl))))
+
+(define-public python2-kitchen
+  (package-with-python2 python-kitchen))
+
 (define-public python-unidecode
   (package
     (name "python-unidecode")
@@ -2570,16 +2697,14 @@ environments and back.")
 (define-public python-pyyaml
   (package
     (name "python-pyyaml")
-    (version "3.11")
+    (version "3.12")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append
-             "https://pypi.python.org/packages/source/P/PyYAML/PyYAML-"
-             version ".tar.gz"))
+       (uri (pypi-uri "PyYAML" version))
        (sha256
         (base32
-         "1s26125vfnskng58ym37xhwv8v0mm95b2cwbjfag8prfhy596v63"))))
+         "1aqjl8dk9amd4zr99n8v2qxzgmr2hdvqfma4zh7a41rj6336c9sr"))))
     (build-system python-build-system)
     (inputs
      `(("libyaml" ,libyaml)))
@@ -2769,16 +2894,14 @@ logging and tracing of the execution.")
 (define-public python-docutils
   (package
     (name "python-docutils")
-    (version "0.12")
+    (version "0.13.1")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append
-             "https://pypi.python.org/packages/source/d/docutils/docutils-"
-             version ".tar.gz"))
+       (uri (pypi-uri "docutils" version))
        (sha256
         (base32
-         "1ylnjnw1x4b2y7blr6x35ncdzn69k253kw4cdkv6asdb21w73ny7"))))
+         "1gkma47i609jfs7dssxn4y9vsz06qi0l5q41nws0zgkpnrghz33i"))))
     (build-system python-build-system)
     (arguments
      '(#:tests? #f)) ; no setup.py test command
@@ -2798,14 +2921,14 @@ reStructuredText.")
 (define-public python-pygments
   (package
     (name "python-pygments")
-    (version "2.0.2")
+    (version "2.1.3")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "Pygments" version))
        (sha256
         (base32
-         "0lagrwifsgn0s8bzqahpr87p7gd38xja8f06akscinp6hj89283k"))))
+         "10axnp2wpjnq9g8wg53fx0c70dfxqrz498jyz8mrdx9a3flwir48"))))
     (build-system python-build-system)
     (arguments
      ;; FIXME: Tests require sphinx, which depends on this.
@@ -3008,7 +3131,7 @@ and is very extensible.")
 (define-public python-scikit-learn
   (package
     (name "python-scikit-learn")
-    (version "0.16.1")
+    (version "0.18.1")
     (source
      (origin
        (method url-fetch)
@@ -3018,7 +3141,7 @@ and is very extensible.")
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
         (base32
-         "140skabifgc7lvvj873pnzlwx0ni6q8qkrsyad2ccjb3h8rxzkih"))))
+         "1hwswckdmd27f7k1jvwdc0m4mqrgxl2s245yq1scq34v124bjqgq"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -3026,21 +3149,12 @@ and is very extensible.")
         'check 'set-HOME
         ;; some tests require access to "$HOME"
         (lambda _ (setenv "HOME" "/tmp"))
-        ;; Tests can only be run after the library has been installed and not
-        ;; within the source directory.
-        (alist-cons-after
-         'install 'check
-         (lambda _
-           (with-directory-excursion "/tmp"
-             ;; With Python 3 one test of 3334 fails
-             ;; (sklearn.tests.test_common.test_transformers); see
-             ;; https://github.com/scikit-learn/scikit-learn/issues/3693
-             (system* "nosetests" "-v" "sklearn")))
-         (alist-delete 'check %standard-phases)))))
+        %standard-phases)))
     (inputs
      `(("openblas" ,openblas)))
     (native-inputs
-     `(("python-nose" ,python-nose)))
+     `(("python-nose" ,python-nose)
+       ("python-cython" ,python-cython)))
     (propagated-inputs
      `(("python-numpy" ,python-numpy)
        ("python-scipy" ,python-scipy)))
@@ -3276,17 +3390,38 @@ capabilities.")
 (define python2-numpy-bootstrap
   (package-with-python2 python-numpy-bootstrap))
 
+(define-public python-munch
+  (package
+    (name "python-munch")
+    (version "2.0.4")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "munch" version))
+        (sha256
+         (base32
+          "1cmqg91xnqx8gvnh4pmp0bfl1dfcm65d5p9mg73zz8pkjhx6h80l"))))
+    (build-system python-build-system)
+    (home-page "https://github.com/Infinidat/munch")
+    (synopsis "Dot-accessible dictionary")
+    (description "Munch is a dot-accessible dictionary similar to JavaScript
+objects.")
+    (license license:expat)))
+
+(define-public python2-munch
+  (package-with-python2 python-munch))
+
 (define-public python2-fastlmm
   (package
     (name "python2-fastlmm")
-    (version "0.2.21")
+    (version "0.2.26")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "fastlmm" version ".zip"))
        (sha256
         (base32
-         "1q8c34rpmwkfy3r4d5172pzdkpfryj561897z9r3x22gq7813x1m"))))
+         "0yxrx9xzai4fyrsi7c2p31kxvpq9czmv1p0wax5ic07m6izbszxg"))))
     (build-system python-build-system)
     (arguments
      `(#:python ,python-2)) ; only Python 2.7 is supported
@@ -3374,6 +3509,33 @@ association studies (GWAS) on extremely large data sets.")
 (define-public python2-numpy
   (package-with-python2 python-numpy))
 
+(define-public python-pygit2
+  (package
+    (name "python-pygit2")
+    (version "0.25.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "pygit2" version))
+       (sha256
+        (base32
+         "0wf5rp0fvrw7j3j18dvwjq6xqlbm611wd55aphrfpps0v1gxh3ny"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-six" ,python-six)
+       ("python-cffi" ,python-cffi)
+       ("libgit2" ,libgit2)
+       ("python-tox" ,python-tox)))
+    (home-page "https://github.com/libgit2/pygit2")
+    (synopsis "Python bindings for libgit2")
+    (description "Pygit2 is a set of Python bindings to the libgit2 shared
+library, libgit2 implements Git plumbing.")
+    ;; GPL2.0 only, with linking exception.
+    (license license:gpl2)))
+
+(define-public python2-pygit2
+  (package-with-python2 python-pygit2))
+
 (define-public python-pyparsing
   (package
     (name "python-pyparsing")
@@ -3462,14 +3624,14 @@ that client code uses to construct the grammar directly in Python code.")
 (define-public python-numexpr
   (package
     (name "python-numexpr")
-    (version "2.6.0")
+    (version "2.6.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "numexpr" version))
        (sha256
         (base32
-         "0i6iagl2hhbr8q4qzbbjd859v5806vqylq87fq7pi914ps6d6cag"))))
+         "01lsja72m32z0i5p8rwxbfyzk4mplh72k2a140nwh8vv4wpyfbnv"))))
     (build-system python-build-system)
     (arguments `(#:tests? #f))          ; no tests included
     (propagated-inputs
@@ -4172,38 +4334,36 @@ a general image processing tool.")
 (define-public python-pycparser
   (package
     (name "python-pycparser")
-    (version "2.14")
+    (version "2.17")
     (source
      (origin
       (method url-fetch)
       (uri (pypi-uri "pycparser" version))
       (sha256
        (base32
-        "0wvzyb6rxsfj3xcnpa4ynbh9qc7rrbk2277d5wqpphmx9akv8nbr"))))
+        "1dkkjri0miidqb1zcqhqljfa34fcy9k5akasgwsv6k622zlk3b0a"))))
     (outputs '("out" "doc"))
     (build-system python-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)))
     (arguments
      `(#:phases
-       (alist-replace
-        'check
-        (lambda _
-          (with-directory-excursion "tests"
-            (zero? (system* "python" "all_tests.py"))))
-        (alist-cons-after
-         'install 'install-doc
-         (lambda* (#:key outputs #:allow-other-keys)
-           (let* ((data (string-append (assoc-ref outputs "doc") "/share"))
-                  (doc (string-append data "/doc/" ,name "-" ,version))
-                  (examples (string-append doc "/examples")))
-             (mkdir-p examples)
-             (for-each (lambda (file)
-                         (copy-file (string-append "." file)
-                                    (string-append doc file)))
-                       '("/README.rst" "/CHANGES" "/LICENSE"))
-             (copy-recursively "examples" examples)))
-         %standard-phases))))
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (with-directory-excursion "tests"
+               (zero? (system* "python" "all_tests.py")))))
+         (add-after 'install 'install-doc
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((data (string-append (assoc-ref outputs "doc") "/share"))
+                    (doc (string-append data "/doc/" ,name "-" ,version))
+                    (examples (string-append doc "/examples")))
+               (mkdir-p examples)
+               (for-each (lambda (file)
+                           (copy-file (string-append "." file)
+                                      (string-append doc file)))
+                         '("/README.rst" "/CHANGES" "/LICENSE"))
+               (copy-recursively "examples" examples)))))))
     (home-page "https://github.com/eliben/pycparser")
     (synopsis "C parser in Python")
     (description
@@ -4361,13 +4521,13 @@ PNG, PostScript, PDF, and SVG file output.")
 (define-public python-decorator
   (package
     (name "python-decorator")
-    (version "4.0.9")
+    (version "4.0.10")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "decorator" version))
        (sha256
-        (base32 "1a5vwhflfd9sh3rfb40xlyipldgdzfff6brman57hqv3661jw0lh"))))
+        (base32 "0w7hg59hlpq74jpyja4yfryap0ccjvchgpkfp20rhj9krgnrhvlw"))))
     (build-system python-build-system)
     (arguments '(#:tests? #f)) ; no test target
     (home-page "https://pypi.python.org/pypi/decorator/")
@@ -4687,14 +4847,14 @@ without using the configuration machinery.")
 (define-public python-jupyter-core
   (package
     (name "python-jupyter-core")
-    (version "4.2.0")
+    (version "4.2.1")
     (source
      (origin
        (method url-fetch)
        (uri (string-append (pypi-uri "jupyter_core" version)))
        (sha256
         (base32
-         "177d9csqldzhsh6xs1p4nf6lzvhzyg6gklqjf69lxgxyadx87v24"))))
+         "1cy7inv218dgh4m1fbzbsiqpz733ylgjrj62jxqpfzs3r2cm7ic9"))))
     (build-system python-build-system)
     ;; FIXME: not sure how to run the tests
     (arguments `(#:tests? #f))
@@ -4744,13 +4904,13 @@ installing @code{kernelspec}s for use with Jupyter frontends.")
 (define-public python-ipykernel
   (package
     (name "python-ipykernel")
-    (version "4.5.0")
+    (version "4.5.2")
     (source
      (origin
       (method url-fetch)
       (uri (pypi-uri "ipykernel" version))
       (sha256
-       (base32 "15c2bp1x3i6s4xb7vz7742h3kmvdfdfn9n2haywm3mwgvf77jni4"))))
+       (base32 "0qllv0k6zzv1r1cj1x2ygxmlrrqhbslzj8rc6r6fg3kc1rgz4m2s"))))
     (build-system python-build-system)
     ;; The tests load a submodule of IPython.  However, IPython itself depends
     ;; on ipykernel.
@@ -5065,6 +5225,27 @@ features useful for text console applications.")
 (define-public python2-urwid
   (package-with-python2 python-urwid))
 
+(define-public python2-openid
+  (package
+    (name "python2-openid")
+    (version "2.2.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "python-openid" version))
+       (sha256
+        (base32
+         "1vvhxlghjan01snfdc4k7ykd80vkyjgizwgg9bncnin8rqz1ricj"))))
+    (build-system python-build-system)
+    (arguments
+     ;; Python 3 support is in `python3-openid`, a separate package.
+     `(#:python ,python-2))
+    (home-page "https://github.com/openid/python-openid")
+    (synopsis "OpenID support for servers and consumers")
+    (description "This library provides OpenID authentication for Python, both
+for clients and servers.")
+    (license license:asl2.0)))
+
 (define-public python-urwidtrees
   (package
     (name "python-urwidtrees")
@@ -5298,6 +5479,49 @@ another XPath engine to find the matching elements in an XML or HTML document.")
 (define-public python2-cssselect
   (package-with-python2 python-cssselect))
 
+(define-public python-openid-cla
+  (package
+    (name "python-openid-cla")
+    (version "1.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "python-openid-cla" version))
+       (sha256
+        (base32
+         "102hy2qisvjxp5s0v9lvwqi4f2dk0dhns40vjgn008yxc7k0h3cr"))))
+    (build-system python-build-system)
+    (home-page "https://github.com/puiterwijk/python-openid-cla/")
+    (synopsis "Implementation of the OpenID CLA extension for python-openid")
+    (description "@code{openid-cla} is an implementation of the OpenID
+contributor license agreement extension for python-openid.")
+    (license license:bsd-3)))
+
+(define-public python2-openid-cla
+  (package-with-python2 python-openid-cla))
+
+(define-public python-openid-teams
+  (package
+    (name "python-openid-teams")
+    (version "1.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "python-openid-teams" version))
+       (sha256
+        (base32
+         "05zrh78alav24rxkbqlpbad6d3x2nljk6z6j7kflxf3vdqa7w969"))))
+    (build-system python-build-system)
+    (home-page "https://github.com/puiterwijk/python-openid-teams/")
+    (synopsis "Implementation of the OpenID teams extension for python-openid")
+    (description
+     "@code{openid-teams} is an implementation of the OpenID
+teams extension for python-openid.")
+    (license license:bsd-3)))
+
+(define-public python2-openid-teams
+  (package-with-python2 python-openid-teams))
+
 (define-public python-netifaces
   (package
     (name "python-netifaces")
@@ -5608,14 +5832,14 @@ connection to each user.")
 (define-public python-backports-abc
   (package
     (name "python-backports-abc")
-      (version "0.4")
+      (version "0.5")
       (source
         (origin
           (method url-fetch)
           (uri (pypi-uri "backports_abc" version))
           (sha256
            (base32
-            "19fh75lni9pb673n2fn505m1rckm0af0szcv5xx1qm1xpa940glb"))))
+            "1pkv8d1zxj5f9i227dxbjczncbv7ks7ywnjwyxfjagm02i2yafq3"))))
     (build-system python-build-system)
     (home-page "https://github.com/cython/backports_abc")
     (synopsis "Backport of additions to the 'collections.abc' module")
@@ -5920,14 +6144,14 @@ Python.")
 (define-public python-markdown
   (package
     (name "python-markdown")
-    (version "2.6.5")
+    (version "2.6.7")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "Markdown" version))
        (sha256
         (base32
-         "0q758a3fiiawr20b3hhjfs677cwj6xi284yb7xspcvv0fdicz54d"))))
+         "1h055llfd0ps0ig7qb3v1j9068xv90dc9s7xkhkgz9zg8r4g5sys"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -6020,6 +6244,28 @@ term.js Javascript terminal emulator library.")
           ,python2-backport-ssl-match-hostname)
           ,@(package-propagated-inputs terminado))))))
 
+(define-public python-straight-plugin
+  (package
+    (name "python-straight-plugin")
+    (version "1.4.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "straight.plugin" version))
+       (sha256
+        (base32
+         "069pjll4383p4kkgvcc40hgyvf79j2wdbpgwz77yigzxksh1gj62"))))
+    (build-system python-build-system)
+    (home-page "https://github.com/ironfroggy/straight.plugin")
+    (synopsis "Simple namespaced plugin facility")
+    (description "Straight Plugin provides a type of plugin you can create from
+almost any existing Python modules, and an easy way for outside developers to
+add functionality and customization to your projects with their own plugins.")
+    (license license:expat)))
+
+(define-public python2-straight-plugin
+  (package-with-python2 python-straight-plugin))
+
 (define-public python-fonttools
   (package
     (name "python-fonttools")
@@ -6461,7 +6707,7 @@ suitable for a wide range of protocols based on the ASN.1 specification.")
     (build-system python-build-system)
     (propagated-inputs
      `(("python-pyasn1" ,python-pyasn1)))
-    (home-page "http://sourceforge.net/projects/pyasn1/")
+    (home-page "https://sourceforge.net/projects/pyasn1/")
     (synopsis "ASN.1 codec implementations")
     (description
      "Pyasn1-modules is a collection of Python modules providing ASN.1 types and
@@ -6579,14 +6825,14 @@ responses, rather than doing any computation.")
 (define-public python-cryptography-vectors
   (package
     (name "python-cryptography-vectors")
-    (version "1.6")
+    (version "1.7.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "cryptography_vectors" version))
        (sha256
         (base32
-         "0xgn3yvlmv5rs92wgjj39qscr6s7mwbbsx7j683sfa6ijmyb1k01"))))
+         "1x2mz4wggja5ih45c6cw0kzyad4jr8avg327dawjr1gnpdq1psa7"))))
     (build-system python-build-system)
     (home-page "https://github.com/pyca/cryptography")
     (synopsis "Test vectors for the cryptography package")
@@ -6601,29 +6847,15 @@ responses, rather than doing any computation.")
 (define-public python-cryptography
   (package
     (name "python-cryptography")
-    (version "1.6")
+    (version "1.7.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "cryptography" version))
        (sha256
         (base32
-         "0gwvmz6w5ml0bjbgmdiscsv5i948lrjd381z7h9qkz6kr398c3ad"))))
+         "0k6v7wq4h0yk9r0x0bl2x9fyrg4a6gj5qp4m9mgpk6m481yyygwm"))))
     (build-system python-build-system)
-    (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         (add-before 'check 'disable-failing-test
-           (lambda _
-             ;; This test is known to fail with OpenSSL >= 1.0.2i and older
-             ;; versions of python-cryptography:
-             ;; https://github.com/pyca/cryptography/issues/3196
-             ;; TODO: Try re-enabling the test when upgrading
-             ;; python-cryptography.
-             (substitute* "tests/hazmat/backends/test_openssl.py"
-               (("def test_numeric_string_x509_name_entry")
-                 "@pytest.mark.xfail\n    def test_numeric_string_x509_name_entry"))
-             #t)))))
     (inputs
      `(("openssl" ,openssl)))
     (propagated-inputs
@@ -6705,26 +6937,21 @@ library.")
 (define-public python-pip
   (package
     (name "python-pip")
-    (version "8.0.2")
+    (version "9.0.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "pip" version))
        (sha256
         (base32
-         "08cm8d4228fj0qnrysy3qv1a6022zr3dcs25amd14lgxil6vvx26"))))
+         "03clr9c1dih5n9c00c592zzvf6r1ffimywkaq9agcqdllzhl7wh9"))))
     (build-system python-build-system)
-    (native-inputs
-      `(;; Tests
-        ("python-virtualenv" ,python-virtualenv)
-        ("python-mock" ,python-mock)
-        ("python-pytest" ,python-pytest)
-        ("python-scripttest" ,python-scripttest)))
+    (arguments
+     '(#:tests? #f))          ; there are no tests in the pypi archive.
     (home-page "https://pip.pypa.io/")
-    (synopsis
-      "Package manager for Python software")
+    (synopsis "Package manager for Python software")
     (description
-      "Pip is a package manager for Python software, that finds packages on the
+     "Pip is a package manager for Python software, that finds packages on the
 Python Package Index (PyPI).")
     (license license:expat)))
 
@@ -7721,14 +7948,14 @@ timestamps.")
 (define-public python-werkzeug
   (package
     (name "python-werkzeug")
-    (version "0.11.11")
+    (version "0.11.15")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "Werkzeug" version))
        (sha256
         (base32
-         "1rgpq8a2qv26d75v9j3b074inirlyy6y4b5x4rxblp202jy4cb77"))))
+         "1h5wycw8yj7q0grqsjnsqflmrlsdagvl2j4dsgdncci6mjc7fpa5"))))
     (build-system python-build-system)
     (native-inputs
      `(("python-pytest" ,python-pytest)))
@@ -7802,15 +8029,13 @@ be set via config files and/or environment variables.")
 (define-public python-ndg-httpsclient
   (package
     (name "python-ndg-httpsclient")
-    (version "0.4.0")
+    (version "0.4.2")
     (source (origin
               (method url-fetch)
-              (uri (string-append
-                    "https://pypi.python.org/packages/source/n/ndg-httpsclient/"
-                    "ndg_httpsclient-" version ".tar.gz"))
+              (uri (pypi-uri "ndg_httpsclient" version))
               (sha256
                 (base32
-                  "0x32ibixm3vv5m9xfk83xsqm8xcqw4dd0khbh6qbri6rxgymbhg8"))))
+                  "1b5qirv46v4dpnmfqviwq42mdwfcby4dxmz0i41wad2337pqf2aq"))))
     (build-system python-build-system)
     (arguments
      '(;; The tests appear to require networking.
@@ -7981,13 +8206,13 @@ applications.")
 (define-public python-click-log
   (package
     (name "python-click-log")
-    (version "0.1.3")
+    (version "0.1.8")
     (source (origin
              (method url-fetch)
              (uri (pypi-uri "click-log" version))
              (sha256
               (base32
-               "0kdd1vminxpcfczxl2kkf285n0dr1gxh2cdbx1p6vkj7b7bci3gx"))))
+               "14ikfjfgnzf21mjniq9lfk2igzykgzfvwwrk85nw2b9fq44109sp"))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-click" ,python-click)))
@@ -8057,6 +8282,28 @@ minimal and fast API targetting the following uses:
 (define-public python2-execnet
   (package-with-python2 python-execnet))
 
+(define-public python-trollius-redis
+  (package
+    (name "python-trollius-redis")
+    (version "0.1.4")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "trollius_redis" version))
+        (sha256
+         (base32
+          "0k3vypszmgmaipgw9xscvgm79h2zd6p6ci8gdp5sxl6g5kbqr9fy"))))
+    (build-system python-build-system)
+    (home-page "https://github.com/benjolitz/trollius-redis")
+    (synopsis "Port of asyncio-redis to trollius")
+    (description "@code{trollius-redis} is a Redis client for Python
+  trollius.  It is an asynchronious IO (PEP 3156) implementation of the
+  Redis protocol.")
+    (license license:bsd-2)))
+
+(define-public python2-trollius-redis
+  (package-with-python2 python-trollius-redis))
+
 ;;; The software provided by this package was integrated into pytest 2.8.
 (define-public python-pytest-cache
   (package
@@ -8168,13 +8415,13 @@ processes across test runs.")
 (define-public python-icalendar
   (package
     (name "python-icalendar")
-    (version "3.11")
+    (version "3.11.1")
     (source (origin
              (method url-fetch)
              (uri (pypi-uri "icalendar" version))
              (sha256
               (base32
-               "01v2f3swd5s72x65cdihw83dx1z799b4i49a6ncg7vqmcm20wapd"))))
+               "1bvi7rzh7scl4nmgj2n2cy7k0v3p29y15cqy2hcdnfq9mnhdr63y"))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-dateutil" ,python-dateutil)
@@ -8646,14 +8893,14 @@ interface to the Amazon Web Services (AWS) API.")
 (define-public awscli
   (package
    (name "awscli")
-   (version "1.11.5")
+   (version "1.11.35")
    (source
     (origin
      (method url-fetch)
      (uri (pypi-uri name version))
      (sha256
       (base32
-       "0lclasm0wnayd3b8zl9l91i32nbgrhh0ncf9lksss4cv0myfwmfg"))))
+       "0k6y8cg311bqak5x9pilg80w6f76dcbzm6xcdrw6rjnk6v4xwy70"))))
    (build-system python-build-system)
    (propagated-inputs
     `(("python-colorama" ,python-colorama)
@@ -8729,10 +8976,10 @@ normally the case.")
 (define-public python2-pytest-subtesthack
   (package-with-python2 python-pytest-subtesthack))
 
-(define-public python2-xdo
+(define-public python-xdo
   (package
-    (name "python2-xdo")
-    (version "0.2")
+    (name "python-xdo")
+    (version "0.3")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -8740,11 +8987,10 @@ normally the case.")
                     "python-xdo_" version ".orig.tar.gz"))
               (sha256
                (base32
-                "1kl5c1p0dyxf62plnk6fl77ycfb4whwjms16r14dxx8kn90hlqz4"))))
+                "1vqh1n5yy5dhnq312kwrl90fnck4v26is3lq3lxdvcn60vv19da0"))))
     (build-system python-build-system)
     (arguments
-     `(#:python ,python-2
-       #:tests? #f))  ; no tests provided
+     `(#:tests? #f))  ; no tests provided
     (inputs
      `(("xdotool" ,xdotool)
        ("libX11" ,libx11)))
@@ -8755,6 +9001,9 @@ input.  (Note that this is mostly a legacy library; you may wish to look at
 python-xdo for newer bindings.)")
     (license license:bsd-3)))
 
+(define-public python2-xdo
+  (package-with-python2 python-xdo))
+
 (define-public python-wtforms
   (package
     (name "python-wtforms")
@@ -8795,14 +9044,14 @@ available in Django, but is a standalone package.")
 (define-public python-mako
   (package
     (name "python-mako")
-    (version "1.0.3")
+    (version "1.0.6")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "Mako" version))
        (sha256
         (base32
-         "136kcjbs0s98qkx8a418b05dfblqp0kiiqyx8vhx4rarwc7bqi3n"))))
+         "03dyxgjknp4ffsv7vwfd28l5bbpzi0ylp20543wpg3iahyyrwma8"))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-markupsafe" ,python-markupsafe)))
@@ -8985,14 +9234,14 @@ layouts.")
 (define-public python-pyquery
   (package
     (name "python-pyquery")
-    (version "1.2.13")
+    (version "1.2.17")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "pyquery" version))
        (sha256
         (base32
-         "0j9fsisip21qv4xljsg5dmni1pgpvwrjyyhhql0glydc4bs5rjgv"))))
+         "1xia20wm0vx5dk85kcwgh13bylz8qh47ffjxssd2586r60xi783a"))))
     (build-system python-build-system)
     (native-inputs
      `(("python-webob" ,python-webob)
@@ -9456,6 +9705,56 @@ presume or force a developer to use a particular tool or library.")
 (define-public python2-flask
   (package-with-python2 python-flask))
 
+(define-public python-flask-wtf
+  (package
+    (name "python-flask-wtf")
+    (version "0.13.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "Flask-WTF" version))
+       (sha256
+        (base32
+         "04l5743j2dici46038sqlzvf0xzpg8rf7s9ld2x24xv7f4idg990"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-flask-babel" ,python-flask-babel)
+       ("python-babel" ,python-babel)
+       ("python-wtforms" ,python-wtforms)))
+    (native-inputs
+     `(("python-nose" ,python-nose)))
+    (home-page "https://github.com/lepture/flask-wtf")
+    (synopsis "Simple integration of Flask and WTForms")
+    (description "Flask-WTF integrates Flask and WTForms, including CSRF, file
+upload, and reCAPTCHA.")
+    (license license:bsd-3)))
+
+(define-public python2-flask-wtf
+  (package-with-python2 python-flask-wtf))
+
+(define-public python-flask-multistatic
+  (package
+    (name "python-flask-multistatic")
+    (version "1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "flask-multistatic" version))
+       (sha256
+        (base32
+         "0p4v50rwv64wcd0zlq7rzl4waprwr4hj19s3cgf1isywa7jcisgm"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-flask" ,python-flask)))
+    (home-page "https://pagure.io/flask-multistatic")
+    (synopsis "Flask plugin to allow overriding static files")
+    (description "@code{flask-multistatic} is a flask plugin that adds support
+for overriding static files.")
+    (license license:gpl3+)))
+
+(define-public python2-flask-multistatic
+  (package-with-python2 python-flask-multistatic))
+
 (define-public python-cookies
   (package
     (name "python-cookies")
@@ -10074,7 +10373,7 @@ different processes.  This allows better error handling when running code over
 multiple processes (imagine multiprocessing, billiard, futures, celery etc).
 
 @item Parse traceback strings and raise with the parsed tracebacks.
-@end itemize")
+@end enumerate\n")
     (license license:bsd-3)))
 
 (define-public python2-tblib
@@ -10116,13 +10415,13 @@ provides support for parsing, splitting and formatting SQL statements.")
 (define-public python-greenlet
   (package
     (name "python-greenlet")
-    (version "0.4.9")
+    (version "0.4.11")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "greenlet" version))
               (sha256
                (base32
-                "04h0m54dyqg49vyarq26mry6kbivnpl47rnmmrk9qn8wpfxviybr"))))
+                "1xhik26j4f3kc4qw9xmj0c567rb5h1zryb4ijwqnqwwjvfhbv59h"))))
     (build-system python-build-system)
     (home-page "https://greenlet.readthedocs.io/")
     (synopsis "Lightweight in-process concurrent programming")
@@ -10234,17 +10533,14 @@ network support library.")
 (define-public python-ply
   (package
     (name "python-ply")
-    (version "3.8")
+    (version "3.9")
     (source
       (origin
         (method url-fetch)
-        (uri (string-append
-               "https://pypi.python.org/packages/"
-               "96/e0/430fcdb6b3ef1ae534d231397bee7e9304be14a47a267e82ebcb3323d0b5"
-               "/ply-" version ".tar.gz"))
+        (uri (pypi-uri "ply" version))
         (sha256
           (base32
-            "1f70ipynmiy09k6px2j7v4w5cdrc21za3xs2k6f1bsvb0bzvvlg7"))))
+            "0gpl0yli3w03ipyqfrp3w5nf0iawhsq65anf5wwm2wf5p502jzhd"))))
     (build-system python-build-system)
     (home-page "http://www.dabeaz.com/ply/")
     (synopsis "Python Lex & Yacc")
@@ -10744,14 +11040,14 @@ implementation for Python.")
 (define-public python-prompt-toolkit
  (package
   (name "python-prompt-toolkit")
-  (version "1.0.7")
+  (version "1.0.9")
   (source
     (origin
       (method url-fetch)
       (uri (pypi-uri "prompt_toolkit" version ".tar.gz"))
       (sha256
         (base32
-          "1vyjd0b7wciv55i19l44zy0adx8q7ss79lhy2r9d1rwz2y4822zg"))))
+          "172r15k9kwdw2lnajvpz1632dd16nqz1kcal1p0lq5ywdarj6rfd"))))
   (build-system python-build-system)
   (arguments
    '(#:tests? #f)) ; The test suite uses some Windows-specific data types.
@@ -10874,14 +11170,14 @@ provide an easy-to-use Python interface for building OAuth1 and OAuth2 clients."
 (define-public python-stem
   (package
     (name "python-stem")
-    (version "1.4.1b")
+    (version "1.5.3")
     (source
      (origin
        (method url-fetch)
-       (uri (pypi-uri "stem" version ".tar.bz2"))
+       (uri (pypi-uri "stem" version))
        (sha256
         (base32
-         "09a3amp1y351nwz088ckiibbp666qi2lxwkyknavswfm400s0ns7"))))
+         "0fm67dfx6qaj0mg80r4yw2i72birpzn7cnbyz4p1857max3zfc97"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -10893,8 +11189,6 @@ provide an easy-to-use Python interface for building OAuth1 and OAuth2 clients."
      `(("python-mock" ,python-mock)
        ("python-pep8" ,python-pep8)
        ("python-pyflakes" ,python-pyflakes)))
-    (propagated-inputs
-     `(("python-pycrypto" ,python-pycrypto)))
     (home-page "https://stem.torproject.org/")
     (synopsis
      "Python controller library that allows applications to interact with Tor")
@@ -11230,14 +11524,14 @@ List.  Forked from and using the same API as the publicsuffix package.")
 (define-public python-freezegun
   (package
     (name "python-freezegun")
-    (version "0.3.7")
+    (version "0.3.8")
     (source
       (origin
         (method url-fetch)
         (uri (pypi-uri "freezegun" version))
         (sha256
           (base32
-            "14l19x06v5jkq4rdwbmfyw4x9lrjb2300afrk21r1ash7y1y9a0w"))))
+            "1sf38d3ibv1jhhvr52x7dhrsiyqk1hm165dfv8w8wh0fhmgxg151"))))
     (build-system python-build-system)
     (native-inputs
      `(("python-mock" ,python-mock)
@@ -11545,14 +11839,14 @@ to Python.")
 (define-public python-graphql-relay
   (package
     (name "python-graphql-relay")
-    (version "0.4.4")
+    (version "0.4.5")
     (source
       (origin
         (method url-fetch)
         (uri (pypi-uri "graphql-relay" version))
         (sha256
          (base32
-          "04wr9ayshxjjdcg2v21c7ffbz36kif1wjl3604fqd3qignb3fbxi"))))
+          "1nv5dxcj59zv31qvl8bd142njmxcmymny2dz3br1l2cpbljbf5i7"))))
     (build-system python-build-system)
     (native-inputs
      `(("python-pytest" ,python-pytest)))
@@ -11647,6 +11941,74 @@ provide extendible implementations of common aspects of a cloud so that you can
 focus on building massively scalable web applications.")
     (license license:expat)))
 
+(define-public python-snowballstemmer
+  (package
+    (name "python-snowballstemmer")
+    (version "1.2.1")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "snowballstemmer" version))
+              (sha256
+               (base32
+                "0a0idq4y5frv7qsg2x62jd7rd272749xk4x99misf5rcifk2d7wi"))))
+    (build-system python-build-system)
+    (arguments
+     `(;; No tests exist
+       #:tests? #f))
+    (home-page "https://github.com/shibukawa/snowball_py")
+    (synopsis "Snowball stemming library collection for Python")
+    (description "This package provides 16 word stemmer algorithms generated
+from Snowball algorithms.  It includes the 15 original ones plus the Poerter
+English stemmer.")
+    (license license:bsd-3)))
+
+(define-public python2-snowballstemmer
+  (package-with-python2 python-snowballstemmer))
+
+(define-public python-sphinx-cloud-sptheme
+  (package
+    (name "python-sphinx-cloud-sptheme")
+    (version "1.7.1")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "cloud_sptheme" version))
+              (sha256
+               (base32
+                "0zm9ap4p5dzln8f1m2immadaxv2xpg8jg4w53y52rhfl7pdb58vy"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-sphinx" ,python-sphinx)))
+    (home-page "https://bitbucket.org/ecollins/cloud_sptheme")
+    (synopsis "'Cloud' theme for Sphinx documenter")
+    (description "This package contains the \"Cloud\" theme for Sphinx and some
+related extensions.")
+    (license license:bsd-3)))
+
+(define-public python2-sphinx-cloud-sptheme
+  (package-with-python2 python-sphinx-cloud-sptheme))
+
+(define-public python-sphinx-alabaster-theme
+  (package
+    (name "python-sphinx-alabaster-theme")
+    (version "0.7.9")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "alabaster" version))
+              (sha256
+               (base32
+                "027anxzcb951gjlcc43y3rbn9qrw36d16vj9wd2smv5410xx9bs7"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-pygments" ,python-pygments)))
+    (home-page "https://alabaster.readthedocs.io/")
+    (synopsis "Configurable sidebar-enabled Sphinx theme")
+    (description "Alabaster is a visually (c)lean, responsive, configurable
+theme for the Sphinx documentation system.  It's the default theme of Sphinx.")
+    (license license:bsd-3)))
+
+(define-public python2-sphinx-alabaster-theme
+  (package-with-python2 python-sphinx-alabaster-theme))
+
 (define-public python-betamax
   (package
     (name "python-betamax")
@@ -11676,13 +12038,13 @@ replay them during future tests.  It is designed to work with python-requests.")
 (define-public python-s3transfer
   (package
     (name "python-s3transfer")
-    (version "0.1.8")
+    (version "0.1.10")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "s3transfer" version))
               (sha256
                (base32
-                "1jivjkp3xqif9gzr5fiq28jsskmh50vzzd7ldsb4rbyiw1iyv3hy"))))
+                "1h8g9bknvxflxkpbnxyfxmk8pvgykbbk9ljdvhqh6z4vjc2926ms"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -12210,3 +12572,72 @@ network.")
 
 (define-public python2-argcomplete
   (package-with-python2 python-argcomplete))
+
+(define-public python-xopen
+  (package
+    (name "python-xopen")
+    (version "0.1.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "xopen" version))
+        (sha256
+          (base32
+           "1wx6mylzcsyhjl19ycb83qq6iqpmr927lz62njfsar6ldsj0qcni"))
+        (file-name (string-append name "-" version ".tar.gz"))))
+    (build-system python-build-system)
+    (home-page "https://github.com/marcelm/xopen/")
+    (synopsis "Open compressed files transparently")
+    (description "This module provides an @code{xopen} function that works like
+Python's built-in @code{open} function, but can also deal with compressed files.
+Supported compression formats are gzip, bzip2 and, xz, and are automatically
+recognized by their file extensions.  The focus is on being as efficient as
+possible on all supported Python versions.")
+    (license license:expat)))
+
+(define-public python2-xopen
+  (package-with-python2 python-xopen))
+
+(define-public python2-cheetah
+  (package
+    (name "python2-cheetah")
+    (version "2.4.4")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "Cheetah" version))
+        (sha256
+          (base32
+            "0l5mm4lnysjkzpjr95q5ydm9xc8bv43fxmr79ypybrf1y0lq4c5y"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:python ,python-2))
+    (propagated-inputs
+     `(("python2-markdown" ,python2-markdown)))
+    (home-page "https://pythonhosted.org/Cheetah/")
+    (synopsis "Template engine")
+    (description "Cheetah is a text-based template engine and Python code
+generator.
+
+Cheetah can be used as a standalone templating utility or referenced as
+a library from other Python applications.  It has many potential uses,
+but web developers looking for a viable alternative to ASP, JSP, PHP and
+PSP are expected to be its principle user group.
+
+Features:
+@enumerate
+@item Generates HTML, SGML, XML, SQL, Postscript, form email, LaTeX, or any other
+   text-based format.
+@item Cleanly separates content, graphic design, and program code.
+@item Blends the power and flexibility of Python with a simple template language
+   that non-programmers can understand.
+@item Gives template writers full access to any Python data structure, module,
+   function, object, or method in their templates.
+@item Makes code reuse easy by providing an object-orientated interface to
+   templates that is accessible from Python code or other Cheetah templates.
+   One template can subclass another and selectively reimplement sections of it.
+@item Provides a simple, yet powerful, caching mechanism that can dramatically
+   improve the performance of a dynamic website.
+@item Compiles templates into optimized, yet readable, Python code.
+@end enumerate")
+    (license (license:x11-style "file://LICENSE"))))
diff --git a/gnu/packages/qemu.scm b/gnu/packages/qemu.scm
index f06b52fdff..61c15ae9d3 100644
--- a/gnu/packages/qemu.scm
+++ b/gnu/packages/qemu.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2015, 2016 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2015, 2016, 2017 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;;
@@ -69,17 +69,14 @@
 (define-public qemu
   (package
     (name "qemu")
-    (version "2.7.0")
+    (version "2.8.0")
     (source (origin
              (method url-fetch)
              (uri (string-append "http://wiki.qemu-project.org/download/qemu-"
                                  version ".tar.bz2"))
              (sha256
               (base32
-               "0lqyz01z90nvxpc3nx4djbci7hx62cwvs5zwd6phssds0sap6vij"))
-             (patches (search-patches "qemu-CVE-2016-8576.patch"
-                                      "qemu-CVE-2016-8577.patch"
-                                      "qemu-CVE-2016-8578.patch"))))
+               "0qjy3rcrn89n42y5iz60kgr0rrl29hpnj8mq2yvbc1wrcizmvzfs"))))
     (build-system gnu-build-system)
     (arguments
      '(;; Running tests in parallel can occasionally lead to failures, like:
@@ -106,6 +103,8 @@
                 (apply system*
                        `("./configure"
                          ,(string-append "--cc=" (which "gcc"))
+                         ;; Some architectures insist on using HOST_CC
+                         ,(string-append "--host-cc=" (which "gcc"))
                          "--disable-debug-info" ; save build space
                          "--enable-virtfs"      ; just to be sure
                          ,(string-append "--prefix=" out)
@@ -124,7 +123,7 @@
          (add-before 'check 'make-gtester-verbose
            (lambda _
              ;; Make GTester verbose to facilitate investigation upon failure.
-             (setenv "V" "1")))
+             (setenv "V" "1") #t))
          (add-before 'check 'disable-test-qga
            (lambda _
              (substitute* "tests/Makefile.include"
@@ -230,14 +229,15 @@ server and embedded PowerPC, and S390 guests.")
        ("pci.ids"
         ,(origin
            (method url-fetch)
-           (uri "http://pciids.sourceforge.net/v2.2/pci.ids")
+           (uri "https://raw.githubusercontent.com/pciutils/pciids/f9477789526f9d380bc57aa92e357c521738d5dd/pci.ids")
            (sha256
             (base32
-             "0h8v0lrlrxkfnjiwnwiq86zyvb8qa2n3844dp1m01lh2nb2fliqw"))))
+             "0g6dbwlamagxqxvng67xng3w2x56c0np4md1v1p1jn32qw518az0"))))
        ("usb.ids"
         ,(origin
            (method url-fetch)
            (uri "http://linux-usb.cvs.sourceforge.net/viewvc/linux-usb/htdocs/usb.ids?revision=1.539")
+           (file-name "usb.ids")
            (sha256
             (base32
              "0w9ila7662lzpx416lqy69zx6gfwq2xiigwd5fdyqcrg3dj07m80"))))))
diff --git a/gnu/packages/qt.scm b/gnu/packages/qt.scm
index acbc955960..b2fe6e445c 100644
--- a/gnu/packages/qt.scm
+++ b/gnu/packages/qt.scm
@@ -2,8 +2,8 @@
 ;;; Copyright © 2013, 2014, 2015 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com>
 ;;; Copyright © 2015 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2015, 2016 Efraim Flashner <efraim@flashner.co.il>
-;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is>
+;;; Copyright © 2015, 2016, 2017 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016, 2017 ng0 <ng0@libertad.pw>
 ;;; Copyright © 2016 Thomas Danckaert <post@thomasdanckaert.be>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -55,6 +55,7 @@
   #:use-module (gnu packages pulseaudio)
   #:use-module (gnu packages python)
   #:use-module (gnu packages ruby)
+  #:use-module (gnu packages sdl)
   #:use-module (gnu packages tls)
   #:use-module (gnu packages xdisorg)
   #:use-module (gnu packages xorg)
@@ -348,7 +349,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtbase
   (package
     (name "qtbase")
-    (version "5.7.0")
+    (version "5.7.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -357,7 +358,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "0ip6xnizsn269r4s1nq9lkx8cdxkjqr1fidwrj3sa8xb7h96syry"))
+               "0zjmcrmnnmaz1lr9wc5i6y565hsvl8ycn790ivqaz62dv54zbkgd"))
              (modules '((guix build utils)))
              (snippet
               '(begin
@@ -531,7 +532,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtsvg
   (package (inherit qtbase)
     (name "qtsvg")
-    (version "5.7.0")
+    (version "5.7.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -540,7 +541,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "10fqrlqkiq83xhx79g8d2sjy7hjdnp28067z8f4byj7db81rzy51"))))
+               "0irr9h566hl9nx8p919rz276zbfvvd6vqdb6i9g6b3piikdigw5h"))))
     (propagated-inputs `())
     (native-inputs `(("perl" ,perl)))
     (inputs
@@ -553,19 +554,27 @@ developers using C++ or QML, a CSS & JavaScript like language.")
          (replace 'configure
            (lambda* (#:key outputs #:allow-other-keys)
              (let ((out (assoc-ref outputs "out")))
-               (zero? (system* "qmake" (string-append "PREFIX=" out))))))
+               ;; Valid QT_BUILD_PARTS variables are:
+               ;; libs tools tests examples demos docs translations
+               (zero? (system* "qmake" "QT_BUILD_PARTS = libs tools tests"
+                               (string-append "PREFIX=" out))))))
          (add-before 'install 'fix-Makefiles
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (let ((out    (assoc-ref outputs "out"))
                    (qtbase (assoc-ref inputs "qtbase")))
                (substitute* (find-files "." "Makefile")
                             (((string-append "INSTALL_ROOT)" qtbase))
-                             (string-append "INSTALL_ROOT)" out)))))))))))
+                             (string-append "INSTALL_ROOT)" out)))
+               #t)))
+            (add-before 'check 'set-display
+              (lambda _
+                (setenv "QT_QPA_PLATFORM" "offscreen")
+                #t)))))))
 
 (define-public qtimageformats
   (package (inherit qtsvg)
     (name "qtimageformats")
-    (version "5.7.0")
+    (version "5.7.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -574,14 +583,15 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "1rb27x7i2pmvsck6wax2cg31gqpzaakciy45wm5l3lcl86j48czg"))
+               "1x3p1xmw7spxa4bwriyrwsfrq31jabsdjsi5fras9y39naia55sg"))
              (modules '((guix build utils)))
              (snippet
               '(begin
                  (delete-file-recursively "src/3rdparty")))))
     (native-inputs `())
     (inputs
-     `(("libmng" ,libmng)
+     `(("jasper" ,jasper)
+       ("libmng" ,libmng)
        ("libtiff" ,libtiff)
        ("libwebp" ,libwebp)
        ("mesa" ,mesa)
@@ -591,7 +601,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtx11extras
   (package (inherit qtsvg)
     (name "qtx11extras")
-    (version "5.7.0")
+    (version "5.7.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -600,7 +610,10 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "1yrkn8pqdbvbqykas3wx1vdfimhjkgx3s5jgdxib9dgmgyx6vjzw"))))
+               "09z49jm70f5i0gcdz9a16z00pg96x8pz7vri5wpirh3fqqn0qnjz"))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments qtsvg)
+       ((#:tests? _ #f) #f))) ; TODO: Enable the tests
     (native-inputs `(("perl" ,perl)))
     (inputs
      `(("mesa" ,mesa)
@@ -609,7 +622,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtxmlpatterns
   (package (inherit qtsvg)
     (name "qtxmlpatterns")
-    (version "5.7.0")
+    (version "5.7.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -618,14 +631,23 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "02z2qxamslg6sphnaykjcjfpypq4b69pb586s43vw4fplm72m21q"))))
+               "1rgqnpg64gn5agmvjwy0am8hp5fpxl3cdkixr1yrsdxi5a6961d8"))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments qtsvg)
+       ((#:phases phases)
+        `(modify-phases ,phases
+           (add-after 'unpack 'disable-network-tests
+             (lambda _ (substitute* "tests/auto/auto.pro"
+                         (("qxmlquery") "# qxmlquery")
+                         (("xmlpatterns") "# xmlpatterns"))
+               #t))))))
     (native-inputs `(("perl" ,perl)))
     (inputs `(("qtbase" ,qtbase)))))
 
 (define-public qtdeclarative
   (package (inherit qtsvg)
     (name "qtdeclarative")
-    (version "5.7.0")
+    (version "5.7.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -634,7 +656,10 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "1x7rij423g5chlfd2kix54f393vxwjvdfsn1c7sybqmfycwn5pl6"))))
+               "0mjxfwnplpx60jc6y94krg00isddl9bfwc7dayl981njb4qds4zx"))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments qtsvg)
+       ((#:tests? _ #f) #f))) ; TODO: Enable the tests
     (native-inputs
      `(("perl" ,perl)
        ("pkg-config" ,pkg-config)
@@ -648,7 +673,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtconnectivity
   (package (inherit qtsvg)
     (name "qtconnectivity")
-    (version "5.7.0")
+    (version "5.7.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -657,7 +682,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "00r7lc1w3snfp2qfqmviqzv0cw16zd8m1sfpvxvpl65yqmzcli4q"))))
+               "0rmr7bd4skby7bax9hpj2sid2bq3098nkw7xm02mdp04hc3bks5k"))))
     (native-inputs
      `(("perl" ,perl)
        ("pkg-config" ,pkg-config)
@@ -669,7 +694,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtwebsockets
   (package (inherit qtsvg)
     (name "qtwebsockets")
-    (version "5.7.0")
+    (version "5.7.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -678,7 +703,10 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "0hwb2l7iwf4wf7l95dli8j3b7h0nffp56skfg1x810kzj0df26vl"))))
+               "1laj0slwibs0bg69kgrdhc9k1s6yisq3pcsr0r9rhbkzisv7aajw"))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments qtsvg)
+       ((#:tests? _ #f) #f))) ; TODO: Enable the tests
     (native-inputs
      `(("perl" ,perl)
        ("qtdeclarative" ,qtdeclarative)))
@@ -687,7 +715,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtsensors
   (package (inherit qtsvg)
     (name "qtsensors")
-    (version "5.7.0")
+    (version "5.7.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -696,7 +724,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "1gii6wg2xd3bkb86y5hgpmwcpl04xav030zscpl6fhscl9kcqg98"))))
+               "041v1x8pwfzpyk6y0sy5zgm915pi15xdhiy18fd5wqayvcp99cyc"))))
     (native-inputs
      `(("perl" ,perl)
        ("qtdeclarative" ,qtdeclarative)))
@@ -705,7 +733,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtmultimedia
   (package (inherit qtsvg)
     (name "qtmultimedia")
-    (version "5.7.0")
+    (version "5.7.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -714,12 +742,18 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "0ndmhiflmyr144nq8drd5njsdi282ixsm4730q5n0ji2v9dp1bh5"))
+               "1vvxmgmvjnz9w1h2ph1j2fy77ij141ycx5fric60lq02pxzifax5"))
              (modules '((guix build utils)))
              (snippet
               '(begin
                  (delete-file-recursively
-                   "examples/multimedia/spectrum/3rdparty")))))
+                   "examples/multimedia/spectrum/3rdparty")
+                 ;; We also prevent the spectrum example from being built.
+                 (substitute* "examples/multimedia/multimedia.pro"
+                   (("spectrum") "#"))))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments qtsvg)
+       ((#:tests? _ #f) #f))) ; TODO: Enable the tests
     (native-inputs
      `(("perl" ,perl)
        ("pkg-config" ,pkg-config)
@@ -734,7 +768,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtwayland
   (package (inherit qtsvg)
     (name "qtwayland")
-    (version "5.7.0")
+    (version "5.7.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -743,7 +777,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "04dynjcr6gxi3hcqdf688a4hkabi2l17slpcx9k0f3dxygwcgf96"))))
+               "1iq1c89y4ggq0dxjlf62jyhh8a9l3x7y914x84w5pby8h3hwagzj"))))
     (native-inputs
      `(("glib" ,glib)
        ("perl" ,perl)
@@ -765,7 +799,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtserialport
   (package (inherit qtsvg)
     (name "qtserialport")
-    (version "5.7.0")
+    (version "5.7.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -774,16 +808,33 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "0rc2l14s59qskp16wqlkizfai32s41qlm7a86r3qahx28gc51qaw"))))
+               "09jsryc0z49cz9783kq48rkn42f10c6krzivp812ddwjsfdy3mbn"))))
     (native-inputs `(("perl" ,perl)))
     (inputs
      `(("qtbase" ,qtbase)
        ("eudev" ,eudev)))))
 
+(define-public qtserialbus
+  (package (inherit qtsvg)
+    (name "qtserialbus")
+    (version "5.7.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
+               "0mxi43l2inpbar8rmg21qjg33bv3f1ycxjgvzjf12ncnybhdnzkj"))))
+    (inputs
+     `(("qtbase" ,qtbase)
+       ("qtserialport" ,qtserialport)))))
+
 (define-public qtwebchannel
   (package (inherit qtsvg)
     (name "qtwebchannel")
-    (version "5.7.0")
+    (version "5.7.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -792,7 +843,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "05lqfidlh1ahdd1j9y20p2037qbcq51zkdzj2m8fwhn7ghbwvd1s"))))
+               "16rij92dxy4k5231l3dpmhy7cnz0cjkn50cpzaf014zrdz3kmav3"))))
     (native-inputs
      `(("perl" ,perl)
        ("qtdeclarative" ,qtdeclarative)
@@ -802,7 +853,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtlocation
   (package (inherit qtsvg)
     (name "qtlocation")
-    (version "5.7.0")
+    (version "5.7.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -811,7 +862,10 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "0rd898gndn41jrp78203lxd94ybfv693l0qg0myag4r46ikk69vh"))))
+               "17zkzffzwbg6aqhsggs23cmwzq4y45m938842lsc423hfm7fdsgr"))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments qtsvg)
+       ((#:tests? _ #f) #f))) ; TODO: Enable the tests
     (native-inputs
      `(("perl" ,perl)
        ("qtdeclarative" ,qtdeclarative)
@@ -822,7 +876,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qttools
   (package (inherit qtsvg)
     (name "qttools")
-    (version "5.7.0")
+    (version "5.7.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -831,7 +885,10 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "004m9l7bgh7qnncbyl3d5fkggdrqx58ib21xv4hflvvarxrssibg"))))
+               "1b6zqa5690b8lqms7rrhb8rcq0xg5hp117v3m08qngbcd0i706b4"))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments qtsvg)
+       ((#:tests? _ #f) #f))) ; TODO: Enable the tests
     (native-inputs
      `(("perl" ,perl)
        ("qtdeclarative" ,qtdeclarative)))
@@ -842,7 +899,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtscript
   (package (inherit qtsvg)
     (name "qtscript")
-    (version "5.7.0")
+    (version "5.7.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -851,7 +908,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "0040890p5ilyrmcpndz1hhp08x2ms5gw4lp4n5iax2a957yy2i4w"))))
+               "09m41n95448pszr7inlg03ycb66s1a9hzfylaka92382acf1myav"))))
     (native-inputs
      `(("perl" ,perl)
        ("qttools" ,qttools)))
@@ -861,7 +918,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtquickcontrols
   (package (inherit qtsvg)
     (name "qtquickcontrols")
-    (version "5.7.0")
+    (version "5.7.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -870,7 +927,10 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "0cpcrmz9n5b4bgmshmk093lirl9xwqb23inchnai1zqg21vrmqfq"))))
+               "17cyfyqzjbm9dhq9pjscz36y84y16rmxwk6h826gjfprddrimsvg"))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments qtsvg)
+       ((#:tests? _ #f) #f))) ; TODO: Enable the tests
     (inputs
      `(("qtbase" ,qtbase)
        ("qtdeclarative" ,qtdeclarative)))))
@@ -878,7 +938,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtquickcontrols2
   (package (inherit qtsvg)
     (name "qtquickcontrols2")
-    (version "5.7.0")
+    (version "5.7.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -887,7 +947,10 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "0i8h933vhvx1bmniqdx0idg6vk82w9byd3dq0bb2phwjg5vv1xb3"))))
+               "1v77ydy4k15lksp3bi2kgha2h7m79g4n7c2qhbr09xnvpb8ars7j"))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments qtsvg)
+       ((#:tests? _ #f) #f))) ; TODO: Enable the tests
     (inputs
      `(("qtbase" ,qtbase)
        ("qtdeclarative" ,qtdeclarative)))))
@@ -895,7 +958,27 @@ developers using C++ or QML, a CSS & JavaScript like language.")
 (define-public qtgraphicaleffects
   (package (inherit qtsvg)
     (name "qtgraphicaleffects")
-    (version "5.7.0")
+    (version "5.7.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
+               "1j2drnx7zp3w6cgvy7bn00fyk5v7vw1j1hidaqcg78lzb6zgls1c"))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments qtsvg)
+       ((#:tests? _ #f) #f))) ; TODO: Enable the tests
+    (inputs
+     `(("qtbase" ,qtbase)
+       ("qtdeclarative" ,qtdeclarative)))))
+
+(define-public qtdeclarative-render2d
+  (package (inherit qtsvg)
+    (name "qtdeclarative-render2d")
+    (version "5.7.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.qt.io/official_releases/qt/"
@@ -904,7 +987,150 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                                  version ".tar.xz"))
              (sha256
               (base32
-               "1rwdjg5mk6xpadmxfq64xfp573zp5lrj9illb9105ra5wff565n8"))))
+               "0zwch9vn17f3bpy300jcfxx6cx9qymk5j7khx0x9k1xqid4166c3"))
+             (modules '((guix build utils)))
+             (snippet
+              '(delete-file-recursively "tools/opengldummy/3rdparty"))))
+    (native-inputs `())
+    (inputs
+     `(("qtbase" ,qtbase)
+       ("qtdeclarative" ,qtdeclarative)))))
+
+(define-public qtgamepad
+  (package (inherit qtsvg)
+    (name "qtgamepad")
+    (version "5.7.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
+               "10lijbsg9xx5ddbbjymdgl41nxz99yn1qgiww2kkggxwwdjj2axv"))))
+    (native-inputs
+     `(("perl" ,perl)
+       ("pkg-config" ,pkg-config)))
+    (inputs
+     `(("fontconfig" ,fontconfig)
+       ("freetype" ,freetype)
+       ("libxrender" ,libxrender)
+       ("sdl2" ,sdl2)
+       ("qtbase" ,qtbase)
+       ("qtdeclarative" ,qtdeclarative)))))
+
+(define-public qtscxml
+  (package (inherit qtsvg)
+    (name "qtscxml")
+    (version "5.7.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
+               "135kknqdmib2cjryfmvfgv7a2qx9pyba3m7i7nkbc5d742r4mbcx"))
+             (modules '((guix build utils)))
+             (snippet
+              '(begin
+                 (delete-file-recursively "tests/3rdparty")
+                 ;; the scion test refers to the bundled 3rd party test code.
+                 (substitute* "tests/auto/auto.pro"
+                   (("scion") "#"))))))
+    (inputs
+     `(("qtbase" ,qtbase)
+       ("qtdeclarative" ,qtdeclarative)))))
+
+(define-public qtpurchasing
+  (package (inherit qtsvg)
+    (name "qtpurchasing")
+    (version "5.7.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
+               "0hkvrgafz1hx9q4yc3nskv3pd3fszghvvd5a7mj33ynf55wpb57n"))))
+    (inputs
+     `(("qtbase" ,qtbase)
+       ("qtdeclarative" ,qtdeclarative)))))
+
+(define-public qtcanvas3d
+  (package (inherit qtsvg)
+    (name "qtcanvas3d")
+    (version "5.7.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
+               "1d5xpq3mhjg4ipxzap7s2vnlfcd02d3yq720npv10xxp2ww0i1x8"))
+             (modules '((guix build utils)))
+             (snippet
+              '(delete-file-recursively "examples/canvas3d/3rdparty"))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments qtsvg)
+      ;; Building the tests depends on the bundled 3rd party javascript files,
+      ;; and the test phase fails to import QtCanvas3D, causing the phase to
+      ;; fail, so we skip building them for now.
+      ((#:phases phases)
+       `(modify-phases ,phases
+         (replace 'configure
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (zero? (system* "qmake" "QT_BUILD_PARTS = libs tools"
+                               (string-append "PREFIX=" out))))))))
+       ((#:tests? _ #f) #f))) ; TODO: Enable the tests
+    (native-inputs `())
+    (inputs
+     `(("qtbase" ,qtbase)
+       ("qtdeclarative" ,qtdeclarative)))))
+
+(define-public qtcharts
+  (package (inherit qtsvg)
+    (name "qtcharts")
+    (version "5.7.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
+               "1qrzcddwff2hxsbxrraff16j4abah2zkra2756s1mvydj9lyxzl5"))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments qtsvg)
+       ((#:tests? _ #f) #f))) ; TODO: Enable the tests
+    (inputs
+     `(("qtbase" ,qtbase)
+       ("qtdeclarative" ,qtdeclarative)))))
+
+(define-public qtdatavis3d
+  (package (inherit qtsvg)
+    (name "qtdatavis3d")
+    (version "5.7.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
+               "1y00p0wyj5cw9c2925y537vpmmg9q3kpf7qr1s7sv67dvvf8bzqv"))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments qtsvg)
+       ((#:tests? _ #f) #f))) ; TODO: Enable the tests
     (inputs
      `(("qtbase" ,qtbase)
        ("qtdeclarative" ,qtdeclarative)))))
@@ -1202,7 +1428,7 @@ different kinds of sliders, and much more.")
 (define-public qtwebkit
   (package
     (name "qtwebkit")
-    (version "5.7.0")
+    (version "5.7.1")
     (source
       (origin
         (method url-fetch)
@@ -1214,7 +1440,7 @@ different kinds of sliders, and much more.")
         ;; <http://lists.qt-project.org/pipermail/development/2016-May/025923.html>.
         (sha256
          (base32
-          "1prlpl3zslzpr1iv7m3irvxjxn3v8nlxh21v9k2kaq4fpwy2b8y7"))))
+          "00szgcra6pf2myfjrdbsr1gmrxycpbjqlzkplna5yr1rjg4gfv54"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("perl" ,perl)
@@ -1312,3 +1538,37 @@ embed content from the World Wide Web into your Qt application.  At the same
 time Web content can be enhanced with native controls.")
 
     (license license:lgpl2.1+)))
+
+(define-public dotherside
+  (package
+    (name "dotherside")
+    (version "0.5.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/filcuc/DOtherSide/"
+                           "archive/v" version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "0pqlrvy4ajjir80ra79ka3n0rjj0ir0f0m91cq86iz3nnw8w148z"))))
+    (build-system cmake-build-system)
+    (native-inputs
+     `(("qttools" ,qttools)))
+    (inputs
+     `(("qtbase" ,qtbase)
+       ("qtdeclarative" ,qtdeclarative)))
+    (home-page "https://github.com/frankosterfeld/qtkeychain")
+    (synopsis "C language library for creating bindings for the Qt QML language")
+    (description
+     "DOtherSide is a C language library for creating bindings for the
+QT QML language.  The following features are implementable from
+a binding language:
+@itemize
+@item Creating custom QObject
+@item Creating custom QAbstractListModels
+@item Creating custom properties, signals and slots
+@item Creating from QML QObject defined in the binded language
+@item Creating from Singleton QML QObject defined in the binded language
+@end itemize\n")
+    (license license:lgpl3)))                    ;version 3 only (+ exception)
diff --git a/gnu/packages/ruby.scm b/gnu/packages/ruby.scm
index c87f8b309f..8fb22d0060 100644
--- a/gnu/packages/ruby.scm
+++ b/gnu/packages/ruby.scm
@@ -4,7 +4,7 @@
 ;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2014, 2015 David Thompson <davet@gnu.org>
 ;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
-;;; Copyright © 2015, 2016 Ben Woodcroft <donttrustben@gmail.com>
+;;; Copyright © 2015, 2016, 2017 Ben Woodcroft <donttrustben@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -180,13 +180,13 @@ a focus on simplicity and productivity.")
 (define-public ruby-hoe
   (package
     (name "ruby-hoe")
-    (version "3.15.2")
+    (version "3.16.0")
     (source (origin
               (method url-fetch)
               (uri (rubygems-uri "hoe" version))
               (sha256
                (base32
-                "1riyf9j9vp7dzgpw5xj9xx1vqkdmg6lr7qiprmn91hcdp81kaszp"))) )
+                "03r8nsw4n4mnia9iqiqk9kqhvrl96m2i81j4yg8cpnppd8vk7vlb"))))
     (build-system ruby-build-system)
     (synopsis "Ruby project management helper")
     (description
@@ -1479,13 +1479,13 @@ with processes on remote servers, via SSH2.")
 (define-public ruby-minitest
   (package
     (name "ruby-minitest")
-    (version "5.7.0")
+    (version "5.10.1")
     (source (origin
               (method url-fetch)
               (uri (rubygems-uri "minitest" version))
               (sha256
                (base32
-                "0rxqfakp629mp3vwda7zpgb57lcns5znkskikbfd0kriwv8i1vq8"))))
+                "1yk2m8sp0p5m1niawa3ncg157a4i0594cg7z91rzjxv963rzrwab"))))
     (build-system ruby-build-system)
     (native-inputs
      `(("ruby-hoe" ,ruby-hoe)))
@@ -1912,13 +1912,13 @@ to reproduce user environments.")
 (define-public ruby-nokogiri
   (package
     (name "ruby-nokogiri")
-    (version "1.6.8")
+    (version "1.7.0.1")
     (source (origin
               (method url-fetch)
               (uri (rubygems-uri "nokogiri" version))
               (sha256
                (base32
-                "17pjhvm4yigriizxbbpx266nnh6nckdm33m3j4ws9dcg99daz91p"))))
+                "10xahg0fwydh27psm8bv429mdja2ks6x83vxizq26ib8wvs05mv3"))))
     (build-system ruby-build-system)
     (arguments
      ;; Tests fail because Nokogiri can only test with an installed extension,
@@ -3049,44 +3049,40 @@ features such as filtering and fine grained logging.")
     (license license:expat)))
 
 (define-public ruby-yard
-  ;; Use git reference because gem is >100 commits out of date and the tests
-  ;; do not pass with the released gem.
-  (let ((commit "d816482a0d4850506c3bcccc9434550c536c28c6"))
-    (package
-      (name "ruby-yard")
-      (version (string-append "0.9.5-1." (string-take commit 8)))
-      (source
-       (origin
-         (method git-fetch)
-         (uri (git-reference
-               (url "https://github.com/lsegal/yard.git")
-               (commit commit)))
-         (file-name (string-append name "-" version "-checkout"))
-         (sha256
-          (base32
-           "1j16c85x22if7y0fzi3c900p9wzkx2riq1y7vsj92a0zvwsxai4i"))
-         (patches (search-patches "ruby-yard-fix-skip-of-markdown-tests.patch"))))
-      (build-system ruby-build-system)
-      (arguments
-       `(#:test-target "spec"
-         #:phases
-         (modify-phases %standard-phases
-           (add-before 'check 'set-HOME-and-disable-failing-test
-             (lambda _
-               ;; $HOME needs to be set to somewhere writeable for tests to run
-               (setenv "HOME" "/tmp")
-               #t)))))
-      (native-inputs
-       `(("ruby-rspec" ,ruby-rspec-2)
-         ("ruby-rack" ,ruby-rack)))
-      (synopsis "Documentation generation tool for Ruby")
-      (description
-       "YARD is a documentation generation tool for the Ruby programming
+  (package
+    (name "ruby-yard")
+    (version "0.9.6")
+    (source
+     (origin
+       (method url-fetch)
+       ;; Tests do not pass if we build from the distributed gem.
+       (uri (string-append "https://github.com/lsegal/yard/archive/v"
+                           version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "0rsz4bghgx7fryzyhlz8wlnd2m9xgyvf1xhrq58mnzfrrfm41bdg"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             ;; $HOME needs to be set to somewhere writeable for tests to run
+             (setenv "HOME" "/tmp")
+             ;; Run tests without using 'rake' to avoid dependencies.
+             (zero? (system* "rspec")))))))
+    (native-inputs
+     `(("ruby-rspec" ,ruby-rspec)
+       ("ruby-rack" ,ruby-rack)))
+    (synopsis "Documentation generation tool for Ruby")
+    (description
+     "YARD is a documentation generation tool for the Ruby programming
 language.  It enables the user to generate consistent, usable documentation
 that can be exported to a number of formats very easily, and also supports
 extending for custom Ruby constructs such as custom class level definitions.")
-      (home-page "http://yardoc.org")
-      (license license:expat))))
+    (home-page "http://yardoc.org")
+    (license license:expat)))
 
 (define-public ruby-clap
   (package
@@ -3304,14 +3300,14 @@ neither too verbose nor too minimal.")
 (define-public ruby-sqlite3
   (package
     (name "ruby-sqlite3")
-    (version "1.3.12")
+    (version "1.3.13")
     (source
      (origin
        (method url-fetch)
        (uri (rubygems-uri "sqlite3" version))
        (sha256
         (base32
-         "0hld87rvwyy31xsxzhicv2lj3g3kmvmwfxj09kw13g6lacdjz4bx"))))
+         "01ifzp8nwzqppda419c9wcvr8n82ysmisrs0hph9pdmv1lpa4f5i"))))
     (build-system ruby-build-system)
     (arguments
      `(#:phases
diff --git a/gnu/packages/rust.scm b/gnu/packages/rust.scm
new file mode 100644
index 0000000000..ae04530041
--- /dev/null
+++ b/gnu/packages/rust.scm
@@ -0,0 +1,332 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016 David Craven <david@craven.ch>
+;;; Copyright © 2016 Eric Le Bihan <eric.le.bihan.dev@free.fr>
+;;; Copyright © 2016 ng0 <ng0@libertad.pw>
+;;;
+;;; 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 rust)
+  #:use-module (gnu packages base)
+  #:use-module (gnu packages bootstrap)
+  #:use-module (gnu packages cmake)
+  #:use-module (gnu packages compression)
+  #:use-module (gnu packages curl)
+  #:use-module (gnu packages elf)
+  #:use-module (gnu packages gcc)
+  #:use-module (gnu packages jemalloc)
+  #:use-module (gnu packages llvm)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages python)
+  #:use-module (gnu packages ssh)
+  #:use-module (gnu packages tls)
+  #:use-module (gnu packages version-control)
+  #:use-module (guix build-system cargo)
+  #:use-module (guix build-system gnu)
+  #:use-module (guix build-system trivial)
+  #:use-module (guix download)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix packages)
+  #:use-module (ice-9 match)
+  #:use-module (srfi srfi-26))
+
+;; Should be one less than the current released version.
+(define %rust-bootstrap-binaries-version "1.13.0")
+
+(define %rust-bootstrap-binaries
+  (origin
+    (method url-fetch)
+    (uri (string-append
+          "https://static.rust-lang.org/dist/"
+          "rust-" %rust-bootstrap-binaries-version
+          "-i686-unknown-linux-gnu.tar.gz"))
+    (sha256
+     (base32
+      "0fcl7xgm2m21sjv1f27i3v692aa91lk8r867hl8d6l377w8k95r3"))))
+
+(define (increment-rust-version rust-version major patch)
+  (match (string-split rust-version #\.)
+    (("1" minor _)
+     (string-append (number->string major) "."
+                    (number->string (+ (string->number minor) 1)) "."
+                    (number->string patch)))))
+
+(define* (cargo-version rustc-version #:optional (patch 0))
+  ;; Computes the cargo version that matches the rustc version.
+  ;; https://github.com/rust-lang/cargo#Releases
+  (increment-rust-version rustc-version 0 patch))
+
+(define* (rustc-version bootstrap-version #:optional (patch 0))
+  ;; Computes the rustc version that can be compiled from a given
+  ;; other rustc version. The patch argument is for selecting
+  ;; a stability or security fix. 1.11.0 -> 1.12.1 -> 1.13.0
+  (increment-rust-version bootstrap-version 1 patch))
+
+(define rustc-bootstrap
+  (package
+    (name "rustc-bootstrap")
+    (version %rust-bootstrap-binaries-version)
+    (source %rust-bootstrap-binaries)
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("patchelf" ,patchelf)))
+    (inputs
+     `(("gcc:lib" ,(canonical-package gcc) "lib")
+       ("zlib" ,zlib)))
+    (arguments
+     `(#:tests? #f
+       #:strip-binaries? #f
+       #:system "i686-linux"
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure)
+         (delete 'build)
+         (replace 'install
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (gcc:lib (assoc-ref inputs "gcc:lib"))
+                    (libc (assoc-ref inputs "libc"))
+                    (zlib (assoc-ref inputs "zlib"))
+                    (ld-so (string-append libc
+                                          ,(glibc-dynamic-linker "i686-linux")))
+                    (rpath (string-append out "/lib:" zlib "/lib:"
+                                          libc "/lib:" gcc:lib "/lib"))
+                    (rustc (string-append out "/bin/rustc"))
+                    (rustdoc (string-append out "/bin/rustdoc")))
+               (system* "bash" "install.sh"
+                        (string-append "--prefix=" out)
+                        (string-append "--components=rustc,"
+                                       "rust-std-i686-unknown-linux-gnu"))
+               (for-each (lambda (file)
+                           (system* "patchelf" "--set-rpath" rpath file))
+                         (cons* rustc rustdoc (find-files out "\\.so$")))
+               (for-each (lambda (file)
+                           (system* "patchelf" "--set-interpreter" ld-so file))
+                         (list rustc rustdoc))))))))
+    (supported-systems '("i686-linux" "x86_64-linux"))
+    (home-page "https://www.rust-lang.org")
+    (synopsis "Prebuilt rust compiler")
+    (description "This package provides a pre-built @command{rustc} compiler,
+which can in turn be used to build the final Rust compiler.")
+    (license license:asl2.0)))
+
+(define cargo-bootstrap
+  (package
+    (name "cargo-bootstrap")
+    (version (cargo-version %rust-bootstrap-binaries-version))
+    (source %rust-bootstrap-binaries)
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("patchelf" ,patchelf)))
+    (inputs
+     `(("gcc:lib" ,(canonical-package gcc) "lib")))
+    (arguments
+     `(#:tests? #f
+       #:strip-binaries? #f
+       #:system "i686-linux"
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure)
+         (delete 'build)
+         (replace 'install
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (gcc:lib (assoc-ref inputs "gcc:lib"))
+                    (libc (assoc-ref inputs "libc"))
+                    (ld-so (string-append libc
+                                          ,(glibc-dynamic-linker "i686-linux")))
+                    (rpath (string-append out "/lib:" libc "/lib:"
+                                          gcc:lib "/lib"))
+                    (cargo (string-append out "/bin/cargo")))
+               (system* "bash" "install.sh"
+                        (string-append "--prefix=" out)
+                        "--components=cargo")
+               (system* "patchelf"
+                        "--set-interpreter" ld-so
+                        "--set-rpath" rpath
+                        cargo)))))))
+    (supported-systems '("i686-linux" "x86_64-linux"))
+    (home-page "https://www.rust-lang.org")
+    (synopsis "Prebuilt cargo package manager")
+    (description "This package provides a pre-built @command{cargo} package
+manager, which is required to build itself.")
+    (license license:asl2.0)))
+
+(define rust-bootstrap
+  (package
+    (name "rust-bootstrap")
+    (version %rust-bootstrap-binaries-version)
+    (source #f)
+    (build-system trivial-build-system)
+    (propagated-inputs
+     `(("rustc-bootstrap" ,rustc-bootstrap)
+       ("cargo-bootstrap" ,cargo-bootstrap)
+       ("gcc" ,(canonical-package gcc))))
+    (arguments
+     `(#:modules ((guix build utils))
+       #:builder
+       (begin
+         (use-modules (guix build utils))
+         (let ((out (assoc-ref %outputs "out"))
+               (gcc (assoc-ref %build-inputs "gcc")))
+           (mkdir-p (string-append out "/bin"))
+           ;; Rust requires a C toolchain for linking. The prebuilt
+           ;; binaries expect a compiler called cc. Thus symlink gcc
+           ;; to cc.
+           (symlink (string-append gcc "/bin/gcc")
+                    (string-append out "/bin/cc"))))))
+    (home-page "https://www.rust-lang.org")
+    (synopsis "Rust bootstrapping meta package")
+    (description "Meta package for a rust environment. Provides pre-compiled
+rustc-bootstrap and cargo-bootstrap packages.")
+    (license license:asl2.0)))
+
+(define-public rustc
+  (package
+    (name "rustc")
+    (version (rustc-version %rust-bootstrap-binaries-version))
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://static.rust-lang.org/dist/"
+                    "rustc-" version "-src.tar.gz"))
+              (sha256
+               (base32
+                "0srvmhhdbbcl21nzg9m9zni7k10h88lsy8k1ljz03g8mx79fv467"))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("cmake" ,cmake)
+       ("git" ,git)
+       ("python-2" ,python-2)
+       ("rust-bootstrap" ,rust-bootstrap)
+       ("which" ,which)))
+    (inputs
+     `(("jemalloc" ,jemalloc)
+       ("llvm" ,llvm)))
+    (arguments
+     ;; FIXME: Test failure with llvm 3.8; Update llvm.
+     ;; https://github.com/rust-lang/rust/issues/36835
+     `(#:tests? #f
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'patch-configure
+           (lambda _
+             ;; Detect target CPU correctly.
+             (substitute* "configure"
+               (("/usr/bin/env") (which "env")))
+             ;; Avoid curl as a build dependency.
+             (substitute* "configure"
+               (("probe_need CFG_CURL curl") ""))))
+         (add-after 'unpack 'set-env
+           (lambda _
+             (setenv "SHELL" (which "sh"))
+             (setenv "CONFIG_SHELL" (which "sh"))))
+         (add-after 'unpack 'patch-lockfile-test
+           (lambda _
+             (substitute* "src/tools/tidy/src/main.rs"
+               (("^.*cargo.*::check.*$") ""))))
+         (replace 'configure
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (gcc (assoc-ref inputs "gcc"))
+                    (binutils (assoc-ref inputs "binutils"))
+                    (python (assoc-ref inputs "python-2"))
+                    (rustc (assoc-ref inputs "rustc-bootstrap"))
+                    (llvm (assoc-ref inputs "llvm"))
+                    (jemalloc (assoc-ref inputs "jemalloc"))
+                    (flags (list
+                            (string-append "--prefix=" out)
+                            (string-append "--datadir=" out "/share")
+                            (string-append "--infodir=" out "/share/info")
+                            (string-append "--default-linker=" gcc "/bin/gcc")
+                            (string-append "--default-ar=" binutils "/bin/ar")
+                            (string-append "--python=" python "/bin/python2")
+                            (string-append "--local-rust-root=" rustc)
+                            (string-append "--llvm-root=" llvm)
+                            (string-append "--jemalloc-root=" jemalloc "/lib")
+                            "--release-channel=stable"
+                            "--enable-rpath"
+                            "--enable-local-rust"
+                            ;;"--enable-rustbuild"
+                            "--disable-manage-submodules")))
+               ;; Rust uses a custom configure script (no autoconf).
+               (zero? (apply system* "./configure" flags)))))
+         (add-after 'install 'wrap-rustc
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out"))
+                   (libc (assoc-ref inputs "libc"))
+                   (ld-wrapper (assoc-ref inputs "ld-wrapper")))
+               ;; Let gcc find ld and libc startup files.
+               (wrap-program (string-append out "/bin/rustc")
+                 `("PATH" ":" prefix (,(string-append ld-wrapper "/bin")))
+                 `("LIBRARY_PATH" ":" suffix (,(string-append libc "/lib"))))))))))
+    (synopsis "Compiler for the Rust progamming language")
+    (description "Rust is a systems programming language that provides memory
+safety and thread safety guarantees.")
+    (home-page "https://www.rust-lang.org")
+    ;; Dual licensed.
+    (license (list license:asl2.0 license:expat))))
+
+(define-public cargo
+  (package
+    (name "cargo")
+    (version (cargo-version (rustc-version %rust-bootstrap-binaries-version)))
+    (source (origin
+              (method url-fetch)
+              ;; Use a cargo tarball with vendored dependencies and a cargo
+              ;; config file.
+              (uri (string-append
+                    "https://github.com/dvc94ch/cargo"
+                    "/archive/" version "-cargo-vendor.tar.gz"))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "0hpix5hwz10pm1wh65gimhsy9nxjvy7yikgbpw8afwglqr3bl856"))))
+    (build-system cargo-build-system)
+    (propagated-inputs
+     `(("cmake" ,cmake)
+       ("pkg-config" ,pkg-config)))
+    (inputs
+     `(("curl" ,curl)
+       ("libgit2" ,libgit2)
+       ("libssh2" ,libssh2)
+       ("openssl" ,openssl)
+       ("python-2" ,python-2)
+       ("zlib" ,zlib)))
+    (arguments
+     `(#:cargo ,cargo-bootstrap
+       #:tests? #f ; FIXME
+       #:phases
+       (modify-phases %standard-phases
+         ;; Avoid cargo complaining about missmatched checksums.
+         (delete 'patch-source-shebangs)
+         (delete 'patch-generated-file-shebangs)
+         (delete 'patch-usr-bin-file)
+         ;; Set CARGO_HOME to use the vendored dependencies.
+         (add-after 'unpack 'set-cargo-home
+           (lambda* (#:key inputs #:allow-other-keys)
+             (let* ((gcc (assoc-ref inputs "gcc"))
+                    (cc (string-append gcc "/bin/gcc")))
+               (setenv "CARGO_HOME" (string-append (getcwd) "/cargohome"))
+               (setenv "CMAKE_C_COMPILER" cc)
+               (setenv "CC" cc))
+             #t)))))
+    (home-page "https://github.com/rust-lang/cargo")
+    (synopsis "Build tool and package manager for Rust")
+    (description "Cargo is a tool that allows Rust projects to declare their
+dependencies and ensures a reproducible build.")
+    ;; Cargo is dual licensed Apache and MIT. Also contains
+    ;; code from openssl which is GPL2 with linking exception.
+    (license (list license:asl2.0 license:expat license:gpl2))))
diff --git a/gnu/packages/samba.scm b/gnu/packages/samba.scm
index 913d5f7d98..b2309f4b51 100644
--- a/gnu/packages/samba.scm
+++ b/gnu/packages/samba.scm
@@ -99,14 +99,14 @@ anywhere.")
 (define-public samba
   (package
     (name "samba")
-    (version "4.5.1")
+    (version "4.5.3")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://download.samba.org/pub/samba/stable/"
                                  "samba-" version ".tar.gz"))
              (sha256
               (base32
-               "11ghsfvqxzfv8gnl62jfnpil9cwd04gak8sx5qcg6zv7d7h079xh"))))
+               "1jif95684swssqwp9v3i2r08cn3r2iddf6ly68db4wmvl5ac8vgh"))))
     (build-system gnu-build-system)
     (arguments
      '(#:phases
diff --git a/gnu/packages/scanner.scm b/gnu/packages/scanner.scm
index 76817b389f..7bdbf35f05 100644
--- a/gnu/packages/scanner.scm
+++ b/gnu/packages/scanner.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014 John Darrington <jmd@gnu.org>
 ;;; Copyright © 2015 Andy Wingo <wingo@igalia.com>
+;;; Copyright © 2016 Andy Patterson <ajpatter@uwaterloo.ca>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -20,24 +21,32 @@
 (define-module (gnu packages scanner)
   #:use-module (guix packages)
   #:use-module (guix download)
+  #:use-module (guix utils)
   #:use-module (guix build-system gnu)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages libusb)
   #:use-module ((guix licenses)
                 #:prefix licence:))
 
-(define-public sane-backends
+(define-public sane-backends-minimal
   (package
-    (name "sane-backends")
+    (name "sane-backends-minimal")
     (version "1.0.25")
     (source (origin
              (method url-fetch)
              (uri (string-append
                    "https://alioth.debian.org/frs/download.php/file/4146/"
-                   name "-" version ".tar.gz"))
+                   "sane-backends-" version ".tar.gz"))
              (sha256
               (base32
-               "0b3fvhrxl4l82bf3v0j47ypjv6a0k5lqbgknrq1agpmjca6vmmx4"))))
+               "0b3fvhrxl4l82bf3v0j47ypjv6a0k5lqbgknrq1agpmjca6vmmx4"))
+             (modules '((guix build utils)))
+             (snippet
+              ;; Generated HTML files and udev rules normally embed a
+              ;; timestamp.  Work around that to build things reproducibly.
+              '(substitute* "tools/sane-desc.c"
+                 (("asctime \\(localtime \\(&current_time\\)\\)")
+                  "\"1970-01-01\"")))))
     (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)))
@@ -47,6 +56,10 @@
      `(#:tests? #f
        #:phases
        (modify-phases %standard-phases
+         (add-before 'configure 'disable-backends
+           (lambda _
+             (setenv "BACKENDS" " ")
+             #t))
          (add-after
           'install 'install-udev-rules
           (lambda* (#:key outputs #:allow-other-keys)
@@ -67,9 +80,48 @@
     ;; **** File generated for html-backends-split mode is different from reference
     ;; Makefile:501: recipe for target 'check.local' failed
     (home-page "http://www.sane-project.org")
-    (synopsis "Raster image scanner library and drivers")
+    (synopsis
+     "Raster image scanner library and drivers, without scanner support")
     (description "SANE stands for \"Scanner Access Now Easy\" and is an API
 proving access to any raster image scanner hardware (flatbed scanner,
 hand-held scanner, video- and still-cameras, frame-grabbers, etc.).  The
-package contains the library and drivers.")
+package contains the library, but no drivers.")
     (license licence:gpl2+))) ; plus linking exception
+
+;; This variant links in the hpaio backend, provided by hplip, which adds
+;; support for HP scanners whose backends are not maintained by
+;; 'sane-backends'. It also builds all of those backends.
+(define-public sane-backends
+  (package
+    (inherit sane-backends-minimal)
+    (name "sane-backends")
+    (inputs
+     `(("hplip" ,(@ (gnu packages cups) hplip))
+       ,@(package-inputs sane-backends-minimal)))
+    (arguments
+     (substitute-keyword-arguments (package-arguments sane-backends-minimal)
+       ((#:phases phases)
+        `(modify-phases ,phases
+           (delete 'disable-backends)
+           (add-after 'unpack 'add-backends
+             (lambda _
+               (substitute* "backend/dll.conf.in"
+                 (("hp5590" all) (format #f "~a~%~a" all "hpaio")))
+               #t))
+           (add-after 'install 'install-hpaio
+             (lambda* (#:key inputs outputs #:allow-other-keys)
+               (define hplip (string-append (assoc-ref inputs "hplip")
+                                            "/lib/sane"))
+               (define out (string-append (assoc-ref outputs "out")
+                                          "/lib/sane"))
+               (for-each
+                (lambda (file)
+                  (symlink file (string-append out "/" (basename file))))
+                (find-files hplip))
+               #t))))))
+    (synopsis
+     "Raster image scanner library and drivers, with scanner support")
+    (description "SANE stands for \"Scanner Access Now Easy\" and is an API
+proving access to any raster image scanner hardware (flatbed scanner,
+hand-held scanner, video- and still-cameras, frame-grabbers, etc.).  The
+package contains the library and drivers.")))
diff --git a/gnu/packages/scheme.scm b/gnu/packages/scheme.scm
index 16b1b5586c..2756805f3d 100644
--- a/gnu/packages/scheme.scm
+++ b/gnu/packages/scheme.scm
@@ -323,20 +323,24 @@ mashups, office (web agendas, mail clients, ...), etc.")
 (define-public chicken
   (package
     (name "chicken")
-    (version "4.11.0")
+    (version "4.11.1")
     (source (origin
-             (method url-fetch)
-             (uri (string-append "http://code.call-cc.org/releases/"
-                                 version "/chicken-" version ".tar.gz"))
-             (sha256
-              (base32
-               "12ddyiikqknpr8h6llsxbg2fz75xnayvcnsvr1cwv8xnjn7jpp73"))))
+              (method url-fetch)
+              (uri (string-append "http://code.call-cc.org/releases/"
+                                  version "/chicken-" version ".tar.gz"))
+              (uri (string-append "http://code.call-cc.org/dev-snapshots/"
+                                  "2016/09/12/chicken-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1rwymbbmnwdyhdzilv9w75an989xw9kjf3x52iqdng3nphpflcga"))
+              (patches
+               (search-patches "chicken-CVE-2016-6830+CVE-2016-6831.patch"))))
     (build-system gnu-build-system)
     (arguments
      `(#:modules ((guix build gnu-build-system)
                   (guix build utils)
                   (srfi srfi-1))
-
+       
        ;; No `configure' script; run "make check" after "make install" as
        ;; prescribed by README.
        #:phases
@@ -344,14 +348,7 @@ mashups, office (web agendas, mail clients, ...), etc.")
          (delete 'configure)
          (delete 'check)
          (add-after 'install 'check
-           (assoc-ref %standard-phases 'check))
-         (add-after 'unpack 'disable-broken-tests
-           (lambda _
-             ;; The port tests fail with this error:
-             ;; Error: (line 294) invalid escape-sequence '\x o'
-             (substitute* "tests/runtests.sh"
-               (("\\$interpret -s port-tests\\.scm") ""))
-             #t)))
+           (assoc-ref %standard-phases 'check)))
 
        #:make-flags (let ((out (assoc-ref %outputs "out")))
                       (list "PLATFORM=linux"
@@ -578,7 +575,7 @@ mixed.")
                       (list (string-append "PREFIX=" out)
                             (string-append "LDFLAGS=-Wl,-rpath=" out "/lib")))
        #:test-target "test"))
-    (home-page "https://code.google.com/p/chibi-scheme/")
+    (home-page "https://github.com/ashinn/chibi-scheme")
     (synopsis "Small embeddable Scheme implementation")
     (description
      "Chibi-Scheme is a very small library with no external dependencies
diff --git a/gnu/packages/sdl.scm b/gnu/packages/sdl.scm
index bb4ad1c90b..cb0af1ceed 100644
--- a/gnu/packages/sdl.scm
+++ b/gnu/packages/sdl.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2015 David Thompson <dthompson2@worcester.edu>
+;;; Copyright © 2013, 2015, 2017 David Thompson <dthompson2@worcester.edu>
 ;;; Copyright © 2014 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com>
 ;;; Copyright © 2015 Alex Kost <alezost@gmail.com>
@@ -29,8 +29,11 @@
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system trivial)
   #:use-module (gnu packages audio)
+  #:use-module (gnu packages fcitx)
   #:use-module (gnu packages fontutils)
+  #:use-module (gnu packages glib)
   #:use-module (gnu packages guile)
+  #:use-module (gnu packages ibus)
   #:use-module (gnu packages image)
   #:use-module (gnu packages linux)
   #:use-module (gnu packages mp3)
@@ -97,6 +100,16 @@ joystick, and graphics hardware.")
              (sha256
               (base32
                "11c75qj1qxmx67iwkvf9z4x69phk301pdn86zzr6jncnap7kh824"))))
+    (inputs
+     ;; SDL2 needs to be built with ibus support otherwise some systems
+     ;; experience a bug where input events are doubled.
+     ;;
+     ;; For more information, see: https://dev.solus-project.com/T1721
+     (append `(("dbus" ,dbus)
+               ("fcitx" ,fcitx) ; helps with CJK input
+               ("glib" ,glib)
+               ("ibus" ,ibus))
+             (package-inputs sdl)))
     (license bsd-3)))
 
 (define-public libmikmod
diff --git a/gnu/packages/search.scm b/gnu/packages/search.scm
index f0dbbc9b11..cb8b670757 100644
--- a/gnu/packages/search.scm
+++ b/gnu/packages/search.scm
@@ -35,13 +35,13 @@
 (define-public xapian
   (package
     (name "xapian")
-    (version "1.4.1")
+    (version "1.4.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://oligarchy.co.uk/xapian/" version
                                   "/xapian-core-" version ".tar.xz"))
               (sha256
-               (base32 "1svhrs5zl7cyv9kqh70k02zc3cmpcpn6nvgdkv0pl1iwwx6m7wn5"))))
+               (base32 "1kp18r97qm2zky9z6ym8csjg1kj81zvqn88n4cppl4lq54sw9hmf"))))
     (build-system gnu-build-system)
     (inputs `(("zlib" ,zlib)
               ("util-linux" ,util-linux)))
diff --git a/gnu/packages/security-token.scm b/gnu/packages/security-token.scm
index 8f58c589d9..e1b87adff9 100644
--- a/gnu/packages/security-token.scm
+++ b/gnu/packages/security-token.scm
@@ -93,15 +93,15 @@ the low-level development kit for the Yubico YubiKey authentication device.")
 (define-public pcsc-lite
   (package
     (name "pcsc-lite")
-    (version "1.8.18")
+    (version "1.8.20")
     (source (origin
               (method url-fetch)
               (uri (string-append
-                    "https://alioth.debian.org/frs/download.php/file/4179/"
+                    "https://alioth.debian.org/frs/download.php/file/4203/"
                     "pcsc-lite-" version ".tar.bz2"))
               (sha256
                (base32
-                "0189s10xsgcmdvc2sixakncwlv47cg6by6m9vdm038gn32q34bdj"))))
+                "1ckb0jf4n585a4j26va3jm2nrv3c1y38974514f8qy3c04a02zgc"))))
     (build-system gnu-build-system)
     (arguments
      `(#:configure-flags '("--enable-usbdropdir=/var/lib/pcsc/drivers")))
diff --git a/gnu/packages/serialization.scm b/gnu/packages/serialization.scm
index 3f20a3525c..8db81c581c 100644
--- a/gnu/packages/serialization.scm
+++ b/gnu/packages/serialization.scm
@@ -154,7 +154,7 @@ serialization.")
 (define-public jsoncpp
   (package
     (name "jsoncpp")
-    (version "1.7.7")
+    (version "1.8.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -163,7 +163,7 @@ serialization.")
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "15wg14480lrbrhc2myk9rwpwb2gzix9bk80p4y7gxg3zrzml0xh8"))))
+                "1g35ci93s03wph4kabi46iz42wgyfbn2763cklf15h7hrdi29ssx"))))
     (build-system cmake-build-system)
     (home-page "https://github.com/open-source-parsers/jsoncpp")
     (arguments
diff --git a/gnu/packages/shells.scm b/gnu/packages/shells.scm
index 1931609753..5237e81206 100644
--- a/gnu/packages/shells.scm
+++ b/gnu/packages/shells.scm
@@ -4,6 +4,7 @@
 ;;; Copyright © 2014 Kevin Lemonnier <lemonnierk@ulrar.net>
 ;;; Copyright © 2015 Jeff Mickey <j@codemac.net>
 ;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2016 Stefan Reichör <stefan@xsteve.at>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -298,21 +299,21 @@ ksh, and tcsh.")
 (define-public xonsh
   (package
     (name "xonsh")
-    (version "0.4.7")
+    (version "0.5.2")
     (source
       (origin
         (method url-fetch)
         (uri (pypi-uri "xonsh" version))
         (sha256
           (base32
-            "04b0z41mxiwsp5rl21fzrixcdmx2kndjlh4gn3582qfga9hihf20"))
+            "13ndyq9cal2j93qqbjyp2jn3cshiavdxsaj2qjzm6mas0gzywmf0"))
         (modules '((guix build utils)))
         (snippet
          `(begin
             ;; Delete bundled ply.
             (delete-file-recursively "xonsh/ply")
             (substitute* '("setup.py")
-              (("'xonsh\\.ply',") ""))
+              (("'xonsh\\.ply\\.ply',") ""))
             #t))))
     (build-system python-build-system)
     (arguments
@@ -326,8 +327,8 @@ ksh, and tcsh.")
     (synopsis "Python-ish shell")
     (description
      "Xonsh is a Python-ish, BASHwards-looking shell language and command
-prompt. The language is a superset of Python 3.4+ with additional shell
-primitives that you are used to from Bash and IPython. It works on all major
-systems including Linux, Mac OSX, and Windows. Xonsh is meant for the daily
+prompt.  The language is a superset of Python 3.4+ with additional shell
+primitives that you are used to from Bash and IPython.  It works on all major
+systems including Linux, Mac OSX, and Windows.  Xonsh is meant for the daily
 use of experts and novices alike.")
     (license bsd-2)))
diff --git a/gnu/packages/shellutils.scm b/gnu/packages/shellutils.scm
index d832194700..c9a35ca3b6 100644
--- a/gnu/packages/shellutils.scm
+++ b/gnu/packages/shellutils.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2016 Matthew Jordan <matthewjordandevops@yandex.com>
-;;; Copyright © 2016 Alex Griffin <a@ajgrf.com>
+;;; Copyright © 2016, 2017 Alex Griffin <a@ajgrf.com>
 ;;; Copyright © 2016 Christopher Baines <mail@cbaines.net>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -58,14 +58,14 @@ between various shells or commands.")
 (define-public trash-cli
   (package
     (name "trash-cli")
-    (version "0.12.9.14")
+    (version "0.17.1.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "trash-cli" version))
        (sha256
         (base32
-         "1p4v2qx0sy47d9c9axszq04wns63s4b7rrhmsavg948sklqdaf54"))))
+         "019sjab29jkps8zkf8icihhf3ng4lx9y4p1lxjd3wbnnynphc4is"))))
     (build-system python-build-system)
     (arguments
      `(#:python ,python-2
diff --git a/gnu/packages/speech.scm b/gnu/packages/speech.scm
index 39a940dfde..1d903520e7 100644
--- a/gnu/packages/speech.scm
+++ b/gnu/packages/speech.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2016 David Thompson <davet@gnu.org>
 ;;; Copyright © 2016 Marius Bakke <mbakke@fastmail.com>
+;;; Copyright © 2017 Leo Famulari <leo@famulari.name>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -92,3 +93,36 @@ stable and well documented interface.")
                     ;; festival_client.{c,h} carries an expat-style license.
                     "See src/modules/festival_client.c in the distribution.")
                    license:gpl3+)))) ; doc/texinfo.tex -- with TeX exception.
+
+(define-public sonic
+  (package
+    (name "sonic")
+    (version "0.2.0")
+    (source (origin
+             (method url-fetch)
+             (uri (string-append "https://github.com/waywardgeek/sonic/archive/"
+                                 "release-" version ".tar.gz"))
+             (file-name (string-append name "-" version ".tar.gz"))
+             (sha256
+              (base32
+               "11a0q9wkgbb9ymf52v7dvybfhj8hprgr67zs1xcng143fvjpr0n7"))))
+    (build-system gnu-build-system)
+    (arguments
+      `(#:tests? #f ; No test suite.
+        #:make-flags
+         (list (string-append "DESTDIR=" (assoc-ref %outputs "out")))
+        #:phases
+        (modify-phases %standard-phases
+          (delete 'configure)))) ; No ./configure script.
+    (synopsis "Speed up or slow down speech")
+    (description "Sonic implements a simple algorithm for speeding up or slowing
+down speech.  However, it's optimized for speed ups of over 2X, unlike previous
+algorithms for changing speech rate.  Sonic is a C library designed to be easily
+integrated into streaming voice applications such as text-to-speech (TTS) back
+ends.
+
+The primary motivation behind Sonic is to enable the blind and visually impaired
+to improve their productivity with speech engines, like eSpeak.  Sonic can also
+be used by the sighted.")
+    (home-page "https://github.com/waywardgeek/sonic")
+    (license license:asl2.0)))
diff --git a/gnu/packages/ssh.scm b/gnu/packages/ssh.scm
index ea5ec811d1..0fe6598bb2 100644
--- a/gnu/packages/ssh.scm
+++ b/gnu/packages/ssh.scm
@@ -112,7 +112,7 @@ a server that supports the SSH-2 protocol.")
 (define-public openssh
   (package
    (name "openssh")
-   (version "7.3p1")
+   (version "7.4p1")
    (source (origin
             (method url-fetch)
             (uri (let ((tail (string-append name "-" version ".tar.gz")))
@@ -122,9 +122,8 @@ a server that supports the SSH-2 protocol.")
                                         tail)
                          (string-append "http://ftp2.fr.openbsd.org/pub/OpenBSD/OpenSSH/portable/"
                                         tail))))
-            (patches (search-patches "openssh-memory-exhaustion.patch"))
             (sha256 (base32
-                     "1k5y1wi29d47cgizbryxrhc1fbjsba2x8l5mqfa9b9nadnd9iyrz"))))
+                     "1l8r3x4fr2kb6xm95s7kjdif1wp6f94d4kljh4qjj9109shw87qv"))))
    (build-system gnu-build-system)
    (inputs `(("groff" ,groff)
              ("openssl" ,openssl)
diff --git a/gnu/packages/statistics.scm b/gnu/packages/statistics.scm
index 36f1889efa..db1a6871ad 100644
--- a/gnu/packages/statistics.scm
+++ b/gnu/packages/statistics.scm
@@ -6,6 +6,7 @@
 ;;; Copyright © 2016 Pjotr Prins <pjotr.guix@thebird.nl>
 ;;; Copyright © 2016 Roel Janssen <roel@gnu.org>
 ;;; Copyright © 2016 Ben Woodcroft <donttrustben@gmail.com>
+;;; Copyright © 2016 Raoul Bonnal <ilpuccio.febo@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -101,7 +102,7 @@ be output in text, PostScript, PDF or HTML.")
 (define-public r
   (package
     (name "r")
-    (version "3.3.1")
+    (version "3.3.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://cran/src/base/R-"
@@ -109,7 +110,7 @@ be output in text, PostScript, PDF or HTML.")
                                   version ".tar.gz"))
               (sha256
                (base32
-                "1qm9znh8akfy9fkzzi6f1vz2w1dd0chsr6qn7kw80lqzhgjrmi9x"))))
+                "0k2i9qdd83g09fcpls2198q4ykxkii5skczb514gnx7mx4hsv56j"))))
     (build-system gnu-build-system)
     (arguments
      `(#:make-flags
@@ -205,16 +206,63 @@ publication-quality data plots.  A large amount of 3rd-party packages are
 available, greatly increasing its breadth and scope.")
     (license license:gpl3+)))
 
+(define-public r-bit
+  (package
+    (name "r-bit")
+    (version "1.1-12")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "bit" version))
+       (sha256
+        (base32
+         "0a6ig6nnjzq80r2ll4hc74za3xwzbzig6wlyb4dby0knzf3iqa6f"))))
+    (build-system r-build-system)
+    (home-page "http://ff.r-forge.r-project.org")
+    (synopsis "Class for vectors of 1-bit booleans")
+    (description
+     "This package provides bitmapped vectors of booleans (no @code{NA}s),
+coercion from and to logicals, integers and integer subscripts, fast boolean
+operators and fast summary statistics.  With @code{bit} class vectors of true
+binary booleans, @code{TRUE} and @code{FALSE} can be stored with 1 bit only.")
+    (license license:gpl2)))
+
+(define-public r-bit64
+  (package
+    (name "r-bit64")
+    (version "0.9-5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "bit64" version))
+       (sha256
+        (base32
+         "0fz5m3fhvxgwjl76maag7yn0zdw24rx34gy6v77378fajag9yllg"))))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-bit" ,r-bit)))
+    (home-page "http://ff.r-forge.r-project.org/")
+    (synopsis "S3 class for vectors of 64 bit integers")
+    (description
+     "The bit64 package provides serializable S3 atomic 64 bit (signed)
+integers that can be used in vectors, matrices, arrays and @code{data.frames}.
+Methods are available for coercion from and to logicals, integers, doubles,
+characters and factors as well as many elementwise and summary functions.
+Many fast algorithmic operations such as @code{match} and @code{order} support
+interactive data exploration and manipulation and optionally leverage
+caching.")
+    (license license:gpl2)))
+
 (define-public r-colorspace
   (package
     (name "r-colorspace")
-    (version "1.2-7")
+    (version "1.3-2")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "colorspace" version))
        (sha256
-        (base32 "0flw97iwwpkxy6si9cn982jhl61wb1rxi3r0nz2xxf0c3fzw18d5"))))
+        (base32 "0d1ya7hx4y58n5ivwmdmq2zgh0g2sbv7ykh13n85c1355csd57yx"))))
     (build-system r-build-system)
     (home-page "http://cran.r-project.org/web/packages/colorspace")
     (synopsis "Color space manipulation")
@@ -276,13 +324,13 @@ OpenSSL should be used.")
 (define-public r-estimability
   (package
     (name "r-estimability")
-    (version "1.1-1")
+    (version "1.2")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "estimability" version))
               (sha256
                (base32
-                "049adh8i0ad0m0qln2ylqdxcs5v2q9zfignn2a50r5f93ip2ay6w"))))
+                "13b80bpnbrarazjvnpnk91ljjsqgfm2fm3gy66aj09cmmsmv199h"))))
     (build-system r-build-system)
     (home-page "http://cran.r-project.org/web/packages/estimability")
     (synopsis "Tools for assessing estimability of linear predictions")
@@ -394,13 +442,13 @@ Munsell colour system.")
 (define-public r-rcpp
   (package
     (name "r-rcpp")
-    (version "0.12.7")
+    (version "0.12.8")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "Rcpp" version))
        (sha256
-        (base32 "1ipid4yfqp1k5c70f7bz7izzq63srmrcxhiqrnyilk2wgrvd7ypb"))))
+        (base32 "0is1vql1q82g7yakad4skx707ip0fx3rgdwv9a8mi8259gly2qji"))))
     (build-system r-build-system)
     (home-page "http://www.rcpp.org")
     (synopsis "Seamless R and C++ Integration")
@@ -440,14 +488,14 @@ and operations on them using LAPACK and SuiteSparse.")
 (define-public r-mgcv
   (package
    (name "r-mgcv")
-   (version "1.8-15")
+   (version "1.8-16")
    (source
     (origin
      (method url-fetch)
      (uri (cran-uri "mgcv" version))
      (sha256
       (base32
-       "05xzmsx51y92c0r0yihac8m9d3v1sqnn8ahcgm3q75j8z6zybsjs"))))
+       "0pj31gdwra7nv8spys4pfcbmsik99q1y1d0d2g37ywc3sz5s0rlj"))))
    (build-system r-build-system)
    (home-page "http://cran.r-project.org/web/packages/mgcv")
    (synopsis "Mixed generalised additive model computation")
@@ -638,13 +686,13 @@ using just two functions: melt and dcast (or acast).")
 (define-public r-scales
   (package
     (name "r-scales")
-    (version "0.4.0")
+    (version "0.4.1")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "scales" version))
        (sha256
-        (base32 "19y6q4j8vpmc73dnn4ncp5wj44gri7m77ys3z2rn3crrcc9zc7l5"))))
+        (base32 "1lqccfmqdwrw0cjyqvw2zvgpk2jvnqrfb303l1raqyyf3zxqhav4"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-dichromat" ,r-dichromat)
@@ -664,22 +712,22 @@ legends.")
 (define-public r-ggplot2
   (package
     (name "r-ggplot2")
-    (version "2.1.0")
+    (version "2.2.1")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "ggplot2" version))
        (sha256
-        (base32 "0s9rvp0f736ji6p9xpxq54agxf95pjkql4sj7ag0hv2xhnp27hzj"))))
+        (base32 "0543782ddv2hp6s0l702mnxfg8n7a6qlbm8bm55x22hnqgz8kg2z"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-digest" ,r-digest)
        ("r-gtable" ,r-gtable)
        ("r-plyr" ,r-plyr)
-       ("r-proto" ,r-proto)
+       ("r-lazyeval" ,r-lazyeval)
+       ("r-tibble" ,r-tibble)
        ("r-reshape2" ,r-reshape2)
-       ("r-scales" ,r-scales)
-       ("r-svglite" ,r-svglite)))
+       ("r-scales" ,r-scales)))
     (home-page "http://ggplot2.org")
     (synopsis "An implementation of the grammar of graphics")
     (description
@@ -694,14 +742,14 @@ aesthetic attributes.")
 (define-public r-gdtools
   (package
     (name "r-gdtools")
-    (version "0.1.1")
+    (version "0.1.3")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "gdtools" version))
        (sha256
         (base32
-         "1l9d759x9s4ddz51sls8kcjps2i9kwfbc72dnagrdavh82h0al8n"))))
+         "1prh814lw3qkgnf0760cvpic1k68jhlkpcxlksv8chjkvsrnnf09"))))
     (build-system r-build-system)
     (native-inputs
      `(("r-rcpp" ,r-rcpp)
@@ -720,14 +768,14 @@ and to generate base64 encoded string from raster matrix.")
 (define-public r-svglite
   (package
     (name "r-svglite")
-    (version "1.1.0")
+    (version "1.2.0")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "svglite" version))
        (sha256
         (base32
-         "11ryicjglfi6jvkk4jgg5kra42qbs5z2zid7jjhlslpjcljfwc70"))))
+         "1s1gvmlmmna5y4jsn9h6438pg5b86fl4nwfvkgm6n4h6ljfgqyx3"))))
     (build-system r-build-system)
     (native-inputs  `(("r-rcpp" ,r-rcpp)))
     (propagated-inputs
@@ -803,13 +851,13 @@ R/DBMS implementations.")
 (define-public r-bh
   (package
     (name "r-bh")
-    (version "1.60.0-2")
+    (version "1.62.0-1")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "BH" version))
               (sha256
                (base32
-                "136497fng9bcvrf8favpj8inz96pxdwp1rrb2k00sxjxjbgawhg4"))))
+                "01vfdpfznd4ynqql33z238xr262mvy3i80lyi8l3a3p3hi0a262p"))))
     (build-system r-build-system)
     (home-page "https://github.com/eddelbuettel/bh")
     (synopsis "R package providing subset of Boost headers")
@@ -926,13 +974,13 @@ syntax that can be converted to XHTML or other formats.")
 (define-public r-yaml
   (package
     (name "r-yaml")
-    (version "2.1.13")
+    (version "2.1.14")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "yaml" version))
               (sha256
                (base32
-                "18kz5mfn7qpif5pn91w4vbrc5bkycsj85vwm5wxwzjlb02i9mxi6"))))
+                "0x88xicrf7vwp77xgan27mnpdljhpkn0pz5kphnwqi3ddy25k9a1"))))
     (build-system r-build-system)
     (home-page "https://cran.r-project.org/web/packages/yaml/")
     (synopsis "Methods to convert R data to YAML and back")
@@ -944,18 +992,17 @@ emitter (http://pyyaml.org/wiki/LibYAML) for R.")
 (define-public r-knitr
   (package
     (name "r-knitr")
-    (version "1.14")
+    (version "1.15.1")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "knitr" version))
               (sha256
                (base32
-                "1v0s0knb294p7a2xkwy35bhg0w8p3qcgyphd748sj86hh8a30vds"))))
+                "1pbxd3k7kv5sa1a5gxm0zc2bhjxdgx2nfch9xap5k85djmgsfqc1"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-evaluate" ,r-evaluate)
        ("r-digest" ,r-digest)
-       ("r-formatr" ,r-formatr)
        ("r-highr" ,r-highr)
        ("r-markdown" ,r-markdown)
        ("r-stringr" ,r-stringr)
@@ -1323,13 +1370,13 @@ and density estimation.")
 (define-public r-chron
   (package
     (name "r-chron")
-    (version "2.3-47")
+    (version "2.3-48")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "chron" version))
               (sha256
                (base32
-                "1xj50kk8b8mbjpszp8i0wbripb5a4b36jcscwlbyap8n4487g34s"))))
+                "1q1d0p2wq19w3mpfqnrg8nmspxqmhv4ap52r393s6y3abl36ccac"))))
     (build-system r-build-system)
     (home-page "http://cran.r-project.org/web/packages/chron")
     (synopsis "Chronological R objects which can handle dates and times")
@@ -1341,16 +1388,14 @@ times.")
 (define-public r-data-table
   (package
     (name "r-data-table")
-    (version "1.9.6")
+    (version "1.10.0")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "data.table" version))
               (sha256
                (base32
-                "0vi3zplpxqbg78z9ifjfs1kl2i8qhkqxr7l9ysp2663kq54w6x3g"))))
+                "1168arn4wjd1jj7kgr4sb8xd52hr8p8iqp85g5jwp3mkz4p76qfg"))))
     (build-system r-build-system)
-    (propagated-inputs
-     `(("r-chron" ,r-chron)))
     (home-page "https://github.com/Rdatatable/data.table/wiki")
     (synopsis "Enhanced version of data.frame R object")
     (description
@@ -1483,16 +1528,14 @@ inference for statistical models.")
 (define-public r-coda
   (package
     (name "r-coda")
-    (version "0.18-1")
+    (version "0.19-1")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "coda" version))
               (sha256
                (base32
-                "03sc780734zj2kqcm8lkyvf76fql0jbfhkblpn8l58zmb6cqi958"))))
+                "14a4a8df4ygj05h37chmdn8kzcqs07fpbflxfrq530563mrza7yl"))))
     (build-system r-build-system)
-    (propagated-inputs
-     `(("r-lattice" ,r-lattice)))
     (home-page "http://cran.r-project.org/web/packages/coda")
     (synopsis "This is a package for Output Analysis and Diagnostics for MCMC")
     (description "This package provides functions for summarizing and plotting
@@ -1504,14 +1547,14 @@ chain.")
 (define-public r-ade4
   (package
     (name "r-ade4")
-    (version "1.7-4")
+    (version "1.7-5")
     (source
       (origin
         (method url-fetch)
         (uri (cran-uri "ade4" version))
         (sha256
           (base32
-            "17sbicash7z4b63dlrbaf8xx2pbwh62vykzvhdjs43h8jkl881y7"))))
+            "0aaqbnydm5fb37nrvqj4bx6hxax7255j426cwh2lh88nyvznbq37"))))
     (build-system r-build-system)
     (home-page "http://pbil.univ-lyon1.fr/ADE-4")
     (synopsis "Multivariate data analysis and graphical display")
@@ -1776,14 +1819,14 @@ collation, and NAMESPACE files.")
 (define-public r-openssl
   (package
     (name "r-openssl")
-    (version "0.9.5")
+    (version "0.9.6")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "openssl" version))
        (sha256
         (base32
-         "1lal8mmcwjhhln10mfi96ipv3d364k0wiviiln220wvhddcpr9pp"))))
+         "0ffwllii8xl6sa2v66134g0fwaw1y3zn3mvaa4nrc120vv5d3mkd"))))
     (build-system r-build-system)
     (inputs
      `(("openssl" ,openssl)))
@@ -1833,13 +1876,13 @@ functions make it easy to control additional request components.")
 (define-public r-git2r
   (package
     (name "r-git2r")
-    (version "0.15.0")
+    (version "0.18.0")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "git2r" version))
               (sha256
                (base32
-                "1rpdf85wy9fp456ypvbhl3p9whkb7kgl0n7rkqxd2bhvyzkvjak8"))))
+                "0bgzdsdi9n6l8pchivs6a2g4ksa56qs8hygpyv2c0ndqmx4jxcwi"))))
     (build-system r-build-system)
     ;; This R package contains modified sources of libgit2.  This modified
     ;; version of libgit2 is built as the package is built.  Hence libgit2 is
@@ -1926,14 +1969,14 @@ were originally a part of the r-devtools package.")
 (define-public r-hms
   (package
     (name "r-hms")
-    (version "0.2")
+    (version "0.3")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "hms" version))
        (sha256
         (base32
-         "0ln1dc26mkl5pc26vvyf01d35x75q6cjaj39cccxp67chbwbdlds"))))
+         "127znf522r5mn3k6frhdd7pqh063bs3l85gn9h7cx50hpjf2as4k"))))
     (build-system r-build-system)
     (home-page "https://github.com/rstats-db/hms")
     (synopsis "Pretty time of day")
@@ -1970,13 +2013,13 @@ disk (or a connection).")
 (define-public r-plotrix
   (package
     (name "r-plotrix")
-    (version "3.6-3")
+    (version "3.6-4")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "plotrix" version))
               (sha256
                (base32
-                "0h97jra8zqssi9j4i0psa6c7ya49ya8jd2qc18lc61a4s2yn8w91"))))
+                "1wxzjnzvkl3aga51ad2xhv4s7v46kvnp4z0nz4cb9cn10057sfw8"))))
     (build-system r-build-system)
     (home-page "http://cran.r-project.org/web/packages/plotrix")
     (synopsis "Various plotting functions")
@@ -2049,13 +2092,13 @@ well as additional utilities such as panel and axis annotation functions.")
 (define-public r-rcpparmadillo
   (package
     (name "r-rcpparmadillo")
-    (version "0.7.500.0.0")
+    (version "0.7.600.1.0")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "RcppArmadillo" version))
               (sha256
                (base32
-                "06qb6877c5qd8lvnc4b27z8fwb5r5pyylkj0g6kj1rn868zkh5ps"))
+                "0k1wniip184j0ckcg9kcjy2q4mcfj5jpd1nkk4l0ab75ad8znywv"))
               (modules '((guix build utils)))
               ;; Remove bundled armadillo sources
               (snippet
@@ -2130,27 +2173,50 @@ ENVI binary files, fast calculation of AUC, LogitBoost classifier, base64
 encoder/decoder, round-off-error-free sum and cumsum, etc.")
     (license license:gpl3+)))
 
+(define-public r-rprojroot
+  (package
+    (name "r-rprojroot")
+    (version "1.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "rprojroot" version))
+       (sha256
+        (base32
+         "04ywfpar4d2hyi4rh4fbixrbzd665gpa2jhx67g8857cr70pp0nh"))))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-backports" ,r-backports)))
+    (home-page "https://github.com/krlmlr/rprojroot")
+    (synopsis "Finding files in project subdirectories")
+    (description
+     "This package helps accessing files relative to a project root.  It
+provides helpers for robust, reliable and flexible paths to files below a
+project root.  The root of a project is defined as a directory that matches a
+certain criterion, e.g., it contains a certain regular file.")
+    (license license:gpl3)))
+
 (define-public r-rmarkdown
   (package
     (name "r-rmarkdown")
-    (version "1.1")
+    (version "1.3")
     (source
       (origin
         (method url-fetch)
         (uri (cran-uri "rmarkdown" version))
         (sha256
           (base32
-            "1czvkaz1ji3jyj6qrvbswisqs9d05ljqc4vjkfdrf6hygix7azd0"))))
+            "1vvxyf3zhyxx6k697lia299456hryp8nh3zr0fc27f3107a8mcjf"))))
     (properties `((upstream-name . "rmarkdown")))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-catools" ,r-catools)
        ("r-evaluate" ,r-evaluate)
-       ("r-tibble" ,r-tibble)
        ("r-htmltools" ,r-htmltools)
        ("r-jsonlite" ,r-jsonlite)
        ("r-base64enc" ,r-base64enc)
        ("r-knitr" ,r-knitr)
+       ("r-rprojroot" ,r-rprojroot)
        ("r-yaml" ,r-yaml)
        ("ghc-pandoc" ,ghc-pandoc)))
     (home-page "http://rmarkdown.rstudio.com")
@@ -2203,20 +2269,44 @@ grobs.")
 and draw tables.")
     (license license:gpl2+)))
 
+(define-public r-plogr
+  (package
+    (name "r-plogr")
+    (version "0.1-1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "plogr" version))
+       (sha256
+        (base32
+         "13zliqlbkl8b04k9ga0sx5jsh7k867gracgl84l2a9kcqy9mqx92"))))
+    (build-system r-build-system)
+    (home-page "https://github.com/krlmlr/plogr")
+    (synopsis "R bindings for the plog C++ logging library")
+    (description
+     "This package provides the header files for a stripped-down version of
+the plog header-only C++ logging library, and a method to log to R's standard
+error stream.")
+    (license license:expat)))
+
 (define-public r-rsqlite
   (package
     (name "r-rsqlite")
-    (version "1.0.0")
+    (version "1.1-1")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "RSQLite" version))
               (sha256
                (base32
-                "08b1syv8z887gxiw8i09dpqh0zisfb6ihq6qqr01zipvkahzq34f"))))
+                "11vnzds5gidgakdmsbdn0bvnsz064ym1savwb7l6gc1bjn7xa2k4"))))
     (properties `((upstream-name . "RSQLite")))
     (build-system r-build-system)
     (propagated-inputs
-     `(("r-dbi" ,r-dbi)))
+     `(("r-dbi" ,r-dbi)
+       ("r-bh" ,r-bh)
+       ("r-memoise" ,r-memoise)
+       ("r-plogr" ,r-plogr)
+       ("r-rcpp" ,r-rcpp)))
     (home-page "https://github.com/rstats-db/RSQLite")
     (synopsis "SQLite interface for R")
     (description
@@ -2259,20 +2349,18 @@ ldap, and also supports cookies, redirects, authentication, etc.")
 (define-public r-xml
   (package
     (name "r-xml")
-    (version "3.98-1.4")
+    (version "3.98-1.5")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "XML" version))
               (sha256
                (base32
-                "09hiy5a875v2fhsgrsfymrwccn9249wnnsr6ck2slrig65svq2lw"))))
+                "0dcdj7ryn8lm7wmv4hqhh9jxa5k97l6ad8xyvb932yfkwj1g1byy"))))
     (properties
      `((upstream-name . "XML")))
     (build-system r-build-system)
     (inputs
      `(("libxml2" ,libxml2)))
-    (propagated-inputs
-     `(("r-rcurl" ,r-rcurl)))
     (home-page "http://www.omegahat.org/RSXML")
     (synopsis "Tools for parsing and generating XML within R")
     (description
@@ -2420,13 +2508,13 @@ worker processes and collect and return the results on the master.")
 (define-public r-sparsem
   (package
     (name "r-sparsem")
-    (version "1.72")
+    (version "1.74")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "SparseM" version))
               (sha256
                (base32
-                "0zpb1swn9xjkb22sky10ixff7vqfiz9m36nkbc1qqbm9frcldnka"))))
+                "1fpfhld887y5lyb8jydprmv5krqm1fk6n53z942b4g4z1v4g04j7"))))
     (properties
      `((upstream-name . "SparseM")))
     (inputs
@@ -2954,13 +3042,13 @@ maintenance for package developers.")
 (define-public r-r-utils
   (package
     (name "r-r-utils")
-    (version "2.4.0")
+    (version "2.5.0")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "R.utils" version))
               (sha256
                (base32
-                "0cn0wlmgwclmqak05825wrk9q894xa4qjqa7rn0i9p4ss7k6vifj"))))
+                "17q3w5dlly5xl2srrzsmf9s7vs5d576vqbcs6sr2p5x4qvqa1q8s"))))
     (properties `((upstream-name . "R.utils")))
     (build-system r-build-system)
     (propagated-inputs
@@ -3002,13 +3090,13 @@ persistent (on the file system).")
 (define-public r-r-rsp
   (package
     (name "r-r-rsp")
-    (version "0.30.0")
+    (version "0.40.0")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "R.rsp" version))
               (sha256
                (base32
-                "1ssykygqkxzx9qblxhavxlf2z6r5bhk0s47yw1dllfiyc8zy7jv2"))))
+                "1hz5fnxz30m3cc7x7ha1swx4pn8c2244z6ka6v9m3l5lpdgc1367"))))
     (properties `((upstream-name . "R.rsp")))
     (build-system r-build-system)
     (propagated-inputs
@@ -3204,13 +3292,13 @@ features present in other programming languages.")
 (define-public r-plotly
   (package
     (name "r-plotly")
-    (version "4.5.2")
+    (version "4.5.6")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "plotly" version))
               (sha256
                (base32
-                "08shs0qhy9js0fpj3d4rzfbwmw11ki3z5vg8jszfm6m69mfkgzw1"))))
+                "09yw977yxlcxv57kni3q899zrxyxa6pznr06cylr9lqkyr7llfhx"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-base64enc" ,r-base64enc)
@@ -3421,40 +3509,59 @@ definition of Surv objects, Kaplan-Meier and Aalen-Johansen (multi-state)
 curves, Cox models, and parametric accelerated failure time models.")
     (license license:lgpl2.0+)))
 
+(define-public r-base64
+  (package
+    (name "r-base64")
+    (version "2.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "base64" version))
+       (sha256
+        (base32
+         "1labh0ycdm2xcjssj8bhnyjvbk44mcdsi0rb2p8rfqa428mrq9cf"))))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-openssl" ,r-openssl)))
+    (home-page "http://cran.r-project.org/web/packages/base64")
+    (synopsis "Base64 encoder and decoder")
+    (description
+     "This package is a compatibility wrapper to replace the orphaned package
+by Romain Francois.  New applications should use the openssl or base64enc
+package instead.")
+    (license license:expat)))
+
 (define-public r-hmisc
   (package
     (name "r-hmisc")
-    (version "4.0-0")
+    (version "4.0-2")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "Hmisc" version))
        (sha256
         (base32
-         "0azxmg9h9c456biydc0wpi9xhljmd37m8bv0zaadbvc93g7x0l4b"))))
+         "1lg9k0kj803wsm3h0a991q9l2lrgsqryzfv2z79b88kjbfapqpqr"))))
     (properties `((upstream-name . "Hmisc")))
     (build-system r-build-system)
     (native-inputs
      `(("gfortran" ,gfortran)))
     (propagated-inputs
      `(("r-acepack" ,r-acepack)
-       ("r-cluster" ,r-cluster)
+       ("r-base64" ,r-base64)
+       ("r-base64enc" ,r-base64enc)
        ("r-data-table" ,r-data-table)
-       ("r-foreign" ,r-foreign)
        ("r-formula" ,r-formula)
        ("r-ggplot2" ,r-ggplot2)
        ("r-gridextra" ,r-gridextra)
        ("r-gtable" ,r-gtable)
-       ("r-lattice" ,r-lattice)
        ;; Hmisc needs survival >= 2.40.1, so it cannot use the survival
-       ;; package that comes with R 3.3.1.
+       ;; package that comes with R 3.3.2.
        ("r-survival" ,r-survival)
        ("r-latticeextra" ,r-latticeextra)
        ("r-htmltable" ,r-htmltable)
        ("r-htmltools" ,r-htmltools)
-       ("r-viridis" ,r-viridis)
-       ("r-nnet" ,r-nnet)
-       ("r-rpart" ,r-rpart)))
+       ("r-viridis" ,r-viridis)))
     (home-page "http://biostat.mc.vanderbilt.edu/Hmisc")
     (synopsis "Miscellaneous data analysis and graphics functions")
     (description
@@ -3530,14 +3637,14 @@ routines.")
 (define-public r-fastcluster
   (package
     (name "r-fastcluster")
-    (version "1.1.20")
+    (version "1.1.22")
     (source
      (origin
        (method url-fetch)
        (uri (cran-uri "fastcluster" version))
        (sha256
         (base32
-         "0rlbxhh894znf10x0xgkv9dzpibgq9jw5aqpgviccdnxc2c5hwid"))))
+         "006k9isra5biyavqwci61avladw19mhp6kmkjj3777rl1r4r8b9z"))))
     (build-system r-build-system)
     (home-page "http://danifold.net/fastcluster.html")
     (synopsis "Fast hierarchical clustering routines")
@@ -3730,16 +3837,14 @@ estimation) corresponding to the book: Wand, M.P.  and Jones, M.C. (1995)
 (define-public r-zoo
   (package
     (name "r-zoo")
-    (version "1.7-13")
+    (version "1.7-14")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "zoo" version))
               (sha256
                (base32
-                "0m67bnrg7r1jxvs9p7rpa430szp5qfp65r056yb8bivpc16jd98c"))))
+                "167m142rwwfy8b9hnfc3fi28dcsdjk61g1crqhll6sh5xmgnfn28"))))
     (build-system r-build-system)
-    (propagated-inputs
-     `(("r-lattice" ,r-lattice)))
     (home-page "http://zoo.R-Forge.R-project.org/")
     (synopsis "S3 infrastructure for regular and irregular time series")
     (description "This package contains an S3 class with methods for totally
@@ -3767,3 +3872,135 @@ with alternating row colors) in LaTeX and HTML formats easily from
 @code{glm}, @code{coxph}, @code{nls}, @code{fitdistr}, @code{mytable} and
 @code{cbind.mytable} objects.")
     (license license:gpl2+)))
+
+(define-public r-vipor
+  (package
+    (name "r-vipor")
+    (version "0.4.4")
+    (source (origin
+              (method url-fetch)
+              (uri (cran-uri "vipor" version))
+              (sha256
+               (base32
+                "0p1z9a3fazl78pj8a1i2n62v8hrs8cinq82j9wpawhmfkn3dggss"))))
+    (build-system r-build-system)
+    (home-page "http://cran.r-project.org/web/packages/vipor")
+    (synopsis "Plot categorical data using noise and density estimates")
+    (description
+     "This package provides tools to generate a violin point plot, a
+combination of a violin/histogram plot and a scatter plot by offsetting points
+within a category based on their density using quasirandom noise.")
+    (license license:gpl2+)))
+
+(define-public r-beeswarm
+  (package
+    (name "r-beeswarm")
+    (version "0.2.3")
+    (source (origin
+              (method url-fetch)
+              (uri (cran-uri "beeswarm" version))
+              (sha256
+               (base32
+                "0hy89bwv7jixlg91li1fywa77916am2whqp1m1fx1khd45g44581"))))
+    (build-system r-build-system)
+    (home-page "http://www.cbs.dtu.dk/~eklund/beeswarm/")
+    (synopsis "Implementation of bee swarm plots")
+    (description
+     "This package provides an implementation of bee swarm plots.  The bee
+swarm plot is a one-dimensional scatter plot like stripchart, but with
+closely-packed, non-overlapping points.")
+    (license license:artistic2.0)))
+
+(define-public r-sourcetools
+  (package
+    (name "r-sourcetools")
+    (version "0.1.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "sourcetools" version))
+       (sha256
+        (base32
+         "0jx6kslygfqaic3cmjwag3dy98q1a2dw20cz7z8agsknmmbk6dy2"))))
+    (build-system r-build-system)
+    (home-page "http://cran.r-project.org/web/packages/sourcetools")
+    (synopsis "Tools for reading, tokenizing and parsing R code")
+    (description
+     "The sourcetools package provides both an R and C++ interface for the
+tokenization of R code, and helpers for interacting with the tokenized
+representation of R code.")
+    (license license:expat)))
+
+(define-public r-ggbeeswarm
+  (package
+    (name "r-ggbeeswarm")
+    (version "0.5.3")
+    (source (origin
+              (method url-fetch)
+              (uri (cran-uri "ggbeeswarm" version))
+              (sha256
+               (base32
+                "1jgp55rvmzc4agcrlsjn8m5lk85di9c4wj94xzikqkql4lvq3qpd"))))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-beeswarm" ,r-beeswarm)
+       ("r-ggplot2" ,r-ggplot2)
+       ("r-vipor" ,r-vipor)))
+    (home-page "https://github.com/eclarke/ggbeeswarm")
+    (synopsis "Categorical scatter (violin point) plots")
+    (description
+     "This package provides two methods of plotting categorical scatter plots
+such that the arrangement of points within a category reflects the density of
+data at that region, and avoids over-plotting.")
+    (license license:gpl2+)))
+
+(define-public r-ggthemes
+  (package
+    (name "r-ggthemes")
+    (version "3.3.0")
+    (source (origin
+              (method url-fetch)
+              (uri (cran-uri "ggthemes" version))
+              (sha256
+               (base32
+                "1qdxg2siwsiq32fmgcxn4vihgxad9v8q0aqigl7a94c26bwxs7y2"))))
+    (build-system r-build-system)
+    (propagated-inputs
+     `(("r-assertthat" ,r-assertthat)
+       ("r-colorspace" ,r-colorspace)
+       ("r-ggplot2" ,r-ggplot2)
+       ("r-scales" ,r-scales)))
+    (home-page "https://cran.rstudio.com/web/packages/ggthemes")
+    (synopsis "Extra themes, scales and geoms for @code{ggplot2}")
+    (description "This package provides extra themes and scales for
+@code{ggplot2} that replicate the look of plots by Edward Tufte and
+Stephen Few in Fivethirtyeight, The Economist, Stata, Excel, and The
+Wall Street Journal, among others.  This package also provides
+@code{geoms} for Tufte's box plot and range frame.")
+    (license license:gpl2)))
+
+(define-public r-statmod
+  (package
+    (name "r-statmod")
+    (version "1.4.27")
+    (source (origin
+              (method url-fetch)
+              (uri (cran-uri "statmod" version))
+              (sha256
+               (base32
+                "14yilq9d3z20hig4rs8bjqyydw3dfx90mhmzvw9w8p16h0s595sn"))))
+    (build-system r-build-system)
+    (home-page "http://cran.r-project.org/web/packages/statmod")
+    (native-inputs
+     `(("gfortran" ,gfortran)))
+    (synopsis "Statistical modeling")
+    (description
+     "This package provides a collection of algorithms and functions to aid
+statistical modeling.  It includes growth curve comparisons, limiting dilution
+analysis (aka ELDA), mixed linear models, heteroscedastic regression,
+inverse-Gaussian probability calculations, Gauss quadrature and a secure
+convergence algorithm for nonlinear models.  It also includes advanced
+generalized linear model functions that implement secure convergence,
+dispersion modeling and Tweedie power-law families.")
+    ;; Statmod is distributed under either license
+    (license (list license:gpl2 license:gpl3))))
diff --git a/gnu/packages/suckless.scm b/gnu/packages/suckless.scm
index 820d550d6e..a00420312d 100644
--- a/gnu/packages/suckless.scm
+++ b/gnu/packages/suckless.scm
@@ -6,6 +6,7 @@
 ;;; Copyright © 2015 Dmitry Bogatov <KAction@gnu.org>
 ;;; Copyright © 2015 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2016 Eric Bavier <bavier@member.fsf.org>
+;;; Copyright © 2017 Alex Griffin <a@ajgrf.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -40,16 +41,19 @@
 (define-public dwm
   (package
     (name "dwm")
-    (version "6.0")
+    (version "6.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "http://dl.suckless.org/dwm/dwm-"
                                  version ".tar.gz"))
              (sha256
-              (base32 "0mpbivy9j80l1jqq4bd4g4z8s5c54fxrjj44avmfwncjwqylifdj"))))
+              (base32 "1zkmwb6df6m254shx06ly90c0q4jl70skk1pvkixpb7hcxhwbxn2"))))
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f
+       #:make-flags (list (string-append "FREETYPEINC="
+                                         (assoc-ref %build-inputs "freetype")
+                                         "/include/freetype2"))
        #:phases
        (alist-replace
         'configure
@@ -65,7 +69,9 @@
                      (string-append "DESTDIR=" out) "PREFIX="))))
          %standard-phases))))
     (inputs
-     `(("libx11" ,libx11)
+     `(("freetype" ,freetype)
+       ("libx11" ,libx11)
+       ("libxft" ,libxft)
        ("libxinerama" ,libxinerama)))
     (home-page "http://dwm.suckless.org/")
     (synopsis "Dynamic window manager")
@@ -78,23 +84,28 @@ optimising the environment for the application in use and the task performed.")
 (define-public dmenu
   (package
     (name "dmenu")
-    (version "4.5")
+    (version "4.6")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://dl.suckless.org/tools/dmenu-"
                                   version ".tar.gz"))
               (sha256
                (base32
-                "0l58jpxrr80fmyw5pgw5alm5qry49aw6y049745wl991v2cdcb08"))))
+                "1cwnvamqqlgczvd5dv5rsgqbhv8kp0ddjnhmavb3q732i8028yja"))))
     (build-system gnu-build-system)
     (arguments
      '(#:tests? #f ; no tests
        #:make-flags (list "CC=gcc"
-                          (string-append "PREFIX=" %output))
+                          (string-append "PREFIX=" %output)
+                          (string-append "FREETYPEINC="
+                                         (assoc-ref %build-inputs "freetype")
+                                         "/include/freetype2"))
        #:phases
        (alist-delete 'configure %standard-phases)))
     (inputs
-     `(("libx11" ,libx11)
+     `(("freetype" ,freetype)
+       ("libxft" ,libxft)
+       ("libx11" ,libx11)
        ("libxinerama" ,libxinerama)))
     (home-page "http://tools.suckless.org/dmenu/")
     (synopsis "Dynamic menu")
@@ -106,15 +117,14 @@ numbers of user-defined menu items efficiently.")
 (define-public slock
   (package
     (name "slock")
-    (version "1.3")
+    (version "1.4")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://dl.suckless.org/tools/slock-"
                                   version ".tar.gz"))
-              (patches (search-patches "slock-CVE-2016-6866.patch"))
               (sha256
                (base32
-                "065xa9hl7zn0lv2f7yjxphqsa35rg6dn9hv10gys0sh4ljpa7d5s"))))
+                "0sif752303dg33f14k6pgwq2jp1hjyhqv6x4sy3sj281qvdljf5m"))))
     (build-system gnu-build-system)
     (arguments
      '(#:tests? #f ; no tests
diff --git a/gnu/packages/sync.scm b/gnu/packages/sync.scm
index a4fdfd303e..429fe196de 100644
--- a/gnu/packages/sync.scm
+++ b/gnu/packages/sync.scm
@@ -107,7 +107,7 @@ silently and reliably flow across to every other.")
 (define-public qsyncthingtray
   (package
     (name "qsyncthingtray")
-    (version "0.5.6")
+    (version "0.5.7")
     (source
       (origin
         (method url-fetch)
@@ -117,7 +117,7 @@ silently and reliably flow across to every other.")
         (file-name (string-append name "-" version ".tar.gz"))
         (sha256
          (base32
-          "0py3593pv3iz0vds82wzbjy1ykc96qaaji1ldd9dlr50kb1840c3"))))
+          "1qzlxgq36sb1dk621nkbjw9k6y3css6q3z8xzx6nv7f327vanvp6"))))
     (build-system cmake-build-system)
     (arguments
      `(#:configure-flags '("-DQST_BUILD_WEBKIT=1")
diff --git a/gnu/packages/telephony.scm b/gnu/packages/telephony.scm
index 62efcfd5c2..2adf08ce97 100644
--- a/gnu/packages/telephony.scm
+++ b/gnu/packages/telephony.scm
@@ -318,14 +318,14 @@ address of one of the participants.")
 (define-public mumble
   (package
     (name "mumble")
-    (version "1.2.17")
+    (version "1.2.18")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://mumble.info/snapshot/"
                                   name "-" version ".tar.gz"))
               (sha256
                (base32
-                "176br3b0pv5sz3zvgzsz9rxr3n79irlm902h7n1wh4f6vbph2dhw"))
+                "1ajmdzf2jqbnm4hm53wv8bzazffflzs3z8hhbl70kfci4v4arxz0"))
               (modules '((guix build utils)))
               (snippet
                `(begin
diff --git a/gnu/packages/terminals.scm b/gnu/packages/terminals.scm
index 79da6c7127..8e648c4031 100644
--- a/gnu/packages/terminals.scm
+++ b/gnu/packages/terminals.scm
@@ -4,7 +4,8 @@
 ;;; Copyright © 2016 Alex Griffin <a@ajgrf.com>
 ;;; Copyright © 2016 David Craven <david@craven.ch>
 ;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2016 José Miguel Sánchez García <jmi2k@openmailbox.org>
+;;; Copyright © 2016, 2017 José Miguel Sánchez García <jmi2k@openmailbox.org>
+;;; Copyright © 2017 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -269,13 +270,13 @@ multi-seat support, a replacement for @command{mingetty}, and more.")
 (define-public libtermkey
   (package
     (name "libtermkey")
-    (version "0.18")
+    (version "0.19")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://www.leonerd.org.uk/code/"
                                   name "/" name "-" version ".tar.gz"))
               (sha256
-               (base32 "09ir16kaarv55mnc4jn2sqnjjhzpb1aha51wpd9ayif887g4d5r3"))))
+               (base32 "1ds8gdr8p2dfr970z8kxgfz6x7m1jxmmfrb2aafab3wcni6al1f5"))))
     (build-system gnu-build-system)
     (arguments
      '(#:make-flags (list
@@ -329,3 +330,38 @@ configuration, testing, and debugging tool.  It has also serves well
 as a low-tech serial communications program to allow access to all
 types of devices that provide serial consoles.")
     (license license:gpl2+)))
+
+(define-public beep
+  (package
+    (name "beep")
+    (version "1.3")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://www.johnath.com/" name "/"
+                                  name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "0bgch6jq5cahakk3kbr9549iysf2dik09afixxy5brbxk1xfzb2r"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f                      ; no tests.
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure)
+         (add-after 'unpack 'patch-makefile
+           (lambda* (#:key outputs #:allow-other-keys)
+             (substitute* "Makefile" (("/usr") (assoc-ref outputs "out")))
+             #t))
+         (add-before 'install 'create-output-directories
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((out (assoc-ref %outputs "out")))
+               (mkdir-p (string-append out "/bin"))
+               (mkdir-p (string-append out "/man/man1"))))))))
+    (synopsis "Linux command-line utility to control the PC speaker")
+    (description "beep allows the user to control the PC speaker with precision,
+allowing different sounds to indicate different events.  While it can be run
+quite happily on the command line, its intended place of residence is within
+scripts, notifying the user when something interesting occurs.  Of course, it
+has no notion of what's interesing, but it's very good at that notifying part.")
+    (home-page "http://www.johnath.com/beep")
+    (license license:gpl2+)))
diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
index f5ffe42b91..90878da933 100644
--- a/gnu/packages/tls.scm
+++ b/gnu/packages/tls.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2014 Ian Denhardt <ian@zenhack.net>
 ;;; Copyright © 2013, 2015 Andreas Enge <andreas@enge.fr>
@@ -139,6 +139,7 @@ living in the same process.")
   (package
     (name "gnutls")
     (version "3.5.4")
+    (replacement gnutls-3.5.8)
     (source (origin
              (method url-fetch)
              (uri
@@ -211,6 +212,20 @@ required structures.")
     (properties '((ftp-server . "ftp.gnutls.org")
                   (ftp-directory . "/gcrypt/gnutls")))))
 
+(define gnutls-3.5.8                              ;fixes GNUTLS-SA-2017-{1,2}
+  (package
+    (inherit gnutls)
+    (version "3.5.8")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://gnupg/gnutls/v"
+                                  (version-major+minor version)
+                                  "/gnutls-" version ".tar.xz"))
+              (sha256
+               (base32
+                "1zyl2z63s68hx1dpxqx0lykmlf3rwrzlrf44sq3h7dvjmr1z55qf"))))
+    (replacement #f)))
+
 (define-public openssl
   (package
    (name "openssl")
@@ -717,6 +732,13 @@ number generator")
              (string-append "PREFIX=" (assoc-ref %outputs "out")))
        #:phases
        (modify-phases %standard-phases
+         (add-after 'unpack 'patch-paths
+           (lambda* (#:key inputs #:allow-other-keys)
+             (let ((pem (string-append (assoc-ref inputs "libressl")
+                                       "/etc/ssl/cert.pem")))
+               (substitute* "http.c"
+                 (("/etc/ssl/cert.pem") pem))
+               #t)))
          (delete 'configure)))) ; no './configure' script
     (native-inputs
      `(("pkg-config" ,pkg-config)))
diff --git a/gnu/packages/tor.scm b/gnu/packages/tor.scm
index 92644fed2e..6f26f404be 100644
--- a/gnu/packages/tor.scm
+++ b/gnu/packages/tor.scm
@@ -39,14 +39,14 @@
 (define-public tor
   (package
     (name "tor")
-    (version "0.2.8.11")
+    (version "0.2.9.8")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://dist.torproject.org/tor-"
                                  version ".tar.gz"))
              (sha256
               (base32
-               "1cvaviamvmajzpdgjn2k1rk3g9ywl1c4ygs5157gvnkyl6zs1pks"))))
+               "0sklgmx4nikcfhqd606kvpwy1l8840w24ikli1xjjx25739k7pgv"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("python" ,python-2)))  ; for tests
@@ -54,9 +54,6 @@
      `(("zlib" ,zlib)
        ("openssl" ,openssl)
        ("libevent" ,libevent)))
-
-    ;; TODO: Recommend `torsocks' since `torify' needs it.
-
     (home-page "https://www.torproject.org/")
     (synopsis "Anonymous network router to improve privacy on the Internet")
     (description
@@ -66,7 +63,12 @@ somebody watching your Internet connection from learning what sites you
 visit, and it prevents the sites you visit from learning your physical
 location.  Tor works with many of your existing applications, including
 web browsers, instant messaging clients, remote login, and other
-applications based on the TCP protocol.")
+applications based on the TCP protocol.
+
+To @code{torify} applications (to take measures to ensure that an application,
+which has not been designed for use with Tor such as ssh, will use only Tor for
+internet connectivity, and also ensures that there are no leaks from DNS, UDP or
+the application layer) you need to install @code{torsocks}.")
     (license bsd-3)))
 
 (define-public torsocks
diff --git a/gnu/packages/unrtf.scm b/gnu/packages/unrtf.scm
index 162dec7525..e11c9445ca 100644
--- a/gnu/packages/unrtf.scm
+++ b/gnu/packages/unrtf.scm
@@ -23,6 +23,7 @@
   #:use-module (guix download)
   #:use-module (guix build-system gnu)
   #:use-module (guix gexp)
+  #:use-module (gnu packages)
   #:use-module (gnu packages autotools)
   #:use-module (gnu packages m4)
   #:use-module (gnu packages base))
@@ -35,6 +36,7 @@
              (method url-fetch)
              (uri (string-append "mirror://gnu/unrtf/unrtf-"
                                  version ".tar.gz"))
+             (patches (search-patches "unrtf-CVE-2016-10091.patch"))
              (sha256
               (base32
                "1pcdzf2h1prn393dkvg93v80vh38q0v817xnbwrlwxbdz4k7i8r2"))
diff --git a/gnu/packages/upnp.scm b/gnu/packages/upnp.scm
index f680a52881..9be9741202 100644
--- a/gnu/packages/upnp.scm
+++ b/gnu/packages/upnp.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014 Sree Harsha Totakura <sreeharsha@totakura.in>
-;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2016, 2017 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -28,15 +28,14 @@
 (define-public miniupnpc
   (package
     (name "miniupnpc")
-    (version "2.0")
+    (version "2.0.20161216")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append
-             "http://miniupnp.tuxfamily.org/files/miniupnpc-"
-             version ".tar.gz"))
+       (uri (string-append "https://miniupnp.tuxfamily.org/files/"
+                           name "-" version ".tar.gz"))
        (sha256
-        (base32 "0fzrc6fs8vzb2yvk01bd3q5jkarysl7gjlyaqncy3yvfk2wcwd6l"))))
+        (base32 "0gpxva9jkjvqwawff5y51r6bmsmdhixl3i5bmzlqsqpwsq449q81"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("python" ,python-2)))
diff --git a/gnu/packages/version-control.scm b/gnu/packages/version-control.scm
index cc958281c7..8833b17e42 100644
--- a/gnu/packages/version-control.scm
+++ b/gnu/packages/version-control.scm
@@ -1,7 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
 ;;; Copyright © 2013 Cyril Roelandt <tipecaml@gmail.com>
-;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2013, 2014 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2015, 2016 Mathieu Lirzin <mthl@gnu.org>
 ;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org>
@@ -327,7 +327,7 @@ everything from small to very large projects with speed and efficiency.")
 (define-public libgit2
   (package
     (name "libgit2")
-    (version "0.24.3")
+    (version "0.25.1")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/libgit2/libgit2/"
@@ -335,7 +335,7 @@ everything from small to very large projects with speed and efficiency.")
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "0m37b2jq8g70bmxlgrhbj4p23c893vxwmlmw1v5ywfxz3njyc90a"))))
+                "1cdwcw38frc1wf28x5ppddazv9hywc718j92f3xa3ybzzycyds3s"))))
     (build-system cmake-build-system)
     (arguments
      `(#:phases
diff --git a/gnu/packages/video.scm b/gnu/packages/video.scm
index 446de429f3..a5b35479a0 100644
--- a/gnu/packages/video.scm
+++ b/gnu/packages/video.scm
@@ -3,11 +3,11 @@
 ;;; Copyright © 2014, 2015, 2016 David Thompson <davet@gnu.org>
 ;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
-;;; Copyright © 2015, 2016 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2015, 2016, 2017 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2015 Andy Patterson <ajpatter@uwaterloo.ca>
 ;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2015, 2016 Alex Vong <alexvong1995@gmail.com>
-;;; Copyright © 2016 Alex Griffin <a@ajgrf.com>
+;;; Copyright © 2016, 2017 Alex Griffin <a@ajgrf.com>
 ;;; Copyright © 2016 Kei Kebreau <kei@openmailbox.org>
 ;;; Copyright © 2016 Dmitry Nikolaev <cameltheman@gmail.com>
 ;;; Copyright © 2016 Andy Patterson <ajpatter@uwaterloo.ca>
@@ -610,14 +610,14 @@ audio/video codec library.")
 (define-public ffmpeg-2.8
   (package
     (inherit ffmpeg)
-    (version "2.8.9")
+    (version "2.8.10")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://ffmpeg.org/releases/ffmpeg-"
                                  version ".tar.xz"))
              (sha256
               (base32
-               "1s3011q7sxyb55n3r8aiv7xh53bwxjdxa83s2ilqhq5rygrrgg8i"))))
+               "1ca84kc715xm7wmbnj1z4jfhxj8c7rxhy4cqwrd8cnih0l196j1c"))))
     (arguments
      (substitute-keyword-arguments (package-arguments ffmpeg)
        ((#:configure-flags flags)
@@ -834,7 +834,7 @@ SVCD, DVD, 3ivx, DivX 3/4/5, WMV and H.264 movies.")
 (define-public mpv
   (package
     (name "mpv")
-    (version "0.22.0")
+    (version "0.23.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -842,11 +842,11 @@ SVCD, DVD, 3ivx, DivX 3/4/5, WMV and H.264 movies.")
                     ".tar.gz"))
               (sha256
                (base32
-                "1xl2a0nfbkcq00f41m50fmfz9hl7hzpk7cq7j38r38rp1s7sryf0"))
+                "1629v5l0rmphxra7chmfm7bnn59zc1mp529b9m2zqzaqf1czxvla"))
               (file-name (string-append name "-" version ".tar.gz"))))
     (build-system waf-build-system)
     (native-inputs
-     `(("perl" ,perl)
+     `(("perl" ,perl) ; for zsh completion file
        ("pkg-config" ,pkg-config)
        ("python-docutils" ,python-docutils)))
     ;; Missing features: libguess, Wayland, V4L2
@@ -904,7 +904,7 @@ projects while introducing many more.")
 (define-public gnome-mpv
   (package
     (name "gnome-mpv")
-    (version "0.10")
+    (version "0.11")
     (source
      (origin
        (method url-fetch)
@@ -913,7 +913,7 @@ projects while introducing many more.")
                            ".tar.xz"))
        (sha256
         (base32
-         "10zizf926a82c753a80bi49rb5c4yqjyd6zin4xgmggspfxngncj"))))
+         "1hn3mpsxbrwf2m0nz4vzji4i6i896y8kqjb9kijqpk04cnrs3fgz"))))
     (native-inputs
      `(("intltool" ,intltool)
        ("pkg-config" ,pkg-config)))
@@ -970,15 +970,15 @@ access to mpv's powerful playback capabilities.")
 (define-public youtube-dl
   (package
     (name "youtube-dl")
-    (version "2016.10.16")
+    (version "2017.01.10")
     (source (origin
               (method url-fetch)
-              (uri (string-append "https://youtube-dl.org/downloads/"
+              (uri (string-append "https://yt-dl.org/downloads/"
                                   version "/youtube-dl-"
                                   version ".tar.gz"))
               (sha256
                (base32
-                "0q6cxbp1xx8xmwn3xbxh6gcbgqjxy3slzfca4dbkk9xl2yy9rwqg"))))
+                "0clr6vj9lg96fffc9xv2apr7an6lljnli1b8clfj4dap1i0d34v4"))))
     (build-system python-build-system)
     (arguments
      ;; The problem here is that the directory for the man page and completion
@@ -1006,7 +1006,7 @@ access to mpv's powerful playback capabilities.")
     (description
      "Youtube-dl is a small command-line program to download videos from
 YouTube.com and a few more sites.")
-    (home-page "https://youtube-dl.org")
+    (home-page "https://yt-dl.org")
     (license license:public-domain)))
 
 (define-public libbluray
@@ -1399,7 +1399,7 @@ from various services and pipes them into a video playing application.")
 (define-public mlt
   (package
     (name "mlt")
-    (version "6.2.0")
+    (version "6.4.1")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/mltframework/mlt/"
@@ -1407,7 +1407,7 @@ from various services and pipes them into a video playing application.")
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "1zwzfgxrcbwkxnkiwv0a1rzxdnnaly90yyarl9wdw84nx11ffbnx"))))
+                "10m3ry0b2pvqx3bk34qh5dq337nn8pkc2gzfyhsj4nv9abskln47"))))
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f ; no tests
diff --git a/gnu/packages/vim.scm b/gnu/packages/vim.scm
index 0c359967d9..7275b980ab 100644
--- a/gnu/packages/vim.scm
+++ b/gnu/packages/vim.scm
@@ -49,7 +49,7 @@
 (define-public vim
   (package
     (name "vim")
-    (version "8.0.0133")
+    (version "8.0.0147")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://github.com/vim/vim/archive/v"
@@ -57,7 +57,7 @@
              (file-name (string-append name "-" version ".tar.gz"))
              (sha256
               (base32
-               "1965lb3sq378kz2fxb5swi442bdvzj416znvslb7saapqx3pjj51"))))
+               "0rjq77n2gj3bb22dhawmbwkknii14gy7akplrplgxl1l789isfpq"))))
     (build-system gnu-build-system)
     (arguments
      `(#:test-target "test"
diff --git a/gnu/packages/vpn.scm b/gnu/packages/vpn.scm
index 9a08ad4f41..6b13cf169b 100644
--- a/gnu/packages/vpn.scm
+++ b/gnu/packages/vpn.scm
@@ -3,7 +3,7 @@
 ;;; Copyright © 2013, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2015 Jeff Mickey <j@codemac.net>
-;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016, 2017 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -119,13 +119,13 @@ Only \"Universal TUN/TAP device driver support\" is needed in the kernel.")
 (define-public openconnect
   (package
    (name "openconnect")
-   (version "7.07")
+   (version "7.08")
    (source (origin
             (method url-fetch)
             (uri (string-append "ftp://ftp.infradead.org/pub/openconnect/"
                                 "openconnect-" version ".tar.gz"))
             (sha256 (base32
-                     "0rl33f1g42hxzqfv2a33gls8cb77q4w432xkims1dnfwhzagrv7k"))))
+                     "00wacb79l2c45f94gxs63b9z25wlciarasvjrb8jb8566wgyqi0w"))))
    (build-system gnu-build-system)
    (inputs
     `(("libxml2" ,libxml2)
@@ -152,7 +152,7 @@ and probably others.")
 (define-public openvpn
   (package
     (name "openvpn")
-    (version "2.3.9")
+    (version "2.3.14")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -160,7 +160,7 @@ and probably others.")
                     version ".tar.xz"))
               (sha256
                (base32
-                "1hfwmdsp7s34qx34qgwrpp89h30744lbsks6y619cdh27bpnpwaj"))))
+                "167frlmmg2raffn9h7ww3agdwgfdl0wa5wm9fsgl0i6mz3md187k"))))
     (build-system gnu-build-system)
     (arguments
      '(#:configure-flags '("--enable-iproute2=yes")))
diff --git a/gnu/packages/web.scm b/gnu/packages/web.scm
index 5454f57dbe..5901e0ef6d 100644
--- a/gnu/packages/web.scm
+++ b/gnu/packages/web.scm
@@ -16,6 +16,7 @@
 ;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is>
 ;;; Copyright © 2016 Arun Isaac <arunisaac@systemreboot.net>
 ;;; Copyright © 2016 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2016 Bake Timmons <b3timmons@speedymail.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -62,6 +63,7 @@
   #:use-module (gnu packages gettext)
   #:use-module (gnu packages glib)
   #:use-module (gnu packages gnome)
+  #:use-module (gnu packages gnupg)
   #:use-module (gnu packages gperf)
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages icu4c)
@@ -525,7 +527,7 @@ for efficient socket-like bidirectional reliable communication channels.")
 (define-public libpsl
   (package
     (name "libpsl")
-    (version "0.16.0")
+    (version "0.16.1")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/rockdaboot/libpsl/"
@@ -533,7 +535,7 @@ for efficient socket-like bidirectional reliable communication channels.")
                                   "/libpsl-" version ".tar.gz"))
               (sha256
                (base32
-                "1ghhwrn3y047ngs6d59z6ssnx6f7zr3fjvxji17ln9r10sj4njvi"))))
+                "1srrd0iyz9p5xgl8q0hrzqg7p8cl9ar0cdb8f54hls4kllf3f80l"))))
     (build-system gnu-build-system)
     (inputs
      `(("icu4c" ,icu4c)
@@ -668,6 +670,34 @@ server).  It was primarily designed to be used by one person or a small group
 of people.")
     (license l:expat)))
 
+(define-public wwwoffle
+  (package
+    (name "wwwoffle")
+    (version "2.9j")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://www.gedanken.org.uk/software/"
+                                  "wwwoffle/download/wwwoffle-"
+                                  version ".tgz"))
+              (sha256
+               (base32
+                "1ihil1xq9dp21hf108khxbw6f3baq0w5c0j3af038y6lkmad4vdi"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:configure-flags '("--with-gnutls")
+       #:tests? #f))                         ; no test target
+    (native-inputs `(("flex" ,flex)))
+    (inputs `(("gnutls" ,gnutls)
+              ("libcrypt", libgcrypt)))
+    (home-page "https://www.gedanken.org.uk/software/wwwoffle/")
+    (synopsis "Caching web proxy optimized for intermittent internet links")
+    (description "WWWOFFLE is a proxy web server that is especially good for
+intermittent internet links.  It can cache HTTP, HTTPS, FTP, and finger
+protocols, and supports browsing and requesting pages while offline, indexing,
+modifying pages and incoming and outgoing headers, monitoring pages for
+changes, and much more.")
+    (license l:gpl2+)))
+
 (define-public libyaml
   (package
     (name "libyaml")
@@ -3276,13 +3306,13 @@ particularly easy to create complete web applications using httpuv alone.")
 (define-public r-jsonlite
   (package
     (name "r-jsonlite")
-    (version "1.1")
+    (version "1.2")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "jsonlite" version))
               (sha256
                (base32
-                "0mrfzh0mxxrhqdmxai434wvyd7skkw28vxr7pyls19yrg941g6r3"))))
+                "0k966hzp3qnwck7fgd76w49zrz39s7pqyywws17bhbcd8rh4csyb"))))
     (build-system r-build-system)
     (home-page "http://arxiv.org/abs/1403.2805")
     (synopsis "Robust, high performance JSON parser and generator for R")
@@ -3300,13 +3330,13 @@ in systems and applications.")
 (define-public r-servr
   (package
     (name "r-servr")
-    (version "0.4")
+    (version "0.5")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "servr" version))
               (sha256
                (base32
-                "1fkqf5ynd1g0932qwv5nr70bw42m8vxpc9rhi0qxmdamwqcw8qjn"))))
+                "1ixcl9xjc1k9zvl6v6bsw4kpramr1h53b4s46qg8kahkqy6kqd8a"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-httpuv" ,r-httpuv)
@@ -3359,13 +3389,13 @@ directory.")
 (define-public r-htmlwidgets
   (package
     (name "r-htmlwidgets")
-    (version "0.7")
+    (version "0.8")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "htmlwidgets" version))
               (sha256
                (base32
-                "1xh8aiaci5hi3r67ym7r37hm89m9vzywk292avnmaj125kq7w1d0"))))
+                "1df3pwl34rvdbr9sgr5h27q9bmqpckvpwq4frl3d1v614y3vfclj"))))
     (build-system r-build-system)
     (propagated-inputs
      `(("r-htmltools" ,r-htmltools)
@@ -3411,13 +3441,13 @@ LaTeX.")
 (define-public r-curl
   (package
     (name "r-curl")
-    (version "2.2")
+    (version "2.3")
     (source (origin
               (method url-fetch)
               (uri (cran-uri "curl" version))
               (sha256
                (base32
-                "0hyvyjzf5ja7kfhzmlfgp86hg1lxrriiwbnr6pxabwwslswj3cmj"))))
+                "0gbw5l0wnsw26fbr08gj9vgxrzxg8axvqxfshmd8g9khpgbdl0gr"))))
     (build-system r-build-system)
     (arguments
      `(#:phases
diff --git a/gnu/packages/wm.scm b/gnu/packages/wm.scm
index 46a8c3f873..6713560c5f 100644
--- a/gnu/packages/wm.scm
+++ b/gnu/packages/wm.scm
@@ -9,7 +9,7 @@
 ;;; Copyright © 2016 Al McElrath <hello@yrns.org>
 ;;; Copyright © 2016 Carlo Zancanaro <carlo@zancanaro.id.au>
 ;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is>
+;;; Copyright © 2016 ng0 <ng0@libertad.pw>
 ;;; Copyright © 2016 doncatnip <gnopap@gmail.com>
 ;;; Copyright © 2016 Ivan Vilata i Balaguer <ivan@selidor.net>
 ;;;
@@ -497,15 +497,15 @@ experience.")
 (define-public awesome
   (package
     (name "awesome")
-    (version "3.5.9")
+    (version "4.0")
     (source
      (origin (method url-fetch)
              (uri (string-append
-                   "https://awesome.naquadah.org/download/awesome-"
-                   version ".tar.xz"))
+                   "https://github.com/awesomeWM/awesome-releases/raw/"
+                   "master/awesome-" version ".tar.xz"))
              (sha256
               (base32
-               "0kynair1ykr74b39a4gcm2y24viial64337cf26nhlc7azjbby67"))
+               "0czkcz67sab63gf5m2p2pgg05yinjx60hfb9rfyzdkkg28q9f02w"))
              (modules '((guix build utils)
                         (srfi srfi-19)))
              (snippet
@@ -538,6 +538,7 @@ experience.")
               ("libxcb" ,libxcb)
               ("libxcursor" ,libxcursor)
               ("libxdg-basedir" ,libxdg-basedir)
+              ("libxkbcommon" ,libxkbcommon)
               ("lua" ,lua)
               ("lua-lgi",lua-lgi)
               ("pango" ,pango)
@@ -547,6 +548,7 @@ experience.")
               ("xcb-util-image" ,xcb-util-image)
               ("xcb-util-keysyms" ,xcb-util-keysyms)
               ("xcb-util-renderutil" ,xcb-util-renderutil)
+              ("xcb-util-xrm" ,xcb-util-xrm)
               ("xcb-util-wm" ,xcb-util-wm)))
     (arguments
      `(;; Let compression happen in our 'compress-documentation' phase so that
diff --git a/gnu/packages/xdisorg.scm b/gnu/packages/xdisorg.scm
index 4633b5159e..21d396972a 100644
--- a/gnu/packages/xdisorg.scm
+++ b/gnu/packages/xdisorg.scm
@@ -601,7 +601,7 @@ X Window System.")
        ("libxt" ,libxt)
        ("libxext" ,libxext)
        ("libxinerama" ,libxinerama)))
-    (home-page "http://sourceforge.net/projects/libxosd/")
+    (home-page "https://sourceforge.net/projects/libxosd/")
     (synopsis "X On Screen Display")
     (description
      "XOSD provides a C library and a simple utility (osd_cat) for displaying
@@ -716,7 +716,7 @@ within a single process.")
 (define-public xcape
   (package
     (name "xcape")
-    (version "1.1")
+    (version "1.2")
     (source
       (origin
         (method url-fetch)
@@ -725,7 +725,7 @@ within a single process.")
         (file-name (string-append name "-" version ".tar.gz"))
         (sha256
           (base32
-            "0jkdiaxc6sryrbibdgi2y1c48n4l9xyazhxr16l6h4ibddx95bk9"))))
+            "0898zc3vwxia00h9kfknpf7jygxgwggrx8v5mxc31w4lzn2dhzm2"))))
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f ; no check target
@@ -940,7 +940,7 @@ connectivity of the X server running on a particular @code{DISPLAY}.")
 (define-public rofi
   (package
     (name "rofi")
-    (version "1.2.0")
+    (version "1.3.1")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/DaveDavenport/rofi/"
@@ -948,7 +948,7 @@ connectivity of the X server running on a particular @code{DISPLAY}.")
                                   version "/rofi-" version ".tar.xz"))
               (sha256
                (base32
-                "0xxx0xpxhrhlhi2axq9867zqrhwqavc1qrr833k1xr0pvm5m0aqc"))))
+                "1s47biv6d68nblpz6d3aklsar1xxxcilzr4y77v3hz2w1wbz2b5m"))))
     (build-system gnu-build-system)
     (inputs
      `(("pango" ,pango)
@@ -1027,7 +1027,7 @@ actions, a built-in clock, a battery monitor and a system tray.")
 (define-public xcb-util-xrm
   (package
     (name "xcb-util-xrm")
-    (version "1.0")
+    (version "1.2")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1035,7 +1035,7 @@ actions, a built-in clock, a battery monitor and a system tray.")
                     "/download/v" version "/xcb-util-xrm-" version ".tar.bz2"))
               (sha256
                (base32
-                "1h5vxwpd37dqfw9yj1l4zd9c5dj30r3g0szgysr6kd7xrqgaq04l"))
+                "0vbqhag51i0njc8d5fc8c6aa12496cwrc3s6s7sa5kfc17cwhppp"))
               (modules '((guix build utils)))
               (snippet
                ;; Drop bundled m4.
diff --git a/gnu/packages/xfig.scm b/gnu/packages/xfig.scm
index 6436e52ad6..2e65000eb7 100644
--- a/gnu/packages/xfig.scm
+++ b/gnu/packages/xfig.scm
@@ -34,12 +34,12 @@
     (version "3.2.5c")
     (source
      (origin
-      (method url-fetch)
-      (uri (string-append "mirror://sourceforge/mcj/mcj-source/xfig."
-                          version ".full.tar.gz"))
-      (sha256
-       (base32
-        "1yd1jclvw5w3ja4jjzr1ysbn8iklh88wq84jn9d1gavrbfbqyqpa"))))
+       (method url-fetch)
+       (uri (string-append "mirror://sourceforge/mcj/mcj-source/xfig."
+                           version ".full.tar.gz"))
+       (sha256
+        (base32
+         "1yd1jclvw5w3ja4jjzr1ysbn8iklh88wq84jn9d1gavrbfbqyqpa"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("imake" ,imake)
@@ -59,51 +59,54 @@
     (arguments
      `(#:tests? #f
        #:phases
-       (alist-replace
-        'configure
-        (lambda* (#:key inputs outputs #:allow-other-keys)
-          (let ((imake (assoc-ref inputs "imake"))
-                (out   (assoc-ref outputs "out")))
-           (substitute* "Imakefile"
-             (("XCOMM (BINDIR = )[[:graph:]]*" _ front)
-              (string-append front out "/bin"))
-             (("(PNGLIBDIR = )[[:graph:]]*" _ front)
-              (string-append front (assoc-ref inputs "libpng") "/lib"))
-             (("(PNGINC = -I)[[:graph:]]*" _ front)
-              (string-append front (assoc-ref inputs "libpng") "/include"))
-             (("(JPEGLIBDIR = )[[:graph:]]*" _ front)
-              (string-append front (assoc-ref inputs "libjpeg") "/lib"))
-             (("(JPEGINC = -I)[[:graph:]]*" _ front)
-              (string-append front (assoc-ref inputs "libjpeg") "/include"))
-             (("(ZLIBDIR = )[[:graph:]]*" _ front)
-              (string-append front (assoc-ref inputs "zlib") "/lib"))
-             (("(XPMLIBDIR = )[[:graph:]]*" _ front)
-              (string-append front (assoc-ref inputs "libxpm") "/lib"))
-             (("(XPMINC = -I)[[:graph:]]*" _ front)
-              (string-append front (assoc-ref inputs "libxpm") "/include"))
-             (("(XFIGLIBDIR = )[[:graph:]]*" _ front)
-              (string-append front out "/lib"))
-             (("(XFIGDOCDIR = )[[:graph:]]*" _ front)
-              (string-append front out "/share/doc"))
-             (("XCOMM USEINLINE") "USEINLINE"))
-           ;; The -a argument is required in order to pick up the correct paths
-           ;; to several X header files.
-           (zero? (system* "xmkmf" "-a"))
-           ;; Reset some variables that are inherited from imake templates
-           (substitute* "Makefile"
-             ;; These imake variables somehow remain undefined
-             (("DefaultGcc2[[:graph:]]*Opt") "-O2")
-             ;; Reset a few variable defaults that are set in imake templates
-             ((imake) out)
-             (("(MANPATH = )[[:graph:]]*" _ front)
-              (string-append front out "/share/man"))
-             (("(CONFDIR = )([[:graph:]]*)" _ front default)
-              (string-append front out default)))))
-        (alist-cons-after
-         'install 'install/libs
-         (lambda _
-           (zero? (system* "make" "install.libs")))
-         (alist-cons-after
+       (modify-phases %standard-phases
+         (replace 'configure
+                  (lambda* (#:key inputs outputs #:allow-other-keys)
+                    (let ((imake (assoc-ref inputs "imake"))
+                          (out   (assoc-ref outputs "out")))
+                      (substitute* "Imakefile"
+                        (("XCOMM XAPPLOADDIR = /home/user/xfig *")
+                         (string-append "XAPPLOADDIR = " out ,%app-defaults-dir))
+                        (("XCOMM (BINDIR = )[[:graph:]]*" _ front)
+                         (string-append front out "/bin"))
+                        (("(PNGLIBDIR = )[[:graph:]]*" _ front)
+                         (string-append front (assoc-ref inputs "libpng") "/lib"))
+                        (("(PNGINC = -I)[[:graph:]]*" _ front)
+                         (string-append front (assoc-ref inputs "libpng") "/include"))
+                        (("(JPEGLIBDIR = )[[:graph:]]*" _ front)
+                         (string-append front (assoc-ref inputs "libjpeg") "/lib"))
+                        (("(JPEGINC = -I)[[:graph:]]*" _ front)
+                         (string-append front (assoc-ref inputs "libjpeg") "/include"))
+                        (("(ZLIBDIR = )[[:graph:]]*" _ front)
+                         (string-append front (assoc-ref inputs "zlib") "/lib"))
+                        (("(XPMLIBDIR = )[[:graph:]]*" _ front)
+                         (string-append front (assoc-ref inputs "libxpm") "/lib"))
+                        (("(XPMINC = -I)[[:graph:]]*" _ front)
+                         (string-append front (assoc-ref inputs "libxpm") "/include"))
+                        (("(XFIGLIBDIR = )[[:graph:]]*" _ front)
+                         (string-append front out "/lib"))
+                        (("(XFIGDOCDIR = )[[:graph:]]*" _ front)
+                         (string-append front out "/share/doc"))
+                        (("XCOMM USEINLINE") "USEINLINE"))
+                      ;; The -a argument is required in order to pick up the correct paths
+                      ;; to several X header files.
+                      (zero? (system* "xmkmf" "-a"))
+                      ;; Reset some variables that are inherited from imake templates
+                      (substitute* "Makefile"
+                        ;; These imake variables somehow remain undefined
+                        (("DefaultGcc2[[:graph:]]*Opt") "-O2")
+                        ;; Reset a few variable defaults that are set in imake templates
+                        ((imake) out)
+                        (("(MANPATH = )[[:graph:]]*" _ front)
+                         (string-append front out "/share/man"))
+                        (("(CONFDIR = )([[:graph:]]*)" _ front default)
+                         (string-append front out default))))
+                    #t))
+         (add-after
+          'install 'install/libs
+          (lambda _
+            (zero? (system* "make" "install.libs"))))
+         (add-after
           'install 'install/doc
           (lambda _
             (begin
@@ -118,15 +121,7 @@
                   (dump-port in out)
                   (close-pipe in)
                   (close-port out)))
-              (zero? (system* "make" "install.doc"))))
-          (alist-cons-after
-           'install 'wrap-xfig
-           (lambda* (#:key outputs #:allow-other-keys)
-             (let ((out (assoc-ref outputs "out")))
-               (wrap-program (string-append out "/bin/xfig")
-                             `("XAPPLRESDIR" suffix
-                               (,(string-append out "/etc/X11/app-defaults"))))))
-           %standard-phases))))))
+              (zero? (system* "make" "install.doc"))))))))
     (home-page "http://xfig.org/")
     (synopsis "Interactive drawing tool")
     (description
@@ -144,12 +139,12 @@ selected in various ways.  For text, 35 fonts are available.")
     (version "3.2.5e")
     (source
      (origin
-      (method url-fetch)
-      (uri (string-append "mirror://sourceforge/mcj/mcj-source/transfig."
-                          version ".tar.gz"))
-      (sha256
-       (base32
-        "0i3p7qmg2w8qrad3pn42b0miwarql7yy0gpd49b1bpal6bqsiicf"))))
+       (method url-fetch)
+       (uri (string-append "mirror://sourceforge/mcj/mcj-source/transfig."
+                           version ".tar.gz"))
+       (sha256
+        (base32
+         "0i3p7qmg2w8qrad3pn42b0miwarql7yy0gpd49b1bpal6bqsiicf"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("imake" ,imake)
@@ -183,20 +178,20 @@ selected in various ways.  For text, 35 fonts are available.")
               (("(XPMINC = -I)[[:graph:]]*" _ front)
                (string-append front (assoc-ref inputs "libxpm") "/include/X11"))
               (("/usr/local/lib/fig2dev") (string-append out "/lib")))
-           ;; The -a argument is required in order to pick up the correct paths
-           ;; to several X header files.
-           (zero? (system* "xmkmf" "-a"))
-           (substitute* '("Makefile"
-                          "fig2dev/Makefile"
-                          "transfig/Makefile")
-             ;; These imake variables somehow remain undefined
-             (("DefaultGcc2[[:graph:]]*Opt") "-O2")
-             ;; Reset a few variable defaults that are set in imake templates
-             ((imake) out)
-             (("(MANPATH = )[[:graph:]]*" _ front)
-              (string-append front out "/share/man"))
-             (("(CONFDIR = )([[:graph:]]*)" _ front default)
-              (string-append front out default)))))
+            ;; The -a argument is required in order to pick up the correct paths
+            ;; to several X header files.
+            (zero? (system* "xmkmf" "-a"))
+            (substitute* '("Makefile"
+                           "fig2dev/Makefile"
+                           "transfig/Makefile")
+              ;; These imake variables somehow remain undefined
+              (("DefaultGcc2[[:graph:]]*Opt") "-O2")
+              ;; Reset a few variable defaults that are set in imake templates
+              ((imake) out)
+              (("(MANPATH = )[[:graph:]]*" _ front)
+               (string-append front out "/share/man"))
+              (("(CONFDIR = )([[:graph:]]*)" _ front default)
+               (string-append front out default)))))
         (alist-cons-after
          'install 'install/doc
          (lambda _
diff --git a/gnu/packages/xml.scm b/gnu/packages/xml.scm
index 594a1a471c..32b658489c 100644
--- a/gnu/packages/xml.scm
+++ b/gnu/packages/xml.scm
@@ -74,6 +74,7 @@ things the parser might find in the XML document (like start tags).")
 (define-public libxml2
   (package
     (name "libxml2")
+    (replacement libxml2/fixed)
     (version "2.9.4")
     (source (origin
              (method url-fetch)
@@ -101,6 +102,15 @@ things the parser might find in the XML document (like start tags).")
 project (but it is usable outside of the Gnome platform).")
     (license license:x11)))
 
+(define libxml2/fixed
+  (package
+    (inherit libxml2)
+    (source
+      (origin
+        (inherit (package-source libxml2))
+        (patches (search-patches "libxml2-CVE-2016-4658.patch"
+                                 "libxml2-CVE-2016-5131.patch"))))))
+
 (define-public python-libxml2
   (package (inherit libxml2)
     (name "python-libxml2")
diff --git a/gnu/packages/xorg.scm b/gnu/packages/xorg.scm
index 5fef0178b1..a27c431ddf 100644
--- a/gnu/packages/xorg.scm
+++ b/gnu/packages/xorg.scm
@@ -10,7 +10,7 @@
 ;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is>
 ;;; Copyright © 2016 Alex Kost <alezost@gmail.com>
 ;;; Copyright © 2016 David Craven <david@craven.ch>
-;;; Copyright © 2016 John Darrington <jmd@gnu.org>
+;;; Copyright © 2016, 2017 John Darrington <jmd@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -335,6 +335,7 @@ provided.")
     (license (license:x11-style "file://dri3proto.h"
                                 "See 'dri3proto.h' in the distribution."))))
 
+(define-public %app-defaults-dir "/lib/X11/app-defaults")
 
 (define-public editres
   (package
@@ -354,7 +355,7 @@ provided.")
     (arguments
      `(#:configure-flags
        (list (string-append "--with-appdefaultdir="
-                            %output "/lib/X11/app-defaults"))))
+                            %output ,%app-defaults-dir))))
     (inputs
      `(("libxaw" ,libxaw)
        ("libxmu" ,libxmu)
@@ -1458,7 +1459,7 @@ treat it as part of their software base when porting.")
 (define-public libxpm
   (package
     (name "libxpm")
-    (version "3.5.11")
+    (version "3.5.12")
     (source
       (origin
         (method url-fetch)
@@ -1468,7 +1469,7 @@ treat it as part of their software base when porting.")
                ".tar.bz2"))
         (sha256
           (base32
-            "07041q4k8m4nirzl7lrqn8by2zylx0xvh6n0za301qqs3njszgf5"))))
+            "1v5xaiw4zlhxspvx76y3hq4wpxv7mpj6parqnwdqvpj8vbinsspx"))))
     (build-system gnu-build-system)
     (inputs
       `(("gettext" ,gettext-minimal)
@@ -2399,7 +2400,7 @@ XC-APPGROUP, XTEST.")
 (define-public libevdev
   (package
     (name "libevdev")
-    (version "1.3")
+    (version "1.5.5")
     (source
      (origin
        (method url-fetch)
@@ -2407,10 +2408,10 @@ XC-APPGROUP, XTEST.")
                            name "-" version ".tar.xz"))
        (sha256
         (base32
-         "0iil4pnla0kjdx52ay7igq65sx32sjbzn1wx9q3v74m5g7712m16"))))
+         "1cc00876lqvyadsfmj3sh1h2i0r3qfar98izdfar5f8q41w2009j"))))
     (build-system gnu-build-system)
     (native-inputs `(("python" ,python)))
-    (home-page "http://www.freedesktop.org/wiki/Software/libevdev/")
+    (home-page "https://www.freedesktop.org/wiki/Software/libevdev/")
     (synopsis "Wrapper library for evdev devices")
     (description
      "libevdev is a wrapper library for evdev devices. it moves the common
@@ -3145,7 +3146,7 @@ UniChrome Pro and Chrome9 integrated graphics processors.")
 (define-public xf86-video-qxl
   (package
     (name "xf86-video-qxl")
-    (version "0.1.4")
+    (version "0.1.5")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -3153,7 +3154,7 @@ UniChrome Pro and Chrome9 integrated graphics processors.")
                 "xf86-video-qxl-" version ".tar.bz2"))
               (sha256
                (base32
-                "018ic9ddxfnjcv2yss0mwk1gq6rmip1hrgi2wxwqkbqx1cpx4yp5"))))
+                "14jc24znnahhmz4kqalafmllsg8awlz0y6gpgdpk5ih38ph851mi"))))
     (build-system gnu-build-system)
     (inputs
       `(("fontsproto" ,fontsproto)
@@ -3436,7 +3437,7 @@ X server.")
 (define-public xf86-video-vmware
   (package
     (name "xf86-video-vmware")
-    (version "13.1.0")
+    (version "13.2.1")
     (source
       (origin
         (method url-fetch)
@@ -3446,14 +3447,16 @@ X server.")
                ".tar.bz2"))
         (sha256
           (base32
-           "1k50whwnkzxam2ihc1sw456dx0pvr76naycm4qhyjxqv9d72879w"))))
+           "0azn3g0vcki47n5jddagk2rmbwdvp845k8p7d2r56zxs3w8ggxz2"))))
     (build-system gnu-build-system)
-    (inputs `(("libx11" ,libx11)
-              ("libxext" ,libxext)
-              ("mesa" ,mesa)            ; for xatracker
-              ("xorg-server" ,xorg-server)))
+    (inputs
+     `(("libx11" ,libx11)
+       ("libxext" ,libxext)
+       ("mesa" ,mesa)                   ; for xatracker
+       ("xorg-server" ,xorg-server)))
     (native-inputs
-       `(("pkg-config" ,pkg-config)))
+     `(("eudev" ,eudev)
+       ("pkg-config" ,pkg-config)))
     (home-page "https://www.x.org/wiki/")
     (synopsis "VMware SVGA video driver for X server")
     (description
@@ -3980,23 +3983,9 @@ protocol.")
                 "1grir464hy52a71r3mpm9mzvkf7nwr3vk0b1vc27pd3gp588a38p"))))
     (build-system gnu-build-system)
     (arguments
-     ;; By default, it tries to install XFontSel file in
-     ;; "/gnu/store/<libxt>/share/X11/app-defaults": it defines this
-     ;; directory from 'libxt' (using 'pkg-config').  To put this file
-     ;; inside output dir and to use it properly, we need to configure
-     ;; --with-appdefaultdir and to wrap 'xfontsel' binary.
-     (let ((app-defaults-dir "/share/X11/app-defaults"))
-       `(#:configure-flags
-         (list (string-append "--with-appdefaultdir="
-                              %output ,app-defaults-dir))
-         #:phases
-         (modify-phases %standard-phases
-           (add-after 'install 'wrap-xfontsel
-             (lambda* (#:key outputs #:allow-other-keys)
-               (let ((out (assoc-ref outputs "out")))
-                 (wrap-program (string-append out "/bin/xfontsel")
-                   `("XAPPLRESDIR" =
-                     (,(string-append out ,app-defaults-dir)))))))))))
+     `(#:configure-flags
+       (list (string-append "--with-appdefaultdir="
+                            %output ,%app-defaults-dir))))
     (inputs
      `(("libx11" ,libx11)
        ("libxaw" ,libxaw)
@@ -4026,19 +4015,9 @@ Font Description (XLFD) full name for a font.")
                 "0n97iqqap9wyxjan2n520vh4rrf5bc0apsw2k9py94dqzci258y1"))))
     (build-system gnu-build-system)
     (arguments
-     ;; The same 'app-defaults' problem as with 'xfontsel' package.
-     (let ((app-defaults-dir "/share/X11/app-defaults"))
        `(#:configure-flags
          (list (string-append "--with-appdefaultdir="
-                              %output ,app-defaults-dir))
-         #:phases
-         (modify-phases %standard-phases
-           (add-after 'install 'wrap-xfd
-             (lambda* (#:key outputs #:allow-other-keys)
-               (let ((out (assoc-ref outputs "out")))
-                 (wrap-program (string-append out "/bin/xfd")
-                   `("XAPPLRESDIR" =
-                     (,(string-append out ,app-defaults-dir)))))))))))
+                              %output ,%app-defaults-dir))))
     (inputs
      `(("fontconfig" ,fontconfig)
        ("libx11" ,libx11)
@@ -5302,7 +5281,8 @@ draggable titlebars and borders.")
                ".tar.bz2"))
         (sha256
           (base32
-            "06lz6i7rbrp19kgikpaz4c97fw7n31k2h2aiikczs482g2zbdvj6"))))
+           "06lz6i7rbrp19kgikpaz4c97fw7n31k2h2aiikczs482g2zbdvj6"))
+        (patches (search-patches "libxt-guix-search-paths.patch"))))
     (build-system gnu-build-system)
     (outputs '("out"
                "doc"))                            ;2 MiB of man pages + XML
@@ -5355,6 +5335,36 @@ draggable titlebars and borders.")
 Intrinsics (Xt) Library.")
     (license license:x11)))
 
+(define-public twm
+  (package
+    (name "twm")
+    (version "1.0.9")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://xorg/individual/app/" name "-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "1s1r00x8add3f27xjqxg6q7mwplwrb72gakbh4y6j052as25wchw"))))
+    (build-system gnu-build-system)
+    (inputs
+     `(("libxt" ,libxt)
+       ("libxmu" ,libxmu)
+       ("libxext" ,libxext)
+       ("xproto" ,xproto)))
+    (native-inputs
+     `(("bison" ,bison)
+       ("pkg-config" ,pkg-config)))
+    (home-page "https://www.x.org/wiki/")
+    (synopsis "Tab Window Manager for the X Window System")
+    (description "Twm is a window manager for the X Window System.
+It provides titlebars, shaped windows, several forms of icon management,
+user-defined macro functions, click-to-type and pointer-driven
+keyboard focus, and user-specified key and pointer button bindings.")
+    (license license:x11)))
 
 (define-public xcb-util
   (package
@@ -5614,6 +5624,66 @@ user-friendly mechanism to start the X server.")
 Intrinsics (Xt) Library.")
     (license license:x11)))
 
+(define-public xmag
+  (package
+    (name "xmag")
+    (version "1.0.6")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://xorg/individual/app/" name "-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "19bsg5ykal458d52v0rvdx49v54vwxwqg8q36fdcsv9p2j8yri87"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:configure-flags
+       (list (string-append "--with-appdefaultdir="
+                            %output ,%app-defaults-dir))))
+    (inputs
+     `(("libxaw" ,libxaw)))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (home-page "https://www.x.org/wiki/")
+    (synopsis "Display or capture a magnified part of a X11 screen")
+    (description "Xmag displays and captures a magnified snapshot of a portion
+of an X11 screen.")
+    (license license:x11)))
+
+(define-public xmessage
+  (package
+    (name "xmessage")
+    (version "1.0.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://xorg/individual/app/" name "-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "1jmcac1xbwplbxfl75sr6w3zqhx1khpdzlqippjsr31cjp1rjc48"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:configure-flags
+       (list (string-append "--with-appdefaultdir="
+                            %output ,%app-defaults-dir))))
+    (inputs
+     `(("libxaw" ,libxaw)))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (home-page "https://www.x.org/wiki/")
+    (synopsis "Displays a message or query in a window")
+    (description
+     "Xmessage displays a message or query in a window.   The user can click
+on a button to dismiss it or can select one of several buttons
+to answer a question.  Xmessage can also exit after a specified time.")
+    (license license:x11)))
+
 (define-public xterm
   (package
     (name "xterm")
diff --git a/gnu/packages/zile.scm b/gnu/packages/zile.scm
index 13a5440eea..dfa9d7373d 100644
--- a/gnu/packages/zile.scm
+++ b/gnu/packages/zile.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;;
@@ -21,14 +21,21 @@
 (define-module (gnu packages zile)
   #:use-module (guix licenses)
   #:use-module (guix download)
+  #:use-module (guix git-download)
   #:use-module (guix packages)
+  #:use-module (guix utils)
   #:use-module (guix build-system gnu)
+  #:use-module (gnu packages autotools)
+  #:use-module (gnu packages bash)
   #:use-module (gnu packages bdw-gc)
-  #:use-module (gnu packages perl)
+  #:use-module (gnu packages guile)
+  #:use-module (gnu packages gnupg)
+  #:use-module (gnu packages m4)
   #:use-module (gnu packages man)
   #:use-module (gnu packages ncurses)
-  #:use-module (gnu packages bash)
-  #:use-module (gnu packages pkg-config))
+  #:use-module (gnu packages perl)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages version-control))
 
 (define-public zile
   (package
@@ -67,3 +74,70 @@
      "GNU Zile is a lightweight Emacs clone.  It usage is similar to the
 default Emacs configuration, but it carries a much lighter feature set.")
     (license gpl3+)))
+
+(define-public zile-on-guile
+  ;; This is a fork of Zile that uses Guile, announced here:
+  ;; <http://lists.gnu.org/archive/html/guile-user/2012-02/msg00033.html>.
+  (let ((commit "fd097811a60e58696d734c35b0eb7da3afc1adb7")
+        (revision "0"))
+    (package
+      (inherit zile)
+      (name "zile-on-guile")
+      (version (string-append (package-version zile)
+                              "-" revision "."
+                              (string-take commit 7)))
+      (home-page "https://github.com/spk121/zile")
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url home-page)
+                      (commit commit)
+                      (recursive? #t)))           ;for the Gnulib sub-module
+                (sha256
+                 (base32
+                  "0wlli8hqal9ikmbl3a49kyhzyf164jk6mdbir3bclq2gxszs532d"))
+                (file-name (string-append name "-" version "-checkout"))))
+      (inputs
+       `(("guile" ,guile-2.0)
+         ,@(package-inputs zile)))
+      (native-inputs
+       `(("m4" ,m4)                               ;for 'bootstrap'
+         ("autoconf" ,(autoconf-wrapper))
+         ("automake" ,automake)
+
+         ;; For some reason, 'bootstrap' insists on having these.
+         ("git" ,git)
+         ("gpg" ,gnupg)
+
+         ,@(package-native-inputs zile)))
+      (arguments
+       (substitute-keyword-arguments (package-arguments zile)
+         ((#:phases phases)
+          `(modify-phases ,phases
+             (add-after 'unpack 'bootstrap
+               (lambda _
+                 ;; Make sure all the files are writable so that ./bootstrap
+                 ;; can proceed.
+                 (for-each (lambda (file)
+                             (chmod file #o755))
+                           (find-files "."))
+                 (patch-shebang "gnulib/gnulib-tool")
+                 (zero? (system* "sh" "./bootstrap"
+                                 "--gnulib-srcdir=gnulib"
+                                 "--skip-git" "--skip-po"
+                                 "--verbose"))))
+             (add-after 'install 'wrap-command
+               (lambda* (#:key outputs #:allow-other-keys)
+                 ;; Add zile.scm to the search path.
+                 (let* ((out    (assoc-ref outputs "out"))
+                        (scheme (dirname
+                                 (car (find-files out "^zile\\.scm$")))))
+                   (wrap-program (string-append out "/bin/zile-on-guile")
+                     `("GUILE_LOAD_PATH" ":" prefix (,scheme)))
+                   #t)))))))
+      (synopsis "Lightweight clone of the Emacs editor using Guile")
+      (description
+       "GNU Zile is a lightweight clone of the Emacs editor, and Zile-on-Guile
+is a variant of Zile that can be extended in Guile Scheme.  Hitting
+@kbd{M-C} (or: @kbd{Alt} and @kbd{C}) brings up a Guile REPL from which
+interactive functions akin to those of Emacs can be invoked."))))
diff --git a/gnu/packages/zip.scm b/gnu/packages/zip.scm
index c9fb70c031..2cf30d6e32 100644
--- a/gnu/packages/zip.scm
+++ b/gnu/packages/zip.scm
@@ -156,7 +156,7 @@ recreates the stored directory structure by default.")
 (define-public perl-zip
   (package
     (name "perl-zip")
-    (version "1.30")
+    (version "1.59")
     (source 
      (origin
        (method url-fetch)
@@ -165,7 +165,7 @@ recreates the stored directory structure by default.")
              version ".tar.gz"))
        (sha256
         (base32
-         "0633zah5z9njiqnvy3vh42fjymncmil1jdfb7d18w8xpfzzp5d7q"))))
+         "0m31qlppg65vh32pwxkwjby02q70abx49d2yk6vfd4585fqb27cx"))))
     (build-system perl-build-system)
     (synopsis  "Provides an interface to ZIP archive files")
     (description "The Archive::Zip module allows a Perl program to create,
diff --git a/gnu/services/admin.scm b/gnu/services/admin.scm
index d8086b78d4..deaf677bd9 100644
--- a/gnu/services/admin.scm
+++ b/gnu/services/admin.scm
@@ -58,8 +58,8 @@
 }
 "))
 
-(define (simple-rotation-config file)
-  (string-append file " {
+(define (simple-rotation-config files)
+  #~(string-append #$(string-join files ",") " {
         sharedscripts
 }
 "))
@@ -72,7 +72,8 @@
                            (display #$(syslog-rotation-config %rotated-files)
                                     port)
                            (display #$(simple-rotation-config
-                                       "/var/log/shepherd.log")
+                                       '("/var/log/shepherd.log"
+                                         "/var/log/guix-daemon.log"))
                                     port)))))))
 
 (define (default-jobs rottlog)
diff --git a/gnu/services/avahi.scm b/gnu/services/avahi.scm
index 60e9e61f94..29720415fc 100644
--- a/gnu/services/avahi.scm
+++ b/gnu/services/avahi.scm
@@ -107,7 +107,7 @@
            (requirement '(dbus-system networking))
 
            (start #~(make-forkexec-constructor
-                     (list (string-append #$avahi "/sbin/avahi-daemon")
+                     (list #$(file-append avahi "/sbin/avahi-daemon")
                            "--daemonize"
                            #$@(if debug? #~("--debug") #~())
                            "-f" #$config)
diff --git a/gnu/services/base.scm b/gnu/services/base.scm
index ea1ab63d1b..1b1ce0d5e8 100644
--- a/gnu/services/base.scm
+++ b/gnu/services/base.scm
@@ -37,7 +37,6 @@
   #:use-module ((gnu packages base)
                 #:select (canonical-package glibc))
   #:use-module (gnu packages package-management)
-  #:use-module (gnu packages ssh)
   #:use-module (gnu packages lsof)
   #:use-module (gnu packages terminals)
   #:use-module ((gnu build file-systems)
@@ -610,7 +609,7 @@ strings or string-valued gexps."
            (dup2 (open-fdes #$tty O_RDONLY) 0)
            (close-fdes 1)
            (dup2 (open-fdes #$tty O_WRONLY) 1)
-           (execl (string-append #$kbd "/bin/unicode_start")
+           (execl #$(file-append kbd "/bin/unicode_start")
                   "unicode_start"))
           (else
            (zero? (cdr (waitpid pid))))))))
@@ -623,7 +622,7 @@ strings or string-valued gexps."
       (documentation (string-append "Load console keymap (loadkeys)."))
       (provision '(console-keymap))
       (start #~(lambda _
-                 (zero? (system* (string-append #$kbd "/bin/loadkeys")
+                 (zero? (system* #$(file-append kbd "/bin/loadkeys")
                                  #$@files))))
       (respawn? #f)))))
 
@@ -655,7 +654,7 @@ strings or string-valued gexps."
              (start #~(lambda _
                         (and #$(unicode-start device)
                              (zero?
-                              (system* (string-append #$kbd "/bin/setfont")
+                              (system* #$(file-append kbd "/bin/setfont")
                                        "-C" #$device #$font)))))
              (stop #~(const #t))
              (respawn? #f)))))
@@ -737,7 +736,7 @@ the message of the day, among other things."
        (requirement '(user-processes host-name udev))
 
        (start  #~(make-forkexec-constructor
-                  (list (string-append #$mingetty "/sbin/mingetty")
+                  (list #$(file-append mingetty "/sbin/mingetty")
                         "--noclear" #$tty
                         #$@(if auto-login
                                #~("--autologin" #$auto-login)
@@ -872,7 +871,7 @@ the tty to run, among other things."
            (provision '(nscd))
            (requirement '(user-processes))
            (start #~(make-forkexec-constructor
-                     (list (string-append #$(nscd-configuration-glibc config)
+                     (list #$(file-append (nscd-configuration-glibc config)
                                           "/sbin/nscd")
                            "-f" #$nscd.conf "--foreground")
 
@@ -1058,7 +1057,7 @@ public key, with GUIX."
              (format #t "registering public key '~a'...~%" key)
              (close-port (current-input-port))
              (dup port 0)
-             (execl (string-append #$guix "/bin/guix")
+             (execl #$(file-append guix "/bin/guix")
                     "guix" "archive" "--authorize")
              (exit 1)))
           (else
@@ -1090,10 +1089,10 @@ failed to register hydra.gnu.org public key: ~a~%" status))))))))
                     (default %default-substitute-urls))
   (extra-options    guix-configuration-extra-options ;list of strings
                     (default '()))
+  (log-file         guix-configuration-log-file   ;string
+                    (default "/var/log/guix-daemon.log"))
   (lsof             guix-configuration-lsof       ;<package>
-                    (default lsof))
-  (lsh              guix-configuration-lsh        ;<package>
-                    (default lsh)))
+                    (default lsof)))
 
 (define %default-guix-configuration
   (guix-configuration))
@@ -1104,14 +1103,14 @@ failed to register hydra.gnu.org public key: ~a~%" status))))))))
     (($ <guix-configuration> guix build-group build-accounts
                              authorize-key? keys
                              use-substitutes? substitute-urls extra-options
-                             lsof lsh)
+                             log-file lsof)
      (list (shepherd-service
             (documentation "Run the Guix daemon.")
             (provision '(guix-daemon))
             (requirement '(user-processes))
             (start
              #~(make-forkexec-constructor
-                (list (string-append #$guix "/bin/guix-daemon")
+                (list #$(file-append guix "/bin/guix-daemon")
                       "--build-users-group" #$build-group
                       #$@(if use-substitutes?
                              '()
@@ -1119,10 +1118,11 @@ failed to register hydra.gnu.org public key: ~a~%" status))))))))
                       "--substitute-urls" #$(string-join substitute-urls)
                       #$@extra-options)
 
-                ;; Add 'lsof' (for the GC) and 'lsh' (for offloading) to the
-                ;; daemon's $PATH.
+                ;; Add 'lsof' (for the GC) to the daemon's $PATH.
                 #:environment-variables
-                (list (string-append "PATH=" #$lsof "/bin:" #$lsh "/bin"))))
+                (list (string-append "PATH=" #$lsof "/bin"))
+
+                #:log-file #$log-file))
             (stop #~(make-kill-destructor)))))))
 
 (define (guix-accounts config)
@@ -1186,7 +1186,7 @@ failed to register hydra.gnu.org public key: ~a~%" status))))))))
             (provision '(guix-publish))
             (requirement '(guix-daemon))
             (start #~(make-forkexec-constructor
-                      (list (string-append #$guix "/bin/guix")
+                      (list #$(file-append guix "/bin/guix")
                             "publish" "-u" "guix-publish"
                             "-p" #$(number->string port)
                             (string-append "--listen=" #$host))))
@@ -1340,7 +1340,7 @@ item of @var{packages}."
                     ;; The first one is for udev, the second one for eudev.
                     (setenv "UDEV_CONFIG_FILE" #$udev.conf)
                     (setenv "EUDEV_RULES_DIRECTORY"
-                            (string-append #$rules "/lib/udev/rules.d"))
+                            #$(file-append rules "/lib/udev/rules.d"))
 
                     (let ((pid (primitive-fork)))
                       (case pid
@@ -1353,11 +1353,11 @@ item of @var{packages}."
                          (wait-for-udevd)
 
                          ;; Trigger device node creation.
-                         (system* (string-append #$udev "/bin/udevadm")
+                         (system* #$(file-append udev "/bin/udevadm")
                                   "trigger" "--action=add")
 
                          ;; Wait for things to settle down.
-                         (system* (string-append #$udev "/bin/udevadm")
+                         (system* #$(file-append udev "/bin/udevadm")
                                   "settle")
                          pid)))))
          (stop #~(make-kill-destructor))
@@ -1428,7 +1428,7 @@ extra rules from the packages listed in @var{rules}."
                        ;; 'gpm' runs in the background and sets a PID file.
                        ;; Note that it requires running as "root".
                        (false-if-exception (delete-file "/var/run/gpm.pid"))
-                       (fork+exec-command (list (string-append #$gpm "/sbin/gpm")
+                       (fork+exec-command (list #$(file-append gpm "/sbin/gpm")
                                                 #$@options))
 
                        ;; Wait for the PID file to appear; declare failure if
@@ -1443,7 +1443,7 @@ extra rules from the packages listed in @var{rules}."
 
             (stop #~(lambda (_)
                       ;; Return #f if successfully stopped.
-                      (not (zero? (system* (string-append #$gpm "/sbin/gpm")
+                      (not (zero? (system* #$(file-append gpm "/sbin/gpm")
                                            "-k"))))))))))
 
 (define gpm-service-type
@@ -1472,7 +1472,7 @@ This service is not part of @var{%base-services}."
                            (default kmscon))
   (virtual-terminal        kmscon-configuration-virtual-terminal)
   (login-program           kmscon-configuration-login-program
-                           (default #~(string-append #$shadow "/bin/login")))
+                           (default (file-append shadow "/bin/login")))
   (login-arguments         kmscon-configuration-login-arguments
                            (default '("-p")))
   (hardware-acceleration?  kmscon-configuration-hardware-acceleration?
@@ -1490,7 +1490,7 @@ This service is not part of @var{%base-services}."
 
        (define kmscon-command
          #~(list
-            (string-append #$kmscon "/bin/kmscon") "--login"
+            #$(file-append kmscon "/bin/kmscon") "--login"
             "--vt" #$virtual-terminal
             #$@(if hardware-acceleration? '("--hwaccel") '())
             "--" #$login-program #$@login-arguments))
diff --git a/gnu/services/configuration.scm b/gnu/services/configuration.scm
index 94c5f21557..a98db64fa5 100644
--- a/gnu/services/configuration.scm
+++ b/gnu/services/configuration.scm
@@ -28,10 +28,13 @@
   #:use-module (srfi srfi-35)
   #:export (configuration-field
             configuration-field-name
+            configuration-field-type
             configuration-missing-field
             configuration-field-error
             configuration-field-serializer
             configuration-field-getter
+            configuration-field-default-value-thunk
+            configuration-field-documentation
             serialize-configuration
             define-configuration
             validate-configuration
diff --git a/gnu/services/cuirass.scm b/gnu/services/cuirass.scm
index d843c07335..c15a846bad 100644
--- a/gnu/services/cuirass.scm
+++ b/gnu/services/cuirass.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2016 Mathieu Lirzin <mthl@gnu.org>
+;;; Copyright © 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -29,8 +30,7 @@
             cuirass-configuration
             cuirass-configuration?
 
-            cuirass-service-type
-            cuirass-service))
+            cuirass-service-type))
 
 ;;;; Commentary:
 ;;;
@@ -42,8 +42,12 @@
 (define-record-type* <cuirass-configuration>
   cuirass-configuration make-cuirass-configuration
   cuirass-configuration?
+  (cuirass          cuirass-configuration-cuirass ;package
+                    (default cuirass))
+  (log-file         cuirass-configuration-log-file ;string
+                    (default "/var/log/cuirass.log"))
   (cache-directory  cuirass-configuration-cache-directory ;string (dir-name)
-                    (default ""))
+                    (default "/var/cache/cuirass"))
   (user             cuirass-configuration-user ;string
                     (default "cuirass"))
   (group            cuirass-configuration-group ;string
@@ -52,8 +56,8 @@
                     (default 60))
   (database         cuirass-configuration-database ;string (file-name)
                     (default "/var/run/cuirass/cuirass.db"))
-  (specifications   cuirass-configuration-specifications ;string (file-name)
-                    (default ""))
+  (specifications   cuirass-configuration-specifications)
+                                  ;gexp that evaluates to specification-alist
   (use-substitutes? cuirass-configuration-use-substitutes? ;boolean
                     (default #f))
   (one-shot?        cuirass-configuration-one-shot? ;boolean
@@ -63,10 +67,14 @@
   "Return a <shepherd-service> for the Cuirass service with CONFIG."
   (and
    (cuirass-configuration? config)
-   (let ((cache-directory  (cuirass-configuration-cache-directory config))
+   (let ((cuirass          (cuirass-configuration-cuirass config))
+         (cache-directory  (cuirass-configuration-cache-directory config))
+         (log-file         (cuirass-configuration-log-file config))
+         (user             (cuirass-configuration-user config))
+         (group            (cuirass-configuration-group config))
          (interval         (cuirass-configuration-interval config))
          (database         (cuirass-configuration-database config))
-         (specifications   (cuirass-configuration-specifications config))
+         (specs            (cuirass-configuration-specifications config))
          (use-substitutes? (cuirass-configuration-use-substitutes? config))
          (one-shot?        (cuirass-configuration-one-shot? config)))
      (list (shepherd-service
@@ -75,16 +83,16 @@
             (requirement '(guix-daemon))
             (start #~(make-forkexec-constructor
                       (list (string-append #$cuirass "/bin/cuirass")
-                            #$@(if (string=? "" cache-directory)
-                                   '()
-                                   (list "--cache-directory" cache-directory))
-                            #$@(if (string=? "" specifications)
-                                   '()
-                                   (list "--specifications" specifications))
+                            "--cache-directory" #$cache-directory
+                            "--specifications"
+                            #$(scheme-file "cuirass-specs.scm" specs)
                             "--database" #$database
                             "--interval" #$(number->string interval)
                             #$@(if use-substitutes? '("--use-substitutes") '())
-                            #$@(if one-shot? '("--one-shot") '()))))
+                            #$@(if one-shot? '("--one-shot") '()))
+                      #:user #$user
+                      #:group #$group
+                      #:log-file #$log-file))
             (stop #~(make-kill-destructor)))))))
 
 (define (cuirass-account config)
@@ -102,14 +110,32 @@
            (home-directory (string-append "/var/run/" cuirass-user))
            (shell #~(string-append #$shadow "/sbin/nologin"))))))
 
+(define (cuirass-activation config)
+  "Return the activation code for CONFIG."
+  (let ((cache (cuirass-configuration-cache-directory config))
+        (db    (dirname (cuirass-configuration-database config)))
+        (user  (cuirass-configuration-user config))
+        (group (cuirass-configuration-group config)))
+    (with-imported-modules '((guix build utils))
+      #~(begin
+          (use-modules (guix build utils))
+
+          (mkdir-p #$cache)
+          (mkdir-p #$db)
+
+          (let ((uid (passwd:uid (getpw #$user)))
+                (gid (group:gid (getgr #$group))))
+            (chown #$cache uid gid)
+            (chown #$db uid gid))))))
+
 (define cuirass-service-type
   (service-type
    (name 'cuirass)
    (extensions
     (list
+     (service-extension profile-service-type      ;for 'info cuirass'
+                        (compose list cuirass-configuration-cuirass))
+     (service-extension activation-service-type cuirass-activation)
      (service-extension shepherd-root-service-type cuirass-shepherd-service)
      (service-extension account-service-type cuirass-account)))))
 
-(define* (cuirass-service #:key (config (cuirass-configuration)))
-  "Return a service that runs cuirass according to CONFIG."
-  (service cuirass-service-type config))
diff --git a/gnu/services/databases.scm b/gnu/services/databases.scm
index 1eed85542b..3ecc8aff78 100644
--- a/gnu/services/databases.scm
+++ b/gnu/services/databases.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2015 David Thompson <davet@gnu.org>
 ;;; Copyright © 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
+;;; Copyright © 2017 Christopher Baines <mail@cbaines.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -35,7 +36,11 @@
             mysql-service
             mysql-service-type
             mysql-configuration
-            mysql-configuration?))
+            mysql-configuration?
+
+            redis-configuration
+            redis-configuration?
+            redis-service-type))
 
 ;;; Commentary:
 ;;;
@@ -48,6 +53,10 @@
   postgresql-configuration?
   (postgresql     postgresql-configuration-postgresql ;<package>
                   (default postgresql))
+  (port           postgresql-configuration-port
+                  (default 5432))
+  (locale         postgresql-configuration-locale
+                  (default "en_US.utf8"))
   (config-file    postgresql-configuration-file)
   (data-directory postgresql-configuration-data-directory))
 
@@ -80,13 +89,18 @@ host	all	all	::1/128 	trust"))
 
 (define postgresql-activation
   (match-lambda
-    (($ <postgresql-configuration> postgresql config-file data-directory)
+    (($ <postgresql-configuration> postgresql port locale config-file data-directory)
      #~(begin
          (use-modules (guix build utils)
                       (ice-9 match))
 
          (let ((user (getpwnam "postgres"))
-               (initdb (string-append #$postgresql "/bin/initdb")))
+               (initdb (string-append #$postgresql "/bin/initdb"))
+               (initdb-args
+                (append
+                 (if #$locale
+                     (list (string-append "--locale=" #$locale))
+                     '()))))
            ;; Create db state directory.
            (mkdir-p #$data-directory)
            (chown #$data-directory (passwd:uid user) (passwd:gid user))
@@ -101,14 +115,19 @@ host	all	all	::1/128 	trust"))
                 (lambda ()
                   (setgid (passwd:gid user))
                   (setuid (passwd:uid user))
-                  (primitive-exit (system* initdb "-D" #$data-directory)))
+                  (primitive-exit
+                   (apply system*
+                          initdb
+                          "-D"
+                          #$data-directory
+                          initdb-args)))
                 (lambda ()
                   (primitive-exit 1))))
              (pid (waitpid pid))))))))
 
 (define postgresql-shepherd-service
   (match-lambda
-    (($ <postgresql-configuration> postgresql config-file data-directory)
+    (($ <postgresql-configuration> postgresql port locale config-file data-directory)
      (let ((start-script
             ;; Wrapper script that switches to the 'postgres' user before
             ;; launching daemon.
@@ -121,6 +140,7 @@ host	all	all	::1/128 	trust"))
                               (system* postgres
                                        (string-append "--config-file="
                                                       #$config-file)
+                                       "-p" (number->string #$port)
                                        "-D" #$data-directory)))))
        (list (shepherd-service
               (provision '(postgres))
@@ -140,6 +160,8 @@ host	all	all	::1/128 	trust"))
                                           (const %postgresql-accounts))))))
 
 (define* (postgresql-service #:key (postgresql postgresql)
+                             (port 5432)
+                             (locale "en_US.utf8")
                              (config-file %default-postgres-config)
                              (data-directory "/var/lib/postgresql/data"))
   "Return a service that runs @var{postgresql}, the PostgreSQL database server.
@@ -149,6 +171,8 @@ and stores the database cluster in @var{data-directory}."
   (service postgresql-service-type
            (postgresql-configuration
             (postgresql postgresql)
+            (port port)
+            (locale locale)
             (config-file config-file)
             (data-directory data-directory))))
 
@@ -160,7 +184,8 @@ and stores the database cluster in @var{data-directory}."
 (define-record-type* <mysql-configuration>
   mysql-configuration make-mysql-configuration
   mysql-configuration?
-  (mysql mysql-configuration-mysql (default mariadb)))
+  (mysql mysql-configuration-mysql (default mariadb))
+  (port mysql-configuration-port (default 3306)))
 
 (define %mysql-accounts
   (list (user-group
@@ -175,10 +200,11 @@ and stores the database cluster in @var{data-directory}."
 
 (define mysql-configuration-file
   (match-lambda
-    (($ <mysql-configuration> mysql)
-     (plain-file "my.cnf" "[mysqld]
+    (($ <mysql-configuration> mysql port)
+     (mixed-text-file "my.cnf" "[mysqld]
 datadir=/var/lib/mysql
 socket=/run/mysqld/mysqld.sock
+port=" (number->string port) "
 "))))
 
 (define (%mysql-activation config)
@@ -266,3 +292,77 @@ database server.
 The optional @var{config} argument specifies the configuration for
 @command{mysqld}, which should be a @code{<mysql-configuration>} object."
   (service mysql-service-type config))
+
+
+;;;
+;;; Redis
+;;;
+
+(define-record-type* <redis-configuration>
+  redis-configuration make-redis-configuration
+  redis-configuration?
+  (redis             redis-configuration-redis ;<package>
+                     (default redis))
+  (bind              redis-configuration-bind
+                     (default "127.0.0.1"))
+  (port              redis-configuration-port
+                     (default 6379))
+  (working-directory redis-configuration-working-directory
+                     (default "/var/lib/redis"))
+  (config-file       redis-configuration-config-file
+                     (default #f)))
+
+(define (default-redis.conf bind port working-directory)
+  (mixed-text-file "redis.conf"
+                   "bind " bind "\n"
+                   "port " (number->string port) "\n"
+                   "dir " working-directory "\n"
+                   "daemonize no\n"))
+
+(define %redis-accounts
+  (list (user-group (name "redis") (system? #t))
+        (user-account
+         (name "redis")
+         (group "redis")
+         (system? #t)
+         (comment "Redis server user")
+         (home-directory "/var/empty")
+         (shell (file-append shadow "/sbin/nologin")))))
+
+(define redis-activation
+  (match-lambda
+    (($ <redis-configuration> redis bind port working-directory config-file)
+     #~(begin
+         (use-modules (guix build utils)
+                      (ice-9 match))
+
+         (let ((user (getpwnam "redis")))
+           (mkdir-p #$working-directory)
+           (chown #$working-directory (passwd:uid user) (passwd:gid user)))))))
+
+(define redis-shepherd-service
+  (match-lambda
+    (($ <redis-configuration> redis bind port working-directory config-file)
+     (let ((config-file
+            (or config-file
+                (default-redis.conf bind port working-directory))))
+       (list (shepherd-service
+              (provision '(redis))
+              (documentation "Run the Redis daemon.")
+              (requirement '(user-processes syslogd))
+              (start #~(make-forkexec-constructor
+                        '(#$(file-append redis "/bin/redis-server")
+                          #$config-file)
+                        #:user "redis"
+                        #:group "redis"))
+              (stop #~(make-kill-destructor))))))))
+
+(define redis-service-type
+  (service-type (name 'redis)
+                (extensions
+                 (list (service-extension shepherd-root-service-type
+                                          redis-shepherd-service)
+                       (service-extension activation-service-type
+                                          redis-activation)
+                       (service-extension account-service-type
+                                          (const %redis-accounts))))))
diff --git a/gnu/services/desktop.scm b/gnu/services/desktop.scm
index 7555780ade..36049587d3 100644
--- a/gnu/services/desktop.scm
+++ b/gnu/services/desktop.scm
@@ -40,6 +40,7 @@
   #:use-module (gnu packages xdisorg)
   #:use-module (gnu packages suckless)
   #:use-module (gnu packages linux)
+  #:use-module (gnu packages libusb)
   #:use-module (guix records)
   #:use-module (guix packages)
   #:use-module (guix store)
@@ -753,6 +754,10 @@ with the administrator's password."
          (screen-locker-service slock)
          (screen-locker-service xlockmore "xlock")
 
+         ;; Add udev rules for MTP devices so that non-root users can access
+         ;; them.
+         (simple-service 'mtp udev-service-type (list libmtp))
+
          ;; The D-Bus clique.
          (avahi-service)
          (wicd-service)
diff --git a/gnu/services/messaging.scm b/gnu/services/messaging.scm
new file mode 100644
index 0000000000..0b5aa1fae8
--- /dev/null
+++ b/gnu/services/messaging.scm
@@ -0,0 +1,726 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2017 Clément Lassieur <clement@lassieur.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 services messaging)
+  #:use-module (gnu packages messaging)
+  #:use-module (gnu packages admin)
+  #:use-module (gnu services)
+  #:use-module (gnu services shepherd)
+  #:use-module (gnu services configuration)
+  #:use-module (gnu system shadow)
+  #:use-module (guix gexp)
+  #:use-module (guix records)
+  #:use-module (guix packages)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-35)
+  #:use-module (ice-9 match)
+  #:export (prosody-service-type
+            prosody-configuration
+            opaque-prosody-configuration
+
+            virtualhost-configuration
+            int-component-configuration
+            ext-component-configuration
+
+            mod-muc-configuration
+            ssl-configuration
+
+            %default-modules-enabled))
+
+;;; Commentary:
+;;;
+;;; Messaging services.
+;;;
+;;; Code:
+
+(define (id ctx . parts)
+  (datum->syntax ctx (apply symbol-append (map syntax->datum parts))))
+
+(define-syntax define-maybe
+  (lambda (x)
+    (syntax-case x ()
+      ((_ stem)
+       (with-syntax
+           ((stem?                (id #'stem #'stem #'?))
+            (maybe-stem?          (id #'stem #'maybe- #'stem #'?))
+            (serialize-stem       (id #'stem #'serialize- #'stem))
+            (serialize-maybe-stem (id #'stem #'serialize-maybe- #'stem)))
+         #'(begin
+             (define (maybe-stem? val)
+               (or (eq? val 'disabled) (stem? val)))
+             (define (serialize-maybe-stem field-name val)
+               (when (stem? val) (serialize-stem field-name val)))))))))
+
+(define-syntax define-all-configurations
+  (lambda (stx)
+    (define (make-pred arg)
+      (lambda (field target)
+        (and (memq (syntax->datum target) `(common ,arg)) field)))
+    (syntax-case stx ()
+      ((_ stem (field (field-type def) doc target) ...)
+       (with-syntax (((new-field-type ...)
+                      (map (lambda (field-type target)
+                             (if (and (eq? 'common (syntax->datum target))
+                                      (not (string-prefix?
+                                            "maybe-"
+                                            (symbol->string
+                                             (syntax->datum field-type)))))
+                                 (id #'stem #'maybe- field-type) field-type))
+                           #'(field-type ...) #'(target ...)))
+                     ((new-def ...)
+                      (map (lambda (def target)
+                             (if (eq? 'common (syntax->datum target))
+                                 #''disabled def))
+                           #'(def ...) #'(target ...)))
+                     ((new-doc ...)
+                      (map (lambda (doc target)
+                             (if (eq? 'common (syntax->datum target))
+                                 "" doc))
+                           #'(doc ...) #'(target ...))))
+         #`(begin
+             (define common-fields
+               '(#,@(filter-map (make-pred #f) #'(field ...) #'(target ...))))
+             (define-configuration prosody-configuration
+               #,@(filter-map (make-pred 'global)
+                              #'((field (field-type def) doc) ...)
+                              #'(target ...)))
+             (define-configuration virtualhost-configuration
+               #,@(filter-map (make-pred 'virtualhost)
+                              #'((field (new-field-type new-def) new-doc) ...)
+                              #'(target ...)))
+             (define-configuration int-component-configuration
+               #,@(filter-map (make-pred 'int-component)
+                              #'((field (new-field-type new-def) new-doc) ...)
+                              #'(target ...)))
+             (define-configuration ext-component-configuration
+               #,@(filter-map (make-pred 'ext-component)
+                              #'((field (new-field-type new-def) new-doc) ...)
+                              #'(target ...)))))))))
+
+(define (uglify-field-name field-name)
+  (let ((str (symbol->string field-name)))
+    (string-join (string-split (if (string-suffix? "?" str)
+                                   (substring str 0 (1- (string-length str)))
+                                   str)
+                               #\-)
+                 "_")))
+
+(define (serialize-field field-name val)
+  (format #t "~a = ~a;\n" (uglify-field-name field-name) val))
+(define (serialize-field-list field-name val)
+  (serialize-field field-name
+                   (with-output-to-string
+                     (lambda ()
+                       (format #t "{\n")
+                       (for-each (lambda (x)
+                                   (format #t "~a;\n" x))
+                                 val)
+                       (format #t "}")))))
+
+(define (serialize-boolean field-name val)
+  (serialize-field field-name (if val "true" "false")))
+(define-maybe boolean)
+
+(define (string-or-boolean? val)
+  (or (string? val) (boolean? val)))
+(define (serialize-string-or-boolean field-name val)
+  (if (string? val)
+      (serialize-string field-name val)
+      (serialize-boolean field-name val)))
+
+(define (non-negative-integer? val)
+  (and (exact-integer? val) (not (negative? val))))
+(define (serialize-non-negative-integer field-name val)
+  (serialize-field field-name val))
+(define-maybe non-negative-integer)
+
+(define (non-negative-integer-list? val)
+  (and (list? val) (and-map non-negative-integer? val)))
+(define (serialize-non-negative-integer-list field-name val)
+  (serialize-field-list field-name val))
+(define-maybe non-negative-integer-list)
+
+(define (enclose-quotes s)
+  (format #f "\"~a\"" s))
+(define (serialize-string field-name val)
+  (serialize-field field-name (enclose-quotes val)))
+(define-maybe string)
+
+(define (string-list? val)
+  (and (list? val)
+       (and-map (lambda (x)
+                  (and (string? x) (not (string-index x #\,))))
+                val)))
+(define (serialize-string-list field-name val)
+  (serialize-field-list field-name (map enclose-quotes val)))
+(define-maybe string-list)
+
+(define (module-list? val)
+  (string-list? val))
+(define (serialize-module-list field-name val)
+  (serialize-string-list field-name (cons "posix" val)))
+(define-maybe module-list)
+
+(define (file-name? val)
+  (and (string? val)
+       (string-prefix? "/" val)))
+(define (serialize-file-name field-name val)
+  (serialize-string field-name val))
+(define-maybe file-name)
+
+(define (file-name-list? val)
+  (and (list? val) (and-map file-name? val)))
+(define (serialize-file-name-list field-name val)
+  (serialize-string-list field-name val))
+(define-maybe file-name)
+
+(define-configuration mod-muc-configuration
+  (name
+   (string "Prosody Chatrooms")
+   "The name to return in service discovery responses.")
+
+  (restrict-room-creation
+   (string-or-boolean #f)
+   "If @samp{#t}, this will only allow admins to create new chatrooms.
+Otherwise anyone can create a room.  The value @samp{\"local\"} restricts room
+creation to users on the service's parent domain.  E.g. @samp{user@@example.com}
+can create rooms on @samp{rooms.example.com}.  The value @samp{\"admin\"}
+restricts to service administrators only.")
+
+  (max-history-messages
+   (non-negative-integer 20)
+   "Maximum number of history messages that will be sent to the member that has
+just joined the room."))
+(define (serialize-mod-muc-configuration field-name val)
+  (serialize-configuration val mod-muc-configuration-fields))
+(define-maybe mod-muc-configuration)
+
+(define-configuration ssl-configuration
+  (protocol
+   (maybe-string 'disabled)
+   "This determines what handshake to use.")
+
+  (key
+   (file-name "/etc/prosody/certs/key.pem")
+   "Path to your private key file, relative to @code{/etc/prosody}.")
+
+  (certificate
+   (file-name "/etc/prosody/certs/cert.pem")
+   "Path to your certificate file, relative to @code{/etc/prosody}.")
+
+  (capath
+   (file-name "/etc/ssl/certs")
+   "Path to directory containing root certificates that you wish Prosody to
+trust when verifying the certificates of remote servers.")
+
+  (cafile
+   (maybe-file-name 'disabled)
+   "Path to a file containing root certificates that you wish Prosody to trust.
+Similar to @code{capath} but with all certificates concatenated together.")
+
+  (verify
+   (maybe-string-list 'disabled)
+   "A list of verification options (these mostly map to OpenSSL's
+@code{set_verify()} flags).")
+
+  (options
+   (maybe-string-list 'disabled)
+   "A list of general options relating to SSL/TLS.  These map to OpenSSL's
+@code{set_options()}.  For a full list of options available in LuaSec, see the
+LuaSec source.")
+
+  (depth
+   (maybe-non-negative-integer 'disabled)
+   "How long a chain of certificate authorities to check when looking for a
+trusted root certificate.")
+
+  (ciphers
+   (maybe-string 'disabled)
+   "An OpenSSL cipher string.  This selects what ciphers Prosody will offer to
+clients, and in what order.")
+
+  (dhparam
+   (maybe-file-name 'disabled)
+   "A path to a file containing parameters for Diffie-Hellman key exchange.  You
+can create such a file with:
+@code{openssl dhparam -out /etc/prosody/certs/dh-2048.pem 2048}")
+
+  (curve
+   (maybe-string 'disabled)
+   "Curve for Elliptic curve Diffie-Hellman. Prosody's default is
+@samp{\"secp384r1\"}.")
+
+  (verifyext
+   (maybe-string-list 'disabled)
+   "A list of \"extra\" verification options.")
+
+  (password
+   (maybe-string 'disabled)
+   "Password for encrypted private keys."))
+(define (serialize-ssl-configuration field-name val)
+  (format #t "ssl = {\n")
+  (serialize-configuration val ssl-configuration-fields)
+  (format #t "};\n"))
+(define-maybe ssl-configuration)
+
+(define %default-modules-enabled
+  '("roster"
+    "saslauth"
+    "tls"
+    "dialback"
+    "disco"
+    "private"
+    "vcard"
+    "version"
+    "uptime"
+    "time"
+    "ping"
+    "pep"
+    "register"
+    "admin_adhoc"))
+
+;; Guile bug.  Use begin wrapper, because otherwise virtualhost-configuration
+;; is assumed to be a function.  See
+;; https://www.gnu.org/software/guile/manual/html_node/R6RS-Incompatibilities.html
+(begin
+  (define (virtualhost-configuration-list? val)
+    (and (list? val) (and-map virtualhost-configuration? val)))
+  (define (serialize-virtualhost-configuration-list l)
+    (for-each
+     (lambda (val) (serialize-virtualhost-configuration val)) l))
+
+  (define (int-component-configuration-list? val)
+    (and (list? val) (and-map int-component-configuration? val)))
+  (define (serialize-int-component-configuration-list l)
+    (for-each
+     (lambda (val) (serialize-int-component-configuration val)) l))
+
+  (define (ext-component-configuration-list? val)
+    (and (list? val) (and-map ext-component-configuration? val)))
+  (define (serialize-ext-component-configuration-list l)
+    (for-each
+     (lambda (val) (serialize-ext-component-configuration val)) l))
+
+  (define-all-configurations prosody-configuration
+    (prosody
+     (package prosody)
+     "The Prosody package."
+     global)
+
+    (data-path
+     (file-name "/var/lib/prosody")
+     "Location of the Prosody data storage directory.  See
+@url{http://prosody.im/doc/configure}."
+     global)
+
+    (plugin-paths
+     (file-name-list '())
+     "Additional plugin directories.  They are searched in all the specified
+paths in order.  See @url{http://prosody.im/doc/plugins_directory}."
+     global)
+
+    (admins
+     (string-list '())
+     "This is a list of accounts that are admins for the server.  Note that you
+must create the accounts separately.  See @url{http://prosody.im/doc/admins} and
+@url{http://prosody.im/doc/creating_accounts}.
+Example: @code{(admins '(\"user1@@example.com\" \"user2@@example.net\"))}"
+     common)
+
+    (use-libevent?
+     (boolean #f)
+     "Enable use of libevent for better performance under high load.  See
+@url{http://prosody.im/doc/libevent}."
+     common)
+
+    (modules-enabled
+     (module-list %default-modules-enabled)
+     "This is the list of modules Prosody will load on startup.  It looks for
+@code{mod_modulename.lua} in the plugins folder, so make sure that exists too.
+Documentation on modules can be found at: @url{http://prosody.im/doc/modules}.
+Defaults to @samp{%default-modules-enabled}."
+     common)
+
+    (modules-disabled
+     (string-list '())
+     "@samp{\"offline\"}, @samp{\"c2s\"} and @samp{\"s2s\"} are auto-loaded, but
+should you want to disable them then add them to this list."
+     common)
+
+    (groups-file
+     (file-name "/var/lib/prosody/sharedgroups.txt")
+     "Path to a text file where the shared groups are defined.  If this path is
+empty then @samp{mod_groups} does nothing.  See
+@url{http://prosody.im/doc/modules/mod_groups}."
+     common)
+
+    (allow-registration?
+     (boolean #f)
+     "Disable account creation by default, for security.  See
+@url{http://prosody.im/doc/creating_accounts}."
+     common)
+
+    (ssl
+     (maybe-ssl-configuration (ssl-configuration))
+     "These are the SSL/TLS-related settings.  Most of them are disabled so to
+use Prosody's defaults.  If you do not completely understand these options, do
+not add them to your config, it is easy to lower the security of your server
+using them.  See @url{http://prosody.im/doc/advanced_ssl_config}."
+     common)
+
+    (c2s-require-encryption?
+     (boolean #f)
+     "Whether to force all client-to-server connections to be encrypted or not.
+See @url{http://prosody.im/doc/modules/mod_tls}."
+     common)
+
+    (s2s-require-encryption?
+     (boolean #f)
+     "Whether to force all server-to-server connections to be encrypted or not.
+See @url{http://prosody.im/doc/modules/mod_tls}."
+     common)
+
+    (s2s-secure-auth?
+     (boolean #f)
+     "Whether to require encryption and certificate authentication.  This
+provides ideal security, but requires servers you communicate with to support
+encryption AND present valid, trusted certificates.  See
+@url{http://prosody.im/doc/s2s#security}."
+     common)
+
+    (s2s-insecure-domains
+     (string-list '())
+     "Many servers don't support encryption or have invalid or self-signed
+certificates.  You can list domains here that will not be required to
+authenticate using certificates.  They will be authenticated using DNS.  See
+@url{http://prosody.im/doc/s2s#security}."
+     common)
+
+    (s2s-secure-domains
+     (string-list '())
+     "Even if you leave @code{s2s-secure-auth?} disabled, you can still require
+valid certificates for some domains by specifying a list here.  See
+@url{http://prosody.im/doc/s2s#security}."
+     common)
+
+    (authentication
+     (string "internal_plain")
+     "Select the authentication backend to use.  The default provider stores
+passwords in plaintext and uses Prosody's configured data storage to store the
+authentication data.  If you do not trust your server please see
+@url{http://prosody.im/doc/modules/mod_auth_internal_hashed} for information
+about using the hashed backend.  See also
+@url{http://prosody.im/doc/authentication}"
+     common)
+
+    ;; TODO: Handle more complicated log structures.
+    (log
+     (maybe-string "*syslog")
+     "Set logging options.  Advanced logging configuration is not yet supported
+by the GuixSD Prosody Service.  See @url{http://prosody.im/doc/logging}."
+     common)
+
+    (pidfile
+     (file-name "/var/run/prosody/prosody.pid")
+     "File to write pid in.  See @url{http://prosody.im/doc/modules/mod_posix}."
+     global)
+
+    (virtualhosts
+     (virtualhost-configuration-list
+      (list (virtualhost-configuration
+             (domain "localhost"))))
+     "A host in Prosody is a domain on which user accounts can be created.  For
+example if you want your users to have addresses like
+@samp{\"john.smith@@example.com\"} then you need to add a host
+@samp{\"example.com\"}.  All options in this list will apply only to this host.
+
+Note: the name \"virtual\" host is used in configuration to avoid confusion with
+the actual physical host that Prosody is installed on.  A single Prosody
+instance can serve many domains, each one defined as a VirtualHost entry in
+Prosody's configuration.  Conversely a server that hosts a single domain would
+have just one VirtualHost entry.
+
+See @url{http://prosody.im/doc/configure#virtual_host_settings}."
+     global)
+
+    (int-components
+     (int-component-configuration-list '())
+     "Components are extra services on a server which are available to clients,
+usually on a subdomain of the main server (such as
+@samp{\"mycomponent.example.com\"}).  Example components might be chatroom
+servers, user directories, or gateways to other protocols.
+
+Internal components are implemented with Prosody-specific plugins.  To add an
+internal component, you simply fill the hostname field, and the plugin you wish
+to use for the component.
+
+See @url{http://prosody.im/doc/components}."
+     global)
+
+    (ext-components
+     (ext-component-configuration-list '())
+     "External components use XEP-0114, which most standalone components
+support.  To add an external component, you simply fill the hostname field.  See
+@url{http://prosody.im/doc/components}."
+     global)
+
+    (component-secret
+     (string (configuration-missing-field 'ext-component 'component-secret))
+     "Password which the component will use to log in."
+     ext-component)
+
+    (component-ports
+     (non-negative-integer-list '(5347))
+     "Port(s) Prosody listens on for component connections."
+     global)
+
+    (component-interface
+     (string "127.0.0.1")
+     "Interface Prosody listens on for component connections."
+     global)
+
+    (domain
+     (string (configuration-missing-field 'virtualhost 'domain))
+     "Domain you wish Prosody to serve."
+     virtualhost)
+
+    (hostname
+     (string (configuration-missing-field 'int-component 'hostname))
+     "Hostname of the component."
+     int-component)
+
+    (plugin
+     (string (configuration-missing-field 'int-component 'plugin))
+     "Plugin you wish to use for the component."
+     int-component)
+
+    (mod-muc
+     (maybe-mod-muc-configuration 'disabled)
+     "Multi-user chat (MUC) is Prosody's module for allowing you to create
+hosted chatrooms/conferences for XMPP users.
+
+General information on setting up and using multi-user chatrooms can be found
+in the \"Chatrooms\" documentation (@url{http://prosody.im/doc/chatrooms}),
+which you should read if you are new to XMPP chatrooms.
+
+See also @url{http://prosody.im/doc/modules/mod_muc}."
+     int-component)
+
+    (hostname
+     (string (configuration-missing-field 'ext-component 'hostname))
+     "Hostname of the component."
+     ext-component)))
+
+;; Serialize Virtualhost line first.
+(define (serialize-virtualhost-configuration config)
+  (define (rest? field)
+    (not (memq (configuration-field-name field)
+               '(domain))))
+  (let ((domain (virtualhost-configuration-domain config))
+        (rest (filter rest? virtualhost-configuration-fields)))
+    (format #t "VirtualHost \"~a\"\n" domain)
+    (serialize-configuration config rest)))
+
+;; Serialize Component line first.
+(define (serialize-int-component-configuration config)
+  (define (rest? field)
+    (not (memq (configuration-field-name field)
+               '(hostname plugin))))
+  (let ((hostname (int-component-configuration-hostname config))
+        (plugin (int-component-configuration-plugin config))
+        (rest (filter rest? int-component-configuration-fields)))
+    (format #t "Component \"~a\" \"~a\"\n" hostname plugin)
+    (serialize-configuration config rest)))
+
+;; Serialize Component line first.
+(define (serialize-ext-component-configuration config)
+  (define (rest? field)
+    (not (memq (configuration-field-name field)
+               '(hostname))))
+  (let ((hostname (ext-component-configuration-hostname config))
+        (rest (filter rest? ext-component-configuration-fields)))
+    (format #t "Component \"~a\"\n" hostname)
+    (serialize-configuration config rest)))
+
+;; Serialize virtualhosts and components last.
+(define (serialize-prosody-configuration config)
+  (define (rest? field)
+    (not (memq (configuration-field-name field)
+               '(virtualhosts int-components ext-components))))
+  (let ((rest (filter rest? prosody-configuration-fields)))
+    (serialize-configuration config rest))
+  (serialize-virtualhost-configuration-list
+   (prosody-configuration-virtualhosts config))
+  (serialize-int-component-configuration-list
+   (prosody-configuration-int-components config))
+  (serialize-ext-component-configuration-list
+   (prosody-configuration-ext-components config)))
+
+(define-configuration opaque-prosody-configuration
+  (prosody
+   (package prosody)
+   "The prosody package.")
+
+  (prosody.cfg.lua
+   (string (configuration-missing-field 'opaque-prosody-configuration
+                                        'prosody.cfg.lua))
+   "The contents of the @code{prosody.cfg.lua} to use."))
+
+(define (prosody-shepherd-service config)
+  "Return a <shepherd-service> for Prosody with CONFIG."
+  (let* ((prosody (if (opaque-prosody-configuration? config)
+                      (opaque-prosody-configuration-prosody config)
+                      (prosody-configuration-prosody config)))
+         (prosodyctl-bin (file-append prosody "/bin/prosodyctl"))
+         (prosodyctl-action (lambda args
+                              #~(lambda _
+                                  (zero? (system* #$prosodyctl-bin #$@args))))))
+    (list (shepherd-service
+           (documentation "Run the Prosody XMPP server")
+           (provision '(prosody))
+           (requirement '(networking syslogd user-processes))
+           (start (prosodyctl-action "start"))
+           (stop (prosodyctl-action "stop"))))))
+
+(define %prosody-accounts
+  (list (user-group (name "prosody") (system? #t))
+        (user-account
+         (name "prosody")
+         (group "prosody")
+         (system? #t)
+         (comment "Prosody daemon user")
+         (home-directory "/var/empty")
+         (shell (file-append shadow "/sbin/nologin")))))
+
+(define (prosody-activation config)
+  "Return the activation gexp for CONFIG."
+  (let* ((config-dir "/etc/prosody")
+         (default-certs-dir "/etc/prosody/certs")
+         (data-path (prosody-configuration-data-path config))
+         (pidfile-dir (dirname (prosody-configuration-pidfile config)))
+         (config-str
+          (if (opaque-prosody-configuration? config)
+              (opaque-prosody-configuration-prosody.cfg.lua config)
+              (with-output-to-string
+                (lambda ()
+                  (serialize-prosody-configuration config)))))
+         (config-file (plain-file "prosody.cfg.lua" config-str)))
+    #~(begin
+        (define %user (getpw "prosody"))
+
+        (mkdir-p #$config-dir)
+        (chown #$config-dir (passwd:uid %user) (passwd:gid %user))
+        (copy-file #$config-file (string-append #$config-dir
+                                                "/prosody.cfg.lua"))
+
+        (mkdir-p #$default-certs-dir)
+        (chown #$default-certs-dir (passwd:uid %user) (passwd:gid %user))
+        (chmod #$default-certs-dir #o750)
+
+        (mkdir-p #$data-path)
+        (chown #$data-path (passwd:uid %user) (passwd:gid %user))
+        (chmod #$data-path #o750)
+
+        (mkdir-p #$pidfile-dir)
+        (chown #$pidfile-dir (passwd:uid %user) (passwd:gid %user)))))
+
+(define prosody-service-type
+  (service-type (name 'prosody)
+                (extensions
+                 (list (service-extension shepherd-root-service-type
+                                          prosody-shepherd-service)
+                       (service-extension account-service-type
+                                          (const %prosody-accounts))
+                       (service-extension activation-service-type
+                                          prosody-activation)))))
+
+;; A little helper to make it easier to document all those fields.
+(define (generate-documentation)
+  (define documentation
+    `((prosody-configuration
+       ,prosody-configuration-fields
+       (ssl ssl-configuration)
+       (virtualhosts virtualhost-configuration)
+       (int-components int-component-configuration)
+       (ext-components ext-component-configuration))
+      (ssl-configuration ,ssl-configuration-fields)
+      (int-component-configuration ,int-component-configuration-fields
+                                   (mod-muc mod-muc-configuration))
+      (ext-component-configuration ,ext-component-configuration-fields)
+      (mod-muc-configuration ,mod-muc-configuration-fields)
+      (virtualhost-configuration ,virtualhost-configuration-fields)
+      (opaque-prosody-configuration ,opaque-prosody-configuration-fields)))
+  (define (generate configuration-name)
+    (match (assq-ref documentation configuration-name)
+      ((fields . sub-documentation)
+       (format #t "\nAvailable @code{~a} fields are:\n\n" configuration-name)
+       (when (memq configuration-name
+                   '(virtualhost-configuration
+                     int-component-configuration
+                     ext-component-configuration))
+         (format #t "all these @code{prosody-configuration} fields: ~a, plus:\n"
+                 (string-join (map (lambda (s)
+                                     (format #f "@code{~a}" s)) common-fields)
+                              ", ")))
+       (for-each
+        (lambda (f)
+          (let ((field-name (configuration-field-name f))
+                (field-type (configuration-field-type f))
+                (field-docs (string-trim-both
+                             (configuration-field-documentation f)))
+                (default (catch #t
+                           (configuration-field-default-value-thunk f)
+                           (lambda _ 'nope))))
+            (define (escape-chars str chars escape)
+              (with-output-to-string
+                (lambda ()
+                  (string-for-each (lambda (c)
+                                     (when (char-set-contains? chars c)
+                                       (display escape))
+                                     (display c))
+                                   str))))
+            (define (show-default? val)
+              (or (string? default) (number? default) (boolean? default)
+                  (and (list? val) (and-map show-default? val))))
+            (format #t "@deftypevr {@code{~a} parameter} ~a ~a\n~a\n"
+                    configuration-name field-type field-name field-docs)
+            (when (show-default? default)
+              (format #t "Defaults to @samp{~a}.\n"
+                      (escape-chars (format #f "~s" default)
+                                    (char-set #\@ #\{ #\})
+                                    #\@)))
+            (for-each generate (or (assq-ref sub-documentation field-name) '()))
+            (format #t "@end deftypevr\n\n")))
+        (filter (lambda (f)
+                  (not (string=? "" (configuration-field-documentation f))))
+                fields)))))
+  (generate 'prosody-configuration)
+  (format #t "It could be that you just want to get a @code{prosody.cfg.lua}
+up and running.  In that case, you can pass an
+@code{opaque-prosody-configuration} record as the value of
+@code{prosody-service-type}.  As its name indicates, an opaque configuration
+does not have easy reflective capabilities.")
+  (generate 'opaque-prosody-configuration)
+  (format #t "For example, if your @code{prosody.cfg.lua} is just the empty
+string, you could instantiate a prosody service like this:
+
+@example
+(service prosody-service-type
+         (opaque-prosody-configuration
+          (prosody.cfg.lua \"\")))
+@end example"))
diff --git a/gnu/services/networking.scm b/gnu/services/networking.scm
index d672ecf687..ac011f1286 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, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 John Darrington <jmd@gnu.org>
@@ -633,7 +633,12 @@ configuration file."
       (let ((file-name "/etc/wicd/dhclient.conf.template.default"))
         (unless (file-exists? file-name)
           (copy-file (string-append #$wicd file-name)
-                     file-name)))))
+                     file-name)))
+
+      ;; Wicd invokes 'wpa_supplicant', which needs this directory for its
+      ;; named socket files.
+      (mkdir-p "/var/run/wpa_supplicant")
+      (chmod "/var/run/wpa_supplicant" #o750)))
 
 (define (wicd-shepherd-service wicd)
   "Return a shepherd service for WICD."
diff --git a/gnu/services/sddm.scm b/gnu/services/sddm.scm
index 5bb58bd6f0..2ebfe22016 100644
--- a/gnu/services/sddm.scm
+++ b/gnu/services/sddm.scm
@@ -220,7 +220,7 @@ Relogin="              (if (sddm-configuration-relogin? config)
    (name "sddm-greeter")
    (auth
     (list
-     ;; Load environment form /etc/environment and ~/.pam_environment
+     ;; Load environment from /etc/environment and ~/.pam_environment
      (pam-entry
       (control "required")
       (module "pam_env.so"))
diff --git a/gnu/services/shepherd.scm b/gnu/services/shepherd.scm
index 3273184b9a..d8d5006abf 100644
--- a/gnu/services/shepherd.scm
+++ b/gnu/services/shepherd.scm
@@ -82,7 +82,7 @@
                     (loop (+ 1 fd))))
 
                 ;; Start shepherd.
-                (execl (string-append #$shepherd "/bin/shepherd")
+                (execl #$(file-append shepherd "/bin/shepherd")
                        "shepherd" "--config" #$shepherd-conf)))))
 
 (define shepherd-root-service-type
diff --git a/gnu/services/web.scm b/gnu/services/web.scm
index 8f6e5bf6b7..db895405a2 100644
--- a/gnu/services/web.scm
+++ b/gnu/services/web.scm
@@ -27,11 +27,12 @@
   #:use-module (gnu packages web)
   #:use-module (guix records)
   #:use-module (guix gexp)
+  #:use-module (srfi srfi-1)
   #:use-module (ice-9 match)
   #:export (nginx-configuration
             nginx-configuration?
-            nginx-vhost-configuration
-            nginx-vhost-configuration?
+            nginx-server-configuration
+            nginx-server-configuration?
             nginx-service
             nginx-service-type))
 
@@ -41,24 +42,24 @@
 ;;;
 ;;; Code:
 
-(define-record-type* <nginx-vhost-configuration>
-  nginx-vhost-configuration make-nginx-vhost-configuration
-  nginx-vhost-configuration?
-  (http-port           nginx-vhost-configuration-http-port
+(define-record-type* <nginx-server-configuration>
+  nginx-server-configuration make-nginx-server-configuration
+  nginx-server-configuration?
+  (http-port           nginx-server-configuration-http-port
                        (default 80))
-  (https-port          nginx-vhost-configuration-https-port
+  (https-port          nginx-server-configuration-https-port
                        (default 443))
-  (server-name         nginx-vhost-configuration-server-name
+  (server-name         nginx-server-configuration-server-name
                        (default (list 'default)))
-  (root                nginx-vhost-configuration-root
+  (root                nginx-server-configuration-root
                        (default "/srv/http"))
-  (index               nginx-vhost-configuration-index
+  (index               nginx-server-configuration-index
                        (default (list "index.html")))
-  (ssl-certificate     nginx-vhost-configuration-ssl-certificate
+  (ssl-certificate     nginx-server-configuration-ssl-certificate
                        (default "/etc/nginx/cert.pem"))
-  (ssl-certificate-key nginx-vhost-configuration-ssl-certificate-key
+  (ssl-certificate-key nginx-server-configuration-ssl-certificate-key
                        (default "/etc/nginx/key.pem"))
-  (server-tokens?      nginx-vhost-configuration-server-tokens?
+  (server-tokens?      nginx-server-configuration-server-tokens?
                        (default #f)))
 
 (define-record-type* <nginx-configuration>
@@ -67,6 +68,7 @@
   (nginx         nginx-configuration-nginx)         ;<package>
   (log-directory nginx-configuration-log-directory) ;string
   (run-directory nginx-configuration-run-directory) ;string
+  (server-blocks nginx-configuration-server-blocks) ;list
   (file          nginx-configuration-file))         ;string | file-like
 
 (define (config-domain-strings names)
@@ -74,8 +76,8 @@
 of domain names."
  (string-join
   (map (match-lambda
-        ('default "_")
-        ((? string? str) str))
+        ('default "_ ")
+        ((? string? str) (string-append str " ")))
        names)))
 
 (define (config-index-strings names)
@@ -83,40 +85,40 @@ of domain names."
 of index files."
  (string-join
   (map (match-lambda
-        ((? string? str) str))
+        ((? string? str) (string-append str " ")))
        names)))
 
-(define (default-nginx-vhost-config vhost)
+(define (default-nginx-server-config server)
   (string-append
    "    server {\n"
-   (if (nginx-vhost-configuration-http-port vhost)
+   (if (nginx-server-configuration-http-port server)
        (string-append "      listen "
-                      (number->string (nginx-vhost-configuration-http-port vhost))
+                      (number->string (nginx-server-configuration-http-port server))
                       ";\n")
        "")
-   (if (nginx-vhost-configuration-https-port vhost)
+   (if (nginx-server-configuration-https-port server)
        (string-append "      listen "
-                      (number->string (nginx-vhost-configuration-https-port vhost))
+                      (number->string (nginx-server-configuration-https-port server))
                       " ssl;\n")
        "")
    "      server_name " (config-domain-strings
-                         (nginx-vhost-configuration-server-name vhost))
+                         (nginx-server-configuration-server-name server))
                         ";\n"
-   (if (nginx-vhost-configuration-ssl-certificate vhost)
+   (if (nginx-server-configuration-ssl-certificate server)
        (string-append "      ssl_certificate "
-                      (nginx-vhost-configuration-ssl-certificate vhost) ";\n")
+                      (nginx-server-configuration-ssl-certificate server) ";\n")
        "")
-   (if (nginx-vhost-configuration-ssl-certificate-key vhost)
+   (if (nginx-server-configuration-ssl-certificate-key server)
        (string-append "      ssl_certificate_key "
-                      (nginx-vhost-configuration-ssl-certificate-key vhost) ";\n")
+                      (nginx-server-configuration-ssl-certificate-key server) ";\n")
        "")
-   "      root " (nginx-vhost-configuration-root vhost) ";\n"
-   "      index " (config-index-strings (nginx-vhost-configuration-index vhost)) ";\n"
-   "      server_tokens " (if (nginx-vhost-configuration-server-tokens? vhost)
+   "      root " (nginx-server-configuration-root server) ";\n"
+   "      index " (config-index-strings (nginx-server-configuration-index server)) ";\n"
+   "      server_tokens " (if (nginx-server-configuration-server-tokens? server)
                               "on" "off") ";\n"
    "    }\n"))
 
-(define (default-nginx-config log-directory run-directory vhost-list)
+(define (default-nginx-config log-directory run-directory server-list)
   (plain-file "nginx.conf"
               (string-append
                "user nginx nginx;\n"
@@ -129,7 +131,7 @@ of index files."
                "    uwsgi_temp_path " run-directory "/uwsgi_temp;\n"
                "    scgi_temp_path " run-directory "/scgi_temp;\n"
                "    access_log " log-directory "/access.log;\n"
-               (let ((http (map default-nginx-vhost-config vhost-list)))
+               (let ((http (map default-nginx-server-config server-list)))
                  (do ((http http (cdr http))
                       (block "" (string-append (car http) "\n" block )))
                      ((null? http) block)))
@@ -148,7 +150,8 @@ of index files."
 
 (define nginx-activation
   (match-lambda
-    (($ <nginx-configuration> nginx log-directory run-directory config-file)
+    (($ <nginx-configuration> nginx log-directory run-directory server-blocks
+                              config-file)
      #~(begin
          (use-modules (guix build utils))
 
@@ -164,17 +167,25 @@ of index files."
          (mkdir-p (string-append #$run-directory "/scgi_temp"))
          ;; Check configuration file syntax.
          (system* (string-append #$nginx "/sbin/nginx")
-                  "-c" #$config-file "-t")))))
+                  "-c" #$(or config-file
+                             (default-nginx-config log-directory
+                               run-directory server-blocks))
+                  "-t")))))
 
 (define nginx-shepherd-service
   (match-lambda
-    (($ <nginx-configuration> nginx log-directory run-directory config-file)
+    (($ <nginx-configuration> nginx log-directory run-directory server-blocks
+                              config-file)
      (let* ((nginx-binary (file-append nginx "/sbin/nginx"))
             (nginx-action
              (lambda args
                #~(lambda _
                    (zero?
-                    (system* #$nginx-binary "-c" #$config-file #$@args))))))
+                    (system* #$nginx-binary "-c"
+                             #$(or config-file
+                                   (default-nginx-config log-directory
+                                     run-directory server-blocks))
+                             #$@args))))))
 
        ;; TODO: Add 'reload' action.
        (list (shepherd-service
@@ -192,14 +203,20 @@ of index files."
                        (service-extension activation-service-type
                                           nginx-activation)
                        (service-extension account-service-type
-                                          (const %nginx-accounts))))))
+                                          (const %nginx-accounts))))
+                (compose concatenate)
+                (extend (lambda (config servers)
+                          (nginx-configuration
+                            (inherit config)
+                            (server-blocks
+                              (append (nginx-configuration-server-blocks config)
+                              servers)))))))
 
 (define* (nginx-service #:key (nginx nginx)
                         (log-directory "/var/log/nginx")
                         (run-directory "/var/run/nginx")
-                        (vhost-list (list (nginx-vhost-configuration)))
-                        (config-file
-                         (default-nginx-config log-directory run-directory vhost-list)))
+                        (server-list '())
+                        (config-file #f))
   "Return a service that runs NGINX, the nginx web server.
 
 The nginx daemon loads its runtime configuration from CONFIG-FILE, stores log
@@ -209,4 +226,5 @@ files in LOG-DIRECTORY, and stores temporary runtime files in RUN-DIRECTORY."
             (nginx nginx)
             (log-directory log-directory)
             (run-directory run-directory)
+            (server-blocks server-list)
             (file config-file))))
diff --git a/gnu/system/grub.scm b/gnu/system/grub.scm
index 4657b06b5f..067b291a5c 100644
--- a/gnu/system/grub.scm
+++ b/gnu/system/grub.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -177,9 +177,9 @@ STORE-MOUNT-POINT is its mount point; these are used to determine where the
 background image and fonts must be searched for.  SYSTEM must be the target
 system string---e.g., \"x86_64-linux\"."
   (define setup-gfxterm-body
-    ;; Intel systems need to be switched into graphics mode, whereas most
-    ;; other modern architectures have no other mode and therefore don't need
-    ;; to be switched.
+    ;; Intel and EFI systems need to be switched into graphics mode, whereas
+    ;; most other modern architectures have no other mode and therefore don't
+    ;; need to be switched.
     (if (string-match "^(x86_64|i[3-6]86)-" system)
         "
   # Leave 'gfxmode' to 'auto'.
@@ -188,6 +188,15 @@ system string---e.g., \"x86_64-linux\"."
   insmod video_bochs
   insmod video_cirrus
   insmod gfxterm
+
+  if [ \"${grub_platform}\" == efi ]; then
+    # This is for (U)EFI systems (these modules are unavailable in the
+    # non-EFI GRUB.)  If we don't load them, GRUB boots in \"blind mode\",
+    # which isn't convenient.
+    insmod efi_gop
+    insmod efi_uga
+  fi
+
   terminal_output gfxterm
 "
         ""))
diff --git a/gnu/system/install.scm b/gnu/system/install.scm
index dfa003f256..ad234fd9c1 100644
--- a/gnu/system/install.scm
+++ b/gnu/system/install.scm
@@ -255,8 +255,8 @@ the user's target storage device rather than on the RAM disk."
                     (persistent? #f)
                     (max-database-size (* 5 (expt 2 20)))))) ;5 MiB
 
-(define (installation-services)
-  "Return the list services for the installation image."
+(define %installation-services
+  ;; List of services of the installation system.
   (let ((motd (plain-file "motd" "
 Welcome to the installation of the Guix System Distribution!
 
@@ -377,8 +377,7 @@ Use Alt-F2 for documentation.
                   (home-directory "/home/guest"))))
 
     (issue %issue)
-
-    (services (installation-services))
+    (services %installation-services)
 
     ;; We don't need setuid programs so pass the empty list so we don't pull
     ;; additional programs here.
@@ -393,6 +392,7 @@ Use Alt-F2 for documentation.
                      grub                  ;mostly so xrefs to its manual work
                      cryptsetup
                      mdadm
+                     dosfstools         ;mkfs.fat, for the UEFI boot partition
                      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-initrd.scm b/gnu/system/linux-initrd.scm
index 174239a566..4a753cdadb 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -29,6 +29,7 @@
                 #:select (derivation->output-path))
   #:use-module (guix modules)
   #:use-module (gnu packages compression)
+  #:use-module (gnu packages disk)
   #:use-module (gnu packages linux)
   #:use-module (gnu packages guile)
   #:use-module ((gnu packages make-bootstrap)
@@ -193,6 +194,12 @@ loaded at boot time in the order in which they appear."
       ,@(if (find (file-system-type-predicate "9p") file-systems)
             virtio-9p-modules
             '())
+      ,@(if (find (file-system-type-predicate "vfat") file-systems)
+            '("nls_iso8859-1")
+            '())
+      ,@(if (find (file-system-type-predicate "btrfs") file-systems)
+            '("btrfs")
+            '())
       ,@(if volatile-root?
             '("fuse")
             '())
@@ -205,6 +212,14 @@ loaded at boot time in the order in which they appear."
                   file-systems)
             (list e2fsck/static)
             '())
+      ,@(if (find (lambda (fs)
+                    (string-suffix? "fat" (file-system-type fs)))
+                  file-systems)
+            (list fatfsck/static)
+            '())
+      ,@(if (find (file-system-type-predicate "btrfs") file-systems)
+            (list btrfs-progs/static)
+            '())
       ,@(if volatile-root?
             (list unionfs-fuse/static)
             '())))
diff --git a/gnu/tests/install.scm b/gnu/tests/install.scm
index 4779b80e94..ae54154c5c 100644
--- a/gnu/tests/install.scm
+++ b/gnu/tests/install.scm
@@ -36,7 +36,8 @@
   #:export (%test-installed-os
             %test-separate-store-os
             %test-raid-root-os
-            %test-encrypted-os))
+            %test-encrypted-os
+            %test-btrfs-root-os))
 
 ;;; Commentary:
 ;;;
@@ -518,4 +519,78 @@ build (current-guix) and then store a couple of full system images.")
       (run-basic-test %encrypted-root-os command "encrypted-root-os"
                       #:initialization enter-luks-passphrase)))))
 
+
+;;;
+;;; Btrfs root file system.
+;;;
+
+(define-os-with-source (%btrfs-root-os %btrfs-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 "my-root")
+                          (title 'label)
+                          (mount-point "/")
+                          (type "btrfs"))
+                        %base-file-systems))
+    (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 %btrfs-root-installation-script
+  ;; Shell script of a simple installation.
+  "\
+. /etc/profile
+set -e -x
+guix --version
+
+export GUIX_BUILD_OPTIONS=--no-grafts
+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.btrfs -L my-root /dev/vdb2
+mount /dev/vdb2 /mnt
+btrfs subvolume create /mnt/home
+herd start cow-store /mnt
+mkdir /mnt/etc
+cp /etc/target-config.scm /mnt/etc/config.scm
+guix system build /mnt/etc/config.scm
+guix system init /mnt/etc/config.scm /mnt --no-substitutes
+sync
+reboot\n")
+
+(define %test-btrfs-root-os
+  (system-test
+   (name "btrfs-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 %btrfs-root-os
+                                               %btrfs-root-os-source
+                                               #:script
+                                               %btrfs-root-installation-script))
+                         (command (qemu-command/writable-image image)))
+      (run-basic-test %btrfs-root-os command "btrfs-root-os")))))
+
 ;;; install.scm ends here
diff --git a/gnu/tests/nfs.scm b/gnu/tests/nfs.scm
new file mode 100644
index 0000000000..1f28f5a5b8
--- /dev/null
+++ b/gnu/tests/nfs.scm
@@ -0,0 +1,131 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2016 John Darrington <jmd@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 tests nfs)
+  #:use-module (gnu tests)
+  #:use-module (gnu system)
+  #:use-module (gnu system grub)
+  #:use-module (gnu system file-systems)
+  #:use-module (gnu system shadow)
+  #:use-module (gnu system vm)
+  #:use-module (gnu services)
+  #:use-module (gnu services base)
+  #:use-module (gnu services nfs)
+  #:use-module (gnu services networking)
+  #:use-module (gnu packages onc-rpc)
+  #:use-module (guix gexp)
+  #:use-module (guix store)
+  #:use-module (guix monads)
+  #:export (%test-nfs))
+
+(define %base-os
+  (operating-system
+    (host-name "olitupmok")
+    (timezone "Europe/Berlin")
+    (locale "en_US.UTF-8")
+
+    (bootloader (grub-configuration (device "/dev/sdX")))
+    (file-systems %base-file-systems)
+    (users %base-user-accounts)
+    (packages (cons*
+               rpcbind
+               %base-packages))
+    (services (cons*
+               (service rpcbind-service-type
+                        (rpcbind-configuration))
+               (dhcp-client-service)
+               %base-services))))
+
+(define (run-nfs-test name socket)
+  "Run a test of an OS running RPC-SERVICE, which should create SOCKET."
+  (mlet* %store-monad ((os ->   (marionette-operating-system
+                                 %base-os
+                                 #:imported-modules '((gnu services herd)
+                                                      (guix combinators))))
+                       (command (system-qemu-image/shared-store-script
+                                 os #:graphic? #f)))
+    (define test
+      (with-imported-modules '((gnu build marionette))
+        #~(begin
+            (use-modules (gnu build marionette)
+                         (srfi srfi-64))
+
+            (define marionette
+              (make-marionette (list #$command)))
+
+            (define (wait-for-socket file)
+              ;; Wait until SOCKET  exists in the guest
+              (marionette-eval
+               `(let loop ((i 10))
+                  (cond ((and (file-exists? ,file)
+                              (eq? 'socket (stat:type (stat ,file))))
+                         #t)
+                        ((> i 0)
+                         (sleep 1)
+                         (loop (- i 1)))
+                        (else
+                         (error "Socket didn't show up: " ,file))))
+               marionette))
+
+            (mkdir #$output)
+            (chdir #$output)
+
+            (test-begin "rpc-daemon")
+
+            ;; Wait for the rpcbind daemon to be up and running.
+            (test-eq "RPC service running"
+              'running!
+              (marionette-eval
+               '(begin
+                  (use-modules (gnu services herd))
+                  (start-service 'rpcbind-daemon)
+                  'running!)
+               marionette))
+
+            ;; Check the socket file and that the service is still running.
+            (test-assert "RPC socket exists"
+              (and
+                (wait-for-socket #$socket)
+                (marionette-eval
+                 '(begin
+                    (use-modules (gnu services herd)
+                                 (srfi srfi-1))
+
+                    (live-service-running
+                     (find (lambda (live)
+                             (memq 'rpcbind-daemon
+                                   (live-service-provision live)))
+                           (current-services))))
+                 marionette)))
+
+            (test-assert "Probe RPC daemon"
+              (marionette-eval
+               '(zero? (system* "rpcinfo" "-p"))
+               marionette))
+
+            (test-end)
+            (exit (= (test-runner-fail-count (test-runner-current)) 0)))))
+
+    (gexp->derivation name test)))
+
+(define %test-nfs
+  (system-test
+   (name "nfs")
+   (description "Test some things related to NFS.")
+   (value (run-nfs-test name "/var/run/rpcbind.sock"))))
diff --git a/graph.js b/graph.js
new file mode 100644
index 0000000000..ad8279395d
--- /dev/null
+++ b/graph.js
@@ -0,0 +1,129 @@
+// GNU Guix --- Functional package management for GNU
+// Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
+//
+// 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/>.
+
+var outerRadius = Math.max(nodeArray.length * 15, 500) / 2,
+    innerRadius = outerRadius - Math.min(nodeArray.length * 5, 200),
+    width = outerRadius * 2,
+    height = outerRadius * 2,
+    colors = d3.scale.category20c(),
+    matrix = [];
+
+function neighborsOf (node) {
+    return links.filter(function (e) {
+        return e.source === node;
+    }).map(function (e) {
+       return e.target;
+    });
+}
+
+function zoomed () {
+    zoomer.attr("transform",
+                "translate(" + d3.event.translate + ")" +
+                "scale(" + d3.event.scale + ")");
+}
+
+function fade (opacity, root) {
+    return function (g, i) {
+        root.selectAll("g path.chord")
+            .filter(function (d) {
+                return d.source.index != i && d.target.index != i;
+            })
+            .transition()
+            .style("opacity", opacity);
+    };
+}
+
+// Now that we have all nodes in an object we can replace each reference
+// with the actual node object.
+links.forEach(function (link) {
+  link.target = nodes[link.target];
+  link.source = nodes[link.source];
+});
+
+// Construct a square matrix for package dependencies
+nodeArray.forEach(function (d, index, arr) {
+    var source = index,
+        row = matrix[source];
+    if (!row) {
+        row = matrix[source] = [];
+        for (var i = -1; ++i < arr.length;) row[i] = 0;
+    }
+    neighborsOf(d).forEach(function (d) { row[d.index]++; });
+});
+
+// chord layout
+var chord = d3.layout.chord()
+    .padding(0.01)
+    .sortSubgroups(d3.descending)
+    .sortChords(d3.descending)
+    .matrix(matrix);
+
+var arc = d3.svg.arc()
+    .innerRadius(innerRadius)
+    .outerRadius(innerRadius + 20);
+
+var zoom = d3.behavior.zoom()
+    .scaleExtent([0.1, 10])
+    .on("zoom", zoomed);
+
+var svg = d3.select("body").append("svg")
+    .attr("width", "100%")
+    .attr("height", "100%")
+    .attr('viewBox', '0 0 ' + Math.min(width, height) + ' ' + Math.min(width, height))
+    .attr('preserveAspectRatio', 'xMinYMin')
+    .call(zoom);
+
+var zoomer = svg.append("g");
+
+var container = zoomer.append("g")
+    .attr("transform", "translate(" + outerRadius + "," + outerRadius + ")");
+
+// Group for arcs and labels
+var g = container.selectAll(".group")
+    .data(chord.groups)
+    .enter().append("g")
+    .attr("class", "group")
+    .on("mouseout", fade(1, container))
+    .on("mouseover", fade(0.1, container));
+
+// Draw one segment per package
+g.append("path")
+    .style("fill",   function (d) { return colors(d.index); })
+    .style("stroke", function (d) { return colors(d.index); })
+    .attr("d", arc);
+
+// Add circular labels
+g.append("text")
+    .each(function (d) { d.angle = (d.startAngle + d.endAngle) / 2; })
+    .attr("dy", ".35em")
+    .attr("transform", function (d) {
+      return "rotate(" + (d.angle * 180 / Math.PI - 90) + ")"
+          + "translate(" + (innerRadius + 26) + ")"
+          + (d.angle > Math.PI ? "rotate(180)" : "");
+    })
+    .style("text-anchor", function (d) { return d.angle > Math.PI ? "end" : null; })
+    .text(function (d) { return nodeArray[d.index].label; });
+
+// Draw chords from source to target; color by source.
+container.selectAll(".chord")
+    .data(chord.chords)
+    .enter().append("path")
+    .attr("class", "chord")
+    .style("stroke", function (d) { return d3.rgb(colors(d.source.index)).darker(); })
+    .style("fill", function (d) { return colors(d.source.index); })
+    .attr("d", d3.svg.chord().radius(innerRadius));
diff --git a/guix/build-system/cargo.scm b/guix/build-system/cargo.scm
new file mode 100644
index 0000000000..3582f0e328
--- /dev/null
+++ b/guix/build-system/cargo.scm
@@ -0,0 +1,149 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
+;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
+;;; Copyright © 2016 David Craven <david@craven.ch>
+;;;
+;;; 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 build-system cargo)
+  #:use-module (guix search-paths)
+  #:use-module (guix store)
+  #:use-module (guix utils)
+  #:use-module (guix derivations)
+  #:use-module (guix packages)
+  #:use-module (guix build-system)
+  #:use-module (guix build-system gnu)
+  #:use-module (ice-9 match)
+  #:use-module (srfi srfi-26)
+  #:export (cargo-build-system
+            crate-url
+            crate-url?
+            crate-uri))
+
+(define crate-url "https://crates.io/api/v1/crates/")
+(define crate-url? (cut string-prefix? crate-url <>))
+
+(define (crate-uri name version)
+  "Return a URI string for the crate package hosted at crates.io corresponding
+to NAME and VERSION."
+  (string-append crate-url name "/" version "/download"))
+
+(define (default-cargo)
+  "Return the default Cargo package."
+  ;; Lazily resolve the binding to avoid a circular dependency.
+  (let ((rust (resolve-interface '(gnu packages rust))))
+    (module-ref rust 'cargo)))
+
+(define (default-rustc)
+  "Return the default Rustc package."
+  ;; Lazily resolve the binding to avoid a circular dependency.
+  (let ((rust (resolve-interface '(gnu packages rust))))
+    (module-ref rust 'rustc)))
+
+(define %cargo-build-system-modules
+  ;; Build-side modules imported by default.
+  `((guix build cargo-build-system)
+    ,@%gnu-build-system-modules))
+
+(define* (cargo-build store name inputs
+                      #:key
+                      (tests? #t)
+                      (test-target #f)
+                      (configure-flags #f)
+                      (phases '(@ (guix build cargo-build-system)
+                                  %standard-phases))
+                      (outputs '("out"))
+                      (search-paths '())
+                      (system (%current-system))
+                      (guile #f)
+                      (imported-modules %cargo-build-system-modules)
+                      (modules '((guix build cargo-build-system)
+                                 (guix build utils))))
+  "Build SOURCE using CARGO, and with INPUTS."
+
+  (define builder
+    `(begin
+       (use-modules ,@modules)
+       (cargo-build #:name ,name
+                    #:source ,(match (assoc-ref inputs "source")
+                                (((? derivation? source))
+                                 (derivation->output-path source))
+                                ((source)
+                                 source)
+                                (source
+                                 source))
+                    #:system ,system
+                    #:test-target ,test-target
+                    #:tests? ,tests?
+                    #:phases ,phases
+                    #:outputs %outputs
+                    #:search-paths ',(map search-path-specification->sexp
+                                          search-paths)
+                    #:inputs %build-inputs)))
+
+  (define guile-for-build
+    (match guile
+      ((? package?)
+       (package-derivation store guile system #:graft? #f))
+      (#f                                         ; the default
+       (let* ((distro (resolve-interface '(gnu packages commencement)))
+              (guile  (module-ref distro 'guile-final)))
+         (package-derivation store guile system #:graft? #f)))))
+
+  (build-expression->derivation store name builder
+                                #:inputs inputs
+                                #:system system
+                                #:modules imported-modules
+                                #:outputs (cons "src" outputs)
+                                #:guile-for-build guile-for-build))
+
+(define* (lower name
+                #:key source inputs native-inputs outputs system target
+                (cargo (default-cargo))
+                (rustc (default-rustc))
+                #:allow-other-keys
+                #:rest arguments)
+  "Return a bag for NAME."
+
+  (define private-keywords
+    '(#:source #:target #:cargo #:rustc #:inputs #:native-inputs #:outputs))
+
+  (and (not target) ;; TODO: support cross-compilation
+       (bag
+         (name name)
+         (system system)
+         (target target)
+         (host-inputs `(,@(if source
+                              `(("source" ,source))
+                              '())
+                        ,@inputs
+
+                        ;; Keep the standard inputs of 'gnu-build-system'
+                        ,@(standard-packages)))
+         (build-inputs `(("cargo" ,cargo)
+                         ("rustc" ,rustc)
+                         ,@native-inputs))
+         (outputs outputs)
+         (build cargo-build)
+         (arguments (strip-keyword-arguments private-keywords arguments)))))
+
+(define cargo-build-system
+  (build-system
+    (name 'cargo)
+    (description
+     "Cargo build system, to build Rust crates")
+    (lower lower)))
diff --git a/guix/build-system/ocaml.scm b/guix/build-system/ocaml.scm
new file mode 100644
index 0000000000..f4f57b5ad5
--- /dev/null
+++ b/guix/build-system/ocaml.scm
@@ -0,0 +1,181 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016, 2017 Julien Lepiller <julien@lepiller.eu>
+;;;
+;;; 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 build-system ocaml)
+  #:use-module (guix store)
+  #:use-module (guix utils)
+  #:use-module (guix derivations)
+  #:use-module (guix search-paths)
+  #:use-module (guix build-system)
+  #:use-module (guix build-system gnu)
+  #:use-module (guix packages)
+  #:use-module (ice-9 match)
+  #:export (%ocaml-build-system-modules
+            ocaml-build
+            ocaml-build-system))
+
+;; Commentary:
+;;
+;; Standard build procedure for packages using ocaml. This is implemented as an
+;; extension of `gnu-build-system'.
+;;
+;; OCaml packages don't use a single standard for their build system. Some use
+;; autotools, other use custom configure scripts with Makefiles, others use
+;; oasis to generate the configure script and Makefile and lastly, some use
+;; custom ocaml scripts.
+;;
+;; Each phase in the build system will try to figure out what the build system
+;; is for that package. Most packages come with a custom configure script and
+;; a Makefile that in turn call custom build tools. Packages built with oasis
+;; will have a `setup.ml' file in the top directory, that can be used for all
+;; phases. In that case the Makefile is here only to call that script. In case
+;; the setup.ml do not work as expected, the @var{use-make} argument can be
+;; used to ignore the setup.ml file and run make instead.
+;;
+;; Some packages use their own custom scripts, `pkg/pkg.ml' or
+;; `pkg/build.ml'. They can be used here too.
+;;
+;; Code:
+
+(define %ocaml-build-system-modules
+  ;; Build-side modules imported by default.
+  `((guix build ocaml-build-system)
+    ,@%gnu-build-system-modules))
+
+(define (default-ocaml)
+  "Return the default OCaml package."
+
+  ;; Do not use `@' to avoid introducing circular dependencies.
+  (let ((module (resolve-interface '(gnu packages ocaml))))
+    (module-ref module 'ocaml)))
+
+(define (default-findlib)
+  "Return the default OCaml-findlib package."
+
+  ;; Do not use `@' to avoid introducing circular dependencies.
+  (let ((module (resolve-interface '(gnu packages ocaml))))
+    (module-ref module 'ocaml-findlib)))
+
+(define* (lower name
+                #:key source inputs native-inputs outputs system target
+                (ocaml (default-ocaml))
+                (findlib (default-findlib))
+                #:allow-other-keys
+                #:rest arguments)
+  "Return a bag for NAME."
+  (define private-keywords
+    '(#:source #:target #:ocaml #:findlib #:inputs #:native-inputs))
+
+  (and (not target)                               ;XXX: no cross-compilation
+       (bag
+         (name name)
+         (system system)
+         (host-inputs `(,@(if source
+                              `(("source" ,source))
+                              '())
+                        ,@inputs
+
+                        ;; Keep the standard inputs of 'gnu-build-system'.
+                        ,@(standard-packages)))
+         (build-inputs `(("ocaml" ,ocaml)
+                         ("findlib" ,findlib)
+                         ,@native-inputs))
+         (outputs outputs)
+         (build ocaml-build)
+         (arguments (strip-keyword-arguments private-keywords arguments)))))
+
+(define* (ocaml-build store name inputs
+                      #:key (guile #f)
+                      (outputs '("out")) (configure-flags ''())
+                      (search-paths '())
+                      (make-flags ''())
+                      (build-flags ''())
+                      (out-of-source? #t)
+                      (use-make? #f)
+                      (tests? #t)
+                      (test-flags ''("--enable-tests"))
+                      (test-target "test")
+                      (install-target "install")
+                      (validate-runpath? #t)
+                      (patch-shebangs? #t)
+                      (strip-binaries? #t)
+                      (strip-flags ''("--strip-debug"))
+                      (strip-directories ''("lib" "lib64" "libexec"
+                                            "bin" "sbin"))
+                      (phases '(@ (guix build ocaml-build-system)
+                                  %standard-phases))
+                      (system (%current-system))
+                      (imported-modules %ocaml-build-system-modules)
+                      (modules '((guix build ocaml-build-system)
+                                 (guix build utils))))
+  "Build SOURCE using OCAML, and with INPUTS. This assumes that SOURCE
+provides a 'setup.ml' file as its build system."
+  (define builder
+    `(begin
+       (use-modules ,@modules)
+       (ocaml-build #:source ,(match (assoc-ref inputs "source")
+                                (((? derivation? source))
+                                 (derivation->output-path source))
+                                ((source)
+                                 source)
+                                (source
+                                 source))
+                    #:system ,system
+                    #:outputs %outputs
+                    #:inputs %build-inputs
+                    #:search-paths ',(map search-path-specification->sexp
+                                          search-paths)
+                    #:phases ,phases
+                    #:configure-flags ,configure-flags
+                    #:test-flags ,test-flags
+                    #:make-flags ,make-flags
+                    #:build-flags ,build-flags
+                    #:out-of-source? ,out-of-source?
+                    #:use-make? ,use-make?
+                    #:tests? ,tests?
+                    #:test-target ,test-target
+                    #:install-target ,install-target
+                    #:validate-runpath? ,validate-runpath?
+                    #:patch-shebangs? ,patch-shebangs?
+                    #:strip-binaries? ,strip-binaries?
+                    #:strip-flags ,strip-flags
+                    #:strip-directories ,strip-directories)))
+
+  (define guile-for-build
+    (match guile
+      ((? package?)
+       (package-derivation store guile system #:graft? #f))
+      (#f                                         ; the default
+       (let* ((distro (resolve-interface '(gnu packages commencement)))
+              (guile  (module-ref distro 'guile-final)))
+         (package-derivation store guile system #:graft? #f)))))
+
+  (build-expression->derivation store name builder
+                                #:system system
+                                #:inputs inputs
+                                #:modules imported-modules
+                                #:outputs outputs
+                                #:guile-for-build guile-for-build))
+
+(define ocaml-build-system
+  (build-system
+    (name 'ocaml)
+    (description "The standard OCaml build system")
+    (lower lower)))
+
+;;; ocaml.scm ends here
diff --git a/guix/build/cargo-build-system.scm b/guix/build/cargo-build-system.scm
new file mode 100644
index 0000000000..7d656a8d58
--- /dev/null
+++ b/guix/build/cargo-build-system.scm
@@ -0,0 +1,110 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016 David Craven <david@craven.ch>
+;;;
+;;; 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 build cargo-build-system)
+  #:use-module ((guix build gnu-build-system) #:prefix gnu:)
+  #:use-module (guix build utils)
+  #:use-module (ice-9 ftw)
+  #:use-module (ice-9 format)
+  #:use-module (ice-9 match)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-26)
+  #:export (%standard-phases
+            cargo-build))
+
+;; Commentary:
+;;
+;; Builder-side code of the standard Rust package build procedure.
+;;
+;; Code:
+
+;; FIXME: Needs to be parsed from url not package name.
+(define (package-name->crate-name name)
+  "Return the crate name of NAME."
+  (match (string-split name #\-)
+    (("rust" rest ...)
+     (string-join rest "-"))
+    (_ #f)))
+
+(define* (configure #:key inputs #:allow-other-keys)
+  "Replace Cargo.toml [dependencies] section with guix inputs."
+  ;; Make sure Cargo.toml is writeable when the crate uses git-fetch.
+  (chmod "Cargo.toml" #o644)
+  (let ((port (open-file "Cargo.toml" "a" #:encoding "utf-8")))
+    (format port "~%[replace]~%")
+    (for-each
+     (match-lambda
+       ((name . path)
+        (let ((crate (package-name->crate-name name)))
+          (when (and crate path)
+            (match (string-split (basename path) #\-)
+              ((_ ... version)
+               (format port "\"~a:~a\" = { path = \"~a/share/rust-source\" }~%"
+                       crate version path)))))))
+     inputs)
+    (close-port port))
+  #t)
+
+(define* (build #:key (cargo-build-flags '("--release" "--frozen"))
+                #:allow-other-keys)
+  "Build a given Cargo package."
+  (if (file-exists? "Cargo.lock")
+      (zero? (apply system* `("cargo" "build" ,@cargo-build-flags)))
+      #t))
+
+(define* (check #:key tests? #:allow-other-keys)
+  "Run tests for a given Cargo package."
+  (if (and tests? (file-exists? "Cargo.lock"))
+      (zero? (system* "cargo" "test"))
+      #t))
+
+(define* (install #:key inputs outputs #:allow-other-keys)
+  "Install a given Cargo package."
+  (let* ((out (assoc-ref outputs "out"))
+         (src (assoc-ref inputs "source"))
+         (rsrc (string-append (assoc-ref outputs "src")
+                              "/share/rust-source")))
+    (mkdir-p rsrc)
+    ;; Rust doesn't have a stable ABI yet. Because of this
+    ;; Cargo doesn't have a search path for binaries yet.
+    ;; Until this changes we are working around this by
+    ;; distributing crates as source and replacing
+    ;; references in Cargo.toml with store paths.
+    (copy-recursively "src" (string-append rsrc "/src"))
+    (install-file "Cargo.toml" rsrc)
+    ;; When the package includes executables we install
+    ;; it using cargo install. This fails when the crate
+    ;; doesn't contain an executable.
+    (if (file-exists? "Cargo.lock")
+        (system* "cargo" "install" "--root" out)
+        (mkdir out))))
+
+(define %standard-phases
+  ;; 'configure' phase is not needed.
+  (modify-phases gnu:%standard-phases
+    (replace 'configure configure)
+    (replace 'build build)
+    (replace 'check check)
+    (replace 'install install)))
+
+(define* (cargo-build #:key inputs (phases %standard-phases)
+                      #:allow-other-keys #:rest args)
+  "Build the given Cargo package, applying all of PHASES in order."
+  (apply gnu:gnu-build #:inputs inputs #:phases phases args))
+
+;;; cargo-build-system.scm ends here
diff --git a/guix/build/download.scm b/guix/build/download.scm
index 8e32b3d7ff..203338b527 100644
--- a/guix/build/download.scm
+++ b/guix/build/download.scm
@@ -289,9 +289,12 @@ DIRECTORY.  Those authority certificates are checked when
                               (string-suffix? ".pem" file)))
                    '())))
     (for-each (lambda (file)
-                (set-certificate-credentials-x509-trust-file!
-                 cred (string-append directory "/" file)
-                 x509-certificate-format/pem))
+                (let ((file (string-append directory "/" file)))
+                  ;; Protect against dangling symlinks.
+                  (when (file-exists? file)
+                    (set-certificate-credentials-x509-trust-file!
+                     cred file
+                     x509-certificate-format/pem))))
               (or files '()))
     cred))
 
diff --git a/guix/build/make-bootstrap.scm b/guix/build/make-bootstrap.scm
index bc4c0e3d5f..21c78cc8f5 100644
--- a/guix/build/make-bootstrap.scm
+++ b/guix/build/make-bootstrap.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2015 Manolis Fragkiskos Ragkousis <manolis837@gmail.com>
+;;; Copyright © 2015, 2017 Manolis Fragkiskos Ragkousis <manolis837@gmail.com>
 ;;; Copyright © 2015 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -64,7 +64,8 @@ when producing a bootstrap libc."
       #t))
 
   (define %libc-object-files-rx "^(crt.*|ld.*|lib(c|m|dl|rt|pthread|nsl|\
-util).*\\.so(\\..*)?|lib(machuser|hurduser).so.*|libc(rt|)_nonshared\\.a)$")
+util).*\\.so(\\..*)?|lib(machuser|hurduser).so.*|(libc(rt|)|libpthread)\
+_nonshared\\.a)$")
 
   (setvbuf (current-output-port) _IOLBF)
   (let* ((libdir (string-append output "/lib")))
diff --git a/guix/build/ocaml-build-system.scm b/guix/build/ocaml-build-system.scm
new file mode 100644
index 0000000000..f77251ca09
--- /dev/null
+++ b/guix/build/ocaml-build-system.scm
@@ -0,0 +1,119 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016, 2017 Julien Lepiller <julien@lepiller.eu>
+;;;
+;;; 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 build ocaml-build-system)
+  #:use-module ((guix build gnu-build-system) #:prefix gnu:)
+  #:use-module (guix build utils)
+  #:use-module (ice-9 match)
+  #:export (%standard-phases
+            ocaml-build))
+
+;; Commentary:
+;;
+;; Builder-side code of the standard ocaml build procedure.
+;;
+;; Code:
+
+(define* (ocaml-findlib-environment #:key outputs #:allow-other-keys)
+  (let* ((out (assoc-ref outputs "out")))
+    (setenv "OCAMLFIND_DESTDIR" (string-append out "/lib/ocaml/site-lib"))
+    (setenv "OCAMLFIND_LDCONF" "ignore"))
+  #t)
+
+(define* (configure #:key outputs (configure-flags '())
+                    (test-flags '("--enable-tests")) tests?
+                    #:allow-other-keys)
+  "Configure the given package."
+  (let* ((out        (assoc-ref outputs "out")))
+    (format #t "build directory: ~s~%" (getcwd))
+    (if (file-exists? "setup.ml")
+      (let ((args `("-configure"
+                    "--prefix" ,out
+                    ,@(if tests?
+                          test-flags
+                          '())
+                    ,@configure-flags)))
+        (format #t "running 'setup.ml' with arguments ~s~%" args)
+        (zero? (apply system* "ocaml" "setup.ml" args)))
+       (let ((args `("-prefix" ,out ,@configure-flags)))
+        (format #t "running 'configure' with arguments ~s~%" args)
+        (zero? (apply system* "./configure" args))))))
+
+(define* (build #:key inputs outputs (build-flags '()) (make-flags '())
+                (use-make? #f) #:allow-other-keys)
+  "Build the given package."
+  (if (and (file-exists? "setup.ml") (not use-make?))
+    (zero? (apply system* "ocaml" "setup.ml" "-build" build-flags))
+    (if (file-exists? "Makefile")
+      (zero? (apply system* "make" make-flags))
+      (let ((file (if (file-exists? "pkg/pkg.ml") "pkg/pkg.ml" "pkg/build.ml")))
+        (zero? (apply system* "ocaml" "-I"
+                              (string-append (assoc-ref inputs "findlib")
+                                             "/lib/ocaml/site-lib")
+                              file build-flags))))))
+
+(define* (check #:key inputs outputs (make-flags '()) (test-target "test") tests?
+                  (use-make? #f) #:allow-other-keys)
+  "Install the given package."
+  (when tests?
+    (if (and (file-exists? "setup.ml") (not use-make?))
+      (zero? (system* "ocaml" "setup.ml" (string-append "-" test-target)))
+      (if (file-exists? "Makefile")
+        (zero? (apply system* "make" test-target make-flags))
+        (let ((file (if (file-exists? "pkg/pkg.ml") "pkg/pkg.ml" "pkg/build.ml")))
+          (zero? (system* "ocaml" "-I"
+                          (string-append (assoc-ref inputs "findlib")
+                                         "/lib/ocaml/site-lib")
+                          file test-target)))))))
+
+(define* (install #:key outputs (build-flags '()) (make-flags '()) (use-make? #f)
+                  (install-target "install")
+                  #:allow-other-keys)
+  "Install the given package."
+  (let ((out (assoc-ref outputs "out")))
+    (if (and (file-exists? "setup.ml") (not use-make?))
+      (zero? (apply system* "ocaml" "setup.ml"
+                    (string-append "-" install-target) build-flags))
+      (if (file-exists? "Makefile")
+        (zero? (apply system* "make" install-target make-flags))
+        (zero? (system* "opam-installer" "-i" (string-append "--prefix=" out)
+                        (string-append "--libdir=" out "/lib/ocaml/site-lib")))))))
+
+(define* (prepare-install #:key outputs #:allow-other-keys)
+  "Prepare for building the given package."
+  (mkdir-p (string-append (assoc-ref outputs "out") "/lib/ocaml/site-lib"))
+  (mkdir-p (string-append (assoc-ref outputs "out") "/bin")))
+
+(define %standard-phases
+  ;; Everything is as with the GNU Build System except for the `configure'
+  ;; , `build', `check' and `install' phases.
+  (modify-phases gnu:%standard-phases
+    (add-before 'configure 'ocaml-findlib-environment
+                ocaml-findlib-environment)
+    (add-before 'install 'prepare-install prepare-install)
+    (replace 'configure configure)
+    (replace 'build build)
+    (replace 'check check)
+    (replace 'install install)))
+
+(define* (ocaml-build #:key inputs (phases %standard-phases)
+                      #:allow-other-keys #:rest args)
+  "Build the given package, applying all of PHASES in order."
+  (apply gnu:gnu-build #:inputs inputs #:phases phases args))
+
+;;; ocaml-build-system.scm ends here
diff --git a/guix/build/syscalls.scm b/guix/build/syscalls.scm
index 9386c0f5d0..2e37846ff0 100644
--- a/guix/build/syscalls.scm
+++ b/guix/build/syscalls.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2015 David Thompson <davet@gnu.org>
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
 ;;;
@@ -1474,7 +1474,9 @@ always a positive integer."
         ;; ENOTTY is what we're after but 2012-and-earlier Linux versions
         ;; would return EINVAL instead in some cases:
         ;; <https://bugs.ruby-lang.org/issues/10494>.
-        (if (or (= errno ENOTTY) (= errno EINVAL))
+        ;; Furthermore, some FUSE file systems like unionfs return ENOSYS for
+        ;; that ioctl.
+        (if (memv errno (list ENOTTY EINVAL ENOSYS))
             (fall-back)
             (apply throw args))))))
 
diff --git a/guix/derivations.scm b/guix/derivations.scm
index 7ed9bd61d3..b712c508e5 100644
--- a/guix/derivations.scm
+++ b/guix/derivations.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2016, 2017 Mathieu Lirzin <mthl@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -120,7 +121,7 @@
 ;;; Nix derivations, as implemented in Nix's `derivations.cc'.
 ;;;
 
-(define-record-type <derivation>
+(define-immutable-record-type <derivation>
   (make-derivation outputs inputs sources system builder args env-vars
                    file-name)
   derivation?
@@ -453,19 +454,22 @@ one-argument procedure similar to that returned by 'substitution-oracle'."
        (loop (read drv-port)
              (cons (ununquote exp) result))))))
 
-(define read-derivation
-  (let ((cache (make-weak-value-hash-table 200)))
-    (lambda (drv-port)
-      "Read the derivation from DRV-PORT and return the corresponding
+(define %derivation-cache
+  ;; Maps derivation file names to <derivation> objects.
+  ;; XXX: This is redundant with 'atts-cache' in the store.
+  (make-weak-value-hash-table 200))
+
+(define (read-derivation drv-port)
+  "Read the derivation from DRV-PORT and return the corresponding
 <derivation> object."
-      ;; Memoize that operation because `%read-derivation' is quite expensive,
-      ;; and because the same argument is read more than 15 times on average
-      ;; during something like (package-derivation s gdb).
-      (let ((file (and=> (port-filename drv-port) basename)))
-        (or (and file (hash-ref cache file))
-            (let ((drv (%read-derivation drv-port)))
-              (hash-set! cache file drv)
-              drv))))))
+  ;; Memoize that operation because `%read-derivation' is quite expensive,
+  ;; and because the same argument is read more than 15 times on average
+  ;; during something like (package-derivation s gdb).
+  (let ((file (port-filename drv-port)))
+    (or (and file (hash-ref %derivation-cache file))
+        (let ((drv (%read-derivation drv-port)))
+          (hash-set! %derivation-cache file drv)
+          drv))))
 
 (define-inlinable (write-sequence lst write-item port)
   ;; Write each element of LST with WRITE-ITEM to PORT, separating them with a
@@ -520,9 +524,9 @@ that form."
   (define (write-input input port)
     (match input
       (($ <derivation-input> path sub-drvs)
-       (display "(" port)
-       (write path port)
-       (display "," port)
+       (display "(\"" port)
+       (display path port)
+       (display "\"," port)
        (write-string-list sub-drvs)
        (display ")" port))))
 
@@ -545,7 +549,7 @@ that form."
      (write-list inputs write-input port)
      (display "," port)
      (write-string-list sources)
-     (format port ",~s,~s," system builder)
+     (simple-format port ",\"~a\",\"~a\"," system builder)
      (write-string-list args)
      (display "," port)
      (write-list env-vars write-env-var port)
@@ -814,14 +818,6 @@ output should not be used."
             e
             outputs)))
 
-  (define (set-file-name drv file)
-    ;; Set FILE as the 'file-name' field of DRV.
-    (match drv
-      (($ <derivation> outputs inputs sources system builder
-          args env-vars)
-       (make-derivation outputs inputs sources system builder
-                        args env-vars file))))
-
   (define input->derivation-input
     (match-lambda
       (((? derivation? drv))
@@ -866,10 +862,12 @@ output should not be used."
                                       system builder args env-vars #f))
          (drv        (add-output-paths drv-masked)))
 
-    (let ((file (add-text-to-store store (string-append name ".drv")
-                                   (derivation->string drv)
-                                   (map derivation-input-path inputs))))
-      (set-file-name drv file))))
+    (let* ((file (add-text-to-store store (string-append name ".drv")
+                                    (derivation->string drv)
+                                    (map derivation-input-path inputs)))
+           (drv* (set-field drv (derivation-file-name) file)))
+      (hash-set! %derivation-cache file drv*)
+      drv*)))
 
 (define* (map-derivation store drv mapping
                          #:key (system (%current-system)))
diff --git a/guix/docker.scm b/guix/docker.scm
new file mode 100644
index 0000000000..dbe1e5351c
--- /dev/null
+++ b/guix/docker.scm
@@ -0,0 +1,127 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net>
+;;;
+;;; 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 docker)
+  #:use-module (guix hash)
+  #:use-module (guix store)
+  #:use-module (guix utils)
+  #:use-module ((guix build utils)
+                #:select (delete-file-recursively
+                          with-directory-excursion))
+  #:use-module (json)
+  #:use-module (rnrs bytevectors)
+  #:use-module (ice-9 match)
+  #:export (build-docker-image))
+
+;; Generate a 256-bit identifier in hexadecimal encoding for the Docker image
+;; containing the closure at PATH.
+(define docker-id
+  (compose bytevector->base16-string sha256 string->utf8))
+
+(define (layer-diff-id layer)
+  "Generate a layer DiffID for the given LAYER archive."
+  (string-append "sha256:" (bytevector->base16-string (file-sha256 layer))))
+
+;; This is the semantic version of the JSON metadata schema according to
+;; https://github.com/docker/docker/blob/master/image/spec/v1.2.md
+;; It is NOT the version of the image specification.
+(define schema-version "1.0")
+
+(define (image-description id time)
+  "Generate a simple image description."
+  `((id . ,id)
+    (created . ,time)
+    (container_config . #nil)))
+
+(define (generate-tag path)
+  "Generate an image tag for the given PATH."
+  (match (string-split (basename path) #\-)
+    ((hash name . rest) (string-append name ":" hash))))
+
+(define (manifest path id)
+  "Generate a simple image manifest."
+  `(((Config . "config.json")
+     (RepoTags . (,(generate-tag path)))
+     (Layers . (,(string-append id "/layer.tar"))))))
+
+;; According to the specifications this is required for backwards
+;; compatibility.  It duplicates information provided by the manifest.
+(define (repositories path id)
+  "Generate a repositories file referencing PATH and the image ID."
+  `((,(generate-tag path) . ((latest . ,id)))))
+
+;; See https://github.com/opencontainers/image-spec/blob/master/config.md
+(define (config layer time arch)
+  "Generate a minimal image configuration for the given LAYER file."
+  ;; "architecture" must be values matching "platform.arch" in the
+  ;; runtime-spec at
+  ;; https://github.com/opencontainers/runtime-spec/blob/v1.0.0-rc2/config.md#platform
+  `((architecture . ,arch)
+    (comment . "Generated by GNU Guix")
+    (created . ,time)
+    (config . #nil)
+    (container_config . #nil)
+    (os . "linux")
+    (rootfs . ((type . "layers")
+               (diff_ids . (,(layer-diff-id layer)))))))
+
+(define* (build-docker-image path #:key system)
+  "Generate a Docker image archive from the given store PATH.  The image
+contains the closure of the given store item."
+  (let ((id (docker-id path))
+        (time (strftime "%FT%TZ" (localtime (current-time))))
+        (name (string-append (getcwd)
+                             "/docker-image-" (basename path) ".tar"))
+        (arch (match system
+                ("x86_64-linux" "amd64")
+                ("i686-linux" "386")
+                ("armhf-linux" "arm")
+                ("mips64el-linux" "mips64le"))))
+    (and (call-with-temporary-directory
+          (lambda (directory)
+            (with-directory-excursion directory
+              ;; Add symlink from /bin to /gnu/store/.../bin
+              (symlink (string-append path "/bin") "bin")
+
+              (mkdir id)
+              (with-directory-excursion id
+                (with-output-to-file "VERSION"
+                  (lambda () (display schema-version)))
+                (with-output-to-file "json"
+                  (lambda () (scm->json (image-description id time))))
+
+                ;; Wrap it up
+                (let ((items (with-store store
+                               (requisites store (list path)))))
+                  (and (zero? (apply system* "tar" "-cf" "layer.tar"
+                                     (cons "../bin" items)))
+                       (delete-file "../bin"))))
+
+              (with-output-to-file "config.json"
+                (lambda ()
+                  (scm->json (config (string-append id "/layer.tar")
+                                     time arch))))
+              (with-output-to-file "manifest.json"
+                (lambda ()
+                  (scm->json (manifest path id))))
+              (with-output-to-file "repositories"
+                (lambda ()
+                  (scm->json (repositories path id)))))
+            (and (zero? (system* "tar" "-C" directory "-cf" name "."))
+                 (begin (delete-file-recursively directory) #t))))
+         name)))
diff --git a/guix/gexp.scm b/guix/gexp.scm
index fd5dc49233..1f7fbef0a0 100644
--- a/guix/gexp.scm
+++ b/guix/gexp.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -669,41 +669,34 @@ references; otherwise, return only non-native references."
                    result)
            result))
       (($ <gexp-input> (? gexp? exp) _ #f)
-       (if native?
-           (append (gexp-inputs exp #:native? #t)
-                   result)
-           (append (gexp-inputs exp)
-                   result)))
+       (append (gexp-inputs exp #:native? native?)
+               result))
       (($ <gexp-input> (? string? str))
        (if (direct-store-path? str)
            (cons `(,str) result)
            result))
-      (($ <gexp-input> (? struct? thing) output)
-       (if (lookup-compiler thing)
+      (($ <gexp-input> (? struct? thing) output n?)
+       (if (and (eqv? n? native?) (lookup-compiler thing))
            ;; THING is a derivation, or a package, or an origin, etc.
            (cons `(,thing ,output) result)
            result))
       (($ <gexp-input> (lst ...) output n?)
-       (fold-right add-reference-inputs result
-                   ;; XXX: For now, automatically convert LST to a list of
-                   ;; gexp-inputs.
-                   (map (match-lambda
-                         ((? gexp-input? x) x)
-                         (x (%gexp-input x "out" (or n? native?))))
-                        lst)))
+       (if (eqv? native? n?)
+           (fold-right add-reference-inputs result
+                       ;; XXX: For now, automatically convert LST to a list of
+                       ;; gexp-inputs.
+                       (map (match-lambda
+                              ((? gexp-input? x) x)
+                              (x (%gexp-input x "out" (or n? native?))))
+                            lst))
+           result))
       (_
        ;; 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?
-                  (filter native-input? (gexp-references exp))
-                  (remove native-input? (gexp-references exp)))))
+              (gexp-references exp)))
 
 (define gexp-native-inputs
   (cut gexp-inputs <> #:native? #t))
@@ -819,9 +812,9 @@ environment."
            (cons exp result))
           ((ungexp-native-splicing _ ...)
            (cons exp result))
-          ((exp0 exp ...)
+          ((exp0 . exp)
            (let ((result (loop #'exp0 result)))
-             (fold loop result #'(exp ...))))
+             (loop  #'exp result)))
           (_
            result))))
 
@@ -853,9 +846,9 @@ environment."
       (match (assoc exp substs)
         ((_ id)
          id)
-        (_
-         #'(syntax-error "error: no 'ungexp' substitution"
-                         #'ref))))
+        (_                                        ;internal error
+         (with-syntax ((exp exp))
+           #'(syntax-error "error: no 'ungexp' substitution" exp)))))
 
     (define (substitute-ungexp-splicing exp substs)
       (syntax-case exp ()
@@ -867,7 +860,7 @@ environment."
                         #,(substitute-references #'(rest ...) substs))))
            (_
             #'(syntax-error "error: no 'ungexp-splicing' substitution"
-                            #'ref))))))
+                            exp))))))
 
     (define (substitute-references exp substs)
       ;; Return a variant of EXP where all the cars of SUBSTS have been
@@ -882,9 +875,9 @@ environment."
          (substitute-ungexp-splicing exp substs))
         (((ungexp-native-splicing _ ...) rest ...)
          (substitute-ungexp-splicing exp substs))
-        ((exp0 exp ...)
+        ((exp0 . exp)
          #`(cons #,(substitute-references #'exp0 substs)
-                 #,(substitute-references #'(exp ...) substs)))
+                 #,(substitute-references #'exp substs)))
         (x #''x)))
 
     (syntax-case s (ungexp output)
diff --git a/guix/git-download.scm b/guix/git-download.scm
index 9cc6dd3d94..62e625c715 100644
--- a/guix/git-download.scm
+++ b/guix/git-download.scm
@@ -30,7 +30,9 @@
             git-reference-commit
             git-reference-recursive?
 
-            git-fetch))
+            git-fetch
+            git-version
+            git-file-name))
 
 ;;; Commentary:
 ;;;
@@ -82,20 +84,39 @@ HASH-ALGO (a symbol).  Use NAME as the file name, or a generic name if #f."
                                            (((names dirs) ...)
                                             dirs)))
 
-          (git-fetch '#$(git-reference-url ref)
-                     '#$(git-reference-commit ref)
+          (git-fetch (getenv "git url") (getenv "git commit")
                      #$output
-                     #:recursive? '#$(git-reference-recursive? ref)
+                     #:recursive? (call-with-input-string
+                                      (getenv "git recursive?")
+                                    read)
                      #:git-command (string-append #+git "/bin/git")))))
 
   (mlet %store-monad ((guile (package->derivation guile system)))
     (gexp->derivation (or name "git-checkout") build
+
+                      ;; Use environment variables and a fixed script name so
+                      ;; there's only one script in store for all the
+                      ;; downloads.
+                      #:script-name "git-download"
+                      #:env-vars
+                      `(("git url" . ,(git-reference-url ref))
+                        ("git commit" . ,(git-reference-commit ref))
+                        ("git recursive?" . ,(object->string
+                                              (git-reference-recursive? ref))))
+
                       #:system system
                       #:local-build? #t           ;don't offload repo cloning
                       #:hash-algo hash-algo
                       #:hash hash
                       #:recursive? #t
-                      #:guile-for-build guile
-                      #:local-build? #t)))
+                      #:guile-for-build guile)))
+
+(define (git-version version revision commit)
+  "Return the version string for packages using git-download."
+  (string-append version "-" revision "." (string-take commit 7)))
+
+(define (git-file-name name version)
+  "Return the file-name for packages using git-download."
+  (string-append name "-" version "-checkout"))
 
 ;;; git-download.scm ends here
diff --git a/guix/gnu-maintenance.scm b/guix/gnu-maintenance.scm
index 4d4bb452be..789724c8c0 100644
--- a/guix/gnu-maintenance.scm
+++ b/guix/gnu-maintenance.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2012, 2013 Nikita Karetnikov <nikita@karetnikov.org>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -76,17 +76,17 @@
 ;;;
 
 (define %gnumaint-base-url
-  "http://cvs.savannah.gnu.org/viewvc/*checkout*/gnumaint/")
+  "http://cvs.savannah.gnu.org/viewvc/*checkout*/womb/gnumaint/")
 
 (define %package-list-url
   (string->uri
-   (string-append %gnumaint-base-url "gnupackages.txt?root=womb")))
+   (string-append %gnumaint-base-url "gnupackages.txt")))
 
 (define %package-description-url
   ;; This file contains package descriptions in recutils format.
   ;; See <https://lists.gnu.org/archive/html/guix-devel/2013-10/msg00071.html>.
   (string->uri
-   (string-append %gnumaint-base-url "pkgblurbs.txt?root=womb")))
+   (string-append %gnumaint-base-url "pkgblurbs.txt")))
 
 (define-record-type* <gnu-package-descriptor>
   gnu-package-descriptor
diff --git a/guix/grafts.scm b/guix/grafts.scm
index dda7c1d235..2006d3908e 100644
--- a/guix/grafts.scm
+++ b/guix/grafts.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -214,6 +214,17 @@ available."
                        (delete-duplicates (concatenate refs) string=?))
                result))))))
 
+(define-syntax-rule (with-cache key exp ...)
+  "Cache the value of monadic expression EXP under KEY."
+  (mlet %state-monad ((cache (current-state)))
+    (match (vhash-assq key cache)
+      ((_ . result)                               ;cache hit
+       (return result))
+      (#f                                         ;cache miss
+       (mlet %state-monad ((result (begin exp ...)))
+         (set-current-state (vhash-consq key result cache))
+         (return result))))))
+
 (define* (cumulative-grafts store drv grafts
                             references
                             #:key
@@ -252,48 +263,39 @@ derivations to the corresponding set of grafts."
                                  #:system system))
           (state-return grafts))))
 
-  (define (return/cache cache value)
-    (mbegin %state-monad
-      (set-current-state (vhash-consq drv value cache))
-      (return value)))
-
-  (mlet %state-monad ((cache (current-state)))
-    (match (vhash-assq drv cache)
-      ((_ . grafts)                               ;hit
+  (with-cache drv
+    (match (non-self-references references drv outputs)
+      (()                                         ;no dependencies
        (return grafts))
-      (#f                                         ;miss
-       (match (non-self-references references drv outputs)
-         (()                                      ;no dependencies
-          (return/cache cache grafts))
-         (deps                                    ;one or more dependencies
-          (mlet %state-monad ((grafts (mapm %state-monad dependency-grafts deps)))
-            (let ((grafts (delete-duplicates (concatenate grafts) equal?)))
-              (match (filter (lambda (graft)
-                               (member (graft-origin-file-name graft) deps))
-                             grafts)
-                (()
-                 (return/cache cache grafts))
-                ((applicable ..1)
-                 ;; Use APPLICABLE, the subset of GRAFTS that is really
-                 ;; applicable to DRV, to avoid creating several identical
-                 ;; grafted variants of DRV.
-                 (let* ((new    (graft-derivation/shallow store drv applicable
-                                                          #:guile guile
-                                                          #:system system))
-
-                        ;; Replace references to any of the outputs of DRV,
-                        ;; even if that's more than needed.  This is so that
-                        ;; the result refers only to the outputs of NEW and
-                        ;; not to those of DRV.
-                        (grafts (append (map (lambda (output)
-                                               (graft
-                                                 (origin drv)
-                                                 (origin-output output)
-                                                 (replacement new)
-                                                 (replacement-output output)))
-                                             (derivation-output-names drv))
-                                        grafts)))
-                   (return/cache cache grafts))))))))))))
+      (deps                                       ;one or more dependencies
+       (mlet %state-monad ((grafts (mapm %state-monad dependency-grafts deps)))
+         (let ((grafts (delete-duplicates (concatenate grafts) equal?)))
+           (match (filter (lambda (graft)
+                            (member (graft-origin-file-name graft) deps))
+                          grafts)
+             (()
+              (return grafts))
+             ((applicable ..1)
+              ;; Use APPLICABLE, the subset of GRAFTS that is really
+              ;; applicable to DRV, to avoid creating several identical
+              ;; grafted variants of DRV.
+              (let* ((new    (graft-derivation/shallow store drv applicable
+                                                       #:guile guile
+                                                       #:system system))
+
+                     ;; Replace references to any of the outputs of DRV,
+                     ;; even if that's more than needed.  This is so that
+                     ;; the result refers only to the outputs of NEW and
+                     ;; not to those of DRV.
+                     (grafts (append (map (lambda (output)
+                                            (graft
+                                              (origin drv)
+                                              (origin-output output)
+                                              (replacement new)
+                                              (replacement-output output)))
+                                          (derivation-output-names drv))
+                                     grafts)))
+                (return grafts))))))))))
 
 (define* (graft-derivation store drv grafts
                            #:key (guile (%guile-for-build))
@@ -333,4 +335,8 @@ it otherwise.  It returns the previous setting."
   (lambda (store)
     (values (%graft? enable?) store)))
 
+;; Local Variables:
+;; eval: (put 'with-cache 'scheme-indent-function 1)
+;; End:
+
 ;;; grafts.scm ends here
diff --git a/guix/graph.scm b/guix/graph.scm
index 735d340c2c..7af2cd3b80 100644
--- a/guix/graph.scm
+++ b/guix/graph.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -21,6 +22,7 @@
   #:use-module (guix monads)
   #:use-module (guix records)
   #:use-module (guix sets)
+  #:use-module (rnrs io ports)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-9)
   #:use-module (srfi srfi-26)
@@ -41,9 +43,13 @@
             node-transitive-edges
             node-reachable-count
 
+            %graph-backends
+            %d3js-backend
             %graphviz-backend
             graph-backend?
             graph-backend
+            graph-backend-name
+            graph-backend-description
 
             export-graph))
 
@@ -140,12 +146,14 @@ typically returned by 'node-edges' or 'node-back-edges'."
 ;;;
 
 (define-record-type <graph-backend>
-  (graph-backend prologue epilogue node edge)
+  (graph-backend name description prologue epilogue node edge)
   graph-backend?
-  (prologue graph-backend-prologue)
-  (epilogue graph-backend-epilogue)
-  (node     graph-backend-node)
-  (edge     graph-backend-edge))
+  (name         graph-backend-name)
+  (description  graph-backend-description)
+  (prologue     graph-backend-prologue)
+  (epilogue     graph-backend-epilogue)
+  (node         graph-backend-node)
+  (edge         graph-backend-edge))
 
 (define %colors
   ;; See colortbl.h in Graphviz.
@@ -170,9 +178,66 @@ typically returned by 'node-edges' or 'node-back-edges'."
           id1 id2 (pop-color id1)))
 
 (define %graphviz-backend
-  (graph-backend emit-prologue emit-epilogue
+  (graph-backend "graphviz"
+                 "Generate graph in DOT format for use with Graphviz."
+                 emit-prologue emit-epilogue
                  emit-node emit-edge))
 
+
+;;;
+;;; d3js export.
+;;;
+
+(define (emit-d3js-prologue name port)
+  (format port "\
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset=\"utf-8\">
+    <style>
+text {
+  font: 10px sans-serif;
+  pointer-events: none;
+}
+    </style>
+    <script type=\"text/javascript\" src=\"~a\"></script>
+  </head>
+  <body>
+    <script type=\"text/javascript\">
+var nodes = {},
+    nodeArray = [],
+    links = [];
+" (search-path %load-path "d3.v3.js")))
+
+(define (emit-d3js-epilogue port)
+  (format port "</script><script type=\"text/javascript\" src=\"~a\"></script></body></html>"
+          (search-path %load-path "graph.js")))
+
+(define (emit-d3js-node id label port)
+  (format port "\
+nodes[\"~a\"] = {\"id\": \"~a\", \"label\": \"~a\", \"index\": nodeArray.length};
+nodeArray.push(nodes[\"~a\"]);~%"
+          id id label id))
+
+(define (emit-d3js-edge id1 id2 port)
+  (format port "links.push({\"source\": \"~a\", \"target\": \"~a\"});~%"
+          id1 id2))
+
+(define %d3js-backend
+  (graph-backend "d3js"
+                 "Generate chord diagrams with d3js."
+                 emit-d3js-prologue emit-d3js-epilogue
+                 emit-d3js-node emit-d3js-edge))
+
+
+;;;
+;;; Shared.
+;;;
+
+(define %graph-backends
+  (list %graphviz-backend
+        %d3js-backend))
+
 (define* (export-graph sinks port
                        #:key
                        reverse-edges? node-type
@@ -181,7 +246,7 @@ typically returned by 'node-edges' or 'node-back-edges'."
 given BACKEND.  Use NODE-TYPE to traverse the DAG.  When REVERSE-EDGES? is
 true, draw reverse arrows."
   (match backend
-    (($ <graph-backend> emit-prologue emit-epilogue emit-node emit-edge)
+    (($ <graph-backend> _ _ emit-prologue emit-epilogue emit-node emit-edge)
      (emit-prologue (node-type-name node-type) port)
 
      (match node-type
diff --git a/guix/http-client.scm b/guix/http-client.scm
index cc3acc9587..0090783524 100644
--- a/guix/http-client.scm
+++ b/guix/http-client.scm
@@ -276,7 +276,12 @@ Raise an '&http-get-error' condition if downloading fails."
                               (code code)
                               (reason (response-reason-phrase resp)))
                              (&message
-                              (message "download failed"))))))))))
+                              (message
+                               (format
+                                #f
+                                (_ "~a: HTTP download failed: ~a (~s)")
+                                (uri->string uri) code
+                                (response-reason-phrase resp))))))))))))
 
 
 ;;;
diff --git a/guix/import/cran.scm b/guix/import/cran.scm
index 3fb2e213b0..463a25514e 100644
--- a/guix/import/cran.scm
+++ b/guix/import/cran.scm
@@ -23,6 +23,11 @@
   #:use-module ((ice-9 rdelim) #:select (read-string))
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-26)
+  #:use-module (srfi srfi-34)
+  #:use-module (srfi srfi-41)
+  #:use-module (ice-9 receive)
+  #:use-module (web uri)
+  #:use-module (guix combinators)
   #:use-module (guix http-client)
   #:use-module (guix hash)
   #:use-module (guix store)
@@ -32,8 +37,10 @@
   #:use-module ((guix build-system r) #:select (cran-uri bioconductor-uri))
   #:use-module (guix upstream)
   #:use-module (guix packages)
+  #:use-module (gnu packages)
   #:export (cran->guix-package
             bioconductor->guix-package
+            recursive-import
             %cran-updater
             %bioconductor-updater))
 
@@ -51,19 +58,21 @@
    ("Artistic-2.0" 'artistic2.0)
    ("Apache License 2.0" 'asl2.0)
    ("BSD_2_clause" 'bsd-2)
+   ("BSD_2_clause + file LICENSE" 'bsd-2)
    ("BSD_3_clause" 'bsd-3)
+   ("BSD_3_clause + file LICENSE" 'bsd-3)
    ("GPL" (list 'gpl2+ 'gpl3+))
    ("GPL (>= 2)" 'gpl2+)
    ("GPL (>= 3)" 'gpl3+)
-   ("GPL-2" 'gpl2+)
-   ("GPL-3" 'gpl3+)
-   ("LGPL-2" 'lgpl2.0+)
-   ("LGPL-2.1" 'lgpl2.1+)
-   ("LGPL-3" 'lgpl3+)
+   ("GPL-2" 'gpl2)
+   ("GPL-3" 'gpl3)
+   ("LGPL-2" 'lgpl2.0)
+   ("LGPL-2.1" 'lgpl2.1)
+   ("LGPL-3" 'lgpl3)
    ("LGPL (>= 2)" 'lgpl2.0+)
    ("LGPL (>= 3)" 'lgpl3+)
-   ("MIT" 'x11)
-   ("MIT + file LICENSE" 'x11)
+   ("MIT" 'expat)
+   ("MIT + file LICENSE" 'expat)
    ((x) (string->license x))
    ((lst ...) `(list ,@(map string->license lst)))
    (_ #f)))
@@ -121,10 +130,18 @@ package definition."
 
 (define (fetch-description base-url name)
   "Return an alist of the contents of the DESCRIPTION file for the R package
-NAME, or #f on failure.  NAME is case-sensitive."
+NAME, or #f in case of failure.  NAME is case-sensitive."
   ;; This API always returns the latest release of the module.
   (let ((url (string-append base-url name "/DESCRIPTION")))
-    (description->alist (read-string (http-fetch url)))))
+    (guard (c ((http-get-error? c)
+               (format (current-error-port)
+                       "error: failed to retrieve package information \
+from ~s: ~a (~s)~%"
+                       (uri->string (http-get-error-uri c))
+                       (http-get-error-code c)
+                       (http-get-error-reason c))
+               #f))
+      (description->alist (read-string (http-fetch url))))))
 
 (define (listify meta field)
   "Look up FIELD in the alist META.  If FIELD contains a comma-separated
@@ -146,14 +163,49 @@ empty list when the FIELD cannot be found."
                         (string-any char-set:whitespace item)))
                   (map string-trim-both items))))))
 
+(define default-r-packages
+  (list "KernSmooth"
+        "MASS"
+        "Matrix"
+        "base"
+        "boot"
+        "class"
+        "cluster"
+        "codetools"
+        "compiler"
+        "datasets"
+        "foreign"
+        "grDevices"
+        "graphics"
+        "grid"
+        "lattice"
+        "methods"
+        "mgcv"
+        "nlme"
+        "nnet"
+        "parallel"
+        "rpart"
+        "spatial"
+        "splines"
+        "stats"
+        "stats4"
+        "survival"
+        "tcltk"
+        "tools"
+        "translations"
+        "utils"))
+
+(define (guix-name name)
+  "Return a Guix package name for a given R package name."
+  (string-append "r-" (string-map (match-lambda
+                                    (#\_ #\-)
+                                    (#\. #\-)
+                                    (chr (char-downcase chr)))
+                                  name)))
+
 (define (description->package repository meta)
   "Return the `package' s-expression for an R package published on REPOSITORY
 from the alist META, which was derived from the R package's DESCRIPTION file."
-  (define (guix-name name)
-    (if (string-prefix? "r-" name)
-        (string-downcase name)
-        (string-append "r-" (string-downcase name))))
-
   (let* ((base-url   (case repository
                        ((cran)         %cran-url)
                        ((bioconductor) %bioconductor-url)))
@@ -174,42 +226,107 @@ from the alist META, which was derived from the R package's DESCRIPTION file."
                        (_ #f)))
          (tarball    (with-store store (download-to-store store source-url)))
          (sysdepends (map string-downcase (listify meta "SystemRequirements")))
-         (propagate  (map guix-name (lset-union equal?
-                                                (listify meta "Imports")
-                                                (listify meta "LinkingTo")
-                                                (delete "R"
-                                                        (listify meta "Depends"))))))
-    `(package
-       (name ,(guix-name name))
-       (version ,version)
-       (source (origin
-                 (method url-fetch)
-                 (uri (,(procedure-name uri-helper) ,name version))
-                 (sha256
-                  (base32
-                   ,(bytevector->nix-base32-string (file-sha256 tarball))))))
-       ,@(if (not (equal? (string-append "r-" name)
-                          (guix-name name)))
-             `((properties ,`(,'quasiquote ((,'upstream-name . ,name)))))
-             '())
-       (build-system r-build-system)
-       ,@(maybe-inputs sysdepends)
-       ,@(maybe-inputs propagate 'propagated-inputs)
-       (home-page ,(if (string-null? home-page)
-                       (string-append base-url name)
-                       home-page))
-       (synopsis ,synopsis)
-       (description ,(beautify-description (assoc-ref meta "Description")))
-       (license ,license))))
-
-(define* (cran->guix-package package-name #:optional (repo 'cran))
-  "Fetch the metadata for PACKAGE-NAME from REPO and return the `package'
+         (propagate  (filter (lambda (name)
+                               (not (member name default-r-packages)))
+                             (lset-union equal?
+                                         (listify meta "Imports")
+                                         (listify meta "LinkingTo")
+                                         (delete "R"
+                                                 (listify meta "Depends"))))))
+    (values
+     `(package
+        (name ,(guix-name name))
+        (version ,version)
+        (source (origin
+                  (method url-fetch)
+                  (uri (,(procedure-name uri-helper) ,name version))
+                  (sha256
+                   (base32
+                    ,(bytevector->nix-base32-string (file-sha256 tarball))))))
+        ,@(if (not (equal? (string-append "r-" name)
+                           (guix-name name)))
+              `((properties ,`(,'quasiquote ((,'upstream-name . ,name)))))
+              '())
+        (build-system r-build-system)
+        ,@(maybe-inputs sysdepends)
+        ,@(maybe-inputs (map guix-name propagate) 'propagated-inputs)
+        (home-page ,(if (string-null? home-page)
+                        (string-append base-url name)
+                        home-page))
+        (synopsis ,synopsis)
+        (description ,(beautify-description (or (assoc-ref meta "Description")
+                                                "")))
+        (license ,license))
+     propagate)))
+
+(define cran->guix-package
+  (memoize
+   (lambda* (package-name #:optional (repo 'cran))
+     "Fetch the metadata for PACKAGE-NAME from REPO and return the `package'
 s-expression corresponding to that package, or #f on failure."
-  (let* ((url (case repo
-                ((cran)         %cran-url)
-                ((bioconductor) %bioconductor-svn-url)))
-         (module-meta (fetch-description url package-name)))
-    (and=> module-meta (cut description->package repo <>))))
+     (let* ((url (case repo
+                   ((cran)         %cran-url)
+                   ((bioconductor) %bioconductor-svn-url)))
+            (module-meta (fetch-description url package-name)))
+       (and=> module-meta (cut description->package repo <>))))))
+
+(define* (recursive-import package-name #:optional (repo 'cran))
+  "Generate a stream of package expressions for PACKAGE-NAME and all its
+dependencies."
+  (receive (package . dependencies)
+      (cran->guix-package package-name repo)
+    (if (not package)
+        stream-null
+
+        ;; Generate a lazy stream of package expressions for all unknown
+        ;; dependencies in the graph.
+        (let* ((make-state (lambda (queue done)
+                             (cons queue done)))
+               (next       (match-lambda
+                             (((next . rest) . done) next)))
+               (imported   (match-lambda
+                             ((queue . done) done)))
+               (done?      (match-lambda
+                             ((queue . done)
+                              (zero? (length queue)))))
+               (unknown?   (lambda* (dependency #:optional (done '()))
+                             (and (not (member dependency
+                                               done))
+                                  (null? (find-packages-by-name
+                                          (guix-name dependency))))))
+               (update     (lambda (state new-queue)
+                             (match state
+                               (((head . tail) . done)
+                                (make-state (lset-difference
+                                             equal?
+                                             (lset-union equal? new-queue tail)
+                                             done)
+                                            (cons head done)))))))
+          (stream-cons
+           package
+           (stream-unfold
+            ;; map: produce a stream element
+            (lambda (state)
+              (cran->guix-package (next state) repo))
+
+            ;; predicate
+            (compose not done?)
+
+            ;; generator: update the queue
+            (lambda (state)
+              (receive (package . dependencies)
+                  (cran->guix-package (next state) repo)
+                (if package
+                    (update state (filter (cut unknown? <>
+                                               (cons (next state)
+                                                     (imported state)))
+                                          (car dependencies)))
+                    ;; TODO: Try the other archives before giving up
+                    (update state (imported state)))))
+
+            ;; initial state
+            (make-state (filter unknown? (car dependencies))
+                        (list package-name))))))))
 
 
 ;;;
diff --git a/guix/import/crate.scm b/guix/import/crate.scm
new file mode 100644
index 0000000000..233a20e983
--- /dev/null
+++ b/guix/import/crate.scm
@@ -0,0 +1,165 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016 David Craven <david@craven.ch>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (guix import crate)
+  #:use-module (guix base32)
+  #:use-module (guix build-system cargo)
+  #:use-module ((guix download) #:prefix download:)
+  #:use-module (guix hash)
+  #:use-module (guix http-client)
+  #:use-module (guix import json)
+  #:use-module (guix import utils)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix monads)
+  #:use-module (guix packages)
+  #:use-module (guix upstream)
+  #:use-module (guix utils)
+  #:use-module (ice-9 match)
+  #:use-module (ice-9 pretty-print) ; recursive
+  #:use-module (json)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-2)
+  #:use-module (srfi srfi-26)
+  #:export (crate->guix-package
+            guix-package->crate-name
+            %crate-updater))
+
+(define (crate-fetch crate-name callback)
+  "Fetch the metadata for CRATE-NAME from crates.io and call the callback."
+
+  (define (crates->inputs crates)
+    (sort (map (cut assoc-ref <> "crate_id") crates) string-ci<?))
+
+  (define (string->license string)
+    (map spdx-string->license (string-split string #\/)))
+
+  (define (crate-kind-predicate kind)
+    (lambda (dep) (string=? (assoc-ref dep "kind") kind)))
+
+  (and-let* ((crate-json (json-fetch (string-append crate-url crate-name)))
+             (crate (assoc-ref crate-json "crate"))
+             (name (assoc-ref crate "name"))
+             (version (assoc-ref crate "max_version"))
+             (homepage (assoc-ref crate "homepage"))
+             (repository (assoc-ref crate "repository"))
+             (synopsis (assoc-ref crate "description"))
+             (description (assoc-ref crate "description"))
+             (license (string->license (assoc-ref crate "license")))
+             (path (string-append "/" version "/dependencies"))
+             (deps-json (json-fetch (string-append crate-url name path)))
+             (deps (assoc-ref deps-json "dependencies"))
+             (input-crates (filter (crate-kind-predicate "normal") deps))
+             (native-input-crates
+              (filter (lambda (dep)
+                        (not ((crate-kind-predicate "normal") dep))) deps))
+             (inputs (crates->inputs input-crates))
+             (native-inputs (crates->inputs native-input-crates))
+             (home-page (match homepage
+                          (() repository)
+                          (_ homepage))))
+    (callback #:name name #:version version
+              #:inputs inputs #:native-inputs native-inputs
+              #:home-page home-page #:synopsis synopsis
+              #:description description #:license license)))
+
+(define* (make-crate-sexp #:key name version inputs native-inputs
+                          home-page synopsis description license
+                          #:allow-other-keys)
+  "Return the `package' s-expression for a rust package with the given NAME,
+VERSION, INPUTS, NATIVE-INPUTS, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE."
+  (let* ((port (http-fetch (crate-uri name version)))
+         (guix-name (crate-name->package-name name))
+         (inputs (map crate-name->package-name inputs))
+         (native-inputs (map crate-name->package-name native-inputs))
+         (pkg `(package
+                   (name ,guix-name)
+                   (version ,version)
+                   (source (origin
+                             (method url-fetch)
+                             (uri (crate-uri ,name version))
+                             (file-name (string-append name "-" version ".tar.gz"))
+                             (sha256
+                              (base32
+                               ,(bytevector->nix-base32-string (port-sha256 port))))))
+                   (build-system cargo-build-system)
+                   ,@(maybe-native-inputs native-inputs "src")
+                   ,@(maybe-inputs inputs "src")
+                   (home-page ,(match home-page
+                                 (() "")
+                                 (_ home-page)))
+                   (synopsis ,synopsis)
+                   (description ,(beautify-description description))
+                   (license ,(match license
+                               (() #f)
+                               ((license) license)
+                               (_ `(list ,@license)))))))
+         (close-port port)
+         pkg))
+
+(define (crate->guix-package crate-name)
+  "Fetch the metadata for CRATE-NAME from crates.io, and return the
+`package' s-expression corresponding to that package, or #f on failure."
+  (crate-fetch crate-name make-crate-sexp))
+
+(define (guix-package->crate-name package)
+  "Return the crate name of PACKAGE."
+  (and-let* ((origin (package-source package))
+             (uri (origin-uri origin))
+             (crate-url? uri)
+             (len (string-length crate-url))
+             (path (xsubstring uri len))
+             (parts (string-split path #\/)))
+    (match parts
+      ((name _ ...) name))))
+
+(define (crate-name->package-name name)
+  (string-append "rust-" (string-join (string-split name #\_) "-")))
+
+;;;
+;;; Updater
+;;;
+
+(define (crate-package? package)
+  "Return true if PACKAGE is a Rust crate from crates.io."
+  (let ((source-url (and=> (package-source package) origin-uri))
+        (fetch-method (and=> (package-source package) origin-method)))
+    (and (eq? fetch-method download:url-fetch)
+         (match source-url
+           ((? string?)
+            (crate-url? source-url))
+           ((source-url ...)
+            (any crate-url? source-url))))))
+
+(define (latest-release package)
+  "Return an <upstream-source> for the latest release of PACKAGE."
+  (let* ((crate-name (guix-package->crate-name package))
+         (callback (lambda* (#:key version #:allow-other-keys) version))
+         (version (crate-fetch crate-name callback))
+         (url (crate-uri crate-name version)))
+    (upstream-source
+     (package (package-name package))
+     (version version)
+     (urls (list url)))))
+
+(define %crate-updater
+  (upstream-updater
+   (name 'crates)
+   (description "Updater for crates.io packages")
+   (pred crate-package?)
+   (latest latest-release)))
+
diff --git a/guix/import/elpa.scm b/guix/import/elpa.scm
index 320a09e8c6..96cf5bbae6 100644
--- a/guix/import/elpa.scm
+++ b/guix/import/elpa.scm
@@ -89,7 +89,13 @@ NAMES (strings)."
   "Fetch URL, store the content in a temporary file and call PROC with that
 file.  Returns the value returned by PROC.  On error call ERROR-THUNK and
 return its value or leave if it's false."
-  (proc (http-fetch/cached (string->uri url))))
+  (catch #t
+    (lambda ()
+      (proc (http-fetch/cached (string->uri url))))
+    (lambda (key . args)
+      (if error-thunk
+          (error-thunk)
+          (leave (_ "~A: download failed~%") url)))))
 
 (define (is-elpa-package? name elpa-pkg-spec)
   "Return true if the string NAME corresponds to the name of the package
@@ -222,7 +228,7 @@ type '<elpa-package>'."
                         (bytevector->nix-base32-string (file-sha256 tarball))
                         "failed to download package")))))
        (build-system emacs-build-system)
-       ,@(maybe-inputs 'inputs dependencies)
+       ,@(maybe-inputs 'propagated-inputs dependencies)
        (home-page ,(elpa-package-home-page pkg))
        (synopsis ,(elpa-package-synopsis pkg))
        (description ,(elpa-package-description pkg))
diff --git a/guix/import/github.scm b/guix/import/github.scm
index 0843ddeefd..01452b12e3 100644
--- a/guix/import/github.scm
+++ b/guix/import/github.scm
@@ -23,23 +23,12 @@
   #:use-module (guix utils)
   #:use-module ((guix download) #:prefix download:)
   #:use-module (guix import utils)
+  #:use-module (guix import json)
   #:use-module (guix packages)
   #:use-module (guix upstream)
   #:use-module (web uri)
   #:export (%github-updater))
 
-(define (json-fetch* url)
-  "Return a list/hash representation of the JSON resource URL, or #f on
-failure."
-  (call-with-output-file "/dev/null"
-    (lambda (null)
-      (with-error-to-port null
-        (lambda ()
-          (call-with-temporary-output-file
-           (lambda (temp port)
-             (and (url-fetch url temp)
-                  (call-with-input-file temp json->scm)))))))))
-
 (define (find-extension url)
   "Return the extension of the archive e.g. '.tar.gz' given a URL, or
 false if none is recognized"
@@ -136,7 +125,7 @@ the package e.g. 'bedtools2'.  Return #f if there is no releases"
                    "https://api.github.com/repos/"
                    (github-user-slash-repository url)
                    "/releases"))
-         (json (json-fetch*
+         (json (json-fetch
                 (if token
                     (string-append api-url "?access_token=" token)
                     api-url))))
diff --git a/guix/import/pypi.scm b/guix/import/pypi.scm
index 9794ff9757..7cce0fc594 100644
--- a/guix/import/pypi.scm
+++ b/guix/import/pypi.scm
@@ -303,7 +303,8 @@ VERSION, SOURCE-URL, HOME-PAGE, SYNOPSIS, DESCRIPTION, and LICENSE."
   "Return true if PACKAGE is a Python package from PyPI."
 
   (define (pypi-url? url)
-    (string-prefix? "https://pypi.python.org/" url))
+    (or (string-prefix? "https://pypi.python.org/" url)
+        (string-prefix? "https://pypi.io/packages" url)))
 
   (let ((source-url (and=> (package-source package) origin-uri))
         (fetch-method (and=> (package-source package) origin-method)))
diff --git a/guix/import/utils.scm b/guix/import/utils.scm
index 057c2d9c7d..be1980d08f 100644
--- a/guix/import/utils.scm
+++ b/guix/import/utils.scm
@@ -22,6 +22,7 @@
   #:use-module (guix base32)
   #:use-module ((guix build download) #:prefix build:)
   #:use-module (guix hash)
+  #:use-module (guix http-client)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix utils)
   #:use-module (ice-9 match)
@@ -36,6 +37,10 @@
             url-fetch
             guix-hash-url
 
+            maybe-inputs
+            maybe-native-inputs
+            package->definition
+
             spdx-string->license
             license->symbol
 
@@ -205,3 +210,34 @@ into a proper sentence and by using two spaces between sentences."
     ;; Use double spacing between sentences
     (regexp-substitute/global #f "\\. \\b"
                               cleaned 'pre ".  " 'post)))
+
+(define* (package-names->package-inputs names #:optional (output #f))
+  (map (lambda (input)
+         (cons* input (list 'unquote (string->symbol input))
+                            (or (and output (list output))
+                                '())))
+       names))
+
+(define* (maybe-inputs package-names #:optional (output #f))
+  "Given a list of PACKAGE-NAMES, tries to generate the 'inputs' field of a
+package definition."
+  (match (package-names->package-inputs package-names output)
+    (()
+     '())
+    ((package-inputs ...)
+     `((inputs (,'quasiquote ,package-inputs))))))
+
+(define* (maybe-native-inputs package-names #:optional (output #f))
+  "Given a list of PACKAGE-NAMES, tries to generate the 'inputs' field of a
+package definition."
+  (match (package-names->package-inputs package-names output)
+    (()
+     '())
+    ((package-inputs ...)
+     `((native-inputs (,'quasiquote ,package-inputs))))))
+
+(define (package->definition guix-package)
+  (match guix-package
+    (('package ('name (? string? name)) _ ...)
+     `(define-public ,(string->symbol name)
+        ,guix-package))))
diff --git a/guix/profiles.scm b/guix/profiles.scm
index 0b317ef51e..e7707b6543 100644
--- a/guix/profiles.scm
+++ b/guix/profiles.scm
@@ -919,10 +919,14 @@ files for the truetype fonts of the @var{manifest} entries."
 (define* (profile-derivation manifest
                              #:key
                              (hooks %default-profile-hooks)
+                             (locales? #t)
                              system)
   "Return a derivation that builds a profile (aka. 'user environment') with
 the given MANIFEST.  The profile includes additional derivations returned by
-the monadic procedures listed in HOOKS--such as an Info 'dir' file, etc."
+the monadic procedures listed in HOOKS--such as an Info 'dir' file, etc.
+
+When LOCALES? is true, the build is performed under a UTF-8 locale; this adds
+a dependency on the 'glibc-utf8-locales' package."
   (mlet %store-monad ((system (if system
                                   (return system)
                                   (current-system)))
@@ -939,6 +943,19 @@ the monadic procedures listed in HOOKS--such as an Info 'dir' file, etc."
                           extras)
               (manifest-inputs manifest)))
 
+    (define glibc-utf8-locales                    ;lazy reference
+      (module-ref (resolve-interface '(gnu packages base))
+                  'glibc-utf8-locales))
+
+    (define set-utf8-locale
+      ;; Some file names (e.g., in 'nss-certs') are UTF-8 encoded so
+      ;; install a UTF-8 locale.
+      #~(begin
+          (setenv "LOCPATH"
+                  #$(file-append glibc-utf8-locales "/lib/locale/"
+                                 (package-version glibc-utf8-locales)))
+          (setlocale LC_ALL "en_US.utf8")))
+
     (define builder
       (with-imported-modules '((guix build profiles)
                                (guix build union)
@@ -953,6 +970,8 @@ the monadic procedures listed in HOOKS--such as an Info 'dir' file, etc."
             (setvbuf (current-output-port) _IOLBF)
             (setvbuf (current-error-port) _IOLBF)
 
+            #+(if locales? set-utf8-locale #t)
+
             (define search-paths
               ;; Search paths of MANIFEST's packages, converted back to their
               ;; record form.
@@ -1099,7 +1118,8 @@ case when generations have been deleted (there are \"holes\")."
   "Link GENERATION, a string, to the empty profile.  An error is raised if
 that fails."
   (let* ((drv  (run-with-store store
-                 (profile-derivation (manifest '()))))
+                 (profile-derivation (manifest '())
+                                     #:locales? #f)))
          (prof (derivation->output-path drv "out")))
     (build-derivations store (list drv))
     (switch-symlinks generation prof)))
diff --git a/guix/scripts/archive.scm b/guix/scripts/archive.scm
index 400353247c..9e49c53635 100644
--- a/guix/scripts/archive.scm
+++ b/guix/scripts/archive.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -41,7 +42,13 @@
   #:use-module (srfi srfi-26)
   #:use-module (srfi srfi-37)
   #:use-module (ice-9 binary-ports)
-  #:export (guix-archive))
+  #:export (guix-archive
+            options->derivations+files))
+
+;; XXX: Use this hack instead of #:autoload to avoid compilation errors.
+;; See <http://bugs.gnu.org/12202>.
+(module-autoload! (current-module)
+                  '(guix docker) '(build-docker-image))
 
 
 ;;;
@@ -50,7 +57,8 @@
 
 (define %default-options
   ;; Alist of default option values.
-  `((system . ,(%current-system))
+  `((format . "nar")
+    (system . ,(%current-system))
     (substitutes? . #t)
     (graft? . #t)
     (max-silent-time . 3600)
@@ -62,6 +70,8 @@ Export/import one or more packages from/to the store.\n"))
   (display (_ "
       --export           export the specified files/packages to stdout"))
   (display (_ "
+      --format=FMT       export files/packages in the specified format FMT"))
+  (display (_ "
   -r, --recursive        combined with '--export', include dependencies"))
   (display (_ "
       --import           import from the archive passed on stdin"))
@@ -116,6 +126,9 @@ Export/import one or more packages from/to the store.\n"))
          (option '("export") #f #f
                  (lambda (opt name arg result)
                    (alist-cons 'export #t result)))
+         (option '(#\f "format") #t #f
+                 (lambda (opt name arg result . rest)
+                   (alist-cons 'format arg result)))
          (option '(#\r "recursive") #f #f
                  (lambda (opt name arg result)
                    (alist-cons 'export-recursive? #t result)))
@@ -245,8 +258,21 @@ resulting archive to the standard output port."
 
     (if (or (assoc-ref opts 'dry-run?)
             (build-derivations store drv))
-        (export-paths store files (current-output-port)
-                      #:recursive? (assoc-ref opts 'export-recursive?))
+        (match (assoc-ref opts 'format)
+          ("nar"
+           (export-paths store files (current-output-port)
+                         #:recursive? (assoc-ref opts 'export-recursive?)))
+          ("docker"
+           (match files
+             ((file)
+              (let ((system (assoc-ref opts 'system)))
+                (format #t "~a\n"
+                        (build-docker-image file #:system system))))
+             (_
+              ;; TODO: Remove this restriction.
+              (leave (_ "only a single item can be exported to Docker~%")))))
+          (format
+           (leave (_ "~a: unknown archive format~%") format)))
         (leave (_ "unable to export the given packages~%")))))
 
 (define (generate-key-pair parameters)
diff --git a/guix/scripts/build.scm b/guix/scripts/build.scm
index 8c2c4902fc..ccb4c275fc 100644
--- a/guix/scripts/build.scm
+++ b/guix/scripts/build.scm
@@ -151,7 +151,11 @@ the new package's version number from URI."
 
                ;; Use #:recursive? #t to allow for directories.
                (source (download-to-store store uri
-                                          #:recursive? #t))))))
+                                          #:recursive? #t))
+
+               ;; Override the replacement, otherwise '--with-source' would
+               ;; have no effect.
+               (replacement #f)))))
 
 
 ;;;
diff --git a/guix/scripts/challenge.scm b/guix/scripts/challenge.scm
index 590d8f1099..9ab4fbe2a9 100644
--- a/guix/scripts/challenge.scm
+++ b/guix/scripts/challenge.scm
@@ -118,7 +118,7 @@ taken since we do not import the archives."
               (select-reference item narinfos urls)
               (narinfo-hash->sha256 (narinfo-hash first))))))
       (()
-       (leave (_ "no substitutes for '~a'~%") item))))
+       (warning (_ "no substitutes for '~a'; cannot conclude~%") item))))
 
   (mlet* %store-monad ((local     (mapm %store-monad
                                         query-locally-built-hash items))
diff --git a/guix/scripts/copy.scm b/guix/scripts/copy.scm
new file mode 100644
index 0000000000..9ae204e6c6
--- /dev/null
+++ b/guix/scripts/copy.scm
@@ -0,0 +1,207 @@
+;;; 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 scripts copy)
+  #:use-module (guix ui)
+  #:use-module (guix scripts)
+  #:use-module (guix ssh)
+  #:use-module (guix store)
+  #:use-module (guix utils)
+  #:use-module (guix derivations)
+  #:use-module (guix scripts build)
+  #:use-module ((guix scripts archive) #:select (options->derivations+files))
+  #:use-module (ssh session)
+  #:use-module (ssh auth)
+  #:use-module (ssh key)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-11)
+  #:use-module (srfi srfi-37)
+  #:use-module (ice-9 match)
+  #:use-module (ice-9 format)
+  #:export (guix-copy))
+
+
+;;;
+;;; Exchanging store items over SSH.
+;;;
+
+(define %compression
+  "zlib@openssh.com,zlib")
+
+(define* (open-ssh-session host #:key user port)
+  "Open an SSH session for HOST and return it.  When USER and PORT are #f, use
+default values or whatever '~/.ssh/config' specifies; otherwise use them.
+Throw an error on failure."
+  (let ((session (make-session #:user user
+                               #:host host
+                               #:port port
+                               #:timeout 10       ;seconds
+                               ;; #:log-verbosity 'protocol
+
+                               ;; We need lightweight compression when
+                               ;; exchanging full archives.
+                               #:compression %compression
+                               #:compression-level 3)))
+
+    ;; Honor ~/.ssh/config.
+    (session-parse-config! session)
+
+    (match (connect! session)
+      ('ok
+       ;; Let the SSH agent authenticate us to the server.
+       (match (userauth-agent! session)
+         ('success
+          session)
+         (x
+          (disconnect! session)
+          (leave (_ "SSH authentication failed for '~a': ~a~%")
+                 host (get-error session)))))
+      (x
+       ;; Connection failed or timeout expired.
+       (leave (_ "SSH connection to '~a' failed: ~a~%")
+              host (get-error session))))))
+
+(define (ssh-spec->user+host+port spec)
+  "Parse SPEC, a string like \"user@host:port\" or just \"host\", and return
+three values: the user name (or #f), the host name, and the TCP port
+number (or #f) corresponding to SPEC."
+  (define tokens
+    (char-set #\@ #\:))
+
+  (match (string-tokenize spec (char-set-complement tokens))
+    ((host)
+     (values #f host #f))
+    ((left right)
+     (if (string-index spec #\@)
+         (values left right #f)
+         (values #f left (string->number right))))
+    ((user host port)
+     (match (string->number port)
+       ((? integer? port)
+        (values user host port))
+       (x
+        (leave (_ "~a: invalid TCP port number~%") port))))
+    (x
+     (leave (_ "~a: invalid SSH specification~%") spec))))
+
+(define (send-to-remote-host target opts)
+  "Send ITEMS to TARGET.  ITEMS is a list of store items or package names; for ;
+package names, build the underlying packages before sending them."
+  (with-store local
+    (set-build-options-from-command-line local opts)
+    (let-values (((user host port)
+                  (ssh-spec->user+host+port target))
+                 ((drv items)
+                  (options->derivations+files local opts)))
+      (show-what-to-build local drv
+                          #:use-substitutes? (assoc-ref opts 'substitutes?)
+                          #:dry-run? (assoc-ref opts 'dry-run?))
+
+      (and (or (assoc-ref opts 'dry-run?)
+               (build-derivations local drv))
+           (let* ((session (open-ssh-session host #:user user #:port port))
+                  (sent    (send-files local items
+                                       (connect-to-remote-daemon session)
+                                       #:recursive? #t)))
+             (format #t "~{~a~%~}" sent)
+             sent)))))
+
+(define (retrieve-from-remote-host source opts)
+  "Retrieve ITEMS from SOURCE."
+  (with-store local
+    (let*-values (((user host port)
+                   (ssh-spec->user+host+port source))
+                  ((session)
+                   (open-ssh-session host #:user user #:port port))
+                  ((remote)
+                   (connect-to-remote-daemon session)))
+      (set-build-options-from-command-line local opts)
+      ;; TODO: Here we could to compute and build the derivations on REMOTE
+      ;; rather than on LOCAL (one-off offloading) but that is currently too
+      ;; slow due to the many RPC round trips.  So we just assume that REMOTE
+      ;; contains ITEMS.
+      (let*-values (((drv items)
+                     (options->derivations+files local opts))
+                    ((retrieved)
+                     (retrieve-files local items remote #:recursive? #t)))
+        (format #t "~{~a~%~}" retrieved)
+        retrieved))))
+
+
+;;;
+;;; Options.
+;;;
+
+(define (show-help)
+  (display (_ "Usage: guix copy [OPTION]... ITEMS...
+Copy ITEMS to or from the specified host over SSH.\n"))
+  (display (_ "
+      --to=HOST          send ITEMS to HOST"))
+  (display (_ "
+      --from=HOST        receive ITEMS from HOST"))
+  (newline)
+  (show-build-options-help)
+  (newline)
+  (display (_ "
+  -h, --help             display this help and exit"))
+  (display (_ "
+  -V, --version          display version information and exit"))
+  (newline)
+  (show-bug-report-information))
+
+(define %options
+  ;; Specifications of the command-line options.
+  (cons* (option '("to") #t #f
+                 (lambda (opt name arg result)
+                   (alist-cons 'destination arg result)))
+         (option '("from") #t #f
+                 (lambda (opt name arg result)
+                   (alist-cons 'source arg result)))
+         (option '(#\h "help") #f #f
+                 (lambda args
+                   (show-help)
+                   (exit 0)))
+         (option '(#\V "version") #f #f
+                 (lambda args
+                   (show-version-and-exit "guix copy")))
+         (option '(#\s "system") #t #f
+                 (lambda (opt name arg result)
+                   (alist-cons 'system arg
+                               (alist-delete 'system result eq?))))
+         %standard-build-options))
+
+(define %default-options
+  `((system . ,(%current-system))
+    (substitutes? . #t)
+    (graft? . #t)
+    (max-silent-time . 3600)
+    (verbosity . 0)))
+
+
+;;;
+;;; Entry point.
+;;;
+
+(define (guix-copy . args)
+  (with-error-handling
+    (let* ((opts     (parse-command-line args %options (list %default-options)))
+           (source   (assoc-ref opts 'source))
+           (target   (assoc-ref opts 'destination)))
+      (cond (target (send-to-remote-host target opts))
+            (source (retrieve-from-remote-host source opts))
+            (else   (leave (_ "use '--to' or '--from'~%")))))))
diff --git a/guix/scripts/environment.scm b/guix/scripts/environment.scm
index 6dea67ca22..1d3be6a84f 100644
--- a/guix/scripts/environment.scm
+++ b/guix/scripts/environment.scm
@@ -155,6 +155,9 @@ COMMAND or an interactive shell in that environment.\n"))
   (display (_ "
   -s, --system=SYSTEM    attempt to build for SYSTEM--e.g., \"i686-linux\""))
   (display (_ "
+  -r, --root=FILE        make FILE a symlink to the result, and register it
+                         as a garbage collector root"))
+  (display (_ "
   -C, --container        run command within an isolated container"))
   (display (_ "
   -N, --network          allow containers to access the network"))
@@ -247,6 +250,9 @@ COMMAND or an interactive shell in that environment.\n"))
                    (alist-cons 'file-system-mapping
                                (specification->file-system-mapping arg #f)
                                result)))
+         (option '(#\r "root") #t #f
+                 (lambda (opt name arg result)
+                   (alist-cons 'gc-root arg result)))
          (option '("bootstrap") #f #f
                  (lambda (opt name arg result)
                    (alist-cons 'bootstrap? #t result)))
@@ -323,7 +329,8 @@ profile."
                       #:system system
                       #:hooks (if bootstrap?
                                   '()
-                                  %default-profile-hooks)))
+                                  %default-profile-hooks)
+                      #:locales? (not bootstrap?)))
 
 (define requisites* (store-lift requisites))
 
@@ -522,7 +529,26 @@ message if any test fails."
     (report-error (_ "cannot create container: /proc/self/setgroups does not exist\n"))
     (leave (_ "is your kernel version < 3.19?\n"))))
 
-;; Entry point.
+(define (register-gc-root target root)
+  "Make ROOT an indirect root to TARGET.  This is procedure is idempotent."
+  (let* ((root (string-append (canonicalize-path (dirname root))
+                              "/" root)))
+    (catch 'system-error
+      (lambda ()
+        (symlink target root)
+        ((store-lift add-indirect-root) root))
+      (lambda args
+        (if (and (= EEXIST (system-error-errno args))
+                 (equal? (false-if-exception (readlink root)) target))
+            (with-monad %store-monad
+              (return #t))
+            (apply throw args))))))
+
+
+;;;
+;;; Entry point.
+;;;
+
 (define (guix-environment . args)
   (with-error-handling
     (let* ((opts       (parse-args args))
@@ -578,7 +604,9 @@ message if any test fails."
                                                                system))
                                  (prof-drv   (inputs->profile-derivation
                                               inputs system bootstrap?))
-                                 (profile -> (derivation->output-path prof-drv)))
+                                 (profile -> (derivation->output-path prof-drv))
+                                 (gc-root -> (assoc-ref opts 'gc-root)))
+
               ;; First build the inputs.  This is necessary even for
               ;; --search-paths.  Additionally, we might need to build bash for
               ;; a container.
@@ -587,6 +615,9 @@ message if any test fails."
                                        (list prof-drv bash)
                                        (list prof-drv))
                                    opts)
+                (mwhen gc-root
+                  (register-gc-root profile gc-root))
+
                 (cond
                  ((assoc-ref opts 'dry-run?)
                   (return #t))
diff --git a/guix/scripts/graph.scm b/guix/scripts/graph.scm
index 2f70d64c90..79ce503a2e 100644
--- a/guix/scripts/graph.scm
+++ b/guix/scripts/graph.scm
@@ -37,6 +37,7 @@
   #:use-module (srfi srfi-37)
   #:use-module (ice-9 match)
   #:export (%package-node-type
+            %reverse-package-node-type
             %bag-node-type
             %bag-with-origins-node-type
             %bag-emerged-node-type
@@ -103,6 +104,25 @@ name."
 
 
 ;;;
+;;; Reverse package DAG.
+;;;
+
+(define %reverse-package-node-type
+  ;; For this node type we first need to compute the list of packages and the
+  ;; list of back-edges.  Since we want to do it only once, we use the
+  ;; promises below.
+  (let* ((packages   (delay (fold-packages cons '())))
+         (back-edges (delay (run-with-store #f    ;store not actually needed
+                              (node-back-edges %package-node-type
+                                               (force packages))))))
+    (node-type
+     (inherit %package-node-type)
+     (name "reverse-package")
+     (description "the reverse DAG of packages")
+     (edges (lift1 (force back-edges) %store-monad)))))
+
+
+;;;
 ;;; Package DAG using bags.
 ;;;
 
@@ -323,6 +343,7 @@ substitutes."
 (define %node-types
   ;; List of all the node types.
   (list %package-node-type
+        %reverse-package-node-type
         %bag-node-type
         %bag-with-origins-node-type
         %bag-emerged-node-type
@@ -337,6 +358,13 @@ substitutes."
             %node-types)
       (leave (_ "~a: unknown node type~%") name)))
 
+(define (lookup-backend name)
+  "Return the graph backend called NAME.  Raise an error if it is not found."
+  (or (find (lambda (backend)
+              (string=? (graph-backend-name backend) name))
+            %graph-backends)
+      (leave (_ "~a: unknown backend~%") name)))
+
 (define (list-node-types)
   "Print the available node types along with their synopsis."
   (display (_ "The available node types are:\n"))
@@ -347,6 +375,16 @@ substitutes."
                       (node-type-description type)))
             %node-types))
 
+(define (list-backends)
+  "Print the available backends along with their synopsis."
+  (display (_ "The available backend types are:\n"))
+  (newline)
+  (for-each (lambda (backend)
+              (format #t "  - ~a: ~a~%"
+                      (graph-backend-name backend)
+                      (graph-backend-description backend)))
+            %graph-backends))
+
 
 ;;;
 ;;; Command-line options.
@@ -361,6 +399,14 @@ substitutes."
                 (lambda (opt name arg result)
                   (list-node-types)
                   (exit 0)))
+        (option '(#\b "backend") #t #f
+                (lambda (opt name arg result)
+                  (alist-cons 'backend (lookup-backend arg)
+                              result)))
+        (option '("list-backends") #f #f
+                (lambda (opt name arg result)
+                  (list-backends)
+                  (exit 0)))
         (option '(#\e "expression") #t #f
                 (lambda (opt name arg result)
                   (alist-cons 'expression arg result)))
@@ -378,6 +424,10 @@ substitutes."
   (display (_ "Usage: guix graph PACKAGE...
 Emit a Graphviz (dot) representation of the dependencies of PACKAGE...\n"))
   (display (_ "
+  -b, --backend=TYPE     produce a graph with the given backend TYPE"))
+  (display (_ "
+      --list-backends    list the available graph backends"))
+  (display (_ "
   -t, --type=TYPE        represent nodes of the given TYPE"))
   (display (_ "
       --list-types       list the available graph types"))
@@ -392,7 +442,8 @@ Emit a Graphviz (dot) representation of the dependencies of PACKAGE...\n"))
   (show-bug-report-information))
 
 (define %default-options
-  `((node-type . ,%package-node-type)))
+  `((node-type . ,%package-node-type)
+    (backend   . ,%graphviz-backend)))
 
 
 ;;;
@@ -407,6 +458,7 @@ Emit a Graphviz (dot) representation of the dependencies of PACKAGE...\n"))
                                  (lambda (arg result)
                                    (alist-cons 'argument arg result))
                                  %default-options))
+           (backend  (assoc-ref opts 'backend))
            (type     (assoc-ref opts 'node-type))
            (items    (filter-map (match-lambda
                                    (('argument . (? store-path? item))
@@ -429,7 +481,8 @@ Emit a Graphviz (dot) representation of the dependencies of PACKAGE...\n"))
                                              items)))
               (export-graph (concatenate nodes)
                             (current-output-port)
-                            #:node-type type)))))))
+                            #:node-type type
+                            #:backend backend)))))))
   #t)
 
 ;;; graph.scm ends here
diff --git a/guix/scripts/hash.scm b/guix/scripts/hash.scm
index a339a8556b..640b2417d2 100644
--- a/guix/scripts/hash.scm
+++ b/guix/scripts/hash.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;
@@ -116,6 +116,9 @@ and 'hexadecimal' can be used as well).\n"))
     (case (stat:type stat)
       ((directory)
        (member (basename file) '(".bzr" ".git" ".hg" ".svn" "CVS")))
+      ((regular)
+       ;; Git sub-modules have a '.git' file that is a regular text file.
+       (string=? (basename file) ".git"))
       (else
        #f)))
 
diff --git a/guix/scripts/import.scm b/guix/scripts/import.scm
index e54744feca..4d07e0fd69 100644
--- a/guix/scripts/import.scm
+++ b/guix/scripts/import.scm
@@ -73,7 +73,7 @@ rather than \\n."
 ;;; Entry point.
 ;;;
 
-(define importers '("gnu" "nix" "pypi" "cpan" "hackage" "elpa" "gem" "cran"))
+(define importers '("gnu" "nix" "pypi" "cpan" "hackage" "elpa" "gem" "cran" "crate"))
 
 (define (resolve-importer name)
   (let ((module (resolve-interface
@@ -107,10 +107,17 @@ Run IMPORTER with ARGS.\n"))
      (show-version-and-exit "guix import"))
     ((importer args ...)
      (if (member importer importers)
-         (match (apply (resolve-importer importer) args)
-           ((and expr ('package _ ...))
-            (pretty-print expr (newline-rewriting-port
-                                (current-output-port))))
-           (x
-            (leave (_ "'~a' import failed~%") importer)))
+         (let ((print (lambda (expr)
+                        (pretty-print expr (newline-rewriting-port
+                                            (current-output-port))))))
+           (match (apply (resolve-importer importer) args)
+             ((and expr ('package _ ...))
+              (print expr))
+             ((? list? expressions)
+              (for-each (lambda (expr)
+                          (print expr)
+                          (newline))
+                        expressions))
+             (x
+              (leave (_ "'~a' import failed~%") importer))))
          (leave (_ "~a: invalid importer~%") importer)))))
diff --git a/guix/scripts/import/cran.scm b/guix/scripts/import/cran.scm
index ace1123b90..66c660ae14 100644
--- a/guix/scripts/import/cran.scm
+++ b/guix/scripts/import/cran.scm
@@ -26,6 +26,7 @@
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-11)
   #:use-module (srfi srfi-37)
+  #:use-module (srfi srfi-41)
   #:use-module (ice-9 match)
   #:use-module (ice-9 format)
   #:export (guix-import-cran))
@@ -63,6 +64,9 @@ Import and convert the CRAN package for PACKAGE-NAME.\n"))
                  (lambda (opt name arg result)
                    (alist-cons 'repo (string->symbol arg)
                                (alist-delete 'repo result))))
+         (option '(#\r "recursive") #f #f
+                 (lambda (opt name arg result)
+                   (alist-cons 'recursive #t result)))
          %standard-import-options))
 
 
@@ -88,12 +92,22 @@ Import and convert the CRAN package for PACKAGE-NAME.\n"))
                            (reverse opts))))
     (match args
       ((package-name)
-       (let ((sexp (cran->guix-package package-name
-                                       (or (assoc-ref opts 'repo) 'cran))))
-         (unless sexp
-           (leave (_ "failed to download description for package '~a'~%")
-                  package-name))
-         sexp))
+       (if (assoc-ref opts 'recursive)
+           ;; Recursive import
+           (map (match-lambda
+                  ((and ('package ('name name) . rest) pkg)
+                   `(define-public ,(string->symbol name)
+                      ,pkg))
+                  (_ #f))
+                (stream->list (recursive-import package-name
+                                                (or (assoc-ref opts 'repo) 'cran))))
+           ;; Single import
+           (let ((sexp (cran->guix-package package-name
+                                           (or (assoc-ref opts 'repo) 'cran))))
+             (unless sexp
+               (leave (_ "failed to download description for package '~a'~%")
+                      package-name))
+             sexp)))
       (()
        (leave (_ "too few arguments~%")))
       ((many ...)
diff --git a/guix/scripts/import/crate.scm b/guix/scripts/import/crate.scm
new file mode 100644
index 0000000000..4337a0b623
--- /dev/null
+++ b/guix/scripts/import/crate.scm
@@ -0,0 +1,94 @@
+
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2014 David Thompson <davet@gnu.org>
+;;; Copyright © 2016 David Craven <david@craven.ch>
+;;;
+;;; 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 scripts import crate)
+  #:use-module (guix ui)
+  #:use-module (guix utils)
+  #:use-module (guix scripts)
+  #:use-module (guix import crate)
+  #:use-module (guix scripts import)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-11)
+  #:use-module (srfi srfi-37)
+  #:use-module (ice-9 match)
+  #:use-module (ice-9 format)
+  #:export (guix-import-crate))
+
+
+;;;
+;;; Command-line options.
+;;;
+
+(define %default-options
+  '())
+
+(define (show-help)
+  (display (_ "Usage: guix import crate PACKAGE-NAME
+Import and convert the crate.io package for PACKAGE-NAME.\n"))
+  (display (_ "
+  -h, --help             display this help and exit"))
+  (display (_ "
+  -V, --version          display version information and exit"))
+  (newline)
+  (show-bug-report-information))
+
+(define %options
+  ;; Specification of the command-line options.
+  (cons* (option '(#\h "help") #f #f
+                 (lambda args
+                   (show-help)
+                   (exit 0)))
+         (option '(#\V "version") #f #f
+                 (lambda args
+                   (show-version-and-exit "guix import crate")))
+         %standard-import-options))
+
+
+;;;
+;;; Entry point.
+;;;
+
+(define (guix-import-crate . args)
+  (define (parse-options)
+    ;; Return the alist of option values.
+    (args-fold* args %options
+                (lambda (opt name arg result)
+                  (leave (_ "~A: unrecognized option~%") name))
+                (lambda (arg result)
+                  (alist-cons 'argument arg result))
+                %default-options))
+
+  (let* ((opts (parse-options))
+         (args (filter-map (match-lambda
+                            (('argument . value)
+                             value)
+                            (_ #f))
+                           (reverse opts))))
+    (match args
+      ((package-name)
+       (let ((sexp (crate->guix-package package-name)))
+         (unless sexp
+           (leave (_ "failed to download meta-data for package '~a'~%")
+                  package-name))
+         sexp))
+      (()
+       (leave (_ "too few arguments~%")))
+      ((many ...)
+       (leave (_ "too many arguments~%"))))))
diff --git a/guix/scripts/offload.scm b/guix/scripts/offload.scm
index c98cf8c534..6a4ae28689 100644
--- a/guix/scripts/offload.scm
+++ b/guix/scripts/offload.scm
@@ -27,6 +27,7 @@
   #:use-module (ssh version)
   #:use-module (guix config)
   #:use-module (guix records)
+  #:use-module (guix ssh)
   #:use-module (guix store)
   #:use-module (guix derivations)
   #:use-module ((guix serialization)
@@ -221,53 +222,6 @@ instead of '~a' of type '~a'~%")
        (leave (_ "failed to connect to '~a': ~a~%")
               (build-machine-name machine) (get-error session))))))
 
-(define* (connect-to-remote-daemon session
-                                   #:optional
-                                   (socket-name "/var/guix/daemon-socket/socket"))
-  "Connect to the remote build daemon listening on SOCKET-NAME over SESSION,
-an SSH session.  Return a <nix-server> object."
-  (define redirect
-    ;; Code run in SESSION to redirect the remote process' stdin/stdout to the
-    ;; daemon's socket, à la socat.  The SSH protocol supports forwarding to
-    ;; Unix-domain sockets but libssh doesn't have an API for that, hence this
-    ;; hack.
-    `(begin
-       (use-modules (ice-9 match) (rnrs io ports))
-
-       (let ((sock   (socket AF_UNIX SOCK_STREAM 0))
-             (stdin  (current-input-port))
-             (stdout (current-output-port)))
-         (setvbuf stdin _IONBF)
-         (setvbuf stdout _IONBF)
-         (connect sock AF_UNIX ,socket-name)
-
-         (let loop ()
-           (match (select (list stdin sock) '() (list stdin stdout sock))
-             ((reads writes ())
-              (when (memq stdin reads)
-                (match (get-bytevector-some stdin)
-                  ((? eof-object?)
-                   (primitive-exit 0))
-                  (bv
-                   (put-bytevector sock bv))))
-              (when (memq sock reads)
-                (match (get-bytevector-some sock)
-                  ((? eof-object?)
-                   (primitive-exit 0))
-                  (bv
-                   (put-bytevector stdout bv))))
-              (loop))
-             (_
-              (primitive-exit 1)))))))
-
-  (let ((channel
-         (open-remote-pipe* session OPEN_BOTH
-                            ;; Sort-of shell-quote REDIRECT.
-                            "guile" "-c"
-                            (object->string
-                             (object->string redirect)))))
-    (open-connection #:port channel)))
-
 
 ;;;
 ;;; Synchronization.
@@ -382,8 +336,9 @@ MACHINE."
   ;; Protect DRV from garbage collection.
   (add-temp-root store (derivation-file-name drv))
 
-  (send-files (cons (derivation-file-name drv) inputs)
-              store)
+  (with-store local
+    (send-files local (cons (derivation-file-name drv) inputs) store
+                #:log-port (current-output-port)))
   (format (current-error-port) "offloading '~a' to '~a'...~%"
           (derivation-file-name drv) (build-machine-name machine))
   (format (current-error-port) "@ build-remote ~a ~a~%"
@@ -401,93 +356,17 @@ MACHINE."
     (parameterize ((current-build-output-port (build-log-port)))
       (build-derivations store (list drv))))
 
-  (retrieve-files outputs store)
+  (retrieve-files* outputs store)
   (format (current-error-port) "done with offloaded '~a'~%"
           (derivation-file-name drv)))
 
-(define (store-import-channel session)
-  "Return an output port to which archives to be exported to SESSION's store
-can be written."
-  ;; Using the 'import-paths' RPC on a remote store would be slow because it
-  ;; makes a round trip every time 32 KiB have been transferred.  This
-  ;; procedure instead opens a separate channel to use the remote
-  ;; 'import-paths' procedure, which consumes all the data in a single round
-  ;; trip.
-  (define import
-    `(begin
-       (use-modules (guix))
-
-       (with-store store
-         (setvbuf (current-input-port) _IONBF)
-         (import-paths store (current-input-port)))))
-
-  (open-remote-output-pipe session
-                           (string-join
-                            `("guile" "-c"
-                              ,(object->string
-                                (object->string import))))))
-
-(define (store-export-channel session files)
-  "Return an input port from which an export of FILES from SESSION's store can
-be read."
-  ;; Same as above: this is more efficient than calling 'export-paths' on a
-  ;; remote store.
-  (define export
-    `(begin
-       (use-modules (guix))
-
-       (with-store store
-         (setvbuf (current-output-port) _IONBF)
-         (export-paths store ',files (current-output-port)))))
-
-  (open-remote-input-pipe session
-                          (string-join
-                           `("guile" "-c"
-                             ,(object->string
-                               (object->string export))))))
-
-(define (send-files files remote)
-  "Send the subset of FILES that's missing to REMOTE, a remote store."
-  (with-store store
-    ;; Compute the subset of FILES missing on SESSION and send them.
-    (let* ((session (channel-get-session (nix-server-socket remote)))
-           (node    (make-node session))
-           (missing (node-eval node
-                               `(begin
-                                  (use-modules (guix)
-                                               (srfi srfi-1) (srfi srfi-26))
-
-                                  (with-store store
-                                    (remove (cut valid-path? store <>)
-                                            ',files)))))
-           (count   (length missing))
-           (port    (store-import-channel session)))
-      (format #t (N_ "sending ~a store item to '~a'...~%"
-                     "sending ~a store items to '~a'...~%" count)
-              count (session-get session 'host))
-
-      ;; Send MISSING in topological order.
-      (export-paths store missing port)
-
-      ;; Tell the remote process that we're done.  (In theory the
-      ;; end-of-archive mark of 'export-paths' would be enough, but in
-      ;; practice it's not.)
-      (channel-send-eof port)
-
-      ;; Wait for completion of the remote process.
-      (let ((result (zero? (channel-get-exit-status port))))
-        (close-port port)
-        result))))
-
-(define (retrieve-files files remote)
-  "Retrieve FILES from SESSION's store, and import them."
-  (let* ((session (channel-get-session (nix-server-socket remote)))
-         (host    (session-get session 'host))
-         (port    (store-export-channel session files))
-         (count   (length files)))
+(define (retrieve-files* files remote)
+  "Retrieve FILES from REMOTE and import them using 'restore-file-set'."
+  (let-values (((port count)
+                (file-retrieval-port files remote)))
     (format #t (N_ "retrieving ~a store item from '~a'...~%"
                    "retrieving ~a store items from '~a'...~%" count)
-            count host)
+            count (remote-store-host remote))
 
     ;; We cannot use the 'import-paths' RPC here because we already
     ;; hold the locks for FILES.
@@ -677,8 +556,8 @@ allowed on MACHINE.  Return +∞ if MACHINE is unreachable."
   (delay
     (seed->random-state (logxor (getpid) (car (gettimeofday))))))
 
-(define (nonce)
-  (string-append (gethostname) "-"
+(define* (nonce #:optional (name (gethostname)))
+  (string-append name "-"
                  (number->string (random 1000000 (force %random-state)))))
 
 (define (assert-node-can-import node name daemon-socket)
@@ -687,7 +566,9 @@ allowed on MACHINE.  Return +∞ if MACHINE is unreachable."
     (with-store store
       (let* ((item   (add-text-to-store store "export-test" (nonce)))
              (remote (connect-to-remote-daemon session daemon-socket)))
-        (send-files (list item) remote)
+        (with-store local
+          (send-files local (list item) remote))
+
         (if (valid-path? remote item)
             (info (_ "'~a' successfully imported '~a'~%")
                   name item)
@@ -698,10 +579,9 @@ allowed on MACHINE.  Return +∞ if MACHINE is unreachable."
   "Bail out if we cannot import signed archives from NODE."
   (let* ((session (node-session node))
          (remote  (connect-to-remote-daemon session daemon-socket))
-         (item    (add-text-to-store remote "import-test" (nonce)))
-         (port    (store-export-channel session (list item))))
+         (item    (add-text-to-store remote "import-test" (nonce name))))
     (with-store store
-      (if (and (import-paths store port)
+      (if (and (retrieve-files store (list item) remote)
                (valid-path? store item))
           (info (_ "successfully imported '~a' from '~a'~%")
                 item name)
diff --git a/guix/scripts/package.scm b/guix/scripts/package.scm
index 96a22f6fab..9e5b7f3c75 100644
--- a/guix/scripts/package.scm
+++ b/guix/scripts/package.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
 ;;; Copyright © 2013, 2015 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2014, 2016 Alex Kost <alezost@gmail.com>
@@ -200,7 +200,8 @@ specified in MANIFEST, a manifest object."
                      (profile-derivation manifest
                                          #:hooks (if bootstrap?
                                                      '()
-                                                     %default-profile-hooks))))
+                                                     %default-profile-hooks)
+                                         #:locales? (not bootstrap?))))
          (prof     (derivation->output-path prof-drv)))
     (show-what-to-build store (list prof-drv)
                         #:use-substitutes? use-substitutes?
@@ -576,11 +577,12 @@ upgrading, #f otherwise."
 (define (store-item->manifest-entry item)
   "Return a manifest entry for ITEM, a \"/gnu/store/...\" file name."
   (let-values (((name version)
-                (package-name->name+version (store-path-package-name item))))
+                (package-name->name+version (store-path-package-name item)
+                                            #\-)))
     (manifest-entry
       (name name)
       (version version)
-      (output #f)
+      (output "out")                              ;XXX: wild guess
       (item item))))
 
 (define (options->installable opts manifest transaction)
diff --git a/guix/scripts/perform-download.scm b/guix/scripts/perform-download.scm
index 0d2e7089aa..59ade0a8c1 100644
--- a/guix/scripts/perform-download.scm
+++ b/guix/scripts/perform-download.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -19,7 +19,7 @@
 (define-module (guix scripts perform-download)
   #:use-module (guix ui)
   #:use-module (guix derivations)
-  #:use-module ((guix store) #:select (derivation-path?))
+  #:use-module ((guix store) #:select (derivation-path? store-path?))
   #:use-module (guix build download)
   #:use-module (ice-9 match)
   #:export (guix-perform-download))
@@ -41,17 +41,23 @@
     (module-use! module (resolve-interface '(guix base32)))
     module))
 
-(define (perform-download drv)
-  "Perform the download described by DRV, a fixed-output derivation."
+(define* (perform-download drv #:optional output)
+  "Perform the download described by DRV, a fixed-output derivation, to
+OUTPUT.
+
+Note: Unless OUTPUT is #f, we don't read the value of 'out' in DRV since the
+actual output is different from that when we're doing a 'bmCheck' or
+'bmRepair' build."
   (derivation-let drv ((url "url")
-                       (output "out")
+                       (output* "out")
                        (executable "executable")
                        (mirrors "mirrors")
                        (content-addressed-mirrors "content-addressed-mirrors"))
     (unless url
       (leave (_ "~a: missing URL~%") (derivation-file-name drv)))
 
-    (let* ((url        (call-with-input-string url read))
+    (let* ((output     (or output output*))
+           (url        (call-with-input-string url read))
            (drv-output (assoc-ref (derivation-outputs drv) "out"))
            (algo       (derivation-output-hash-algo drv-output))
            (hash       (derivation-output-hash drv-output)))
@@ -91,20 +97,25 @@ the daemon and not explicitly described as an input of the derivation.  This
 allows us to sidestep bootstrapping problems, such downloading the source code
 of GnuTLS over HTTPS, before we have built GnuTLS.  See
 <http://bugs.gnu.org/22774>."
+
+  ;; This program must be invoked by guix-daemon under an unprivileged UID to
+  ;; prevent things downloading from 'file:///etc/shadow' or arbitrary code
+  ;; execution via the content-addressed mirror procedures.  (That means we
+  ;; exclude users who did not pass '--build-users-group'.)
   (with-error-handling
     (match args
-      (((? derivation-path? drv))
-       ;; This program must be invoked by guix-daemon under an unprivileged
-       ;; UID to prevent things downloading from 'file:///etc/shadow' or
-       ;; arbitrary code execution via the content-addressed mirror
-       ;; procedures.  (That means we exclude users who did not pass
-       ;; '--build-users-group'.)
+      (((? derivation-path? drv) (? store-path? output))
+       (assert-low-privileges)
+       (perform-download (call-with-input-file drv read-derivation)
+                         output))
+      (((? derivation-path? drv))                 ;backward compatibility
        (assert-low-privileges)
        (perform-download (call-with-input-file drv read-derivation)))
       (("--version")
        (show-version-and-exit))
       (x
-       (leave (_ "fixed-output derivation name expected~%"))))))
+       (leave
+        (_ "fixed-output derivation and output file name expected~%"))))))
 
 ;; Local Variables:
 ;; eval: (put 'derivation-let 'scheme-indent-function 2)
diff --git a/guix/scripts/refresh.scm b/guix/scripts/refresh.scm
index f8fb3f80ca..0dd7eee974 100644
--- a/guix/scripts/refresh.scm
+++ b/guix/scripts/refresh.scm
@@ -209,7 +209,8 @@ unavailable optional dependencies such as Guile-JSON."
                  ((guix import cpan) => %cpan-updater)
                  ((guix import pypi) => %pypi-updater)
                  ((guix import gem) => %gem-updater)
-                 ((guix import github) => %github-updater)))
+                 ((guix import github) => %github-updater)
+                 ((guix import crate) => %crate-updater)))
 
 (define (lookup-updater-by-name name)
   "Return the updater called NAME."
diff --git a/guix/ssh.scm b/guix/ssh.scm
new file mode 100644
index 0000000000..3548243839
--- /dev/null
+++ b/guix/ssh.scm
@@ -0,0 +1,226 @@
+;;; 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 ssh)
+  #:use-module (guix store)
+  #:autoload   (guix ui) (N_)
+  #:use-module (ssh channel)
+  #:use-module (ssh popen)
+  #:use-module (ssh session)
+  #:use-module (ssh dist)
+  #:use-module (ssh dist node)
+  #:use-module (srfi srfi-11)
+  #:use-module (srfi srfi-34)
+  #:use-module (srfi srfi-35)
+  #:use-module (ice-9 match)
+  #:use-module (ice-9 binary-ports)
+  #:export (connect-to-remote-daemon
+            send-files
+            retrieve-files
+            remote-store-host
+
+            file-retrieval-port))
+
+;;; Commentary:
+;;;
+;;; This module provides tools to support communication with remote stores
+;;; over SSH, using Guile-SSH.
+;;;
+;;; Code:
+
+(define* (connect-to-remote-daemon session
+                                   #:optional
+                                   (socket-name "/var/guix/daemon-socket/socket"))
+  "Connect to the remote build daemon listening on SOCKET-NAME over SESSION,
+an SSH session.  Return a <nix-server> object."
+  (define redirect
+    ;; Code run in SESSION to redirect the remote process' stdin/stdout to the
+    ;; daemon's socket, à la socat.  The SSH protocol supports forwarding to
+    ;; Unix-domain sockets but libssh doesn't have an API for that, hence this
+    ;; hack.
+    `(begin
+       (use-modules (ice-9 match) (rnrs io ports))
+
+       (let ((sock   (socket AF_UNIX SOCK_STREAM 0))
+             (stdin  (current-input-port))
+             (stdout (current-output-port)))
+         (setvbuf stdin _IONBF)
+         (setvbuf stdout _IONBF)
+         (connect sock AF_UNIX ,socket-name)
+
+         (let loop ()
+           (match (select (list stdin sock) '() (list stdin stdout sock))
+             ((reads writes ())
+              (when (memq stdin reads)
+                (match (get-bytevector-some stdin)
+                  ((? eof-object?)
+                   (primitive-exit 0))
+                  (bv
+                   (put-bytevector sock bv))))
+              (when (memq sock reads)
+                (match (get-bytevector-some sock)
+                  ((? eof-object?)
+                   (primitive-exit 0))
+                  (bv
+                   (put-bytevector stdout bv))))
+              (loop))
+             (_
+              (primitive-exit 1)))))))
+
+  (let ((channel
+         (open-remote-pipe* session OPEN_BOTH
+                            ;; Sort-of shell-quote REDIRECT.
+                            "guile" "-c"
+                            (object->string
+                             (object->string redirect)))))
+    (open-connection #:port channel)))
+
+(define (store-import-channel session)
+  "Return an output port to which archives to be exported to SESSION's store
+can be written."
+  ;; Using the 'import-paths' RPC on a remote store would be slow because it
+  ;; makes a round trip every time 32 KiB have been transferred.  This
+  ;; procedure instead opens a separate channel to use the remote
+  ;; 'import-paths' procedure, which consumes all the data in a single round
+  ;; trip.
+  (define import
+    `(begin
+       (use-modules (guix))
+
+       (with-store store
+         (setvbuf (current-input-port) _IONBF)
+
+         ;; FIXME: Exceptions are silently swallowed.  We should report them
+         ;; somehow.
+         (import-paths store (current-input-port)))))
+
+  (open-remote-output-pipe session
+                           (string-join
+                            `("guile" "-c"
+                              ,(object->string
+                                (object->string import))))))
+
+(define* (store-export-channel session files
+                               #:key recursive?)
+  "Return an input port from which an export of FILES from SESSION's store can
+be read.  When RECURSIVE? is true, the closure of FILES is exported."
+  ;; Same as above: this is more efficient than calling 'export-paths' on a
+  ;; remote store.
+  (define export
+    `(begin
+       (use-modules (guix))
+
+       (with-store store
+         (setvbuf (current-output-port) _IONBF)
+
+         ;; FIXME: Exceptions are silently swallowed.  We should report them
+         ;; somehow.
+         (export-paths store ',files (current-output-port)
+                       #:recursive? ,recursive?))))
+
+  (open-remote-input-pipe session
+                          (string-join
+                           `("guile" "-c"
+                             ,(object->string
+                               (object->string export))))))
+
+(define* (send-files local files remote
+                     #:key
+                     recursive?
+                     (log-port (current-error-port)))
+  "Send the subset of FILES from LOCAL (a local store) that's missing to
+REMOTE, a remote store.  When RECURSIVE? is true, send the closure of FILES.
+Return the list of store items actually sent."
+  ;; Compute the subset of FILES missing on SESSION and send them.
+  (let* ((files   (if recursive? (requisites local files) files))
+         (session (channel-get-session (nix-server-socket remote)))
+         (node    (make-node session))
+         (missing (node-eval node
+                             `(begin
+                                (use-modules (guix)
+                                             (srfi srfi-1) (srfi srfi-26))
+
+                                (with-store store
+                                  (remove (cut valid-path? store <>)
+                                          ',files)))))
+         (count   (length missing))
+         (port    (store-import-channel session)))
+    (format log-port (N_ "sending ~a store item to '~a'...~%"
+                         "sending ~a store items to '~a'...~%" count)
+            count (session-get session 'host))
+
+    ;; Send MISSING in topological order.
+    (export-paths local missing port)
+
+    ;; Tell the remote process that we're done.  (In theory the end-of-archive
+    ;; mark of 'export-paths' would be enough, but in practice it's not.)
+    (channel-send-eof port)
+
+    ;; Wait for completion of the remote process.
+    (let ((result (zero? (channel-get-exit-status port))))
+      (close-port port)
+      missing)))
+
+(define (remote-store-session remote)
+  "Return the SSH channel beneath REMOTE, a remote store as returned by
+'connect-to-remote-daemon', or #f."
+  (channel-get-session (nix-server-socket remote)))
+
+(define (remote-store-host remote)
+  "Return the name of the host REMOTE is connected to, where REMOTE is a
+remote store as returned by 'connect-to-remote-daemon'."
+  (match (remote-store-session remote)
+    (#f #f)
+    ((? session? session)
+     (session-get session 'host))))
+
+(define* (file-retrieval-port files remote
+                              #:key recursive?)
+  "Return an input port from which to retrieve FILES (a list of store items)
+from REMOTE, along with the number of items to retrieve (lower than or equal
+to the length of FILES.)"
+  (values (store-export-channel (remote-store-session remote) files
+                                #:recursive? recursive?)
+          (length files)))            ;XXX: inaccurate when RECURSIVE? is true
+
+(define* (retrieve-files local files remote
+                         #:key recursive? (log-port (current-error-port)))
+  "Retrieve FILES from REMOTE and import them using the 'import-paths' RPC on
+LOCAL.  When RECURSIVE? is true, retrieve the closure of FILES."
+  (let-values (((port count)
+                (file-retrieval-port files remote
+                                     #:recursive? recursive?)))
+    (format #t (N_ "retrieving ~a store item from '~a'...~%"
+                   "retrieving ~a store items from '~a'...~%" count)
+            count (remote-store-host remote))
+    (when (eof-object? (lookahead-u8 port))
+      ;; The failure could be because one of the requested store items is not
+      ;; valid on REMOTE, or because Guile or Guix is improperly installed.
+      ;; TODO: Improve error reporting.
+      (raise (condition
+              (&message
+               (message
+                (format #f
+                        (_ "failed to retrieve store items from '~a'")
+                        (remote-store-host remote)))))))
+
+    (let ((result (import-paths local port)))
+      (close-port port)
+      result)))
+
+;;; ssh.scm ends here
diff --git a/guix/ui.scm b/guix/ui.scm
index cafb3c6705..7d4c437354 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2013 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
 ;;; Copyright © 2014 Cyril Roelandt <tipecaml@gmail.com>
@@ -306,7 +306,13 @@ exiting.  ARGS is the list of arguments received by the 'throw' handler."
   "Display version information for COMMAND and `(exit 0)'."
   (simple-format #t "~a (~a) ~a~%"
                  command %guix-package-name %guix-version)
-  (display (_ "Copyright (C) 2016 the Guix authors
+  (format #t "Copyright ~a 2017 ~a"
+          ;; TRANSLATORS: Translate "(C)" to the copyright symbol
+          ;; (C-in-a-circle), if this symbol is available in the user's
+          ;; locale.  Otherwise, do not translate "(C)"; leave it as-is.  */
+          (_ "(C)")
+          (_ "the Guix authors\n"))
+  (display (_"\
 License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
 This is free software: you are free to change and redistribute it.
 There is NO WARRANTY, to the extent permitted by law.
diff --git a/guix/upstream.scm b/guix/upstream.scm
index 8685afd860..2334c4c0a6 100644
--- a/guix/upstream.scm
+++ b/guix/upstream.scm
@@ -241,12 +241,16 @@ and 'interactive' (default)."
                    ((archive-type)
                     (match (and=> (package-source package) origin-uri)
                       ((? string? uri)
-                       (or (file-extension uri) "gz"))
+                       (file-extension (basename uri)))
                       (_
                        "gz")))
                    ((url signature-url)
                     (find2 (lambda (url sig-url)
-                             (string-suffix? archive-type url))
+                             ;; Some URIs lack a file extension, like
+                             ;; 'https://crates.io/???/0.1/download'.  In that
+                             ;; case, pick the first URL.
+                             (or (not archive-type)
+                                 (string-suffix? archive-type url)))
                            urls
                            (or signature-urls (circular-list #f)))))
        (let ((tarball (download-tarball store url signature-url
diff --git a/guix/utils.scm b/guix/utils.scm
index 06f49daca8..ee06e47fe9 100644
--- a/guix/utils.scm
+++ b/guix/utils.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2013, 2014, 2015 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2014 Ian Denhardt <ian@zenhack.net>
@@ -500,11 +500,13 @@ returned by `config.guess'."
   ;; cross-building to.
   (make-parameter #f))
 
-(define (package-name->name+version spec)
+(define* (package-name->name+version spec
+                                     #:optional (delimiter #\@))
   "Given SPEC, a package name like \"foo@0.9.1b\", return two values: \"foo\"
 and \"0.9.1b\".  When the version part is unavailable, SPEC and #f are
-returned.  Both parts must not contain any '@'."
-  (match (string-rindex spec #\@)
+returned.  Both parts must not contain any '@'.  Optionally, DELIMITER can be
+a character other than '@'."
+  (match (string-rindex spec delimiter)
     (#f  (values spec #f))
     (idx (values (substring spec 0 idx)
                  (substring spec (1+ idx))))))
diff --git a/nix/libstore/build.cc b/nix/libstore/build.cc
index e823001788..cebc404d1c 100644
--- a/nix/libstore/build.cc
+++ b/nix/libstore/build.cc
@@ -1680,7 +1680,11 @@ void DerivationGoal::startBuilder()
             % drv.platform % settings.thisSystem % drvPath);
     }
 
-    useChroot = settings.useChroot;
+    /* Note: built-in builders are *not* running in a chroot environment so
+       that we can easily implement them in Guile without having it as a
+       derivation input (they are running under a separate build user,
+       though).  */
+    useChroot = settings.useChroot && !isBuiltin(drv);
 
     /* Construct the environment passed to the builder. */
     env.clear();
@@ -2048,12 +2052,7 @@ void DerivationGoal::runChild()
         commonChildInit(builderOut);
 
 #if CHROOT_ENABLED
-	/* Note: built-in builders are *not* running in a chroot environment
-	   so that we can easily implement them in Guile without having it as
-	   a derivation input (they are running under a separate build user,
-	   though).  */
-
-        if (useChroot && !isBuiltin(drv)) {
+        if (useChroot) {
             /* Initialise the loopback interface. */
             AutoCloseFD fd(socket(PF_INET, SOCK_DGRAM, IPPROTO_IP));
             if (fd == -1) throw SysError("cannot open IP socket");
@@ -2272,8 +2271,17 @@ void DerivationGoal::runChild()
                 logType = ltFlat;
 
 		auto buildDrv = lookupBuiltinBuilder(drv.builder);
-                if (buildDrv != NULL)
-                    buildDrv(drv, drvPath);
+                if (buildDrv != NULL) {
+		    /* Check what the output file name is.  When doing a
+		       'bmCheck' build, the output file name is different from
+		       that specified in DRV due to hash rewriting.  */
+		    Path output = drv.outputs["out"].path;
+		    auto redirected = redirectedOutputs.find(output);
+		    if (redirected != redirectedOutputs.end())
+			output = redirected->second;
+
+                    buildDrv(drv, drvPath, output);
+		}
                 else
                     throw Error(format("unsupported builtin function '%1%'") % string(drv.builder, 8));
                 _exit(0);
@@ -2743,6 +2751,8 @@ Path DerivationGoal::addHashRewrite(const Path & path)
     rewritesToTmp[h1] = h2;
     rewritesFromTmp[h2] = h1;
     redirectedOutputs[path] = p;
+    printMsg(lvlChatty, format("output '%1%' redirected to '%2%'")
+	     % path % p);
     return p;
 }
 
diff --git a/nix/libstore/builtins.cc b/nix/libstore/builtins.cc
index 32af767dc4..7ed75e5079 100644
--- a/nix/libstore/builtins.cc
+++ b/nix/libstore/builtins.cc
@@ -1,5 +1,5 @@
 /* GNU Guix --- Functional package management for GNU
-   Copyright (C) 2016 Ludovic Courtès <ludo@gnu.org>
+   Copyright (C) 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 
    This file is part of GNU Guix.
 
@@ -25,7 +25,8 @@
 namespace nix {
 
 static void builtinDownload(const Derivation &drv,
-			    const std::string &drvPath)
+			    const std::string &drvPath,
+			    const std::string &output)
 {
     /* Invoke 'guix perform-download'.  */
     Strings args;
@@ -35,7 +36,10 @@ static void builtinDownload(const Derivation &drv,
     /* Close all other file descriptors. */
     closeMostFDs(set<int>());
 
-    const char *const argv[] = { "download", drvPath.c_str(), NULL };
+    const char *const argv[] =
+      {
+	"download", drvPath.c_str(), output.c_str(), NULL
+      };
 
     /* XXX: Hack our way to use the 'download' script from 'LIBEXECDIR/guix'
        or just 'LIBEXECDIR', depending on whether we're running uninstalled or
diff --git a/nix/libstore/builtins.hh b/nix/libstore/builtins.hh
index 79171fcb6c..396ea14ebc 100644
--- a/nix/libstore/builtins.hh
+++ b/nix/libstore/builtins.hh
@@ -1,5 +1,5 @@
 /* GNU Guix --- Functional package management for GNU
-   Copyright (C) 2016 Ludovic Courtès <ludo@gnu.org>
+   Copyright (C) 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 
    This file is part of GNU Guix.
 
@@ -33,7 +33,8 @@ namespace nix {
 
     /* Build DRV, which lives at DRVPATH.  */
     typedef void (*derivationBuilder) (const Derivation &drv,
-				       const std::string &drvPath);
+				       const std::string &drvPath,
+				       const std::string &output);
 
     /* Return the built-in builder called BUILDER, or NULL if none was
        found.  */
diff --git a/nix/local.mk b/nix/local.mk
index 79667ed49e..eb70d266fb 100644
--- a/nix/local.mk
+++ b/nix/local.mk
@@ -22,7 +22,7 @@
 #
 
 BUILT_SOURCES += %D%/libstore/schema.sql.hh
-CLEANFILES += $(BUILT_SOURCES) etc/guix-daemon.service etc/guix-daemon.conf
+CLEANFILES += $(BUILT_SOURCES)
 
 noinst_LIBRARIES = libformat.a libutil.a libstore.a
 
@@ -189,9 +189,9 @@ nodist_systemdservice_DATA = etc/guix-daemon.service etc/guix-publish.service
 
 etc/guix-%.service: etc/guix-%.service.in	\
 			 $(top_builddir)/config.status
-	$(AM_V_GEN)$(MKDIR_P) "`dirname $@`";				\
-	$(SED) -e 's|@''bindir''@|$(bindir)|' <				\
-	       "$(srcdir)/$<" > "$@.tmp";	\
+	$(AM_V_GEN)$(MKDIR_P) "`dirname $@`";	\
+	$(SED) -e 's|@''bindir''@|$(bindir)|' <	\
+	       "$<" > "$@.tmp";		\
 	mv "$@.tmp" "$@"
 
 # The '.conf' jobs for Upstart.
@@ -200,17 +200,23 @@ nodist_upstartjob_DATA = etc/guix-daemon.conf etc/guix-publish.conf
 
 etc/guix-%.conf: etc/guix-%.conf.in	\
 			 $(top_builddir)/config.status
-	$(AM_V_GEN)$(MKDIR_P) "`dirname $@`";				\
-	$(SED) -e 's|@''bindir''@|$(bindir)|' <				\
-	       "$(srcdir)/$<" > "$@.tmp";		\
+	$(AM_V_GEN)$(MKDIR_P) "`dirname $@`";	\
+	$(SED) -e 's|@''bindir''@|$(bindir)|' <	\
+	       "$<" > "$@.tmp";		\
 	mv "$@.tmp" "$@"
 
+CLEANFILES +=					\
+  $(nodist_systemdservice_DATA)			\
+  $(nodist_upstartjob_DATA)
+
 EXTRA_DIST +=					\
   %D%/libstore/schema.sql			\
   %D%/AUTHORS					\
   %D%/COPYING					\
-  etc/guix-daemon.service.in	\
-  etc/guix-daemon.conf.in
+  etc/guix-daemon.service.in			\
+  etc/guix-daemon.conf.in			\
+  etc/guix-publish.service.in			\
+  etc/guix-publish.conf.in
 
 if CAN_RUN_TESTS
 
diff --git a/po/guix/POTFILES.in b/po/guix/POTFILES.in
index 27cc64929d..0a2eee8170 100644
--- a/po/guix/POTFILES.in
+++ b/po/guix/POTFILES.in
@@ -24,6 +24,7 @@ guix/scripts/edit.scm
 guix/scripts/size.scm
 guix/scripts/graph.scm
 guix/scripts/challenge.scm
+guix/scripts/copy.scm
 guix/gnu-maintenance.scm
 guix/scripts/container.scm
 guix/scripts/container/exec.scm
diff --git a/po/guix/da.po b/po/guix/da.po
index 0e6ae3ad43..cf42db8658 100644
--- a/po/guix/da.po
+++ b/po/guix/da.po
@@ -4,6 +4,7 @@
 # Joe Hansen <joedalton2@yahoo.dk>, 2015, 2016.
 #
 # build -> kompilering
+# derivation -> derivat
 # emit -> opret
 # garbage -> affald (spild, bedre forslag?)
 # in a row -> i træk
@@ -12,10 +13,10 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: guix 0.11.0\n"
+"Project-Id-Version: guix 0.12.0\n"
 "Report-Msgid-Bugs-To: ludo@gnu.org\n"
-"POT-Creation-Date: 2016-07-29 10:16+0200\n"
-"PO-Revision-Date: 2016-12-04 19:31+01:00\n"
+"POT-Creation-Date: 2016-12-18 15:32+0100\n"
+"PO-Revision-Date: 2016-12-18 19:31+01:00\n"
 "Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n"
 "Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
 "Language: da\n"
@@ -55,85 +56,95 @@ msgstr "vælger ~a fra ~a~%"
 msgid "deprecated NAME-VERSION syntax; use NAME@VERSION instead~%"
 msgstr "forældet NAVN-VERSION-syntaks; brug NAVN@VERSION i stedet for~%"
 
-#: gnu/packages.scm:311
+#: gnu/packages.scm:311 guix/scripts/package.scm:272
+#, scheme-format
+msgid "package '~a' has been superseded by '~a'~%"
+msgstr "pakken »~a« er blevet efterfulgt af »~a«~%"
+
+#: gnu/packages.scm:318
 #, scheme-format
 msgid "~A: package not found for version ~a~%"
 msgstr "~A: pakke ikke fundet for version ~a~%"
 
-#: gnu/packages.scm:321
+#: gnu/packages.scm:328
 #, scheme-format
 msgid "~A: unknown package~%"
 msgstr "~A: ukendt pakke~%"
 
-#: gnu/packages.scm:349
+#: gnu/packages.scm:356
 #, scheme-format
 msgid "package `~a' lacks output `~a'~%"
 msgstr "pakke »~a« mangler uddata »~a«~%"
 
-#: gnu/services.scm:540
+#: gnu/services.scm:542
 #, scheme-format
 msgid "no target of type '~a' for service ~s"
 msgstr "intet mål af typen »~a« for tjeneste ~s"
 
-#: gnu/services.scm:551 gnu/services.scm:612
+#: gnu/services.scm:553 gnu/services.scm:614
 #, scheme-format
 msgid "more than one target service of type '~a'"
 msgstr "mere end en måltjeneste af typen »~a«"
 
-#: gnu/services.scm:602
+#: gnu/services.scm:604
 #, scheme-format
 msgid "service of type '~a' not found"
 msgstr "tjenste af typen »~a« blev ikke fundet"
 
-#: gnu/system.scm:500
+#: gnu/system.scm:522
 #, scheme-format
 msgid "using a string for file '~a' is deprecated; use 'plain-file' instead~%"
 msgstr "brug af en streng for filen »~a« er forældet; brug »plain-file« i stedet~%"
 
-#: gnu/system.scm:516
+#: gnu/system.scm:538
 #, scheme-format
 msgid "using a monadic value for '~a' is deprecated; use 'plain-file' instead~%"
 msgstr "brug af en unik værdi for »~a« er forældet; brug »plain-file« i stedet~%"
 
-#: gnu/system.scm:650
+#: gnu/system.scm:680
 #, scheme-format
 msgid "~a: invalid locale name"
 msgstr "~a: ugyldigt navn for regionsindstillinger"
 
-#: gnu/system.scm:770
+#: gnu/system.scm:860
+msgid "/"
+msgstr "/"
+
+#: gnu/system.scm:862
 #, scheme-format
 msgid "unrecognized boot parameters for '~a'~%"
 msgstr "ikke genkendte opstartsparametre for »~a«~%"
 
-#: gnu/services/shepherd.scm:162
+#: gnu/services/shepherd.scm:165
 #, scheme-format
 msgid "service '~a' provided more than once"
 msgstr "tjenesten »~a« tilbudt mere end en gang"
 
-#: gnu/services/shepherd.scm:177
+#: gnu/services/shepherd.scm:180
 #, scheme-format
 msgid "service '~a' requires '~a', which is not provided by any service"
 msgstr "tjenesten »~a« kræver »~a«, som ikke tilbydes af nogen tjeneste"
 
-#: gnu/system/shadow.scm:240
+#: gnu/system/shadow.scm:220
 #, scheme-format
 msgid "supplementary group '~a' of user '~a' is undeclared"
-msgstr "supplerende gruppe »~a« for bruger »~a« er ikke deklæret"
+msgstr "supplerende gruppe »~a« for bruger »~a« er ikke erklæret"
 
-#: gnu/system/shadow.scm:250
+#: gnu/system/shadow.scm:230
 #, scheme-format
 msgid "primary group '~a' of user '~a' is undeclared"
-msgstr "primær gruppe »~a« for brugeren »~a« er ikke deklæret"
+msgstr "primær gruppe »~a« for brugeren »~a« er ikke erklæret"
 
-#: guix/scripts.scm:52
+#: guix/scripts.scm:53
 #, scheme-format
 msgid "invalid argument: ~a~%"
 msgstr "ugyldigt argument: ~a~%"
 
-#: guix/scripts.scm:78 guix/scripts/download.scm:99 guix/scripts/gc.scm:164
-#: guix/scripts/import/cran.scm:78 guix/scripts/import/elpa.scm:77
-#: guix/scripts/pull.scm:219 guix/scripts/lint.scm:916
-#: guix/scripts/publish.scm:549 guix/scripts/graph.scm:383
+#: guix/scripts.scm:79 guix/scripts/download.scm:133 guix/scripts/gc.scm:164
+#: guix/scripts/import/cran.scm:82 guix/scripts/import/elpa.scm:77
+#: guix/scripts/pull.scm:219 guix/scripts/lint.scm:1042
+#: guix/scripts/publish.scm:556 guix/scripts/edit.scm:81
+#: guix/scripts/graph.scm:436
 #, scheme-format
 msgid "~A: unrecognized option~%"
 msgstr "~A: ikke genkendt tilvalg~%"
@@ -143,12 +154,12 @@ msgstr "~A: ikke genkendt tilvalg~%"
 msgid "failed to create GC root `~a': ~a~%"
 msgstr "kunne ikke oprette GC-root »~a«: ~a~%"
 
-#: guix/scripts/build.scm:198
+#: guix/scripts/build.scm:196
 #, scheme-format
 msgid "invalid replacement specification: ~s~%"
 msgstr "ugyldig erstatningsspecifikation: ~s~%"
 
-#: guix/scripts/build.scm:246
+#: guix/scripts/build.scm:253
 msgid ""
 "\n"
 "      --with-source=SOURCE\n"
@@ -158,7 +169,7 @@ msgstr ""
 "      --with-source=KILDE\n"
 "                         brug KILDE når den tilsvarende pakke kompileres"
 
-#: guix/scripts/build.scm:249
+#: guix/scripts/build.scm:256
 msgid ""
 "\n"
 "      --with-input=PACKAGE=REPLACEMENT\n"
@@ -168,12 +179,22 @@ msgstr ""
 "      --with-input=PAKKE=ERSTATNING\n"
 "                         erstat afhængighedsPAKKE med ERSTATNING"
 
-#: guix/scripts/build.scm:274
+#: guix/scripts/build.scm:259
+msgid ""
+"\n"
+"      --with-graft=PACKAGE=REPLACEMENT\n"
+"                         graft REPLACEMENT on packages that refer to PACKAGE"
+msgstr ""
+"\n"
+"      --with-graft=PAKKE=ERSTATNING\n"
+"                         pod ERSTATNING på pakker som refererer til PAKKE"
+
+#: guix/scripts/build.scm:284
 #, scheme-format
 msgid "transformation '~a' had no effect on ~a~%"
 msgstr "transformation »~a« havde ingen effekt på ~a~%"
 
-#: guix/scripts/build.scm:292
+#: guix/scripts/build.scm:302
 msgid ""
 "\n"
 "  -L, --load-path=DIR    prepend DIR to the package module search path"
@@ -181,7 +202,7 @@ msgstr ""
 "\n"
 "  -L, --load-path=MAPPE  foranstil MAPPE til pakkemodulets søgesti"
 
-#: guix/scripts/build.scm:294
+#: guix/scripts/build.scm:304
 msgid ""
 "\n"
 "  -K, --keep-failed      keep build tree of failed builds"
@@ -189,23 +210,23 @@ msgstr ""
 "\n"
 "  -K, --keep-failed      bevar kompileringstræ for mislykkede kompileringer"
 
-#: guix/scripts/build.scm:296
+#: guix/scripts/build.scm:306
 msgid ""
 "\n"
 "  -k, --keep-going       keep going when some of the derivations fail"
 msgstr ""
 "\n"
-"  -k, --keep-going       fortsæt når nogle af derivationerne fejler"
+"  -k, --keep-going       fortsæt når nogle af derivaterne fejler"
 
-#: guix/scripts/build.scm:298
+#: guix/scripts/build.scm:308
 msgid ""
 "\n"
 "  -n, --dry-run          do not build the derivations"
 msgstr ""
 "\n"
-"  -n, --dry-run          kompiler ikke derivationerne"
+"  -n, --dry-run          kompiler ikke derivater"
 
-#: guix/scripts/build.scm:300
+#: guix/scripts/build.scm:310
 msgid ""
 "\n"
 "      --fallback         fall back to building when the substituter fails"
@@ -213,15 +234,15 @@ msgstr ""
 "\n"
 "      --fallback         fald tilbage til kompilering når erstatningen fejler"
 
-#: guix/scripts/build.scm:302
+#: guix/scripts/build.scm:312
 msgid ""
 "\n"
 "      --no-substitutes   build instead of resorting to pre-built substitutes"
 msgstr ""
 "\n"
-"      --no-substitutes   kompiler i stedet for en ny sortering af prækompilerede substitutter"
+"      --no-substitutes   kompiler i stedet for at bruge prækompilerede substitutter"
 
-#: guix/scripts/build.scm:304 guix/scripts/size.scm:217
+#: guix/scripts/build.scm:314 guix/scripts/size.scm:220
 msgid ""
 "\n"
 "      --substitute-urls=URLS\n"
@@ -231,7 +252,7 @@ msgstr ""
 "      --substitute-urls=ADRESSER\n"
 "                         hent substitut fra ADRESSER hvis de er godkendt"
 
-#: guix/scripts/build.scm:307
+#: guix/scripts/build.scm:317
 msgid ""
 "\n"
 "      --no-grafts        do not graft packages"
@@ -239,7 +260,7 @@ msgstr ""
 "\n"
 "      --no-grafts        pod ikke pakker"
 
-#: guix/scripts/build.scm:309
+#: guix/scripts/build.scm:319
 msgid ""
 "\n"
 "      --no-build-hook    do not attempt to offload builds via the build hook"
@@ -247,7 +268,7 @@ msgstr ""
 "\n"
 "      --no-build-hook    forsøg ikke at aflaste kompileringer via kompileringskrogen"
 
-#: guix/scripts/build.scm:311
+#: guix/scripts/build.scm:321
 msgid ""
 "\n"
 "      --max-silent-time=SECONDS\n"
@@ -255,17 +276,17 @@ msgid ""
 msgstr ""
 "\n"
 "      --max-silent-time=SEKUNDER\n"
-"                         marker kompileringen som mislykket efter SEKUNDER af stilhed"
+"                         marker kompileringen som mislykket efter SEKUNDERs stilhed"
 
-#: guix/scripts/build.scm:314
+#: guix/scripts/build.scm:324
 msgid ""
 "\n"
 "      --timeout=SECONDS  mark the build as failed after SECONDS of activity"
 msgstr ""
 "\n"
-"      --timeout=SEKUNDER marker kompileringen som mislykket efter SEKUNDER af aktivitet"
+"      --timeout=SEKUNDER marker kompileringen som mislykket efter SEKUNDERs aktivitet"
 
-#: guix/scripts/build.scm:316
+#: guix/scripts/build.scm:326
 msgid ""
 "\n"
 "      --verbosity=LEVEL  use the given verbosity LEVEL"
@@ -273,7 +294,7 @@ msgstr ""
 "\n"
 "      --verbosity=NIVEAU brug det angivne uddybnings-NIVEAU"
 
-#: guix/scripts/build.scm:318
+#: guix/scripts/build.scm:328
 msgid ""
 "\n"
 "      --rounds=N         build N times in a row to detect non-determinism"
@@ -281,97 +302,97 @@ msgstr ""
 "\n"
 "      --rounds=N         kompiler N gange i træk for at detektere ikkedeterminisme"
 
-#: guix/scripts/build.scm:320
+#: guix/scripts/build.scm:330
 msgid ""
 "\n"
 "  -c, --cores=N          allow the use of up to N CPU cores for the build"
 msgstr ""
 "\n"
-"  -c, --cores=N          tillad brugen af op til N CPU-kerner til kompileringen"
+"  -c, --cores=N          tillad brugen af op til N cpu-kerner til kompileringen"
 
-#: guix/scripts/build.scm:322
+#: guix/scripts/build.scm:332
 msgid ""
 "\n"
 "  -M, --max-jobs=N       allow at most N build jobs"
 msgstr ""
 "\n"
-"  -M, --max-jobs=N       tillad højest N-kompileringsjob"
+"  -M, --max-jobs=N       tillad højst N kompileringsjob"
 
-#: guix/scripts/build.scm:428 guix/scripts/build.scm:435
+#: guix/scripts/build.scm:438 guix/scripts/build.scm:445
 #, scheme-format
 msgid "not a number: '~a' option argument: ~a~%"
 msgstr "ikke et nummer: »~a« tilvalgsparameter: ~a~%"
 
-#: guix/scripts/build.scm:455
+#: guix/scripts/build.scm:465
 msgid ""
 "Usage: guix build [OPTION]... PACKAGE-OR-DERIVATION...\n"
 "Build the given PACKAGE-OR-DERIVATION and return their output paths.\n"
 msgstr ""
-"Brug: guix build [TILVALG]... PAKKE-ELLER-AFLEDNING...\n"
-"Kompiler den angivne PAKKE-ELLER-AFLEDNING og returner deres uddatastier.\n"
+"Brug: guix build [TILVALG]... PAKKE-ELLER-DERIVAT...\n"
+"Kompiler den angivne PAKKE-ELLER-DERIVAT og returner deres uddatastier.\n"
 
-#: guix/scripts/build.scm:457
+#: guix/scripts/build.scm:467
 msgid ""
 "\n"
 "  -e, --expression=EXPR  build the package or derivation EXPR evaluates to"
 msgstr ""
 "\n"
 "  -e, --expression=UDTRYK\n"
-"                         kompiler pakken eller derivationen UDTRYK evaluerer til"
+"                         kompiler pakken eller derivatet UDTRYK evaluerer til"
 
-#: guix/scripts/build.scm:459
+#: guix/scripts/build.scm:469
 msgid ""
 "\n"
 "  -f, --file=FILE        build the package or derivation that the code within\n"
 "                         FILE evaluates to"
 msgstr ""
 "\n"
-"  -f, --file=FIL         kompiler pakken eller derivationen som koden i FIL evaluerer\n"
+"  -f, --file=FIL         kompiler pakken eller derivatet som koden i FIL evaluerer\n"
 "                         til"
 
-#: guix/scripts/build.scm:462
+#: guix/scripts/build.scm:472
 msgid ""
 "\n"
 "  -S, --source           build the packages' source derivations"
 msgstr ""
 "\n"
-"  -S, --source           kompiler pakkernes kildederivationer"
+"  -S, --source           kompiler pakkernes kildederivater"
 
-#: guix/scripts/build.scm:464
+#: guix/scripts/build.scm:474
 msgid ""
 "\n"
 "      --sources[=TYPE]   build source derivations; TYPE may optionally be one\n"
 "                         of \"package\", \"all\" (default), or \"transitive\""
 msgstr ""
 "\n"
-"      --sources[=TYPE]   kompileringskildeafledninger; TYPE kan valgfrit være\n"
+"      --sources[=TYPE]   kompileringskildederivater; TYPE kan valgfrit være\n"
 "                         »package«, »all« (standard) eller »transitive«"
 
-#: guix/scripts/build.scm:467
+#: guix/scripts/build.scm:477
 msgid ""
 "\n"
 "  -s, --system=SYSTEM    attempt to build for SYSTEM--e.g., \"i686-linux\""
 msgstr ""
 "\n"
-"  -s, --system=SYSTEM    forsøger at kompilere for SYSTEM--f.eks., »i686-linux«"
+"  -s, --system=SYSTEM    forsøger at kompilere for SYSTEM--f.eks. »i686-linux«"
 
-#: guix/scripts/build.scm:469
+#: guix/scripts/build.scm:479
 msgid ""
 "\n"
 "      --target=TRIPLET   cross-build for TRIPLET--e.g., \"armel-linux-gnu\""
 msgstr ""
 "\n"
-"      --target=TRIPLET   krydskompiler for TRIPLET--f.eks., »armel-linux-gnu«"
+"      --target=TRIPLET   krydskompiler for TRIPLET--f.eks. »armel-linux-gnu«"
 
-#: guix/scripts/build.scm:471
+#: guix/scripts/build.scm:481
 msgid ""
 "\n"
 "  -d, --derivations      return the derivation paths of the given packages"
 msgstr ""
 "\n"
-"  -d, --derivations      returner de afledte stier for de givne pakker"
+"  -d, --derivations      returner de derivate stier for de givne pakker"
 
-#: guix/scripts/build.scm:473
+#: guix/scripts/build.scm:483
 msgid ""
 "\n"
 "      --check            rebuild items to check for non-determinism issues"
@@ -379,7 +400,7 @@ msgstr ""
 "\n"
 "      --check            kompiler elementer igen for at kontrollere ikkedeterminisme"
 
-#: guix/scripts/build.scm:475
+#: guix/scripts/build.scm:485
 msgid ""
 "\n"
 "  -r, --root=FILE        make FILE a symlink to the result, and register it\n"
@@ -389,7 +410,7 @@ msgstr ""
 "  -r, --root=FIL         gør FIL til en symbolsk henvisning for resultatet, og\n"
 "                         registrer den som en affaldsindsamlerroot"
 
-#: guix/scripts/build.scm:478
+#: guix/scripts/build.scm:488
 msgid ""
 "\n"
 "  -q, --quiet            do not show the build log"
@@ -397,22 +418,22 @@ msgstr ""
 "\n"
 "  -q, --quiet            vis ikke kompileringsloggen"
 
-#: guix/scripts/build.scm:480
+#: guix/scripts/build.scm:490
 msgid ""
 "\n"
 "      --log-file         return the log file names for the given derivations"
 msgstr ""
 "\n"
-"      --log-file         returner logfilnavnen for de givne afledninger"
+"      --log-file         returner logfilnavnen for de givne derivater"
 
-#: guix/scripts/build.scm:487 guix/scripts/download.scm:56
-#: guix/scripts/package.scm:388 guix/scripts/gc.scm:74
-#: guix/scripts/hash.scm:56 guix/scripts/import.scm:91
-#: guix/scripts/import/cran.scm:46 guix/scripts/pull.scm:83
-#: guix/scripts/substitute.scm:827 guix/scripts/system.scm:695
-#: guix/scripts/lint.scm:865 guix/scripts/publish.scm:73
-#: guix/scripts/edit.scm:44 guix/scripts/size.scm:225
-#: guix/scripts/graph.scm:364 guix/scripts/challenge.scm:182
+#: guix/scripts/build.scm:497 guix/scripts/download.scm:81
+#: guix/scripts/package.scm:419 guix/scripts/gc.scm:74
+#: guix/scripts/hash.scm:59 guix/scripts/import.scm:91
+#: guix/scripts/import/cran.scm:47 guix/scripts/pull.scm:83
+#: guix/scripts/substitute.scm:836 guix/scripts/system.scm:748
+#: guix/scripts/lint.scm:991 guix/scripts/publish.scm:74
+#: guix/scripts/edit.scm:44 guix/scripts/size.scm:228
+#: guix/scripts/graph.scm:416 guix/scripts/challenge.scm:182
 #: guix/scripts/container.scm:33 guix/scripts/container/exec.scm:43
 msgid ""
 "\n"
@@ -421,14 +442,14 @@ msgstr ""
 "\n"
 "  -h, --help             vis denne hjælpetekst og afslut"
 
-#: guix/scripts/build.scm:489 guix/scripts/download.scm:58
-#: guix/scripts/package.scm:390 guix/scripts/gc.scm:76
-#: guix/scripts/hash.scm:58 guix/scripts/import.scm:93
-#: guix/scripts/import/cran.scm:48 guix/scripts/pull.scm:85
-#: guix/scripts/substitute.scm:829 guix/scripts/system.scm:697
-#: guix/scripts/lint.scm:869 guix/scripts/publish.scm:75
-#: guix/scripts/edit.scm:46 guix/scripts/size.scm:227
-#: guix/scripts/graph.scm:366 guix/scripts/challenge.scm:184
+#: guix/scripts/build.scm:499 guix/scripts/download.scm:83
+#: guix/scripts/package.scm:421 guix/scripts/gc.scm:76
+#: guix/scripts/hash.scm:61 guix/scripts/import.scm:93
+#: guix/scripts/import/cran.scm:49 guix/scripts/pull.scm:85
+#: guix/scripts/substitute.scm:838 guix/scripts/system.scm:750
+#: guix/scripts/lint.scm:995 guix/scripts/publish.scm:76
+#: guix/scripts/edit.scm:46 guix/scripts/size.scm:230
+#: guix/scripts/graph.scm:418 guix/scripts/challenge.scm:184
 #: guix/scripts/container.scm:35 guix/scripts/container/exec.scm:45
 msgid ""
 "\n"
@@ -437,7 +458,7 @@ msgstr ""
 "\n"
 "  -V, --version          vis versioninformation og afslut"
 
-#: guix/scripts/build.scm:516
+#: guix/scripts/build.scm:526
 #, scheme-format
 msgid ""
 "invalid argument: '~a' option argument: ~a, ~\n"
@@ -446,33 +467,38 @@ msgstr ""
 "ugyldigt argument: »~a« tilvalgsargumentet: ~a, ~\n"
 "skal være »package«, »all« eller »transitive«~%"
 
-#: guix/scripts/build.scm:563
+#: guix/scripts/build.scm:573
 #, scheme-format
 msgid "~s: not something we can build~%"
 msgstr "~s: ikke noget vi kan kompilere~%"
 
-#: guix/scripts/build.scm:643
+#: guix/scripts/build.scm:627
+#, scheme-format
+msgid "~a: warning: package '~a' has no source~%"
+msgstr "~a: advarsel: pakken »~a« har ingen kilde~%"
+
+#: guix/scripts/build.scm:661
 #, scheme-format
 msgid "no build log for '~a'~%"
 msgstr "ingen kompileringslog for »~a«~%"
 
-#: guix/scripts/download.scm:47
+#: guix/scripts/download.scm:67
 msgid ""
 "Usage: guix download [OPTION] URL\n"
-"Download the file at URL, add it to the store, and print its store path\n"
-"and the hash of its contents.\n"
+"Download the file at URL to the store or to the given file, and print its\n"
+"file name and the hash of its contents.\n"
 "\n"
 "Supported formats: 'nix-base32' (default), 'base32', and 'base16'\n"
 "('hex' and 'hexadecimal' can be used as well).\n"
 msgstr ""
 "Brug: guix download [TILVALG] ADRESSE\n"
-"hent filen på ADRESSE, tilføj den til lageret, og udskriv dens lagersti\n"
-"og hashen for dens indhold.\n"
+"Hent filen på ADRESSE til lageret eller til den angivne fil, og udskriv dens\n"
+"filnavn og hashen for dens indhold.\n"
 "\n"
 "Understøttede formater: »nix-base32« (standard), »base32«, og »base16«\n"
 "(»hex« og »hexadecimal« kan også bruges).\n"
 
-#: guix/scripts/download.scm:53 guix/scripts/hash.scm:51
+#: guix/scripts/download.scm:73 guix/scripts/hash.scm:54
 msgid ""
 "\n"
 "  -f, --format=FMT       write the hash in the given format"
@@ -480,91 +506,109 @@ msgstr ""
 "\n"
 "  -f, --format=FMT       skriv hashen i det givne format"
 
-#: guix/scripts/download.scm:76 guix/scripts/hash.scm:76
+#: guix/scripts/download.scm:75
+msgid ""
+"\n"
+"      --no-check-certificate\n"
+"                         do not validate the certificate of HTTPS servers "
+msgstr ""
+"\n"
+"      --no-check-certificate\n"
+"                         valider ikke certifikatet for HTTPS-servere"
+
+#: guix/scripts/download.scm:78
+msgid ""
+"\n"
+"  -o, --output=FILE      download to FILE"
+msgstr ""
+"\n"
+"  -o, --output=FIL       hent til FIL"
+
+#: guix/scripts/download.scm:101 guix/scripts/hash.scm:82
 #, scheme-format
 msgid "unsupported hash format: ~a~%"
 msgstr "ikke understøttet hash-format: ~a~%"
 
-#: guix/scripts/download.scm:102 guix/scripts/package.scm:842
-#: guix/scripts/publish.scm:551
+#: guix/scripts/download.scm:136 guix/scripts/package.scm:879
+#: guix/scripts/publish.scm:558
 #, scheme-format
 msgid "~A: extraneous argument~%"
 msgstr "~A: uvedkommende argument~%"
 
-#: guix/scripts/download.scm:111
+#: guix/scripts/download.scm:144
 #, scheme-format
 msgid "no download URI was specified~%"
 msgstr "ingen overførselsadresse var angivet~%"
 
-#: guix/scripts/download.scm:113
+#: guix/scripts/download.scm:146
 #, scheme-format
 msgid "~a: failed to parse URI~%"
 msgstr "~a: kunne ikke fortolke URI~%"
 
-#: guix/scripts/download.scm:126
+#: guix/scripts/download.scm:156
 #, scheme-format
 msgid "~a: download failed~%"
 msgstr "~a: overførsel mislykkede~%"
 
-#: guix/scripts/package.scm:104
+#: guix/scripts/package.scm:107
 #, scheme-format
 msgid "Try \"info '(guix) Invoking guix package'\" for more information.~%"
 msgstr "Prøv »info '(guix) Invoking guix package'« for yderligere information.~%"
 
-#: guix/scripts/package.scm:126
+#: guix/scripts/package.scm:129
 #, scheme-format
 msgid "error: while creating directory `~a': ~a~%"
 msgstr "fejl: under oprettelse af mappe »~a«: ~a~%"
 
-#: guix/scripts/package.scm:130
+#: guix/scripts/package.scm:133
 #, scheme-format
 msgid "Please create the `~a' directory, with you as the owner.~%"
 msgstr "Opret venligst mappen »~a«, med dig som ejer.~%"
 
-#: guix/scripts/package.scm:137
+#: guix/scripts/package.scm:140
 #, scheme-format
 msgid "error: directory `~a' is not owned by you~%"
 msgstr "fejl: mappen »~a« er ikke ejet af dig~%"
 
-#: guix/scripts/package.scm:140
+#: guix/scripts/package.scm:143
 #, scheme-format
 msgid "Please change the owner of `~a' to user ~s.~%"
 msgstr "Ændr venligst ejeren af »~a« til brugeren ~s.~%"
 
-#: guix/scripts/package.scm:175
+#: guix/scripts/package.scm:178
 #, scheme-format
 msgid "not removing generation ~a, which is current~%"
 msgstr "fjerner ikke generation ~a, som er nuværende~%"
 
-#: guix/scripts/package.scm:182
+#: guix/scripts/package.scm:185
 #, scheme-format
 msgid "no matching generation~%"
 msgstr "ingen matchende generation~%"
 
-#: guix/scripts/package.scm:185 guix/scripts/package.scm:659
-#: guix/scripts/system.scm:502
+#: guix/scripts/package.scm:188 guix/scripts/package.scm:699
+#: guix/scripts/system.scm:549
 #, scheme-format
 msgid "invalid syntax: ~a~%"
 msgstr "ugyldig syntaks: ~a~%"
 
-#: guix/scripts/package.scm:210
+#: guix/scripts/package.scm:214
 #, scheme-format
 msgid "nothing to be done~%"
 msgstr "intet at udføre~%"
 
-#: guix/scripts/package.scm:224
+#: guix/scripts/package.scm:228
 #, scheme-format
 msgid "~a package in profile~%"
 msgid_plural "~a packages in profile~%"
 msgstr[0] "~a pakke i profil~%"
 msgstr[1] "~a pakker i profil~%"
 
-#: guix/scripts/package.scm:313
+#: guix/scripts/package.scm:344
 #, scheme-format
 msgid "The following environment variable definitions may be needed:~%"
 msgstr "De følgende miljøvariabeldefinitioner kan være krævet:~%"
 
-#: guix/scripts/package.scm:329
+#: guix/scripts/package.scm:360
 msgid ""
 "Usage: guix package [OPTION]...\n"
 "Install, remove, or upgrade packages in a single transaction.\n"
@@ -572,7 +616,7 @@ msgstr ""
 "Brug: guix-pakke [TILVALG] ... \n"
 "Installer, fjern eller opgrader pakker i en enkel transaktion.\n"
 
-#: guix/scripts/package.scm:331
+#: guix/scripts/package.scm:362
 msgid ""
 "\n"
 "  -i, --install PACKAGE ...\n"
@@ -582,7 +626,7 @@ msgstr ""
 "  -i, --install PAKKE ...\n"
 "                         installer PAKKER"
 
-#: guix/scripts/package.scm:334
+#: guix/scripts/package.scm:365
 msgid ""
 "\n"
 "  -e, --install-from-expression=EXP\n"
@@ -592,7 +636,7 @@ msgstr ""
 "  -e, --install-from-expression=UDTRYK\n"
 "                         installer pakken UDTRYK evaluerer til"
 
-#: guix/scripts/package.scm:337
+#: guix/scripts/package.scm:368
 msgid ""
 "\n"
 "  -f, --install-from-file=FILE\n"
@@ -604,7 +648,7 @@ msgstr ""
 "                         installer pakken som koden i FIL evaluerer\n"
 "                         til"
 
-#: guix/scripts/package.scm:341
+#: guix/scripts/package.scm:372
 msgid ""
 "\n"
 "  -r, --remove PACKAGE ...\n"
@@ -614,7 +658,7 @@ msgstr ""
 "  -r, --remove PAKKE ...\n"
 "                         fjern PAKKER"
 
-#: guix/scripts/package.scm:344
+#: guix/scripts/package.scm:375
 msgid ""
 "\n"
 "  -u, --upgrade[=REGEXP] upgrade all the installed packages matching REGEXP"
@@ -624,7 +668,7 @@ msgstr ""
 "                         opgrader alle de installerede pakker der matcher\n"
 "                         REGUDTRYK"
 
-#: guix/scripts/package.scm:346
+#: guix/scripts/package.scm:377
 msgid ""
 "\n"
 "  -m, --manifest=FILE    create a new profile generation with the manifest\n"
@@ -634,7 +678,7 @@ msgstr ""
 "  -m, --manifest=FIL     opret en ny profiloprettelse med manifestet fra\n"
 "                         FIL"
 
-#: guix/scripts/package.scm:349
+#: guix/scripts/package.scm:380
 msgid ""
 "\n"
 "      --do-not-upgrade[=REGEXP] do not upgrade any packages matching REGEXP"
@@ -642,7 +686,7 @@ msgstr ""
 "\n"
 "      --do-not--upgrade[=REGUDTRYK] opgrader ikke pakker der matcher REGUDTRYK"
 
-#: guix/scripts/package.scm:351
+#: guix/scripts/package.scm:382
 msgid ""
 "\n"
 "      --roll-back        roll back to the previous generation"
@@ -650,7 +694,7 @@ msgstr ""
 "\n"
 "      --roll-back        rul tilbage til den forrige generation"
 
-#: guix/scripts/package.scm:353
+#: guix/scripts/package.scm:384
 msgid ""
 "\n"
 "      --search-paths[=KIND]\n"
@@ -660,7 +704,7 @@ msgstr ""
 "      --search-paths[=KIND]\n"
 "                         vis krævede miljøvariabeldefinitioner"
 
-#: guix/scripts/package.scm:356
+#: guix/scripts/package.scm:387
 msgid ""
 "\n"
 "  -l, --list-generations[=PATTERN]\n"
@@ -670,7 +714,7 @@ msgstr ""
 "  -l, --list-generations[=MØNSTER]\n"
 "                         vis generationer der matcher MØNSTER"
 
-#: guix/scripts/package.scm:359
+#: guix/scripts/package.scm:390
 msgid ""
 "\n"
 "  -d, --delete-generations[=PATTERN]\n"
@@ -680,7 +724,7 @@ msgstr ""
 "  -d, --delete-generations[=MØNSTER]\n"
 "                         slet generationer der matcher MØNSTER"
 
-#: guix/scripts/package.scm:362
+#: guix/scripts/package.scm:393
 msgid ""
 "\n"
 "  -S, --switch-generation=PATTERN\n"
@@ -690,7 +734,7 @@ msgstr ""
 "  -S, --switch-generation=MØNSTER\n"
 "                         skift til et generationsmatchende MØNSTER"
 
-#: guix/scripts/package.scm:365
+#: guix/scripts/package.scm:396
 msgid ""
 "\n"
 "  -p, --profile=PROFILE  use PROFILE instead of the user's default profile"
@@ -698,7 +742,7 @@ msgstr ""
 "\n"
 "  -p, --profile=PROFIL   brug PROFIL i stedet for brugerens standardprofil"
 
-#: guix/scripts/package.scm:368
+#: guix/scripts/package.scm:399
 msgid ""
 "\n"
 "      --bootstrap        use the bootstrap Guile to build the profile"
@@ -706,7 +750,7 @@ msgstr ""
 "\n"
 "      --bootstrap        brug bootstrap Guile til at kompilere profilen"
 
-#: guix/scripts/package.scm:370 guix/scripts/pull.scm:76
+#: guix/scripts/package.scm:401 guix/scripts/pull.scm:76
 msgid ""
 "\n"
 "      --verbose          produce verbose output"
@@ -714,7 +758,7 @@ msgstr ""
 "\n"
 "      --verbose          lav uddybende uddata"
 
-#: guix/scripts/package.scm:373
+#: guix/scripts/package.scm:404
 msgid ""
 "\n"
 "  -s, --search=REGEXP    search in synopsis and description using REGEXP"
@@ -722,7 +766,7 @@ msgstr ""
 "\n"
 "  -s, --search=REGUDTRYK søg i synopsis og beskrivelse via REGUDTRYK"
 
-#: guix/scripts/package.scm:375
+#: guix/scripts/package.scm:406
 msgid ""
 "\n"
 "  -I, --list-installed[=REGEXP]\n"
@@ -732,7 +776,7 @@ msgstr ""
 "  -I, --list-installed[=REGUDTRYK]\n"
 "                         vis installerede pakker der matcher REGUDTRYK"
 
-#: guix/scripts/package.scm:378
+#: guix/scripts/package.scm:409
 msgid ""
 "\n"
 "  -A, --list-available[=REGEXP]\n"
@@ -742,7 +786,7 @@ msgstr ""
 "  -A, --list-available[=REGUDTRYK]\n"
 "                         vis tilgængelige pakker der matcher REGUDTRYK"
 
-#: guix/scripts/package.scm:381
+#: guix/scripts/package.scm:412
 msgid ""
 "\n"
 "      --show=PACKAGE     show details about PACKAGE"
@@ -750,22 +794,22 @@ msgstr ""
 "\n"
 "      --show=PACKAGE     vis detaljer om PAKKE"
 
-#: guix/scripts/package.scm:476
+#: guix/scripts/package.scm:507
 #, scheme-format
 msgid "~a: unsupported kind of search path~%"
 msgstr "~a: ikke understøttet type af søgesti%"
 
-#: guix/scripts/package.scm:755
+#: guix/scripts/package.scm:790
 #, scheme-format
 msgid "cannot switch to generation '~a'~%"
 msgstr "kan ikke skifte til generation »~a«~%"
 
-#: guix/scripts/package.scm:771
+#: guix/scripts/package.scm:806
 #, scheme-format
 msgid "would install new manifest from '~a' with ~d entries~%"
 msgstr "vil installere nyt manifest fra »~a« med ~d poster~%"
 
-#: guix/scripts/package.scm:773
+#: guix/scripts/package.scm:808
 #, scheme-format
 msgid "installing new manifest from '~a' with ~d entries~%"
 msgstr "installerer nyt manifest fra »~a« med ~d poster~%"
@@ -900,9 +944,9 @@ msgstr "uvedkommende argumenter: ~{~a ~}~%"
 
 #: guix/scripts/gc.scm:226 guix/scripts/gc.scm:229
 msgid "freed ~h bytes~%"
-msgstr "frigivet ~h byte~%"
+msgstr "frigav ~h byte~%"
 
-#: guix/scripts/hash.scm:46
+#: guix/scripts/hash.scm:47
 msgid ""
 "Usage: guix hash [OPTION] FILE\n"
 "Return the cryptographic hash of FILE.\n"
@@ -916,7 +960,15 @@ msgstr ""
 "Understøttede formater: »nix-base32« (standard), »base32« og »base16« (»hex«\n"
 "og »hexadecimal« kan også bruges).\n"
 
-#: guix/scripts/hash.scm:53
+#: guix/scripts/hash.scm:52
+msgid ""
+"\n"
+"  -x, --exclude-vcs      exclude version control directories"
+msgstr ""
+"\n"
+"  -x, --exclude-vcs      ekskluder versionskontrolmapper"
+
+#: guix/scripts/hash.scm:56
 msgid ""
 "\n"
 "  -r, --recursive        compute the hash on FILE recursively"
@@ -924,17 +976,18 @@ msgstr ""
 "\n"
 "  -r, --recursive        beregn hashen på FIL rekursivt"
 
-#: guix/scripts/hash.scm:104
+#: guix/scripts/hash.scm:109
 #, scheme-format
 msgid "unrecognized option: ~a~%"
 msgstr "tilvalg blev ikke genkendt: ~a~%"
 
-#: guix/scripts/hash.scm:135 guix/ui.scm:477
+#: guix/scripts/hash.scm:152 guix/ui.scm:478
 #, scheme-format
 msgid "~a~%"
 msgstr "~a~%"
 
-#: guix/scripts/hash.scm:138 guix/scripts/system.scm:825
+#: guix/scripts/hash.scm:155 guix/scripts/system.scm:879
+#: guix/scripts/system.scm:886 guix/scripts/system.scm:893
 #, scheme-format
 msgid "wrong number of arguments~%"
 msgstr "forkert antal argumenter~%"
@@ -956,17 +1009,17 @@ msgstr "IMPORTER skal være en af importørerne vist nedenfor:\n"
 msgid "guix import: missing importer name~%"
 msgstr "guix import: mangler importørnavn~%"
 
-#: guix/scripts/import.scm:115
+#: guix/scripts/import.scm:122
 #, scheme-format
 msgid "'~a' import failed~%"
-msgstr "»~a« import mislykkedes~%"
+msgstr "import af »~a« mislykkedes~%"
 
-#: guix/scripts/import.scm:116
+#: guix/scripts/import.scm:123
 #, scheme-format
 msgid "~a: invalid importer~%"
 msgstr "~a: ugyldigt importprogram~%"
 
-#: guix/scripts/import/cran.scm:42
+#: guix/scripts/import/cran.scm:43
 msgid ""
 "Usage: guix import cran PACKAGE-NAME\n"
 "Import and convert the CRAN package for PACKAGE-NAME.\n"
@@ -974,7 +1027,7 @@ msgstr ""
 "Usage: guix import cran PAKKENAVN\n"
 "Importer og konverter pakken CRAN for PAKKENAVN.\n"
 
-#: guix/scripts/import/cran.scm:44
+#: guix/scripts/import/cran.scm:45
 msgid ""
 "\n"
 "  -a, --archive=ARCHIVE  specify the archive repository"
@@ -982,17 +1035,17 @@ msgstr ""
 "\n"
 "  -a, --archive=ARKIV    angiv arkivet"
 
-#: guix/scripts/import/cran.scm:94
+#: guix/scripts/import/cran.scm:108
 #, scheme-format
 msgid "failed to download description for package '~a'~%"
 msgstr "kunne ikke hente beskrivelse for pakke »~a«:~%"
 
-#: guix/scripts/import/cran.scm:98 guix/scripts/import/elpa.scm:95
+#: guix/scripts/import/cran.scm:112 guix/scripts/import/elpa.scm:95
 #, scheme-format
 msgid "too few arguments~%"
 msgstr "for få argumenter~%"
 
-#: guix/scripts/import/cran.scm:100 guix/scripts/import/elpa.scm:97
+#: guix/scripts/import/cran.scm:114 guix/scripts/import/elpa.scm:97
 #, scheme-format
 msgid "too many arguments~%"
 msgstr "for mange argumenter~%"
@@ -1083,7 +1136,7 @@ msgstr "opdaterede ~a der med succes blev udrullet undet »~a«~%"
 #: guix/scripts/pull.scm:212
 #, scheme-format
 msgid "failed to update Guix, check the build log~%"
-msgstr "kunne ikke opdatere Guix, kontroller kompileringsloggen~%"
+msgstr "kunne ikke opdatere Guix; kontroller kompileringsloggen~%"
 
 #: guix/scripts/pull.scm:221
 #, scheme-format
@@ -1094,127 +1147,127 @@ msgstr "~A: uventet argument~%"
 msgid "failed to download up-to-date source, exiting\n"
 msgstr "kunne ikke hente opdateret kilde, afslutter\n"
 
-#: guix/scripts/substitute.scm:113
+#: guix/scripts/substitute.scm:112
 #, scheme-format
 msgid "authentication and authorization of substitutes disabled!~%"
 msgstr "godkendelse og autorisation af substitutter er deaktiveret!~%"
 
-#: guix/scripts/substitute.scm:188
+#: guix/scripts/substitute.scm:187
 #, scheme-format
 msgid "download from '~a' failed: ~a, ~s~%"
 msgstr "hent fra »~a« mislykkedes: ~a, ~s~%"
 
-#: guix/scripts/substitute.scm:201
+#: guix/scripts/substitute.scm:200
 #, scheme-format
 msgid "while fetching ~a: server is somewhat slow~%"
 msgstr "under overførsel af ~a: server er noget langsom~%"
 
-#: guix/scripts/substitute.scm:203
+#: guix/scripts/substitute.scm:202
 #, scheme-format
 msgid "try `--no-substitutes' if the problem persists~%"
 msgstr "prøv »--no-substitutes« hvis problemet fortsætter~%"
 
-#: guix/scripts/substitute.scm:219
+#: guix/scripts/substitute.scm:220
 #, scheme-format
 msgid "unsupported substitute URI scheme: ~a~%"
 msgstr "ikke understøttet substitut-URI-skema: ~a~%"
 
-#: guix/scripts/substitute.scm:252
+#: guix/scripts/substitute.scm:254
 #, scheme-format
 msgid "while fetching '~a': ~a (~s)~%"
 msgstr "under overførsel af »~a«: ~a (~s)~%"
 
-#: guix/scripts/substitute.scm:257
+#: guix/scripts/substitute.scm:259
 #, scheme-format
 msgid "ignoring substitute server at '~s'~%"
 msgstr "ignorerer substitutserver »~s«~%"
 
-#: guix/scripts/substitute.scm:306
+#: guix/scripts/substitute.scm:309
 #, scheme-format
 msgid "signature version must be a number: ~s~%"
 msgstr "signaturversion skal være et nummer: ~s~%"
 
-#: guix/scripts/substitute.scm:310
+#: guix/scripts/substitute.scm:313
 #, scheme-format
 msgid "unsupported signature version: ~a~%"
 msgstr "signaturversion er ikke understøttet: ~a~%"
 
-#: guix/scripts/substitute.scm:318
+#: guix/scripts/substitute.scm:321
 #, scheme-format
 msgid "signature is not a valid s-expression: ~s~%"
 msgstr "signatur er ikke et gyldigt s-udtryk: ~s~%"
 
-#: guix/scripts/substitute.scm:322
+#: guix/scripts/substitute.scm:325
 #, scheme-format
 msgid "invalid format of the signature field: ~a~%"
 msgstr "ugyldigt format for signaturfeltet: ~a~%"
 
-#: guix/scripts/substitute.scm:357
+#: guix/scripts/substitute.scm:360
 #, scheme-format
 msgid "invalid signature for '~a'~%"
 msgstr "ugyldig signatur for »~a«~%"
 
-#: guix/scripts/substitute.scm:359
+#: guix/scripts/substitute.scm:362
 #, scheme-format
 msgid "hash mismatch for '~a'~%"
 msgstr "hash mismatch for »~a«~%"
 
-#: guix/scripts/substitute.scm:361
+#: guix/scripts/substitute.scm:364
 #, scheme-format
 msgid "'~a' is signed with an unauthorized key~%"
 msgstr "»~a« er underskrevet med en uautoriseret nøgle~%"
 
-#: guix/scripts/substitute.scm:363
+#: guix/scripts/substitute.scm:366
 #, scheme-format
 msgid "signature on '~a' is corrupt~%"
 msgstr "signatur på »~a« er ødelagt~%"
 
-#: guix/scripts/substitute.scm:401
+#: guix/scripts/substitute.scm:404
 #, scheme-format
 msgid "substitute at '~a' lacks a signature~%"
 msgstr "substitut på »~a« mangler en signatur~%"
 
-#: guix/scripts/substitute.scm:409
+#: guix/scripts/substitute.scm:411
 #, scheme-format
-msgid "~%Found valid signature for ~a~%"
-msgstr "~%Fandt gyldig signatur for ~a~%"
+msgid "Found valid signature for ~a~%"
+msgstr "Fandt gyldig signatur for ~a~%"
 
-#: guix/scripts/substitute.scm:412
+#: guix/scripts/substitute.scm:414
 #, scheme-format
 msgid "From ~a~%"
 msgstr "Fra ~a~%"
 
-#: guix/scripts/substitute.scm:452
+#: guix/scripts/substitute.scm:454
 #, scheme-format
 msgid "'~a' does not name a store item~%"
 msgstr "»~a« nævner ikke et lagerelement~%"
 
-#: guix/scripts/substitute.scm:596
+#: guix/scripts/substitute.scm:600
 #, scheme-format
 msgid "updating list of substitutes from '~a'... ~5,1f%"
 msgstr "opdaterer liste af substitutter fra »~a«... ~5,1f%"
 
-#: guix/scripts/substitute.scm:646
+#: guix/scripts/substitute.scm:655
 #, scheme-format
 msgid "~s: unsupported server URI scheme~%"
 msgstr "~s: ikke understøttet server-URI-skema~%"
 
-#: guix/scripts/substitute.scm:656
+#: guix/scripts/substitute.scm:665
 #, scheme-format
 msgid "'~a' uses different store '~a'; ignoring it~%"
 msgstr "»~a« bruger et andet lager »~a«; ignorerer~%"
 
-#: guix/scripts/substitute.scm:801
+#: guix/scripts/substitute.scm:810
 #, scheme-format
 msgid "host name lookup error: ~a~%"
 msgstr "opslagsfejl for værtsnavn: ~a~%"
 
-#: guix/scripts/substitute.scm:806
+#: guix/scripts/substitute.scm:815
 #, scheme-format
 msgid "TLS error in procedure '~a': ~a~%"
-msgstr "TLS-fejl i procedure »~a«: ~a~%"
+msgstr "TLS-fejl i proceduren »~a«: ~a~%"
 
-#: guix/scripts/substitute.scm:817
+#: guix/scripts/substitute.scm:826
 msgid ""
 "Usage: guix substitute [OPTION]...\n"
 "Internal tool to substitute a pre-built binary to a local build.\n"
@@ -1222,7 +1275,7 @@ msgstr ""
 "Brug: guix substitute [TILVALG] ...\n"
 "Internt værktøj til at erstatte en prækompileret binær fil med en lokal kompilering.\n"
 
-#: guix/scripts/substitute.scm:819
+#: guix/scripts/substitute.scm:828
 msgid ""
 "\n"
 "      --query            report on the availability of substitutes for the\n"
@@ -1232,7 +1285,7 @@ msgstr ""
 "      --query            rapport om tilgængeligheden for substitutter for\n"
 "                         lagerfilnavnene sendt til standardind"
 
-#: guix/scripts/substitute.scm:822
+#: guix/scripts/substitute.scm:831
 msgid ""
 "\n"
 "      --substitute STORE-FILE DESTINATION\n"
@@ -1247,41 +1300,41 @@ msgstr ""
 #. TRANSLATORS: The second part of this message looks like
 #. "(4.1MiB installed)"; it shows the size of the package once
 #. installed.
-#: guix/scripts/substitute.scm:895
+#: guix/scripts/substitute.scm:904
 #, scheme-format
 msgid "Downloading ~a~:[~*~; (~a installed)~]...~%"
 msgstr "Henter ~a~:[~*~; (~a installeret)~]...~%"
 
-#: guix/scripts/substitute.scm:951
+#: guix/scripts/substitute.scm:961
 msgid "ACL for archive imports seems to be uninitialized, substitutes may be unavailable\n"
 msgstr "ACL for arkivimporter ser ikke ud til at være initialiseret, substitutter kan være utilgængelige\n"
 
-#: guix/scripts/substitute.scm:1047
+#: guix/scripts/substitute.scm:1057
 #, scheme-format
 msgid "~a: unrecognized options~%"
 msgstr "~a: ikke genkendte tilvalg~%"
 
-#: guix/scripts/authenticate.scm:58
+#: guix/scripts/authenticate.scm:59
 #, scheme-format
 msgid "cannot find public key for secret key '~a'~%"
 msgstr "kan ikke finde offentlig nøgle for hemmelig nøgle »~a«~%"
 
-#: guix/scripts/authenticate.scm:78
+#: guix/scripts/authenticate.scm:79
 #, scheme-format
 msgid "error: invalid signature: ~a~%"
 msgstr "fejl: ugyldig signatur: ~a~%"
 
-#: guix/scripts/authenticate.scm:80
+#: guix/scripts/authenticate.scm:81
 #, scheme-format
 msgid "error: unauthorized public key: ~a~%"
 msgstr "fejl: ikke autoriseret offentlig nøgle: ~a~%"
 
-#: guix/scripts/authenticate.scm:82
+#: guix/scripts/authenticate.scm:83
 #, scheme-format
 msgid "error: corrupt signature data: ~a~%"
 msgstr "fejl: ødelagt signaturdata: ~a~%"
 
-#: guix/scripts/authenticate.scm:120
+#: guix/scripts/authenticate.scm:121
 msgid ""
 "Usage: guix authenticate OPTION...\n"
 "Sign or verify the signature on the given file.  This tool is meant to\n"
@@ -1291,195 +1344,215 @@ msgstr ""
 "Underskriv eller verificer signaturen på den givne fil. Dette værktøj skal\n"
 "bruges internt af »guix-daemon«.\n"
 
-#: guix/scripts/authenticate.scm:126
+#: guix/scripts/authenticate.scm:127
 msgid "wrong arguments"
 msgstr "forkerte argumenter"
 
-#: guix/scripts/system.scm:111
+#: guix/scripts/system.scm:109
 #, scheme-format
 msgid "failed to register '~a' under '~a'~%"
 msgstr "kunne ikke registrere »~a« under »~a«~%"
 
-#: guix/scripts/system.scm:144
+#: guix/scripts/system.scm:142
 #, scheme-format
 msgid "failed to install GRUB on device '~a'~%"
 msgstr "kunne ikke installere GRUB på enhed »~a«~%"
 
-#: guix/scripts/system.scm:162
+#: guix/scripts/system.scm:160
 #, scheme-format
 msgid "initializing the current root file system~%"
 msgstr "initialiserer det nuværende root-filsystem~%"
 
-#: guix/scripts/system.scm:176
+#: guix/scripts/system.scm:174
 #, scheme-format
 msgid "not running as 'root', so the ownership of '~a' may be incorrect!~%"
 msgstr "kører ikke som »root«, så ejerskabet af »~a« kan være forkert!~%"
 
-#: guix/scripts/system.scm:234
+#: guix/scripts/system.scm:238
 #, scheme-format
 msgid "while talking to shepherd: ~a~%"
 msgstr "under kommunikation med shepherd: ~a~%"
 
-#: guix/scripts/system.scm:248
+#: guix/scripts/system.scm:245
 #, scheme-format
 msgid "service '~a' could not be found~%"
 msgstr "tjensten »~a« blev ikke fundet~%"
 
-#: guix/scripts/system.scm:251
+#: guix/scripts/system.scm:248
 #, scheme-format
 msgid "service '~a' does not have an action '~a'~%"
 msgstr "tjenesten »~a« har ikke en handling »~a«~%"
 
-#: guix/scripts/system.scm:255
+#: guix/scripts/system.scm:252
 #, scheme-format
 msgid "exception caught while executing '~a' on service '~a':~%"
 msgstr "undtagelse fanget under kørsel af »~a« på tjenesten »~a«:~%"
 
-#: guix/scripts/system.scm:263
+#: guix/scripts/system.scm:260
 #, scheme-format
 msgid "something went wrong: ~s~%"
 msgstr "noget gik galt: ~s~%"
 
-#: guix/scripts/system.scm:266
+#: guix/scripts/system.scm:263
 #, scheme-format
 msgid "shepherd error~%"
 msgstr "shepherd-fejl~%"
 
-#: guix/scripts/system.scm:302
+#: guix/scripts/system.scm:280
 #, scheme-format
 msgid "failed to obtain list of shepherd services~%"
-msgstr "kunne ikke indhente liste for shepherd-tjenester~%"
+msgstr "kunne ikke indhente liste over shepherd-tjenester~%"
 
-#: guix/scripts/system.scm:322
+#: guix/scripts/system.scm:300
 #, scheme-format
 msgid "unloading service '~a'...~%"
 msgstr "afslutter tjeneste »~a« ...~%"
 
-#: guix/scripts/system.scm:330
+#: guix/scripts/system.scm:308
 #, scheme-format
 msgid "loading new services:~{ ~a~}...~%"
 msgstr "indlæser nye tjenester:~{ ~a~}...~%"
 
-#: guix/scripts/system.scm:354
+#: guix/scripts/system.scm:332
 #, scheme-format
 msgid "activating system...~%"
 msgstr "aktiverer system ...~%"
 
-#: guix/scripts/system.scm:445
+#: guix/scripts/system.scm:425
+#, scheme-format
+msgid "cannot switch to system generation '~a'~%"
+msgstr "kan ikke skifte til systemoprettelse »~a«~%"
+
+#: guix/scripts/system.scm:459
+#, scheme-format
+msgid "failed to re-install GRUB configuration file: '~a'~%"
+msgstr "kunne ikke geninstallere GRUB-konfigurationsfilen: »~a«~%"
+
+#: guix/scripts/system.scm:489
 msgid "the DAG of services"
 msgstr "DAGen for tjenester"
 
-#: guix/scripts/system.scm:458
+#: guix/scripts/system.scm:502
 msgid "the dependency graph of shepherd services"
 msgstr "afhængighedsgrafen for shepherd-tjenester"
 
-#: guix/scripts/system.scm:479
+#: guix/scripts/system.scm:526
 #, scheme-format
 msgid "  file name: ~a~%"
 msgstr "  filnavn: ~a~%"
 
-#: guix/scripts/system.scm:480
+#: guix/scripts/system.scm:527
 #, scheme-format
 msgid "  canonical file name: ~a~%"
 msgstr "  kanonisk filnavn: ~a~%"
 
 #. TRANSLATORS: Please preserve the two-space indentation.
-#: guix/scripts/system.scm:482
+#: guix/scripts/system.scm:529
 #, scheme-format
 msgid "  label: ~a~%"
 msgstr "  etikelt: ~a~%"
 
-#: guix/scripts/system.scm:483
+#: guix/scripts/system.scm:530
 #, scheme-format
 msgid "  root device: ~a~%"
 msgstr "  root-enhed: ~a~%"
 
-#: guix/scripts/system.scm:484
+#: guix/scripts/system.scm:531
 #, scheme-format
 msgid "  kernel: ~a~%"
 msgstr "  kerne: ~a~%"
 
-#: guix/scripts/system.scm:541
+#: guix/scripts/system.scm:588
 #, scheme-format
 msgid "~a not found: 'guix pull' was never run~%"
 msgstr "~a blev ikke fundet: »guix pull« blev aldrig kørt~%"
 
-#: guix/scripts/system.scm:542
+#: guix/scripts/system.scm:589
 #, scheme-format
 msgid "Consider running 'guix pull' before 'reconfigure'.~%"
 msgstr "Overvej at køre »guix pull« før »reconfigure«.~%"
 
-#: guix/scripts/system.scm:543
+#: guix/scripts/system.scm:590
 #, scheme-format
 msgid "Failing to do that may downgrade your system!~%"
-msgstr "Manglende udførsel kan nedgradere dit system!~%"
+msgstr "Hvis dette ikke gøres, kan dit system blive nedgraderet!~%"
 
-#: guix/scripts/system.scm:613
+#: guix/scripts/system.scm:661
 #, scheme-format
 msgid "initializing operating system under '~a'...~%"
 msgstr "initialiserer operativsystem under »~a«...~%"
 
-#: guix/scripts/system.scm:652
+#: guix/scripts/system.scm:700
 msgid ""
-"Usage: guix system [OPTION] ACTION [FILE]\n"
+"Usage: guix system [OPTION ...] ACTION [ARG ...] [FILE]\n"
 "Build the operating system declared in FILE according to ACTION.\n"
+"Some ACTIONS support additional ARGS.\n"
 msgstr ""
-"Brug: guix system [TILVALG] HANDLING [FIL]\n"
-"Kompiler operativsystemet deklæret i FIL jævnfør HANDLING.\n"
+"Brug: guix system [TILVALG] HANDLING [ARG ...] [FIL]\n"
+"Kompiler operativsystemet erklæret i FIL jævnfør HANDLING.\n"
+"Nogle HANDLINGER understøtter yderligere ARGUMENTER.\n"
 
-#: guix/scripts/system.scm:655 guix/scripts/container.scm:28
+#: guix/scripts/system.scm:704 guix/scripts/container.scm:28
 msgid "The valid values for ACTION are:\n"
 msgstr "De gyldige værdier for HANDLING er:\n"
 
-#: guix/scripts/system.scm:657
+#: guix/scripts/system.scm:706
 msgid "   reconfigure      switch to a new operating system configuration\n"
 msgstr "   reconfigure      skift til en ny operativsystemkonfiguration\n"
 
-#: guix/scripts/system.scm:659
+#: guix/scripts/system.scm:708
+msgid "   roll-back        switch to the previous operating system configuration\n"
+msgstr "   roll-back        skift til den forrige operativsystemkonfiguration\n"
+
+#: guix/scripts/system.scm:710
+msgid "   switch-generation switch to an existing operating system configuration\n"
+msgstr "   switch-generation skift til en eksisterende operativsystemkonfiguration\n"
+
+#: guix/scripts/system.scm:712
 msgid "   list-generations list the system generations\n"
 msgstr "   list-generations viser systemoprettelserne\n"
 
-#: guix/scripts/system.scm:661
+#: guix/scripts/system.scm:714
 msgid "   build            build the operating system without installing anything\n"
 msgstr "   build            kompiler operativsystemet uden at installere noget\n"
 
-#: guix/scripts/system.scm:663
+#: guix/scripts/system.scm:716
 msgid "   container        build a container that shares the host's store\n"
 msgstr "   container        kompiler en container som deler værtens lager\n"
 
-#: guix/scripts/system.scm:665
+#: guix/scripts/system.scm:718
 msgid "   vm               build a virtual machine image that shares the host's store\n"
 msgstr "   vm               kompiler et virtuelt maskinaftryk som deler værtens lager\n"
 
-#: guix/scripts/system.scm:667
+#: guix/scripts/system.scm:720
 msgid "   vm-image         build a freestanding virtual machine image\n"
 msgstr "   vm-image         kompiler et fritstående virtuelt maskinaftryk\n"
 
-#: guix/scripts/system.scm:669
+#: guix/scripts/system.scm:722
 msgid "   disk-image       build a disk image, suitable for a USB stick\n"
-msgstr "   disk-image       kompiler et diskaftryk, egnet for et USB-drev\n"
+msgstr "   disk-image       kompiler et diskaftryk, som egner sig til et USB-drev\n"
 
-#: guix/scripts/system.scm:671
+#: guix/scripts/system.scm:724
 msgid "   init             initialize a root file system to run GNU\n"
 msgstr "   init             initialiser et rootfilsystem til at køre GNU.\n"
 
-#: guix/scripts/system.scm:673
+#: guix/scripts/system.scm:726
 msgid "   extension-graph  emit the service extension graph in Dot format\n"
 msgstr "   extension-graph  opret tjenesteudvidelsesgrafen i Dot-format\n"
 
-#: guix/scripts/system.scm:675
+#: guix/scripts/system.scm:728
 msgid "   shepherd-graph   emit the graph of shepherd services in Dot format\n"
 msgstr "   shepherd-graph   opret grafen for shepherd-tjenester i Dot-format\n"
 
-#: guix/scripts/system.scm:679
+#: guix/scripts/system.scm:732
 msgid ""
 "\n"
 "  -d, --derivation       return the derivation of the given system"
 msgstr ""
 "\n"
-"  -d, --derivation       returner de afledte stier for det givne system"
+"  -d, --derivation       returner de derivate stier for det givne system"
 
-#: guix/scripts/system.scm:681
+#: guix/scripts/system.scm:734
 msgid ""
 "\n"
 "      --on-error=STRATEGY\n"
@@ -1489,7 +1562,7 @@ msgstr ""
 "      --on-error=STRATEGI\n"
 "                         brug STRATEGI når den opstår en fejl under læsning af FIL"
 
-#: guix/scripts/system.scm:684
+#: guix/scripts/system.scm:737
 msgid ""
 "\n"
 "      --image-size=SIZE  for 'vm-image', produce an image of SIZE"
@@ -1497,7 +1570,7 @@ msgstr ""
 "\n"
 "      --image-size=STR   for »vm-image«, lav et aftryk af STR"
 
-#: guix/scripts/system.scm:686
+#: guix/scripts/system.scm:739
 msgid ""
 "\n"
 "      --no-grub          for 'init', do not install GRUB"
@@ -1505,7 +1578,7 @@ msgstr ""
 "\n"
 "      --no-grub          for »init«, installer ikke GRUB"
 
-#: guix/scripts/system.scm:688
+#: guix/scripts/system.scm:741
 msgid ""
 "\n"
 "      --share=SPEC       for 'vm', share host file system according to SPEC"
@@ -1513,7 +1586,7 @@ msgstr ""
 "\n"
 "      --share=SPEC       for »vm«, del værtsfilsystem jævnfør SPEC"
 
-#: guix/scripts/system.scm:690
+#: guix/scripts/system.scm:743
 msgid ""
 "\n"
 "      --expose=SPEC      for 'vm', expose host file system according to SPEC"
@@ -1521,7 +1594,7 @@ msgstr ""
 "\n"
 "      --expose=SPEC      for »vm«, fremvis værtsfilsystem jævnfør SPEC"
 
-#: guix/scripts/system.scm:692
+#: guix/scripts/system.scm:745
 msgid ""
 "\n"
 "      --full-boot        for 'vm', make a full boot sequence"
@@ -1529,50 +1602,65 @@ msgstr ""
 "\n"
 "      --full-boot        for »vm«, lav en fuld opstartssekvens"
 
-#: guix/scripts/system.scm:777
+#: guix/scripts/system.scm:830
 #, scheme-format
 msgid "no configuration file specified~%"
 msgstr "ingen konfigurationsfil angivet~%"
 
-#: guix/scripts/system.scm:840
+#: guix/scripts/system.scm:912
 #, scheme-format
 msgid "~a: unknown action~%"
 msgstr "~a: ukendt handling~%"
 
-#: guix/scripts/system.scm:855
+#: guix/scripts/system.scm:927
 #, scheme-format
 msgid "wrong number of arguments for action '~a'~%"
 msgstr "forkert antal argumenter for handling »~a«~%"
 
-#: guix/scripts/system.scm:860
+#: guix/scripts/system.scm:932
 #, scheme-format
 msgid "guix system: missing command name~%"
 msgstr "guix system: mangler kommandonavn~%"
 
-#: guix/scripts/system.scm:862
+#: guix/scripts/system.scm:934
 #, scheme-format
 msgid "Try 'guix system --help' for more information.~%"
 msgstr "Prøv »guix system --help« for yderligere information.~%"
 
-#: guix/scripts/lint.scm:130
+#: guix/scripts/lint.scm:133
 #, scheme-format
 msgid "Available checkers:~%"
 msgstr "Tilgængelige kontrolprogrammer:~%"
 
-#: guix/scripts/lint.scm:150
+#: guix/scripts/lint.scm:157
 msgid "description should not be empty"
 msgstr "beskrivelse skal være udfyldt"
 
-#: guix/scripts/lint.scm:160
+#: guix/scripts/lint.scm:167
 msgid "Texinfo markup in description is invalid"
 msgstr "Texinfo-opmærkning i beskrivelse er ugyldig"
 
-#: guix/scripts/lint.scm:168
+#: guix/scripts/lint.scm:177
+#, scheme-format
+msgid ""
+"description should not contain ~\n"
+"trademark sign '~a' at ~d"
+msgstr ""
+"beskrivelse må ikke indeholde ~\n"
+"varemærketegn »~a« på ~d"
+
+#. TRANSLATORS: '@code' is Texinfo markup and must be kept
+#. as is.
+#: guix/scripts/lint.scm:190
+msgid "use @code or similar ornament instead of quotes"
+msgstr "brug @code eller lignende ornament i stedet for citationstegn"
+
+#: guix/scripts/lint.scm:197
 msgid "description should start with an upper-case letter or digit"
 msgstr "beskrivelse skal starte med et stort bogstav eller et tal"
 
 # arg, hvad foregår der her
-#: guix/scripts/lint.scm:184
+#: guix/scripts/lint.scm:213
 #, scheme-format
 msgid ""
 "sentences in description should be followed ~\n"
@@ -1581,201 +1669,227 @@ msgstr ""
 "sætninger i beskrivelsen skal efterfølges ~\n"
 "af to mellemrum; mulig infraction~p ved ~{~a~^, ~}"
 
-#: guix/scripts/lint.scm:200
+#: guix/scripts/lint.scm:231
 #, scheme-format
 msgid "invalid description: ~s"
 msgstr "ugyldig beskrivelse: ~s"
 
-#: guix/scripts/lint.scm:220
+# native kan evt. være platformsspecifik
+# Det er dog svært at gætte med sikkerhed hvad det betyder her
+#: guix/scripts/lint.scm:256
 #, scheme-format
 msgid "'~a' should probably be a native input"
 msgstr "»~a« skal sandsynligvis være standarddata"
 
-#: guix/scripts/lint.scm:238
+#: guix/scripts/lint.scm:280
+#, scheme-format
+msgid "'~a' should probably not be an input at all"
+msgstr "»~a« skal sandsynligvis ikke være inddata"
+
+#: guix/scripts/lint.scm:306
 msgid "synopsis should not be empty"
 msgstr "synopsis skal være udfyldt"
 
-#: guix/scripts/lint.scm:246
+#: guix/scripts/lint.scm:314
 msgid "no period allowed at the end of the synopsis"
 msgstr "ingen periode er tilladt i slutningen af synopsen"
 
-#: guix/scripts/lint.scm:258
+#: guix/scripts/lint.scm:326
 msgid "no article allowed at the beginning of the synopsis"
 msgstr "ingen artikel er tilladt i begyndelsen af synopsen"
 
-#: guix/scripts/lint.scm:265
+#: guix/scripts/lint.scm:333
 msgid "synopsis should be less than 80 characters long"
 msgstr "synopsis skal være mindre end 80 tegn lang"
 
-#: guix/scripts/lint.scm:271
+#: guix/scripts/lint.scm:339
 msgid "synopsis should start with an upper-case letter or digit"
 msgstr "synopsis skal starte med et stort bogstav eller et tal"
 
-#: guix/scripts/lint.scm:278
+#: guix/scripts/lint.scm:346
 msgid "synopsis should not start with the package name"
 msgstr "synopsis skal ikke starte med pakkenavnet"
 
-#: guix/scripts/lint.scm:292
+#: guix/scripts/lint.scm:360
 #, scheme-format
 msgid "invalid synopsis: ~s"
 msgstr "ugyldig synopsis: ~s"
 
-#: guix/scripts/lint.scm:383
+#: guix/scripts/lint.scm:459
 #, scheme-format
 msgid "URI ~a returned suspiciously small file (~a bytes)"
-msgstr "URI ~a returnerede mistænkelig lille fil (~a byte)"
+msgstr "URI'en ~a returnerede mistænkelig lille fil (~a byte)"
 
-#: guix/scripts/lint.scm:392 guix/scripts/lint.scm:404
+#: guix/scripts/lint.scm:468 guix/scripts/lint.scm:480
 #, scheme-format
 msgid "URI ~a not reachable: ~a (~s)"
 msgstr "URI ~a kan ikke nås: ~a (~s)"
 
-#: guix/scripts/lint.scm:411
+#: guix/scripts/lint.scm:487
 #, scheme-format
 msgid "URI ~a domain not found: ~a"
 msgstr "URI ~a domæne blev ikke fundet: ~a"
 
-#: guix/scripts/lint.scm:419
+#: guix/scripts/lint.scm:495
 #, scheme-format
 msgid "URI ~a unreachable: ~a"
 msgstr "URI ~a kan ikke nås: ~a"
 
-#: guix/scripts/lint.scm:445
+#: guix/scripts/lint.scm:504 guix/scripts/lint.scm:761
+#, scheme-format
+msgid "TLS certificate error: ~a"
+msgstr "TLS-certifikatfejl: ~a"
+
+#: guix/scripts/lint.scm:525
 msgid "invalid value for home page"
 msgstr "ugyldig værdi for hjemmeside"
 
-#: guix/scripts/lint.scm:448
+#: guix/scripts/lint.scm:528
 #, scheme-format
 msgid "invalid home page URL: ~s"
 msgstr "ugyldig hjemmesideadresse: ~s"
 
-#: guix/scripts/lint.scm:468
+#: guix/scripts/lint.scm:548
 msgid "file names of patches should start with the package name"
 msgstr "filnavn for rettelser skal starte med pakkenavnet"
 
-#: guix/scripts/lint.scm:507
+#: guix/scripts/lint.scm:587
 #, scheme-format
 msgid "~a: ~a: proposed synopsis: ~s~%"
 msgstr "~a: ~a: foreslået synopsis: ~s~%"
 
-#: guix/scripts/lint.scm:520
+#: guix/scripts/lint.scm:600
 #, scheme-format
 msgid "~a: ~a: proposed description:~%     \"~a\"~%"
 msgstr "~a: ~a: foreslået beskrivelse:~%     »~a«~%"
 
-#: guix/scripts/lint.scm:557
+#: guix/scripts/lint.scm:642
 msgid "all the source URIs are unreachable:"
 msgstr "alle kilde-URI'erne kan ikke nås:"
 
-#: guix/scripts/lint.scm:580
+#: guix/scripts/lint.scm:665
 msgid "the source file name should contain the package name"
 msgstr "kildefilnavnet skal indeholde pakkenavnet"
 
-#: guix/scripts/lint.scm:589 guix/scripts/lint.scm:593
+#: guix/scripts/lint.scm:681
+#, scheme-format
+msgid "URL should be 'mirror://~a/~a'"
+msgstr "Adresse skal være »mirror://~a/~a«"
+
+#: guix/scripts/lint.scm:699 guix/scripts/lint.scm:703
 #, scheme-format
 msgid "failed to create derivation: ~a"
-msgstr "kunne ikke oprette afledning: ~a"
+msgstr "kunne ikke oprette derivat: ~a"
 
-#: guix/scripts/lint.scm:607
+#: guix/scripts/lint.scm:717
 #, scheme-format
 msgid "failed to create derivation: ~s~%"
-msgstr "kunne ikke oprette afledning: ~s~%"
+msgstr "kunne ikke oprette derivat: ~s~%"
 
-#: guix/scripts/lint.scm:617
+#: guix/scripts/lint.scm:727
 msgid "invalid license field"
 msgstr "ugyldigt licensfelt"
 
-#: guix/scripts/lint.scm:634
+#: guix/scripts/lint.scm:744
 #, scheme-format
 msgid "failed to retrieve CVE vulnerabilities from ~s: ~a (~s)~%"
 msgstr "kunne ikke indhente CVE-sårbarheder fra ~s: ~a (~s)~%"
 
-#: guix/scripts/lint.scm:639 guix/scripts/lint.scm:647
+#: guix/scripts/lint.scm:749 guix/scripts/lint.scm:758
+#: guix/scripts/lint.scm:763
 #, scheme-format
 msgid "assuming no CVE vulnerabilities~%"
 msgstr "antager ingen CVE-sårbarheder~%"
 
-#: guix/scripts/lint.scm:645
+#: guix/scripts/lint.scm:756
 #, scheme-format
 msgid "failed to lookup NIST host: ~a~%"
 msgstr "kunne ikke slå NIST-vært op: ~a~%"
 
-#: guix/scripts/lint.scm:683
+#: guix/scripts/lint.scm:801
 #, scheme-format
 msgid "probably vulnerable to ~a"
 msgstr "sandsynligvis sårbar for ~a"
 
-#: guix/scripts/lint.scm:698
+#: guix/scripts/lint.scm:816
 #, scheme-format
 msgid "tabulation on line ~a, column ~a"
 msgstr "tabulering på linje ~a, kolonne ~a"
 
-#: guix/scripts/lint.scm:707
+#: guix/scripts/lint.scm:825
 #, scheme-format
 msgid "trailing white space on line ~a"
 msgstr "efterstillet mellemrum på linje ~a"
 
-#: guix/scripts/lint.scm:717
+#: guix/scripts/lint.scm:835
 #, scheme-format
 msgid "line ~a is way too long (~a characters)"
 msgstr "linjen ~a er alt for lang (~a tegn)"
 
-#: guix/scripts/lint.scm:728
+#: guix/scripts/lint.scm:846
 #, scheme-format
 msgid "line ~a: parentheses feel lonely, move to the previous or next line"
 msgstr "linjen ~a: parenteser er ensomme, flyt til den forrige eller næste linje"
 
-#: guix/scripts/lint.scm:783
+#: guix/scripts/lint.scm:901
 msgid "Validate package descriptions"
 msgstr "Valider pakkebeskrivelser"
 
-#: guix/scripts/lint.scm:787
+#: guix/scripts/lint.scm:905
 msgid "Validate synopsis & description of GNU packages"
 msgstr "Valider synopsis og beskrivelse for GNU-pakker"
 
-#: guix/scripts/lint.scm:791
+#: guix/scripts/lint.scm:909
 msgid "Identify inputs that should be native inputs"
 msgstr "Identificer inddata som skal være standarddata"
 
-#: guix/scripts/lint.scm:795
+#: guix/scripts/lint.scm:913
+msgid "Identify inputs that should be inputs at all"
+msgstr "Identificer inddata som skal være inddata"
+
+#: guix/scripts/lint.scm:917
 msgid "Validate file names and availability of patches"
 msgstr "Valider filnavne og tilgængelighed for rettelser"
 
-#: guix/scripts/lint.scm:799
+#: guix/scripts/lint.scm:921
 msgid "Validate home-page URLs"
 msgstr "Valider hjemmesiders adresser"
 
 #. TRANSLATORS: <license> is the name of a data type and must not be
 #. translated.
-#: guix/scripts/lint.scm:805
+#: guix/scripts/lint.scm:927
 msgid "Make sure the 'license' field is a <license> or a list thereof"
 msgstr "Sikr at feltet »license« er en <license> eller en liste deraf"
 
-#: guix/scripts/lint.scm:810
+#: guix/scripts/lint.scm:932
 msgid "Validate source URLs"
 msgstr "Valider kildeadresser"
 
-#: guix/scripts/lint.scm:814
+#: guix/scripts/lint.scm:936
+msgid "Suggest 'mirror://' URLs"
+msgstr "Foreslå »mirror://«-adresser"
+
+#: guix/scripts/lint.scm:940
 msgid "Validate file names of sources"
 msgstr "Valider filnavne for kilder"
 
-#: guix/scripts/lint.scm:818
+#: guix/scripts/lint.scm:944
 msgid "Report failure to compile a package to a derivation"
-msgstr "Rapporter mislykket kompilering af en pakke til en afledning"
+msgstr "Rapporter mislykket kompilering af en pakke til et derivat"
 
-#: guix/scripts/lint.scm:822
+#: guix/scripts/lint.scm:948
 msgid "Validate package synopses"
 msgstr "Valider pakkesynopser"
 
-#: guix/scripts/lint.scm:826
+#: guix/scripts/lint.scm:952
 msgid "Check the Common Vulnerabilities and Exposures (CVE) database"
 msgstr "Kontroller databasen Common Vulnerabilities and Exposures (CVE)"
 
-#: guix/scripts/lint.scm:831
+#: guix/scripts/lint.scm:957
 msgid "Look for formatting issues in the source"
 msgstr "Kig efter formateringsproblemstillinger i kilden"
 
-#: guix/scripts/lint.scm:859
+#: guix/scripts/lint.scm:985
 msgid ""
 "Usage: guix lint [OPTION]... [PACKAGE]...\n"
 "Run a set of checkers on the specified package; if none is specified,\n"
@@ -1785,7 +1899,7 @@ msgstr ""
 "Kør et sæt af kontroller på den specificerede pakke; hvis ingen er specificeret,\n"
 "så kør kontrollerne på alle pakker.\n"
 
-#: guix/scripts/lint.scm:862
+#: guix/scripts/lint.scm:988
 msgid ""
 "\n"
 "  -c, --checkers=CHECKER1,CHECKER2...\n"
@@ -1795,7 +1909,7 @@ msgstr ""
 "  -c, --checkers=KONTROL1,KONTROL2...\n"
 "                         kør kun de specificerede kontroller"
 
-#: guix/scripts/lint.scm:867
+#: guix/scripts/lint.scm:993
 msgid ""
 "\n"
 "  -l, --list-checkers    display the list of available lint checkers"
@@ -1803,12 +1917,12 @@ msgstr ""
 "\n"
 "  -l, --list-checkers    vis listen med tilgængelige lint-kontroller"
 
-#: guix/scripts/lint.scm:887
+#: guix/scripts/lint.scm:1013
 #, scheme-format
 msgid "~a: invalid checker~%"
 msgstr "~a: ugyldig kontrol~%"
 
-#: guix/scripts/publish.scm:57
+#: guix/scripts/publish.scm:58
 #, scheme-format
 msgid ""
 "Usage: guix publish [OPTION]...\n"
@@ -1817,7 +1931,7 @@ msgstr ""
 "Brug: guix publish [TILVALG] ...\n"
 "Udgiv ~a over HTTP.\n"
 
-#: guix/scripts/publish.scm:59
+#: guix/scripts/publish.scm:60
 msgid ""
 "\n"
 "  -p, --port=PORT        listen on PORT"
@@ -1825,7 +1939,7 @@ msgstr ""
 "\n"
 "  -p, --port=PORT        lyt på PORT"
 
-#: guix/scripts/publish.scm:61
+#: guix/scripts/publish.scm:62
 msgid ""
 "\n"
 "      --listen=HOST      listen on the network interface for HOST"
@@ -1833,7 +1947,7 @@ msgstr ""
 "\n"
 "      --listen=VÆRT      lyt på netværksgrænsefladen efter VÆRT"
 
-#: guix/scripts/publish.scm:63
+#: guix/scripts/publish.scm:64
 msgid ""
 "\n"
 "  -u, --user=USER        change privileges to USER as soon as possible"
@@ -1841,7 +1955,7 @@ msgstr ""
 "\n"
 "  -u, --user=BRUGER      ændr privilegier for BRUGER så snart som muligt"
 
-#: guix/scripts/publish.scm:65
+#: guix/scripts/publish.scm:66
 msgid ""
 "\n"
 "  -C, --compression[=LEVEL]\n"
@@ -1851,15 +1965,15 @@ msgstr ""
 "  -C, --compression[=NIVEAU]\n"
 "                         komprimer arkiver med NIVEAU"
 
-#: guix/scripts/publish.scm:68
+#: guix/scripts/publish.scm:69
 msgid ""
 "\n"
 "      --ttl=TTL          announce narinfos can be cached for TTL seconds"
 msgstr ""
 "\n"
-"      --ttl=TTL          announce narinfos kan mellemlagres i TTL-sekunder"
+"      --ttl=TTL          announce narinfos kan mellemlagres i TTL sekunder"
 
-#: guix/scripts/publish.scm:70
+#: guix/scripts/publish.scm:71
 msgid ""
 "\n"
 "  -r, --repl[=PORT]      spawn REPL server on PORT"
@@ -1867,37 +1981,37 @@ msgstr ""
 "\n"
 "  -r, --repl[=PORT]      udsend REPL-server on PORT"
 
-#: guix/scripts/publish.scm:86
+#: guix/scripts/publish.scm:87
 #, scheme-format
 msgid "lookup of host '~a' failed: ~a~%"
 msgstr "opslag efter værten »~a« mislykkedes: ~a~%"
 
-#: guix/scripts/publish.scm:124
+#: guix/scripts/publish.scm:125
 #, scheme-format
 msgid "lookup of host '~a' returned nothing"
 msgstr "opslag efter værten »~a« returnerede intet"
 
-#: guix/scripts/publish.scm:137
+#: guix/scripts/publish.scm:138
 #, scheme-format
 msgid "zlib support is missing; compression disabled~%"
-msgstr "zlib-understøttelse mangler; kompression deaktiveret~%"
+msgstr "zlib-understøttelse mangler; komprimering deaktiveret~%"
 
-#: guix/scripts/publish.scm:144
+#: guix/scripts/publish.scm:145
 #, scheme-format
 msgid "~a: invalid duration~%"
 msgstr "~a: ugyldig varighed~%"
 
-#: guix/scripts/publish.scm:537
+#: guix/scripts/publish.scm:544
 #, scheme-format
 msgid "user '~a' not found: ~a~%"
 msgstr "brugeren »~a« blev ikke fundet: ~a~%"
 
-#: guix/scripts/publish.scm:574
+#: guix/scripts/publish.scm:581
 #, scheme-format
 msgid "server running as root; consider using the '--user' option!~%"
 msgstr "server kører som root; overvej at bruge tilvalget »--user«!~%"
 
-#: guix/scripts/publish.scm:576
+#: guix/scripts/publish.scm:583
 #, scheme-format
 msgid "publishing ~a on ~a, port ~d~%"
 msgstr "udgiver ~a på ~a, port ~d~%"
@@ -1915,34 +2029,34 @@ msgstr ""
 msgid "file '~a' not found in search path ~s~%"
 msgstr "filen »~a« blev ikke fundet i søgestien ~s~%"
 
-#: guix/scripts/edit.scm:83
+#: guix/scripts/edit.scm:90
 #, scheme-format
 msgid "source location of package '~a' is unknown~%"
 msgstr "kildeplacering for pakken »~a« er ukendt~%"
 
-#: guix/scripts/edit.scm:96
+#: guix/scripts/edit.scm:103
 #, scheme-format
 msgid "failed to launch '~a': ~a~%"
 msgstr "kunne ikke starte »~a«: ~a~%"
 
-#: guix/scripts/size.scm:76
+#: guix/scripts/size.scm:77
 #, scheme-format
 msgid "no available substitute information for '~a'~%"
 msgstr "ingen tilgængelig substitutinformation for »~a«~%"
 
-#: guix/scripts/size.scm:84
+#: guix/scripts/size.scm:85
 msgid "store item"
 msgstr "lagerpost"
 
-#: guix/scripts/size.scm:84
+#: guix/scripts/size.scm:85
 msgid "total"
 msgstr "i alt"
 
-#: guix/scripts/size.scm:84
+#: guix/scripts/size.scm:85
 msgid "self"
 msgstr "selv"
 
-#: guix/scripts/size.scm:95
+#: guix/scripts/size.scm:96
 #, scheme-format
 msgid "total: ~,1f MiB~%"
 msgstr "i alt: ~,1f MiB~%"
@@ -1950,11 +2064,11 @@ msgstr "i alt: ~,1f MiB~%"
 #. TRANSLATORS: This is the title of a graph, meaning that the graph
 #. represents a profile of the store (the "store" being the place where
 #. packages are stored.)
-#: guix/scripts/size.scm:206
+#: guix/scripts/size.scm:209
 msgid "store profile"
 msgstr "lagerprofil"
 
-#: guix/scripts/size.scm:215
+#: guix/scripts/size.scm:218
 msgid ""
 "Usage: guix size [OPTION]... PACKAGE\n"
 "Report the size of PACKAGE and its dependencies.\n"
@@ -1962,7 +2076,7 @@ msgstr ""
 "Brug: guix size [TILVALG]... PAKKE\n"
 "Rapporter størrelsen for PAKKE og dens afhængigheder.\n"
 
-#: guix/scripts/size.scm:220
+#: guix/scripts/size.scm:223
 msgid ""
 "\n"
 "  -s, --system=SYSTEM    consider packages for SYSTEM--e.g., \"i686-linux\""
@@ -1970,7 +2084,7 @@ msgstr ""
 "\n"
 "  -s, --system=SYSTEM    overvej pakker for SYSTEM--f.eks., »i686-linux«"
 
-#: guix/scripts/size.scm:222
+#: guix/scripts/size.scm:225
 msgid ""
 "\n"
 "  -m, --map-file=FILE    write to FILE a graphical map of disk usage"
@@ -1978,64 +2092,77 @@ msgstr ""
 "\n"
 "  -m, --map-file=FIL     skriv til FIL et grafisk kort over diskforbrug"
 
-#: guix/scripts/size.scm:276
+#: guix/scripts/size.scm:279
 msgid "missing store item argument\n"
 msgstr "manglende lagerpostargument\n"
 
-#: guix/scripts/graph.scm:82
+#: guix/scripts/graph.scm:83
 #, scheme-format
 msgid "~a: invalid argument (package name expected)"
 msgstr "~a: ugyldigt argument (forventede et pakkenavn)"
 
-#: guix/scripts/graph.scm:93
+#: guix/scripts/graph.scm:94
 msgid "the DAG of packages, excluding implicit inputs"
-msgstr "DAGen for pakker, ekskluderende implicitte inddata"
+msgstr "DAGen for pakker, eksklusive implicitte inddata"
 
-#: guix/scripts/graph.scm:150
+#: guix/scripts/graph.scm:151
 msgid "the DAG of packages, including implicit inputs"
 msgstr "DAGen for pakker, inklusive implicitte inddata"
 
-#: guix/scripts/graph.scm:160
+#: guix/scripts/graph.scm:161
 msgid "the DAG of packages and origins, including implicit inputs"
 msgstr "DAGen for pakker og oprindelser, inklusive implicitte inddata"
 
-#: guix/scripts/graph.scm:191
+#: guix/scripts/graph.scm:192
 msgid "same as 'bag', but without the bootstrap nodes"
 msgstr "samme som »bag«m uden bootstrap-knuder"
 
-#: guix/scripts/graph.scm:237
+#: guix/scripts/graph.scm:238
 msgid "the DAG of derivations"
-msgstr "DAGen for afledninger"
+msgstr "DAGen for derivater"
 
-#: guix/scripts/graph.scm:249
+#: guix/scripts/graph.scm:250
 msgid "unsupported argument for derivation graph"
-msgstr "argument for afledningsgraf er ikke understøttet"
+msgstr "argument for derivatgraf er ikke understøttet"
 
-#: guix/scripts/graph.scm:270
+#: guix/scripts/graph.scm:276
+msgid "unsupported argument for this type of graph"
+msgstr "ikke understøttet argument for denne graftype"
+
+#: guix/scripts/graph.scm:289
 #, scheme-format
 msgid "references for '~a' are not known~%"
 msgstr "referencer for »~a« er ikke kendt~%"
 
-#: guix/scripts/graph.scm:277
+#: guix/scripts/graph.scm:296
 msgid "the DAG of run-time dependencies (store references)"
 msgstr "DAGen for kørselstidsafhængigheder (lagerreferencer)"
 
-#: guix/scripts/graph.scm:290
-msgid "unsupported argument for reference graph"
-msgstr "argument for referencegraf er ikke understøttet"
+#: guix/scripts/graph.scm:312
+msgid "the DAG of referrers in the store"
+msgstr "DAGen for referencer i lageret"
 
-#: guix/scripts/graph.scm:315
+#: guix/scripts/graph.scm:338
 #, scheme-format
 msgid "~a: unknown node type~%"
 msgstr "~a: ukendt knudetype~%"
 
-#: guix/scripts/graph.scm:319
+#: guix/scripts/graph.scm:345
+#, scheme-format
+msgid "~a: unknown backend~%"
+msgstr "~a: ukendt motor~%"
+
+#: guix/scripts/graph.scm:349
 msgid "The available node types are:\n"
 msgstr "De gyldige knudetyper er:\n"
 
+#: guix/scripts/graph.scm:359
+msgid "The available backend types are:\n"
+msgstr "De gyldige motortyper er:\n"
+
 #. TRANSLATORS: Here 'dot' is the name of a program; it must not be
 #. translated.
-#: guix/scripts/graph.scm:355
+#: guix/scripts/graph.scm:403
 msgid ""
 "Usage: guix graph PACKAGE...\n"
 "Emit a Graphviz (dot) representation of the dependencies of PACKAGE...\n"
@@ -2043,7 +2170,23 @@ msgstr ""
 "Brug: guix graph PAKKE...\n"
 "Opret en Graphviz-repræsentation (dot) af afhængighederne for PAKKE...\n"
 
-#: guix/scripts/graph.scm:357
+#: guix/scripts/graph.scm:405
+msgid ""
+"\n"
+"  -b, --backend=TYPE     produce a graph with the given backend TYPE"
+msgstr ""
+"\n"
+"  -b, --backend=TYPE     fremstil en graf med den angivne motor-TYPE"
+
+#: guix/scripts/graph.scm:407
+msgid ""
+"\n"
+"      --list-backends    list the available graph backends"
+msgstr ""
+"\n"
+"      --list-backends     vis de tilgængelige grafmotorer"
+
+#: guix/scripts/graph.scm:409
 msgid ""
 "\n"
 "  -t, --type=TYPE        represent nodes of the given TYPE"
@@ -2051,7 +2194,7 @@ msgstr ""
 "\n"
 "  -t, --type=TYPE        repræsenter knuder for den givne TYPE"
 
-#: guix/scripts/graph.scm:359
+#: guix/scripts/graph.scm:411
 msgid ""
 "\n"
 "      --list-types       list the available graph types"
@@ -2059,7 +2202,7 @@ msgstr ""
 "\n"
 "      --list-types       vis de tilgængelige graftyper"
 
-#: guix/scripts/graph.scm:361
+#: guix/scripts/graph.scm:413
 msgid ""
 "\n"
 "  -e, --expression=EXPR  consider the package EXPR evaluates to"
@@ -2120,18 +2263,26 @@ msgstr ""
 "      --substitute-urls=ADRESSER\n"
 "                         sammenlign kompileringsresultater med dem på ADRESSER"
 
-#: guix/gnu-maintenance.scm:532
+#: guix/gnu-maintenance.scm:555
 msgid "Updater for GNU packages"
 msgstr "Opdater for GNU-pakker"
 
-#: guix/gnu-maintenance.scm:539
+#: guix/gnu-maintenance.scm:562
 msgid "Updater for GNOME packages"
 msgstr "Opdateringsprogram for GNOME-pakker"
 
-#: guix/gnu-maintenance.scm:546
+#: guix/gnu-maintenance.scm:569
+msgid "Updater for KDE packages"
+msgstr "Opdateringsprogram for KDE-pakker"
+
+#: guix/gnu-maintenance.scm:576
 msgid "Updater for X.org packages"
 msgstr "Opdateringsprogram for X.org-pakker"
 
+#: guix/gnu-maintenance.scm:583
+msgid "Updater for packages hosted on kernel.org"
+msgstr "Opdateringsprogram for pakker fra kernel.org"
+
 #: guix/scripts/container.scm:25
 msgid ""
 "Usage: guix container ACTION ARGS...\n"
@@ -2187,70 +2338,70 @@ msgstr "ingen sådan proces ~d~%"
 msgid "exec failed with status ~d~%"
 msgstr "exec mislykkedes med status ~d~%"
 
-#: guix/upstream.scm:157
+#: guix/upstream.scm:212
 #, scheme-format
 msgid "signature verification failed for `~a'~%"
 msgstr "signaturverifikation mislykkedes for »~a«~%"
 
-#: guix/upstream.scm:159
+#: guix/upstream.scm:214
 #, scheme-format
 msgid "(could be because the public key is not in your keyring)~%"
 msgstr "(kunne være fordi den offentlige nøgle ikke er i din nøglering)~%"
 
-#: guix/upstream.scm:191
+#: guix/upstream.scm:246
 msgid "gz"
 msgstr "gz"
 
-#: guix/upstream.scm:234
+#: guix/upstream.scm:293
 #, scheme-format
 msgid "~a: could not locate source file"
 msgstr "~a: kunne ikke lokalisere kildefil"
 
-#: guix/upstream.scm:239
+#: guix/upstream.scm:298
 #, scheme-format
 msgid "~a: ~a: no `version' field in source; skipping~%"
 msgstr "~a: ~a: intet »versionsfelt« i kilde; udelader~%"
 
-#: guix/ui.scm:238
+#: guix/ui.scm:239
 msgid "entering debugger; type ',bt' for a backtrace\n"
 msgstr "går i fejlsøger; tast »,bt« for en tilbagesporing\n"
 
-#: guix/ui.scm:254 guix/ui.scm:271
+#: guix/ui.scm:255 guix/ui.scm:272
 #, scheme-format
 msgid "failed to load '~a': ~a~%"
 msgstr "kunne ikke indlæse »~a«: ~a~%"
 
-#: guix/ui.scm:257
+#: guix/ui.scm:258
 #, scheme-format
 msgid "~a: error: ~a~%"
 msgstr "~a: fejl: ~a~%"
 
-#: guix/ui.scm:260 guix/ui.scm:529
+#: guix/ui.scm:261 guix/ui.scm:530
 #, scheme-format
 msgid "exception thrown: ~s~%"
 msgstr "undtagelse smidt: ~s~%"
 
-#: guix/ui.scm:262 guix/ui.scm:280
+#: guix/ui.scm:263 guix/ui.scm:281
 #, scheme-format
 msgid "failed to load '~a':~%"
 msgstr "kunne ikke indlæse »~a«:~%"
 
-#: guix/ui.scm:274
+#: guix/ui.scm:275
 #, scheme-format
 msgid "~a: warning: ~a~%"
 msgstr "~a: advarsel: ~a~%"
 
-#: guix/ui.scm:277
+#: guix/ui.scm:278
 #, scheme-format
 msgid "failed to load '~a': exception thrown: ~s~%"
 msgstr "kunne ikke indlæse »~a«: undtagelse smidt: ~s~%"
 
-#: guix/ui.scm:289
+#: guix/ui.scm:290
 #, scheme-format
 msgid "failed to install locale: ~a~%"
 msgstr "kunne ikke installere sprog: ~a~%"
 
-#: guix/ui.scm:308
+#: guix/ui.scm:309
 msgid ""
 "Copyright (C) 2016 the Guix authors\n"
 "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\n"
@@ -2266,7 +2417,7 @@ msgstr ""
 #. package.  Please add another line saying "Report translation bugs to
 #. ...\n" with the address for translation bugs (typically your translation
 #. team's web or email address).
-#: guix/ui.scm:320
+#: guix/ui.scm:321
 #, scheme-format
 msgid ""
 "\n"
@@ -2275,7 +2426,7 @@ msgstr ""
 "\n"
 "Rapporter fejl til: ~a."
 
-#: guix/ui.scm:322
+#: guix/ui.scm:323
 #, scheme-format
 msgid ""
 "\n"
@@ -2284,7 +2435,7 @@ msgstr ""
 "\n"
 "~a hjemmeside: <~a>"
 
-#: guix/ui.scm:324
+#: guix/ui.scm:325
 msgid ""
 "\n"
 "General help using GNU software: <http://www.gnu.org/gethelp/>"
@@ -2292,199 +2443,199 @@ msgstr ""
 "\n"
 "Generel hjælp til brugen af GNU-programmer: <http://www.gnu.org/gethelp/>"
 
-#: guix/ui.scm:369
+#: guix/ui.scm:370
 #, scheme-format
 msgid "'~a' is not a valid regular expression: ~a~%"
 msgstr "»~a« er ikke et gyldigt regulært udtryk: ~a~%"
 
-#: guix/ui.scm:375
+#: guix/ui.scm:376
 #, scheme-format
 msgid "~a: invalid number~%"
 msgstr "~a: ugyldigt nummer~%"
 
-#: guix/ui.scm:392
+#: guix/ui.scm:393
 #, scheme-format
 msgid "invalid number: ~a~%"
 msgstr "ugyldigt nummer: ~a~%"
 
-#: guix/ui.scm:415
+#: guix/ui.scm:416
 #, scheme-format
 msgid "unknown unit: ~a~%"
 msgstr "ukendt enhed: ~a~%"
 
-#: guix/ui.scm:432
+#: guix/ui.scm:433
 #, scheme-format
 msgid "~a:~a:~a: package `~a' has an invalid input: ~s~%"
 msgstr "~a:~a:~a: pakken »~a« har ugyldige inddata: ~s~%"
 
-#: guix/ui.scm:439
+#: guix/ui.scm:440
 #, scheme-format
 msgid "~a: ~a: build system `~a' does not support cross builds~%"
 msgstr "~a: ~a: kompileringssystem »~a« understøtter ikke krydskompileringer~%"
 
-#: guix/ui.scm:444
+#: guix/ui.scm:445
 #, scheme-format
 msgid "profile '~a' does not exist~%"
 msgstr "profilen »~a« findes ikke~%"
 
-#: guix/ui.scm:447
+#: guix/ui.scm:448
 #, scheme-format
 msgid "generation ~a of profile '~a' does not exist~%"
 msgstr "oprettelse ~a af profilen »~a« findes ikke~%"
 
-#: guix/ui.scm:454
+#: guix/ui.scm:455
 #, scheme-format
 msgid "corrupt input while restoring '~a' from ~s~%"
 msgstr "ødelagte inddata under gendannelse af »~a« fra ~s~%"
 
-#: guix/ui.scm:456
+#: guix/ui.scm:457
 #, scheme-format
 msgid "corrupt input while restoring archive from ~s~%"
 msgstr "ødelagte inddata under gendannelse af arkiv fra ~s~%"
 
-#: guix/ui.scm:459
+#: guix/ui.scm:460
 #, scheme-format
 msgid "failed to connect to `~a': ~a~%"
 msgstr "kunne ikke forbinde til »~a«: ~a~%"
 
-#: guix/ui.scm:464
+#: guix/ui.scm:465
 #, scheme-format
 msgid "build failed: ~a~%"
 msgstr "kompilering mislykkedes: ~a~%"
 
-#: guix/ui.scm:467
+#: guix/ui.scm:468
 #, scheme-format
 msgid "reference to invalid output '~a' of derivation '~a'~%"
-msgstr "reference til ugyldige uddata »~a« for afledning »~a«~%"
+msgstr "reference til ugyldige uddata »~a« for derivat »~a«~%"
 
-#: guix/ui.scm:471
+#: guix/ui.scm:472
 #, scheme-format
 msgid "file '~a' could not be found in these directories:~{ ~a~}~%"
 msgstr "filen »~a« blev ikke fundet i disse mapper:~{ ~a~}~%"
 
-#: guix/ui.scm:483
+#: guix/ui.scm:484
 #, scheme-format
 msgid "~a: ~a~%"
 msgstr "~a: ~a~%"
 
-#: guix/ui.scm:518
+#: guix/ui.scm:519
 #, scheme-format
 msgid "failed to read expression ~s: ~s~%"
 msgstr "kunne ikke læse udtryk ~s: ~s~%"
 
-#: guix/ui.scm:524
+#: guix/ui.scm:525
 #, scheme-format
 msgid "failed to evaluate expression '~a':~%"
 msgstr "kunne ikke evaluere udtryk »~a«:~%"
 
-#: guix/ui.scm:527
+#: guix/ui.scm:528
 #, scheme-format
 msgid "syntax error: ~a~%"
 msgstr "syntaksfejl: ~a~%"
 
-#: guix/ui.scm:541
+#: guix/ui.scm:542
 #, scheme-format
 msgid "expression ~s does not evaluate to a package~%"
 msgstr "udtryk ~s evaluerer ikke til en pakke~%"
 
-#: guix/ui.scm:603
+#: guix/ui.scm:604
 #, scheme-format
 msgid "~:[The following derivation would be built:~%~{   ~a~%~}~;~]"
 msgid_plural "~:[The following derivations would be built:~%~{   ~a~%~}~;~]"
-msgstr[0] "~:[Den følgende afledning ville blive kompileret:~%~{   ~a~%~}~;~]"
-msgstr[1] "~:[De følgende afledninger ville blive kompileret:~%~{   ~a~%~}~;~]"
+msgstr[0] "~:[Det følgende derivat ville blive kompileret:~%~{   ~a~%~}~;~]"
+msgstr[1] "~:[De følgende derivater ville blive kompileret:~%~{   ~a~%~}~;~]"
 
-#: guix/ui.scm:608
+#: guix/ui.scm:609
 #, scheme-format
 msgid "~:[The following file would be downloaded:~%~{   ~a~%~}~;~]"
 msgid_plural "~:[The following files would be downloaded:~%~{   ~a~%~}~;~]"
 msgstr[0] "~:[Den følgende fil ville blive hentet:~%~{   ~a~%~}~;~]"
 msgstr[1] "~:[De følgende filer ville blive hentet:~%~{   ~a~%~}~;~]"
 
-#: guix/ui.scm:614
+#: guix/ui.scm:615
 #, scheme-format
 msgid "~:[The following derivation will be built:~%~{   ~a~%~}~;~]"
 msgid_plural "~:[The following derivations will be built:~%~{   ~a~%~}~;~]"
-msgstr[0] "~:[Den følgende afledning vil blive kompileret:~%~{   ~a~%~}~;~]"
-msgstr[1] "~:[De følgende afledninger vil blive kompileret:~%~{   ~a~%~}~;~]"
+msgstr[0] "~:[Det følgende derivat vil blive kompileret:~%~{   ~a~%~}~;~]"
+msgstr[1] "~:[De følgende derivater vil blive kompileret:~%~{   ~a~%~}~;~]"
 
-#: guix/ui.scm:619
+#: guix/ui.scm:620
 #, scheme-format
 msgid "~:[The following file will be downloaded:~%~{   ~a~%~}~;~]"
 msgid_plural "~:[The following files will be downloaded:~%~{   ~a~%~}~;~]"
 msgstr[0] "~:[Den følgende fil vil blive hentet:~%~{   ~a~%~}~;~]"
 msgstr[1] "~:[De følgende filer vil blive hentet:~%~{   ~a~%~}~;~]"
 
-#: guix/ui.scm:674
+#: guix/ui.scm:675
 #, scheme-format
 msgid "The following package would be removed:~%~{~a~%~}~%"
 msgid_plural "The following packages would be removed:~%~{~a~%~}~%"
 msgstr[0] "Den følgende pakke ville blive fjernet:~%~{~a~%~}~%"
 msgstr[1] "De følgende pakker ville blive fjernet:~%~{~a~%~}~%"
 
-#: guix/ui.scm:679
+#: guix/ui.scm:680
 #, scheme-format
 msgid "The following package will be removed:~%~{~a~%~}~%"
 msgid_plural "The following packages will be removed:~%~{~a~%~}~%"
 msgstr[0] "Den følgende pakke vil blive fjernet:~%~{~a~%~}~%"
 msgstr[1] "De følgende pakker vil blive fjernet:~%~{~a~%~}~%"
 
-#: guix/ui.scm:692
+#: guix/ui.scm:693
 #, scheme-format
 msgid "The following package would be downgraded:~%~{~a~%~}~%"
 msgid_plural "The following packages would be downgraded:~%~{~a~%~}~%"
 msgstr[0] "Den følgende pakke ville blive nedgraderet:~%~{~a~%~}~%"
 msgstr[1] "De følgende pakker ville blive nedgraderet:~%~{~a~%~}~%"
 
-#: guix/ui.scm:697
+#: guix/ui.scm:698
 #, scheme-format
 msgid "The following package will be downgraded:~%~{~a~%~}~%"
 msgid_plural "The following packages will be downgraded:~%~{~a~%~}~%"
 msgstr[0] "Den følgende pakke vil blive nedgraderet:~%~{~a~%~}~%"
 msgstr[1] "De følgende pakker vil blive nedgraderet:~%~{~a~%~}~%"
 
-#: guix/ui.scm:710
+#: guix/ui.scm:711
 #, scheme-format
 msgid "The following package would be upgraded:~%~{~a~%~}~%"
 msgid_plural "The following packages would be upgraded:~%~{~a~%~}~%"
 msgstr[0] "Den følgende pakke ville blive opgraderet:~%~{~a~%~}~%"
 msgstr[1] "De følgende pakker ville blive opgraderet:~%~{~a~%~}~%"
 
-#: guix/ui.scm:715
+#: guix/ui.scm:716
 #, scheme-format
 msgid "The following package will be upgraded:~%~{~a~%~}~%"
 msgid_plural "The following packages will be upgraded:~%~{~a~%~}~%"
 msgstr[0] "Den følgende pakke vil blive opgraderet:~%~{~a~%~}~%"
 msgstr[1] "De følgende pakker vil blive opgraderet:~%~{~a~%~}~%"
 
-#: guix/ui.scm:726
+#: guix/ui.scm:727
 #, scheme-format
 msgid "The following package would be installed:~%~{~a~%~}~%"
 msgid_plural "The following packages would be installed:~%~{~a~%~}~%"
 msgstr[0] "Den følgende pakke ville blive installeret:~%~{~a~%~}~%"
 msgstr[1] "De følgende pakker ville blive installeret:~%~{~a~%~}~%"
 
-#: guix/ui.scm:731
+#: guix/ui.scm:732
 #, scheme-format
 msgid "The following package will be installed:~%~{~a~%~}~%"
 msgid_plural "The following packages will be installed:~%~{~a~%~}~%"
 msgstr[0] "Den følgende pakke vil blive installeret:~%~{~a~%~}~%"
 msgstr[1] "De følgende pakker vil blive installeret:~%~{~a~%~}~%"
 
-#: guix/ui.scm:748
+#: guix/ui.scm:749
 msgid "<unknown location>"
 msgstr "<ukendt sted>"
 
-#: guix/ui.scm:767
+#: guix/ui.scm:768
 #, scheme-format
 msgid "failed to create configuration directory `~a': ~a~%"
 msgstr "kunne ikke oprette konfiguratinsmappe »~a«: ~a~%"
 
-#: guix/ui.scm:890 guix/ui.scm:904
+#: guix/ui.scm:891 guix/ui.scm:905
 msgid "unknown"
 msgstr "ukendt"
 
-#: guix/ui.scm:1062
+#: guix/ui.scm:1063
 #, scheme-format
 msgid "Generation ~a\t~a"
 msgstr "Generation ~a\t~a"
@@ -2492,27 +2643,27 @@ msgstr "Generation ~a\t~a"
 #. TRANSLATORS: The word "current" here is an adjective for
 #. "Generation", as in "current generation".  Use the appropriate
 #. gender where applicable.
-#: guix/ui.scm:1072
+#: guix/ui.scm:1073
 #, scheme-format
 msgid "~a\t(current)~%"
 msgstr "~a\t(nuværende)~%"
 
-#: guix/ui.scm:1089
+#: guix/ui.scm:1116
 #, scheme-format
 msgid "switched from generation ~a to ~a~%"
 msgstr "skiftede fra generation ~a til ~a~%"
 
-#: guix/ui.scm:1105
+#: guix/ui.scm:1132
 #, scheme-format
 msgid "deleting ~a~%"
 msgstr "sletter ~a~%"
 
-#: guix/ui.scm:1153
+#: guix/ui.scm:1163
 #, scheme-format
 msgid "Try `guix --help' for more information.~%"
 msgstr "Prøv »guix --help« for yderligere information.~%"
 
-#: guix/ui.scm:1180
+#: guix/ui.scm:1191
 msgid ""
 "Usage: guix COMMAND ARGS...\n"
 "Run COMMAND with ARGS.\n"
@@ -2520,31 +2671,31 @@ msgstr ""
 "Brug: guix KOMMANDO ARG...\n"
 "Kør KOMMANDO med ARG.\n"
 
-#: guix/ui.scm:1183
+#: guix/ui.scm:1194
 msgid "COMMAND must be one of the sub-commands listed below:\n"
 msgstr "KOMMANDO skal være en af underkommandoerne vist nedenfor:\n"
 
-#: guix/ui.scm:1203
+#: guix/ui.scm:1214
 #, scheme-format
 msgid "guix: ~a: command not found~%"
 msgstr "guix: ~a: kommando blev ikke fundet~%"
 
-#: guix/ui.scm:1220
+#: guix/ui.scm:1233
 #, scheme-format
 msgid "guix: missing command name~%"
 msgstr "guix: mangler kommandonavn~%"
 
-#: guix/ui.scm:1228
+#: guix/ui.scm:1241
 #, scheme-format
 msgid "guix: unrecognized option '~a'~%"
 msgstr "guix: ikke genkendt tilvalg »~a«~%"
 
-#: guix/http-client.scm:266
+#: guix/http-client.scm:270
 #, scheme-format
 msgid "following redirection to `~a'...~%"
 msgstr "følger omdirigering til »~a«...~%"
 
-#: guix/http-client.scm:275
+#: guix/http-client.scm:279
 msgid "download failed"
 msgstr "overførsel mislykkedes"
 
@@ -2592,11 +2743,11 @@ msgstr "ugyldig arkivmærke for mellemfil"
 
 #: nix/nix-daemon/guix-daemon.cc:61
 msgid "guix-daemon -- perform derivation builds and store accesses"
-msgstr "guix-daemon - udfør afledningskompileringer og lageradgange"
+msgstr "guix-daemon – udfør derivatkompileringer og lageradgange"
 
 #: nix/nix-daemon/guix-daemon.cc:63
 msgid "This program is a daemon meant to run in the background.  It serves requests sent over a Unix-domain socket.  It accesses the store, and builds derivations on behalf of its clients."
-msgstr "Dette program er en ædmon lavet til at køre i baggrunden. Den betjener forespørgsler sendt over en Unix-domænesokkel. Den tilgår lageret, og bgyger afledninger på vegne af dens klienter."
+msgstr "Dette program er en ædmon lavet til at køre i baggrunden. Den betjener forespørgsler sendt over en Unix-domænesokkel. Den tilgår lageret, og bygger derivater på vegne af dens klienter."
 
 #: nix/nix-daemon/guix-daemon.cc:87
 msgid "SYSTEM"
@@ -2612,11 +2763,11 @@ msgstr "N"
 
 #: nix/nix-daemon/guix-daemon.cc:90
 msgid "use N CPU cores to build each derivation; 0 means as many as available"
-msgstr "brug N CPU-kerner til at kompilere hver afledning; 0 betyder så mange som er tilgængelige"
+msgstr "brug N cpu-kerner til at kompilere hvert derivat; 0 betyder så mange som er tilgængelige"
 
 #: nix/nix-daemon/guix-daemon.cc:93
 msgid "allow at most N build jobs"
-msgstr "tillad højest N-kompileringsjob"
+msgstr "tillad højst N kompileringsjob"
 
 #: nix/nix-daemon/guix-daemon.cc:95
 msgid "disable chroot builds"
@@ -2660,7 +2811,7 @@ msgstr "kompileringsfejl i mellemlageret"
 
 #: nix/nix-daemon/guix-daemon.cc:109
 msgid "build each derivation N times in a row"
-msgstr "kompiler hver derivation N gange i træk"
+msgstr "kompiler hvert derivat N gange i træk"
 
 #: nix/nix-daemon/guix-daemon.cc:111
 msgid "do not keep build logs"
@@ -2680,11 +2831,11 @@ msgstr "udgiv Linux 2.6"
 
 #: nix/nix-daemon/guix-daemon.cc:132
 msgid "tell whether the GC must keep outputs of live derivations"
-msgstr "fortæl om GC'en skal bevare uddata for live afledninger"
+msgstr "fortæl om GC'en skal bevare uddata for live derivater"
 
 #: nix/nix-daemon/guix-daemon.cc:135
 msgid "tell whether the GC must keep derivations corresponding to live outputs"
-msgstr "fortæl om GC'en skal bevare afledninger svarende til live uddata"
+msgstr "fortæl om GC'en skal bevare derivater svarende til live uddata"
 
 #: nix/nix-daemon/guix-daemon.cc:138
 msgid "SOCKET"
@@ -2717,9 +2868,3 @@ msgstr "fejl: forskellige versioner af libgcrypt\n"
 #, c-format
 msgid "warning: daemon is running as root, so using `--build-users-group' is highly recommended\n"
 msgstr "advarsel: dæmon kører som root, så brug af »--build-users-group« anbefales\n"
-
-#~ msgid "guix import: invalid importer~%"
-#~ msgstr "guix import: ugyldig importør~%"
-
-#~ msgid "too many arguments\n"
-#~ msgstr "for mange argumenter\n"
diff --git a/po/guix/fr.po b/po/guix/fr.po
index f641339e05..990b83926f 100644
--- a/po/guix/fr.po
+++ b/po/guix/fr.po
@@ -10,10 +10,10 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: guix 0.11.0\n"
+"Project-Id-Version: guix 0.12.0\n"
 "Report-Msgid-Bugs-To: ludo@gnu.org\n"
-"POT-Creation-Date: 2016-07-29 10:16+0200\n"
-"PO-Revision-Date: 2016-11-11 10:43+0100\n"
+"POT-Creation-Date: 2016-12-18 15:32+0100\n"
+"PO-Revision-Date: 2016-12-19 07:40+0100\n"
 "Last-Translator: Frédéric Marchal <fmarchal@perso.be>\n"
 "Language-Team: French <traduc@traduc.org>\n"
 "Language: fr\n"
@@ -53,85 +53,95 @@ msgstr "choix de ~a parmi ~a~%"
 msgid "deprecated NAME-VERSION syntax; use NAME@VERSION instead~%"
 msgstr "syntaxe NOM-VERSION dépréciée. Utilisez plutôt NOM@VERSION~%"
 
-#: gnu/packages.scm:311
+#: gnu/packages.scm:311 guix/scripts/package.scm:272
+#, scheme-format
+msgid "package '~a' has been superseded by '~a'~%"
+msgstr "le paquet « ~a » a été remplacé par « ~a »~%"
+
+#: gnu/packages.scm:318
 #, scheme-format
 msgid "~A: package not found for version ~a~%"
 msgstr "~A: paquet introuvable pour la version ~a~%"
 
-#: gnu/packages.scm:321
+#: gnu/packages.scm:328
 #, scheme-format
 msgid "~A: unknown package~%"
 msgstr "~A: paquet inconnu~%"
 
-#: gnu/packages.scm:349
+#: gnu/packages.scm:356
 #, scheme-format
 msgid "package `~a' lacks output `~a'~%"
 msgstr "le paquet « ~a » requiert la sortie « ~a »~%"
 
-#: gnu/services.scm:540
+#: gnu/services.scm:542
 #, scheme-format
 msgid "no target of type '~a' for service ~s"
 msgstr "pas de cible de type « ~a » pour le service ~s"
 
-#: gnu/services.scm:551 gnu/services.scm:612
+#: gnu/services.scm:553 gnu/services.scm:614
 #, scheme-format
 msgid "more than one target service of type '~a'"
 msgstr "plus d'un service cible de type « ~a »"
 
-#: gnu/services.scm:602
+#: gnu/services.scm:604
 #, scheme-format
 msgid "service of type '~a' not found"
 msgstr "service de type « ~a » pas trouvé"
 
-#: gnu/system.scm:500
+#: gnu/system.scm:522
 #, scheme-format
 msgid "using a string for file '~a' is deprecated; use 'plain-file' instead~%"
 msgstr "l'utilisation d'une chaîne pour le fichier « ~a » est dépréciée. Utilisez plutôt « plain-file »~%"
 
-#: gnu/system.scm:516
+#: gnu/system.scm:538
 #, scheme-format
 msgid "using a monadic value for '~a' is deprecated; use 'plain-file' instead~%"
 msgstr "l'utilisation d'une valeur monadic pour « ~a » est dépréciée. Utilisez plutôt « plain-file »~%"
 
-#: gnu/system.scm:650
+#: gnu/system.scm:680
 #, scheme-format
 msgid "~a: invalid locale name"
 msgstr "~a: nom d'environnement linguistique non valide"
 
-#: gnu/system.scm:770
+#: gnu/system.scm:860
+msgid "/"
+msgstr "/"
+
+#: gnu/system.scm:862
 #, scheme-format
 msgid "unrecognized boot parameters for '~a'~%"
 msgstr "paramètres de démarrage non reconnus pour « ~a »~%"
 
-#: gnu/services/shepherd.scm:162
+#: gnu/services/shepherd.scm:165
 #, scheme-format
 msgid "service '~a' provided more than once"
 msgstr "service « ~a » fourni plus d'une fois"
 
-#: gnu/services/shepherd.scm:177
+#: gnu/services/shepherd.scm:180
 #, scheme-format
 msgid "service '~a' requires '~a', which is not provided by any service"
 msgstr "le service « ~a » requiert « ~a » qui n'est fourni pas aucun service"
 
-#: gnu/system/shadow.scm:240
+#: gnu/system/shadow.scm:220
 #, scheme-format
 msgid "supplementary group '~a' of user '~a' is undeclared"
 msgstr "le groupe supplémentaire « ~a » de l'utilisateur « ~a » n'est pas déclaré"
 
-#: gnu/system/shadow.scm:250
+#: gnu/system/shadow.scm:230
 #, scheme-format
 msgid "primary group '~a' of user '~a' is undeclared"
 msgstr "le groupe primaire « ~a » de l'utilisateur « ~a » n'est pas déclaré"
 
-#: guix/scripts.scm:52
+#: guix/scripts.scm:53
 #, scheme-format
 msgid "invalid argument: ~a~%"
 msgstr "argument non valide: ~a~%"
 
-#: guix/scripts.scm:78 guix/scripts/download.scm:99 guix/scripts/gc.scm:164
-#: guix/scripts/import/cran.scm:78 guix/scripts/import/elpa.scm:77
-#: guix/scripts/pull.scm:219 guix/scripts/lint.scm:916
-#: guix/scripts/publish.scm:549 guix/scripts/graph.scm:383
+#: guix/scripts.scm:79 guix/scripts/download.scm:133 guix/scripts/gc.scm:164
+#: guix/scripts/import/cran.scm:82 guix/scripts/import/elpa.scm:77
+#: guix/scripts/pull.scm:219 guix/scripts/lint.scm:1042
+#: guix/scripts/publish.scm:556 guix/scripts/edit.scm:81
+#: guix/scripts/graph.scm:436
 #, scheme-format
 msgid "~A: unrecognized option~%"
 msgstr "~A: option non reconnue~%"
@@ -141,12 +151,12 @@ msgstr "~A: option non reconnue~%"
 msgid "failed to create GC root `~a': ~a~%"
 msgstr "impossible de créer la racine du GC « ~a »: ~a~%"
 
-#: guix/scripts/build.scm:198
+#: guix/scripts/build.scm:196
 #, scheme-format
 msgid "invalid replacement specification: ~s~%"
 msgstr "spécification de remplacement invalide: ~s~%"
 
-#: guix/scripts/build.scm:246
+#: guix/scripts/build.scm:253
 msgid ""
 "\n"
 "      --with-source=SOURCE\n"
@@ -156,7 +166,7 @@ msgstr ""
 "      --with-source=SOURCE\n"
 "                         utiliser la SOURCE donnée pour compiler le paquet correspondant"
 
-#: guix/scripts/build.scm:249
+#: guix/scripts/build.scm:256
 msgid ""
 "\n"
 "      --with-input=PACKAGE=REPLACEMENT\n"
@@ -166,12 +176,22 @@ msgstr ""
 "      --with-input=PAQUET=REMPLACEMENT\n"
 "                         remplacer le paquet de dépendance PAQUET par REMPLACEMENT"
 
-#: guix/scripts/build.scm:274
+#: guix/scripts/build.scm:259
+msgid ""
+"\n"
+"      --with-graft=PACKAGE=REPLACEMENT\n"
+"                         graft REPLACEMENT on packages that refer to PACKAGE"
+msgstr ""
+"\n"
+"      --with-graft=PAQUET=REMPLACEMENT\n"
+"                         greffer le paquet REMPLACEMENT sur les paquets qui font référence à PAQUET"
+
+#: guix/scripts/build.scm:284
 #, scheme-format
 msgid "transformation '~a' had no effect on ~a~%"
 msgstr "la transformation « ~a » n'a pas d'effet sur ~a~%"
 
-#: guix/scripts/build.scm:292
+#: guix/scripts/build.scm:302
 msgid ""
 "\n"
 "  -L, --load-path=DIR    prepend DIR to the package module search path"
@@ -179,7 +199,7 @@ msgstr ""
 "\n"
 "  -L, --load-path=REP    préfixer le chemin de recherche par REP "
 
-#: guix/scripts/build.scm:294
+#: guix/scripts/build.scm:304
 msgid ""
 "\n"
 "  -K, --keep-failed      keep build tree of failed builds"
@@ -187,7 +207,7 @@ msgstr ""
 "\n"
 "  -K, --keep-failed      garder l'arbre de compilation pour les compilations ayant échoué"
 
-#: guix/scripts/build.scm:296
+#: guix/scripts/build.scm:306
 msgid ""
 "\n"
 "  -k, --keep-going       keep going when some of the derivations fail"
@@ -195,7 +215,7 @@ msgstr ""
 "\n"
 "  -k, --keep-going       continuer si certaines dérivations échouent"
 
-#: guix/scripts/build.scm:298
+#: guix/scripts/build.scm:308
 msgid ""
 "\n"
 "  -n, --dry-run          do not build the derivations"
@@ -203,7 +223,7 @@ msgstr ""
 "\n"
 "  -n, --dry-run          ne pas compiler les dérivations"
 
-#: guix/scripts/build.scm:300
+#: guix/scripts/build.scm:310
 msgid ""
 "\n"
 "      --fallback         fall back to building when the substituter fails"
@@ -211,7 +231,7 @@ msgstr ""
 "\n"
 "      --fallback         revenir à la compilation quand le substitut échoue"
 
-#: guix/scripts/build.scm:302
+#: guix/scripts/build.scm:312
 msgid ""
 "\n"
 "      --no-substitutes   build instead of resorting to pre-built substitutes"
@@ -219,7 +239,7 @@ msgstr ""
 "\n"
 "      --no-substitutes   compiler plutôt que recourir à des substituts pré-compilés"
 
-#: guix/scripts/build.scm:304 guix/scripts/size.scm:217
+#: guix/scripts/build.scm:314 guix/scripts/size.scm:220
 msgid ""
 "\n"
 "      --substitute-urls=URLS\n"
@@ -229,7 +249,7 @@ msgstr ""
 "      --substitute-urls=URLS\n"
 "                         récupérer les substituts depuis les URLS si elles sont autorisées"
 
-#: guix/scripts/build.scm:307
+#: guix/scripts/build.scm:317
 msgid ""
 "\n"
 "      --no-grafts        do not graft packages"
@@ -237,7 +257,7 @@ msgstr ""
 "\n"
 "      --no-grafts        ne pas greffer les paquets"
 
-#: guix/scripts/build.scm:309
+#: guix/scripts/build.scm:319
 msgid ""
 "\n"
 "      --no-build-hook    do not attempt to offload builds via the build hook"
@@ -245,7 +265,7 @@ msgstr ""
 "\n"
 "      --no-build-hook    ne pas essayer de décharger les compilations via le hook de compilation"
 
-#: guix/scripts/build.scm:311
+#: guix/scripts/build.scm:321
 msgid ""
 "\n"
 "      --max-silent-time=SECONDS\n"
@@ -255,7 +275,7 @@ msgstr ""
 "      --max-silent-time=N\n"
 "                         marquer la compilation comme ayant échouée après N secondes de silence"
 
-#: guix/scripts/build.scm:314
+#: guix/scripts/build.scm:324
 msgid ""
 "\n"
 "      --timeout=SECONDS  mark the build as failed after SECONDS of activity"
@@ -263,7 +283,7 @@ msgstr ""
 "\n"
 "      --timeout=N        marquer la compilation comme ayant échouée après N secondes d'activité"
 
-#: guix/scripts/build.scm:316
+#: guix/scripts/build.scm:326
 msgid ""
 "\n"
 "      --verbosity=LEVEL  use the given verbosity LEVEL"
@@ -271,7 +291,7 @@ msgstr ""
 "\n"
 "      --verbosity=NIVEAU  utiliser le NIVEAU de verbosité donné"
 
-#: guix/scripts/build.scm:318
+#: guix/scripts/build.scm:328
 msgid ""
 "\n"
 "      --rounds=N         build N times in a row to detect non-determinism"
@@ -279,7 +299,7 @@ msgstr ""
 "\n"
 "      --rounds=N         compiler N fois de suite pour détecter les non déterminismes"
 
-#: guix/scripts/build.scm:320
+#: guix/scripts/build.scm:330
 msgid ""
 "\n"
 "  -c, --cores=N          allow the use of up to N CPU cores for the build"
@@ -287,7 +307,7 @@ msgstr ""
 "\n"
 "  -c, --cores=N          utiliser jusqu'à N cœurs CPU pour la compilation"
 
-#: guix/scripts/build.scm:322
+#: guix/scripts/build.scm:332
 msgid ""
 "\n"
 "  -M, --max-jobs=N       allow at most N build jobs"
@@ -295,12 +315,12 @@ msgstr ""
 "\n"
 "  -M, --max-jobs=N       autoriser au plus N tâches de compilation"
 
-#: guix/scripts/build.scm:428 guix/scripts/build.scm:435
+#: guix/scripts/build.scm:438 guix/scripts/build.scm:445
 #, scheme-format
 msgid "not a number: '~a' option argument: ~a~%"
 msgstr "pas un nombre: argument d'option « ~a »: ~a~%"
 
-#: guix/scripts/build.scm:455
+#: guix/scripts/build.scm:465
 msgid ""
 "Usage: guix build [OPTION]... PACKAGE-OR-DERIVATION...\n"
 "Build the given PACKAGE-OR-DERIVATION and return their output paths.\n"
@@ -308,7 +328,7 @@ msgstr ""
 "Usage: guix build [OPTION]... PAQUET-OU-DERIVATION...\n"
 "Compiler le PAQUET-OU-DERIVATION donné et retourner leur chemin de sortie.\n"
 
-#: guix/scripts/build.scm:457
+#: guix/scripts/build.scm:467
 msgid ""
 "\n"
 "  -e, --expression=EXPR  build the package or derivation EXPR evaluates to"
@@ -316,7 +336,7 @@ msgstr ""
 "\n"
 "  -e, --expression=EXPR  compiler le paquet ou la dérivation évalué par EXPR"
 
-#: guix/scripts/build.scm:459
+#: guix/scripts/build.scm:469
 msgid ""
 "\n"
 "  -f, --file=FILE        build the package or derivation that the code within\n"
@@ -326,7 +346,7 @@ msgstr ""
 "  -f, --file=FICHIER     compiler le paquet ou la dérivation qui est évaluée\n"
 "                         par le code dans FICHIER"
 
-#: guix/scripts/build.scm:462
+#: guix/scripts/build.scm:472
 msgid ""
 "\n"
 "  -S, --source           build the packages' source derivations"
@@ -334,7 +354,7 @@ msgstr ""
 "\n"
 "  -S, --source           compiler les dérivations de source du paquet"
 
-#: guix/scripts/build.scm:464
+#: guix/scripts/build.scm:474
 msgid ""
 "\n"
 "      --sources[=TYPE]   build source derivations; TYPE may optionally be one\n"
@@ -344,7 +364,7 @@ msgstr ""
 "      --sources[=TYPE]   compiler les dérivations sources. TYPE peut optionnellement\n"
 "                         être « package », « all » (défaut) ou « transitive »"
 
-#: guix/scripts/build.scm:467
+#: guix/scripts/build.scm:477
 msgid ""
 "\n"
 "  -s, --system=SYSTEM    attempt to build for SYSTEM--e.g., \"i686-linux\""
@@ -352,7 +372,7 @@ msgstr ""
 "\n"
 "  -s, --system=SYSTÈME   essayer de compiler pour le SYSTÈME donné, par exemple « i686-linux »"
 
-#: guix/scripts/build.scm:469
+#: guix/scripts/build.scm:479
 msgid ""
 "\n"
 "      --target=TRIPLET   cross-build for TRIPLET--e.g., \"armel-linux-gnu\""
@@ -360,7 +380,7 @@ msgstr ""
 "\n"
 "      --target=TRIPLET   effectuer une compilation croisée pour TRIPLET, par exemple « armel-linux-gnu »"
 
-#: guix/scripts/build.scm:471
+#: guix/scripts/build.scm:481
 msgid ""
 "\n"
 "  -d, --derivations      return the derivation paths of the given packages"
@@ -368,7 +388,7 @@ msgstr ""
 "\n"
 "  -d, --derivations      retourner les chemins de dérivation pour les paquets donnés"
 
-#: guix/scripts/build.scm:473
+#: guix/scripts/build.scm:483
 msgid ""
 "\n"
 "      --check            rebuild items to check for non-determinism issues"
@@ -376,7 +396,7 @@ msgstr ""
 "\n"
 "      --check            recompiler les éléments pour détecter des problèmes de non déterminisme"
 
-#: guix/scripts/build.scm:475
+#: guix/scripts/build.scm:485
 msgid ""
 "\n"
 "  -r, --root=FILE        make FILE a symlink to the result, and register it\n"
@@ -386,7 +406,7 @@ msgstr ""
 "  -r, --root=FICHIER     faire de FICHIER un lien symbolique pointant sur le résultat\n"
 "                         et l'enregistrer en tant que racine du garbage collector"
 
-#: guix/scripts/build.scm:478
+#: guix/scripts/build.scm:488
 msgid ""
 "\n"
 "  -q, --quiet            do not show the build log"
@@ -394,7 +414,7 @@ msgstr ""
 "\n"
 "  -q, --quiet            ne pas montrer le journal de compilation"
 
-#: guix/scripts/build.scm:480
+#: guix/scripts/build.scm:490
 msgid ""
 "\n"
 "      --log-file         return the log file names for the given derivations"
@@ -402,14 +422,14 @@ msgstr ""
 "\n"
 "      --log-file         retourner les fichiers de journalisation pour les dérivations données"
 
-#: guix/scripts/build.scm:487 guix/scripts/download.scm:56
-#: guix/scripts/package.scm:388 guix/scripts/gc.scm:74
-#: guix/scripts/hash.scm:56 guix/scripts/import.scm:91
-#: guix/scripts/import/cran.scm:46 guix/scripts/pull.scm:83
-#: guix/scripts/substitute.scm:827 guix/scripts/system.scm:695
-#: guix/scripts/lint.scm:865 guix/scripts/publish.scm:73
-#: guix/scripts/edit.scm:44 guix/scripts/size.scm:225
-#: guix/scripts/graph.scm:364 guix/scripts/challenge.scm:182
+#: guix/scripts/build.scm:497 guix/scripts/download.scm:81
+#: guix/scripts/package.scm:419 guix/scripts/gc.scm:74
+#: guix/scripts/hash.scm:59 guix/scripts/import.scm:91
+#: guix/scripts/import/cran.scm:47 guix/scripts/pull.scm:83
+#: guix/scripts/substitute.scm:836 guix/scripts/system.scm:748
+#: guix/scripts/lint.scm:991 guix/scripts/publish.scm:74
+#: guix/scripts/edit.scm:44 guix/scripts/size.scm:228
+#: guix/scripts/graph.scm:416 guix/scripts/challenge.scm:182
 #: guix/scripts/container.scm:33 guix/scripts/container/exec.scm:43
 msgid ""
 "\n"
@@ -418,14 +438,14 @@ msgstr ""
 "\n"
 "  -h, --help             afficher cette aide et quitter"
 
-#: guix/scripts/build.scm:489 guix/scripts/download.scm:58
-#: guix/scripts/package.scm:390 guix/scripts/gc.scm:76
-#: guix/scripts/hash.scm:58 guix/scripts/import.scm:93
-#: guix/scripts/import/cran.scm:48 guix/scripts/pull.scm:85
-#: guix/scripts/substitute.scm:829 guix/scripts/system.scm:697
-#: guix/scripts/lint.scm:869 guix/scripts/publish.scm:75
-#: guix/scripts/edit.scm:46 guix/scripts/size.scm:227
-#: guix/scripts/graph.scm:366 guix/scripts/challenge.scm:184
+#: guix/scripts/build.scm:499 guix/scripts/download.scm:83
+#: guix/scripts/package.scm:421 guix/scripts/gc.scm:76
+#: guix/scripts/hash.scm:61 guix/scripts/import.scm:93
+#: guix/scripts/import/cran.scm:49 guix/scripts/pull.scm:85
+#: guix/scripts/substitute.scm:838 guix/scripts/system.scm:750
+#: guix/scripts/lint.scm:995 guix/scripts/publish.scm:76
+#: guix/scripts/edit.scm:46 guix/scripts/size.scm:230
+#: guix/scripts/graph.scm:418 guix/scripts/challenge.scm:184
 #: guix/scripts/container.scm:35 guix/scripts/container/exec.scm:45
 msgid ""
 "\n"
@@ -434,7 +454,7 @@ msgstr ""
 "\n"
 "  -V, --version          afficher les informations sur la version et quitter"
 
-#: guix/scripts/build.scm:516
+#: guix/scripts/build.scm:526
 #, scheme-format
 msgid ""
 "invalid argument: '~a' option argument: ~a, ~\n"
@@ -443,33 +463,39 @@ msgstr ""
 "argument invalide: argument en option « ~a »: ~a, ~\n"
 "doit être « package », « all » ou « transitive »~%"
 
-#: guix/scripts/build.scm:563
+#: guix/scripts/build.scm:573
 #, scheme-format
 msgid "~s: not something we can build~%"
 msgstr "~s: pas quelque chose qu'on sait compiler~%"
 
-#: guix/scripts/build.scm:643
+#: guix/scripts/build.scm:627
+#, scheme-format
+msgid "~a: warning: package '~a' has no source~%"
+msgstr "~a: attention: le paquet « ~a » n'a pas de source~%"
+
+#: guix/scripts/build.scm:661
 #, scheme-format
 msgid "no build log for '~a'~%"
 msgstr "aucun journal de compilation pour « ~a »~%"
 
-#: guix/scripts/download.scm:47
+#: guix/scripts/download.scm:67
 msgid ""
 "Usage: guix download [OPTION] URL\n"
-"Download the file at URL, add it to the store, and print its store path\n"
-"and the hash of its contents.\n"
+"Download the file at URL to the store or to the given file, and print its\n"
+"file name and the hash of its contents.\n"
 "\n"
 "Supported formats: 'nix-base32' (default), 'base32', and 'base16'\n"
 "('hex' and 'hexadecimal' can be used as well).\n"
 msgstr ""
 "Usage: guix download [OPTION] URL\n"
-"Télécharger le fichier à partir de l'URL spécifiée, l'ajouter au dépôt et\n"
-"afficher son chemin et l'empreinte de son contenu.\n"
+"Télécharger le fichier à partir de l'URL spécifiée et l'ajouter au dépôt ou\n"
+"au fichier spécifié puis afficher son nom de fichier et l'empreinte de son\n"
+"contenu.\n"
 "\n"
 "Formats supportés: 'nix-base32' (défaut), 'base32', et 'base16'\n"
 "('hex' et 'hexadecimal' peuvent aussi être utilisés).\n"
 
-#: guix/scripts/download.scm:53 guix/scripts/hash.scm:51
+#: guix/scripts/download.scm:73 guix/scripts/hash.scm:54
 msgid ""
 "\n"
 "  -f, --format=FMT       write the hash in the given format"
@@ -477,91 +503,109 @@ msgstr ""
 "\n"
 "  -f, --format=FORMAT    écrire l'empreinte dans le FORMAT donné"
 
-#: guix/scripts/download.scm:76 guix/scripts/hash.scm:76
+#: guix/scripts/download.scm:75
+msgid ""
+"\n"
+"      --no-check-certificate\n"
+"                         do not validate the certificate of HTTPS servers "
+msgstr ""
+"\n"
+"      --no-check-certificate\n"
+"                         ne valide pas les certificats des serveurs HTTPS "
+
+#: guix/scripts/download.scm:78
+msgid ""
+"\n"
+"  -o, --output=FILE      download to FILE"
+msgstr ""
+"\n"
+"  -o, --output=FICHIER   télécharge dans le FICHIER"
+
+#: guix/scripts/download.scm:101 guix/scripts/hash.scm:82
 #, scheme-format
 msgid "unsupported hash format: ~a~%"
 msgstr "format d'empreinte non supporté: ~a~%"
 
-#: guix/scripts/download.scm:102 guix/scripts/package.scm:842
-#: guix/scripts/publish.scm:551
+#: guix/scripts/download.scm:136 guix/scripts/package.scm:879
+#: guix/scripts/publish.scm:558
 #, scheme-format
 msgid "~A: extraneous argument~%"
 msgstr "~A: argument superflu~%"
 
-#: guix/scripts/download.scm:111
+#: guix/scripts/download.scm:144
 #, scheme-format
 msgid "no download URI was specified~%"
 msgstr "aucune URI de téléchargement spécifiée~%"
 
-#: guix/scripts/download.scm:113
+#: guix/scripts/download.scm:146
 #, scheme-format
 msgid "~a: failed to parse URI~%"
 msgstr "~a: impossible d'évaluer l'URI~%"
 
-#: guix/scripts/download.scm:126
+#: guix/scripts/download.scm:156
 #, scheme-format
 msgid "~a: download failed~%"
 msgstr "~a: le téléchargement a échoué~%"
 
-#: guix/scripts/package.scm:104
+#: guix/scripts/package.scm:107
 #, scheme-format
 msgid "Try \"info '(guix) Invoking guix package'\" for more information.~%"
 msgstr "Essayez « info '(guix) Invoking guix package' » pour plus d'information.~%"
 
-#: guix/scripts/package.scm:126
+#: guix/scripts/package.scm:129
 #, scheme-format
 msgid "error: while creating directory `~a': ~a~%"
 msgstr "erreur: pendant la création du répertoire « ~a »: ~a~%"
 
-#: guix/scripts/package.scm:130
+#: guix/scripts/package.scm:133
 #, scheme-format
 msgid "Please create the `~a' directory, with you as the owner.~%"
 msgstr "Veuillez créer le répertoire « ~a » dont vous êtes le propriétaire.~%"
 
-#: guix/scripts/package.scm:137
+#: guix/scripts/package.scm:140
 #, scheme-format
 msgid "error: directory `~a' is not owned by you~%"
 msgstr "erreur: vous ne possédez pas le répertoire « ~a »"
 
-#: guix/scripts/package.scm:140
+#: guix/scripts/package.scm:143
 #, scheme-format
 msgid "Please change the owner of `~a' to user ~s.~%"
 msgstr "Veuillez définir ~s comme propriétaire de « ~a ».~%"
 
-#: guix/scripts/package.scm:175
+#: guix/scripts/package.scm:178
 #, scheme-format
 msgid "not removing generation ~a, which is current~%"
 msgstr "la génération ~a n'est pas supprimée car elle est actuelle~%"
 
-#: guix/scripts/package.scm:182
+#: guix/scripts/package.scm:185
 #, scheme-format
 msgid "no matching generation~%"
 msgstr "aucune génération correspondante~%"
 
-#: guix/scripts/package.scm:185 guix/scripts/package.scm:659
-#: guix/scripts/system.scm:502
+#: guix/scripts/package.scm:188 guix/scripts/package.scm:699
+#: guix/scripts/system.scm:549
 #, scheme-format
 msgid "invalid syntax: ~a~%"
 msgstr "syntaxe non valide: ~a~%"
 
-#: guix/scripts/package.scm:210
+#: guix/scripts/package.scm:214
 #, scheme-format
 msgid "nothing to be done~%"
 msgstr "aucune action à faire~%"
 
-#: guix/scripts/package.scm:224
+#: guix/scripts/package.scm:228
 #, scheme-format
 msgid "~a package in profile~%"
 msgid_plural "~a packages in profile~%"
 msgstr[0] "~a paquet dans le profile~%"
 msgstr[1] "~a paquets dans le profile~%"
 
-#: guix/scripts/package.scm:313
+#: guix/scripts/package.scm:344
 #, scheme-format
 msgid "The following environment variable definitions may be needed:~%"
 msgstr "Il pourrait être nécessaire de définir les variables d'environnement suivantes:~%"
 
-#: guix/scripts/package.scm:329
+#: guix/scripts/package.scm:360
 msgid ""
 "Usage: guix package [OPTION]...\n"
 "Install, remove, or upgrade packages in a single transaction.\n"
@@ -569,7 +613,7 @@ msgstr ""
 "Usage: guix package [OPTION]...\n"
 "Installer, supprimer ou mettre à jour les paquets en une seule transaction.\n"
 
-#: guix/scripts/package.scm:331
+#: guix/scripts/package.scm:362
 msgid ""
 "\n"
 "  -i, --install PACKAGE ...\n"
@@ -579,7 +623,7 @@ msgstr ""
 "  -i, --install=PAQUET ...\n"
 "                         installer PAQUETs"
 
-#: guix/scripts/package.scm:334
+#: guix/scripts/package.scm:365
 msgid ""
 "\n"
 "  -e, --install-from-expression=EXP\n"
@@ -589,7 +633,7 @@ msgstr ""
 "  -e, --install-from-expression=EXP\n"
 "                         installer le paquet évalué par EXP"
 
-#: guix/scripts/package.scm:337
+#: guix/scripts/package.scm:368
 msgid ""
 "\n"
 "  -f, --install-from-file=FILE\n"
@@ -601,7 +645,7 @@ msgstr ""
 "                         installer le paquet évalué par le code dans\n"
 "                         FICHIER"
 
-#: guix/scripts/package.scm:341
+#: guix/scripts/package.scm:372
 msgid ""
 "\n"
 "  -r, --remove PACKAGE ...\n"
@@ -611,7 +655,7 @@ msgstr ""
 "  -r, --remove=PAQUET ...\n"
 "                         supprimer PAQUETs"
 
-#: guix/scripts/package.scm:344
+#: guix/scripts/package.scm:375
 msgid ""
 "\n"
 "  -u, --upgrade[=REGEXP] upgrade all the installed packages matching REGEXP"
@@ -619,7 +663,7 @@ msgstr ""
 "\n"
 "  -u, --upgrade[=REGEXP] mettre à jour tous les paquets installés correspondant à REGEXP"
 
-#: guix/scripts/package.scm:346
+#: guix/scripts/package.scm:377
 msgid ""
 "\n"
 "  -m, --manifest=FILE    create a new profile generation with the manifest\n"
@@ -629,7 +673,7 @@ msgstr ""
 "  -m, --manifest=FICHIER créer une nouvelle génération de profil avec le\n"
 "                         manifeste dans FICHIER"
 
-#: guix/scripts/package.scm:349
+#: guix/scripts/package.scm:380
 msgid ""
 "\n"
 "      --do-not-upgrade[=REGEXP] do not upgrade any packages matching REGEXP"
@@ -637,7 +681,7 @@ msgstr ""
 "\n"
 "      --do-not-upgrade[=REGEXP] ne pas mettre à jour les paquets correspondant à REGEXP"
 
-#: guix/scripts/package.scm:351
+#: guix/scripts/package.scm:382
 msgid ""
 "\n"
 "      --roll-back        roll back to the previous generation"
@@ -645,7 +689,7 @@ msgstr ""
 "\n"
 "      --roll-back        revenir à la génération antérieure"
 
-#: guix/scripts/package.scm:353
+#: guix/scripts/package.scm:384
 msgid ""
 "\n"
 "      --search-paths[=KIND]\n"
@@ -655,7 +699,7 @@ msgstr ""
 "      --search-paths=[GENRE]\n"
 "                         afficher les définitions de variables d'environnement requises"
 
-#: guix/scripts/package.scm:356
+#: guix/scripts/package.scm:387
 msgid ""
 "\n"
 "  -l, --list-generations[=PATTERN]\n"
@@ -665,7 +709,7 @@ msgstr ""
 "  -l, --list-generations[=MOTIF]\n"
 "                         lister les générations correspondant à MOTIF"
 
-#: guix/scripts/package.scm:359
+#: guix/scripts/package.scm:390
 msgid ""
 "\n"
 "  -d, --delete-generations[=PATTERN]\n"
@@ -675,7 +719,7 @@ msgstr ""
 "  -d, --delete-generations[=MOTIF]\n"
 "                         supprimer les générations correspondant à MOTIF"
 
-#: guix/scripts/package.scm:362
+#: guix/scripts/package.scm:393
 msgid ""
 "\n"
 "  -S, --switch-generation=PATTERN\n"
@@ -685,7 +729,7 @@ msgstr ""
 "  -S, --switch-generation=MOTIF\n"
 "                         basculer vers une génération correspondant à MOTIF"
 
-#: guix/scripts/package.scm:365
+#: guix/scripts/package.scm:396
 msgid ""
 "\n"
 "  -p, --profile=PROFILE  use PROFILE instead of the user's default profile"
@@ -693,7 +737,7 @@ msgstr ""
 "\n"
 "  -p, --profile=PROFIL   utiliser PROFIL au lieu du profil par défaut de l'utilisateur"
 
-#: guix/scripts/package.scm:368
+#: guix/scripts/package.scm:399
 msgid ""
 "\n"
 "      --bootstrap        use the bootstrap Guile to build the profile"
@@ -701,7 +745,7 @@ msgstr ""
 "\n"
 "      --bootstrap        utiliser le programme d'amorçage Guile pour compiler le profil"
 
-#: guix/scripts/package.scm:370 guix/scripts/pull.scm:76
+#: guix/scripts/package.scm:401 guix/scripts/pull.scm:76
 msgid ""
 "\n"
 "      --verbose          produce verbose output"
@@ -709,7 +753,7 @@ msgstr ""
 "\n"
 "      --verbose          produire une sortie verbeuse"
 
-#: guix/scripts/package.scm:373
+#: guix/scripts/package.scm:404
 msgid ""
 "\n"
 "  -s, --search=REGEXP    search in synopsis and description using REGEXP"
@@ -717,7 +761,7 @@ msgstr ""
 "\n"
 "  -s, --search=REGEXP    chercher dans le synopsis et la description en utilisant REGEXP"
 
-#: guix/scripts/package.scm:375
+#: guix/scripts/package.scm:406
 msgid ""
 "\n"
 "  -I, --list-installed[=REGEXP]\n"
@@ -727,7 +771,7 @@ msgstr ""
 "  -I, --list-installed[=REGEXP]\n"
 "                         lister les paquets installés correspondant à REGEXP"
 
-#: guix/scripts/package.scm:378
+#: guix/scripts/package.scm:409
 msgid ""
 "\n"
 "  -A, --list-available[=REGEXP]\n"
@@ -737,7 +781,7 @@ msgstr ""
 "  -A, --list-available[=REGEXP]\n"
 "                         lister les paquets disponibles correspondant à REGEXP"
 
-#: guix/scripts/package.scm:381
+#: guix/scripts/package.scm:412
 msgid ""
 "\n"
 "      --show=PACKAGE     show details about PACKAGE"
@@ -745,22 +789,22 @@ msgstr ""
 "\n"
 "      --show=PAQUET      montrer des détails du PAQUET"
 
-#: guix/scripts/package.scm:476
+#: guix/scripts/package.scm:507
 #, scheme-format
 msgid "~a: unsupported kind of search path~%"
 msgstr "~a: type de chemin de recherche non supporté~%"
 
-#: guix/scripts/package.scm:755
+#: guix/scripts/package.scm:790
 #, scheme-format
 msgid "cannot switch to generation '~a'~%"
 msgstr "impossible de passer à la génération « ~a »~%"
 
-#: guix/scripts/package.scm:771
+#: guix/scripts/package.scm:806
 #, scheme-format
 msgid "would install new manifest from '~a' with ~d entries~%"
 msgstr "installerait le nouveau manifeste depuis « ~a » avec ~d entrées~%"
 
-#: guix/scripts/package.scm:773
+#: guix/scripts/package.scm:808
 #, scheme-format
 msgid "installing new manifest from '~a' with ~d entries~%"
 msgstr "installation du nouveau manifeste depuis « ~a » avec ~d entrées~%"
@@ -897,7 +941,7 @@ msgstr "arguments superflus: ~{~a ~}~%"
 msgid "freed ~h bytes~%"
 msgstr "~h octets libérés~%"
 
-#: guix/scripts/hash.scm:46
+#: guix/scripts/hash.scm:47
 msgid ""
 "Usage: guix hash [OPTION] FILE\n"
 "Return the cryptographic hash of FILE.\n"
@@ -911,7 +955,15 @@ msgstr ""
 "Formats supportés: « nix-base32 » (défaut), « base32 », et « base16 » (« hex »\n"
 "et « hexadecimal » peuvent également être utilisés).\n"
 
-#: guix/scripts/hash.scm:53
+#: guix/scripts/hash.scm:52
+msgid ""
+"\n"
+"  -x, --exclude-vcs      exclude version control directories"
+msgstr ""
+"\n"
+"  -x, --exclude-vcs      exclure les répertoires de contrôle de versions"
+
+#: guix/scripts/hash.scm:56
 msgid ""
 "\n"
 "  -r, --recursive        compute the hash on FILE recursively"
@@ -919,17 +971,18 @@ msgstr ""
 "\n"
 "  -r, --recursive        calculer l'empreinte de FICHIER de manière récursive"
 
-#: guix/scripts/hash.scm:104
+#: guix/scripts/hash.scm:109
 #, scheme-format
 msgid "unrecognized option: ~a~%"
 msgstr "option non reconnue: ~a~%"
 
-#: guix/scripts/hash.scm:135 guix/ui.scm:477
+#: guix/scripts/hash.scm:152 guix/ui.scm:478
 #, scheme-format
 msgid "~a~%"
 msgstr "~a~%"
 
-#: guix/scripts/hash.scm:138 guix/scripts/system.scm:825
+#: guix/scripts/hash.scm:155 guix/scripts/system.scm:879
+#: guix/scripts/system.scm:886 guix/scripts/system.scm:893
 #, scheme-format
 msgid "wrong number of arguments~%"
 msgstr "nombre d'arguments incorrect~%"
@@ -951,17 +1004,17 @@ msgstr "IMPORTATEUR doit être un des importateurs listés ci-dessous:\n"
 msgid "guix import: missing importer name~%"
 msgstr "guix import: nom d'importateur manquant~%"
 
-#: guix/scripts/import.scm:115
+#: guix/scripts/import.scm:122
 #, scheme-format
 msgid "'~a' import failed~%"
 msgstr "l'importateur « ~a » a échoué~%"
 
-#: guix/scripts/import.scm:116
+#: guix/scripts/import.scm:123
 #, scheme-format
 msgid "~a: invalid importer~%"
 msgstr "~a: importateur non valide~%"
 
-#: guix/scripts/import/cran.scm:42
+#: guix/scripts/import/cran.scm:43
 msgid ""
 "Usage: guix import cran PACKAGE-NAME\n"
 "Import and convert the CRAN package for PACKAGE-NAME.\n"
@@ -969,7 +1022,7 @@ msgstr ""
 "Usage: guix import cran PAQUET-NOM\n"
 "Importer et convertir le paquet CAN pour PAQUET-NOM.\n"
 
-#: guix/scripts/import/cran.scm:44
+#: guix/scripts/import/cran.scm:45
 msgid ""
 "\n"
 "  -a, --archive=ARCHIVE  specify the archive repository"
@@ -977,17 +1030,17 @@ msgstr ""
 "\n"
 "  -a, --archive=ARCHIVE  spécifier le dépôt de l'archive"
 
-#: guix/scripts/import/cran.scm:94
+#: guix/scripts/import/cran.scm:108
 #, scheme-format
 msgid "failed to download description for package '~a'~%"
 msgstr "échec lors du téléchargement de la description du paquet « ~a »~%"
 
-#: guix/scripts/import/cran.scm:98 guix/scripts/import/elpa.scm:95
+#: guix/scripts/import/cran.scm:112 guix/scripts/import/elpa.scm:95
 #, scheme-format
 msgid "too few arguments~%"
 msgstr "trop peux d'arguments~%"
 
-#: guix/scripts/import/cran.scm:100 guix/scripts/import/elpa.scm:97
+#: guix/scripts/import/cran.scm:114 guix/scripts/import/elpa.scm:97
 #, scheme-format
 msgid "too many arguments~%"
 msgstr "trop d'arguments~%"
@@ -1089,127 +1142,127 @@ msgstr "~A: argument inattendu~%"
 msgid "failed to download up-to-date source, exiting\n"
 msgstr "impossible de télécharger une source à jour; fin\n"
 
-#: guix/scripts/substitute.scm:113
+#: guix/scripts/substitute.scm:112
 #, scheme-format
 msgid "authentication and authorization of substitutes disabled!~%"
 msgstr "authentification et autorisation des substituts désactivées !~%"
 
-#: guix/scripts/substitute.scm:188
+#: guix/scripts/substitute.scm:187
 #, scheme-format
 msgid "download from '~a' failed: ~a, ~s~%"
 msgstr "le téléchargement depuis « ~a » a échoué: ~a, ~s~%"
 
-#: guix/scripts/substitute.scm:201
+#: guix/scripts/substitute.scm:200
 #, scheme-format
 msgid "while fetching ~a: server is somewhat slow~%"
 msgstr "pendant la récupération de ~a: le serveur est plutôt lent~%"
 
-#: guix/scripts/substitute.scm:203
+#: guix/scripts/substitute.scm:202
 #, scheme-format
 msgid "try `--no-substitutes' if the problem persists~%"
 msgstr "essayez l'option « --no-substitutes » si le problème persiste~%"
 
-#: guix/scripts/substitute.scm:219
+#: guix/scripts/substitute.scm:220
 #, scheme-format
 msgid "unsupported substitute URI scheme: ~a~%"
 msgstr "schéma de substitution URI non supporté: ~a~%"
 
-#: guix/scripts/substitute.scm:252
+#: guix/scripts/substitute.scm:254
 #, scheme-format
 msgid "while fetching '~a': ~a (~s)~%"
 msgstr "pendant la récupération de « ~a »: ~a (~s)~%"
 
-#: guix/scripts/substitute.scm:257
+#: guix/scripts/substitute.scm:259
 #, scheme-format
 msgid "ignoring substitute server at '~s'~%"
 msgstr "ignore le serveur de substitution à « ~s »~%"
 
-#: guix/scripts/substitute.scm:306
+#: guix/scripts/substitute.scm:309
 #, scheme-format
 msgid "signature version must be a number: ~s~%"
 msgstr "la version de la signature doit être un nombre: ~s~%"
 
-#: guix/scripts/substitute.scm:310
+#: guix/scripts/substitute.scm:313
 #, scheme-format
 msgid "unsupported signature version: ~a~%"
 msgstr "version de signature non supportée: ~a~%"
 
-#: guix/scripts/substitute.scm:318
+#: guix/scripts/substitute.scm:321
 #, scheme-format
 msgid "signature is not a valid s-expression: ~s~%"
 msgstr "la signature n'est pas une s-expression valide: ~s~%"
 
-#: guix/scripts/substitute.scm:322
+#: guix/scripts/substitute.scm:325
 #, scheme-format
 msgid "invalid format of the signature field: ~a~%"
 msgstr "format invalide du champ de signature: ~a~%"
 
-#: guix/scripts/substitute.scm:357
+#: guix/scripts/substitute.scm:360
 #, scheme-format
 msgid "invalid signature for '~a'~%"
 msgstr "signature non valide pour « ~a »~%"
 
-#: guix/scripts/substitute.scm:359
+#: guix/scripts/substitute.scm:362
 #, scheme-format
 msgid "hash mismatch for '~a'~%"
 msgstr "l'empreinte ne correspond pas pour « ~a »~%"
 
-#: guix/scripts/substitute.scm:361
+#: guix/scripts/substitute.scm:364
 #, scheme-format
 msgid "'~a' is signed with an unauthorized key~%"
 msgstr "« ~a » est signé avec une clé non autorisée~%"
 
-#: guix/scripts/substitute.scm:363
+#: guix/scripts/substitute.scm:366
 #, scheme-format
 msgid "signature on '~a' is corrupt~%"
 msgstr "la signature de « ~a » est corrompue~%"
 
-#: guix/scripts/substitute.scm:401
+#: guix/scripts/substitute.scm:404
 #, scheme-format
 msgid "substitute at '~a' lacks a signature~%"
 msgstr "le substitut à « ~a » n'a pas de signature~%"
 
-#: guix/scripts/substitute.scm:409
+#: guix/scripts/substitute.scm:411
 #, scheme-format
-msgid "~%Found valid signature for ~a~%"
-msgstr "~%Signature valide trouvée pour ~a~%"
+msgid "Found valid signature for ~a~%"
+msgstr "Signature valide trouvée pour ~a~%"
 
-#: guix/scripts/substitute.scm:412
+#: guix/scripts/substitute.scm:414
 #, scheme-format
 msgid "From ~a~%"
 msgstr "De ~a~%"
 
-#: guix/scripts/substitute.scm:452
+#: guix/scripts/substitute.scm:454
 #, scheme-format
 msgid "'~a' does not name a store item~%"
 msgstr "« ~a » ne nomme pas un élément du stockage~%"
 
-#: guix/scripts/substitute.scm:596
+#: guix/scripts/substitute.scm:600
 #, scheme-format
 msgid "updating list of substitutes from '~a'... ~5,1f%"
 msgstr "mise à jour de la liste des substituts depuis « ~a »... ~5,1f%"
 
-#: guix/scripts/substitute.scm:646
+#: guix/scripts/substitute.scm:655
 #, scheme-format
 msgid "~s: unsupported server URI scheme~%"
 msgstr "~s: schéma de URI serveur non supporté~%"
 
-#: guix/scripts/substitute.scm:656
+#: guix/scripts/substitute.scm:665
 #, scheme-format
 msgid "'~a' uses different store '~a'; ignoring it~%"
 msgstr "« ~a » utilise un stockage « ~a » différent. Il est ignoré~%"
 
-#: guix/scripts/substitute.scm:801
+#: guix/scripts/substitute.scm:810
 #, scheme-format
 msgid "host name lookup error: ~a~%"
 msgstr "erreur lors de la consultation du nom d'hôte: ~a~%"
 
-#: guix/scripts/substitute.scm:806
+#: guix/scripts/substitute.scm:815
 #, scheme-format
 msgid "TLS error in procedure '~a': ~a~%"
 msgstr "erreur TLS dans la procédure « ~a »: ~a~%"
 
-#: guix/scripts/substitute.scm:817
+#: guix/scripts/substitute.scm:826
 msgid ""
 "Usage: guix substitute [OPTION]...\n"
 "Internal tool to substitute a pre-built binary to a local build.\n"
@@ -1217,7 +1270,7 @@ msgstr ""
 "Usage: guix substitute [OPTION]...\n"
 "Outil interne pour substituer un binaire pré-compilé à une compilation locale.\n"
 
-#: guix/scripts/substitute.scm:819
+#: guix/scripts/substitute.scm:828
 msgid ""
 "\n"
 "      --query            report on the availability of substitutes for the\n"
@@ -1228,7 +1281,7 @@ msgstr ""
 "                         noms de fichiers de dépôt passés sur l'entrée\n"
 "                         standard"
 
-#: guix/scripts/substitute.scm:822
+#: guix/scripts/substitute.scm:831
 msgid ""
 "\n"
 "      --substitute STORE-FILE DESTINATION\n"
@@ -1243,41 +1296,41 @@ msgstr ""
 #. TRANSLATORS: The second part of this message looks like
 #. "(4.1MiB installed)"; it shows the size of the package once
 #. installed.
-#: guix/scripts/substitute.scm:895
+#: guix/scripts/substitute.scm:904
 #, scheme-format
 msgid "Downloading ~a~:[~*~; (~a installed)~]...~%"
 msgstr "Téléchargement de ~a~:[~*~; (~a installé)~]...~%"
 
-#: guix/scripts/substitute.scm:951
+#: guix/scripts/substitute.scm:961
 msgid "ACL for archive imports seems to be uninitialized, substitutes may be unavailable\n"
 msgstr "l'ACL pour l'import d'archives ne semble pas initialisée ; les substituts pourraient être indisponibles\n"
 
-#: guix/scripts/substitute.scm:1047
+#: guix/scripts/substitute.scm:1057
 #, scheme-format
 msgid "~a: unrecognized options~%"
 msgstr "~a: options non reconnues~%"
 
-#: guix/scripts/authenticate.scm:58
+#: guix/scripts/authenticate.scm:59
 #, scheme-format
 msgid "cannot find public key for secret key '~a'~%"
 msgstr "impossible de trouver la clé publique correspondant à la clé secrète « ~a »~%"
 
-#: guix/scripts/authenticate.scm:78
+#: guix/scripts/authenticate.scm:79
 #, scheme-format
 msgid "error: invalid signature: ~a~%"
 msgstr "erreur: signature non valide: ~a~%"
 
-#: guix/scripts/authenticate.scm:80
+#: guix/scripts/authenticate.scm:81
 #, scheme-format
 msgid "error: unauthorized public key: ~a~%"
 msgstr "erreur: clé publique non autorisée: ~a~%"
 
-#: guix/scripts/authenticate.scm:82
+#: guix/scripts/authenticate.scm:83
 #, scheme-format
 msgid "error: corrupt signature data: ~a~%"
 msgstr "erreur: signature corrompue: ~a~%"
 
-#: guix/scripts/authenticate.scm:120
+#: guix/scripts/authenticate.scm:121
 msgid ""
 "Usage: guix authenticate OPTION...\n"
 "Sign or verify the signature on the given file.  This tool is meant to\n"
@@ -1287,187 +1340,207 @@ msgstr ""
 "Signer ou vérifier la signature du fichier donné.  Cet outil est destiné\n"
 "à être utilisé en interne par « guix-daemon ».\n"
 
-#: guix/scripts/authenticate.scm:126
+#: guix/scripts/authenticate.scm:127
 msgid "wrong arguments"
 msgstr "mauvais arguments"
 
-#: guix/scripts/system.scm:111
+#: guix/scripts/system.scm:109
 #, scheme-format
 msgid "failed to register '~a' under '~a'~%"
 msgstr "impossible d'enregistrer « ~a » sous « ~a »~%"
 
-#: guix/scripts/system.scm:144
+#: guix/scripts/system.scm:142
 #, scheme-format
 msgid "failed to install GRUB on device '~a'~%"
 msgstr "échec de l'installation de GRUB sur le périphérique « ~a »~%"
 
-#: guix/scripts/system.scm:162
+#: guix/scripts/system.scm:160
 #, scheme-format
 msgid "initializing the current root file system~%"
 msgstr "initialisation du système de fichier racine courant~%"
 
-#: guix/scripts/system.scm:176
+#: guix/scripts/system.scm:174
 #, scheme-format
 msgid "not running as 'root', so the ownership of '~a' may be incorrect!~%"
 msgstr "n'est pas exécuté en tant que « root » donc le propriétaire de « ~a » pourrait être incorrect !~%"
 
-#: guix/scripts/system.scm:234
+#: guix/scripts/system.scm:238
 #, scheme-format
 msgid "while talking to shepherd: ~a~%"
 msgstr "en parlant à shepherd: ~a~%"
 
-#: guix/scripts/system.scm:248
+#: guix/scripts/system.scm:245
 #, scheme-format
 msgid "service '~a' could not be found~%"
 msgstr "service: « ~a » introuvable~%"
 
-#: guix/scripts/system.scm:251
+#: guix/scripts/system.scm:248
 #, scheme-format
 msgid "service '~a' does not have an action '~a'~%"
 msgstr "le service « ~a » n'a pas d'action « ~a »~%"
 
-#: guix/scripts/system.scm:255
+#: guix/scripts/system.scm:252
 #, scheme-format
 msgid "exception caught while executing '~a' on service '~a':~%"
 msgstr "exception interceptée pendant l'exécution de « ~a » sur le service « ~a »:~%"
 
-#: guix/scripts/system.scm:263
+#: guix/scripts/system.scm:260
 #, scheme-format
 msgid "something went wrong: ~s~%"
 msgstr "quelque chose s'est mal passé: ~s~%"
 
-#: guix/scripts/system.scm:266
+#: guix/scripts/system.scm:263
 #, scheme-format
 msgid "shepherd error~%"
 msgstr "erreur de shepherd~%"
 
-#: guix/scripts/system.scm:302
+#: guix/scripts/system.scm:280
 #, scheme-format
 msgid "failed to obtain list of shepherd services~%"
 msgstr "erreur en essayant d'obtenir la liste des services de shepherd~%"
 
-#: guix/scripts/system.scm:322
+#: guix/scripts/system.scm:300
 #, scheme-format
 msgid "unloading service '~a'...~%"
 msgstr "déchargement du service « ~a »...~%"
 
-#: guix/scripts/system.scm:330
+#: guix/scripts/system.scm:308
 #, scheme-format
 msgid "loading new services:~{ ~a~}...~%"
 msgstr "Chargement des nouveaux services:~{ ~a~}...~%"
 
-#: guix/scripts/system.scm:354
+#: guix/scripts/system.scm:332
 #, scheme-format
 msgid "activating system...~%"
 msgstr "activation du système...~%"
 
-#: guix/scripts/system.scm:445
+#: guix/scripts/system.scm:425
+#, scheme-format
+msgid "cannot switch to system generation '~a'~%"
+msgstr "impossible de passer à la génération « ~a » du système~%"
+
+#: guix/scripts/system.scm:459
+#, scheme-format
+msgid "failed to re-install GRUB configuration file: '~a'~%"
+msgstr "échec à la ré-installation du fichier de configuration de GRUB: « ~a »~%"
+
+#: guix/scripts/system.scm:489
 msgid "the DAG of services"
 msgstr "le graphe orienté acyclique (DAG) des services"
 
-#: guix/scripts/system.scm:458
+#: guix/scripts/system.scm:502
 msgid "the dependency graph of shepherd services"
 msgstr "le graphique des dépendances des services de shepherd"
 
-#: guix/scripts/system.scm:479
+#: guix/scripts/system.scm:526
 #, scheme-format
 msgid "  file name: ~a~%"
 msgstr "  nom de fichier: ~a~%"
 
-#: guix/scripts/system.scm:480
+#: guix/scripts/system.scm:527
 #, scheme-format
 msgid "  canonical file name: ~a~%"
 msgstr "  nom de fichier canonique: ~a~%"
 
 #. TRANSLATORS: Please preserve the two-space indentation.
-#: guix/scripts/system.scm:482
+#: guix/scripts/system.scm:529
 #, scheme-format
 msgid "  label: ~a~%"
 msgstr "  étiquette: ~a~%"
 
-#: guix/scripts/system.scm:483
+#: guix/scripts/system.scm:530
 #, scheme-format
 msgid "  root device: ~a~%"
 msgstr "  périphérique racine: ~a~%"
 
-#: guix/scripts/system.scm:484
+#: guix/scripts/system.scm:531
 #, scheme-format
 msgid "  kernel: ~a~%"
 msgstr "  noyau: ~a~%"
 
-#: guix/scripts/system.scm:541
+#: guix/scripts/system.scm:588
 #, scheme-format
 msgid "~a not found: 'guix pull' was never run~%"
 msgstr "~a pas trouvé: « guix pull » n'a jamais été exécuté~%"
 
-#: guix/scripts/system.scm:542
+#: guix/scripts/system.scm:589
 #, scheme-format
 msgid "Consider running 'guix pull' before 'reconfigure'.~%"
 msgstr "Envisagez d'exécuter « guix pull » avant « reconfigure ».~%"
 
-#: guix/scripts/system.scm:543
+#: guix/scripts/system.scm:590
 #, scheme-format
 msgid "Failing to do that may downgrade your system!~%"
 msgstr "Si vous ne le faites pas, votre système pourrait être amené à une version inférieure !~%"
 
-#: guix/scripts/system.scm:613
+#: guix/scripts/system.scm:661
 #, scheme-format
 msgid "initializing operating system under '~a'...~%"
 msgstr "initialisation du système d'exploitation sous « ~a »...~%"
 
-#: guix/scripts/system.scm:652
+#: guix/scripts/system.scm:700
 msgid ""
-"Usage: guix system [OPTION] ACTION [FILE]\n"
+"Usage: guix system [OPTION ...] ACTION [ARG ...] [FILE]\n"
 "Build the operating system declared in FILE according to ACTION.\n"
+"Some ACTIONS support additional ARGS.\n"
 msgstr ""
-"Usage: guix system [OPTION] ACTION [FICHIER]\n"
+"Usage: guix system [OPTION ...] ACTION [ARG ...] [FICHIER]\n"
 "Compiler le système d'exploitation déclaré dans FICHER en suivant ACTION.\n"
+"Certaines ACTIONS supportent des ARGUMENTS supplémentaires.\n"
 
-#: guix/scripts/system.scm:655 guix/scripts/container.scm:28
+#: guix/scripts/system.scm:704 guix/scripts/container.scm:28
 msgid "The valid values for ACTION are:\n"
 msgstr "Les valeurs possibles pour ACTION sont:\n"
 
-#: guix/scripts/system.scm:657
+#: guix/scripts/system.scm:706
 msgid "   reconfigure      switch to a new operating system configuration\n"
 msgstr "   reconfigure      basculer vers une nouvelle configuration du système d'exploitation\n"
 
-#: guix/scripts/system.scm:659
+#: guix/scripts/system.scm:708
+msgid "   roll-back        switch to the previous operating system configuration\n"
+msgstr "   roll-back        basculer vers la configuration du système d'exploitation précédente\n"
+
+#: guix/scripts/system.scm:710
+msgid "   switch-generation switch to an existing operating system configuration\n"
+msgstr "   switch-generation basculer vers une configuration du système d'exploitation existante\n"
+
+#: guix/scripts/system.scm:712
 msgid "   list-generations list the system generations\n"
 msgstr "   list-generations lister les générations du système\n"
 
-#: guix/scripts/system.scm:661
+#: guix/scripts/system.scm:714
 msgid "   build            build the operating system without installing anything\n"
 msgstr "   build            compiler le système d'exploitation sans rien installer\n"
 
-#: guix/scripts/system.scm:663
+#: guix/scripts/system.scm:716
 msgid "   container        build a container that shares the host's store\n"
 msgstr "   container        compiler un conteneur qui partage le stockage de l'hôte\n"
 
-#: guix/scripts/system.scm:665
+#: guix/scripts/system.scm:718
 msgid "   vm               build a virtual machine image that shares the host's store\n"
 msgstr "   vm               compiler une machine virtuelle partageant le dépôt de l'hôte\n"
 
-#: guix/scripts/system.scm:667
+#: guix/scripts/system.scm:720
 msgid "   vm-image         build a freestanding virtual machine image\n"
 msgstr "   vm-image         compiler une image autonome de machine virtuelle\n"
 
-#: guix/scripts/system.scm:669
+#: guix/scripts/system.scm:722
 msgid "   disk-image       build a disk image, suitable for a USB stick\n"
 msgstr "   disk-image       compiler une image disque adaptée pour une clé USB\n"
 
-#: guix/scripts/system.scm:671
+#: guix/scripts/system.scm:724
 msgid "   init             initialize a root file system to run GNU\n"
 msgstr "   init             initialiser un système de fichier racine pour lancer GNU.\n"
 
-#: guix/scripts/system.scm:673
+#: guix/scripts/system.scm:726
 msgid "   extension-graph  emit the service extension graph in Dot format\n"
 msgstr "   extension-graph  produire le graphique d'extension de service au format Dot\n"
 
-#: guix/scripts/system.scm:675
+#: guix/scripts/system.scm:728
 msgid "   shepherd-graph   emit the graph of shepherd services in Dot format\n"
 msgstr "   shepherd-graph   produire le graphique des services de shepherd au format Dot\n"
 
-#: guix/scripts/system.scm:679
+#: guix/scripts/system.scm:732
 msgid ""
 "\n"
 "  -d, --derivation       return the derivation of the given system"
@@ -1475,7 +1548,7 @@ msgstr ""
 "\n"
 "  -d, --derivation       retourner les dérivations pour le système donné"
 
-#: guix/scripts/system.scm:681
+#: guix/scripts/system.scm:734
 msgid ""
 "\n"
 "      --on-error=STRATEGY\n"
@@ -1485,7 +1558,7 @@ msgstr ""
 "      --on-error=STRATÉGIE\n"
 "                         appliquer la STRATÉGIE quand une erreur survient en lisant le FICHIER"
 
-#: guix/scripts/system.scm:684
+#: guix/scripts/system.scm:737
 msgid ""
 "\n"
 "      --image-size=SIZE  for 'vm-image', produce an image of SIZE"
@@ -1494,7 +1567,7 @@ msgstr ""
 "      --image-size=TAILLE\n"
 "                         pour « vm-image », produire une image de TAILLE"
 
-#: guix/scripts/system.scm:686
+#: guix/scripts/system.scm:739
 msgid ""
 "\n"
 "      --no-grub          for 'init', do not install GRUB"
@@ -1502,7 +1575,7 @@ msgstr ""
 "\n"
 "      --no-grub          pour « init », ne pas installer GRUB"
 
-#: guix/scripts/system.scm:688
+#: guix/scripts/system.scm:741
 msgid ""
 "\n"
 "      --share=SPEC       for 'vm', share host file system according to SPEC"
@@ -1511,7 +1584,7 @@ msgstr ""
 "      --share=SPEC       pour « vm », partager le système de fichiers hôte selon\n"
 "                         SPEC"
 
-#: guix/scripts/system.scm:690
+#: guix/scripts/system.scm:743
 msgid ""
 "\n"
 "      --expose=SPEC      for 'vm', expose host file system according to SPEC"
@@ -1520,7 +1593,7 @@ msgstr ""
 "      --expose=SPEC      pour « vm », exposer le système de fichiers hôte selon\n"
 "                         SPEC"
 
-#: guix/scripts/system.scm:692
+#: guix/scripts/system.scm:745
 msgid ""
 "\n"
 "      --full-boot        for 'vm', make a full boot sequence"
@@ -1528,49 +1601,64 @@ msgstr ""
 "\n"
 "      --full-boot        pour « vm », accomplir une séquence complète de démarrage"
 
-#: guix/scripts/system.scm:777
+#: guix/scripts/system.scm:830
 #, scheme-format
 msgid "no configuration file specified~%"
 msgstr "aucun fichier de configuration spécifié~%"
 
-#: guix/scripts/system.scm:840
+#: guix/scripts/system.scm:912
 #, scheme-format
 msgid "~a: unknown action~%"
 msgstr "~a: action inconnue~%"
 
-#: guix/scripts/system.scm:855
+#: guix/scripts/system.scm:927
 #, scheme-format
 msgid "wrong number of arguments for action '~a'~%"
 msgstr "nombre d'arguments incorrect pour l'action « ~a »~%"
 
-#: guix/scripts/system.scm:860
+#: guix/scripts/system.scm:932
 #, scheme-format
 msgid "guix system: missing command name~%"
 msgstr "système guix: nom de commande manquant~%"
 
-#: guix/scripts/system.scm:862
+#: guix/scripts/system.scm:934
 #, scheme-format
 msgid "Try 'guix system --help' for more information.~%"
 msgstr "Essayez « guix system --help » pour plus d'informations.~%"
 
-#: guix/scripts/lint.scm:130
+#: guix/scripts/lint.scm:133
 #, scheme-format
 msgid "Available checkers:~%"
 msgstr "Vérificateurs disponibles:~%"
 
-#: guix/scripts/lint.scm:150
+#: guix/scripts/lint.scm:157
 msgid "description should not be empty"
 msgstr "la description ne devrait pas être vide"
 
-#: guix/scripts/lint.scm:160
+#: guix/scripts/lint.scm:167
 msgid "Texinfo markup in description is invalid"
 msgstr "l'utilisation de balises Texinfo dans la description est invalide"
 
-#: guix/scripts/lint.scm:168
+#: guix/scripts/lint.scm:177
+#, scheme-format
+msgid ""
+"description should not contain ~\n"
+"trademark sign '~a' at ~d"
+msgstr ""
+"la description ne devrait pas contenir ~\n"
+"le signe de marque déposée « ~a » à ~d"
+
+#. TRANSLATORS: '@code' is Texinfo markup and must be kept
+#. as is.
+#: guix/scripts/lint.scm:190
+msgid "use @code or similar ornament instead of quotes"
+msgstr "utiliser @code ou une décoration similaire au lieu des guillemets"
+
+#: guix/scripts/lint.scm:197
 msgid "description should start with an upper-case letter or digit"
 msgstr "La description devrait commencer par une majuscule ou un chiffre"
 
-#: guix/scripts/lint.scm:184
+#: guix/scripts/lint.scm:213
 #, scheme-format
 msgid ""
 "sentences in description should be followed ~\n"
@@ -1579,201 +1667,225 @@ msgstr ""
 "les phrases dans la description devraient être suivies ~\n"
 "par deux espaces. Infraction probable~p à ~{~a~^, ~}"
 
-#: guix/scripts/lint.scm:200
+#: guix/scripts/lint.scm:231
 #, scheme-format
 msgid "invalid description: ~s"
 msgstr "description invalide: ~s"
 
-#: guix/scripts/lint.scm:220
+#: guix/scripts/lint.scm:256
 #, scheme-format
 msgid "'~a' should probably be a native input"
 msgstr "« ~a » devrait sans doute être une entrée native"
 
-#: guix/scripts/lint.scm:238
+#: guix/scripts/lint.scm:280
+#, scheme-format
+msgid "'~a' should probably not be an input at all"
+msgstr "« ~a » ne devrait probablement pas être une entrée du tout"
+
+#: guix/scripts/lint.scm:306
 msgid "synopsis should not be empty"
 msgstr "le synopsis ne devrait pas être vide"
 
-#: guix/scripts/lint.scm:246
+#: guix/scripts/lint.scm:314
 msgid "no period allowed at the end of the synopsis"
 msgstr "un point n'est pas autorisé à la fin du synopsis"
 
-#: guix/scripts/lint.scm:258
+#: guix/scripts/lint.scm:326
 msgid "no article allowed at the beginning of the synopsis"
 msgstr "les articles ne sont pas permis au début du synopsis"
 
-#: guix/scripts/lint.scm:265
+#: guix/scripts/lint.scm:333
 msgid "synopsis should be less than 80 characters long"
 msgstr "le synopsis devrait être plus court que 80 caractères"
 
-#: guix/scripts/lint.scm:271
+#: guix/scripts/lint.scm:339
 msgid "synopsis should start with an upper-case letter or digit"
 msgstr "le synopsis devrait commencer par une majuscule ou un chiffre"
 
-#: guix/scripts/lint.scm:278
+#: guix/scripts/lint.scm:346
 msgid "synopsis should not start with the package name"
 msgstr "le synopsis ne devrait pas commencer par un nom de paquet"
 
-#: guix/scripts/lint.scm:292
+#: guix/scripts/lint.scm:360
 #, scheme-format
 msgid "invalid synopsis: ~s"
 msgstr "synopsis non valide: ~s"
 
-#: guix/scripts/lint.scm:383
+#: guix/scripts/lint.scm:459
 #, scheme-format
 msgid "URI ~a returned suspiciously small file (~a bytes)"
 msgstr "l'URI ~a a renvoyé un fichier étrangement petit (~a octets)"
 
-#: guix/scripts/lint.scm:392 guix/scripts/lint.scm:404
+#: guix/scripts/lint.scm:468 guix/scripts/lint.scm:480
 #, scheme-format
 msgid "URI ~a not reachable: ~a (~s)"
 msgstr "l'URI ~a n'a pu être atteinte: ~a (~s)"
 
-#: guix/scripts/lint.scm:411
+#: guix/scripts/lint.scm:487
 #, scheme-format
 msgid "URI ~a domain not found: ~a"
 msgstr "le domaine de l'URI ~a pas trouvé: ~a"
 
-#: guix/scripts/lint.scm:419
+#: guix/scripts/lint.scm:495
 #, scheme-format
 msgid "URI ~a unreachable: ~a"
 msgstr "l'URI ~a n'a pu être atteinte: ~a"
 
-#: guix/scripts/lint.scm:445
+#: guix/scripts/lint.scm:504 guix/scripts/lint.scm:761
+#, scheme-format
+msgid "TLS certificate error: ~a"
+msgstr "erreur de certificat TLS: ~a"
+
+#: guix/scripts/lint.scm:525
 msgid "invalid value for home page"
 msgstr "valeur invalide pour la page d'accueil"
 
-#: guix/scripts/lint.scm:448
+#: guix/scripts/lint.scm:528
 #, scheme-format
 msgid "invalid home page URL: ~s"
 msgstr "URL de la page d'accueil invalide: ~s"
 
-#: guix/scripts/lint.scm:468
+#: guix/scripts/lint.scm:548
 msgid "file names of patches should start with the package name"
 msgstr "les noms de fichiers des correctifs devraient commencer par le nom du paquet"
 
-#: guix/scripts/lint.scm:507
+#: guix/scripts/lint.scm:587
 #, scheme-format
 msgid "~a: ~a: proposed synopsis: ~s~%"
 msgstr "~a: ~a: synopsis proposé: ~s~%"
 
-#: guix/scripts/lint.scm:520
+#: guix/scripts/lint.scm:600
 #, scheme-format
 msgid "~a: ~a: proposed description:~%     \"~a\"~%"
 msgstr "~a: ~a: description proposée:~%     « ~a »~%"
 
-#: guix/scripts/lint.scm:557
+#: guix/scripts/lint.scm:642
 msgid "all the source URIs are unreachable:"
 msgstr "toutes les URI sources sont inatteignables:"
 
-#: guix/scripts/lint.scm:580
+#: guix/scripts/lint.scm:665
 msgid "the source file name should contain the package name"
 msgstr "le nom du fichier source devrait contenir le nom du paquet"
 
-#: guix/scripts/lint.scm:589 guix/scripts/lint.scm:593
+#: guix/scripts/lint.scm:681
+#, scheme-format
+msgid "URL should be 'mirror://~a/~a'"
+msgstr "l'URL devrait être « mirror://~a/~a »"
+
+#: guix/scripts/lint.scm:699 guix/scripts/lint.scm:703
 #, scheme-format
 msgid "failed to create derivation: ~a"
 msgstr "échec à la création de la dérivation: ~a"
 
-#: guix/scripts/lint.scm:607
+#: guix/scripts/lint.scm:717
 #, scheme-format
 msgid "failed to create derivation: ~s~%"
 msgstr "échec à la création de la dérivation: ~s~%"
 
-#: guix/scripts/lint.scm:617
+#: guix/scripts/lint.scm:727
 msgid "invalid license field"
 msgstr "champ de licence invalide"
 
-#: guix/scripts/lint.scm:634
+#: guix/scripts/lint.scm:744
 #, scheme-format
 msgid "failed to retrieve CVE vulnerabilities from ~s: ~a (~s)~%"
 msgstr "échec de récupération des vulnérabilités CVE depuis ~s: ~a (~s)~%"
 
-#: guix/scripts/lint.scm:639 guix/scripts/lint.scm:647
+#: guix/scripts/lint.scm:749 guix/scripts/lint.scm:758
+#: guix/scripts/lint.scm:763
 #, scheme-format
 msgid "assuming no CVE vulnerabilities~%"
 msgstr "on suppose qu'il n'y a pas de vulnérabilités CVE~%"
 
-#: guix/scripts/lint.scm:645
+#: guix/scripts/lint.scm:756
 #, scheme-format
 msgid "failed to lookup NIST host: ~a~%"
 msgstr "impossible de trouver l'hôte NIST: ~a~%"
 
-#: guix/scripts/lint.scm:683
+#: guix/scripts/lint.scm:801
 #, scheme-format
 msgid "probably vulnerable to ~a"
 msgstr "probablement vulnérable à ~a"
 
-#: guix/scripts/lint.scm:698
+#: guix/scripts/lint.scm:816
 #, scheme-format
 msgid "tabulation on line ~a, column ~a"
 msgstr "tabulation à la ligne ~a, colonne ~a"
 
-#: guix/scripts/lint.scm:707
+#: guix/scripts/lint.scm:825
 #, scheme-format
 msgid "trailing white space on line ~a"
 msgstr "espace à la fin de la ligne ~a"
 
-#: guix/scripts/lint.scm:717
+#: guix/scripts/lint.scm:835
 #, scheme-format
 msgid "line ~a is way too long (~a characters)"
 msgstr "la ligne ~a est beaucoup trop longue (~a caractères)"
 
-#: guix/scripts/lint.scm:728
+#: guix/scripts/lint.scm:846
 #, scheme-format
 msgid "line ~a: parentheses feel lonely, move to the previous or next line"
 msgstr "ligne ~a: des parenthèses se sentent seules. À déplacer à la ligne suivante ou précédente"
 
-#: guix/scripts/lint.scm:783
+#: guix/scripts/lint.scm:901
 msgid "Validate package descriptions"
 msgstr "Valider des descriptions de paquets"
 
-#: guix/scripts/lint.scm:787
+#: guix/scripts/lint.scm:905
 msgid "Validate synopsis & description of GNU packages"
 msgstr "Valider le synopsis et la description de paquets GNU"
 
-#: guix/scripts/lint.scm:791
+#: guix/scripts/lint.scm:909
 msgid "Identify inputs that should be native inputs"
 msgstr "Identifier les entrées qui devraient être natives"
 
-#: guix/scripts/lint.scm:795
+#: guix/scripts/lint.scm:913
+msgid "Identify inputs that should be inputs at all"
+msgstr "Identifier les entrées qui devraient être des entrées"
+
+#: guix/scripts/lint.scm:917
 msgid "Validate file names and availability of patches"
 msgstr "Valider les noms de fichiers et la disponibilité de correctifs"
 
-#: guix/scripts/lint.scm:799
+#: guix/scripts/lint.scm:921
 msgid "Validate home-page URLs"
 msgstr "Valider les URL des pages d'accueil"
 
 #. TRANSLATORS: <license> is the name of a data type and must not be
 #. translated.
-#: guix/scripts/lint.scm:805
+#: guix/scripts/lint.scm:927
 msgid "Make sure the 'license' field is a <license> or a list thereof"
 msgstr "Assurez vous que le champ « licence » est une <licence> ou une telle liste"
 
-#: guix/scripts/lint.scm:810
+#: guix/scripts/lint.scm:932
 msgid "Validate source URLs"
 msgstr "Valider les URL sources"
 
-#: guix/scripts/lint.scm:814
+#: guix/scripts/lint.scm:936
+msgid "Suggest 'mirror://' URLs"
+msgstr "Suggérer les URLs « mirror:// »"
+
+#: guix/scripts/lint.scm:940
 msgid "Validate file names of sources"
 msgstr "Valider les noms des fichiers des sources"
 
-#: guix/scripts/lint.scm:818
+#: guix/scripts/lint.scm:944
 msgid "Report failure to compile a package to a derivation"
 msgstr "Signaler l'échec de la compilation d'un paquet d'une dérivation"
 
-#: guix/scripts/lint.scm:822
+#: guix/scripts/lint.scm:948
 msgid "Validate package synopses"
 msgstr "Valider les synopsis des paquets"
 
-#: guix/scripts/lint.scm:826
+#: guix/scripts/lint.scm:952
 msgid "Check the Common Vulnerabilities and Exposures (CVE) database"
 msgstr "Vérifier la base de données des vulnérabilités et failles connues (CVE)"
 
-#: guix/scripts/lint.scm:831
+#: guix/scripts/lint.scm:957
 msgid "Look for formatting issues in the source"
 msgstr "Rechercher des problèmes de format dans la source"
 
-#: guix/scripts/lint.scm:859
+#: guix/scripts/lint.scm:985
 msgid ""
 "Usage: guix lint [OPTION]... [PACKAGE]...\n"
 "Run a set of checkers on the specified package; if none is specified,\n"
@@ -1783,7 +1895,7 @@ msgstr ""
 "Lancer un ensemble de vérificateurs sur le paquet spécifié; si aucun n'est spécifié,\n"
 "lancer les vérificateurs sur tous les paquets.\n"
 
-#: guix/scripts/lint.scm:862
+#: guix/scripts/lint.scm:988
 msgid ""
 "\n"
 "  -c, --checkers=CHECKER1,CHECKER2...\n"
@@ -1793,7 +1905,7 @@ msgstr ""
 "  -c, --checkers=CHECKER1,CHECKER2...\n"
 "                         lancer uniquement les vérificateurs spécifiés"
 
-#: guix/scripts/lint.scm:867
+#: guix/scripts/lint.scm:993
 msgid ""
 "\n"
 "  -l, --list-checkers    display the list of available lint checkers"
@@ -1801,12 +1913,12 @@ msgstr ""
 "\n"
 "  -l, --list-checkers    afficher la liste des vérificateurs disponibles"
 
-#: guix/scripts/lint.scm:887
+#: guix/scripts/lint.scm:1013
 #, scheme-format
 msgid "~a: invalid checker~%"
 msgstr "~a: vérificateur non valide~%"
 
-#: guix/scripts/publish.scm:57
+#: guix/scripts/publish.scm:58
 #, scheme-format
 msgid ""
 "Usage: guix publish [OPTION]...\n"
@@ -1815,7 +1927,7 @@ msgstr ""
 "Usage: guix publish [OPTION]...\n"
 "Diffuser ~a via HTTP.\n"
 
-#: guix/scripts/publish.scm:59
+#: guix/scripts/publish.scm:60
 msgid ""
 "\n"
 "  -p, --port=PORT        listen on PORT"
@@ -1823,7 +1935,7 @@ msgstr ""
 "\n"
 "  -p, --port=PORT        écouter sur le PORT"
 
-#: guix/scripts/publish.scm:61
+#: guix/scripts/publish.scm:62
 msgid ""
 "\n"
 "      --listen=HOST      listen on the network interface for HOST"
@@ -1831,7 +1943,7 @@ msgstr ""
 "\n"
 "      --listen=HÔTE      écouter sur l'interface réseau HÔTE"
 
-#: guix/scripts/publish.scm:63
+#: guix/scripts/publish.scm:64
 msgid ""
 "\n"
 "  -u, --user=USER        change privileges to USER as soon as possible"
@@ -1841,7 +1953,7 @@ msgstr ""
 "                         changer les privilèges de UTILISATEUR aussi vite\n"
 "                         que possible"
 
-#: guix/scripts/publish.scm:65
+#: guix/scripts/publish.scm:66
 msgid ""
 "\n"
 "  -C, --compression[=LEVEL]\n"
@@ -1851,7 +1963,7 @@ msgstr ""
 "  -C, --compression[=NIVEAU]\n"
 "                         compresser les archives au NIVEAU"
 
-#: guix/scripts/publish.scm:68
+#: guix/scripts/publish.scm:69
 msgid ""
 "\n"
 "      --ttl=TTL          announce narinfos can be cached for TTL seconds"
@@ -1860,7 +1972,7 @@ msgstr ""
 "      --ttl=TTL          les annonces narinfos peuvent être mises en cache\n"
 "                         pendant TTL secondes"
 
-#: guix/scripts/publish.scm:70
+#: guix/scripts/publish.scm:71
 msgid ""
 "\n"
 "  -r, --repl[=PORT]      spawn REPL server on PORT"
@@ -1868,37 +1980,37 @@ msgstr ""
 "\n"
 "  -r, --repl[=PORT]      créer le serveur REPL sur le PORT"
 
-#: guix/scripts/publish.scm:86
+#: guix/scripts/publish.scm:87
 #, scheme-format
 msgid "lookup of host '~a' failed: ~a~%"
 msgstr "la recherche de l'hôte « ~a » a échoué: ~a~%"
 
-#: guix/scripts/publish.scm:124
+#: guix/scripts/publish.scm:125
 #, scheme-format
 msgid "lookup of host '~a' returned nothing"
 msgstr "la recherche de l'hôte « ~a » n'a rien retourné"
 
-#: guix/scripts/publish.scm:137
+#: guix/scripts/publish.scm:138
 #, scheme-format
 msgid "zlib support is missing; compression disabled~%"
 msgstr "le support zlib est manquant. La compression est désactivée~%"
 
-#: guix/scripts/publish.scm:144
+#: guix/scripts/publish.scm:145
 #, scheme-format
 msgid "~a: invalid duration~%"
 msgstr "~a: durée non valide~%"
 
-#: guix/scripts/publish.scm:537
+#: guix/scripts/publish.scm:544
 #, scheme-format
 msgid "user '~a' not found: ~a~%"
 msgstr "utilisateur « ~a » pas trouvé: ~a~%"
 
-#: guix/scripts/publish.scm:574
+#: guix/scripts/publish.scm:581
 #, scheme-format
 msgid "server running as root; consider using the '--user' option!~%"
 msgstr "le serveur tourne en tant que root. Envisagez d'utiliser l'option « --user » !~%"
 
-#: guix/scripts/publish.scm:576
+#: guix/scripts/publish.scm:583
 #, scheme-format
 msgid "publishing ~a on ~a, port ~d~%"
 msgstr "diffusion de ~a sur ~a, port ~d~%"
@@ -1916,34 +2028,34 @@ msgstr ""
 msgid "file '~a' not found in search path ~s~%"
 msgstr "fichier « ~a » pas trouvé dans le chemin de recherche ~s~%"
 
-#: guix/scripts/edit.scm:83
+#: guix/scripts/edit.scm:90
 #, scheme-format
 msgid "source location of package '~a' is unknown~%"
 msgstr "l'emplacement source du paquet « ~a » est inconnue~%"
 
-#: guix/scripts/edit.scm:96
+#: guix/scripts/edit.scm:103
 #, scheme-format
 msgid "failed to launch '~a': ~a~%"
 msgstr "impossible de démarrer « ~a »: ~a~%"
 
-#: guix/scripts/size.scm:76
+#: guix/scripts/size.scm:77
 #, scheme-format
 msgid "no available substitute information for '~a'~%"
 msgstr "pas d'information de substitution disponible pour « ~a »~%"
 
-#: guix/scripts/size.scm:84
+#: guix/scripts/size.scm:85
 msgid "store item"
 msgstr "élément stockage"
 
-#: guix/scripts/size.scm:84
+#: guix/scripts/size.scm:85
 msgid "total"
 msgstr "total"
 
-#: guix/scripts/size.scm:84
+#: guix/scripts/size.scm:85
 msgid "self"
 msgstr "lui-même"
 
-#: guix/scripts/size.scm:95
+#: guix/scripts/size.scm:96
 #, scheme-format
 msgid "total: ~,1f MiB~%"
 msgstr "total: ~,1f MiB~%"
@@ -1951,11 +2063,11 @@ msgstr "total: ~,1f MiB~%"
 #. TRANSLATORS: This is the title of a graph, meaning that the graph
 #. represents a profile of the store (the "store" being the place where
 #. packages are stored.)
-#: guix/scripts/size.scm:206
+#: guix/scripts/size.scm:209
 msgid "store profile"
 msgstr "profil stockage"
 
-#: guix/scripts/size.scm:215
+#: guix/scripts/size.scm:218
 msgid ""
 "Usage: guix size [OPTION]... PACKAGE\n"
 "Report the size of PACKAGE and its dependencies.\n"
@@ -1963,7 +2075,7 @@ msgstr ""
 "Usage: guix size [OPTION]... PAQUET\n"
 "Rapporter la taille du PAQUET et de ses dépendances.\n"
 
-#: guix/scripts/size.scm:220
+#: guix/scripts/size.scm:223
 msgid ""
 "\n"
 "  -s, --system=SYSTEM    consider packages for SYSTEM--e.g., \"i686-linux\""
@@ -1971,7 +2083,7 @@ msgstr ""
 "\n"
 "  -s, --system=SYSTÈME   prend en compte les paquets pour le SYSTÈME, par exemple « i686-linux »"
 
-#: guix/scripts/size.scm:222
+#: guix/scripts/size.scm:225
 msgid ""
 "\n"
 "  -m, --map-file=FILE    write to FILE a graphical map of disk usage"
@@ -1979,64 +2091,77 @@ msgstr ""
 "\n"
 "  -m, --map-file=FICHIER écrit dans le FICHIER une carte graphique de l'utilisation du disque"
 
-#: guix/scripts/size.scm:276
+#: guix/scripts/size.scm:279
 msgid "missing store item argument\n"
 msgstr "argument d'élément de stockage manquant\n"
 
-#: guix/scripts/graph.scm:82
+#: guix/scripts/graph.scm:83
 #, scheme-format
 msgid "~a: invalid argument (package name expected)"
 msgstr "~a: argument invalide (nom de paquet attendu)"
 
-#: guix/scripts/graph.scm:93
+#: guix/scripts/graph.scm:94
 msgid "the DAG of packages, excluding implicit inputs"
 msgstr "le DAG des paquets en excluant les entrées implicites"
 
-#: guix/scripts/graph.scm:150
+#: guix/scripts/graph.scm:151
 msgid "the DAG of packages, including implicit inputs"
 msgstr "le DAG des paquets en incluant les entrées implicites"
 
-#: guix/scripts/graph.scm:160
+#: guix/scripts/graph.scm:161
 msgid "the DAG of packages and origins, including implicit inputs"
 msgstr "le DAG des paquets et origines en incluant les entrées implicites"
 
-#: guix/scripts/graph.scm:191
+#: guix/scripts/graph.scm:192
 msgid "same as 'bag', but without the bootstrap nodes"
 msgstr "comme « bag » mais sans les nœuds d'amorçage"
 
-#: guix/scripts/graph.scm:237
+#: guix/scripts/graph.scm:238
 msgid "the DAG of derivations"
 msgstr "le DAG des dérivations"
 
-#: guix/scripts/graph.scm:249
+#: guix/scripts/graph.scm:250
 msgid "unsupported argument for derivation graph"
 msgstr "argument non supporté pour le graphe de dérivation"
 
-#: guix/scripts/graph.scm:270
+#: guix/scripts/graph.scm:276
+msgid "unsupported argument for this type of graph"
+msgstr "argument non supporté pour ce type de graphe"
+
+#: guix/scripts/graph.scm:289
 #, scheme-format
 msgid "references for '~a' are not known~%"
 msgstr "les références pour « ~a » sont inconnues~%"
 
-#: guix/scripts/graph.scm:277
+#: guix/scripts/graph.scm:296
 msgid "the DAG of run-time dependencies (store references)"
 msgstr "le DAG des dépendances à l'exécution (stockage des références)"
 
-#: guix/scripts/graph.scm:290
-msgid "unsupported argument for reference graph"
-msgstr "argument non supporté pour le graphe de référence"
+#: guix/scripts/graph.scm:312
+msgid "the DAG of referrers in the store"
+msgstr "le graphe orienté acyclique (DAG) des référents dans le stockage"
 
-#: guix/scripts/graph.scm:315
+#: guix/scripts/graph.scm:338
 #, scheme-format
 msgid "~a: unknown node type~%"
 msgstr "~a: type de nœud inconnu~%"
 
-#: guix/scripts/graph.scm:319
+#: guix/scripts/graph.scm:345
+#, scheme-format
+msgid "~a: unknown backend~%"
+msgstr "~a: moteur de graphe inconnu~%"
+
+#: guix/scripts/graph.scm:349
 msgid "The available node types are:\n"
 msgstr "Les types de nœuds disponibles sont:\n"
 
+#: guix/scripts/graph.scm:359
+msgid "The available backend types are:\n"
+msgstr "Les types de moteurs de graphes disponibles sont:\n"
+
 #. TRANSLATORS: Here 'dot' is the name of a program; it must not be
 #. translated.
-#: guix/scripts/graph.scm:355
+#: guix/scripts/graph.scm:403
 msgid ""
 "Usage: guix graph PACKAGE...\n"
 "Emit a Graphviz (dot) representation of the dependencies of PACKAGE...\n"
@@ -2044,7 +2169,23 @@ msgstr ""
 "Usage: guix graph PAQUET...\n"
 "Produit une représentation Graphviz (dot) des dépendances de PAQUET...\n"
 
-#: guix/scripts/graph.scm:357
+#: guix/scripts/graph.scm:405
+msgid ""
+"\n"
+"  -b, --backend=TYPE     produce a graph with the given backend TYPE"
+msgstr ""
+"\n"
+"  -t, --backend=TYPE     produire un graphe avec le TYPE de moteur donné"
+
+#: guix/scripts/graph.scm:407
+msgid ""
+"\n"
+"      --list-backends    list the available graph backends"
+msgstr ""
+"\n"
+"      --list-backends    lister les types de moteurs de graphes disponibles"
+
+#: guix/scripts/graph.scm:409
 msgid ""
 "\n"
 "  -t, --type=TYPE        represent nodes of the given TYPE"
@@ -2052,7 +2193,7 @@ msgstr ""
 "\n"
 "  -t, --type=TYPE        représenter les nœuds du TYPE donné"
 
-#: guix/scripts/graph.scm:359
+#: guix/scripts/graph.scm:411
 msgid ""
 "\n"
 "      --list-types       list the available graph types"
@@ -2060,7 +2201,7 @@ msgstr ""
 "\n"
 "      --list-types       lister les types de graphes disponibles"
 
-#: guix/scripts/graph.scm:361
+#: guix/scripts/graph.scm:413
 msgid ""
 "\n"
 "  -e, --expression=EXPR  consider the package EXPR evaluates to"
@@ -2121,18 +2262,26 @@ msgstr ""
 "      --substitute-urls=URLS\n"
 "                         comparer les résultats de compilation avec ceux aux URLS"
 
-#: guix/gnu-maintenance.scm:532
+#: guix/gnu-maintenance.scm:555
 msgid "Updater for GNU packages"
 msgstr "Logiciel de mise à jour des paquets GNU"
 
-#: guix/gnu-maintenance.scm:539
+#: guix/gnu-maintenance.scm:562
 msgid "Updater for GNOME packages"
 msgstr "Logiciel de mise à jour des paquets GNOME"
 
-#: guix/gnu-maintenance.scm:546
+#: guix/gnu-maintenance.scm:569
+msgid "Updater for KDE packages"
+msgstr "Logiciel de mise à jour des paquets KDE"
+
+#: guix/gnu-maintenance.scm:576
 msgid "Updater for X.org packages"
 msgstr "Logiciel de mise à jour des paquets X.org"
 
+#: guix/gnu-maintenance.scm:583
+msgid "Updater for packages hosted on kernel.org"
+msgstr "Logiciel de mise à jour des paquets hébergés sur kernel.org"
+
 #: guix/scripts/container.scm:25
 msgid ""
 "Usage: guix container ACTION ARGS...\n"
@@ -2188,70 +2337,70 @@ msgstr "aucun processus ~d~%"
 msgid "exec failed with status ~d~%"
 msgstr "exec a échoué avec le statut ~d~%"
 
-#: guix/upstream.scm:157
+#: guix/upstream.scm:212
 #, scheme-format
 msgid "signature verification failed for `~a'~%"
 msgstr "la vérification de la signature a échoué pour « ~a »~%"
 
-#: guix/upstream.scm:159
+#: guix/upstream.scm:214
 #, scheme-format
 msgid "(could be because the public key is not in your keyring)~%"
 msgstr "(il est possible que la clé publique ne soit pas dans dans votre trousseau)~%"
 
-#: guix/upstream.scm:191
+#: guix/upstream.scm:246
 msgid "gz"
 msgstr "gz"
 
-#: guix/upstream.scm:234
+#: guix/upstream.scm:293
 #, scheme-format
 msgid "~a: could not locate source file"
 msgstr "~a: le fichier source est introuvable"
 
-#: guix/upstream.scm:239
+#: guix/upstream.scm:298
 #, scheme-format
 msgid "~a: ~a: no `version' field in source; skipping~%"
 msgstr "~a: ~a: aucun champ « version » dans la source; ignoré~%"
 
-#: guix/ui.scm:238
+#: guix/ui.scm:239
 msgid "entering debugger; type ',bt' for a backtrace\n"
 msgstr "entrée dans le débogueur; tapez « ,bt » pour la trace inverse\n"
 
-#: guix/ui.scm:254 guix/ui.scm:271
+#: guix/ui.scm:255 guix/ui.scm:272
 #, scheme-format
 msgid "failed to load '~a': ~a~%"
 msgstr "impossible de charger « ~a »: ~a~%"
 
-#: guix/ui.scm:257
+#: guix/ui.scm:258
 #, scheme-format
 msgid "~a: error: ~a~%"
 msgstr "~a: erreur: ~a~%"
 
-#: guix/ui.scm:260 guix/ui.scm:529
+#: guix/ui.scm:261 guix/ui.scm:530
 #, scheme-format
 msgid "exception thrown: ~s~%"
 msgstr "exception générée: ~s~%"
 
-#: guix/ui.scm:262 guix/ui.scm:280
+#: guix/ui.scm:263 guix/ui.scm:281
 #, scheme-format
 msgid "failed to load '~a':~%"
 msgstr "échec lors du chargement de « ~a »:~%"
 
-#: guix/ui.scm:274
+#: guix/ui.scm:275
 #, scheme-format
 msgid "~a: warning: ~a~%"
 msgstr "~a: avertissement: ~a~%"
 
-#: guix/ui.scm:277
+#: guix/ui.scm:278
 #, scheme-format
 msgid "failed to load '~a': exception thrown: ~s~%"
 msgstr "échec lors du chargement de « ~a »: exception générée: ~s~%"
 
-#: guix/ui.scm:289
+#: guix/ui.scm:290
 #, scheme-format
 msgid "failed to install locale: ~a~%"
 msgstr "impossible d'installer l'environnement linguistique: ~a~%"
 
-#: guix/ui.scm:308
+#: guix/ui.scm:309
 msgid ""
 "Copyright (C) 2016 the Guix authors\n"
 "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\n"
@@ -2267,7 +2416,7 @@ msgstr ""
 #. package.  Please add another line saying "Report translation bugs to
 #. ...\n" with the address for translation bugs (typically your translation
 #. team's web or email address).
-#: guix/ui.scm:320
+#: guix/ui.scm:321
 #, scheme-format
 msgid ""
 "\n"
@@ -2277,7 +2426,7 @@ msgstr ""
 "Signalez toute anomalie à : ~a.\n"
 "Signalez toute erreur de traduction à : traduc@traduc.org"
 
-#: guix/ui.scm:322
+#: guix/ui.scm:323
 #, scheme-format
 msgid ""
 "\n"
@@ -2286,7 +2435,7 @@ msgstr ""
 "\n"
 "~a page d'accueil: <~a>"
 
-#: guix/ui.scm:324
+#: guix/ui.scm:325
 msgid ""
 "\n"
 "General help using GNU software: <http://www.gnu.org/gethelp/>"
@@ -2294,199 +2443,199 @@ msgstr ""
 "\n"
 "Aide générale sur l'utilisation des logiciels GNU: <http://www.gnu.org/gethelp/>"
 
-#: guix/ui.scm:369
+#: guix/ui.scm:370
 #, scheme-format
 msgid "'~a' is not a valid regular expression: ~a~%"
 msgstr "« ~a » n'est pas une expression rationnelle valide: ~a~%"
 
-#: guix/ui.scm:375
+#: guix/ui.scm:376
 #, scheme-format
 msgid "~a: invalid number~%"
 msgstr "~a: nombre non valide~%"
 
-#: guix/ui.scm:392
+#: guix/ui.scm:393
 #, scheme-format
 msgid "invalid number: ~a~%"
 msgstr "nombre non valide: ~a~%"
 
-#: guix/ui.scm:415
+#: guix/ui.scm:416
 #, scheme-format
 msgid "unknown unit: ~a~%"
 msgstr "unité inconnue: ~a~%"
 
-#: guix/ui.scm:432
+#: guix/ui.scm:433
 #, scheme-format
 msgid "~a:~a:~a: package `~a' has an invalid input: ~s~%"
 msgstr "~a:~a:~a: le paquet « ~a » a une entrée non valide: ~s~%"
 
-#: guix/ui.scm:439
+#: guix/ui.scm:440
 #, scheme-format
 msgid "~a: ~a: build system `~a' does not support cross builds~%"
 msgstr "~a: ~a: le système de compilation « ~a » ne supporte pas la compilation croisée~%"
 
-#: guix/ui.scm:444
+#: guix/ui.scm:445
 #, scheme-format
 msgid "profile '~a' does not exist~%"
 msgstr "le profile « ~a » n'existe pas~%"
 
-#: guix/ui.scm:447
+#: guix/ui.scm:448
 #, scheme-format
 msgid "generation ~a of profile '~a' does not exist~%"
 msgstr "la génération ~a du profile « ~a » n'existe pas~%"
 
-#: guix/ui.scm:454
+#: guix/ui.scm:455
 #, scheme-format
 msgid "corrupt input while restoring '~a' from ~s~%"
 msgstr "entrée corrompue en restaurant « ~a » depuis ~s~%"
 
-#: guix/ui.scm:456
+#: guix/ui.scm:457
 #, scheme-format
 msgid "corrupt input while restoring archive from ~s~%"
 msgstr "entrée corrompue en restaurant l'archive depuis ~s~%"
 
-#: guix/ui.scm:459
+#: guix/ui.scm:460
 #, scheme-format
 msgid "failed to connect to `~a': ~a~%"
 msgstr "impossible de se connecter à « ~a »: ~a~%"
 
-#: guix/ui.scm:464
+#: guix/ui.scm:465
 #, scheme-format
 msgid "build failed: ~a~%"
 msgstr "la compilation a échoué: ~a~%"
 
-#: guix/ui.scm:467
+#: guix/ui.scm:468
 #, scheme-format
 msgid "reference to invalid output '~a' of derivation '~a'~%"
 msgstr "référence à la sortie invalide « ~a » de la dérivation « ~a »~%"
 
-#: guix/ui.scm:471
+#: guix/ui.scm:472
 #, scheme-format
 msgid "file '~a' could not be found in these directories:~{ ~a~}~%"
 msgstr "le fichier « ~a » n'a pas été trouvé dans ces répertoires:~{ ~a~}~%"
 
-#: guix/ui.scm:483
+#: guix/ui.scm:484
 #, scheme-format
 msgid "~a: ~a~%"
 msgstr "~a: ~a~%"
 
-#: guix/ui.scm:518
+#: guix/ui.scm:519
 #, scheme-format
 msgid "failed to read expression ~s: ~s~%"
 msgstr "impossible de lire l'expression ~s: ~s~%"
 
-#: guix/ui.scm:524
+#: guix/ui.scm:525
 #, scheme-format
 msgid "failed to evaluate expression '~a':~%"
 msgstr "impossible d'évaluer l'expression « ~a »:~%"
 
-#: guix/ui.scm:527
+#: guix/ui.scm:528
 #, scheme-format
 msgid "syntax error: ~a~%"
 msgstr "erreur de syntaxe: ~a~%"
 
-#: guix/ui.scm:541
+#: guix/ui.scm:542
 #, scheme-format
 msgid "expression ~s does not evaluate to a package~%"
 msgstr "l'expression ~s ne correspond à aucun paquet~%"
 
-#: guix/ui.scm:603
+#: guix/ui.scm:604
 #, scheme-format
 msgid "~:[The following derivation would be built:~%~{   ~a~%~}~;~]"
 msgid_plural "~:[The following derivations would be built:~%~{   ~a~%~}~;~]"
 msgstr[0] "~:[La dérivation suivante serait compilée:~%~{   ~a~%~}~;~]"
 msgstr[1] "~:[Les dérivations suivantes seraient compilées:~%~{   ~a~%~}~;~]"
 
-#: guix/ui.scm:608
+#: guix/ui.scm:609
 #, scheme-format
 msgid "~:[The following file would be downloaded:~%~{   ~a~%~}~;~]"
 msgid_plural "~:[The following files would be downloaded:~%~{   ~a~%~}~;~]"
 msgstr[0] "~:[Le fichier suivant serait téléchargé:~%~{   ~a~%~}~;~]"
 msgstr[1] "~:[Les fichiers suivants seraient téléchargés:~%~{   ~a~%~}~;~]"
 
-#: guix/ui.scm:614
+#: guix/ui.scm:615
 #, scheme-format
 msgid "~:[The following derivation will be built:~%~{   ~a~%~}~;~]"
 msgid_plural "~:[The following derivations will be built:~%~{   ~a~%~}~;~]"
 msgstr[0] "~:[La dérivation suivante sera compilée:~%~{   ~a~%~}~;~]"
 msgstr[1] "~:[Les dérivations suivantes seront compilées:~%~{   ~a~%~}~;~]"
 
-#: guix/ui.scm:619
+#: guix/ui.scm:620
 #, scheme-format
 msgid "~:[The following file will be downloaded:~%~{   ~a~%~}~;~]"
 msgid_plural "~:[The following files will be downloaded:~%~{   ~a~%~}~;~]"
 msgstr[0] "~:[Le fichier suivant sera téléchargé:~%~{   ~a~%~}~;~]"
 msgstr[1] "~:[Les fichiers suivants seront téléchargés:~%~{   ~a~%~}~;~]"
 
-#: guix/ui.scm:674
+#: guix/ui.scm:675
 #, scheme-format
 msgid "The following package would be removed:~%~{~a~%~}~%"
 msgid_plural "The following packages would be removed:~%~{~a~%~}~%"
 msgstr[0] "Le paquet suivant serait supprimé:~%~{~a~%~}~%"
 msgstr[1] "Les paquets suivants seraient supprimés:~%~{~a~%~}~%"
 
-#: guix/ui.scm:679
+#: guix/ui.scm:680
 #, scheme-format
 msgid "The following package will be removed:~%~{~a~%~}~%"
 msgid_plural "The following packages will be removed:~%~{~a~%~}~%"
 msgstr[0] "Le paquet suivant sera supprimé:~%~{~a~%~}~%"
 msgstr[1] "Les paquets suivants seront supprimés:~%~{~a~%~}~%"
 
-#: guix/ui.scm:692
+#: guix/ui.scm:693
 #, scheme-format
 msgid "The following package would be downgraded:~%~{~a~%~}~%"
 msgid_plural "The following packages would be downgraded:~%~{~a~%~}~%"
 msgstr[0] "Le paquet suivant serait mis à une version inférieure:~%~{~a~%~}~%"
 msgstr[1] "Les paquets suivants seraient mis à des versions inférieures:~%~{~a~%~}~%"
 
-#: guix/ui.scm:697
+#: guix/ui.scm:698
 #, scheme-format
 msgid "The following package will be downgraded:~%~{~a~%~}~%"
 msgid_plural "The following packages will be downgraded:~%~{~a~%~}~%"
 msgstr[0] "Le paquet suivant sera mis à une version inférieure:~%~{~a~%~}~%"
 msgstr[1] "Les paquets suivants seront mis à des versions inférieures:~%~{~a~%~}~%"
 
-#: guix/ui.scm:710
+#: guix/ui.scm:711
 #, scheme-format
 msgid "The following package would be upgraded:~%~{~a~%~}~%"
 msgid_plural "The following packages would be upgraded:~%~{~a~%~}~%"
 msgstr[0] "Le paquet suivant serait mis à jour:~%~{~a~%~}~%"
 msgstr[1] "Les paquets suivants seraient mis à jour:~%~{~a~%~}~%"
 
-#: guix/ui.scm:715
+#: guix/ui.scm:716
 #, scheme-format
 msgid "The following package will be upgraded:~%~{~a~%~}~%"
 msgid_plural "The following packages will be upgraded:~%~{~a~%~}~%"
 msgstr[0] "Le paquet suivant sera mis à jour:~%~{~a~%~}~%"
 msgstr[1] "Les paquets suivants seront mis à jour:~%~{~a~%~}~%"
 
-#: guix/ui.scm:726
+#: guix/ui.scm:727
 #, scheme-format
 msgid "The following package would be installed:~%~{~a~%~}~%"
 msgid_plural "The following packages would be installed:~%~{~a~%~}~%"
 msgstr[0] "Le paquet suivant serait installé:~%~{~a~%~}~%"
 msgstr[1] "Les paquets suivants seraient installés:~%~{~a~%~}~%"
 
-#: guix/ui.scm:731
+#: guix/ui.scm:732
 #, scheme-format
 msgid "The following package will be installed:~%~{~a~%~}~%"
 msgid_plural "The following packages will be installed:~%~{~a~%~}~%"
 msgstr[0] "Le paquet suivant sera installé:~%~{~a~%~}~%"
 msgstr[1] "Les paquets suivants seront installés:~%~{~a~%~}~%"
 
-#: guix/ui.scm:748
+#: guix/ui.scm:749
 msgid "<unknown location>"
 msgstr "<emplacement inconnu>"
 
-#: guix/ui.scm:767
+#: guix/ui.scm:768
 #, scheme-format
 msgid "failed to create configuration directory `~a': ~a~%"
 msgstr "impossible de créer le répertoire de configuration « ~a »: ~a~%"
 
-#: guix/ui.scm:890 guix/ui.scm:904
+#: guix/ui.scm:891 guix/ui.scm:905
 msgid "unknown"
 msgstr "inconnu"
 
-#: guix/ui.scm:1062
+#: guix/ui.scm:1063
 #, scheme-format
 msgid "Generation ~a\t~a"
 msgstr "Génération ~a\t~a"
@@ -2494,27 +2643,27 @@ msgstr "Génération ~a\t~a"
 #. TRANSLATORS: The word "current" here is an adjective for
 #. "Generation", as in "current generation".  Use the appropriate
 #. gender where applicable.
-#: guix/ui.scm:1072
+#: guix/ui.scm:1073
 #, scheme-format
 msgid "~a\t(current)~%"
 msgstr "~a\t(actuel)~%"
 
-#: guix/ui.scm:1089
+#: guix/ui.scm:1116
 #, scheme-format
 msgid "switched from generation ~a to ~a~%"
 msgstr "passé de la génération ~a à ~a~%"
 
-#: guix/ui.scm:1105
+#: guix/ui.scm:1132
 #, scheme-format
 msgid "deleting ~a~%"
 msgstr "suppression de ~a~%"
 
-#: guix/ui.scm:1153
+#: guix/ui.scm:1163
 #, scheme-format
 msgid "Try `guix --help' for more information.~%"
 msgstr "Essayez « guix --help » pour plus d'informations.~%"
 
-#: guix/ui.scm:1180
+#: guix/ui.scm:1191
 msgid ""
 "Usage: guix COMMAND ARGS...\n"
 "Run COMMAND with ARGS.\n"
@@ -2522,31 +2671,31 @@ msgstr ""
 "Usage: guix COMMANDE ARGS...\n"
 "Lance la COMMANDE avec les arguments ARGS.\n"
 
-#: guix/ui.scm:1183
+#: guix/ui.scm:1194
 msgid "COMMAND must be one of the sub-commands listed below:\n"
 msgstr "COMMANDE doit être une des sous-commandes listées ci-dessous:\n"
 
-#: guix/ui.scm:1203
+#: guix/ui.scm:1214
 #, scheme-format
 msgid "guix: ~a: command not found~%"
 msgstr "guix: ~a: commande introuvable~%"
 
-#: guix/ui.scm:1220
+#: guix/ui.scm:1233
 #, scheme-format
 msgid "guix: missing command name~%"
 msgstr "guix: nom de commande manquant~%"
 
-#: guix/ui.scm:1228
+#: guix/ui.scm:1241
 #, scheme-format
 msgid "guix: unrecognized option '~a'~%"
 msgstr "guix: option « ~a » non reconnue ~%"
 
-#: guix/http-client.scm:266
+#: guix/http-client.scm:270
 #, scheme-format
 msgid "following redirection to `~a'...~%"
 msgstr "redirection vers « ~a »...~%"
 
-#: guix/http-client.scm:275
+#: guix/http-client.scm:279
 msgid "download failed"
 msgstr "le téléchargement a échoué"
 
@@ -2720,6 +2869,9 @@ msgstr "erreur: désaccord de version de libgcrypt\n"
 msgid "warning: daemon is running as root, so using `--build-users-group' is highly recommended\n"
 msgstr "avertissement: le daemon fonctionne en tant que root, l'utilisation de « --build-users-group » est fortement recommandée\n"
 
+#~ msgid "unsupported argument for reference graph"
+#~ msgstr "argument non supporté pour le graphe de référence"
+
 #~ msgid "looking for the latest release of GNU ~a..."
 #~ msgstr "recherche de la dernière version de GNU ~a..."
 
diff --git a/po/guix/pt_BR.po b/po/guix/pt_BR.po
index c4661a57f4..0c59e11d68 100644
--- a/po/guix/pt_BR.po
+++ b/po/guix/pt_BR.po
@@ -1,14 +1,14 @@
 # Brazilian Portuguese translation of the guix
 # Copyright (C) 2016 Free Software Foundation, Inc.
-# Copyright (C) 2016 Ludovic Courtès
+# Copyright (C) 2016 Ludovic Courtès
 # This file is distributed under the same license as the guix package.
 # Rafael Fontenelle <rffontenelle@gmail.com>, 2013, 2016.
 msgid ""
 msgstr ""
-"Project-Id-Version: guix 0.11.0\n"
+"Project-Id-Version: guix 0.12.0\n"
 "Report-Msgid-Bugs-To: ludo@gnu.org\n"
-"POT-Creation-Date: 2016-07-29 10:16+0200\n"
-"PO-Revision-Date: 2016-11-01 17:32-0200\n"
+"POT-Creation-Date: 2016-12-18 15:32+0100\n"
+"PO-Revision-Date: 2016-12-18 17:13-0200\n"
 "Last-Translator: Rafael Fontenelle <rffontenelle@gmail.com>\n"
 "Language-Team: Brazilian Portuguese <ldpbr-translation@lists.sourceforge.net>\n"
 "Language: pt_BR\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Generator: Virtaal 0.7.1\n"
+"X-Generator: Virtaal 1.0.0-beta1\n"
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 
 #: gnu/packages.scm:79
@@ -49,85 +49,95 @@ msgstr "escolhendo ~a de ~a~%"
 msgid "deprecated NAME-VERSION syntax; use NAME@VERSION instead~%"
 msgstr "sintaxe NOME-VERSÃO obsoleta; em vez disso, use NOME@VERSÃO~%"
 
-#: gnu/packages.scm:311
+#: gnu/packages.scm:311 guix/scripts/package.scm:272
+#, scheme-format
+msgid "package '~a' has been superseded by '~a'~%"
+msgstr "pacote \"~a\" foi substituído por \"~a\"~%"
+
+#: gnu/packages.scm:318
 #, scheme-format
 msgid "~A: package not found for version ~a~%"
 msgstr "~A: pacote não encontrado para versão ~a~%"
 
-#: gnu/packages.scm:321
+#: gnu/packages.scm:328
 #, scheme-format
 msgid "~A: unknown package~%"
 msgstr "~A: pacote desconhecido~%"
 
-#: gnu/packages.scm:349
+#: gnu/packages.scm:356
 #, scheme-format
 msgid "package `~a' lacks output `~a'~%"
 msgstr "pacote \"~a\" carece de mensagem de saída \"~a\"~%"
 
-#: gnu/services.scm:540
+#: gnu/services.scm:542
 #, scheme-format
 msgid "no target of type '~a' for service ~s"
 msgstr "nenhum alvo do tipo \"~a\" para o serviço ~s"
 
-#: gnu/services.scm:551 gnu/services.scm:612
+#: gnu/services.scm:553 gnu/services.scm:614
 #, scheme-format
 msgid "more than one target service of type '~a'"
 msgstr "mais de um serviço alvo do tipo \"~a\""
 
-#: gnu/services.scm:602
+#: gnu/services.scm:604
 #, scheme-format
 msgid "service of type '~a' not found"
 msgstr "serviço do tipo \"~a\" não localizado"
 
-#: gnu/system.scm:500
+#: gnu/system.scm:522
 #, scheme-format
 msgid "using a string for file '~a' is deprecated; use 'plain-file' instead~%"
 msgstr "usando um texto para arquivo \"~a\" está obsoleto; em vez disso, use \"plain-file\"~%"
 
-#: gnu/system.scm:516
+#: gnu/system.scm:538
 #, scheme-format
 msgid "using a monadic value for '~a' is deprecated; use 'plain-file' instead~%"
 msgstr "usando um valor monádico para \"~a\" está obsoleto; em vez disso, use \"plain-file\"~%"
 
-#: gnu/system.scm:650
+#: gnu/system.scm:680
 #, scheme-format
 msgid "~a: invalid locale name"
 msgstr "~a: nome de localidade inválido"
 
-#: gnu/system.scm:770
+#: gnu/system.scm:860
+msgid "/"
+msgstr "/"
+
+#: gnu/system.scm:862
 #, scheme-format
 msgid "unrecognized boot parameters for '~a'~%"
 msgstr "parâmetros de inicialização não reconhecidos para \"~a\"~%"
 
-#: gnu/services/shepherd.scm:162
+#: gnu/services/shepherd.scm:165
 #, scheme-format
 msgid "service '~a' provided more than once"
 msgstr "serviço \"~a\" fornecido mais de uma vez"
 
-#: gnu/services/shepherd.scm:177
+#: gnu/services/shepherd.scm:180
 #, scheme-format
 msgid "service '~a' requires '~a', which is not provided by any service"
 msgstr "serviço \"~a\" requer \"~a\", o que não é fornecido por nenhum serviço"
 
-#: gnu/system/shadow.scm:240
+#: gnu/system/shadow.scm:220
 #, scheme-format
 msgid "supplementary group '~a' of user '~a' is undeclared"
 msgstr "grupo suplementar \"~a\" do usuário \"~a\" não está declarado"
 
-#: gnu/system/shadow.scm:250
+#: gnu/system/shadow.scm:230
 #, scheme-format
 msgid "primary group '~a' of user '~a' is undeclared"
 msgstr "grupo primário \"~a\" do usuário \"~a\" não está declarado"
 
-#: guix/scripts.scm:52
+#: guix/scripts.scm:53
 #, scheme-format
 msgid "invalid argument: ~a~%"
 msgstr "argumento inválido: ~a~%"
 
-#: guix/scripts.scm:78 guix/scripts/download.scm:99 guix/scripts/gc.scm:164
-#: guix/scripts/import/cran.scm:78 guix/scripts/import/elpa.scm:77
-#: guix/scripts/pull.scm:219 guix/scripts/lint.scm:916
-#: guix/scripts/publish.scm:549 guix/scripts/graph.scm:383
+#: guix/scripts.scm:79 guix/scripts/download.scm:133 guix/scripts/gc.scm:164
+#: guix/scripts/import/cran.scm:82 guix/scripts/import/elpa.scm:77
+#: guix/scripts/pull.scm:219 guix/scripts/lint.scm:1042
+#: guix/scripts/publish.scm:556 guix/scripts/edit.scm:81
+#: guix/scripts/graph.scm:436
 #, scheme-format
 msgid "~A: unrecognized option~%"
 msgstr "~A: opção não reconhecida~%"
@@ -137,12 +147,12 @@ msgstr "~A: opção não reconhecida~%"
 msgid "failed to create GC root `~a': ~a~%"
 msgstr "falha ao criar raiz de GC \"~a\": ~a~%"
 
-#: guix/scripts/build.scm:198
+#: guix/scripts/build.scm:196
 #, scheme-format
 msgid "invalid replacement specification: ~s~%"
 msgstr "especificação de substituição inválida: ~s~%"
 
-#: guix/scripts/build.scm:246
+#: guix/scripts/build.scm:253
 msgid ""
 "\n"
 "      --with-source=SOURCE\n"
@@ -152,7 +162,7 @@ msgstr ""
 "      --with-source=FONTE\n"
 "                         usa FONTE ao compilar o pacote correspondente"
 
-#: guix/scripts/build.scm:249
+#: guix/scripts/build.scm:256
 msgid ""
 "\n"
 "      --with-input=PACKAGE=REPLACEMENT\n"
@@ -162,12 +172,22 @@ msgstr ""
 "      --with-input=PACOTE=SUBSTITUIÇÃO\n"
 "                         substitui a dependência PACOTE por SUBSTITUIÇÃO"
 
-#: guix/scripts/build.scm:274
+#: guix/scripts/build.scm:259
+msgid ""
+"\n"
+"      --with-graft=PACKAGE=REPLACEMENT\n"
+"                         graft REPLACEMENT on packages that refer to PACKAGE"
+msgstr ""
+"\n"
+"      --with-graft=PACOTE=SUBSTITUIÇÃO\n"
+"                         insere SUBSTITUIÇÃO em pacotes referindo-se a PACOTE"
+
+#: guix/scripts/build.scm:284
 #, scheme-format
 msgid "transformation '~a' had no effect on ~a~%"
 msgstr "a transformação \"~a\" não obteve efeito em ~a~%"
 
-#: guix/scripts/build.scm:292
+#: guix/scripts/build.scm:302
 msgid ""
 "\n"
 "  -L, --load-path=DIR    prepend DIR to the package module search path"
@@ -176,7 +196,7 @@ msgstr ""
 "  -L, --load-path=DIR    insere DIR no início do caminho de pesquisa do\n"
 "                         módulo do pacote"
 
-#: guix/scripts/build.scm:294
+#: guix/scripts/build.scm:304
 msgid ""
 "\n"
 "  -K, --keep-failed      keep build tree of failed builds"
@@ -184,7 +204,7 @@ msgstr ""
 "\n"
 "  -K, --keep-failed      mantém a árvore de compilado de pacotes falhos"
 
-#: guix/scripts/build.scm:296
+#: guix/scripts/build.scm:306
 msgid ""
 "\n"
 "  -k, --keep-going       keep going when some of the derivations fail"
@@ -192,7 +212,7 @@ msgstr ""
 "\n"
 "  -k, --keep-going       continua mesmo se algumas das derivações falharem"
 
-#: guix/scripts/build.scm:298
+#: guix/scripts/build.scm:308
 msgid ""
 "\n"
 "  -n, --dry-run          do not build the derivations"
@@ -200,7 +220,7 @@ msgstr ""
 "\n"
 "  -n, --dry-run          não compila as derivações"
 
-#: guix/scripts/build.scm:300
+#: guix/scripts/build.scm:310
 msgid ""
 "\n"
 "      --fallback         fall back to building when the substituter fails"
@@ -208,7 +228,7 @@ msgstr ""
 "\n"
 "      --fallback         volta para compilação quando o substituto falhar"
 
-#: guix/scripts/build.scm:302
+#: guix/scripts/build.scm:312
 msgid ""
 "\n"
 "      --no-substitutes   build instead of resorting to pre-built substitutes"
@@ -217,7 +237,7 @@ msgstr ""
 "      --no-substitutes   compila, em vez de recorrer a substitutos\n"
 "                         pré-construídos"
 
-#: guix/scripts/build.scm:304 guix/scripts/size.scm:217
+#: guix/scripts/build.scm:314 guix/scripts/size.scm:220
 msgid ""
 "\n"
 "      --substitute-urls=URLS\n"
@@ -227,7 +247,7 @@ msgstr ""
 "      --substitute-urls=URLS\n"
 "                         obtém substituto a partir das URLS se autorizadas"
 
-#: guix/scripts/build.scm:307
+#: guix/scripts/build.scm:317
 msgid ""
 "\n"
 "      --no-grafts        do not graft packages"
@@ -235,7 +255,7 @@ msgstr ""
 "\n"
 "      --no-grafts        não faz gráficos de pacotes"
 
-#: guix/scripts/build.scm:309
+#: guix/scripts/build.scm:319
 msgid ""
 "\n"
 "      --no-build-hook    do not attempt to offload builds via the build hook"
@@ -244,7 +264,7 @@ msgstr ""
 "      --no-build-hook    não tenta descarregar compilações via hook de\n"
 "                         compilação"
 
-#: guix/scripts/build.scm:311
+#: guix/scripts/build.scm:321
 msgid ""
 "\n"
 "      --max-silent-time=SECONDS\n"
@@ -255,7 +275,7 @@ msgstr ""
 "                         marca a compilação como falha após transcorridos\n"
 "                         SEGUNDOS de silêncio"
 
-#: guix/scripts/build.scm:314
+#: guix/scripts/build.scm:324
 msgid ""
 "\n"
 "      --timeout=SECONDS  mark the build as failed after SECONDS of activity"
@@ -265,7 +285,7 @@ msgstr ""
 "                         marca a compilação como falha após transcorridos\n"
 "                         SEGUNDOS de atividade"
 
-#: guix/scripts/build.scm:316
+#: guix/scripts/build.scm:326
 msgid ""
 "\n"
 "      --verbosity=LEVEL  use the given verbosity LEVEL"
@@ -273,7 +293,7 @@ msgstr ""
 "\n"
 "      --verbosity=NÍVEL  usa o NÍVEL de detalhamento dado"
 
-#: guix/scripts/build.scm:318
+#: guix/scripts/build.scm:328
 msgid ""
 "\n"
 "      --rounds=N         build N times in a row to detect non-determinism"
@@ -282,7 +302,7 @@ msgstr ""
 "      --rounds=N         compila N vezes de uma vez para detectar\n"
 "                         não determinismo"
 
-#: guix/scripts/build.scm:320
+#: guix/scripts/build.scm:330
 msgid ""
 "\n"
 "  -c, --cores=N          allow the use of up to N CPU cores for the build"
@@ -290,7 +310,7 @@ msgstr ""
 "\n"
 "  -c, --cores=N          permite uso de até N núcleos de CPU para compilação"
 
-#: guix/scripts/build.scm:322
+#: guix/scripts/build.scm:332
 msgid ""
 "\n"
 "  -M, --max-jobs=N       allow at most N build jobs"
@@ -298,12 +318,12 @@ msgstr ""
 "\n"
 "  -M, --max-jobs=N       permite no máximo N trabalhos de compilação"
 
-#: guix/scripts/build.scm:428 guix/scripts/build.scm:435
+#: guix/scripts/build.scm:438 guix/scripts/build.scm:445
 #, scheme-format
 msgid "not a number: '~a' option argument: ~a~%"
 msgstr "não é um número: argumento da opção \"~a\": ~a~%"
 
-#: guix/scripts/build.scm:455
+#: guix/scripts/build.scm:465
 msgid ""
 "Usage: guix build [OPTION]... PACKAGE-OR-DERIVATION...\n"
 "Build the given PACKAGE-OR-DERIVATION and return their output paths.\n"
@@ -311,7 +331,7 @@ msgstr ""
 "Uso: guix build [OPÇÃO]... PACOTE-OU-DERIVAÇÃO...\n"
 "Compila o PACOTE-OU-DERIVAÇÃO dado e returna seus caminhos de saída.\n"
 
-#: guix/scripts/build.scm:457
+#: guix/scripts/build.scm:467
 msgid ""
 "\n"
 "  -e, --expression=EXPR  build the package or derivation EXPR evaluates to"
@@ -319,7 +339,7 @@ msgstr ""
 "\n"
 "  -e, --expression=EXPR  compila o pacote ou derivação que EXPR corresponder"
 
-#: guix/scripts/build.scm:459
+#: guix/scripts/build.scm:469
 msgid ""
 "\n"
 "  -f, --file=FILE        build the package or derivation that the code within\n"
@@ -329,7 +349,7 @@ msgstr ""
 "  -f, --file=ARQUIVO     compila o pacote ou derivação que o código dentro\n"
 "                         de ARQUIVO avaliar"
 
-#: guix/scripts/build.scm:462
+#: guix/scripts/build.scm:472
 msgid ""
 "\n"
 "  -S, --source           build the packages' source derivations"
@@ -337,7 +357,7 @@ msgstr ""
 "\n"
 "  -S, --source           compila as derivações de fontes do pacote"
 
-#: guix/scripts/build.scm:464
+#: guix/scripts/build.scm:474
 msgid ""
 "\n"
 "      --sources[=TYPE]   build source derivations; TYPE may optionally be one\n"
@@ -347,7 +367,7 @@ msgstr ""
 "      --sources[=TIPO]   compila derivações de fonte; como opção, TIPO pode\n"
 "                         um entre \"package\", \"all\" (padrão) ou \"transitive\""
 
-#: guix/scripts/build.scm:467
+#: guix/scripts/build.scm:477
 msgid ""
 "\n"
 "  -s, --system=SYSTEM    attempt to build for SYSTEM--e.g., \"i686-linux\""
@@ -355,7 +375,7 @@ msgstr ""
 "\n"
 "  -s, --system=SISTEMA   tenta compilar para SISTEMA (ex.: \"i686-linux\")"
 
-#: guix/scripts/build.scm:469
+#: guix/scripts/build.scm:479
 msgid ""
 "\n"
 "      --target=TRIPLET   cross-build for TRIPLET--e.g., \"armel-linux-gnu\""
@@ -363,7 +383,7 @@ msgstr ""
 "\n"
 "      --target=TRIO      compilação cruzada para TRIO (ex: \"armel-linux-gnu\")"
 
-#: guix/scripts/build.scm:471
+#: guix/scripts/build.scm:481
 msgid ""
 "\n"
 "  -d, --derivations      return the derivation paths of the given packages"
@@ -371,7 +391,7 @@ msgstr ""
 "\n"
 "  -d, --derivations      retorna os caminhos de derivação dos pacotes dados"
 
-#: guix/scripts/build.scm:473
+#: guix/scripts/build.scm:483
 msgid ""
 "\n"
 "      --check            rebuild items to check for non-determinism issues"
@@ -380,7 +400,7 @@ msgstr ""
 "      --check            recompila itens para verificar questões de\n"
 "                         não determinismo"
 
-#: guix/scripts/build.scm:475
+#: guix/scripts/build.scm:485
 msgid ""
 "\n"
 "  -r, --root=FILE        make FILE a symlink to the result, and register it\n"
@@ -390,7 +410,7 @@ msgstr ""
 "  -r, --root=ARQUIVO     faz do ARQUIVO um link simbólico para o resultado\n"
 "                          e o registra, como um coletor de lixo"
 
-#: guix/scripts/build.scm:478
+#: guix/scripts/build.scm:488
 msgid ""
 "\n"
 "  -q, --quiet            do not show the build log"
@@ -398,7 +418,7 @@ msgstr ""
 "\n"
 "  -q, --quiet            não mostra o log de compilação"
 
-#: guix/scripts/build.scm:480
+#: guix/scripts/build.scm:490
 msgid ""
 "\n"
 "      --log-file         return the log file names for the given derivations"
@@ -407,14 +427,14 @@ msgstr ""
 "      --log-file         retorna o os nomes de arquivos de log para as\n"
 "                         derivações fornecidas"
 
-#: guix/scripts/build.scm:487 guix/scripts/download.scm:56
-#: guix/scripts/package.scm:388 guix/scripts/gc.scm:74
-#: guix/scripts/hash.scm:56 guix/scripts/import.scm:91
-#: guix/scripts/import/cran.scm:46 guix/scripts/pull.scm:83
-#: guix/scripts/substitute.scm:827 guix/scripts/system.scm:695
-#: guix/scripts/lint.scm:865 guix/scripts/publish.scm:73
-#: guix/scripts/edit.scm:44 guix/scripts/size.scm:225
-#: guix/scripts/graph.scm:364 guix/scripts/challenge.scm:182
+#: guix/scripts/build.scm:497 guix/scripts/download.scm:81
+#: guix/scripts/package.scm:419 guix/scripts/gc.scm:74
+#: guix/scripts/hash.scm:59 guix/scripts/import.scm:91
+#: guix/scripts/import/cran.scm:47 guix/scripts/pull.scm:83
+#: guix/scripts/substitute.scm:836 guix/scripts/system.scm:748
+#: guix/scripts/lint.scm:991 guix/scripts/publish.scm:74
+#: guix/scripts/edit.scm:44 guix/scripts/size.scm:228
+#: guix/scripts/graph.scm:416 guix/scripts/challenge.scm:182
 #: guix/scripts/container.scm:33 guix/scripts/container/exec.scm:43
 msgid ""
 "\n"
@@ -423,14 +443,14 @@ msgstr ""
 "\n"
 "  -h, --help             exibe esta ajuda e sai"
 
-#: guix/scripts/build.scm:489 guix/scripts/download.scm:58
-#: guix/scripts/package.scm:390 guix/scripts/gc.scm:76
-#: guix/scripts/hash.scm:58 guix/scripts/import.scm:93
-#: guix/scripts/import/cran.scm:48 guix/scripts/pull.scm:85
-#: guix/scripts/substitute.scm:829 guix/scripts/system.scm:697
-#: guix/scripts/lint.scm:869 guix/scripts/publish.scm:75
-#: guix/scripts/edit.scm:46 guix/scripts/size.scm:227
-#: guix/scripts/graph.scm:366 guix/scripts/challenge.scm:184
+#: guix/scripts/build.scm:499 guix/scripts/download.scm:83
+#: guix/scripts/package.scm:421 guix/scripts/gc.scm:76
+#: guix/scripts/hash.scm:61 guix/scripts/import.scm:93
+#: guix/scripts/import/cran.scm:49 guix/scripts/pull.scm:85
+#: guix/scripts/substitute.scm:838 guix/scripts/system.scm:750
+#: guix/scripts/lint.scm:995 guix/scripts/publish.scm:76
+#: guix/scripts/edit.scm:46 guix/scripts/size.scm:230
+#: guix/scripts/graph.scm:418 guix/scripts/challenge.scm:184
 #: guix/scripts/container.scm:35 guix/scripts/container/exec.scm:45
 msgid ""
 "\n"
@@ -439,7 +459,7 @@ msgstr ""
 "\n"
 "  -V, --version          exibe informações da versão e sai"
 
-#: guix/scripts/build.scm:516
+#: guix/scripts/build.scm:526
 #, scheme-format
 msgid ""
 "invalid argument: '~a' option argument: ~a, ~\n"
@@ -448,33 +468,38 @@ msgstr ""
 "argumento inválido: argumento da opção \"~a\": ~a, ~\n"
 "deve ser um entre \"package\", \"all\" ou \"transitive\"~%"
 
-#: guix/scripts/build.scm:563
+#: guix/scripts/build.scm:573
 #, scheme-format
 msgid "~s: not something we can build~%"
 msgstr "~s: não é algo que podemos compilar~%"
 
-#: guix/scripts/build.scm:643
+#: guix/scripts/build.scm:627
+#, scheme-format
+msgid "~a: warning: package '~a' has no source~%"
+msgstr "~a: aviso: pacote \"~a\" não possui fontes~%"
+
+#: guix/scripts/build.scm:661
 #, scheme-format
 msgid "no build log for '~a'~%"
 msgstr "nenhum log de compilação para \"~a\"~%"
 
-#: guix/scripts/download.scm:47
+#: guix/scripts/download.scm:67
 msgid ""
 "Usage: guix download [OPTION] URL\n"
-"Download the file at URL, add it to the store, and print its store path\n"
-"and the hash of its contents.\n"
+"Download the file at URL to the store or to the given file, and print its\n"
+"file name and the hash of its contents.\n"
 "\n"
 "Supported formats: 'nix-base32' (default), 'base32', and 'base16'\n"
 "('hex' and 'hexadecimal' can be used as well).\n"
 msgstr ""
 "Uso: guix download [OPÇÃO] URL\n"
-"Baixa o arquivo na URL, adiciona-o para o armazenamento e exibe o caminho\n"
-"de seu armazenamento e o hash de seu conteúdo.\n"
+"Baixa o arquivo da URL para o armazenamento ou o arquivo dado, e exibe seu\n"
+"nome de arquivo e o hash de seu conteúdo.\n"
 "\n"
 "Suporte a formatos: \"nix-base32\" (padrão), \"base32\" e \"base16\"\n"
 "(\"hex\" e \"hexadecimal\" também podem ser usados).\n"
 
-#: guix/scripts/download.scm:53 guix/scripts/hash.scm:51
+#: guix/scripts/download.scm:73 guix/scripts/hash.scm:54
 msgid ""
 "\n"
 "  -f, --format=FMT       write the hash in the given format"
@@ -482,92 +507,110 @@ msgstr ""
 "\n"
 "  -f, --format=FMT       escreve o hash no formato FMT dado"
 
-#: guix/scripts/download.scm:76 guix/scripts/hash.scm:76
+#: guix/scripts/download.scm:75
+msgid ""
+"\n"
+"      --no-check-certificate\n"
+"                         do not validate the certificate of HTTPS servers "
+msgstr ""
+"\n"
+"      --no-check-certificate\n"
+"                         não valida o certificado de servidores HTTPS "
+
+#: guix/scripts/download.scm:78
+msgid ""
+"\n"
+"  -o, --output=FILE      download to FILE"
+msgstr ""
+"\n"
+"  -o, --output=ARQUIVO   baixa para ARQUIVO"
+
+#: guix/scripts/download.scm:101 guix/scripts/hash.scm:82
 #, scheme-format
 msgid "unsupported hash format: ~a~%"
 msgstr "sem suporte ao formato de hash: ~a~%"
 
-#: guix/scripts/download.scm:102 guix/scripts/package.scm:842
-#: guix/scripts/publish.scm:551
+#: guix/scripts/download.scm:136 guix/scripts/package.scm:879
+#: guix/scripts/publish.scm:558
 #, scheme-format
 msgid "~A: extraneous argument~%"
 msgstr "~A: argumento estranho~%"
 
-#: guix/scripts/download.scm:111
+#: guix/scripts/download.scm:144
 #, scheme-format
 msgid "no download URI was specified~%"
 msgstr "nenhuma URI de download foi especificada~%"
 
-#: guix/scripts/download.scm:113
+#: guix/scripts/download.scm:146
 #, scheme-format
 msgid "~a: failed to parse URI~%"
 msgstr "~a: falha ao analisar URI~%"
 
-#: guix/scripts/download.scm:126
+#: guix/scripts/download.scm:156
 #, scheme-format
 msgid "~a: download failed~%"
 msgstr "~a: falha no download~%"
 
-#: guix/scripts/package.scm:104
+#: guix/scripts/package.scm:107
 #, scheme-format
 msgid "Try \"info '(guix) Invoking guix package'\" for more information.~%"
 msgstr "Tente \"info '(guix) Invoking guix package'\" para mais informações.~%"
 
-#: guix/scripts/package.scm:126
+#: guix/scripts/package.scm:129
 #, scheme-format
 msgid "error: while creating directory `~a': ~a~%"
 msgstr "erro: ao criar diretório \"~a\": ~a~%"
 
-#: guix/scripts/package.scm:130
+#: guix/scripts/package.scm:133
 #, scheme-format
 msgid "Please create the `~a' directory, with you as the owner.~%"
 msgstr "Por favor, crie o diretório \"~a\", com você sendo o proprietário.~%"
 
-#: guix/scripts/package.scm:137
+#: guix/scripts/package.scm:140
 #, scheme-format
 msgid "error: directory `~a' is not owned by you~%"
 msgstr "erro: diretório \"~a\" não tem você como proprietário~%"
 
-#: guix/scripts/package.scm:140
+#: guix/scripts/package.scm:143
 #, scheme-format
 msgid "Please change the owner of `~a' to user ~s.~%"
 msgstr "Por favor, altere o proprietário d \"~a\" para o usuário ~s.~%"
 
-#: guix/scripts/package.scm:175
+#: guix/scripts/package.scm:178
 #, scheme-format
 msgid "not removing generation ~a, which is current~%"
 msgstr "não será removida a geração ~a, que é o atual~%"
 
 # geração, criação?
-#: guix/scripts/package.scm:182
+#: guix/scripts/package.scm:185
 #, scheme-format
 msgid "no matching generation~%"
 msgstr "nenhuma geração correspondente~%"
 
-#: guix/scripts/package.scm:185 guix/scripts/package.scm:659
-#: guix/scripts/system.scm:502
+#: guix/scripts/package.scm:188 guix/scripts/package.scm:699
+#: guix/scripts/system.scm:549
 #, scheme-format
 msgid "invalid syntax: ~a~%"
 msgstr "sintaxe inválida: ~a~%"
 
-#: guix/scripts/package.scm:210
+#: guix/scripts/package.scm:214
 #, scheme-format
 msgid "nothing to be done~%"
 msgstr "nada para ser feito~%"
 
-#: guix/scripts/package.scm:224
+#: guix/scripts/package.scm:228
 #, scheme-format
 msgid "~a package in profile~%"
 msgid_plural "~a packages in profile~%"
 msgstr[0] "~a pacote no perfil~%"
 msgstr[1] "~a pacotes no perfil~%"
 
-#: guix/scripts/package.scm:313
+#: guix/scripts/package.scm:344
 #, scheme-format
 msgid "The following environment variable definitions may be needed:~%"
 msgstr "As seguintes definições de variável de ambiente podem ser necessárias:~%"
 
-#: guix/scripts/package.scm:329
+#: guix/scripts/package.scm:360
 msgid ""
 "Usage: guix package [OPTION]...\n"
 "Install, remove, or upgrade packages in a single transaction.\n"
@@ -575,7 +618,7 @@ msgstr ""
 "Uso: guix package [OPÇÃO]...\n"
 "Instala, remove ou atualiza pacotes em uma única transação.\n"
 
-#: guix/scripts/package.scm:331
+#: guix/scripts/package.scm:362
 msgid ""
 "\n"
 "  -i, --install PACKAGE ...\n"
@@ -585,7 +628,7 @@ msgstr ""
 "  -i, --install PACOTE ...\n"
 "                         instala PACOTEs"
 
-#: guix/scripts/package.scm:334
+#: guix/scripts/package.scm:365
 msgid ""
 "\n"
 "  -e, --install-from-expression=EXP\n"
@@ -595,7 +638,7 @@ msgstr ""
 "  -e, --install-from-expression=EXP\n"
 "                         instala o pacote que EXPR corresponder"
 
-#: guix/scripts/package.scm:337
+#: guix/scripts/package.scm:368
 msgid ""
 "\n"
 "  -f, --install-from-file=FILE\n"
@@ -607,7 +650,7 @@ msgstr ""
 "                         instala o pacote que o código dentro de\n"
 "                         ARQUIVO corresponder"
 
-#: guix/scripts/package.scm:341
+#: guix/scripts/package.scm:372
 msgid ""
 "\n"
 "  -r, --remove PACKAGE ...\n"
@@ -617,7 +660,7 @@ msgstr ""
 "  -r, --remove PACOTE ...\n"
 "                         remove PACOTEs"
 
-#: guix/scripts/package.scm:344
+#: guix/scripts/package.scm:375
 msgid ""
 "\n"
 "  -u, --upgrade[=REGEXP] upgrade all the installed packages matching REGEXP"
@@ -626,7 +669,7 @@ msgstr ""
 "  -u, --upgrade[=REGEXP] atualiza todos os pacotes instalados correspondendo\n"
 "                         à REGEXP"
 
-#: guix/scripts/package.scm:346
+#: guix/scripts/package.scm:377
 msgid ""
 "\n"
 "  -m, --manifest=FILE    create a new profile generation with the manifest\n"
@@ -636,7 +679,7 @@ msgstr ""
 "  -m, --manifest=ARQUIVO cria a geração de um novo perfil com o manifesto\n"
 "                         do ARQUIVO"
 
-#: guix/scripts/package.scm:349
+#: guix/scripts/package.scm:380
 msgid ""
 "\n"
 "      --do-not-upgrade[=REGEXP] do not upgrade any packages matching REGEXP"
@@ -644,7 +687,7 @@ msgstr ""
 "\n"
 "      --do-not-upgrade[=REGEXP] não atualiza pacotes correspondente a REGEXP"
 
-#: guix/scripts/package.scm:351
+#: guix/scripts/package.scm:382
 msgid ""
 "\n"
 "      --roll-back        roll back to the previous generation"
@@ -652,7 +695,7 @@ msgstr ""
 "\n"
 "      --roll-back        reverte para a geração anterior"
 
-#: guix/scripts/package.scm:353
+#: guix/scripts/package.scm:384
 msgid ""
 "\n"
 "      --search-paths[=KIND]\n"
@@ -662,7 +705,7 @@ msgstr ""
 "      --search-paths[=TIPO]\n"
 "                         exibe definições necessárias de variável de ambiente"
 
-#: guix/scripts/package.scm:356
+#: guix/scripts/package.scm:387
 msgid ""
 "\n"
 "  -l, --list-generations[=PATTERN]\n"
@@ -672,7 +715,7 @@ msgstr ""
 "  -l, --list-generations[=PADRÃO]\n"
 "                         lista criações correspondendo a PADRÃO"
 
-#: guix/scripts/package.scm:359
+#: guix/scripts/package.scm:390
 msgid ""
 "\n"
 "  -d, --delete-generations[=PATTERN]\n"
@@ -682,7 +725,7 @@ msgstr ""
 "  -d, --delete-generations[=PADRÃO]\n"
 "                         exclui gerações correspondendo a PADRÃO"
 
-#: guix/scripts/package.scm:362
+#: guix/scripts/package.scm:393
 msgid ""
 "\n"
 "  -S, --switch-generation=PATTERN\n"
@@ -692,7 +735,7 @@ msgstr ""
 "  -S, --switch-generations=PADRÃO\n"
 "                         alterna para a geração correspondendo a PADRÃO"
 
-#: guix/scripts/package.scm:365
+#: guix/scripts/package.scm:396
 msgid ""
 "\n"
 "  -p, --profile=PROFILE  use PROFILE instead of the user's default profile"
@@ -700,7 +743,7 @@ msgstr ""
 "\n"
 "  -p, --profile=PERFIL   usa PERFIL em vez do perfil padrão do usuário"
 
-#: guix/scripts/package.scm:368
+#: guix/scripts/package.scm:399
 msgid ""
 "\n"
 "      --bootstrap        use the bootstrap Guile to build the profile"
@@ -708,7 +751,7 @@ msgstr ""
 "\n"
 "      --bootstrap        usa a inicialização do Guile para compilar o perfil"
 
-#: guix/scripts/package.scm:370 guix/scripts/pull.scm:76
+#: guix/scripts/package.scm:401 guix/scripts/pull.scm:76
 msgid ""
 "\n"
 "      --verbose          produce verbose output"
@@ -716,7 +759,7 @@ msgstr ""
 "\n"
 "      --verbose          produz uma saída mais detalhada"
 
-#: guix/scripts/package.scm:373
+#: guix/scripts/package.scm:404
 msgid ""
 "\n"
 "  -s, --search=REGEXP    search in synopsis and description using REGEXP"
@@ -724,7 +767,7 @@ msgstr ""
 "\n"
 "  -s, --search=REGEXP    pesquisa na sinopse e descrição usando REGEXP"
 
-#: guix/scripts/package.scm:375
+#: guix/scripts/package.scm:406
 msgid ""
 "\n"
 "  -I, --list-installed[=REGEXP]\n"
@@ -734,7 +777,7 @@ msgstr ""
 "  -I, --list-installed[=REGEXP]\n"
 "                         lista pacotes instalados correspondentes a REGEXP"
 
-#: guix/scripts/package.scm:378
+#: guix/scripts/package.scm:409
 msgid ""
 "\n"
 "  -A, --list-available[=REGEXP]\n"
@@ -744,7 +787,7 @@ msgstr ""
 "  -A, --list-available[=REGEXP]\n"
 "                         lista pacotes disponíveis correspondentes a REGEXP"
 
-#: guix/scripts/package.scm:381
+#: guix/scripts/package.scm:412
 msgid ""
 "\n"
 "      --show=PACKAGE     show details about PACKAGE"
@@ -752,23 +795,23 @@ msgstr ""
 "\n"
 "      --show=PACOTE      mostra detalhes sobre o PACOTE"
 
-#: guix/scripts/package.scm:476
+#: guix/scripts/package.scm:507
 #, scheme-format
 msgid "~a: unsupported kind of search path~%"
 msgstr "~a: sem suporte ao tipo de caminho de pesquisa~%"
 
 # geração, criação?
-#: guix/scripts/package.scm:755
+#: guix/scripts/package.scm:790
 #, scheme-format
 msgid "cannot switch to generation '~a'~%"
 msgstr "não foi possível alternar para a geração \"~a\"~%"
 
-#: guix/scripts/package.scm:771
+#: guix/scripts/package.scm:806
 #, scheme-format
 msgid "would install new manifest from '~a' with ~d entries~%"
 msgstr "instalaria novo manifesto a partir de \"~a\" com entradas ~d~%"
 
-#: guix/scripts/package.scm:773
+#: guix/scripts/package.scm:808
 #, scheme-format
 msgid "installing new manifest from '~a' with ~d entries~%"
 msgstr "instalando novo manifesto a partir de \"~a\" com entradas ~d~%"
@@ -908,7 +951,7 @@ msgstr "argumentos estranhos: ~{~a ~}~%"
 msgid "freed ~h bytes~%"
 msgstr "~h bytes liberados~%"
 
-#: guix/scripts/hash.scm:46
+#: guix/scripts/hash.scm:47
 msgid ""
 "Usage: guix hash [OPTION] FILE\n"
 "Return the cryptographic hash of FILE.\n"
@@ -922,7 +965,15 @@ msgstr ""
 "Suporte a formatos: \"nix-base32\" (padrão), \"base32\" e \"base16\"\n"
 "(\"hex\" e \"hexadecimal\" também podem ser usados).\n"
 
-#: guix/scripts/hash.scm:53
+#: guix/scripts/hash.scm:52
+msgid ""
+"\n"
+"  -x, --exclude-vcs      exclude version control directories"
+msgstr ""
+"\n"
+"  -x, --exclude-vcs      exclui diretórios de controle de versão"
+
+#: guix/scripts/hash.scm:56
 msgid ""
 "\n"
 "  -r, --recursive        compute the hash on FILE recursively"
@@ -930,17 +981,18 @@ msgstr ""
 "\n"
 "  -r, --recursive        computa o hash no AQUIVO recursivamente"
 
-#: guix/scripts/hash.scm:104
+#: guix/scripts/hash.scm:109
 #, scheme-format
 msgid "unrecognized option: ~a~%"
 msgstr "opção não reconhecida: ~a~%"
 
-#: guix/scripts/hash.scm:135 guix/ui.scm:477
+#: guix/scripts/hash.scm:152 guix/ui.scm:478
 #, scheme-format
 msgid "~a~%"
 msgstr "~a~%"
 
-#: guix/scripts/hash.scm:138 guix/scripts/system.scm:825
+#: guix/scripts/hash.scm:155 guix/scripts/system.scm:879
+#: guix/scripts/system.scm:886 guix/scripts/system.scm:893
 #, scheme-format
 msgid "wrong number of arguments~%"
 msgstr "número errado de argumentos~%"
@@ -962,17 +1014,17 @@ msgstr "IMPORTADOR deve ser um dos importadores listados abaixo:\n"
 msgid "guix import: missing importer name~%"
 msgstr "guix: import: faltando o nome de um importador~%"
 
-#: guix/scripts/import.scm:115
+#: guix/scripts/import.scm:122
 #, scheme-format
 msgid "'~a' import failed~%"
 msgstr "importação de \"~a\" falhou~%"
 
-#: guix/scripts/import.scm:116
+#: guix/scripts/import.scm:123
 #, scheme-format
 msgid "~a: invalid importer~%"
 msgstr "~a: importador inválido~%"
 
-#: guix/scripts/import/cran.scm:42
+#: guix/scripts/import/cran.scm:43
 msgid ""
 "Usage: guix import cran PACKAGE-NAME\n"
 "Import and convert the CRAN package for PACKAGE-NAME.\n"
@@ -980,7 +1032,7 @@ msgstr ""
 "Uso: guix import cran NOME-PACOTE\n"
 "Importa e converte o pacote CRAN para NOME-PACOTE.\n"
 
-#: guix/scripts/import/cran.scm:44
+#: guix/scripts/import/cran.scm:45
 msgid ""
 "\n"
 "  -a, --archive=ARCHIVE  specify the archive repository"
@@ -988,17 +1040,17 @@ msgstr ""
 "\n"
 "  -a, --archive=PACOTE   especifica o repositório de pacote"
 
-#: guix/scripts/import/cran.scm:94
+#: guix/scripts/import/cran.scm:108
 #, scheme-format
 msgid "failed to download description for package '~a'~%"
 msgstr "falha ao baixar descrição para o pacote \"~a\"~%"
 
-#: guix/scripts/import/cran.scm:98 guix/scripts/import/elpa.scm:95
+#: guix/scripts/import/cran.scm:112 guix/scripts/import/elpa.scm:95
 #, scheme-format
 msgid "too few arguments~%"
 msgstr "poucos argumentos~%"
 
-#: guix/scripts/import/cran.scm:100 guix/scripts/import/elpa.scm:97
+#: guix/scripts/import/cran.scm:114 guix/scripts/import/elpa.scm:97
 #, scheme-format
 msgid "too many arguments~%"
 msgstr "número excessivo de argumentos~%"
@@ -1100,127 +1152,127 @@ msgstr "~A: argumento inesperado~%"
 msgid "failed to download up-to-date source, exiting\n"
 msgstr "falha ao baixar fonte atualizada; saindo\n"
 
-#: guix/scripts/substitute.scm:113
+#: guix/scripts/substitute.scm:112
 #, scheme-format
 msgid "authentication and authorization of substitutes disabled!~%"
 msgstr "autenticação e autorização de substitutos desabilitado!~%"
 
-#: guix/scripts/substitute.scm:188
+#: guix/scripts/substitute.scm:187
 #, scheme-format
 msgid "download from '~a' failed: ~a, ~s~%"
 msgstr "download de \"~a\" falhou: ~a, ~s~%"
 
-#: guix/scripts/substitute.scm:201
+#: guix/scripts/substitute.scm:200
 #, scheme-format
 msgid "while fetching ~a: server is somewhat slow~%"
 msgstr "enquanto obtinha ~a: servidor está um pouco lento~%"
 
-#: guix/scripts/substitute.scm:203
+#: guix/scripts/substitute.scm:202
 #, scheme-format
 msgid "try `--no-substitutes' if the problem persists~%"
 msgstr "Tente \"--no-substitutes\" se o problema persistir~%"
 
-#: guix/scripts/substitute.scm:219
+#: guix/scripts/substitute.scm:220
 #, scheme-format
 msgid "unsupported substitute URI scheme: ~a~%"
 msgstr "sem suporte ao esquema de URI de substituto: ~a~%"
 
-#: guix/scripts/substitute.scm:252
+#: guix/scripts/substitute.scm:254
 #, scheme-format
 msgid "while fetching '~a': ~a (~s)~%"
 msgstr "enquanto obtinha \"~a\": ~a (~s)~%"
 
-#: guix/scripts/substitute.scm:257
+#: guix/scripts/substitute.scm:259
 #, scheme-format
 msgid "ignoring substitute server at '~s'~%"
 msgstr "ignorando servidor substituto em \"~s\"~%"
 
-#: guix/scripts/substitute.scm:306
+#: guix/scripts/substitute.scm:309
 #, scheme-format
 msgid "signature version must be a number: ~s~%"
 msgstr "a versão de assinatura deve ser um número: ~s~%"
 
-#: guix/scripts/substitute.scm:310
+#: guix/scripts/substitute.scm:313
 #, scheme-format
 msgid "unsupported signature version: ~a~%"
 msgstr "sem suporte à versão da assinatura: ~a~%"
 
-#: guix/scripts/substitute.scm:318
+#: guix/scripts/substitute.scm:321
 #, scheme-format
 msgid "signature is not a valid s-expression: ~s~%"
 msgstr "a assinatura não é uma expressão-s válida: ~s~%"
 
-#: guix/scripts/substitute.scm:322
+#: guix/scripts/substitute.scm:325
 #, scheme-format
 msgid "invalid format of the signature field: ~a~%"
 msgstr "formato inválido do campo de assinatura: ~a~%"
 
-#: guix/scripts/substitute.scm:357
+#: guix/scripts/substitute.scm:360
 #, scheme-format
 msgid "invalid signature for '~a'~%"
 msgstr "assinatura inválida para \"~a\"~%"
 
-#: guix/scripts/substitute.scm:359
+#: guix/scripts/substitute.scm:362
 #, scheme-format
 msgid "hash mismatch for '~a'~%"
 msgstr "hash incompatível para \"~a\"~%"
 
-#: guix/scripts/substitute.scm:361
+#: guix/scripts/substitute.scm:364
 #, scheme-format
 msgid "'~a' is signed with an unauthorized key~%"
 msgstr "\"~a\" está assinado com uma chave não autorizada~%"
 
-#: guix/scripts/substitute.scm:363
+#: guix/scripts/substitute.scm:366
 #, scheme-format
 msgid "signature on '~a' is corrupt~%"
 msgstr "a assinatura em \"~a\" está corrompida~%"
 
-#: guix/scripts/substitute.scm:401
+#: guix/scripts/substitute.scm:404
 #, scheme-format
 msgid "substitute at '~a' lacks a signature~%"
 msgstr "o substituto em \"~a\" carece de uma assinatura~%"
 
-#: guix/scripts/substitute.scm:409
+#: guix/scripts/substitute.scm:411
 #, scheme-format
-msgid "~%Found valid signature for ~a~%"
-msgstr "~%Localizada assinatura válida para ~a~%"
+msgid "Found valid signature for ~a~%"
+msgstr "Localizada assinatura válida para ~a~%"
 
-#: guix/scripts/substitute.scm:412
+#: guix/scripts/substitute.scm:414
 #, scheme-format
 msgid "From ~a~%"
 msgstr "De ~a~%"
 
-#: guix/scripts/substitute.scm:452
+#: guix/scripts/substitute.scm:454
 #, scheme-format
 msgid "'~a' does not name a store item~%"
 msgstr "\"~a\" não é o nome de um item do armazenamento~%"
 
-#: guix/scripts/substitute.scm:596
+#: guix/scripts/substitute.scm:600
 #, scheme-format
 msgid "updating list of substitutes from '~a'... ~5,1f%"
 msgstr "atualizando a lista de substitutos de \"~a\"... ~5,1f%"
 
-#: guix/scripts/substitute.scm:646
+#: guix/scripts/substitute.scm:655
 #, scheme-format
 msgid "~s: unsupported server URI scheme~%"
 msgstr "~s: sem suporte ao esquema de URI de servidor~%"
 
-#: guix/scripts/substitute.scm:656
+#: guix/scripts/substitute.scm:665
 #, scheme-format
 msgid "'~a' uses different store '~a'; ignoring it~%"
 msgstr "\"~a\" usa um armazenamento diferente \"~a\""
 
-#: guix/scripts/substitute.scm:801
+#: guix/scripts/substitute.scm:810
 #, scheme-format
 msgid "host name lookup error: ~a~%"
 msgstr "erro na busca pelo nome da máquina: ~a~%"
 
-#: guix/scripts/substitute.scm:806
+#: guix/scripts/substitute.scm:815
 #, scheme-format
 msgid "TLS error in procedure '~a': ~a~%"
 msgstr "erro TLS no procedimento \"~a\": ~a~%"
 
-#: guix/scripts/substitute.scm:817
+#: guix/scripts/substitute.scm:826
 msgid ""
 "Usage: guix substitute [OPTION]...\n"
 "Internal tool to substitute a pre-built binary to a local build.\n"
@@ -1229,7 +1281,7 @@ msgstr ""
 "Ferramenta interna para substituir um binário pré-compilado para\n"
 "uma compilação local.\n"
 
-#: guix/scripts/substitute.scm:819
+#: guix/scripts/substitute.scm:828
 msgid ""
 "\n"
 "      --query            report on the availability of substitutes for the\n"
@@ -1240,7 +1292,7 @@ msgstr ""
 "                         nomes de arquivos de armazenamento passados na\n"
 "                         entrada padrão"
 
-#: guix/scripts/substitute.scm:822
+#: guix/scripts/substitute.scm:831
 msgid ""
 "\n"
 "      --substitute STORE-FILE DESTINATION\n"
@@ -1255,41 +1307,41 @@ msgstr ""
 #. TRANSLATORS: The second part of this message looks like
 #. "(4.1MiB installed)"; it shows the size of the package once
 #. installed.
-#: guix/scripts/substitute.scm:895
+#: guix/scripts/substitute.scm:904
 #, scheme-format
 msgid "Downloading ~a~:[~*~; (~a installed)~]...~%"
 msgstr "Baixando ~a~:[~*~; (~a instalado)~]...~%"
 
-#: guix/scripts/substitute.scm:951
+#: guix/scripts/substitute.scm:961
 msgid "ACL for archive imports seems to be uninitialized, substitutes may be unavailable\n"
 msgstr "ACL para importações de pacote parece não estar inicializado, substitutos podem estar indisponíveis\n"
 
-#: guix/scripts/substitute.scm:1047
+#: guix/scripts/substitute.scm:1057
 #, scheme-format
 msgid "~a: unrecognized options~%"
 msgstr "~a: opções desconhecidas~%"
 
-#: guix/scripts/authenticate.scm:58
+#: guix/scripts/authenticate.scm:59
 #, scheme-format
 msgid "cannot find public key for secret key '~a'~%"
 msgstr "não foi possível localizar a chave pública da chave privada \"~a\"~%"
 
-#: guix/scripts/authenticate.scm:78
+#: guix/scripts/authenticate.scm:79
 #, scheme-format
 msgid "error: invalid signature: ~a~%"
 msgstr "erro: assinatura inválida: ~a~%"
 
-#: guix/scripts/authenticate.scm:80
+#: guix/scripts/authenticate.scm:81
 #, scheme-format
 msgid "error: unauthorized public key: ~a~%"
 msgstr "erro: chave pública não autorizada: ~a~%"
 
-#: guix/scripts/authenticate.scm:82
+#: guix/scripts/authenticate.scm:83
 #, scheme-format
 msgid "error: corrupt signature data: ~a~%"
 msgstr "erro: dados de assinatura corrompidos: ~a~%"
 
-#: guix/scripts/authenticate.scm:120
+#: guix/scripts/authenticate.scm:121
 msgid ""
 "Usage: guix authenticate OPTION...\n"
 "Sign or verify the signature on the given file.  This tool is meant to\n"
@@ -1299,191 +1351,212 @@ msgstr ""
 "Assina ou verifica a assinatura no arquivo dado. Essa ferramenta é\n"
 "feita para ser usada internamente por \"guix-daemon\".\n"
 
-#: guix/scripts/authenticate.scm:126
+#: guix/scripts/authenticate.scm:127
 msgid "wrong arguments"
 msgstr "argumentos errados"
 
-#: guix/scripts/system.scm:111
+#: guix/scripts/system.scm:109
 #, scheme-format
 msgid "failed to register '~a' under '~a'~%"
 msgstr "falha ao registrar \"~a\" sob \"~a\"~%"
 
-#: guix/scripts/system.scm:144
+#: guix/scripts/system.scm:142
 #, scheme-format
 msgid "failed to install GRUB on device '~a'~%"
 msgstr "falha ao instalar GRUB no dispositivo \"~a\"~%"
 
-#: guix/scripts/system.scm:162
+#: guix/scripts/system.scm:160
 #, scheme-format
 msgid "initializing the current root file system~%"
 msgstr "inicialização do sistema de arquivos raiz atual~%"
 
-#: guix/scripts/system.scm:176
+#: guix/scripts/system.scm:174
 #, scheme-format
 msgid "not running as 'root', so the ownership of '~a' may be incorrect!~%"
 msgstr "execução como não \"root\", então o dono de \"~a\" pode estar incorreto!~%"
 
-#: guix/scripts/system.scm:234
+#: guix/scripts/system.scm:238
 #, scheme-format
 msgid "while talking to shepherd: ~a~%"
 msgstr "enquanto falava com o shepherd: ~a~%"
 
-#: guix/scripts/system.scm:248
+#: guix/scripts/system.scm:245
 #, scheme-format
 msgid "service '~a' could not be found~%"
 msgstr "o serviço \"~a\" não pôde ser localizado~%"
 
-#: guix/scripts/system.scm:251
+#: guix/scripts/system.scm:248
 #, scheme-format
 msgid "service '~a' does not have an action '~a'~%"
 msgstr "o serviço \"~a\" não possui uma ação \"~a\"~%"
 
-#: guix/scripts/system.scm:255
+#: guix/scripts/system.scm:252
 #, scheme-format
 msgid "exception caught while executing '~a' on service '~a':~%"
 msgstr "exceção encontrada ao executar \"~a\" no serviço \"~a\":~%"
 
-#: guix/scripts/system.scm:263
+#: guix/scripts/system.scm:260
 #, scheme-format
 msgid "something went wrong: ~s~%"
 msgstr "algo deu errado: ~s~%"
 
-#: guix/scripts/system.scm:266
+#: guix/scripts/system.scm:263
 #, scheme-format
 msgid "shepherd error~%"
 msgstr "erro do shepherd~%"
 
-#: guix/scripts/system.scm:302
+#: guix/scripts/system.scm:280
 #, scheme-format
 msgid "failed to obtain list of shepherd services~%"
 msgstr "falha ao obter lista de serviços do shepherd~%"
 
-#: guix/scripts/system.scm:322
+#: guix/scripts/system.scm:300
 #, scheme-format
 msgid "unloading service '~a'...~%"
 msgstr "descarregando serviço \"~a\"...~%"
 
-#: guix/scripts/system.scm:330
+#: guix/scripts/system.scm:308
 #, scheme-format
 msgid "loading new services:~{ ~a~}...~%"
 msgstr "carregando novos serviços:~{ ~a~}...~%"
 
-#: guix/scripts/system.scm:354
+#: guix/scripts/system.scm:332
 #, scheme-format
 msgid "activating system...~%"
 msgstr "ativando sistema...~%"
 
-#: guix/scripts/system.scm:445
+# geração, criação?
+#: guix/scripts/system.scm:425
+#, scheme-format
+msgid "cannot switch to system generation '~a'~%"
+msgstr "não foi possível alternar para a geração do sistema \"~a\"~%"
+
+#: guix/scripts/system.scm:459
+#, scheme-format
+msgid "failed to re-install GRUB configuration file: '~a'~%"
+msgstr "falha ao reinstalar o arquivo de configuração do GRUB: \"~a\"~%"
+
+#: guix/scripts/system.scm:489
 msgid "the DAG of services"
 msgstr "o DAG de serviços"
 
-#: guix/scripts/system.scm:458
+#: guix/scripts/system.scm:502
 msgid "the dependency graph of shepherd services"
 msgstr "o gráfico de dependência de serviços do shepherd"
 
-#: guix/scripts/system.scm:479
+#: guix/scripts/system.scm:526
 #, scheme-format
 msgid "  file name: ~a~%"
 msgstr "  nome de arquivo: ~a~%"
 
-#: guix/scripts/system.scm:480
+#: guix/scripts/system.scm:527
 #, scheme-format
 msgid "  canonical file name: ~a~%"
 msgstr "  nome de arquivo canônico: ~a~%"
 
 #. TRANSLATORS: Please preserve the two-space indentation.
-#: guix/scripts/system.scm:482
+#: guix/scripts/system.scm:529
 #, scheme-format
 msgid "  label: ~a~%"
 msgstr "  rótulo: ~a~%"
 
-#: guix/scripts/system.scm:483
+#: guix/scripts/system.scm:530
 #, scheme-format
 msgid "  root device: ~a~%"
 msgstr "  dispositivo raiz: ~a~%"
 
-#: guix/scripts/system.scm:484
+#: guix/scripts/system.scm:531
 #, scheme-format
 msgid "  kernel: ~a~%"
 msgstr "  kernel: ~a~%"
 
-#: guix/scripts/system.scm:541
+#: guix/scripts/system.scm:588
 #, scheme-format
 msgid "~a not found: 'guix pull' was never run~%"
 msgstr "~a não localizado: \"guix pull\" nunca foi executado~%"
 
-#: guix/scripts/system.scm:542
+#: guix/scripts/system.scm:589
 #, scheme-format
 msgid "Consider running 'guix pull' before 'reconfigure'.~%"
 msgstr "Considere executar \"guix pull\" antes de \"reconfigure\".~%"
 
-#: guix/scripts/system.scm:543
+#: guix/scripts/system.scm:590
 #, scheme-format
 msgid "Failing to do that may downgrade your system!~%"
 msgstr "Falhar em fazer isso pode fazer um downgrade de seu sistema!~%"
 
-#: guix/scripts/system.scm:613
+#: guix/scripts/system.scm:661
 #, scheme-format
 msgid "initializing operating system under '~a'...~%"
 msgstr "inicializando sistema operacional sob \"~a\"...~%"
 
-#: guix/scripts/system.scm:652
+#: guix/scripts/system.scm:700
 msgid ""
-"Usage: guix system [OPTION] ACTION [FILE]\n"
+"Usage: guix system [OPTION ...] ACTION [ARG ...] [FILE]\n"
 "Build the operating system declared in FILE according to ACTION.\n"
+"Some ACTIONS support additional ARGS.\n"
 msgstr ""
-"Uso: guix system [OPÇÃO] AÇÃO [ARQUIVO]\n"
+"Uso: guix system [OPÇÃO ...] AÇÃO [ARGUMENTOS ...] [ARQUIVO]\n"
 "Compilação do sistema operacional declarado em ARQUIVO de acordo com AÇÃO.\n"
+"Algumas AÇÕES fornecem suporte adicional a ARGUMENTOS.\n"
 
-#: guix/scripts/system.scm:655 guix/scripts/container.scm:28
+#: guix/scripts/system.scm:704 guix/scripts/container.scm:28
 msgid "The valid values for ACTION are:\n"
 msgstr "Os valores válidos para AÇÃO são:\n"
 
-#: guix/scripts/system.scm:657
+#: guix/scripts/system.scm:706
 msgid "   reconfigure      switch to a new operating system configuration\n"
-msgstr "   reconfigure      alterna para configuração de um novo sistema de arquivos\n"
+msgstr "   reconfigure      alterna para configuração de um novo sistema operacional\n"
+
+#: guix/scripts/system.scm:708
+msgid "   roll-back        switch to the previous operating system configuration\n"
+msgstr "   roll-back        alterna para a configuração de sistema operacional anterior\n"
 
-#: guix/scripts/system.scm:659
+#: guix/scripts/system.scm:710
+msgid "   switch-generation switch to an existing operating system configuration\n"
+msgstr "   switch-generation alterna para uma configuração de sistema operacional existente\n"
+
+#: guix/scripts/system.scm:712
 msgid "   list-generations list the system generations\n"
 msgstr "   list-generations lista as gerações do sistema\n"
 
-#: guix/scripts/system.scm:661
+#: guix/scripts/system.scm:714
 msgid "   build            build the operating system without installing anything\n"
 msgstr "   build            compila o sistema operacional sem instalador nada\n"
 
-#: guix/scripts/system.scm:663
+#: guix/scripts/system.scm:716
 msgid "   container        build a container that shares the host's store\n"
 msgstr ""
 "   container        compila um contêiner que compartilha o armazenamento\n"
 "                    da máquina\n"
 
-#: guix/scripts/system.scm:665
+#: guix/scripts/system.scm:718
 msgid "   vm               build a virtual machine image that shares the host's store\n"
 msgstr ""
 "   vm               compila uma imagem de máquina virtual que compartilha\n"
 "                    o armazenamento da máquina\n"
 
-#: guix/scripts/system.scm:667
+#: guix/scripts/system.scm:720
 msgid "   vm-image         build a freestanding virtual machine image\n"
 msgstr "   vm-image         compila uma imagem de máquina virtual independente\n"
 
-#: guix/scripts/system.scm:669
+#: guix/scripts/system.scm:722
 msgid "   disk-image       build a disk image, suitable for a USB stick\n"
 msgstr "   disk-image       compila uma imagem de disco, adequada para pendrive USB\n"
 
-#: guix/scripts/system.scm:671
+#: guix/scripts/system.scm:724
 msgid "   init             initialize a root file system to run GNU\n"
 msgstr "   init             inicializa um sistema de arquivos raiz para executar GNU\n"
 
-#: guix/scripts/system.scm:673
+#: guix/scripts/system.scm:726
 msgid "   extension-graph  emit the service extension graph in Dot format\n"
 msgstr "   extension-graph  emite o gráfico da extensão de serviço no formato Dot\n"
 
-#: guix/scripts/system.scm:675
+#: guix/scripts/system.scm:728
 msgid "   shepherd-graph   emit the graph of shepherd services in Dot format\n"
 msgstr "   shepherd-graph   emite o gráfico de serviços do shepherd no formato Dot\n"
 
-#: guix/scripts/system.scm:679
+#: guix/scripts/system.scm:732
 msgid ""
 "\n"
 "  -d, --derivation       return the derivation of the given system"
@@ -1491,7 +1564,7 @@ msgstr ""
 "\n"
 "  -d, --derivation       retorna a derivação do sistema dado"
 
-#: guix/scripts/system.scm:681
+#: guix/scripts/system.scm:734
 msgid ""
 "\n"
 "      --on-error=STRATEGY\n"
@@ -1501,7 +1574,7 @@ msgstr ""
 "      --on-error=ESTRATÉGIA\n"
 "                         aplica ESTRATÉGIA ao ocorrer um erro ao ler ARQUIVO"
 
-#: guix/scripts/system.scm:684
+#: guix/scripts/system.scm:737
 msgid ""
 "\n"
 "      --image-size=SIZE  for 'vm-image', produce an image of SIZE"
@@ -1509,7 +1582,7 @@ msgstr ""
 "\n"
 "      --image-size=TAM   para \"vm-image\", produz uma imagem de TAM"
 
-#: guix/scripts/system.scm:686
+#: guix/scripts/system.scm:739
 msgid ""
 "\n"
 "      --no-grub          for 'init', do not install GRUB"
@@ -1517,7 +1590,7 @@ msgstr ""
 "\n"
 "      --no-grub          para \"init\", não instala GRUB"
 
-#: guix/scripts/system.scm:688
+#: guix/scripts/system.scm:741
 msgid ""
 "\n"
 "      --share=SPEC       for 'vm', share host file system according to SPEC"
@@ -1526,7 +1599,7 @@ msgstr ""
 "      --share=ESPEC      para \"vm\", compartilha o sistema de arquivos do\n"
 "                         hospedeiro de acordo com ESPEC"
 
-#: guix/scripts/system.scm:690
+#: guix/scripts/system.scm:743
 msgid ""
 "\n"
 "      --expose=SPEC      for 'vm', expose host file system according to SPEC"
@@ -1535,7 +1608,7 @@ msgstr ""
 "      --expose=ESPEC     para \"vm\", expõe o sistema de arquivos do\n"
 "                         hospedeiro de acordo com ESPEC"
 
-#: guix/scripts/system.scm:692
+#: guix/scripts/system.scm:745
 msgid ""
 "\n"
 "      --full-boot        for 'vm', make a full boot sequence"
@@ -1544,49 +1617,64 @@ msgstr ""
 "      --full-boot        para \"vm\", faz uma sequência completa de\n"
 "                         inicialização"
 
-#: guix/scripts/system.scm:777
+#: guix/scripts/system.scm:830
 #, scheme-format
 msgid "no configuration file specified~%"
 msgstr "nenhum arquivo de configuração especificado~%"
 
-#: guix/scripts/system.scm:840
+#: guix/scripts/system.scm:912
 #, scheme-format
 msgid "~a: unknown action~%"
 msgstr "~a: ação desconhecida~%"
 
-#: guix/scripts/system.scm:855
+#: guix/scripts/system.scm:927
 #, scheme-format
 msgid "wrong number of arguments for action '~a'~%"
 msgstr "número errado de argumentos para a ação \"~a\"~%"
 
-#: guix/scripts/system.scm:860
+#: guix/scripts/system.scm:932
 #, scheme-format
 msgid "guix system: missing command name~%"
 msgstr "guix system: faltando um nome de comando~%"
 
-#: guix/scripts/system.scm:862
+#: guix/scripts/system.scm:934
 #, scheme-format
 msgid "Try 'guix system --help' for more information.~%"
 msgstr "Tente \"guix system --help\" para mais informações.~%"
 
-#: guix/scripts/lint.scm:130
+#: guix/scripts/lint.scm:133
 #, scheme-format
 msgid "Available checkers:~%"
 msgstr "Verificadores disponíveis:~%"
 
-#: guix/scripts/lint.scm:150
+#: guix/scripts/lint.scm:157
 msgid "description should not be empty"
 msgstr "a descrição deve não estar vazia"
 
-#: guix/scripts/lint.scm:160
+#: guix/scripts/lint.scm:167
 msgid "Texinfo markup in description is invalid"
 msgstr "Marcação Texinfo na descrição é inválida"
 
-#: guix/scripts/lint.scm:168
+#: guix/scripts/lint.scm:177
+#, scheme-format
+msgid ""
+"description should not contain ~\n"
+"trademark sign '~a' at ~d"
+msgstr ""
+"a descrição não deve conter ~\n"
+"sinal de marca registrada \"~a\" em ~d"
+
+#. TRANSLATORS: '@code' is Texinfo markup and must be kept
+#. as is.
+#: guix/scripts/lint.scm:190
+msgid "use @code or similar ornament instead of quotes"
+msgstr "use @code ou ornamento similar em vez de aspas"
+
+#: guix/scripts/lint.scm:197
 msgid "description should start with an upper-case letter or digit"
 msgstr "a descrição deve iniciar com uma letra maiúscula ou dígito"
 
-#: guix/scripts/lint.scm:184
+#: guix/scripts/lint.scm:213
 #, scheme-format
 msgid ""
 "sentences in description should be followed ~\n"
@@ -1595,201 +1683,225 @@ msgstr ""
 "sentenças nas descrição devem ser seguidas ~\n"
 "por dois espaços; possível infração~p em ~{~a~^, ~}"
 
-#: guix/scripts/lint.scm:200
+#: guix/scripts/lint.scm:231
 #, scheme-format
 msgid "invalid description: ~s"
 msgstr "a descrição inválida: ~s"
 
-#: guix/scripts/lint.scm:220
+#: guix/scripts/lint.scm:256
 #, scheme-format
 msgid "'~a' should probably be a native input"
 msgstr "\"~a\" provavelmente é uma entrada nativa"
 
-#: guix/scripts/lint.scm:238
+#: guix/scripts/lint.scm:280
+#, scheme-format
+msgid "'~a' should probably not be an input at all"
+msgstr "\"~a\" provavelmente deve não ser uma entrada"
+
+#: guix/scripts/lint.scm:306
 msgid "synopsis should not be empty"
 msgstr "a sinopse deve não estar vazia"
 
-#: guix/scripts/lint.scm:246
+#: guix/scripts/lint.scm:314
 msgid "no period allowed at the end of the synopsis"
 msgstr "nenhum ponto permitido ao final da sinopse"
 
-#: guix/scripts/lint.scm:258
+#: guix/scripts/lint.scm:326
 msgid "no article allowed at the beginning of the synopsis"
 msgstr "nenhum artigo permitido no início da sinopse"
 
-#: guix/scripts/lint.scm:265
+#: guix/scripts/lint.scm:333
 msgid "synopsis should be less than 80 characters long"
 msgstr "a sinopse deve ser menor que 80 caracteres"
 
-#: guix/scripts/lint.scm:271
+#: guix/scripts/lint.scm:339
 msgid "synopsis should start with an upper-case letter or digit"
 msgstr "a sinopse deve iniciar com uma letra maiúscula ou dígito"
 
-#: guix/scripts/lint.scm:278
+#: guix/scripts/lint.scm:346
 msgid "synopsis should not start with the package name"
 msgstr "a sinopse deve não iniciar com o nome do pacote"
 
-#: guix/scripts/lint.scm:292
+#: guix/scripts/lint.scm:360
 #, scheme-format
 msgid "invalid synopsis: ~s"
 msgstr "sinopse inválida: ~s"
 
-#: guix/scripts/lint.scm:383
+#: guix/scripts/lint.scm:459
 #, scheme-format
 msgid "URI ~a returned suspiciously small file (~a bytes)"
 msgstr "a URI ~a retornou um arquivo suspeitosamente pequeno (~a bytes)"
 
-#: guix/scripts/lint.scm:392 guix/scripts/lint.scm:404
+#: guix/scripts/lint.scm:468 guix/scripts/lint.scm:480
 #, scheme-format
 msgid "URI ~a not reachable: ~a (~s)"
 msgstr "a URI ~a não é alcançável: ~a (~s)"
 
-#: guix/scripts/lint.scm:411
+#: guix/scripts/lint.scm:487
 #, scheme-format
 msgid "URI ~a domain not found: ~a"
 msgstr "o domínio da URI ~a não foi localizado: ~a"
 
-#: guix/scripts/lint.scm:419
+#: guix/scripts/lint.scm:495
 #, scheme-format
 msgid "URI ~a unreachable: ~a"
 msgstr "URI ~a inalcançável: ~a"
 
-#: guix/scripts/lint.scm:445
+#: guix/scripts/lint.scm:504 guix/scripts/lint.scm:761
+#, scheme-format
+msgid "TLS certificate error: ~a"
+msgstr "erro de certificado TLS: ~a"
+
+#: guix/scripts/lint.scm:525
 msgid "invalid value for home page"
 msgstr "valor inválido para página inicial"
 
-#: guix/scripts/lint.scm:448
+#: guix/scripts/lint.scm:528
 #, scheme-format
 msgid "invalid home page URL: ~s"
 msgstr "URL de página inicial inválida: ~s"
 
-#: guix/scripts/lint.scm:468
+#: guix/scripts/lint.scm:548
 msgid "file names of patches should start with the package name"
 msgstr "nomes de arquivos de patches devem iniciar com o nome do pacote"
 
-#: guix/scripts/lint.scm:507
+#: guix/scripts/lint.scm:587
 #, scheme-format
 msgid "~a: ~a: proposed synopsis: ~s~%"
 msgstr "~a: ~a: sinopse proposta: ~s~%"
 
-#: guix/scripts/lint.scm:520
+#: guix/scripts/lint.scm:600
 #, scheme-format
 msgid "~a: ~a: proposed description:~%     \"~a\"~%"
 msgstr "~a: ~a: descrição proposta:~%     \"~a\"~%"
 
-#: guix/scripts/lint.scm:557
+#: guix/scripts/lint.scm:642
 msgid "all the source URIs are unreachable:"
 msgstr "todas as URIs fontes estão inalcançáveis:"
 
-#: guix/scripts/lint.scm:580
+#: guix/scripts/lint.scm:665
 msgid "the source file name should contain the package name"
 msgstr "o nome de arquivo fonte deve conter o nome do pacote"
 
-#: guix/scripts/lint.scm:589 guix/scripts/lint.scm:593
+#: guix/scripts/lint.scm:681
+#, scheme-format
+msgid "URL should be 'mirror://~a/~a'"
+msgstr "a URL deve ser \"mirror://~a/~a\""
+
+#: guix/scripts/lint.scm:699 guix/scripts/lint.scm:703
 #, scheme-format
 msgid "failed to create derivation: ~a"
 msgstr "falha ao criar a derivação: ~a"
 
-#: guix/scripts/lint.scm:607
+#: guix/scripts/lint.scm:717
 #, scheme-format
 msgid "failed to create derivation: ~s~%"
 msgstr "falha ao criar a derivação: ~s~%"
 
-#: guix/scripts/lint.scm:617
+#: guix/scripts/lint.scm:727
 msgid "invalid license field"
 msgstr "campo de licença inválido"
 
-#: guix/scripts/lint.scm:634
+#: guix/scripts/lint.scm:744
 #, scheme-format
 msgid "failed to retrieve CVE vulnerabilities from ~s: ~a (~s)~%"
 msgstr "falha ao obter vulnerabilidades CVE de ~s: ~a (~s)~%"
 
-#: guix/scripts/lint.scm:639 guix/scripts/lint.scm:647
+#: guix/scripts/lint.scm:749 guix/scripts/lint.scm:758
+#: guix/scripts/lint.scm:763
 #, scheme-format
 msgid "assuming no CVE vulnerabilities~%"
 msgstr "presumindo haver nenhuma vulnerabilidade CVE~%"
 
-#: guix/scripts/lint.scm:645
+#: guix/scripts/lint.scm:756
 #, scheme-format
 msgid "failed to lookup NIST host: ~a~%"
 msgstr "falha ao procurar o servidor do NIST: ~a~%"
 
-#: guix/scripts/lint.scm:683
+#: guix/scripts/lint.scm:801
 #, scheme-format
 msgid "probably vulnerable to ~a"
 msgstr "provavelmente vulnerável a ~a"
 
-#: guix/scripts/lint.scm:698
+#: guix/scripts/lint.scm:816
 #, scheme-format
 msgid "tabulation on line ~a, column ~a"
 msgstr "tabulação na linha ~a, coluna ~a"
 
-#: guix/scripts/lint.scm:707
+#: guix/scripts/lint.scm:825
 #, scheme-format
 msgid "trailing white space on line ~a"
 msgstr "espaço ao final da linha ~a"
 
-#: guix/scripts/lint.scm:717
+#: guix/scripts/lint.scm:835
 #, scheme-format
 msgid "line ~a is way too long (~a characters)"
 msgstr "a linha ~a está grande demais (~a caracteres)"
 
-#: guix/scripts/lint.scm:728
+#: guix/scripts/lint.scm:846
 #, scheme-format
 msgid "line ~a: parentheses feel lonely, move to the previous or next line"
 msgstr "linha ~a: parênteses está solitário, mova-o para a linha anterior ou a seguinte"
 
-#: guix/scripts/lint.scm:783
+#: guix/scripts/lint.scm:901
 msgid "Validate package descriptions"
 msgstr "Valida descrições dos pacotes"
 
-#: guix/scripts/lint.scm:787
+#: guix/scripts/lint.scm:905
 msgid "Validate synopsis & description of GNU packages"
 msgstr "Valida sinopse & descrição de pacotes GNU"
 
-#: guix/scripts/lint.scm:791
+#: guix/scripts/lint.scm:909
 msgid "Identify inputs that should be native inputs"
 msgstr "Identifica entradas que devem ser nativas"
 
-#: guix/scripts/lint.scm:795
+#: guix/scripts/lint.scm:913
+msgid "Identify inputs that should be inputs at all"
+msgstr "Identifica entradas que devem ser entradas"
+
+#: guix/scripts/lint.scm:917
 msgid "Validate file names and availability of patches"
 msgstr "Valida nomes de arquivos e disponibilidade de patches"
 
-#: guix/scripts/lint.scm:799
+#: guix/scripts/lint.scm:921
 msgid "Validate home-page URLs"
 msgstr "Valida URLs de site"
 
 #. TRANSLATORS: <license> is the name of a data type and must not be
 #. translated.
-#: guix/scripts/lint.scm:805
+#: guix/scripts/lint.scm:927
 msgid "Make sure the 'license' field is a <license> or a list thereof"
 msgstr "Certifica que o campo \"license\" é um <license> ou uma lista disto"
 
-#: guix/scripts/lint.scm:810
+#: guix/scripts/lint.scm:932
 msgid "Validate source URLs"
 msgstr "Valida URLs fonte"
 
-#: guix/scripts/lint.scm:814
+#: guix/scripts/lint.scm:936
+msgid "Suggest 'mirror://' URLs"
+msgstr "Sugere URLs \"mirror://\""
+
+#: guix/scripts/lint.scm:940
 msgid "Validate file names of sources"
 msgstr "Valida nomes de arquivos dos fontes"
 
-#: guix/scripts/lint.scm:818
+#: guix/scripts/lint.scm:944
 msgid "Report failure to compile a package to a derivation"
 msgstr "Relata falha ao compilar um pacote para uma derivação"
 
-#: guix/scripts/lint.scm:822
+#: guix/scripts/lint.scm:948
 msgid "Validate package synopses"
 msgstr "Valida sinopses do pacotes"
 
-#: guix/scripts/lint.scm:826
+#: guix/scripts/lint.scm:952
 msgid "Check the Common Vulnerabilities and Exposures (CVE) database"
 msgstr "Verifica o banco de dados de Vulnerabilidades e Exposições Comuns (CVE)"
 
-#: guix/scripts/lint.scm:831
+#: guix/scripts/lint.scm:957
 msgid "Look for formatting issues in the source"
 msgstr "Procura por problemas de formatação no fonte"
 
-#: guix/scripts/lint.scm:859
+#: guix/scripts/lint.scm:985
 msgid ""
 "Usage: guix lint [OPTION]... [PACKAGE]...\n"
 "Run a set of checkers on the specified package; if none is specified,\n"
@@ -1799,7 +1911,7 @@ msgstr ""
 "Executa uma série de verificadores no pacote especificado; se nenhum\n"
 "for especificado, executa-os em todos pacote.\n"
 
-#: guix/scripts/lint.scm:862
+#: guix/scripts/lint.scm:988
 msgid ""
 "\n"
 "  -c, --checkers=CHECKER1,CHECKER2...\n"
@@ -1809,7 +1921,7 @@ msgstr ""
 "  -c, --checkers=CHECKER1,CHECKER2...\n"
 "                         executa apenas os verificadores especificados"
 
-#: guix/scripts/lint.scm:867
+#: guix/scripts/lint.scm:993
 msgid ""
 "\n"
 "  -l, --list-checkers    display the list of available lint checkers"
@@ -1817,12 +1929,12 @@ msgstr ""
 "\n"
 "  -l, --list-checkers    exibe a lista de verificações lint disponíveis"
 
-#: guix/scripts/lint.scm:887
+#: guix/scripts/lint.scm:1013
 #, scheme-format
 msgid "~a: invalid checker~%"
 msgstr "~a: verificador inválido~%"
 
-#: guix/scripts/publish.scm:57
+#: guix/scripts/publish.scm:58
 #, scheme-format
 msgid ""
 "Usage: guix publish [OPTION]...\n"
@@ -1831,7 +1943,7 @@ msgstr ""
 "Uso: guix publish [OPÇÃO]...\n"
 "Publica ~a por HTTP.\n"
 
-#: guix/scripts/publish.scm:59
+#: guix/scripts/publish.scm:60
 msgid ""
 "\n"
 "  -p, --port=PORT        listen on PORT"
@@ -1839,7 +1951,7 @@ msgstr ""
 "\n"
 "  -p, --port=PORTA       Ouve na PORTA"
 
-#: guix/scripts/publish.scm:61
+#: guix/scripts/publish.scm:62
 msgid ""
 "\n"
 "      --listen=HOST      listen on the network interface for HOST"
@@ -1847,7 +1959,7 @@ msgstr ""
 "\n"
 "      --listen=MÁQUINA   ouve na interface de rede pela MÁQUINA"
 
-#: guix/scripts/publish.scm:63
+#: guix/scripts/publish.scm:64
 msgid ""
 "\n"
 "  -u, --user=USER        change privileges to USER as soon as possible"
@@ -1855,7 +1967,7 @@ msgstr ""
 "\n"
 "  -u, --user=USUÁRIO     altera privilégios para o USUÁRIO assim que possível"
 
-#: guix/scripts/publish.scm:65
+#: guix/scripts/publish.scm:66
 msgid ""
 "\n"
 "  -C, --compression[=LEVEL]\n"
@@ -1866,7 +1978,7 @@ msgstr ""
 "                         comprime pacotes no NÍVEL"
 
 # Abreviei segundos para a linha caber em 80 caracteres -- Rafael 
-#: guix/scripts/publish.scm:68
+#: guix/scripts/publish.scm:69
 msgid ""
 "\n"
 "      --ttl=TTL          announce narinfos can be cached for TTL seconds"
@@ -1874,7 +1986,7 @@ msgstr ""
 "\n"
 "      --ttl=TTL          anuncia que narinfos podem usar cache por TTL segs."
 
-#: guix/scripts/publish.scm:70
+#: guix/scripts/publish.scm:71
 msgid ""
 "\n"
 "  -r, --repl[=PORT]      spawn REPL server on PORT"
@@ -1882,37 +1994,37 @@ msgstr ""
 "\n"
 "  -r, --repl[=PORTA]      faz um servidor de REPL na PORTA"
 
-#: guix/scripts/publish.scm:86
+#: guix/scripts/publish.scm:87
 #, scheme-format
 msgid "lookup of host '~a' failed: ~a~%"
 msgstr "a procura da máquina \"~a\" falhou: ~a~%"
 
-#: guix/scripts/publish.scm:124
+#: guix/scripts/publish.scm:125
 #, scheme-format
 msgid "lookup of host '~a' returned nothing"
 msgstr "a procura da máquina \"~a\" retornou nada"
 
-#: guix/scripts/publish.scm:137
+#: guix/scripts/publish.scm:138
 #, scheme-format
 msgid "zlib support is missing; compression disabled~%"
 msgstr "suporte a zlib está faltando; compressão desabilitada~%"
 
-#: guix/scripts/publish.scm:144
+#: guix/scripts/publish.scm:145
 #, scheme-format
 msgid "~a: invalid duration~%"
 msgstr "~a: duração inválida~%"
 
-#: guix/scripts/publish.scm:537
+#: guix/scripts/publish.scm:544
 #, scheme-format
 msgid "user '~a' not found: ~a~%"
 msgstr "usuário \"~a\" não localizado: ~a~%"
 
-#: guix/scripts/publish.scm:574
+#: guix/scripts/publish.scm:581
 #, scheme-format
 msgid "server running as root; consider using the '--user' option!~%"
 msgstr "servidor executado como root; considere usar a opção \"--user\"!~%"
 
-#: guix/scripts/publish.scm:576
+#: guix/scripts/publish.scm:583
 #, scheme-format
 msgid "publishing ~a on ~a, port ~d~%"
 msgstr "publicando ~a em ~a, porta ~d~%"
@@ -1930,34 +2042,34 @@ msgstr ""
 msgid "file '~a' not found in search path ~s~%"
 msgstr "arquivo \"~a\" não localizado no caminho de pesquisa ~s~%"
 
-#: guix/scripts/edit.scm:83
+#: guix/scripts/edit.scm:90
 #, scheme-format
 msgid "source location of package '~a' is unknown~%"
 msgstr "localização fonte de pacote \"~a\" é desconhecida~%"
 
-#: guix/scripts/edit.scm:96
+#: guix/scripts/edit.scm:103
 #, scheme-format
 msgid "failed to launch '~a': ~a~%"
 msgstr "falha ao iniciar \"~a\": ~a~%"
 
-#: guix/scripts/size.scm:76
+#: guix/scripts/size.scm:77
 #, scheme-format
 msgid "no available substitute information for '~a'~%"
 msgstr "nenhuma informação de substituto disponível para \"~a\"~%"
 
-#: guix/scripts/size.scm:84
+#: guix/scripts/size.scm:85
 msgid "store item"
 msgstr "item do armazenamento"
 
-#: guix/scripts/size.scm:84
+#: guix/scripts/size.scm:85
 msgid "total"
 msgstr "total"
 
-#: guix/scripts/size.scm:84
+#: guix/scripts/size.scm:85
 msgid "self"
 msgstr "próprio"
 
-#: guix/scripts/size.scm:95
+#: guix/scripts/size.scm:96
 #, scheme-format
 msgid "total: ~,1f MiB~%"
 msgstr "total: ~,1f MB~%"
@@ -1965,11 +2077,11 @@ msgstr "total: ~,1f MB~%"
 #. TRANSLATORS: This is the title of a graph, meaning that the graph
 #. represents a profile of the store (the "store" being the place where
 #. packages are stored.)
-#: guix/scripts/size.scm:206
+#: guix/scripts/size.scm:209
 msgid "store profile"
 msgstr "perfil do armazenamento"
 
-#: guix/scripts/size.scm:215
+#: guix/scripts/size.scm:218
 msgid ""
 "Usage: guix size [OPTION]... PACKAGE\n"
 "Report the size of PACKAGE and its dependencies.\n"
@@ -1977,7 +2089,7 @@ msgstr ""
 "Uso: guix size [OPÇÃO]... PACOTES...\n"
 "Relata o tamanho do PACOTE e suas dependências.\n"
 
-#: guix/scripts/size.scm:220
+#: guix/scripts/size.scm:223
 msgid ""
 "\n"
 "  -s, --system=SYSTEM    consider packages for SYSTEM--e.g., \"i686-linux\""
@@ -1985,7 +2097,7 @@ msgstr ""
 "\n"
 "  -s, --system=SISTEMA   considera pacotes para SISTEMA (ex.: \"i686-linux\")"
 
-#: guix/scripts/size.scm:222
+#: guix/scripts/size.scm:225
 msgid ""
 "\n"
 "  -m, --map-file=FILE    write to FILE a graphical map of disk usage"
@@ -1993,64 +2105,77 @@ msgstr ""
 "\n"
 "  -m, --map-file=ARQUIVO escreve para ARQUIVO um mapa gráfico do uso do disco"
 
-#: guix/scripts/size.scm:276
+#: guix/scripts/size.scm:279
 msgid "missing store item argument\n"
 msgstr "faltando argumento de item do armazenamento\n"
 
-#: guix/scripts/graph.scm:82
+#: guix/scripts/graph.scm:83
 #, scheme-format
 msgid "~a: invalid argument (package name expected)"
 msgstr "~a: argumento inválido (esperava-se nome de pacote)"
 
-#: guix/scripts/graph.scm:93
+#: guix/scripts/graph.scm:94
 msgid "the DAG of packages, excluding implicit inputs"
 msgstr "o DAG dos pacotes, excluindo entradas implícitas"
 
-#: guix/scripts/graph.scm:150
+#: guix/scripts/graph.scm:151
 msgid "the DAG of packages, including implicit inputs"
 msgstr "o DAG dos pacotes, incluindo entradas implícitas"
 
-#: guix/scripts/graph.scm:160
+#: guix/scripts/graph.scm:161
 msgid "the DAG of packages and origins, including implicit inputs"
 msgstr "o DAG dos pacotes e origens, incluindo entradas implícitas"
 
-#: guix/scripts/graph.scm:191
+#: guix/scripts/graph.scm:192
 msgid "same as 'bag', but without the bootstrap nodes"
 msgstr "mesmo que \"bag\", mas sem o nós de inicialização"
 
-#: guix/scripts/graph.scm:237
+#: guix/scripts/graph.scm:238
 msgid "the DAG of derivations"
 msgstr "o DAG de derivações"
 
-#: guix/scripts/graph.scm:249
+#: guix/scripts/graph.scm:250
 msgid "unsupported argument for derivation graph"
 msgstr "sem suporte ao argumento para gráfico de derivação"
 
-#: guix/scripts/graph.scm:270
+#: guix/scripts/graph.scm:276
+msgid "unsupported argument for this type of graph"
+msgstr "sem suporte ao argumento para esse tipo de gráfico"
+
+#: guix/scripts/graph.scm:289
 #, scheme-format
 msgid "references for '~a' are not known~%"
 msgstr "referências para \"~a\" não são conhecidas~%"
 
-#: guix/scripts/graph.scm:277
+#: guix/scripts/graph.scm:296
 msgid "the DAG of run-time dependencies (store references)"
 msgstr "o DAG de dependências de tempo real (referências de armazenamento)"
 
-#: guix/scripts/graph.scm:290
-msgid "unsupported argument for reference graph"
-msgstr "sem suporte ao argumento para gráfico de referência"
+#: guix/scripts/graph.scm:312
+msgid "the DAG of referrers in the store"
+msgstr "o DAG de referências no armazenamento"
 
-#: guix/scripts/graph.scm:315
+#: guix/scripts/graph.scm:338
 #, scheme-format
 msgid "~a: unknown node type~%"
 msgstr "~a: tipo de nó desconhecido~%"
 
-#: guix/scripts/graph.scm:319
+#: guix/scripts/graph.scm:345
+#, scheme-format
+msgid "~a: unknown backend~%"
+msgstr "~a: backend desconhecido~%"
+
+#: guix/scripts/graph.scm:349
 msgid "The available node types are:\n"
 msgstr "Os tipos de nós disponíveis são:\n"
 
+#: guix/scripts/graph.scm:359
+msgid "The available backend types are:\n"
+msgstr "Os tipos de backends disponíveis são:\n"
+
 #. TRANSLATORS: Here 'dot' is the name of a program; it must not be
 #. translated.
-#: guix/scripts/graph.scm:355
+#: guix/scripts/graph.scm:403
 msgid ""
 "Usage: guix graph PACKAGE...\n"
 "Emit a Graphviz (dot) representation of the dependencies of PACKAGE...\n"
@@ -2058,7 +2183,23 @@ msgstr ""
 "Uso: guix graph PACOTE...\n"
 "Emite uma representação em Graphviz (dot) das dependências do PACOTE...\n"
 
-#: guix/scripts/graph.scm:357
+#: guix/scripts/graph.scm:405
+msgid ""
+"\n"
+"  -b, --backend=TYPE     produce a graph with the given backend TYPE"
+msgstr ""
+"\n"
+"  -b, --backend=TIPO     produz um grafo com backend do tipo TIPO"
+
+#: guix/scripts/graph.scm:407
+msgid ""
+"\n"
+"      --list-backends    list the available graph backends"
+msgstr ""
+"\n"
+"      --list-backends    lista os backends de gráficos disponíveis"
+
+#: guix/scripts/graph.scm:409
 msgid ""
 "\n"
 "  -t, --type=TYPE        represent nodes of the given TYPE"
@@ -2066,7 +2207,7 @@ msgstr ""
 "\n"
 "  -t, --type=TIPO        representa nós do TIPO dado"
 
-#: guix/scripts/graph.scm:359
+#: guix/scripts/graph.scm:411
 msgid ""
 "\n"
 "      --list-types       list the available graph types"
@@ -2074,7 +2215,7 @@ msgstr ""
 "\n"
 "      --list-types       lista os tipos de gráficos disponíveis"
 
-#: guix/scripts/graph.scm:361
+#: guix/scripts/graph.scm:413
 msgid ""
 "\n"
 "  -e, --expression=EXPR  consider the package EXPR evaluates to"
@@ -2135,18 +2276,26 @@ msgstr ""
 "      --substitute-urls=URLS\n"
 "                         compara resultados da compilação com os de URLS"
 
-#: guix/gnu-maintenance.scm:532
+#: guix/gnu-maintenance.scm:555
 msgid "Updater for GNU packages"
 msgstr "Atualizador para pacotes GNU"
 
-#: guix/gnu-maintenance.scm:539
+#: guix/gnu-maintenance.scm:562
 msgid "Updater for GNOME packages"
 msgstr "Atualizador para pacotes GNOME"
 
-#: guix/gnu-maintenance.scm:546
+#: guix/gnu-maintenance.scm:569
+msgid "Updater for KDE packages"
+msgstr "Atualizador para pacotes KDE"
+
+#: guix/gnu-maintenance.scm:576
 msgid "Updater for X.org packages"
 msgstr "Atualizador para pacotes X.org"
 
+#: guix/gnu-maintenance.scm:583
+msgid "Updater for packages hosted on kernel.org"
+msgstr "Atualizador para pacotes hospedados no kernel.org"
+
 #: guix/scripts/container.scm:25
 msgid ""
 "Usage: guix container ACTION ARGS...\n"
@@ -2202,70 +2351,70 @@ msgstr "processo inexistente ~d~%"
 msgid "exec failed with status ~d~%"
 msgstr "execução falhou com status ~d~%"
 
-#: guix/upstream.scm:157
+#: guix/upstream.scm:212
 #, scheme-format
 msgid "signature verification failed for `~a'~%"
 msgstr "verificação de assinatura falhou para \"~a\"~%"
 
-#: guix/upstream.scm:159
+#: guix/upstream.scm:214
 #, scheme-format
 msgid "(could be because the public key is not in your keyring)~%"
 msgstr "(pode ser porque a chave pública não está no seu chaveiro)~%"
 
-#: guix/upstream.scm:191
+#: guix/upstream.scm:246
 msgid "gz"
 msgstr "gz"
 
-#: guix/upstream.scm:234
+#: guix/upstream.scm:293
 #, scheme-format
 msgid "~a: could not locate source file"
 msgstr "~a: não foi possível localizar um arquivo fonte"
 
-#: guix/upstream.scm:239
+#: guix/upstream.scm:298
 #, scheme-format
 msgid "~a: ~a: no `version' field in source; skipping~%"
 msgstr "~a: ~a: sem o campo \"version\" no fonte; pulando~%"
 
-#: guix/ui.scm:238
+#: guix/ui.scm:239
 msgid "entering debugger; type ',bt' for a backtrace\n"
 msgstr "entrando no depurador; digite \",bt\" para o \"backtrace\"\n"
 
-#: guix/ui.scm:254 guix/ui.scm:271
+#: guix/ui.scm:255 guix/ui.scm:272
 #, scheme-format
 msgid "failed to load '~a': ~a~%"
 msgstr "falha ao carregar \"~a\": ~a~%"
 
-#: guix/ui.scm:257
+#: guix/ui.scm:258
 #, scheme-format
 msgid "~a: error: ~a~%"
 msgstr "~a: erro: ~a~%"
 
-#: guix/ui.scm:260 guix/ui.scm:529
+#: guix/ui.scm:261 guix/ui.scm:530
 #, scheme-format
 msgid "exception thrown: ~s~%"
 msgstr "excepção lançada: ~s~%"
 
-#: guix/ui.scm:262 guix/ui.scm:280
+#: guix/ui.scm:263 guix/ui.scm:281
 #, scheme-format
 msgid "failed to load '~a':~%"
 msgstr "falha ao carregar \"~a\":~%"
 
-#: guix/ui.scm:274
+#: guix/ui.scm:275
 #, scheme-format
 msgid "~a: warning: ~a~%"
 msgstr "~a: aviso: ~a~%"
 
-#: guix/ui.scm:277
+#: guix/ui.scm:278
 #, scheme-format
 msgid "failed to load '~a': exception thrown: ~s~%"
 msgstr "falha ao carregar \"~a\": exceção lançada: ~s~%"
 
-#: guix/ui.scm:289
+#: guix/ui.scm:290
 #, scheme-format
 msgid "failed to install locale: ~a~%"
 msgstr "falha ao instalar localidade: ~a~%"
 
-#: guix/ui.scm:308
+#: guix/ui.scm:309
 msgid ""
 "Copyright (C) 2016 the Guix authors\n"
 "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\n"
@@ -2281,7 +2430,7 @@ msgstr ""
 #. package.  Please add another line saying "Report translation bugs to
 #. ...\n" with the address for translation bugs (typically your translation
 #. team's web or email address).
-#: guix/ui.scm:320
+#: guix/ui.scm:321
 #, scheme-format
 msgid ""
 "\n"
@@ -2290,7 +2439,7 @@ msgstr ""
 "\n"
 "Relate erros para: ~a."
 
-#: guix/ui.scm:322
+#: guix/ui.scm:323
 #, scheme-format
 msgid ""
 "\n"
@@ -2299,7 +2448,7 @@ msgstr ""
 "\n"
 "Site do ~a: <~a>"
 
-#: guix/ui.scm:324
+#: guix/ui.scm:325
 msgid ""
 "\n"
 "General help using GNU software: <http://www.gnu.org/gethelp/>"
@@ -2307,199 +2456,199 @@ msgstr ""
 "\n"
 "Ajuda em geral usando softwares GNU: <http://www.gnu.org/gethelp/>"
 
-#: guix/ui.scm:369
+#: guix/ui.scm:370
 #, scheme-format
 msgid "'~a' is not a valid regular expression: ~a~%"
 msgstr "\"~a\" não é uma expressão regular válida: ~a~%"
 
-#: guix/ui.scm:375
+#: guix/ui.scm:376
 #, scheme-format
 msgid "~a: invalid number~%"
 msgstr "~a: número inválido~%"
 
-#: guix/ui.scm:392
+#: guix/ui.scm:393
 #, scheme-format
 msgid "invalid number: ~a~%"
 msgstr "número inválido: ~a~%"
 
-#: guix/ui.scm:415
+#: guix/ui.scm:416
 #, scheme-format
 msgid "unknown unit: ~a~%"
 msgstr "unidade desconhecida: ~a~%"
 
-#: guix/ui.scm:432
+#: guix/ui.scm:433
 #, scheme-format
 msgid "~a:~a:~a: package `~a' has an invalid input: ~s~%"
 msgstr "~a:~a:~a: o pacote \"~a\" tem uma entrada inválida: ~s~%"
 
-#: guix/ui.scm:439
+#: guix/ui.scm:440
 #, scheme-format
 msgid "~a: ~a: build system `~a' does not support cross builds~%"
 msgstr "~a: ~a: o sistema de compilação de \"~a\" não oferece suporte a compilações cruzadas~%"
 
-#: guix/ui.scm:444
+#: guix/ui.scm:445
 #, scheme-format
 msgid "profile '~a' does not exist~%"
 msgstr "o perfil \"~a\" não existe~%"
 
-#: guix/ui.scm:447
+#: guix/ui.scm:448
 #, scheme-format
 msgid "generation ~a of profile '~a' does not exist~%"
 msgstr "a geração ~a do perfil \"~a\" não existe~%"
 
-#: guix/ui.scm:454
+#: guix/ui.scm:455
 #, scheme-format
 msgid "corrupt input while restoring '~a' from ~s~%"
 msgstr "entrada corrompida ao restaurar \"~a\" de ~s~%"
 
-#: guix/ui.scm:456
+#: guix/ui.scm:457
 #, scheme-format
 msgid "corrupt input while restoring archive from ~s~%"
 msgstr "entrada corrompida ao restaurar um pacote de ~s~%"
 
-#: guix/ui.scm:459
+#: guix/ui.scm:460
 #, scheme-format
 msgid "failed to connect to `~a': ~a~%"
 msgstr "falha ao conectar em \"~a\": ~a~%"
 
-#: guix/ui.scm:464
+#: guix/ui.scm:465
 #, scheme-format
 msgid "build failed: ~a~%"
 msgstr "compilação falhou: ~a~%"
 
-#: guix/ui.scm:467
+#: guix/ui.scm:468
 #, scheme-format
 msgid "reference to invalid output '~a' of derivation '~a'~%"
 msgstr "referência a uma saída inválida \"~a\" da derivação \"~a\"~%"
 
-#: guix/ui.scm:471
+#: guix/ui.scm:472
 #, scheme-format
 msgid "file '~a' could not be found in these directories:~{ ~a~}~%"
 msgstr "o arquivo \"~a\" não pôde ser localizado nesses diretórios:~{ ~a~}~%"
 
-#: guix/ui.scm:483
+#: guix/ui.scm:484
 #, scheme-format
 msgid "~a: ~a~%"
 msgstr "~a: ~a~%"
 
-#: guix/ui.scm:518
+#: guix/ui.scm:519
 #, scheme-format
 msgid "failed to read expression ~s: ~s~%"
 msgstr "falha ao ler a expressão ~s: ~s~%"
 
-#: guix/ui.scm:524
+#: guix/ui.scm:525
 #, scheme-format
 msgid "failed to evaluate expression '~a':~%"
 msgstr "falha ao avaliar a expressão \"~a\":~%"
 
-#: guix/ui.scm:527
+#: guix/ui.scm:528
 #, scheme-format
 msgid "syntax error: ~a~%"
 msgstr "erro de sintaxe: ~a~%"
 
-#: guix/ui.scm:541
+#: guix/ui.scm:542
 #, scheme-format
 msgid "expression ~s does not evaluate to a package~%"
 msgstr "a expressão ~s não corresponde a um pacote~%"
 
-#: guix/ui.scm:603
+#: guix/ui.scm:604
 #, scheme-format
 msgid "~:[The following derivation would be built:~%~{   ~a~%~}~;~]"
 msgid_plural "~:[The following derivations would be built:~%~{   ~a~%~}~;~]"
 msgstr[0] "~:[A seguinte derivação seria compilada:~%~{   ~a~%~}~;~]"
 msgstr[1] "~:[As seguintes derivações seriam compiladas:~%~{   ~a~%~}~;~]"
 
-#: guix/ui.scm:608
+#: guix/ui.scm:609
 #, scheme-format
 msgid "~:[The following file would be downloaded:~%~{   ~a~%~}~;~]"
 msgid_plural "~:[The following files would be downloaded:~%~{   ~a~%~}~;~]"
 msgstr[0] "~:[O seguinte arquivo seria baixado:~%~{   ~a~%~}~;~]"
 msgstr[1] "~:[Os seguintes arquivos seriam baixados:~%~{   ~a~%~}~;~]"
 
-#: guix/ui.scm:614
+#: guix/ui.scm:615
 #, scheme-format
 msgid "~:[The following derivation will be built:~%~{   ~a~%~}~;~]"
 msgid_plural "~:[The following derivations will be built:~%~{   ~a~%~}~;~]"
 msgstr[0] "~:[A seguinte derivação será compilada:~%~{   ~a~%~}~;~]"
 msgstr[1] "~:[As seguintes derivações serão compiladas:~%~{   ~a~%~}~;~]"
 
-#: guix/ui.scm:619
+#: guix/ui.scm:620
 #, scheme-format
 msgid "~:[The following file will be downloaded:~%~{   ~a~%~}~;~]"
 msgid_plural "~:[The following files will be downloaded:~%~{   ~a~%~}~;~]"
 msgstr[0] "~:[O seguinte arquivo será baixado:~%~{   ~a~%~}~;~]"
 msgstr[1] "~:[Os seguintes arquivos serão baixados:~%~{   ~a~%~}~;~]"
 
-#: guix/ui.scm:674
+#: guix/ui.scm:675
 #, scheme-format
 msgid "The following package would be removed:~%~{~a~%~}~%"
 msgid_plural "The following packages would be removed:~%~{~a~%~}~%"
 msgstr[0] "O seguinte pacote seria removido:~%~{~a~%~}~%"
 msgstr[1] "Os seguintes pacotes seriam removidos:~%~{~a~%~}~%"
 
-#: guix/ui.scm:679
+#: guix/ui.scm:680
 #, scheme-format
 msgid "The following package will be removed:~%~{~a~%~}~%"
 msgid_plural "The following packages will be removed:~%~{~a~%~}~%"
 msgstr[0] "O seguinte pacote será removido:~%~{~a~%~}~%"
 msgstr[1] "Os seguintes pacotes serão removidos:~%~{~a~%~}~%"
 
-#: guix/ui.scm:692
+#: guix/ui.scm:693
 #, scheme-format
 msgid "The following package would be downgraded:~%~{~a~%~}~%"
 msgid_plural "The following packages would be downgraded:~%~{~a~%~}~%"
 msgstr[0] "O seguinte pacote sofreria um downgrade:~%~{~a~%~}~%"
 msgstr[1] "Os seguintes pacotes sofreriam um downgrade:~%~{~a~%~}~%"
 
-#: guix/ui.scm:697
+#: guix/ui.scm:698
 #, scheme-format
 msgid "The following package will be downgraded:~%~{~a~%~}~%"
 msgid_plural "The following packages will be downgraded:~%~{~a~%~}~%"
 msgstr[0] "O seguinte pacote sofrerá um downgrade:~%~{~a~%~}~%"
 msgstr[1] "Os seguintes pacotes sofrerão um downgrade:~%~{~a~%~}~%"
 
-#: guix/ui.scm:710
+#: guix/ui.scm:711
 #, scheme-format
 msgid "The following package would be upgraded:~%~{~a~%~}~%"
 msgid_plural "The following packages would be upgraded:~%~{~a~%~}~%"
 msgstr[0] "O seguinte pacote seria atualizado:~%~{~a~%~}~%"
 msgstr[1] "Os seguintes pacotes seriam atualizados:~%~{~a~%~}~%"
 
-#: guix/ui.scm:715
+#: guix/ui.scm:716
 #, scheme-format
 msgid "The following package will be upgraded:~%~{~a~%~}~%"
 msgid_plural "The following packages will be upgraded:~%~{~a~%~}~%"
 msgstr[0] "O seguinte pacote será atualizado:~%~{~a~%~}~%"
 msgstr[1] "Os seguintes pacotes serão atualizados:~%~{~a~%~}~%"
 
-#: guix/ui.scm:726
+#: guix/ui.scm:727
 #, scheme-format
 msgid "The following package would be installed:~%~{~a~%~}~%"
 msgid_plural "The following packages would be installed:~%~{~a~%~}~%"
 msgstr[0] "O seguinte pacote seria instalado:~%~{~a~%~}~%"
 msgstr[1] "Os seguintes pacotes seriam instalados:~%~{~a~%~}~%"
 
-#: guix/ui.scm:731
+#: guix/ui.scm:732
 #, scheme-format
 msgid "The following package will be installed:~%~{~a~%~}~%"
 msgid_plural "The following packages will be installed:~%~{~a~%~}~%"
 msgstr[0] "O seguinte pacote será instalado:~%~{~a~%~}~%"
 msgstr[1] "Os seguintes pacotes serão instalados:~%~{~a~%~}~%"
 
-#: guix/ui.scm:748
+#: guix/ui.scm:749
 msgid "<unknown location>"
 msgstr "<local desconhecido>"
 
-#: guix/ui.scm:767
+#: guix/ui.scm:768
 #, scheme-format
 msgid "failed to create configuration directory `~a': ~a~%"
 msgstr "falha ao criar o diretório de compilação \"~a\": ~a~%"
 
-#: guix/ui.scm:890 guix/ui.scm:904
+#: guix/ui.scm:891 guix/ui.scm:905
 msgid "unknown"
 msgstr "desconhecido"
 
-#: guix/ui.scm:1062
+#: guix/ui.scm:1063
 #, scheme-format
 msgid "Generation ~a\t~a"
 msgstr "Geração ~a\t~a"
@@ -2507,28 +2656,28 @@ msgstr "Geração ~a\t~a"
 #. TRANSLATORS: The word "current" here is an adjective for
 #. "Generation", as in "current generation".  Use the appropriate
 #. gender where applicable.
-#: guix/ui.scm:1072
+#: guix/ui.scm:1073
 #, scheme-format
 msgid "~a\t(current)~%"
 msgstr "~a\t(atual)~%"
 
 # geração, criação?
-#: guix/ui.scm:1089
+#: guix/ui.scm:1116
 #, scheme-format
 msgid "switched from generation ~a to ~a~%"
 msgstr "trocado da geração ~a para ~a~%"
 
-#: guix/ui.scm:1105
+#: guix/ui.scm:1132
 #, scheme-format
 msgid "deleting ~a~%"
 msgstr "excluindo ~a~%"
 
-#: guix/ui.scm:1153
+#: guix/ui.scm:1163
 #, scheme-format
 msgid "Try `guix --help' for more information.~%"
 msgstr "Tente \"guix --help\" para mais informações.~%"
 
-#: guix/ui.scm:1180
+#: guix/ui.scm:1191
 msgid ""
 "Usage: guix COMMAND ARGS...\n"
 "Run COMMAND with ARGS.\n"
@@ -2536,31 +2685,31 @@ msgstr ""
 "Uso: guix COMANDO ARGUMENTOS...\n"
 "Executa COMANDO com ARGUMENTOS.\n"
 
-#: guix/ui.scm:1183
+#: guix/ui.scm:1194
 msgid "COMMAND must be one of the sub-commands listed below:\n"
 msgstr "COMANDO deve ser um dos subcomandos listados abaixo:\n"
 
-#: guix/ui.scm:1203
+#: guix/ui.scm:1214
 #, scheme-format
 msgid "guix: ~a: command not found~%"
 msgstr "guix: ~a: comando não encontrado~%"
 
-#: guix/ui.scm:1220
+#: guix/ui.scm:1233
 #, scheme-format
 msgid "guix: missing command name~%"
 msgstr "guix: faltando um nome de comando~%"
 
-#: guix/ui.scm:1228
+#: guix/ui.scm:1241
 #, scheme-format
 msgid "guix: unrecognized option '~a'~%"
 msgstr "guix: opção \"~a\" desconhecida~%"
 
-#: guix/http-client.scm:266
+#: guix/http-client.scm:270
 #, scheme-format
 msgid "following redirection to `~a'...~%"
 msgstr "seguindo redirecionamento para \"~a\"...~%"
 
-#: guix/http-client.scm:275
+#: guix/http-client.scm:279
 msgid "download failed"
 msgstr "download falhou"
 
@@ -2734,6 +2883,9 @@ msgstr "erro: versão do libgcrypt não confere\n"
 msgid "warning: daemon is running as root, so using `--build-users-group' is highly recommended\n"
 msgstr "aviso: daemon está sendo executado como root, então o uso de \"--build-users-group\" é fortemente recomendado\n"
 
+#~ msgid "unsupported argument for reference graph"
+#~ msgstr "sem suporte ao argumento para gráfico de referência"
+
 #~ msgid "Hello, GNU world: An example GNU package"
 #~ msgstr "Olá, mundo GNU: Um exemplo de pacote GNU"
 
@@ -3131,9 +3283,6 @@ msgstr "aviso: daemon está sendo executado como root, então o uso de \"--build
 #~ "são armazenados como uma sequência de registros, cada registro contendo um\n"
 #~ "número arbitrário de campos nomeados."
 
-#~ msgid "package `~a' has no source~%"
-#~ msgstr "pacote \"~a\" não possui fontes~%"
-
 #~ msgid "~a: not a number~%"
 #~ msgstr "~a: não é um número~%"
 
diff --git a/po/packages/da.po b/po/packages/da.po
index 4c3cb735f4..286ea70577 100644
--- a/po/packages/da.po
+++ b/po/packages/da.po
@@ -5,10 +5,10 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: guix-packages 0.11.0\n"
+"Project-Id-Version: guix-packages 0.12.0\n"
 "Report-Msgid-Bugs-To: ludo@gnu.org\n"
-"POT-Creation-Date: 2016-07-29 10:23+0200\n"
-"PO-Revision-Date: 2016-12-04 19:30+01:00\n"
+"POT-Creation-Date: 2016-12-18 15:32+0100\n"
+"PO-Revision-Date: 2016-12-18 19:30+01:00\n"
 "Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n"
 "Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
 "Language: da\n"
@@ -37,11 +37,11 @@ msgstr ""
 "som kan bruges i dit daglige arbejde, personlige behov, eller bare\n"
 "god gammeldags skrivning."
 
-#: gnu/packages/aspell.scm:53 gnu/packages/libreoffice.scm:644
+#: gnu/packages/aspell.scm:57 gnu/packages/libreoffice.scm:644
 msgid "Spell checker"
 msgstr "Stavekontrol"
 
-#: gnu/packages/aspell.scm:55
+#: gnu/packages/aspell.scm:59
 msgid ""
 "Aspell is a spell-checker which can be used either as a library or as\n"
 "a standalone program.  Notable features of Aspell include its full support of\n"
@@ -53,15 +53,15 @@ msgstr ""
 "fulde understøttelse af dokumenter skrivet i UTF-8-kodning og dets evne\n"
 "til at bruge flere ordbøger, inklusive personlige."
 
-#: gnu/packages/aspell.scm:95
+#: gnu/packages/aspell.scm:99
 msgid "This package provides a dictionary for the GNU Aspell spell checker."
 msgstr "Denne pakke tilbyder en ordbog for stavekontrollen GNU Aspell."
 
-#: gnu/packages/audio.scm:109
+#: gnu/packages/audio.scm:123
 msgid "Realtime modular synthesizer and effect processor"
 msgstr ""
 
-#: gnu/packages/audio.scm:111
+#: gnu/packages/audio.scm:125
 msgid ""
 "AlsaModularSynth is a digital implementation of a classical analog\n"
 "modular synthesizer system.  It uses virtual control voltages to control the\n"
@@ -70,11 +70,11 @@ msgid ""
 "Filter) modules follow the convention of 1V / Octave."
 msgstr ""
 
-#: gnu/packages/audio.scm:148
+#: gnu/packages/audio.scm:162
 msgid "Library for audio labelling"
 msgstr ""
 
-#: gnu/packages/audio.scm:150
+#: gnu/packages/audio.scm:164
 msgid ""
 "aubio is a tool designed for the extraction of annotations from audio\n"
 "signals.  Its features include segmenting a sound file before each of its\n"
@@ -82,22 +82,22 @@ msgid ""
 "streams from live audio."
 msgstr ""
 
-#: gnu/packages/audio.scm:242
+#: gnu/packages/audio.scm:260
 msgid "Digital audio workstation"
 msgstr ""
 
-#: gnu/packages/audio.scm:244
+#: gnu/packages/audio.scm:262
 msgid ""
 "Ardour is a multi-channel digital audio workstation, allowing users to\n"
 "record, edit, mix and master audio and MIDI projects.  It is targeted at audio\n"
 "engineers, musicians, soundtrack editors and composers."
 msgstr ""
 
-#: gnu/packages/audio.scm:276
+#: gnu/packages/audio.scm:297
 msgid "Tonewheel organ synthesizer"
 msgstr ""
 
-#: gnu/packages/audio.scm:278
+#: gnu/packages/audio.scm:299
 msgid ""
 "AZR-3 is a port of the free VST plugin AZR-3.  It is a tonewheel organ\n"
 "with drawbars, distortion and rotating speakers.  The organ has three\n"
@@ -106,11 +106,11 @@ msgid ""
 "plugins are provided."
 msgstr ""
 
-#: gnu/packages/audio.scm:315
+#: gnu/packages/audio.scm:336
 msgid "Audio plug-in pack for LV2 and JACK environments"
-msgstr ""
+msgstr "Lydudvidelsesmpakke for LV2- og JACK-miljøer"
 
-#: gnu/packages/audio.scm:317
+#: gnu/packages/audio.scm:338
 msgid ""
 "Calf Studio Gear is an audio plug-in pack for LV2 and JACK environments.\n"
 "The suite contains lots of effects (delay, modulation, signal processing,\n"
@@ -119,42 +119,80 @@ msgid ""
 "tools (analyzer, mono/stereo tools, crossovers)."
 msgstr ""
 
-#: gnu/packages/audio.scm:360
-msgid "Sound and music computing system"
+#: gnu/packages/audio.scm:390
+msgid "Software speech synthesizer"
+msgstr "Programsynthesizer for tale"
+
+#: gnu/packages/audio.scm:391
+msgid ""
+"eSpeak is a software speech synthesizer for English and\n"
+"other languages.  eSpeak uses a \"formant synthesis\" method.  This allows many\n"
+"languages to be provided in a small size.  The speech is clear, and can be used\n"
+"at high speeds, but is not as natural or smooth as larger synthesizers which are\n"
+"based on human speech recordings."
 msgstr ""
 
-#: gnu/packages/audio.scm:362
+#: gnu/packages/audio.scm:438
+msgid "LV2 plugins for live use"
+msgstr "LV2-udvidelsesmoduler for live brug"
+
+#: gnu/packages/audio.scm:440
+msgid ""
+"The infamous plugins are a collection of LV2 audio plugins for live\n"
+"performances.  The plugins include a cellular automaton synthesizer, an\n"
+"envelope follower, distortion effects, tape effects and more."
+msgstr ""
+
+#: gnu/packages/audio.scm:481
+msgid "SWH plugins in LV2 format"
+msgstr "SWH-udvidelsesmoduler i LV2-format"
+
+#: gnu/packages/audio.scm:483
+msgid ""
+"Swh-plugins-lv2 is a collection of audio plugins in LV2 format.  Plugin\n"
+"classes include: dynamics (compressor, limiter), time (delay, chorus,\n"
+"flanger), ringmodulator, distortion, filters, pitchshift, oscillators,\n"
+"emulation (valve, tape), bit fiddling (decimator, pointer-cast), etc."
+msgstr ""
+
+#: gnu/packages/audio.scm:523
+msgid "Sound and music computing system"
+msgstr "Lyd- og musikberegningsystem"
+
+#: gnu/packages/audio.scm:525
 msgid ""
 "Csound is a user-programmable and user-extensible sound processing\n"
 "language and software synthesizer."
 msgstr ""
 
-#: gnu/packages/audio.scm:405 gnu/packages/audio.scm:2328
+#: gnu/packages/audio.scm:568 gnu/packages/audio.scm:2602
 msgid "C++ wrapper around the ALSA API"
-msgstr ""
+msgstr "C++-omslag omkring ALSA API'en"
 
-#: gnu/packages/audio.scm:407
+#: gnu/packages/audio.scm:570
 msgid ""
 "clalsadrv is a C++ wrapper around the ALSA API simplifying access to\n"
 "ALSA PCM devices."
 msgstr ""
+"Clalsadrv er et C++-omslag omkring ALSA API'en, der forenkler adgang til\n"
+"ALSA PCM-enheder."
 
-#: gnu/packages/audio.scm:444
+#: gnu/packages/audio.scm:607
 msgid "LADSPA ambisonics plugins"
 msgstr ""
 
-#: gnu/packages/audio.scm:446
+#: gnu/packages/audio.scm:609
 msgid ""
 "The AMB plugins are a set of LADSPA ambisonics plugins, mainly to be\n"
 "used within Ardour.  Features include: mono and stereo to B-format panning,\n"
 "horizontal rotator, square, hexagon and cube decoders."
 msgstr ""
 
-#: gnu/packages/audio.scm:481
+#: gnu/packages/audio.scm:644
 msgid "Chorus, phaser, and vintage high-pass and low-pass filters"
 msgstr ""
 
-#: gnu/packages/audio.scm:483
+#: gnu/packages/audio.scm:646
 msgid ""
 "This package provides various LADSPA plugins.  @code{cs_chorus} and\n"
 "@code{cs_phaser} provide chorus and phaser effects, respectively;\n"
@@ -164,21 +202,21 @@ msgid ""
 "the non-linear circuit elements of their original analog counterparts."
 msgstr ""
 
-#: gnu/packages/audio.scm:521
+#: gnu/packages/audio.scm:684
 msgid "LADSPA reverb plugin"
 msgstr ""
 
-#: gnu/packages/audio.scm:523
+#: gnu/packages/audio.scm:686
 msgid ""
 "This package provides a stereo reverb LADSPA plugin based on the\n"
 "well-known greverb."
 msgstr ""
 
-#: gnu/packages/audio.scm:557
+#: gnu/packages/audio.scm:720
 msgid "LADSPA four-band parametric equalizer plugin"
 msgstr ""
 
-#: gnu/packages/audio.scm:559
+#: gnu/packages/audio.scm:722
 msgid ""
 "This package provides a LADSPA plugin for a four-band parametric\n"
 "equalizer.  Each section has an active/bypass switch, frequency, bandwidth and\n"
@@ -193,11 +231,11 @@ msgid ""
 "for stage use."
 msgstr ""
 
-#: gnu/packages/audio.scm:602
+#: gnu/packages/audio.scm:765
 msgid "LADSPA stereo width plugin"
 msgstr "LADSPA-stereo med udvidelsesmodul"
 
-#: gnu/packages/audio.scm:604
+#: gnu/packages/audio.scm:767
 msgid ""
 "This package provides a LADSPA plugin to manipulate the stereo width of\n"
 "audio signals."
@@ -205,11 +243,11 @@ msgstr ""
 "Denne pakke tilbyder et LADSPA-udvidelsesmodul til at manipulere stereodyben\n"
 "for lydsignaler."
 
-#: gnu/packages/audio.scm:639
+#: gnu/packages/audio.scm:802
 msgid "LADSPA plugin for synthesizer oscillators"
 msgstr "LADSPA-udvidelsesmodul for synthesizeroscillatorer"
 
-#: gnu/packages/audio.scm:641
+#: gnu/packages/audio.scm:804
 msgid ""
 "The @code{blvco} LADSPA plugin provides three anti-aliased oscillators:\n"
 "\n"
@@ -224,11 +262,11 @@ msgid ""
 "output of analog synthesizers such as the Moog Voyager."
 msgstr ""
 
-#: gnu/packages/audio.scm:683
+#: gnu/packages/audio.scm:846
 msgid "LADSPA Autowah effect plugin"
 msgstr ""
 
-#: gnu/packages/audio.scm:685
+#: gnu/packages/audio.scm:848
 msgid ""
 "This package provides a LADSPA plugin for a Wah effect with envelope\n"
 "follower."
@@ -236,19 +274,19 @@ msgstr ""
 "Denne pakke tilbyder et LADSPA-udvidelsesmodul for wn Wah-effekt med\n"
 "kuvertfølger."
 
-#: gnu/packages/audio.scm:719
+#: gnu/packages/audio.scm:882
 msgid "LADSPA stereo reverb plugin"
 msgstr ""
 
-#: gnu/packages/audio.scm:721
+#: gnu/packages/audio.scm:884
 msgid "This package provides a LADSPA plugin for a stereo reverb effect."
 msgstr "Denne pakke tilbyder et LADSPA-udvidelsesmodul for en stereo reverb-effekt."
 
-#: gnu/packages/audio.scm:755
+#: gnu/packages/audio.scm:918
 msgid "SoundFont synthesizer"
 msgstr "SoundFont-synthesizer"
 
-#: gnu/packages/audio.scm:757
+#: gnu/packages/audio.scm:920
 msgid ""
 "FluidSynth is a real-time software synthesizer based on the SoundFont 2\n"
 "specifications.  FluidSynth reads and handles MIDI events from the MIDI input\n"
@@ -256,11 +294,11 @@ msgid ""
 "also play midifiles using a Soundfont."
 msgstr ""
 
-#: gnu/packages/audio.scm:789
+#: gnu/packages/audio.scm:952
 msgid "MPEG-4 and MPEG-2 AAC decoder"
 msgstr "MPEG-4- og MPEG-2 AAC-afkoder"
 
-#: gnu/packages/audio.scm:791
+#: gnu/packages/audio.scm:954
 msgid ""
 "FAAD2 is an MPEG-4 and MPEG-2 AAC decoder supporting LC, Main, LTP, SBR,\n"
 "PS, and DAB+."
@@ -268,29 +306,29 @@ msgstr ""
 "FAAD2 er en MPEG-4- og MPEG-2 AAC-afkoder, der understøtter LC, Main, LTP, SBR,\n"
 "PS og DAB+."
 
-#: gnu/packages/audio.scm:820
+#: gnu/packages/audio.scm:983
 msgid "Signal processing language"
 msgstr "Signalbehandlingssprog"
 
-#: gnu/packages/audio.scm:822
+#: gnu/packages/audio.scm:985
 msgid "Faust is a programming language for realtime audio signal processing."
 msgstr "Faust er et programmeringssprog for behandling af lydsignaler i realtid."
 
-#: gnu/packages/audio.scm:857
+#: gnu/packages/audio.scm:1050
 msgid "GUS compatible patches for MIDI players"
 msgstr ""
 
-#: gnu/packages/audio.scm:859
+#: gnu/packages/audio.scm:1052
 msgid ""
 "FreePats is a project to create a free and open set of GUS compatible\n"
 "patches that can be used with softsynths such as Timidity and WildMidi."
 msgstr ""
 
-#: gnu/packages/audio.scm:912
+#: gnu/packages/audio.scm:1105
 msgid "Virtual guitar amplifier"
 msgstr ""
 
-#: gnu/packages/audio.scm:913
+#: gnu/packages/audio.scm:1106
 msgid ""
 "Guitarix is a virtual guitar amplifier running JACK.\n"
 "Guitarix takes the signal from your guitar as a mono-signal from your sound\n"
@@ -301,11 +339,11 @@ msgid ""
 "auto-wah."
 msgstr ""
 
-#: gnu/packages/audio.scm:959
+#: gnu/packages/audio.scm:1162
 msgid "Audio effects processor"
 msgstr ""
 
-#: gnu/packages/audio.scm:961
+#: gnu/packages/audio.scm:1164
 msgid ""
 "Rakarrack is a richly featured multi-effects processor emulating a\n"
 "guitar effects pedalboard.  Effects include compressor, expander, noise gate,\n"
@@ -317,22 +355,22 @@ msgid ""
 "well suited to all musical instruments and vocals."
 msgstr ""
 
-#: gnu/packages/audio.scm:1005
+#: gnu/packages/audio.scm:1215
 msgid "LV2 convolution reverb"
 msgstr ""
 
-#: gnu/packages/audio.scm:1007
+#: gnu/packages/audio.scm:1217
 msgid ""
 "IR is a low-latency, real-time, high performance signal convolver\n"
 "especially for creating reverb effects.  It supports impulse responses with 1,\n"
 "2 or 4 channels, in any soundfile format supported by libsndfile."
 msgstr ""
 
-#: gnu/packages/audio.scm:1037
+#: gnu/packages/audio.scm:1247
 msgid "JACK audio connection kit"
 msgstr ""
 
-#: gnu/packages/audio.scm:1039
+#: gnu/packages/audio.scm:1249
 msgid ""
 "JACK is a low-latency audio server.  It can connect a number of\n"
 "different applications to an audio device, as well as allowing them to share\n"
@@ -342,32 +380,32 @@ msgid ""
 "synchronous execution of all clients, and low latency operation."
 msgstr ""
 
-#: gnu/packages/audio.scm:1136
+#: gnu/packages/audio.scm:1346
 msgid "Simple LV2 host for JACK"
 msgstr ""
 
-#: gnu/packages/audio.scm:1138
+#: gnu/packages/audio.scm:1348
 msgid ""
 "Jalv is a simple but fully featured LV2 host for JACK.  It runs LV2\n"
 "plugins and exposes their ports as JACK ports, essentially making any LV2\n"
 "plugin function as a JACK application."
 msgstr ""
 
-#: gnu/packages/audio.scm:1181
+#: gnu/packages/audio.scm:1391
 msgid "Linux Audio Developer's Simple Plugin API (LADSPA)"
 msgstr ""
 
-#: gnu/packages/audio.scm:1183
+#: gnu/packages/audio.scm:1393
 msgid ""
 "LADSPA is a standard that allows software audio processors and effects\n"
 "to be plugged into a wide range of audio synthesis and recording packages."
 msgstr ""
 
-#: gnu/packages/audio.scm:1219
+#: gnu/packages/audio.scm:1429
 msgid "Audio application session manager"
 msgstr ""
 
-#: gnu/packages/audio.scm:1221
+#: gnu/packages/audio.scm:1431
 msgid ""
 "LASH is a session management system for audio applications.  It allows\n"
 "you to save and restore audio sessions consisting of multiple interconneced\n"
@@ -375,11 +413,11 @@ msgid ""
 "connections between them."
 msgstr ""
 
-#: gnu/packages/audio.scm:1242
+#: gnu/packages/audio.scm:1452
 msgid "Bauer stereophonic-to-binaural DSP"
 msgstr ""
 
-#: gnu/packages/audio.scm:1244
+#: gnu/packages/audio.scm:1454
 msgid ""
 "The Bauer stereophonic-to-binaural DSP (bs2b) library and plugins is\n"
 "designed to improve headphone listening of stereo audio records.  Recommended\n"
@@ -387,21 +425,21 @@ msgid ""
 "essential distortions."
 msgstr ""
 
-#: gnu/packages/audio.scm:1267
+#: gnu/packages/audio.scm:1477
 msgid "Implementation of the Open Sound Control protocol"
 msgstr ""
 
-#: gnu/packages/audio.scm:1269
+#: gnu/packages/audio.scm:1479
 msgid ""
 "liblo is a lightweight library that provides an easy to use\n"
 "implementation of the Open Sound Control (OSC) protocol."
 msgstr ""
 
-#: gnu/packages/audio.scm:1290
+#: gnu/packages/audio.scm:1501
 msgid "Python bindings for liblo"
 msgstr ""
 
-#: gnu/packages/audio.scm:1292
+#: gnu/packages/audio.scm:1503
 msgid ""
 "Pyliblo is a Python wrapper for the liblo Open Sound Control (OSC)\n"
 "library.  It supports almost the complete functionality of liblo, allowing you\n"
@@ -409,22 +447,22 @@ msgid ""
 "included are the command line utilities @code{send_osc} and @code{dump_osc}."
 msgstr ""
 
-#: gnu/packages/audio.scm:1334
+#: gnu/packages/audio.scm:1545
 msgid "Library to simplify use of LV2 plugins in applications"
 msgstr ""
 
-#: gnu/packages/audio.scm:1336
+#: gnu/packages/audio.scm:1547
 msgid ""
 "Lilv is a C library to make the use of LV2 plugins as simple as possible\n"
 "for applications.  Lilv is the successor to SLV2, rewritten to be\n"
 "significantly faster and have minimal dependencies."
 msgstr ""
 
-#: gnu/packages/audio.scm:1363
+#: gnu/packages/audio.scm:1573
 msgid "LV2 audio plugin specification"
 msgstr ""
 
-#: gnu/packages/audio.scm:1365
+#: gnu/packages/audio.scm:1575
 msgid ""
 "LV2 is an open specification for audio plugins and host applications.\n"
 "At its core, LV2 is a simple stable interface, accompanied by extensions which\n"
@@ -432,38 +470,38 @@ msgid ""
 "software."
 msgstr ""
 
-#: gnu/packages/audio.scm:1400
+#: gnu/packages/audio.scm:1610
 msgid "LV2 port of the mda Piano plugin"
 msgstr ""
 
-#: gnu/packages/audio.scm:1401
+#: gnu/packages/audio.scm:1611
 msgid "An LV2 port of the mda Piano VSTi."
 msgstr ""
 
-#: gnu/packages/audio.scm:1414
+#: gnu/packages/audio.scm:1624
 msgid "LV2 port of the mda EPiano plugin"
 msgstr ""
 
-#: gnu/packages/audio.scm:1415
+#: gnu/packages/audio.scm:1625
 msgid "An LV2 port of the mda EPiano VSTi."
 msgstr ""
 
-#: gnu/packages/audio.scm:1453
+#: gnu/packages/audio.scm:1670
 msgid "C++ libraries for LV2 plugins"
 msgstr ""
 
-#: gnu/packages/audio.scm:1455
+#: gnu/packages/audio.scm:1672
 msgid ""
 "The LV2 Toolkit (LVTK) contains libraries that wrap the LV2 C API and\n"
 "extensions into easy to use C++ classes.  It is the successor of\n"
 "lv2-c++-tools."
 msgstr ""
 
-#: gnu/packages/audio.scm:1496
+#: gnu/packages/audio.scm:1713
 msgid "3D audio API"
 msgstr ""
 
-#: gnu/packages/audio.scm:1498
+#: gnu/packages/audio.scm:1715
 msgid ""
 "OpenAL provides capabilities for playing audio in a virtual 3D\n"
 "environment.  Distance attenuation, doppler shift, and directional sound\n"
@@ -473,62 +511,70 @@ msgid ""
 "buffers, and audio capture."
 msgstr ""
 
-#: gnu/packages/audio.scm:1532
+#: gnu/packages/audio.scm:1745
+msgid "Free implementation of OpenAL's ALUT standard"
+msgstr ""
+
+#: gnu/packages/audio.scm:1746
+msgid "freealut is the OpenAL Utility Toolkit."
+msgstr ""
+
+#: gnu/packages/audio.scm:1775
 msgid "Modular patch bay for audio and MIDI systems"
 msgstr ""
 
-#: gnu/packages/audio.scm:1534
+#: gnu/packages/audio.scm:1777
 msgid ""
 "Patchage is a modular patch bay for audio and MIDI systems based on JACK\n"
 "and ALSA."
 msgstr ""
 
-#: gnu/packages/audio.scm:1559
+#: gnu/packages/audio.scm:1802
 msgid "Real-time audio utility library"
 msgstr ""
 
-#: gnu/packages/audio.scm:1561
+#: gnu/packages/audio.scm:1804
 msgid ""
 "Raul (Real-time Audio Utility Library) is a C++ utility library primarily\n"
 "aimed at audio/musical applications."
 msgstr ""
 
-#: gnu/packages/audio.scm:1587
+#: gnu/packages/audio.scm:1847
 msgid "Audio time-stretching and pitch-shifting library"
 msgstr ""
 
-#: gnu/packages/audio.scm:1589
+#: gnu/packages/audio.scm:1849
 msgid ""
 "Rubber Band is a library and utility program that permits changing the\n"
 "tempo and pitch of an audio recording independently of one another."
 msgstr ""
 
-#: gnu/packages/audio.scm:1637
+#: gnu/packages/audio.scm:1897
 msgid "Cross-platform MIDI library for C++"
 msgstr ""
 
-#: gnu/packages/audio.scm:1639
+#: gnu/packages/audio.scm:1899
 msgid ""
 "RtMidi is a set of C++ classes (RtMidiIn, RtMidiOut, and API specific\n"
 "classes) that provide a common cross-platform API for realtime MIDI\n"
 "input/output."
 msgstr ""
 
-#: gnu/packages/audio.scm:1665
+#: gnu/packages/audio.scm:1925
 msgid "Library for serialising LV2 atoms to/from RDF"
 msgstr ""
 
-#: gnu/packages/audio.scm:1667
+#: gnu/packages/audio.scm:1927
 msgid ""
 "Sratom is a library for serialising LV2 atoms to/from RDF, particularly\n"
 "the Turtle syntax."
 msgstr ""
 
-#: gnu/packages/audio.scm:1692
+#: gnu/packages/audio.scm:1952
 msgid "Library for loading and wrapping LV2 plugin UIs"
 msgstr ""
 
-#: gnu/packages/audio.scm:1694
+#: gnu/packages/audio.scm:1954
 msgid ""
 "Suil is a lightweight C library for loading and wrapping LV2 plugin UIs.\n"
 "\n"
@@ -540,11 +586,11 @@ msgid ""
 "Suil currently supports every combination of Gtk 2, Qt 4, and X11."
 msgstr ""
 
-#: gnu/packages/audio.scm:1751
+#: gnu/packages/audio.scm:2011
 msgid "Software synthesizer for playing MIDI files"
 msgstr ""
 
-#: gnu/packages/audio.scm:1753
+#: gnu/packages/audio.scm:2013
 msgid ""
 "TiMidity++ is a software synthesizer.  It can play MIDI files by\n"
 "converting them into PCM waveform data; give it a MIDI data along with digital\n"
@@ -553,43 +599,43 @@ msgid ""
 "disks as various audio file formats."
 msgstr ""
 
-#: gnu/packages/audio.scm:1792
+#: gnu/packages/audio.scm:2052
 msgid "Modular and extensible audio processing system"
 msgstr ""
 
-#: gnu/packages/audio.scm:1794
+#: gnu/packages/audio.scm:2054
 msgid ""
 "Vamp is an audio processing plugin system for plugins that extract\n"
 "descriptive information from audio data — typically referred to as audio\n"
 "analysis plugins or audio feature extraction plugins."
 msgstr ""
 
-#: gnu/packages/audio.scm:1833
+#: gnu/packages/audio.scm:2093
 msgid "Library for time stretching and pitch scaling of audio"
 msgstr ""
 
-#: gnu/packages/audio.scm:1835
+#: gnu/packages/audio.scm:2095
 msgid ""
 "SBSMS (Subband Sinusoidal Modeling Synthesis) is software for time\n"
 "stretching and pitch scaling of audio.  This package contains the library."
 msgstr ""
 
-#: gnu/packages/audio.scm:1858
+#: gnu/packages/audio.scm:2118
 msgid "Hybrid lossless audio codec"
 msgstr ""
 
-#: gnu/packages/audio.scm:1860
+#: gnu/packages/audio.scm:2120
 msgid ""
 "WavPack is an audio compression format with lossless, lossy and hybrid\n"
 "compression modes.  This package contains command-line programs and library to\n"
 "encode and decode wavpack files."
 msgstr ""
 
-#: gnu/packages/audio.scm:1879
+#: gnu/packages/audio.scm:2139
 msgid "Mod file playing library"
 msgstr ""
 
-#: gnu/packages/audio.scm:1881
+#: gnu/packages/audio.scm:2141
 msgid ""
 "Libmodplug renders mod music files as raw audio data, for playing or\n"
 "conversion.  mod, .s3m, .it, .xm, and a number of lesser-known formats are\n"
@@ -597,33 +643,33 @@ msgid ""
 "surround and reverb."
 msgstr ""
 
-#: gnu/packages/audio.scm:1900
+#: gnu/packages/audio.scm:2160
 msgid "Module player library"
 msgstr ""
 
-#: gnu/packages/audio.scm:1902
+#: gnu/packages/audio.scm:2162
 msgid ""
 "Libxmp is a library that renders module files to PCM data.  It supports\n"
 "over 90 mainstream and obscure module formats including Protracker (MOD),\n"
 "Scream Tracker 3 (S3M), Fast Tracker II (XM), and Impulse Tracker (IT)."
 msgstr ""
 
-#: gnu/packages/audio.scm:1925
+#: gnu/packages/audio.scm:2185
 msgid "Extended module player"
 msgstr ""
 
-#: gnu/packages/audio.scm:1927
+#: gnu/packages/audio.scm:2187
 msgid ""
 "Xmp is a portable module player that plays over 90 mainstream and\n"
 "obscure module formats, including Protracker MOD, Fasttracker II XM, Scream\n"
 "Tracker 3 S3M and Impulse Tracker IT files."
 msgstr ""
 
-#: gnu/packages/audio.scm:1959
+#: gnu/packages/audio.scm:2219
 msgid "Audio processing library for changing tempo, pitch and playback rate"
 msgstr ""
 
-#: gnu/packages/audio.scm:1961
+#: gnu/packages/audio.scm:2221
 msgid ""
 "SoundTouch is an audio processing library for changing the tempo, pitch\n"
 "and playback rates of audio streams or audio files.  It is intended for\n"
@@ -631,11 +677,11 @@ msgid ""
 "control functionality, or just for playing around with the sound effects."
 msgstr ""
 
-#: gnu/packages/audio.scm:1998
+#: gnu/packages/audio.scm:2258
 msgid "Sound processing utility"
 msgstr ""
 
-#: gnu/packages/audio.scm:2000
+#: gnu/packages/audio.scm:2260
 msgid ""
 "SoX (Sound eXchange) is a command line utility that can convert\n"
 "various formats of computer audio files to other formats.  It can also\n"
@@ -643,92 +689,92 @@ msgid ""
 "can play and record audio files."
 msgstr ""
 
-#: gnu/packages/audio.scm:2023
+#: gnu/packages/audio.scm:2283
 msgid "One-dimensional sample-rate conversion library"
 msgstr ""
 
-#: gnu/packages/audio.scm:2025
+#: gnu/packages/audio.scm:2285
 msgid ""
 "The SoX Resampler library (libsoxr) performs one-dimensional sample-rate\n"
 "conversion.  It may be used, for example, to resample PCM-encoded audio."
 msgstr ""
 
-#: gnu/packages/audio.scm:2047
+#: gnu/packages/audio.scm:2315
 msgid "MPEG Audio Layer 2 (MP2) encoder"
 msgstr ""
 
-#: gnu/packages/audio.scm:2049
+#: gnu/packages/audio.scm:2317
 msgid ""
 "TwoLAME is an optimised MPEG Audio Layer 2 (MP2) encoder based on\n"
 "tooLAME by Mike Cheng, which in turn is based upon the ISO dist10 code and\n"
 "portions of LAME."
 msgstr ""
 
-#: gnu/packages/audio.scm:2089
+#: gnu/packages/audio.scm:2357
 msgid "Audio I/O library"
 msgstr ""
 
-#: gnu/packages/audio.scm:2091
+#: gnu/packages/audio.scm:2359
 msgid ""
 "PortAudio is a portable C/C++ audio I/O library providing a simple API\n"
 "to record and/or play sound using a callback function or a blocking read/write\n"
 "interface."
 msgstr ""
 
-#: gnu/packages/audio.scm:2114
+#: gnu/packages/audio.scm:2388
 msgid "Graphical user interface for FluidSynth"
 msgstr ""
 
-#: gnu/packages/audio.scm:2116
+#: gnu/packages/audio.scm:2390
 msgid ""
 "Qsynth is a GUI front-end application for the FluidSynth SoundFont\n"
 "synthesizer written in C++."
 msgstr ""
 
-#: gnu/packages/audio.scm:2154
+#: gnu/packages/audio.scm:2428
 msgid "Networked audio system"
 msgstr ""
 
-#: gnu/packages/audio.scm:2156
+#: gnu/packages/audio.scm:2430
 msgid ""
 "RSound allows you to send audio from an application and transfer it\n"
 "directly to a different computer on your LAN network.  It is an audio daemon\n"
 "with a much different focus than most other audio daemons."
 msgstr ""
 
-#: gnu/packages/audio.scm:2187
+#: gnu/packages/audio.scm:2461
 msgid "JACK audio frequency analyzer and display"
 msgstr ""
 
-#: gnu/packages/audio.scm:2189
+#: gnu/packages/audio.scm:2463
 msgid ""
 "XJackFreak is an audio analysis and equalizing tool for the Jack Audio\n"
 "Connection Kit.  It can display the FFT of any input, modify it and output the\n"
 "result."
 msgstr ""
 
-#: gnu/packages/audio.scm:2235
+#: gnu/packages/audio.scm:2509
 msgid "Fast, partitioned convolution engine library"
 msgstr ""
 
-#: gnu/packages/audio.scm:2237
+#: gnu/packages/audio.scm:2511
 msgid ""
 "Zita convolver is a C++ library providing a real-time convolution\n"
 "engine."
 msgstr ""
 
-#: gnu/packages/audio.scm:2282
+#: gnu/packages/audio.scm:2556
 msgid "C++ library for resampling audio signals"
 msgstr ""
 
-#: gnu/packages/audio.scm:2284
+#: gnu/packages/audio.scm:2558
 msgid ""
 "Libzita-resampler is a C++ library for resampling audio signals.  It is\n"
 "designed to be used within a real-time processing context, to be fast, and to\n"
 "provide high-quality sample rate conversion."
 msgstr ""
 
-#: gnu/packages/audio.scm:2330
+#: gnu/packages/audio.scm:2604
 msgid ""
 "Zita-alsa-pcmi is a C++ wrapper around the ALSA API.  It provides easy\n"
 "access to ALSA PCM devices, taking care of the many functions required to\n"
@@ -736,11 +782,11 @@ msgid ""
 "point audio data."
 msgstr ""
 
-#: gnu/packages/audio.scm:2361
+#: gnu/packages/audio.scm:2635
 msgid "Cue and toc file parsers and utilities"
 msgstr ""
 
-#: gnu/packages/audio.scm:2362
+#: gnu/packages/audio.scm:2636
 msgid ""
 "Cuetools is a set of programs that are useful for manipulating\n"
 "and using CUE sheet (cue) files and Table of Contents (toc) files.  CUE and TOC\n"
@@ -748,11 +794,11 @@ msgid ""
 "machine-readable ASCII format."
 msgstr ""
 
-#: gnu/packages/audio.scm:2381
+#: gnu/packages/audio.scm:2655
 msgid "WAVE audio data processing tool"
 msgstr ""
 
-#: gnu/packages/audio.scm:2382
+#: gnu/packages/audio.scm:2656
 msgid ""
 "shntool is a multi-purpose WAVE data processing and reporting\n"
 "utility.  File formats are abstracted from its core, so it can process any file\n"
@@ -760,21 +806,52 @@ msgid ""
 "module to handle that particular file type."
 msgstr ""
 
-#: gnu/packages/audio.scm:2419
+#: gnu/packages/audio.scm:2693
 msgid "DTS Coherent Acoustics decoder"
 msgstr ""
 
-#: gnu/packages/audio.scm:2420
+#: gnu/packages/audio.scm:2694
 msgid ""
 "Dcadec is a DTS Coherent Acoustics surround sound decoder\n"
 "with support for HD extensions."
 msgstr ""
 
-#: gnu/packages/backup.scm:92
+#: gnu/packages/audio.scm:2715
+msgid "Tool to adjust loudness of media files"
+msgstr ""
+
+#: gnu/packages/audio.scm:2717
+msgid ""
+"BS1770GAIN is a loudness scanner compliant with ITU-R BS.1770 and its\n"
+"flavors EBU R128, ATSC A/85, and ReplayGain 2.0.  It helps normalizing the\n"
+"loudness of audio and video files to the same level."
+msgstr ""
+
+#: gnu/packages/audio.scm:2748
+msgid "Lightweight audio filtering library"
+msgstr ""
+
+#: gnu/packages/audio.scm:2749
+msgid ""
+"An easy to use audio filtering library made from webrtc\n"
+"code, used in @code{libtoxcore}."
+msgstr ""
+
+#: gnu/packages/audio.scm:2793
+msgid "GSM 06.10 lossy speech compression library"
+msgstr "GSM 06.10-talekomprimeringsbibliotek uden kvalitetestab"
+
+#: gnu/packages/audio.scm:2794
+msgid ""
+"This C library provides an encoder and a decoder for the GSM\n"
+"06.10 RPE-LTP lossy speech compression algorithm."
+msgstr ""
+
+#: gnu/packages/backup.scm:93
 msgid "Encrypted backup using rsync algorithm"
 msgstr "Krypteret sikkerhedskopiering via brug af rsync-algoritmen"
 
-#: gnu/packages/backup.scm:94
+#: gnu/packages/backup.scm:95
 msgid ""
 "Duplicity backs up directories by producing encrypted tar-format volumes\n"
 "and uploading them to a remote or local file server.  Because duplicity uses\n"
@@ -791,11 +868,22 @@ msgstr ""
 "underskrive disse arkiver, så vil de være sikret mod spionage og/eller\n"
 "ændring af serveren."
 
-#: gnu/packages/backup.scm:127
+#: gnu/packages/backup.scm:132
+msgid "File verification and repair tool"
+msgstr ""
+
+#: gnu/packages/backup.scm:133
+msgid ""
+"Par2cmdline is a tool for generating RAID-like PAR2 recovery\n"
+"files using Reed-Solomon coding.  PAR2 files can be stored along side backups\n"
+"or distributed files for recovering from bitrot."
+msgstr ""
+
+#: gnu/packages/backup.scm:164
 msgid "Simple incremental backup tool"
 msgstr "Simpelt værktøj til trinvis sikkerhedskopiering"
 
-#: gnu/packages/backup.scm:129
+#: gnu/packages/backup.scm:166
 msgid ""
 "Hdup2 is a backup utility, its aim is to make backup really simple.  The\n"
 "backup scheduling is done by means of a cron job.  It supports an\n"
@@ -808,11 +896,11 @@ msgstr ""
 "sikkerhedskopier, krypterede sikkerhedskopier og opdelte sikkerhedskopier\n"
 "(kaldt klumper) så der nemt kan brændes til cd/dvd."
 
-#: gnu/packages/backup.scm:185
+#: gnu/packages/backup.scm:224
 msgid "Multi-format archive and compression library"
 msgstr "Arkiv- og komprimeringsbibliotek for flere formater"
 
-#: gnu/packages/backup.scm:187
+#: gnu/packages/backup.scm:226
 msgid ""
 "Libarchive provides a flexible interface for reading and writing\n"
 "archives in various formats such as tar and cpio.  Libarchive also supports\n"
@@ -830,11 +918,11 @@ msgstr ""
 "Bemærk venligst at der i øjeblikket ikke er indbygget understøttelse\n"
 "for vilkårlig vilkårlig adgang eller for direkte modifikation i arkivet."
 
-#: gnu/packages/backup.scm:258
+#: gnu/packages/backup.scm:289
 msgid "Provide a list of files to backup"
 msgstr "Tilbyder en liste af filer til sikkerhedskopiering"
 
-#: gnu/packages/backup.scm:260
+#: gnu/packages/backup.scm:291
 msgid ""
 "Rdup is a utility inspired by rsync and the plan9 way of doing backups.\n"
 "Rdup itself does not backup anything, it only print a list of absolute\n"
@@ -847,11 +935,11 @@ msgstr ""
 "skripter er krævet til for det videre arbejde med denne liste og\n"
 "implementering af sikkerhedskopistrategien."
 
-#: gnu/packages/backup.scm:290
+#: gnu/packages/backup.scm:321
 msgid "Tar-compatible archiver"
 msgstr "Tar-kompatibelt arkivprogram"
 
-#: gnu/packages/backup.scm:292
+#: gnu/packages/backup.scm:323
 msgid ""
 "Btar is a tar-compatible archiver which allows arbitrary compression and\n"
 "ciphering, redundancy, differential backup, indexed extraction, multicore\n"
@@ -863,11 +951,11 @@ msgstr ""
 "indekseret udtrækning, komprimering med flere kerner, inddata- og uddata-\n"
 "serialisering, og tolerance for delvise arkivfejl."
 
-#: gnu/packages/backup.scm:320
+#: gnu/packages/backup.scm:349
 msgid "Local/remote mirroring+incremental backup"
 msgstr "Lokal/ekstern spejlning+trinvis sikkerhedskopiering"
 
-#: gnu/packages/backup.scm:322
+#: gnu/packages/backup.scm:351
 msgid ""
 "Rdiff-backup backs up one directory to another, possibly over a network.\n"
 "The target directory ends up a copy of the source directory, but extra reverse\n"
@@ -895,23 +983,11 @@ msgstr ""
 "placering og kun forskellene vil blive overført. Endelig er rdiff-backup\n"
 "nem at bruge og startopsætningen er lavet med fornuftige standarder."
 
-#: gnu/packages/backup.scm:369
-msgid "Deduplicating backup program"
-msgstr ""
-
-#: gnu/packages/backup.scm:370
-msgid ""
-"Attic is a deduplicating backup program.  The main goal of\n"
-"Attic is to provide an efficient and secure way to backup data.  The data\n"
-"deduplication technique used makes Attic suitable for daily backups since only\n"
-"changes are stored."
-msgstr ""
-
-#: gnu/packages/backup.scm:406
+#: gnu/packages/backup.scm:393
 msgid "Tools & library for data backup and distributed storage"
 msgstr ""
 
-#: gnu/packages/backup.scm:408
+#: gnu/packages/backup.scm:395
 msgid ""
 "Libchop is a set of utilities and library for data backup and\n"
 "distributed storage.  Its main application is @command{chop-backup}, an\n"
@@ -922,11 +998,11 @@ msgid ""
 "detection, and lossless compression."
 msgstr ""
 
-#: gnu/packages/backup.scm:461
+#: gnu/packages/backup.scm:491
 msgid "Deduplicated, encrypted, authenticated and compressed backups"
 msgstr ""
 
-#: gnu/packages/backup.scm:462
+#: gnu/packages/backup.scm:492
 msgid ""
 "Borg is a deduplicating backup program.  Optionally, it\n"
 "supports compression and authenticated encryption.  The main goal of Borg is to\n"
@@ -936,11 +1012,23 @@ msgid ""
 "to not fully trusted targets.  Borg is a fork of Attic."
 msgstr ""
 
-#: gnu/packages/base.scm:67
+#: gnu/packages/backup.scm:538
+msgid "Deduplicating backup program"
+msgstr ""
+
+#: gnu/packages/backup.scm:539
+msgid ""
+"Attic is a deduplicating backup program.  The main goal of\n"
+"Attic is to provide an efficient and secure way to backup data.  The data\n"
+"deduplication technique used makes Attic suitable for daily backups since only\n"
+"changes are stored."
+msgstr ""
+
+#: gnu/packages/base.scm:70
 msgid "Hello, GNU world: An example GNU package"
 msgstr "Hej, GNU-verden: Et eksempel på en GNU-pakke"
 
-#: gnu/packages/base.scm:69
+#: gnu/packages/base.scm:72
 msgid ""
 "GNU Hello prints the message \"Hello, world!\" and then exits.  It\n"
 "serves as an example of standard GNU coding practices.  As such, it supports\n"
@@ -951,11 +1039,11 @@ msgstr ""
 "sådan understøtter programmer parametre på kommandolinjen, flere\n"
 "sprog og så videre."
 
-#: gnu/packages/base.scm:89
+#: gnu/packages/base.scm:106
 msgid "Print lines matching a pattern"
 msgstr "Udskriv linjer der matcher et mønster"
 
-#: gnu/packages/base.scm:91
+#: gnu/packages/base.scm:108
 msgid ""
 "grep is a tool for finding text inside files.  Text is found by\n"
 "matching a pattern provided by the user in one or many files.  The pattern\n"
@@ -974,11 +1062,11 @@ msgstr ""
 "grep tilbyder mange udvidelser i forhold til standardredskabet,\n"
 "inklusiv rekursiv mappesøgning."
 
-#: gnu/packages/base.scm:114
+#: gnu/packages/base.scm:131
 msgid "Stream editor"
 msgstr "Strømredigeringsprogram"
 
-#: gnu/packages/base.scm:129
+#: gnu/packages/base.scm:146
 msgid ""
 "Sed is a non-interactive, text stream editor.  It receives a text\n"
 "input from a file or from standard input and it then applies a series of text\n"
@@ -992,11 +1080,11 @@ msgstr ""
 "tekstmønster i en strøm. GNU-implementeringen tilbyder flere\n"
 "udvidelser i forhold til standardredskabet."
 
-#: gnu/packages/base.scm:151
+#: gnu/packages/base.scm:185
 msgid "Managing tar archives"
 msgstr "Håndtering af tar-arkiver"
 
-#: gnu/packages/base.scm:153
+#: gnu/packages/base.scm:187
 msgid ""
 "Tar provides the ability to create tar archives, as well as the\n"
 "ability to extract, update or list files in an existing archive.  It is\n"
@@ -1011,11 +1099,11 @@ msgstr ""
 "mappestruktur og filinformation såsom rettigheder og oprettelse/ændrings-\n"
 "datoer bevares. GNU tar tilbyder mange udvidelser over standardredskabet."
 
-#: gnu/packages/base.scm:176
+#: gnu/packages/base.scm:210
 msgid "Apply differences to originals, with optional backups"
 msgstr "Anvend forskelle på originaler, med valgfri sikkerhedskopiering"
 
-#: gnu/packages/base.scm:178
+#: gnu/packages/base.scm:212
 msgid ""
 "Patch is a program that applies changes to files based on differences\n"
 "laid out as by the program \"diff\".  The changes may be applied to one or more\n"
@@ -1029,11 +1117,11 @@ msgstr ""
 "forskellige diff-formater. Det kan også bruges til at tilbageføre\n"
 "tidligere anvendte forskelle."
 
-#: gnu/packages/base.scm:198
+#: gnu/packages/base.scm:232
 msgid "Comparing and merging files"
 msgstr "Sammenligning og sammenføjning af filer"
 
-#: gnu/packages/base.scm:200
+#: gnu/packages/base.scm:234
 msgid ""
 "GNU Diffutils is a package containing tools for finding the\n"
 "differences between files.  The \"diff\" command is used to show how two files\n"
@@ -1047,11 +1135,11 @@ msgstr ""
 "de er forskellige. »diff3« giver dig mulighed for at sammenligne tre filer.\n"
 "Endelig tilbyder »sdiff« en interaktiv måde at sammenføje to filer."
 
-#: gnu/packages/base.scm:232
+#: gnu/packages/base.scm:266
 msgid "Operating on files matching given criteria"
 msgstr "Operation på filer der matcher angivne kriterier"
 
-#: gnu/packages/base.scm:234
+#: gnu/packages/base.scm:268
 msgid ""
 "Findutils supplies the basic file directory searching utilities of the\n"
 "GNU system.  It consists of two primary searching utilities: \"find\"\n"
@@ -1067,11 +1155,11 @@ msgstr ""
 "ekstra værktøjer er inkluderet: »updatedb« opdaterer filnavnsdatabasen\n"
 "og »xargs« kan bruges til at anvende kommandoer med arbitrært lange argumenter."
 
-#: gnu/packages/base.scm:298
+#: gnu/packages/base.scm:323
 msgid "Core GNU utilities (file, text, shell)"
 msgstr "Core GNU-redskaber (file, text, shell)"
 
-#: gnu/packages/base.scm:300
+#: gnu/packages/base.scm:325
 msgid ""
 "GNU Coreutils includes all of the basic command-line tools that are\n"
 "expected in a POSIX system.  These provide the basic file, shell and text\n"
@@ -1084,11 +1172,11 @@ msgstr ""
 "af disse værktøjer tilbyder udvidet funktionalitet udover det skitseret\n"
 "i POSIX-standarden."
 
-#: gnu/packages/base.scm:342
+#: gnu/packages/base.scm:367
 msgid "Remake files automatically"
 msgstr "Gendan filer automatisk"
 
-#: gnu/packages/base.scm:344
+#: gnu/packages/base.scm:369
 msgid ""
 "Make is a program that is used to control the production of\n"
 "executables or other files from their source files.  The process is\n"
@@ -1105,11 +1193,11 @@ msgstr ""
 "gendannes efter at deres kilder har ændret sig. GNU make tilbyder\n"
 "mange funktionsrige udvidelser der ligger udover standardredskabet."
 
-#: gnu/packages/base.scm:389
+#: gnu/packages/base.scm:415
 msgid "Binary utilities: bfd gas gprof ld"
 msgstr "Binære redskaber: bfd gas gprof ld"
 
-#: gnu/packages/base.scm:391
+#: gnu/packages/base.scm:417
 msgid ""
 "GNU Binutils is a collection of tools for working with binary files.\n"
 "Perhaps the most notable are \"ld\", a linker, and \"as\", an assembler.\n"
@@ -1119,22 +1207,22 @@ msgid ""
 "included."
 msgstr ""
 
-#: gnu/packages/base.scm:456
+#: gnu/packages/base.scm:491
 msgid "The linker wrapper"
 msgstr ""
 
-#: gnu/packages/base.scm:458
+#: gnu/packages/base.scm:493
 msgid ""
 "The linker wrapper (or 'ld-wrapper') wraps the linker to add any\n"
 "missing '-rpath' flags, and to detect any misuse of libraries outside of the\n"
 "store."
 msgstr ""
 
-#: gnu/packages/base.scm:639
+#: gnu/packages/base.scm:667
 msgid "The GNU C Library"
 msgstr ""
 
-#: gnu/packages/base.scm:641
+#: gnu/packages/base.scm:669
 msgid ""
 "Any Unix-like operating system needs a C library: the library which\n"
 "defines the \"system calls\" and other basic facilities such as open, malloc,\n"
@@ -1144,47 +1232,47 @@ msgid ""
 "with the Linux kernel."
 msgstr ""
 
-#: gnu/packages/base.scm:672
+#: gnu/packages/base.scm:732
+msgid "The GNU C Library (GNU Hurd variant)"
+msgstr "GNU C-biblioteket (GNU Hurd-variant)"
+
+#: gnu/packages/base.scm:804
 msgid "All the locales supported by the GNU C Library"
 msgstr ""
 
-#: gnu/packages/base.scm:674
+#: gnu/packages/base.scm:806
 msgid ""
 "This package provides all the locales supported by the GNU C Library,\n"
 "more than 400 in total.  To use them set the 'LOCPATH' environment variable to\n"
 "the 'share/locale' sub-directory of this package."
 msgstr ""
 
-#: gnu/packages/base.scm:742
+#: gnu/packages/base.scm:874
 msgid "Small sample of UTF-8 locales"
 msgstr ""
 
-#: gnu/packages/base.scm:744
+#: gnu/packages/base.scm:876
 msgid ""
 "This package provides a small sample of UTF-8 locales mostly useful in\n"
 "test environments."
 msgstr ""
 
-#: gnu/packages/base.scm:762
+#: gnu/packages/base.scm:894
 msgid "Find full path of shell commands"
 msgstr ""
 
-#: gnu/packages/base.scm:764
+#: gnu/packages/base.scm:896
 msgid ""
 "The which program finds the location of executables in PATH, with a\n"
 "variety of options.  It is an alternative to the shell \"type\" built-in\n"
 "command."
 msgstr ""
 
-#: gnu/packages/base.scm:833
-msgid "The GNU C Library (GNU Hurd variant)"
-msgstr "GNU C-biblioteket (GNU Hurd-variant)"
-
-#: gnu/packages/base.scm:935
+#: gnu/packages/base.scm:1001
 msgid "Database of current and historical time zones"
 msgstr ""
 
-#: gnu/packages/base.scm:936
+#: gnu/packages/base.scm:1002
 msgid ""
 "The Time Zone Database (often called tz or zoneinfo)\n"
 "contains code and data that represent the history of local time for many\n"
@@ -1193,22 +1281,22 @@ msgid ""
 "and daylight-saving rules."
 msgstr ""
 
-#: gnu/packages/base.scm:962
+#: gnu/packages/base.scm:1028
 msgid "Character set conversion library"
 msgstr "Bibliotek til konvertering af tegnsæt"
 
-#: gnu/packages/base.scm:964
+#: gnu/packages/base.scm:1030
 msgid ""
 "libiconv provides an implementation of the iconv function for systems\n"
 "that lack it.  iconv is used to convert between character encodings in a\n"
 "program.  It supports a wide variety of different encodings."
 msgstr ""
 
-#: gnu/packages/bittorrent.scm:95
+#: gnu/packages/bittorrent.scm:102
 msgid "Fast and easy BitTorrent client"
 msgstr ""
 
-#: gnu/packages/bittorrent.scm:97
+#: gnu/packages/bittorrent.scm:104
 msgid ""
 "Transmission is a BitTorrent client that comes with graphical,\n"
 "textual, and Web user interfaces.  Transmission also has a daemon for\n"
@@ -1216,49 +1304,74 @@ msgid ""
 "DHT, µTP, PEX and Magnet Links."
 msgstr ""
 
-#: gnu/packages/bittorrent.scm:129
+#: gnu/packages/bittorrent.scm:136
 msgid "BitTorrent library of rtorrent"
 msgstr "BitTorrent-bibliotek for rtorrent"
 
-#: gnu/packages/bittorrent.scm:131
+#: gnu/packages/bittorrent.scm:138
 msgid ""
 "LibTorrent is a BitTorrent library used by and developed in parallel\n"
 "with the BitTorrent client rtorrent.  It is written in C++ with emphasis on\n"
 "speed and efficiency."
 msgstr ""
 
-#: gnu/packages/bittorrent.scm:158
+#: gnu/packages/bittorrent.scm:165
 msgid "BitTorrent client with ncurses interface"
 msgstr ""
 
-#: gnu/packages/bittorrent.scm:160
+#: gnu/packages/bittorrent.scm:167
 msgid ""
 "rTorrent is a BitTorrent client with an ncurses interface.  It supports\n"
 "full encryption, DHT, PEX, and Magnet Links.  It can also be controlled via\n"
 "XML-RPC over SCGI."
 msgstr ""
 
-#: gnu/packages/bittorrent.scm:201
+#: gnu/packages/bittorrent.scm:208
 msgid "Console client for the Transmission BitTorrent daemon"
 msgstr ""
 
-#: gnu/packages/bittorrent.scm:202
+#: gnu/packages/bittorrent.scm:209
 msgid ""
 "Transmission-remote-cli is a console client, with a curses\n"
 "interface, for the Transmission BitTorrent daemon."
 msgstr ""
 
-#: gnu/packages/bittorrent.scm:245
+#: gnu/packages/bittorrent.scm:254
 msgid "Utility for parallel downloading files"
 msgstr "Redskab for parallel overførsel af filer"
 
-#: gnu/packages/bittorrent.scm:247
+#: gnu/packages/bittorrent.scm:256
 msgid ""
 "Aria2 is a lightweight, multi-protocol & multi-source command-line\n"
 "download utility.  It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink.\n"
 "Aria2 can be manipulated via built-in JSON-RPC and XML-RPC interfaces."
 msgstr ""
 
+#: gnu/packages/bittorrent.scm:289
+msgid "Universal download manager with GTK+ interface"
+msgstr ""
+
+#: gnu/packages/bittorrent.scm:291
+msgid ""
+"uGet is portable download manager with GTK+ interface supporting\n"
+"HTTP, HTTPS, BitTorrent and Metalink, supporting multi-connection\n"
+"downloads, download scheduling, download rate limiting."
+msgstr ""
+
+#: gnu/packages/bittorrent.scm:319
+msgid "Utility to create BitTorrent metainfo files"
+msgstr "Redskab til at oprette BitTorrent-metainfofiler"
+
+#: gnu/packages/bittorrent.scm:320
+msgid ""
+"mktorrent is a simple command-line utility to create\n"
+"BitTorrent @dfn{metainfo} files, often known simply as @dfn{torrents}, from\n"
+"both single files and whole directories.  It can add multiple trackers and web\n"
+"seed URLs, and set the @code{private} flag to disallow advertisement through\n"
+"the distributed hash table (DHT) and Peer Exchange.  Hashing is multi-threaded\n"
+"and will take advantage of multiple processor cores where possible."
+msgstr ""
+
 #: gnu/packages/certs.scm:65
 msgid "Python script to extract .pem data from certificate collection"
 msgstr ""
@@ -1280,11 +1393,11 @@ msgid ""
 "taken from the NSS package and thus ultimately from the Mozilla project."
 msgstr ""
 
-#: gnu/packages/compression.scm:80
+#: gnu/packages/compression.scm:83
 msgid "Compression library"
 msgstr ""
 
-#: gnu/packages/compression.scm:82
+#: gnu/packages/compression.scm:85
 msgid ""
 "zlib is designed to be a free, general-purpose, legally unencumbered --\n"
 "that is, not covered by any patents -- lossless data-compression library for\n"
@@ -1297,31 +1410,31 @@ msgid ""
 "in compression."
 msgstr ""
 
-#: gnu/packages/compression.scm:107
+#: gnu/packages/compression.scm:110
 msgid "Replacement for Sun's 'jar' utility"
 msgstr ""
 
-#: gnu/packages/compression.scm:109
+#: gnu/packages/compression.scm:112
 msgid ""
 "FastJar is an attempt to create a much faster replacement for Sun's 'jar'\n"
 "utility.  Instead of being written in Java, FastJar is written in C."
 msgstr ""
 
-#: gnu/packages/compression.scm:143
+#: gnu/packages/compression.scm:146
 msgid "C library for manipulating POSIX tar files"
 msgstr ""
 
-#: gnu/packages/compression.scm:145
+#: gnu/packages/compression.scm:148
 msgid ""
 "libtar is a C library for manipulating POSIX tar files.  It handles\n"
 "adding and extracting files to/from a tar archive."
 msgstr ""
 
-#: gnu/packages/compression.scm:162
+#: gnu/packages/compression.scm:165
 msgid "General file (de)compression (using lzw)"
 msgstr ""
 
-#: gnu/packages/compression.scm:167
+#: gnu/packages/compression.scm:170
 msgid ""
 "GNU Gzip provides data compression and decompression utilities; the\n"
 "typical extension is \".gz\".  Unlike the \"zip\" format, it compresses a single\n"
@@ -1329,11 +1442,11 @@ msgid ""
 "\".tar.gz\" or \".tgz\", etc."
 msgstr ""
 
-#: gnu/packages/compression.scm:243
+#: gnu/packages/compression.scm:246
 msgid "High-quality data compression program"
 msgstr ""
 
-#: gnu/packages/compression.scm:245
+#: gnu/packages/compression.scm:248
 msgid ""
 "bzip2 is a freely available, patent free (see below), high-quality data\n"
 "compressor.  It typically compresses files to within 10% to 15% of the best\n"
@@ -1342,11 +1455,11 @@ msgid ""
 "decompression."
 msgstr ""
 
-#: gnu/packages/compression.scm:266
+#: gnu/packages/compression.scm:269
 msgid "Parallel bzip2 compression utility"
 msgstr ""
 
-#: gnu/packages/compression.scm:268
+#: gnu/packages/compression.scm:271
 msgid ""
 "lbzip2 is a multi-threaded compression utility with support for the\n"
 "bzip2 compressed file format.  lbzip2 can process standard bz2 files in\n"
@@ -1356,11 +1469,11 @@ msgid ""
 "compatible with bzip2 – both at file format and command line level."
 msgstr ""
 
-#: gnu/packages/compression.scm:298
+#: gnu/packages/compression.scm:301
 msgid "Parallel bzip2 implementation"
 msgstr ""
 
-#: gnu/packages/compression.scm:300
+#: gnu/packages/compression.scm:303
 msgid ""
 "Pbzip2 is a parallel implementation of the bzip2 block-sorting file\n"
 "compressor that uses pthreads and achieves near-linear speedup on SMP machines.\n"
@@ -1368,11 +1481,11 @@ msgid ""
 "compressed with pbzip2 can be decompressed with bzip2)."
 msgstr ""
 
-#: gnu/packages/compression.scm:321
+#: gnu/packages/compression.scm:324
 msgid "General-purpose data compression"
 msgstr ""
 
-#: gnu/packages/compression.scm:323
+#: gnu/packages/compression.scm:326
 msgid ""
 "XZ Utils is free general-purpose data compression software with high\n"
 "compression ratio.  XZ Utils were written for POSIX-like systems, but also\n"
@@ -1385,11 +1498,11 @@ msgid ""
 "than gzip and 15 % smaller output than bzip2."
 msgstr ""
 
-#: gnu/packages/compression.scm:351
+#: gnu/packages/compression.scm:354
 msgid "Data compression library suitable for real-time data de-/compression"
 msgstr ""
 
-#: gnu/packages/compression.scm:353
+#: gnu/packages/compression.scm:356
 msgid ""
 "LZO is a data compression library which is suitable for data\n"
 "de-/compression in real-time.  This means it favours speed over\n"
@@ -1399,11 +1512,11 @@ msgid ""
 "format are designed to be portable across platforms."
 msgstr ""
 
-#: gnu/packages/compression.scm:376
+#: gnu/packages/compression.scm:379
 msgid "Compress or expand files"
 msgstr ""
 
-#: gnu/packages/compression.scm:378
+#: gnu/packages/compression.scm:381
 msgid ""
 "Lzop is a file compressor which is very similar to gzip.  Lzop uses the\n"
 "LZO data compression library for compression services, and its main advantages\n"
@@ -1411,11 +1524,11 @@ msgid ""
 "some compression ratio)."
 msgstr ""
 
-#: gnu/packages/compression.scm:397
+#: gnu/packages/compression.scm:400
 msgid "Lossless data compressor based on the LZMA algorithm"
 msgstr ""
 
-#: gnu/packages/compression.scm:399
+#: gnu/packages/compression.scm:402
 msgid ""
 "Lzip is a lossless data compressor with a user interface similar to the\n"
 "one of gzip or bzip2.  Lzip decompresses almost as fast as gzip and compresses\n"
@@ -1423,11 +1536,11 @@ msgid ""
 "archiving.  Lzip is a clean implementation of the LZMA algorithm."
 msgstr ""
 
-#: gnu/packages/compression.scm:431
+#: gnu/packages/compression.scm:434
 msgid "Archives in shell scripts, uuencode/uudecode"
 msgstr ""
 
-#: gnu/packages/compression.scm:433
+#: gnu/packages/compression.scm:436
 msgid ""
 "GNU sharutils is a package for creating and manipulating shell\n"
 "archives that can be readily emailed.  A shell archive is a file that can be\n"
@@ -1435,71 +1548,71 @@ msgid ""
 "This package is mostly for compatibility and historical interest."
 msgstr ""
 
-#: gnu/packages/compression.scm:464
+#: gnu/packages/compression.scm:467
 msgid "Library for SoundFont decompression"
 msgstr ""
 
-#: gnu/packages/compression.scm:466
+#: gnu/packages/compression.scm:469
 msgid ""
 "SfArkLib is a C++ library for decompressing SoundFont files compressed\n"
 "with the sfArk algorithm."
 msgstr ""
 
-#: gnu/packages/compression.scm:499
+#: gnu/packages/compression.scm:502
 msgid "Basic sfArk decompressor"
 msgstr ""
 
-#: gnu/packages/compression.scm:500
+#: gnu/packages/compression.scm:503
 msgid ""
 "SfArk extractor converts SoundFonts in the compressed legacy\n"
 "sfArk file format to the uncompressed sf2 format."
 msgstr ""
 
-#: gnu/packages/compression.scm:517
+#: gnu/packages/compression.scm:520
 msgid "Compression tools for some formats used by Microsoft"
 msgstr ""
 
-#: gnu/packages/compression.scm:519
+#: gnu/packages/compression.scm:522
 msgid ""
 "The purpose of libmspack is to provide both compression and\n"
 "decompression of some loosely related file formats used by Microsoft."
 msgstr ""
 
-#: gnu/packages/compression.scm:538
+#: gnu/packages/compression.scm:541
 msgid "Low-level interface to bzip2 compression library"
 msgstr ""
 
-#: gnu/packages/compression.scm:539
+#: gnu/packages/compression.scm:542
 msgid ""
 "This module provides a Perl interface to the bzip2\n"
 "compression library."
 msgstr ""
 
-#: gnu/packages/compression.scm:573
+#: gnu/packages/compression.scm:576
 msgid "Low-level interface to zlib compression library"
 msgstr ""
 
-#: gnu/packages/compression.scm:574
+#: gnu/packages/compression.scm:577
 msgid ""
 "This module provides a Perl interface to the zlib\n"
 "compression library."
 msgstr ""
 
-#: gnu/packages/compression.scm:595
+#: gnu/packages/compression.scm:598
 msgid "IO Interface to compressed files/buffers"
 msgstr ""
 
-#: gnu/packages/compression.scm:596
+#: gnu/packages/compression.scm:599
 msgid ""
 "IO-Compress provides a Perl interface to allow reading and\n"
 "writing of compressed data created with the zlib and bzip2 libraries."
 msgstr ""
 
-#: gnu/packages/compression.scm:622
+#: gnu/packages/compression.scm:625
 msgid "Compression algorithm focused on speed"
 msgstr ""
 
-#: gnu/packages/compression.scm:623
+#: gnu/packages/compression.scm:626
 msgid ""
 "LZ4 is a lossless compression algorithm, providing\n"
 "compression speed at 400 MB/s per core (0.16 Bytes/cycle).  It also features an\n"
@@ -1508,35 +1621,35 @@ msgid ""
 "time for compression ratio."
 msgstr ""
 
-#: gnu/packages/compression.scm:664
-msgid "Tools to create and extract squashfs filesystems"
+#: gnu/packages/compression.scm:667
+msgid "Tools to create and extract squashfs file systems"
 msgstr ""
 
-#: gnu/packages/compression.scm:666
+#: gnu/packages/compression.scm:669
 msgid ""
-"Squashfs is a highly compressed read-only filesystem for Linux.  It uses\n"
+"Squashfs is a highly compressed read-only file system for Linux.  It uses\n"
 "zlib to compress files, inodes, and directories.  All blocks are packed to\n"
 "minimize the data overhead, and block sizes of between 4K and 1M are supported.\n"
 "It is intended to be used for archival use, for live CDs, and for embedded\n"
 "systems where low overhead is needed.  This package allows you to create and\n"
-"extract such filesystems."
+"extract such file systems."
 msgstr ""
 
-#: gnu/packages/compression.scm:703
+#: gnu/packages/compression.scm:706
 msgid "Parallel implementation of gzip"
 msgstr ""
 
-#: gnu/packages/compression.scm:705
+#: gnu/packages/compression.scm:708
 msgid ""
 "This package provides a parallel implementation of gzip that exploits\n"
 "multiple processors and multiple cores when compressing data."
 msgstr ""
 
-#: gnu/packages/compression.scm:729
+#: gnu/packages/compression.scm:732
 msgid "Parallel indexing implementation of LZMA"
 msgstr ""
 
-#: gnu/packages/compression.scm:731
+#: gnu/packages/compression.scm:734
 msgid ""
 "The existing XZ Utils provide great compression in the .xz file format,\n"
 "but they produce just one big block of compressed data.  Pixz instead produces\n"
@@ -1545,11 +1658,11 @@ msgid ""
 "tarballs."
 msgstr ""
 
-#: gnu/packages/compression.scm:772
+#: gnu/packages/compression.scm:775
 msgid "Implementation of the Brotli compression algorithm"
 msgstr ""
 
-#: gnu/packages/compression.scm:774
+#: gnu/packages/compression.scm:777
 msgid ""
 "Brotli is a general-purpose lossless compression algorithm.  It is\n"
 "similar in speed to deflate but offers denser compression.  This package\n"
@@ -1557,19 +1670,19 @@ msgid ""
 "respectively, based on the reference implementation from Google."
 msgstr ""
 
-#: gnu/packages/compression.scm:798
+#: gnu/packages/compression.scm:801
 msgid "Tool to unpack Cabinet archives"
 msgstr ""
 
-#: gnu/packages/compression.scm:799
+#: gnu/packages/compression.scm:802
 msgid "Extracts files out of Microsoft Cabinet (.cab) archives"
 msgstr ""
 
-#: gnu/packages/compression.scm:831
+#: gnu/packages/compression.scm:834
 msgid "Delta encoder for binary files"
 msgstr ""
 
-#: gnu/packages/compression.scm:832
+#: gnu/packages/compression.scm:835
 msgid ""
 "xdelta encodes only the differences between two binary files\n"
 "using the VCDIFF algorithm and patch file format described in RFC 3284.  It can\n"
@@ -1578,11 +1691,11 @@ msgid ""
 "human-readable output."
 msgstr ""
 
-#: gnu/packages/compression.scm:864
+#: gnu/packages/compression.scm:867
 msgid "Large file compressor with a very high compression ratio"
 msgstr ""
 
-#: gnu/packages/compression.scm:865
+#: gnu/packages/compression.scm:868
 msgid ""
 "lrzip is a compression utility that uses long-range\n"
 "redundancy reduction to improve the subsequent compression ratio of\n"
@@ -1593,63 +1706,97 @@ msgid ""
 "well as bzip2."
 msgstr ""
 
-#: gnu/packages/databases.scm:109
+#: gnu/packages/compression.scm:892
+msgid "Fast compressor/decompressor"
+msgstr ""
+
+#: gnu/packages/compression.scm:893
+msgid ""
+"Snappy is a compression/decompression library. It does not\n"
+"aim for maximum compression, or compatibility with any other compression library;\n"
+"instead, it aims for very high speeds and reasonable compression. For instance,\n"
+"compared to the fastest mode of zlib, Snappy is an order of magnitude faster\n"
+"for most inputs, but the resulting compressed files are anywhere from 20% to\n"
+"100% bigger."
+msgstr ""
+
+#: gnu/packages/compression.scm:960
+msgid "Command-line file archiver with high compression ratio"
+msgstr ""
+
+#: gnu/packages/compression.scm:961
+msgid ""
+"p7zip is a command-line port of 7-Zip, a file archiver that\n"
+"handles the 7z format which features very high compression ratios."
+msgstr ""
+
+#: gnu/packages/compression.scm:1000
+msgid "Compressed C++ iostream"
+msgstr ""
+
+#: gnu/packages/compression.scm:1001
+msgid ""
+"gzstream is a small library for providing zlib\n"
+"functionality in a C++ iostream."
+msgstr ""
+
+#: gnu/packages/databases.scm:116
 msgid "Clustered RDF storage and query engine"
 msgstr ""
 
-#: gnu/packages/databases.scm:110
+#: gnu/packages/databases.scm:117
 msgid ""
 "4store is a RDF/SPARQL store written in C, supporting\n"
 "either single machines or networked clusters."
 msgstr ""
 
-#: gnu/packages/databases.scm:129
+#: gnu/packages/databases.scm:136
 msgid "Hash library of database functions compatible with traditional dbm"
 msgstr ""
 
-#: gnu/packages/databases.scm:131
+#: gnu/packages/databases.scm:138
 msgid ""
 "GDBM is a library for manipulating hashed databases.  It is used to\n"
 "store key/value pairs in a file in a manner similar to the Unix dbm library\n"
 "and provides interfaces to the traditional file format."
 msgstr ""
 
-#: gnu/packages/databases.scm:177
+#: gnu/packages/databases.scm:189
 msgid "Berkeley database"
 msgstr ""
 
-#: gnu/packages/databases.scm:179
+#: gnu/packages/databases.scm:191
 msgid ""
 "Berkeley DB is an embeddable database allowing developers the choice of\n"
 "SQL, Key/Value, XML/XQuery or Java Object storage for their data model."
 msgstr ""
 
-#: gnu/packages/databases.scm:253
+#: gnu/packages/databases.scm:278
 msgid "Fast, easy to use, and popular database"
 msgstr ""
 
-#: gnu/packages/databases.scm:255
+#: gnu/packages/databases.scm:280
 msgid ""
 "MySQL is a fast, reliable, and easy to use relational database\n"
 "management system that supports the standardized Structured Query\n"
 "Language."
 msgstr ""
 
-#: gnu/packages/databases.scm:322
+#: gnu/packages/databases.scm:347
 msgid "SQL database server"
 msgstr ""
 
-#: gnu/packages/databases.scm:324
+#: gnu/packages/databases.scm:349
 msgid ""
 "MariaDB is a multi-user and multi-threaded SQL database server, designed\n"
 "as a drop-in replacement of MySQL."
 msgstr ""
 
-#: gnu/packages/databases.scm:354
+#: gnu/packages/databases.scm:379
 msgid "Powerful object-relational database system"
 msgstr ""
 
-#: gnu/packages/databases.scm:356
+#: gnu/packages/databases.scm:381
 msgid ""
 "PostgreSQL is a powerful object-relational database system.  It is fully\n"
 "ACID compliant, has full support for foreign keys, joins, views, triggers, and\n"
@@ -1659,11 +1806,11 @@ msgid ""
 "pictures, sounds, or video."
 msgstr ""
 
-#: gnu/packages/databases.scm:394
+#: gnu/packages/databases.scm:436
 msgid "Manipulate plain text files as databases"
 msgstr ""
 
-#: gnu/packages/databases.scm:396
+#: gnu/packages/databases.scm:438
 msgid ""
 "GNU Recutils is a set of tools and libraries for creating and\n"
 "manipulating text-based, human-editable databases.  Despite being text-based,\n"
@@ -1672,11 +1819,11 @@ msgid ""
 "types are supported, as is encryption."
 msgstr ""
 
-#: gnu/packages/databases.scm:453
+#: gnu/packages/databases.scm:495
 msgid "Command-line tool for accessing SPARQL endpoints over HTTP"
 msgstr ""
 
-#: gnu/packages/databases.scm:454
+#: gnu/packages/databases.scm:496
 msgid ""
 "Sparql-query is a command-line tool for accessing SPARQL\n"
 "endpoints over HTTP.  It has been intentionally designed to 'feel' similar to\n"
@@ -1687,11 +1834,11 @@ msgid ""
 "for example from a shell script."
 msgstr ""
 
-#: gnu/packages/databases.scm:509
+#: gnu/packages/databases.scm:553
 msgid "The SQLite database management system"
 msgstr ""
 
-#: gnu/packages/databases.scm:511
+#: gnu/packages/databases.scm:555
 msgid ""
 "SQLite is a software library that implements a self-contained, serverless,\n"
 "zero-configuration, transactional SQL database engine.  SQLite is the most\n"
@@ -1699,11 +1846,11 @@ msgid ""
 "is in the public domain."
 msgstr ""
 
-#: gnu/packages/databases.scm:546
+#: gnu/packages/databases.scm:610
 msgid "Trivial database"
 msgstr ""
 
-#: gnu/packages/databases.scm:548
+#: gnu/packages/databases.scm:612
 msgid ""
 "TDB is a Trivial Database.  In concept, it is very much like GDBM,\n"
 "and BSD's DB except that it allows multiple simultaneous writers and uses\n"
@@ -1711,19 +1858,19 @@ msgid ""
 "extremely small."
 msgstr ""
 
-#: gnu/packages/databases.scm:567
+#: gnu/packages/databases.scm:631
 msgid "Database independent interface for Perl"
 msgstr ""
 
-#: gnu/packages/databases.scm:568
+#: gnu/packages/databases.scm:632
 msgid "This package provides an database interface for Perl."
 msgstr ""
 
-#: gnu/packages/databases.scm:615
+#: gnu/packages/databases.scm:679
 msgid "Extensible and flexible object <-> relational mapper"
 msgstr ""
 
-#: gnu/packages/databases.scm:616
+#: gnu/packages/databases.scm:680
 msgid ""
 "An SQL to OO mapper with an object API inspired by\n"
 "Class::DBI (with a compatibility layer as a springboard for porting) and a\n"
@@ -1735,21 +1882,21 @@ msgid ""
 "\"ORDER BY\" and \"HAVING\" support."
 msgstr ""
 
-#: gnu/packages/databases.scm:646
+#: gnu/packages/databases.scm:710
 msgid "Cursor with built-in caching support"
 msgstr ""
 
-#: gnu/packages/databases.scm:647
+#: gnu/packages/databases.scm:711
 msgid ""
 "DBIx::Class::Cursor::Cached provides a cursor class with\n"
 "built-in caching support."
 msgstr ""
 
-#: gnu/packages/databases.scm:667
+#: gnu/packages/databases.scm:731
 msgid "Introspect many-to-many relationships"
 msgstr ""
 
-#: gnu/packages/databases.scm:668
+#: gnu/packages/databases.scm:732
 msgid ""
 "Because the many-to-many relationships are not real\n"
 "relationships, they can not be introspected with DBIx::Class.  Many-to-many\n"
@@ -1759,22 +1906,22 @@ msgid ""
 "introspected and examined."
 msgstr ""
 
-#: gnu/packages/databases.scm:725
+#: gnu/packages/databases.scm:789
 msgid "Create a DBIx::Class::Schema based on a database"
 msgstr "Opret et DBIx::Class::Schema baseret på en database"
 
-#: gnu/packages/databases.scm:726
+#: gnu/packages/databases.scm:790
 msgid ""
 "DBIx::Class::Schema::Loader automates the definition of a\n"
 "DBIx::Class::Schema by scanning database table definitions and setting up the\n"
 "columns, primary keys, unique constraints and relationships."
 msgstr ""
 
-#: gnu/packages/databases.scm:750
+#: gnu/packages/databases.scm:814
 msgid "DBI PostgreSQL interface"
 msgstr "DBI PostgreSQL-grænseflade"
 
-#: gnu/packages/databases.scm:751
+#: gnu/packages/databases.scm:815
 msgid ""
 "This package provides a PostgreSQL driver for the Perl5\n"
 "@dfn{Database Interface} (DBI)."
@@ -1782,11 +1929,11 @@ msgstr ""
 "Denne pakke tilbyder en PostgreSQL-driver for Perl5-\n"
 "@dfn{Database Interface} (DBI)."
 
-#: gnu/packages/databases.scm:774
+#: gnu/packages/databases.scm:838
 msgid "DBI MySQL interface"
 msgstr "DBI MySQL-grænseflade"
 
-#: gnu/packages/databases.scm:775
+#: gnu/packages/databases.scm:839
 msgid ""
 "This package provides a MySQL driver for the Perl5\n"
 "@dfn{Database Interface} (DBI)."
@@ -1794,11 +1941,11 @@ msgstr ""
 "Denne pakke tilbyder en MySQL-driver for Perl5-\n"
 "@dfn{Database Interface} (DBI)."
 
-#: gnu/packages/databases.scm:794
+#: gnu/packages/databases.scm:858
 msgid "SQlite interface for Perl"
 msgstr "SQlite-grænseflade for Perl"
 
-#: gnu/packages/databases.scm:795
+#: gnu/packages/databases.scm:859
 msgid ""
 "DBD::SQLite is a Perl DBI driver for SQLite, that includes\n"
 "the entire thing in the distribution.  So in order to get a fast transaction\n"
@@ -1806,11 +1953,11 @@ msgid ""
 "module, and nothing else."
 msgstr ""
 
-#: gnu/packages/databases.scm:825
+#: gnu/packages/databases.scm:889
 msgid "Generate SQL from Perl data structures"
 msgstr "Opret SQL fra Perldatastrukturer"
 
-#: gnu/packages/databases.scm:826
+#: gnu/packages/databases.scm:890
 msgid ""
 "This module was inspired by the excellent DBIx::Abstract.\n"
 "While based on the concepts used by DBIx::Abstract, the concepts used have\n"
@@ -1820,43 +1967,43 @@ msgid ""
 "time your data changes."
 msgstr ""
 
-#: gnu/packages/databases.scm:855
+#: gnu/packages/databases.scm:919
 msgid "Split SQL code into atomic statements"
 msgstr ""
 
-#: gnu/packages/databases.scm:856
+#: gnu/packages/databases.scm:920
 msgid ""
 "This module tries to split any SQL code, even including\n"
 "non-standard extensions, into the atomic statements it is composed of."
 msgstr ""
 
-#: gnu/packages/databases.scm:874
+#: gnu/packages/databases.scm:938
 msgid "SQL tokenizer"
 msgstr ""
 
-#: gnu/packages/databases.scm:875
+#: gnu/packages/databases.scm:939
 msgid ""
 "SQL::Tokenizer is a tokenizer for SQL queries.  It does not\n"
 "claim to be a parser or query verifier.  It just creates sane tokens from a\n"
 "valid SQL query."
 msgstr ""
 
-#: gnu/packages/databases.scm:893
+#: gnu/packages/databases.scm:957
 msgid "Data source abstraction library"
 msgstr "Abstraktionsbibliotek for datakilde"
 
-#: gnu/packages/databases.scm:894
+#: gnu/packages/databases.scm:958
 msgid ""
 "Unixodbc is a library providing an API with which to access\n"
 "data sources.  Data sources include SQL Servers and any software with an ODBC\n"
 "Driver."
 msgstr ""
 
-#: gnu/packages/databases.scm:918
+#: gnu/packages/databases.scm:982
 msgid "In-memory key/value and document store"
 msgstr ""
 
-#: gnu/packages/databases.scm:920
+#: gnu/packages/databases.scm:984
 msgid ""
 "UnQLite is an in-process software library which implements a\n"
 "self-contained, serverless, zero-configuration, transactional NoSQL\n"
@@ -1865,33 +2012,33 @@ msgid ""
 "similar to BerkeleyDB, LevelDB, etc."
 msgstr ""
 
-#: gnu/packages/databases.scm:947
+#: gnu/packages/databases.scm:1012
 msgid "Key-value cache and store"
 msgstr ""
 
-#: gnu/packages/databases.scm:948
+#: gnu/packages/databases.scm:1013
 msgid ""
 "Redis is an advanced key-value cache and store.  Redis\n"
 "supports many data structures including strings, hashes, lists, sets, sorted\n"
 "sets, bitmaps and hyperloglogs."
 msgstr ""
 
-#: gnu/packages/databases.scm:974
+#: gnu/packages/databases.scm:1039
 msgid "Kyoto Cabinet is a modern implementation of the DBM database"
 msgstr ""
 
-#: gnu/packages/databases.scm:976
+#: gnu/packages/databases.scm:1041
 msgid ""
 "Kyoto Cabinet is a standalone file-based database that supports Hash\n"
 "and B+ Tree data storage models.  It is a fast key-value lightweight\n"
 "database and supports many programming languages.  It is a NoSQL database."
 msgstr ""
 
-#: gnu/packages/databases.scm:1008
+#: gnu/packages/databases.scm:1073
 msgid "NoSQL data engine"
 msgstr ""
 
-#: gnu/packages/databases.scm:1010
+#: gnu/packages/databases.scm:1075
 msgid ""
 "WiredTiger is an extensible platform for data management.  It supports\n"
 "row-oriented storage (where all columns of a row are stored together),\n"
@@ -1900,19 +2047,64 @@ msgid ""
 "trees (LSM), for sustained throughput under random insert workloads."
 msgstr ""
 
-#: gnu/packages/databases.scm:1046
+#: gnu/packages/databases.scm:1111
 msgid "Perl5 access to Berkeley DB version 1.x"
 msgstr ""
 
-#: gnu/packages/databases.scm:1048
+#: gnu/packages/databases.scm:1113
 msgid "The DB::File module provides Perl bindings to the Berkeley DB version 1.x."
 msgstr ""
 
-#: gnu/packages/debug.scm:74
+#: gnu/packages/databases.scm:1140
+msgid "Lightning memory-mapped database library"
+msgstr ""
+
+#: gnu/packages/databases.scm:1141
+msgid "Lightning memory-mapped database library."
+msgstr ""
+
+#: gnu/packages/databases.scm:1162
+msgid "C++ connector for PostgreSQL"
+msgstr ""
+
+#: gnu/packages/databases.scm:1164
+msgid ""
+"Libpqxx is a C++ library to enable user programs to communicate with the\n"
+"PostgreSQL database back-end.  The database back-end can be local or it may be\n"
+"on another machine, accessed via TCP/IP."
+msgstr ""
+
+#: gnu/packages/databases.scm:1187
+msgid "Small object-relational mapping utility"
+msgstr ""
+
+#: gnu/packages/databases.scm:1189
+msgid ""
+"Peewee is a simple and small ORM (object-relation mapping) tool.  Peewee\n"
+"handles converting between pythonic values and those used by databases, so you\n"
+"can use Python types in your code without having to worry.  It has built-in\n"
+"support for sqlite, mysql and postgresql.  If you already have a database, you\n"
+"can autogenerate peewee models using @code{pwiz}, a model generator."
+msgstr ""
+
+#: gnu/packages/databases.scm:1236
+msgid "Library providing transparent encryption of SQLite database files"
+msgstr ""
+
+#: gnu/packages/databases.scm:1237
+msgid ""
+"SQLCipher is an implementation of SQLite, extended to\n"
+"provide transparent 256-bit AES encryption of database files.  Pages are\n"
+"encrypted before being written to disk and are decrypted when read back.  It’s\n"
+"well suited for protecting embedded application databases and for mobile\n"
+"development."
+msgstr ""
+
+#: gnu/packages/debug.scm:78
 msgid "Heuristical file minimizer"
 msgstr ""
 
-#: gnu/packages/debug.scm:76
+#: gnu/packages/debug.scm:80
 msgid ""
 "Delta assists you in minimizing \"interesting\" files subject to a test\n"
 "of their interestingness.  A common such situation is when attempting to\n"
@@ -1920,11 +2112,11 @@ msgid ""
 "program to exhibit a bug."
 msgstr ""
 
-#: gnu/packages/debug.scm:135
+#: gnu/packages/debug.scm:134
 msgid "Reducer for interesting code"
 msgstr ""
 
-#: gnu/packages/debug.scm:137
+#: gnu/packages/debug.scm:136
 msgid ""
 "C-Reduce is a tool that takes a large C or C++ program that has a\n"
 "property of interest (such as triggering a compiler bug) and automatically\n"
@@ -1933,11 +2125,11 @@ msgid ""
 "tools that process C/C++ code."
 msgstr ""
 
-#: gnu/packages/debug.scm:249
+#: gnu/packages/debug.scm:251
 msgid "Security-oriented fuzzer"
 msgstr ""
 
-#: gnu/packages/debug.scm:251
+#: gnu/packages/debug.scm:253
 msgid ""
 "American fuzzy lop is a security-oriented fuzzer that employs a novel\n"
 "type of compile-time instrumentation and genetic algorithms to automatically\n"
@@ -1948,35 +2140,47 @@ msgid ""
 "down the road."
 msgstr ""
 
-#: gnu/packages/dejagnu.scm:78
-msgid "GNU software testing framework"
+#: gnu/packages/debug.scm:305
+msgid "Expose race conditions in Makefiles"
 msgstr ""
 
-#: gnu/packages/dejagnu.scm:80
+#: gnu/packages/debug.scm:307
 msgid ""
-"DejaGnu is a framework for testing software.  In effect, it serves as\n"
-"a front-end for all tests written for a program.  Thus, each program can have\n"
-"multiple test suites, which are then all managed by a single harness."
+"Stress Make is a customized GNU Make that explicitely managess the\n"
+"order in which concurrent jobs are run in order to provoke erroneous behavior\n"
+"into becoming manifest.  It can run jobs in the order they're launched, in\n"
+"backwards order, or in random order.  The thought is that if code builds\n"
+"correctly with Stress Make then it is likely that the @code{Makefile} contains\n"
+"no race conditions."
 msgstr ""
 
-#: gnu/packages/feh.scm:54
-msgid "Fast and light imlib2-based image viewer"
-msgstr "Hurtig og simpel imlib2-baseret billedfremviser"
+#: gnu/packages/debug.scm:334
+msgid "Transparent application input fuzzer"
+msgstr ""
 
-#: gnu/packages/feh.scm:56
+#: gnu/packages/debug.scm:335
 msgid ""
-"feh is an X11 image viewer aimed mostly at console users.\n"
-"Unlike most other viewers, it does not have a fancy GUI, but simply\n"
-"displays images.  It can also be used to set the desktop wallpaper.\n"
-"It is controlled via commandline arguments and configurable key/mouse\n"
-"actions."
+"Zzuf is a transparent application input fuzzer.  It works by\n"
+"intercepting file operations and changing random bits in the program's\n"
+"input.  Zzuf's behaviour is deterministic, making it easy to reproduce bugs."
 msgstr ""
 
-#: gnu/packages/games.scm:128
+#: gnu/packages/dejagnu.scm:77
+msgid "GNU software testing framework"
+msgstr ""
+
+#: gnu/packages/dejagnu.scm:79
+msgid ""
+"DejaGnu is a framework for testing software.  In effect, it serves as\n"
+"a front-end for all tests written for a program.  Thus, each program can have\n"
+"multiple test suites, which are then all managed by a single harness."
+msgstr ""
+
+#: gnu/packages/games.scm:137
 msgid "Backgammon game"
 msgstr "Backgammonspil"
 
-#: gnu/packages/games.scm:129
+#: gnu/packages/games.scm:138
 msgid ""
 "The GNU backgammon application can be used for playing, analyzing and\n"
 "teaching the game.  It has an advanced evaluation engine based on artificial\n"
@@ -1990,11 +2194,11 @@ msgstr ""
 "avancerede spillere. Udover grænsefladen for kommandolinjen har\n"
 "spillet også en attraktiv 3D-repræsentation af brættet."
 
-#: gnu/packages/games.scm:158
+#: gnu/packages/games.scm:167
 msgid "3d Rubik's cube game"
 msgstr ""
 
-#: gnu/packages/games.scm:160
+#: gnu/packages/games.scm:169
 msgid ""
 "GNUbik is a puzzle game in which you must manipulate a cube to make\n"
 "each of its faces have a uniform color.  The game is customizable, allowing\n"
@@ -2003,11 +2207,11 @@ msgid ""
 "scriptable with Guile."
 msgstr ""
 
-#: gnu/packages/games.scm:210
+#: gnu/packages/games.scm:221
 msgid "GNU/Linux port of the indie game \"l'Abbaye des Morts\""
 msgstr "GNU/Linux-port af indiespillet »l'Abbaye des Morts«"
 
-#: gnu/packages/games.scm:211
+#: gnu/packages/games.scm:222
 msgid ""
 "L'Abbaye des Morts is a 2D platform game set in 13th century\n"
 "France.  The Cathars, who preach about good Christian beliefs, were being\n"
@@ -2016,11 +2220,11 @@ msgid ""
 "that beneath its ruins lay buried an ancient evil."
 msgstr ""
 
-#: gnu/packages/games.scm:254
+#: gnu/packages/games.scm:266
 msgid "Lemmings clone"
 msgstr "Lemmingsklon"
 
-#: gnu/packages/games.scm:256
+#: gnu/packages/games.scm:268
 msgid ""
 "Pingus is a free Lemmings-like puzzle game in which the player takes\n"
 "command of a bunch of small animals and has to guide them through levels.\n"
@@ -2030,22 +2234,22 @@ msgid ""
 "level's exit.  The game is presented in a 2D side view."
 msgstr ""
 
-#: gnu/packages/games.scm:278
+#: gnu/packages/games.scm:290
 msgid "Convert English text to humorous dialects"
 msgstr ""
 
-#: gnu/packages/games.scm:279
+#: gnu/packages/games.scm:291
 msgid ""
 "The GNU Talk Filters are programs that convert English text\n"
 "into stereotyped or otherwise humorous dialects.  The filters are provided as\n"
 "a C library, so they can easily be integrated into other programs."
 msgstr ""
 
-#: gnu/packages/games.scm:311
+#: gnu/packages/games.scm:323
 msgid "Simulate the display from \"The Matrix\""
 msgstr ""
 
-#: gnu/packages/games.scm:312
+#: gnu/packages/games.scm:324
 msgid ""
 "CMatrix simulates the display from \"The Matrix\" and is\n"
 "based on the screensaver from the movie's website.  It works with terminal\n"
@@ -2053,22 +2257,22 @@ msgid ""
 "asynchronously and at a user-defined speed."
 msgstr ""
 
-#: gnu/packages/games.scm:332
+#: gnu/packages/games.scm:344
 msgid "Full chess implementation"
 msgstr "Fuld skakimplementering"
 
-#: gnu/packages/games.scm:333
+#: gnu/packages/games.scm:345
 msgid ""
 "GNU Chess is a chess engine.  It allows you to compete\n"
 "against the computer in a game of chess, either through the default terminal\n"
 "interface or via an external visual interface such as GNU XBoard."
 msgstr ""
 
-#: gnu/packages/games.scm:361
+#: gnu/packages/games.scm:373
 msgid "Twisted adventures of young pig farmer Dink Smallwood"
 msgstr ""
 
-#: gnu/packages/games.scm:363
+#: gnu/packages/games.scm:375
 msgid ""
 "GNU FreeDink is a free and portable re-implementation of the engine\n"
 "for the role-playing game Dink Smallwood.  It supports not only the original\n"
@@ -2076,19 +2280,19 @@ msgid ""
 "To that extent, it also includes a front-end for managing all of your D-Mods."
 msgstr ""
 
-#: gnu/packages/games.scm:385
+#: gnu/packages/games.scm:397
 msgid "Game data for GNU Freedink"
 msgstr "Spildata for GNU Freedink"
 
-#: gnu/packages/games.scm:387
+#: gnu/packages/games.scm:399
 msgid "This package contains the game data of GNU Freedink."
 msgstr "Denne pakke indeholder spildataen for GNU Freedink."
 
-#: gnu/packages/games.scm:438
+#: gnu/packages/games.scm:451
 msgid "Graphical user interface for chess programs"
 msgstr "Grafisk brugerflade for skakprogrammer"
 
-#: gnu/packages/games.scm:439
+#: gnu/packages/games.scm:452
 msgid ""
 "GNU XBoard is a graphical board for all varieties of chess,\n"
 "including international chess, xiangqi (Chinese chess), shogi (Japanese chess)\n"
@@ -2097,11 +2301,11 @@ msgid ""
 "Portable Game Notation."
 msgstr ""
 
-#: gnu/packages/games.scm:492
+#: gnu/packages/games.scm:505
 msgid "Ball and paddle game"
 msgstr ""
 
-#: gnu/packages/games.scm:493
+#: gnu/packages/games.scm:506
 msgid ""
 "XBoing is a blockout type game where you have a paddle which\n"
 "you control to bounce a ball around the game zone destroying blocks with a\n"
@@ -2109,11 +2313,11 @@ msgid ""
 "destroy, the better your score.  The person with the highest score wins."
 msgstr ""
 
-#: gnu/packages/games.scm:525
+#: gnu/packages/games.scm:538
 msgid "Typing tutor"
 msgstr ""
 
-#: gnu/packages/games.scm:527
+#: gnu/packages/games.scm:540
 msgid ""
 "GNU Typist is a universal typing tutor.  It can be used to learn and\n"
 "practice touch-typing.  Several tutorials are included; in addition to\n"
@@ -2122,11 +2326,11 @@ msgid ""
 "are primarily in English, however some in other languages are provided."
 msgstr ""
 
-#: gnu/packages/games.scm:580
+#: gnu/packages/games.scm:587
 msgid "3D game engine written in C++"
 msgstr "3D-spilmotor skrevet i C++"
 
-#: gnu/packages/games.scm:582
+#: gnu/packages/games.scm:589
 msgid ""
 "The Irrlicht Engine is a high performance realtime 3D engine written in\n"
 "C++.  Features include an OpenGL renderer, extensible materials, scene graph\n"
@@ -2134,11 +2338,11 @@ msgid ""
 "for common mesh file formats, and collision detection."
 msgstr ""
 
-#: gnu/packages/games.scm:634
+#: gnu/packages/games.scm:641
 msgid "2D space shooter"
 msgstr "2D-rumskyder"
 
-#: gnu/packages/games.scm:636
+#: gnu/packages/games.scm:643
 msgid ""
 "M.A.R.S. is a 2D space shooter with pretty visual effects and\n"
 "attractive physics.  Players can battle each other or computer controlled\n"
@@ -2146,19 +2350,19 @@ msgid ""
 "match, cannon keep, and grave-itation pit."
 msgstr ""
 
-#: gnu/packages/games.scm:677
+#: gnu/packages/games.scm:684
 msgid "Main game data for the Minetest game engine"
 msgstr "Spildata for spilmotoren Minetest"
 
-#: gnu/packages/games.scm:679
+#: gnu/packages/games.scm:686
 msgid "Game data for the Minetest infinite-world block sandox game."
 msgstr ""
 
-#: gnu/packages/games.scm:731
+#: gnu/packages/games.scm:738
 msgid "Infinite-world block sandbox game"
 msgstr ""
 
-#: gnu/packages/games.scm:733
+#: gnu/packages/games.scm:740
 msgid ""
 "Minetest is a sandbox construction game.  Players can create and destroy\n"
 "various types of blocks in a three-dimensional open world.  This allows\n"
@@ -2167,11 +2371,11 @@ msgid ""
 "in different ways."
 msgstr ""
 
-#: gnu/packages/games.scm:772
+#: gnu/packages/games.scm:779
 msgid "Curses Implementation of the Glk API"
 msgstr ""
 
-#: gnu/packages/games.scm:774
+#: gnu/packages/games.scm:781
 msgid ""
 "Glk defines a portable API for applications with text UIs.  It was\n"
 "primarily designed for interactive fiction, but it should be suitable for many\n"
@@ -2180,11 +2384,11 @@ msgid ""
 "using the curses.h library for screen control."
 msgstr ""
 
-#: gnu/packages/games.scm:811
+#: gnu/packages/games.scm:818
 msgid "Interpreter for Glulx VM"
 msgstr "Fortolker for Glulx VM"
 
-#: gnu/packages/games.scm:813
+#: gnu/packages/games.scm:820
 msgid ""
 "Glulx is a 32-bit portable virtual machine intended for writing and\n"
 "playing interactive fiction.  It was designed by Andrew Plotkin to relieve\n"
@@ -2192,22 +2396,22 @@ msgid ""
 "reference interpreter, using Glk API."
 msgstr ""
 
-#: gnu/packages/games.scm:849
+#: gnu/packages/games.scm:856
 msgid "Z-machine interpreter"
 msgstr ""
 
-#: gnu/packages/games.scm:851
+#: gnu/packages/games.scm:858
 msgid ""
 "Fizmo is a console-based Z-machine interpreter.  It is used to play\n"
 "interactive fiction, also known as text adventures, which were implemented\n"
 "either by Infocom or created using the Inform compiler."
 msgstr ""
 
-#: gnu/packages/games.scm:901
+#: gnu/packages/games.scm:908
 msgid "Reference frontend for the libretro API"
 msgstr ""
 
-#: gnu/packages/games.scm:903
+#: gnu/packages/games.scm:910
 msgid ""
 "Libretro is a simple but powerful development interface that allows for\n"
 "the easy creation of emulators, games and multimedia applications that can plug\n"
@@ -2216,11 +2420,11 @@ msgid ""
 "multi-system game/emulator system."
 msgstr ""
 
-#: gnu/packages/games.scm:923
+#: gnu/packages/games.scm:930
 msgid "Play the game of Go"
 msgstr "Spil Go"
 
-#: gnu/packages/games.scm:925
+#: gnu/packages/games.scm:932
 msgid ""
 "GNU Go is a program that plays the game of Go, in which players\n"
 "place stones on a grid to form territory or capture other stones.  While\n"
@@ -2231,11 +2435,11 @@ msgid ""
 "Protocol)."
 msgstr ""
 
-#: gnu/packages/games.scm:975
+#: gnu/packages/games.scm:960
 msgid "High speed arctic racing game based on Tux Racer"
 msgstr ""
 
-#: gnu/packages/games.scm:977
+#: gnu/packages/games.scm:962
 msgid ""
 "Extreme Tux Racer, or etracer as it is called for short, is\n"
 "a simple OpenGL racing game featuring Tux, the Linux mascot.  The goal of the\n"
@@ -2248,11 +2452,23 @@ msgid ""
 "This game is based on the GPL version of the famous game TuxRacer."
 msgstr ""
 
-#: gnu/packages/games.scm:1015
+#: gnu/packages/games.scm:1042
+msgid "3D kart racing game"
+msgstr ""
+
+#: gnu/packages/games.scm:1043
+msgid ""
+"SuperTuxKart is a 3D kart racing game, with a focus on\n"
+"having fun over realism.  You can play with up to 4 friends on one PC, racing\n"
+"against each other or just trying to beat the computer; single-player mode is\n"
+"also available."
+msgstr ""
+
+#: gnu/packages/games.scm:1075
 msgid "Game of jumping to the next floor, trying not to fall"
 msgstr ""
 
-#: gnu/packages/games.scm:1017
+#: gnu/packages/games.scm:1077
 msgid ""
 "GNUjump is a simple, yet addictive game in which you must jump from\n"
 "platform to platform to avoid falling, while the platforms drop at faster rates\n"
@@ -2260,11 +2476,11 @@ msgid ""
 "falling, themeable graphics and sounds, and replays."
 msgstr ""
 
-#: gnu/packages/games.scm:1060
+#: gnu/packages/games.scm:1120
 msgid "Turn-based strategy game"
 msgstr ""
 
-#: gnu/packages/games.scm:1062
+#: gnu/packages/games.scm:1122
 msgid ""
 "The Battle for Wesnoth is a fantasy, turn based tactical strategy game,\n"
 "with several single player campaigns, and multiplayer games (both networked and\n"
@@ -2276,11 +2492,11 @@ msgid ""
 "next campaign."
 msgstr ""
 
-#: gnu/packages/games.scm:1106
+#: gnu/packages/games.scm:1166
 msgid "X86 emulator with CGA/EGA/VGA/etc. graphics and sound"
 msgstr "X86-emulator med CGA/EGA/VGA/etc. grafik og lyd"
 
-#: gnu/packages/games.scm:1107
+#: gnu/packages/games.scm:1167
 msgid ""
 "DOSBox is a DOS-emulator that uses the SDL library.  DOSBox\n"
 "also emulates CPU:286/386 realmode/protected mode, Directory\n"
@@ -2289,22 +2505,22 @@ msgid ""
 "older games."
 msgstr ""
 
-#: gnu/packages/games.scm:1152
+#: gnu/packages/games.scm:1212
 msgid "Mouse and keyboard discovery for children"
 msgstr ""
 
-#: gnu/packages/games.scm:1154
+#: gnu/packages/games.scm:1214
 msgid ""
 "Gamine is a game designed for young children who are learning to use the\n"
 "mouse and keyboard.  The child uses the mouse to draw colored dots and lines\n"
 "on the screen and keyboard to display letters."
 msgstr ""
 
-#: gnu/packages/games.scm:1185
+#: gnu/packages/games.scm:1246
 msgid "Puzzle game with a cat in lead role"
 msgstr ""
 
-#: gnu/packages/games.scm:1186
+#: gnu/packages/games.scm:1247
 msgid ""
 "Project Raincat is a game developed by Carnegie Mellon\n"
 "students through GCS during the Fall 2008 semester.  Raincat features game\n"
@@ -2313,11 +2529,11 @@ msgid ""
 "is programmed in Haskell."
 msgstr ""
 
-#: gnu/packages/games.scm:1221
+#: gnu/packages/games.scm:1282
 msgid "Client for 'The Mana World' and similar games"
 msgstr ""
 
-#: gnu/packages/games.scm:1223
+#: gnu/packages/games.scm:1284
 msgid ""
 "ManaPlus is a 2D MMORPG client for game servers.  It is the only\n"
 "fully supported client for @uref{http://www.themanaworld.org, The mana\n"
@@ -2325,96 +2541,96 @@ msgid ""
 "@uref{http://landoffire.org, Land of fire}."
 msgstr ""
 
-#: gnu/packages/games.scm:1273
+#: gnu/packages/games.scm:1334
 msgid "Nintendo 64 emulator core library"
 msgstr "Nintendo 64-emulator - grundlæggende bibliotek"
 
-#: gnu/packages/games.scm:1275
+#: gnu/packages/games.scm:1336
 msgid ""
 "Mupen64Plus is a cross-platform plugin-based Nintendo 64 (N64) emulator\n"
 "which is capable of accurately playing many games.  This package contains the\n"
 "core library."
 msgstr ""
 
-#: gnu/packages/games.scm:1319 gnu/packages/games.scm:1364
-#: gnu/packages/games.scm:1406 gnu/packages/games.scm:1448
-#: gnu/packages/games.scm:1764
+#: gnu/packages/games.scm:1380 gnu/packages/games.scm:1425
+#: gnu/packages/games.scm:1467 gnu/packages/games.scm:1509
+#: gnu/packages/games.scm:1825
 msgid "Mupen64Plus SDL input plugin"
 msgstr ""
 
-#: gnu/packages/games.scm:1321
+#: gnu/packages/games.scm:1382
 msgid ""
 "Mupen64Plus is a cross-platform plugin-based Nintendo 64 (N64) emulator\n"
 "which is capable of accurately playing many games.  This package contains the\n"
 "SDL audio plugin."
 msgstr ""
 
-#: gnu/packages/games.scm:1366
+#: gnu/packages/games.scm:1427
 msgid ""
 "Mupen64Plus is a cross-platform plugin-based Nintendo 64 (N64) emulator\n"
 "which is capable of accurately playing many games.  This package contains the\n"
 "SDL input plugin."
 msgstr ""
 
-#: gnu/packages/games.scm:1408
+#: gnu/packages/games.scm:1469
 msgid ""
 "Mupen64Plus is a cross-platform plugin-based Nintendo 64 (N64) emulator\n"
 "which is capable of accurately playing many games.  This package contains the\n"
 "high-level emulation (HLE) RSP processor plugin."
 msgstr ""
 
-#: gnu/packages/games.scm:1450
+#: gnu/packages/games.scm:1511
 msgid ""
 "Mupen64Plus is a cross-platform plugin-based Nintendo 64 (N64) emulator\n"
 "which is capable of accurately playing many games.  This package contains the\n"
 "Z64 RSP processor plugin."
 msgstr ""
 
-#: gnu/packages/games.scm:1494 gnu/packages/games.scm:1548
-#: gnu/packages/games.scm:1598 gnu/packages/games.scm:1646
+#: gnu/packages/games.scm:1555 gnu/packages/games.scm:1609
+#: gnu/packages/games.scm:1659 gnu/packages/games.scm:1707
 msgid "Mupen64Plus Rice Video plugin"
 msgstr ""
 
-#: gnu/packages/games.scm:1496
+#: gnu/packages/games.scm:1557
 msgid ""
 "Mupen64Plus is a cross-platform plugin-based Nintendo 64 (N64) emulator\n"
 "which is capable of accurately playing many games.  This package contains the\n"
 "Arachnoid video plugin."
 msgstr ""
 
-#: gnu/packages/games.scm:1550
+#: gnu/packages/games.scm:1611
 msgid ""
 "Mupen64Plus is a cross-platform plugin-based Nintendo 64 (N64) emulator\n"
 "which is capable of accurately playing many games.  This package contains the\n"
 "Glide64 video plugin."
 msgstr ""
 
-#: gnu/packages/games.scm:1600
+#: gnu/packages/games.scm:1661
 msgid ""
 "Mupen64Plus is a cross-platform plugin-based Nintendo 64 (N64) emulator\n"
 "which is capable of accurately playing many games.  This package contains the\n"
 "Glide64MK2 video plugin."
 msgstr ""
 
-#: gnu/packages/games.scm:1648
+#: gnu/packages/games.scm:1709
 msgid ""
 "Mupen64Plus is a cross-platform plugin-based Nintendo 64 (N64) emulator\n"
 "which is capable of accurately playing many games.  This package contains the\n"
 "Rice Video plugin."
 msgstr ""
 
-#: gnu/packages/games.scm:1700
+#: gnu/packages/games.scm:1761
 msgid "Mupen64Plus Z64 video plugin"
 msgstr ""
 
-#: gnu/packages/games.scm:1702
+#: gnu/packages/games.scm:1763
 msgid ""
 "Mupen64Plus is a cross-platform plugin-based Nintendo 64 (N64) emulator\n"
 "which is capable of accurately playing many games.  This package contains the\n"
 "Z64 video plugin."
 msgstr ""
 
-#: gnu/packages/games.scm:1766
+#: gnu/packages/games.scm:1827
 msgid ""
 "Mupen64Plus is a cross-platform plugin-based Nintendo 64 (N64) emulator\n"
 "which is capable of accurately playing many games.  This package contains the\n"
@@ -2422,22 +2638,22 @@ msgid ""
 "towards a working Mupen64Plus for casual users."
 msgstr ""
 
-#: gnu/packages/games.scm:1830
+#: gnu/packages/games.scm:1884
 msgid "Nintendo Entertainment System (NES/Famicom) emulator"
 msgstr ""
 
-#: gnu/packages/games.scm:1832
+#: gnu/packages/games.scm:1886
 msgid ""
 "Nestopia UE (Undead Edition) is a fork of the Nintendo Entertainment\n"
 "System (NES/Famicom) emulator Nestopia, with enhancements from members of the\n"
 "emulation community.  It provides highly accurate emulation."
 msgstr ""
 
-#: gnu/packages/games.scm:1862
+#: gnu/packages/games.scm:1916
 msgid "Video game console emulator front-end"
 msgstr ""
 
-#: gnu/packages/games.scm:1863
+#: gnu/packages/games.scm:1917
 msgid ""
 "EmulationStation provides a graphical front-end to a large\n"
 "number of video game console emulators.  It features an interface that is\n"
@@ -2445,64 +2661,65 @@ msgid ""
 "and a game metadata scraper."
 msgstr ""
 
-#: gnu/packages/games.scm:1915
+#: gnu/packages/games.scm:1969
 msgid "Transportation economics simulator"
 msgstr ""
 
-#: gnu/packages/games.scm:1916
+#: gnu/packages/games.scm:1970
 msgid ""
 "OpenTTD is a game in which you transport goods and\n"
 "passengers by land, water and air.  It is a re-implementation of Transport\n"
 "Tycoon Deluxe with many enhancements including multiplayer mode,\n"
 "internationalization support, conditional orders and the ability to clone,\n"
-"autoreplace and autoupdate vehicles."
+"autoreplace and autoupdate vehicles.  This package only includes the game engine.  When you start\n"
+"it you will be prompted to download a graphics set."
 msgstr ""
 
-#: gnu/packages/games.scm:1970
+#: gnu/packages/games.scm:2025
 msgid "Pinball simulator"
 msgstr "Pinball-simulator"
 
-#: gnu/packages/games.scm:1971
+#: gnu/packages/games.scm:2026
 msgid ""
 "The Emilia Pinball Project is a pinball simulator.  There\n"
 "are only two levels to play with, but they are very addictive."
 msgstr ""
 
-#: gnu/packages/games.scm:1992
+#: gnu/packages/games.scm:2047
 msgid "Board game inspired by The Settlers of Catan"
 msgstr "Brætspil inspireret af The Settlers of Catan"
 
-#: gnu/packages/games.scm:1993
+#: gnu/packages/games.scm:2048
 msgid ""
 "Pioneers is an emulation of the board game The Settlers of\n"
 "Catan.  It can be played on a local network, on the internet, and with AI\n"
 "players."
 msgstr ""
 
-#: gnu/packages/games.scm:2027
+#: gnu/packages/games.scm:2082
 msgid "Nintendo DS emulator"
 msgstr "Nintendo DS-emulator"
 
-#: gnu/packages/games.scm:2029
+#: gnu/packages/games.scm:2084
 msgid "DeSmuME is an emulator for the Nintendo DS handheld gaming console."
 msgstr "DeSmuME er en emulator for den håndholdte spilkonsol Nintendo DS."
 
-#: gnu/packages/games.scm:2067
+#: gnu/packages/games.scm:2122
 msgid "Logic puzzle game"
 msgstr ""
 
-#: gnu/packages/games.scm:2068
+#: gnu/packages/games.scm:2123
 msgid ""
 "The goal of this logic game is to open all cards in a 6x6\n"
 "grid, using a number of hints as to their relative position.  The game idea\n"
 "is attributed to Albert Einstein."
 msgstr ""
 
-#: gnu/packages/games.scm:2097
+#: gnu/packages/games.scm:2152
 msgid "MUD and telnet client"
 msgstr ""
 
-#: gnu/packages/games.scm:2099
+#: gnu/packages/games.scm:2154
 msgid ""
 "POWWOW is a client software which can be used for telnet as well as for\n"
 "@dfn{Multi-User Dungeon} (MUD).  Additionally it can serve as a nice client for\n"
@@ -2510,22 +2727,22 @@ msgid ""
 "http://lavachat.symlynx.com/unix/"
 msgstr ""
 
-#: gnu/packages/games.scm:2237
+#: gnu/packages/games.scm:2296
 msgid "Arena shooter derived from the Cube 2 engine"
 msgstr "Arenaskydespil afledt fra Cube 2-motoren"
 
-#: gnu/packages/games.scm:2239
+#: gnu/packages/games.scm:2298
 msgid ""
 "Red Eclipse is an arena shooter, created from the Cube2 engine.\n"
 "Offering an innovative parkour system and distinct but all potent weapons,\n"
 "Red Eclipse provides fast paced and accessible gameplay."
 msgstr ""
 
-#: gnu/packages/games.scm:2333
+#: gnu/packages/games.scm:2392
 msgid "Nintendo multi-system emulator"
 msgstr "Nintendo multi-system-emulator"
 
-#: gnu/packages/games.scm:2335
+#: gnu/packages/games.scm:2394
 msgid ""
 "higan (formerly bsnes) is an emulator for multiple Nintendo video game\n"
 "consoles, including the Nintendo Entertainment System (NES/Famicom), Super\n"
@@ -2534,22 +2751,22 @@ msgid ""
 "Super Game Boy, BS-X Satellaview, and Sufami Turbo."
 msgstr ""
 
-#: gnu/packages/games.scm:2395
+#: gnu/packages/games.scm:2454
 msgid "Text adventure game"
 msgstr ""
 
-#: gnu/packages/games.scm:2397
+#: gnu/packages/games.scm:2456
 msgid ""
 "Grue Hunter is a text adventure game written in Perl.  You must make\n"
 "your way through an underground cave system in search of the Grue.  Can you\n"
 "capture it and get out alive?"
 msgstr ""
 
-#: gnu/packages/games.scm:2439
+#: gnu/packages/games.scm:2505
 msgid "3D Real-time strategy and real-time tactics game"
 msgstr ""
 
-#: gnu/packages/games.scm:2441
+#: gnu/packages/games.scm:2507
 msgid ""
 "Warzone 2100 offers campaign, multi-player, and single-player skirmish\n"
 "modes. An extensive tech tree with over 400 different technologies, combined\n"
@@ -2557,11 +2774,11 @@ msgid ""
 "tactics."
 msgstr ""
 
-#: gnu/packages/games.scm:2484
+#: gnu/packages/games.scm:2550
 msgid "2D scrolling shooter game"
 msgstr "2D-rullende skydespil"
 
-#: gnu/packages/games.scm:2486
+#: gnu/packages/games.scm:2552
 msgid ""
 "In the year 2579, the intergalactic weapons corporation, WEAPCO, has\n"
 "dominated the galaxy.  Guide Chris Bainfield and his friend Sid Wilson on\n"
@@ -2570,11 +2787,11 @@ msgid ""
 "in strikes against the evil corporation."
 msgstr ""
 
-#: gnu/packages/games.scm:2524
+#: gnu/packages/games.scm:2583
 msgid "Fast-paced, arcade-style, top-scrolling space shooter"
 msgstr ""
 
-#: gnu/packages/games.scm:2526
+#: gnu/packages/games.scm:2585
 msgid ""
 "In this game you are the captain of the cargo ship Chromium B.S.U. and\n"
 "are responsible for delivering supplies to the troops on the front line.  Your\n"
@@ -2582,34 +2799,150 @@ msgid ""
 "safety of the Chromium vessel."
 msgstr ""
 
-#: gnu/packages/gcc.scm:313
-msgid "GNU Compiler Collection"
+#: gnu/packages/games.scm:2659
+msgid "Drawing software for children"
+msgstr ""
+
+#: gnu/packages/games.scm:2661
+msgid ""
+"Tux Paint is a free drawing program designed for young children (kids\n"
+"ages 3 and up).  It has a simple, easy-to-use interface; fun sound effects;\n"
+"and an encouraging cartoon mascot who helps guide children as they use the\n"
+"program.  It provides a blank canvas and a variety of drawing tools to help\n"
+"your child be creative."
+msgstr ""
+
+#: gnu/packages/games.scm:2699
+msgid "Stamp images for Tux Paint"
+msgstr ""
+
+#: gnu/packages/games.scm:2701
+msgid ""
+"This package contains a set of \"Rubber Stamp\" images which can be used\n"
+"with the \"Stamp\" tool within Tux Paint."
+msgstr ""
+
+#: gnu/packages/games.scm:2748
+msgid "Configure Tux Paint"
+msgstr "Konfigurer Tux Paint"
+
+#: gnu/packages/games.scm:2750
+msgid "Tux Paint Config is a graphical configuration editor for Tux Paint."
+msgstr "Tux Paint Config er et grafisk redigeringsprogram til konfigurationen for Tux Paint."
+
+#: gnu/packages/games.scm:2782
+msgid "2D platformer game"
+msgstr "2D-platformsspil"
+
+#: gnu/packages/games.scm:2783
+msgid ""
+"SuperTux is a free classic 2D jump'n run sidescroller game\n"
+"in a style similar to the original Super Mario games covered under\n"
+"the GNU GPL."
+msgstr ""
+
+#: gnu/packages/games.scm:2817
+msgid "MUD client"
+msgstr "MUD-klient"
+
+#: gnu/packages/games.scm:2819
+msgid ""
+"TinTin++ is a MUD client which supports MCCP (Mud Client Compression Protocol),\n"
+"MMCP (Mud Master Chat Protocol), xterm 256 colors, most TELNET options used by MUDs,\n"
+"as well as those required to login via telnet on Linux / Mac OS X servers, and an\n"
+"auto mapper with a VT100 map display."
+msgstr ""
+
+#: gnu/packages/games.scm:2856
+msgid "Programming game"
+msgstr "Programmeringsspil"
+
+#: gnu/packages/games.scm:2857
+msgid ""
+"Learn programming, playing with ants and spider webs ;-)\n"
+"Your robot ant can be programmed in many languages: OCaml, Python, C, C++,\n"
+"Java, Ruby, Lua, JavaScript, Pascal, Perl, Scheme, Vala, Prolog.  Experienced\n"
+"programmers may also add their own favorite language."
+msgstr ""
+
+#: gnu/packages/games.scm:2901
+msgid "Keyboard mashing and doodling game for babies"
+msgstr ""
+
+#: gnu/packages/games.scm:2902
+msgid ""
+"Bambam is a simple baby keyboard (and gamepad) masher\n"
+"application that locks the keyboard and mouse and instead displays bright\n"
+"colors, pictures, and sounds."
+msgstr ""
+
+#: gnu/packages/games.scm:2945
+msgid "Arcade-style fire fighting game"
+msgstr ""
+
+#: gnu/packages/games.scm:2947
+msgid ""
+"Mr. Rescue is an arcade styled 2d action game centered around evacuating\n"
+"civilians from burning buildings.  The game features fast paced fire\n"
+"extinguishing action, intense boss battles, a catchy soundtrack and lots of\n"
+"throwing people around in pseudo-randomly generated buildings."
+msgstr ""
+
+#: gnu/packages/games.scm:3023
+msgid "Non-euclidean graphical rogue-like game"
+msgstr ""
+
+#: gnu/packages/games.scm:3025
+msgid ""
+"HyperRogue is a game in which the player collects treasures and fights\n"
+"monsters -- rogue-like but for the fact that it is played on the hyperbolic\n"
+"plane and not in euclidean space.\n"
+"\n"
+"In HyperRogue, the player can move through different parts of the world, which\n"
+"are home to particular creatures and may be subject to own rules of \"physics\".\n"
+"\n"
+"While it can use ASCII characters to display the world the classical rogue\n"
+"symbols, the game needs graphics to render the non-euclidean world."
+msgstr ""
+
+#: gnu/packages/games.scm:3065
+msgid "Shooter with space station destruction"
+msgstr ""
+
+#: gnu/packages/games.scm:3067
+msgid ""
+"Kobo Deluxe is an enhanced version of Akira Higuchi's XKobo graphical game\n"
+"for Un*x systems with X11."
 msgstr ""
 
 #: gnu/packages/gcc.scm:315
+msgid "GNU Compiler Collection"
+msgstr ""
+
+#: gnu/packages/gcc.scm:317
 msgid ""
 "GCC is the GNU Compiler Collection.  It provides compiler front-ends\n"
 "for several languages, including C, C++, Objective-C, Fortran, Java, Ada, and\n"
 "Go.  It also includes runtime support libraries for these languages."
 msgstr ""
 
-#: gnu/packages/gcc.scm:395
+#: gnu/packages/gcc.scm:403
 msgid "GNU C++ standard library"
 msgstr "GNU C++-standardbibliotek"
 
-#: gnu/packages/gcc.scm:430
+#: gnu/packages/gcc.scm:438
 msgid "Collection of subroutines used by various GNU programs"
 msgstr "Samling af underrutiner brugt af diverse GNU-programmer"
 
-#: gnu/packages/gcc.scm:655
+#: gnu/packages/gcc.scm:692
 msgid "GNU libstdc++ documentation"
 msgstr ""
 
-#: gnu/packages/gcc.scm:723
+#: gnu/packages/gcc.scm:761
 msgid "Manipulating sets and relations of integer points bounded by linear constraints"
 msgstr ""
 
-#: gnu/packages/gcc.scm:726
+#: gnu/packages/gcc.scm:764
 msgid ""
 "isl is a library for manipulating sets and relations of integer points\n"
 "bounded by linear constraints.  Supported operations on sets include\n"
@@ -2621,11 +2954,11 @@ msgid ""
 "dependence analysis and bounds on piecewise step-polynomials."
 msgstr ""
 
-#: gnu/packages/gcc.scm:758
+#: gnu/packages/gcc.scm:796
 msgid "Library to generate code for scanning Z-polyhedra"
 msgstr ""
 
-#: gnu/packages/gcc.scm:760
+#: gnu/packages/gcc.scm:798
 msgid ""
 "CLooG is a free software library to generate code for scanning\n"
 "Z-polyhedra.  That is, it finds a code (e.g., in C, FORTRAN...) that\n"
@@ -2640,11 +2973,11 @@ msgid ""
 "effective code."
 msgstr ""
 
-#: gnu/packages/gcc.scm:815
+#: gnu/packages/gcc.scm:853
 msgid "Reference manual for the C programming language"
 msgstr ""
 
-#: gnu/packages/gcc.scm:817
+#: gnu/packages/gcc.scm:855
 msgid ""
 "This is a reference manual for the C programming language, as\n"
 "implemented by the GNU C Compiler (gcc).  As a reference, it is not intended\n"
@@ -2652,60 +2985,38 @@ msgid ""
 "of the language.  Library functions are not included."
 msgstr ""
 
-#: gnu/packages/geeqie.scm:55
-msgid "Library and command-line utility to manage image metadata"
-msgstr "Bibliotek og kommandolinjeredskab til at håndtere billedmetadata"
-
-#: gnu/packages/geeqie.scm:57
-msgid ""
-"Exiv2 is a C++ library and a command line utility to manage image\n"
-"metadata.  It provides fast and easy read and write access to the Exif, IPTC\n"
-"and XMP metadata of images in various formats."
-msgstr ""
-
-#: gnu/packages/geeqie.scm:100
-msgid "Lightweight GTK+ based image viewer"
-msgstr ""
+#: gnu/packages/gettext.scm:90
+msgid "Tools and documentation for translation (used to build other packages)"
+msgstr "Værktøjer og dokumentation for oversættelse (brugt til at bygge andre pakker)"
 
-#: gnu/packages/geeqie.scm:102
+#: gnu/packages/gettext.scm:92
 msgid ""
-"Geeqie is a lightweight GTK+ based image viewer for Unix like operating\n"
-"systems.  It features: EXIF, IPTC and XMP metadata browsing and editing\n"
-"interoperability; easy integration with other software; geeqie works on files\n"
-"and directories, there is no need to import images; fast preview for many raw\n"
-"image formats; tools for image comparison, sorting and managing photo\n"
-"collection.  Geeqie was initially based on GQview."
+"GNU Gettext is a package providing a framework for translating the\n"
+"textual output of programs into multiple languages.  It provides translators\n"
+"with the means to create message catalogs, and a runtime library to load\n"
+"translated messages from the catalogs.  Nearly all GNU packages use Gettext."
 msgstr ""
 
-#: gnu/packages/gettext.scm:93
+#: gnu/packages/gettext.scm:122
 msgid "Tools and documentation for translation"
 msgstr "Værktøjer og dokumentation for oversættelse"
 
-#: gnu/packages/gettext.scm:95
-msgid ""
-"GNU Gettext is a package providing a framework for translating the\n"
-"textual output of programs into multiple languages.  It provides translators\n"
-"with the means to create message catalogs, as well as an Emacs mode to work\n"
-"with them, and a runtime library to load translated messages from the\n"
-"catalogs.  Nearly all GNU packages use Gettext."
-msgstr ""
-
-#: gnu/packages/gettext.scm:151
+#: gnu/packages/gettext.scm:173
 msgid "Scripts to ease maintenance of translations"
 msgstr ""
 
-#: gnu/packages/gettext.scm:153
+#: gnu/packages/gettext.scm:175
 msgid ""
 "The po4a (PO for anything) project goal is to ease translations (and\n"
 "more interestingly, the maintenance of translations) using gettext tools on\n"
 "areas where they were not expected like documentation."
 msgstr ""
 
-#: gnu/packages/gimp.scm:58
+#: gnu/packages/gimp.scm:60
 msgid "Image pixel format conversion library"
 msgstr ""
 
-#: gnu/packages/gimp.scm:60
+#: gnu/packages/gimp.scm:62
 msgid ""
 "Babl is a dynamic, any to any, pixel format translation library.\n"
 "It allows converting between different methods of storing pixels known as\n"
@@ -2716,22 +3027,22 @@ msgid ""
 "provided as well as the framework to add new color models and data types."
 msgstr ""
 
-#: gnu/packages/gimp.scm:116
+#: gnu/packages/gimp.scm:118
 msgid "Graph based image processing framework"
 msgstr "Grafbaseret billedbehandlingsramme"
 
-#: gnu/packages/gimp.scm:117
+#: gnu/packages/gimp.scm:119
 msgid ""
 "GEGL (Generic Graphics Library) provides infrastructure to\n"
 "do demand based cached non destructive image editing on larger than RAM\n"
 "buffers."
 msgstr ""
 
-#: gnu/packages/gimp.scm:161
+#: gnu/packages/gimp.scm:178
 msgid "GNU Image Manipulation Program"
 msgstr ""
 
-#: gnu/packages/gimp.scm:163
+#: gnu/packages/gimp.scm:180
 msgid ""
 "GIMP is an application for image manipulation tasks such as photo\n"
 "retouching, composition and authoring.  It supports all common image formats\n"
@@ -2739,11 +3050,11 @@ msgid ""
 "that is extensible via a plugin system."
 msgstr ""
 
-#: gnu/packages/gimp.scm:211
+#: gnu/packages/gimp.scm:228
 msgid "GIMP plug-in to edit image in fourier space"
 msgstr ""
 
-#: gnu/packages/gimp.scm:213
+#: gnu/packages/gimp.scm:230
 msgid ""
 "This package provides a simple plug-in to apply the fourier transform on\n"
 "an image, allowing you to work with the transformed image inside GIMP.  You\n"
@@ -2751,22 +3062,22 @@ msgid ""
 "inverse fourier transform."
 msgstr ""
 
-#: gnu/packages/gnome.scm:164
+#: gnu/packages/gnome.scm:165
 msgid "CD/DVD burning tool for Gnome"
 msgstr "Cd/dvd-brændeværktøj for GNOME"
 
-#: gnu/packages/gnome.scm:165
+#: gnu/packages/gnome.scm:166
 msgid ""
 "Brasero is an application to burn CD/DVD for the Gnome\n"
 "Desktop.  It is designed to be as simple as possible and has some unique\n"
 "features to enable users to create their discs easily and quickly."
 msgstr ""
 
-#: gnu/packages/gnome.scm:212
+#: gnu/packages/gnome.scm:213
 msgid "Diagram creation for GNOME"
 msgstr "Diagramoprettelse for GNOME"
 
-#: gnu/packages/gnome.scm:213
+#: gnu/packages/gnome.scm:214
 msgid ""
 "Dia can be used to draw different types of diagrams, and\n"
 "includes support for UML static structure diagrams (class diagrams), entity\n"
@@ -2774,11 +3085,11 @@ msgid ""
 "formats like PNG, SVG, PDF and EPS."
 msgstr ""
 
-#: gnu/packages/gnome.scm:234
+#: gnu/packages/gnome.scm:235
 msgid "Bootstrap GNOME modules built from Git"
 msgstr "Bootstrap GNOME-moduler kompileret fra Git"
 
-#: gnu/packages/gnome.scm:235
+#: gnu/packages/gnome.scm:236
 msgid ""
 "gnome-common contains various files needed to bootstrap\n"
 "GNOME modules built from Git.  It contains a common \"autogen.sh\" script that\n"
@@ -2786,11 +3097,11 @@ msgid ""
 "commonly used macros."
 msgstr ""
 
-#: gnu/packages/gnome.scm:276
+#: gnu/packages/gnome.scm:277
 msgid "Libgnome-desktop, gnome-about, and desktop-wide documents"
 msgstr ""
 
-#: gnu/packages/gnome.scm:278
+#: gnu/packages/gnome.scm:279
 msgid ""
 "The libgnome-desktop library provides API shared by several applications\n"
 "on the desktop, but that cannot live in the platform for various reasons.\n"
@@ -2800,41 +3111,41 @@ msgid ""
 "The gnome-about program helps find which version of GNOME is installed."
 msgstr ""
 
-#: gnu/packages/gnome.scm:311
+#: gnu/packages/gnome.scm:312
 msgid "Documentation utilities for the Gnome project"
 msgstr "Dokumentationsredskaber for GNOME-projektet"
 
-#: gnu/packages/gnome.scm:313
+#: gnu/packages/gnome.scm:314
 msgid ""
 "Gnome-doc-utils is a collection of documentation utilities for the\n"
 "Gnome project.  It includes xml2po tool which makes it easier to translate\n"
 "and keep up to date translations of documentation."
 msgstr ""
 
-#: gnu/packages/gnome.scm:357
+#: gnu/packages/gnome.scm:358
 msgid "Libraries for displaying certificates and accessing key stores"
 msgstr ""
 
-#: gnu/packages/gnome.scm:359
+#: gnu/packages/gnome.scm:360
 msgid ""
 "The GCR package contains libraries used for displaying certificates and\n"
 "accessing key stores.  It also provides the viewer for crypto files on the\n"
 "GNOME Desktop."
 msgstr ""
 
-#: gnu/packages/gnome.scm:388
+#: gnu/packages/gnome.scm:389
 msgid "Accessing passwords from the GNOME keyring"
 msgstr ""
 
-#: gnu/packages/gnome.scm:390
+#: gnu/packages/gnome.scm:391
 msgid "Client library to access passwords from the GNOME keyring."
 msgstr ""
 
-#: gnu/packages/gnome.scm:452
+#: gnu/packages/gnome.scm:453
 msgid "Daemon to store passwords and encryption keys"
 msgstr "Dæmon til at lagre adgandskoder og krypteringsnøgler"
 
-#: gnu/packages/gnome.scm:454
+#: gnu/packages/gnome.scm:455
 msgid ""
 "gnome-keyring is a program that keeps passwords and other secrets for\n"
 "users.  It is run as a daemon in the session, similar to ssh-agent, and other\n"
@@ -2845,11 +3156,11 @@ msgid ""
 "forgotten when the session ends."
 msgstr ""
 
-#: gnu/packages/gnome.scm:519
+#: gnu/packages/gnome.scm:528
 msgid "GNOME's document viewer"
 msgstr ""
 
-#: gnu/packages/gnome.scm:521
+#: gnu/packages/gnome.scm:530
 msgid ""
 "Evince is a document viewer for multiple document formats.  It\n"
 "currently supports PDF, PostScript, DjVu, TIFF and DVI.  The goal\n"
@@ -2857,32 +3168,32 @@ msgid ""
 "on the GNOME Desktop with a single simple application."
 msgstr ""
 
-#: gnu/packages/gnome.scm:550
+#: gnu/packages/gnome.scm:559
 msgid "GNOME settings for various desktop components"
 msgstr ""
 
-#: gnu/packages/gnome.scm:552
+#: gnu/packages/gnome.scm:561
 msgid ""
 "Gsettings-desktop-schemas contains a collection of GSettings schemas\n"
 "for settings shared by various components of the GNOME desktop."
 msgstr ""
 
-#: gnu/packages/gnome.scm:586
+#: gnu/packages/gnome.scm:595
 msgid "Utility to implement the Freedesktop Icon Naming Specification"
 msgstr ""
 
-#: gnu/packages/gnome.scm:588
+#: gnu/packages/gnome.scm:597
 msgid ""
 "To help with the transition to the Freedesktop Icon Naming\n"
 "Specification, the icon naming utility maps the icon names used by the\n"
 "GNOME and KDE desktops to the icon names proposed in the specification."
 msgstr ""
 
-#: gnu/packages/gnome.scm:610
+#: gnu/packages/gnome.scm:619
 msgid "Utilities for working with desktop entries"
 msgstr ""
 
-#: gnu/packages/gnome.scm:612
+#: gnu/packages/gnome.scm:621
 msgid ""
 "This package contains a few command line utilities for working with\n"
 "desktop entries:\n"
@@ -2897,19 +3208,19 @@ msgid ""
 "                         handled by desktop files."
 msgstr ""
 
-#: gnu/packages/gnome.scm:646
+#: gnu/packages/gnome.scm:660
 msgid "GNOME icon theme"
 msgstr "GNOME-ikontema"
 
-#: gnu/packages/gnome.scm:648
+#: gnu/packages/gnome.scm:662
 msgid "Icons for the GNOME desktop."
 msgstr "Ikoner for GNOME-skrivebordet."
 
-#: gnu/packages/gnome.scm:687
+#: gnu/packages/gnome.scm:703
 msgid "Database of common MIME types"
 msgstr "Database med gængse MIME-typer"
 
-#: gnu/packages/gnome.scm:689
+#: gnu/packages/gnome.scm:705
 msgid ""
 "The shared-mime-info package contains the core database of common types\n"
 "and the update-mime-database command used to extend it.  It requires glib2 to\n"
@@ -2918,19 +3229,19 @@ msgid ""
 "database is translated at Transifex."
 msgstr ""
 
-#: gnu/packages/gnome.scm:713
+#: gnu/packages/gnome.scm:729
 msgid "Freedesktop icon theme"
 msgstr "Freedesktop-ikontema"
 
-#: gnu/packages/gnome.scm:715
+#: gnu/packages/gnome.scm:731
 msgid "Freedesktop icon theme."
 msgstr "Freedesktop-ikondtema."
 
-#: gnu/packages/gnome.scm:743
+#: gnu/packages/gnome.scm:759
 msgid "GNOME desktop notification library"
 msgstr ""
 
-#: gnu/packages/gnome.scm:745
+#: gnu/packages/gnome.scm:761
 msgid ""
 "Libnotify is a library that sends desktop notifications to a\n"
 "notification daemon, as defined in the Desktop Notifications spec.  These\n"
@@ -2938,11 +3249,11 @@ msgid ""
 "some form of information without getting in the user's way."
 msgstr ""
 
-#: gnu/packages/gnome.scm:777
+#: gnu/packages/gnome.scm:793
 msgid "GObject plugin system"
 msgstr ""
 
-#: gnu/packages/gnome.scm:779
+#: gnu/packages/gnome.scm:795
 msgid ""
 "Libpeas is a gobject-based plugins engine, and is targetted at giving\n"
 "every application the chance to assume its own extensibility.  It also has a\n"
@@ -2951,33 +3262,33 @@ msgid ""
 "the API."
 msgstr ""
 
-#: gnu/packages/gnome.scm:808
+#: gnu/packages/gnome.scm:824
 msgid "OpenGL extension to GTK+"
 msgstr "OpenGL-udvidelse til GTK+"
 
-#: gnu/packages/gnome.scm:809
+#: gnu/packages/gnome.scm:825
 msgid ""
 "GtkGLExt is an OpenGL extension to GTK+.  It provides\n"
 "additional GDK objects which support OpenGL rendering in GTK+ and GtkWidget\n"
 "API add-ons to make GTK+ widgets OpenGL-capable."
 msgstr ""
 
-#: gnu/packages/gnome.scm:852
+#: gnu/packages/gnome.scm:868
 msgid "GTK+ rapid application development tool"
 msgstr ""
 
-#: gnu/packages/gnome.scm:853
+#: gnu/packages/gnome.scm:869
 msgid ""
 "Glade is a rapid application development (RAD) tool to\n"
 "enable quick & easy development of user interfaces for the GTK+ toolkit and\n"
 "the GNOME desktop environment."
 msgstr ""
 
-#: gnu/packages/gnome.scm:878
+#: gnu/packages/gnome.scm:894
 msgid "CSS2 parsing and manipulation library"
 msgstr "CSS2-fortolknings- og manipuleringsbibliotek"
 
-#: gnu/packages/gnome.scm:880
+#: gnu/packages/gnome.scm:896
 msgid ""
 "Libcroco is a standalone CSS2 parsing and manipulation library.\n"
 "The parser provides a low level event driven SAC-like API and a CSS object\n"
@@ -2985,31 +3296,31 @@ msgid ""
 "XML/CSS rendering engine."
 msgstr ""
 
-#: gnu/packages/gnome.scm:913
+#: gnu/packages/gnome.scm:929
 msgid "GNOME's Structured File Library"
 msgstr ""
 
-#: gnu/packages/gnome.scm:915
+#: gnu/packages/gnome.scm:931
 msgid ""
 "Libgsf aims to provide an efficient extensible I/O abstraction for\n"
 "dealing with different structured file formats."
 msgstr ""
 
-#: gnu/packages/gnome.scm:966
+#: gnu/packages/gnome.scm:982
 msgid "Render SVG files using Cairo"
 msgstr ""
 
-#: gnu/packages/gnome.scm:968
+#: gnu/packages/gnome.scm:984
 msgid ""
 "Librsvg is a C library to render SVG files using the Cairo 2D graphics\n"
 "library."
 msgstr ""
 
-#: gnu/packages/gnome.scm:992
+#: gnu/packages/gnome.scm:1008
 msgid "Create trees of CORBA Interface Definition Language files"
 msgstr ""
 
-#: gnu/packages/gnome.scm:993
+#: gnu/packages/gnome.scm:1009
 msgid ""
 "Libidl is a library for creating trees of CORBA Interface\n"
 "Definition Language (idl) files, which is a specification for defining\n"
@@ -3018,144 +3329,144 @@ msgid ""
 "functionality was designed to be as reusable and portable as possible."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1033
+#: gnu/packages/gnome.scm:1049
 msgid "CORBA 2.4-compliant Object Request Broker"
 msgstr ""
 
-#: gnu/packages/gnome.scm:1034
+#: gnu/packages/gnome.scm:1050
 msgid ""
 "ORBit2 is a CORBA 2.4-compliant Object Request Broker (orb)\n"
 "featuring mature C, C++ and Python bindings."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1081
+#: gnu/packages/gnome.scm:1097
 msgid "Framework for creating reusable components for use in GNOME applications"
 msgstr ""
 
-#: gnu/packages/gnome.scm:1082
+#: gnu/packages/gnome.scm:1098
 msgid ""
 "Bonobo is a framework for creating reusable components for\n"
 "use in GNOME applications, built on top of CORBA."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1113
+#: gnu/packages/gnome.scm:1129
 msgid "Store application preferences"
 msgstr ""
 
-#: gnu/packages/gnome.scm:1114
+#: gnu/packages/gnome.scm:1130
 msgid ""
 "Gconf is a system for storing application preferences.  It\n"
 "is intended for user preferences; not arbitrary data storage."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1136
+#: gnu/packages/gnome.scm:1153
 msgid "Base MIME and Application database for GNOME"
 msgstr ""
 
-#: gnu/packages/gnome.scm:1137
+#: gnu/packages/gnome.scm:1154
 msgid ""
 "GNOME Mime Data is a module which contains the base MIME\n"
 "and Application database for GNOME.  The data stored by this module is\n"
 "designed to be accessed through the MIME functions in GnomeVFS."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1181
+#: gnu/packages/gnome.scm:1198
 msgid "Access files and folders in GNOME applications"
 msgstr ""
 
-#: gnu/packages/gnome.scm:1183
+#: gnu/packages/gnome.scm:1200
 msgid ""
 "GnomeVFS is the core library used to access files and folders in GNOME\n"
 "applications.  It provides a file system abstraction which allows applications\n"
 "to access local and remote files with a single consistent API."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1227
+#: gnu/packages/gnome.scm:1244
 msgid "Useful routines for building applications"
 msgstr ""
 
-#: gnu/packages/gnome.scm:1228
+#: gnu/packages/gnome.scm:1245
 msgid ""
 "The libgnome library provides a number of useful routines\n"
 "for building modern applications, including session management, activation of\n"
 "files and URIs, and displaying help."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1251
+#: gnu/packages/gnome.scm:1268
 msgid "2D drawing library"
 msgstr "2D-tegnebibliotek"
 
-#: gnu/packages/gnome.scm:1252
+#: gnu/packages/gnome.scm:1269
 msgid ""
 "Libart is a 2D drawing library intended as a\n"
 "high-quality vector-based 2D library with antialiasing and alpha composition."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1279
+#: gnu/packages/gnome.scm:1296
 msgid "Flexible widget for creating interactive structured graphics"
 msgstr ""
 
-#: gnu/packages/gnome.scm:1280
+#: gnu/packages/gnome.scm:1297
 msgid ""
 "The GnomeCanvas widget provides a flexible widget for\n"
 "creating interactive structured graphics."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1304
+#: gnu/packages/gnome.scm:1321
 msgid "C++ bindings to the GNOME Canvas library"
 msgstr ""
 
-#: gnu/packages/gnome.scm:1305
+#: gnu/packages/gnome.scm:1322
 msgid "C++ bindings to the GNOME Canvas library."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1336
+#: gnu/packages/gnome.scm:1353
 msgid "Additional widgets for applications"
 msgstr ""
 
-#: gnu/packages/gnome.scm:1337
+#: gnu/packages/gnome.scm:1354
 msgid ""
 "The libgnomeui library provides additional widgets for\n"
 "applications.  Many of the widgets from libgnomeui have already been\n"
 "ported to GTK+."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1363
+#: gnu/packages/gnome.scm:1380
 msgid "Load glade interfaces and access the glade built widgets"
 msgstr ""
 
-#: gnu/packages/gnome.scm:1364
+#: gnu/packages/gnome.scm:1381
 msgid ""
 "Libglade is a library that provides interfaces for loading\n"
 "graphical interfaces described in glade files and for accessing the\n"
 "widgets built in the loading process."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1394 gnu/packages/gnome.scm:1426
+#: gnu/packages/gnome.scm:1411 gnu/packages/gnome.scm:1443
 msgid "Printing framework for GNOME"
 msgstr ""
 
-#: gnu/packages/gnome.scm:1396
+#: gnu/packages/gnome.scm:1413
 msgid ""
 "GNOME-print was a printing framework for GNOME.  It has been deprecated\n"
 "since ca. 2006, when GTK+ itself incorporated printing support."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1471
+#: gnu/packages/gnome.scm:1488
 msgid "Some user interface controls using Bonobo"
 msgstr ""
 
-#: gnu/packages/gnome.scm:1472
+#: gnu/packages/gnome.scm:1489
 msgid ""
 "The Bonobo UI library provides a number of user interface\n"
 "controls using the Bonobo component framework."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1496
+#: gnu/packages/gnome.scm:1513
 msgid "Window Navigator Construction Kit"
 msgstr ""
 
-#: gnu/packages/gnome.scm:1498
+#: gnu/packages/gnome.scm:1515
 msgid ""
 "Libwnck is the Window Navigator Construction Kit, a library for use in\n"
 "writing pagers, tasklists, and more generally applications that are dealing\n"
@@ -3163,19 +3474,19 @@ msgid ""
 "Hints specification (EWMH)."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1551
+#: gnu/packages/gnome.scm:1568
 msgid "Document-centric objects and utilities"
 msgstr ""
 
-#: gnu/packages/gnome.scm:1552
+#: gnu/packages/gnome.scm:1569
 msgid "A GLib/GTK+ set of document-centric objects and utilities."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1635
+#: gnu/packages/gnome.scm:1652
 msgid "Spreadsheet application"
 msgstr ""
 
-#: gnu/packages/gnome.scm:1637
+#: gnu/packages/gnome.scm:1654
 msgid ""
 "GNUmeric is a GNU spreadsheet application, running under GNOME.  It is\n"
 "interoperable with other spreadsheet applications.  It has a vast array of\n"
@@ -3184,29 +3495,29 @@ msgid ""
 "engineering."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1671
+#: gnu/packages/gnome.scm:1694
 msgid "Default GNOME 3 themes"
 msgstr "Standardtemaer for GNOME 3"
 
-#: gnu/packages/gnome.scm:1673
+#: gnu/packages/gnome.scm:1696
 msgid "The default GNOME 3 themes (Adwaita and some accessibility themes)."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1706
+#: gnu/packages/gnome.scm:1729
 msgid "Manage encryption keys and passwords in the GNOME keyring"
 msgstr "Håndter krypteringsnøgler og adgangskoder i GNOME keyring"
 
-#: gnu/packages/gnome.scm:1708
+#: gnu/packages/gnome.scm:1731
 msgid ""
 "Seahorse is a GNOME application for managing encryption keys and\n"
 "passwords in the GNOME keyring."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1746 gnu/packages/gnome.scm:1955
+#: gnu/packages/gnome.scm:1769 gnu/packages/gnome.scm:1978
 msgid "Compiler for the GObject type system"
 msgstr ""
 
-#: gnu/packages/gnome.scm:1748
+#: gnu/packages/gnome.scm:1771
 msgid ""
 "Vala is a programming language that aims to bring modern programming\n"
 "language features to GNOME developers without imposing any additional runtime\n"
@@ -3214,11 +3525,11 @@ msgid ""
 "libraries written in C."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1786
+#: gnu/packages/gnome.scm:1809
 msgid "Virtual Terminal Emulator"
 msgstr ""
 
-#: gnu/packages/gnome.scm:1788
+#: gnu/packages/gnome.scm:1811
 msgid ""
 "VTE is a library (libvte) implementing a terminal emulator widget for\n"
 "GTK+, and a minimal sample application (vte) using that.  Vte is mainly used in\n"
@@ -3226,29 +3537,29 @@ msgid ""
 "editors, IDEs, etc."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1821
+#: gnu/packages/gnome.scm:1844
 msgid "Enhanced VTE terminal widget"
 msgstr ""
 
-#: gnu/packages/gnome.scm:1823
+#: gnu/packages/gnome.scm:1846
 msgid ""
 "VTE is a library (libvte) implementing a terminal emulator widget for\n"
 "GTK+, this fork provides additional functions exposed for keyboard text\n"
 "selection and URL hints."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1922
+#: gnu/packages/gnome.scm:1945
 msgid "Low-level GNOME configuration system"
 msgstr ""
 
-#: gnu/packages/gnome.scm:1923
+#: gnu/packages/gnome.scm:1946
 msgid ""
 "Dconf is a low-level configuration system.  Its main purpose\n"
 "is to provide a backend to GSettings on platforms that don't already have\n"
 "configuration storage systems."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1957
+#: gnu/packages/gnome.scm:1980
 msgid ""
 "JSON-GLib is a C library based on GLib providing serialization and\n"
 "deserialization support for the JavaScript Object Notation (JSON) format\n"
@@ -3257,11 +3568,11 @@ msgid ""
 "and objects."
 msgstr ""
 
-#: gnu/packages/gnome.scm:1996
+#: gnu/packages/gnome.scm:2019
 msgid "High-level API for X Keyboard Extension"
 msgstr ""
 
-#: gnu/packages/gnome.scm:1998
+#: gnu/packages/gnome.scm:2021
 msgid ""
 "LibXklavier is a library providing high-level API for X Keyboard\n"
 "Extension known as XKB.  This library is intended to support XFree86 and other\n"
@@ -3269,72 +3580,72 @@ msgid ""
 "indicators etc)."
 msgstr ""
 
-#: gnu/packages/gnome.scm:2026
+#: gnu/packages/gnome.scm:2049
 msgid "Python bindings to librsvg"
 msgstr ""
 
-#: gnu/packages/gnome.scm:2028
+#: gnu/packages/gnome.scm:2051
 msgid ""
 "This packages provides Python bindings to librsvg, the SVG rendering\n"
 "library."
 msgstr ""
 
-#: gnu/packages/gnome.scm:2077
+#: gnu/packages/gnome.scm:2100
 msgid "Network-related GIO modules"
 msgstr ""
 
-#: gnu/packages/gnome.scm:2079
+#: gnu/packages/gnome.scm:2102
 msgid ""
 "This package contains various network related extensions for the GIO\n"
 "library."
 msgstr ""
 
-#: gnu/packages/gnome.scm:2110
+#: gnu/packages/gnome.scm:2133
 msgid "RESTful web api query library"
 msgstr ""
 
-#: gnu/packages/gnome.scm:2112
+#: gnu/packages/gnome.scm:2135
 msgid ""
 "This library was designed to make it easier to access web services that\n"
 "claim to be \"RESTful\".  It includes convenience wrappers for libsoup and\n"
 "libxml to ease remote use of the RESTful API."
 msgstr ""
 
-#: gnu/packages/gnome.scm:2181
+#: gnu/packages/gnome.scm:2204
 msgid "GLib-based HTTP Library"
 msgstr ""
 
-#: gnu/packages/gnome.scm:2183
+#: gnu/packages/gnome.scm:2206
 msgid ""
 "LibSoup is an HTTP client/server library for GNOME.  It uses GObjects\n"
 "and the GLib main loop, to integrate well with GNOME applications."
 msgstr ""
 
-#: gnu/packages/gnome.scm:2229
+#: gnu/packages/gnome.scm:2252
 msgid "GObject bindings for \"Secret Service\" API"
 msgstr "GObject-bindinger for »Secret Service«-API'en"
 
-#: gnu/packages/gnome.scm:2231
+#: gnu/packages/gnome.scm:2254
 msgid ""
 "Libsecret is a GObject based library for storing and retrieving passwords\n"
 "and other secrets.  It communicates with the \"Secret Service\" using DBus."
 msgstr ""
 
-#: gnu/packages/gnome.scm:2266
+#: gnu/packages/gnome.scm:2289
 msgid "Minesweeper game"
 msgstr "Minestrygerspil"
 
-#: gnu/packages/gnome.scm:2268
+#: gnu/packages/gnome.scm:2291
 msgid ""
 "Mines (previously gnomine) is a puzzle game where you locate mines\n"
 "floating in an ocean using only your brain and a little bit of luck."
 msgstr ""
 
-#: gnu/packages/gnome.scm:2299
+#: gnu/packages/gnome.scm:2322
 msgid "Japanese logic game"
 msgstr ""
 
-#: gnu/packages/gnome.scm:2301
+#: gnu/packages/gnome.scm:2324
 msgid ""
 "Sudoku is a Japanese logic game that exploded in popularity in 2005.\n"
 "GNOME Sudoku is meant to have an interface as simple and unobstrusive as\n"
@@ -3342,11 +3653,11 @@ msgid ""
 "more fun."
 msgstr ""
 
-#: gnu/packages/gnome.scm:2347
+#: gnu/packages/gnome.scm:2370
 msgid "Terminal emulator"
 msgstr "Terminalemulator"
 
-#: gnu/packages/gnome.scm:2349
+#: gnu/packages/gnome.scm:2372
 msgid ""
 "GNOME Terminal is a terminal emulator application for accessing a\n"
 "UNIX shell environment which can be used to run programs available on\n"
@@ -3356,22 +3667,22 @@ msgid ""
 "keyboard shortcuts."
 msgstr ""
 
-#: gnu/packages/gnome.scm:2415
+#: gnu/packages/gnome.scm:2438
 msgid "Color management service"
 msgstr ""
 
-#: gnu/packages/gnome.scm:2416
+#: gnu/packages/gnome.scm:2439
 msgid ""
 "Colord is a system service that makes it easy to manage,\n"
 "install and generate color profiles to accurately color manage input and\n"
 "output devices."
 msgstr ""
 
-#: gnu/packages/gnome.scm:2459
+#: gnu/packages/gnome.scm:2482
 msgid "Geolocation service"
 msgstr ""
 
-#: gnu/packages/gnome.scm:2460
+#: gnu/packages/gnome.scm:2483
 msgid ""
 "Geoclue is a D-Bus service that provides location\n"
 "information.  The primary goal of the Geoclue project is to make creating\n"
@@ -3380,11 +3691,11 @@ msgid ""
 "permission from user."
 msgstr ""
 
-#: gnu/packages/gnome.scm:2495
+#: gnu/packages/gnome.scm:2518
 msgid "Geocoding and reverse-geocoding library"
 msgstr ""
 
-#: gnu/packages/gnome.scm:2497
+#: gnu/packages/gnome.scm:2520
 msgid ""
 "geocode-glib is a convenience library for geocoding (finding longitude,\n"
 "and latitude from an address) and reverse geocoding (finding an address from\n"
@@ -3392,11 +3703,11 @@ msgid ""
 "faster results and to avoid unnecessary server load."
 msgstr ""
 
-#: gnu/packages/gnome.scm:2550
+#: gnu/packages/gnome.scm:2573
 msgid "System daemon for managing power devices"
 msgstr "Systemdæmon til håndtering af strømenheder"
 
-#: gnu/packages/gnome.scm:2552
+#: gnu/packages/gnome.scm:2575
 msgid ""
 "UPower is an abstraction for enumerating power devices,\n"
 "listening to device events and querying history and statistics.  Any\n"
@@ -3404,21 +3715,21 @@ msgid ""
 "service via the system message bus."
 msgstr ""
 
-#: gnu/packages/gnome.scm:2602
+#: gnu/packages/gnome.scm:2630
 msgid "Location, time zone, and weather library for GNOME"
 msgstr ""
 
-#: gnu/packages/gnome.scm:2604
+#: gnu/packages/gnome.scm:2632
 msgid ""
 "libgweather is a library to access weather information from online\n"
 "services for numerous locations."
 msgstr ""
 
-#: gnu/packages/gnome.scm:2656
+#: gnu/packages/gnome.scm:2683
 msgid "GNOME settings daemon"
 msgstr ""
 
-#: gnu/packages/gnome.scm:2658
+#: gnu/packages/gnome.scm:2685
 msgid ""
 "This package contains the daemon responsible for setting the various\n"
 "parameters of a GNOME session and the applications that run under it.  It\n"
@@ -3426,42 +3737,42 @@ msgid ""
 "settings, themes, mouse settings, and startup of other daemons."
 msgstr ""
 
-#: gnu/packages/gnome.scm:2694
+#: gnu/packages/gnome.scm:2721
 msgid "Library to parse and save media playlists for GNOME"
 msgstr ""
 
-#: gnu/packages/gnome.scm:2695
+#: gnu/packages/gnome.scm:2722
 msgid ""
 "Totem-pl-parser is a GObjects-based library to parse and save\n"
 "playlists in a variety of formats."
 msgstr ""
 
-#: gnu/packages/gnome.scm:2729
+#: gnu/packages/gnome.scm:2756
 msgid "Solitaire card games"
 msgstr ""
 
-#: gnu/packages/gnome.scm:2731
+#: gnu/packages/gnome.scm:2758
 msgid ""
 "Aisleriot (also known as Solitaire or sol) is a collection of card games\n"
 "which are easy to play with the aid of a mouse."
 msgstr ""
 
-#: gnu/packages/gnome.scm:2755
+#: gnu/packages/gnome.scm:2782
 msgid "API documentation browser for GNOME"
 msgstr ""
 
-#: gnu/packages/gnome.scm:2757
+#: gnu/packages/gnome.scm:2784
 msgid ""
 "Devhelp is an API documentation browser for GTK+ and GNOME.  It works\n"
 "natively with GTK-Doc (the API reference system developed for GTK+ and used\n"
 "throughout GNOME for API documentation)."
 msgstr ""
 
-#: gnu/packages/gnome.scm:2818
+#: gnu/packages/gnome.scm:2845
 msgid "Object oriented GL/GLES Abstraction/Utility Layer"
 msgstr ""
 
-#: gnu/packages/gnome.scm:2820
+#: gnu/packages/gnome.scm:2847
 msgid ""
 "Cogl is a small library for using 3D graphics hardware to draw pretty\n"
 "pictures.  The API departs from the flat state machine style of OpenGL and is\n"
@@ -3469,26 +3780,26 @@ msgid ""
 "without stepping on each others toes."
 msgstr ""
 
-#: gnu/packages/gnome.scm:2875
+#: gnu/packages/gnome.scm:2902
 msgid "Open GL based interactive canvas library"
 msgstr ""
 
-#: gnu/packages/gnome.scm:2877 gnu/packages/gnome.scm:2906
+#: gnu/packages/gnome.scm:2904 gnu/packages/gnome.scm:2933
 msgid ""
 "Clutter is an Open GL based interactive canvas library, designed for\n"
 "creating fast, mainly 2D single window applications such as media box UIs,\n"
 "presentations, kiosk style applications and so on."
 msgstr ""
 
-#: gnu/packages/gnome.scm:2904
+#: gnu/packages/gnome.scm:2931
 msgid "Open GL based interactive canvas library GTK+ widget"
 msgstr ""
 
-#: gnu/packages/gnome.scm:2934
+#: gnu/packages/gnome.scm:2961
 msgid "Integration library for using GStreamer with Clutter"
 msgstr ""
 
-#: gnu/packages/gnome.scm:2936
+#: gnu/packages/gnome.scm:2963
 msgid ""
 "Clutter-Gst is an integration library for using GStreamer with Clutter.\n"
 "It provides a GStreamer sink to upload frames to GL and an actor that\n"
@@ -3496,11 +3807,11 @@ msgid ""
 "GL based interactive canvas library."
 msgstr ""
 
-#: gnu/packages/gnome.scm:2970
+#: gnu/packages/gnome.scm:2997
 msgid "C library providing a ClutterActor to display maps"
 msgstr ""
 
-#: gnu/packages/gnome.scm:2972
+#: gnu/packages/gnome.scm:2999
 msgid ""
 "libchamplain is a C library providing a ClutterActor to display maps.\n"
 "It also provides a Gtk+ widget to display maps in Gtk+ applications.  Python\n"
@@ -3508,32 +3819,32 @@ msgid ""
 "such as OpenStreetMap, OpenCycleMap, OpenAerialMap, and Maps for free."
 msgstr ""
 
-#: gnu/packages/gnome.scm:3003
+#: gnu/packages/gnome.scm:3030
 msgid "Object mapper from GObjects to SQLite"
 msgstr ""
 
-#: gnu/packages/gnome.scm:3005
+#: gnu/packages/gnome.scm:3032
 msgid ""
 "Gom provides an object mapper from GObjects to SQLite.  It helps you\n"
 "write applications that need to store structured data as well as make complex\n"
 "queries upon that data."
 msgstr ""
 
-#: gnu/packages/gnome.scm:3040
+#: gnu/packages/gnome.scm:3067
 msgid "Useful functionality shared among GNOME games"
 msgstr ""
 
-#: gnu/packages/gnome.scm:3042
+#: gnu/packages/gnome.scm:3069
 msgid ""
 "libgames-support is a small library intended for internal use by\n"
 "GNOME Games, but it may be used by others."
 msgstr ""
 
-#: gnu/packages/gnome.scm:3070
+#: gnu/packages/gnome.scm:3097
 msgid "Sliding block puzzles"
 msgstr ""
 
-#: gnu/packages/gnome.scm:3072
+#: gnu/packages/gnome.scm:3099
 msgid ""
 "GNOME Klotski is a set of block sliding puzzles.  The objective is to move\n"
 "the patterned block to the area bordered by green markers.  To do so, you will\n"
@@ -3541,67 +3852,67 @@ msgid ""
 "as possible!"
 msgstr ""
 
-#: gnu/packages/gnome.scm:3123
+#: gnu/packages/gnome.scm:3150
 msgid "Framework for discovering and browsing media"
 msgstr ""
 
-#: gnu/packages/gnome.scm:3125 gnu/packages/gnome.scm:3178
+#: gnu/packages/gnome.scm:3152 gnu/packages/gnome.scm:3205
 msgid ""
 "Grilo is a framework focused on making media discovery and browsing easy\n"
 "for application developers."
 msgstr ""
 
-#: gnu/packages/gnome.scm:3176
+#: gnu/packages/gnome.scm:3203
 msgid "Plugins for the Grilo media discovery library"
 msgstr ""
 
-#: gnu/packages/gnome.scm:3254
+#: gnu/packages/gnome.scm:3281
 msgid "Simple media player for GNOME based on GStreamer"
 msgstr ""
 
-#: gnu/packages/gnome.scm:3255
+#: gnu/packages/gnome.scm:3282
 msgid ""
 "Totem is a simple yet featureful media player for GNOME\n"
 "which can read a large number of file formats."
 msgstr ""
 
-#: gnu/packages/gnome.scm:3344
+#: gnu/packages/gnome.scm:3372
 msgid "Music player for GNOME"
 msgstr ""
 
-#: gnu/packages/gnome.scm:3345
+#: gnu/packages/gnome.scm:3373
 msgid ""
 "Rhythmbox is a music playing application for GNOME.  It\n"
 "supports playlists, song ratings, and any codecs installed through gstreamer."
 msgstr ""
 
-#: gnu/packages/gnome.scm:3395
+#: gnu/packages/gnome.scm:3423
 msgid "GNOME image viewer"
 msgstr ""
 
-#: gnu/packages/gnome.scm:3396
+#: gnu/packages/gnome.scm:3424
 msgid ""
 "Eye of GNOME is the GNOME image viewer.  It\n"
 "supports image conversion, rotation, and slideshows."
 msgstr ""
 
-#: gnu/packages/gnome.scm:3421
+#: gnu/packages/gnome.scm:3449
 msgid "GObject bindings for libudev"
 msgstr ""
 
-#: gnu/packages/gnome.scm:3423
+#: gnu/packages/gnome.scm:3451
 msgid ""
 "This library provides GObject bindings for libudev.  It was originally\n"
 "part of udev-extras, then udev, then systemd.  It's now a project on its own."
 msgstr ""
 
-#: gnu/packages/gnome.scm:3469
-msgid "Userspace virtual filesystem for GIO"
+#: gnu/packages/gnome.scm:3497
+msgid "Userspace virtual file system for GIO"
 msgstr ""
 
-#: gnu/packages/gnome.scm:3471
+#: gnu/packages/gnome.scm:3499
 msgid ""
-"GVFS is a userspace virtual filesystem designed to work with the I/O\n"
+"GVFS is a userspace virtual file system designed to work with the I/O\n"
 "abstraction of GIO.  It contains a GIO module that seamlessly adds GVFS support\n"
 "to all applications using the GIO API.  It also supports exposing the GVFS\n"
 "mounts to non-GIO applications using FUSE.\n"
@@ -3610,11 +3921,11 @@ msgid ""
 "DAV, and others."
 msgstr ""
 
-#: gnu/packages/gnome.scm:3517
+#: gnu/packages/gnome.scm:3545
 msgid "GLib binding for libusb1"
 msgstr "GLib-binding for libusb1"
 
-#: gnu/packages/gnome.scm:3519
+#: gnu/packages/gnome.scm:3547
 msgid ""
 "GUsb is a GObject wrapper for libusb1 that makes it easy to do\n"
 "asynchronous control, bulk and interrupt transfers with proper cancellation\n"
@@ -3622,11 +3933,11 @@ msgid ""
 "USB transfers with your high-level application or system daemon."
 msgstr ""
 
-#: gnu/packages/gnome.scm:3571
+#: gnu/packages/gnome.scm:3598
 msgid "Document and image scanner"
 msgstr "Dokument- og billedskanner"
 
-#: gnu/packages/gnome.scm:3572
+#: gnu/packages/gnome.scm:3599
 msgid ""
 "Simple Scan is an easy-to-use application, designed to let\n"
 "users connect their scanner and quickly have the image/document in an\n"
@@ -3635,52 +3946,52 @@ msgid ""
 "work and the interface is well tested."
 msgstr ""
 
-#: gnu/packages/gnome.scm:3621
+#: gnu/packages/gnome.scm:3646
 msgid "GNOME web browser"
 msgstr "GNOME-internetbrowser"
 
-#: gnu/packages/gnome.scm:3623
+#: gnu/packages/gnome.scm:3648
 msgid ""
 "Epiphany is a GNOME web browser targeted at non-technical users.  Its\n"
 "principles are simplicity and standards compliance."
 msgstr ""
 
-#: gnu/packages/gnome.scm:3679
+#: gnu/packages/gnome.scm:3704
 msgid "D-Bus debugger"
 msgstr "D-Bus-fejlsøger"
 
-#: gnu/packages/gnome.scm:3681
+#: gnu/packages/gnome.scm:3706
 msgid ""
 "D-Feet is a D-Bus debugger, which can be used to inspect D-Bus interfaces\n"
 "of running programs and invoke methods on those interfaces."
 msgstr ""
 
-#: gnu/packages/gnome.scm:3703
+#: gnu/packages/gnome.scm:3728
 msgid "XSL stylesheets for Yelp"
 msgstr "XSL-stilark for Yelp"
 
-#: gnu/packages/gnome.scm:3705
+#: gnu/packages/gnome.scm:3730
 msgid ""
 "Yelp-xsl contains XSL stylesheets that are used by the yelp help browser\n"
 "to format Docbook and Mallard documents."
 msgstr ""
 
-#: gnu/packages/gnome.scm:3736
+#: gnu/packages/gnome.scm:3761
 msgid "GNOME help browser"
 msgstr ""
 
-#: gnu/packages/gnome.scm:3738
+#: gnu/packages/gnome.scm:3763
 msgid ""
 "Yelp is the help viewer in Gnome.  It natively views Mallard, DocBook,\n"
 "man, info, and HTML documents.  It can locate documents according to the\n"
 "freedesktop.org help system specification."
 msgstr ""
 
-#: gnu/packages/gnome.scm:3766
+#: gnu/packages/gnome.scm:3791
 msgid "Yelp documentation tools"
 msgstr "Yelp-dokumentationsværktøjer"
 
-#: gnu/packages/gnome.scm:3768
+#: gnu/packages/gnome.scm:3793
 msgid ""
 "Yelp-tools is a collection of scripts and build utilities to help create,\n"
 "manage, and publish documentation for Yelp and the web.  Most of the heavy\n"
@@ -3688,32 +3999,32 @@ msgid ""
 "wraps things up in a developer-friendly way."
 msgstr ""
 
-#: gnu/packages/gnome.scm:3805
+#: gnu/packages/gnome.scm:3830
 msgid "GObject collection library"
 msgstr "GObject-samlingsbibliotek"
 
-#: gnu/packages/gnome.scm:3807
+#: gnu/packages/gnome.scm:3832
 msgid ""
 "Libgee is a utility library providing GObject-based interfaces and\n"
 "classes for commonly used data structures."
 msgstr ""
 
-#: gnu/packages/gnome.scm:3834
+#: gnu/packages/gnome.scm:3859
 msgid "GObject wrapper around the Exiv2 photo metadata library"
 msgstr ""
 
-#: gnu/packages/gnome.scm:3836
+#: gnu/packages/gnome.scm:3861
 msgid ""
 "Gexiv2 is a GObject wrapper around the Exiv2 photo metadata library.  It\n"
 "allows for GNOME applications to easily inspect and update EXIF, IPTC, and XMP\n"
 "metadata in photo and video files of various formats."
 msgstr ""
 
-#: gnu/packages/gnome.scm:3888
+#: gnu/packages/gnome.scm:3904
 msgid "Photo manager for GNOME 3"
 msgstr "Billedhåndtering for GNOME 3"
 
-#: gnu/packages/gnome.scm:3890
+#: gnu/packages/gnome.scm:3906
 msgid ""
 "Shotwell is a digital photo manager designed for the GNOME desktop\n"
 "environment.  It allows you to import photos from disk or camera, organize\n"
@@ -3721,42 +4032,42 @@ msgid ""
 "share them with others via social networking and more."
 msgstr ""
 
-#: gnu/packages/gnome.scm:3922
+#: gnu/packages/gnome.scm:3947
 msgid "Graphical archive manager for GNOME"
 msgstr "Grafisk arkivhåndtering for GNOME"
 
-#: gnu/packages/gnome.scm:3923
+#: gnu/packages/gnome.scm:3948
 msgid ""
 "File Roller is an archive manager for the GNOME desktop\n"
 "environment that allows users to view, unpack, and create compressed archives\n"
 "such as gzip tarballs."
 msgstr ""
 
-#: gnu/packages/gnome.scm:4001
+#: gnu/packages/gnome.scm:4026
 msgid "Session manager for GNOME"
 msgstr ""
 
-#: gnu/packages/gnome.scm:4003
+#: gnu/packages/gnome.scm:4028
 msgid ""
 "This package contains the GNOME session manager, as well as a\n"
 "configuration program to choose applications starting on login."
 msgstr ""
 
-#: gnu/packages/gnome.scm:4054
+#: gnu/packages/gnome.scm:4079
 msgid "Javascript bindings for GNOME"
 msgstr "Javascript-bindinger for GNOME"
 
-#: gnu/packages/gnome.scm:4057
+#: gnu/packages/gnome.scm:4082
 msgid ""
 "Gjs is a javascript binding for GNOME.  It's mainly based on spidermonkey\n"
 "javascript engine and the GObject introspection framework."
 msgstr ""
 
-#: gnu/packages/gnome.scm:4116
+#: gnu/packages/gnome.scm:4141
 msgid "GNOME text editor"
 msgstr "GNOME-tesktredigeringsprogram"
 
-#: gnu/packages/gnome.scm:4117
+#: gnu/packages/gnome.scm:4142
 msgid ""
 "While aiming at simplicity and ease of use, gedit is a\n"
 "powerful general purpose text editor."
@@ -3764,21 +4075,21 @@ msgstr ""
 "Selv om den forsøger at være enkel og nem at bruge, så\n"
 "er gedit et funktionsrigt og alment tekstredigeringsprogram."
 
-#: gnu/packages/gnome.scm:4141
+#: gnu/packages/gnome.scm:4166
 msgid "Display graphical dialog boxes from shell scripts"
 msgstr "Vis grafiske dialogbokse fra skalskripter"
 
-#: gnu/packages/gnome.scm:4144
+#: gnu/packages/gnome.scm:4169
 msgid ""
 "Zenity is a rewrite of gdialog, the GNOME port of dialog which allows you\n"
 "to display dialog boxes from the commandline and shell scripts."
 msgstr ""
 
-#: gnu/packages/gnome.scm:4189
+#: gnu/packages/gnome.scm:4214
 msgid "Window and compositing manager"
 msgstr ""
 
-#: gnu/packages/gnome.scm:4192
+#: gnu/packages/gnome.scm:4217
 msgid ""
 "Mutter is a window and compositing manager that displays and manages your\n"
 "desktop via OpenGL.  Mutter combines a sophisticated display engine using the\n"
@@ -3786,11 +4097,11 @@ msgid ""
 "window manager."
 msgstr ""
 
-#: gnu/packages/gnome.scm:4227
+#: gnu/packages/gnome.scm:4252
 msgid "Single sign-on framework for GNOME"
 msgstr ""
 
-#: gnu/packages/gnome.scm:4230
+#: gnu/packages/gnome.scm:4255
 msgid ""
 "GNOME Online Accounts provides interfaces so that applications and\n"
 "libraries in GNOME can access the user's online accounts.  It has providers for\n"
@@ -3798,32 +4109,32 @@ msgid ""
 "Exchange, Last.fm, IMAP/SMTP, Jabber, SIP and Kerberos."
 msgstr ""
 
-#: gnu/packages/gnome.scm:4292
+#: gnu/packages/gnome.scm:4317
 msgid "Store address books and calendars"
 msgstr ""
 
-#: gnu/packages/gnome.scm:4295
+#: gnu/packages/gnome.scm:4320
 msgid ""
 "This package provides a unified backend for programs that work with\n"
 "contacts, tasks, and calendar information.  It was originally developed for\n"
 "Evolution (hence the name), but is now used by other packages as well."
 msgstr ""
 
-#: gnu/packages/gnome.scm:4358
+#: gnu/packages/gnome.scm:4383
 msgid "Text entry and UI navigation application"
 msgstr ""
 
-#: gnu/packages/gnome.scm:4361
+#: gnu/packages/gnome.scm:4386
 msgid ""
 "Caribou is an input assistive technology intended for switch and pointer\n"
 "users."
 msgstr ""
 
-#: gnu/packages/gnome.scm:4450
+#: gnu/packages/gnome.scm:4492
 msgid "Network connection manager"
 msgstr ""
 
-#: gnu/packages/gnome.scm:4453
+#: gnu/packages/gnome.scm:4495
 msgid ""
 "NetworkManager is a system network service that manages your network\n"
 "devices and connections, attempting to keep active network connectivity when\n"
@@ -3832,21 +4143,29 @@ msgid ""
 "services."
 msgstr ""
 
-#: gnu/packages/gnome.scm:4488
+#: gnu/packages/gnome.scm:4520
+msgid "Database of broadband connection configuration"
+msgstr ""
+
+#: gnu/packages/gnome.scm:4521
+msgid "Database of broadband connection configuration."
+msgstr ""
+
+#: gnu/packages/gnome.scm:4556
 msgid "Applet for managing network connections"
 msgstr ""
 
-#: gnu/packages/gnome.scm:4491
+#: gnu/packages/gnome.scm:4559
 msgid ""
 "This package contains a systray applet for NetworkManager.  It displays\n"
 "the available networks and allows users to easily switch between them."
 msgstr ""
 
-#: gnu/packages/gnome.scm:4516
+#: gnu/packages/gnome.scm:4584
 msgid "C++ wrapper for XML parser library libxml2"
 msgstr "C++-omslag for XML-fortolkerbiblioteket libxml2"
 
-#: gnu/packages/gnome.scm:4518
+#: gnu/packages/gnome.scm:4586
 msgid ""
 "This package provides a C++ wrapper for the XML parser library\n"
 "libxml2."
@@ -3854,41 +4173,41 @@ msgstr ""
 "Denne pakke tilbyder et C++-omslag for XML-fortolkerbiblioteket\n"
 "libxml2."
 
-#: gnu/packages/gnome.scm:4575
+#: gnu/packages/gnome.scm:4657
 msgid "Display manager for GNOME"
 msgstr ""
 
-#: gnu/packages/gnome.scm:4578
+#: gnu/packages/gnome.scm:4660
 msgid ""
 "GNOME Display Manager is a system service that is responsible for\n"
 "providing graphical log-ins and managing local and remote displays."
 msgstr ""
 
-#: gnu/packages/gnome.scm:4602
+#: gnu/packages/gnome.scm:4684
 msgid "Portable system access library"
 msgstr ""
 
-#: gnu/packages/gnome.scm:4605
+#: gnu/packages/gnome.scm:4687
 msgid ""
 "LibGTop is a library to get system specific data such as CPU and memory\n"
 "usage and information about running processes."
 msgstr ""
 
-#: gnu/packages/gnome.scm:4635
+#: gnu/packages/gnome.scm:4717
 msgid "GNOME Bluetooth subsystem"
 msgstr ""
 
-#: gnu/packages/gnome.scm:4638
+#: gnu/packages/gnome.scm:4720
 msgid ""
 "This package contains tools for managing and manipulating Bluetooth\n"
 "devices using the GNOME desktop."
 msgstr ""
 
-#: gnu/packages/gnome.scm:4703
+#: gnu/packages/gnome.scm:4786
 msgid "Utilities to configure the GNOME desktop"
 msgstr ""
 
-#: gnu/packages/gnome.scm:4706
+#: gnu/packages/gnome.scm:4789
 msgid ""
 "This package contains configuration applets for the GNOME desktop,\n"
 "allowing to set accessibility configuration, desktop fonts, keyboard and mouse\n"
@@ -3896,21 +4215,21 @@ msgid ""
 "properties, screen resolution, and other GNOME parameters."
 msgstr ""
 
-#: gnu/packages/gnome.scm:4787
+#: gnu/packages/gnome.scm:4870
 msgid "Desktop shell for GNOME"
 msgstr ""
 
-#: gnu/packages/gnome.scm:4790
+#: gnu/packages/gnome.scm:4873
 msgid ""
 "GNOME Shell provides core user interface functions for the GNOME desktop,\n"
 "like switching to windows and launching applications."
 msgstr ""
 
-#: gnu/packages/gnome.scm:4824
+#: gnu/packages/gnome.scm:4907
 msgid "VNC viewer widget for GTK+"
 msgstr ""
 
-#: gnu/packages/gnome.scm:4826
+#: gnu/packages/gnome.scm:4909
 msgid ""
 "GTK-VNC is a VNC viewer widget for GTK+, used by remote desktop viewing\n"
 "applications, for instance the Vinagre client, GNOME Boxes and virt-viewer.\n"
@@ -3918,22 +4237,22 @@ msgid ""
 "as SASL, TLS and VeNCrypt.  Additionally it supports encoding extensions."
 msgstr ""
 
-#: gnu/packages/gnome.scm:4869
+#: gnu/packages/gnome.scm:4952
 msgid "File manager for GNOME"
 msgstr "Filhåndtering for GNOME"
 
-#: gnu/packages/gnome.scm:4872
+#: gnu/packages/gnome.scm:4955
 msgid ""
 "Nautilus (Files) is a file manager designed to fit the GNOME desktop\n"
 "design and behaviour, giving the user a simple way to navigate and manage its\n"
 "files."
 msgstr ""
 
-#: gnu/packages/gnome.scm:4900
+#: gnu/packages/gnome.scm:4983
 msgid "Disk usage analyzer for GNOME"
 msgstr ""
 
-#: gnu/packages/gnome.scm:4902
+#: gnu/packages/gnome.scm:4985
 msgid ""
 "Baobab (Disk Usage Analyzer) is a graphical application to analyse disk\n"
 "usage in the GNOME desktop environment.  It can easily scan device volumes or\n"
@@ -3941,11 +4260,11 @@ msgid ""
 "is complete it provides a graphical representation of each selected folder."
 msgstr ""
 
-#: gnu/packages/gnome.scm:4926
+#: gnu/packages/gnome.scm:5009
 msgid "Background images for the GNOME desktop"
 msgstr ""
 
-#: gnu/packages/gnome.scm:4928
+#: gnu/packages/gnome.scm:5011
 msgid ""
 "GNOME backgrounds package contains a collection of graphics files which\n"
 "can be used as backgrounds in the GNOME Desktop environment.  Additionally,\n"
@@ -3953,75 +4272,85 @@ msgid ""
 "can add your own files to the collection."
 msgstr ""
 
-#: gnu/packages/gnome.scm:4961
+#: gnu/packages/gnome.scm:5044
 msgid "Take pictures of your screen"
 msgstr ""
 
-#: gnu/packages/gnome.scm:4963
+#: gnu/packages/gnome.scm:5046
 msgid ""
 "GNOME Screenshot is a utility used for taking screenshots of the entire\n"
 "screen, a window or a user defined area of the screen, with optional\n"
 "beautifying border effects."
 msgstr ""
 
-#: gnu/packages/gnome.scm:4991
+#: gnu/packages/gnome.scm:5083
 msgid "Graphical editor for GNOME's dconf configuration system"
 msgstr ""
 
-#: gnu/packages/gnome.scm:4993
+#: gnu/packages/gnome.scm:5085
 msgid ""
 "Dconf-editor is a graphical tool for browsing and editing the dconf\n"
 "configuration system for GNOME.  It allows users to configure desktop\n"
 "software that do not provide their own configuration interface."
 msgstr ""
 
-#: gnu/packages/gnome.scm:5037
+#: gnu/packages/gnome.scm:5130
 msgid "The GNU desktop environment"
 msgstr "GNU-skrivebordsmiljøet"
 
-#: gnu/packages/gnome.scm:5040
+#: gnu/packages/gnome.scm:5133
 msgid ""
 "GNOME is the graphical desktop for GNU.  It includes a wide variety of\n"
 "applications for browsing the web, editing text and images, creating\n"
 "documents and diagrams, playing media, scanning, and much more."
 msgstr ""
 
-#: gnu/packages/gnome.scm:5091
+#: gnu/packages/gnome.scm:5184
 msgid "Desktop recording program"
 msgstr "Skrivebordsoptagelsesprogram"
 
-#: gnu/packages/gnome.scm:5092
+#: gnu/packages/gnome.scm:5185
 msgid ""
 "Byzanz is a simple desktop recording program with a\n"
 "command-line interface.  It can record part or all of an X display for a\n"
 "specified duration and save it as a GIF encoded animated image file."
 msgstr ""
 
-#: gnu/packages/gnome.scm:5120
+#: gnu/packages/gnome.scm:5213
 msgid "Library for accessing SkyDrive and Hotmail"
 msgstr "Bibliotek til at tilgå SkyDrive og Hotmail"
 
-#: gnu/packages/gnome.scm:5122
+#: gnu/packages/gnome.scm:5215
 msgid ""
 "Libzapojit is a GLib-based library for accessing online service APIs of\n"
 "Microsoft SkyDrive and Hotmail, using their REST protocols."
 msgstr ""
 
-#: gnu/packages/gnome.scm:5148
+#: gnu/packages/gnome.scm:5241
 msgid "GNOME's calendar application"
 msgstr "GNOME's kalenderprogram"
 
-#: gnu/packages/gnome.scm:5150
+#: gnu/packages/gnome.scm:5243
 msgid ""
 "GNOME Calendar is a simple calendar application designed to fit the GNOME\n"
 "desktop.  It supports multiple calendars, monthly view and yearly view."
 msgstr ""
 
-#: gnu/packages/gnome.scm:5188
+#: gnu/packages/gnome.scm:5271
+msgid "Look up words in dictionary sources"
+msgstr ""
+
+#: gnu/packages/gnome.scm:5273
+msgid ""
+"GNOME Dictionary can look for the definition or translation of a word in\n"
+"existing databases over the internet."
+msgstr ""
+
+#: gnu/packages/gnome.scm:5311
 msgid "Customize advanced GNOME 3 options"
 msgstr "Tilpas avancerede GNOME 3-indstillinger"
 
-#: gnu/packages/gnome.scm:5191
+#: gnu/packages/gnome.scm:5314
 msgid ""
 "GNOME Tweak Tool allows adjusting advanced configuration settings in\n"
 "GNOME 3.  This includes things like the fonts used in user interface elements,\n"
@@ -4029,53 +4358,53 @@ msgid ""
 "GNOME Shell appearance and extension, etc."
 msgstr ""
 
-#: gnu/packages/gnome.scm:5218
+#: gnu/packages/gnome.scm:5341
 msgid "Extensions for GNOME Shell"
 msgstr ""
 
-#: gnu/packages/gnome.scm:5219
+#: gnu/packages/gnome.scm:5342
 msgid ""
 "GNOME Shell extensions modify and extend GNOME Shell\n"
 "functionality and behavior."
 msgstr ""
 
-#: gnu/packages/gnome.scm:5249
+#: gnu/packages/gnome.scm:5372
 msgid "A flat GTK+ theme with transparent elements"
 msgstr ""
 
-#: gnu/packages/gnome.scm:5250
+#: gnu/packages/gnome.scm:5373
 msgid ""
 "Arc is a flat theme with transparent elements for GTK 3, GTK\n"
 "2, and GNOME Shell which supports GTK 3 and GTK 2 based desktop environments\n"
 "like GNOME, Unity, Budgie, Pantheon, XFCE, Mate, etc."
 msgstr ""
 
-#: gnu/packages/gnome.scm:5286
+#: gnu/packages/gnome.scm:5409
 msgid "Moka icon theme"
 msgstr "Moka-ikontema"
 
-#: gnu/packages/gnome.scm:5287
+#: gnu/packages/gnome.scm:5410
 msgid ""
 "Moka is a stylized desktop icon set, designed to be clear,\n"
 "simple and consistent."
 msgstr ""
 
-#: gnu/packages/gnome.scm:5317
+#: gnu/packages/gnome.scm:5440
 msgid "Arc icon theme"
 msgstr "Arc-ikontema"
 
-#: gnu/packages/gnome.scm:5318
+#: gnu/packages/gnome.scm:5441
 msgid ""
 "The Arc icon theme provides a set of icons matching the\n"
 "style of the Arc GTK theme.  Icons missing from the Arc theme are provided by\n"
 "the Moka icon theme."
 msgstr ""
 
-#: gnu/packages/gnome.scm:5350
+#: gnu/packages/gnome.scm:5473
 msgid "Library to aggregate data about people"
 msgstr "Bibliotek til at aggregere data om folk"
 
-#: gnu/packages/gnome.scm:5351
+#: gnu/packages/gnome.scm:5474
 msgid ""
 "Libfolks is a library that aggregates information about people\n"
 "from multiple sources (e.g., Telepathy connection managers for IM contacts,\n"
@@ -4084,21 +4413,102 @@ msgid ""
 "compiled."
 msgstr ""
 
-#: gnu/packages/gnome.scm:5386
+#: gnu/packages/gnome.scm:5509
 msgid "GLib/GObject wrapper for the Facebook API"
 msgstr "GLib/GObject-omslag for Facebook-API'en"
 
-#: gnu/packages/gnome.scm:5387
+#: gnu/packages/gnome.scm:5510
 msgid ""
 "This library allows you to use the Facebook API from\n"
 "GLib/GObject code."
 msgstr ""
 
-#: gnu/packages/gnuzilla.scm:97
+#: gnu/packages/gnome.scm:5538
+msgid "GNOME keyboard configuration library"
+msgstr "Konfigurationsbibliotek for GNOME-tastatur"
+
+#: gnu/packages/gnome.scm:5540
+msgid ""
+"Libgnomekbd is a keyboard configuration library for the GNOME desktop\n"
+"environment, which can notably display keyboard layouts."
+msgstr ""
+
+#: gnu/packages/gnome.scm:5574
+msgid "Library for writing single instance applications"
+msgstr "Bibliotek til at skrive enkel instans-programmer"
+
+#: gnu/packages/gnome.scm:5576
+msgid ""
+"Libunique is a library for writing single instance applications.  If you\n"
+"launch a single instance application twice, the second instance will either just\n"
+"quit or will send a message to the running instance.  Libunique makes it easy to\n"
+"write this kind of application, by providing a base class, taking care of all\n"
+"the IPC machinery needed to send messages to a running instance, and also\n"
+"handling the startup notification side."
+msgstr ""
+
+#: gnu/packages/gnome.scm:5608
+msgid "Desktop calculator"
+msgstr "Skrivebordslommeregner"
+
+#: gnu/packages/gnome.scm:5610
+msgid ""
+"Calculator is an application that solves mathematical equations and\n"
+"is suitable as a default application in a Desktop environment."
+msgstr ""
+
+#: gnu/packages/gnome.scm:5635
+msgid "Virtual sticky note"
+msgstr ""
+
+#: gnu/packages/gnome.scm:5637
+msgid ""
+"Xpad is a sticky note that strives to be simple, fault tolerant,\n"
+"and customizable.  Xpad consists of independent pad windows, each is\n"
+"basically a text box in which notes can be written."
+msgstr ""
+
+#: gnu/packages/gnome.scm:5667
+msgid "Unicode character picker and font browser"
+msgstr ""
+
+#: gnu/packages/gnome.scm:5669
+msgid ""
+"This program allows you to browse through all the available Unicode\n"
+"characters and categories for the installed fonts, and to examine their\n"
+"detailed properties.  It is an easy way to find the character you might\n"
+"only know by its Unicode name or code point."
+msgstr ""
+
+#: gnu/packages/gnome.scm:5699
+msgid "Web development studio"
+msgstr ""
+
+#: gnu/packages/gnome.scm:5701
+msgid ""
+"Bluefish is an editor targeted towards programmers and web developers,\n"
+"with many options to write web sites, scripts and other code.\n"
+"Bluefish supports many programming and markup languages."
+msgstr ""
+
+#: gnu/packages/gnome.scm:5733
+msgid "Process viewer and system resource monitor for GNOME"
+msgstr ""
+
+#: gnu/packages/gnome.scm:5735
+msgid ""
+"GNOME System Monitor is a GNOME process viewer and system monitor with\n"
+"an attractive, easy-to-use interface.  It has features, such as a tree view\n"
+"for process dependencies, icons for processes, the ability to hide processes,\n"
+"graphical time histories of CPU/memory/swap usage and the ability to\n"
+"kill/reinice processes."
+msgstr ""
+
+#: gnu/packages/gnuzilla.scm:101
 msgid "Mozilla javascript engine"
 msgstr "Mozillas javascriptmotor"
 
-#: gnu/packages/gnuzilla.scm:98
+#: gnu/packages/gnuzilla.scm:102
 msgid ""
 "SpiderMonkey is Mozilla's JavaScript engine written\n"
 "in C/C++."
@@ -4106,22 +4516,22 @@ msgstr ""
 "SpiderMonkey er Mozillas JavaScript-motor skrevet\n"
 "i C/C++."
 
-#: gnu/packages/gnuzilla.scm:173
+#: gnu/packages/gnuzilla.scm:180
 msgid "Netscape API for system level and libc-like functions"
 msgstr ""
 
-#: gnu/packages/gnuzilla.scm:174
+#: gnu/packages/gnuzilla.scm:181
 msgid ""
 "Netscape Portable Runtime (NSPR) provides a\n"
 "platform-neutral API for system level and libc-like functions.  It is used\n"
 "in the Mozilla clients."
 msgstr ""
 
-#: gnu/packages/gnuzilla.scm:279
+#: gnu/packages/gnuzilla.scm:285
 msgid "Network Security Services"
 msgstr ""
 
-#: gnu/packages/gnuzilla.scm:281
+#: gnu/packages/gnuzilla.scm:287
 msgid ""
 "Network Security Services (NSS) is a set of libraries designed to support\n"
 "cross-platform development of security-enabled client and server applications.\n"
@@ -4130,33 +4540,33 @@ msgid ""
 "standards."
 msgstr ""
 
-#: gnu/packages/gnuzilla.scm:586
+#: gnu/packages/gnuzilla.scm:623
 msgid "Entirely free browser derived from Mozilla Firefox"
 msgstr ""
 
-#: gnu/packages/gnuzilla.scm:588
+#: gnu/packages/gnuzilla.scm:625
 msgid ""
 "IceCat is the GNU version of the Firefox browser.  It is entirely free\n"
 "software, which does not recommend non-free plugins and addons.  It also\n"
 "features built-in privacy-protecting features."
 msgstr ""
 
-#: gnu/packages/gtk.scm:91
+#: gnu/packages/gtk.scm:94
 msgid "GNOME accessibility toolkit"
 msgstr ""
 
-#: gnu/packages/gtk.scm:93
+#: gnu/packages/gtk.scm:96
 msgid ""
 "ATK provides the set of accessibility interfaces that are implemented\n"
 "by other toolkits and applications.  Using the ATK interfaces, accessibility\n"
 "tools have full access to view and control running applications."
 msgstr ""
 
-#: gnu/packages/gtk.scm:132
+#: gnu/packages/gtk.scm:136
 msgid "2D graphics library"
 msgstr "2D-grafikbibliotek"
 
-#: gnu/packages/gtk.scm:134
+#: gnu/packages/gtk.scm:138
 msgid ""
 "Cairo is a 2D graphics library with support for multiple output devices.\n"
 "Currently supported output targets include the X Window System (via both\n"
@@ -4174,52 +4584,56 @@ msgid ""
 "affine transformation (scale, rotation, shear, etc.)."
 msgstr ""
 
-#: gnu/packages/gtk.scm:182
+#: gnu/packages/gtk.scm:166
+msgid "2D graphics library (with X11 support)"
+msgstr "2D-grafikbibliotek (med X11-understøttelse)"
+
+#: gnu/packages/gtk.scm:199
 msgid "OpenType text shaping engine"
-msgstr ""
+msgstr "OpenType-tekstformningsmotor"
 
-#: gnu/packages/gtk.scm:184
+#: gnu/packages/gtk.scm:201
 msgid "HarfBuzz is an OpenType text shaping engine."
-msgstr ""
+msgstr "HarfBuzz er et OpenType-tekstformningsmotor."
 
-#: gnu/packages/gtk.scm:215
+#: gnu/packages/gtk.scm:232
 msgid "GNOME text and font handling library"
 msgstr ""
 
-#: gnu/packages/gtk.scm:217
+#: gnu/packages/gtk.scm:234
 msgid ""
 "Pango is the core text and font handling library used in GNOME\n"
 "applications.  It has extensive support for the different writing systems\n"
 "used throughout the world."
 msgstr ""
 
-#: gnu/packages/gtk.scm:243
+#: gnu/packages/gtk.scm:260
 msgid "Obsolete pango functions"
 msgstr ""
 
-#: gnu/packages/gtk.scm:244
+#: gnu/packages/gtk.scm:261
 msgid ""
 "Pangox was a X backend to pango.  It is now obsolete and no\n"
 "longer provided by recent pango releases.  pangox-compat provides the\n"
 "functions which were removed."
 msgstr ""
 
-#: gnu/packages/gtk.scm:280
+#: gnu/packages/gtk.scm:297
 msgid "GTK+ widget for interactive graph-like environments"
 msgstr ""
 
-#: gnu/packages/gtk.scm:282
+#: gnu/packages/gtk.scm:299
 msgid ""
 "Ganv is an interactive GTK+ widget for interactive “boxes and lines” or\n"
 "graph-like environments, e.g. modular synths or finite state machine\n"
 "diagrams."
 msgstr ""
 
-#: gnu/packages/gtk.scm:334
+#: gnu/packages/gtk.scm:368
 msgid "Widget that extends the standard GTK+ 2.x 'GtkTextView' widget"
 msgstr ""
 
-#: gnu/packages/gtk.scm:336
+#: gnu/packages/gtk.scm:370
 msgid ""
 "GtkSourceView is a portable C library that extends the standard GTK+\n"
 "framework for multiline text editing with support for configurable syntax\n"
@@ -4227,56 +4641,56 @@ msgid ""
 "printing and other features typical of a source code editor."
 msgstr ""
 
-#: gnu/packages/gtk.scm:385
+#: gnu/packages/gtk.scm:419
 msgid "GNOME source code widget"
 msgstr ""
 
-#: gnu/packages/gtk.scm:386
+#: gnu/packages/gtk.scm:420
 msgid ""
 "GtkSourceView is a text widget that extends the standard\n"
 "GTK+ text widget GtkTextView.  It improves GtkTextView by implementing syntax\n"
 "highlighting and other features typical of a source code editor."
 msgstr ""
 
-#: gnu/packages/gtk.scm:436
+#: gnu/packages/gtk.scm:470
 msgid "GNOME image loading and manipulation library"
 msgstr ""
 
-#: gnu/packages/gtk.scm:438
+#: gnu/packages/gtk.scm:472
 msgid ""
 "GdkPixbuf is a library for image loading and manipulation developed\n"
 "in the GNOME project."
 msgstr ""
 
-#: gnu/packages/gtk.scm:470
+#: gnu/packages/gtk.scm:504
 msgid "GNOME image loading and manipulation library, with SVG support"
 msgstr "GNOME-billedindlæsnings- og manipuleringsbibliotek, med SVG-understøttelse"
 
-#: gnu/packages/gtk.scm:510
+#: gnu/packages/gtk.scm:544
 msgid "Assistive Technology Service Provider Interface, core components"
 msgstr ""
 
-#: gnu/packages/gtk.scm:512
+#: gnu/packages/gtk.scm:546
 msgid ""
 "The Assistive Technology Service Provider Interface, core components,\n"
 "is part of the GNOME accessibility project."
 msgstr ""
 
-#: gnu/packages/gtk.scm:545
+#: gnu/packages/gtk.scm:579
 msgid "Assistive Technology Service Provider Interface, ATK bindings"
 msgstr ""
 
-#: gnu/packages/gtk.scm:547
+#: gnu/packages/gtk.scm:581
 msgid ""
 "The Assistive Technology Service Provider Interface\n"
 "is part of the GNOME accessibility project."
 msgstr ""
 
-#: gnu/packages/gtk.scm:605
+#: gnu/packages/gtk.scm:640
 msgid "Cross-platform toolkit for creating graphical user interfaces"
 msgstr ""
 
-#: gnu/packages/gtk.scm:607
+#: gnu/packages/gtk.scm:642
 msgid ""
 "GTK+, or the GIMP Toolkit, is a multi-platform toolkit for creating\n"
 "graphical user interfaces.  Offering a complete set of widgets, GTK+ is\n"
@@ -4284,11 +4698,11 @@ msgid ""
 "application suites."
 msgstr ""
 
-#: gnu/packages/gtk.scm:730
+#: gnu/packages/gtk.scm:774
 msgid "Cairo bindings for GNU Guile"
 msgstr ""
 
-#: gnu/packages/gtk.scm:732
+#: gnu/packages/gtk.scm:776
 msgid ""
 "Guile-Cairo wraps the Cairo graphics library for Guile Scheme.\n"
 "Guile-Cairo is complete, wrapping almost all of the Cairo API.  It is API\n"
@@ -4298,21 +4712,21 @@ msgid ""
 "exceptions, macros, and a dynamic programming environment."
 msgstr ""
 
-#: gnu/packages/gtk.scm:772
+#: gnu/packages/gtk.scm:816
 msgid "Render SVG images using Cairo from Guile"
 msgstr ""
 
-#: gnu/packages/gtk.scm:774
+#: gnu/packages/gtk.scm:818
 msgid ""
 "Guile-RSVG wraps the RSVG library for Guile, allowing you to render SVG\n"
 "images onto Cairo surfaces."
 msgstr ""
 
-#: gnu/packages/gtk.scm:818
+#: gnu/packages/gtk.scm:862
 msgid "Create SVG or PDF presentations in Guile"
 msgstr "Opret SVG- eller PDF-præsentationer i Guile"
 
-#: gnu/packages/gtk.scm:820
+#: gnu/packages/gtk.scm:864
 msgid ""
 "Guile-Present defines a declarative vocabulary for presentations,\n"
 "together with tools to render presentation documents as SVG or PDF.\n"
@@ -4321,51 +4735,51 @@ msgid ""
 "documents."
 msgstr ""
 
-#: gnu/packages/gtk.scm:874
+#: gnu/packages/gtk.scm:918
 msgid "Guile interface for GTK+ programming for GNOME"
 msgstr "Guile brugerflade til GTK+-programmering for GNOME"
 
-#: gnu/packages/gtk.scm:876
+#: gnu/packages/gtk.scm:920
 msgid ""
 "Includes guile-clutter, guile-gnome-gstreamer,\n"
 "guile-gnome-platform (GNOME developer libraries), and guile-gtksourceview."
 msgstr ""
 
-#: gnu/packages/gtk.scm:908
+#: gnu/packages/gtk.scm:952
 msgid "C++ bindings to the Cairo 2D graphics library"
 msgstr "C++-bindinger til CAiro 2D-grafikbiblioteket"
 
-#: gnu/packages/gtk.scm:910
+#: gnu/packages/gtk.scm:954
 msgid ""
 "Cairomm provides a C++ programming interface to the Cairo 2D graphics\n"
 "library."
 msgstr ""
 
-#: gnu/packages/gtk.scm:934
+#: gnu/packages/gtk.scm:978
 msgid "C++ interface to the Pango text rendering library"
 msgstr "C++-grænseflade til tekstoptegningsbiblioteket Pango"
 
-#: gnu/packages/gtk.scm:936
+#: gnu/packages/gtk.scm:980
 msgid ""
 "Pangomm provides a C++ programming interface to the Pango text rendering\n"
 "library."
 msgstr ""
 
-#: gnu/packages/gtk.scm:957
+#: gnu/packages/gtk.scm:1001
 msgid "C++ interface to the ATK accessibility library"
 msgstr "C++-grænseflade til ATK-tilgængelighedsbiblioteket"
 
-#: gnu/packages/gtk.scm:959
+#: gnu/packages/gtk.scm:1003
 msgid ""
 "ATKmm provides a C++ programming interface to the ATK accessibility\n"
 "toolkit."
 msgstr ""
 
-#: gnu/packages/gtk.scm:999
+#: gnu/packages/gtk.scm:1043
 msgid "C++ interface to the GTK+ graphical user interface library"
 msgstr ""
 
-#: gnu/packages/gtk.scm:1001
+#: gnu/packages/gtk.scm:1045
 msgid ""
 "gtkmm is the official C++ interface for the popular GUI library GTK+.\n"
 "Highlights include typesafe callbacks, and a comprehensive set of widgets that\n"
@@ -4374,30 +4788,30 @@ msgid ""
 "extensive documentation, including API reference and a tutorial."
 msgstr ""
 
-#: gnu/packages/gtk.scm:1060
+#: gnu/packages/gtk.scm:1104
 msgid "Python bindings for cairo"
 msgstr "Pythonbindinger for cairo"
 
-#: gnu/packages/gtk.scm:1062
+#: gnu/packages/gtk.scm:1106
 msgid "Pycairo is a set of Python bindings for the Cairo graphics library."
 msgstr "Pycairo er et sæt af Pythonbindinger for grafikbiblioteket Cairo."
 
-#: gnu/packages/gtk.scm:1146
+#: gnu/packages/gtk.scm:1190
 msgid "Python bindings for GTK+"
 msgstr "Pythonbindinger for GTK+"
 
-#: gnu/packages/gtk.scm:1148
+#: gnu/packages/gtk.scm:1192
 msgid ""
 "PyGTK allows you to write full featured GTK programs in Python.  It is\n"
 "targetted at GTK 2.x, and can be used in conjunction with gnome-python to\n"
 "write GNOME applications."
 msgstr ""
 
-#: gnu/packages/gtk.scm:1179
+#: gnu/packages/gtk.scm:1223
 msgid "Library for minimalistic gtk+3 user interfaces"
 msgstr ""
 
-#: gnu/packages/gtk.scm:1180
+#: gnu/packages/gtk.scm:1224
 msgid ""
 "Girara is a library that implements a user interface that\n"
 "focuses on simplicity and minimalism.  Currently based on GTK+, a\n"
@@ -4408,53 +4822,64 @@ msgid ""
 "information."
 msgstr ""
 
-#: gnu/packages/gtk.scm:1241
+#: gnu/packages/gtk.scm:1286
 msgid "Documentation generator from C source code"
 msgstr ""
 
-#: gnu/packages/gtk.scm:1243
+#: gnu/packages/gtk.scm:1288
 msgid ""
 "GTK-Doc generates API documentation from comments added to C code.  It is\n"
 "typically used to document the public API of GTK+ and GNOME libraries, but it\n"
 "can also be used to document application code."
 msgstr ""
 
-#: gnu/packages/gtk.scm:1270
+#: gnu/packages/gtk.scm:1316
 msgid "Theming engines for GTK+ 2.x"
 msgstr ""
 
-#: gnu/packages/gtk.scm:1272
+#: gnu/packages/gtk.scm:1318
 msgid ""
 "This package contains the standard GTK+ 2.x theming engines including\n"
 "Clearlooks, Crux, High Contrast, Industrial, LighthouseBlue, Metal, Mist,\n"
 "Redmond95 and ThinIce."
 msgstr ""
 
-#: gnu/packages/gtk.scm:1300
+#: gnu/packages/gtk.scm:1346
 msgid "Cairo-based theming engine for GTK+ 2.x"
 msgstr ""
 
-#: gnu/packages/gtk.scm:1302
+#: gnu/packages/gtk.scm:1348
 msgid ""
 "Murrine is a cairo-based GTK+ theming engine.  It is named after the\n"
 "glass artworks done by Venicians glass blowers."
 msgstr ""
 
-#: gnu/packages/gtk.scm:1327
+#: gnu/packages/gtk.scm:1373
 msgid "Spell-checking addon for GTK's TextView widget"
 msgstr ""
 
-#: gnu/packages/gtk.scm:1329
+#: gnu/packages/gtk.scm:1375
 msgid ""
 "GtkSpell provides word-processor-style highlighting and replacement of\n"
 "misspelled words in a GtkTextView widget."
 msgstr ""
 
-#: gnu/packages/guile.scm:120 gnu/packages/guile.scm:188
+#: gnu/packages/gtk.scm:1398
+msgid "Lightweight GTK+ clipboard manager"
+msgstr ""
+
+#: gnu/packages/gtk.scm:1400
+msgid ""
+"ClipIt is a clipboard manager with features such as a history, search\n"
+"thereof, global hotkeys and clipboard item actions.  It was forked from\n"
+"Parcellite and adds bugfixes and features."
+msgstr ""
+
+#: gnu/packages/guile.scm:123 gnu/packages/guile.scm:199
 msgid "Scheme implementation intended especially for extensions"
 msgstr ""
 
-#: gnu/packages/guile.scm:122 gnu/packages/guile.scm:190
+#: gnu/packages/guile.scm:125 gnu/packages/guile.scm:201
 msgid ""
 "Guile is the GNU Ubiquitous Intelligent Language for Extensions, the\n"
 "official extension language of the GNU system.  It is an implementation of\n"
@@ -4463,15 +4888,15 @@ msgid ""
 "without requiring the source code to be rewritten."
 msgstr ""
 
-#: gnu/packages/guile.scm:221
+#: gnu/packages/guile.scm:249
 msgid "Snapshot of what will become version 2.2 of GNU Guile"
 msgstr ""
 
-#: gnu/packages/guile.scm:320
+#: gnu/packages/guile.scm:367
 msgid "Web application framework written in Guile"
 msgstr ""
 
-#: gnu/packages/guile.scm:321
+#: gnu/packages/guile.scm:368
 msgid ""
 "GNU Artanis is a web application framework written in Guile\n"
 "Scheme.  A web application framework (WAF) is a software framework that is\n"
@@ -4483,11 +4908,11 @@ msgid ""
 "more."
 msgstr ""
 
-#: gnu/packages/guile.scm:351
+#: gnu/packages/guile.scm:398
 msgid "Framework for building readers for GNU Guile"
 msgstr "Ramme til at bygge læsere for GNU Guile"
 
-#: gnu/packages/guile.scm:353
+#: gnu/packages/guile.scm:400
 msgid ""
 "Guile-Reader is a simple framework for building readers for GNU Guile.\n"
 "\n"
@@ -4502,21 +4927,21 @@ msgid ""
 "many readers as needed)."
 msgstr ""
 
-#: gnu/packages/guile.scm:398
+#: gnu/packages/guile.scm:445
 msgid "Guile bindings to ncurses"
 msgstr "Guilebindinger til ncurses"
 
-#: gnu/packages/guile.scm:400
+#: gnu/packages/guile.scm:447
 msgid ""
 "guile-ncurses provides Guile language bindings for the ncurses\n"
 "library."
 msgstr ""
 
-#: gnu/packages/guile.scm:420
+#: gnu/packages/guile.scm:467
 msgid "Run jobs at scheduled times"
 msgstr "Afvikl job på planlagte tidspunkter"
 
-#: gnu/packages/guile.scm:422
+#: gnu/packages/guile.scm:469
 msgid ""
 "GNU Mcron is a complete replacement for Vixie cron.  It is used to run\n"
 "tasks on a schedule, such as every hour or every Monday.  Mcron is written in\n"
@@ -4524,11 +4949,11 @@ msgid ""
 "format is also supported."
 msgstr ""
 
-#: gnu/packages/guile.scm:499
+#: gnu/packages/guile.scm:556
 msgid "Collection of useful Guile Scheme modules"
 msgstr ""
 
-#: gnu/packages/guile.scm:501
+#: gnu/packages/guile.scm:558
 msgid ""
 "Guile-Lib is intended as an accumulation place for pure-scheme Guile\n"
 "modules, allowing for people to cooperate integrating their generic Guile\n"
@@ -4536,11 +4961,11 @@ msgid ""
 "for Guile\"."
 msgstr ""
 
-#: gnu/packages/guile.scm:532
+#: gnu/packages/guile.scm:593
 msgid "JSON module for Guile"
 msgstr "JSON-modul for Guile"
 
-#: gnu/packages/guile.scm:534
+#: gnu/packages/guile.scm:595
 msgid ""
 "Guile-json supports parsing and building JSON documents according to the\n"
 "http:://json.org specification.  These are the main features:\n"
@@ -4550,11 +4975,11 @@ msgid ""
 "- Allows JSON pretty printing."
 msgstr ""
 
-#: gnu/packages/guile.scm:605
+#: gnu/packages/guile.scm:676
 msgid "MiniKanren declarative logic system, packaged for Guile"
 msgstr ""
 
-#: gnu/packages/guile.scm:607
+#: gnu/packages/guile.scm:678
 msgid ""
 "MiniKanren is a relational programming extension to the Scheme\n"
 "programming Language, written as a smaller version of Kanren suitable for\n"
@@ -4567,51 +4992,51 @@ msgid ""
 "See http://minikanren.org/ for more on miniKanren generally."
 msgstr ""
 
-#: gnu/packages/guile.scm:689
+#: gnu/packages/guile.scm:767
 msgid "S-expression based regular expressions"
 msgstr ""
 
-#: gnu/packages/guile.scm:691
+#: gnu/packages/guile.scm:769
 msgid ""
 "Irregex is an s-expression based alternative to your classic\n"
 "string-based regular expressions.  It implements SRFI 115 and is deeply\n"
 "inspired by the SCSH regular expression system."
 msgstr ""
 
-#: gnu/packages/guile.scm:755
+#: gnu/packages/guile.scm:836
 msgid "Guile bindings to the GDBM library via Guile's FFI"
 msgstr ""
 
-#: gnu/packages/guile.scm:757
+#: gnu/packages/guile.scm:838
 msgid ""
 "Guile bindings to the GDBM key-value storage system, using\n"
 "Guile's foreign function interface."
 msgstr ""
 
-#: gnu/packages/guile.scm:805
+#: gnu/packages/guile.scm:886
 msgid "Access SQLite databases from Guile"
 msgstr "Tilgå SQLite-databaser fra Guile"
 
-#: gnu/packages/guile.scm:807
+#: gnu/packages/guile.scm:888
 msgid "This package provides Guile bindings to the SQLite database system."
 msgstr "Denne pakke tilbyder Guilebindinger til SQLite-databasesystemet."
 
-#: gnu/packages/guile.scm:851
+#: gnu/packages/guile.scm:932
 msgid "Functional static site generator"
 msgstr ""
 
-#: gnu/packages/guile.scm:852
+#: gnu/packages/guile.scm:933
 msgid ""
 "Haunt is a static site generator written in Guile\n"
 "Scheme.  Haunt features a functional build system and an extensible\n"
 "interface for reading articles in any format."
 msgstr ""
 
-#: gnu/packages/guile.scm:873
+#: gnu/packages/guile.scm:954
 msgid "Guile application configuration parsing library"
 msgstr ""
 
-#: gnu/packages/guile.scm:875
+#: gnu/packages/guile.scm:956
 msgid ""
 "Guile Config is a library providing a declarative approach to\n"
 "application configuration specification.  The library provides clean\n"
@@ -4622,43 +5047,43 @@ msgid ""
 "above command-line parameters."
 msgstr ""
 
-#: gnu/packages/guile.scm:909
+#: gnu/packages/guile.scm:994
 msgid "Redis client library for Guile"
 msgstr ""
 
-#: gnu/packages/guile.scm:910
+#: gnu/packages/guile.scm:995
 msgid ""
 "Guile-redis provides a Scheme interface to the Redis\n"
 "key-value cache and store."
 msgstr ""
 
-#: gnu/packages/guile.scm:984
+#: gnu/packages/guile.scm:1072
 msgid "Whitespace to lisp syntax for Guile"
 msgstr ""
 
-#: gnu/packages/guile.scm:985
+#: gnu/packages/guile.scm:1073
 msgid ""
 "Wisp is a syntax for Guile which provides a Python-like\n"
 "whitespace-significant language.  It may be easier on the eyes for some\n"
 "users and in some situations."
 msgstr ""
 
-#: gnu/packages/guile.scm:1018
+#: gnu/packages/guile.scm:1106
 msgid "2D/3D game engine for GNU Guile"
 msgstr ""
 
-#: gnu/packages/guile.scm:1019
+#: gnu/packages/guile.scm:1107
 msgid ""
 "Sly is a 2D/3D game engine written in Guile Scheme.  Sly\n"
 "features a functional reactive programming interface and live coding\n"
 "capabilities."
 msgstr ""
 
-#: gnu/packages/guile.scm:1054
+#: gnu/packages/guile.scm:1142
 msgid "Generate C bindings for Guile"
 msgstr ""
 
-#: gnu/packages/guile.scm:1055
+#: gnu/packages/guile.scm:1143
 msgid ""
 "G-Wrap is a tool and Guile library for generating function\n"
 "wrappers for inter-language calls.  It currently only supports generating Guile\n"
@@ -4667,11 +5092,11 @@ msgid ""
 "provides access to that interface and its types from the Scheme level."
 msgstr ""
 
-#: gnu/packages/guile.scm:1092
+#: gnu/packages/guile.scm:1180
 msgid "Guile database abstraction layer"
 msgstr "Guile-databaseabstraktionslag"
 
-#: gnu/packages/guile.scm:1095
+#: gnu/packages/guile.scm:1183
 msgid ""
 "guile-dbi is a library for Guile that provides a convenient interface to\n"
 "SQL databases.  Database programming with guile-dbi is generic in that the same\n"
@@ -4679,45 +5104,81 @@ msgid ""
 "It currently supports MySQL, Postgres and SQLite3."
 msgstr ""
 
-#: gnu/packages/guile.scm:1121
+#: gnu/packages/guile.scm:1209
 msgid "Guile DBI driver for SQLite"
 msgstr "Guile DBI-driver for SQLite"
 
-#: gnu/packages/guile.scm:1124
+#: gnu/packages/guile.scm:1212
 msgid ""
 "guile-dbi is a library for Guile that provides a convenient interface to\n"
 "SQL databases.  This package implements the interface for SQLite."
 msgstr ""
 
-#: gnu/packages/guile.scm:1150
+#: gnu/packages/guile.scm:1238
 msgid "XOSD bindings for Guile"
 msgstr "XOSD-bindinger for Guile"
 
-#: gnu/packages/guile.scm:1152
+#: gnu/packages/guile.scm:1240
 msgid ""
 "Guile-XOSD provides Guile bindings for @code{libxosd},\n"
 "@uref{http://sourceforge.net/projects/libxosd/, the X On Screen Display\n"
 "library}."
 msgstr ""
 
-#: gnu/packages/guile.scm:1175
+#: gnu/packages/guile.scm:1263
 msgid "Evaluate code in a running Guile process"
 msgstr "Evaluer kode i en kørende Guileproces"
 
-#: gnu/packages/guile.scm:1177
+#: gnu/packages/guile.scm:1265
 msgid ""
 "Guile-Daemon is a small Guile program that loads your initial\n"
 "configuration file, and then reads and evaluates Guile expressions that\n"
 "you send to a FIFO file."
 msgstr ""
 
-#: gnu/packages/imagemagick.scm:101 gnu/packages/imagemagick.scm:195
+#: gnu/packages/guile.scm:1296
+msgid "CommonMark parser for Guile"
+msgstr ""
+
+#: gnu/packages/guile.scm:1298
+msgid ""
+"guile-commonmark is a library for parsing CommonMark, a fully specified\n"
+"variant of Markdown.  The library is written in Guile Scheme and is designed\n"
+"to transform a CommonMark document to SXML.  guile-commonmark tries to closely\n"
+"follow the @uref{http://commonmark.org/, CommonMark spec}, the main difference\n"
+"is no support for parsing block and inline level HTML."
+msgstr ""
+
+#: gnu/packages/guile.scm:1380
+msgid "Structured access to bytevector contents for Guile"
+msgstr ""
+
+#: gnu/packages/guile.scm:1382
+msgid ""
+"Guile bytestructures offers a system imitating the type system\n"
+"of the C programming language, to be used on bytevectors.  C's type\n"
+"system works on raw memory, and Guile works on bytevectors which are\n"
+"an abstraction over raw memory.  It's also more powerful than the C\n"
+"type system, elevating types to first-class status."
+msgstr ""
+
+#: gnu/packages/guile.scm:1419
+msgid "Spell-checking from Guile"
+msgstr ""
+
+#: gnu/packages/guile.scm:1421
+msgid ""
+"guile-aspell is a Guile Scheme library for comparing a string against a\n"
+"dictionary and suggesting spelling corrections."
+msgstr ""
+
+#: gnu/packages/imagemagick.scm:106 gnu/packages/imagemagick.scm:208
 msgid "Create, edit, compose, or convert bitmap images"
 msgstr "Opret, rediger, komponer eller konverter bitmap-billeder"
 
-#: gnu/packages/imagemagick.scm:103
+#: gnu/packages/imagemagick.scm:108
 msgid ""
-"ImageMagick® is a software suite to create, edit, compose, or convert\n"
+"ImageMagick is a software suite to create, edit, compose, or convert\n"
 "bitmap images.  It can read and write images in a variety of formats (over 100)\n"
 "including DPX, EXR, GIF, JPEG, JPEG-2000, PDF, PhotoCD, PNG, Postscript, SVG,\n"
 "and TIFF.  Use ImageMagick to resize, flip, mirror, rotate, distort, shear and\n"
@@ -4725,11 +5186,11 @@ msgid ""
 "text, lines, polygons, ellipses and Bézier curves."
 msgstr ""
 
-#: gnu/packages/imagemagick.scm:147
+#: gnu/packages/imagemagick.scm:153
 msgid "Perl interface to ImageMagick"
 msgstr "Perlgrænseflade til ImageMagick"
 
-#: gnu/packages/imagemagick.scm:148
+#: gnu/packages/imagemagick.scm:154
 msgid ""
 "This Perl extension allows the reading, manipulation and\n"
 "writing of a large number of image file formats using the ImageMagick library.\n"
@@ -4737,28 +5198,28 @@ msgid ""
 "script."
 msgstr ""
 
-#: gnu/packages/imagemagick.scm:197
+#: gnu/packages/imagemagick.scm:210
 msgid ""
 "GraphicsMagick provides a comprehensive collection of utilities,\n"
 "programming interfaces, and GUIs, to support file format conversion, image\n"
 "processing, and 2D vector rendering."
 msgstr ""
 
-#: gnu/packages/image.scm:73
+#: gnu/packages/image.scm:84
 msgid "Library for handling PNG files"
 msgstr "Bibliotek for håndtering af PNG-filer"
 
-#: gnu/packages/image.scm:75
+#: gnu/packages/image.scm:86
 msgid ""
 "Libpng is the official PNG (Portable Network Graphics) reference\n"
 "library.  It supports almost all PNG features and is extensible."
 msgstr ""
 
-#: gnu/packages/image.scm:107
+#: gnu/packages/image.scm:118
 msgid "Library for handling JPEG files"
 msgstr "Bibliotek for håndtering af JPEG-filer"
 
-#: gnu/packages/image.scm:109
+#: gnu/packages/image.scm:120
 msgid ""
 "Libjpeg implements JPEG image encoding, decoding, and transcoding.\n"
 "JPEG is a standardized compression method for full-color and gray-scale\n"
@@ -4767,22 +5228,46 @@ msgid ""
 "image files in PBMPLUS PPM/PGM, GIF, BMP, and Targa file formats."
 msgstr ""
 
-#: gnu/packages/image.scm:142
+#: gnu/packages/image.scm:185
+msgid "Implementation of the JPEG XR standard"
+msgstr ""
+
+#: gnu/packages/image.scm:186
+msgid ""
+"JPEG XR is an approved ISO/IEC International standard (its\n"
+"official designation is ISO/IEC 29199-2). This library is an implementation of that standard."
+msgstr ""
+
+#: gnu/packages/image.scm:209
 msgid "Optimize JPEG images"
 msgstr "Optimer JPEG-billeder"
 
-#: gnu/packages/image.scm:144
+#: gnu/packages/image.scm:211
 msgid ""
 "jpegoptim provides lossless optimization (based on optimizing\n"
 "the Huffman tables) and \"lossy\" optimization based on setting\n"
 "maximum quality factor."
 msgstr ""
 
-#: gnu/packages/image.scm:175
+#: gnu/packages/image.scm:236
+msgid "Library for handling Mac OS icns resource files"
+msgstr "Bibliotek for håndtering af Mac OS-ikonressourcefiler"
+
+#: gnu/packages/image.scm:238
+msgid ""
+"Libicns is a library for the manipulation of Mac OS IconFamily resource\n"
+"type files (ICNS).  @command{icns2png} and @command{png2icns} are provided to\n"
+"convert between PNG and ICNS. @command{icns2png} will extract image files from\n"
+"ICNS files under names like \"Foo_48x48x32.png\" useful for installing for use\n"
+"with .desktop files.  Additionally, @command{icontainer2png} is provided for\n"
+"extracting icontainer icon files."
+msgstr ""
+
+#: gnu/packages/image.scm:273
 msgid "Library for handling TIFF files"
 msgstr "Bibliotek for håndtering af TIFF-filer"
 
-#: gnu/packages/image.scm:177
+#: gnu/packages/image.scm:275
 msgid ""
 "Libtiff provides support for the Tag Image File Format (TIFF), a format\n"
 "used for storing image data.\n"
@@ -4790,11 +5275,11 @@ msgid ""
 "collection of tools for doing simple manipulations of TIFF images."
 msgstr ""
 
-#: gnu/packages/image.scm:220
+#: gnu/packages/image.scm:318
 msgid "Library for reading images in the Microsoft WMF format"
 msgstr "Bibliotek for læsning af billeder i Microsoft WMF-formatet"
 
-#: gnu/packages/image.scm:222
+#: gnu/packages/image.scm:320
 msgid ""
 "libwmf is a library for reading vector images in Microsoft's native\n"
 "Windows Metafile Format (WMF) and for either (a) displaying them in, e.g., an X\n"
@@ -4802,11 +5287,11 @@ msgid ""
 "the W3C's XML-based Scaleable Vector Graphic (SVG) format."
 msgstr ""
 
-#: gnu/packages/image.scm:289
+#: gnu/packages/image.scm:387
 msgid "Library and tools for image processing and analysis"
 msgstr "Bibliotek og værktøjer for billedbehandling og analyse"
 
-#: gnu/packages/image.scm:291
+#: gnu/packages/image.scm:389
 msgid ""
 "Leptonica is a C library and set of command-line tools for efficient\n"
 "image processing and image analysis operations.  It supports rasterop, affine\n"
@@ -4816,11 +5301,11 @@ msgid ""
 "arithmetic ops."
 msgstr ""
 
-#: gnu/packages/image.scm:314
+#: gnu/packages/image.scm:411
 msgid "Decoder of the JBIG2 image compression format"
 msgstr ""
 
-#: gnu/packages/image.scm:316
+#: gnu/packages/image.scm:413
 msgid ""
 "JBIG2 is designed for lossy or lossless encoding of 'bilevel' (1-bit\n"
 "monochrome) images at moderately high resolution, and in particular scanned\n"
@@ -4833,11 +5318,11 @@ msgid ""
 "work."
 msgstr ""
 
-#: gnu/packages/image.scm:351
+#: gnu/packages/image.scm:451
 msgid "JPEG 2000 codec"
 msgstr "JPEG 2000-kodning"
 
-#: gnu/packages/image.scm:353
+#: gnu/packages/image.scm:453
 msgid ""
 "The OpenJPEG library is a JPEG 2000 codec written in C.  It has\n"
 "been developed in order to promote the use of JPEG 2000, the new\n"
@@ -4850,11 +5335,11 @@ msgid ""
 "error-resilience, a Java-viewer for j2k-images, ..."
 msgstr ""
 
-#: gnu/packages/image.scm:431
+#: gnu/packages/image.scm:534
 msgid "Tools and library for working with GIF images"
 msgstr "Værktøjer og bibliotek for arbejde med GIF-billeder"
 
-#: gnu/packages/image.scm:433
+#: gnu/packages/image.scm:536
 msgid ""
 "GIFLIB is a library for reading and writing GIF images.  It is API and\n"
 "ABI compatible with libungif which was in wide use while the LZW compression\n"
@@ -4862,19 +5347,19 @@ msgid ""
 "compose, and analyze GIF images."
 msgstr ""
 
-#: gnu/packages/image.scm:455
+#: gnu/packages/image.scm:558
 msgid "GIF decompression library"
 msgstr "GIF-dekomprimeringsbibliotek"
 
-#: gnu/packages/image.scm:457
+#: gnu/packages/image.scm:560
 msgid "libungif is the old GIF decompression library by the GIFLIB project."
 msgstr "libungif er det gamle GIF-dekomprimeringsbibliotek af GIFLIB-projektet."
 
-#: gnu/packages/image.scm:486
+#: gnu/packages/image.scm:589
 msgid "Loading, saving, rendering and manipulating image files"
 msgstr "Indlæs, gem, optegn og manipuler billedfiler"
 
-#: gnu/packages/image.scm:488
+#: gnu/packages/image.scm:591
 msgid ""
 "Imlib2 is a library that does image file loading and saving as well as\n"
 "rendering, manipulation, arbitrary polygon support, etc.\n"
@@ -4887,32 +5372,32 @@ msgid ""
 "more modular, simple, and flexible."
 msgstr ""
 
-#: gnu/packages/image.scm:520
+#: gnu/packages/image.scm:623
 msgid "Wrapper library for imlib2"
 msgstr "Omslagsbibliotek for imlib2"
 
-#: gnu/packages/image.scm:522
+#: gnu/packages/image.scm:625
 msgid ""
 "Giblib is a simple library which wraps imlib2's context API, avoiding\n"
 "all the context_get/set calls, adds fontstyles to the truetype renderer and\n"
 "supplies a generic doubly-linked list and some string functions."
 msgstr ""
 
-#: gnu/packages/image.scm:562
+#: gnu/packages/image.scm:666
 msgid "Library for handling popular graphics image formats"
 msgstr "Bibliotek til håndtering af populære grafiske billedformater"
 
-#: gnu/packages/image.scm:564
+#: gnu/packages/image.scm:668
 msgid ""
 "FreeImage is a library for developers who would like to support popular\n"
 "graphics image formats like PNG, BMP, JPEG, TIFF and others."
 msgstr ""
 
-#: gnu/packages/image.scm:616
+#: gnu/packages/image.scm:723
 msgid "Computer vision library"
 msgstr ""
 
-#: gnu/packages/image.scm:618
+#: gnu/packages/image.scm:725
 msgid ""
 "VIGRA stands for Vision with Generic Algorithms.  It is an image\n"
 "processing and analysis library that puts its main emphasis on customizable\n"
@@ -4920,11 +5405,11 @@ msgid ""
 "multi-dimensional image processing."
 msgstr ""
 
-#: gnu/packages/image.scm:649
+#: gnu/packages/image.scm:758
 msgid "Lossless and lossy image compression"
 msgstr "Billedkomprimering med og uden kvalitetetstab"
 
-#: gnu/packages/image.scm:651
+#: gnu/packages/image.scm:760
 msgid ""
 "WebP is a new image format that provides lossless and lossy compression\n"
 "for images.  WebP lossless images are 26% smaller in size compared to\n"
@@ -4936,41 +5421,52 @@ msgid ""
 "channels."
 msgstr ""
 
-#: gnu/packages/image.scm:679
+#: gnu/packages/image.scm:788
 msgid "Library for handling MNG files"
 msgstr "Bibliotek for håndtering af MNG-filer"
 
-#: gnu/packages/image.scm:681
+#: gnu/packages/image.scm:790
 msgid "Libmng is the MNG (Multiple-image Network Graphics) reference library."
 msgstr "Libmng er MNG-referencebiblioteket (Multiple-image Network Graphics)."
 
-#: gnu/packages/image.scm:730
+#: gnu/packages/image.scm:814
+msgid "Library and command-line utility to manage image metadata"
+msgstr "Bibliotek og kommandolinjeredskab til at håndtere billedmetadata"
+
+#: gnu/packages/image.scm:816
+msgid ""
+"Exiv2 is a C++ library and a command line utility to manage image\n"
+"metadata.  It provides fast and easy read and write access to the Exif, IPTC\n"
+"and XMP metadata of images in various formats."
+msgstr ""
+
+#: gnu/packages/image.scm:872
 msgid "Library for manipulating many image formats"
 msgstr "Bibliotek for manipulering af mange billedformater"
 
-#: gnu/packages/image.scm:731
+#: gnu/packages/image.scm:873
 msgid ""
 "Developer's Image Library (DevIL) is a library to develop\n"
 "applications with support for many types of images.  DevIL can load, save,\n"
 "convert, manipulate, filter and display a wide variety of image formats."
 msgstr ""
 
-#: gnu/packages/image.scm:765
+#: gnu/packages/image.scm:892
 msgid "JPEG-2000 library"
 msgstr "JPEG-2000-bibliotek"
 
-#: gnu/packages/image.scm:766
+#: gnu/packages/image.scm:893
 msgid ""
 "The JasPer Project is an initiative to provide a reference\n"
 "implementation of the codec specified in the JPEG-2000 Part-1 standard (i.e.,\n"
 "ISO/IEC 15444-1)."
 msgstr ""
 
-#: gnu/packages/image.scm:796
+#: gnu/packages/image.scm:923
 msgid "Scaling, colorspace conversion, and dithering library"
 msgstr ""
 
-#: gnu/packages/image.scm:797
+#: gnu/packages/image.scm:924
 msgid ""
 "Zimg implements the commonly required image processing basics\n"
 "of scaling, colorspace conversion, and depth conversion.  A simple API enables\n"
@@ -4978,11 +5474,11 @@ msgid ""
 "the programmer."
 msgstr ""
 
-#: gnu/packages/image.scm:830
+#: gnu/packages/image.scm:957
 msgid "Perceptual image comparison utility"
 msgstr ""
 
-#: gnu/packages/image.scm:831
+#: gnu/packages/image.scm:958
 msgid ""
 "PerceptualDiff visually compares two images to determine\n"
 "whether they look alike.  It uses a computational model of the human visual\n"
@@ -4990,11 +5486,127 @@ msgid ""
 "differences in file encoding, image quality, and other small variations."
 msgstr ""
 
-#: gnu/packages/inkscape.scm:91
-msgid "Vector graphics editor"
+#: gnu/packages/image.scm:989
+msgid "Image and audio steganography"
+msgstr ""
+
+#: gnu/packages/image.scm:991
+msgid ""
+"Steghide is a steganography program that is able to hide data in various\n"
+"kinds of image- and audio-files.  The color- respectivly sample-frequencies\n"
+"are not changed thus making the embedding resistant against first-order\n"
+"statistical tests."
+msgstr ""
+
+#: gnu/packages/image.scm:1017
+msgid "Image library for Extempore"
+msgstr "Billedbibliotek for Extempore"
+
+#: gnu/packages/image.scm:1019
+msgid ""
+"This package is a collection of assorted single-file libraries.  Of\n"
+"all included libraries only the image loading and decoding library is\n"
+"installed as @code{stb_image}."
+msgstr ""
+
+#: gnu/packages/image.scm:1047
+msgid ""
+"Optimizer that recompresses PNG image files to a\n"
+"smaller size"
+msgstr ""
+
+#: gnu/packages/image.scm:1049
+msgid ""
+"OptiPNG is a PNG optimizer that recompresses image\n"
+"files to a smaller size, without losing any information.  This program\n"
+"also converts external formats (BMP, GIF, PNM and TIFF) to optimized\n"
+"PNG, and performs PNG integrity checks and corrections."
+msgstr ""
+
+#: gnu/packages/image.scm:1083
+msgid "SIMD-accelerated JPEG image handling library"
+msgstr ""
+
+#: gnu/packages/image.scm:1084
+msgid ""
+"libjpeg-turbo is a JPEG image codec that accelerates baseline\n"
+"JPEG compression and decompression using SIMD instructions: MMX on x86, SSE2 on\n"
+"x86-64, NEON on ARM, and AltiVec on PowerPC processors.  Even on other systems,\n"
+"its highly-optimized Huffman coding routines allow it to outperform libjpeg by\n"
+"a significant amount.\n"
+"libjpeg-turbo implements both the traditional libjpeg API and the less powerful\n"
+"but more straightforward TurboJPEG API, and provides a full-featured Java\n"
+"interface.  It supports color space extensions that allow it to compress from\n"
+"and decompress to 32-bit and big-endian pixel buffers (RGBX, XBGR, etc.)."
+msgstr ""
+
+#: gnu/packages/image-viewers.scm:63
+msgid "Fast and light imlib2-based image viewer"
+msgstr "Hurtig og simpel imlib2-baseret billedfremviser"
+
+#: gnu/packages/image-viewers.scm:65
+msgid ""
+"feh is an X11 image viewer aimed mostly at console users.\n"
+"Unlike most other viewers, it does not have a fancy GUI, but simply\n"
+"displays images.  It can also be used to set the desktop wallpaper.\n"
+"It is controlled via commandline arguments and configurable key/mouse\n"
+"actions."
+msgstr ""
+
+#: gnu/packages/image-viewers.scm:111
+msgid "Lightweight GTK+ based image viewer"
+msgstr ""
+
+#: gnu/packages/image-viewers.scm:113
+msgid ""
+"Geeqie is a lightweight GTK+ based image viewer for Unix like operating\n"
+"systems.  It features: EXIF, IPTC and XMP metadata browsing and editing\n"
+"interoperability; easy integration with other software; geeqie works on files\n"
+"and directories, there is no need to import images; fast preview for many raw\n"
+"image formats; tools for image comparison, sorting and managing photo\n"
+"collection.  Geeqie was initially based on GQview."
+msgstr ""
+
+#: gnu/packages/image-viewers.scm:148
+msgid "Simple X Image Viewer"
+msgstr "Simpel X-billedfremviser"
+
+#: gnu/packages/image-viewers.scm:150
+msgid ""
+"sxiv is an alternative to feh and qiv.  Its primary goal is to\n"
+"provide the most basic features required for fast image viewing.  It has\n"
+"vi key bindings and works nicely with tiling window managers.  Its code\n"
+"base should be kept small and clean to make it easy for you to dig into\n"
+"it and customize it for your needs."
+msgstr ""
+
+#: gnu/packages/image-viewers.scm:191
+msgid "Simple, fast and elegant image viewer"
+msgstr "Simpel, hurtig og elegant billedfremviser"
+
+#: gnu/packages/image-viewers.scm:192
+msgid ""
+"Viewnior is an image viewer program.  Created to be simple,\n"
+"fast and elegant.  Its minimalistic interface provides more screenspace for\n"
+"your images.  Among its features are:\n"
+"@enumerate\n"
+"@item Fullscreen & Slideshow\n"
+"@item Rotate, flip, crop, save, delete images\n"
+"@item Animation support\n"
+"@item Browse only selected images\n"
+"@item Navigation window\n"
+"@item Set image as wallpaper (Gnome 2, Gnome 3, XFCE, LXDE, FluxBox, Nitrogen)\n"
+"@item Simple interface\n"
+"@item EXIF and IPTC metadata\n"
+"@item Configurable mouse actions\n"
+"@end enumerate\n"
 msgstr ""
 
 #: gnu/packages/inkscape.scm:92
+msgid "Vector graphics editor"
+msgstr "Redigeringsprogram for vektorgrafik"
+
+#: gnu/packages/inkscape.scm:93
 msgid ""
 "Inkscape is a vector graphics editor.  What sets Inkscape\n"
 "apart is its use of Scalable Vector Graphics (SVG), an XML-based W3C standard,\n"
@@ -5011,11 +5623,11 @@ msgid ""
 "fragmentation avoidance and scalable concurrency support."
 msgstr ""
 
-#: gnu/packages/key-mon.scm:52
+#: gnu/packages/key-mon.scm:50
 msgid "Show keyboard and mouse status"
 msgstr ""
 
-#: gnu/packages/key-mon.scm:54
+#: gnu/packages/key-mon.scm:52
 msgid ""
 "The key-mon utility displays the current keyboard and mouse status.\n"
 "This is useful for teaching and screencasts."
@@ -5282,11 +5894,11 @@ msgid ""
 "and to return information on pronunciations, meanings and synonyms."
 msgstr ""
 
-#: gnu/packages/libreoffice.scm:859
+#: gnu/packages/libreoffice.scm:861
 msgid "Office suite"
 msgstr ""
 
-#: gnu/packages/libreoffice.scm:860
+#: gnu/packages/libreoffice.scm:862
 msgid ""
 "LibreOffice is a comprehensive office suite.  It contains\n"
 "a number of components: Writer, a word processor; Calc, a spreadsheet\n"
@@ -5295,39 +5907,29 @@ msgid ""
 "Math for editing mathematics."
 msgstr ""
 
-#: gnu/packages/linux.scm:162
+#: gnu/packages/linux.scm:170
 msgid "GNU Linux-Libre kernel headers"
 msgstr "GNU Linux-LIbre - kerneteksthoveder"
 
-#: gnu/packages/linux.scm:163
+#: gnu/packages/linux.scm:171
 msgid "Headers of the Linux-Libre kernel."
 msgstr "Teksthoveder for Linux-Libre-kernen."
 
-#: gnu/packages/linux.scm:193
-msgid "Tools for loading and managing Linux kernel modules"
-msgstr "Værktøjer til at indlæse og håndtere Linuxkernemoduler"
-
-#: gnu/packages/linux.scm:195
-msgid ""
-"Tools for loading and managing Linux kernel modules, such as `modprobe',\n"
-"`insmod', `lsmod', and more."
-msgstr ""
-
-#: gnu/packages/linux.scm:334
+#: gnu/packages/linux.scm:321
 msgid "100% free redistribution of a cleaned Linux kernel"
 msgstr ""
 
-#: gnu/packages/linux.scm:336
+#: gnu/packages/linux.scm:323
 msgid ""
 "GNU Linux-Libre is a free (as in freedom) variant of the Linux kernel.\n"
 "It has been modified to remove all non-free binary blobs."
 msgstr ""
 
-#: gnu/packages/linux.scm:413
+#: gnu/packages/linux.scm:397
 msgid "Pluggable authentication modules for Linux"
 msgstr ""
 
-#: gnu/packages/linux.scm:415
+#: gnu/packages/linux.scm:399
 msgid ""
 "A *Free* project to implement OSF's RFC 86.0.\n"
 "Pluggable authentication modules are small shared object files that can\n"
@@ -5335,33 +5937,33 @@ msgid ""
 "at login.  Local and dynamic reconfiguration are its key features."
 msgstr ""
 
-#: gnu/packages/linux.scm:442
-msgid "Small utilities that use the proc filesystem"
+#: gnu/packages/linux.scm:441
+msgid "Small utilities that use the proc file system"
 msgstr "Små redskaber som bruger filsystemet proc"
 
-#: gnu/packages/linux.scm:444
+#: gnu/packages/linux.scm:443
 msgid ""
 "This PSmisc package is a set of some small useful utilities that\n"
-"use the proc filesystem.  We're not about changing the world, but\n"
+"use the proc file system.  We're not about changing the world, but\n"
 "providing the system administrator with some help in common tasks."
 msgstr ""
 
-#: gnu/packages/linux.scm:509
+#: gnu/packages/linux.scm:520
 msgid "Collection of utilities for the Linux kernel"
 msgstr "Samling af redskaber for Linuxkernen"
 
-#: gnu/packages/linux.scm:510
+#: gnu/packages/linux.scm:521
 msgid ""
 "Util-linux is a diverse collection of Linux kernel\n"
-"utilities.  It provides dmesg and includes tools for working with filesystems,\n"
+"utilities.  It provides dmesg and includes tools for working with file systems,\n"
 "block devices, UUIDs, TTYs, and many other tools."
 msgstr ""
 
-#: gnu/packages/linux.scm:551
+#: gnu/packages/linux.scm:571
 msgid "Utilities that give information about processes"
 msgstr "Redskaber som giver information om processer"
 
-#: gnu/packages/linux.scm:553
+#: gnu/packages/linux.scm:573
 msgid ""
 "Procps is the package that has a bunch of small useful utilities\n"
 "that give information about processes using the Linux /proc file system.\n"
@@ -5369,107 +5971,107 @@ msgid ""
 "slabtop, and skill."
 msgstr ""
 
-#: gnu/packages/linux.scm:578
+#: gnu/packages/linux.scm:599
 msgid "Tools for working with USB devices, such as lsusb"
 msgstr "Værktøjer for arbejde med USB-enheder, såsom lsusb"
 
-#: gnu/packages/linux.scm:580
+#: gnu/packages/linux.scm:601
 msgid "Tools for working with USB devices, such as lsusb."
 msgstr "Værktøjer for arbejde med USB-enheder, såsom lsusb."
 
-#: gnu/packages/linux.scm:654
+#: gnu/packages/linux.scm:679
 msgid "Creating and checking ext2/ext3/ext4 file systems"
 msgstr "Oprettelse og kontrol af ext2/ext3/ext4-filsystemer"
 
-#: gnu/packages/linux.scm:656
+#: gnu/packages/linux.scm:681
 msgid "This package provides tools for manipulating ext2/ext3/ext4 file systems."
 msgstr "Denne pakke tilbyder værktøjer til manipulering af ext2/ext3/ext4-filsystemer."
 
-#: gnu/packages/linux.scm:698
+#: gnu/packages/linux.scm:723
 msgid "Statically-linked fsck.* commands from e2fsprogs"
 msgstr ""
 
-#: gnu/packages/linux.scm:700
+#: gnu/packages/linux.scm:725
 msgid ""
 "This package provides statically-linked command of fsck.ext[234] taken\n"
 "from the e2fsprogs package.  It is meant to be used in initrds."
 msgstr ""
 
-#: gnu/packages/linux.scm:720
+#: gnu/packages/linux.scm:745
 msgid "Recover deleted files from ext2/3/4 partitions"
 msgstr "Gendan slettede filer fra ext2/3/4-partitioner"
 
-#: gnu/packages/linux.scm:722
+#: gnu/packages/linux.scm:747
 msgid ""
 "Extundelete is a set of tools that can recover deleted files from an\n"
 "ext3 or ext4 partition."
 msgstr ""
 
-#: gnu/packages/linux.scm:754
+#: gnu/packages/linux.scm:779
 msgid "Zero non-allocated regions in ext2/ext3/ext4 file systems"
 msgstr ""
 
-#: gnu/packages/linux.scm:756
+#: gnu/packages/linux.scm:781
 msgid ""
 "The zerofree command scans the free blocks in an ext2 file system and\n"
 "fills any non-zero blocks with zeroes.  This is a useful way to make disk\n"
 "images more compressible."
 msgstr ""
 
-#: gnu/packages/linux.scm:775
+#: gnu/packages/linux.scm:800
 msgid "System call tracer for Linux"
 msgstr ""
 
-#: gnu/packages/linux.scm:777
+#: gnu/packages/linux.scm:802
 msgid ""
 "strace is a system call tracer, i.e. a debugging tool which prints out a\n"
 "trace of all the system calls made by a another process/program."
 msgstr ""
 
-#: gnu/packages/linux.scm:798
+#: gnu/packages/linux.scm:823
 msgid "Library call tracer for Linux"
 msgstr ""
 
-#: gnu/packages/linux.scm:800
+#: gnu/packages/linux.scm:825
 msgid ""
 "ltrace intercepts and records dynamic library calls which are called by\n"
 "an executed process and the signals received by that process.  It can also\n"
 "intercept and print the system calls executed by the program."
 msgstr ""
 
-#: gnu/packages/linux.scm:820
+#: gnu/packages/linux.scm:845
 msgid "The Advanced Linux Sound Architecture libraries"
 msgstr ""
 
-#: gnu/packages/linux.scm:822 gnu/packages/linux.scm:864
+#: gnu/packages/linux.scm:847 gnu/packages/linux.scm:890
 msgid ""
 "The Advanced Linux Sound Architecture (ALSA) provides audio and\n"
 "MIDI functionality to the Linux-based operating system."
 msgstr ""
 
-#: gnu/packages/linux.scm:862
+#: gnu/packages/linux.scm:888
 msgid "Utilities for the Advanced Linux Sound Architecture (ALSA)"
 msgstr ""
 
-#: gnu/packages/linux.scm:889
+#: gnu/packages/linux.scm:915
 msgid "Program to configure the Linux IP packet filtering rules"
 msgstr ""
 
-#: gnu/packages/linux.scm:891
+#: gnu/packages/linux.scm:917
 msgid ""
 "iptables is the userspace command line program used to configure the\n"
-"Linux 2.4.x and later IPv4 packet filtering ruleset.  It is targeted towards\n"
+"Linux 2.4.x and later IPv4 packet filtering ruleset (firewall).  It is targeted at\n"
 "system administrators.  Since Network Address Translation is also configured\n"
 "from the packet filter ruleset, iptables is used for this, too.  The iptables\n"
 "package also includes ip6tables.  ip6tables is used for configuring the IPv6\n"
 "packet filter."
 msgstr ""
 
-#: gnu/packages/linux.scm:938
+#: gnu/packages/linux.scm:966
 msgid "Utilities for controlling TCP/IP networking and traffic in Linux"
 msgstr "Redskaber for kontrol af TCP/IP-netværk og trafik i Linux"
 
-#: gnu/packages/linux.scm:940
+#: gnu/packages/linux.scm:968
 msgid ""
 "Iproute2 is a collection of utilities for controlling TCP/IP\n"
 "networking and traffic with the Linux kernel.\n"
@@ -5490,11 +6092,11 @@ msgid ""
 "manpages."
 msgstr ""
 
-#: gnu/packages/linux.scm:1051
+#: gnu/packages/linux.scm:1079
 msgid "Tools for controlling the network subsystem in Linux"
 msgstr ""
 
-#: gnu/packages/linux.scm:1053
+#: gnu/packages/linux.scm:1081
 msgid ""
 "This package includes the important tools for controlling the network\n"
 "subsystem of the Linux kernel.  This includes arp, hostname, ifconfig,\n"
@@ -5503,21 +6105,21 @@ msgid ""
 "advanced aspects of IP configuration (iptunnel, ipmaddr)."
 msgstr ""
 
-#: gnu/packages/linux.scm:1090
+#: gnu/packages/linux.scm:1118
 msgid "Library for working with POSIX capabilities"
 msgstr "Bibliotek til arbejde med POSIX-funktioner"
 
-#: gnu/packages/linux.scm:1092
+#: gnu/packages/linux.scm:1120
 msgid ""
 "Libcap2 provides a programming interface to POSIX capabilities on\n"
 "Linux-based operating systems."
 msgstr ""
 
-#: gnu/packages/linux.scm:1135
+#: gnu/packages/linux.scm:1163
 msgid "Manipulate Ethernet bridges"
 msgstr ""
 
-#: gnu/packages/linux.scm:1137
+#: gnu/packages/linux.scm:1165
 msgid ""
 "Utilities for Linux's Ethernet bridging facilities.  A bridge is a way\n"
 "to connect two Ethernet segments together in a protocol independent way.\n"
@@ -5526,11 +6128,11 @@ msgid ""
 "transparently through a bridge."
 msgstr ""
 
-#: gnu/packages/linux.scm:1159
+#: gnu/packages/linux.scm:1187
 msgid "NetLink protocol library suite"
 msgstr ""
 
-#: gnu/packages/linux.scm:1161
+#: gnu/packages/linux.scm:1189
 msgid ""
 "The libnl suite is a collection of libraries providing APIs to netlink\n"
 "protocol based Linux kernel interfaces.  Netlink is an IPC mechanism primarily\n"
@@ -5539,21 +6141,21 @@ msgid ""
 "configuration and monitoring interfaces."
 msgstr ""
 
-#: gnu/packages/linux.scm:1191
+#: gnu/packages/linux.scm:1219
 msgid "Tool for configuring wireless devices"
 msgstr "Værktøj til konfiguration af trådløse enheder"
 
-#: gnu/packages/linux.scm:1193
+#: gnu/packages/linux.scm:1221
 msgid ""
 "iw is a new nl80211 based CLI configuration utility for wireless\n"
 "devices.  It replaces @code{iwconfig}, which is deprecated."
 msgstr ""
 
-#: gnu/packages/linux.scm:1239
+#: gnu/packages/linux.scm:1267
 msgid "Analyze power consumption on Intel-based laptops"
 msgstr "Analyser strømforbrug på Intelbaserede bærbare"
 
-#: gnu/packages/linux.scm:1241
+#: gnu/packages/linux.scm:1269
 msgid ""
 "PowerTOP is a Linux tool to diagnose issues with power consumption and\n"
 "power management.  In addition to being a diagnostic tool, PowerTOP also has\n"
@@ -5562,31 +6164,31 @@ msgid ""
 "settings."
 msgstr ""
 
-#: gnu/packages/linux.scm:1263
+#: gnu/packages/linux.scm:1291
 msgid "Audio mixer for X and the console"
 msgstr ""
 
-#: gnu/packages/linux.scm:1265
+#: gnu/packages/linux.scm:1293
 msgid ""
 "Aumix adjusts an audio mixer from X, the console, a terminal,\n"
 "the command line or a script."
 msgstr ""
 
-#: gnu/packages/linux.scm:1289
+#: gnu/packages/linux.scm:1317
 msgid "Displays the IO activity of running processes"
 msgstr "Viser IO-aktivet for kørende processer"
 
-#: gnu/packages/linux.scm:1291
+#: gnu/packages/linux.scm:1319
 msgid ""
 "Iotop is a Python program with a top like user interface to show the\n"
 "processes currently causing I/O."
 msgstr ""
 
-#: gnu/packages/linux.scm:1343
+#: gnu/packages/linux.scm:1371
 msgid "Support file systems implemented in user space"
 msgstr ""
 
-#: gnu/packages/linux.scm:1345
+#: gnu/packages/linux.scm:1373
 msgid ""
 "As a consequence of its monolithic design, file system code for Linux\n"
 "normally goes into the kernel itself---which is not only a robustness issue,\n"
@@ -5596,11 +6198,11 @@ msgid ""
 "user-space processes."
 msgstr ""
 
-#: gnu/packages/linux.scm:1370
+#: gnu/packages/linux.scm:1398
 msgid "User-space union file system"
 msgstr ""
 
-#: gnu/packages/linux.scm:1372
+#: gnu/packages/linux.scm:1400
 msgid ""
 "UnionFS-FUSE is a flexible union file system implementation in user\n"
 "space, using the FUSE library.  Mounting a union file system allows you to\n"
@@ -5608,15 +6210,15 @@ msgid ""
 "UnionFS-FUSE additionally supports copy-on-write."
 msgstr ""
 
-#: gnu/packages/linux.scm:1397
+#: gnu/packages/linux.scm:1425
 msgid "User-space union file system (statically linked)"
 msgstr ""
 
-#: gnu/packages/linux.scm:1440
+#: gnu/packages/linux.scm:1468
 msgid "Mount remote file systems over SSH"
 msgstr ""
 
-#: gnu/packages/linux.scm:1442
+#: gnu/packages/linux.scm:1470
 msgid ""
 "This is a file system client based on the SSH File Transfer Protocol.\n"
 "Since most SSH servers already support this protocol it is very easy to set\n"
@@ -5624,11 +6226,11 @@ msgid ""
 "file system is as easy as logging into the server with an SSH client."
 msgstr ""
 
-#: gnu/packages/linux.scm:1471
+#: gnu/packages/linux.scm:1499
 msgid "Tools for non-uniform memory access (NUMA) machines"
 msgstr ""
 
-#: gnu/packages/linux.scm:1473
+#: gnu/packages/linux.scm:1501
 msgid ""
 "NUMA stands for Non-Uniform Memory Access, in other words a system whose\n"
 "memory is not all in one place.  The numactl program allows you to run your\n"
@@ -5641,32 +6243,32 @@ msgid ""
 "system."
 msgstr ""
 
-#: gnu/packages/linux.scm:1535
+#: gnu/packages/linux.scm:1563
 msgid "Linux keyboard utilities and keyboard maps"
 msgstr ""
 
-#: gnu/packages/linux.scm:1537
+#: gnu/packages/linux.scm:1565
 msgid ""
 "This package contains keytable files and keyboard utilities compatible\n"
 "for systems using the Linux kernel.  This includes commands such as\n"
 "'loadkeys', 'setfont', 'kbdinfo', and 'chvt'."
 msgstr ""
 
-#: gnu/packages/linux.scm:1556
+#: gnu/packages/linux.scm:1584
 msgid "Monitor file accesses"
 msgstr ""
 
-#: gnu/packages/linux.scm:1558
+#: gnu/packages/linux.scm:1586
 msgid ""
 "The inotify-tools packages provides a C library and command-line tools\n"
 "to use Linux' inotify mechanism, which allows file accesses to be monitored."
 msgstr ""
 
-#: gnu/packages/linux.scm:1596
+#: gnu/packages/linux.scm:1624
 msgid "Kernel module tools"
 msgstr ""
 
-#: gnu/packages/linux.scm:1597
+#: gnu/packages/linux.scm:1625
 msgid ""
 "Kmod is a set of tools to handle common tasks with Linux\n"
 "kernel modules like insert, remove, list, check properties, resolve\n"
@@ -5677,33 +6279,37 @@ msgid ""
 "from the module-init-tools project."
 msgstr ""
 
-#: gnu/packages/linux.scm:1632
+#: gnu/packages/linux.scm:1660
 msgid "Userspace device management"
 msgstr ""
 
-#: gnu/packages/linux.scm:1633
+#: gnu/packages/linux.scm:1661
 msgid ""
 "Udev is a daemon which dynamically creates and removes\n"
 "device nodes from /dev/, handles hotplug events and loads drivers at boot\n"
 "time."
 msgstr ""
 
-#: gnu/packages/linux.scm:1693
+#: gnu/packages/linux.scm:1733
 msgid "Logical volume management for Linux"
 msgstr ""
 
-#: gnu/packages/linux.scm:1695
+#: gnu/packages/linux.scm:1735
 msgid ""
 "LVM2 is the logical volume management tool set for Linux-based systems.\n"
 "This package includes the user-space libraries and tools, including the device\n"
 "mapper.  Kernel components are part of Linux-libre."
 msgstr ""
 
-#: gnu/packages/linux.scm:1731
+#: gnu/packages/linux.scm:1757
+msgid "Logical volume management for Linux (statically linked)"
+msgstr ""
+
+#: gnu/packages/linux.scm:1787
 msgid "Tools for manipulating Linux Wireless Extensions"
 msgstr ""
 
-#: gnu/packages/linux.scm:1732
+#: gnu/packages/linux.scm:1788
 msgid ""
 "Wireless Tools are used to manipulate the now-deprecated\n"
 "Linux Wireless Extensions; consider using 'iw' instead.  The Wireless\n"
@@ -5712,44 +6318,44 @@ msgid ""
 "interface."
 msgstr ""
 
-#: gnu/packages/linux.scm:1804
+#: gnu/packages/linux.scm:1860
 msgid "Central regulatory domain agent (CRDA) for WiFi"
 msgstr ""
 
-#: gnu/packages/linux.scm:1806
+#: gnu/packages/linux.scm:1862
 msgid ""
 "The Central Regulatory Domain Agent (CRDA) acts as the udev helper for\n"
 "communication between the kernel Linux and user space for regulatory\n"
 "compliance."
 msgstr ""
 
-#: gnu/packages/linux.scm:1852
+#: gnu/packages/linux.scm:1908
 msgid "Wireless regulatory database"
 msgstr ""
 
-#: gnu/packages/linux.scm:1854
+#: gnu/packages/linux.scm:1910
 msgid ""
 "This package contains the wireless regulatory database Central\n"
 "Regulatory Database Agent (CRDA) daemon.  The database contains information on\n"
 "country-specific regulations for the wireless spectrum."
 msgstr ""
 
-#: gnu/packages/linux.scm:1930
+#: gnu/packages/linux.scm:1982
 msgid "Utilities to read temperature/voltage/fan sensors"
 msgstr ""
 
-#: gnu/packages/linux.scm:1932
+#: gnu/packages/linux.scm:1984
 msgid ""
 "Lm-sensors is a hardware health monitoring package for Linux.  It allows\n"
 "you to access information from temperature, voltage, and fan speed sensors.\n"
 "It works with most newer systems."
 msgstr ""
 
-#: gnu/packages/linux.scm:1959
+#: gnu/packages/linux.scm:2011
 msgid "I2C tools for Linux"
 msgstr "I2C-værktøjer for Linux"
 
-#: gnu/packages/linux.scm:1961
+#: gnu/packages/linux.scm:2013
 msgid ""
 "The i2c-tools package contains a heterogeneous set of I2C tools for\n"
 "Linux: a bus probing tool, a chip dumper, register-level SMBus access helpers,\n"
@@ -5757,22 +6363,22 @@ msgid ""
 "SMBus access."
 msgstr ""
 
-#: gnu/packages/linux.scm:1997
+#: gnu/packages/linux.scm:2049
 msgid "Hardware health information viewer"
 msgstr ""
 
-#: gnu/packages/linux.scm:1999
+#: gnu/packages/linux.scm:2051
 msgid ""
 "Xsensors reads data from the libsensors library regarding hardware\n"
 "health such as temperature, voltage and fan speed and displays the information\n"
 "in a digital read-out."
 msgstr ""
 
-#: gnu/packages/linux.scm:2047
+#: gnu/packages/linux.scm:2099
 msgid "Linux profiling with performance counters"
 msgstr ""
 
-#: gnu/packages/linux.scm:2049
+#: gnu/packages/linux.scm:2101
 msgid ""
 "perf is a tool suite for profiling using hardware performance counters,\n"
 "with support in the Linux kernel.  perf can instrument CPU performance\n"
@@ -5781,11 +6387,11 @@ msgid ""
 "particular the 'perf' command."
 msgstr ""
 
-#: gnu/packages/linux.scm:2072
+#: gnu/packages/linux.scm:2124
 msgid "Simple tool for creating Linux namespace containers"
 msgstr "Simpelt værktøj til oprettelse af naverumscontainere under Linux"
 
-#: gnu/packages/linux.scm:2073
+#: gnu/packages/linux.scm:2125
 msgid ""
 "pflask is a simple tool for creating Linux namespace\n"
 "containers.  It can be used for running a command or even booting an OS inside\n"
@@ -5794,32 +6400,32 @@ msgid ""
 "thanks to the use of namespaces."
 msgstr ""
 
-#: gnu/packages/linux.scm:2100
+#: gnu/packages/linux.scm:2152
 msgid "Tune hard disk parameters for high performance"
 msgstr "Finjuster harddiskparametre for høj ydelse"
 
-#: gnu/packages/linux.scm:2102
+#: gnu/packages/linux.scm:2154
 msgid ""
 "Get/set device parameters for Linux SATA/IDE drives.  It's primary use\n"
 "is for enabling irq-unmasking and IDE multiple-mode."
 msgstr ""
 
-#: gnu/packages/linux.scm:2125
+#: gnu/packages/linux.scm:2177
 msgid "Tool for enabling and disabling wireless devices"
 msgstr "Værktøj til aktivering og deaktivering af trådløse enheder"
 
-#: gnu/packages/linux.scm:2127
+#: gnu/packages/linux.scm:2179
 msgid ""
 "rfkill is a simple tool for accessing the rfkill device interface,\n"
 "which is used to enable and disable wireless networking devices, typically\n"
 "WLAN, Bluetooth and mobile broadband."
 msgstr ""
 
-#: gnu/packages/linux.scm:2146
+#: gnu/packages/linux.scm:2198
 msgid "Display information on ACPI devices"
 msgstr ""
 
-#: gnu/packages/linux.scm:2147
+#: gnu/packages/linux.scm:2199
 msgid ""
 "@code{acpi} attempts to replicate the functionality of the\n"
 "\"old\" @code{apm} command on ACPI systems, including battery and thermal\n"
@@ -5827,11 +6433,11 @@ msgid ""
 "about ACPI devices."
 msgstr ""
 
-#: gnu/packages/linux.scm:2166
+#: gnu/packages/linux.scm:2218
 msgid "Daemon for delivering ACPI events to user-space programs"
 msgstr ""
 
-#: gnu/packages/linux.scm:2168
+#: gnu/packages/linux.scm:2220
 msgid ""
 "acpid is designed to notify user-space programs of Advanced\n"
 "Configuration and Power Interface (ACPI) events.  acpid should be started\n"
@@ -5840,37 +6446,37 @@ msgid ""
 "specified in /etc/acpi/events and execute the rules that match the event."
 msgstr ""
 
-#: gnu/packages/linux.scm:2190
+#: gnu/packages/linux.scm:2242
 msgid "System utilities based on Linux sysfs"
 msgstr ""
 
-#: gnu/packages/linux.scm:2192
+#: gnu/packages/linux.scm:2244
 msgid ""
-"These are a set of utilities built upon sysfs, a virtual filesystem in\n"
+"These are a set of utilities built upon sysfs, a virtual file system in\n"
 "Linux kernel versions 2.5+ that exposes a system's device tree.  The package\n"
 "also contains the libsysfs library."
 msgstr ""
 
-#: gnu/packages/linux.scm:2221
+#: gnu/packages/linux.scm:2273
 msgid "System utilities based on Linux sysfs (version 1.x)"
 msgstr ""
 
-#: gnu/packages/linux.scm:2244
+#: gnu/packages/linux.scm:2296
 msgid "Utilities to get and set CPU frequency on Linux"
 msgstr ""
 
-#: gnu/packages/linux.scm:2246
+#: gnu/packages/linux.scm:2298
 msgid ""
 "The cpufrequtils suite contains utilities to retrieve CPU frequency\n"
 "information, and set the CPU frequency if supported, using the cpufreq\n"
 "capabilities of the Linux kernel."
 msgstr ""
 
-#: gnu/packages/linux.scm:2265
+#: gnu/packages/linux.scm:2317
 msgid "Interface library for the Linux IEEE1394 drivers"
 msgstr ""
 
-#: gnu/packages/linux.scm:2267
+#: gnu/packages/linux.scm:2319
 msgid ""
 "Libraw1394 is the only supported interface to the kernel side raw1394 of\n"
 "the Linux IEEE-1394 subsystem, which provides direct access to the connected\n"
@@ -5879,105 +6485,109 @@ msgid ""
 "protocol in question."
 msgstr ""
 
-#: gnu/packages/linux.scm:2291
+#: gnu/packages/linux.scm:2343
 msgid "AV/C protocol library for IEEE 1394"
 msgstr ""
 
-#: gnu/packages/linux.scm:2293
+#: gnu/packages/linux.scm:2345
 msgid ""
 "Libavc1394 is a programming interface to the AV/C specification from\n"
 "the 1394 Trade Association.  AV/C stands for Audio/Video Control."
 msgstr ""
 
-#: gnu/packages/linux.scm:2315
+#: gnu/packages/linux.scm:2367
 msgid "Isochronous streaming media library for IEEE 1394"
 msgstr ""
 
-#: gnu/packages/linux.scm:2317
+#: gnu/packages/linux.scm:2369
 msgid ""
 "The libiec61883 library provides a higher level API for streaming DV,\n"
 "MPEG-2 and audio over Linux IEEE 1394."
 msgstr ""
 
-#: gnu/packages/linux.scm:2356
+#: gnu/packages/linux.scm:2416
 msgid "Tool for managing Linux Software RAID arrays"
 msgstr ""
 
-#: gnu/packages/linux.scm:2358
+#: gnu/packages/linux.scm:2418
 msgid ""
 "mdadm is a tool for managing Linux Software RAID arrays.  It can create,\n"
 "assemble, report on, and monitor arrays.  It can also move spares between raid\n"
 "arrays when needed."
 msgstr ""
 
-#: gnu/packages/linux.scm:2385
+#: gnu/packages/linux.scm:2450
+msgid "Statically-linked 'mdadm' command for use in an initrd"
+msgstr ""
+
+#: gnu/packages/linux.scm:2474
 msgid "Linux-native asynchronous I/O access library"
 msgstr ""
 
-#: gnu/packages/linux.scm:2387
+#: gnu/packages/linux.scm:2476
 msgid ""
 "This library enables userspace to use Linux kernel asynchronous I/O\n"
 "system calls, important for the performance of databases and other advanced\n"
 "applications."
 msgstr ""
 
-#: gnu/packages/linux.scm:2409
+#: gnu/packages/linux.scm:2498
 msgid "Bluetooth subband audio codec"
 msgstr "Bluetooth subband-lydkodning"
 
-#: gnu/packages/linux.scm:2411
+#: gnu/packages/linux.scm:2500
 msgid ""
 "The SBC is a digital audio encoder and decoder used to transfer data to\n"
 "Bluetooth audio output devices like headphones or loudspeakers."
 msgstr ""
 
-#: gnu/packages/linux.scm:2469
+#: gnu/packages/linux.scm:2558
 msgid "Linux Bluetooth protocol stack"
 msgstr ""
 
-#: gnu/packages/linux.scm:2471
+#: gnu/packages/linux.scm:2560
 msgid ""
 "BlueZ provides support for the core Bluetooth layers and protocols.  It\n"
 "is flexible, efficient and uses a modular implementation."
 msgstr ""
 
-#: gnu/packages/linux.scm:2527
+#: gnu/packages/linux.scm:2582
 msgid "Mount exFAT file systems"
 msgstr ""
 
-#: gnu/packages/linux.scm:2529
+#: gnu/packages/linux.scm:2584
 msgid ""
 "This package provides a FUSE-based file system that provides read and\n"
 "write access to exFAT devices."
 msgstr ""
 
-#: gnu/packages/linux.scm:2569
+#: gnu/packages/linux.scm:2624
 msgid "Mouse support for the Linux console"
 msgstr "Museunderstøttelse for Linuxkonsollen"
 
-#: gnu/packages/linux.scm:2571
+#: gnu/packages/linux.scm:2626
 msgid ""
 "The GPM (general-purpose mouse) daemon is a mouse server for\n"
 "applications running on the Linux console.  It allows users to select items\n"
 "and copy/paste text in the console and in xterm."
 msgstr ""
 
-#: gnu/packages/linux.scm:2605
+#: gnu/packages/linux.scm:2676
 msgid "Create and manage btrfs copy-on-write file systems"
 msgstr ""
 
-#: gnu/packages/linux.scm:2606
+#: gnu/packages/linux.scm:2677
 msgid ""
-"Btrfs is a copy-on-write (CoW) filesystem for Linux aimed at\n"
+"Btrfs is a copy-on-write (CoW) file system for Linux aimed at\n"
 "implementing advanced features while focusing on fault tolerance, repair and\n"
 "easy administration."
 msgstr ""
 
-#: gnu/packages/linux.scm:2635
+#: gnu/packages/linux.scm:2706
 msgid "Free-fall protection for spinning laptop hard drives"
 msgstr ""
 
-#: gnu/packages/linux.scm:2637
+#: gnu/packages/linux.scm:2708
 msgid ""
 "Prevents shock damage to the internal spinning hard drive(s) of some\n"
 "HP and Dell laptops.  When sudden movement is detected, all input/output\n"
@@ -5987,11 +6597,11 @@ msgid ""
 "feature, and a laptop with an accelerometer.  It has no effect on SSDs."
 msgstr ""
 
-#: gnu/packages/linux.scm:2691
+#: gnu/packages/linux.scm:2762
 msgid "Simple fan control program"
 msgstr "Simpelt kontrolprogram til blæseren"
 
-#: gnu/packages/linux.scm:2693
+#: gnu/packages/linux.scm:2764
 msgid ""
 "Thinkfan is a simple fan control program.  It reads temperatures,\n"
 "checks them against configured limits and switches to appropriate (also\n"
@@ -6000,43 +6610,43 @@ msgid ""
 "from userspace."
 msgstr ""
 
-#: gnu/packages/linux.scm:2728
+#: gnu/packages/linux.scm:2799
 msgid "Read-write access to NTFS file systems"
 msgstr "Læs/skriv adgang til NTFS-filsystemer"
 
-#: gnu/packages/linux.scm:2730
+#: gnu/packages/linux.scm:2801
 msgid ""
 "NTFS-3G provides read-write access to NTFS file systems, which are\n"
 "commonly found on Microsoft Windows.  It is implemented as a FUSE file system.\n"
 "The package provides additional NTFS tools."
 msgstr ""
 
-#: gnu/packages/linux.scm:2748
+#: gnu/packages/linux.scm:2819
 msgid "Random number generator daemon"
 msgstr ""
 
-#: gnu/packages/linux.scm:2750
+#: gnu/packages/linux.scm:2821
 msgid ""
 "Monitor a hardware random number generator, and supply entropy\n"
 "from that to the system kernel's @file{/dev/random} machinery."
 msgstr ""
 
-#: gnu/packages/linux.scm:2788
+#: gnu/packages/linux.scm:2859
 msgid "CPU frequency and voltage scaling tools for Linux"
 msgstr ""
 
-#: gnu/packages/linux.scm:2790
+#: gnu/packages/linux.scm:2861
 msgid ""
 "cpupower is a set of user-space tools that use the cpufreq feature of the\n"
 "Linux kernel to retrieve and control processor features related to power saving,\n"
 "such as frequency and voltage scaling."
 msgstr ""
 
-#: gnu/packages/linux.scm:2809
+#: gnu/packages/linux.scm:2880
 msgid "Entropy source for the Linux random number generator"
 msgstr ""
 
-#: gnu/packages/linux.scm:2811
+#: gnu/packages/linux.scm:2882
 msgid ""
 "haveged generates an unpredictable stream of random numbers for use by\n"
 "Linux's @file{/dev/random} and @file{/dev/urandom} devices.  The kernel's\n"
@@ -6049,6 +6659,118 @@ msgid ""
 "as used on certified hardware security devices."
 msgstr ""
 
+#: gnu/packages/linux.scm:2921
+msgid "eCryptfs cryptographic file system utilities"
+msgstr ""
+
+#: gnu/packages/linux.scm:2923
+msgid ""
+"eCryptfs is a POSIX-compliant stacked cryptographic file system for Linux.\n"
+"Each file's cryptographic meta-data is stored inside the file itself, along\n"
+"with the encrypted contents.  This allows individual encrypted files to be\n"
+"copied between hosts and still be decrypted with the proper key.  eCryptfs is a\n"
+"native Linux file system, and has been part of the Linux kernel since version\n"
+"2.6.19.  This package contains the userland utilities to manage it."
+msgstr ""
+
+#: gnu/packages/linux.scm:2954
+msgid "NFSv4 support library for name/ID mapping"
+msgstr ""
+
+#: gnu/packages/linux.scm:2955
+msgid ""
+"Libnfsidmap is a library holding mulitiple methods of\n"
+"mapping names to ids and visa versa, mainly for NFSv4.  It provides an\n"
+"extensible array of mapping functions, currently consisting of two choices:\n"
+"the default @code{nsswitch} and the experimental @code{umich_ldap}."
+msgstr ""
+
+#: gnu/packages/linux.scm:2988
+msgid "Tools for loading and managing Linux kernel modules"
+msgstr "Værktøjer til at indlæse og håndtere Linuxkernemoduler"
+
+#: gnu/packages/linux.scm:2990
+msgid ""
+"Tools for loading and managing Linux kernel modules, such as `modprobe',\n"
+"`insmod', `lsmod', and more."
+msgstr ""
+
+#: gnu/packages/linux.scm:3024
+msgid "Machine check monitor for x86 Linux systems"
+msgstr ""
+
+#: gnu/packages/linux.scm:3026
+msgid ""
+"The mcelog daemon is required by the Linux kernel to log memory, I/O, CPU,\n"
+"and other hardware errors on x86 systems.  It can also perform user-defined\n"
+"tasks, such as bringing bad pages off-line, when configurable error thresholds\n"
+"are exceeded."
+msgstr ""
+
+#: gnu/packages/linux.scm:3055
+msgid "MTD Flash Storage Utilities"
+msgstr "Lagerredskaber for MTD-flash"
+
+#: gnu/packages/linux.scm:3056
+msgid ""
+"This package provides utilities for testing, partitioning, etc\n"
+"of flash storage."
+msgstr ""
+"Denne pakke tilbyder redskaber til test, partitionering, etc.\n"
+"for flashlager."
+
+#: gnu/packages/linux.scm:3079
+msgid "Interface to Linux's seccomp syscall filtering mechanism"
+msgstr ""
+
+#: gnu/packages/linux.scm:3080
+msgid ""
+"The libseccomp library provides an easy to use, platform\n"
+"independent, interface to the Linux Kernel's syscall filtering mechanism.  The\n"
+"libseccomp API is designed to abstract away the underlying BPF based syscall\n"
+"filter language and present a more conventional function-call based filtering\n"
+"interface that should be familiar to, and easily adopted by, application\n"
+"developers."
+msgstr ""
+
+#: gnu/packages/linux.scm:3121
+msgid "Usage monitor for AMD Radeon graphics"
+msgstr ""
+
+#: gnu/packages/linux.scm:3122
+msgid ""
+"RadeonTop monitors resource consumption on supported AMD\n"
+"Radeon Graphics Processing Units (GPUs), either in real time as bar graphs on\n"
+"a terminal or saved to a file for further processing.  It measures both the\n"
+"activity of the GPU as a whole, which is also accurate during OpenCL\n"
+"computations, as well as separate component statistics that are only meaningful\n"
+"under OpenGL graphics workloads."
+msgstr ""
+
+#: gnu/packages/linux.scm:3157
+msgid "Tool and library to manipulate EFI variables"
+msgstr "Værktøj og bibliotek til at manipulere EFI-variabler"
+
+#: gnu/packages/linux.scm:3158
+msgid ""
+"This package provides a library and a command line\n"
+"interface to the variable facility of UEFI boot firmware."
+msgstr ""
+"Denne pakke tilbyder et bibliotek og en kommandolinje-\n"
+"grænseflade til variabelfaciliteten for UEFI-opstartsfirmware."
+
+#: gnu/packages/linux.scm:3199
+msgid "Modify the Extensible Firmware Interface (EFI) boot manager"
+msgstr ""
+
+#: gnu/packages/linux.scm:3201
+msgid ""
+"@code{efibootmgr} is a user-space application to modify the Intel\n"
+"Extensible Firmware Interface (EFI) Boot Manager.  This application can\n"
+"create and destroy boot entries, change the boot order, change the next\n"
+"running boot option, and more."
+msgstr ""
+
 #: gnu/packages/lout.scm:109
 msgid "Document layout system"
 msgstr ""
@@ -6072,11 +6794,11 @@ msgid ""
 "beginning."
 msgstr ""
 
-#: gnu/packages/messaging.scm:80
+#: gnu/packages/messaging.scm:97
 msgid "Off-the-Record (OTR) Messaging Library and Toolkit"
 msgstr ""
 
-#: gnu/packages/messaging.scm:82
+#: gnu/packages/messaging.scm:99
 msgid ""
 "OTR allows you to have private conversations over instant messaging by\n"
 "providing: (1) Encryption: No one else can read your instant messages.  (2)\n"
@@ -6089,11 +6811,11 @@ msgid ""
 "keys, no previous conversation is compromised."
 msgstr ""
 
-#: gnu/packages/messaging.scm:148
+#: gnu/packages/messaging.scm:165
 msgid "IRC to instant messaging gateway"
 msgstr ""
 
-#: gnu/packages/messaging.scm:149
+#: gnu/packages/messaging.scm:166
 msgid ""
 "BitlBee brings IM (instant messaging) to IRC clients, for\n"
 "people who have an IRC client running all the time and don't want to run an\n"
@@ -6103,45 +6825,45 @@ msgid ""
 "identi.ca and status.net)."
 msgstr ""
 
-#: gnu/packages/messaging.scm:182
+#: gnu/packages/messaging.scm:202
 msgid "Graphical IRC Client"
 msgstr ""
 
-#: gnu/packages/messaging.scm:184
+#: gnu/packages/messaging.scm:204
 msgid ""
-"HexChat lets you connect to multiple IRC networks at once.  The main window\n"
-"shows the list of currently connected networks and their channels, the current\n"
-"conversation and the list of users.  It uses colors to differentiate between\n"
-"users and to highlight messages.  It checks spelling using available\n"
+"HexChat lets you connect to multiple IRC networks at once.  The main\n"
+"window shows the list of currently connected networks and their channels, the\n"
+"current conversation and the list of users.  It uses colors to differentiate\n"
+"between users and to highlight messages.  It checks spelling using available\n"
 "dictionaries.  HexChat can be extended with multiple addons."
 msgstr ""
 
-#: gnu/packages/messaging.scm:250
+#: gnu/packages/messaging.scm:271
 msgid "Lightweight Internet Relay Chat server for small networks"
 msgstr ""
 
-#: gnu/packages/messaging.scm:252
+#: gnu/packages/messaging.scm:273
 msgid ""
 "ngIRCd is a lightweight Internet Relay Chat server for small or private\n"
 "networks.  It is easy to configure, can cope with dynamic IP addresses, and\n"
 "supports IPv6, SSL-protected connections as well as PAM for authentication."
 msgstr ""
 
-#: gnu/packages/messaging.scm:323
+#: gnu/packages/messaging.scm:344
 msgid "Graphical multi-protocol instant messaging client"
 msgstr ""
 
-#: gnu/packages/messaging.scm:325
+#: gnu/packages/messaging.scm:346
 msgid ""
 "Pidgin is a modular instant messaging client that supports many popular\n"
 "chat protocols."
 msgstr ""
 
-#: gnu/packages/messaging.scm:363
+#: gnu/packages/messaging.scm:384
 msgid "Off-the-Record Messaging plugin for Pidgin"
 msgstr ""
 
-#: gnu/packages/messaging.scm:365
+#: gnu/packages/messaging.scm:386
 msgid ""
 "Pidgin-OTR is a plugin that adds support for OTR to the Pidgin instant\n"
 "messaging client.  OTR (Off-the-Record) Messaging allows you to have private\n"
@@ -6156,11 +6878,11 @@ msgid ""
 "compromised."
 msgstr ""
 
-#: gnu/packages/messaging.scm:405
+#: gnu/packages/messaging.scm:426
 msgid "IRC network bouncer"
 msgstr ""
 
-#: gnu/packages/messaging.scm:406
+#: gnu/packages/messaging.scm:427
 msgid ""
 "ZNC is an IRC network bouncer or BNC.  It can detach the\n"
 "client from the actual IRC server, and also from selected channels.  Multiple\n"
@@ -6168,22 +6890,22 @@ msgid ""
 "simultaneously and therefore appear under the same nickname on IRC."
 msgstr ""
 
-#: gnu/packages/messaging.scm:428
+#: gnu/packages/messaging.scm:449
 msgid "Non-blocking Jabber/XMPP module"
 msgstr ""
 
-#: gnu/packages/messaging.scm:430
+#: gnu/packages/messaging.scm:451
 msgid ""
 "The goal of this python library is to provide a way for Python\n"
 "applications to use Jabber/XMPP networks in a non-blocking way.  This library\n"
 "was initially a fork of xmpppy, but is using non-blocking sockets."
 msgstr ""
 
-#: gnu/packages/messaging.scm:487
+#: gnu/packages/messaging.scm:501
 msgid "Jabber (XMPP) client"
 msgstr ""
 
-#: gnu/packages/messaging.scm:488
+#: gnu/packages/messaging.scm:502
 msgid ""
 "Gajim is a feature-rich and easy to use Jabber/XMPP client.\n"
 "Among its features are: a tabbed chat window and single window modes; support\n"
@@ -6192,21 +6914,133 @@ msgid ""
 "end-to-end encryption support; XML console."
 msgstr ""
 
-#: gnu/packages/mpd.scm:65
+#: gnu/packages/messaging.scm:576
+msgid "Jabber (XMPP) server"
+msgstr ""
+
+#: gnu/packages/messaging.scm:577
+msgid ""
+"Prosody is a modern XMPP communication server.  It aims to\n"
+"be easy to set up and configure, and efficient with system resources.\n"
+"Additionally, for developers it aims to be easy to extend and give a flexible\n"
+"system on which to rapidly develop added functionality, or prototype new\n"
+"protocols."
+msgstr ""
+
+#: gnu/packages/messaging.scm:619
+msgid "Library for the Tox encrypted messenger protocol"
+msgstr ""
+
+#: gnu/packages/messaging.scm:621
+msgid "C library implementation of the Tox encrypted messenger protocol."
+msgstr "C-biblioteksimplementering for den Tox-krypterede messengerprotokol."
+
+#: gnu/packages/messaging.scm:662
+msgid "Lightweight Tox client"
+msgstr "Simpel Tox-klient"
+
+#: gnu/packages/messaging.scm:663
+msgid ""
+"A  lightweight Tox client.  Tox is a distributed and secure\n"
+"instant messenger with audio and video chat capabilities."
+msgstr ""
+
+#: gnu/packages/messaging.scm:714
+msgid "Tox chat client using Qt"
+msgstr ""
+
+#: gnu/packages/messaging.scm:715
+msgid ""
+"qTox is a Tox client that follows the Tox design\n"
+"guidelines.  It provides an easy to use application that allows you to\n"
+"connect with friends and family without anyone else listening in."
+msgstr ""
+
+#: gnu/packages/messaging.scm:812
+msgid ""
+"Distributed and trustless peer-to-peer communications protocol\n"
+"for sending encrypted messages to one person or many subscribers."
+msgstr ""
+
+#: gnu/packages/messaging.scm:814
+msgid "Distributed peer-to-peer communication"
+msgstr ""
+
+#: gnu/packages/messaging.scm:833
+msgid "Multi-user chat program"
+msgstr ""
+
+#: gnu/packages/messaging.scm:834
+msgid ""
+"Ytalk is a replacement for the BSD talk program.  Its main\n"
+"advantage is the ability to communicate with any arbitrary number of users at\n"
+"once.  It supports both talk protocols (\"talk\" and \"ntalk\") and can communicate\n"
+"with several different talk daemons at the same time."
+msgstr ""
+
+#: gnu/packages/messaging.scm:859
+msgid "Portable high-level Jabber/XMPP library for C++"
+msgstr ""
+
+#: gnu/packages/messaging.scm:861
+msgid ""
+"gloox is a full-featured Jabber/XMPP client library,\n"
+"written in ANSI C++.  It makes writing spec-compliant clients easy\n"
+"and allows for hassle-free integration of Jabber/XMPP functionality\n"
+"into existing applications."
+msgstr ""
+
+#: gnu/packages/messaging.scm:934
+msgid ""
+"@code{Net::PSYC} with support for TCP, UDP, Event.pm, @code{IO::Select} and\n"
+"Gtk2 event loops.  This package includes 12 applications and additional scripts:\n"
+"psycion (a @uref{http://about.psyc.eu,PSYC} chat client), remotor (a control console\n"
+"for @uref{https://torproject.org,tor} router) and many more."
+msgstr ""
+
+#: gnu/packages/messaging.scm:938
+msgid "Perl implementation of PSYC protocol"
+msgstr "Perlimplementering af PSYC-protokollen"
+
+#: gnu/packages/messaging.scm:977
+msgid ""
+"@code{libpsyc} is a PSYC library in C which implements\n"
+"core aspects of PSYC, useful for all kinds of clients and servers\n"
+"including psyced."
+msgstr ""
+
+#: gnu/packages/messaging.scm:980
+msgid "PSYC library in C"
+msgstr ""
+
+#: gnu/packages/messaging.scm:1047
+msgid "psycLPC is a multi-user network server programming language"
+msgstr ""
+
+#: gnu/packages/messaging.scm:1049
+msgid ""
+"LPC is a bytecode language, invented to specifically implement\n"
+"multi user virtual environments on the internet.  This technology is used for\n"
+"MUDs and also the psyced implementation of the Protocol for SYnchronous\n"
+"Conferencing (PSYC).  psycLPC is a fork of LDMud with some new features and\n"
+"many bug fixes."
+msgstr ""
+
+#: gnu/packages/mpd.scm:68
 msgid "Music Player Daemon client library"
 msgstr ""
 
-#: gnu/packages/mpd.scm:66
+#: gnu/packages/mpd.scm:69
 msgid ""
 "A stable, documented, asynchronous API library for\n"
 "interfacing MPD in the C, C++ & Objective C languages."
 msgstr ""
 
-#: gnu/packages/mpd.scm:126
+#: gnu/packages/mpd.scm:129
 msgid "Music Player Daemon"
 msgstr ""
 
-#: gnu/packages/mpd.scm:127
+#: gnu/packages/mpd.scm:130
 msgid ""
 "Music Player Daemon (MPD) is a flexible, powerful,\n"
 "server-side application for playing music.  Through plugins and libraries it\n"
@@ -6214,11 +7048,11 @@ msgid ""
 "protocol."
 msgstr ""
 
-#: gnu/packages/mpd.scm:150
+#: gnu/packages/mpd.scm:153
 msgid "Music Player Daemon client"
 msgstr "Music Player - dæmonklient"
 
-#: gnu/packages/mpd.scm:151
+#: gnu/packages/mpd.scm:154
 msgid ""
 "MPC is a minimalist command line interface to MPD, the music\n"
 "player daemon."
@@ -6226,53 +7060,64 @@ msgstr ""
 "MPC er en minimalistisk kommandolinjegrænseflade til MPD,\n"
 "musikafspillerdæmonen."
 
-#: gnu/packages/mpd.scm:174
+#: gnu/packages/mpd.scm:177
 msgid "Curses Music Player Daemon client"
 msgstr ""
 
-#: gnu/packages/mpd.scm:175
+#: gnu/packages/mpd.scm:178
 msgid ""
 "ncmpc is a fully featured MPD client, which runs in a\n"
 "terminal using ncurses."
 msgstr ""
 
-#: gnu/packages/mpd.scm:204
+#: gnu/packages/mpd.scm:207
 msgid "Featureful ncurses based MPD client inspired by ncmpc"
 msgstr ""
 
-#: gnu/packages/mpd.scm:205
+#: gnu/packages/mpd.scm:208
 msgid ""
 "Ncmpcpp is an mpd client with a UI very similar to ncmpc,\n"
 "but it provides new useful features such as support for regular expressions\n"
 "for library searches, extended song format, items filtering, the ability to\n"
-"sort playlists, and a local filesystem browser."
+"sort playlists, and a local file system browser."
 msgstr ""
 
-#: gnu/packages/mpd.scm:228
+#: gnu/packages/mpd.scm:231
 msgid "MPD client for track scrobbling"
 msgstr ""
 
-#: gnu/packages/mpd.scm:229
+#: gnu/packages/mpd.scm:232
 msgid ""
 "mpdscribble is a Music Player Daemon client which submits\n"
 "information about tracks being played to a scrobbler, such as Libre.FM."
 msgstr ""
 
-#: gnu/packages/mpd.scm:254
+#: gnu/packages/mpd.scm:257
 msgid "Python MPD client library"
 msgstr ""
 
-#: gnu/packages/mpd.scm:255
+#: gnu/packages/mpd.scm:258
 msgid ""
 "Python-mpd2 is a Python library which provides a client\n"
 "interface for the Music Player Daemon."
 msgstr ""
 
-#: gnu/packages/netpbm.scm:146
+#: gnu/packages/mpd.scm:307
+msgid "Elegant client for the Music Player Daemon"
+msgstr ""
+
+#: gnu/packages/mpd.scm:308
+msgid ""
+"Sonata is an elegant graphical client for the Music Player\n"
+"Daemon (MPD).  It supports playlists, multiple profiles (connecting to different\n"
+"MPD servers, search and multimedia key support."
+msgstr ""
+
+#: gnu/packages/netpbm.scm:167
 msgid "Toolkit for manipulation of images"
 msgstr ""
 
-#: gnu/packages/netpbm.scm:148
+#: gnu/packages/netpbm.scm:169
 msgid ""
 "Netpbm is a toolkit for the manipulation of graphic images, including\n"
 "the conversion of images between a variety of different formats.\n"
@@ -6292,11 +7137,11 @@ msgid ""
 "themselves."
 msgstr ""
 
-#: gnu/packages/networking.scm:65
+#: gnu/packages/networking.scm:77
 msgid "Viewing and manipulating MAC addresses of network interfaces"
 msgstr ""
 
-#: gnu/packages/networking.scm:66
+#: gnu/packages/networking.scm:78
 msgid ""
 "GNU MAC Changer is a utility for viewing and changing MAC\n"
 "addresses of networking devices.  New addresses may be set explicitly or\n"
@@ -6304,22 +7149,22 @@ msgid ""
 "or, more generally, MAC addresses of the same category of hardware."
 msgstr ""
 
-#: gnu/packages/networking.scm:94
+#: gnu/packages/networking.scm:106
 msgid "Teredo IPv6 tunneling software"
 msgstr ""
 
-#: gnu/packages/networking.scm:96
+#: gnu/packages/networking.scm:108
 msgid ""
 "Miredo is an implementation (client, relay, server) of the Teredo\n"
 "specification, which provides IPv6 Internet connectivity to IPv6 enabled hosts\n"
 "residing in IPv4-only networks, even when they are behind a NAT device."
 msgstr ""
 
-#: gnu/packages/networking.scm:118
+#: gnu/packages/networking.scm:130
 msgid "Open bidirectional communication channels from the command line"
 msgstr ""
 
-#: gnu/packages/networking.scm:120
+#: gnu/packages/networking.scm:132
 msgid ""
 "socat is a relay for bidirectional data transfer between two independent\n"
 "data channels---files, pipes, devices, sockets, etc.  It can create\n"
@@ -6332,11 +7177,22 @@ msgid ""
 "or server shell scripts with network connections."
 msgstr ""
 
-#: gnu/packages/networking.scm:144
+#: gnu/packages/networking.scm:213
+msgid "Monitor and filter incoming requests for network services"
+msgstr ""
+
+#: gnu/packages/networking.scm:214
+msgid ""
+"With this package you can monitor and filter incoming requests for\n"
+"network services.  It includes a library which may be used by daemons to\n"
+"transparently check connection attempts against an access control list."
+msgstr ""
+
+#: gnu/packages/networking.scm:234
 msgid "Library for message-based applications"
 msgstr ""
 
-#: gnu/packages/networking.scm:146
+#: gnu/packages/networking.scm:236
 msgid ""
 "The 0MQ lightweight messaging kernel is a library which extends the\n"
 "standard socket interfaces with features traditionally provided by specialized\n"
@@ -6346,43 +7202,43 @@ msgid ""
 "more."
 msgstr ""
 
-#: gnu/packages/networking.scm:185
+#: gnu/packages/networking.scm:275
 msgid "Apache Kafka C/C++ client library"
 msgstr ""
 
-#: gnu/packages/networking.scm:187
+#: gnu/packages/networking.scm:277
 msgid ""
 "librdkafka is a C library implementation of the Apache Kafka protocol,\n"
 "containing both Producer and Consumer support."
 msgstr ""
 
-#: gnu/packages/networking.scm:204
+#: gnu/packages/networking.scm:294
 msgid "Library for Neighbor Discovery Protocol"
 msgstr ""
 
-#: gnu/packages/networking.scm:206
+#: gnu/packages/networking.scm:296
 msgid ""
 "libndp contains a library which provides a wrapper for IPv6 Neighbor\n"
 "Discovery Protocol.  It also provides a tool named ndptool for sending and\n"
 "receiving NDP messages."
 msgstr ""
 
-#: gnu/packages/networking.scm:224
+#: gnu/packages/networking.scm:314
 msgid "Display or change Ethernet device settings"
 msgstr ""
 
-#: gnu/packages/networking.scm:226
+#: gnu/packages/networking.scm:316
 msgid ""
 "ethtool can be used to query and change settings such as speed,\n"
 "auto-negotiation and checksum offload on many network devices, especially\n"
 "Ethernet devices."
 msgstr ""
 
-#: gnu/packages/networking.scm:263
+#: gnu/packages/networking.scm:353
 msgid "Text based network interface status monitor"
 msgstr ""
 
-#: gnu/packages/networking.scm:265
+#: gnu/packages/networking.scm:355
 msgid ""
 "IFStatus is a simple, easy-to-use program for displaying commonly\n"
 "needed/wanted real-time traffic statistics of multiple network\n"
@@ -6390,11 +7246,11 @@ msgid ""
 "intended as a substitute for the PPPStatus and EthStatus projects."
 msgstr ""
 
-#: gnu/packages/networking.scm:285
+#: gnu/packages/networking.scm:375
 msgid "Realtime console network usage monitor"
 msgstr ""
 
-#: gnu/packages/networking.scm:287
+#: gnu/packages/networking.scm:377
 msgid ""
 "Nload is a console application which monitors network traffic and\n"
 "bandwidth usage in real time.  It visualizes the in- and outgoing traffic using\n"
@@ -6402,11 +7258,11 @@ msgid ""
 "and min/max network usage."
 msgstr ""
 
-#: gnu/packages/networking.scm:323
+#: gnu/packages/networking.scm:420
 msgid "Tunnel IPv4 data through a DNS server"
 msgstr ""
 
-#: gnu/packages/networking.scm:324
+#: gnu/packages/networking.scm:421
 msgid ""
 "Iodine tunnels IPv4 data through a DNS server.  This\n"
 "can be useful in different situations where internet access is firewalled, but\n"
@@ -6414,22 +7270,34 @@ msgid ""
 "and up to 1 Mbit/s downstream."
 msgstr ""
 
-#: gnu/packages/networking.scm:335
+#: gnu/packages/networking.scm:459
+msgid "Improved whois client"
+msgstr ""
+
+#: gnu/packages/networking.scm:460
+msgid ""
+"This whois client is intelligent and can\n"
+"automatically select the appropriate whois server for most queries.\n"
+"Because of historical reasons this also includes a tool called mkpasswd\n"
+"which can be used to encrypt a password with @code{crypt(3)}."
+msgstr ""
+
+#: gnu/packages/networking.scm:471
 msgid "Network traffic analyzer"
 msgstr ""
 
-#: gnu/packages/networking.scm:376
+#: gnu/packages/networking.scm:512
 msgid ""
 "Wireshark is a network protocol analyzer, or @dfn{packet\n"
 "sniffer}, that lets you capture and interactively browse the contents of\n"
 "network frames."
 msgstr ""
 
-#: gnu/packages/networking.scm:407
+#: gnu/packages/networking.scm:543
 msgid "Web server latency and throughput monitor"
 msgstr ""
 
-#: gnu/packages/networking.scm:409
+#: gnu/packages/networking.scm:545
 msgid ""
 "httping measures how long it takes to connect to a web server, send an\n"
 "HTTP(S) request, and receive the reply headers.  It is somewhat similar to\n"
@@ -6438,106 +7306,269 @@ msgid ""
 "application stack itself."
 msgstr ""
 
-#: gnu/packages/pdf.scm:101
+#: gnu/packages/networking.scm:566
+msgid "Console based live network and disk I/O bandwidth monitor"
+msgstr ""
+
+#: gnu/packages/networking.scm:567
+msgid ""
+"Bandwidth Monitor NG is a small and simple console based\n"
+"live network and disk I/O bandwidth monitor."
+msgstr ""
+
+#: gnu/packages/networking.scm:616
+msgid "Assess WiFi network security"
+msgstr ""
+
+#: gnu/packages/networking.scm:618
+msgid ""
+"Aircrack-ng is a complete suite of tools to assess WiFi network\n"
+"security.  It focuses on different areas of WiFi security: monitoring,\n"
+"attacking, testing, and cracking.  All tools are command-line driven, which\n"
+"allows for heavy scripting."
+msgstr ""
+
+#: gnu/packages/networking.scm:643
+msgid "Perl Interface to the Domain Name System"
+msgstr ""
+
+#: gnu/packages/networking.scm:644
+msgid "Net::DNS is the Perl Interface to the Domain Name System."
+msgstr ""
+
+#: gnu/packages/networking.scm:675
+msgid "IPv6 related part of the C socket.h defines and structure manipulators for Perl"
+msgstr ""
+
+#: gnu/packages/networking.scm:676
+msgid ""
+"Socket6 binds the IPv6 related part of the C socket header\n"
+"definitions and structure manipulators for Perl."
+msgstr ""
+
+#: gnu/packages/networking.scm:703
+msgid "Programmable DNS resolver class for offline emulation of DNS"
+msgstr ""
+
+#: gnu/packages/networking.scm:704
+msgid ""
+"Net::DNS::Resolver::Programmable is a programmable DNS resolver for\n"
+"offline emulation of DNS."
+msgstr ""
+
+#: gnu/packages/networking.scm:737
+msgid "Manages IPv4 and IPv6 addresses and subnets"
+msgstr ""
+
+#: gnu/packages/networking.scm:738
+msgid "NetAddr::IP manages IPv4 and IPv6 addresses and subsets."
+msgstr ""
+
+#: gnu/packages/networking.scm:762
+msgid "Patricia Trie Perl module for fast IP address lookups"
+msgstr ""
+
+#: gnu/packages/networking.scm:764
+msgid "Net::Patricia does IP address lookups quickly in Perl."
+msgstr ""
+
+#: gnu/packages/networking.scm:787
+msgid "Perl extension for merging IPv4 or IPv6 CIDR addresses"
+msgstr ""
+
+#: gnu/packages/networking.scm:788
+msgid "Net::CIDR::Lite merges IPv4 or IPv6 CIDR addresses."
+msgstr ""
+
+#: gnu/packages/networking.scm:810
+msgid "Look up location and network information by IP Address in Perl"
+msgstr ""
+
+#: gnu/packages/networking.scm:811
+msgid ""
+"The Perl module 'Geo::IP'.  It looks up location and network\n"
+"information by IP Address."
+msgstr ""
+
+#: gnu/packages/networking.scm:840
+msgid "Perl object interface for AF_INET/AF_INET6 domain sockets"
+msgstr ""
+
+#: gnu/packages/networking.scm:841
+msgid ""
+"IO::Socket::INET6 is an interface for AF_INET/AF_INET6 domain\n"
+"sockets in Perl."
+msgstr ""
+
+#: gnu/packages/networking.scm:872
+msgid "Redirect any TCP connection through a proxy or proxy chain"
+msgstr ""
+
+#: gnu/packages/networking.scm:873
+msgid ""
+"Proxychains-ng is a preloader which hooks calls to sockets\n"
+"in dynamically linked programs and redirects them through one or more SOCKS or\n"
+"HTTP proxies."
+msgstr ""
+
+#: gnu/packages/networking.scm:894
+msgid "Network communication layer on top of UDP"
+msgstr ""
+
+#: gnu/packages/networking.scm:896
+msgid ""
+"ENet's purpose is to provide a relatively thin, simple and robust network\n"
+"communication layer on top of UDP.  The primary feature it provides is optional\n"
+"reliable, in-order delivery of packets.  ENet omits certain higher level\n"
+"networking features such as authentication, server discovery, encryption, or\n"
+"other similar tasks that are particularly application specific so that the\n"
+"library remains flexible, portable, and easily embeddable."
+msgstr ""
+
+#: gnu/packages/networking.scm:959
+msgid "Applicative network protocol demultiplexer"
+msgstr ""
+
+#: gnu/packages/networking.scm:961
+msgid ""
+"sslh is a network protocol demultiplexer.  It acts like a switchboard,\n"
+"accepting connections from clients on one port and forwarding them to different\n"
+"servers based on the contents of the first received data packet.  Detection of\n"
+"common protocols like HTTP(S), SSL, SSH, OpenVPN, tinc, and XMPP is already\n"
+"implemented, but any other protocol that matches a regular expression can be\n"
+"added.  sslh's name comes from its original application of serving both SSH and\n"
+"HTTPS on port 443, allowing SSH connections from inside corporate firewalls\n"
+"that block port 22."
+msgstr ""
+
+#: gnu/packages/networking.scm:984
+msgid "TCP, UDP and SCTP bandwidth measurement tool"
+msgstr ""
+
+#: gnu/packages/networking.scm:986
+msgid ""
+"iPerf is a tool to measure achievable bandwidth on IP networks.  It\n"
+"supports tuning of various parameters related to timing, buffers and\n"
+"protocols (TCP, UDP, SCTP with IPv4 and IPv6).  For each test it reports\n"
+"the bandwidth, loss, and other parameters."
+msgstr ""
+
+#: gnu/packages/networking.scm:1019
+msgid "Per-process bandwidth monitor"
+msgstr ""
+
+#: gnu/packages/networking.scm:1020
+msgid ""
+"NetHogs is a small 'net top' tool for Linux.  Instead of\n"
+"breaking the traffic down per protocol or per subnet, like most tools do, it\n"
+"groups bandwidth by process.\n"
+"\n"
+"NetHogs does not rely on a special kernel module to be loaded.  If there's\n"
+"suddenly a lot of network traffic, you can fire up NetHogs and immediately see\n"
+"which PID is causing this.  This makes it easy to identify programs that have\n"
+"gone wild and are suddenly taking up your bandwidth."
+msgstr ""
+
+#: gnu/packages/pdf.scm:121
 msgid "PDF rendering library"
 msgstr "PDF-optegningsbibliotek"
 
-#: gnu/packages/pdf.scm:103
+#: gnu/packages/pdf.scm:123
 msgid "Poppler is a PDF rendering library based on the xpdf-3.0 code base."
 msgstr "Poppler er et PDF-optegningsbibliotek baseret på xpdf-3.0-kodebasen."
 
-#: gnu/packages/pdf.scm:112
+#: gnu/packages/pdf.scm:132
 msgid "Qt4 frontend for the Poppler PDF rendering library"
 msgstr "Qt4-brugeflade for Poppler PDF-optegningsbiblioteket"
 
-#: gnu/packages/pdf.scm:119
+#: gnu/packages/pdf.scm:143
 msgid "Qt5 frontend for the Poppler PDF rendering library"
 msgstr "Qt5-brugeflade for Poppler PDF-optegningsbiblioteket"
 
-#: gnu/packages/pdf.scm:152
+#: gnu/packages/pdf.scm:176
 msgid "Python bindings for Poppler-Qt4"
 msgstr "Pythonbindinger for Poppler-Qt4"
 
-#: gnu/packages/pdf.scm:154
+#: gnu/packages/pdf.scm:178
 msgid ""
 "This package provides Python bindings for the Qt4 interface of the\n"
 "Poppler PDF rendering library."
 msgstr ""
 
-#: gnu/packages/pdf.scm:191
+#: gnu/packages/pdf.scm:215
 msgid "Library for generating PDF files"
 msgstr "Bibliotek til at oprette PDF-filer"
 
-#: gnu/packages/pdf.scm:193
+#: gnu/packages/pdf.scm:217
 msgid ""
 "libHaru is a library for generating PDF files.  libHaru does not support\n"
 "reading and editing of existing PDF files."
 msgstr ""
 
-#: gnu/packages/pdf.scm:240
+#: gnu/packages/pdf.scm:264
 msgid "Viewer for PDF files based on the Motif toolkit"
 msgstr ""
 
-#: gnu/packages/pdf.scm:242
+#: gnu/packages/pdf.scm:266
 msgid "Xpdf is a viewer for Portable Document Format (PDF) files."
 msgstr "Xpdf er en fremviser for Portable Document Format-filer (PDF)."
 
-#: gnu/packages/pdf.scm:272
+#: gnu/packages/pdf.scm:296
 msgid "Comic book support for zathura (libarchive backend)"
 msgstr "Understøttelse af tegneserier i zathura (libarchive-motor)"
 
-#: gnu/packages/pdf.scm:273
+#: gnu/packages/pdf.scm:297
 msgid ""
 "The zathura-cb plugin adds comic book support to zathura\n"
 "using libarchive."
 msgstr ""
 
-#: gnu/packages/pdf.scm:303
+#: gnu/packages/pdf.scm:327
 msgid "PS support for zathura (libspectre backend)"
 msgstr ""
 
-#: gnu/packages/pdf.scm:304
+#: gnu/packages/pdf.scm:328
 msgid ""
 "The zathura-ps plugin adds PS support to zathura\n"
 "using libspectre."
 msgstr ""
 
-#: gnu/packages/pdf.scm:335
+#: gnu/packages/pdf.scm:359
 msgid "DjVu support for zathura (DjVuLibre backend)"
 msgstr ""
 
-#: gnu/packages/pdf.scm:336
+#: gnu/packages/pdf.scm:360
 msgid ""
 "The zathura-djvu plugin adds DjVu support to zathura\n"
 "using the DjVuLibre library."
 msgstr ""
 
-#: gnu/packages/pdf.scm:368
+#: gnu/packages/pdf.scm:392
 msgid "PDF support for zathura (poppler backend)"
 msgstr ""
 
-#: gnu/packages/pdf.scm:369
+#: gnu/packages/pdf.scm:393
 msgid ""
 "The zathura-pdf-poppler plugin adds PDF support to zathura\n"
 "by using the poppler rendering engine."
 msgstr ""
 
-#: gnu/packages/pdf.scm:406
+#: gnu/packages/pdf.scm:430
 msgid "Lightweight keyboard-driven PDF viewer"
 msgstr ""
 
-#: gnu/packages/pdf.scm:407
+#: gnu/packages/pdf.scm:431
 msgid ""
 "Zathura is a customizable document viewer.  It provides a\n"
 "minimalistic interface and an interface that mainly focuses on keyboard\n"
 "interaction."
 msgstr ""
 
-#: gnu/packages/pdf.scm:446
+#: gnu/packages/pdf.scm:470
 msgid "Tools to work with the PDF file format"
 msgstr ""
 
-#: gnu/packages/pdf.scm:448
+#: gnu/packages/pdf.scm:472
 msgid ""
 "PoDoFo is a C++ library and set of command-line tools to work with the\n"
 "PDF file format.  It can parse PDF files and load them into memory, and makes\n"
@@ -6546,11 +7577,11 @@ msgid ""
 "extracting content or merging files."
 msgstr ""
 
-#: gnu/packages/pdf.scm:491
+#: gnu/packages/pdf.scm:528
 msgid "Lightweight PDF viewer and toolkit"
 msgstr ""
 
-#: gnu/packages/pdf.scm:493
+#: gnu/packages/pdf.scm:530
 msgid ""
 "MuPDF is a C library that implements a PDF and XPS parsing and\n"
 "rendering engine.  It is used primarily to render pages into bitmaps,\n"
@@ -6562,11 +7593,11 @@ msgid ""
 "and examining the file structure (pdfshow)."
 msgstr ""
 
-#: gnu/packages/pdf.scm:533
+#: gnu/packages/pdf.scm:582
 msgid "Command-line tools and library for transforming PDF files"
 msgstr ""
 
-#: gnu/packages/pdf.scm:535
+#: gnu/packages/pdf.scm:584
 msgid ""
 "QPDF is a command-line program that does structural, content-preserving\n"
 "transformations on PDF files.  It could have been called something like\n"
@@ -6575,16 +7606,108 @@ msgid ""
 "program capable of converting PDF into other formats."
 msgstr ""
 
-#: gnu/packages/pdf.scm:565
+#: gnu/packages/pdf.scm:614
 msgid "Notetaking using a stylus"
 msgstr ""
 
-#: gnu/packages/pdf.scm:567
+#: gnu/packages/pdf.scm:616
 msgid ""
 "Xournal is an application for notetaking, sketching, keeping a journal\n"
 "using a stylus."
 msgstr ""
 
+#: gnu/packages/pdf.scm:634
+msgid "Python library for generating PDFs and graphics"
+msgstr "Pythonbibliotek til at oprette PDF-filer og grafik"
+
+#: gnu/packages/pdf.scm:635
+msgid ""
+"This is the ReportLab PDF Toolkit.  It allows rapid creation\n"
+"of rich PDF documents, and also creation of charts in a variety of bitmap and\n"
+"vector formats."
+msgstr ""
+
+#: gnu/packages/pdf.scm:688
+msgid "PDF presentation tool with visual effects"
+msgstr "PDF-præsentationsværktøj med visuelle effekter"
+
+#: gnu/packages/pdf.scm:690
+msgid ""
+"Impressive is a tool to display PDF files that provides visual effects\n"
+"such as smooth alpha-blended slide transitions.  It provides additional tools\n"
+"such as zooming, highlighting an area of the screen, and a tool to navigate\n"
+"the PDF pages."
+msgstr ""
+
+#: gnu/packages/pdf.scm:737
+msgid "Framebuffer and drm-based image viewer"
+msgstr "Framebuffer og drm-baseret billedfremviser"
+
+#: gnu/packages/pdf.scm:739
+msgid ""
+"fbida contains a few applications for viewing and editing images on\n"
+"the framebuffer."
+msgstr ""
+
+#: gnu/packages/pdf.scm:764
+msgid "PDF to SVG converter"
+msgstr "PDF- til SVG-konverteringsprogram"
+
+#: gnu/packages/pdf.scm:765
+msgid ""
+"@command{pdf2svg} is a simple command-line PDF to SVG\n"
+"converter using the Poppler and Cairo libraries."
+msgstr ""
+
+#: gnu/packages/pdf.scm:796 gnu/packages/pdf.scm:833
+msgid "Pure Python PDF toolkit"
+msgstr "Pure Python PDF-værktøjssæt"
+
+#: gnu/packages/pdf.scm:797
+msgid ""
+"PyPDF2 is a pure Python PDF library capable of:\n"
+"\n"
+"@enumerate\n"
+"@item extracting document information (title, author, …)\n"
+"@item splitting documents page by page\n"
+"@item merging documents page by page\n"
+"@item cropping pages\n"
+"@item merging multiple pages into a single page\n"
+"@item encrypting and decrypting PDF files\n"
+"@end enumerate\n"
+"\n"
+"By being pure Python, it should run on any Python platform without any\n"
+"dependencies on external libraries.  It can also work entirely on\n"
+"@code{StringIO} objects rather than file streams, allowing for PDF\n"
+"manipulation in memory.  It is therefore a useful tool for websites that\n"
+"manage or manipulate PDFs."
+msgstr ""
+
+#: gnu/packages/pdf.scm:834
+msgid ""
+"PyPDF2 is a pure Python PDF toolkit.\n"
+"\n"
+"Note: This module isn't maintained anymore.  For new projects please use\n"
+"python-pypdf2 instead."
+msgstr ""
+
+#: gnu/packages/pdf.scm:858
+msgid "Scale and tile PDF images/pages to print on multiple pages"
+msgstr ""
+
+#: gnu/packages/pdf.scm:859
+msgid ""
+"@command{pdfposter} can be used to create a large poster by\n"
+"building it from multple pages and/or printing it on large media.  It expects\n"
+"as input a PDF file, normally printing on a single page.  The output is again\n"
+"a PDF file, maybe containing multiple pages together building the poster.  The\n"
+"input page will be scaled to obtain the desired size.\n"
+"\n"
+"This is much like @command{poster} does for Postscript files, but working with\n"
+"PDF.  Since sometimes @command{poster} does not like your files converted from\n"
+"PDF.  Indeed @command{pdfposter} was inspired by @command{poster}."
+msgstr ""
+
 #: gnu/packages/pem.scm:41
 msgid "Personal expenses manager"
 msgstr ""
@@ -6598,31 +7721,31 @@ msgid ""
 "feature."
 msgstr ""
 
-#: gnu/packages/perl.scm:116
+#: gnu/packages/perl.scm:138
 msgid "Implementation of the Perl programming language"
 msgstr ""
 
-#: gnu/packages/perl.scm:118
+#: gnu/packages/perl.scm:140
 msgid ""
 "Perl 5 is a highly capable, feature-rich programming language with over\n"
 "24 years of development."
 msgstr ""
 
-#: gnu/packages/perl.scm:137
+#: gnu/packages/perl.scm:159
 msgid "Module for merging hierarchies using the C3 algorithm"
 msgstr ""
 
-#: gnu/packages/perl.scm:138
+#: gnu/packages/perl.scm:160
 msgid ""
 "This module implements the C3 algorithm, which aims to\n"
 "provide a sane method resolution order under multiple inheritance."
 msgstr ""
 
-#: gnu/packages/perl.scm:156
+#: gnu/packages/perl.scm:178
 msgid "Compute differences between two files or lists"
 msgstr ""
 
-#: gnu/packages/perl.scm:157
+#: gnu/packages/perl.scm:179
 msgid ""
 "This is a module for computing the difference between two\n"
 "files, two strings, or any other two lists of things.  It uses an intelligent\n"
@@ -6631,11 +7754,11 @@ msgid ""
 "differences."
 msgstr ""
 
-#: gnu/packages/perl.scm:179
+#: gnu/packages/perl.scm:201
 msgid "Use shorter versions of class names"
 msgstr ""
 
-#: gnu/packages/perl.scm:180
+#: gnu/packages/perl.scm:202
 msgid ""
 "The alias module loads the class you specify and exports\n"
 "into your namespace a subroutine that returns the class name.  You can\n"
@@ -6643,31 +7766,59 @@ msgid ""
 "implicitly."
 msgstr ""
 
-#: gnu/packages/perl.scm:202
+#: gnu/packages/perl.scm:224
 msgid "Configuration files and command line parsing"
 msgstr ""
 
-#: gnu/packages/perl.scm:203
+#: gnu/packages/perl.scm:225
 msgid ""
 "AppConfig is a bundle of Perl5 modules for reading\n"
 "configuration files and parsing command line arguments."
 msgstr ""
 
-#: gnu/packages/perl.scm:221
+#: gnu/packages/perl.scm:243
 msgid "Perl API to zip files"
 msgstr ""
 
-#: gnu/packages/perl.scm:222 gnu/packages/zip.scm:170
+#: gnu/packages/perl.scm:244 gnu/packages/zip.scm:171
 msgid ""
 "The Archive::Zip module allows a Perl program to create,\n"
 "manipulate, read, and write Zip archive files."
 msgstr ""
 
-#: gnu/packages/perl.scm:241 gnu/packages/perl.scm:4312
+#: gnu/packages/perl.scm:265
+msgid "Small utils for array manipulation"
+msgstr ""
+
+#: gnu/packages/perl.scm:266
+msgid ""
+"@code{Array::Utils} is a small pure-perl module containing\n"
+"list manipulation routines."
+msgstr ""
+
+#: gnu/packages/perl.scm:284
+msgid "Lexically disable autovivification"
+msgstr ""
+
+#: gnu/packages/perl.scm:285
+msgid ""
+"When an undefined variable is dereferenced, it gets silently\n"
+"upgraded to an array or hash reference (depending of the type of the\n"
+"dereferencing).  This behaviour is called autovivification and usually does\n"
+"what you mean but it may be unnatural or surprising because your variables get\n"
+"populated behind your back.  This is especially true when several levels of\n"
+"dereferencing are involved, in which case all levels are vivified up to the\n"
+"last, or when it happens in intuitively read-only constructs like\n"
+"@code{exists}.  The pragma provided by this package lets you disable\n"
+"autovivification for some constructs and optionally throws a warning or an\n"
+"error when it would have happened."
+msgstr ""
+
+#: gnu/packages/perl.scm:311 gnu/packages/perl.scm:5077
 msgid "Establish an ISA relationship with base classes at compile time"
 msgstr ""
 
-#: gnu/packages/perl.scm:242
+#: gnu/packages/perl.scm:312
 msgid ""
 "Allows you to both load one or more modules, while setting\n"
 "up inheritance from those modules at the same time.  Unless you are using the\n"
@@ -6675,21 +7826,21 @@ msgid ""
 "parent."
 msgstr ""
 
-#: gnu/packages/perl.scm:267
+#: gnu/packages/perl.scm:337
 msgid "Execute code after a scope finished compilation"
 msgstr ""
 
-#: gnu/packages/perl.scm:268
+#: gnu/packages/perl.scm:338
 msgid ""
 "This module allows you to execute code when perl finished\n"
 "compiling the surrounding scope."
 msgstr ""
 
-#: gnu/packages/perl.scm:286
+#: gnu/packages/perl.scm:356
 msgid "Benchmarking with statistical confidence"
 msgstr ""
 
-#: gnu/packages/perl.scm:288
+#: gnu/packages/perl.scm:358
 msgid ""
 "The Benchmark::Timer class allows you to time portions of code\n"
 "conveniently, as well as benchmark code by allowing timings of repeated\n"
@@ -6698,11 +7849,11 @@ msgid ""
 "but don't want to go all out and profile your code."
 msgstr ""
 
-#: gnu/packages/perl.scm:313
+#: gnu/packages/perl.scm:383
 msgid "Bit vector library"
 msgstr ""
 
-#: gnu/packages/perl.scm:314
+#: gnu/packages/perl.scm:384
 msgid ""
 "Bit::Vector is an efficient C library which allows you to\n"
 "handle bit vectors, sets (of integers), \"big integer arithmetic\" and boolean\n"
@@ -6712,21 +7863,62 @@ msgid ""
 "library can nevertheless be used stand-alone, without Perl."
 msgstr ""
 
-#: gnu/packages/perl.scm:336
+#: gnu/packages/perl.scm:406
 msgid "Boolean support for Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:337
+#: gnu/packages/perl.scm:407
 msgid ""
 "This module provides basic Boolean support, by defining two\n"
 "special objects: true and false."
 msgstr ""
 
-#: gnu/packages/perl.scm:358
+#: gnu/packages/perl.scm:425
+msgid "Data files for Business::ISBN"
+msgstr ""
+
+#: gnu/packages/perl.scm:426
+msgid ""
+"This package provides a data pack for @code{Business::ISBN}.\n"
+"These data are generated from the RangeMessage.xml file provided by the ISBN\n"
+"Agency."
+msgstr ""
+
+#: gnu/packages/perl.scm:448
+msgid "Work with International Standard Book Numbers"
+msgstr ""
+
+#: gnu/packages/perl.scm:449
+msgid ""
+"This modules provides tools to deal with International\n"
+"Standard Book Numbers, including ISBN-10 and ISBN-13."
+msgstr ""
+
+#: gnu/packages/perl.scm:467
+msgid "Work with International Standard Serial Numbers"
+msgstr ""
+
+#: gnu/packages/perl.scm:468
+msgid ""
+"This modules provides tools to deal with International\n"
+"Standard Serial Numbers."
+msgstr ""
+
+#: gnu/packages/perl.scm:488
+msgid "Work with International Standard Music Numbers"
+msgstr ""
+
+#: gnu/packages/perl.scm:489
+msgid ""
+"This modules provides tools to deal with International\n"
+"Standard Music Numbers."
+msgstr ""
+
+#: gnu/packages/perl.scm:510
 msgid "Cache interface for Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:359
+#: gnu/packages/perl.scm:511
 msgid ""
 "The Cache modules are designed to assist a developer in\n"
 "persisting data for a specified period of time.  Often these modules are used\n"
@@ -6734,14 +7926,14 @@ msgid ""
 "expensive calls to remote machines or databases.  People have also been known\n"
 "to use Cache::Cache for its straightforward interface in sharing data between\n"
 "runs of an application or invocations of a CGI-style script or simply as an\n"
-"easy to use abstraction of the filesystem or shared memory."
+"easy to use abstraction of the file system or shared memory."
 msgstr ""
 
-#: gnu/packages/perl.scm:382
+#: gnu/packages/perl.scm:534
 msgid "Shared memory interprocess cache via mmap"
 msgstr ""
 
-#: gnu/packages/perl.scm:383
+#: gnu/packages/perl.scm:535
 msgid ""
 "A shared memory cache through an mmap'ed file.  It's core is\n"
 "written in C for performance.  It uses fcntl locking to ensure multiple\n"
@@ -6749,11 +7941,11 @@ msgid ""
 "algorithm to keep the most used entries in the cache."
 msgstr ""
 
-#: gnu/packages/perl.scm:404
+#: gnu/packages/perl.scm:556
 msgid "Capture STDOUT and STDERR from Perl, XS or external programs"
 msgstr ""
 
-#: gnu/packages/perl.scm:406
+#: gnu/packages/perl.scm:558
 msgid ""
 "Capture::Tiny provides a simple, portable way to capture almost anything\n"
 "sent to STDOUT or STDERR, regardless of whether it comes from Perl, from XS\n"
@@ -6761,31 +7953,31 @@ msgid ""
 "is captured while being passed through to the original file handles."
 msgstr ""
 
-#: gnu/packages/perl.scm:426
+#: gnu/packages/perl.scm:578
 msgid "Executable comments for Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:427
+#: gnu/packages/perl.scm:579
 msgid ""
 "Carp::Assert is intended for a purpose like the ANSI C\n"
 "library assert.h."
 msgstr ""
 
-#: gnu/packages/perl.scm:449
+#: gnu/packages/perl.scm:601
 msgid "Convenience wrappers around Carp::Assert"
 msgstr ""
 
-#: gnu/packages/perl.scm:450
+#: gnu/packages/perl.scm:602
 msgid ""
 "Carp::Assert::More is a set of handy assertion functions for\n"
 "Perl."
 msgstr ""
 
-#: gnu/packages/perl.scm:470
+#: gnu/packages/perl.scm:622
 msgid "Report errors from a \"clan\" of modules"
 msgstr ""
 
-#: gnu/packages/perl.scm:471
+#: gnu/packages/perl.scm:623
 msgid ""
 "This module allows errors from a clan (or family) of modules\n"
 "to appear to originate from the caller of the clan.  This is necessary in\n"
@@ -6793,21 +7985,21 @@ msgid ""
 "the Carp.pm module doesn't help."
 msgstr ""
 
-#: gnu/packages/perl.scm:495
+#: gnu/packages/perl.scm:647
 msgid "Automated accessor generation"
 msgstr ""
 
-#: gnu/packages/perl.scm:496
+#: gnu/packages/perl.scm:648
 msgid ""
 "This module automagically generates accessors/mutators for\n"
 "your class."
 msgstr ""
 
-#: gnu/packages/perl.scm:518
+#: gnu/packages/perl.scm:670
 msgid "Faster, but less expandable, chained accessors"
 msgstr ""
 
-#: gnu/packages/perl.scm:519
+#: gnu/packages/perl.scm:671
 msgid ""
 "A chained accessor is one that always returns the object\n"
 "when called with parameters (to set), and the value of the field when called\n"
@@ -6815,52 +8007,52 @@ msgid ""
 "the same mk_accessors interface."
 msgstr ""
 
-#: gnu/packages/perl.scm:545
+#: gnu/packages/perl.scm:697
 msgid "Build groups of accessors"
 msgstr ""
 
-#: gnu/packages/perl.scm:546
+#: gnu/packages/perl.scm:698
 msgid ""
 "This class lets you build groups of accessors that will call\n"
 "different getters and setters."
 msgstr ""
 
-#: gnu/packages/perl.scm:566
+#: gnu/packages/perl.scm:718
 msgid "Pragma to use the C3 method resolution order algorithm"
 msgstr ""
 
-#: gnu/packages/perl.scm:567
+#: gnu/packages/perl.scm:719
 msgid ""
 "This is pragma to change Perl 5's standard method resolution\n"
 "order from depth-first left-to-right (a.k.a - pre-order) to the more\n"
 "sophisticated C3 method resolution order."
 msgstr ""
 
-#: gnu/packages/perl.scm:591
+#: gnu/packages/perl.scm:743
 msgid "Drop-in replacement for NEXT"
 msgstr ""
 
-#: gnu/packages/perl.scm:592
+#: gnu/packages/perl.scm:744
 msgid ""
 "This module is intended as a drop-in replacement for NEXT,\n"
 "supporting the same interface, but using Class::C3 to do the hard work."
 msgstr ""
 
-#: gnu/packages/perl.scm:616
+#: gnu/packages/perl.scm:768
 msgid "Load mix-ins or components to your C3-based class"
 msgstr ""
 
-#: gnu/packages/perl.scm:617
+#: gnu/packages/perl.scm:769
 msgid ""
 "This module will inject base classes to your module using\n"
 "the Class::C3 method resolution order."
 msgstr ""
 
-#: gnu/packages/perl.scm:635
+#: gnu/packages/perl.scm:787
 msgid "Inheritable, overridable class data"
 msgstr ""
 
-#: gnu/packages/perl.scm:636
+#: gnu/packages/perl.scm:788
 msgid ""
 "Class::Data::Inheritable is for creating accessor/mutators\n"
 "to class data.  That is, if you want to store something about your class as a\n"
@@ -6868,70 +8060,82 @@ msgid ""
 "subclasses and can be overridden."
 msgstr ""
 
-#: gnu/packages/perl.scm:657
+#: gnu/packages/perl.scm:809
 msgid "Class for easy date and time manipulation"
 msgstr ""
 
-#: gnu/packages/perl.scm:658
+#: gnu/packages/perl.scm:810
 msgid ""
 "This module provides a general-purpose date and datetime\n"
 "type for perl."
 msgstr ""
 
-#: gnu/packages/perl.scm:677
+#: gnu/packages/perl.scm:827
+msgid "Base class for error handling"
+msgstr ""
+
+#: gnu/packages/perl.scm:829
+msgid ""
+"@code{Class::ErrorHandler} provides an error-handling mechanism that is generic\n"
+"enough to be used as the base class for a variety of OO classes.  Subclasses inherit\n"
+"its two error-handling methods, error and errstr, to communicate error messages back\n"
+"to the calling program."
+msgstr ""
+
+#: gnu/packages/perl.scm:850
 msgid "Utility methods for factory classes"
 msgstr ""
 
-#: gnu/packages/perl.scm:678
+#: gnu/packages/perl.scm:851
 msgid "This module exports methods useful for factory classes."
 msgstr ""
 
-#: gnu/packages/perl.scm:695
+#: gnu/packages/perl.scm:868
 msgid "Get information about a class and its structure"
 msgstr ""
 
-#: gnu/packages/perl.scm:696
+#: gnu/packages/perl.scm:869
 msgid ""
 "Class::Inspector allows you to get information about a\n"
 "loaded class."
 msgstr ""
 
-#: gnu/packages/perl.scm:724
+#: gnu/packages/perl.scm:897
 msgid "Working (require \"Class::Name\") and more"
 msgstr ""
 
-#: gnu/packages/perl.scm:725
+#: gnu/packages/perl.scm:898
 msgid ""
 "\"require EXPR\" only accepts Class/Name.pm style module\n"
 "names, not Class::Name.  For that, this module provides \"load_class\n"
 "'Class::Name'\"."
 msgstr ""
 
-#: gnu/packages/perl.scm:748
+#: gnu/packages/perl.scm:921
 msgid "XS implementation of parts of Class::Load"
 msgstr ""
 
-#: gnu/packages/perl.scm:749
+#: gnu/packages/perl.scm:922
 msgid ""
 "This module provides an XS implementation for portions of\n"
 "Class::Load."
 msgstr ""
 
-#: gnu/packages/perl.scm:768
+#: gnu/packages/perl.scm:941
 msgid "Create generic methods for OO Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:769
+#: gnu/packages/perl.scm:942
 msgid ""
 "This module solves the problem of having to continually\n"
 "write accessor methods for your objects that perform standard tasks."
 msgstr ""
 
-#: gnu/packages/perl.scm:790
+#: gnu/packages/perl.scm:963
 msgid "Moose-like method modifiers"
 msgstr ""
 
-#: gnu/packages/perl.scm:791
+#: gnu/packages/perl.scm:964
 msgid ""
 "Class::Method::Modifiers provides three modifiers: 'before',\n"
 "'around', and 'after'.  'before' and 'after' are run just before and after the\n"
@@ -6940,42 +8144,42 @@ msgid ""
 "original method."
 msgstr ""
 
-#: gnu/packages/perl.scm:812
+#: gnu/packages/perl.scm:985
 msgid "Implementation of a singleton class for Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:813
+#: gnu/packages/perl.scm:986
 msgid ""
 "This module implements a Singleton class from which other\n"
 "classes can be derived.  By itself, the Class::Singleton module does very\n"
 "little other than manage the instantiation of a single object."
 msgstr ""
 
-#: gnu/packages/perl.scm:832
+#: gnu/packages/perl.scm:1005
 msgid "Minimalist class construction"
 msgstr ""
 
-#: gnu/packages/perl.scm:833
+#: gnu/packages/perl.scm:1006
 msgid ""
 "This module offers a minimalist class construction kit.  It\n"
 "uses no non-core modules for any recent Perl."
 msgstr ""
 
-#: gnu/packages/perl.scm:853
+#: gnu/packages/perl.scm:1026
 msgid "Unload a class"
 msgstr ""
 
-#: gnu/packages/perl.scm:854
+#: gnu/packages/perl.scm:1027
 msgid ""
 "Class:Unload unloads a given class by clearing out its\n"
 "symbol table and removing it from %INC."
 msgstr ""
 
-#: gnu/packages/perl.scm:872
+#: gnu/packages/perl.scm:1045
 msgid "Generate fast XS accessors without runtime compilation"
 msgstr ""
 
-#: gnu/packages/perl.scm:873
+#: gnu/packages/perl.scm:1046
 msgid ""
 "Class::XSAccessor implements fast read, write, and\n"
 "read/write accessors in XS.  Additionally, it can provide predicates such as\n"
@@ -6985,53 +8189,53 @@ msgid ""
 "arrays for their internal representation."
 msgstr ""
 
-#: gnu/packages/perl.scm:893
+#: gnu/packages/perl.scm:1066
 msgid "Recursively copy Perl datatypes"
 msgstr ""
 
-#: gnu/packages/perl.scm:895
+#: gnu/packages/perl.scm:1068
 msgid ""
 "This module provides a clone() method which makes recursive copies of\n"
 "nested hash, array, scalar and reference types, including tied variables and\n"
 "objects."
 msgstr ""
 
-#: gnu/packages/perl.scm:916
+#: gnu/packages/perl.scm:1089
 msgid "Sane defaults for Perl programs"
 msgstr ""
 
-#: gnu/packages/perl.scm:917
+#: gnu/packages/perl.scm:1090
 msgid ""
 "This module implements some sane defaults for Perl programs,\n"
 "as defined by two typical specimens of Perl coders."
 msgstr ""
 
-#: gnu/packages/perl.scm:937
+#: gnu/packages/perl.scm:1110
 msgid "Load configuration from different file formats"
 msgstr ""
 
-#: gnu/packages/perl.scm:938
+#: gnu/packages/perl.scm:1111
 msgid ""
 "Config::Any provides a facility for Perl applications and\n"
 "libraries to load configuration data from multiple different file formats.  It\n"
 "supports XML, YAML, JSON, Apache-style configuration, and Perl code."
 msgstr ""
 
-#: gnu/packages/perl.scm:959
+#: gnu/packages/perl.scm:1132
 msgid "Module to implement some AutoConf macros in Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:960
+#: gnu/packages/perl.scm:1133
 msgid ""
 "Config::AutoConf is intended to provide the same\n"
 "opportunities to Perl developers as GNU Autoconf does for Shell developers."
 msgstr ""
 
-#: gnu/packages/perl.scm:978
+#: gnu/packages/perl.scm:1151
 msgid "Generic Config Module"
 msgstr ""
 
-#: gnu/packages/perl.scm:979
+#: gnu/packages/perl.scm:1152
 msgid ""
 "This module opens a config file and parses its contents for\n"
 "you.  The format of config files supported by Config::General is inspired by\n"
@@ -7042,52 +8246,52 @@ msgid ""
 "options."
 msgstr ""
 
-#: gnu/packages/perl.scm:1006
+#: gnu/packages/perl.scm:1179
 msgid "Simple .ini-file format reader and writer"
 msgstr ""
 
-#: gnu/packages/perl.scm:1007
+#: gnu/packages/perl.scm:1180
 msgid ""
 "@code{Config::INI} is a module that facilates the reading\n"
 "and writing of @code{.ini}-style configuration files."
 msgstr ""
 
-#: gnu/packages/perl.scm:1028
+#: gnu/packages/perl.scm:1201
 msgid "Preserve context during subroutine call"
 msgstr ""
 
-#: gnu/packages/perl.scm:1029
+#: gnu/packages/perl.scm:1202
 msgid ""
 "This module runs code after a subroutine call, preserving\n"
 "the context the subroutine would have seen if it were the last statement in\n"
 "the caller."
 msgstr ""
 
-#: gnu/packages/perl.scm:1050
+#: gnu/packages/perl.scm:1223
 msgid "Verify requirements in a CPAN::Meta object"
 msgstr ""
 
-#: gnu/packages/perl.scm:1051
+#: gnu/packages/perl.scm:1224
 msgid ""
 "This module verifies if requirements described in a\n"
 "CPAN::Meta object are present."
 msgstr ""
 
-#: gnu/packages/perl.scm:1071
+#: gnu/packages/perl.scm:1244
 msgid "JSON::XS for Cpanel"
 msgstr ""
 
-#: gnu/packages/perl.scm:1072 gnu/packages/perl.scm:2938
+#: gnu/packages/perl.scm:1245 gnu/packages/perl.scm:3537
 msgid ""
 "This module converts Perl data structures to JSON and vice\n"
 "versa."
 msgstr ""
 
-#: gnu/packages/perl.scm:1090
+#: gnu/packages/perl.scm:1263
 msgid "Random password generator"
 msgstr ""
 
-#: gnu/packages/perl.scm:1091
+#: gnu/packages/perl.scm:1264
 msgid ""
 "Crypt::RandPasswd provides three functions that can be used\n"
 "to generate random passwords, constructed from words, letters, or characters.\n"
@@ -7098,51 +8302,72 @@ msgid ""
 "Password Generator\"."
 msgstr ""
 
-#: gnu/packages/perl.scm:1134
+#: gnu/packages/perl.scm:1307
 msgid "Library for genomic analysis"
 msgstr ""
 
-#: gnu/packages/perl.scm:1135
+#: gnu/packages/perl.scm:1308
 msgid ""
 "Chaolin Zhang's Perl Library (czplib) contains assorted\n"
 "functions and data structures for processing and analysing genomic and\n"
 "bioinformatics data."
 msgstr ""
 
-#: gnu/packages/perl.scm:1154
+#: gnu/packages/perl.scm:1329
+msgid "Compare Perl data structures"
+msgstr "Sammenlign Perldatastrukturer"
+
+#: gnu/packages/perl.scm:1330
+msgid ""
+"This module compares arbitrary data structures to see if\n"
+"they are copies of each other."
+msgstr ""
+
+#: gnu/packages/perl.scm:1348
+msgid "Perl extension for generating unique identifiers"
+msgstr ""
+
+#: gnu/packages/perl.scm:1349
+msgid ""
+"@code{Data::Uniqid} provides three simple routines for\n"
+"generating unique ids.  These ids are coded with a Base62 systen to make them\n"
+"short and handy (e.g. to use it as part of a URL)."
+msgstr ""
+
+#: gnu/packages/perl.scm:1368
 msgid "Pretty printing of data structures"
 msgstr ""
 
-#: gnu/packages/perl.scm:1155
+#: gnu/packages/perl.scm:1369
 msgid ""
 "This module provide functions that takes a list of values as\n"
 "their argument and produces a string as its result.  The string contains Perl\n"
 "code that, when \"eval\"ed, produces a deep copy of the original arguments."
 msgstr ""
 
-#: gnu/packages/perl.scm:1174
+#: gnu/packages/perl.scm:1388
 msgid "Concise data dumper"
 msgstr ""
 
-#: gnu/packages/perl.scm:1175
+#: gnu/packages/perl.scm:1389
 msgid ""
 "Data::Dumper::Concise provides a dumper with Less\n"
 "indentation and newlines plus sub deparsing."
 msgstr ""
 
-#: gnu/packages/perl.scm:1197
+#: gnu/packages/perl.scm:1411
 msgid "Parse and validate simple name/value option pairs"
 msgstr ""
 
-#: gnu/packages/perl.scm:1199
+#: gnu/packages/perl.scm:1413
 msgid "Data::OptList provides a simple syntax for name/value option pairs."
 msgstr ""
 
-#: gnu/packages/perl.scm:1221
+#: gnu/packages/perl.scm:1435
 msgid "Help when paging through sets of results"
 msgstr ""
 
-#: gnu/packages/perl.scm:1222
+#: gnu/packages/perl.scm:1436
 msgid ""
 "When searching through large amounts of data, it is often\n"
 "the case that a result set is returned that is larger than we want to display\n"
@@ -7150,11 +8375,11 @@ msgid ""
 "The maths behind this is unfortunately fiddly, hence this module."
 msgstr ""
 
-#: gnu/packages/perl.scm:1244
+#: gnu/packages/perl.scm:1458
 msgid "Structured tags datastructures"
 msgstr ""
 
-#: gnu/packages/perl.scm:1246
+#: gnu/packages/perl.scm:1460
 msgid ""
 "This module is for manipulating data as hierarchical tag/value\n"
 "pairs (Structured TAGs or Simple Tree AGgregates).  These datastructures can\n"
@@ -7162,11 +8387,11 @@ msgid ""
 "Perl."
 msgstr ""
 
-#: gnu/packages/perl.scm:1273
+#: gnu/packages/perl.scm:1487
 msgid "N at a time iteration API"
 msgstr ""
 
-#: gnu/packages/perl.scm:1274
+#: gnu/packages/perl.scm:1488
 msgid ""
 "This module tries to find middle ground between one at a\n"
 "time and all at once processing of data sets.  The purpose of this module is\n"
@@ -7175,21 +8400,21 @@ msgid ""
 "necessary later on."
 msgstr ""
 
-#: gnu/packages/perl.scm:1299
+#: gnu/packages/perl.scm:1513
 msgid "Dynamic generation of nested combinations of variants"
 msgstr ""
 
-#: gnu/packages/perl.scm:1300
+#: gnu/packages/perl.scm:1514
 msgid ""
 "Data::Tumbler - Dynamic generation of nested combinations of\n"
 "variants."
 msgstr ""
 
-#: gnu/packages/perl.scm:1326
+#: gnu/packages/perl.scm:1540
 msgid "Visitor style traversal of Perl data structures"
 msgstr ""
 
-#: gnu/packages/perl.scm:1327
+#: gnu/packages/perl.scm:1541
 msgid ""
 "This module is a simple visitor implementation for Perl\n"
 "values.  It has a main dispatcher method, visit, which takes a single perl\n"
@@ -7199,11 +8424,11 @@ msgid ""
 "structures, and all ref types (hashes, arrays, scalars, code, globs)."
 msgstr ""
 
-#: gnu/packages/perl.scm:1352
+#: gnu/packages/perl.scm:1566
 msgid "Gregorian calendar date calculations"
 msgstr ""
 
-#: gnu/packages/perl.scm:1353
+#: gnu/packages/perl.scm:1567
 msgid ""
 "This package consists of a Perl module for date calculations\n"
 "based on the Gregorian calendar, thereby complying with all relevant norms and\n"
@@ -7211,43 +8436,67 @@ msgid ""
 "applicable)."
 msgstr ""
 
-#: gnu/packages/perl.scm:1377
+#: gnu/packages/perl.scm:1591
 msgid "XS wrapper for Date::Calc"
 msgstr ""
 
-#: gnu/packages/perl.scm:1378
+#: gnu/packages/perl.scm:1592
 msgid ""
 "Date::Calc::XS is an XS wrapper and C library plug-in for\n"
 "Date::Calc."
 msgstr ""
 
-#: gnu/packages/perl.scm:1402
+#: gnu/packages/perl.scm:1616
 msgid "Date manipulation routines"
 msgstr ""
 
-#: gnu/packages/perl.scm:1403
+#: gnu/packages/perl.scm:1617
 msgid ""
 "Date::Manip is a series of modules for common date/time\n"
 "operations, such as comparing two times, determining a date a given amount of\n"
 "time from another, or parsing international times."
 msgstr ""
 
-#: gnu/packages/perl.scm:1431
+#: gnu/packages/perl.scm:1636
+msgid "Simple date handling"
+msgstr ""
+
+#: gnu/packages/perl.scm:1637
+msgid ""
+"Dates are complex enough without times and timezones.  This\n"
+"module may be used to create simple date objects.  It handles validation,\n"
+"interval arithmetic, and day-of-week calculation.  It does not deal with\n"
+"hours, minutes, seconds, and time zones."
+msgstr ""
+
+#: gnu/packages/perl.scm:1667
 msgid "Date and time object for Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:1432
+#: gnu/packages/perl.scm:1668
 msgid ""
 "DateTime is a class for the representation of date/time\n"
 "combinations.  It represents the Gregorian calendar, extended backwards in\n"
 "time before its creation (in 1582)."
 msgstr ""
 
-#: gnu/packages/perl.scm:1457
+#: gnu/packages/perl.scm:1690
+msgid "Dates in the Julian calendar"
+msgstr ""
+
+#: gnu/packages/perl.scm:1691
+msgid ""
+"This package is a companion module to @code{DateTime.pm}.\n"
+"It implements the Julian calendar.  It supports everything that\n"
+"@code{DateTime.pm} supports and more: about one day per century more, to be\n"
+"precise."
+msgstr ""
+
+#: gnu/packages/perl.scm:1717
 msgid "DateTime set objects"
 msgstr ""
 
-#: gnu/packages/perl.scm:1458
+#: gnu/packages/perl.scm:1718
 msgid ""
 "The DateTime::Set module provides a date/time sets\n"
 "implementation.  It allows, for example, the generation of groups of dates,\n"
@@ -7255,21 +8504,21 @@ msgid ""
 "within a time range."
 msgstr ""
 
-#: gnu/packages/perl.scm:1481
+#: gnu/packages/perl.scm:1741
 msgid "DateTime rfc2445 recurrences"
 msgstr ""
 
-#: gnu/packages/perl.scm:1482
+#: gnu/packages/perl.scm:1742
 msgid ""
 "This module provides convenience methods that let you easily\n"
 "create DateTime::Set objects for RFC 2445 style recurrences."
 msgstr ""
 
-#: gnu/packages/perl.scm:1503
+#: gnu/packages/perl.scm:1763
 msgid "DateTime::Set extension for basic recurrences"
 msgstr ""
 
-#: gnu/packages/perl.scm:1504
+#: gnu/packages/perl.scm:1764
 msgid ""
 "This module provides convenience methods that let you easily\n"
 "create DateTime::Set objects for various recurrences, such as \"once a month\"\n"
@@ -7277,11 +8526,11 @@ msgid ""
 "\"every Monday, Wednesday and Thursday at 10:00 AM and 2:00 PM\"."
 msgstr ""
 
-#: gnu/packages/perl.scm:1529
+#: gnu/packages/perl.scm:1789
 msgid "Create DateTime parser classes and objects"
 msgstr ""
 
-#: gnu/packages/perl.scm:1530
+#: gnu/packages/perl.scm:1790
 msgid ""
 "DateTime::Format::Builder creates DateTime parsers.  Many\n"
 "string formats of dates and times are simple and just require a basic regular\n"
@@ -7289,43 +8538,43 @@ msgid ""
 "to do this without writing reams of structural code."
 msgstr ""
 
-#: gnu/packages/perl.scm:1557
+#: gnu/packages/perl.scm:1817
 msgid "Parse data/time strings"
 msgstr ""
 
-#: gnu/packages/perl.scm:1558
+#: gnu/packages/perl.scm:1818
 msgid ""
 "DateTime::Format::Flexible attempts to take any string you\n"
 "give it and parse it into a DateTime object."
 msgstr ""
 
-#: gnu/packages/perl.scm:1584
+#: gnu/packages/perl.scm:1844
 msgid "Parse and format iCal datetime and duration strings"
 msgstr ""
 
-#: gnu/packages/perl.scm:1585
+#: gnu/packages/perl.scm:1845
 msgid ""
 "This module understands the ICal date/time and duration\n"
 "formats, as defined in RFC 2445.  It can be used to parse these formats in\n"
 "order to create the appropriate objects."
 msgstr ""
 
-#: gnu/packages/perl.scm:1617
+#: gnu/packages/perl.scm:1877
 msgid "Machine-readable date/time with natural parsing"
 msgstr ""
 
-#: gnu/packages/perl.scm:1618
+#: gnu/packages/perl.scm:1878
 msgid ""
 "DateTime::Format::Natural takes a string with a human\n"
 "readable date/time and creates a machine readable one by applying natural\n"
 "parsing logic."
 msgstr ""
 
-#: gnu/packages/perl.scm:1642
+#: gnu/packages/perl.scm:1902
 msgid "Parse and format strp and strf time patterns"
 msgstr ""
 
-#: gnu/packages/perl.scm:1643
+#: gnu/packages/perl.scm:1903
 msgid ""
 "This module implements most of `strptime(3)`, the POSIX\n"
 "function that is the reverse of `strftime(3)`, for `DateTime`.  While\n"
@@ -7333,21 +8582,21 @@ msgid ""
 "takes a string and a pattern and returns the `DateTime` object associated."
 msgstr ""
 
-#: gnu/packages/perl.scm:1668
+#: gnu/packages/perl.scm:1928
 msgid "Localization support for DateTime.pm"
 msgstr ""
 
-#: gnu/packages/perl.scm:1669
+#: gnu/packages/perl.scm:1929
 msgid ""
 "The DateTime::Locale modules provide localization data for\n"
 "the DateTime.pm class."
 msgstr ""
 
-#: gnu/packages/perl.scm:1696
+#: gnu/packages/perl.scm:1956
 msgid "Time zone object for Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:1697
+#: gnu/packages/perl.scm:1957
 msgid ""
 "This class is the base class for all time zone objects.  A\n"
 "time zone is represented internally as a set of observances, each of which\n"
@@ -7357,81 +8606,103 @@ msgid ""
 "DateTime::TimeZone methods."
 msgstr ""
 
-#: gnu/packages/perl.scm:1727
+#: gnu/packages/perl.scm:1987
 msgid "Parse date/time strings"
 msgstr ""
 
-#: gnu/packages/perl.scm:1728
+#: gnu/packages/perl.scm:1988
 msgid ""
 "DateTimeX::Easy uses a variety of DateTime::Format packages\n"
 "to create DateTime objects, with some custom tweaks to smooth out the rough\n"
 "edges (mainly concerning timezone detection and selection)."
 msgstr ""
 
-#: gnu/packages/perl.scm:1749
+#: gnu/packages/perl.scm:2009
+msgid "Convert between DateTime and RFC2822/822 formats"
+msgstr ""
+
+#: gnu/packages/perl.scm:2010
+msgid ""
+"RFCs 2822 and 822 specify date formats to be used by email.\n"
+"This module parses and emits such dates."
+msgstr ""
+
+#: gnu/packages/perl.scm:2032
+msgid "Parse and format W3CDTF datetime strings"
+msgstr ""
+
+#: gnu/packages/perl.scm:2034
+msgid ""
+"This module understands the W3CDTF date/time format, an ISO 8601 profile,\n"
+"defined at https://www.w3.org/TR/NOTE-datetime.  This format is the native date\n"
+"format of RSS 1.0.  It can be used to parse these formats in order to create\n"
+"the appropriate objects."
+msgstr ""
+
+#: gnu/packages/perl.scm:2056
 msgid "Meatier version of caller"
 msgstr ""
 
-#: gnu/packages/perl.scm:1750
+#: gnu/packages/perl.scm:2057
 msgid "Devel::Caller provides meatier version of caller."
 msgstr ""
 
-#: gnu/packages/perl.scm:1768
+#: gnu/packages/perl.scm:2075
 msgid "Check that a command is available"
 msgstr ""
 
-#: gnu/packages/perl.scm:1769
+#: gnu/packages/perl.scm:2076
 msgid ""
 "Devel::CheckBin is a perl module that checks whether a\n"
 "particular command is available."
 msgstr ""
 
-#: gnu/packages/perl.scm:1789
+#: gnu/packages/perl.scm:2096
 msgid "Provides equivalent of ${^GLOBAL_PHASE} eq 'DESTRUCT' for older perls"
 msgstr ""
 
-#: gnu/packages/perl.scm:1790
+#: gnu/packages/perl.scm:2097
 msgid ""
 "Devel::GlobalDestruction provides a function returning the\n"
 "equivalent of \"$@{^GLOBAL_PHASE@} eq 'DESTRUCT'\" for older perls."
 msgstr ""
 
-#: gnu/packages/perl.scm:1810
+#: gnu/packages/perl.scm:2117
 msgid "Alias lexical variables"
 msgstr ""
 
-#: gnu/packages/perl.scm:1811
+#: gnu/packages/perl.scm:2118
 msgid ""
 "Devel::LexAlias provides the ability to alias a lexical\n"
 "variable in a subroutines scope to one of your choosing."
 msgstr ""
 
-#: gnu/packages/perl.scm:1833
+#: gnu/packages/perl.scm:2140
 msgid "Introspect overloaded operators"
 msgstr ""
 
-#: gnu/packages/perl.scm:1834
+#: gnu/packages/perl.scm:2141
 msgid ""
 "Devel::OverloadInfo returns information about overloaded\n"
 "operators for a given class (or object), including where in the inheritance\n"
 "hierarchy the overloads are declared and where the code implementing it is."
 msgstr ""
 
-#: gnu/packages/perl.scm:1861
+#: gnu/packages/perl.scm:2168
 msgid "Partial dumping of data structures"
 msgstr ""
 
-#: gnu/packages/perl.scm:1862
+#: gnu/packages/perl.scm:2169
 msgid ""
 "This module is a data dumper optimized for logging of\n"
 "arbitrary parameters."
 msgstr ""
 
-#: gnu/packages/perl.scm:1880
+#: gnu/packages/perl.scm:2187
 msgid "Object representing a stack trace"
 msgstr ""
 
-#: gnu/packages/perl.scm:1881
+#: gnu/packages/perl.scm:2188
 msgid ""
 "The Devel::StackTrace module contains two classes,\n"
 "Devel::StackTrace and Devel::StackTrace::Frame.  These objects encapsulate the\n"
@@ -7439,11 +8710,11 @@ msgid ""
 "providing a simple interface to this data."
 msgstr ""
 
-#: gnu/packages/perl.scm:1903
+#: gnu/packages/perl.scm:2210
 msgid "Displays stack trace in HTML"
 msgstr ""
 
-#: gnu/packages/perl.scm:1904
+#: gnu/packages/perl.scm:2211
 msgid ""
 "Devel::StackTrace::AsHTML adds as_html method to\n"
 "Devel::StackTrace which displays the stack trace in beautiful HTML, with code\n"
@@ -7452,49 +8723,117 @@ msgid ""
 "each stack frame."
 msgstr ""
 
-#: gnu/packages/perl.scm:1925
+#: gnu/packages/perl.scm:2232
 msgid "Dump symbol names or the symbol table"
 msgstr ""
 
-#: gnu/packages/perl.scm:1926
+#: gnu/packages/perl.scm:2233
 msgid "Devel::Symdump provides access to the perl symbol table."
 msgstr ""
 
-#: gnu/packages/perl.scm:1943
+#: gnu/packages/perl.scm:2250
 msgid "Keyed-Hashing for Message Authentication"
 msgstr ""
 
-#: gnu/packages/perl.scm:1944
+#: gnu/packages/perl.scm:2251
 msgid ""
 "The Digest::HMAC module follows the common Digest::\n"
 "interface for the RFC 2104 HMAC mechanism."
 msgstr ""
 
-#: gnu/packages/perl.scm:1960
+#: gnu/packages/perl.scm:2276
+msgid "Perl interface to the MD-5 algorithm"
+msgstr "Perlgrænseflade til MD-5-algoritmen"
+
+#: gnu/packages/perl.scm:2278
+msgid ""
+"The @code{Digest::MD5} module allows you to use the MD5 Message Digest\n"
+"algorithm from within Perl programs.  The algorithm takes as\n"
+"input a message of arbitrary length and produces as output a\n"
+"128-bit \"fingerprint\" or \"message digest\" of the input."
+msgstr ""
+
+#: gnu/packages/perl.scm:2296
 msgid "Perl implementation of the SHA-1 message digest algorithm"
 msgstr ""
 
-#: gnu/packages/perl.scm:1962
+#: gnu/packages/perl.scm:2298
 msgid ""
 "This package provides 'Digest::SHA1', an implementation of the NIST\n"
 "SHA-1 message digest algorithm for use by Perl programs."
 msgstr ""
 
-#: gnu/packages/perl.scm:1984
+#: gnu/packages/perl.scm:2320
 msgid "Declare version conflicts for your dist"
 msgstr ""
 
-#: gnu/packages/perl.scm:1985
+#: gnu/packages/perl.scm:2321
 msgid ""
 "This module allows you to specify conflicting versions of\n"
 "modules separately and deal with them after the module is done installing."
 msgstr ""
 
-#: gnu/packages/perl.scm:2003
+#: gnu/packages/perl.scm:2341
+msgid "Detect the encoding of data"
+msgstr ""
+
+#: gnu/packages/perl.scm:2342
+msgid ""
+"This package provides a class @code{Encode::Detect} to detect\n"
+"the encoding of data."
+msgstr ""
+
+#: gnu/packages/perl.scm:2360
+msgid "ASCII mapping for eucJP encoding"
+msgstr "ASCII-oversættelse for eucJP-kodning"
+
+#: gnu/packages/perl.scm:2361
+msgid ""
+"This package provides an ASCII mapping for the eucJP\n"
+"encoding."
+msgstr ""
+"Denne pakke tilbyder en ASCII-oversættelse for eucJP-\n"
+"kodningen."
+
+#: gnu/packages/perl.scm:2379
+msgid "JIS X 0212 (aka JIS 2000) encodings"
+msgstr "JIS X 0212-kodninger (aka JIS 2000)"
+
+#: gnu/packages/perl.scm:2380
+msgid ""
+"This package provides encodings for JIS X 0212, which is\n"
+"also known as JIS 2000."
+msgstr ""
+
+#: gnu/packages/perl.scm:2398
+msgid "Additional Chinese encodings"
+msgstr "Yderligere kinesiske kodninger"
+
+#: gnu/packages/perl.scm:2399
+msgid ""
+"This Perl module provides Chinese encodings that are not\n"
+"part of Perl by default, including \"BIG5-1984\", \"BIG5-2003\", \"BIG5PLUS\",\n"
+"\"BIG5EXT\", \"CCCII\", \"EUC-TW\", \"CNS11643-*\", \"GB18030\", and\n"
+"\"UNISYS\"."
+msgstr ""
+
+#: gnu/packages/perl.scm:2421
+msgid "Advanced operations on path variables"
+msgstr ""
+
+#: gnu/packages/perl.scm:2422
+msgid ""
+"@code{Env::Path} presents an object-oriented interface to\n"
+"path variables, defined as that subclass of environment variables which name\n"
+"an ordered list of file system elements separated by a platform-standard\n"
+"separator."
+msgstr ""
+
+#: gnu/packages/perl.scm:2442
 msgid "OO-ish Error/Exception handling for Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:2004
+#: gnu/packages/perl.scm:2443
 msgid ""
 "The Error package provides two interfaces.  Firstly Error\n"
 "provides a procedural interface to exception handling.  Secondly Error is a\n"
@@ -7502,11 +8841,11 @@ msgid ""
 "catch, or can simply be recorded."
 msgstr ""
 
-#: gnu/packages/perl.scm:2029
+#: gnu/packages/perl.scm:2468
 msgid "Safely and cleanly create closures via string eval"
 msgstr ""
 
-#: gnu/packages/perl.scm:2030
+#: gnu/packages/perl.scm:2469
 msgid ""
 "String eval is often used for dynamic code generation.  For\n"
 "instance, Moose uses it heavily, to generate inlined versions of accessors and\n"
@@ -7520,32 +8859,32 @@ msgid ""
 "errors are rethrown automatically."
 msgstr ""
 
-#: gnu/packages/perl.scm:2059
+#: gnu/packages/perl.scm:2498
 msgid "Allows you to declare real exception classes in Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:2060
+#: gnu/packages/perl.scm:2499
 msgid ""
 "Exception::Class allows you to declare exception hierarchies\n"
 "in your modules in a \"Java-esque\" manner."
 msgstr ""
 
-#: gnu/packages/perl.scm:2076
+#: gnu/packages/perl.scm:2515
 msgid "Lightweight exporting of functions and variables"
 msgstr ""
 
-#: gnu/packages/perl.scm:2078
+#: gnu/packages/perl.scm:2517
 msgid ""
 "Exporter::Lite is an alternative to Exporter, intended to provide a\n"
 "lightweight subset of the most commonly-used functionality.  It supports\n"
 "import(), @@EXPORT and @@EXPORT_OK and not a whole lot else."
 msgstr ""
 
-#: gnu/packages/perl.scm:2098
+#: gnu/packages/perl.scm:2537
 msgid "Exporter with the features of Sub::Exporter but only core dependencies"
 msgstr ""
 
-#: gnu/packages/perl.scm:2099
+#: gnu/packages/perl.scm:2538
 msgid ""
 "Exporter::Tiny supports many of Sub::Exporter's\n"
 "external-facing features including renaming imported functions with the `-as`,\n"
@@ -7554,85 +8893,109 @@ msgid ""
 "only about 40% as many lines of code and with zero non-core dependencies."
 msgstr ""
 
-#: gnu/packages/perl.scm:2122
+#: gnu/packages/perl.scm:2561
 msgid "Build.PL install path logic made easy"
 msgstr ""
 
-#: gnu/packages/perl.scm:2123
+#: gnu/packages/perl.scm:2562
 msgid ""
 "This module tries to make install path resolution as easy as\n"
 "possible."
 msgstr ""
 
-#: gnu/packages/perl.scm:2141
+#: gnu/packages/perl.scm:2580
 msgid "Wrapper for perl's configuration"
 msgstr ""
 
-#: gnu/packages/perl.scm:2142
+#: gnu/packages/perl.scm:2581
 msgid ""
 "ExtUtils::Config is an abstraction around the %Config hash.\n"
 "By itself it is not a particularly interesting module by any measure, however\n"
 "it ties together a family of modern toolchain modules."
 msgstr ""
 
-#: gnu/packages/perl.scm:2161
+#: gnu/packages/perl.scm:2600
 msgid "Various portability utilities for module builders"
 msgstr ""
 
-#: gnu/packages/perl.scm:2162
+#: gnu/packages/perl.scm:2601
 msgid ""
 "This module provides various portable helper functions for\n"
 "module building modules."
 msgstr ""
 
-#: gnu/packages/perl.scm:2192
+#: gnu/packages/perl.scm:2621
+msgid "Tool to build C libraries"
+msgstr ""
+
+#: gnu/packages/perl.scm:2622
+msgid ""
+"Some Perl modules need to ship C libraries together with\n"
+"their Perl code.  Although there are mechanisms to compile and link (or glue)\n"
+"C code in your Perl programs, there isn't a clear method to compile standard,\n"
+"self-contained C libraries.  This module main goal is to help in that task."
+msgstr ""
+
+#: gnu/packages/perl.scm:2654
 msgid "Watch for changes to files"
 msgstr ""
 
-#: gnu/packages/perl.scm:2193
+#: gnu/packages/perl.scm:2655
 msgid ""
 "This module provides a class to monitor a directory for\n"
 "changes made to any file."
 msgstr ""
 
-#: gnu/packages/perl.scm:2211
+#: gnu/packages/perl.scm:2673
 msgid "Recursively copy files and directories"
 msgstr ""
 
-#: gnu/packages/perl.scm:2212
+#: gnu/packages/perl.scm:2674
 msgid ""
 "This module has 3 functions: one to copy files only, one to\n"
 "copy directories only, and one to do either depending on the argument's\n"
 "type."
 msgstr ""
 
-#: gnu/packages/perl.scm:2234
+#: gnu/packages/perl.scm:2696
 msgid "Alternative interface to File::Find"
 msgstr ""
 
-#: gnu/packages/perl.scm:2235
+#: gnu/packages/perl.scm:2697
 msgid ""
 "File::Find::Rule is a friendlier interface to File::Find.\n"
 "It allows you to build rules which specify the desired files and\n"
 "directories."
 msgstr ""
 
-#: gnu/packages/perl.scm:2258
+#: gnu/packages/perl.scm:2720
 msgid "Common rules for searching for Perl things"
 msgstr ""
 
-#: gnu/packages/perl.scm:2259
+#: gnu/packages/perl.scm:2721
 msgid ""
 "File::Find::Rule::Perl provides methods for finding various\n"
 "types Perl-related files, or replicating search queries run on a distribution\n"
 "in various parts of the CPAN ecosystem."
 msgstr ""
 
-#: gnu/packages/perl.scm:2282
+#: gnu/packages/perl.scm:2742
+msgid "Matches patterns in a series of files"
+msgstr ""
+
+#: gnu/packages/perl.scm:2743
+msgid ""
+"@code{File::Grep} provides similar functionality as perl's\n"
+"builtin @code{grep}, @code{map}, and @code{foreach} commands, but iterating\n"
+"over a passed filelist instead of arrays.  While trivial, this module can\n"
+"provide a quick dropin when such functionality is needed."
+msgstr ""
+
+#: gnu/packages/perl.scm:2767
 msgid "Find your home and other directories on any platform"
 msgstr ""
 
-#: gnu/packages/perl.scm:2283
+#: gnu/packages/perl.scm:2768
 msgid ""
 "File::HomeDir is a module for locating the directories that\n"
 "are \"owned\" by a user (typically your user) and to solve the various issues\n"
@@ -7640,24 +9003,35 @@ msgid ""
 "platforms."
 msgstr ""
 
-#: gnu/packages/perl.scm:2310
+#: gnu/packages/perl.scm:2790
+msgid "Create or remove directory trees"
+msgstr ""
+
+#: gnu/packages/perl.scm:2791
+msgid ""
+"This module provide a convenient way to create directories\n"
+"of arbitrary depth and to delete an entire directory subtree from the\n"
+"file system."
+msgstr ""
+
+#: gnu/packages/perl.scm:2817
 msgid ""
 "Perl extension for crawling directory trees and compiling\n"
 "lists of files"
 msgstr ""
 
-#: gnu/packages/perl.scm:2313
+#: gnu/packages/perl.scm:2820
 msgid ""
 "The File::List module crawls the directory tree starting at the\n"
 "provided base directory and can return files (and/or directories if desired)\n"
 "matching a regular expression."
 msgstr ""
 
-#: gnu/packages/perl.scm:2332
+#: gnu/packages/perl.scm:2839
 msgid "Remove files and directories in Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:2333
+#: gnu/packages/perl.scm:2840
 msgid ""
 "File::Remove::remove removes files and directories.  It acts\n"
 "like /bin/rm, for the most part.  Although \"unlink\" can be given a list of\n"
@@ -7665,11 +9039,11 @@ msgid ""
 "accepts wildcards, * and ?, as arguments for file names."
 msgstr ""
 
-#: gnu/packages/perl.scm:2357
+#: gnu/packages/perl.scm:2864
 msgid "Locate per-dist and per-module shared files"
 msgstr ""
 
-#: gnu/packages/perl.scm:2358
+#: gnu/packages/perl.scm:2865
 msgid ""
 "The intent of File::ShareDir is to provide a companion to\n"
 "Class::Inspector and File::HomeDir.  Quite often you want or need your Perl\n"
@@ -7679,73 +9053,101 @@ msgid ""
 "the installation."
 msgstr ""
 
-#: gnu/packages/perl.scm:2380
+#: gnu/packages/perl.scm:2887
 msgid "Install shared files"
 msgstr ""
 
-#: gnu/packages/perl.scm:2381
+#: gnu/packages/perl.scm:2888
 msgid ""
 "File::ShareDir::Install allows you to install read-only data\n"
 "files from a distribution.  It is a companion module to File::ShareDir, which\n"
 "allows you to locate these files after installation."
 msgstr ""
 
-#: gnu/packages/perl.scm:2400
+#: gnu/packages/perl.scm:2907
 msgid "Reading/Writing/Modifying of complete files"
 msgstr ""
 
-#: gnu/packages/perl.scm:2401
+#: gnu/packages/perl.scm:2908
 msgid ""
 "File::Slurp provides subroutines to read or write entire\n"
 "files with a simple call.  It also has a subroutine for reading the list of\n"
 "file names in a directory."
 msgstr ""
 
-#: gnu/packages/perl.scm:2419
+#: gnu/packages/perl.scm:2931
+msgid "Simple, sane and efficient module to slurp a file"
+msgstr ""
+
+#: gnu/packages/perl.scm:2932
+msgid ""
+"This module provides functions for fast and correct file\n"
+"slurping and spewing.  All functions are optionally exported."
+msgstr ""
+
+#: gnu/packages/perl.scm:2949
 msgid "Simple file reader and writer"
 msgstr ""
 
-#: gnu/packages/perl.scm:2421
+#: gnu/packages/perl.scm:2951
 msgid "This module provides functions for fast reading and writing of files."
 msgstr ""
 
-#: gnu/packages/perl.scm:2440
+#: gnu/packages/perl.scm:2970
 msgid "Return name and handle of a temporary file safely"
 msgstr ""
 
-#: gnu/packages/perl.scm:2441
+#: gnu/packages/perl.scm:2971
 msgid ""
 "File::Temp can be used to create and open temporary files in\n"
 "a safe way."
 msgstr ""
 
-#: gnu/packages/perl.scm:2458
+#: gnu/packages/perl.scm:2988
 msgid "Portable implementation of the `which' utility"
 msgstr ""
 
-#: gnu/packages/perl.scm:2460
+#: gnu/packages/perl.scm:2990
 msgid ""
 "File::Which was created to be able to get the paths to executable\n"
 "programs on systems under which the `which' program wasn't implemented in the\n"
 "shell."
 msgstr ""
 
-#: gnu/packages/perl.scm:2481
+#: gnu/packages/perl.scm:3011
 msgid "Extended Unix style glob functionality"
 msgstr ""
 
-#: gnu/packages/perl.scm:2482
+#: gnu/packages/perl.scm:3012
 msgid ""
 "@code{File::Zglob} provides a traditional Unix @code{glob}\n"
 "functionality; it returns a list of file names that match the given pattern.\n"
 "For instance, it supports the @code{**/*.pm} form."
 msgstr ""
 
-#: gnu/packages/perl.scm:2507
+#: gnu/packages/perl.scm:3031
+msgid "Module to handle parsing command line options"
+msgstr ""
+
+#: gnu/packages/perl.scm:3032
+msgid ""
+"The @code{Getopt::Long} module implements an extended getopt\n"
+"function called @code{GetOptions()}.  It parses the command line from\n"
+"@code{ARGV}, recognizing and removing specified options and their possible\n"
+"values.\n"
+"\n"
+"This function adheres to the POSIX syntax for command line options, with GNU\n"
+"extensions.  In general, this means that options have long names instead of\n"
+"single letters, and are introduced with a double dash \"--\".  Support for\n"
+"bundling of command line options, as was the case with the more traditional\n"
+"single-letter approach, is provided but not enabled by default."
+msgstr ""
+
+#: gnu/packages/perl.scm:3065
 msgid "Getopt::Long, but simpler and more powerful"
 msgstr ""
 
-#: gnu/packages/perl.scm:2508
+#: gnu/packages/perl.scm:3066
 msgid ""
 "Getopt::Long::Descriptive is yet another Getopt library.\n"
 "It's built atop Getopt::Long, and gets a lot of its features, but tries to\n"
@@ -7753,21 +9155,31 @@ msgid ""
 "usage (help) messages, data validation, and a few other useful features."
 msgstr ""
 
-#: gnu/packages/perl.scm:2526
+#: gnu/packages/perl.scm:3084
 msgid "Table-driven argument parsing for Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:2528
+#: gnu/packages/perl.scm:3086
 msgid ""
 "Getopt::Tabular is a Perl 5 module for table-driven argument parsing,\n"
 "vaguely inspired by John Ousterhout's Tk_ParseArgv."
 msgstr ""
 
-#: gnu/packages/perl.scm:2547
+#: gnu/packages/perl.scm:3108
+msgid "Graph data structures and algorithms"
+msgstr ""
+
+#: gnu/packages/perl.scm:3109
+msgid ""
+"This is @code{Graph}, a Perl module for dealing with graphs,\n"
+"the abstract data structures."
+msgstr ""
+
+#: gnu/packages/perl.scm:3126
 msgid "Safe cleanup blocks implemented as guards"
 msgstr ""
 
-#: gnu/packages/perl.scm:2548
+#: gnu/packages/perl.scm:3127
 msgid ""
 "@code{Guard} implements so-called @dfn{guards}.  A guard is\n"
 "something (usually an object) that \"guards\" a resource, ensuring that it is\n"
@@ -7778,11 +9190,11 @@ msgid ""
 "which are tied to the scope exit."
 msgstr ""
 
-#: gnu/packages/perl.scm:2571
+#: gnu/packages/perl.scm:3150
 msgid "Merge arbitrarily deep hashes into a single hash"
 msgstr ""
 
-#: gnu/packages/perl.scm:2572
+#: gnu/packages/perl.scm:3151
 msgid ""
 "Hash::Merge merges two arbitrarily deep hashes into a single\n"
 "hash.  That is, at any level, it will add non-conflicting key-value pairs from\n"
@@ -7792,21 +9204,21 @@ msgid ""
 "merged."
 msgstr ""
 
-#: gnu/packages/perl.scm:2594
+#: gnu/packages/perl.scm:3173
 msgid "Store multiple values per key"
 msgstr ""
 
-#: gnu/packages/perl.scm:2595
+#: gnu/packages/perl.scm:3174
 msgid ""
 "Hash::MultiValue is an object (and a plain hash reference)\n"
 "that may contain multiple values per key, inspired by MultiDict of WebOb."
 msgstr ""
 
-#: gnu/packages/perl.scm:2615
+#: gnu/packages/perl.scm:3194
 msgid "Import packages into other packages"
 msgstr ""
 
-#: gnu/packages/perl.scm:2616
+#: gnu/packages/perl.scm:3195
 msgid ""
 "Writing exporters is a pain.  Some use Exporter, some use\n"
 "Sub::Exporter, some use Moose::Exporter, some use Exporter::Declare ... and\n"
@@ -7816,22 +9228,22 @@ msgid ""
 "compilation.  Import::Into provides global methods to make this painless."
 msgstr ""
 
-#: gnu/packages/perl.scm:2638
+#: gnu/packages/perl.scm:3217
 msgid "Use modules in inc/ if newer than installed"
 msgstr ""
 
-#: gnu/packages/perl.scm:2639
+#: gnu/packages/perl.scm:3218
 msgid ""
 "The inc::latest module helps bootstrap configure-time\n"
 "dependencies for CPAN distributions.  These dependencies get bundled into the\n"
 "inc directory within a distribution and are used by Makefile.PL or Build.PL."
 msgstr ""
 
-#: gnu/packages/perl.scm:2660
+#: gnu/packages/perl.scm:3239
 msgid "Capture STDOUT and STDERR from Perl code, subprocesses or XS"
 msgstr ""
 
-#: gnu/packages/perl.scm:2661
+#: gnu/packages/perl.scm:3240
 msgid ""
 "@code{IO::CaptureOutput} provides routines for capturing\n"
 "@code{STDOUT} and @code{STDERR} from perl subroutines, forked system\n"
@@ -7841,53 +9253,64 @@ msgid ""
 "try @code{Capture::Tiny} instead."
 msgstr ""
 
-#: gnu/packages/perl.scm:2683
+#: gnu/packages/perl.scm:3262
 msgid "Utilities for interactive I/O"
 msgstr ""
 
-#: gnu/packages/perl.scm:2684
+#: gnu/packages/perl.scm:3263
 msgid ""
 "This module provides three utility subroutines that make it\n"
 "easier to develop interactive applications: is_interactive(), interactive(),\n"
 "and busy()."
 msgstr ""
 
-#: gnu/packages/perl.scm:2703
+#: gnu/packages/perl.scm:3282
 msgid "Emulate file interface for in-core strings"
 msgstr ""
 
-#: gnu/packages/perl.scm:2704
+#: gnu/packages/perl.scm:3283
 msgid ""
 "IO::String is an IO::File (and IO::Handle) compatible class\n"
 "that reads or writes data from in-core strings."
 msgstr ""
 
-#: gnu/packages/perl.scm:2722
+#: gnu/packages/perl.scm:3301
 msgid "IO:: interface for reading/writing an array of lines"
 msgstr ""
 
-#: gnu/packages/perl.scm:2723
+#: gnu/packages/perl.scm:3302
 msgid ""
 "This toolkit primarily provides modules for performing both\n"
 "traditional and object-oriented i/o) on things *other* than normal\n"
 "filehandles; in particular, IO::Scalar, IO::ScalarArray, and IO::Lines."
 msgstr ""
 
-#: gnu/packages/perl.scm:2741
+#: gnu/packages/perl.scm:3320
 msgid "Perl interface to pseudo ttys"
 msgstr ""
 
-#: gnu/packages/perl.scm:2743
+#: gnu/packages/perl.scm:3322
 msgid ""
 "This package provides the 'IO::Pty' and 'IO::Tty' Perl interfaces to\n"
 "pseudo ttys."
 msgstr ""
 
-#: gnu/packages/perl.scm:2771
+#: gnu/packages/perl.scm:3340
+msgid "Run interactive command-line programs"
+msgstr ""
+
+#: gnu/packages/perl.scm:3341
+msgid ""
+"@code{IPC::Cmd} allows for the searching and execution of\n"
+"any binary on your system.  It adheres to verbosity settings and is able to\n"
+"run interactively.  It also has an option to capture output/error buffers."
+msgstr ""
+
+#: gnu/packages/perl.scm:3370
 msgid "Run system() and background procs w/ piping, redirs, ptys"
 msgstr ""
 
-#: gnu/packages/perl.scm:2772
+#: gnu/packages/perl.scm:3371
 msgid ""
 "IPC::Run allows you run and interact with child processes\n"
 "using files, pipes, and pseudo-ttys.  Both system()-style and scripted usages\n"
@@ -7895,11 +9318,11 @@ msgid ""
 "both supported and may be mixed."
 msgstr ""
 
-#: gnu/packages/perl.scm:2790
+#: gnu/packages/perl.scm:3389
 msgid "Run a subprocess with input/output redirection"
 msgstr ""
 
-#: gnu/packages/perl.scm:2792
+#: gnu/packages/perl.scm:3391
 msgid ""
 "The IPC::Run3 module allows you to run a subprocess and redirect stdin,\n"
 "stdout, and/or stderr to files and perl data structures.  It aims to satisfy\n"
@@ -7907,21 +9330,21 @@ msgid ""
 "Perlish API and none of the bloat and rarely used features of IPC::Run."
 msgstr ""
 
-#: gnu/packages/perl.scm:2816
+#: gnu/packages/perl.scm:3415
 msgid "Lightweight interface to shared memory"
 msgstr ""
 
-#: gnu/packages/perl.scm:2817
+#: gnu/packages/perl.scm:3416
 msgid ""
 "IPC::ShareLite provides a simple interface to shared memory,\n"
 "allowing data to be efficiently communicated between processes."
 msgstr ""
 
-#: gnu/packages/perl.scm:2835
+#: gnu/packages/perl.scm:3434
 msgid "Run commands simply, with detailed diagnostics"
 msgstr ""
 
-#: gnu/packages/perl.scm:2836
+#: gnu/packages/perl.scm:3435
 msgid ""
 "Calling Perl's in-built @code{system} function is easy,\n"
 "determining if it was successful is hard.  Let's face it, @code{$?} isn't the\n"
@@ -7932,21 +9355,21 @@ msgid ""
 "commands."
 msgstr ""
 
-#: gnu/packages/perl.scm:2861
+#: gnu/packages/perl.scm:3460
 msgid "JSON encoder/decoder for Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:2862
+#: gnu/packages/perl.scm:3461
 msgid ""
 "This module converts Perl data structures to JSON and vice\n"
 "versa using either JSON::XS or JSON::PP."
 msgstr ""
 
-#: gnu/packages/perl.scm:2887
+#: gnu/packages/perl.scm:3486
 msgid "Wrapper for Perl JSON classes"
 msgstr ""
 
-#: gnu/packages/perl.scm:2889
+#: gnu/packages/perl.scm:3488
 msgid ""
 "This module tries to provide a coherent API to bring together the\n"
 "various JSON modules currently on CPAN.  This module will allow you to code to\n"
@@ -7954,11 +9377,11 @@ msgid ""
 "installed."
 msgstr ""
 
-#: gnu/packages/perl.scm:2913
+#: gnu/packages/perl.scm:3512
 msgid "Cpanel::JSON::XS with fallback"
 msgstr ""
 
-#: gnu/packages/perl.scm:2914
+#: gnu/packages/perl.scm:3513
 msgid ""
 "This module first checks to see if either Cpanel::JSON::XS\n"
 "or JSON::XS is already loaded, in which case it uses that module.  Otherwise\n"
@@ -7966,15 +9389,58 @@ msgid ""
 "either uses the first module it finds or throws an error."
 msgstr ""
 
-#: gnu/packages/perl.scm:2937
+#: gnu/packages/perl.scm:3536
 msgid "JSON serialising/deserialising for Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:2957
+#: gnu/packages/perl.scm:3555
+msgid "Bringing loggers and listeners together"
+msgstr ""
+
+#: gnu/packages/perl.scm:3556
+msgid ""
+"@code{Log::Any} provides a standard log production API for\n"
+"modules.  @code{Log::Any::Adapter} allows applications to choose the mechanism\n"
+"for log consumption, whether screen, file or another logging mechanism like\n"
+"@code{Log::Dispatch} or @code{Log::Log4perl}.\n"
+"\n"
+"A CPAN module uses @code{Log::Any} to get a log producer object.  An\n"
+"application, in turn, may choose one or more logging mechanisms via\n"
+"@code{Log::Any::Adapter}, or none at all.\n"
+"\n"
+"@code{Log::Any} has a very tiny footprint and no dependencies beyond Perl\n"
+"itself, which makes it appropriate for even small CPAN modules to use.  It\n"
+"defaults to 'null' logging activity, so a module can safely log without\n"
+"worrying about whether the application has chosen (or will ever choose) a\n"
+"logging mechanism."
+msgstr ""
+
+#: gnu/packages/perl.scm:3592
+msgid "Log::Any adapter for Log::Log4perl"
+msgstr ""
+
+#: gnu/packages/perl.scm:3593
+msgid ""
+"@code{Log::Any::Adapter::Log4perl} provides a\n"
+"@code{Log::Any} adapter using @code{Log::Log4perl} for logging."
+msgstr ""
+
+#: gnu/packages/perl.scm:3614
+msgid "Log4j implementation for Perl"
+msgstr ""
+
+#: gnu/packages/perl.scm:3615
+msgid ""
+"@code{Log::Log4perl} lets you remote-control and fine-tune\n"
+"the logging behaviour of your system from the outside.  It implements the\n"
+"widely popular (Java-based) Log4j logging package in pure Perl."
+msgstr ""
+
+#: gnu/packages/perl.scm:3635
 msgid "Log::Report in the lightest form"
 msgstr ""
 
-#: gnu/packages/perl.scm:2959
+#: gnu/packages/perl.scm:3637
 msgid ""
 "This module allows libraries to have a dependency to a small module\n"
 "instead of the full Log-Report distribution.  The full power of\n"
@@ -7984,48 +9450,59 @@ msgid ""
 "version."
 msgstr ""
 
-#: gnu/packages/perl.scm:2984
+#: gnu/packages/perl.scm:3662
 msgid "Get messages to users and logs"
 msgstr ""
 
-#: gnu/packages/perl.scm:2986
+#: gnu/packages/perl.scm:3664
 msgid ""
 "@code{Log::Report} combines three tasks which are closely related in\n"
 "one: logging, exceptions, and translations."
 msgstr ""
 
-#: gnu/packages/perl.scm:3009
+#: gnu/packages/perl.scm:3682
+msgid "Transliterate text between writing systems"
+msgstr ""
+
+#: gnu/packages/perl.scm:3683
+msgid ""
+"@code{Lingua::Translit} can be used to convert text from one\n"
+"writing system to another, based on national or international transliteration\n"
+"tables.  Where possible a reverse transliteration is supported."
+msgstr ""
+
+#: gnu/packages/perl.scm:3707
 msgid "Combination of List::Util and List::MoreUtils"
 msgstr ""
 
-#: gnu/packages/perl.scm:3010
+#: gnu/packages/perl.scm:3708
 msgid ""
 "This module exports all of the functions that either\n"
 "List::Util or List::MoreUtils defines, with preference to List::Util."
 msgstr ""
 
-#: gnu/packages/perl.scm:3032
+#: gnu/packages/perl.scm:3730
 msgid "Compare elements of two or more lists"
 msgstr ""
 
-#: gnu/packages/perl.scm:3033
+#: gnu/packages/perl.scm:3731
 msgid ""
 "@code{List::Compare} provides a module to perform\n"
 "comparative operations on two or more lists.  Provided operations include\n"
 "intersections, unions, unique elements, complements and many more."
 msgstr ""
 
-#: gnu/packages/perl.scm:3058 gnu/packages/perl.scm:3085
+#: gnu/packages/perl.scm:3756 gnu/packages/perl.scm:3783
 msgid "Provide the stuff missing in List::Util"
 msgstr ""
 
-#: gnu/packages/perl.scm:3059
+#: gnu/packages/perl.scm:3757
 msgid ""
 "List::MoreUtils provides some trivial but commonly needed\n"
 "functionality on lists which is not going to go into List::Util."
 msgstr ""
 
-#: gnu/packages/perl.scm:3086
+#: gnu/packages/perl.scm:3784
 msgid ""
 "@code{List::SomeUtils} provides some trivial but commonly\n"
 "needed functionality on lists which is not going to go into @code{List::Util}.\n"
@@ -8037,43 +9514,43 @@ msgid ""
 "portions of this module couldn't be compiled on this machine."
 msgstr ""
 
-#: gnu/packages/perl.scm:3110
+#: gnu/packages/perl.scm:3808
 msgid "Expiry plug-in for Memoize that adds LRU cache expiration"
 msgstr ""
 
-#: gnu/packages/perl.scm:3111
+#: gnu/packages/perl.scm:3809
 msgid ""
 "This module implements an expiry policy for Memoize that\n"
 "follows LRU semantics, that is, the last n results, where n is specified as\n"
 "the argument to the CACHESIZE parameter, will be cached."
 msgstr ""
 
-#: gnu/packages/perl.scm:3129
+#: gnu/packages/perl.scm:3827
 msgid "Charset information for MIME messages"
 msgstr ""
 
-#: gnu/packages/perl.scm:3131
+#: gnu/packages/perl.scm:3829
 msgid ""
 "@code{MIME::Charset} provides information about character sets used for\n"
 "MIME messages on Internet."
 msgstr ""
 
-#: gnu/packages/perl.scm:3149
+#: gnu/packages/perl.scm:3847
 msgid "Definition of MIME types"
 msgstr ""
 
-#: gnu/packages/perl.scm:3150
+#: gnu/packages/perl.scm:3848
 msgid ""
 "This module provides a list of known mime-types, combined\n"
 "from various sources.  For instance, it contains all IANA types and the\n"
 "knowledge of Apache."
 msgstr ""
 
-#: gnu/packages/perl.scm:3172
+#: gnu/packages/perl.scm:3870
 msgid "Write your linewise code for handles; this does the rest"
 msgstr ""
 
-#: gnu/packages/perl.scm:3173
+#: gnu/packages/perl.scm:3871
 msgid ""
 "It's boring to deal with opening files for IO, converting\n"
 "strings to handle-like objects, and all that.  With\n"
@@ -8082,11 +9559,21 @@ msgid ""
 "file names are added for you."
 msgstr ""
 
-#: gnu/packages/perl.scm:3204
+#: gnu/packages/perl.scm:3898
+msgid "Enable all of the features of Modern Perl with one import"
+msgstr ""
+
+#: gnu/packages/perl.scm:3899
+msgid ""
+"@code{Modern::Perl} provides a simple way to enable\n"
+"multiple, by now, standard libraries in a Perl program."
+msgstr ""
+
+#: gnu/packages/perl.scm:3927
 msgid "Tiny replacement for Module::Build"
 msgstr ""
 
-#: gnu/packages/perl.scm:3205
+#: gnu/packages/perl.scm:3928
 msgid ""
 "Many Perl distributions use a Build.PL file instead of a\n"
 "Makefile.PL file to drive distribution configuration, build, test and\n"
@@ -8096,11 +9583,11 @@ msgid ""
 "has less than 120, yet supports the features needed by most distributions."
 msgstr ""
 
-#: gnu/packages/perl.scm:3227
+#: gnu/packages/perl.scm:3950
 msgid "Find and use installed modules in a (sub)category"
 msgstr ""
 
-#: gnu/packages/perl.scm:3228
+#: gnu/packages/perl.scm:3951
 msgid ""
 "Module::Find lets you find and use modules in categories.\n"
 "This can be useful for auto-detecting driver or plugin modules.  You can\n"
@@ -8108,11 +9595,11 @@ msgid ""
 "subcategories."
 msgstr ""
 
-#: gnu/packages/perl.scm:3254
+#: gnu/packages/perl.scm:3977
 msgid "Loads alternate underlying implementations for a module"
 msgstr ""
 
-#: gnu/packages/perl.scm:3255
+#: gnu/packages/perl.scm:3978
 msgid ""
 "This module abstracts out the process of choosing one of\n"
 "several underlying implementations for a module.  This can be used to provide\n"
@@ -8121,11 +9608,11 @@ msgid ""
 "implementations."
 msgstr ""
 
-#: gnu/packages/perl.scm:3293
+#: gnu/packages/perl.scm:4016
 msgid "Standalone, extensible Perl module installer"
 msgstr ""
 
-#: gnu/packages/perl.scm:3294
+#: gnu/packages/perl.scm:4017
 msgid ""
 "Module::Install is a package for writing installers for\n"
 "CPAN (or CPAN-like) distributions that are clean, simple, minimalist, act in a\n"
@@ -8133,52 +9620,52 @@ msgid ""
 "installation version 5.005 or newer."
 msgstr ""
 
-#: gnu/packages/perl.scm:3315
+#: gnu/packages/perl.scm:4038
 msgid "Give your Perl module the ability to have plugins"
 msgstr ""
 
-#: gnu/packages/perl.scm:3316
+#: gnu/packages/perl.scm:4039
 msgid ""
 "This module provides a simple but extensible way of having\n"
 "'plugins' for your Perl module."
 msgstr ""
 
-#: gnu/packages/perl.scm:3335
+#: gnu/packages/perl.scm:4058
 msgid "Perl runtime module handling"
 msgstr ""
 
-#: gnu/packages/perl.scm:3336
+#: gnu/packages/perl.scm:4059
 msgid ""
 "The functions exported by this module deal with runtime\n"
 "handling of Perl modules, which are normally handled at compile time."
 msgstr ""
 
-#: gnu/packages/perl.scm:3359
+#: gnu/packages/perl.scm:4082
 msgid "Provide information on conflicts for Module::Runtime"
 msgstr ""
 
-#: gnu/packages/perl.scm:3360
+#: gnu/packages/perl.scm:4083
 msgid ""
 "This module provides conflicts checking for Module::Runtime,\n"
 "which had a recent release that broke some versions of Moose.  It is called\n"
 "from Moose::Conflicts and moose-outdated."
 msgstr ""
 
-#: gnu/packages/perl.scm:3381
+#: gnu/packages/perl.scm:4104
 msgid "Recursively scan Perl code for dependencies"
 msgstr ""
 
-#: gnu/packages/perl.scm:3382
+#: gnu/packages/perl.scm:4105
 msgid ""
 "Module::ScanDeps is a module to recursively scan Perl\n"
 "programs for dependencies."
 msgstr ""
 
-#: gnu/packages/perl.scm:3402
+#: gnu/packages/perl.scm:4125
 msgid "Module name tools and transformations"
 msgstr ""
 
-#: gnu/packages/perl.scm:3403
+#: gnu/packages/perl.scm:4126
 msgid ""
 "This module provides a few useful functions for manipulating\n"
 "module names.  Its main aim is to centralise some of the functions commonly\n"
@@ -8186,11 +9673,11 @@ msgid ""
 "module names to relative paths."
 msgstr ""
 
-#: gnu/packages/perl.scm:3433
+#: gnu/packages/perl.scm:4156
 msgid "Minimalist Object Orientation (with Moose compatibility)"
 msgstr ""
 
-#: gnu/packages/perl.scm:3434
+#: gnu/packages/perl.scm:4157
 msgid ""
 "Moo is an extremely light-weight Object Orientation system.\n"
 "It allows one to concisely define objects and roles with a convenient syntax\n"
@@ -8198,11 +9685,11 @@ msgid ""
 "Moose and is optimised for rapid startup."
 msgstr ""
 
-#: gnu/packages/perl.scm:3510
+#: gnu/packages/perl.scm:4233
 msgid "Postmodern object system for Perl 5"
 msgstr ""
 
-#: gnu/packages/perl.scm:3512
+#: gnu/packages/perl.scm:4235
 msgid ""
 "Moose is a complete object system for Perl 5.  It provides keywords for\n"
 "attribute declaration, object construction, inheritance, and maybe more.  With\n"
@@ -8213,11 +9700,11 @@ msgid ""
 "sentences."
 msgstr ""
 
-#: gnu/packages/perl.scm:3540
+#: gnu/packages/perl.scm:4263
 msgid "Emulate Class::Accessor::Fast behavior using Moose attributes"
 msgstr ""
 
-#: gnu/packages/perl.scm:3541
+#: gnu/packages/perl.scm:4264
 msgid ""
 "This module attempts to emulate the behavior of\n"
 "Class::Accessor::Fast as accurately as possible using the Moose attribute\n"
@@ -8225,21 +9712,21 @@ msgid ""
 "private methods are not."
 msgstr ""
 
-#: gnu/packages/perl.scm:3573
+#: gnu/packages/perl.scm:4296
 msgid "Moose role for processing command line options"
 msgstr ""
 
-#: gnu/packages/perl.scm:3574
+#: gnu/packages/perl.scm:4297
 msgid ""
 "This is a Moose role which provides an alternate constructor\n"
 "for creating objects using parameters passed in from the command line."
 msgstr ""
 
-#: gnu/packages/perl.scm:3595
+#: gnu/packages/perl.scm:4318
 msgid "Mark overload code symbols as methods"
 msgstr ""
 
-#: gnu/packages/perl.scm:3596
+#: gnu/packages/perl.scm:4319
 msgid ""
 "MooseX::MarkAsMethods allows one to easily mark certain\n"
 "functions as Moose methods.  This will allow other packages such as\n"
@@ -8249,21 +9736,21 @@ msgid ""
 "overloads will \"just work\"."
 msgstr ""
 
-#: gnu/packages/perl.scm:3626
+#: gnu/packages/perl.scm:4349
 msgid "Code attribute introspection"
 msgstr ""
 
-#: gnu/packages/perl.scm:3627
+#: gnu/packages/perl.scm:4350
 msgid ""
 "This module allows code attributes of methods to be\n"
 "introspected using Moose meta method objects."
 msgstr ""
 
-#: gnu/packages/perl.scm:3653
+#: gnu/packages/perl.scm:4376
 msgid "Subclassing of non-Moose classes"
 msgstr ""
 
-#: gnu/packages/perl.scm:3654
+#: gnu/packages/perl.scm:4377
 msgid ""
 "MooseX::NonMoose allows for easily subclassing non-Moose\n"
 "classes with Moose, taking care of the details connected with doing this, such\n"
@@ -8272,31 +9759,31 @@ msgid ""
 "BUILD methods are called.  It tries to be as non-intrusive as possible."
 msgstr ""
 
-#: gnu/packages/perl.scm:3683
+#: gnu/packages/perl.scm:4406
 msgid "Extension of Params::Validate using Moose's types"
 msgstr ""
 
-#: gnu/packages/perl.scm:3684
+#: gnu/packages/perl.scm:4407
 msgid ""
 "This module fills a gap in Moose by adding method parameter\n"
 "validation to Moose."
 msgstr ""
 
-#: gnu/packages/perl.scm:3705
+#: gnu/packages/perl.scm:4428
 msgid "Apply roles to a related Perl class"
 msgstr ""
 
-#: gnu/packages/perl.scm:3706
+#: gnu/packages/perl.scm:4429
 msgid ""
 "This module applies roles to make a subclass instead of\n"
 "manually setting up a subclass."
 msgstr ""
 
-#: gnu/packages/perl.scm:3733
+#: gnu/packages/perl.scm:4456
 msgid "Moose roles with composition parameters"
 msgstr ""
 
-#: gnu/packages/perl.scm:3734
+#: gnu/packages/perl.scm:4457
 msgid ""
 "Because Moose roles serve many different masters, they\n"
 "usually provide only the least common denominator of functionality.  To\n"
@@ -8306,11 +9793,11 @@ msgid ""
 "Parameterized roles offer a solution to these (and other) kinds of problems."
 msgstr ""
 
-#: gnu/packages/perl.scm:3760
+#: gnu/packages/perl.scm:4483
 msgid "Roles which support overloading"
 msgstr ""
 
-#: gnu/packages/perl.scm:3761
+#: gnu/packages/perl.scm:4484
 msgid ""
 "MooseX::Role::WithOverloading allows you to write a\n"
 "Moose::Role which defines overloaded operators and allows those overload\n"
@@ -8318,11 +9805,11 @@ msgid ""
 "where plain Moose::Roles would lose the overloading."
 msgstr ""
 
-#: gnu/packages/perl.scm:3783
+#: gnu/packages/perl.scm:4506
 msgid "Name your accessors foo() and set_foo()"
 msgstr ""
 
-#: gnu/packages/perl.scm:3784
+#: gnu/packages/perl.scm:4507
 msgid ""
 "This module does not provide any methods.  Simply loading it\n"
 "changes the default naming policy for the loading class so that accessors are\n"
@@ -8330,85 +9817,96 @@ msgid ""
 "accessor, while set methods are prefixed with \"_set_\"."
 msgstr ""
 
-#: gnu/packages/perl.scm:3810
+#: gnu/packages/perl.scm:4533
 msgid "Strict object constructors for Moose"
 msgstr ""
 
-#: gnu/packages/perl.scm:3811
+#: gnu/packages/perl.scm:4534
 msgid ""
 "Simply loading this module makes your constructors\n"
 "\"strict\".  If your constructor is called with an attribute init argument\n"
 "that your class does not declare, then it calls Moose->throw_error()."
 msgstr ""
 
-#: gnu/packages/perl.scm:3839
+#: gnu/packages/perl.scm:4562
 msgid "Trait loading and resolution for Moose"
 msgstr ""
 
-#: gnu/packages/perl.scm:3840
+#: gnu/packages/perl.scm:4563
 msgid ""
 "Adds support on top of MooseX::Traits for class precedence\n"
 "search for traits and some extra attributes."
 msgstr ""
 
-#: gnu/packages/perl.scm:3866
+#: gnu/packages/perl.scm:4589
 msgid "Organise your Moose types in libraries"
 msgstr ""
 
-#: gnu/packages/perl.scm:3867
+#: gnu/packages/perl.scm:4590
 msgid ""
 "This package lets you declare types using short names, but\n"
 "behind the scenes it namespaces all your type declarations, effectively\n"
 "prevent name clashes between packages."
 msgstr ""
 
-#: gnu/packages/perl.scm:3898
+#: gnu/packages/perl.scm:4621
 msgid "DateTime related constraints and coercions for Moose"
 msgstr ""
 
-#: gnu/packages/perl.scm:3899
+#: gnu/packages/perl.scm:4622
 msgid ""
 "This module packages several Moose::Util::TypeConstraints\n"
 "with coercions, designed to work with the DateTime suite of objects."
 msgstr ""
 
-#: gnu/packages/perl.scm:3931
+#: gnu/packages/perl.scm:4654
 msgid "Extensions to MooseX::Types::DateTime"
 msgstr ""
 
-#: gnu/packages/perl.scm:3932
+#: gnu/packages/perl.scm:4655
 msgid ""
 "This module builds on MooseX::Types::DateTime to add\n"
 "additional custom types and coercions.  Since it builds on an existing type,\n"
 "all coercions and constraints are inherited."
 msgstr ""
 
-#: gnu/packages/perl.scm:3961
+#: gnu/packages/perl.scm:4684
 msgid "ClassName type constraints for Moose"
 msgstr ""
 
-#: gnu/packages/perl.scm:3962
+#: gnu/packages/perl.scm:4685
 msgid ""
 "MooseX::Types::LoadableClass provides a ClassName type\n"
 "constraint with coercion to load the class."
 msgstr ""
 
-#: gnu/packages/perl.scm:3986
+#: gnu/packages/perl.scm:4709
 msgid "Moosish types and type builder"
 msgstr ""
 
-#: gnu/packages/perl.scm:3987
+#: gnu/packages/perl.scm:4710
 msgid ""
 "MooX::Types::MooseLike provides a possibility to build your\n"
 "own set of Moose-like types.  These custom types can then be used to describe\n"
 "fields in Moo-based classes."
 msgstr ""
 
-#: gnu/packages/perl.scm:4006
+#: gnu/packages/perl.scm:4729
+msgid "Mozilla's CA cert bundle in PEM format"
+msgstr ""
+
+#: gnu/packages/perl.scm:4730
+msgid ""
+"@code{Mozilla::CA} provides a copy of Mozilla's bundle of\n"
+"Certificate Authority certificates in a form that can be consumed by modules\n"
+"and libraries based on OpenSSL."
+msgstr ""
+
+#: gnu/packages/perl.scm:4749
 msgid "MRO interface compatibility for Perls < 5.9.5"
 msgstr ""
 
-#: gnu/packages/perl.scm:4007
+#: gnu/packages/perl.scm:4750
 msgid ""
 "The \"mro\" namespace provides several utilities for dealing\n"
 "with method resolution order and method caching in general in Perl 5.9.5 and\n"
@@ -8416,11 +9914,11 @@ msgid ""
 "Perl (back to 5.6.0)."
 msgstr ""
 
-#: gnu/packages/perl.scm:4034
+#: gnu/packages/perl.scm:4777
 msgid "Keep imports out of your namespace"
 msgstr ""
 
-#: gnu/packages/perl.scm:4035
+#: gnu/packages/perl.scm:4778
 msgid ""
 "The namespace::autoclean pragma will remove all imported\n"
 "symbols at the end of the current package's compile cycle.  Functions called\n"
@@ -8431,11 +9929,11 @@ msgid ""
 "anything that looks like a method."
 msgstr ""
 
-#: gnu/packages/perl.scm:4061
+#: gnu/packages/perl.scm:4804
 msgid "Keep imports and functions out of your namespace"
 msgstr ""
 
-#: gnu/packages/perl.scm:4062
+#: gnu/packages/perl.scm:4805
 msgid ""
 "The namespace::clean pragma will remove all previously\n"
 "declared or imported symbols at the end of the current package's compile\n"
@@ -8443,64 +9941,76 @@ msgid ""
 "name, but they won't show up as methods on your class or instances."
 msgstr ""
 
-#: gnu/packages/perl.scm:4082
-msgid "Numeric comparisons"
+#: gnu/packages/perl.scm:4828
+msgid "Perl client for Etsy's statsd daemon"
+msgstr "Perlklient for Etsy's statsd-dæmonen"
+
+#: gnu/packages/perl.scm:4829
+msgid ""
+"This module implement a UDP client for the statsd statistics\n"
+"collector daemon in use at Etsy.com."
 msgstr ""
+"Dette modul implementerer en UDP-klient for statsd-statistik\n"
+"indsamlingsdæmonen i brug på Etsy.com."
 
-#: gnu/packages/perl.scm:4083
+#: gnu/packages/perl.scm:4847
+msgid "Numeric comparisons"
+msgstr "Numeriske sammenligninger"
+
+#: gnu/packages/perl.scm:4848
 msgid ""
 "Number::Compare compiles a simple comparison to an anonymous\n"
 "subroutine, which you can call with a value to be tested against."
 msgstr ""
 
-#: gnu/packages/perl.scm:4101
+#: gnu/packages/perl.scm:4866
 msgid "Generate cryptographic signatures for objects"
-msgstr ""
+msgstr "Opret kryptografiske underskrifter for objekter"
 
-#: gnu/packages/perl.scm:4102
+#: gnu/packages/perl.scm:4867
 msgid ""
 "Object::Signature is an abstract base class that you can\n"
 "inherit from in order to allow your objects to generate unique cryptographic\n"
 "signatures."
 msgstr ""
 
-#: gnu/packages/perl.scm:4124
+#: gnu/packages/perl.scm:4889
 msgid "Anonymous packages"
-msgstr ""
+msgstr "Anonyme pakker"
 
-#: gnu/packages/perl.scm:4125
+#: gnu/packages/perl.scm:4890
 msgid ""
 "This module allows for anonymous packages that are\n"
 "independent of the main namespace and only available through an object\n"
 "instance, not by name."
 msgstr ""
 
-#: gnu/packages/perl.scm:4153
+#: gnu/packages/perl.scm:4918
 msgid "Manage deprecation warnings for your distribution"
-msgstr ""
+msgstr "Håndter forældelsesadvarseler for din distribution"
 
-#: gnu/packages/perl.scm:4154
+#: gnu/packages/perl.scm:4919
 msgid ""
 "This module allows you to manage a set of deprecations for\n"
 "one or more modules."
 msgstr ""
 
-#: gnu/packages/perl.scm:4181
+#: gnu/packages/perl.scm:4946
 msgid "Routines for manipulating stashes"
 msgstr ""
 
-#: gnu/packages/perl.scm:4182
+#: gnu/packages/perl.scm:4947
 msgid ""
 "Manipulating stashes (Perl's symbol tables) is occasionally\n"
 "necessary, but incredibly messy, and easy to get wrong.  This module hides all\n"
 "of that behind a simple API."
 msgstr ""
 
-#: gnu/packages/perl.scm:4205
+#: gnu/packages/perl.scm:4970
 msgid "Faster implementation of the Package::Stash API"
 msgstr ""
 
-#: gnu/packages/perl.scm:4206
+#: gnu/packages/perl.scm:4971
 msgid ""
 "This is a backend for Package::Stash, which provides the\n"
 "functionality in a way that's less buggy and much faster.  It will be used by\n"
@@ -8508,11 +10018,11 @@ msgid ""
 "compiler."
 msgstr ""
 
-#: gnu/packages/perl.scm:4226
+#: gnu/packages/perl.scm:4991
 msgid "Play with other peoples' lexical variables"
 msgstr ""
 
-#: gnu/packages/perl.scm:4227
+#: gnu/packages/perl.scm:4992
 msgid ""
 "PadWalker is a module which allows you to inspect (and even\n"
 "change) lexical variables in any subroutine which called you.  It will only\n"
@@ -8520,89 +10030,101 @@ msgid ""
 "is particularly useful for debugging."
 msgstr ""
 
-#: gnu/packages/perl.scm:4248
+#: gnu/packages/perl.scm:5013
 msgid "Simple, compact and correct param-checking functions"
 msgstr ""
 
-#: gnu/packages/perl.scm:4250
+#: gnu/packages/perl.scm:5015
 msgid ""
 "Params::Util provides a basic set of importable functions that makes\n"
 "checking parameters easier."
 msgstr ""
 
-#: gnu/packages/perl.scm:4274
+#: gnu/packages/perl.scm:5039
 msgid "Validate method/function parameters"
 msgstr ""
 
-#: gnu/packages/perl.scm:4275
+#: gnu/packages/perl.scm:5040
 msgid ""
 "The Params::Validate module allows you to validate method or\n"
 "function call parameters to an arbitrary level of specificity."
 msgstr ""
 
-#: gnu/packages/perl.scm:4293
+#: gnu/packages/perl.scm:5058
 msgid "Create and manipulate PAR distributions"
-msgstr ""
+msgstr "Opret og manipuler PAR-distributioner"
 
-#: gnu/packages/perl.scm:4294
+#: gnu/packages/perl.scm:5059
 msgid ""
 "PAR::Dist is a toolkit to create and manipulate PAR\n"
 "distributions."
 msgstr ""
+"PAR::Dist er et værktøjssæt til at oprette og manipulere PAR-\n"
+"distributioner."
 
-#: gnu/packages/perl.scm:4313
+#: gnu/packages/perl.scm:5078
 msgid ""
 "Allows you to both load one or more modules, while setting\n"
 "up inheritance from those modules at the same time."
 msgstr ""
 
-#: gnu/packages/perl.scm:4332
+#: gnu/packages/perl.scm:5097
 msgid "Path specification manipulation"
 msgstr ""
 
-#: gnu/packages/perl.scm:4333
+#: gnu/packages/perl.scm:5098
 msgid ""
 "Path::Class is a module for manipulation of file and\n"
 "directory specifications in a cross-platform manner."
 msgstr ""
 
-#: gnu/packages/perl.scm:4354
+#: gnu/packages/perl.scm:5122
+msgid "File path utility"
+msgstr ""
+
+#: gnu/packages/perl.scm:5123
+msgid ""
+"This module provides a small, fast utility for working\n"
+"with file paths."
+msgstr ""
+
+#: gnu/packages/perl.scm:5144
 msgid "Fast and correct UTF-8 IO"
 msgstr ""
 
-#: gnu/packages/perl.scm:4355
+#: gnu/packages/perl.scm:5145
 msgid ""
 "@code{PerlIO::utf8_strict} provides a fast and correct UTF-8\n"
 "PerlIO layer.  Unlike Perl's default @code{:utf8} layer it checks the input\n"
 "for correctness."
 msgstr ""
 
-#: gnu/packages/perl.scm:4376
+#: gnu/packages/perl.scm:5166
 msgid "Check for comprehensive documentation of a module"
 msgstr ""
 
-#: gnu/packages/perl.scm:4377
+#: gnu/packages/perl.scm:5167
 msgid ""
 "This module provides a mechanism for determining if the pod\n"
 "for a given module is comprehensive."
 msgstr ""
 
-#: gnu/packages/perl.scm:4394
+#: gnu/packages/perl.scm:5184
 msgid "Parsing library for text in Pod format"
 msgstr ""
 
-#: gnu/packages/perl.scm:4395
+#: gnu/packages/perl.scm:5185
 msgid ""
 "Pod::Simple is a Perl library for parsing text in\n"
 "the Pod (plain old documentation) markup language that is typically\n"
 "used for writing documentation for Perl and for Perl modules."
 msgstr ""
 
-#: gnu/packages/perl.scm:4416
+#: gnu/packages/perl.scm:5206
 msgid "GNU C library compatible strftime for loggers and servers"
 msgstr ""
 
-#: gnu/packages/perl.scm:4417
+#: gnu/packages/perl.scm:5207
 msgid ""
 "POSIX::strftime::Compiler provides GNU C library compatible\n"
 "strftime(3).  But this module is not affected by the system locale.  This\n"
@@ -8610,22 +10132,22 @@ msgid ""
 "applications."
 msgstr ""
 
-#: gnu/packages/perl.scm:4435
+#: gnu/packages/perl.scm:5225
 msgid "Information about the currently running perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:4437
+#: gnu/packages/perl.scm:5227
 msgid ""
 "Probe::Perl provides methods for obtaining information about the\n"
 "currently running perl interpreter.  It originally began life as code in the\n"
 "Module::Build project, but has been externalized here for general use."
 msgstr ""
 
-#: gnu/packages/perl.scm:4459
+#: gnu/packages/perl.scm:5249
 msgid "Create read-only scalars, arrays, hashes"
 msgstr ""
 
-#: gnu/packages/perl.scm:4460
+#: gnu/packages/perl.scm:5250
 msgid ""
 "This module provides a facility for creating non-modifiable\n"
 "variables in Perl.  This is useful for configuration files, headers, etc.  It\n"
@@ -8633,11 +10155,11 @@ msgid ""
 "variables that should not be changed."
 msgstr ""
 
-#: gnu/packages/perl.scm:4478
+#: gnu/packages/perl.scm:5268
 msgid "Provide commonly requested regular expressions"
 msgstr ""
 
-#: gnu/packages/perl.scm:4480
+#: gnu/packages/perl.scm:5270
 msgid ""
 "This module exports a single hash (`%RE') that stores or generates\n"
 "commonly needed regular expressions.  Patterns currently provided include:\n"
@@ -8647,29 +10169,29 @@ msgid ""
 "codes."
 msgstr ""
 
-#: gnu/packages/perl.scm:4510
+#: gnu/packages/perl.scm:5300
 msgid "Roles, as a slice of Moose"
 msgstr ""
 
-#: gnu/packages/perl.scm:4511
+#: gnu/packages/perl.scm:5301
 msgid "Role::Tiny is a minimalist role composition tool."
 msgstr ""
 
-#: gnu/packages/perl.scm:4528
+#: gnu/packages/perl.scm:5318
 msgid "Call isa, can, does, and DOES safely"
 msgstr ""
 
-#: gnu/packages/perl.scm:4529
+#: gnu/packages/perl.scm:5319
 msgid ""
 "This module allows you to call isa, can, does, and DOES\n"
 "safely on things that may not be objects."
 msgstr ""
 
-#: gnu/packages/perl.scm:4547
+#: gnu/packages/perl.scm:5337
 msgid "Lexically-scoped resource management"
 msgstr ""
 
-#: gnu/packages/perl.scm:4548
+#: gnu/packages/perl.scm:5338
 msgid ""
 "This module provides a convenient way to perform cleanup or\n"
 "other forms of resource management at the end of a scope.  It is particularly\n"
@@ -8680,29 +10202,29 @@ msgid ""
 "collector."
 msgstr ""
 
-#: gnu/packages/perl.scm:4571
+#: gnu/packages/perl.scm:5361
 msgid "Infinite sets"
 msgstr ""
 
-#: gnu/packages/perl.scm:4572
+#: gnu/packages/perl.scm:5362
 msgid "Set::Infinite is a set theory module for infinite sets."
 msgstr ""
 
-#: gnu/packages/perl.scm:4592
+#: gnu/packages/perl.scm:5382
 msgid "Unordered collections of Perl Objects"
 msgstr ""
 
-#: gnu/packages/perl.scm:4593
+#: gnu/packages/perl.scm:5383
 msgid ""
 "Set::Object provides efficient sets, unordered collections\n"
 "of Perl objects without duplicates for scalars and references."
 msgstr ""
 
-#: gnu/packages/perl.scm:4611
+#: gnu/packages/perl.scm:5401
 msgid "Set operations for Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:4612
+#: gnu/packages/perl.scm:5402
 msgid ""
 "The first priority of Set::Scalar is to be a convenient\n"
 "interface to sets (as in: unordered collections of Perl scalars).  While not\n"
@@ -8710,11 +10232,21 @@ msgid ""
 "compact."
 msgstr ""
 
-#: gnu/packages/perl.scm:4632
+#: gnu/packages/perl.scm:5422
+msgid "Sort arrays by one or multiple calculated keys"
+msgstr ""
+
+#: gnu/packages/perl.scm:5423
+msgid ""
+"This Perl module provides various functions to quickly sort\n"
+"arrays by one or multiple calculated keys."
+msgstr ""
+
+#: gnu/packages/perl.scm:5441
 msgid "Spiffy Perl Interface Framework For You"
 msgstr ""
 
-#: gnu/packages/perl.scm:4633
+#: gnu/packages/perl.scm:5442
 msgid ""
 "Spiffy is a framework and methodology for doing object\n"
 "oriented (OO) programming in Perl.  Spiffy combines the best parts of\n"
@@ -8724,11 +10256,11 @@ msgid ""
 "other OO languages like Python, Ruby, Java and Perl 6."
 msgstr ""
 
-#: gnu/packages/perl.scm:4655
+#: gnu/packages/perl.scm:5464
 msgid "Temporary buffer to save bytes"
 msgstr ""
 
-#: gnu/packages/perl.scm:4656
+#: gnu/packages/perl.scm:5465
 msgid ""
 "Stream::Buffered is a buffer class to store arbitrary length\n"
 "of byte strings and then get a seekable filehandle once everything is\n"
@@ -8736,62 +10268,62 @@ msgid ""
 "on the length of the size."
 msgstr ""
 
-#: gnu/packages/perl.scm:4676
+#: gnu/packages/perl.scm:5485
 msgid "Turn on strict and make all warnings fatal"
 msgstr ""
 
-#: gnu/packages/perl.scm:4677
+#: gnu/packages/perl.scm:5486
 msgid ""
 "Strictures turns on strict and make all warnings fatal when\n"
 "run from within a source-controlled directory."
 msgstr ""
 
-#: gnu/packages/perl.scm:4695
+#: gnu/packages/perl.scm:5504
 msgid "Camelcase and de-camelcase"
 msgstr ""
 
-#: gnu/packages/perl.scm:4696
+#: gnu/packages/perl.scm:5505
 msgid ""
 "This module may be used to convert from under_score text to\n"
 "CamelCase and back again."
 msgstr ""
 
-#: gnu/packages/perl.scm:4716
+#: gnu/packages/perl.scm:5525
 msgid "Rewrite strings based on a set of known prefixes"
 msgstr ""
 
-#: gnu/packages/perl.scm:4717
+#: gnu/packages/perl.scm:5526
 msgid ""
 "This module allows you to rewrite strings based on a set of\n"
 "known prefixes."
 msgstr ""
 
-#: gnu/packages/perl.scm:4736
+#: gnu/packages/perl.scm:5545
 msgid "String printing alternatives to printf"
 msgstr ""
 
-#: gnu/packages/perl.scm:4738
+#: gnu/packages/perl.scm:5547
 msgid ""
 "This module inserts values into (translated) strings.  It provides\n"
 "@code{printf} and @code{sprintf} alternatives via both an object-oriented and\n"
 "a functional interface."
 msgstr ""
 
-#: gnu/packages/perl.scm:4761
+#: gnu/packages/perl.scm:5570
 msgid "Sophisticated exporter for custom-built routines"
 msgstr ""
 
-#: gnu/packages/perl.scm:4763
+#: gnu/packages/perl.scm:5572
 msgid ""
 "Sub::Exporter provides a sophisticated alternative to Exporter.pm for\n"
 "custom-built routines."
 msgstr ""
 
-#: gnu/packages/perl.scm:4782
+#: gnu/packages/perl.scm:5591
 msgid "Only use Sub::Exporter if you need it"
 msgstr ""
 
-#: gnu/packages/perl.scm:4783
+#: gnu/packages/perl.scm:5592
 msgid ""
 "Sub::Exporter is an incredibly powerful module, but with\n"
 "that power comes great responsibility, as well as some runtime penalties.\n"
@@ -8801,54 +10333,54 @@ msgid ""
 "renaming exports, if they try to use them."
 msgstr ""
 
-#: gnu/packages/perl.scm:4805
+#: gnu/packages/perl.scm:5614
 msgid "Retrieve names of code references"
 msgstr ""
 
-#: gnu/packages/perl.scm:4806
+#: gnu/packages/perl.scm:5615
 msgid ""
 "Sub::Identify allows you to retrieve the real name of code\n"
 "references."
 msgstr ""
 
-#: gnu/packages/perl.scm:4825
+#: gnu/packages/perl.scm:5634
 msgid "Install subroutines into packages easily"
 msgstr ""
 
-#: gnu/packages/perl.scm:4827
+#: gnu/packages/perl.scm:5636
 msgid ""
 "Sub::Install makes it easy to install subroutines into packages without\n"
 "the unsightly mess of C<no strict> or typeglobs lying about where just anyone\n"
 "can see them."
 msgstr ""
 
-#: gnu/packages/perl.scm:4848
+#: gnu/packages/perl.scm:5657
 msgid "(Re)name a sub"
 msgstr ""
 
-#: gnu/packages/perl.scm:4849
+#: gnu/packages/perl.scm:5658
 msgid ""
 "Assigns a new name to referenced sub.  If package\n"
 "specification is omitted in the name, then the current package is used.  The\n"
 "return value is the sub."
 msgstr ""
 
-#: gnu/packages/perl.scm:4868
+#: gnu/packages/perl.scm:5677
 msgid "Apparently run a function in a higher stack frame"
 msgstr ""
 
-#: gnu/packages/perl.scm:4869
+#: gnu/packages/perl.scm:5678
 msgid ""
 "Like Tcl's uplevel() function, but not quite so dangerous.\n"
 "The idea is just to fool caller().  All the really naughty bits of Tcl's\n"
 "uplevel() are avoided."
 msgstr ""
 
-#: gnu/packages/perl.scm:4888
+#: gnu/packages/perl.scm:5697
 msgid "Perl extension for generating SVG documents"
 msgstr ""
 
-#: gnu/packages/perl.scm:4889
+#: gnu/packages/perl.scm:5698
 msgid ""
 "SVG is a Perl module which generates a nested data structure\n"
 "containing the DOM representation of an SVG (Scalable Vector Graphics) image.\n"
@@ -8857,32 +10389,32 @@ msgid ""
 "animation content."
 msgstr ""
 
-#: gnu/packages/perl.scm:4908
+#: gnu/packages/perl.scm:5717
 msgid "Perl extension for getting CPU information"
 msgstr ""
 
-#: gnu/packages/perl.scm:4910
+#: gnu/packages/perl.scm:5719
 msgid ""
 "In responce to a post on perlmonks.org, a module for counting the number\n"
 "of CPU's on a system.  Support has now also been added for type of CPU and\n"
 "clock speed."
 msgstr ""
 
-#: gnu/packages/perl.scm:4932
+#: gnu/packages/perl.scm:5741
 msgid "Get full hostname in Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:4933
+#: gnu/packages/perl.scm:5742
 msgid ""
 "Sys::Hostname::Long tries very hard to get the full hostname\n"
 "of a system."
 msgstr ""
 
-#: gnu/packages/perl.scm:4951
+#: gnu/packages/perl.scm:5760
 msgid "Ensure that a platform has weaken support"
 msgstr ""
 
-#: gnu/packages/perl.scm:4952
+#: gnu/packages/perl.scm:5761
 msgid ""
 "One recurring problem in modules that use Scalar::Util's\n"
 "weaken function is that it is not present in the pure-perl variant.  If\n"
@@ -8892,11 +10424,11 @@ msgid ""
 "error encouraging the user to seek support."
 msgstr ""
 
-#: gnu/packages/perl.scm:4977
+#: gnu/packages/perl.scm:5786
 msgid "Template processing system for Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:4978
+#: gnu/packages/perl.scm:5787
 msgid ""
 "The Template Toolkit is a collection of modules which\n"
 "implement an extensible template processing system.  It was originally\n"
@@ -8905,42 +10437,42 @@ msgid ""
 "documents: HTML, XML, POD, PostScript, LaTeX, and so on."
 msgstr ""
 
-#: gnu/packages/perl.scm:5001
+#: gnu/packages/perl.scm:5810
 msgid "Profiling for Template Toolkit"
 msgstr ""
 
-#: gnu/packages/perl.scm:5002
+#: gnu/packages/perl.scm:5811
 msgid ""
 "Template::Timer provides inline profiling of the template\n"
 "processing in Perl code."
 msgstr ""
 
-#: gnu/packages/perl.scm:5020
+#: gnu/packages/perl.scm:5829
 msgid "Detect encoding of the current terminal"
 msgstr ""
 
-#: gnu/packages/perl.scm:5021
+#: gnu/packages/perl.scm:5830
 msgid ""
 "Term::Encoding is a simple module to detect the encoding of\n"
 "the current terminal expects in various ways."
 msgstr ""
 
-#: gnu/packages/perl.scm:5045
+#: gnu/packages/perl.scm:5854
 msgid "Progress meter on a standard terminal"
 msgstr ""
 
-#: gnu/packages/perl.scm:5046
+#: gnu/packages/perl.scm:5855
 msgid ""
 "Term::ProgressBar provides a simple progress bar on the\n"
 "terminal, to let the user know that something is happening, roughly how much\n"
 "stuff has been done, and maybe an estimate at how long remains."
 msgstr ""
 
-#: gnu/packages/perl.scm:5069
+#: gnu/packages/perl.scm:5878
 msgid "Progress meter if run interactively"
 msgstr ""
 
-#: gnu/packages/perl.scm:5070
+#: gnu/packages/perl.scm:5879
 msgid ""
 "Term::ProgressBar is a wonderful module for showing progress\n"
 "bars on the terminal.  This module acts very much like that module when it is\n"
@@ -8948,21 +10480,21 @@ msgid ""
 "a cron job) then it does not show the progress bar."
 msgstr ""
 
-#: gnu/packages/perl.scm:5092
+#: gnu/packages/perl.scm:5901
 msgid "Simple progress bars"
 msgstr ""
 
-#: gnu/packages/perl.scm:5093
+#: gnu/packages/perl.scm:5902
 msgid ""
 "Term::ProgressBar::Simple tells you how much work has been\n"
 "done, how much is left to do, and estimate how long it will take."
 msgstr ""
 
-#: gnu/packages/perl.scm:5111
+#: gnu/packages/perl.scm:5920
 msgid "Simple terminal control"
 msgstr "Simpel terminalkontrol"
 
-#: gnu/packages/perl.scm:5112
+#: gnu/packages/perl.scm:5921
 msgid ""
 "This module, ReadKey, provides ioctl control for terminals\n"
 "so the input modes can be changed (thus allowing reads of a single character\n"
@@ -8971,22 +10503,22 @@ msgid ""
 "screen size, and retrieval/modification of the control characters."
 msgstr ""
 
-#: gnu/packages/perl.scm:5139
+#: gnu/packages/perl.scm:5948
 msgid "Data-driven testing framework for Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:5140
+#: gnu/packages/perl.scm:5949
 msgid ""
 "Test::Base gives a way to trivially write your own test\n"
 "framework base class.  It concentrates on offering reusable data driven\n"
 "patterns, so that you can write tests with a minimum of code."
 msgstr ""
 
-#: gnu/packages/perl.scm:5167
+#: gnu/packages/perl.scm:5976
 msgid "Easily create test classes in an xUnit/JUnit style"
 msgstr ""
 
-#: gnu/packages/perl.scm:5168
+#: gnu/packages/perl.scm:5977
 msgid ""
 "@code{Test::Class} provides a simple way of creating classes\n"
 "and objects to test your code in an xUnit style.\n"
@@ -8996,21 +10528,21 @@ msgid ""
 "@code{Test::Differences}, @code{Test::Exception}, etc.)."
 msgstr ""
 
-#: gnu/packages/perl.scm:5200
+#: gnu/packages/perl.scm:6009
 msgid "Test classes the easy way"
 msgstr ""
 
-#: gnu/packages/perl.scm:5201
+#: gnu/packages/perl.scm:6010
 msgid ""
 "@code{Test::Class::Most} provides some more convenience when\n"
 "using @code{Test::Class}."
 msgstr ""
 
-#: gnu/packages/perl.scm:5231
+#: gnu/packages/perl.scm:6040
 msgid "Check for uncleaned imports"
 msgstr ""
 
-#: gnu/packages/perl.scm:5232
+#: gnu/packages/perl.scm:6041
 msgid ""
 "This module lets you check your module's namespaces for\n"
 "imported functions you might have forgotten to remove with\n"
@@ -9018,11 +10550,11 @@ msgid ""
 "called as methods, which usually isn't want you want."
 msgstr ""
 
-#: gnu/packages/perl.scm:5252
+#: gnu/packages/perl.scm:6061
 msgid "Flexible deep comparison for the Test::Builder framework"
 msgstr ""
 
-#: gnu/packages/perl.scm:5254
+#: gnu/packages/perl.scm:6063
 msgid ""
 "Test::Deep compares two structures by going through each level, ensuring\n"
 "that the values match, that arrays and hashes have the same elements and that\n"
@@ -9030,21 +10562,21 @@ msgid ""
 "structures without getting caught in an infinite loop."
 msgstr ""
 
-#: gnu/packages/perl.scm:5280
+#: gnu/packages/perl.scm:6089
 msgid "Test strings and data structures and show differences"
 msgstr ""
 
-#: gnu/packages/perl.scm:5281
+#: gnu/packages/perl.scm:6090
 msgid ""
 "This module exports three test functions and four diff-style\n"
 "functions."
 msgstr ""
 
-#: gnu/packages/perl.scm:5302
+#: gnu/packages/perl.scm:6111
 msgid "Perl extension for maintaining test directories"
 msgstr ""
 
-#: gnu/packages/perl.scm:5303
+#: gnu/packages/perl.scm:6112
 msgid ""
 "Testing code can involve making sure that files are created\n"
 "and deleted as expected.  Doing this manually can be error prone, as it's easy\n"
@@ -9054,76 +10586,99 @@ msgid ""
 "files, as well as to verify that there are no missing or unknown files."
 msgstr ""
 
-#: gnu/packages/perl.scm:5329
+#: gnu/packages/perl.scm:6138
 msgid "Test exception based code"
 msgstr ""
 
-#: gnu/packages/perl.scm:5330
+#: gnu/packages/perl.scm:6139
 msgid ""
 "This module provides a few convenience methods for testing\n"
 "exception based code.  It is built with Test::Builder and plays happily with\n"
 "Test::More and friends."
 msgstr ""
 
-#: gnu/packages/perl.scm:5350
+#: gnu/packages/perl.scm:6159
 msgid "Simple helpers for testing code with exceptions"
 msgstr ""
 
-#: gnu/packages/perl.scm:5351
+#: gnu/packages/perl.scm:6160
 msgid ""
 "Test::Fatal is an alternative to the popular\n"
 "Test::Exception.  It does much less, but should allow greater flexibility in\n"
 "testing exception-throwing code with about the same amount of typing."
 msgstr ""
 
-#: gnu/packages/perl.scm:5381
+#: gnu/packages/perl.scm:6184
+msgid "Ease software testing with files and directories"
+msgstr ""
+
+#: gnu/packages/perl.scm:6185
+msgid ""
+"This library provides functions to enable testing of files\n"
+"and directories.  For instance, the @code{file_ok} helper can test whether the\n"
+"contents of a file is equal to a particular string."
+msgstr ""
+
+#: gnu/packages/perl.scm:6215
 msgid "Run Perl standard test scripts with statistics"
 msgstr ""
 
-#: gnu/packages/perl.scm:5382
+#: gnu/packages/perl.scm:6216
 msgid ""
 "Simple test harness which allows tests to be run and results\n"
 "automatically aggregated and output to STDOUT."
 msgstr ""
 
-#: gnu/packages/perl.scm:5400
+#: gnu/packages/perl.scm:6234
 msgid "Traces memory leaks in Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:5401
+#: gnu/packages/perl.scm:6235
 msgid ""
 "Test::LeakTrace provides several functions that trace memory\n"
 "leaks.  This module scans arenas, the memory allocation system, so it can\n"
 "detect any leaked SVs in given blocks."
 msgstr ""
 
-#: gnu/packages/perl.scm:5420
+#: gnu/packages/perl.scm:6254
 msgid "Tests strings for equality, with more helpful failures"
 msgstr ""
 
-#: gnu/packages/perl.scm:5421
+#: gnu/packages/perl.scm:6255
 msgid ""
 "This module provides some drop-in replacements for the\n"
 "string comparison functions of Test::More, but which are more suitable when\n"
 "you test against long strings."
 msgstr ""
 
-#: gnu/packages/perl.scm:5449
+#: gnu/packages/perl.scm:6276
+msgid "Interact with a t/test_manifest file"
+msgstr ""
+
+#: gnu/packages/perl.scm:6277
+msgid ""
+"@code{Test::Manifest} overrides the default test file order.  Instead of\n"
+"running all of the t/*.t files in ASCII-betical order, it looks in the t/test_manifest\n"
+"file to find out which tests you want to run and the order in which you want to run them.\n"
+"It constructs the right value for the build system to do the right thing."
+msgstr ""
+
+#: gnu/packages/perl.scm:6306
 msgid "Emulate troublesome interfaces in Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:5450
+#: gnu/packages/perl.scm:6307
 msgid ""
 "Test::MockObject allows you to create objects that conform\n"
 "to particular interfaces with very little code.  You don't have to reimplement\n"
 "the behavior, just the input and the output."
 msgstr ""
 
-#: gnu/packages/perl.scm:5469
+#: gnu/packages/perl.scm:6326
 msgid "Replaces actual time with simulated time"
 msgstr ""
 
-#: gnu/packages/perl.scm:5470
+#: gnu/packages/perl.scm:6327
 msgid ""
 "This module was created to enable test suites to test code\n"
 "at specific points in time.  Specifically it overrides localtime, gmtime and\n"
@@ -9132,22 +10687,22 @@ msgid ""
 "to gmtime,time or localtime."
 msgstr ""
 
-#: gnu/packages/perl.scm:5497
+#: gnu/packages/perl.scm:6354
 msgid "Most commonly needed test functions and features"
 msgstr ""
 
-#: gnu/packages/perl.scm:5498
+#: gnu/packages/perl.scm:6355
 msgid ""
 "This module provides the most commonly used testing\n"
 "functions, along with automatically turning on strict and warning and gives a\n"
 "bit more fine-grained control over test suites."
 msgstr ""
 
-#: gnu/packages/perl.scm:5516
+#: gnu/packages/perl.scm:6373
 msgid "Ensure no warnings are produced while testing"
 msgstr ""
 
-#: gnu/packages/perl.scm:5518
+#: gnu/packages/perl.scm:6375
 msgid ""
 "This modules causes any warnings during testing to be captured and\n"
 "stored.  It automatically adds an extra test that will run when your script\n"
@@ -9156,91 +10711,91 @@ msgid ""
 "including a stack trace of what was going on when it occurred."
 msgstr ""
 
-#: gnu/packages/perl.scm:5543
+#: gnu/packages/perl.scm:6400
 msgid "Utilities to test STDOUT and STDERR messages"
 msgstr ""
 
-#: gnu/packages/perl.scm:5545
+#: gnu/packages/perl.scm:6402
 msgid ""
 "Test::Output provides a simple interface for testing output sent to\n"
 "STDOUT or STDERR.  A number of different utilities are included to try and be\n"
 "as flexible as possible to the tester."
 msgstr ""
 
-#: gnu/packages/perl.scm:5567
+#: gnu/packages/perl.scm:6424
 msgid "Check for POD errors in files"
 msgstr ""
 
-#: gnu/packages/perl.scm:5568
+#: gnu/packages/perl.scm:6425
 msgid ""
 "Check POD files for errors or warnings in a test file, using\n"
 "Pod::Simple to do the heavy lifting."
 msgstr ""
 
-#: gnu/packages/perl.scm:5588
+#: gnu/packages/perl.scm:6445
 msgid "Check for pod coverage"
 msgstr ""
 
-#: gnu/packages/perl.scm:5589
+#: gnu/packages/perl.scm:6446
 msgid ""
 "This module adds a test to your Perl distribution which\n"
 "checks for pod coverage of all appropriate files."
 msgstr ""
 
-#: gnu/packages/perl.scm:5607
+#: gnu/packages/perl.scm:6464
 msgid "Checks to see if the module can be loaded"
 msgstr ""
 
-#: gnu/packages/perl.scm:5608
+#: gnu/packages/perl.scm:6465
 msgid ""
 "Test::Requires checks to see if the module can be loaded.\n"
 "If this fails, then rather than failing tests this skips all tests."
 msgstr ""
 
-#: gnu/packages/perl.scm:5627
+#: gnu/packages/perl.scm:6484
 msgid "Basic cross-platform tests for scripts"
 msgstr ""
 
-#: gnu/packages/perl.scm:5629
+#: gnu/packages/perl.scm:6486
 msgid ""
 "The intent of the Test::Script module is to provide a series of basic\n"
 "tests for 80% of the testing you will need to do for scripts in the script (or\n"
 "bin as is also commonly used) paths of your Perl distribution."
 msgstr ""
 
-#: gnu/packages/perl.scm:5652
+#: gnu/packages/perl.scm:6509
 msgid "Fork test in Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:5653
+#: gnu/packages/perl.scm:6510
 msgid ""
 "Test::SharedFork is a utility module for Test::Builder.  It\n"
 "makes fork(2) safe to use in test cases."
 msgstr ""
 
-#: gnu/packages/perl.scm:5669
+#: gnu/packages/perl.scm:6526
 msgid "Basic utilities for writing tests"
 msgstr ""
 
-#: gnu/packages/perl.scm:5671
+#: gnu/packages/perl.scm:6528
 msgid "Test::Simple contains basic utilities for writing tests."
 msgstr ""
 
-#: gnu/packages/perl.scm:5688
+#: gnu/packages/perl.scm:6545
 msgid "Simplify running Test::Builder tests"
 msgstr ""
 
-#: gnu/packages/perl.scm:5690
+#: gnu/packages/perl.scm:6547
 msgid ""
 "Test::Tester allows testing of test modules based on Test::Builder with\n"
 "a minimum of effort."
 msgstr ""
 
-#: gnu/packages/perl.scm:5716
-msgid "Trap exit codes, exceptions, output, etc."
+#: gnu/packages/perl.scm:6573
+msgid "Trap exit codes, exceptions, output, and so on"
 msgstr ""
 
-#: gnu/packages/perl.scm:5717
+#: gnu/packages/perl.scm:6574
 msgid ""
 "This module is primarily (but not exclusively) for use in\n"
 "test scripts: A block eval configurable and extensible but by default trapping\n"
@@ -9248,11 +10803,11 @@ msgid ""
 "from boxed blocks of test code."
 msgstr ""
 
-#: gnu/packages/perl.scm:5737
+#: gnu/packages/perl.scm:6594
 msgid "UTF-8 testing in Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:5738
+#: gnu/packages/perl.scm:6595
 msgid ""
 "This module is a collection of tests useful for dealing with\n"
 "UTF-8 strings in Perl.  This module has two types of tests: The validity tests\n"
@@ -9260,21 +10815,21 @@ msgid ""
 "will check that string has a given set of characteristics."
 msgstr ""
 
-#: gnu/packages/perl.scm:5760
+#: gnu/packages/perl.scm:6617
 msgid "Perl extension to test methods for warnings"
 msgstr ""
 
-#: gnu/packages/perl.scm:5761
+#: gnu/packages/perl.scm:6618
 msgid ""
 "This module provides a few convenience methods for testing\n"
 "warning based code."
 msgstr ""
 
-#: gnu/packages/perl.scm:5779
+#: gnu/packages/perl.scm:6636
 msgid "Test for warnings and the lack of them"
 msgstr ""
 
-#: gnu/packages/perl.scm:5780
+#: gnu/packages/perl.scm:6637
 msgid ""
 "This module is intended to be used as a drop-in replacement\n"
 "for Test::NoWarnings.  It also adds an extra test, but runs this test before\n"
@@ -9283,11 +10838,11 @@ msgid ""
 "plan, or not, and things will still Just Work."
 msgstr ""
 
-#: gnu/packages/perl.scm:5801
+#: gnu/packages/perl.scm:6658
 msgid "Test fallback behaviour in absence of modules"
 msgstr ""
 
-#: gnu/packages/perl.scm:5802
+#: gnu/packages/perl.scm:6659
 msgid ""
 "This module allows you to deliberately hide modules from a\n"
 "program even though they are installed.  This is mostly useful for testing\n"
@@ -9295,62 +10850,76 @@ msgid ""
 "installed."
 msgstr ""
 
-#: gnu/packages/perl.scm:5829
+#: gnu/packages/perl.scm:6686
 msgid "Dynamic generation of tests"
 msgstr ""
 
-#: gnu/packages/perl.scm:5830
+#: gnu/packages/perl.scm:6687
 msgid ""
 "The Test::WriteVariants module provides for the dynamic\n"
 "generation of tests in nested combinations of contexts."
 msgstr ""
 
-#: gnu/packages/perl.scm:5850
+#: gnu/packages/perl.scm:6707
 msgid "Testing module for YAML implementations"
 msgstr ""
 
-#: gnu/packages/perl.scm:5851
+#: gnu/packages/perl.scm:6708
 msgid ""
 "Test::YAML is a subclass of Test::Base with YAML specific\n"
 "support."
 msgstr ""
 
-#: gnu/packages/perl.scm:5870
+#: gnu/packages/perl.scm:6727
 msgid "Align text"
 msgstr ""
 
-#: gnu/packages/perl.scm:5871
+#: gnu/packages/perl.scm:6728
 msgid ""
 "Text::Aligner exports a single function, align(), which is\n"
 "used to justify strings to various alignment styles."
 msgstr ""
 
-#: gnu/packages/perl.scm:5889
+#: gnu/packages/perl.scm:6746
 msgid "Extract delimited text sequences from strings"
 msgstr ""
 
-#: gnu/packages/perl.scm:5890
+#: gnu/packages/perl.scm:6747
 msgid ""
 "The Text::Balanced module can be used to extract delimited\n"
 "text sequences from strings."
 msgstr ""
 
-#: gnu/packages/perl.scm:5908
+#: gnu/packages/perl.scm:6765
 msgid "Manipulate comma-separated values"
 msgstr ""
 
-#: gnu/packages/perl.scm:5909
+#: gnu/packages/perl.scm:6766
 msgid ""
 "Text::CSV provides facilities for the composition and\n"
 "decomposition of comma-separated values.  An instance of the Text::CSV class\n"
 "can combine fields into a CSV string and parse a CSV string into fields."
 msgstr ""
 
-#: gnu/packages/perl.scm:5930
+#: gnu/packages/perl.scm:6785
+msgid "Rountines for manipulating CSV files"
+msgstr ""
+
+#: gnu/packages/perl.scm:6786
+msgid ""
+"@code{Text::CSV_XS} provides facilities for the composition\n"
+"and decomposition of comma-separated values.  An instance of the\n"
+"@code{Text::CSV_XS} class will combine fields into a CSV string and parse a\n"
+"CSV string into fields.  The module accepts either strings or files as input\n"
+"and support the use of user-specified characters for delimiters, separators,\n"
+"and escapes."
+msgstr ""
+
+#: gnu/packages/perl.scm:6810
 msgid "Perform diffs on files and record sets"
 msgstr ""
 
-#: gnu/packages/perl.scm:5931
+#: gnu/packages/perl.scm:6811
 msgid ""
 "Text::Diff provides a basic set of services akin to the GNU\n"
 "diff utility.  It is not anywhere near as feature complete as GNU diff, but it\n"
@@ -9359,49 +10928,61 @@ msgid ""
 "generally slower on larger files."
 msgstr ""
 
-#: gnu/packages/perl.scm:5953
+#: gnu/packages/perl.scm:6833
 msgid "Match globbing patterns against text"
 msgstr ""
 
-#: gnu/packages/perl.scm:5954
+#: gnu/packages/perl.scm:6834
 msgid ""
 "Text::Glob implements glob(3) style matching that can be\n"
-"used to match against text, rather than fetching names from a filesystem.  If\n"
+"used to match against text, rather than fetching names from a file system.  If\n"
 "you want to do full file globbing use the File::Glob module instead."
 msgstr ""
 
-#: gnu/packages/perl.scm:5977
+#: gnu/packages/perl.scm:6857
 msgid "Fast, middleweight template engine"
 msgstr ""
 
-#: gnu/packages/perl.scm:5979
+#: gnu/packages/perl.scm:6859
 msgid ""
 "Text::NeatTemplate provides a simple, middleweight but fast\n"
 "template engine, for when you need speed rather than complex features,\n"
 "yet need more features than simple variable substitution."
 msgstr ""
 
-#: gnu/packages/perl.scm:5998
+#: gnu/packages/perl.scm:6878
+msgid "Convert between Roman and Arabic algorisms"
+msgstr ""
+
+#: gnu/packages/perl.scm:6879
+msgid ""
+"This package provides functions to convert between Roman and\n"
+"Arabic algorisms.  It supports both conventional Roman algorisms (which range\n"
+"from 1 to 3999) and Milhar Romans, a variation which uses a bar across the\n"
+"algorism to indicate multiplication by 1000."
+msgstr ""
+
+#: gnu/packages/perl.scm:6899
 msgid "Simple ASCII tables"
 msgstr ""
 
-#: gnu/packages/perl.scm:5999
+#: gnu/packages/perl.scm:6900
 msgid "Text::SimpleTable draws simple ASCII tables."
 msgstr ""
 
-#: gnu/packages/perl.scm:6020
+#: gnu/packages/perl.scm:6921
 msgid "Organize Data in Tables"
 msgstr ""
 
-#: gnu/packages/perl.scm:6021
+#: gnu/packages/perl.scm:6922
 msgid "Text::Table renders plaintext tables."
 msgstr ""
 
-#: gnu/packages/perl.scm:6038
+#: gnu/packages/perl.scm:6939
 msgid "Provide plain ASCII transliterations of Unicode text"
 msgstr ""
 
-#: gnu/packages/perl.scm:6039
+#: gnu/packages/perl.scm:6940
 msgid ""
 "Text::Unidecode provides a function, unidecode(...) that\n"
 "takes Unicode data and tries to represent it in US-ASCII characters (i.e., the\n"
@@ -9411,21 +10992,21 @@ msgid ""
 "system."
 msgstr ""
 
-#: gnu/packages/perl.scm:6067
+#: gnu/packages/perl.scm:6968
 msgid "Role for classes that can be thrown"
 msgstr ""
 
-#: gnu/packages/perl.scm:6068
+#: gnu/packages/perl.scm:6969
 msgid ""
 "Throwable is a role for classes that are meant to be thrown\n"
 "as exceptions to standard program flow."
 msgstr ""
 
-#: gnu/packages/perl.scm:6085
+#: gnu/packages/perl.scm:6986
 msgid "Perl script tidier"
 msgstr ""
 
-#: gnu/packages/perl.scm:6086
+#: gnu/packages/perl.scm:6987
 msgid ""
 "This package contains a Perl script which indents and\n"
 "reformats Perl scripts to make them easier to read.   The formatting can be\n"
@@ -9433,11 +11014,21 @@ msgid ""
 "approximately follow the suggestions in the Perl Style Guide."
 msgstr ""
 
-#: gnu/packages/perl.scm:6107
+#: gnu/packages/perl.scm:7007
+msgid "Cycle through a list of values"
+msgstr ""
+
+#: gnu/packages/perl.scm:7008
+msgid ""
+"You use @code{Tie::Cycle} to go through a list over and over\n"
+"again.  Once you get to the end of the list, you go back to the beginning."
+msgstr ""
+
+#: gnu/packages/perl.scm:7027
 msgid "Ordered associative arrays for Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:6108
+#: gnu/packages/perl.scm:7028
 msgid ""
 "This Perl module implements Perl hashes that preserve the\n"
 "order in which the hash elements were added.  The order is not affected when\n"
@@ -9446,42 +11037,42 @@ msgid ""
 "operations can also be performed on the IxHash."
 msgstr ""
 
-#: gnu/packages/perl.scm:6131
+#: gnu/packages/perl.scm:7051
 msgid "Tie to an existing Perl object"
 msgstr ""
 
-#: gnu/packages/perl.scm:6132
+#: gnu/packages/perl.scm:7052
 msgid ""
 "This class provides a tie constructor that returns the\n"
 "object it was given as it's first argument.  This way side effects of calling\n"
 "$object->TIEHASH are avoided."
 msgstr ""
 
-#: gnu/packages/perl.scm:6154
+#: gnu/packages/perl.scm:7074
 msgid "English expression of durations"
 msgstr ""
 
-#: gnu/packages/perl.scm:6155
+#: gnu/packages/perl.scm:7075
 msgid ""
 "This module provides functions for expressing durations in\n"
 "rounded or exact terms."
 msgstr ""
 
-#: gnu/packages/perl.scm:6177
+#: gnu/packages/perl.scm:7097
 msgid "Parse time duration strings"
 msgstr ""
 
-#: gnu/packages/perl.scm:6178
+#: gnu/packages/perl.scm:7098
 msgid ""
 "Time::Duration::Parse is a module to parse human readable\n"
 "duration strings like \"2 minutes\" and \"3 seconds\" to seconds."
 msgstr ""
 
-#: gnu/packages/perl.scm:6196
+#: gnu/packages/perl.scm:7116
 msgid "Efficiently compute time from local and GMT time"
 msgstr ""
 
-#: gnu/packages/perl.scm:6197
+#: gnu/packages/perl.scm:7117
 msgid ""
 "This module provides functions that are the inverse of\n"
 "built-in perl functions localtime() and gmtime().  They accept a date as a\n"
@@ -9489,103 +11080,133 @@ msgid ""
 "the system epoch."
 msgstr ""
 
-#: gnu/packages/perl.scm:6217
+#: gnu/packages/perl.scm:7137
 msgid "Date parsing/formatting subroutines"
 msgstr ""
 
-#: gnu/packages/perl.scm:6218
+#: gnu/packages/perl.scm:7138
 msgid ""
 "This module provides routines for parsing date string into\n"
 "time values and formatting dates into ASCII strings."
 msgstr ""
 
-#: gnu/packages/perl.scm:6240
+#: gnu/packages/perl.scm:7160
 msgid "Shift and scale time"
 msgstr ""
 
-#: gnu/packages/perl.scm:6241
+#: gnu/packages/perl.scm:7161
 msgid ""
 "This module allows you to speed up your sleep(), alarm(),\n"
 "and time() calls."
 msgstr ""
 
-#: gnu/packages/perl.scm:6264
+#: gnu/packages/perl.scm:7184
 msgid "Simple tree object"
 msgstr ""
 
-#: gnu/packages/perl.scm:6265
+#: gnu/packages/perl.scm:7185
 msgid ""
 "This module in a fully object-oriented implementation of a\n"
 "simple n-ary tree."
 msgstr ""
 
-#: gnu/packages/perl.scm:6289
+#: gnu/packages/perl.scm:7209
 msgid "Factory object for dispensing Visitor objects"
 msgstr ""
 
-#: gnu/packages/perl.scm:6290
+#: gnu/packages/perl.scm:7210
 msgid ""
 "This module is a factory for dispensing\n"
 "Tree::Simple::Visitor::* objects."
 msgstr ""
 
-#: gnu/packages/perl.scm:6308
+#: gnu/packages/perl.scm:7228
 msgid "Minimal try/catch with proper preservation of $@"
 msgstr ""
 
-#: gnu/packages/perl.scm:6309
+#: gnu/packages/perl.scm:7229
 msgid ""
 "This module provides bare bones try/catch/finally statements\n"
 "that are designed to minimize common mistakes with eval blocks, and nothing\n"
 "else."
 msgstr ""
 
-#: gnu/packages/perl.scm:6330
+#: gnu/packages/perl.scm:7250
 msgid "Data types for common serialisation formats"
 msgstr ""
 
-#: gnu/packages/perl.scm:6331
+#: gnu/packages/perl.scm:7251
 msgid ""
 "This module provides some extra datatypes that are used by\n"
 "common serialisation formats such as JSON or CBOR."
 msgstr ""
 
-#: gnu/packages/perl.scm:6350
+#: gnu/packages/perl.scm:7269
+msgid "Unicode normalization forms"
+msgstr ""
+
+#: gnu/packages/perl.scm:7270
+msgid "This Perl module provides Unicode normalization forms."
+msgstr ""
+
+#: gnu/packages/perl.scm:7289
+msgid "Unicode collation algorithm"
+msgstr ""
+
+#: gnu/packages/perl.scm:7290
+msgid ""
+"This package provides tools for sorting and comparing\n"
+"Unicode data."
+msgstr ""
+"Denne pakke tilbyder værktøjer for sortering og sammenligning\n"
+"af Uniocodedata."
+
+#: gnu/packages/perl.scm:7311
 msgid "Unicode line breaking algorithm"
 msgstr ""
 
-#: gnu/packages/perl.scm:6352
+#: gnu/packages/perl.scm:7313
 msgid ""
 "@code{Unicode::LineBreak} implements the line breaking algorithm\n"
 "described in Unicode Standard Annex #14.  The @code{East_Asian_Width} property\n"
 "defined by Annex #11 is used to determine breaking positions."
 msgstr ""
 
-#: gnu/packages/perl.scm:6371
+#: gnu/packages/perl.scm:7336
+msgid "Encoding and decoding of UTF-8 encoding form"
+msgstr ""
+
+#: gnu/packages/perl.scm:7338
+msgid ""
+"This module provides functions to encode and decode UTF-8 encoding form\n"
+"as specified by Unicode and ISO/IEC 10646:2011."
+msgstr ""
+
+#: gnu/packages/perl.scm:7356
 msgid "UNIVERSAL::can() reimplementation"
 msgstr ""
 
-#: gnu/packages/perl.scm:6372
+#: gnu/packages/perl.scm:7357
 msgid ""
 "This module attempts to work around people calling\n"
 "UNIVERSAL::can() as a function, which it is not."
 msgstr ""
 
-#: gnu/packages/perl.scm:6392
+#: gnu/packages/perl.scm:7377
 msgid "UNIVERSAL::isa() reimplementation"
 msgstr ""
 
-#: gnu/packages/perl.scm:6393
+#: gnu/packages/perl.scm:7378
 msgid ""
 "This module attempts to recover from people calling\n"
 "UNIVERSAL::isa as a function."
 msgstr ""
 
-#: gnu/packages/perl.scm:6411
+#: gnu/packages/perl.scm:7396
 msgid "Associate user-defined magic to variables from Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:6412
+#: gnu/packages/perl.scm:7397
 msgid ""
 "Magic is Perl's way of enhancing variables.  This mechanism\n"
 "lets the user add extra data to any variable and hook syntactical\n"
@@ -9594,32 +11215,56 @@ msgid ""
 "having to write a single line of XS."
 msgstr ""
 
-#: gnu/packages/perl.scm:6435
+#: gnu/packages/perl.scm:7420
+msgid "Easily generate well-formed, namespace-aware XML"
+msgstr ""
+
+#: gnu/packages/perl.scm:7421
+msgid ""
+"@code{XML::Writer} is a simple Perl module for writing XML\n"
+"documents: it takes care of constructing markup and escaping data correctly.\n"
+"By default, it also performs a significant amount of well-formedness checking\n"
+"on the output to make certain (for example) that start and end tags match,\n"
+"that there is exactly one document element, and that there are not duplicate\n"
+"attribute names."
+msgstr ""
+
+#: gnu/packages/perl.scm:7447
 msgid "YAML for Perl"
 msgstr ""
 
-#: gnu/packages/perl.scm:6436
+#: gnu/packages/perl.scm:7448
 msgid ""
 "The YAML.pm module implements a YAML Loader and Dumper based\n"
 "on the YAML 1.0 specification."
 msgstr ""
 
-#: gnu/packages/perl.scm:6459
+#: gnu/packages/perl.scm:7471
 msgid "Read/Write YAML files"
 msgstr ""
 
-#: gnu/packages/perl.scm:6460
+#: gnu/packages/perl.scm:7472
 msgid ""
 "YAML::Tiny is a perl class for reading and writing\n"
 "YAML-style files, written with as little code as possible, reducing load time\n"
 "and memory overhead."
 msgstr ""
 
-#: gnu/packages/perl.scm:6487
+#: gnu/packages/perl.scm:7493
+msgid "Generate and use LALR parsers"
+msgstr ""
+
+#: gnu/packages/perl.scm:7494
+msgid ""
+"This package compiles yacc-like @dfn{Look Ahead LR} (LALR)\n"
+"grammars to generate Perl object oriented parser modules."
+msgstr ""
+
+#: gnu/packages/perl.scm:7520
 msgid "Distribution metadata for a CPAN dist"
 msgstr ""
 
-#: gnu/packages/perl.scm:6488
+#: gnu/packages/perl.scm:7521
 msgid ""
 "Software distributions released to the CPAN include a\n"
 "META.json or, for older distributions, META.yml, which describes the\n"
@@ -9630,11 +11275,11 @@ msgid ""
 "methods for interrogating that data."
 msgstr ""
 
-#: gnu/packages/perl.scm:6511
+#: gnu/packages/perl.scm:7544
 msgid "Set of version requirements for a CPAN dist"
 msgstr ""
 
-#: gnu/packages/perl.scm:6512
+#: gnu/packages/perl.scm:7545
 msgid ""
 "A CPAN::Meta::Requirements object models a set of version\n"
 "constraints like those specified in the META.yml or META.json files in CPAN\n"
@@ -9643,22 +11288,22 @@ msgid ""
 "representation."
 msgstr ""
 
-#: gnu/packages/perl.scm:6535
+#: gnu/packages/perl.scm:7568
 msgid "Read and write a subset of YAML for CPAN Meta files"
 msgstr ""
 
-#: gnu/packages/perl.scm:6536
+#: gnu/packages/perl.scm:7569
 msgid ""
 "This module implements a subset of the YAML specification\n"
 "for use in reading and writing CPAN metadata files like META.yml and\n"
 "MYMETA.yml."
 msgstr ""
 
-#: gnu/packages/perl.scm:6557
+#: gnu/packages/perl.scm:7590
 msgid "Build and install Perl modules"
 msgstr ""
 
-#: gnu/packages/perl.scm:6558
+#: gnu/packages/perl.scm:7591
 msgid ""
 "@code{Module::Build} is a system for building, testing, and\n"
 "installing Perl modules; it used to be part of Perl itself until version 5.22,\n"
@@ -9669,21 +11314,21 @@ msgid ""
 "system---most of the @code{Module::Build} code is pure-Perl."
 msgstr ""
 
-#: gnu/packages/perl.scm:6583
+#: gnu/packages/perl.scm:7616
 msgid "Parse META.yml and META.json CPAN metadata files"
 msgstr ""
 
-#: gnu/packages/perl.scm:6584
+#: gnu/packages/perl.scm:7617
 msgid ""
 "Parse::CPAN::Meta is a parser for META.json and META.yml\n"
 "files, using JSON::PP and/or CPAN::Meta::YAML."
 msgstr ""
 
-#: gnu/packages/perl.scm:6602
+#: gnu/packages/perl.scm:7635
 msgid "Common Scalar and List utility subroutines"
 msgstr ""
 
-#: gnu/packages/perl.scm:6603
+#: gnu/packages/perl.scm:7636
 msgid ""
 "This package contains a selection of subroutines that people\n"
 "have expressed would be nice to have in the perl core, but the usage would not\n"
@@ -9691,14 +11336,44 @@ msgid ""
 "such that being individual extensions would be wasteful."
 msgstr ""
 
-#: gnu/packages/perl.scm:6627
+#: gnu/packages/perl.scm:7660
 msgid "Cross-platform functions emulating common shell commands"
 msgstr ""
 
-#: gnu/packages/perl.scm:6629
+#: gnu/packages/perl.scm:7662
 msgid "Shell::Command is a thin wrapper around ExtUtils::Command."
 msgstr ""
 
+#: gnu/packages/perl.scm:7689
+msgid "Object-oriented File::Find replacement in Perl"
+msgstr ""
+
+#: gnu/packages/perl.scm:7690
+msgid ""
+"File::Find::Object is an object-oriented\n"
+"File::Find replacement in Perl."
+msgstr ""
+
+#: gnu/packages/perl.scm:7719
+msgid "Alternative interface to File::Find::Object"
+msgstr ""
+
+#: gnu/packages/perl.scm:7720
+msgid ""
+"File::Find::Object::Rule is an alternative Perl\n"
+"interface to File::Find::Object."
+msgstr ""
+
+#: gnu/packages/perl.scm:7750
+msgid "Test for trailing space in Perl source files"
+msgstr ""
+
+#: gnu/packages/perl.scm:7751
+msgid ""
+"Test::TrailingSpace tests for trailing spaces\n"
+"in Perl source files."
+msgstr ""
+
 #: gnu/packages/photo.scm:64
 msgid "Raw image decoder"
 msgstr ""
@@ -9719,65 +11394,65 @@ msgid ""
 "data as produced by digital cameras."
 msgstr ""
 
-#: gnu/packages/photo.scm:110
+#: gnu/packages/photo.scm:111
 msgid "Accessing digital cameras"
 msgstr ""
 
-#: gnu/packages/photo.scm:112
+#: gnu/packages/photo.scm:113
 msgid ""
 "This is the library backend for gphoto2.  It contains the code for PTP,\n"
 "MTP, and other vendor specific protocols for controlling and transferring data\n"
 "from digital cameras."
 msgstr ""
 
-#: gnu/packages/photo.scm:153
+#: gnu/packages/photo.scm:154
 msgid "Command-line tools to access digital cameras"
 msgstr ""
 
-#: gnu/packages/photo.scm:155
+#: gnu/packages/photo.scm:156
 msgid ""
 "Gphoto2 is a set of command line utilities for manipulating a large\n"
 "number of different digital cameras.  Through libgphoto2, it supports PTP,\n"
 "MTP, and much more."
 msgstr ""
 
-#: gnu/packages/photo.scm:188
+#: gnu/packages/photo.scm:189
 msgid "Program and Perl library to manipulate EXIF tags"
 msgstr ""
 
-#: gnu/packages/photo.scm:190
+#: gnu/packages/photo.scm:191
 msgid ""
 "This package provides the 'exiftool' command and the 'Image::ExifTool'\n"
 "Perl library to manipulate EXIF tags of digital images."
 msgstr ""
 
-#: gnu/packages/photo.scm:213
+#: gnu/packages/photo.scm:214
 msgid "Library for panoramic images"
 msgstr ""
 
-#: gnu/packages/photo.scm:215
+#: gnu/packages/photo.scm:216
 msgid ""
 "The libpano13 package contains the backend library written by the\n"
 "Panorama Tools project for building panoramic images from a set of\n"
 "overlapping images, as well as some command line tools."
 msgstr ""
 
-#: gnu/packages/photo.scm:259
+#: gnu/packages/photo.scm:260
 msgid "Tools for combining and blending images"
 msgstr ""
 
-#: gnu/packages/photo.scm:261
+#: gnu/packages/photo.scm:262
 msgid ""
 "Enblend blends away the seams in a panoramic image mosaic using a\n"
 "multi-resolution spline.  Enfuse merges different exposures of the same\n"
 "scene to produce an image that looks much like a tone-mapped image."
 msgstr ""
 
-#: gnu/packages/qemu.scm:145
+#: gnu/packages/qemu.scm:162
 msgid "Machine emulator and virtualizer"
 msgstr ""
 
-#: gnu/packages/qemu.scm:147
+#: gnu/packages/qemu.scm:164
 msgid ""
 "QEMU is a generic machine emulator and virtualizer.\n"
 "\n"
@@ -9792,10 +11467,77 @@ msgid ""
 "server and embedded PowerPC, and S390 guests."
 msgstr ""
 
-#: gnu/packages/qemu.scm:169
+#: gnu/packages/qemu.scm:186
 msgid "Machine emulator and virtualizer (without GUI)"
 msgstr ""
 
+#: gnu/packages/qemu.scm:245
+msgid "Operating system information database"
+msgstr ""
+
+#: gnu/packages/qemu.scm:246
+msgid ""
+"libosinfo is a GObject based library API for managing\n"
+"information about operating systems, hypervisors and the (virtual) hardware\n"
+"devices they can support.  It includes a database containing device metadata\n"
+"and provides APIs to match/identify optimal devices for deploying an operating\n"
+"system on a hypervisor.  Via GObject Introspection, the API is available in\n"
+"all common programming languages.  Vala bindings are also provided."
+msgstr ""
+
+#: gnu/packages/qemu.scm:320
+msgid "Simple API for virtualization"
+msgstr ""
+
+#: gnu/packages/qemu.scm:321
+msgid ""
+"Libvirt is a C toolkit to interact with the virtualization\n"
+"capabilities of recent versions of Linux.  The library aims at providing long\n"
+"term stable C API initially for the Xen paravirtualization but should be able\n"
+"to integrate other virtualization mechanisms if needed."
+msgstr ""
+
+#: gnu/packages/qemu.scm:362
+msgid "GLib wrapper around libvirt"
+msgstr ""
+
+#: gnu/packages/qemu.scm:363
+msgid ""
+"libvirt-glib wraps the libvirt library to provide a\n"
+"high-level object-oriented API better suited for glib-based applications, via\n"
+"three libraries:\n"
+"\n"
+"@enumerate\n"
+"@item libvirt-glib - GLib main loop integration & misc helper APIs\n"
+"@item libvirt-gconfig - GObjects for manipulating libvirt XML documents\n"
+"@item libvirt-gobject - GObjects for managing libvirt objects\n"
+"@end enumerate\n"
+msgstr ""
+
+#: gnu/packages/qemu.scm:404
+msgid "Python bindings to libvirt"
+msgstr "Pythonbindinger for libvirt"
+
+#: gnu/packages/qemu.scm:405
+msgid ""
+"This package provides Python bindings to the libvirt\n"
+"virtualization library."
+msgstr ""
+"Denne pakke tilbyder Pythonbindinger til virtualiseringsbiblioteket\n"
+"libvirt."
+
+#: gnu/packages/qemu.scm:481
+msgid "Manage virtual machines"
+msgstr "Håndter virtuelle maskiner"
+
+#: gnu/packages/qemu.scm:483
+msgid ""
+"The virt-manager application is a desktop user interface for managing\n"
+"virtual machines through libvirt.  It primarily targets KVM VMs, but also\n"
+"manages Xen and LXC (Linux containers).  It presents a summary view of running\n"
+"domains, their live performance and resource utilization statistics."
+msgstr ""
+
 #: gnu/packages/ratpoison.scm:85
 msgid "Simple mouse-free tiling window manager"
 msgstr ""
@@ -9816,11 +11558,11 @@ msgid ""
 "cripples Emacs and other quality pieces of software."
 msgstr ""
 
-#: gnu/packages/readline.scm:70
+#: gnu/packages/readline.scm:82
 msgid "Edit command lines while typing, with history support"
 msgstr ""
 
-#: gnu/packages/readline.scm:72
+#: gnu/packages/readline.scm:84
 msgid ""
 "The GNU readline library allows users to edit command lines as they\n"
 "are typed in.  It can maintain a searchable history of previously entered\n"
@@ -9829,11 +11571,11 @@ msgid ""
 "comfortable for anyone."
 msgstr ""
 
-#: gnu/packages/readline.scm:107
+#: gnu/packages/readline.scm:121
 msgid "Wrapper to allow the editing of keyboard commands"
 msgstr ""
 
-#: gnu/packages/readline.scm:109
+#: gnu/packages/readline.scm:123
 msgid ""
 "Rlwrap is a 'readline wrapper', a small utility that uses the GNU\n"
 "readline library to allow the editing of keyboard input for any command.  You\n"
@@ -9842,11 +11584,23 @@ msgid ""
 "'special effects' using the filter mechanism."
 msgstr ""
 
-#: gnu/packages/scanner.scm:70
-msgid "Raster image scanner library and drivers"
+#: gnu/packages/scanner.scm:84
+msgid "Raster image scanner library and drivers, without scanner support"
 msgstr ""
 
-#: gnu/packages/scanner.scm:71
+#: gnu/packages/scanner.scm:85
+msgid ""
+"SANE stands for \"Scanner Access Now Easy\" and is an API\n"
+"proving access to any raster image scanner hardware (flatbed scanner,\n"
+"hand-held scanner, video- and still-cameras, frame-grabbers, etc.).  The\n"
+"package contains the library, but no drivers."
+msgstr ""
+
+#: gnu/packages/scanner.scm:123
+msgid "Raster image scanner library and drivers, with scanner support"
+msgstr ""
+
+#: gnu/packages/scanner.scm:124
 msgid ""
 "SANE stands for \"Scanner Access Now Easy\" and is an API\n"
 "proving access to any raster image scanner hardware (flatbed scanner,\n"
@@ -9854,22 +11608,22 @@ msgid ""
 "package contains the library and drivers."
 msgstr ""
 
-#: gnu/packages/scheme.scm:178
+#: gnu/packages/scheme.scm:185
 msgid "A Scheme implementation with integrated editor and debugger"
 msgstr ""
 
-#: gnu/packages/scheme.scm:180
+#: gnu/packages/scheme.scm:187
 msgid ""
 "GNU/MIT Scheme is an implementation of the Scheme programming\n"
 "language.  It provides an interpreter, a compiler and a debugger.  It also\n"
 "features an integrated Emacs-like editor and a large runtime library."
 msgstr ""
 
-#: gnu/packages/scheme.scm:264
+#: gnu/packages/scheme.scm:270
 msgid "Efficient Scheme compiler"
 msgstr ""
 
-#: gnu/packages/scheme.scm:266
+#: gnu/packages/scheme.scm:272
 msgid ""
 "Bigloo is a Scheme implementation devoted to one goal: enabling\n"
 "Scheme based programming style where C(++) is usually\n"
@@ -9881,11 +11635,11 @@ msgid ""
 "Scheme and C programs and between Scheme and Java programs."
 msgstr ""
 
-#: gnu/packages/scheme.scm:310
+#: gnu/packages/scheme.scm:314
 msgid "Multi-tier programming language for the Web 2.0"
 msgstr ""
 
-#: gnu/packages/scheme.scm:312
+#: gnu/packages/scheme.scm:316
 msgid ""
 "HOP is a multi-tier programming language for the Web 2.0 and the\n"
 "so-called diffuse Web.  It is designed for programming interactive web\n"
@@ -9894,33 +11648,33 @@ msgid ""
 "mashups, office (web agendas, mail clients, ...), etc."
 msgstr ""
 
-#: gnu/packages/scheme.scm:366
+#: gnu/packages/scheme.scm:370
 msgid "R5RS Scheme implementation that compiles native code via C"
 msgstr ""
 
-#: gnu/packages/scheme.scm:368
+#: gnu/packages/scheme.scm:372
 msgid ""
 "CHICKEN is a compiler for the Scheme programming language.  CHICKEN\n"
 "produces portable and efficient C, supports almost all of the R5RS Scheme\n"
 "language standard, and includes many enhancements and extensions."
 msgstr ""
 
-#: gnu/packages/scheme.scm:387
+#: gnu/packages/scheme.scm:391
 msgid "Scheme implementation using a bytecode interpreter"
 msgstr ""
 
-#: gnu/packages/scheme.scm:389
+#: gnu/packages/scheme.scm:393
 msgid ""
 "Scheme 48 is an implementation of Scheme based on a byte-code\n"
 "interpreter and is designed to be used as a testbed for experiments in\n"
 "implementation techniques and as an expository tool."
 msgstr ""
 
-#: gnu/packages/scheme.scm:502
+#: gnu/packages/scheme.scm:506
 msgid "Implementation of Scheme and related languages"
 msgstr ""
 
-#: gnu/packages/scheme.scm:504
+#: gnu/packages/scheme.scm:508
 msgid ""
 "Racket is an implementation of the Scheme programming language (R5RS and\n"
 "R6RS) and related languages, such as Typed Racket.  It features a compiler and\n"
@@ -9928,11 +11682,11 @@ msgid ""
 "of libraries."
 msgstr ""
 
-#: gnu/packages/scheme.scm:542
+#: gnu/packages/scheme.scm:546
 msgid "Efficient Scheme interpreter and compiler"
 msgstr ""
 
-#: gnu/packages/scheme.scm:544
+#: gnu/packages/scheme.scm:548
 msgid ""
 "Gambit consists of two main programs: gsi, the Gambit Scheme\n"
 "interpreter, and gsc, the Gambit Scheme compiler.  The interpreter contains\n"
@@ -9943,11 +11697,11 @@ msgid ""
 "mixed."
 msgstr ""
 
-#: gnu/packages/scheme.scm:581
+#: gnu/packages/scheme.scm:582
 msgid "Small embeddable Scheme implementation"
 msgstr ""
 
-#: gnu/packages/scheme.scm:583
+#: gnu/packages/scheme.scm:584
 msgid ""
 "Chibi-Scheme is a very small library with no external dependencies\n"
 "intended for use as an extension and scripting language in C programs.  In\n"
@@ -9956,11 +11710,11 @@ msgid ""
 "threads."
 msgstr ""
 
-#: gnu/packages/scheme.scm:754
+#: gnu/packages/scheme.scm:755
 msgid "Scmutils library for MIT Scheme"
 msgstr ""
 
-#: gnu/packages/scheme.scm:755
+#: gnu/packages/scheme.scm:756
 msgid ""
 "The Scmutils system is an integrated library of\n"
 "procedures, embedded in the programming language Scheme, and intended to\n"
@@ -9968,11 +11722,11 @@ msgid ""
 "engineering."
 msgstr ""
 
-#: gnu/packages/scheme.scm:803
+#: gnu/packages/scheme.scm:804
 msgid "Structure and Interpretation of Computer Programs"
 msgstr ""
 
-#: gnu/packages/scheme.scm:804
+#: gnu/packages/scheme.scm:805
 msgid ""
 "Structure and Interpretation of Computer Programs (SICP) is\n"
 "a textbook aiming to teach the principles of computer programming.\n"
@@ -9982,11 +11736,11 @@ msgid ""
 "metalinguistic abstraction, recursion, interpreters, and modular programming."
 msgstr ""
 
-#: gnu/packages/search.scm:52
+#: gnu/packages/search.scm:63
 msgid "Search Engine Library"
 msgstr ""
 
-#: gnu/packages/search.scm:54
+#: gnu/packages/search.scm:65
 msgid ""
 "Xapian is a highly adaptable toolkit which allows developers to easily\n"
 "add advanced indexing and search facilities to their own applications.  It\n"
@@ -9994,11 +11748,11 @@ msgid ""
 "rich set of boolean query operators."
 msgstr ""
 
-#: gnu/packages/search.scm:97
+#: gnu/packages/search.scm:108
 msgid "Tool for Obsessive Compulsive Classifiers"
 msgstr ""
 
-#: gnu/packages/search.scm:99
+#: gnu/packages/search.scm:110
 msgid ""
 "libtocc is the engine of the Tocc project, a tag-based file management\n"
 "system.  The goal of Tocc is to provide a better system for classifying files\n"
@@ -10006,21 +11760,21 @@ msgid ""
 "files and directories."
 msgstr ""
 
-#: gnu/packages/search.scm:121
+#: gnu/packages/search.scm:132
 msgid "Command-line interface to libtocc"
 msgstr "Kommandolinjegrænseflade til libtocc"
 
-#: gnu/packages/search.scm:123
+#: gnu/packages/search.scm:134
 msgid ""
 "Tocc is a tag-based file management system.  This package contains the\n"
 "command line tool for interacting with libtocc."
 msgstr ""
 
-#: gnu/packages/search.scm:141
+#: gnu/packages/search.scm:152
 msgid "Finding text and HTML files that match boolean expressions"
 msgstr "Find tekst- og HTML-filer som matcher booleske udtryk"
 
-#: gnu/packages/search.scm:143
+#: gnu/packages/search.scm:154
 msgid ""
 "GNU Bool is a utility to perform text searches on files using Boolean\n"
 "expressions.  For example, a search for \"hello AND world\" would return a\n"
@@ -10031,6 +11785,31 @@ msgid ""
 "for parsing HTML files."
 msgstr ""
 
+#: gnu/packages/search.scm:176
+msgid "Locate files on the file system"
+msgstr "Lokaliser filer på filsystemet"
+
+#: gnu/packages/search.scm:178
+msgid ""
+"mlocate is a locate/updatedb implementation.  The 'm' stands for\n"
+"\"merging\": @code{updatedb} reuses the existing database to avoid rereading\n"
+"most of the file system, which makes it faster and does not trash the system\n"
+"caches as much.  The locate(1) utility is intended to be completely compatible\n"
+"with slocate, and attempts to be compatible to GNU locate when it does not\n"
+"conflict with slocate compatibility."
+msgstr ""
+
+#: gnu/packages/search.scm:240
+msgid "Web indexing system"
+msgstr ""
+
+#: gnu/packages/search.scm:242
+msgid ""
+"Swish-e is Simple Web Indexing System for Humans - Enhanced.  Swish-e\n"
+"can quickly and easily index directories of files or remote web sites and\n"
+"search the generated indexes."
+msgstr ""
+
 #: gnu/packages/serveez.scm:51
 msgid "Framework for implementing IP-based servers"
 msgstr "Ramme for implementering af IP-baserede servere"
@@ -10046,11 +11825,88 @@ msgid ""
 "server and an IRC server."
 msgstr ""
 
-#: gnu/packages/telephony.scm:54
+#: gnu/packages/shells.scm:70
+msgid "POSIX-compliant shell optimised for size"
+msgstr ""
+
+#: gnu/packages/shells.scm:72
+msgid ""
+"dash is a POSIX-compliant @command{/bin/sh} implementation that aims to be\n"
+"as small as possible, often without sacrificing speed.  It is faster than the\n"
+"GNU Bourne-Again Shell (@command{bash}) at most scripted tasks.  dash is a\n"
+"direct descendant of NetBSD's Almquist Shell (@command{ash})."
+msgstr ""
+
+#: gnu/packages/shells.scm:116
+msgid "The friendly interactive shell"
+msgstr ""
+
+#: gnu/packages/shells.scm:118
+msgid ""
+"Fish (friendly interactive shell) is a shell focused on interactive use,\n"
+"discoverability, and friendliness.  Fish has very user-friendly and powerful\n"
+"tab-completion, including descriptions of every completion, completion of\n"
+"strings with wildcards, and many completions for specific commands.  It also\n"
+"has extensive and discoverable help.  A special help command gives access to\n"
+"all the fish documentation in your web browser.  Other features include smart\n"
+"terminal handling based on terminfo, an easy to search history, and syntax\n"
+"highlighting."
+msgstr ""
+
+#: gnu/packages/shells.scm:167
+msgid "Alternative implementation of the rc shell by Byron Rakitzis"
+msgstr ""
+
+#: gnu/packages/shells.scm:169
+msgid ""
+"This is a reimplementation by Byron Rakitzis of the Plan 9 shell.  It\n"
+"has a small feature set similar to a traditional Bourne shell."
+msgstr ""
+
+#: gnu/packages/shells.scm:226
+msgid "Unix shell based on csh"
+msgstr ""
+
+#: gnu/packages/shells.scm:228
+msgid ""
+"Tcsh is an enhanced, but completely compatible version of the Berkeley\n"
+"UNIX C shell (csh).  It is a command language interpreter usable both as an\n"
+"interactive login shell and a shell script command processor.  It includes a\n"
+"command-line editor, programmable word completion, spelling correction, a\n"
+"history mechanism, job control and a C-like syntax."
+msgstr ""
+
+#: gnu/packages/shells.scm:286
+msgid "Powerful shell for interactive use and scripting"
+msgstr "Funktionsrig skal for interaktiv brug og skriptopbygning"
+
+#: gnu/packages/shells.scm:287
+msgid ""
+"The Z shell (zsh) is a Unix shell that can be used\n"
+"as an interactive login shell and as a powerful command interpreter\n"
+"for shell scripting.  Zsh can be thought of as an extended Bourne shell\n"
+"with a large number of improvements, including some features of bash,\n"
+"ksh, and tcsh."
+msgstr ""
+
+#: gnu/packages/shells.scm:326
+msgid "Python-ish shell"
+msgstr ""
+
+#: gnu/packages/shells.scm:328
+msgid ""
+"Xonsh is a Python-ish, BASHwards-looking shell language and command\n"
+"prompt. The language is a superset of Python 3.4+ with additional shell\n"
+"primitives that you are used to from Bash and IPython. It works on all major\n"
+"systems including Linux, Mac OSX, and Windows. Xonsh is meant for the daily\n"
+"use of experts and novices alike."
+msgstr ""
+
+#: gnu/packages/telephony.scm:66
 msgid "(u)Common C++ framework for threaded applications"
 msgstr "(u)Common C++-ramme for trådede programmer"
 
-#: gnu/packages/telephony.scm:55
+#: gnu/packages/telephony.scm:67
 msgid ""
 "GNU Common C++ is an portable, optimized class framework for\n"
 "threaded applications, supporting concurrent synchronization, inter-process\n"
@@ -10059,11 +11915,11 @@ msgid ""
 "reimplementation."
 msgstr ""
 
-#: gnu/packages/telephony.scm:75
+#: gnu/packages/telephony.scm:87
 msgid "Common C++ framework for threaded applications"
 msgstr ""
 
-#: gnu/packages/telephony.scm:76
+#: gnu/packages/telephony.scm:88
 msgid ""
 "GNU uCommon C++ is meant as a very light-weight C++ library\n"
 "to facilitate using C++ design patterns even for very deeply embedded\n"
@@ -10071,11 +11927,11 @@ msgid ""
 "support."
 msgstr ""
 
-#: gnu/packages/telephony.scm:98
+#: gnu/packages/telephony.scm:110
 msgid "Implementation of RTP (real-time transport protocol)"
 msgstr ""
 
-#: gnu/packages/telephony.scm:99
+#: gnu/packages/telephony.scm:111
 msgid ""
 "GNU ccRTP is an implementation of RTP, the real-time transport\n"
 "protocol from the IETF.  It is suitable both for high capacity servers and\n"
@@ -10084,22 +11940,22 @@ msgid ""
 "packet-manipulation library."
 msgstr ""
 
-#: gnu/packages/telephony.scm:119
+#: gnu/packages/telephony.scm:131
 msgid "Library implementing SIP (RFC-3261)"
 msgstr ""
 
-#: gnu/packages/telephony.scm:120
+#: gnu/packages/telephony.scm:132
 msgid ""
 "GNU oSIP is an implementation of the SIP protocol.  It is\n"
 "used to provide multimedia and telecom software developers with an interface\n"
 "to initiate and control SIP sessions."
 msgstr ""
 
-#: gnu/packages/telephony.scm:140
+#: gnu/packages/telephony.scm:151
 msgid "Sip abstraction library"
 msgstr ""
 
-#: gnu/packages/telephony.scm:141
+#: gnu/packages/telephony.scm:152
 msgid ""
 "EXosip is a library that hides the complexity of using the\n"
 "SIP protocol for multimedia session establishment.  This protocol is mainly to\n"
@@ -10108,11 +11964,11 @@ msgid ""
 "multiplayer games."
 msgstr ""
 
-#: gnu/packages/telephony.scm:184
+#: gnu/packages/telephony.scm:195
 msgid "Secure peer-to-peer VoIP server for the SIP protocol"
 msgstr ""
 
-#: gnu/packages/telephony.scm:185
+#: gnu/packages/telephony.scm:196
 msgid ""
 "GNU SIP Witch is a peer-to-peer Voice-over-IP server that\n"
 "uses the SIP protocol.  Calls can be made from behind NAT firewalls and\n"
@@ -10122,32 +11978,55 @@ msgid ""
 "internet."
 msgstr ""
 
-#: gnu/packages/telephony.scm:210
+#: gnu/packages/telephony.scm:240
 msgid "Secure RTP (SRTP) Reference Implementation"
 msgstr ""
 
-#: gnu/packages/telephony.scm:211
+#: gnu/packages/telephony.scm:241
 msgid ""
 "This package provides an implementation of the Secure\n"
 "Real-time Transport Protocol (SRTP), the Universal Security Transform (UST),\n"
 "and a supporting cryptographic kernel."
 msgstr ""
 
-#: gnu/packages/telephony.scm:246
+#: gnu/packages/telephony.scm:276
 msgid "Inter-Asterisk-Protocol library"
 msgstr ""
 
-#: gnu/packages/telephony.scm:247
+#: gnu/packages/telephony.scm:277
 msgid ""
 "LibIAX2 implements the Inter-Asterisk-Protocol for relaying\n"
 "Voice-over-IP (VoIP) communications."
 msgstr ""
 
-#: gnu/packages/tex.scm:161 gnu/packages/tex.scm:225 gnu/packages/tex.scm:283
+#: gnu/packages/telephony.scm:308
+msgid "Simple VoIP program to create conferences from the terminal"
+msgstr ""
+
+#: gnu/packages/telephony.scm:310
+msgid ""
+"Seren is a simple VoIP program based on the Opus codec that allows you\n"
+"to create a voice conference from the terminal, with up to 10 participants,\n"
+"without having to register accounts, exchange emails, or add people to contact\n"
+"lists.  All you need to join an existing conference is the host name or IP\n"
+"address of one of the participants."
+msgstr ""
+
+#: gnu/packages/telephony.scm:413
+msgid "Low-latency, high quality voice chat software"
+msgstr ""
+
+#: gnu/packages/telephony.scm:415
+msgid ""
+"Mumble is an low-latency, high quality voice chat\n"
+"software primarily intended for use while gaming."
+msgstr ""
+
+#: gnu/packages/tex.scm:169 gnu/packages/tex.scm:241 gnu/packages/tex.scm:303
 msgid "TeX Live, a package of the TeX typesetting system"
 msgstr ""
 
-#: gnu/packages/tex.scm:163
+#: gnu/packages/tex.scm:171
 msgid ""
 "TeX Live provides a comprehensive TeX document production system.\n"
 "It includes all the major TeX-related programs, macro packages, and fonts\n"
@@ -10157,7 +12036,7 @@ msgid ""
 "This package contains the binaries."
 msgstr ""
 
-#: gnu/packages/tex.scm:227
+#: gnu/packages/tex.scm:243
 msgid ""
 "TeX Live provides a comprehensive TeX document production system.\n"
 "It includes all the major TeX-related programs, macro packages, and fonts\n"
@@ -10167,7 +12046,7 @@ msgid ""
 "This package contains the complete tree of texmf-dist data."
 msgstr ""
 
-#: gnu/packages/tex.scm:285
+#: gnu/packages/tex.scm:305
 msgid ""
 "TeX Live provides a comprehensive TeX document production system.\n"
 "It includes all the major TeX-related programs, macro packages, and fonts\n"
@@ -10177,7 +12056,7 @@ msgid ""
 "This package contains the complete TeX Live distribution."
 msgstr ""
 
-#: gnu/packages/tex.scm:339
+#: gnu/packages/tex.scm:360
 msgid ""
 "TeX Live provides a comprehensive TeX document production system.\n"
 "It includes all the major TeX-related programs, macro packages, and fonts\n"
@@ -10187,7 +12066,7 @@ msgid ""
 "This package contains a small subset of the texmf-dist data."
 msgstr ""
 
-#: gnu/packages/tex.scm:357
+#: gnu/packages/tex.scm:382
 msgid ""
 "TeX Live provides a comprehensive TeX document production system.\n"
 "It includes all the major TeX-related programs, macro packages, and fonts\n"
@@ -10197,11 +12076,34 @@ msgid ""
 "This package contains a small working part of the TeX Live distribution."
 msgstr ""
 
-#: gnu/packages/tex.scm:385
+#: gnu/packages/tex.scm:423
+msgid "Interface to read and parse BibTeX files"
+msgstr ""
+
+#: gnu/packages/tex.scm:424
+msgid ""
+"@code{Text::BibTeX} is a Perl library for reading, parsing,\n"
+"and processing BibTeX files.  @code{Text::BibTeX} gives you access to the data\n"
+"at many different levels: you may work with BibTeX entries as simple field to\n"
+"string mappings, or get at the original form of the data as a list of simple\n"
+"values (strings, macros, or numbers) pasted together."
+msgstr ""
+
+#: gnu/packages/tex.scm:506
+msgid "Backend for the BibLaTeX citation management tool"
+msgstr ""
+
+#: gnu/packages/tex.scm:507
+msgid ""
+"Biber is a BibTeX replacement for users of biblatex.  Among\n"
+"other things it comes with full Unicode support."
+msgstr ""
+
+#: gnu/packages/tex.scm:558
 msgid "Wrapper for LaTeX and friends"
 msgstr ""
 
-#: gnu/packages/tex.scm:387
+#: gnu/packages/tex.scm:560
 msgid ""
 "Rubber is a program whose purpose is to handle all tasks related to the\n"
 "compilation of LaTeX documents.  This includes compiling the document itself,\n"
@@ -10211,16 +12113,27 @@ msgid ""
 "PDF documents."
 msgstr ""
 
-#: gnu/packages/tex.scm:427
+#: gnu/packages/tex.scm:602
 msgid "LaTeX editor"
 msgstr "LaTeX-redigeringsprogram"
 
-#: gnu/packages/tex.scm:428
+#: gnu/packages/tex.scm:603
 msgid ""
 "Texmaker is a program that integrates many tools needed to\n"
 "develop documents with LaTeX, in a single application."
 msgstr ""
 
+#: gnu/packages/tex.scm:642
+msgid "Book on TeX, plain TeX and Eplain"
+msgstr ""
+
+#: gnu/packages/tex.scm:643
+msgid ""
+"@i{TeX for the Impatient} is a ~350 page book on TeX,\n"
+"plain TeX, and Eplain, originally written by Paul Abrahams, Kathryn Hargreaves,\n"
+"and Karl Berry."
+msgstr ""
+
 #: gnu/packages/texinfo.scm:55
 msgid "The GNU documentation format"
 msgstr ""
@@ -10235,15 +12148,15 @@ msgid ""
 "is on expressing the content semantically, avoiding physical markup commands."
 msgstr ""
 
-#: gnu/packages/texinfo.scm:137
+#: gnu/packages/texinfo.scm:125
 msgid "Standalone Info documentation reader"
 msgstr ""
 
-#: gnu/packages/texinfo.scm:167
+#: gnu/packages/texinfo.scm:155
 msgid "Convert Texinfo to HTML"
 msgstr ""
 
-#: gnu/packages/texinfo.scm:169
+#: gnu/packages/texinfo.scm:157
 msgid ""
 "Texi2HTML is a Perl script which converts Texinfo source files to HTML\n"
 "output.  It now supports many advanced features, such as internationalization\n"
@@ -10258,11 +12171,11 @@ msgid ""
 "Texi2HTML."
 msgstr ""
 
-#: gnu/packages/textutils.scm:67
+#: gnu/packages/textutils.scm:74
 msgid "Text encoding converter"
 msgstr ""
 
-#: gnu/packages/textutils.scm:68
+#: gnu/packages/textutils.scm:75
 msgid ""
 "The Recode library converts files between character sets and\n"
 "usages.  It recognises or produces over 200 different character sets (or about\n"
@@ -10272,61 +12185,61 @@ msgid ""
 "handy front-end to the library."
 msgstr ""
 
-#: gnu/packages/textutils.scm:96
+#: gnu/packages/textutils.scm:103
 msgid "Text encoding detection tool"
 msgstr ""
 
-#: gnu/packages/textutils.scm:97
+#: gnu/packages/textutils.scm:104
 msgid ""
 "Enca (Extremely Naive Charset Analyser) consists of libenca,\n"
 "an encoding detection library, and enca, a command line frontend, integrating\n"
 "libenca and several charset conversion libraries and tools."
 msgstr ""
 
-#: gnu/packages/textutils.scm:124
+#: gnu/packages/textutils.scm:131
 msgid "C library for processing UTF-8 Unicode data"
 msgstr ""
 
-#: gnu/packages/textutils.scm:125
+#: gnu/packages/textutils.scm:132
 msgid ""
 "utf8proc is a small C library that provides Unicode\n"
 "normalization, case-folding, and other operations for data in the UTF-8\n"
-"encoding, supporting Unicode version 7.0."
+"encoding, supporting Unicode version 9.0.0."
 msgstr ""
 
-#: gnu/packages/textutils.scm:154
+#: gnu/packages/textutils.scm:161
 msgid "Gordon's text utils library"
 msgstr ""
 
-#: gnu/packages/textutils.scm:156
+#: gnu/packages/textutils.scm:163
 msgid ""
 "libgtextutils is a text utilities library used by the fastx toolkit from\n"
 "the Hannon Lab."
 msgstr ""
 
-#: gnu/packages/textutils.scm:188
+#: gnu/packages/textutils.scm:195
 msgid "C++ hash functions for strings"
 msgstr ""
 
-#: gnu/packages/textutils.scm:190
+#: gnu/packages/textutils.scm:197
 msgid ""
 "CityHash provides hash functions for strings.  The functions mix the\n"
 "input bits thoroughly but are not suitable for cryptography."
 msgstr ""
 
-#: gnu/packages/textutils.scm:227
+#: gnu/packages/textutils.scm:234
 msgid "String library with very low memory overhead"
 msgstr ""
 
-#: gnu/packages/textutils.scm:229
+#: gnu/packages/textutils.scm:236
 msgid "Ustr is a string library for C with very low memory overhead."
 msgstr ""
 
-#: gnu/packages/textutils.scm:250
+#: gnu/packages/textutils.scm:257
 msgid "C/C++ configuration file library"
 msgstr ""
 
-#: gnu/packages/textutils.scm:252
+#: gnu/packages/textutils.scm:259
 msgid ""
 "Libconfig is a simple library for manipulating structured configuration\n"
 "files.  This file format is more compact and more readable than XML.  And\n"
@@ -10334,11 +12247,11 @@ msgid ""
 "application code."
 msgstr ""
 
-#: gnu/packages/textutils.scm:272
+#: gnu/packages/textutils.scm:279
 msgid "Probabilistic fast file fingerprinting tool"
 msgstr ""
 
-#: gnu/packages/textutils.scm:274
+#: gnu/packages/textutils.scm:281
 msgid ""
 "pfff is a tool for calculating a compact digital fingerprint of a file\n"
 "by sampling randomly from the file instead of reading it in full.\n"
@@ -10347,22 +12260,22 @@ msgid ""
 "as existing hashing techniques, with provably negligible risk of collisions."
 msgstr ""
 
-#: gnu/packages/textutils.scm:295
+#: gnu/packages/textutils.scm:302
 msgid "Regular expression library"
 msgstr "Regulært udtryksbibliotek"
 
-#: gnu/packages/textutils.scm:296
+#: gnu/packages/textutils.scm:303
 msgid ""
 "Oniguruma is a regular expressions library.  The special\n"
 "characteristic of this library is that different character encoding for every\n"
 "regular expression object can be specified."
 msgstr ""
 
-#: gnu/packages/textutils.scm:329
+#: gnu/packages/textutils.scm:336
 msgid "Microsoft Word document reader"
 msgstr "Microsoft Word-dokumentlæser"
 
-#: gnu/packages/textutils.scm:330
+#: gnu/packages/textutils.scm:337
 msgid ""
 "Antiword is an application for displaying Microsoft Word\n"
 "documents.  It can also convert the document to PostScript or XML.  Only\n"
@@ -10372,16 +12285,36 @@ msgid ""
 "runs Word\"."
 msgstr ""
 
-#: gnu/packages/textutils.scm:372
+#: gnu/packages/textutils.scm:379
 msgid "Portable C++ library for handling UTF-8"
 msgstr "Flytbart C++-bibliotek til håndtering af UTF-8"
 
-#: gnu/packages/textutils.scm:373
+#: gnu/packages/textutils.scm:380
 msgid ""
 "UTF8-CPP is a C++ library for handling UTF-8 encoded text\n"
 "in a portable way."
 msgstr ""
 
+#: gnu/packages/textutils.scm:446
+msgid "Bayesian text and email classifier"
+msgstr ""
+
+#: gnu/packages/textutils.scm:448
+msgid ""
+"dbacl is a fast Bayesian text and email classifier.  It builds a variety\n"
+"of language models using maximum entropy (minimum divergence) principles, and\n"
+"these can then be used to categorize input data automatically among multiple\n"
+"categories."
+msgstr ""
+
+#: gnu/packages/textutils.scm:490
+msgid "Configuration file parser library"
+msgstr ""
+
+#: gnu/packages/textutils.scm:492
+msgid "C library for creating and parsing configuration files."
+msgstr ""
+
 #: gnu/packages/version-control.scm:105
 msgid "Version control system supporting both distributed and centralized workflows"
 msgstr ""
@@ -10393,53 +12326,42 @@ msgid ""
 "as well as the classic centralized workflow."
 msgstr ""
 
-#: gnu/packages/version-control.scm:269
+#: gnu/packages/version-control.scm:306
 msgid "Distributed version control system"
 msgstr ""
 
-#: gnu/packages/version-control.scm:271
+#: gnu/packages/version-control.scm:308
 msgid ""
 "Git is a free distributed version control system designed to handle\n"
 "everything from small to very large projects with speed and efficiency."
 msgstr ""
 
-#: gnu/packages/version-control.scm:316
-msgid "Man pages of the Git version control system"
-msgstr ""
-
-#: gnu/packages/version-control.scm:318
-msgid ""
-"This package provides the man pages of the Git version control system.\n"
-"This is the documentation displayed when using the '--help' option of a 'git'\n"
-"command."
-msgstr ""
-
-#: gnu/packages/version-control.scm:357
+#: gnu/packages/version-control.scm:362
 msgid "Library providing Git core methods"
 msgstr ""
 
-#: gnu/packages/version-control.scm:359
+#: gnu/packages/version-control.scm:364
 msgid ""
 "Libgit2 is a portable, pure C implementation of the Git core methods\n"
 "provided as a re-entrant linkable library with a solid API, allowing you to\n"
 "write native speed custom Git applications in any language with bindings."
 msgstr ""
 
-#: gnu/packages/version-control.scm:420
+#: gnu/packages/version-control.scm:425
 msgid "Web frontend for git repositories"
 msgstr ""
 
-#: gnu/packages/version-control.scm:422
+#: gnu/packages/version-control.scm:427
 msgid ""
 "CGit is an attempt to create a fast web interface for the Git SCM, using\n"
 "a built-in cache to decrease server I/O pressure."
 msgstr ""
 
-#: gnu/packages/version-control.scm:459
+#: gnu/packages/version-control.scm:464
 msgid "Command-line flags library for shell scripts"
 msgstr ""
 
-#: gnu/packages/version-control.scm:461
+#: gnu/packages/version-control.scm:466
 msgid ""
 "Shell Flags (shFlags) is a library written to greatly simplify the\n"
 "handling of command-line flags in Bourne based Unix shell scripts (bash, dash,\n"
@@ -10450,11 +12372,11 @@ msgid ""
 "will work."
 msgstr ""
 
-#: gnu/packages/version-control.scm:504
+#: gnu/packages/version-control.scm:509
 msgid "Git extensions for Vincent Driessen's branching model"
 msgstr ""
 
-#: gnu/packages/version-control.scm:506
+#: gnu/packages/version-control.scm:511
 msgid ""
 "Vincent Driessen's branching model is a git branching and release\n"
 "management strategy that helps developers keep track of features, hotfixes,\n"
@@ -10463,43 +12385,43 @@ msgid ""
 "lot easier."
 msgstr ""
 
-#: gnu/packages/version-control.scm:541
+#: gnu/packages/version-control.scm:546
 msgid "Run a command over a sequence of commits"
 msgstr ""
 
-#: gnu/packages/version-control.scm:543
+#: gnu/packages/version-control.scm:548
 msgid ""
 "git-test-sequence is similar to an automated git bisect except it’s\n"
 "linear.  It will test every change between two points in the DAG.  It will\n"
 "also walk each side of a merge and test those changes individually."
 msgstr ""
 
-#: gnu/packages/version-control.scm:598
+#: gnu/packages/version-control.scm:603
 msgid "Git access control layer"
 msgstr ""
 
-#: gnu/packages/version-control.scm:600
+#: gnu/packages/version-control.scm:605
 msgid ""
 "Gitolite is an access control layer on top of Git, providing fine access\n"
 "control to Git repositories."
 msgstr ""
 
-#: gnu/packages/version-control.scm:624
+#: gnu/packages/version-control.scm:629
 msgid "Decentralized version control system"
 msgstr ""
 
-#: gnu/packages/version-control.scm:626
+#: gnu/packages/version-control.scm:631
 msgid ""
 "Mercurial is a free, distributed source control management tool.\n"
 "It efficiently handles projects of any size\n"
 "and offers an easy and intuitive interface."
 msgstr ""
 
-#: gnu/packages/version-control.scm:660
+#: gnu/packages/version-control.scm:665
 msgid "HTTP and WebDAV client library"
 msgstr ""
 
-#: gnu/packages/version-control.scm:661
+#: gnu/packages/version-control.scm:666
 msgid ""
 "Neon is an HTTP and WebDAV client library, with a\n"
 "C interface.  Features:\n"
@@ -10519,11 +12441,11 @@ msgid ""
 "property manipulation."
 msgstr ""
 
-#: gnu/packages/version-control.scm:737
+#: gnu/packages/version-control.scm:743
 msgid "Revision control system"
 msgstr ""
 
-#: gnu/packages/version-control.scm:739
+#: gnu/packages/version-control.scm:745
 msgid ""
 "Subversion exists to be universally recognized and adopted as a\n"
 "centralized version control system characterized by its\n"
@@ -10532,11 +12454,11 @@ msgid ""
 "projects, from individuals to large-scale enterprise operations."
 msgstr ""
 
-#: gnu/packages/version-control.scm:760
+#: gnu/packages/version-control.scm:766
 msgid "Per-file local revision control system"
 msgstr ""
 
-#: gnu/packages/version-control.scm:762
+#: gnu/packages/version-control.scm:768
 msgid ""
 "RCS is the original Revision Control System.  It works on a\n"
 "file-by-file basis, in contrast to subsequent version control systems such as\n"
@@ -10545,11 +12467,11 @@ msgid ""
 "machine."
 msgstr ""
 
-#: gnu/packages/version-control.scm:789
+#: gnu/packages/version-control.scm:795
 msgid "Historical centralized version control system"
 msgstr ""
 
-#: gnu/packages/version-control.scm:791
+#: gnu/packages/version-control.scm:797
 msgid ""
 "CVS is a version control system, an important component of Source\n"
 "Configuration Management (SCM).  Using it, you can record the history of\n"
@@ -10557,11 +12479,11 @@ msgid ""
 "RCS, PRCS, and Aegis packages."
 msgstr ""
 
-#: gnu/packages/version-control.scm:824
+#: gnu/packages/version-control.scm:830
 msgid "Export an RCS or CVS history as a fast-import stream"
 msgstr ""
 
-#: gnu/packages/version-control.scm:825
+#: gnu/packages/version-control.scm:831
 msgid ""
 "This program analyzes a collection of RCS files in a CVS\n"
 "repository (or outside of one) and, when possible, emits an equivalent history\n"
@@ -10574,11 +12496,11 @@ msgid ""
 "masters from remote CVS hosts."
 msgstr ""
 
-#: gnu/packages/version-control.scm:852
+#: gnu/packages/version-control.scm:858
 msgid "Version-control-agnostic ChangeLog diff and commit tool"
 msgstr ""
 
-#: gnu/packages/version-control.scm:854
+#: gnu/packages/version-control.scm:860
 msgid ""
 "The vc-dwim package contains two tools, \"vc-dwim\" and \"vc-chlog\".\n"
 "vc-dwim is a tool that simplifies the task of maintaining a ChangeLog and\n"
@@ -10588,33 +12510,33 @@ msgid ""
 "standards-compliant ChangeLog entries based on the changes that it detects."
 msgstr ""
 
-#: gnu/packages/version-control.scm:876
+#: gnu/packages/version-control.scm:882
 msgid "Make histograms from the output of 'diff'"
 msgstr ""
 
-#: gnu/packages/version-control.scm:878
+#: gnu/packages/version-control.scm:884
 msgid ""
 "Diffstat reads the output of 'diff' and displays a histogram of the\n"
 "insertions, deletions, and modifications per-file.  It is useful for reviewing\n"
 "large, complex patch files."
 msgstr ""
 
-#: gnu/packages/version-control.scm:919
+#: gnu/packages/version-control.scm:923
 msgid "File-based version control like SCCS"
 msgstr ""
 
-#: gnu/packages/version-control.scm:920
+#: gnu/packages/version-control.scm:924
 msgid ""
 "GNU CSSC provides a replacement for the legacy Unix source\n"
 "code control system SCCS.  This allows old code still under that system to be\n"
 "accessed and migrated on modern systems."
 msgstr ""
 
-#: gnu/packages/version-control.scm:999
+#: gnu/packages/version-control.scm:1003
 msgid "Project change supervisor"
 msgstr ""
 
-#: gnu/packages/version-control.scm:1000
+#: gnu/packages/version-control.scm:1004
 msgid ""
 "Aegis is a project change supervisor, and performs some of\n"
 "the Software Configuration Management needed in a CASE environment.  Aegis\n"
@@ -10625,11 +12547,11 @@ msgid ""
 "any project with more than one developer, is one of Aegis's major functions."
 msgstr ""
 
-#: gnu/packages/version-control.scm:1049
+#: gnu/packages/version-control.scm:1053
 msgid "Edit version-control repository history"
 msgstr ""
 
-#: gnu/packages/version-control.scm:1050
+#: gnu/packages/version-control.scm:1054
 msgid ""
 "Reposurgeon enables risky operations that version-control\n"
 "systems don't want to let you do, such as editing past comments and metadata\n"
@@ -10640,32 +12562,32 @@ msgid ""
 "from Subversion to any supported Distributed Version Control System (DVCS)."
 msgstr ""
 
-#: gnu/packages/version-control.scm:1080
+#: gnu/packages/version-control.scm:1093
 msgid "Ncurses-based text user interface for Git"
 msgstr ""
 
-#: gnu/packages/version-control.scm:1082
+#: gnu/packages/version-control.scm:1095
 msgid ""
 "Tig is an ncurses text user interface for Git, primarily intended as\n"
 "a history browser.  It can also stage hunks for commit, or colorize the\n"
 "output of the 'git' command."
 msgstr ""
 
-#: gnu/packages/version-control.scm:1108
+#: gnu/packages/version-control.scm:1121
 msgid "Print the modification time of the latest file"
 msgstr ""
 
-#: gnu/packages/version-control.scm:1110
+#: gnu/packages/version-control.scm:1123
 msgid ""
 "Recursively find the newest file in a file tree and print its\n"
 "modification time."
 msgstr ""
 
-#: gnu/packages/version-control.scm:1135
+#: gnu/packages/version-control.scm:1148
 msgid "Multiple repository management tool"
 msgstr ""
 
-#: gnu/packages/version-control.scm:1137
+#: gnu/packages/version-control.scm:1150
 msgid ""
 "Myrepos provides the @code{mr} command, which maps an operation (e.g.,\n"
 "fetching updates) over a collection of version control repositories.  It\n"
@@ -10673,27 +12595,37 @@ msgid ""
 "Mercurial, Bazaar, Darcs, CVS, Fossil, and Veracity."
 msgstr ""
 
-#: gnu/packages/version-control.scm:1168
+#: gnu/packages/version-control.scm:1180
 msgid "Use hubic as a git-annex remote"
 msgstr ""
 
-#: gnu/packages/version-control.scm:1170
+#: gnu/packages/version-control.scm:1182
 msgid ""
 "This package allows you to use your hubic account as a \"special\n"
 "repository\" with git-annex."
 msgstr ""
 
-#: gnu/packages/version-control.scm:1241
+#: gnu/packages/version-control.scm:1232
 msgid "Software configuration management system"
 msgstr ""
 
-#: gnu/packages/version-control.scm:1243
+#: gnu/packages/version-control.scm:1234
 msgid ""
 "Fossil is a distributed source control management system which supports\n"
 "access and administration over HTTP CGI or via a built-in HTTP server.  It has\n"
 "a built-in wiki, built-in file browsing, built-in tickets system, etc."
 msgstr ""
 
+#: gnu/packages/version-control.scm:1262
+msgid "Static git page generator"
+msgstr ""
+
+#: gnu/packages/version-control.scm:1263
+msgid ""
+"Stagit creates static pages for git repositories, the results can\n"
+"be served with a HTTP file server of your choice."
+msgstr ""
+
 #: gnu/packages/webkit.scm:123
 msgid "Web content engine for GTK+"
 msgstr ""
@@ -10705,11 +12637,11 @@ msgid ""
 "HTML/CSS applications to full-fledged web browsers."
 msgstr ""
 
-#: gnu/packages/web.scm:103
+#: gnu/packages/web.scm:114
 msgid "Featureful HTTP server"
 msgstr ""
 
-#: gnu/packages/web.scm:105
+#: gnu/packages/web.scm:116
 msgid ""
 "The Apache HTTP Server Project is a collaborative software development\n"
 "effort aimed at creating a robust, commercial-grade, featureful, and\n"
@@ -10719,54 +12651,76 @@ msgid ""
 "and its related documentation."
 msgstr ""
 
-#: gnu/packages/web.scm:183
+#: gnu/packages/web.scm:194
 msgid "HTTP and reverse proxy server"
 msgstr ""
 
-#: gnu/packages/web.scm:185
+#: gnu/packages/web.scm:196
 msgid ""
 "Nginx (\"engine X\") is a high-performance web and reverse proxy server\n"
 "created by Igor Sysoev.  It can be used both as a standalone web server\n"
 "and as a proxy to reduce the load on back-end HTTP or mail servers."
 msgstr ""
 
-#: gnu/packages/web.scm:221
+#: gnu/packages/web.scm:225
+msgid "Language-independent, high-performant extension to CGI"
+msgstr ""
+
+#: gnu/packages/web.scm:226
+msgid ""
+"FastCGI is a language independent, scalable extension to CGI\n"
+"that provides high performance without the limitations of server specific\n"
+"APIs."
+msgstr ""
+
+#: gnu/packages/web.scm:262
+msgid "Simple server for running CGI applications over FastCGI"
+msgstr ""
+
+#: gnu/packages/web.scm:263
+msgid ""
+"Fcgiwrap is a simple server for running CGI applications\n"
+"over FastCGI.  It hopes to provide clean CGI support to Nginx (and other web\n"
+"servers that may need it)."
+msgstr ""
+
+#: gnu/packages/web.scm:294
 msgid "PSGI/Plack web server"
 msgstr ""
 
-#: gnu/packages/web.scm:222
+#: gnu/packages/web.scm:295
 msgid ""
 "Starman is a PSGI perl web server that has unique features\n"
 "such as high performance, preforking, signal support, superdaemon awareness,\n"
 "and UNIX socket support."
 msgstr ""
 
-#: gnu/packages/web.scm:242
+#: gnu/packages/web.scm:314
 msgid "JSON C library"
 msgstr ""
 
-#: gnu/packages/web.scm:244
+#: gnu/packages/web.scm:316
 msgid ""
 "Jansson is a C library for encoding, decoding and manipulating JSON\n"
 "data."
 msgstr ""
 
-#: gnu/packages/web.scm:276
+#: gnu/packages/web.scm:348
 msgid "JSON implementation in C"
 msgstr ""
 
-#: gnu/packages/web.scm:278
+#: gnu/packages/web.scm:350
 msgid ""
 "JSON-C implements a reference counting object model that allows you to\n"
 "easily construct JSON objects in C, output them as JSON formatted strings and\n"
 "parse JSON formatted strings back into the C representation of JSON objects."
 msgstr ""
 
-#: gnu/packages/web.scm:361
+#: gnu/packages/web.scm:433
 msgid "Hierarchical data exploration with zoomable HTML5 pie charts"
 msgstr ""
 
-#: gnu/packages/web.scm:363
+#: gnu/packages/web.scm:435
 msgid ""
 "Krona is a flexible tool for exploring the relative proportions of\n"
 "hierarchical data, such as metagenomic classifications, using a radial,\n"
@@ -10775,42 +12729,42 @@ msgid ""
 "current version of any major web browser."
 msgstr ""
 
-#: gnu/packages/web.scm:391
+#: gnu/packages/web.scm:463
 msgid "JSON parser/generator for C++ with both SAX/DOM style API"
 msgstr ""
 
-#: gnu/packages/web.scm:393
+#: gnu/packages/web.scm:465
 msgid ""
 "RapidJSON is a fast JSON parser/generator for C++ with both SAX/DOM\n"
 "style API."
 msgstr ""
 
-#: gnu/packages/web.scm:411
+#: gnu/packages/web.scm:483
 msgid "C library for parsing JSON"
 msgstr ""
 
-#: gnu/packages/web.scm:413
+#: gnu/packages/web.scm:485
 msgid ""
 "Yet Another JSON Library (YAJL) is a small event-driven (SAX-style) JSON\n"
 "parser written in ANSI C and a small validating JSON generator."
 msgstr ""
 
-#: gnu/packages/web.scm:443
+#: gnu/packages/web.scm:515
 msgid "WebSockets library written in C"
 msgstr ""
 
-#: gnu/packages/web.scm:445
+#: gnu/packages/web.scm:517
 msgid ""
 "Libwebsockets is a library that allows C programs to establish client\n"
 "and server WebSockets connections---a protocol layered above HTTP that allows\n"
 "for efficient socket-like bidirectional reliable communication channels."
 msgstr ""
 
-#: gnu/packages/web.scm:470
+#: gnu/packages/web.scm:542
 msgid "C library for the Publix Suffix List"
 msgstr ""
 
-#: gnu/packages/web.scm:472
+#: gnu/packages/web.scm:544
 msgid ""
 "A \"public suffix\" is a domain name under which Internet users can\n"
 "directly register own names.\n"
@@ -10828,21 +12782,21 @@ msgid ""
 "UTS#46."
 msgstr ""
 
-#: gnu/packages/web.scm:518
+#: gnu/packages/web.scm:589
 msgid "HTML validator and tidier"
 msgstr ""
 
-#: gnu/packages/web.scm:519
+#: gnu/packages/web.scm:590
 msgid ""
 "HTML Tidy is a command-line tool and C library that can be\n"
 "used to validate and fix HTML data."
 msgstr ""
 
-#: gnu/packages/web.scm:559
+#: gnu/packages/web.scm:630
 msgid "Light-weight HTTP/HTTPS proxy daemon"
 msgstr ""
 
-#: gnu/packages/web.scm:560
+#: gnu/packages/web.scm:631
 msgid ""
 "Tinyproxy is a light-weight HTTP/HTTPS proxy\n"
 "daemon.  Designed from the ground up to be fast and yet small, it is an ideal\n"
@@ -10851,52 +12805,52 @@ msgid ""
 "unavailable."
 msgstr ""
 
-#: gnu/packages/web.scm:593
+#: gnu/packages/web.scm:664
 msgid "Small caching web proxy"
 msgstr ""
 
-#: gnu/packages/web.scm:595
+#: gnu/packages/web.scm:666
 msgid ""
 "Polipo is a small caching web proxy (web cache, HTTP proxy, and proxy\n"
 "server).  It was primarily designed to be used by one person or a small group\n"
 "of people."
 msgstr ""
 
-#: gnu/packages/web.scm:616
+#: gnu/packages/web.scm:687
 msgid "YAML 1.1 parser and emitter written in C"
 msgstr ""
 
-#: gnu/packages/web.scm:618
+#: gnu/packages/web.scm:689
 msgid "LibYAML is a YAML 1.1 parser and emitter written in C."
 msgstr ""
 
-#: gnu/packages/web.scm:635 gnu/packages/web.scm:669 gnu/packages/web.scm:692
+#: gnu/packages/web.scm:706 gnu/packages/web.scm:740 gnu/packages/web.scm:763
 msgid "Media stream URL parser"
 msgstr ""
 
-#: gnu/packages/web.scm:636
+#: gnu/packages/web.scm:707
 msgid ""
 "This package contains support scripts called by libquvi to\n"
 "parse media stream properties."
 msgstr ""
 
-#: gnu/packages/web.scm:670
+#: gnu/packages/web.scm:741
 msgid ""
 "libquvi is a library with a C API for parsing media stream\n"
 "URLs and extracting their actual media files."
 msgstr ""
 
-#: gnu/packages/web.scm:693
+#: gnu/packages/web.scm:764
 msgid ""
 "quvi is a command-line-tool suite to extract media files\n"
 "from streaming URLs.  It is a command-line wrapper for the libquvi library."
 msgstr ""
 
-#: gnu/packages/web.scm:756
+#: gnu/packages/web.scm:827
 msgid "High-performance asynchronous HTTP client library"
 msgstr ""
 
-#: gnu/packages/web.scm:758
+#: gnu/packages/web.scm:829
 msgid ""
 "serf is a C-based HTTP client library built upon the Apache Portable\n"
 "Runtime (APR) library.  It multiplexes connections, running the read/write\n"
@@ -10904,49 +12858,49 @@ msgid ""
 "minimum to provide high performance operation."
 msgstr ""
 
-#: gnu/packages/web.scm:813
+#: gnu/packages/web.scm:884
 msgid "CSS pre-processor"
 msgstr ""
 
-#: gnu/packages/web.scm:814
+#: gnu/packages/web.scm:885
 msgid ""
 "SassC is a compiler written in C for the CSS pre-processor\n"
 "language known as SASS."
 msgstr ""
 
-#: gnu/packages/web.scm:843
+#: gnu/packages/web.scm:914
 msgid "Compile a log format string to perl-code"
 msgstr ""
 
-#: gnu/packages/web.scm:844
+#: gnu/packages/web.scm:915
 msgid ""
 "This module provides methods to compile a log format string\n"
 "to perl-code, for faster generation of access_log lines."
 msgstr ""
 
-#: gnu/packages/web.scm:865
+#: gnu/packages/web.scm:936
 msgid "SASL authentication framework"
 msgstr ""
 
-#: gnu/packages/web.scm:866
+#: gnu/packages/web.scm:937
 msgid "Authen::SASL provides an SASL authentication framework."
 msgstr ""
 
-#: gnu/packages/web.scm:890
+#: gnu/packages/web.scm:961
 msgid "Sensible default Catalyst action"
 msgstr ""
 
-#: gnu/packages/web.scm:891
+#: gnu/packages/web.scm:962
 msgid ""
 "This Catalyst action implements a sensible default end\n"
 "action, which will forward to the first available view."
 msgstr ""
 
-#: gnu/packages/web.scm:919
+#: gnu/packages/web.scm:993
 msgid "Automated REST Method Dispatching"
 msgstr ""
 
-#: gnu/packages/web.scm:920
+#: gnu/packages/web.scm:994
 msgid ""
 "This Action handles doing automatic method dispatching for\n"
 "REST requests.  It takes a normal Catalyst action, and changes the dispatch to\n"
@@ -10955,32 +12909,32 @@ msgid ""
 "regular method."
 msgstr ""
 
-#: gnu/packages/web.scm:956
+#: gnu/packages/web.scm:1030
 msgid "Storage class for Catalyst authentication using DBIx::Class"
 msgstr ""
 
-#: gnu/packages/web.scm:957
+#: gnu/packages/web.scm:1031
 msgid ""
 "The Catalyst::Authentication::Store::DBIx::Class class\n"
 "provides access to authentication information stored in a database via\n"
 "DBIx::Class."
 msgstr ""
 
-#: gnu/packages/web.scm:981
+#: gnu/packages/web.scm:1055
 msgid "Create only one instance of Moose component per context"
 msgstr ""
 
-#: gnu/packages/web.scm:982
+#: gnu/packages/web.scm:1056
 msgid ""
 "Catalyst::Component::InstancePerContext returns a new\n"
 "instance of a component on each request."
 msgstr ""
 
-#: gnu/packages/web.scm:1019
+#: gnu/packages/web.scm:1093
 msgid "Catalyst Development Tools"
 msgstr ""
 
-#: gnu/packages/web.scm:1020
+#: gnu/packages/web.scm:1094
 msgid ""
 "The Catalyst-Devel distribution includes a variety of\n"
 "modules useful for the development of Catalyst applications, but not required\n"
@@ -10990,11 +12944,11 @@ msgid ""
 "modules."
 msgstr ""
 
-#: gnu/packages/web.scm:1049
+#: gnu/packages/web.scm:1123
 msgid "Regex DispatchType for Catalyst"
 msgstr ""
 
-#: gnu/packages/web.scm:1050
+#: gnu/packages/web.scm:1124
 msgid ""
 "Dispatch type managing path-matching behaviour using\n"
 "regexes.  Regex dispatch types have been deprecated and removed from Catalyst\n"
@@ -11004,32 +12958,32 @@ msgid ""
 "when the dispatch type is first seen in your application."
 msgstr ""
 
-#: gnu/packages/web.scm:1098
+#: gnu/packages/web.scm:1172
 msgid "DBIx::Class::Schema Model Class"
 msgstr ""
 
-#: gnu/packages/web.scm:1099
+#: gnu/packages/web.scm:1173
 msgid ""
 "This is a Catalyst Model for DBIx::Class::Schema-based\n"
 "Models."
 msgstr ""
 
-#: gnu/packages/web.scm:1123
+#: gnu/packages/web.scm:1196
 msgid "Request logging from within Catalyst"
 msgstr ""
 
-#: gnu/packages/web.scm:1124
+#: gnu/packages/web.scm:1197
 msgid ""
 "This Catalyst plugin enables you to create \"access logs\"\n"
 "from within a Catalyst application instead of requiring a webserver to do it\n"
 "for you.  It will work even with Catalyst debug logging turned off."
 msgstr ""
 
-#: gnu/packages/web.scm:1156
+#: gnu/packages/web.scm:1229
 msgid "Infrastructure plugin for the Catalyst authentication framework"
 msgstr ""
 
-#: gnu/packages/web.scm:1157
+#: gnu/packages/web.scm:1230
 msgid ""
 "The authentication plugin provides generic user support for\n"
 "Catalyst apps.  It is the basis for both authentication (checking the user is\n"
@@ -11037,52 +12991,52 @@ msgid ""
 "system authorises them to do)."
 msgstr ""
 
-#: gnu/packages/web.scm:1187
+#: gnu/packages/web.scm:1260
 msgid "Role-based authorization for Catalyst"
 msgstr ""
 
-#: gnu/packages/web.scm:1188
+#: gnu/packages/web.scm:1261
 msgid ""
 "Catalyst::Plugin::Authorization::Roles provides role-based\n"
 "authorization for Catalyst based on Catalyst::Plugin::Authentication."
 msgstr ""
 
-#: gnu/packages/web.scm:1211
+#: gnu/packages/web.scm:1284
 msgid "Captchas for Catalyst"
 msgstr ""
 
-#: gnu/packages/web.scm:1212
+#: gnu/packages/web.scm:1285
 msgid ""
 "This plugin creates and validates Captcha images for\n"
 "Catalyst."
 msgstr ""
 
-#: gnu/packages/web.scm:1238
+#: gnu/packages/web.scm:1311
 msgid "Load config files of various types"
 msgstr ""
 
-#: gnu/packages/web.scm:1239
+#: gnu/packages/web.scm:1312
 msgid ""
 "This module will attempt to load find and load configuration\n"
 "files of various types.  Currently it supports YAML, JSON, XML, INI and Perl\n"
 "formats."
 msgstr ""
 
-#: gnu/packages/web.scm:1269
+#: gnu/packages/web.scm:1343
 msgid "Catalyst generic session plugin"
 msgstr ""
 
-#: gnu/packages/web.scm:1270
+#: gnu/packages/web.scm:1344
 msgid ""
 "This plugin links the two pieces required for session\n"
 "management in web applications together: the state, and the store."
 msgstr ""
 
-#: gnu/packages/web.scm:1296
+#: gnu/packages/web.scm:1370
 msgid "Maintain session IDs using cookies"
 msgstr ""
 
-#: gnu/packages/web.scm:1297
+#: gnu/packages/web.scm:1371
 msgid ""
 "In order for Catalyst::Plugin::Session to work, the session\n"
 "ID needs to be stored on the client, and the session data needs to be stored\n"
@@ -11090,22 +13044,22 @@ msgid ""
 "cookie mechanism."
 msgstr ""
 
-#: gnu/packages/web.scm:1327
+#: gnu/packages/web.scm:1401
 msgid "FastMmap session storage backend"
 msgstr ""
 
-#: gnu/packages/web.scm:1328
+#: gnu/packages/web.scm:1402
 msgid ""
 "Catalyst::Plugin::Session::Store::FastMmap is a fast session\n"
 "storage plugin for Catalyst that uses an mmap'ed file to act as a shared\n"
 "memory interprocess cache.  It is based on Cache::FastMmap."
 msgstr ""
 
-#: gnu/packages/web.scm:1351
+#: gnu/packages/web.scm:1425
 msgid "Stack trace on the Catalyst debug screen"
 msgstr ""
 
-#: gnu/packages/web.scm:1352
+#: gnu/packages/web.scm:1426
 msgid ""
 "This plugin enhances the standard Catalyst debug screen by\n"
 "including a stack trace of your application up to the point where the error\n"
@@ -11113,11 +13067,11 @@ msgid ""
 "number, file name, and code context surrounding the line number."
 msgstr ""
 
-#: gnu/packages/web.scm:1378
+#: gnu/packages/web.scm:1452
 msgid "Simple serving of static pages"
 msgstr ""
 
-#: gnu/packages/web.scm:1379
+#: gnu/packages/web.scm:1453
 msgid ""
 "The Static::Simple plugin is designed to make serving static\n"
 "content in your application during development quick and easy, without\n"
@@ -11128,11 +13082,11 @@ msgid ""
 "MIME type directly to the browser, without being processed through Catalyst."
 msgstr ""
 
-#: gnu/packages/web.scm:1446
+#: gnu/packages/web.scm:1520
 msgid "The Catalyst Framework Runtime"
 msgstr ""
 
-#: gnu/packages/web.scm:1447
+#: gnu/packages/web.scm:1521
 msgid ""
 "Catalyst is a modern framework for making web applications.\n"
 "It is designed to make it easy to manage the various tasks you need to do to\n"
@@ -11140,11 +13094,11 @@ msgid ""
 "\"plug in\" existing Perl modules that do what you need."
 msgstr ""
 
-#: gnu/packages/web.scm:1477
+#: gnu/packages/web.scm:1551
 msgid "Replace request base with value passed by HTTP proxy"
 msgstr ""
 
-#: gnu/packages/web.scm:1478
+#: gnu/packages/web.scm:1552
 msgid ""
 "This module is a Moose::Role which allows you more\n"
 "flexibility in your application's deployment configurations when deployed\n"
@@ -11152,42 +13106,42 @@ msgid ""
 "replaced with the contents of the X-Request-Base header."
 msgstr ""
 
-#: gnu/packages/web.scm:1504
+#: gnu/packages/web.scm:1578
 msgid "Download data in many formats"
 msgstr ""
 
-#: gnu/packages/web.scm:1505
+#: gnu/packages/web.scm:1579
 msgid ""
 "The purpose of this module is to provide a method for\n"
 "downloading data into many supportable formats.  For example, downloading a\n"
 "table based report in a variety of formats (CSV, HTML, etc.)."
 msgstr ""
 
-#: gnu/packages/web.scm:1530
+#: gnu/packages/web.scm:1604
 msgid "Catalyst JSON view"
 msgstr ""
 
-#: gnu/packages/web.scm:1531
+#: gnu/packages/web.scm:1605
 msgid ""
 "Catalyst::View::JSON is a Catalyst View handler that returns\n"
 "stash data in JSON format."
 msgstr ""
 
-#: gnu/packages/web.scm:1556
+#: gnu/packages/web.scm:1631
 msgid "Template View Class"
 msgstr ""
 
-#: gnu/packages/web.scm:1557
+#: gnu/packages/web.scm:1632
 msgid ""
 "This module is a Catalyst view class for the Template\n"
 "Toolkit."
 msgstr ""
 
-#: gnu/packages/web.scm:1586
+#: gnu/packages/web.scm:1661
 msgid "Trait Loading and Resolution for Catalyst Components"
 msgstr ""
 
-#: gnu/packages/web.scm:1587
+#: gnu/packages/web.scm:1662
 msgid ""
 "Adds a \"COMPONENT\" in Catalyst::Component method to your\n"
 "Catalyst component base class that reads the optional \"traits\" parameter\n"
@@ -11196,31 +13150,31 @@ msgid ""
 "MooseX::Traits::Pluggable."
 msgstr ""
 
-#: gnu/packages/web.scm:1612
+#: gnu/packages/web.scm:1687
 msgid "Apply roles to Catalyst classes"
 msgstr ""
 
-#: gnu/packages/web.scm:1613
+#: gnu/packages/web.scm:1688
 msgid ""
 "CatalystX::RoleApplicator applies roles to Catalyst\n"
 "application classes."
 msgstr ""
 
-#: gnu/packages/web.scm:1639
+#: gnu/packages/web.scm:1714
 msgid "Catalyst development server with Starman"
 msgstr ""
 
-#: gnu/packages/web.scm:1640
+#: gnu/packages/web.scm:1715
 msgid ""
 "This module provides a Catalyst extension to replace the\n"
 "development server with Starman."
 msgstr ""
 
-#: gnu/packages/web.scm:1664
+#: gnu/packages/web.scm:1739
 msgid "Handle Common Gateway Interface requests and responses"
 msgstr ""
 
-#: gnu/packages/web.scm:1665
+#: gnu/packages/web.scm:1740
 msgid ""
 "CGI.pm is a stable, complete and mature solution for\n"
 "processing and preparing HTTP requests and responses.  Major features include\n"
@@ -11229,52 +13183,52 @@ msgid ""
 "headers."
 msgstr ""
 
-#: gnu/packages/web.scm:1689
+#: gnu/packages/web.scm:1764
 msgid "CGI interface that is CGI.pm compliant"
 msgstr ""
 
-#: gnu/packages/web.scm:1690
+#: gnu/packages/web.scm:1765
 msgid ""
 "CGI::Simple provides a relatively lightweight drop in\n"
 "replacement for CGI.pm.  It shares an identical OO interface to CGI.pm for\n"
 "parameter parsing, file upload, cookie handling and header generation."
 msgstr ""
 
-#: gnu/packages/web.scm:1711
+#: gnu/packages/web.scm:1786
 msgid "Build structures from CGI data"
 msgstr ""
 
-#: gnu/packages/web.scm:1712
+#: gnu/packages/web.scm:1787
 msgid ""
 "This is a module for building structured data from CGI\n"
 "inputs, in a manner reminiscent of how PHP does."
 msgstr ""
 
-#: gnu/packages/web.scm:1735
+#: gnu/packages/web.scm:1810
 msgid "Date conversion routines"
 msgstr ""
 
-#: gnu/packages/web.scm:1736
+#: gnu/packages/web.scm:1811
 msgid ""
 "This module provides functions that deal with the date\n"
 "formats used by the HTTP protocol."
 msgstr ""
 
-#: gnu/packages/web.scm:1756
+#: gnu/packages/web.scm:1831
 msgid "MD5 sums for files and urls"
 msgstr ""
 
-#: gnu/packages/web.scm:1757
+#: gnu/packages/web.scm:1832
 msgid ""
 "Digest::MD5::File is a Perl extension for getting MD5 sums\n"
 "for files and urls."
 msgstr ""
 
-#: gnu/packages/web.scm:1775
+#: gnu/packages/web.scm:1850
 msgid "Perl locale encoding determination"
 msgstr ""
 
-#: gnu/packages/web.scm:1777
+#: gnu/packages/web.scm:1852
 msgid ""
 "The POSIX locale system is used to specify both the language\n"
 "conventions requested by the user and the preferred character set to\n"
@@ -11286,91 +13240,102 @@ msgid ""
 "with Encode::decode(locale => $string)."
 msgstr ""
 
-#: gnu/packages/web.scm:1803
+#: gnu/packages/web.scm:1883
+msgid "Syndication feed auto-discovery"
+msgstr ""
+
+#: gnu/packages/web.scm:1884
+msgid ""
+"@code{Feed::Find} implements feed auto-discovery for finding\n"
+"syndication feeds, given a URI.  It will discover the following feed formats:\n"
+"RSS 0.91, RSS 1.0, RSS 2.0, Atom."
+msgstr ""
+
+#: gnu/packages/web.scm:1905
 msgid "Perl directory listing parser"
 msgstr ""
 
-#: gnu/packages/web.scm:1805
+#: gnu/packages/web.scm:1907
 msgid ""
 "The File::Listing module exports a single function called parse_dir(),\n"
 "which can be used to parse directory listings."
 msgstr ""
 
-#: gnu/packages/web.scm:1837
+#: gnu/packages/web.scm:1939
 msgid "Stock and mutual fund quotes"
 msgstr ""
 
-#: gnu/packages/web.scm:1839
+#: gnu/packages/web.scm:1941
 msgid ""
 "Finance::Quote gets stock quotes from various internet sources, including\n"
 "Yahoo! Finance, Fidelity Investments, and the Australian Stock Exchange."
 msgstr ""
 
-#: gnu/packages/web.scm:1861
+#: gnu/packages/web.scm:1963
 msgid "Perl extension providing access to the GSSAPIv2 library"
 msgstr ""
 
-#: gnu/packages/web.scm:1862
+#: gnu/packages/web.scm:1964
 msgid ""
 "This is a Perl extension for using GSSAPI C bindings as\n"
 "described in RFC 2744."
 msgstr ""
 
-#: gnu/packages/web.scm:1882
+#: gnu/packages/web.scm:1984
 msgid "Manipulate tables of HTML::Element"
 msgstr ""
 
-#: gnu/packages/web.scm:1884
+#: gnu/packages/web.scm:1986
 msgid ""
 "HTML::Element::Extended is a Perl extension for manipulating a table\n"
 "composed of HTML::Element style components."
 msgstr ""
 
-#: gnu/packages/web.scm:1908
+#: gnu/packages/web.scm:2010
 msgid "Perl class representing an HTML form element"
 msgstr ""
 
-#: gnu/packages/web.scm:1909
+#: gnu/packages/web.scm:2011
 msgid ""
 "Objects of the HTML::Form class represents a single HTML\n"
 "<form> ... </form> instance."
 msgstr ""
 
-#: gnu/packages/web.scm:1931
+#: gnu/packages/web.scm:2033
 msgid "Check for HTML errors in a string or file"
 msgstr "Kontroller for HTML-fejl i en streng eller fil"
 
-#: gnu/packages/web.scm:1932
+#: gnu/packages/web.scm:2034
 msgid ""
 "HTML::Lint is a pure-Perl HTML parser and checker for\n"
 "syntactic legitmacy."
 msgstr ""
 
-#: gnu/packages/web.scm:1953
+#: gnu/packages/web.scm:2055
 msgid "Extract contents from HTML tables"
 msgstr "Udtræk indhold fra HTML-tabeller"
 
-#: gnu/packages/web.scm:1955
+#: gnu/packages/web.scm:2057
 msgid ""
 "HTML::TableExtract is a Perl module for extracting the content contained\n"
 "in tables within an HTML document, either as text or encoded element trees."
 msgstr ""
 
-#: gnu/packages/web.scm:1980
+#: gnu/packages/web.scm:2082
 msgid "Work with HTML in a DOM-like tree structure"
 msgstr "Arbejd med HTML i en DOM-lignende træstruktur"
 
-#: gnu/packages/web.scm:1981
+#: gnu/packages/web.scm:2083
 msgid ""
 "This distribution contains a suite of modules for\n"
 "representing, creating, and extracting information from HTML syntax trees."
 msgstr ""
 
-#: gnu/packages/web.scm:2001
+#: gnu/packages/web.scm:2104
 msgid "Perl HTML parser class"
 msgstr ""
 
-#: gnu/packages/web.scm:2003
+#: gnu/packages/web.scm:2106
 msgid ""
 "Objects of the HTML::Parser class will recognize markup and separate\n"
 "it from plain text (alias data content) in HTML documents.  As different\n"
@@ -11378,21 +13343,21 @@ msgid ""
 "are invoked."
 msgstr ""
 
-#: gnu/packages/web.scm:2023
+#: gnu/packages/web.scm:2126
 msgid "Perl data tables useful in parsing HTML"
 msgstr ""
 
-#: gnu/packages/web.scm:2025
+#: gnu/packages/web.scm:2128
 msgid ""
 "The HTML::Tagset module contains several data tables useful in various\n"
 "kinds of HTML parsing operations."
 msgstr ""
 
-#: gnu/packages/web.scm:2044
+#: gnu/packages/web.scm:2147
 msgid "HTML-like templates"
 msgstr ""
 
-#: gnu/packages/web.scm:2046
+#: gnu/packages/web.scm:2149
 msgid ""
 "This module attempts to make using HTML templates simple and natural.\n"
 "It extends standard HTML with a few new HTML-esque tags: @code{<TMPL_VAR>},\n"
@@ -11403,72 +13368,72 @@ msgid ""
 "you to separate design from the data."
 msgstr ""
 
-#: gnu/packages/web.scm:2074
+#: gnu/packages/web.scm:2177
 msgid "HTTP Body Parser"
 msgstr ""
 
-#: gnu/packages/web.scm:2075
+#: gnu/packages/web.scm:2178
 msgid ""
 "HTTP::Body parses chunks of HTTP POST data and supports\n"
 "application/octet-stream, application/json, application/x-www-form-urlencoded,\n"
 "and multipart/form-data."
 msgstr ""
 
-#: gnu/packages/web.scm:2101
+#: gnu/packages/web.scm:2205
 msgid "Minimalist HTTP user agent cookie jar"
 msgstr ""
 
-#: gnu/packages/web.scm:2102
+#: gnu/packages/web.scm:2206
 msgid ""
 "This module implements a minimalist HTTP user agent cookie\n"
 "jar in conformance with RFC 6265 <http://tools.ietf.org/html/rfc6265>."
 msgstr ""
 
-#: gnu/packages/web.scm:2122
+#: gnu/packages/web.scm:2226
 msgid "Perl HTTP cookie jars"
 msgstr ""
 
-#: gnu/packages/web.scm:2124
+#: gnu/packages/web.scm:2228
 msgid ""
 "The HTTP::Cookies class is for objects that represent a cookie jar,\n"
 "that is, a database of all the HTTP cookies that a given LWP::UserAgent\n"
 "object knows about."
 msgstr ""
 
-#: gnu/packages/web.scm:2146
+#: gnu/packages/web.scm:2250
 msgid "Perl simple http server class"
 msgstr ""
 
-#: gnu/packages/web.scm:2148
+#: gnu/packages/web.scm:2252
 msgid ""
 "Instances of the HTTP::Daemon class are HTTP/1.1 servers that listen\n"
 "on a socket for incoming requests.  The HTTP::Daemon is a subclass of\n"
 "IO::Socket::INET, so you can perform socket operations directly on it too."
 msgstr ""
 
-#: gnu/packages/web.scm:2167
+#: gnu/packages/web.scm:2271
 msgid "Perl date conversion routines"
 msgstr ""
 
-#: gnu/packages/web.scm:2169
+#: gnu/packages/web.scm:2273
 msgid ""
 "The HTTP::Date module provides functions that deal with date formats\n"
 "used by the HTTP protocol (and then some more)."
 msgstr ""
 
-#: gnu/packages/web.scm:2192
+#: gnu/packages/web.scm:2297
 msgid "Perl HTTP style message"
 msgstr ""
 
-#: gnu/packages/web.scm:2194
+#: gnu/packages/web.scm:2299
 msgid "An HTTP::Message object contains some headers and a content body."
 msgstr ""
 
-#: gnu/packages/web.scm:2213
+#: gnu/packages/web.scm:2318
 msgid "Perl http content negotiation"
 msgstr ""
 
-#: gnu/packages/web.scm:2215
+#: gnu/packages/web.scm:2320
 msgid ""
 "The HTTP::Negotiate module provides a complete implementation of the\n"
 "HTTP content negotiation algorithm specified in\n"
@@ -11478,11 +13443,11 @@ msgid ""
 "fields in the request."
 msgstr ""
 
-#: gnu/packages/web.scm:2240
+#: gnu/packages/web.scm:2345
 msgid "Parse HTTP/1.1 requests"
 msgstr ""
 
-#: gnu/packages/web.scm:2241
+#: gnu/packages/web.scm:2346
 msgid ""
 "This is an HTTP request parser.  It takes chunks of text as\n"
 "received and returns a 'hint' as to what is required, or returns the\n"
@@ -11490,74 +13455,74 @@ msgid ""
 "supported."
 msgstr ""
 
-#: gnu/packages/web.scm:2261
+#: gnu/packages/web.scm:2366
 msgid "Fast HTTP request parser"
 msgstr ""
 
-#: gnu/packages/web.scm:2262
+#: gnu/packages/web.scm:2367
 msgid ""
 "HTTP::Parser::XS is a fast, primitive HTTP request/response\n"
 "parser."
 msgstr ""
 
-#: gnu/packages/web.scm:2283
+#: gnu/packages/web.scm:2388
 msgid "Set up a CGI environment from an HTTP::Request"
 msgstr ""
 
-#: gnu/packages/web.scm:2284
+#: gnu/packages/web.scm:2389
 msgid ""
 "This module provides a convenient way to set up a CGI\n"
 "environment from an HTTP::Request."
 msgstr ""
 
-#: gnu/packages/web.scm:2308
+#: gnu/packages/web.scm:2413
 msgid "Lightweight HTTP server"
 msgstr "Simpel HTTP-server"
 
-#: gnu/packages/web.scm:2309
+#: gnu/packages/web.scm:2414
 msgid ""
 "HTTP::Server::Simple is a simple standalone HTTP daemon with\n"
 "no non-core module dependencies.  It can be used for building a standalone\n"
 "http-based UI to your existing tools."
 msgstr ""
 
-#: gnu/packages/web.scm:2333
+#: gnu/packages/web.scm:2439
 msgid "HTTP/1.1 client"
 msgstr ""
 
-#: gnu/packages/web.scm:2334
+#: gnu/packages/web.scm:2440
 msgid ""
 "This is a very simple HTTP/1.1 client, designed for doing\n"
 "simple requests without the overhead of a large framework like LWP::UserAgent.\n"
 "It supports proxies and redirection.  It also correctly resumes after EINTR."
 msgstr ""
 
-#: gnu/packages/web.scm:2353
+#: gnu/packages/web.scm:2459
 msgid "Perl module to open an HTML file with automatic charset detection"
 msgstr ""
 
-#: gnu/packages/web.scm:2355
+#: gnu/packages/web.scm:2461
 msgid ""
 "IO::HTML provides an easy way to open a file containing HTML while\n"
 "automatically determining its encoding.  It uses the HTML5 encoding sniffing\n"
 "algorithm specified in section 8.2.2.1 of the draft standard."
 msgstr ""
 
-#: gnu/packages/web.scm:2375
+#: gnu/packages/web.scm:2481
 msgid "Family-neutral IP socket supporting both IPv4 and IPv6"
 msgstr ""
 
-#: gnu/packages/web.scm:2376
+#: gnu/packages/web.scm:2482
 msgid ""
 "This module provides a protocol-independent way to use IPv4\n"
 "and IPv6 sockets, intended as a replacement for IO::Socket::INET."
 msgstr ""
 
-#: gnu/packages/web.scm:2398
+#: gnu/packages/web.scm:2504
 msgid "Nearly transparent SSL encapsulation for IO::Socket::INET"
 msgstr ""
 
-#: gnu/packages/web.scm:2400
+#: gnu/packages/web.scm:2506
 msgid ""
 "IO::Socket::SSL makes using SSL/TLS much easier by wrapping the\n"
 "necessary functionality into the familiar IO::Socket interface and providing\n"
@@ -11566,11 +13531,11 @@ msgid ""
 "select or poll."
 msgstr ""
 
-#: gnu/packages/web.scm:2431
+#: gnu/packages/web.scm:2540
 msgid "Perl modules for the WWW"
 msgstr "Perlmoduler for www"
 
-#: gnu/packages/web.scm:2433
+#: gnu/packages/web.scm:2542
 msgid ""
 "The libwww-perl collection is a set of Perl modules which provides a\n"
 "simple and consistent application programming interface to the\n"
@@ -11580,11 +13545,11 @@ msgid ""
 "help you implement simple HTTP servers."
 msgstr ""
 
-#: gnu/packages/web.scm:2455
+#: gnu/packages/web.scm:2564
 msgid "Perl module to guess the media type for a file or a URL"
 msgstr ""
 
-#: gnu/packages/web.scm:2457
+#: gnu/packages/web.scm:2566
 #, scheme-format
 msgid ""
 "The LWP::MediaTypes module provides functions for handling media (also\n"
@@ -11593,21 +13558,21 @@ msgid ""
 "exists it is used instead."
 msgstr ""
 
-#: gnu/packages/web.scm:2483
+#: gnu/packages/web.scm:2592
 msgid "HTTPS support for LWP::UserAgent"
 msgstr ""
 
-#: gnu/packages/web.scm:2484
+#: gnu/packages/web.scm:2593
 msgid ""
 "The LWP::Protocol::https module provides support for using\n"
 "https schemed URLs with LWP."
 msgstr ""
 
-#: gnu/packages/web.scm:2504
+#: gnu/packages/web.scm:2613
 msgid "Virtual browser that retries errors"
 msgstr ""
 
-#: gnu/packages/web.scm:2505
+#: gnu/packages/web.scm:2614
 msgid ""
 "LWP::UserAgent::Determined works just like LWP::UserAgent,\n"
 "except that when you use it to get a web page but run into a\n"
@@ -11615,19 +13580,19 @@ msgid ""
 "and retry a few times."
 msgstr ""
 
-#: gnu/packages/web.scm:2550
+#: gnu/packages/web.scm:2659
 msgid "Perl interface to Amazon S3"
 msgstr ""
 
-#: gnu/packages/web.scm:2551
+#: gnu/packages/web.scm:2660
 msgid "This module provides a Perlish interface to Amazon S3."
 msgstr ""
 
-#: gnu/packages/web.scm:2571
+#: gnu/packages/web.scm:2680
 msgid "Perl low-level HTTP connection (client)"
 msgstr ""
 
-#: gnu/packages/web.scm:2573
+#: gnu/packages/web.scm:2682
 msgid ""
 "The Net::HTTP class is a low-level HTTP client.  An instance of the\n"
 "Net::HTTP class represents a connection to an HTTP server.  The HTTP protocol\n"
@@ -11635,11 +13600,11 @@ msgid ""
 "HTTP/1.1."
 msgstr ""
 
-#: gnu/packages/web.scm:2593
+#: gnu/packages/web.scm:2702
 msgid "Extensible Perl server engine"
 msgstr ""
 
-#: gnu/packages/web.scm:2594
+#: gnu/packages/web.scm:2703
 msgid ""
 "Net::Server is an extensible, generic Perl server engine.\n"
 "It attempts to be a generic server as in Net::Daemon and NetServer::Generic.\n"
@@ -11653,19 +13618,19 @@ msgid ""
 "or to multiple server ports."
 msgstr ""
 
-#: gnu/packages/web.scm:2622
+#: gnu/packages/web.scm:2731
 msgid "SSL support for Net::SMTP"
 msgstr "SSL-understøttelse for Net::SMTP"
 
-#: gnu/packages/web.scm:2623
+#: gnu/packages/web.scm:2732
 msgid "SSL support for Net::SMTP."
 msgstr "SSL-understøttelse for Net::SMTP."
 
-#: gnu/packages/web.scm:2657
+#: gnu/packages/web.scm:2766
 msgid "Perl Superglue for Web frameworks and servers (PSGI toolkit)"
 msgstr ""
 
-#: gnu/packages/web.scm:2658
+#: gnu/packages/web.scm:2767
 msgid ""
 "Plack is a set of tools for using the PSGI stack.  It\n"
 "contains middleware components, a reference server, and utilities for Web\n"
@@ -11673,21 +13638,21 @@ msgid ""
 "WSGI."
 msgstr ""
 
-#: gnu/packages/web.scm:2684
+#: gnu/packages/web.scm:2793
 msgid "Plack::Middleware which sets body for redirect response"
 msgstr ""
 
-#: gnu/packages/web.scm:2685
+#: gnu/packages/web.scm:2794
 msgid ""
 "This module sets the body in redirect response, if it's not\n"
 "already set."
 msgstr ""
 
-#: gnu/packages/web.scm:2708
+#: gnu/packages/web.scm:2817
 msgid "Override REST methods to Plack apps via POST"
 msgstr ""
 
-#: gnu/packages/web.scm:2709
+#: gnu/packages/web.scm:2818
 msgid ""
 "This middleware allows for POST requests that pretend to be\n"
 "something else: by adding either a header named X-HTTP-Method-Override to the\n"
@@ -11695,72 +13660,72 @@ msgid ""
 "can say what method it actually meant."
 msgstr ""
 
-#: gnu/packages/web.scm:2733
+#: gnu/packages/web.scm:2842
 msgid "Plack::Middleware which removes body for HTTP response"
 msgstr ""
 
-#: gnu/packages/web.scm:2734
+#: gnu/packages/web.scm:2843
 msgid ""
 "This module removes the body in an HTTP response if it's not\n"
 "required."
 msgstr ""
 
-#: gnu/packages/web.scm:2755
+#: gnu/packages/web.scm:2864
 msgid "Supports app to run as a reverse proxy backend"
 msgstr ""
 
-#: gnu/packages/web.scm:2756
+#: gnu/packages/web.scm:2865
 msgid ""
 "Plack::Middleware::ReverseProxy resets some HTTP headers,\n"
 "which are changed by reverse-proxy.  You can specify the reverse proxy address\n"
 "and stop fake requests using 'enable_if' directive in your app.psgi."
 msgstr ""
 
-#: gnu/packages/web.scm:2777
+#: gnu/packages/web.scm:2886
 msgid "Run HTTP tests on external live servers"
 msgstr ""
 
-#: gnu/packages/web.scm:2778
+#: gnu/packages/web.scm:2887
 msgid ""
 "This module allows your to run your Plack::Test tests\n"
 "against an external server instead of just against a local application through\n"
 "either mocked HTTP or a locally spawned server."
 msgstr ""
 
-#: gnu/packages/web.scm:2800
+#: gnu/packages/web.scm:2909
 msgid "Testing TCP programs"
 msgstr "Testning af TCP-programmer"
 
-#: gnu/packages/web.scm:2801
+#: gnu/packages/web.scm:2910
 msgid "Test::TCP is test utilities for TCP/IP programs."
 msgstr "Test::TCP er testredskaber for TCP/IP-programmer."
 
-#: gnu/packages/web.scm:2829
+#: gnu/packages/web.scm:2938
 msgid "Testing-specific WWW::Mechanize subclass"
 msgstr ""
 
-#: gnu/packages/web.scm:2830
+#: gnu/packages/web.scm:2939
 msgid ""
 "Test::WWW::Mechanize is a subclass of the Perl module\n"
 "WWW::Mechanize that incorporates features for web application testing."
 msgstr ""
 
-#: gnu/packages/web.scm:2863
+#: gnu/packages/web.scm:2972
 msgid "Test::WWW::Mechanize for Catalyst"
 msgstr "Test::WWW::Mechanize for Catalyst"
 
-#: gnu/packages/web.scm:2864
+#: gnu/packages/web.scm:2973
 msgid ""
 "The Test::WWW::Mechanize::Catalyst module meshes the\n"
 "Test::WWW:Mechanize module and the Catalyst web application framework to allow\n"
 "testing of Catalyst applications without needing to start up a web server."
 msgstr ""
 
-#: gnu/packages/web.scm:2888
+#: gnu/packages/web.scm:2997
 msgid "Test PSGI programs using WWW::Mechanize"
 msgstr ""
 
-#: gnu/packages/web.scm:2889
+#: gnu/packages/web.scm:2998
 msgid ""
 "PSGI is a specification to decouple web server environments\n"
 "from web application framework code.  Test::WWW::Mechanize is a subclass of\n"
@@ -11769,22 +13734,33 @@ msgid ""
 "applications."
 msgstr ""
 
-#: gnu/packages/web.scm:2909
+#: gnu/packages/web.scm:3018
 msgid "Perl Uniform Resource Identifiers (absolute and relative)"
 msgstr ""
 
-#: gnu/packages/web.scm:2911
+#: gnu/packages/web.scm:3020
 msgid ""
 "The URI module implements the URI class.  Objects of this class\n"
 "represent \"Uniform Resource Identifier references\" as specified in RFC 2396\n"
 "and updated by RFC 2732."
 msgstr ""
 
-#: gnu/packages/web.scm:2934
+#: gnu/packages/web.scm:3044
+msgid "Smart URI fetching/caching"
+msgstr ""
+
+#: gnu/packages/web.scm:3045
+msgid ""
+"@code{URI::Fetch} is a smart client for fetching HTTP pages,\n"
+"notably syndication feeds (RSS, Atom, and others), in an intelligent, bandwidth-\n"
+"and time-saving way."
+msgstr ""
+
+#: gnu/packages/web.scm:3068
 msgid "Find URIs in arbitrary text"
 msgstr ""
 
-#: gnu/packages/web.scm:2935
+#: gnu/packages/web.scm:3069
 msgid ""
 "This module finds URIs and URLs (according to what URI.pm\n"
 "considers a URI) in plain text.  It only finds URIs which include a\n"
@@ -11792,41 +13768,63 @@ msgid ""
 "URI::Find::Schemeless.  For a command-line interface, urifind is provided."
 msgstr ""
 
-#: gnu/packages/web.scm:2957
+#: gnu/packages/web.scm:3091
 msgid "WebSocket support for URI package"
 msgstr ""
 
-#: gnu/packages/web.scm:2958
+#: gnu/packages/web.scm:3092
 msgid ""
 "With this module, the URI package provides the same set of\n"
 "methods for WebSocket URIs as it does for HTTP URIs."
 msgstr ""
+"Med dette modul tilbyder URI-pakken det samme sæt af\n"
+"metoder for WebSocket URI'er som den gør for HTTP URI'er."
 
-#: gnu/packages/web.scm:2978
-msgid "Perl extension interface for libcurl"
+#: gnu/packages/web.scm:3115
+msgid "Object for handling URI templates"
+msgstr "Objekt til håndtering af URI-skabeloner"
+
+#: gnu/packages/web.scm:3116
+msgid ""
+"This perl module provides a wrapper around URI templates as described in\n"
+"RFC 6570."
 msgstr ""
 
-#: gnu/packages/web.scm:2980
+#: gnu/packages/web.scm:3137
+msgid "Perl extension interface for libcurl"
+msgstr "Perludvidelsesgrænseflade for libcurl"
+
+#: gnu/packages/web.scm:3139
 msgid ""
 "This is a Perl extension interface for the libcurl file downloading\n"
 "library."
 msgstr ""
 
-#: gnu/packages/web.scm:3009
+#: gnu/packages/web.scm:3168
 msgid "Web browsing in a Perl object"
 msgstr ""
 
-#: gnu/packages/web.scm:3010
+#: gnu/packages/web.scm:3169
 msgid ""
 "WWW::Mechanize is a Perl module for stateful programmatic\n"
 "web browsing, used for automating interaction with websites."
 msgstr ""
 
-#: gnu/packages/web.scm:3030
+#: gnu/packages/web.scm:3195
+msgid "Search A9 OpenSearch compatible engines"
+msgstr ""
+
+#: gnu/packages/web.scm:3197
+msgid ""
+"@code{WWW::OpenSearch} is a module to search @url{A9's OpenSearch,\n"
+"http://opensearch.a9.com} compatible search engines."
+msgstr ""
+
+#: gnu/packages/web.scm:3217
 msgid "Perl database of robots.txt-derived permissions"
 msgstr ""
 
-#: gnu/packages/web.scm:3032
+#: gnu/packages/web.scm:3219
 msgid ""
 "The WWW::RobotRules module parses /robots.txt files as specified in\n"
 "\"A Standard for Robot Exclusion\", at\n"
@@ -11835,11 +13833,21 @@ msgid ""
 "their web site."
 msgstr ""
 
-#: gnu/packages/web.scm:3052
+#: gnu/packages/web.scm:3242
+msgid "Parse feeds in Python"
+msgstr ""
+
+#: gnu/packages/web.scm:3244
+msgid ""
+"Universal feed parser which handles RSS 0.9x, RSS 1.0, RSS 2.0,\n"
+"CDF, Atom 0.3, and Atom 1.0 feeds."
+msgstr ""
+
+#: gnu/packages/web.scm:3265
 msgid "HTTP and WebSocket server library for R"
 msgstr ""
 
-#: gnu/packages/web.scm:3054
+#: gnu/packages/web.scm:3267
 msgid ""
 "The httpuv package provides low-level socket and protocol support for\n"
 "handling HTTP and WebSocket requests directly from within R.  It is primarily\n"
@@ -11847,11 +13855,11 @@ msgid ""
 "particularly easy to create complete web applications using httpuv alone."
 msgstr ""
 
-#: gnu/packages/web.scm:3075
+#: gnu/packages/web.scm:3288
 msgid "Robust, high performance JSON parser and generator for R"
 msgstr ""
 
-#: gnu/packages/web.scm:3077
+#: gnu/packages/web.scm:3290
 msgid ""
 "The jsonlite package provides a fast JSON parser and generator optimized\n"
 "for statistical data and the web.  It offers flexible, robust, high\n"
@@ -11863,41 +13871,56 @@ msgid ""
 "in systems and applications."
 msgstr ""
 
-#: gnu/packages/web.scm:3105
+#: gnu/packages/web.scm:3318
 msgid "Simple HTTP server to serve static files or dynamic documents"
 msgstr ""
 
-#: gnu/packages/web.scm:3107
+#: gnu/packages/web.scm:3320
 msgid ""
 "Servr provides an HTTP server in R to serve static files, or dynamic\n"
 "documents that can be converted to HTML files (e.g., R Markdown) under a given\n"
 "directory."
 msgstr ""
 
-#: gnu/packages/web.scm:3127
+#: gnu/packages/web.scm:3354
 msgid "R tools for HTML"
 msgstr "R-værktøjer for HTML"
 
-#: gnu/packages/web.scm:3129
+#: gnu/packages/web.scm:3356
 msgid "This package provides tools for HTML generation and output in R."
 msgstr "Denne pakke tilbyder værktøjer for HTML-oprettelse og uddata i R."
 
-#: gnu/packages/web.scm:3148
+#: gnu/packages/web.scm:3375
 msgid "HTML Widgets for R"
 msgstr "HTML-kontroller for R"
 
-#: gnu/packages/web.scm:3150
+#: gnu/packages/web.scm:3377
 msgid ""
 "HTML widgets is a framework for creating HTML widgets that render in\n"
 "various contexts including the R console, R Markdown documents, and Shiny web\n"
 "applications."
 msgstr ""
 
-#: gnu/packages/web.scm:3169
+#: gnu/packages/web.scm:3400
+msgid "Advanced tables for Markdown/HTML"
+msgstr ""
+
+#: gnu/packages/web.scm:3402
+msgid ""
+"This package provides functions to build tables with advanced layout\n"
+"elements such as row spanners, column spanners, table spanners, zebra\n"
+"striping, and more.  While allowing advanced layout, the underlying\n"
+"CSS-structure is simple in order to maximize compatibility with word\n"
+"processors such as LibreOffice.  The package also contains a few text\n"
+"formatting functions that help outputting text compatible with HTML or\n"
+"LaTeX."
+msgstr ""
+
+#: gnu/packages/web.scm:3439
 msgid "HTTP client for R"
 msgstr "HTTP-klient for R"
 
-#: gnu/packages/web.scm:3171
+#: gnu/packages/web.scm:3441
 msgid ""
 "The @code{curl()} and @code{curl_download()} functions provide highly\n"
 "configurable drop-in replacements for base @code{url()} and\n"
@@ -11908,11 +13931,31 @@ msgid ""
 "callback or connection interfaces."
 msgstr ""
 
-#: gnu/packages/web.scm:3205
+#: gnu/packages/web.scm:3463
+msgid "Output R objects in HTML format"
+msgstr ""
+
+#: gnu/packages/web.scm:3465
+msgid ""
+"This package provides easy-to-use and versatile functions to output R\n"
+"objects in HTML format."
+msgstr ""
+
+#: gnu/packages/web.scm:3482
+msgid "JSON library for R"
+msgstr ""
+
+#: gnu/packages/web.scm:3484
+msgid ""
+"This package provides functions to convert R objects into JSON objects\n"
+"and vice-versa."
+msgstr ""
+
+#: gnu/packages/web.scm:3513
 msgid "HTML5 parsing library"
 msgstr "HTML5-fortolkningsbibliotek"
 
-#: gnu/packages/web.scm:3207
+#: gnu/packages/web.scm:3515
 msgid ""
 "Gumbo is an implementation of the HTML5 parsing algorithm implemented as\n"
 "a pure C99 library."
@@ -11920,22 +13963,22 @@ msgstr ""
 "Gumbo er en implementering af HTML5-fortolkningsalgoritmen implenteret\n"
 "som et rent C99-bibliotek."
 
-#: gnu/packages/web.scm:3278
+#: gnu/packages/web.scm:3586
 msgid "Application container server"
 msgstr ""
 
-#: gnu/packages/web.scm:3280
+#: gnu/packages/web.scm:3588
 msgid ""
 "uWSGI presents a complete stack for networked/clustered web applications,\n"
 "implementing message/object passing, caching, RPC and process management.\n"
 "It uses the uwsgi protocol for all the networking/interprocess communications."
 msgstr ""
 
-#: gnu/packages/web.scm:3306
+#: gnu/packages/web.scm:3618
 msgid "Command-line JSON processor"
 msgstr ""
 
-#: gnu/packages/web.scm:3307
+#: gnu/packages/web.scm:3619
 msgid ""
 "jq is like sed for JSON data – you can use it to slice and\n"
 "filter and map and transform structured data with the same ease that sed, awk,\n"
@@ -11945,35 +13988,93 @@ msgid ""
 "you'd expect."
 msgstr ""
 
-#: gnu/packages/web.scm:3346
+#: gnu/packages/web.scm:3658
 msgid "Library for mocking web service APIs which use HTTP or HTTPS"
 msgstr ""
 
-#: gnu/packages/web.scm:3348
+#: gnu/packages/web.scm:3660
 msgid ""
 "Uhttpmock is a project for mocking web service APIs which use HTTP or\n"
 "HTTPS.  It provides a library, libuhttpmock, which implements recording and\n"
 "playback of HTTP request/response traces."
 msgstr ""
 
-#: gnu/packages/web.scm:3383
+#: gnu/packages/web.scm:3695
 msgid "Single file web server"
 msgstr ""
 
-#: gnu/packages/web.scm:3384
+#: gnu/packages/web.scm:3696
 msgid ""
 "Woof (Web Offer One File) is a small simple web server that\n"
 "can easily be invoked on a single file.  Your partner can access the file with\n"
 "tools they trust (e.g. wget)."
 msgstr ""
 
-#: gnu/packages/wordnet.scm:84
+#: gnu/packages/web.scm:3805
+msgid "Web browser"
+msgstr "Internetbrowser"
+
+#: gnu/packages/web.scm:3807
+msgid ""
+"NetSurf is a lightweight web browser that has its own layout and\n"
+"rendering engine entirely written from scratch.  It is small and capable of\n"
+"handling many of the web standards in use today."
+msgstr ""
+
+#: gnu/packages/web.scm:3829
+msgid "Unix command line interface to the www"
+msgstr "Unix-kommandolinjegrænseflade til www"
+
+#: gnu/packages/web.scm:3830
+msgid ""
+"Surfraw (Shell Users' Revolutionary Front Rage Against the Web)\n"
+"provides a unix command line interface to a variety of popular www search engines\n"
+"and similar services."
+msgstr ""
+
+#: gnu/packages/web.scm:3866
+msgid "Simple static web server"
+msgstr "Simpel statisk internetserver"
+
+#: gnu/packages/web.scm:3867
+msgid ""
+"darkhttpd is a simple static web server.  It is\n"
+"standalone and does not need inetd or ucspi-tcp.  It does not need any\n"
+"config files---you only have to specify the www root."
+msgstr ""
+
+#: gnu/packages/web.scm:3897
+msgid "Analyze Web server logs in real time"
+msgstr ""
+
+#: gnu/packages/web.scm:3899
+msgid ""
+"GoAccess is a real-time web log analyzer and interactive viewer that\n"
+"runs in a terminal or through your browser.  It provides fast and valuable\n"
+"HTTP statistics for system administrators that require a visual server report\n"
+"on the fly."
+msgstr ""
+
+#: gnu/packages/web.scm:3934
+msgid "Tunnel data connections through HTTP requests"
+msgstr ""
+
+#: gnu/packages/web.scm:3935
+msgid ""
+"httptunnel creates a bidirectional virtual data connection\n"
+"tunnelled through HTTP (HyperText Transfer Protocol) requests.  This can be\n"
+"useful for users behind restrictive firewalls.  As long as Web traffic is\n"
+"allowed, even through a HTTP-only proxy, httptunnel can be combined with other\n"
+"tools like SSH (Secure Shell) to reach the outside world."
+msgstr ""
+
+#: gnu/packages/wordnet.scm:91
 msgid "Lexical database for the English language"
 msgstr "Leksikal database for det engelske sprog"
 
-#: gnu/packages/wordnet.scm:86
+#: gnu/packages/wordnet.scm:93
 msgid ""
-"WordNet® is a large lexical database of English.  Nouns, verbs,\n"
+"WordNet is a large lexical database of English.  Nouns, verbs,\n"
 "adjectives and adverbs are grouped into sets of cognitive synonyms (synsets),\n"
 "each expressing a distinct concept.  Synsets are interlinked by means of\n"
 "conceptual-semantic and lexical relations.  The resulting network of\n"
@@ -12162,11 +14263,11 @@ msgid ""
 "and prevents bad data from getting to the icecast server."
 msgstr ""
 
-#: gnu/packages/zip.scm:57
+#: gnu/packages/zip.scm:58
 msgid "Compression and file packing utility"
 msgstr "Komprimerings- og filpakningsredskab"
 
-#: gnu/packages/zip.scm:59
+#: gnu/packages/zip.scm:60
 msgid ""
 "Zip is a compression and file packaging/archive utility.  Zip is useful\n"
 "for packaging a set of files for distribution, for archiving files, and for\n"
@@ -12181,11 +14282,11 @@ msgid ""
 "Compression ratios of 2:1 to 3:1 are common for text files."
 msgstr ""
 
-#: gnu/packages/zip.scm:113
+#: gnu/packages/zip.scm:114
 msgid "Decompression and file extraction utility"
 msgstr ""
 
-#: gnu/packages/zip.scm:115
+#: gnu/packages/zip.scm:116
 msgid ""
 "UnZip is an extraction utility for archives compressed in .zip format,\n"
 "also called \"zipfiles\".\n"
@@ -12196,27 +14297,14 @@ msgid ""
 "recreates the stored directory structure by default."
 msgstr ""
 
-#: gnu/packages/zip.scm:149
+#: gnu/packages/zip.scm:150
 msgid "Library for accessing zip files"
 msgstr "Bibliotek til at tilgå zip-filer"
 
-#: gnu/packages/zip.scm:151
+#: gnu/packages/zip.scm:152
 msgid "ZZipLib is a library based on zlib for accessing zip files."
 msgstr "ZZipLib er et bibliotek baseret på zlib for adgang til zip-filer."
 
-#: gnu/packages/zip.scm:169
+#: gnu/packages/zip.scm:170
 msgid "Provides an interface to ZIP archive files"
 msgstr "Tilbyder en grænseflade til ZIP-arkivfiler"
-
-#: gnu/packages/zsh.scm:71
-msgid "Powerful shell for interactive use and scripting"
-msgstr "Funktionsrig skal for interaktiv brug og skriptopbygning"
-
-#: gnu/packages/zsh.scm:72
-msgid ""
-"The Z shell (zsh) is a Unix shell that can be used\n"
-"as an interactive login shell and as a powerful command interpreter\n"
-"for shell scripting.  Zsh can be thought of as an extended Bourne shell\n"
-"with a large number of improvements, including some features of bash,\n"
-"ksh, and tcsh."
-msgstr ""
diff --git a/tests/cpan.scm b/tests/cpan.scm
index e37fc437fc..0c28a74d3e 100644
--- a/tests/cpan.scm
+++ b/tests/cpan.scm
@@ -68,46 +68,55 @@
              (lambda ()
                (display
                 (match url
-                  ("https://api.metacpan.org/release/Foo-Bar"
-                   test-json)
-                  ("https://api.metacpan.org/module/Test::Script"
-                   "{ \"distribution\" : \"Test-Script\" }")
                   ("http://example.com/Foo-Bar-0.1.tar.gz"
                    test-source)
                   (_ (error "Unexpected URL: " url))))))))
-    (match (cpan->guix-package "Foo::Bar")
-      (('package
-         ('name "perl-foo-bar")
-         ('version "0.1")
-         ('source ('origin
-                    ('method 'url-fetch)
-                    ('uri ('string-append "http://example.com/Foo-Bar-"
-                                          'version ".tar.gz"))
-                    ('sha256
-                     ('base32
-                      (? string? hash)))))
-         ('build-system 'perl-build-system)
-         ('inputs
-          ('quasiquote
-           (("perl-test-script" ('unquote 'perl-test-script)))))
-         ('home-page "http://search.cpan.org/dist/Foo-Bar")
-         ('synopsis "Fizzle Fuzz")
-         ('description 'fill-in-yourself!)
-         ('license (package-license perl)))
-       (string=? (bytevector->nix-base32-string
-                  (call-with-input-string test-source port-sha256))
-                 hash))
-      (x
-       (pk 'fail x #f)))))
+        (mock ((guix http-client) http-fetch
+               (lambda (url)
+                 (match url
+                   ("https://api.metacpan.org/release/Foo-Bar"
+                    (values (open-input-string test-json)
+                            (string-length test-json)))
+                   ("https://api.metacpan.org/module/Test::Script?fields=distribution"
+                    (let ((result "{ \"distribution\" : \"Test-Script\" }"))
+                      (values (open-input-string result)
+                              (string-length result))))
+                   (_ (error "Unexpected URL: " url)))))
+              (match (cpan->guix-package "Foo::Bar")
+                (('package
+                   ('name "perl-foo-bar")
+                   ('version "0.1")
+                   ('source ('origin
+                              ('method 'url-fetch)
+                              ('uri ('string-append "http://example.com/Foo-Bar-"
+                                                    'version ".tar.gz"))
+                              ('sha256
+                               ('base32
+                                (? string? hash)))))
+                   ('build-system 'perl-build-system)
+                   ('inputs
+                    ('quasiquote
+                     (("perl-test-script" ('unquote 'perl-test-script)))))
+                   ('home-page "http://search.cpan.org/dist/Foo-Bar")
+                   ('synopsis "Fizzle Fuzz")
+                   ('description 'fill-in-yourself!)
+                   ('license (package-license perl)))
+                 (string=? (bytevector->nix-base32-string
+                            (call-with-input-string test-source port-sha256))
+                           hash))
+                (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")
+  ((@@ (guix import cpan) cpan-source-url)
+   `(("download_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")
+  ((@@ (guix import cpan) cpan-source-url)
+   `(("download_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/crate.scm b/tests/crate.scm
new file mode 100644
index 0000000000..0bb344bb8a
--- /dev/null
+++ b/tests/crate.scm
@@ -0,0 +1,103 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2014 David Thompson <davet@gnu.org>
+;;; Copyright © 2016 David Craven <david@craven.ch>
+;;;
+;;; 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-crate)
+  #:use-module (guix import crate)
+  #:use-module (guix base32)
+  #:use-module (guix build-system cargo)
+  #:use-module (guix hash)
+  #:use-module (guix tests)
+  #:use-module (ice-9 iconv)
+  #:use-module (ice-9 match)
+  #:use-module (srfi srfi-64))
+
+(define test-crate
+  "{
+  \"crate\": {
+    \"max_version\": \"1.0.0\",
+    \"name\": \"foo\",
+    \"license\": \"MIT/Apache-2.0\",
+    \"description\": \"summary\",
+    \"homepage\": \"http://example.com\",
+    \"repository\": \"http://example.com\",
+  }
+}")
+
+(define test-dependencies
+  "{
+  \"dependencies\": [
+     {
+       \"crate_id\": \"bar\",
+       \"kind\": \"normal\",
+     }
+  ]
+}")
+
+(define test-source-hash
+  "")
+
+(test-begin "crate")
+
+(test-equal "guix-package->crate-name"
+  "rustc-serialize"
+  (guix-package->crate-name
+   (dummy-package
+    "rust-rustc-serialize"
+    (source (dummy-origin
+     (uri (crate-uri "rustc-serialize" "1.0")))))))
+
+(test-assert "crate->guix-package"
+  ;; Replace network resources with sample data.
+  (mock ((guix http-client) http-fetch
+         (lambda (url)
+           (match url
+             ("https://crates.io/api/v1/crates/foo"
+              (open-input-string test-crate))
+             ("https://crates.io/api/v1/crates/foo/1.0.0/download"
+              (set! test-source-hash
+                (bytevector->nix-base32-string
+                 (sha256 (string->bytevector "empty file\n" "utf-8"))))
+              (open-input-string "empty file\n"))
+             ("https://crates.io/api/v1/crates/foo/1.0.0/dependencies"
+              (open-input-string test-dependencies))
+             (_ (error "Unexpected URL: " url)))))
+    (match (crate->guix-package "foo")
+      (('package
+         ('name "rust-foo")
+         ('version "1.0.0")
+         ('source ('origin
+                    ('method 'url-fetch)
+                    ('uri ('crate-uri "foo" 'version))
+                    ('file-name ('string-append 'name "-" 'version ".tar.gz"))
+                    ('sha256
+                     ('base32
+                      (? string? hash)))))
+         ('build-system 'cargo-build-system)
+         ('inputs
+          ('quasiquote
+           (("rust-bar" ('unquote 'rust-bar) "src"))))
+         ('home-page "http://example.com")
+         ('synopsis "summary")
+         ('description "summary")
+         ('license ('list 'license:expat 'license:asl2.0)))
+       (string=? test-source-hash hash))
+      (x
+       (pk 'fail x #f)))))
+
+(test-end "crate")
diff --git a/tests/derivations.scm b/tests/derivations.scm
index 2b5aa796d4..3fbfec3793 100644
--- a/tests/derivations.scm
+++ b/tests/derivations.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -279,6 +279,27 @@
       (build-derivations %store (list drv))
       #f)))
 
+(unless (force %http-server-socket)
+  (test-skip 1))
+(test-assert "'download' built-in builder, check mode"
+  ;; Make sure rebuilding the 'builtin:download' derivation in check mode
+  ;; works.  See <http://bugs.gnu.org/25089>.
+  (let* ((text (random-text))
+         (drv (derivation %store "world"
+                          "builtin:download" '()
+                          #:env-vars `(("url"
+                                        . ,(object->string (%local-url))))
+                          #:hash-algo 'sha256
+                          #:hash (sha256 (string->utf8 text)))))
+    (and (with-http-server 200 text
+           (build-derivations %store (list drv)))
+         (with-http-server 200 text
+           (build-derivations %store (list drv)
+                              (build-mode check)))
+         (string=? (call-with-input-file (derivation->output-path drv)
+                     get-string-all)
+                   text))))
+
 (test-equal "derivation-name"
   "foo-0.0"
   (let ((drv (derivation %store "foo-0.0" %bash '())))
@@ -1109,3 +1130,7 @@
          (call-with-input-file out get-string-all))))
 
 (test-end)
+
+;; Local Variables:
+;; eval: (put 'with-http-server 'scheme-indent-function 2)
+;; End:
diff --git a/tests/gem.scm b/tests/gem.scm
index a46c2b1439..669cd8ee60 100644
--- a/tests/gem.scm
+++ b/tests/gem.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015 David Thompson <davet@gnu.org>
+;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -45,13 +46,12 @@
 
 (test-assert "gem->guix-package"
   ;; Replace network resources with sample data.
-  (mock ((guix import utils) url-fetch
-         (lambda (url file-name)
+  (mock ((guix http-client) http-fetch
+         (lambda (url)
            (match url
              ("https://rubygems.org/api/v1/gems/foo.json"
-              (with-output-to-file file-name
-                (lambda ()
-                  (display test-json))))
+              (values (open-input-string test-json)
+                      (string-length test-json)))
              (_ (error "Unexpected URL: " url)))))
     (match (gem->guix-package "foo")
       (('package
diff --git a/tests/gexp.scm b/tests/gexp.scm
index 354d28f014..baf78837ae 100644
--- a/tests/gexp.scm
+++ b/tests/gexp.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -92,6 +92,16 @@
                              (package-derivation %store coreutils)))
                  (gexp->sexp* exp)))))
 
+(test-assert "one input package, dotted list"
+  (let ((exp (gexp (coreutils . (ungexp coreutils)))))
+    (and (gexp? exp)
+         (match (gexp-inputs exp)
+           (((p "out"))
+            (eq? p coreutils)))
+         (equal? `(coreutils . ,(derivation->output-path
+                                 (package-derivation %store coreutils)))
+                 (gexp->sexp* exp)))))
+
 (test-assert "one input origin"
   (let ((exp (gexp (display (ungexp (package-source coreutils))))))
     (and (gexp? exp)
@@ -277,6 +287,14 @@
                           (ungexp %bootstrap-guile)))))
     (list (gexp-inputs exp) '<> (gexp-native-inputs exp))))
 
+(test-equal "ungexp + ungexp-native, nested, special mixture"
+  `(() <> ((,coreutils "out")))
+
+  ;; (gexp-native-inputs exp) used to return '(), wrongfully.
+  (let* ((foo (gexp (foo (ungexp-native coreutils))))
+         (exp (gexp (bar (ungexp foo)))))
+    (list (gexp-inputs exp) '<> (gexp-native-inputs exp))))
+
 (test-assert "input list"
   (let ((exp   (gexp (display
                       '(ungexp (list %bootstrap-guile coreutils)))))
@@ -327,7 +345,8 @@
                  `(list ,@(cons 5 outputs))))))
 
 (test-assert "input list splicing + ungexp-native-splicing"
-  (let* ((inputs (list (gexp-input glibc "debug") %bootstrap-guile))
+  (let* ((inputs (list (gexp-input glibc "debug" #:native? #t)
+                       %bootstrap-guile))
          (exp    (gexp (list (ungexp-native-splicing (cons (+ 2 3) inputs))))))
     (and (lset= equal?
                 `((,glibc "debug") (,%bootstrap-guile "out"))
diff --git a/tests/graph.scm b/tests/graph.scm
index f2e441cee6..6431c482f7 100644
--- a/tests/graph.scm
+++ b/tests/graph.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -32,6 +32,7 @@
   #:use-module (gnu packages)
   #:use-module (gnu packages base)
   #:use-module (gnu packages guile)
+  #:use-module (gnu packages libunistring)
   #:use-module (gnu packages bootstrap)
   #:use-module (ice-9 match)
   #:use-module (srfi srfi-1)
@@ -57,7 +58,8 @@ edges."
     (define (return)
       (values (reverse nodes) (reverse edges)))
 
-    (values (graph-backend (const #t) (const #t)
+    (values (graph-backend "test" "This is the test backend."
+                           (const #t) (const #t)
                            record-node record-edge)
             return)))
 
@@ -91,6 +93,17 @@ edges."
                           (list p3 p3 p2)
                           (list p2 p1 p1))))))))
 
+(test-assert "reverse package DAG"
+  (let-values (((backend nodes+edges) (make-recording-backend)))
+    (run-with-store %store
+      (export-graph (list libunistring) 'port
+                    #:node-type %reverse-package-node-type
+                    #:backend backend))
+    ;; We should see nothing more than these 3 packages.
+    (let-values (((nodes edges) (nodes+edges)))
+      (and (member (package->tuple guile-2.0) nodes)
+           (->bool (member (edge->tuple libunistring guile-2.0) edges))))))
+
 (test-assert "bag-emerged DAG"
   (let-values (((backend nodes+edges) (make-recording-backend)))
     (let* ((o        (dummy-origin (method (lambda _
diff --git a/tests/guix-environment.sh b/tests/guix-environment.sh
index 68343520b0..2b3bbfe036 100644
--- a/tests/guix-environment.sh
+++ b/tests/guix-environment.sh
@@ -25,7 +25,8 @@ set -e
 guix environment --version
 
 tmpdir="t-guix-environment-$$"
-trap 'rm -r "$tmpdir"' EXIT
+gcroot="t-guix-environment-gc-root-$$"
+trap 'rm -r "$tmpdir"; rm -f "$gcroot"' EXIT
 
 mkdir "$tmpdir"
 
@@ -61,6 +62,20 @@ fi
 guix environment --bootstrap --ad-hoc guile-bootstrap --pure \
      -- "$SHELL" -c 'test -f "$GUIX_ENVIRONMENT/bin/guile"'
 
+# Make sure '-r' works as expected.
+rm -f "$gcroot"
+expected="`guix environment --bootstrap --ad-hoc guile-bootstrap \
+             -- "$SHELL" -c 'echo $GUIX_ENVIRONMENT'`"
+guix environment --bootstrap -r "$gcroot" --ad-hoc guile-bootstrap \
+     -- guile -c 1
+test `readlink "$gcroot"` = "$expected"
+
+# Make sure '-r' is idempotent.
+guix environment --bootstrap -r "$gcroot" --ad-hoc guile-bootstrap \
+     -- guile -c 1
+test `readlink "$gcroot"` = "$expected"
+
+
 case "`uname -m`" in
     x86_64)
 	# On x86_64, we should be able to create a 32-bit environment.
diff --git a/tests/guix-package.sh b/tests/guix-package.sh
index 68a1946aa0..5ecb33193f 100644
--- a/tests/guix-package.sh
+++ b/tests/guix-package.sh
@@ -1,5 +1,5 @@
 # GNU Guix --- Functional package management for GNU
-# Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+# Copyright © 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 # Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
 #
 # This file is part of GNU Guix.
@@ -39,6 +39,14 @@ trap 'rm -f "$profile" "$profile-"[0-9]* "$tmpfile"; rm -rf "$module_dir" t-home
 if guix package --bootstrap -e +;
 then false; else true; fi
 
+# Install a store item and make sure the version and output in the manifest
+# are correct.
+guix package --bootstrap -p "$profile" -i `guix build guile-bootstrap`
+test "`guix package -A guile-bootstrap | cut -f 1-2`" \
+     = "`guix package -p "$profile" -I | cut -f 1-2`"
+test "`guix package -p "$profile" -I | cut -f 3`" = "out"
+rm "$profile"
+
 guix package --bootstrap -p "$profile" -i guile-bootstrap
 test -L "$profile" && test -L "$profile-1-link"
 test -f "$profile/bin/guile"
diff --git a/tests/packages.scm b/tests/packages.scm
index 47e76b53e9..247f75cc43 100644
--- a/tests/packages.scm
+++ b/tests/packages.scm
@@ -968,7 +968,8 @@
                  (profile-derivation
                   (manifest (map package->manifest-entry
                                  (list p1 p2)))
-                  #:hooks '())
+                  #:hooks '()
+                  #:locales? #f)
                  #:guile-for-build (%guile-for-build))))
     (build-derivations %store (list prof))
     (string-match (format #f "^export XML_CATALOG_FILES=\"~a/xml/+bar/baz/catalog\\.xml\"\n"
diff --git a/tests/profiles.scm b/tests/profiles.scm
index f9c2f5499e..5536364889 100644
--- a/tests/profiles.scm
+++ b/tests/profiles.scm
@@ -195,7 +195,8 @@
       ((entry ->   (package->manifest-entry %bootstrap-guile))
        (guile      (package->derivation %bootstrap-guile))
        (drv        (profile-derivation (manifest (list entry))
-                                       #:hooks '()))
+                                       #:hooks '()
+                                       #:locales? #f))
        (profile -> (derivation->output-path drv))
        (bindir ->  (string-append profile "/bin"))
        (_          (built-derivations (list drv))))
@@ -207,7 +208,8 @@
   (mlet* %store-monad
       ((entry ->   (package->manifest-entry packages:glibc "debug"))
        (drv        (profile-derivation (manifest (list entry))
-                                       #:hooks '())))
+                                       #:hooks '()
+                                       #:locales? #f)))
     (return (derivation-inputs drv))))
 
 (test-assert "package->manifest-entry defaults to \"out\""
@@ -228,7 +230,8 @@
                       (package-native-search-paths packages:guile-2.0))))
        (entry ->   (package->manifest-entry guile))
        (drv        (profile-derivation (manifest (list entry))
-                                       #:hooks '()))
+                                       #:hooks '()
+                                       #:locales? #f))
        (profile -> (derivation->output-path drv)))
     (mbegin %store-monad
       (built-derivations (list drv))
@@ -259,7 +262,8 @@
                       (package-native-search-paths packages:guile-2.0))))
        (entry ->   (package->manifest-entry guile))
        (drv        (profile-derivation (manifest (list entry))
-                                       #:hooks '()))
+                                       #:hooks '()
+                                       #:locales? #f))
        (profile -> (derivation->output-path drv)))
     (mbegin %store-monad
       (built-derivations (list drv))
@@ -293,7 +297,8 @@
                               (display "foo!" port))))))))
        (entry ->   (package->manifest-entry thing))
        (drv        (profile-derivation (manifest (list entry))
-                                       #:hooks '()))
+                                       #:hooks '()
+                                       #:locales? #f))
        (profile -> (derivation->output-path drv)))
     (mbegin %store-monad
       (built-derivations (list drv))
@@ -321,7 +326,8 @@
                               (display "foo!" port))))))))
        (entry ->   (package->manifest-entry thing))
        (drv        (profile-derivation (manifest (list entry))
-                                       #:hooks '()))
+                                       #:hooks '()
+                                       #:locales? #f))
        (profile -> (derivation->output-path drv)))
     (mbegin %store-monad
       (built-derivations (list drv))
diff --git a/tests/pypi.scm b/tests/pypi.scm
index 9d2fcc7391..f26e7fea13 100644
--- a/tests/pypi.scm
+++ b/tests/pypi.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014 David Thompson <davet@gnu.org>
+;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -91,51 +92,55 @@ baz > 13.37")
 
 (test-assert "pypi->guix-package"
   ;; Replace network resources with sample data.
-  (mock ((guix import utils) url-fetch
-         (lambda (url file-name)
-           (match url
-             ("https://pypi.python.org/pypi/foo/json"
-              (with-output-to-file file-name
-                (lambda ()
-                  (display test-json))))
-             ("https://example.com/foo-1.0.0.tar.gz"
-               (begin
-                 (mkdir "foo-1.0.0")
-                 (with-output-to-file "foo-1.0.0/requirements.txt"
-                   (lambda ()
-                     (display test-requirements)))
-                 (system* "tar" "czvf" file-name "foo-1.0.0/")
-                 (delete-file-recursively "foo-1.0.0")
-                 (set! test-source-hash
-                       (call-with-input-file file-name port-sha256))))
-             ("https://example.com/foo-1.0.0-py2.py3-none-any.whl" #f)
-             (_ (error "Unexpected URL: " url)))))
-    (match (pypi->guix-package "foo")
-      (('package
-         ('name "python-foo")
-         ('version "1.0.0")
-         ('source ('origin
-                    ('method 'url-fetch)
-                    ('uri (string-append "https://example.com/foo-"
-                                         version ".tar.gz"))
-                    ('sha256
-                     ('base32
-                      (? string? hash)))))
-         ('build-system 'python-build-system)
-         ('propagated-inputs
-          ('quasiquote
-           (("python-bar" ('unquote 'python-bar))
-            ("python-baz" ('unquote 'python-baz))
-            ("python-setuptools" ('unquote 'python-setuptools)))))
-         ('home-page "http://example.com")
-         ('synopsis "summary")
-         ('description "summary")
-         ('license 'license:lgpl2.0))
-       (string=? (bytevector->nix-base32-string
-                  test-source-hash)
-                 hash))
-      (x
-       (pk 'fail x #f)))))
+    (mock ((guix import utils) url-fetch
+           (lambda (url file-name)
+             (match url
+               ("https://example.com/foo-1.0.0.tar.gz"
+                (begin
+                  (mkdir "foo-1.0.0")
+                  (with-output-to-file "foo-1.0.0/requirements.txt"
+                    (lambda ()
+                      (display test-requirements)))
+                  (system* "tar" "czvf" file-name "foo-1.0.0/")
+                  (delete-file-recursively "foo-1.0.0")
+                  (set! test-source-hash
+                    (call-with-input-file file-name port-sha256))))
+               ("https://example.com/foo-1.0.0-py2.py3-none-any.whl" #f)
+               (_ (error "Unexpected URL: " url)))))
+          (mock ((guix http-client) http-fetch
+                 (lambda (url)
+                   (match url
+                     ("https://pypi.python.org/pypi/foo/json"
+                      (values (open-input-string test-json)
+                              (string-length test-json)))
+                     ("https://example.com/foo-1.0.0-py2.py3-none-any.whl" #f)
+                     (_ (error "Unexpected URL: " url)))))
+                (match (pypi->guix-package "foo")
+                  (('package
+                     ('name "python-foo")
+                     ('version "1.0.0")
+                     ('source ('origin
+                                ('method 'url-fetch)
+                                ('uri (string-append "https://example.com/foo-"
+                                                     version ".tar.gz"))
+                                ('sha256
+                                 ('base32
+                                  (? string? hash)))))
+                     ('build-system 'python-build-system)
+                     ('propagated-inputs
+                      ('quasiquote
+                       (("python-bar" ('unquote 'python-bar))
+                        ("python-baz" ('unquote 'python-baz))
+                        ("python-setuptools" ('unquote 'python-setuptools)))))
+                     ('home-page "http://example.com")
+                     ('synopsis "summary")
+                     ('description "summary")
+                     ('license 'license:lgpl2.0))
+                   (string=? (bytevector->nix-base32-string
+                              test-source-hash)
+                             hash))
+                  (x
+                   (pk 'fail x #f))))))
 
 (test-skip (if (which "zip") 0 1))
 (test-assert "pypi->guix-package, wheels"
@@ -143,10 +148,6 @@ baz > 13.37")
   (mock ((guix import utils) url-fetch
          (lambda (url file-name)
            (match url
-             ("https://pypi.python.org/pypi/foo/json"
-              (with-output-to-file file-name
-                (lambda ()
-                  (display test-json))))
              ("https://example.com/foo-1.0.0.tar.gz"
                (begin
                  (mkdir "foo-1.0.0")
@@ -170,31 +171,39 @@ baz > 13.37")
                    (rename-file zip-file file-name))
                  (delete-file-recursively "foo-1.0.0.dist-info")))
              (_ (error "Unexpected URL: " url)))))
-    (match (pypi->guix-package "foo")
-      (('package
-         ('name "python-foo")
-         ('version "1.0.0")
-         ('source ('origin
-                    ('method 'url-fetch)
-                    ('uri (string-append "https://example.com/foo-"
-                                         version ".tar.gz"))
-                    ('sha256
-                     ('base32
-                      (? string? hash)))))
-         ('build-system 'python-build-system)
-         ('propagated-inputs
-          ('quasiquote
-           (("python-bar" ('unquote 'python-bar))
-            ("python-baz" ('unquote 'python-baz))
-            ("python-setuptools" ('unquote 'python-setuptools)))))
-         ('home-page "http://example.com")
-         ('synopsis "summary")
-         ('description "summary")
-         ('license 'license:lgpl2.0))
-       (string=? (bytevector->nix-base32-string
-                  test-source-hash)
-                 hash))
-      (x
-       (pk 'fail x #f)))))
+        (mock ((guix http-client) http-fetch
+               (lambda (url)
+                 (match url
+                   ("https://pypi.python.org/pypi/foo/json"
+                    (values (open-input-string test-json)
+                            (string-length test-json)))
+                   ("https://example.com/foo-1.0.0-py2.py3-none-any.whl" #f)
+                   (_ (error "Unexpected URL: " url)))))
+              (match (pypi->guix-package "foo")
+                (('package
+                   ('name "python-foo")
+                   ('version "1.0.0")
+                   ('source ('origin
+                              ('method 'url-fetch)
+                              ('uri (string-append "https://example.com/foo-"
+                                                   version ".tar.gz"))
+                              ('sha256
+                               ('base32
+                                (? string? hash)))))
+                   ('build-system 'python-build-system)
+                   ('propagated-inputs
+                    ('quasiquote
+                     (("python-bar" ('unquote 'python-bar))
+                      ("python-baz" ('unquote 'python-baz))
+                      ("python-setuptools" ('unquote 'python-setuptools)))))
+                   ('home-page "http://example.com")
+                   ('synopsis "summary")
+                   ('description "summary")
+                   ('license 'license:lgpl2.0))
+                 (string=? (bytevector->nix-base32-string
+                            test-source-hash)
+                           hash))
+                (x
+                 (pk 'fail x #f))))))
 
 (test-end "pypi")
diff --git a/tests/scripts-build.scm b/tests/scripts-build.scm
index b324012806..a1f684c736 100644
--- a/tests/scripts-build.scm
+++ b/tests/scripts-build.scm
@@ -50,6 +50,19 @@
                        (add-to-store store "guix.scm" #t
                                      "sha256" s)))))))
 
+(test-assert "options->transformation, with-source, replacement"
+  ;; Same, but this time the original package has a 'replacement' field.  We
+  ;; expect that replacement to be set to #f in the new package.
+  (let* ((p (dummy-package "guix.scm" (replacement coreutils)))
+         (s (search-path %load-path "guix.scm"))
+         (t (options->transformation `((with-source . ,s)))))
+    (with-store store
+      (let ((new (t store p)))
+        (and (not (eq? new p))
+             (string=? (package-source new)
+                       (add-to-store store "guix.scm" #t "sha256" s))
+             (not (package-replacement new)))))))
+
 (test-assert "options->transformation, with-source, with version"
   ;; Our pseudo-package is called 'guix.scm' so the 'guix.scm-2.0' source
   ;; should be applicable, and its version should be extracted.