summary refs log tree commit diff
diff options
context:
space:
mode:
authorRicardo Wurmus <rekado@elephly.net>2019-01-23 12:08:27 +0100
committerRicardo Wurmus <rekado@elephly.net>2019-01-23 12:08:27 +0100
commit5aaef5c5decbf4dd43dfd1bb8d2a7d9e049a8580 (patch)
tree9f4ce853b9bc2d2b5433d8f0bec18749e93d8ba3
parent38f77be464b0b6ca76105d5f0a1b5e55fd694036 (diff)
parent6a6799b27af8646da112d51bedb8e5ff6158e425 (diff)
downloadguix-5aaef5c5decbf4dd43dfd1bb8d2a7d9e049a8580.tar.gz
Merge branch 'master' into staging
-rw-r--r--.mailmap1
-rw-r--r--TODO5
-rw-r--r--build-aux/build-self.scm51
-rw-r--r--build-aux/run-system-tests.scm2
-rw-r--r--doc/contributing.texi450
-rw-r--r--doc/guix.texi2256
-rw-r--r--gnu/ci.scm6
-rw-r--r--gnu/packages/base.scm18
-rw-r--r--gnu/packages/cpp.scm11
-rw-r--r--gnu/packages/ebook.scm4
-rw-r--r--gnu/packages/emacs-xyz.scm112
-rw-r--r--gnu/packages/finance.scm14
-rw-r--r--gnu/packages/games.scm14
-rw-r--r--gnu/packages/guile.scm4
-rw-r--r--gnu/packages/haskell.scm4
-rw-r--r--gnu/packages/linux.scm95
-rw-r--r--gnu/packages/messaging.scm8
-rw-r--r--gnu/packages/moreutils.scm9
-rw-r--r--gnu/packages/package-management.scm26
-rw-r--r--gnu/packages/pdf.scm61
-rw-r--r--gnu/packages/perl-check.scm22
-rw-r--r--gnu/packages/perl.scm55
-rw-r--r--gnu/packages/python-web.scm16
-rw-r--r--gnu/packages/python-xyz.scm47
-rw-r--r--gnu/packages/video.scm18
-rw-r--r--gnu/packages/virtualization.scm215
-rw-r--r--gnu/packages/xml.scm6
-rw-r--r--gnu/packages/xorg.scm6
-rw-r--r--gnu/system/vm.scm1
-rw-r--r--gnu/tests/install.scm3
-rw-r--r--guix/build/compile.scm56
-rw-r--r--guix/deprecation.scm24
-rw-r--r--guix/derivations.scm2
-rw-r--r--guix/grafts.scm2
-rw-r--r--guix/import/github.scm67
-rw-r--r--guix/inferior.scm12
-rw-r--r--guix/records.scm20
-rw-r--r--guix/scripts/challenge.scm2
-rw-r--r--guix/scripts/graph.scm2
-rw-r--r--guix/scripts/lint.scm4
-rw-r--r--guix/scripts/offload.scm43
-rw-r--r--guix/scripts/pull.scm1
-rw-r--r--guix/self.scm19
-rw-r--r--guix/serialization.scm2
-rw-r--r--guix/ssh.scm12
-rw-r--r--guix/store.scm232
-rw-r--r--guix/tests.scm2
-rw-r--r--guix/ui.scm10
-rw-r--r--tests/derivations.scm42
-rw-r--r--tests/gexp.scm4
-rw-r--r--tests/guix-daemon.sh8
-rw-r--r--tests/guix-system.sh6
-rw-r--r--tests/packages.scm2
-rw-r--r--tests/records.scm26
-rw-r--r--tests/store.scm46
55 files changed, 2341 insertions, 1845 deletions
diff --git a/.mailmap b/.mailmap
index 620f055638..981decdeef 100644
--- a/.mailmap
+++ b/.mailmap
@@ -41,6 +41,7 @@ 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>
 Mathieu Othacehe <m.othacehe@gmail.com>
+Mathieu Othacehe <mathieu.othacehe@parrot.com>
 Nikita Karetnikov <nikita@karetnikov.org> <nikita.karetnikov@gmail.com>
 Nils Gillmann <ng0@n0.is> ng0 <ng0@n0.is>
 Nils Gillmann <ng0@n0.is> Nils Gillmann <gillmann@infotropique.org>
diff --git a/TODO b/TODO
index 3c7ae6ef6c..f854f7fa98 100644
--- a/TODO
+++ b/TODO
@@ -103,7 +103,7 @@ Running mkfs.ext4 on /dev/sda2 ...
 
 [              40%              ]
 Running mkfs.ext4 on /dev/sda3 ...
-
+*** Add a confirmation page before formating/partitioning
 ** Desktop environments
 *** Allow for no desktop environments
 Propose to choose between "headless server" and "lightweight X11" in a new
@@ -119,3 +119,6 @@ Under the form:
 (UTC + 1) Europe/Paris
 (UTC + 2) Africa/Cairo
 ...
+** Display issue
+*** Investigate display issue described here:
+https://lists.gnu.org/archive/html/guix-devel/2019-01/msg00305.html
diff --git a/build-aux/build-self.scm b/build-aux/build-self.scm
index 87a45d94db..f70c3d91ff 100644
--- a/build-aux/build-self.scm
+++ b/build-aux/build-self.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2014, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -293,9 +293,6 @@ interface (FFI) of Guile.")
                       (use-modules (ice-9 match))
 
                       (eval-when (expand load eval)
-                        ;; Don't augment '%load-path'.
-                        (unsetenv "GUIX_PACKAGE_PATH")
-
                         ;; (gnu packages …) modules are going to be looked up
                         ;; under SOURCE.  (guix config) is looked up in FRONT.
                         (match (command-line)
@@ -312,15 +309,11 @@ interface (FFI) of Guile.")
 
                         ;; Only load Guile-Gcrypt, our own modules, or those
                         ;; of Guile.
-                        (match %load-compiled-path
-                          ((front _ ... sys1 sys2)
-                           (unless (string-prefix? #$guile-gcrypt front)
-                             (set! %load-compiled-path
-                               (list (string-append #$guile-gcrypt
-                                                    "/lib/guile/"
-                                                    (effective-version)
-                                                    "/site-ccache")
-                                     front sys1 sys2))))))
+                        (set! %load-compiled-path
+                          (cons (string-append #$guile-gcrypt "/lib/guile/"
+                                               (effective-version)
+                                               "/site-ccache")
+                                %load-compiled-path)))
 
                       (use-modules (guix store)
                                    (guix self)
@@ -372,6 +365,19 @@ interface (FFI) of Guile.")
                              derivation-file-name))))))
                   #:module-path (list source))))
 
+(define (call-with-clean-environment thunk)
+  (let ((env (environ)))
+    (dynamic-wind
+      (lambda ()
+        (environ '()))
+      thunk
+      (lambda ()
+        (environ env)))))
+
+(define-syntax-rule (with-clean-environment exp ...)
+  "Evaluate EXP in a context where zero environment variables are defined."
+  (call-with-clean-environment (lambda () exp ...)))
+
 ;; The procedure below is our return value.
 (define* (build source
                 #:key verbose? (version (date-version-string)) system
@@ -406,14 +412,17 @@ files."
       ;; stdin will actually be /dev/null.
       (let* ((pipe   (with-input-from-port port
                        (lambda ()
-                         (setenv "GUILE_WARN_DEPRECATED" "no") ;be quiet and drive
-                         (open-pipe* OPEN_READ
-                                     (derivation->output-path build)
-                                     source system version
-                                     (if (file-port? port)
-                                         (number->string
-                                          (logior major minor))
-                                         "none")))))
+                         ;; Make sure BUILD is not influenced by
+                         ;; $GUILE_LOAD_PATH & co.
+                         (with-clean-environment
+                          (setenv "GUILE_WARN_DEPRECATED" "no") ;be quiet and drive
+                          (open-pipe* OPEN_READ
+                                      (derivation->output-path build)
+                                      source system version
+                                      (if (file-port? port)
+                                          (number->string
+                                           (logior major minor))
+                                          "none"))))))
              (str    (get-string-all pipe))
              (status (close-pipe pipe)))
         (match str
diff --git a/build-aux/run-system-tests.scm b/build-aux/run-system-tests.scm
index bcd7547704..fd1f6653af 100644
--- a/build-aux/run-system-tests.scm
+++ b/build-aux/run-system-tests.scm
@@ -30,7 +30,7 @@
 
 (define (built-derivations* drv)
   (lambda (store)
-    (guard (c ((nix-protocol-error? c)
+    (guard (c ((store-protocol-error? c)
                (values #f store)))
       (values (build-derivations store drv) store))))
 
diff --git a/doc/contributing.texi b/doc/contributing.texi
index f24886233d..ecc20dabc5 100644
--- a/doc/contributing.texi
+++ b/doc/contributing.texi
@@ -23,6 +23,7 @@ choice.
 * Building from Git::           The latest and greatest.
 * Running Guix Before It Is Installed::  Hacker tricks.
 * The Perfect Setup::           The right tools.
+* Packaging Guidelines::        Growing the distribution.
 * Coding Style::                Hygiene of the contributor.
 * Submitting Patches::          Share your work.
 @end menu
@@ -223,6 +224,455 @@ trigger string @code{origin...}, which can be expanded further.  The
 @code{...}, which also can be expanded further.
 
 
+@node Packaging Guidelines
+@section Packaging Guidelines
+
+@cindex packages, creating
+The GNU distribution is nascent and may well lack some of your favorite
+packages.  This section describes how you can help make the distribution
+grow.
+
+Free software packages are usually distributed in the form of
+@dfn{source code tarballs}---typically @file{tar.gz} files that contain
+all the source files.  Adding a package to the distribution means
+essentially two things: adding a @dfn{recipe} that describes how to
+build the package, including a list of other packages required to build
+it, and adding @dfn{package metadata} along with that recipe, such as a
+description and licensing information.
+
+In Guix all this information is embodied in @dfn{package definitions}.
+Package definitions provide a high-level view of the package.  They are
+written using the syntax of the Scheme programming language; in fact,
+for each package we define a variable bound to the package definition,
+and export that variable from a module (@pxref{Package Modules}).
+However, in-depth Scheme knowledge is @emph{not} a prerequisite for
+creating packages.  For more information on package definitions,
+@pxref{Defining Packages}.
+
+Once a package definition is in place, stored in a file in the Guix
+source tree, it can be tested using the @command{guix build} command
+(@pxref{Invoking guix build}).  For example, assuming the new package is
+called @code{gnew}, you may run this command from the Guix build tree
+(@pxref{Running Guix Before It Is Installed}):
+
+@example
+./pre-inst-env guix build gnew --keep-failed
+@end example
+
+Using @code{--keep-failed} makes it easier to debug build failures since
+it provides access to the failed build tree.  Another useful
+command-line option when debugging is @code{--log-file}, to access the
+build log.
+
+If the package is unknown to the @command{guix} command, it may be that
+the source file contains a syntax error, or lacks a @code{define-public}
+clause to export the package variable.  To figure it out, you may load
+the module from Guile to get more information about the actual error:
+
+@example
+./pre-inst-env guile -c '(use-modules (gnu packages gnew))'
+@end example
+
+Once your package builds correctly, please send us a patch
+(@pxref{Submitting Patches}).  Well, if you need help, we will be happy to
+help you too.  Once the patch is committed in the Guix repository, the
+new package automatically gets built on the supported platforms by
+@url{http://hydra.gnu.org/jobset/gnu/master, our continuous integration
+system}.
+
+@cindex substituter
+Users can obtain the new package definition simply by running
+@command{guix pull} (@pxref{Invoking guix pull}).  When
+@code{@value{SUBSTITUTE-SERVER}} is done building the package, installing the
+package automatically downloads binaries from there
+(@pxref{Substitutes}).  The only place where human intervention is
+needed is to review and apply the patch.
+
+
+@menu
+* Software Freedom::            What may go into the distribution.
+* Package Naming::              What's in a name?
+* Version Numbers::             When the name is not enough.
+* Synopses and Descriptions::   Helping users find the right package.
+* Python Modules::              A touch of British comedy.
+* Perl Modules::                Little pearls.
+* Java Packages::               Coffee break.
+* Fonts::                       Fond of fonts.
+@end menu
+
+@node Software Freedom
+@subsection Software Freedom
+
+@c Adapted from http://www.gnu.org/philosophy/philosophy.html.
+@cindex free software
+The GNU operating system has been developed so that users can have
+freedom in their computing.  GNU is @dfn{free software}, meaning that
+users have the @url{http://www.gnu.org/philosophy/free-sw.html,four
+essential freedoms}: to run the program, to study and change the program
+in source code form, to redistribute exact copies, and to distribute
+modified versions.  Packages found in the GNU distribution provide only
+software that conveys these four freedoms.
+
+In addition, the GNU distribution follow the
+@url{http://www.gnu.org/distros/free-system-distribution-guidelines.html,free
+software distribution guidelines}.  Among other things, these guidelines
+reject non-free firmware, recommendations of non-free software, and
+discuss ways to deal with trademarks and patents.
+
+Some otherwise free upstream package sources contain a small and optional
+subset that violates the above guidelines, for instance because this subset
+is itself non-free code.  When that happens, the offending items are removed
+with appropriate patches or code snippets in the @code{origin} form of the
+package (@pxref{Defining Packages}).  This way, @code{guix
+build --source} returns the ``freed'' source rather than the unmodified
+upstream source.
+
+
+@node Package Naming
+@subsection Package Naming
+
+@cindex package name
+A package has actually two names associated with it:
+First, there is the name of the @emph{Scheme variable}, the one following
+@code{define-public}.  By this name, the package can be made known in the
+Scheme code, for instance as input to another package.  Second, there is
+the string in the @code{name} field of a package definition.  This name
+is used by package management commands such as
+@command{guix package} and @command{guix build}.
+
+Both are usually the same and correspond to the lowercase conversion of
+the project name chosen upstream, with underscores replaced with
+hyphens.  For instance, GNUnet is available as @code{gnunet}, and
+SDL_net as @code{sdl-net}.
+
+We do not add @code{lib} prefixes for library packages, unless these are
+already part of the official project name.  But @pxref{Python
+Modules} and @ref{Perl Modules} for special rules concerning modules for
+the Python and Perl languages.
+
+Font package names are handled differently, @pxref{Fonts}.
+
+
+@node Version Numbers
+@subsection Version Numbers
+
+@cindex package version
+We usually package only the latest version of a given free software
+project.  But sometimes, for instance for incompatible library versions,
+two (or more) versions of the same package are needed.  These require
+different Scheme variable names.  We use the name as defined
+in @ref{Package Naming}
+for the most recent version; previous versions use the same name, suffixed
+by @code{-} and the smallest prefix of the version number that may
+distinguish the two versions.
+
+The name inside the package definition is the same for all versions of a
+package and does not contain any version number.
+
+For instance, the versions 2.24.20 and 3.9.12 of GTK+ may be packaged as follows:
+
+@example
+(define-public gtk+
+  (package
+    (name "gtk+")
+    (version "3.9.12")
+    ...))
+(define-public gtk+-2
+  (package
+    (name "gtk+")
+    (version "2.24.20")
+    ...))
+@end example
+If we also wanted GTK+ 3.8.2, this would be packaged as
+@example
+(define-public gtk+-3.8
+  (package
+    (name "gtk+")
+    (version "3.8.2")
+    ...))
+@end example
+
+@c See <https://lists.gnu.org/archive/html/guix-devel/2016-01/msg00425.html>,
+@c for a discussion of what follows.
+@cindex version number, for VCS snapshots
+Occasionally, we package snapshots of upstream's version control system
+(VCS) instead of formal releases.  This should remain exceptional,
+because it is up to upstream developers to clarify what the stable
+release is.  Yet, it is sometimes necessary.  So, what should we put in
+the @code{version} field?
+
+Clearly, we need to make the commit identifier of the VCS snapshot
+visible in the version string, but we also need to make sure that the
+version string is monotonically increasing so that @command{guix package
+--upgrade} can determine which version is newer.  Since commit
+identifiers, notably with Git, are not monotonically increasing, we add
+a revision number that we increase each time we upgrade to a newer
+snapshot.  The resulting version string looks like this:
+
+@example
+2.0.11-3.cabba9e
+  ^    ^    ^
+  |    |    `-- upstream commit ID
+  |    |
+  |    `--- Guix package revision
+  |
+latest upstream version
+@end example
+
+It is a good idea to strip commit identifiers in the @code{version}
+field to, say, 7 digits.  It avoids an aesthetic annoyance (assuming
+aesthetics have a role to play here) as well as problems related to OS
+limits such as the maximum shebang length (127 bytes for the Linux
+kernel.)  It is best to use the full commit identifiers in
+@code{origin}s, though, to avoid ambiguities.  A typical package
+definition may look like this:
+
+@example
+(define my-package
+  (let ((commit "c3f29bc928d5900971f65965feaae59e1272a3f7")
+        (revision "1"))          ;Guix package revision
+    (package
+      (version (git-version "0.9" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "git://example.org/my-package.git")
+                      (commit commit)))
+                (sha256 (base32 "1mbikn@dots{}"))
+                (file-name (git-file-name name version))))
+      ;; @dots{}
+      )))
+@end example
+
+@node Synopses and Descriptions
+@subsection Synopses and Descriptions
+
+@cindex package description
+@cindex package synopsis
+As we have seen before, each package in GNU@tie{}Guix includes a
+synopsis and a description (@pxref{Defining Packages}).  Synopses and
+descriptions are important: They are what @command{guix package
+--search} searches, and a crucial piece of information to help users
+determine whether a given package suits their needs.  Consequently,
+packagers should pay attention to what goes into them.
+
+Synopses must start with a capital letter and must not end with a
+period.  They must not start with ``a'' or ``the'', which usually does
+not bring anything; for instance, prefer ``File-frobbing tool'' over ``A
+tool that frobs files''.  The synopsis should say what the package
+is---e.g., ``Core GNU utilities (file, text, shell)''---or what it is
+used for---e.g., the synopsis for GNU@tie{}grep is ``Print lines
+matching a pattern''.
+
+Keep in mind that the synopsis must be meaningful for a very wide
+audience.  For example, ``Manipulate alignments in the SAM format''
+might make sense for a seasoned bioinformatics researcher, but might be
+fairly unhelpful or even misleading to a non-specialized audience.  It
+is a good idea to come up with a synopsis that gives an idea of the
+application domain of the package.  In this example, this might give
+something like ``Manipulate nucleotide sequence alignments'', which
+hopefully gives the user a better idea of whether this is what they are
+looking for.
+
+Descriptions should take between five and ten lines.  Use full
+sentences, and avoid using acronyms without first introducing them.
+Please avoid marketing phrases such as ``world-leading'',
+``industrial-strength'', and ``next-generation'', and avoid superlatives
+like ``the most advanced''---they are not helpful to users looking for a
+package and may even sound suspicious.  Instead, try to be factual,
+mentioning use cases and features.
+
+@cindex Texinfo markup, in package descriptions
+Descriptions can include Texinfo markup, which is useful to introduce
+ornaments such as @code{@@code} or @code{@@dfn}, bullet lists, or
+hyperlinks (@pxref{Overview,,, texinfo, GNU Texinfo}).  However you
+should be careful when using some characters for example @samp{@@} and
+curly braces which are the basic special characters in Texinfo
+(@pxref{Special Characters,,, texinfo, GNU Texinfo}).  User interfaces
+such as @command{guix package --show} take care of rendering it
+appropriately.
+
+Synopses and descriptions are translated by volunteers
+@uref{http://translationproject.org/domain/guix-packages.html, at the
+Translation Project} so that as many users as possible can read them in
+their native language.  User interfaces search them and display them in
+the language specified by the current locale.
+
+To allow @command{xgettext} to extract them as translatable strings,
+synopses and descriptions @emph{must be literal strings}.  This means
+that you cannot use @code{string-append} or @code{format} to construct
+these strings:
+
+@lisp
+(package
+  ;; @dots{}
+  (synopsis "This is translatable")
+  (description (string-append "This is " "*not*" " translatable.")))
+@end lisp
+
+Translation is a lot of work so, as a packager, please pay even more
+attention to your synopses and descriptions as every change may entail
+additional work for translators.  In order to help them, it is possible
+to make recommendations or instructions visible to them by inserting
+special comments like this (@pxref{xgettext Invocation,,, gettext, GNU
+Gettext}):
+
+@example
+;; TRANSLATORS: "X11 resize-and-rotate" should not be translated.
+(description "ARandR is designed to provide a simple visual front end
+for the X11 resize-and-rotate (RandR) extension. @dots{}")
+@end example
+
+
+@node Python Modules
+@subsection Python Modules
+
+@cindex python
+We currently package Python 2 and Python 3, under the Scheme variable names
+@code{python-2} and @code{python} as explained in @ref{Version Numbers}.
+To avoid confusion and naming clashes with other programming languages, it
+seems desirable that the name of a package for a Python module contains
+the word @code{python}.
+
+Some modules are compatible with only one version of Python, others with both.
+If the package Foo compiles only with Python 3, we name it
+@code{python-foo}; if it compiles only with Python 2, we name it
+@code{python2-foo}. If it is compatible with both versions, we create two
+packages with the corresponding names.
+
+If a project already contains the word @code{python}, we drop this;
+for instance, the module python-dateutil is packaged under the names
+@code{python-dateutil} and @code{python2-dateutil}.  If the project name
+starts with @code{py} (e.g.@: @code{pytz}), we keep it and prefix it as
+described above.
+
+@subsubsection Specifying Dependencies
+@cindex inputs, for Python packages
+
+Dependency information for Python packages is usually available in the
+package source tree, with varying degrees of accuracy: in the
+@file{setup.py} file, in @file{requirements.txt}, or in @file{tox.ini}.
+
+Your mission, when writing a recipe for a Python package, is to map
+these dependencies to the appropriate type of ``input'' (@pxref{package
+Reference, inputs}).  Although the @code{pypi} importer normally does a
+good job (@pxref{Invoking guix import}), you may want to check the
+following check list to determine which dependency goes where.
+
+@itemize
+
+@item
+We currently package Python 2 with @code{setuptools} and @code{pip}
+installed like Python 3.4 has per default.  Thus you don't need to
+specify either of these as an input.  @command{guix lint} will warn you
+if you do.
+
+@item
+Python dependencies required at run time go into
+@code{propagated-inputs}.  They are typically defined with the
+@code{install_requires} keyword in @file{setup.py}, or in the
+@file{requirements.txt} file.
+
+@item
+Python packages required only at build time---e.g., those listed with
+the @code{setup_requires} keyword in @file{setup.py}---or only for
+testing---e.g., those in @code{tests_require}---go into
+@code{native-inputs}.  The rationale is that (1) they do not need to be
+propagated because they are not needed at run time, and (2) in a
+cross-compilation context, it's the ``native'' input that we'd want.
+
+Examples are the @code{pytest}, @code{mock}, and @code{nose} test
+frameworks.  Of course if any of these packages is also required at
+run-time, it needs to go to @code{propagated-inputs}.
+
+@item
+Anything that does not fall in the previous categories goes to
+@code{inputs}, for example programs or C libraries required for building
+Python packages containing C extensions.
+
+@item
+If a Python package has optional dependencies (@code{extras_require}),
+it is up to you to decide whether to add them or not, based on their
+usefulness/overhead ratio (@pxref{Submitting Patches, @command{guix
+size}}).
+
+@end itemize
+
+
+@node Perl Modules
+@subsection Perl Modules
+
+@cindex perl
+Perl programs standing for themselves are named as any other package,
+using the lowercase upstream name.
+For Perl packages containing a single class, we use the lowercase class name,
+replace all occurrences of @code{::} by dashes and prepend the prefix
+@code{perl-}.
+So the class @code{XML::Parser} becomes @code{perl-xml-parser}.
+Modules containing several classes keep their lowercase upstream name and
+are also prepended by @code{perl-}.  Such modules tend to have the word
+@code{perl} somewhere in their name, which gets dropped in favor of the
+prefix.  For instance, @code{libwww-perl} becomes @code{perl-libwww}.
+
+
+@node Java Packages
+@subsection Java Packages
+
+@cindex java
+Java programs standing for themselves are named as any other package,
+using the lowercase upstream name.
+
+To avoid confusion and naming clashes with other programming languages,
+it is desirable that the name of a package for a Java package is
+prefixed with @code{java-}.  If a project already contains the word
+@code{java}, we drop this; for instance, the package @code{ngsjava} is
+packaged under the name @code{java-ngs}.
+
+For Java packages containing a single class or a small class hierarchy,
+we use the lowercase class name, replace all occurrences of @code{.} by
+dashes and prepend the prefix @code{java-}.  So the class
+@code{apache.commons.cli} becomes package
+@code{java-apache-commons-cli}.
+
+
+@node Fonts
+@subsection Fonts
+
+@cindex fonts
+For fonts that are in general not installed by a user for typesetting
+purposes, or that are distributed as part of a larger software package,
+we rely on the general packaging rules for software; for instance, this
+applies to the fonts delivered as part of the X.Org system or fonts that
+are part of TeX Live.
+
+To make it easier for a user to search for fonts, names for other packages
+containing only fonts are constructed as follows, independently of the
+upstream package name.
+
+The name of a package containing only one font family starts with
+@code{font-}; it is followed by the foundry name and a dash @code{-}
+if the foundry is known, and the font family name, in which spaces are
+replaced by dashes (and as usual, all upper case letters are transformed
+to lower case).
+For example, the Gentium font family by SIL is packaged under the name
+@code{font-sil-gentium}.
+
+For a package containing several font families, the name of the collection
+is used in the place of the font family name.
+For instance, the Liberation fonts consist of three families,
+Liberation Sans, Liberation Serif and Liberation Mono.
+These could be packaged separately under the names
+@code{font-liberation-sans} and so on; but as they are distributed together
+under a common name, we prefer to package them together as
+@code{font-liberation}.
+
+In the case where several formats of the same font family or font collection
+are packaged separately, a short form of the format, prepended by a dash,
+is added to the package name.  We use @code{-ttf} for TrueType fonts,
+@code{-otf} for OpenType fonts and @code{-type1} for PostScript Type 1
+fonts.
+
+
 @node Coding Style
 @section Coding Style
 
diff --git a/doc/guix.texi b/doc/guix.texi
index d6148757fe..ceec8caa46 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -117,10 +117,16 @@ Project}.
 @menu
 * Introduction::                What is Guix about?
 * Installation::                Installing Guix.
+* System Installation::         Installing the whole operating system.
 * Package Management::          Package installation, upgrade, etc.
 * Programming Interface::       Using Guix in Scheme.
 * Utilities::                   Package management commands.
-* GNU Distribution::            Software for your friendly GNU system.
+* System Configuration::        Configuring the operating system.
+* Documentation::               Browsing software user manuals.
+* Installing Debugging Files::  Feeding the debugger.
+* Security Updates::            Deploying security fixes quickly.
+* Bootstrapping::               GNU/Linux built from scratch.
+* Porting::                     Targeting another platform or kernel.
 * Contributing::                Your help needed!
 
 * Acknowledgments::             Thanks!
@@ -146,6 +152,16 @@ Setting Up the Daemon
 * Daemon Offload Setup::        Offloading builds to remote machines.
 * SELinux Support::             Using an SELinux policy for the daemon.
 
+System Installation
+
+* Limitations::                 What you can expect.
+* Hardware Considerations::     Supported hardware.
+* USB Stick and DVD Installation::  Preparing the installation medium.
+* Preparing for Installation::  Networking, partitioning, etc.
+* Proceeding with the Installation::  The real thing.
+* Installing GuixSD in a VM::   GuixSD playground.
+* Building the Installation Image::  How this comes to be.
+
 Package Management
 
 * Features::                    How Guix will make your life brighter.
@@ -171,6 +187,7 @@ Substitutes
 
 Programming Interface
 
+* Package Modules::             Packages from the programmer's viewpoint.
 * Defining Packages::           Defining new packages.
 * Build Systems::               Specifying how packages are built.
 * The Store::                   Manipulating the package store.
@@ -210,28 +227,6 @@ Invoking @command{guix build}
 * Additional Build Options::    Options specific to 'guix build'.
 * Debugging Build Failures::    Real life packaging experience.
 
-GNU Distribution
-
-* System Installation::         Installing the whole operating system.
-* System Configuration::        Configuring the operating system.
-* Documentation::               Browsing software user manuals.
-* Installing Debugging Files::  Feeding the debugger.
-* Security Updates::            Deploying security fixes quickly.
-* Package Modules::             Packages from the programmer's viewpoint.
-* Packaging Guidelines::        Growing the distribution.
-* Bootstrapping::               GNU/Linux built from scratch.
-* Porting::                     Targeting another platform or kernel.
-
-System Installation
-
-* Limitations::                 What you can expect.
-* Hardware Considerations::     Supported hardware.
-* USB Stick and DVD Installation::  Preparing the installation medium.
-* Preparing for Installation::  Networking, partitioning, etc.
-* Proceeding with the Installation::  The real thing.
-* Installing GuixSD in a VM::   GuixSD playground.
-* Building the Installation Image::  How this comes to be.
-
 System Configuration
 
 * Using the Configuration System::  Customizing your GNU system.
@@ -286,32 +281,6 @@ Defining Services
 * Service Reference::           API reference.
 * Shepherd Services::           A particular type of service.
 
-Packaging Guidelines
-
-* Software Freedom::            What may go into the distribution.
-* Package Naming::              What's in a name?
-* Version Numbers::             When the name is not enough.
-* Synopses and Descriptions::   Helping users find the right package.
-* Python Modules::              A touch of British comedy.
-* Perl Modules::                Little pearls.
-* Java Packages::               Coffee break.
-* Fonts::                       Fond of fonts.
-
-Contributing
-
-* Building from Git::           The latest and greatest.
-* Running Guix Before It Is Installed::  Hacker tricks.
-* The Perfect Setup::           The right tools.
-* Coding Style::                Hygiene of the contributor.
-* Submitting Patches::          Share your work.
-
-Coding Style
-
-* Programming Paradigm::        How to compose your elements.
-* Modules::                     Where to store your code?
-* Data Types and Pattern Matching::  Implementing data structures.
-* Formatting Code::             Writing conventions.
-
 @end detailmenu
 @end menu
 
@@ -322,11 +291,22 @@ Coding Style
 @cindex purpose
 GNU Guix@footnote{``Guix'' is pronounced like ``geeks'', or ``ɡiːks''
 using the international phonetic alphabet (IPA).} is a package
-management tool for the GNU system.  Guix makes it easy for unprivileged
-users to install, upgrade, or remove packages, to roll back to a
+management tool for and distribution of the GNU system.
+Guix makes it easy for unprivileged
+users to install, upgrade, or remove software packages, to roll back to a
 previous package set, to build packages from source, and generally
 assists with the creation and maintenance of software environments.
 
+@cindex Guix System
+@cindex GuixSD
+You can install GNU@tie{}Guix on top of an existing GNU/Linux system where it
+complements the available tools without interference (@pxref{Installation}),
+or you can use it as a standalone operating system distribution,
+@dfn{Guix@tie{}System} (@pxref{GNU Distribution}).
+
+@node Managing Software the Guix Way
+@section Managing Software the Guix Way
+
 @cindex user interfaces
 Guix provides a command-line package management interface
 (@pxref{Invoking guix package}), a set of command-line utilities
@@ -348,17 +328,6 @@ is also @emph{customizable}: users can @emph{derive} specialized package
 definitions from existing ones, including from the command line
 (@pxref{Package Transformation Options}).
 
-@cindex Guix System Distribution
-@cindex GuixSD
-You can install GNU@tie{}Guix on top of an existing GNU/Linux system
-where it complements the available tools without interference
-(@pxref{Installation}), or you can use it as part of the standalone
-@dfn{Guix System Distribution} or GuixSD (@pxref{GNU Distribution}).
-With GNU@tie{}GuixSD, you @emph{declare} all aspects of the operating
-system configuration and Guix takes care of instantiating the
-configuration in a transactional, reproducible, and stateless fashion
-(@pxref{System Configuration}).
-
 @cindex functional package management
 @cindex isolation
 Under the hood, Guix implements the @dfn{functional package management}
@@ -389,6 +358,81 @@ for transactional package upgrade and rollback, per-user installation, and
 garbage collection of packages (@pxref{Features}).
 
 
+@node GNU Distribution
+@section GNU Distribution
+
+@cindex Guix System
+@cindex GuixSD
+Guix comes with a distribution of the GNU system consisting entirely of
+free software@footnote{The term ``free'' here refers to the
+@url{http://www.gnu.org/philosophy/free-sw.html,freedom provided to
+users of that software}.}.  The
+distribution can be installed on its own (@pxref{System Installation}),
+but it is also possible to install Guix as a package manager on top of
+an installed GNU/Linux system (@pxref{Installation}).  When we need to
+distinguish between the two, we refer to the standalone distribution as
+Guix@tie{}System.
+
+The distribution provides core GNU packages such as GNU libc, GCC, and
+Binutils, as well as many GNU and non-GNU applications.  The complete
+list of available packages can be browsed
+@url{http://www.gnu.org/software/guix/packages,on-line} or by
+running @command{guix package} (@pxref{Invoking guix package}):
+
+@example
+guix package --list-available
+@end example
+
+Our goal is to provide a practical 100% free software distribution of
+Linux-based and other variants of GNU, with a focus on the promotion and
+tight integration of GNU components, and an emphasis on programs and
+tools that help users exert that freedom.
+
+Packages are currently available on the following platforms:
+
+@table @code
+
+@item x86_64-linux
+Intel/AMD @code{x86_64} architecture, Linux-Libre kernel;
+
+@item i686-linux
+Intel 32-bit architecture (IA32), Linux-Libre kernel;
+
+@item armhf-linux
+ARMv7-A architecture with hard float, Thumb-2 and NEON,
+using the EABI hard-float application binary interface (ABI),
+and Linux-Libre kernel.
+
+@item aarch64-linux
+little-endian 64-bit ARMv8-A processors, Linux-Libre kernel.  This is
+currently in an experimental stage, with limited support.
+@xref{Contributing}, for how to help!
+
+@item mips64el-linux
+little-endian 64-bit MIPS processors, specifically the Loongson series,
+n32 ABI, and Linux-Libre kernel.
+
+@end table
+
+With Guix@tie{}System, you @emph{declare} all aspects of the operating system
+configuration and Guix takes care of instantiating the configuration in a
+transactional, reproducible, and stateless fashion (@pxref{System
+Configuration}).  Guix System uses the Linux-libre kernel, the Shepherd
+initialization system (@pxref{Introduction,,, shepherd, The GNU Shepherd
+Manual}), the well-known GNU utilities and tool chain, as well as the
+graphical environment or system services of your choice.
+
+Guix System is available on all the above platforms except
+@code{mips64el-linux}.
+
+@noindent
+For information on porting to other architectures or kernels,
+@pxref{Porting}.
+
+Building this distribution is a cooperative effort, and you are invited
+to join!  @xref{Contributing}, for information about how you can help.
+
+
 @c *********************************************************************
 @node Installation
 @chapter Installation
@@ -1689,6 +1733,659 @@ store you need to define the environment variable
 @c TODO What else?
 
 @c *********************************************************************
+@node System Installation
+@chapter System Installation
+
+@cindex installing GuixSD
+@cindex Guix System Distribution
+This section explains how to install the Guix System Distribution (GuixSD)
+on a machine.  The Guix package manager can
+also be installed on top of a running GNU/Linux system,
+@pxref{Installation}.
+
+@ifinfo
+@quotation Note
+@c This paragraph is for people reading this from tty2 of the
+@c installation image.
+You are reading this documentation with an Info reader.  For details on
+how to use it, hit the @key{RET} key (``return'' or ``enter'') on the
+link that follows: @pxref{Top, Info reader,, info-stnd, Stand-alone GNU
+Info}.  Hit @kbd{l} afterwards to come back here.
+
+Alternately, run @command{info info} in another tty to keep the manual
+available.
+@end quotation
+@end ifinfo
+
+@menu
+* Limitations::                 What you can expect.
+* Hardware Considerations::     Supported hardware.
+* USB Stick and DVD Installation::  Preparing the installation medium.
+* Preparing for Installation::  Networking, partitioning, etc.
+* Proceeding with the Installation::  The real thing.
+* Installing GuixSD in a VM::   GuixSD playground.
+* Building the Installation Image::  How this comes to be.
+@end menu
+
+@node Limitations
+@section Limitations
+
+As of version @value{VERSION}, the Guix System Distribution (GuixSD) is
+not production-ready.  It may contain bugs and lack important
+features.  Thus, if you are looking for a stable production system that
+respects your freedom as a computer user, a good solution at this point
+is to consider @url{http://www.gnu.org/distros/free-distros.html, one of
+the more established GNU/Linux distributions}.  We hope you can soon switch
+to the GuixSD without fear, of course.  In the meantime, you can
+also keep using your distribution and try out the package manager on top
+of it (@pxref{Installation}).
+
+Before you proceed with the installation, be aware of the following
+noteworthy limitations applicable to version @value{VERSION}:
+
+@itemize
+@item
+The installation process does not include a graphical user interface and
+requires familiarity with GNU/Linux (see the following subsections to
+get a feel of what that means.)
+
+@item
+Support for the Logical Volume Manager (LVM) is missing.
+
+@item
+More and more system services are provided (@pxref{Services}), but some
+may be missing.
+
+@item
+More than 8,500 packages are available, but you might
+occasionally find that a useful package is missing.
+
+@item
+GNOME, Xfce, LXDE, and Enlightenment are available (@pxref{Desktop Services}),
+as well as a number of X11 window managers.  However, some graphical
+applications may be missing, as well as KDE.
+@end itemize
+
+You have been warned!  But more than a disclaimer, this is an invitation
+to report issues (and success stories!), and to join us in improving it.
+@xref{Contributing}, for more info.
+
+
+@node Hardware Considerations
+@section Hardware Considerations
+
+@cindex hardware support on GuixSD
+GNU@tie{}GuixSD focuses on respecting the user's computing freedom.  It
+builds around the kernel Linux-libre, which means that only hardware for
+which free software drivers and firmware exist is supported.  Nowadays,
+a wide range of off-the-shelf hardware is supported on
+GNU/Linux-libre---from keyboards to graphics cards to scanners and
+Ethernet controllers.  Unfortunately, there are still areas where
+hardware vendors deny users control over their own computing, and such
+hardware is not supported on GuixSD.
+
+@cindex WiFi, hardware support
+One of the main areas where free drivers or firmware are lacking is WiFi
+devices.  WiFi devices known to work include those using Atheros chips
+(AR9271 and AR7010), which corresponds to the @code{ath9k} Linux-libre
+driver, and those using Broadcom/AirForce chips (BCM43xx with
+Wireless-Core Revision 5), which corresponds to the @code{b43-open}
+Linux-libre driver.  Free firmware exists for both and is available
+out-of-the-box on GuixSD, as part of @var{%base-firmware}
+(@pxref{operating-system Reference, @code{firmware}}).
+
+@cindex RYF, Respects Your Freedom
+The @uref{https://www.fsf.org/, Free Software Foundation} runs
+@uref{https://www.fsf.org/ryf, @dfn{Respects Your Freedom}} (RYF), a
+certification program for hardware products that respect your freedom
+and your privacy and ensure that you have control over your device.  We
+encourage you to check the list of RYF-certified devices.
+
+Another useful resource is the @uref{https://www.h-node.org/, H-Node}
+web site.  It contains a catalog of hardware devices with information
+about their support in GNU/Linux.
+
+
+@node USB Stick and DVD Installation
+@section USB Stick and DVD Installation
+
+An ISO-9660 installation image that can be written to a USB stick or
+burnt to a DVD can be downloaded from
+@indicateurl{https://alpha.gnu.org/gnu/guix/guixsd-install-@value{VERSION}.@var{system}.iso.xz},
+where @var{system} is one of:
+
+@table @code
+@item x86_64-linux
+for a GNU/Linux system on Intel/AMD-compatible 64-bit CPUs;
+
+@item i686-linux
+for a 32-bit GNU/Linux system on Intel-compatible CPUs.
+@end table
+
+@c start duplication of authentication part from ``Binary Installation''
+Make sure to download the associated @file{.sig} file and to verify the
+authenticity of the image against it, along these lines:
+
+@example
+$ wget https://alpha.gnu.org/gnu/guix/guixsd-install-@value{VERSION}.@var{system}.iso.xz.sig
+$ gpg --verify guixsd-install-@value{VERSION}.@var{system}.iso.xz.sig
+@end example
+
+If that command fails because you do not have the required public key,
+then run this command to import it:
+
+@example
+$ gpg --keyserver @value{KEY-SERVER} \
+      --recv-keys @value{OPENPGP-SIGNING-KEY-ID}
+@end example
+
+@noindent
+and rerun the @code{gpg --verify} command.
+@c end duplication
+
+This image contains the tools necessary for an installation.
+It is meant to be copied @emph{as is} to a large-enough USB stick or DVD.
+
+@unnumberedsubsec Copying to a USB Stick
+
+To copy the image to a USB stick, follow these steps:
+
+@enumerate
+@item
+Decompress the image using the @command{xz} command:
+
+@example
+xz -d guixsd-install-@value{VERSION}.@var{system}.iso.xz
+@end example
+
+@item
+Insert a USB stick of 1@tie{}GiB or more into your machine, and determine
+its device name.  Assuming that the USB stick is known as @file{/dev/sdX},
+copy the image with:
+
+@example
+dd if=guixsd-install-@value{VERSION}.@var{system}.iso of=/dev/sdX
+sync
+@end example
+
+Access to @file{/dev/sdX} usually requires root privileges.
+@end enumerate
+
+@unnumberedsubsec Burning on a DVD
+
+To copy the image to a DVD, follow these steps:
+
+@enumerate
+@item
+Decompress the image using the @command{xz} command:
+
+@example
+xz -d guixsd-install-@value{VERSION}.@var{system}.iso.xz
+@end example
+
+@item
+Insert a blank DVD into your machine, and determine
+its device name.  Assuming that the DVD drive is known as @file{/dev/srX},
+copy the image with:
+
+@example
+growisofs -dvd-compat -Z /dev/srX=guixsd-install-@value{VERSION}.@var{system}.iso
+@end example
+
+Access to @file{/dev/srX} usually requires root privileges.
+@end enumerate
+
+@unnumberedsubsec Booting
+
+Once this is done, you should be able to reboot the system and boot from
+the USB stick or DVD.  The latter usually requires you to get in the
+BIOS or UEFI boot menu, where you can choose to boot from the USB stick.
+
+@xref{Installing GuixSD in a VM}, if, instead, you would like to install
+GuixSD in a virtual machine (VM).
+
+
+@node Preparing for Installation
+@section Preparing for Installation
+
+Once you have successfully booted your computer using the installation medium,
+you should end up with the welcome page of the graphical installer.  The
+graphical installer is a text-based user interface built upon the newt
+library.  It shall guide you through all the different steps needed to install
+GNU GuixSD.  However, as the graphical installer is still under heavy
+development, you might want to fallback to the original, shell based install
+process, by switching to TTYs 3 to 6 with the shortcuts CTRL-ALT-F[3-6]. The
+following sections describe the installation procedure assuming you're using
+one of those TTYs. They are configured and can be used to run commands as
+root.
+
+TTY2 shows this documentation, browsable using the Info reader commands
+(@pxref{Top,,, info-stnd, Stand-alone GNU Info}).  The installation system
+runs the GPM mouse daemon, which allows you to select text with the left mouse
+button and to paste it with the middle button.
+
+@quotation Note
+Installation requires access to the Internet so that any missing
+dependencies of your system configuration can be downloaded.  See the
+``Networking'' section below.
+@end quotation
+
+The installation system includes many common tools needed for this task.
+But it is also a full-blown GuixSD system, which means that you can
+install additional packages, should you need it, using @command{guix
+package} (@pxref{Invoking guix package}).
+
+@subsection Keyboard Layout
+
+@cindex keyboard layout
+The installation image uses the US qwerty keyboard layout.  If you want
+to change it, you can use the @command{loadkeys} command.  For example,
+the following command selects the Dvorak keyboard layout:
+
+@example
+loadkeys dvorak
+@end example
+
+See the files under @file{/run/current-system/profile/share/keymaps} for
+a list of available keyboard layouts.  Run @command{man loadkeys} for
+more information.
+
+@subsection Networking
+
+Run the following command to see what your network interfaces are called:
+
+@example
+ifconfig -a
+@end example
+
+@noindent
+@dots{} or, using the GNU/Linux-specific @command{ip} command:
+
+@example
+ip a
+@end example
+
+@c http://cgit.freedesktop.org/systemd/systemd/tree/src/udev/udev-builtin-net_id.c#n20
+Wired interfaces have a name starting with @samp{e}; for example, the
+interface corresponding to the first on-board Ethernet controller is
+called @samp{eno1}.  Wireless interfaces have a name starting with
+@samp{w}, like @samp{w1p2s0}.
+
+@table @asis
+@item Wired connection
+To configure a wired network run the following command, substituting
+@var{interface} with the name of the wired interface you want to use.
+
+@example
+ifconfig @var{interface} up
+@end example
+
+@item Wireless connection
+@cindex wireless
+@cindex WiFi
+To configure wireless networking, you can create a configuration file
+for the @command{wpa_supplicant} configuration tool (its location is not
+important) using one of the available text editors such as
+@command{nano}:
+
+@example
+nano wpa_supplicant.conf
+@end example
+
+As an example, the following stanza can go to this file and will work
+for many wireless networks, provided you give the actual SSID and
+passphrase for the network you are connecting to:
+
+@example
+network=@{
+  ssid="@var{my-ssid}"
+  key_mgmt=WPA-PSK
+  psk="the network's secret passphrase"
+@}
+@end example
+
+Start the wireless service and run it in the background with the
+following command (substitute @var{interface} with the name of the
+network interface you want to use):
+
+@example
+wpa_supplicant -c wpa_supplicant.conf -i @var{interface} -B
+@end example
+
+Run @command{man wpa_supplicant} for more information.
+@end table
+
+@cindex DHCP
+At this point, you need to acquire an IP address.  On a network where IP
+addresses are automatically assigned @i{via} DHCP, you can run:
+
+@example
+dhclient -v @var{interface}
+@end example
+
+Try to ping a server to see if networking is up and running:
+
+@example
+ping -c 3 gnu.org
+@end example
+
+Setting up network access is almost always a requirement because the
+image does not contain all the software and tools that may be needed.
+
+@cindex installing over SSH
+If you want to, you can continue the installation remotely by starting
+an SSH server:
+
+@example
+herd start ssh-daemon
+@end example
+
+Make sure to either set a password with @command{passwd}, or configure
+OpenSSH public key authentication before logging in.
+
+@subsection Disk Partitioning
+
+Unless this has already been done, the next step is to partition, and
+then format the target partition(s).
+
+The installation image includes several partitioning tools, including
+Parted (@pxref{Overview,,, parted, GNU Parted User Manual}),
+@command{fdisk}, and @command{cfdisk}.  Run it and set up your disk with
+the partition layout you want:
+
+@example
+cfdisk
+@end example
+
+If your disk uses the GUID Partition Table (GPT) format and you plan to
+install BIOS-based GRUB (which is the default), make sure a BIOS Boot
+Partition is available (@pxref{BIOS installation,,, grub, GNU GRUB
+manual}).
+
+@cindex EFI, installation
+@cindex UEFI, installation
+@cindex ESP, EFI system partition
+If you instead wish to use EFI-based GRUB, a FAT32 @dfn{EFI System Partition}
+(ESP) is required.  This partition should be mounted at @file{/boot/efi} and
+must have the @code{esp} flag set.  E.g., for @command{parted}:
+
+@example
+parted /dev/sda set 1 esp on
+@end example
+
+@quotation Note
+@vindex grub-bootloader
+@vindex grub-efi-bootloader
+Unsure whether to use EFI- or BIOS-based GRUB?  If the directory
+@file{/sys/firmware/efi} exists in the installation image, then you should
+probably perform an EFI installation, using @code{grub-efi-bootloader}.
+Otherwise you should use the BIOS-based GRUB, known as
+@code{grub-bootloader}.  @xref{Bootloader Configuration}, for more info on
+bootloaders.
+@end quotation
+
+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 only supports ext4 and btrfs file systems.  In particular, code
+that reads file system UUIDs and labels only works for these file system
+types.}.  For the ESP, if you have one and assuming it is
+@file{/dev/sda1}, run:
+
+@example
+mkfs.fat -F32 /dev/sda1
+@end example
+
+Preferably, assign file systems a label so that you can easily and
+reliably refer to them in @code{file-system} declarations (@pxref{File
+Systems}).  This is typically done using the @code{-L} option of
+@command{mkfs.ext4} and related commands.  So, assuming the target root
+partition lives at @file{/dev/sda2}, a file system with the label
+@code{my-root} can be created with:
+
+@example
+mkfs.ext4 -L my-root /dev/sda2
+@end example
+
+@cindex encrypted disk
+If you are instead planning to encrypt the root partition, you can use
+the Cryptsetup/LUKS utilities to do that (see @inlinefmtifelse{html,
+@uref{https://linux.die.net/man/8/cryptsetup, @code{man cryptsetup}},
+@code{man cryptsetup}} for more information.)  Assuming you want to
+store the root partition on @file{/dev/sda2}, the command sequence would
+be along these lines:
+
+@example
+cryptsetup luksFormat /dev/sda2
+cryptsetup open --type luks /dev/sda2 my-partition
+mkfs.ext4 -L my-root /dev/mapper/my-partition
+@end example
+
+Once that is done, mount the target file system under @file{/mnt}
+with a command like (again, assuming @code{my-root} is the label of the
+root file system):
+
+@example
+mount LABEL=my-root /mnt
+@end example
+
+Also mount any other file systems you would like to use on the target
+system relative to this path.  If you have @file{/boot} on a separate
+partition for example, mount it at @file{/mnt/boot} now so it is found
+by @code{guix system init} afterwards.
+
+Finally, if you plan to use one or more swap partitions (@pxref{Memory
+Concepts, swap space,, libc, The GNU C Library Reference Manual}), make
+sure to initialize them with @command{mkswap}.  Assuming you have one
+swap partition on @file{/dev/sda3}, you would run:
+
+@example
+mkswap /dev/sda3
+swapon /dev/sda3
+@end example
+
+Alternatively, you may use a swap file.  For example, assuming that in
+the new system you want to use the file @file{/swapfile} as a swap file,
+you would run@footnote{This example will work for many types of file
+systems (e.g., ext4).  However, for copy-on-write file systems (e.g.,
+btrfs), the required steps may be different.  For details, see the
+manual pages for @command{mkswap} and @command{swapon}.}:
+
+@example
+# This is 10 GiB of swap space.  Adjust "count" to change the size.
+dd if=/dev/zero of=/mnt/swapfile bs=1MiB count=10240
+# For security, make the file readable and writable only by root.
+chmod 600 /mnt/swapfile
+mkswap /mnt/swapfile
+swapon /mnt/swapfile
+@end example
+
+Note that if you have encrypted the root partition and created a swap
+file in its file system as described above, then the encryption also
+protects the swap file, just like any other file in that file system.
+
+@node Proceeding with the Installation
+@section Proceeding with the Installation
+
+With the target partitions ready and the target root mounted on
+@file{/mnt}, we're ready to go.  First, run:
+
+@example
+herd start cow-store /mnt
+@end example
+
+This makes @file{/gnu/store} copy-on-write, such that packages added to it
+during the installation phase are written to the target disk on @file{/mnt}
+rather than kept in memory.  This is necessary because the first phase of
+the @command{guix system init} command (see below) entails downloads or
+builds to @file{/gnu/store} which, initially, is an in-memory file system.
+
+Next, you have to edit a file and
+provide the declaration of the operating system to be installed.  To
+that end, the installation system comes with three text editors.  We
+recommend GNU nano (@pxref{Top,,, nano, GNU nano Manual}), which
+supports syntax highlighting and parentheses matching; other editors
+include GNU Zile (an Emacs clone), and
+nvi (a clone of the original BSD @command{vi} editor).
+We strongly recommend storing that file on the target root file system, say,
+as @file{/mnt/etc/config.scm}.  Failing to do that, you will have lost your
+configuration file once you have rebooted into the newly-installed system.
+
+@xref{Using the Configuration System}, for an overview of the
+configuration file.  The example configurations discussed in that
+section are available under @file{/etc/configuration} in the
+installation image.  Thus, to get started with a system configuration
+providing a graphical display server (a ``desktop'' system), you can run
+something along these lines:
+
+@example
+# mkdir /mnt/etc
+# cp /etc/configuration/desktop.scm /mnt/etc/config.scm
+# nano /mnt/etc/config.scm
+@end example
+
+You should pay attention to what your configuration file contains, and
+in particular:
+
+@itemize
+@item
+Make sure the @code{bootloader-configuration} form refers to the target
+you want to install GRUB on.  It should mention @code{grub-bootloader} if
+you are installing GRUB in the legacy way, or @code{grub-efi-bootloader}
+for newer UEFI systems.  For legacy systems, the @code{target} field
+names a device, like @code{/dev/sda}; for UEFI systems it names a path
+to a mounted EFI partition, like @code{/boot/efi}, and do make sure the
+path is actually mounted.
+
+@item
+Be sure that your file system labels match the value of their respective
+@code{device} fields in your @code{file-system} configuration, assuming
+your @code{file-system} configuration uses the @code{file-system-label}
+procedure in its @code{device} field.
+
+@item
+If there are encrypted or RAID partitions, make sure to add a
+@code{mapped-devices} field to describe them (@pxref{Mapped Devices}).
+@end itemize
+
+Once you are done preparing the configuration file, the new system must
+be initialized (remember that the target root file system is mounted
+under @file{/mnt}):
+
+@example
+guix system init /mnt/etc/config.scm /mnt
+@end example
+
+@noindent
+This copies all the necessary files and installs GRUB on
+@file{/dev/sdX}, unless you pass the @option{--no-bootloader} option.  For
+more information, @pxref{Invoking guix system}.  This command may trigger
+downloads or builds of missing packages, which can take some time.
+
+Once that command has completed---and hopefully succeeded!---you can run
+@command{reboot} and boot into the new system.  The @code{root} password
+in the new system is initially empty; other users' passwords need to be
+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 /etc/config.scm}, as @code{root} too, 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
+@email{guix-devel@@gnu.org} to share your experience---good or not so
+good.
+
+@node Installing GuixSD in a VM
+@section Installing GuixSD in a Virtual Machine
+
+@cindex virtual machine, GuixSD installation
+@cindex virtual private server (VPS)
+@cindex VPS (virtual private server)
+If you'd like to install GuixSD in a virtual machine (VM) or on a
+virtual private server (VPS) rather than on your beloved machine, this
+section is for you.
+
+To boot a @uref{http://qemu.org/,QEMU} VM for installing GuixSD in a
+disk image, follow these steps:
+
+@enumerate
+@item
+First, retrieve and decompress the GuixSD installation image as
+described previously (@pxref{USB Stick and DVD Installation}).
+
+@item
+Create a disk image that will hold the installed system.  To make a
+qcow2-formatted disk image, use the @command{qemu-img} command:
+
+@example
+qemu-img create -f qcow2 guixsd.img 50G
+@end example
+
+The resulting file will be much smaller than 50 GB (typically less than
+1 MB), but it will grow as the virtualized storage device is filled up.
+
+@item
+Boot the USB installation image in an VM:
+
+@example
+qemu-system-x86_64 -m 1024 -smp 1 \
+  -net user -net nic,model=virtio -boot menu=on \
+  -drive file=guixsd-install-@value{VERSION}.@var{system}.iso \
+  -drive file=guixsd.img
+@end example
+
+The ordering of the drives matters.
+
+In the VM console, quickly press the @kbd{F12} key to enter the boot
+menu.  Then press the @kbd{2} key and the @kbd{RET} key to validate your
+selection.
+
+@item
+You're now root in the VM, proceed with the installation process.
+@xref{Preparing for Installation}, and follow the instructions.
+@end enumerate
+
+Once installation is complete, you can boot the system that's on your
+@file{guixsd.img} image.  @xref{Running GuixSD in a VM}, for how to do
+that.
+
+@node Building the Installation Image
+@section Building the Installation Image
+
+@cindex installation image
+The installation image described above was built using the @command{guix
+system} command, specifically:
+
+@example
+guix system disk-image gnu/system/install.scm
+@end example
+
+Have a look at @file{gnu/system/install.scm} in the source tree,
+and see also @ref{Invoking guix system} for more information
+about the installation image.
+
+@section Building the Installation Image for ARM Boards
+
+Many ARM boards require a specific variant of the
+@uref{http://www.denx.de/wiki/U-Boot/, U-Boot} bootloader.
+
+If you build a disk image and the bootloader is not available otherwise
+(on another boot drive etc), it's advisable to build an image that
+includes the bootloader, specifically:
+
+@example
+guix system disk-image --system=armhf-linux -e '((@@ (gnu system install) os-with-u-boot) (@@ (gnu system install) installation-os) "A20-OLinuXino-Lime2")'
+@end example
+
+@code{A20-OLinuXino-Lime2} is the name of the board.  If you specify an invalid
+board, a list of possible boards will be printed.
+
+@c *********************************************************************
 @node Package Management
 @chapter Package Management
 
@@ -3740,6 +4437,7 @@ This chapter describes all these APIs in turn, starting from high-level
 package definitions.
 
 @menu
+* Package Modules::             Packages from the programmer's viewpoint.
 * Defining Packages::           Defining new packages.
 * Build Systems::               Specifying how packages are built.
 * The Store::                   Manipulating the package store.
@@ -3749,6 +4447,68 @@ package definitions.
 * Invoking guix repl::          Fiddling with Guix interactively.
 @end menu
 
+@node Package Modules
+@section Package Modules
+
+From a programming viewpoint, the package definitions of the
+GNU distribution are provided by Guile modules in the @code{(gnu packages
+@dots{})} name space@footnote{Note that packages under the @code{(gnu
+packages @dots{})} module name space are not necessarily ``GNU
+packages''.  This module naming scheme follows the usual Guile module
+naming convention: @code{gnu} means that these modules are distributed
+as part of the GNU system, and @code{packages} identifies modules that
+define packages.}  (@pxref{Modules, Guile modules,, guile, GNU Guile
+Reference Manual}).  For instance, the @code{(gnu packages emacs)}
+module exports a variable named @code{emacs}, which is bound to a
+@code{<package>} object (@pxref{Defining Packages}).
+
+The @code{(gnu packages @dots{})} module name space is
+automatically scanned for packages by the command-line tools.  For
+instance, when running @code{guix package -i emacs}, all the @code{(gnu
+packages @dots{})} modules are scanned until one that exports a package
+object whose name is @code{emacs} is found.  This package search
+facility is implemented in the @code{(gnu packages)} module.
+
+@cindex customization, of packages
+@cindex package module search path
+Users can store package definitions in modules with different
+names---e.g., @code{(my-packages emacs)}@footnote{Note that the file
+name and module name must match.  For instance, the @code{(my-packages
+emacs)} module must be stored in a @file{my-packages/emacs.scm} file
+relative to the load path specified with @option{--load-path} or
+@code{GUIX_PACKAGE_PATH}.  @xref{Modules and the File System,,,
+guile, GNU Guile Reference Manual}, for details.}.  There are two ways to make
+these package definitions visible to the user interfaces:
+
+@enumerate
+@item
+By adding the directory containing your package modules to the search path
+with the @code{-L} flag of @command{guix package} and other commands
+(@pxref{Common Build Options}), or by setting the @code{GUIX_PACKAGE_PATH}
+environment variable described below.
+
+@item
+By defining a @dfn{channel} and configuring @command{guix pull} so that it
+pulls from it.  A channel is essentially a Git repository containing package
+modules.  @xref{Channels}, for more information on how to define and use
+channels.
+@end enumerate
+
+@code{GUIX_PACKAGE_PATH} works similarly to other search path variables:
+
+@defvr {Environment Variable} GUIX_PACKAGE_PATH
+This is a colon-separated list of directories to search for additional
+package modules.  Directories listed in this variable take precedence
+over the own modules of the distribution.
+@end defvr
+
+The distribution is fully @dfn{bootstrapped} and @dfn{self-contained}:
+each package is built based solely on other packages in the
+distribution.  The root of this dependency graph is a small set of
+@dfn{bootstrap binaries}, provided by the @code{(gnu packages
+bootstrap)} module.  For more information on bootstrapping,
+@pxref{Bootstrapping}.
+
 @node Defining Packages
 @section Defining Packages
 
@@ -5027,7 +5787,7 @@ Return @code{#t} when @var{path} designates a valid store item and
 invalid, for instance because it is the result of an aborted or failed
 build.)
 
-A @code{&nix-protocol-error} condition is raised if @var{path} is not
+A @code{&store-protocol-error} condition is raised if @var{path} is not
 prefixed by the store directory (@file{/gnu/store}).
 @end deffn
 
@@ -9034,738 +9794,9 @@ ClientPID: 19419
 ClientCommand: cuirass --cache-directory /var/cache/cuirass @dots{}
 @end example
 
-@c *********************************************************************
-@node GNU Distribution
-@chapter GNU Distribution
-
-@cindex Guix System Distribution
-@cindex GuixSD
-Guix comes with a distribution of the GNU system consisting entirely of
-free software@footnote{The term ``free'' here refers to the
-@url{http://www.gnu.org/philosophy/free-sw.html,freedom provided to
-users of that software}.}.  The
-distribution can be installed on its own (@pxref{System Installation}),
-but it is also possible to install Guix as a package manager on top of
-an installed GNU/Linux system (@pxref{Installation}).  To distinguish
-between the two, we refer to the standalone distribution as the Guix
-System Distribution, or GuixSD.
-
-The distribution provides core GNU packages such as GNU libc, GCC, and
-Binutils, as well as many GNU and non-GNU applications.  The complete
-list of available packages can be browsed
-@url{http://www.gnu.org/software/guix/packages,on-line} or by
-running @command{guix package} (@pxref{Invoking guix package}):
-
-@example
-guix package --list-available
-@end example
-
-Our goal is to provide a practical 100% free software distribution of
-Linux-based and other variants of GNU, with a focus on the promotion and
-tight integration of GNU components, and an emphasis on programs and
-tools that help users exert that freedom.
-
-Packages are currently available on the following platforms:
-
-@table @code
-
-@item x86_64-linux
-Intel/AMD @code{x86_64} architecture, Linux-Libre kernel;
-
-@item i686-linux
-Intel 32-bit architecture (IA32), Linux-Libre kernel;
-
-@item armhf-linux
-ARMv7-A architecture with hard float, Thumb-2 and NEON,
-using the EABI hard-float application binary interface (ABI),
-and Linux-Libre kernel.
-
-@item aarch64-linux
-little-endian 64-bit ARMv8-A processors, Linux-Libre kernel.  This is
-currently in an experimental stage, with limited support.
-@xref{Contributing}, for how to help!
-
-@item mips64el-linux
-little-endian 64-bit MIPS processors, specifically the Loongson series,
-n32 ABI, and Linux-Libre kernel.
-
-@end table
-
-GuixSD itself is currently only available on @code{i686} and @code{x86_64}.
-
-@noindent
-For information on porting to other architectures or kernels,
-@pxref{Porting}.
-
-@menu
-* System Installation::         Installing the whole operating system.
-* System Configuration::        Configuring the operating system.
-* Documentation::               Browsing software user manuals.
-* Installing Debugging Files::  Feeding the debugger.
-* Security Updates::            Deploying security fixes quickly.
-* Package Modules::             Packages from the programmer's viewpoint.
-* Packaging Guidelines::        Growing the distribution.
-* Bootstrapping::               GNU/Linux built from scratch.
-* Porting::                     Targeting another platform or kernel.
-@end menu
-
-Building this distribution is a cooperative effort, and you are invited
-to join!  @xref{Contributing}, for information about how you can help.
-
-@node System Installation
-@section System Installation
-
-@cindex installing GuixSD
-@cindex Guix System Distribution
-This section explains how to install the Guix System Distribution (GuixSD)
-on a machine.  The Guix package manager can
-also be installed on top of a running GNU/Linux system,
-@pxref{Installation}.
-
-@ifinfo
-@quotation Note
-@c This paragraph is for people reading this from tty2 of the
-@c installation image.
-You are reading this documentation with an Info reader.  For details on
-how to use it, hit the @key{RET} key (``return'' or ``enter'') on the
-link that follows: @pxref{Top, Info reader,, info-stnd, Stand-alone GNU
-Info}.  Hit @kbd{l} afterwards to come back here.
-
-Alternately, run @command{info info} in another tty to keep the manual
-available.
-@end quotation
-@end ifinfo
-
-@menu
-* Limitations::                 What you can expect.
-* Hardware Considerations::     Supported hardware.
-* USB Stick and DVD Installation::  Preparing the installation medium.
-* Preparing for Installation::  Networking, partitioning, etc.
-* Proceeding with the Installation::  The real thing.
-* Installing GuixSD in a VM::   GuixSD playground.
-* Building the Installation Image::  How this comes to be.
-@end menu
-
-@node Limitations
-@subsection Limitations
-
-As of version @value{VERSION}, the Guix System Distribution (GuixSD) is
-not production-ready.  It may contain bugs and lack important
-features.  Thus, if you are looking for a stable production system that
-respects your freedom as a computer user, a good solution at this point
-is to consider @url{http://www.gnu.org/distros/free-distros.html, one of
-the more established GNU/Linux distributions}.  We hope you can soon switch
-to the GuixSD without fear, of course.  In the meantime, you can
-also keep using your distribution and try out the package manager on top
-of it (@pxref{Installation}).
-
-Before you proceed with the installation, be aware of the following
-noteworthy limitations applicable to version @value{VERSION}:
-
-@itemize
-@item
-The installation process does not include a graphical user interface and
-requires familiarity with GNU/Linux (see the following subsections to
-get a feel of what that means.)
-
-@item
-Support for the Logical Volume Manager (LVM) is missing.
-
-@item
-More and more system services are provided (@pxref{Services}), but some
-may be missing.
-
-@item
-More than 8,500 packages are available, but you might
-occasionally find that a useful package is missing.
-
-@item
-GNOME, Xfce, LXDE, and Enlightenment are available (@pxref{Desktop Services}),
-as well as a number of X11 window managers.  However, some graphical
-applications may be missing, as well as KDE.
-@end itemize
-
-You have been warned!  But more than a disclaimer, this is an invitation
-to report issues (and success stories!), and to join us in improving it.
-@xref{Contributing}, for more info.
-
-
-@node Hardware Considerations
-@subsection Hardware Considerations
-
-@cindex hardware support on GuixSD
-GNU@tie{}GuixSD focuses on respecting the user's computing freedom.  It
-builds around the kernel Linux-libre, which means that only hardware for
-which free software drivers and firmware exist is supported.  Nowadays,
-a wide range of off-the-shelf hardware is supported on
-GNU/Linux-libre---from keyboards to graphics cards to scanners and
-Ethernet controllers.  Unfortunately, there are still areas where
-hardware vendors deny users control over their own computing, and such
-hardware is not supported on GuixSD.
-
-@cindex WiFi, hardware support
-One of the main areas where free drivers or firmware are lacking is WiFi
-devices.  WiFi devices known to work include those using Atheros chips
-(AR9271 and AR7010), which corresponds to the @code{ath9k} Linux-libre
-driver, and those using Broadcom/AirForce chips (BCM43xx with
-Wireless-Core Revision 5), which corresponds to the @code{b43-open}
-Linux-libre driver.  Free firmware exists for both and is available
-out-of-the-box on GuixSD, as part of @var{%base-firmware}
-(@pxref{operating-system Reference, @code{firmware}}).
-
-@cindex RYF, Respects Your Freedom
-The @uref{https://www.fsf.org/, Free Software Foundation} runs
-@uref{https://www.fsf.org/ryf, @dfn{Respects Your Freedom}} (RYF), a
-certification program for hardware products that respect your freedom
-and your privacy and ensure that you have control over your device.  We
-encourage you to check the list of RYF-certified devices.
-
-Another useful resource is the @uref{https://www.h-node.org/, H-Node}
-web site.  It contains a catalog of hardware devices with information
-about their support in GNU/Linux.
-
-
-@node USB Stick and DVD Installation
-@subsection USB Stick and DVD Installation
-
-An ISO-9660 installation image that can be written to a USB stick or
-burnt to a DVD can be downloaded from
-@indicateurl{https://alpha.gnu.org/gnu/guix/guixsd-install-@value{VERSION}.@var{system}.iso.xz},
-where @var{system} is one of:
-
-@table @code
-@item x86_64-linux
-for a GNU/Linux system on Intel/AMD-compatible 64-bit CPUs;
-
-@item i686-linux
-for a 32-bit GNU/Linux system on Intel-compatible CPUs.
-@end table
-
-@c start duplication of authentication part from ``Binary Installation''
-Make sure to download the associated @file{.sig} file and to verify the
-authenticity of the image against it, along these lines:
-
-@example
-$ wget https://alpha.gnu.org/gnu/guix/guixsd-install-@value{VERSION}.@var{system}.iso.xz.sig
-$ gpg --verify guixsd-install-@value{VERSION}.@var{system}.iso.xz.sig
-@end example
-
-If that command fails because you do not have the required public key,
-then run this command to import it:
-
-@example
-$ gpg --keyserver @value{KEY-SERVER} \
-      --recv-keys @value{OPENPGP-SIGNING-KEY-ID}
-@end example
-
-@noindent
-and rerun the @code{gpg --verify} command.
-@c end duplication
-
-This image contains the tools necessary for an installation.
-It is meant to be copied @emph{as is} to a large-enough USB stick or DVD.
-
-@unnumberedsubsubsec Copying to a USB Stick
-
-To copy the image to a USB stick, follow these steps:
-
-@enumerate
-@item
-Decompress the image using the @command{xz} command:
-
-@example
-xz -d guixsd-install-@value{VERSION}.@var{system}.iso.xz
-@end example
-
-@item
-Insert a USB stick of 1@tie{}GiB or more into your machine, and determine
-its device name.  Assuming that the USB stick is known as @file{/dev/sdX},
-copy the image with:
-
-@example
-dd if=guixsd-install-@value{VERSION}.@var{system}.iso of=/dev/sdX
-sync
-@end example
-
-Access to @file{/dev/sdX} usually requires root privileges.
-@end enumerate
-
-@unnumberedsubsubsec Burning on a DVD
-
-To copy the image to a DVD, follow these steps:
-
-@enumerate
-@item
-Decompress the image using the @command{xz} command:
-
-@example
-xz -d guixsd-install-@value{VERSION}.@var{system}.iso.xz
-@end example
-
-@item
-Insert a blank DVD into your machine, and determine
-its device name.  Assuming that the DVD drive is known as @file{/dev/srX},
-copy the image with:
-
-@example
-growisofs -dvd-compat -Z /dev/srX=guixsd-install-@value{VERSION}.@var{system}.iso
-@end example
-
-Access to @file{/dev/srX} usually requires root privileges.
-@end enumerate
-
-@unnumberedsubsubsec Booting
-
-Once this is done, you should be able to reboot the system and boot from
-the USB stick or DVD.  The latter usually requires you to get in the
-BIOS or UEFI boot menu, where you can choose to boot from the USB stick.
-
-@xref{Installing GuixSD in a VM}, if, instead, you would like to install
-GuixSD in a virtual machine (VM).
-
-
-@node Preparing for Installation
-@subsection Preparing for Installation
-
-Once you have successfully booted your computer using the installation medium,
-you should end up with the welcome page of the graphical installer.  The
-graphical installer is a text-based user interface built upon the newt
-library.  It shall guide you through all the different steps needed to install
-GNU GuixSD.  However, as the graphical installer is still under heavy
-development, you might want to fallback to the original, shell based install
-process, by switching to TTYs 3 to 6 with the shortcuts CTRL-ALT-F[3-6]. The
-following sections describe the installation procedure assuming you're using
-one of those TTYs. They are configured and can be used to run commands as
-root.
-
-TTY2 shows this documentation, browsable using the Info reader commands
-(@pxref{Top,,, info-stnd, Stand-alone GNU Info}).  The installation system
-runs the GPM mouse daemon, which allows you to select text with the left mouse
-button and to paste it with the middle button.
-
-@quotation Note
-Installation requires access to the Internet so that any missing
-dependencies of your system configuration can be downloaded.  See the
-``Networking'' section below.
-@end quotation
-
-The installation system includes many common tools needed for this task.
-But it is also a full-blown GuixSD system, which means that you can
-install additional packages, should you need it, using @command{guix
-package} (@pxref{Invoking guix package}).
-
-@subsubsection Keyboard Layout
-
-@cindex keyboard layout
-The installation image uses the US qwerty keyboard layout.  If you want
-to change it, you can use the @command{loadkeys} command.  For example,
-the following command selects the Dvorak keyboard layout:
-
-@example
-loadkeys dvorak
-@end example
-
-See the files under @file{/run/current-system/profile/share/keymaps} for
-a list of available keyboard layouts.  Run @command{man loadkeys} for
-more information.
-
-@subsubsection Networking
-
-Run the following command to see what your network interfaces are called:
-
-@example
-ifconfig -a
-@end example
-
-@noindent
-@dots{} or, using the GNU/Linux-specific @command{ip} command:
-
-@example
-ip a
-@end example
-
-@c http://cgit.freedesktop.org/systemd/systemd/tree/src/udev/udev-builtin-net_id.c#n20
-Wired interfaces have a name starting with @samp{e}; for example, the
-interface corresponding to the first on-board Ethernet controller is
-called @samp{eno1}.  Wireless interfaces have a name starting with
-@samp{w}, like @samp{w1p2s0}.
-
-@table @asis
-@item Wired connection
-To configure a wired network run the following command, substituting
-@var{interface} with the name of the wired interface you want to use.
-
-@example
-ifconfig @var{interface} up
-@end example
-
-@item Wireless connection
-@cindex wireless
-@cindex WiFi
-To configure wireless networking, you can create a configuration file
-for the @command{wpa_supplicant} configuration tool (its location is not
-important) using one of the available text editors such as
-@command{nano}:
-
-@example
-nano wpa_supplicant.conf
-@end example
-
-As an example, the following stanza can go to this file and will work
-for many wireless networks, provided you give the actual SSID and
-passphrase for the network you are connecting to:
-
-@example
-network=@{
-  ssid="@var{my-ssid}"
-  key_mgmt=WPA-PSK
-  psk="the network's secret passphrase"
-@}
-@end example
-
-Start the wireless service and run it in the background with the
-following command (substitute @var{interface} with the name of the
-network interface you want to use):
-
-@example
-wpa_supplicant -c wpa_supplicant.conf -i @var{interface} -B
-@end example
-
-Run @command{man wpa_supplicant} for more information.
-@end table
-
-@cindex DHCP
-At this point, you need to acquire an IP address.  On a network where IP
-addresses are automatically assigned @i{via} DHCP, you can run:
-
-@example
-dhclient -v @var{interface}
-@end example
-
-Try to ping a server to see if networking is up and running:
-
-@example
-ping -c 3 gnu.org
-@end example
-
-Setting up network access is almost always a requirement because the
-image does not contain all the software and tools that may be needed.
-
-@cindex installing over SSH
-If you want to, you can continue the installation remotely by starting
-an SSH server:
-
-@example
-herd start ssh-daemon
-@end example
-
-Make sure to either set a password with @command{passwd}, or configure
-OpenSSH public key authentication before logging in.
-
-@subsubsection Disk Partitioning
-
-Unless this has already been done, the next step is to partition, and
-then format the target partition(s).
-
-The installation image includes several partitioning tools, including
-Parted (@pxref{Overview,,, parted, GNU Parted User Manual}),
-@command{fdisk}, and @command{cfdisk}.  Run it and set up your disk with
-the partition layout you want:
-
-@example
-cfdisk
-@end example
-
-If your disk uses the GUID Partition Table (GPT) format and you plan to
-install BIOS-based GRUB (which is the default), make sure a BIOS Boot
-Partition is available (@pxref{BIOS installation,,, grub, GNU GRUB
-manual}).
-
-@cindex EFI, installation
-@cindex UEFI, installation
-@cindex ESP, EFI system partition
-If you instead wish to use EFI-based GRUB, a FAT32 @dfn{EFI System Partition}
-(ESP) is required.  This partition should be mounted at @file{/boot/efi} and
-must have the @code{esp} flag set.  E.g., for @command{parted}:
-
-@example
-parted /dev/sda set 1 esp on
-@end example
-
-@quotation Note
-@vindex grub-bootloader
-@vindex grub-efi-bootloader
-Unsure whether to use EFI- or BIOS-based GRUB?  If the directory
-@file{/sys/firmware/efi} exists in the installation image, then you should
-probably perform an EFI installation, using @code{grub-efi-bootloader}.
-Otherwise you should use the BIOS-based GRUB, known as
-@code{grub-bootloader}.  @xref{Bootloader Configuration}, for more info on
-bootloaders.
-@end quotation
-
-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 only supports ext4 and btrfs file systems.  In particular, code
-that reads file system UUIDs and labels only works for these file system
-types.}.  For the ESP, if you have one and assuming it is
-@file{/dev/sda1}, run:
-
-@example
-mkfs.fat -F32 /dev/sda1
-@end example
-
-Preferably, assign file systems a label so that you can easily and
-reliably refer to them in @code{file-system} declarations (@pxref{File
-Systems}).  This is typically done using the @code{-L} option of
-@command{mkfs.ext4} and related commands.  So, assuming the target root
-partition lives at @file{/dev/sda2}, a file system with the label
-@code{my-root} can be created with:
-
-@example
-mkfs.ext4 -L my-root /dev/sda2
-@end example
-
-@cindex encrypted disk
-If you are instead planning to encrypt the root partition, you can use
-the Cryptsetup/LUKS utilities to do that (see @inlinefmtifelse{html,
-@uref{https://linux.die.net/man/8/cryptsetup, @code{man cryptsetup}},
-@code{man cryptsetup}} for more information.)  Assuming you want to
-store the root partition on @file{/dev/sda2}, the command sequence would
-be along these lines:
-
-@example
-cryptsetup luksFormat /dev/sda2
-cryptsetup open --type luks /dev/sda2 my-partition
-mkfs.ext4 -L my-root /dev/mapper/my-partition
-@end example
-
-Once that is done, mount the target file system under @file{/mnt}
-with a command like (again, assuming @code{my-root} is the label of the
-root file system):
-
-@example
-mount LABEL=my-root /mnt
-@end example
-
-Also mount any other file systems you would like to use on the target
-system relative to this path.  If you have @file{/boot} on a separate
-partition for example, mount it at @file{/mnt/boot} now so it is found
-by @code{guix system init} afterwards.
-
-Finally, if you plan to use one or more swap partitions (@pxref{Memory
-Concepts, swap space,, libc, The GNU C Library Reference Manual}), make
-sure to initialize them with @command{mkswap}.  Assuming you have one
-swap partition on @file{/dev/sda3}, you would run:
-
-@example
-mkswap /dev/sda3
-swapon /dev/sda3
-@end example
-
-Alternatively, you may use a swap file.  For example, assuming that in
-the new system you want to use the file @file{/swapfile} as a swap file,
-you would run@footnote{This example will work for many types of file
-systems (e.g., ext4).  However, for copy-on-write file systems (e.g.,
-btrfs), the required steps may be different.  For details, see the
-manual pages for @command{mkswap} and @command{swapon}.}:
-
-@example
-# This is 10 GiB of swap space.  Adjust "count" to change the size.
-dd if=/dev/zero of=/mnt/swapfile bs=1MiB count=10240
-# For security, make the file readable and writable only by root.
-chmod 600 /mnt/swapfile
-mkswap /mnt/swapfile
-swapon /mnt/swapfile
-@end example
-
-Note that if you have encrypted the root partition and created a swap
-file in its file system as described above, then the encryption also
-protects the swap file, just like any other file in that file system.
-
-@node Proceeding with the Installation
-@subsection Proceeding with the Installation
-
-With the target partitions ready and the target root mounted on
-@file{/mnt}, we're ready to go.  First, run:
-
-@example
-herd start cow-store /mnt
-@end example
-
-This makes @file{/gnu/store} copy-on-write, such that packages added to it
-during the installation phase are written to the target disk on @file{/mnt}
-rather than kept in memory.  This is necessary because the first phase of
-the @command{guix system init} command (see below) entails downloads or
-builds to @file{/gnu/store} which, initially, is an in-memory file system.
-
-Next, you have to edit a file and
-provide the declaration of the operating system to be installed.  To
-that end, the installation system comes with three text editors.  We
-recommend GNU nano (@pxref{Top,,, nano, GNU nano Manual}), which
-supports syntax highlighting and parentheses matching; other editors
-include GNU Zile (an Emacs clone), and
-nvi (a clone of the original BSD @command{vi} editor).
-We strongly recommend storing that file on the target root file system, say,
-as @file{/mnt/etc/config.scm}.  Failing to do that, you will have lost your
-configuration file once you have rebooted into the newly-installed system.
-
-@xref{Using the Configuration System}, for an overview of the
-configuration file.  The example configurations discussed in that
-section are available under @file{/etc/configuration} in the
-installation image.  Thus, to get started with a system configuration
-providing a graphical display server (a ``desktop'' system), you can run
-something along these lines:
-
-@example
-# mkdir /mnt/etc
-# cp /etc/configuration/desktop.scm /mnt/etc/config.scm
-# nano /mnt/etc/config.scm
-@end example
-
-You should pay attention to what your configuration file contains, and
-in particular:
-
-@itemize
-@item
-Make sure the @code{bootloader-configuration} form refers to the target
-you want to install GRUB on.  It should mention @code{grub-bootloader} if
-you are installing GRUB in the legacy way, or @code{grub-efi-bootloader}
-for newer UEFI systems.  For legacy systems, the @code{target} field
-names a device, like @code{/dev/sda}; for UEFI systems it names a path
-to a mounted EFI partition, like @code{/boot/efi}, and do make sure the
-path is actually mounted.
-
-@item
-Be sure that your file system labels match the value of their respective
-@code{device} fields in your @code{file-system} configuration, assuming
-your @code{file-system} configuration uses the @code{file-system-label}
-procedure in its @code{device} field.
-
-@item
-If there are encrypted or RAID partitions, make sure to add a
-@code{mapped-devices} field to describe them (@pxref{Mapped Devices}).
-@end itemize
-
-Once you are done preparing the configuration file, the new system must
-be initialized (remember that the target root file system is mounted
-under @file{/mnt}):
-
-@example
-guix system init /mnt/etc/config.scm /mnt
-@end example
-
-@noindent
-This copies all the necessary files and installs GRUB on
-@file{/dev/sdX}, unless you pass the @option{--no-bootloader} option.  For
-more information, @pxref{Invoking guix system}.  This command may trigger
-downloads or builds of missing packages, which can take some time.
-
-Once that command has completed---and hopefully succeeded!---you can run
-@command{reboot} and boot into the new system.  The @code{root} password
-in the new system is initially empty; other users' passwords need to be
-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 /etc/config.scm}, as @code{root} too, 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
-@email{guix-devel@@gnu.org} to share your experience---good or not so
-good.
-
-@node Installing GuixSD in a VM
-@subsection Installing GuixSD in a Virtual Machine
-
-@cindex virtual machine, GuixSD installation
-@cindex virtual private server (VPS)
-@cindex VPS (virtual private server)
-If you'd like to install GuixSD in a virtual machine (VM) or on a
-virtual private server (VPS) rather than on your beloved machine, this
-section is for you.
-
-To boot a @uref{http://qemu.org/,QEMU} VM for installing GuixSD in a
-disk image, follow these steps:
-
-@enumerate
-@item
-First, retrieve and decompress the GuixSD installation image as
-described previously (@pxref{USB Stick and DVD Installation}).
-
-@item
-Create a disk image that will hold the installed system.  To make a
-qcow2-formatted disk image, use the @command{qemu-img} command:
-
-@example
-qemu-img create -f qcow2 guixsd.img 50G
-@end example
-
-The resulting file will be much smaller than 50 GB (typically less than
-1 MB), but it will grow as the virtualized storage device is filled up.
-
-@item
-Boot the USB installation image in an VM:
-
-@example
-qemu-system-x86_64 -m 1024 -smp 1 \
-  -net user -net nic,model=virtio -boot menu=on \
-  -drive file=guixsd-install-@value{VERSION}.@var{system}.iso \
-  -drive file=guixsd.img
-@end example
-
-The ordering of the drives matters.
-
-In the VM console, quickly press the @kbd{F12} key to enter the boot
-menu.  Then press the @kbd{2} key and the @kbd{RET} key to validate your
-selection.
-
-@item
-You're now root in the VM, proceed with the installation process.
-@xref{Preparing for Installation}, and follow the instructions.
-@end enumerate
-
-Once installation is complete, you can boot the system that's on your
-@file{guixsd.img} image.  @xref{Running GuixSD in a VM}, for how to do
-that.
-
-@node Building the Installation Image
-@subsection Building the Installation Image
-
-@cindex installation image
-The installation image described above was built using the @command{guix
-system} command, specifically:
-
-@example
-guix system disk-image gnu/system/install.scm
-@end example
-
-Have a look at @file{gnu/system/install.scm} in the source tree,
-and see also @ref{Invoking guix system} for more information
-about the installation image.
-
-@subsection Building the Installation Image for ARM Boards
-
-Many ARM boards require a specific variant of the
-@uref{http://www.denx.de/wiki/U-Boot/, U-Boot} bootloader.
-
-If you build a disk image and the bootloader is not available otherwise
-(on another boot drive etc), it's advisable to build an image that
-includes the bootloader, specifically:
-
-@example
-guix system disk-image --system=armhf-linux -e '((@@ (gnu system install) os-with-u-boot) (@@ (gnu system install) installation-os) "A20-OLinuXino-Lime2")'
-@end example
-
-@code{A20-OLinuXino-Lime2} is the name of the board.  If you specify an invalid
-board, a list of possible boards will be printed.
 
 @node System Configuration
-@section System Configuration
+@chapter System Configuration
 
 @cindex system configuration
 The Guix System Distribution supports a consistent whole-system configuration
@@ -9808,7 +9839,7 @@ instance to support new system services.
 @end menu
 
 @node Using the Configuration System
-@subsection Using the Configuration System
+@section Using the Configuration System
 
 The operating system is configured by providing an
 @code{operating-system} declaration in a file that can then be passed to
@@ -9831,7 +9862,7 @@ Below we discuss the effect of some of the most important fields
 fields), and how to @dfn{instantiate} the operating system using
 @command{guix system}.
 
-@unnumberedsubsubsec Bootloader
+@unnumberedsubsec Bootloader
 
 @cindex legacy boot, on Intel machines
 @cindex BIOS boot, on Intel machines
@@ -9852,7 +9883,7 @@ the @code{bootloader} field should contain something along these lines:
 @xref{Bootloader Configuration}, for more information on the available
 configuration options.
 
-@unnumberedsubsubsec Globally-Visible Packages
+@unnumberedsubsec Globally-Visible Packages
 
 @vindex %base-packages
 The @code{packages} field lists packages that will be globally visible
@@ -9898,7 +9929,7 @@ version:
                     %base-packages)))
 @end lisp
 
-@unnumberedsubsubsec System Services
+@unnumberedsubsec System Services
 
 @cindex services
 @vindex %base-services
@@ -9990,7 +10021,7 @@ following expression returns a list that contains all the services in
         %desktop-services)
 @end example
 
-@unnumberedsubsubsec Instantiating the System
+@unnumberedsubsec Instantiating the System
 
 Assuming the @code{operating-system} declaration
 is stored in the @file{my-system-config.scm}
@@ -10023,7 +10054,7 @@ the latest (e.g., after invoking @command{guix system roll-back}), since
 the operation might overwrite a later generation (@pxref{Invoking guix
 system}).
 
-@unnumberedsubsubsec The Programming Interface
+@unnumberedsubsec The Programming Interface
 
 At the Scheme level, the bulk of an @code{operating-system} declaration
 is instantiated with the following monadic procedure (@pxref{The Store
@@ -10044,7 +10075,7 @@ guts of GuixSD.  Make sure to visit it!
 
 
 @node operating-system Reference
-@subsection @code{operating-system} Reference
+@section @code{operating-system} Reference
 
 This section summarizes all the options available in
 @code{operating-system} declarations (@pxref{Using the Configuration
@@ -10198,7 +10229,7 @@ is that only @code{root} and members of the @code{wheel} group may use
 @end deftp
 
 @node File Systems
-@subsection File Systems
+@section File Systems
 
 The list of file systems to be mounted is specified in the
 @code{file-systems} field of the operating system declaration
@@ -10363,7 +10394,7 @@ and unmount user-space FUSE file systems.  This requires the
 @end defvr
 
 @node Mapped Devices
-@subsection Mapped Devices
+@section Mapped Devices
 
 @cindex device mapping
 @cindex mapped devices
@@ -10484,7 +10515,7 @@ automatically later.
 
 
 @node User Accounts
-@subsection User Accounts
+@section User Accounts
 
 @cindex users
 @cindex accounts
@@ -10619,7 +10650,7 @@ special-case and is automatically added whether or not it is specified.
 @end defvr
 
 @node Locales
-@subsection Locales
+@section Locales
 
 @cindex locale
 A @dfn{locale} defines cultural conventions for a particular language
@@ -10707,7 +10738,7 @@ instance it has @code{uk_UA.utf8} but @emph{not}, say,
 @code{uk_UA.UTF-8}.
 @end defvr
 
-@subsubsection Locale Data Compatibility Considerations
+@subsection Locale Data Compatibility Considerations
 
 @cindex incompatibility, of locale data
 @code{operating-system} declarations provide a @code{locale-libcs} field
@@ -10759,7 +10790,7 @@ both libc 2.21 and the current version of libc in
 
 
 @node Services
-@subsection Services
+@section Services
 
 @cindex system services
 An important part of preparing an @code{operating-system} declaration is
@@ -10837,7 +10868,7 @@ declaration.
 @end menu
 
 @node Base Services
-@subsubsection Base Services
+@subsection Base Services
 
 The @code{(gnu services base)} module provides definitions for the basic
 services that one expects from the system.  The services exported by
@@ -11652,7 +11683,7 @@ commonly used for real-time audio systems.
 @end deffn
 
 @node Scheduled Job Execution
-@subsubsection Scheduled Job Execution
+@subsection Scheduled Job Execution
 
 @cindex cron
 @cindex mcron
@@ -11753,7 +11784,7 @@ specifications,, mcron, GNU@tie{}mcron}).
 
 
 @node Log Rotation
-@subsubsection Log Rotation
+@subsection Log Rotation
 
 @cindex rottlog
 @cindex log rotation
@@ -11855,7 +11886,7 @@ The list of syslog-controlled files to be rotated.  By default it is:
 @end defvr
 
 @node Networking Services
-@subsubsection Networking Services
+@subsection Networking Services
 
 The @code{(gnu services networking)} module provides services to configure
 the network interface.
@@ -12800,7 +12831,7 @@ Package object of the Open vSwitch.
 @end deftp
 
 @node X Window
-@subsubsection X Window
+@subsection X Window
 
 @cindex X11
 @cindex X Window System
@@ -13084,7 +13115,7 @@ makes the good ol' XlockMore usable.
 
 
 @node Printing Services
-@subsubsection Printing Services
+@subsection Printing Services
 
 @cindex printer support with CUPS
 The @code{(gnu services cups)} module provides a Guix service definition
@@ -13925,7 +13956,7 @@ this:
 
 
 @node Desktop Services
-@subsubsection Desktop Services
+@subsection Desktop Services
 
 The @code{(gnu services desktop)} module provides services that are
 usually useful in the context of a ``desktop'' setup---that is, on a
@@ -14233,7 +14264,7 @@ Users need to be in the @code{lp} group to access the D-Bus service.
 @end deffn
 
 @node Sound Services
-@subsubsection Sound Services
+@subsection Sound Services
 
 @cindex sound support
 @cindex ALSA
@@ -14314,7 +14345,7 @@ details.
 
 
 @node Database Services
-@subsubsection Database Services
+@subsection Database Services
 
 @cindex database
 @cindex SQL
@@ -14474,7 +14505,7 @@ Directory in which to store the database and related files.
 @end deftp
 
 @node Mail Services
-@subsubsection Mail Services
+@subsection Mail Services
 
 @cindex mail
 @cindex email
@@ -15945,7 +15976,7 @@ the @code{postmaster} mail to @code{bob} (which subsequently would
 deliver mail to @code{bob@@example.com} and @code{bob@@example2.com}).
 
 @node Messaging Services
-@subsubsection Messaging Services
+@subsection Messaging Services
 
 @cindex messaging
 @cindex jabber
@@ -16447,7 +16478,7 @@ and Error.
 @end deftp
 
 @node Telephony Services
-@subsubsection Telephony Services
+@subsection Telephony Services
 
 @cindex Murmur (VoIP server)
 @cindex VoIP server
@@ -16652,7 +16683,7 @@ If it is set your server will be linked by this host name instead.
 
 
 @node Monitoring Services
-@subsubsection Monitoring Services
+@subsection Monitoring Services
 
 @subsubheading Tailon Service
 
@@ -17157,7 +17188,7 @@ Defaults to @samp{10051}.
 @c %end of fragment
 
 @node Kerberos Services
-@subsubsection Kerberos Services
+@subsection Kerberos Services
 @cindex Kerberos
 
 The @code{(gnu services kerberos)} module provides services relating to
@@ -17283,7 +17314,7 @@ Local accounts with lower values will silently fail to authenticate.
 
 
 @node Web Services
-@subsubsection Web Services
+@subsection Web Services
 
 @cindex web
 @cindex www
@@ -18084,7 +18115,7 @@ more information on X.509 certificates.
 @end quotation
 
 @node Certificate Services
-@subsubsection Certificate Services
+@subsection Certificate Services
 
 @cindex Web
 @cindex HTTP, HTTPS
@@ -18230,7 +18261,7 @@ For each @code{certificate-configuration}, the certificate is saved to
 @code{/etc/letsencrypt/live/@var{name}/fullchain.pem} and the key is
 saved to @code{/etc/letsencrypt/live/@var{name}/privkey.pem}.
 @node DNS Services
-@subsubsection DNS Services
+@subsection DNS Services
 @cindex DNS (domain name system)
 @cindex domain name system (DNS)
 
@@ -18799,7 +18830,7 @@ Defaults to @samp{()}.
 
 
 @node VPN Services
-@subsubsection VPN Services
+@subsection VPN Services
 @cindex VPN (virtual private network)
 @cindex virtual private network (VPN)
 
@@ -19157,7 +19188,7 @@ Defaults to @samp{#f}.
 
 
 @node Network File System
-@subsubsection Network File System
+@subsection Network File System
 @cindex NFS
 
 The @code{(gnu services nfs)} module provides the following services,
@@ -19272,7 +19303,7 @@ If it is @code{#f} then the daemon will use the host's fully qualified domain na
 @end deftp
 
 @node Continuous Integration
-@subsubsection Continuous Integration
+@subsection Continuous Integration
 
 @cindex continuous integration
 @uref{https://git.savannah.gnu.org/cgit/guix/guix-cuirass.git, Cuirass} is a
@@ -19389,7 +19420,7 @@ The Cuirass package to use.
 @end deftp
 
 @node Power Management Services
-@subsubsection Power Management Services
+@subsection Power Management Services
 
 @cindex tlp
 @cindex power management with TLP
@@ -19923,7 +19954,7 @@ Package object of thermald.
 @end deftp
 
 @node Audio Services
-@subsubsection Audio Services
+@subsection Audio Services
 
 The @code{(gnu services audio)} module provides a service to start MPD
 (the Music Player Daemon).
@@ -19973,7 +20004,7 @@ an absolute path can be specified here.
 @end deftp
 
 @node Virtualization Services
-@subsubsection Virtualization services
+@subsection Virtualization services
 
 The @code{(gnu services virtualization)} module provides services for
 the libvirt and virtlog daemons, as well as other virtualization-related
@@ -20766,7 +20797,7 @@ Return the name of @var{platform}---a string such as @code{"arm"}.
 @end deffn
 
 @node Version Control Services
-@subsubsection Version Control Services
+@subsection Version Control Services
 
 The @code{(gnu services version-control)} module provides a service to
 allow remote access to local Git repositories.  There are three options:
@@ -21954,7 +21985,7 @@ This setting controls the commands and features to enable within Gitolite.
 
 
 @node Game Services
-@subsubsection Game Services
+@subsection Game Services
 
 @subsubheading The Battle for Wesnoth Service
 @cindex wesnothd
@@ -21985,7 +22016,7 @@ The port to bind the server to.
 @end deftp
 
 @node Miscellaneous Services
-@subsubsection Miscellaneous Services
+@subsection Miscellaneous Services
 
 @cindex fingerprint
 @subsubheading Fingerprint Service
@@ -22093,7 +22124,7 @@ that enables sharing the clipboard with a vm and setting the guest display
 resolution when the graphical console window resizes.
 @end deffn
 
-@subsubsection Dictionary Services
+@subsection Dictionary Services
 @cindex dictionary
 The @code{(gnu services dict)} module provides the following service:
 
@@ -22219,7 +22250,7 @@ The Containerd package to use.
 @end deftp
 
 @node Setuid Programs
-@subsection Setuid Programs
+@section Setuid Programs
 
 @cindex setuid programs
 Some programs need to run with ``root'' privileges, even when they are
@@ -22265,7 +22296,7 @@ files in this directory refer to the ``real'' binaries, which are in the
 store.
 
 @node X.509 Certificates
-@subsection X.509 Certificates
+@section X.509 Certificates
 
 @cindex HTTPS, certificates
 @cindex X.509 certificates
@@ -22328,7 +22359,7 @@ variable in the relevant documentation.
 
 
 @node Name Service Switch
-@subsection Name Service Switch
+@section Name Service Switch
 
 @cindex name service switch
 @cindex NSS
@@ -22466,7 +22497,7 @@ Reference Manual}).  For example:
 @end deftp
 
 @node Initial RAM Disk
-@subsection Initial RAM Disk
+@section Initial RAM Disk
 
 @cindex initrd
 @cindex initial RAM disk
@@ -22626,7 +22657,7 @@ automatically copied to the initrd.
 @end deffn
 
 @node Bootloader Configuration
-@subsection Bootloader Configuration
+@section Bootloader Configuration
 
 @cindex bootloader
 @cindex boot loader
@@ -22810,7 +22841,7 @@ logos.
 
 
 @node Invoking guix system
-@subsection Invoking @code{guix system}
+@section Invoking @code{guix system}
 
 Once you have written an operating system declaration as seen in the
 previous section, it can be @dfn{instantiated} using the @command{guix
@@ -23238,7 +23269,7 @@ example graph.
 @end table
 
 @node Running GuixSD in a VM
-@subsection Running GuixSD in a Virtual Machine
+@section Running GuixSD in a Virtual Machine
 
 @cindex virtual machine
 To run GuixSD in a virtual machine (VM), one can either use the
@@ -23303,7 +23334,7 @@ to your system definition and start the VM using
 it uses the ICMP protocol.  You'll have to use a different command to check for
 network connectivity, for example @command{guix download}.
 
-@subsubsection Connecting Through SSH
+@subsection Connecting Through SSH
 
 @cindex SSH
 @cindex SSH server
@@ -23329,7 +23360,7 @@ every time you modify your @command{config.scm} file and the
 @command{-o StrictHostKeyChecking=no} prevents you from having to allow a
 connection to an unknown host every time you connect.
 
-@subsubsection Using @command{virt-viewer} with Spice
+@subsection Using @command{virt-viewer} with Spice
 
 As an alternative to the default @command{qemu} graphical client you can
 use the @command{remote-viewer} from the @command{virt-viewer} package.  To
@@ -23349,7 +23380,7 @@ name=com.redhat.spice.0
 You'll also need to add the @pxref{Miscellaneous Services, Spice service}.
 
 @node Defining Services
-@subsection Defining Services
+@section Defining Services
 
 The previous sections show the available services and how one can combine
 them in an @code{operating-system} declaration.  But how do we define
@@ -23363,7 +23394,7 @@ them in the first place?  And what is a service anyway?
 @end menu
 
 @node Service Composition
-@subsubsection Service Composition
+@subsection Service Composition
 
 @cindex services
 @cindex daemons
@@ -23419,7 +23450,7 @@ The following section describes the programming interface for service
 types and services.
 
 @node Service Types and Services
-@subsubsection Service Types and Services
+@subsection Service Types and Services
 
 A @dfn{service type} is a node in the DAG described above.  Let us start
 with a simple example, the service type for the Guix build daemon
@@ -23556,7 +23587,7 @@ Still here?  The next section provides a reference of the programming
 interface for services.
 
 @node Service Reference
-@subsubsection Service Reference
+@subsection Service Reference
 
 We have seen an overview of service types (@pxref{Service Types and
 Services}).  This section provides a reference on how to manipulate
@@ -23781,7 +23812,7 @@ extend it by passing it lists of packages to add to the system profile.
 
 
 @node Shepherd Services
-@subsubsection Shepherd Services
+@subsection Shepherd Services
 
 @cindex shepherd services
 @cindex PID 1
@@ -23925,7 +23956,7 @@ This service represents PID@tie{}1.
 
 
 @node Documentation
-@section Documentation
+@chapter Documentation
 
 @cindex documentation, searching for
 @cindex searching for documentation
@@ -23989,7 +24020,7 @@ bindings to navigate manuals.  @xref{Getting Started,,, info, Info: An
 Introduction}, for an introduction to Info navigation.
 
 @node Installing Debugging Files
-@section Installing Debugging Files
+@chapter Installing Debugging Files
 
 @cindex debugging files
 Program binaries, as produced by the GCC compilers for instance, are
@@ -24055,7 +24086,7 @@ the load.  To check whether a package has a @code{debug} output, use
 
 
 @node Security Updates
-@section Security Updates
+@chapter Security Updates
 
 @cindex security updates
 @cindex security vulnerabilities
@@ -24174,521 +24205,8 @@ lsof | grep /gnu/store/.*bash
 @end example
 
 
-@node Package Modules
-@section Package Modules
-
-From a programming viewpoint, the package definitions of the
-GNU distribution are provided by Guile modules in the @code{(gnu packages
-@dots{})} name space@footnote{Note that packages under the @code{(gnu
-packages @dots{})} module name space are not necessarily ``GNU
-packages''.  This module naming scheme follows the usual Guile module
-naming convention: @code{gnu} means that these modules are distributed
-as part of the GNU system, and @code{packages} identifies modules that
-define packages.}  (@pxref{Modules, Guile modules,, guile, GNU Guile
-Reference Manual}).  For instance, the @code{(gnu packages emacs)}
-module exports a variable named @code{emacs}, which is bound to a
-@code{<package>} object (@pxref{Defining Packages}).
-
-The @code{(gnu packages @dots{})} module name space is
-automatically scanned for packages by the command-line tools.  For
-instance, when running @code{guix package -i emacs}, all the @code{(gnu
-packages @dots{})} modules are scanned until one that exports a package
-object whose name is @code{emacs} is found.  This package search
-facility is implemented in the @code{(gnu packages)} module.
-
-@cindex customization, of packages
-@cindex package module search path
-Users can store package definitions in modules with different
-names---e.g., @code{(my-packages emacs)}@footnote{Note that the file
-name and module name must match.  For instance, the @code{(my-packages
-emacs)} module must be stored in a @file{my-packages/emacs.scm} file
-relative to the load path specified with @option{--load-path} or
-@code{GUIX_PACKAGE_PATH}.  @xref{Modules and the File System,,,
-guile, GNU Guile Reference Manual}, for details.}.  There are two ways to make
-these package definitions visible to the user interfaces:
-
-@enumerate
-@item
-By adding the directory containing your package modules to the search path
-with the @code{-L} flag of @command{guix package} and other commands
-(@pxref{Common Build Options}), or by setting the @code{GUIX_PACKAGE_PATH}
-environment variable described below.
-
-@item
-By defining a @dfn{channel} and configuring @command{guix pull} so that it
-pulls from it.  A channel is essentially a Git repository containing package
-modules.  @xref{Channels}, for more information on how to define and use
-channels.
-@end enumerate
-
-@code{GUIX_PACKAGE_PATH} works similarly to other search path variables:
-
-@defvr {Environment Variable} GUIX_PACKAGE_PATH
-This is a colon-separated list of directories to search for additional
-package modules.  Directories listed in this variable take precedence
-over the own modules of the distribution.
-@end defvr
-
-The distribution is fully @dfn{bootstrapped} and @dfn{self-contained}:
-each package is built based solely on other packages in the
-distribution.  The root of this dependency graph is a small set of
-@dfn{bootstrap binaries}, provided by the @code{(gnu packages
-bootstrap)} module.  For more information on bootstrapping,
-@pxref{Bootstrapping}.
-
-@node Packaging Guidelines
-@section Packaging Guidelines
-
-@cindex packages, creating
-The GNU distribution is nascent and may well lack some of your favorite
-packages.  This section describes how you can help make the distribution
-grow.  @xref{Contributing}, for additional information on how you can
-help.
-
-Free software packages are usually distributed in the form of
-@dfn{source code tarballs}---typically @file{tar.gz} files that contain
-all the source files.  Adding a package to the distribution means
-essentially two things: adding a @dfn{recipe} that describes how to
-build the package, including a list of other packages required to build
-it, and adding @dfn{package metadata} along with that recipe, such as a
-description and licensing information.
-
-In Guix all this information is embodied in @dfn{package definitions}.
-Package definitions provide a high-level view of the package.  They are
-written using the syntax of the Scheme programming language; in fact,
-for each package we define a variable bound to the package definition,
-and export that variable from a module (@pxref{Package Modules}).
-However, in-depth Scheme knowledge is @emph{not} a prerequisite for
-creating packages.  For more information on package definitions,
-@pxref{Defining Packages}.
-
-Once a package definition is in place, stored in a file in the Guix
-source tree, it can be tested using the @command{guix build} command
-(@pxref{Invoking guix build}).  For example, assuming the new package is
-called @code{gnew}, you may run this command from the Guix build tree
-(@pxref{Running Guix Before It Is Installed}):
-
-@example
-./pre-inst-env guix build gnew --keep-failed
-@end example
-
-Using @code{--keep-failed} makes it easier to debug build failures since
-it provides access to the failed build tree.  Another useful
-command-line option when debugging is @code{--log-file}, to access the
-build log.
-
-If the package is unknown to the @command{guix} command, it may be that
-the source file contains a syntax error, or lacks a @code{define-public}
-clause to export the package variable.  To figure it out, you may load
-the module from Guile to get more information about the actual error:
-
-@example
-./pre-inst-env guile -c '(use-modules (gnu packages gnew))'
-@end example
-
-Once your package builds correctly, please send us a patch
-(@pxref{Contributing}).  Well, if you need help, we will be happy to
-help you too.  Once the patch is committed in the Guix repository, the
-new package automatically gets built on the supported platforms by
-@url{http://hydra.gnu.org/jobset/gnu/master, our continuous integration
-system}.
-
-@cindex substituter
-Users can obtain the new package definition simply by running
-@command{guix pull} (@pxref{Invoking guix pull}).  When
-@code{@value{SUBSTITUTE-SERVER}} is done building the package, installing the
-package automatically downloads binaries from there
-(@pxref{Substitutes}).  The only place where human intervention is
-needed is to review and apply the patch.
-
-
-@menu
-* Software Freedom::            What may go into the distribution.
-* Package Naming::              What's in a name?
-* Version Numbers::             When the name is not enough.
-* Synopses and Descriptions::   Helping users find the right package.
-* Python Modules::              A touch of British comedy.
-* Perl Modules::                Little pearls.
-* Java Packages::               Coffee break.
-* Fonts::                       Fond of fonts.
-@end menu
-
-@node Software Freedom
-@subsection Software Freedom
-
-@c Adapted from http://www.gnu.org/philosophy/philosophy.html.
-@cindex free software
-The GNU operating system has been developed so that users can have
-freedom in their computing.  GNU is @dfn{free software}, meaning that
-users have the @url{http://www.gnu.org/philosophy/free-sw.html,four
-essential freedoms}: to run the program, to study and change the program
-in source code form, to redistribute exact copies, and to distribute
-modified versions.  Packages found in the GNU distribution provide only
-software that conveys these four freedoms.
-
-In addition, the GNU distribution follow the
-@url{http://www.gnu.org/distros/free-system-distribution-guidelines.html,free
-software distribution guidelines}.  Among other things, these guidelines
-reject non-free firmware, recommendations of non-free software, and
-discuss ways to deal with trademarks and patents.
-
-Some otherwise free upstream package sources contain a small and optional
-subset that violates the above guidelines, for instance because this subset
-is itself non-free code.  When that happens, the offending items are removed
-with appropriate patches or code snippets in the @code{origin} form of the
-package (@pxref{Defining Packages}).  This way, @code{guix
-build --source} returns the ``freed'' source rather than the unmodified
-upstream source.
-
-
-@node Package Naming
-@subsection Package Naming
-
-@cindex package name
-A package has actually two names associated with it:
-First, there is the name of the @emph{Scheme variable}, the one following
-@code{define-public}.  By this name, the package can be made known in the
-Scheme code, for instance as input to another package.  Second, there is
-the string in the @code{name} field of a package definition.  This name
-is used by package management commands such as
-@command{guix package} and @command{guix build}.
-
-Both are usually the same and correspond to the lowercase conversion of
-the project name chosen upstream, with underscores replaced with
-hyphens.  For instance, GNUnet is available as @code{gnunet}, and
-SDL_net as @code{sdl-net}.
-
-We do not add @code{lib} prefixes for library packages, unless these are
-already part of the official project name.  But @pxref{Python
-Modules} and @ref{Perl Modules} for special rules concerning modules for
-the Python and Perl languages.
-
-Font package names are handled differently, @pxref{Fonts}.
-
-
-@node Version Numbers
-@subsection Version Numbers
-
-@cindex package version
-We usually package only the latest version of a given free software
-project.  But sometimes, for instance for incompatible library versions,
-two (or more) versions of the same package are needed.  These require
-different Scheme variable names.  We use the name as defined
-in @ref{Package Naming}
-for the most recent version; previous versions use the same name, suffixed
-by @code{-} and the smallest prefix of the version number that may
-distinguish the two versions.
-
-The name inside the package definition is the same for all versions of a
-package and does not contain any version number.
-
-For instance, the versions 2.24.20 and 3.9.12 of GTK+ may be packaged as follows:
-
-@example
-(define-public gtk+
-  (package
-    (name "gtk+")
-    (version "3.9.12")
-    ...))
-(define-public gtk+-2
-  (package
-    (name "gtk+")
-    (version "2.24.20")
-    ...))
-@end example
-If we also wanted GTK+ 3.8.2, this would be packaged as
-@example
-(define-public gtk+-3.8
-  (package
-    (name "gtk+")
-    (version "3.8.2")
-    ...))
-@end example
-
-@c See <https://lists.gnu.org/archive/html/guix-devel/2016-01/msg00425.html>,
-@c for a discussion of what follows.
-@cindex version number, for VCS snapshots
-Occasionally, we package snapshots of upstream's version control system
-(VCS) instead of formal releases.  This should remain exceptional,
-because it is up to upstream developers to clarify what the stable
-release is.  Yet, it is sometimes necessary.  So, what should we put in
-the @code{version} field?
-
-Clearly, we need to make the commit identifier of the VCS snapshot
-visible in the version string, but we also need to make sure that the
-version string is monotonically increasing so that @command{guix package
---upgrade} can determine which version is newer.  Since commit
-identifiers, notably with Git, are not monotonically increasing, we add
-a revision number that we increase each time we upgrade to a newer
-snapshot.  The resulting version string looks like this:
-
-@example
-2.0.11-3.cabba9e
-  ^    ^    ^
-  |    |    `-- upstream commit ID
-  |    |
-  |    `--- Guix package revision
-  |
-latest upstream version
-@end example
-
-It is a good idea to strip commit identifiers in the @code{version}
-field to, say, 7 digits.  It avoids an aesthetic annoyance (assuming
-aesthetics have a role to play here) as well as problems related to OS
-limits such as the maximum shebang length (127 bytes for the Linux
-kernel.)  It is best to use the full commit identifiers in
-@code{origin}s, though, to avoid ambiguities.  A typical package
-definition may look like this:
-
-@example
-(define my-package
-  (let ((commit "c3f29bc928d5900971f65965feaae59e1272a3f7")
-        (revision "1"))          ;Guix package revision
-    (package
-      (version (git-version "0.9" revision commit))
-      (source (origin
-                (method git-fetch)
-                (uri (git-reference
-                      (url "git://example.org/my-package.git")
-                      (commit commit)))
-                (sha256 (base32 "1mbikn@dots{}"))
-                (file-name (git-file-name name version))))
-      ;; @dots{}
-      )))
-@end example
-
-@node Synopses and Descriptions
-@subsection Synopses and Descriptions
-
-@cindex package description
-@cindex package synopsis
-As we have seen before, each package in GNU@tie{}Guix includes a
-synopsis and a description (@pxref{Defining Packages}).  Synopses and
-descriptions are important: They are what @command{guix package
---search} searches, and a crucial piece of information to help users
-determine whether a given package suits their needs.  Consequently,
-packagers should pay attention to what goes into them.
-
-Synopses must start with a capital letter and must not end with a
-period.  They must not start with ``a'' or ``the'', which usually does
-not bring anything; for instance, prefer ``File-frobbing tool'' over ``A
-tool that frobs files''.  The synopsis should say what the package
-is---e.g., ``Core GNU utilities (file, text, shell)''---or what it is
-used for---e.g., the synopsis for GNU@tie{}grep is ``Print lines
-matching a pattern''.
-
-Keep in mind that the synopsis must be meaningful for a very wide
-audience.  For example, ``Manipulate alignments in the SAM format''
-might make sense for a seasoned bioinformatics researcher, but might be
-fairly unhelpful or even misleading to a non-specialized audience.  It
-is a good idea to come up with a synopsis that gives an idea of the
-application domain of the package.  In this example, this might give
-something like ``Manipulate nucleotide sequence alignments'', which
-hopefully gives the user a better idea of whether this is what they are
-looking for.
-
-Descriptions should take between five and ten lines.  Use full
-sentences, and avoid using acronyms without first introducing them.
-Please avoid marketing phrases such as ``world-leading'',
-``industrial-strength'', and ``next-generation'', and avoid superlatives
-like ``the most advanced''---they are not helpful to users looking for a
-package and may even sound suspicious.  Instead, try to be factual,
-mentioning use cases and features.
-
-@cindex Texinfo markup, in package descriptions
-Descriptions can include Texinfo markup, which is useful to introduce
-ornaments such as @code{@@code} or @code{@@dfn}, bullet lists, or
-hyperlinks (@pxref{Overview,,, texinfo, GNU Texinfo}).  However you
-should be careful when using some characters for example @samp{@@} and
-curly braces which are the basic special characters in Texinfo
-(@pxref{Special Characters,,, texinfo, GNU Texinfo}).  User interfaces
-such as @command{guix package --show} take care of rendering it
-appropriately.
-
-Synopses and descriptions are translated by volunteers
-@uref{http://translationproject.org/domain/guix-packages.html, at the
-Translation Project} so that as many users as possible can read them in
-their native language.  User interfaces search them and display them in
-the language specified by the current locale.
-
-To allow @command{xgettext} to extract them as translatable strings,
-synopses and descriptions @emph{must be literal strings}.  This means
-that you cannot use @code{string-append} or @code{format} to construct
-these strings:
-
-@lisp
-(package
-  ;; @dots{}
-  (synopsis "This is translatable")
-  (description (string-append "This is " "*not*" " translatable.")))
-@end lisp
-
-Translation is a lot of work so, as a packager, please pay even more
-attention to your synopses and descriptions as every change may entail
-additional work for translators.  In order to help them, it is possible
-to make recommendations or instructions visible to them by inserting
-special comments like this (@pxref{xgettext Invocation,,, gettext, GNU
-Gettext}):
-
-@example
-;; TRANSLATORS: "X11 resize-and-rotate" should not be translated.
-(description "ARandR is designed to provide a simple visual front end
-for the X11 resize-and-rotate (RandR) extension. @dots{}")
-@end example
-
-
-@node Python Modules
-@subsection Python Modules
-
-@cindex python
-We currently package Python 2 and Python 3, under the Scheme variable names
-@code{python-2} and @code{python} as explained in @ref{Version Numbers}.
-To avoid confusion and naming clashes with other programming languages, it
-seems desirable that the name of a package for a Python module contains
-the word @code{python}.
-
-Some modules are compatible with only one version of Python, others with both.
-If the package Foo compiles only with Python 3, we name it
-@code{python-foo}; if it compiles only with Python 2, we name it
-@code{python2-foo}. If it is compatible with both versions, we create two
-packages with the corresponding names.
-
-If a project already contains the word @code{python}, we drop this;
-for instance, the module python-dateutil is packaged under the names
-@code{python-dateutil} and @code{python2-dateutil}.  If the project name
-starts with @code{py} (e.g.@: @code{pytz}), we keep it and prefix it as
-described above.
-
-@subsubsection Specifying Dependencies
-@cindex inputs, for Python packages
-
-Dependency information for Python packages is usually available in the
-package source tree, with varying degrees of accuracy: in the
-@file{setup.py} file, in @file{requirements.txt}, or in @file{tox.ini}.
-
-Your mission, when writing a recipe for a Python package, is to map
-these dependencies to the appropriate type of ``input'' (@pxref{package
-Reference, inputs}).  Although the @code{pypi} importer normally does a
-good job (@pxref{Invoking guix import}), you may want to check the
-following check list to determine which dependency goes where.
-
-@itemize
-
-@item
-We currently package Python 2 with @code{setuptools} and @code{pip}
-installed like Python 3.4 has per default.  Thus you don't need to
-specify either of these as an input.  @command{guix lint} will warn you
-if you do.
-
-@item
-Python dependencies required at run time go into
-@code{propagated-inputs}.  They are typically defined with the
-@code{install_requires} keyword in @file{setup.py}, or in the
-@file{requirements.txt} file.
-
-@item
-Python packages required only at build time---e.g., those listed with
-the @code{setup_requires} keyword in @file{setup.py}---or only for
-testing---e.g., those in @code{tests_require}---go into
-@code{native-inputs}.  The rationale is that (1) they do not need to be
-propagated because they are not needed at run time, and (2) in a
-cross-compilation context, it's the ``native'' input that we'd want.
-
-Examples are the @code{pytest}, @code{mock}, and @code{nose} test
-frameworks.  Of course if any of these packages is also required at
-run-time, it needs to go to @code{propagated-inputs}.
-
-@item
-Anything that does not fall in the previous categories goes to
-@code{inputs}, for example programs or C libraries required for building
-Python packages containing C extensions.
-
-@item
-If a Python package has optional dependencies (@code{extras_require}),
-it is up to you to decide whether to add them or not, based on their
-usefulness/overhead ratio (@pxref{Submitting Patches, @command{guix
-size}}).
-
-@end itemize
-
-
-@node Perl Modules
-@subsection Perl Modules
-
-@cindex perl
-Perl programs standing for themselves are named as any other package,
-using the lowercase upstream name.
-For Perl packages containing a single class, we use the lowercase class name,
-replace all occurrences of @code{::} by dashes and prepend the prefix
-@code{perl-}.
-So the class @code{XML::Parser} becomes @code{perl-xml-parser}.
-Modules containing several classes keep their lowercase upstream name and
-are also prepended by @code{perl-}.  Such modules tend to have the word
-@code{perl} somewhere in their name, which gets dropped in favor of the
-prefix.  For instance, @code{libwww-perl} becomes @code{perl-libwww}.
-
-
-@node Java Packages
-@subsection Java Packages
-
-@cindex java
-Java programs standing for themselves are named as any other package,
-using the lowercase upstream name.
-
-To avoid confusion and naming clashes with other programming languages,
-it is desirable that the name of a package for a Java package is
-prefixed with @code{java-}.  If a project already contains the word
-@code{java}, we drop this; for instance, the package @code{ngsjava} is
-packaged under the name @code{java-ngs}.
-
-For Java packages containing a single class or a small class hierarchy,
-we use the lowercase class name, replace all occurrences of @code{.} by
-dashes and prepend the prefix @code{java-}.  So the class
-@code{apache.commons.cli} becomes package
-@code{java-apache-commons-cli}.
-
-
-@node Fonts
-@subsection Fonts
-
-@cindex fonts
-For fonts that are in general not installed by a user for typesetting
-purposes, or that are distributed as part of a larger software package,
-we rely on the general packaging rules for software; for instance, this
-applies to the fonts delivered as part of the X.Org system or fonts that
-are part of TeX Live.
-
-To make it easier for a user to search for fonts, names for other packages
-containing only fonts are constructed as follows, independently of the
-upstream package name.
-
-The name of a package containing only one font family starts with
-@code{font-}; it is followed by the foundry name and a dash @code{-}
-if the foundry is known, and the font family name, in which spaces are
-replaced by dashes (and as usual, all upper case letters are transformed
-to lower case).
-For example, the Gentium font family by SIL is packaged under the name
-@code{font-sil-gentium}.
-
-For a package containing several font families, the name of the collection
-is used in the place of the font family name.
-For instance, the Liberation fonts consist of three families,
-Liberation Sans, Liberation Serif and Liberation Mono.
-These could be packaged separately under the names
-@code{font-liberation-sans} and so on; but as they are distributed together
-under a common name, we prefer to package them together as
-@code{font-liberation}.
-
-In the case where several formats of the same font family or font collection
-are packaged separately, a short form of the format, prepended by a dash,
-is added to the package name.  We use @code{-ttf} for TrueType fonts,
-@code{-otf} for OpenType fonts and @code{-type1} for PostScript Type 1
-fonts.
-
-
-
 @node Bootstrapping
-@section Bootstrapping
+@chapter Bootstrapping
 
 @c Adapted from the ELS 2013 paper.
 
@@ -24717,7 +24235,7 @@ Binutils, libc, and the other packages mentioned above---the
 These bootstrap binaries are ``taken for granted'', though we can also
 re-create them if needed (more on that later).
 
-@unnumberedsubsec Preparing to Use the Bootstrap Binaries
+@unnumberedsec Preparing to Use the Bootstrap Binaries
 
 @c As of Emacs 24.3, Info-mode displays the image, but since it's a
 @c large image, it's hard to scroll.  Oh well.
@@ -24768,7 +24286,7 @@ derivations @code{gcc-bootstrap-0.drv}, @code{glibc-bootstrap-0.drv},
 etc., at which point we have a working C tool chain.
 
 
-@unnumberedsubsec Building the Build Tools
+@unnumberedsec Building the Build Tools
 
 Bootstrapping is complete when we have a full tool chain that does not
 depend on the pre-built bootstrap tools discussed above.  This
@@ -24823,7 +24341,7 @@ implicitly used by any package that uses @code{gnu-build-system}
 (@pxref{Build Systems, @code{gnu-build-system}}).
 
 
-@unnumberedsubsec Building the Bootstrap Binaries
+@unnumberedsec Building the Bootstrap Binaries
 
 @cindex bootstrap binaries
 Because the final tool chain does not depend on the bootstrap binaries,
@@ -24849,7 +24367,7 @@ unknown, but if you would like to investigate further (and have
 significant computational and storage resources to do so), then let us
 know.
 
-@unnumberedsubsec Reducing the Set of Bootstrap Binaries
+@unnumberedsec Reducing the Set of Bootstrap Binaries
 
 Our bootstrap binaries currently include GCC, Guile, etc.  That's a lot
 of binary code!  Why is that a problem?  It's a problem because these
@@ -24872,7 +24390,7 @@ a simple and auditable assembler.  Your help is welcome!
 
 
 @node Porting
-@section Porting to a New Platform
+@chapter Porting to a New Platform
 
 As discussed above, the GNU distribution is self-contained, and
 self-containment is achieved by relying on pre-built ``bootstrap
diff --git a/gnu/ci.scm b/gnu/ci.scm
index 943fbb6af6..2c04b7189d 100644
--- a/gnu/ci.scm
+++ b/gnu/ci.scm
@@ -250,7 +250,11 @@ system.")
                                 "." system))))
       (cons name (test->thunk test))))
 
-  (if (member system %guixsd-supported-systems)
+  (if (and (member system %guixsd-supported-systems)
+
+           ;; XXX: Our build farm has too few ARMv7 machines and they are very
+           ;; slow, so skip system tests there.
+           (not (string=? system "armhf-linux")))
       ;; Override the value of 'current-guix' used by system tests.  Using a
       ;; channel instance makes tests that rely on 'current-guix' less
       ;; expensive.  It also makes sure we get a valid Guix package when this
diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm
index 9af04029ba..38d9524653 100644
--- a/gnu/packages/base.scm
+++ b/gnu/packages/base.scm
@@ -13,7 +13,7 @@
 ;;; Copyright © 2017, 2018 Marius Bakke <mbakke@fastmail.com>
 ;;; Copyright © 2017 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
-;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2018, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -975,7 +975,7 @@ with the Linux kernel.")
                   (("/bin/pwd") "pwd"))
                 #t))))))))
 
-(define-public glibc-locales
+(define-public (make-glibc-locales glibc)
   (package
     (inherit glibc)
     (name "glibc-locales")
@@ -1010,7 +1010,7 @@ the 'share/locale' sub-directory of this package.")
                                         ,(version-major+minor
                                           (package-version glibc)))))))))))
 
-(define-public glibc-utf8-locales
+(define-public (make-glibc-utf8-locales glibc)
   (package
     (name "glibc-utf8-locales")
     (version (package-version glibc))
@@ -1060,6 +1060,18 @@ test environments.")
     (home-page (package-home-page glibc))
     (license (package-license glibc))))
 
+(define-public glibc-locales
+  (make-glibc-locales glibc))
+(define-public glibc-utf8-locales
+  (make-glibc-utf8-locales glibc))
+
+(define-public glibc-locales-2.27
+  (package (inherit (make-glibc-locales glibc-2.27))
+           (name "glibc-locales-2.27")))
+(define-public glibc-utf8-locales-2.27
+  (package (inherit (make-glibc-utf8-locales glibc-2.27))
+           (name "glibc-utf8-locales-2.27")))
+
 (define-public which
   (package
     (name "which")
diff --git a/gnu/packages/cpp.scm b/gnu/packages/cpp.scm
index d591e6a884..f5aa447a79 100644
--- a/gnu/packages/cpp.scm
+++ b/gnu/packages/cpp.scm
@@ -41,12 +41,15 @@
     (version "0.4.37")
     (source (origin
               (method url-fetch)
+              ;; Warning: This source has proved unreliable 1 time at least.
+              ;; Consider an alternate source or report upstream if this
+              ;; happens again.
               (uri (string-append "https://mediaarea.net/download/source/"
                                   name "/" version "/"
                                   name "_" version ".tar.bz2"))
               (sha256
                (base32
-                "1hcsrmn85b0xp0mp33aazk7g071q1v3f163nnhv8b0mv9c4bgsfn"))))
+                "1dkqbgabzpa6bd7dkqrvd35sdxrhr6qxalb88f3dw0afk65xqb0k"))))
     (native-inputs
      `(("autoconf" ,autoconf)
        ("automake" ,automake)
@@ -58,10 +61,8 @@
        (modify-phases %standard-phases
          (add-after 'unpack 'pre-configure
            (lambda _
-             (chdir "Project/GNU/Library")))
-         (add-after 'pre-configure 'autogen
-           (lambda _
-             (zero? (system* "sh" "autogen.sh")))))))
+             (chdir "Project/GNU/Library")
+             #t)))))
     (home-page "https://github.com/MediaArea/ZenLib")
     (synopsis "C++ utility library")
     (description "ZenLib is a C++ utility library.  It includes classes for handling
diff --git a/gnu/packages/ebook.scm b/gnu/packages/ebook.scm
index 21c2b2b6f0..99e49bc172 100644
--- a/gnu/packages/ebook.scm
+++ b/gnu/packages/ebook.scm
@@ -178,6 +178,10 @@
                   (pyqt (assoc-ref inputs "python2-pyqt")))
               (substitute* "setup/build_environment.py"
                 (("sys.prefix") (string-append "'" pyqt "'")))
+              (substitute* "src/calibre/ebooks/pdf/pdftohtml.py"
+                (("PDFTOHTML = 'pdftohtml'")
+                 (string-append "PDFTOHTML = \"" (assoc-ref inputs "poppler")
+                  "/bin/pdftohtml\"")))
               (setenv "PODOFO_INC_DIR" (string-append podofo "/include/podofo"))
               (setenv "PODOFO_LIB_DIR" (string-append podofo "/lib"))
               #t)))
diff --git a/gnu/packages/emacs-xyz.scm b/gnu/packages/emacs-xyz.scm
index e90c3b3e29..2a811e5315 100644
--- a/gnu/packages/emacs-xyz.scm
+++ b/gnu/packages/emacs-xyz.scm
@@ -31,7 +31,7 @@
 ;;; Copyright © 2017 Peter Mikkelsen <petermikkelsen10@gmail.com>
 ;;; Copyright © 2017, 2018 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2017 Mike Gerwitz <mtg@gnu.org>
-;;; Copyright © 2017, 2018 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2017, 2018, 2019 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2018 Sohom Bhattacharjee <soham.bhattacharjee15@gmail.com>
 ;;; Copyright © 2018 Mathieu Lirzin <mthl@gnu.org>
 ;;; Copyright © 2018, 2019 Pierre Neidhardt <mail@ambrevar.xyz>
@@ -6906,49 +6906,53 @@ Emacs.")
 ;; Tests for ert-runner have a circular dependency with ecukes, and therefore
 ;; cannot be run
 (define-public emacs-ert-runner
-  (package
-    (name "emacs-ert-runner")
-    (version "0.7.0")
-    (source
-     (origin
-       (method url-fetch)
-       (uri (string-append "https://github.com/rejeep/ert-runner.el/archive/v"
-                           version ".tar.gz"))
-       (file-name (string-append name "-" version ".tar.gz"))
-       (sha256
-        (base32
-         "1657nck9i96a4xgl8crfqq0s8gflzp21pkkzwg6m3z5npjxklgwp"))))
-    (build-system emacs-build-system)
-    (inputs
-     `(("emacs-ansi" ,emacs-ansi)
-       ("emacs-commander" ,emacs-commander)
-       ("emacs-dash" ,emacs-dash)
-       ("emacs-f" ,emacs-f)
-       ("emacs-s" ,emacs-s)
-       ("emacs-shut-up" ,emacs-shut-up)))
-    (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         (add-after 'install 'install-executable
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let ((out (assoc-ref outputs "out")))
-               (substitute* "bin/ert-runner"
-                 (("ERT_RUNNER=\"\\$\\(dirname \\$\\(dirname \\$0\\)\\)")
-                  (string-append "ERT_RUNNER=\"" out
-                                 "/share/emacs/site-lisp/guix.d/ert-runner-"
-                                 ,version)))
-               (install-file "bin/ert-runner" (string-append out "/bin"))
-               (wrap-program (string-append out "/bin/ert-runner")
-                 (list "EMACSLOADPATH" ":" 'prefix
-                       (string-split (getenv "EMACSLOADPATH") #\:)))
-               #t))))
-       #:include (cons* "^reporters/.*\\.el$" %default-include)))
-    (home-page "https://github.com/rejeep/ert-runner.el")
-    (synopsis "Opinionated Ert testing workflow")
-    (description "@code{ert-runner} is a tool for Emacs projects tested
+  (let ((version "0.7.0")
+        (revision "1")
+        (commit "90b8fdd5970ef76a4649be60003b37f82cdc1a65"))
+    (package
+      (name "emacs-ert-runner")
+      (version (git-version "0.7.0" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/rejeep/ert-runner.el.git")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32
+           "04nxmyzncacj2wmzd84vv9wkkr2dk9lcb10dvygqmg3p1gadnwzz"))))
+      (build-system emacs-build-system)
+      (inputs
+       `(("emacs-ansi" ,emacs-ansi)
+         ("emacs-commander" ,emacs-commander)
+         ("emacs-dash" ,emacs-dash)
+         ("emacs-f" ,emacs-f)
+         ("emacs-s" ,emacs-s)
+         ("emacs-shut-up" ,emacs-shut-up)))
+      (arguments
+       `(#:phases
+         (modify-phases %standard-phases
+           (add-after 'install 'install-executable
+             (lambda* (#:key inputs outputs #:allow-other-keys)
+               (let ((out (assoc-ref outputs "out")))
+                 (substitute* "bin/ert-runner"
+                   (("ERT_RUNNER=\"\\$\\(dirname \\$\\(dirname \\$0\\)\\)")
+                    (string-append "ERT_RUNNER=\"" out
+                                   "/share/emacs/site-lisp/guix.d/ert-runner-"
+                                   ,version)))
+                 (install-file "bin/ert-runner" (string-append out "/bin"))
+                 (wrap-program (string-append out "/bin/ert-runner")
+                   (list "EMACSLOADPATH" ":" 'prefix
+                         (string-split (getenv "EMACSLOADPATH") #\:)))
+                 #t))))
+         #:include (cons* "^reporters/.*\\.el$" %default-include)))
+      (home-page "https://github.com/rejeep/ert-runner.el")
+      (synopsis "Opinionated Ert testing workflow")
+      (description "@code{ert-runner} is a tool for Emacs projects tested
 using ERT.  It assumes a certain test structure setup and can therefore make
 running tests easier.")
-    (license license:gpl3+)))
+      (license license:gpl3+))))
 
 (define-public ert-runner
   (deprecated-package "ert-runner" emacs-ert-runner))
@@ -12867,3 +12871,27 @@ DBI, and provides DB-accessing API and the simple management UI.")
       (description "This package is a convenience wrapper for @command{edbi}
 to open SQLite databases.")
       (license license:gpl3+))))
+
+(define-public emacs-nix-mode
+  (package
+    (name "emacs-nix-mode")
+    (version "1.2.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/NixOS/nix-mode/archive/v"
+                           version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "06aqz0czznsj8835jqnk794sy2p6pa8kxfqwh0nl5d5vxivria6z"))))
+    (build-system emacs-build-system)
+    (inputs
+     `(("emacs-company" ,emacs-company)
+       ("emacs-mmm-mode" ,emacs-mmm-mode)))
+    (home-page "https://github.com/NixOS/nix-mode")
+    (synopsis "Emacs major mode for editing Nix expressions")
+    (description "@code{nixos-mode} provides an Emacs major mode for editing
+Nix expressions.  It supports syntax highlighting, indenting and refilling of
+comments.")
+    (license license:lgpl2.1+)))
diff --git a/gnu/packages/finance.scm b/gnu/packages/finance.scm
index 4683887979..250b1db144 100644
--- a/gnu/packages/finance.scm
+++ b/gnu/packages/finance.scm
@@ -73,15 +73,15 @@
 (define-public bitcoin-core
   (package
     (name "bitcoin-core")
-    (version "0.16.1")
+    (version "0.17.1")
     (source (origin
              (method url-fetch)
              (uri
-              (string-append "https://bitcoin.org/bin/bitcoin-core-"
+              (string-append "https://bitcoincore.org/bin/bitcoin-core-"
                              version "/bitcoin-" version ".tar.gz"))
              (sha256
               (base32
-               "1zkqp93yircd3pbxczxfnibkpq0sgcv5r7wg6d196b9pwgr9zd39"))))
+               "0am4pnaf2cisv172jqx6jdpzx770agm8777163lkjbw3ryslymiy"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)
@@ -115,9 +115,15 @@
                          "/bin/lupdate"))
        #:phases
         (modify-phases %standard-phases
+          (add-before 'configure 'make-qt-deterministic
+           (lambda _
+            ;; Make Qt deterministic.
+            (setenv "QT_RCC_SOURCE_DATE_OVERRIDE" "1")
+            #t))
           (add-before 'check 'set-home
            (lambda _
-            (setenv "HOME" (getenv "TMPDIR"))))))) ; Tests write to $HOME.
+            (setenv "HOME" (getenv "TMPDIR"))  ; Tests write to $HOME.
+            #t)))))
     (home-page "https://bitcoin.org/en/")
     (synopsis "Bitcoin peer-to-peer client")
     (description
diff --git a/gnu/packages/games.scm b/gnu/packages/games.scm
index 9fa2bb1795..176f56e7a2 100644
--- a/gnu/packages/games.scm
+++ b/gnu/packages/games.scm
@@ -1418,6 +1418,8 @@ interface or via an external visual interface such as GNU XBoard.")
               ("sdl-gfx" ,sdl-gfx)
               ("fontconfig" ,fontconfig)
               ("check" ,check)))
+    (properties '((ftp-directory . "/freedink")
+                  (upstream-name . "freedink")))
     (home-page "https://www.gnu.org/software/freedink/")
     (synopsis "Twisted adventures of young pig farmer Dink Smallwood")
     (description
@@ -1430,14 +1432,14 @@ To that extent, it also includes a front-end for managing all of your D-Mods.")
 (define freedink-data
   (package
     (name "freedink-data")
-    (version "1.08.20170401")
+    (version "1.08.20190120")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://gnu/freedink/freedink-data-"
-                                  version ".tar.xz"))
+                                  version ".tar.gz"))
               (sha256
                (base32
-                "1zx7qywibhznj7bnz217404scr8dfh0xj24xjihnda5iapzz7lz8"))))
+                "17gvryadlxk172mblbsil7hina1z5wahwaxnr6g3mdq57dvl8pvi"))))
     (build-system gnu-build-system)
     (arguments
      `(#:phases
@@ -1445,6 +1447,7 @@ To that extent, it also includes a front-end for managing all of your D-Mods.")
          (delete 'configure)            ; no configure script
          (delete 'check))               ; no tests
        #:make-flags (list (string-append "PREFIX=" (assoc-ref %outputs "out")))))
+    (properties '((ftp-directory . "/freedink")))
     (home-page "https://www.gnu.org/software/freedink/")
     (synopsis "Game data for GNU Freedink")
     (description
@@ -1468,6 +1471,8 @@ To that extent, it also includes a front-end for managing all of your D-Mods.")
     (inputs
      `(("bzip2" ,bzip2)
        ("wxwidgets" ,wxwidgets)))
+    (properties '((ftp-directory . "/freedink")
+                  (upstream-name . "dfarc")))
     (home-page "https://www.gnu.org/software/freedink/")
     (synopsis "Front-end for managing and playing Dink Modules")
     (description "DFArc makes it easy to play and manage the GNU FreeDink game
@@ -5453,6 +5458,9 @@ Strife, Chex Quest, and fan-created games like Harmony, Hacx and Freedoom.")
                           (string-append "fortune-mod/cmake/"
                                          (strip-store-file-name cmake-rules)))
                (chdir "fortune-mod")
+               ;; TODO: Valgrind tests fail for some reason.
+               ;; Similar issue: https://github.com/shlomif/fortune-mod/issues/21 (?)
+               (delete-file "tests/t/valgrind.t")
                #t)))
          (add-after 'install 'fix-install-directory
            (lambda* (#:key outputs #:allow-other-keys)
diff --git a/gnu/packages/guile.scm b/gnu/packages/guile.scm
index 8d14571895..b1447a1d2e 100644
--- a/gnu/packages/guile.scm
+++ b/gnu/packages/guile.scm
@@ -1672,7 +1672,7 @@ is no support for parsing block and inline level HTML.")
 (define-public guile-bytestructures
   (package
     (name "guile-bytestructures")
-    (version "1.0.3")
+    (version "1.0.5")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/TaylanUB/scheme-bytestructures"
@@ -1680,7 +1680,7 @@ is no support for parsing block and inline level HTML.")
                                   "/bytestructures-" version ".tar.gz"))
               (sha256
                (base32
-                "0xf6s8gd3656j8k2ar6y7i62r68azawyzxhsagsk8nvldnrs1r18"))))
+                "0ibk7fjwpb450lnrva4bx45sgln3pbyb645az4ansvh1spgani43"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)))
diff --git a/gnu/packages/haskell.scm b/gnu/packages/haskell.scm
index a3ce2a3e4c..9433ae0570 100644
--- a/gnu/packages/haskell.scm
+++ b/gnu/packages/haskell.scm
@@ -3,7 +3,7 @@
 ;;; Copyright © 2015 Siniša Biđin <sinisa@bidin.eu>
 ;;; Copyright © 2015 Paul van der Walt <paul@denknerd.org>
 ;;; Copyright © 2015 Eric Bavier <bavier@member.fsf.org>
-;;; Copyright © 2016, 2018 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2016, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2016, 2017 Nils Gillmann <ng0@n0.is>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2015, 2016, 2017, 2018, 2019 Ricardo Wurmus <rekado@elephly.net>
@@ -3790,8 +3790,6 @@ writing to stdout and other handles.")
         (base32
          "1qrpxfirsxckg7jv28f5ah2qc8lh95hp7rnqkbqs1ahcwlbnvkm7"))))
     (build-system haskell-build-system)
-    (inputs
-     `(("ghc-hunit" ,ghc-hunit)))
     ;; these inputs are necessary to use this library
     (inputs
      `(("ghc-text" ,ghc-text)
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 4bd53c2ba0..1d47d2caaf 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -2,7 +2,7 @@
 ;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018 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, 2017, 2018 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2014, 2015, 2016, 2017, 2018, 2019 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, 2017, 2018 Efraim Flashner <efraim@flashner.co.il>
@@ -413,8 +413,8 @@ for ARCH and optionally VARIANT, or #f if there is no such configuration."
 It has been modified to remove all non-free binary blobs.")
     (license license:gpl2)))
 
-(define %linux-libre-version "4.20.3")
-(define %linux-libre-hash "0mk996fb4bd9548xnv2as4lxm3gyj1kvn6ra03xxpb0wf8cqdazz")
+(define %linux-libre-version "4.20.4")
+(define %linux-libre-hash "1p7ixkqvnr0mzyivyby8hfix44np7w1nvyxghz8wa1h2nhsszvzv")
 
 (define %linux-libre-4.20-patches
   (list %boot-logo-patch
@@ -427,8 +427,8 @@ It has been modified to remove all non-free binary blobs.")
                     #:patches %linux-libre-4.20-patches
                     #:configuration-file kernel-config))
 
-(define %linux-libre-4.19-version "4.19.16")
-(define %linux-libre-4.19-hash "1dpfllfzksrr6iqhvbh2905gkvycsv5zcmgq6wmwqiry1swzdfyk")
+(define %linux-libre-4.19-version "4.19.17")
+(define %linux-libre-4.19-hash "0friqd9wyhddjli4m41wd994ygnwng40a95ry14478rkadfv7iwh")
 
 (define %linux-libre-4.19-patches
   (list %boot-logo-patch
@@ -5039,3 +5039,88 @@ file systems.")
     ;; The library "libhandle" and the headers in "xfslibs-dev" are
     ;; licensed under lgpl2.1. the other stuff is licensed under gpl2.
     (license (list license:gpl2 license:lgpl2.1))))
+
+(define-public genext2fs
+  (package
+    (name "genext2fs")
+    (version "1.4.1")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/jeremie-koenig/genext2fs.git")
+                    (commit (string-append "genext2fs-" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1r0n74pyypv63qfqqpvx75dwijcsvcrvqrlv8sldbhv0nwr1gk53"))))
+    (build-system gnu-build-system)
+    (home-page "https://github.com/jeremie-koenig/genext2fs")
+    (synopsis "Generate ext2 filesystem as a normal user")
+    (description "This package provides a program to general an ext2
+filesystem as a normal (non-root) user.  It does not require you to mount
+the image file to copy files on it, nor does it require that you become
+the superuser to make device nodes.")
+    (license license:gpl2)))
+
+(define-public fakeroot
+  (package
+    (name "fakeroot")
+    (version "1.23")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://ftp.debian.org/debian/pool/main/f/"
+                                  "fakeroot/fakeroot_" version ".orig.tar.xz"))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1xpl0s2yjyjwlf832b6kbkaa5921liybaar13k7n45ckd9lxd700"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+        (add-after 'configure 'patch-Makefile
+          (lambda _
+            ;; Note: The root of the problem is already in "Makefile.am".
+            (substitute* "Makefile"
+             (("/bin/sh") (which "sh")))
+            #t))
+        (add-after 'unpack 'patch-getopt
+          (lambda*  (#:key inputs #:allow-other-keys)
+            (substitute* "scripts/fakeroot.in"
+             (("getopt")
+              (string-append (assoc-ref inputs "util-linux")
+                             "/bin/getopt")))
+            #t))
+        (add-before 'check 'prepare-check
+          (lambda _
+            (setenv "SHELL" (which "bash"))
+            (setenv "VERBOSE" "1")
+            (substitute* "test/t.touchinstall"
+             ;; We don't have the name of the root user, so use ID=0.
+             (("grep root") "grep \"\\<0\\>\""))
+            (substitute* "test/tartest"
+             ;; We don't have the name of the root group, so use ID=0.
+             (("ROOTGROUP=root") "ROOTGROUP=0")
+             ;; We don't have the name of the daemon user, so use IDs.
+             (("daemon:sys") "1:3")
+             (("daemon:") "1:"))
+            ;; We don't have an /etc/passwd entry for "root" - use numeric IDs.
+            (substitute* "test/compare-tar"
+             (("tar -tvf") "tar --numeric-owner -tvf"))
+            #t)))))
+    (native-inputs
+     `(("sharutils" ,sharutils) ; for the tests
+       ("xz" ,xz))) ; for the tests
+    (inputs
+     `(("libcap" ,libcap)
+       ("util-linux" ,util-linux)))
+    (synopsis "Provides a fake root environment")
+    (description "@command{fakeroot} runs a command in an environment where
+it appears to have root privileges for file manipulation. This is useful
+for allowing users to create archives (tar, ar, .deb etc.) with files in
+them with root permissions/ownership. Without fakeroot one would have to
+have root privileges to create the constituent files of the archives with
+the correct permissions and ownership, and then pack them up, or one would
+have to construct the archives directly, without using the archiver.")
+    (home-page "http://freshmeat.sourceforge.net/projects/fakeroot")
+    (license license:gpl3+)))
diff --git a/gnu/packages/messaging.scm b/gnu/packages/messaging.scm
index 36a181446a..be39d14b53 100644
--- a/gnu/packages/messaging.scm
+++ b/gnu/packages/messaging.scm
@@ -553,14 +553,14 @@ simultaneously and therefore appear under the same nickname on IRC.")
 (define-public python-nbxmpp
   (package
     (name "python-nbxmpp")
-    (version "0.6.8")
+    (version "0.6.9")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "nbxmpp" version))
        (sha256
         (base32
-         "1iip8ijxp86fx4bl1h67p2lp02p2zm1ga2p3q43nv30smj54nawc"))))
+         "03f8dk4kb7ya0pg7v0a0kqms4c7f2bqan5wl4ig0mcwpdmppj3b6"))))
     (build-system python-build-system)
     (arguments
      `(#:tests? #f))                    ; no tests
@@ -578,7 +578,7 @@ was initially a fork of xmpppy, but uses non-blocking sockets.")
 (define-public gajim
   (package
     (name "gajim")
-    (version "1.1.1")
+    (version "1.1.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://gajim.org/downloads/"
@@ -586,7 +586,7 @@ was initially a fork of xmpppy, but uses non-blocking sockets.")
                                   "/gajim-" version ".tar.bz2"))
               (sha256
                (base32
-                "09n4445hclqwfnk2h9cxvsxaixza4cpgb5rp4najdfc2jgg2msb3"))))
+                "1lx03cgi58z54xb7mhs6bc715lc00w5mpysf9n3q8zgn759fm0rj"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
diff --git a/gnu/packages/moreutils.scm b/gnu/packages/moreutils.scm
index 34bce23c30..12d93079c0 100644
--- a/gnu/packages/moreutils.scm
+++ b/gnu/packages/moreutils.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
-;;; Copyright © 2016, 2017 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016, 2017, 2019 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016, 2017, 2018 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -30,7 +30,7 @@
 (define-public moreutils
   (package
     (name "moreutils")
-    (version "0.62")
+    (version "0.63")
     (source
      (origin
        (method url-fetch)
@@ -43,7 +43,7 @@
               name "-" version ".tar.gz")))
        (sha256
         (base32
-         "1gc3rswr0jl0z42pbrmw2zc4gxsyp60hq8cnvrlsig1vk1s9vpwx"))))
+         "07c3wqf1sx3nhj4cs71a9ajcfl6arjjvvnhwqz7a0xm2m1b6vj2g"))))
     (build-system gnu-build-system)
     ;; For building the manual pages.
     (native-inputs
@@ -63,7 +63,8 @@
                       (let* ((out (assoc-ref outputs "out")))
                         (wrap-program
                             (string-append out "/bin/ts")
-                          `("PERL5LIB" ":" prefix (,(getenv "PERL5LIB")))))))
+                          `("PERL5LIB" ":" prefix (,(getenv "PERL5LIB")))))
+                      #t))
          (delete 'configure))           ; no configure script
        #:make-flags
        (list (string-append "PREFIX=" (assoc-ref %outputs "out"))
diff --git a/gnu/packages/package-management.scm b/gnu/packages/package-management.scm
index 05da8190b6..66712da08c 100644
--- a/gnu/packages/package-management.scm
+++ b/gnu/packages/package-management.scm
@@ -43,7 +43,6 @@
   #:use-module (gnu packages curl)
   #:use-module (gnu packages dbm)
   #:use-module (gnu packages docbook)
-  #:use-module (gnu packages emacs-xyz)
   #:use-module (gnu packages file)
   #:use-module (gnu packages gettext)
   #:use-module (gnu packages glib)
@@ -76,7 +75,6 @@
   #:use-module (gnu packages web)
   #:use-module (gnu packages xml)
   #:use-module (gnu packages xorg)
-  #:use-module (guix build-system emacs)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system meson)
   #:use-module (guix build-system python)
@@ -460,30 +458,6 @@ store, usually the directory /nix/store, where each package has its own unique
 sub-directory.")
     (license license:lgpl2.1+)))
 
-(define-public emacs-nix-mode
-  (package
-    (name "emacs-nix-mode")
-    (version "1.2.2")
-    (source
-     (origin
-       (method url-fetch)
-       (uri (string-append "https://github.com/NixOS/nix-mode/archive/v"
-                           version ".tar.gz"))
-       (file-name (string-append name "-" version ".tar.gz"))
-       (sha256
-        (base32
-         "06aqz0czznsj8835jqnk794sy2p6pa8kxfqwh0nl5d5vxivria6z"))))
-    (build-system emacs-build-system)
-    (inputs
-     `(("emacs-company" ,emacs-company)
-       ("emacs-mmm-mode" ,emacs-mmm-mode)))
-    (home-page "https://github.com/NixOS/nix-mode")
-    (synopsis "Emacs major mode for editing Nix expressions")
-    (description "@code{nixos-mode} provides an Emacs major mode for editing
-Nix expressions.  It supports syntax highlighting, indenting and refilling of
-comments.")
-    (license license:lgpl2.1+)))
-
 (define-public stow
   (package
     (name "stow")
diff --git a/gnu/packages/pdf.scm b/gnu/packages/pdf.scm
index 2c9442db02..33bd0062ff 100644
--- a/gnu/packages/pdf.scm
+++ b/gnu/packages/pdf.scm
@@ -1067,26 +1067,45 @@ presentation.  The input files processed by pdfpc are PDF documents.")
     (license license:gpl2+)))
 
 (define-public paps
-  (package
-    (name "paps")
-    (version "0.6.8")
-    (source
-     (origin
-       (method url-fetch)
-       (uri (string-append "mirror://sourceforge/paps/paps/" version "/"
-                           "paps-" version ".tar.gz"))
-       (sha256
-        (base32
-         "080ahnyvq918m8ahq8bg9qvgzlv4k0jgcsdqhrwjzppclx74q8fv"))))
-    (build-system gnu-build-system)
-    (inputs
-     `(("pango" ,pango)))
-    (native-inputs
-     `(("pkg-config" ,pkg-config)))
-    (home-page "http://paps.sourceforge.net/")
-    (synopsis "Pango to PostScript converter")
-    (description
-     "Paps reads a UTF-8 encoded file and generates a PostScript language
+  (let ((commit "37e6ca1cd96d751bbbff5539d795c90d657289a5")
+        (revision "1"))
+    (package
+      (name "paps")
+      ;; The last release was in 2015, but since then there have been security
+      ;; bug fixes.
+      (version (git-version "0.7.0" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/dov/paps.git")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32
+           "1ilcyjqdynxsd2p8dnn8h4592dwf531x9pbkxa1w09hkcdn7hgwc"))))
+      (build-system gnu-build-system)
+      (arguments
+       `(#:phases
+         (modify-phases %standard-phases
+           (add-after 'unpack 'do-not-run-configure-script-during-bootstrap
+             (lambda _
+               (substitute* "autogen.sh"
+                 (("^./configure") "#"))
+               #t)))))
+      (inputs
+       `(("pango" ,pango)))
+      (native-inputs
+       `(("autoconf" ,autoconf)
+         ("automake" ,automake)
+         ("gettext" ,gettext-minimal)
+         ("glib" ,glib "bin")
+         ("intltool" ,intltool)
+         ("pkg-config" ,pkg-config)))
+      (home-page "https://github.com/dov/paps")
+      (synopsis "Pango to PostScript converter")
+      (description
+       "Paps reads a UTF-8 encoded file and generates a PostScript language
 rendering of the file.  The rendering is done by creating outline curves
 through the Pango @code{ft2} backend.")
-    (license license:lgpl2.0+)))
+      (license license:lgpl2.0+))))
diff --git a/gnu/packages/perl-check.scm b/gnu/packages/perl-check.scm
index ee832ccf94..c1edf48f06 100644
--- a/gnu/packages/perl-check.scm
+++ b/gnu/packages/perl-check.scm
@@ -788,6 +788,28 @@ set_relative_time, set_absolute_time or set_fixed_time to alter future calls
 to gmtime,time or localtime.")
     (license perl-license)))
 
+(define-public perl-test-more-utf8
+  (package
+    (name "perl-test-more-utf8")
+    (version "0.05")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (string-append
+               "mirror://cpan/authors/id/M/MO/MONS/Test-More-UTF8-"
+               version ".tar.gz"))
+        (sha256
+         (base32
+          "016fs77lmw8xxrcnapvp6wq4hjwgsdfi3l9ylpxgxkcpdarw9wdr"))))
+    (build-system perl-build-system)
+    (home-page "https://metacpan.org/release/Test-More-UTF8")
+    (synopsis "Enhance Test::More for UTF8-based projects")
+    (description "@code{Test::More::UTF8} is a simple extension for the widely
+used @code{Test::More} module.  By default, it will do a @code{binmode ':utf8'}
+on all of @code{Test::Builder}'s output handles thus enabling the easy use
+flagged strings without warnings like \"Wide character in print @dots{}\"")
+    (license perl-license)))
+
 (define-public perl-test-most
   (package
     (name "perl-test-most")
diff --git a/gnu/packages/perl.scm b/gnu/packages/perl.scm
index c4d9d64de3..073cdbf482 100644
--- a/gnu/packages/perl.scm
+++ b/gnu/packages/perl.scm
@@ -3431,7 +3431,7 @@ provide a quick dropin when such functionality is needed.")
 (define-public perl-file-homedir
   (package
     (name "perl-file-homedir")
-    (version "1.002")
+    (version "1.004")
     (source
      (origin
        (method url-fetch)
@@ -3439,7 +3439,7 @@ provide a quick dropin when such functionality is needed.")
                            "File-HomeDir-" version ".tar.gz"))
        (sha256
         (base32
-         "0x62hn8rc7ninf9nlp69h61yh21g4cbq2g81sh64cf2ify2hqk7b"))))
+         "1bciyzwv7gwsnaykqz0czj6mlbkkg4hg1s40s1q7j2p6nlmpxxj5"))))
     (build-system perl-build-system)
     (propagated-inputs
      `(("perl-file-which" ,perl-file-which)))
@@ -3559,7 +3559,7 @@ the input record separator string on a per file basis.")
 (define-public perl-file-remove
   (package
     (name "perl-file-remove")
-    (version "1.57")
+    (version "1.58")
     (source
      (origin
        (method url-fetch)
@@ -3567,14 +3567,16 @@ the input record separator string on a per file basis.")
                            "File-Remove-" version ".tar.gz"))
        (sha256
         (base32
-         "1b814lw181kkqh6c1n4p2zlzzsq6ic5pfpr831nphf2w2rhcvgmk"))))
+         "1n6h5w3sp2bs4cfrifdx2z15cfpb4r536179mx1a12xbmj1yrxl1"))))
     (build-system perl-build-system)
+    (native-inputs
+     `(("perl-module-build" ,perl-module-build)))
     (home-page "https://metacpan.org/release/File-Remove")
     (synopsis "Remove files and directories in Perl")
-    (description "File::Remove::remove removes files and directories.  It acts
-like /bin/rm, for the most part.  Although \"unlink\" can be given a list of
-files, it will not remove directories; this module remedies that.  It also
-accepts wildcards, * and ?, as arguments for file names.")
+    (description "@code{File::Remove::remove} removes files and directories.
+It acts like @code{/bin/rm}, for the most part.  Although @code{unlink} can be
+given a list of files, it will not remove directories; this module remedies
+that.  It also accepts wildcards, * and ?, as arguments for file names.")
     (license (package-license perl))))
 
 (define-public perl-file-sharedir
@@ -3648,15 +3650,15 @@ allows you to locate these files after installation.")
 (define-public perl-file-slurp
   (package
     (name "perl-file-slurp")
-    (version "9999.19")
+    (version "9999.25")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "mirror://cpan/authors/id/U/UR/URI/"
+       (uri (string-append "mirror://cpan/authors/id/C/CA/CAPOEIRAB/"
                            "File-Slurp-" version ".tar.gz"))
        (sha256
         (base32
-         "0hrn4nipwx40d6ji8ssgr5nw986z9iqq8cn0kdpbszh9jplynaff"))))
+         "1hg3bhf5m78d77p4174cnldd75ppyrvr5rkc8w289ihvwsx9gsn7"))))
     (build-system perl-build-system)
     (home-page "https://metacpan.org/release/File-Slurp")
     (synopsis "Reading/Writing/Modifying of complete files")
@@ -3732,14 +3734,14 @@ a safe way.")
 (define-public perl-file-which
   (package
     (name "perl-file-which")
-    (version "1.09")
+    (version "1.23")
     (source (origin
               (method url-fetch)
-              (uri (string-append "mirror://cpan/authors/id/A/AD/ADAMK/"
+              (uri (string-append "mirror://cpan/authors/id/P/PL/PLICEASE/"
                                   "File-Which-" version ".tar.gz"))
               (sha256
                (base32
-                "1hxjyh9yrv32f3g8vrnr8iylzprajsac14vjm75kf1qnj1jyqbxp"))))
+                "0y70qh5kn2hyrrvbsfhg0iws2qggk5vkpz37f7rbd5rd9cjc57dp"))))
     (build-system perl-build-system)
     (native-inputs `(("test-script" ,perl-test-script)))
     (synopsis "Portable implementation of the `which' utility")
@@ -3747,7 +3749,7 @@ a safe way.")
      "File::Which was created to be able to get the paths to executable
 programs on systems under which the `which' program wasn't implemented in the
 shell.")
-    (home-page "https://metacpan.org/release/ADAMK/File-Which-1.09")
+    (home-page "https://metacpan.org/release/File-Which")
     (license (package-license perl))))
 
 (define-public perl-file-zglob
@@ -4361,15 +4363,15 @@ commands.")
 (define-public perl-json
   (package
     (name "perl-json")
-    (version "2.90")
+    (version "4.01")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "mirror://cpan/authors/id/M/MA/MAKAMAKA/"
+       (uri (string-append "mirror://cpan/authors/id/I/IS/ISHIGAKI/"
                            "JSON-" version ".tar.gz"))
        (sha256
         (base32
-         "127yppvr17qik9pkd1vy901hs4l13kg6rhp76jdgcyask35v7nsd"))))
+         "1vdiw095g5rf51q8d0ipf8020jx371pma0k4sxp0wlfl76lr65b3"))))
     (build-system perl-build-system)
     (propagated-inputs
      `(("perl-json-xs" ,perl-json-xs))) ;recommended
@@ -4436,7 +4438,7 @@ either uses the first module it finds or throws an error.")
 (define-public perl-json-xs
   (package
     (name "perl-json-xs")
-    (version "3.01")
+    (version "4.0")
     (source
      (origin
        (method url-fetch)
@@ -4444,8 +4446,10 @@ either uses the first module it finds or throws an error.")
                            "JSON-XS-" version ".tar.gz"))
        (sha256
         (base32
-         "1aviik480m61ykwvyix83grywzbk828wvfz19hqfvaasd8jz73af"))))
+         "0118yrzagwlcfj5yldn3h23zzqs2rx282jlm068nf7fjlvy4m7s7"))))
     (build-system perl-build-system)
+    (native-inputs
+     `(("perl-canary-stability" ,perl-canary-stability)))
     (propagated-inputs
      `(("perl-common-sense" ,perl-common-sense)
        ("perl-types-serialiser" ,perl-types-serialiser)))
@@ -5299,7 +5303,7 @@ from Moose::Conflicts and moose-outdated.")
 (define-public perl-module-scandeps
   (package
     (name "perl-module-scandeps")
-    (version "1.25")
+    (version "1.27")
     (source
      (origin
        (method url-fetch)
@@ -5307,7 +5311,7 @@ from Moose::Conflicts and moose-outdated.")
                            "Module-ScanDeps-" version ".tar.gz"))
        (sha256
         (base32
-         "13280nq0d6zc58mcz3kvs2m85a741czq0fabk69ks1nr4j1w2nl4"))))
+         "0j6r9r99x5p0i6fv06i44wpsvjxj32amjkiqf6pmqpj80jff2k7f"))))
     (build-system perl-build-system)
     (native-inputs
      `(("perl-test-requires" ,perl-test-requires)))
@@ -8389,7 +8393,7 @@ algorism to indicate multiplication by 1000.")
 (define-public perl-text-template
   (package
     (name "perl-text-template")
-    (version "1.47")
+    (version "1.54")
     (source
      (origin
        (method url-fetch)
@@ -8399,8 +8403,11 @@ algorism to indicate multiplication by 1000.")
              ".tar.gz"))
        (sha256
         (base32
-         "1z781cgz7wbn80lf3kqr2ad0pg6g1wlnim0822h8liw28k3l5msh"))))
+         "0s56jgak9ccbbbybf5v8hvvhyplbfhzl6p6v1751inly80rlj1kv"))))
     (build-system perl-build-system)
+    (native-inputs
+     `(("perl-test-more-utf8" ,perl-test-more-utf8)
+       ("perl-test-warnings" ,perl-test-warnings)))
     (home-page
      "https://metacpan.org/release/Text-Template")
     (synopsis
diff --git a/gnu/packages/python-web.scm b/gnu/packages/python-web.scm
index af0595b36d..cee4973086 100644
--- a/gnu/packages/python-web.scm
+++ b/gnu/packages/python-web.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015 Eric Dvorsak <eric@dvorsak.fr>
-;;; Copyright © 2015, 2016, 2017, 2018 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2015, 2016, 2017, 2018, 2019 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2017 Christopher Baines <mail@cbaines.net>
 ;;; Copyright © 2016, 2017 Danny Milosavljevic <dannym+a@scratchpost.org>
 ;;; Copyright © 2013, 2014, 2015, 2016 Andreas Enge <andreas@enge.fr>
@@ -1218,14 +1218,14 @@ verification of the SSL peer.")
 (define-public python-websocket-client
   (package
     (name "python-websocket-client")
-    (version "0.37.0")
+    (version "0.54.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "websocket_client" version))
        (sha256
         (base32
-         "0h9glp1jll3z76ly3kg08aqgxqk0a68p4zi9yn50353bh5nj92v7"))))
+         "0j88zmikaypf38lvpkf4aaxrjp9j07dmy5ghj7kli0fv3p4n45g5"))))
     (build-system python-build-system)
     (propagated-inputs
      `(("python-six" ,python-six)))
@@ -1233,10 +1233,18 @@ verification of the SSL peer.")
     (synopsis "WebSocket client for Python")
     (description "The Websocket-client module provides the low level APIs for
 WebSocket usage in Python programs.")
+    (properties `((python2-variant . ,(delay python2-websocket-client))))
     (license license:lgpl2.1+)))
 
 (define-public python2-websocket-client
-  (package-with-python2 python-websocket-client))
+  (let ((base (package-with-python2
+                (strip-python2-variant python-websocket-client))))
+    (package
+      (inherit base)
+      (native-inputs
+       `(("python2-backport-ssl-match-hostname"
+          ,python2-backport-ssl-match-hostname)
+         ,@(package-native-inputs base))))))
 
 (define-public python-requests
   (package
diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 770f5abc63..35ac4e69f5 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
-;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2013, 2014, 2015, 2016 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2014, 2017 Eric Bavier <bavier@member.fsf.org>
@@ -1997,25 +1997,25 @@ e.g. filters, callbacks and errbacks can all be promises.")
 (define-public python-virtualenv
   (package
     (name "python-virtualenv")
-    (version "15.0.3")
+    (version "16.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "virtualenv" version))
        (sha256
         (base32
-         "07cbajzk8l05k5zhlw0b9wbf2is65bl9v6zrn2a0iyn57w6pd73d"))))
+         "0242cg3hdq3qdvx5flyrki8lpwlgwf5k45c21ks5049fv7ygm6gq"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         (replace 'check
+         (add-before 'check 'disable-failing-test
            (lambda _
              ;; Disable failing test.  See upstream bug report
              ;; https://github.com/pypa/virtualenv/issues/957
              (substitute* "tests/test_virtualenv.py"
                (("skipif.*") "skipif(True, reason=\"Guix\")\n"))
-             (zero? (system* "py.test")))))))
+             #t)))))
     (native-inputs
      `(("python-mock" ,python-mock)
        ("python-pytest" ,python-pytest)))
@@ -3392,8 +3392,6 @@ toolkits.")
        ("python2-scipy" ,python2-scipy)
        ("python2-pandas" ,python2-pandas)))
     (native-inputs
-     `(("python2-cython" ,python2-cython)))
-    (native-inputs
      `(("unzip" ,unzip)))
     (home-page "http://research.microsoft.com/en-us/um/redmond/projects/mscompbio/")
     (synopsis "Library for reading and manipulating genetic data")
@@ -6052,14 +6050,14 @@ and MAC network addresses.")
 (define-public python-wrapt
   (package
     (name "python-wrapt")
-    (version "1.10.11")
+    (version "1.11.1")
     (source
       (origin
         (method url-fetch)
         (uri (pypi-uri "wrapt" version))
         (sha256
           (base32
-            "1ip3dwib39xhp79kblskgvz3fjzcwxgx3fs3ahdixhpjg7a61mfl"))))
+            "0cqmysny1pz01jw26q48q5zasvns6507rwhgm6wcw743f0r01sja"))))
     (build-system python-build-system)
     (arguments
      ;; Tests are not included in the tarball, they are only available in the
@@ -8705,14 +8703,14 @@ to support both Python 2 and Python 3 with minimal overhead.")
 (define-public python-cysignals
   (package
     (name "python-cysignals")
-    (version "1.1.0")
+    (version "1.9.0")
     (source
       (origin
         (method url-fetch)
-        (uri (pypi-uri "cysignals" version ".tar.bz2"))
+        (uri (pypi-uri "cysignals" version))
         (sha256
           (base32
-            "14cbyd9znlz6cxy1s3g6v6dv5jj45hn27pywkidd9b1zanaysqc6"))))
+            "15ix8crpad26cfl1skyg7qajqqfdrm8q5ahhmlfmqi1aw0jqj2g2"))))
     (build-system python-build-system)
     (native-inputs
       `(("python-cython" ,python-cython)
@@ -11396,17 +11394,18 @@ builds partial trees by inspecting living objects.")
 (define-public python-isort
   (package
     (name "python-isort")
-    (version "4.2.5")
+    (version "4.3.4")
     (source
      (origin
-       (method url-fetch)
-       (uri (string-append
-             "https://github.com/timothycrosley/isort/archive/"
-             version ".tar.gz"))
-       (file-name (string-append name "-" version ".tar.gz"))
+       (method git-fetch)
+       (uri (git-reference
+              ;; Tests pass only from the Github sources
+              (url "https://github.com/timothycrosley/isort")
+              (commit version)))
+       (file-name (git-file-name name version))
        (sha256
         (base32
-         "0zsrgkb0krn5476yncy5dd56k7dk34zqb4bnlvwy44ixgilyjmfh"))))
+         "1q0mlrpki5vjbgwxag5rghljjcfg7mvb0pbkwid80p0sqrxlm2p6"))))
     (build-system python-build-system)
     (native-inputs
      `(("python-mock" ,python-mock)
@@ -11417,10 +11416,16 @@ builds partial trees by inspecting living objects.")
 imports alphabetically, and automatically separated into sections.  It
 provides a command line utility, a python library and plugins for various
 editors.")
-    (license license:expat)))
+    (license license:expat)
+    (properties `((python2-variant . ,(delay python2-isort))))))
 
 (define-public python2-isort
-  (package-with-python2 python-isort))
+  (let ((base (package-with-python2
+               (strip-python2-variant python-isort))))
+    (package (inherit base)
+      (native-inputs
+       `(("python2-futures" ,python2-futures)
+         ,@(package-native-inputs base))))))
 
 (define-public python2-backports-functools-lru-cache
   (package
diff --git a/gnu/packages/video.scm b/gnu/packages/video.scm
index 34f10fdeb4..4121832f12 100644
--- a/gnu/packages/video.scm
+++ b/gnu/packages/video.scm
@@ -15,7 +15,7 @@
 ;;; Copyright © 2016, 2018, 2019 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2017 Feng Shu <tumashu@163.com>
-;;; Copyright © 2017, 2018 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2017, 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2017 Chris Marusich <cmmarusich@gmail.com>
 ;;; Copyright © 2017 Thomas Danckaert <post@thomasdanckaert.be>
 ;;; Copyright © 2017 Ethan R. Jones <doubleplusgood23@gmail.com>
@@ -905,7 +905,7 @@ videoformats depend on the configuration flags of ffmpeg.")
 (define-public vlc
   (package
     (name "vlc")
-    (version "3.0.5")
+    (version "3.0.6")
     (source (origin
              (method url-fetch)
              (uri (string-append
@@ -914,7 +914,7 @@ videoformats depend on the configuration flags of ffmpeg.")
                    "/vlc-" version ".tar.xz"))
              (sha256
               (base32
-               "1nvj00khy08sing0mdnw6virmiq579mrk5rvpx9710nlxggqgh7m"))))
+               "1lvyyahv6g9zv7m5g5qinyrwmw47zdsd5ysimb862j7kw15nvh8q"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("flex" ,flex)
@@ -2667,15 +2667,18 @@ MPEG-2, MPEG-4, DVD (VOB)...
 (define-public mediainfo
   (package
     (name "mediainfo")
-    (version "0.7.95")
+    (version "18.12")
     (source (origin
               (method url-fetch)
+              ;; Warning: This source has proved unreliable 1 time at least.
+              ;; Consider an alternate source or report upstream if this
+              ;; happens again.
               (uri (string-append "https://mediaarea.net/download/source/"
                                   name "/" version "/"
                                   name "_" version ".tar.bz2"))
               (sha256
                (base32
-                "0dy51a3i79jppmg1gi4f6h7jx4hcgnkmfim4d7d3gmnlbkjh8anv"))))
+                "1ix95ilcjlawcq6phh25cgplm3riqa2ii7ql82g8yagqs4ldqp6a"))))
     (native-inputs
      `(("autoconf" ,autoconf)
        ("automake" ,automake)
@@ -2693,10 +2696,7 @@ MPEG-2, MPEG-4, DVD (VOB)...
          (add-after 'unpack 'change-to-build-dir
            (lambda _
              (chdir "Project/GNU/CLI")
-             #t))
-         (add-after 'change-to-build-dir 'autogen
-           (lambda _
-             (invoke "sh" "autogen.sh"))))))
+             #t)))))
     (home-page "https://mediaarea.net/en/MediaInfo")
     (synopsis "Utility for reading media metadata")
     (description "MediaInfo is a utility used for retrieving technical
diff --git a/gnu/packages/virtualization.scm b/gnu/packages/virtualization.scm
index 82bde36222..d178a08413 100644
--- a/gnu/packages/virtualization.scm
+++ b/gnu/packages/virtualization.scm
@@ -6,7 +6,7 @@
 ;;; Copyright © 2017 Alex Vong <alexvong1995@gmail.com>
 ;;; Copyright © 2017 Andy Patterson <ajpatter@uwaterloo.ca>
 ;;; Copyright © 2017, 2018 Rutger Helling <rhelling@mykolab.com>
-;;; Copyright © 2017, 2018 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2017, 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018 Danny Milosavljevic <dannym@scratchpost.org>
 ;;; Copyright © 2018 Sou Bunnbu <iyzsong@member.fsf.org>
 ;;; Copyright © 2018 Julien Lepiller <julien@lepiller.eu>
@@ -30,17 +30,22 @@
 (define-module (gnu packages virtualization)
   #:use-module (gnu packages)
   #:use-module (gnu packages admin)
+  #:use-module (gnu packages assembly)
   #:use-module (gnu packages attr)
   #:use-module (gnu packages autotools)
   #:use-module (gnu packages bison)
   #:use-module (gnu packages check)
+  #:use-module (gnu packages cmake)
   #:use-module (gnu packages compression)
+  #:use-module (gnu packages cross-base)
   #:use-module (gnu packages curl)
   #:use-module (gnu packages cyrus-sasl)
   #:use-module (gnu packages disk)
   #:use-module (gnu packages dns)
   #:use-module (gnu packages docbook)
   #:use-module (gnu packages documentation)
+  #:use-module (gnu packages figlet)
+  #:use-module (gnu packages firmware)
   #:use-module (gnu packages flex)
   #:use-module (gnu packages fontutils)
   #:use-module (gnu packages gettext)
@@ -72,6 +77,7 @@
   #:use-module (gnu packages textutils)
   #:use-module (gnu packages tls)
   #:use-module (gnu packages web)
+  #:use-module (gnu packages wget)
   #:use-module (gnu packages xdisorg)
   #:use-module (gnu packages xml)
   #:use-module (gnu packages xorg)
@@ -896,7 +902,7 @@ Open Container Initiative specification.")
 (define-public umoci
   (package
     (name "umoci")
-    (version "0.4.2")
+    (version "0.4.3")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -905,7 +911,7 @@ Open Container Initiative specification.")
               (file-name (string-append "umoci-" version ".tar.xz"))
               (sha256
                (base32
-                "1rq5jxcss9cmy05x9b2kh9ld57ribi8hgnx2w67jpmf343b83m4q"))))
+                "1hy3gcs8z25153qpw4rk2lispfaf2c90hv1q64xwyjxn22j9ayy9"))))
     (build-system go-build-system)
     (arguments
      '(#:import-path "github.com/openSUSE/umoci"
@@ -1103,3 +1109,206 @@ x86 CPUs, from early 386 to the most recent x86-64 Intel and AMD processors.
 Bochs can run most Operating Systems inside the emulation including Linux,
 DOS or Microsoft Windows.")
     (license license:lgpl2.0+)))
+
+(define-public xen
+  (package
+    (name "xen")
+    (version "4.11.1")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "git://xenbits.xenproject.org/xen.git")
+                    (commit (string-append "RELEASE-" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1wv1hyfii14vi9lfjmnv07h2gpm3b7kvh2p55f4yy2b40simksgk"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:configure-flags
+       (list "--enable-rpath"
+             "--disable-qemu-traditional" ; It tries to do "git clone"
+             "--disable-rombios" ; would try to "git clone" via etherboot.
+             ;; TODO: Re-enable stubdom (it's "more secure" to use it).
+             "--disable-stubdom" ; tries to "git clone" old patched newlib.
+             (string-append "--with-initddir="
+                            (assoc-ref %outputs "out")
+                            "/etc/init.d")
+             (string-append "--with-system-qemu="
+                            (assoc-ref %build-inputs "qemu")
+                            "/bin/qemu-system-i386")
+             (string-append "--with-system-seabios="
+                            (assoc-ref %build-inputs "seabios")
+                            "/share/firmware/bios.bin")
+             (string-append "--with-system-ovmf="
+                            (assoc-ref %build-inputs "ovmf")
+                            "/share/firmware/ovmf_ia32.bin"))
+       #:make-flags (list "-j" "1"
+                          "XEN_BUILD_DATE=Thu Jan  1 01:00:01 CET 1970"
+                          "XEN_BUILD_TIME=01:00:01"
+                          "XEN_BUILD_HOST="
+                          "ETHERBOOT_NICS="
+                          "SMBIOS_REL_DATE=01/01/1970"
+                          "VGABIOS_REL_DATE=01 Jan 1970"
+                          ; QEMU_TRADITIONAL_LOC
+                          ; QEMU_UPSTREAM_LOC
+                          "SYSCONFIG_DIR=/tmp/etc/default"
+                          (string-append "BASH_COMPLETION_DIR="
+                                         (assoc-ref %outputs "out")
+                                         "/etc/bash_completion.d")
+                          (string-append "BOOT_DIR="
+                                         (assoc-ref %outputs "out")
+                                         "/boot")
+                          (string-append "DEBUG_DIR="
+                                         (assoc-ref %outputs "out")
+                                         "/lib/debug")
+                          (string-append "EFI_DIR="
+                                         (assoc-ref %outputs "out")
+                                         "/lib/efi") ; TODO lib64 ?
+                          "MINIOS_UPSTREAM_URL="
+                          ;(string-append "DISTDIR="
+                          ;               (assoc-ref %outputs "out"))
+)
+       #:test-target "test"
+       #:phases
+       (modify-phases %standard-phases
+        (add-after 'unpack 'unpack-mini-os
+          (lambda* (#:key inputs #:allow-other-keys)
+            (copy-recursively (assoc-ref inputs "mini-os") "extras/mini-os")
+            #t))
+        (add-after 'unpack-mini-os 'patch
+          (lambda* (#:key inputs outputs #:allow-other-keys)
+            (substitute* "tools/firmware/Rules.mk"
+             (("override XEN_TARGET_ARCH = x86_32")
+              (string-append "override XEN_TARGET_ARCH = x86_32
+override CC = " (assoc-ref inputs "cross-gcc") "/bin/i686-linux-gnu-gcc"))
+             (("^CFLAGS =$")
+              (string-append "CFLAGS=-I" (assoc-ref inputs "cross-libc")
+                             "/include\n")))
+            (substitute* "config/x86_32.mk"
+             (("CFLAGS += -m32 -march=i686")
+              (string-append "CFLAGS += -march=i686 -I"
+                             (assoc-ref inputs "cross-libc")
+                             "/include")))
+            ;; /var is not in /gnu/store , so don't try to create it.
+            (substitute* '("tools/Makefile"
+                           "tools/xenstore/Makefile"
+                           "tools/xenpaging/Makefile")
+             (("\\$\\(INSTALL_DIR\\) .*XEN_(DUMP|LOG|RUN|LIB|PAGING)_DIR.*")
+              "\n")
+             (("\\$\\(INSTALL_DIR\\) .*XEN_(RUN|LIB)_STORED.*")
+              "\n"))
+            ;; Prevent xen from creating /etc .
+            (substitute* "tools/examples/Makefile"
+             ((" install-readmes") "")
+             ((" install-configs") ""))
+            ;; Set rpath.
+            (substitute* "tools/pygrub/setup.py"
+             (("library_dirs =")
+              ; TODO: extra_link_args = ['-Wl,-rpath=/opt/foo'],
+              (string-append "runtime_library_dirs = ['"
+                             (assoc-ref outputs "out")
+                             "/lib'],\nlibrary_dirs =")))
+            #t))
+        (add-before 'configure 'patch-xen-script-directory
+          (lambda* (#:key outputs #:allow-other-keys)
+            (substitute* '("configure"
+                           "tools/configure"
+                           "docs/configure")
+             (("XEN_SCRIPT_DIR=.*")
+              (string-append "XEN_SCRIPT_DIR="
+                             (assoc-ref outputs "out")
+                             "/etc/xen/scripts")))
+            #t))
+        (add-before 'configure 'set-environment-up
+          (lambda* (#:key make-flags #:allow-other-keys)
+             (define (cross? x)
+               (string-contains x "cross-i686-linux"))
+             (define (filter-environment! filter-predicate
+                                          environment-variable-names)
+               (for-each
+                (lambda (env-name)
+                  (let* ((env-value (getenv env-name))
+                         (search-path (search-path-as-string->list env-value))
+                         (new-search-path (filter filter-predicate
+                                                  search-path))
+                         (new-env-value (list->search-path-as-string
+                                         new-search-path ":")))
+                    (setenv env-name new-env-value)))
+                environment-variable-names))
+             (setenv "CROSS_C_INCLUDE_PATH" (getenv "C_INCLUDE_PATH"))
+             (setenv "CROSS_CPLUS_INCLUDE_PATH" (getenv "CPLUS_INCLUDE_PATH"))
+             (setenv "CROSS_LIBRARY_PATH" (getenv "LIBRARY_PATH"))
+             (filter-environment! cross?
+              '("CROSS_C_INCLUDE_PATH" "CROSS_CPLUS_INCLUDE_PATH"
+                "CROSS_LIBRARY_PATH"))
+             (filter-environment! (lambda (e) (not (cross? e)))
+              '("C_INCLUDE_PATH" "CPLUS_INCLUDE_PATH"
+                "LIBRARY_PATH"))
+             ;; Guix tries to be helpful and automatically adds
+             ;; mini-os-git-checkout/include to the include path,
+             ;; but actually we don't want it to be there (yet).
+             (filter-environment! (lambda (e)
+                                    (not
+                                     (string-contains e
+                                      "mini-os-git-checkout")))
+              '("C_INCLUDE_PATH" "CPLUS_INCLUDE_PATH"
+                "LIBRARY_PATH"))
+            (setenv "EFI_VENDOR" "guix")
+             #t))
+        (replace 'build
+          (lambda* (#:key make-flags #:allow-other-keys)
+            (apply invoke "make" "world" make-flags))))))
+    (inputs
+     `(("acpica" ,acpica) ; TODO: patch iasl invocation.
+       ("bridge-utils" ,bridge-utils) ; TODO: patch invocations.
+       ("glib" ,glib)
+       ("iproute" ,iproute) ; TODO: patch invocations.
+       ("libaio" ,libaio)
+       ("libx11" ,libx11)
+       ("libyajl" ,libyajl)
+       ("ncurses" ,ncurses)
+       ("openssl" ,openssl)
+       ("ovmf" ,ovmf)
+       ("pixman" ,pixman)
+       ("qemu" ,qemu-minimal)
+       ("seabios" ,seabios)
+       ("util-linux" ,util-linux) ; uuid
+       ; TODO: ocaml-findlib, ocaml-nox.
+       ("xz" ,xz) ; for liblzma
+       ("zlib" ,zlib)))
+    (native-inputs
+     `(("dev86" ,dev86)
+       ("bison" ,bison)
+       ("cmake" ,cmake)
+       ("figlet" ,figlet)
+       ("flex" ,flex)
+       ("gettext" ,gettext-minimal)
+       ("libnl" ,libnl)
+       ("mini-os"
+       ,(origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "http://xenbits.xen.org/git-http/mini-os.git")
+               (commit (string-append "xen-RELEASE-" version))))
+         (sha256
+          (base32
+           "1i8pcl19n60i2m9vlg79q3nknpj209c9ic5x10wxaicx45kc107f"))
+         (file-name "mini-os-git-checkout")))
+       ("perl" ,perl)
+       ; TODO: markdown
+       ("pkg-config" ,pkg-config)
+       ("python" ,python-2)
+       ("wget" ,wget)
+       ("cross-gcc" ,(cross-gcc "i686-linux-gnu"
+                                #:xbinutils (cross-binutils "i686-linux-gnu")
+                                #:libc (cross-libc "i686-linux-gnu")))
+       ("cross-libc" ,(cross-libc "i686-linux-gnu")) ; header files
+       ("cross-libc-static" ,(cross-libc "i686-linux-gnu") "static")))
+    (home-page "https://xenproject.org/")
+    (synopsis "Xen Virtual Machine Monitor")
+    (description "This package provides the Xen Virtual Machine Monitor
+which is a hypervisor.")
+    ;; TODO: Some files are licensed differently.  List those.
+    (license license:gpl2)
+    (supported-systems '("i686-linux" "x86_64-linux" "armhf-linux"))))
diff --git a/gnu/packages/xml.scm b/gnu/packages/xml.scm
index fd4c3fea2c..05bc8aa13e 100644
--- a/gnu/packages/xml.scm
+++ b/gnu/packages/xml.scm
@@ -12,7 +12,7 @@
 ;;; Copyright © 2016 Ben Woodcroft <donttrustben@gmail.com>
 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2016, 2017 Nils Gillmann <ng0@n0.is>
-;;; Copyright © 2016, 2017, 2018 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2016, 2017, 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2016, 2017, 2018 Marius Bakke <mbakke@fastmail.com>
 ;;; Copyright © 2017 Adriano Peluso <catonano@gmail.com>
 ;;; Copyright © 2017 Gregor Giesen <giesen@zaehlwerk.net>
@@ -686,14 +686,14 @@ This module provide functions which simplify writing tests for
 (define-public perl-xml-compile
   (package
     (name "perl-xml-compile")
-    (version "1.60")
+    (version "1.61")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://cpan/authors/id/M/MA/MARKOV/"
                                   "XML-Compile-" version ".tar.gz"))
               (sha256
                (base32
-                "04vv7wy5v1l38xsfdbacvyd90qircvnrs2f3ysljm1nhq8mycmwm"))))
+                "13dvsaj8simivj867rkjlf7hhvvcwlahnhk70zf8cq2xbg8wmf7x"))))
     (build-system perl-build-system)
     (propagated-inputs
      `(("perl-carp" ,perl-carp)
diff --git a/gnu/packages/xorg.scm b/gnu/packages/xorg.scm
index 364a37e34d..7e3c1aad1c 100644
--- a/gnu/packages/xorg.scm
+++ b/gnu/packages/xorg.scm
@@ -14,7 +14,7 @@
 ;;; Copyright © 2017, 2018 Marius Bakke <mbakke@fastmail.com>
 ;;; Copyright © 2017, 2018, 2019 Rutger Helling <rhelling@mykolab.com>
 ;;; Copyright © 2017 Arun Isaac <arunisaac@systemreboot.net>
-;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018 Kei Kebreau <kkebreau@posteo.net>
 ;;; Copyright © 2018 Oleg Pykhalov <go.wigust@gmail.com>
 ;;; Copyright © 2018 Benjamin Slade <slade@jnanam.net>
@@ -2236,7 +2236,7 @@ X server: 'handhelds', 'redglass' and 'whiteglass'.")
 (define-public xcursorgen
   (package
     (name "xcursorgen")
-    (version "1.0.6")
+    (version "1.0.7")
     (source
       (origin
         (method url-fetch)
@@ -2246,7 +2246,7 @@ X server: 'handhelds', 'redglass' and 'whiteglass'.")
                ".tar.bz2"))
         (sha256
           (base32
-            "0v7nncj3kaa8c0524j7ricdf4rvld5i7c3m6fj55l5zbah7r3j1i"))))
+            "0ggbv084cavp52hjgcz3vdj0g018axs0m23c03lpc5sgn92gidim"))))
     (build-system gnu-build-system)
     (inputs
       `(("libxcursor" ,libxcursor)
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index 9400e6310d..088b582bcd 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -30,7 +30,6 @@
   #:use-module (guix monads)
   #:use-module (guix records)
   #:use-module (guix modules)
-  #:use-module (guix scripts pack)
   #:use-module (guix utils)
   #:use-module (gcrypt hash)
   #:use-module (guix base32)
diff --git a/gnu/tests/install.scm b/gnu/tests/install.scm
index 7114e5cc79..ec29064118 100644
--- a/gnu/tests/install.scm
+++ b/gnu/tests/install.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2017 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -430,7 +430,6 @@ reboot\n")
                            (type "ext4"))
                          (file-system
                            (device "none")
-                           (type "tmpfs")
                            (mount-point "/home")
                            (type "tmpfs"))
                          %base-file-systems))
diff --git a/guix/build/compile.scm b/guix/build/compile.scm
index 215489f136..9e31be93ff 100644
--- a/guix/build/compile.scm
+++ b/guix/build/compile.scm
@@ -97,8 +97,7 @@
          (report-load file total completed)
          (format debug-port "~%loading '~a'...~%" file)
 
-         (parameterize ((current-warning-port debug-port))
-           (resolve-interface (file-name->module-name file)))
+         (resolve-interface (file-name->module-name file))
 
          (loop files (+ 1 completed)))))))
 
@@ -158,37 +157,38 @@ files are for HOST, a GNU triplet such as \"x86_64-linux-gnu\"."
 
     ;; Exit as soon as something goes wrong.
     (exit-on-exception
-     (with-fluids ((*current-warning-prefix* ""))
-       (with-target host
-         (lambda ()
-           (let ((relative (relative-file source-directory file)))
-             (compile-file file
-                           #:output-file (string-append build-directory "/"
-                                                        (scm->go relative))
-                           #:opts (append warning-options
-                                          (optimization-options relative))))))))
+     (with-target host
+       (lambda ()
+         (let ((relative (relative-file source-directory file)))
+           (compile-file file
+                         #:output-file (string-append build-directory "/"
+                                                      (scm->go relative))
+                         #:opts (append warning-options
+                                        (optimization-options relative)))))))
     (with-mutex progress-lock
       (set! completed (+ 1 completed))))
 
   (with-augmented-search-path %load-path source-directory
     (with-augmented-search-path %load-compiled-path build-directory
-      ;; FIXME: To work around <https://bugs.gnu.org/15602>, we first load all
-      ;; of FILES.
-      (load-files source-directory files
-                  #:report-load report-load
-                  #:debug-port debug-port)
-
-      ;; Make sure compilation related modules are loaded before starting to
-      ;; compile files in parallel.
-      (compile #f)
-
-      ;; XXX: Don't use too many workers to work around the insane memory
-      ;; requirements of the compiler in Guile 2.2.2:
-      ;; <https://lists.gnu.org/archive/html/guile-devel/2017-05/msg00033.html>.
-      (n-par-for-each (min workers 8) build files)
-
-      (unless (zero? total)
-        (report-compilation #f total total)))))
+      (with-fluids ((*current-warning-prefix* ""))
+
+        ;; FIXME: To work around <https://bugs.gnu.org/15602>, we first load all
+        ;; of FILES.
+        (load-files source-directory files
+                    #:report-load report-load
+                    #:debug-port debug-port)
+
+        ;; Make sure compilation related modules are loaded before starting to
+        ;; compile files in parallel.
+        (compile #f)
+
+        ;; XXX: Don't use too many workers to work around the insane memory
+        ;; requirements of the compiler in Guile 2.2.2:
+        ;; <https://lists.gnu.org/archive/html/guile-devel/2017-05/msg00033.html>.
+        (n-par-for-each (min workers 8) build files)
+
+        (unless (zero? total)
+          (report-compilation #f total total))))))
 
 (eval-when (eval load)
   (when (and (string=? "2" (major-version))
diff --git a/guix/deprecation.scm b/guix/deprecation.scm
index 453aad7106..2f7c058940 100644
--- a/guix/deprecation.scm
+++ b/guix/deprecation.scm
@@ -20,7 +20,7 @@
   #:use-module (guix i18n)
   #:use-module (ice-9 format)
   #:export (define-deprecated
-            without-deprecation-warnings
+            define-deprecated/alias
             deprecation-warning-port))
 
 ;;; Commentary:
@@ -33,7 +33,7 @@
 
 (define deprecation-warning-port
   ;; Port where deprecation warnings go.
-  (make-parameter (current-warning-port)))
+  (make-parameter (current-error-port)))
 
 (define (source-properties->location-string properties)
   "Return a human-friendly, GNU-standard representation of PROPERTIES, a
@@ -87,3 +87,23 @@ This will write a deprecation warning to DEPRECATION-WARNING-PORT."
                    (id
                     (identifier? #'id)
                     #'real))))))))))
+
+(define-syntax-rule (define-deprecated/alias deprecated replacement)
+  "Define as an alias a deprecated variable, procedure, or macro, along
+these lines:
+
+  (define-deprecated/alias nix-server? store-connection?)
+
+where 'nix-server?' is the deprecated name for 'store-connection?'.
+
+This will write a deprecation warning to DEPRECATION-WARNING-PORT."
+  (define-syntax deprecated
+    (lambda (s)
+      (warn-about-deprecation 'deprecated (syntax-source s)
+                              #:replacement 'replacement)
+      (syntax-case s ()
+        ((_ args (... ...))
+         #'(replacement args (... ...)))
+        (id
+         (identifier? #'id)
+         #'replacement)))))
diff --git a/guix/derivations.scm b/guix/derivations.scm
index f6176a78fd..fb2fa177be 100644
--- a/guix/derivations.scm
+++ b/guix/derivations.scm
@@ -113,7 +113,7 @@
 ;;; Error conditions.
 ;;;
 
-(define-condition-type &derivation-error &nix-error
+(define-condition-type &derivation-error &store-error
   derivation-error?
   (derivation derivation-error-derivation))
 
diff --git a/guix/grafts.scm b/guix/grafts.scm
index db9c6854fd..a3e12f6efd 100644
--- a/guix/grafts.scm
+++ b/guix/grafts.scm
@@ -189,7 +189,7 @@ available."
        items)))
 
   (define (references* items)
-    (guard (c ((nix-protocol-error? c)
+    (guard (c ((store-protocol-error? c)
                ;; As a last resort, build DRV and query the references of the
                ;; build result.
 
diff --git a/guix/import/github.scm b/guix/import/github.scm
index b287313d98..4d12339204 100644
--- a/guix/import/github.scm
+++ b/guix/import/github.scm
@@ -98,7 +98,9 @@ false if none is recognized"
               (updated-url source-uri))
              ((source-uri ...)
               (find updated-url source-uri))))
-     ((eq? fetch-method download:git-fetch)
+     ((and (eq? fetch-method download:git-fetch)
+           (string-prefix? "https://github.com/"
+                           (download:git-reference-url source-uri)))
       (download:git-reference-url source-uri))
      (else #f))))
 
@@ -169,6 +171,9 @@ empty list."
   "Return a string of the newest released version name given a string URL like
 'https://github.com/arq5x/bedtools2/archive/v2.24.0.tar.gz' and the name of
 the package e.g. 'bedtools2'.  Return #f if there is no releases"
+  (define (pre-release? x)
+    (hash-ref x "prerelease"))
+
   (let* ((json (fetch-releases-or-tags url)))
     (if (eq? json #f)
         (if (%github-token)
@@ -178,40 +183,32 @@ API when using a GitHub token")
 API. This may be fixed by using an access token and setting the environment
 variable GUIX_GITHUB_TOKEN, for instance one procured from
 https://github.com/settings/tokens"))
-        (let loop ((releases
-                    (filter
-                     (lambda (x)
-                       ;; example pre-release:
-                       ;; https://github.com/wwood/OrfM/releases/tag/v0.5.1
-                       ;; or an all-prerelease set
-                       ;; https://github.com/powertab/powertabeditor/releases
-                       (not (hash-ref x "prerelease")))
-                     json)))
-          (match releases
-            (()                                   ;empty release list
-             #f)
-            ((release . rest)                     ;one or more releases
-             (let ((tag (or (hash-ref release "tag_name") ;a "release"
-                            (hash-ref release "name")))   ;a tag
-                   (name-length (string-length package-name)))
-               ;; some tags include the name of the package e.g. "fdupes-1.51"
-               ;; so remove these
-               (if (and (< name-length (string-length tag))
-                        (string=? (string-append package-name "-")
-                                  (substring tag 0 (+ name-length 1))))
-                   (substring tag (+ name-length 1))
-                   ;; some tags start with a "v" e.g. "v0.25.0"
-                   ;; where some are just the version number
-                   (if (string-prefix? "v" tag)
-                       (substring tag 1)
-
-                       ;; Finally, reject tags that don't start with a digit:
-                       ;; they may not represent a release.
-                       (if (and (not (string-null? tag))
-                                (char-set-contains? char-set:digit
-                                                    (string-ref tag 0)))
-                           tag
-                           (loop rest)))))))))))
+        (any
+         (lambda (release)
+           (let ((tag (or (hash-ref release "tag_name") ;a "release"
+                          (hash-ref release "name")))   ;a tag
+                 (name-length (string-length package-name)))
+             (cond
+              ;; some tags include the name of the package e.g. "fdupes-1.51"
+              ;; so remove these
+              ((and (< name-length (string-length tag))
+                    (string=? (string-append package-name "-")
+                              (substring tag 0 (+ name-length 1))))
+               (substring tag (+ name-length 1)))
+              ;; some tags start with a "v" e.g. "v0.25.0"
+              ;; where some are just the version number
+              ((string-prefix? "v" tag)
+               (substring tag 1))
+              ;; Finally, reject tags that don't start with a digit:
+              ;; they may not represent a release.
+              ((and (not (string-null? tag))
+                    (char-set-contains? char-set:digit
+                                        (string-ref tag 0)))
+               tag)
+              (else #f))))
+         (match (remove pre-release? json)
+           (() json) ; keep everything
+           (releases releases))))))
 
 (define (latest-release pkg)
   "Return an <upstream-source> for the latest release of PKG."
diff --git a/guix/inferior.scm b/guix/inferior.scm
index 9f19e7d316..6cfa146029 100644
--- a/guix/inferior.scm
+++ b/guix/inferior.scm
@@ -26,9 +26,9 @@
                           version>? version-prefix?
                           cache-directory))
   #:use-module ((guix store)
-                #:select (nix-server-socket
-                          nix-server-major-version
-                          nix-server-minor-version
+                #:select (store-connection-socket
+                          store-connection-major-version
+                          store-connection-minor-version
                           store-lift))
   #:use-module ((guix derivations)
                 #:select (read-derivation-from-file))
@@ -424,8 +424,8 @@ thus be the code of a one-argument procedure that accepts a store."
      (chmod directory #o700)
      (let* ((name     (string-append directory "/inferior"))
             (socket   (socket AF_UNIX SOCK_STREAM 0))
-            (major    (nix-server-major-version store))
-            (minor    (nix-server-minor-version store))
+            (major    (store-connection-major-version store))
+            (minor    (store-connection-minor-version store))
             (proto    (logior major minor)))
        (bind socket AF_UNIX name)
        (listen socket 1024)
@@ -451,7 +451,7 @@ thus be the code of a one-argument procedure that accepts a store."
         inferior)
        (match (accept socket)
          ((client . address)
-          (proxy client (nix-server-socket store))))
+          (proxy client (store-connection-socket store))))
        (close-port socket)
        (read-inferior-response inferior)))))
 
diff --git a/guix/records.scm b/guix/records.scm
index 98f3c8fef0..6b3c25cefa 100644
--- a/guix/records.scm
+++ b/guix/records.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2018 Mark H Weaver <mhw@netris.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -52,6 +53,22 @@
       ((weird _ ...)                              ;weird!
        (syntax-violation name "invalid field specifier" #'weird)))))
 
+(define (report-duplicate-field-specifier name ctor)
+  "Report the first duplicate identifier among the bindings in CTOR."
+  (syntax-case ctor ()
+    ((_ bindings ...)
+     (let loop ((bindings #'(bindings ...))
+                (seen   '()))
+       (syntax-case bindings ()
+         (((field value) rest ...)
+          (not (memq (syntax->datum #'field) seen))
+          (loop #'(rest ...) (cons (syntax->datum #'field) seen)))
+         ((duplicate rest ...)
+          (syntax-violation name "duplicate field initializer"
+                            #'duplicate))
+         (()
+          #t))))))
+
 (eval-when (expand load eval)
   ;; The procedures below are needed both at run time and at expansion time.
 
@@ -169,6 +186,9 @@ of TYPE matches the expansion-time ABI."
                           #'(field (... ...)))
                     (wrap-field-value f (field-default-value f))))
 
+              ;; Pass S to make sure source location info is preserved.
+              (report-duplicate-field-specifier 'name s)
+
               (let ((fields (append fields (map car default-values))))
                 (cond ((lset= eq? fields '(expected ...))
                        #`(let* #,(field-bindings
diff --git a/guix/scripts/challenge.scm b/guix/scripts/challenge.scm
index f0693ed8df..65de42053d 100644
--- a/guix/scripts/challenge.scm
+++ b/guix/scripts/challenge.scm
@@ -109,7 +109,7 @@
   "Return the hash of ITEM, a store item, if ITEM was built locally.
 Otherwise return #f."
   (lambda (store)
-    (guard (c ((nix-protocol-error? c)
+    (guard (c ((store-protocol-error? c)
                (values #f store)))
       (if (locally-built? store item)
           (values (query-path-hash store item) store)
diff --git a/guix/scripts/graph.scm b/guix/scripts/graph.scm
index 145a574dba..8efeef3274 100644
--- a/guix/scripts/graph.scm
+++ b/guix/scripts/graph.scm
@@ -299,7 +299,7 @@ this type of graph")))))))
 information available in the local store or using information about
 substitutes."
   (lambda (store)
-    (guard (c ((nix-protocol-error? c)
+    (guard (c ((store-protocol-error? c)
                (match (substitutable-path-info store (list item))
                  ((info)
                   (values (substitutable-references info) store))
diff --git a/guix/scripts/lint.scm b/guix/scripts/lint.scm
index 665adcfb8d..ddad5b7fd0 100644
--- a/guix/scripts/lint.scm
+++ b/guix/scripts/lint.scm
@@ -833,11 +833,11 @@ descriptions maintained upstream."
   (define (try system)
     (catch #t
       (lambda ()
-        (guard (c ((nix-protocol-error? c)
+        (guard (c ((store-protocol-error? c)
                    (emit-warning package
                                  (format #f (G_ "failed to create ~a derivation: ~a")
                                          system
-                                         (nix-protocol-error-message c))))
+                                         (store-protocol-error-message c))))
                   ((message-condition? c)
                    (emit-warning package
                                  (format #f (G_ "failed to create ~a derivation: ~a")
diff --git a/guix/scripts/offload.scm b/guix/scripts/offload.scm
index 30fe69ad6d..eb02672dbf 100644
--- a/guix/scripts/offload.scm
+++ b/guix/scripts/offload.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -358,12 +358,12 @@ MACHINE."
   (format (current-error-port) "@ build-remote ~a ~a~%"
           (derivation-file-name drv) (build-machine-name machine))
 
-  (guard (c ((nix-protocol-error? c)
+  (guard (c ((store-protocol-error? c)
              (format (current-error-port)
                      (G_ "derivation '~a' offloaded to '~a' failed: ~a~%")
                      (derivation-file-name drv)
                      (build-machine-name machine)
-                     (nix-protocol-error-message c))
+                     (store-protocol-error-message c))
              (let* ((inferior (false-if-exception (remote-inferior session)))
                     (space (false-if-exception
                             (node-free-disk-space inferior))))
@@ -712,18 +712,31 @@ machine."
                    (warning (G_ "failed to run 'guix repl' on machine '~a'~%")
                             (build-machine-name machine)))
                   ((? inferior? inferior)
-                   (let ((uts  (inferior-eval '(uname) inferior))
-                         (load (node-load inferior))
-                         (free (node-free-disk-space inferior)))
-                     (close-inferior inferior)
-                     (format #t "~a~%  kernel: ~a ~a~%  architecture: ~a~%\
-  host name: ~a~%  normalized load: ~a~%  free disk space: ~,2f MiB~%"
-                             (build-machine-name machine)
-                             (utsname:sysname uts) (utsname:release uts)
-                             (utsname:machine uts)
-                             (utsname:nodename uts)
-                             (normalized-load machine load)
-                             (/ free (expt 2 20) 1.)))))
+                   (let ((now (car (gettimeofday))))
+                     (match (inferior-eval '(list (uname)
+                                                  (car (gettimeofday)))
+                                           inferior)
+                       ((uts time)
+                        (when (< time now)
+                          ;; Build machine clocks must not be behind as this
+                          ;; could cause timestamp issues.
+                          (warning (G_ "machine '~a' is ~a seconds behind~%")
+                                   (build-machine-name machine)
+                                   (- now time)))
+
+                        (let ((load (node-load inferior))
+                              (free (node-free-disk-space inferior)))
+                          (close-inferior inferior)
+                          (format #t "~a~%  kernel: ~a ~a~%  architecture: ~a~%\
+  host name: ~a~%  normalized load: ~a~%  free disk space: ~,2f MiB~%\
+  time difference: ~a s~%"
+                                  (build-machine-name machine)
+                                  (utsname:sysname uts) (utsname:release uts)
+                                  (utsname:machine uts)
+                                  (utsname:nodename uts)
+                                  (normalized-load machine load)
+                                  (/ free (expt 2 20) 1.)
+                                  (- time now))))))))
 
                 (disconnect! session))
               machines)))
diff --git a/guix/scripts/pull.scm b/guix/scripts/pull.scm
index d3a4401a01..41c7fb289a 100644
--- a/guix/scripts/pull.scm
+++ b/guix/scripts/pull.scm
@@ -46,6 +46,7 @@
   #:use-module ((gnu packages certs) #:select (le-certs))
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-26)
+  #:use-module (srfi srfi-34)
   #:use-module (srfi srfi-35)
   #:use-module (srfi srfi-37)
   #:use-module (ice-9 match)
diff --git a/guix/self.scm b/guix/self.scm
index fa78015a41..d1b8256802 100644
--- a/guix/self.scm
+++ b/guix/self.scm
@@ -36,8 +36,7 @@
   #:export (make-config.scm
             whole-package                     ;for internal use in 'guix pull'
             compiled-guix
-            guix-derivation
-            reload-guix))
+            guix-derivation))
 
 
 ;;;
@@ -613,10 +612,6 @@ Info manual."
                  (append (file-imports source "gnu/system/examples"
                                        (const #t))
 
-                         ;; Need so we get access system tests from an
-                         ;; inferior.
-                         (file-imports source "gnu/tests" (const #t))
-
                          ;; All the installer code is on the build-side.
                          (file-imports source "gnu/installer/"
                                        (const #t))
@@ -636,6 +631,17 @@ Info manual."
                  #:extensions dependencies
                  #:guile-for-build guile-for-build))
 
+  (define *system-test-modules*
+    ;; Ship these modules mostly so (gnu ci) can discover them.
+    (scheme-node "guix-system-tests"
+                 `((gnu tests)
+                   ,@(scheme-modules* source "gnu/tests"))
+                 (list *core-package-modules* *package-modules*
+                       *extra-modules* *system-modules* *core-modules*
+                       *cli-modules*)           ;for (guix scripts pack), etc.
+                 #:extensions dependencies
+                 #:guile-for-build guile-for-build))
+
   (define *config*
     (scheme-node "guix-config"
                  '()
@@ -664,6 +670,7 @@ Info manual."
                                  ;; comes with *CORE-MODULES*.
                                  (list *config*
                                        *cli-modules*
+                                       *system-test-modules*
                                        *system-modules*
                                        *package-modules*
                                        *core-package-modules*
diff --git a/guix/serialization.scm b/guix/serialization.scm
index 7c0fea552d..e14b7d1b9f 100644
--- a/guix/serialization.scm
+++ b/guix/serialization.scm
@@ -59,7 +59,7 @@
 
 ;; Similar to serialize.cc in Nix.
 
-(define-condition-type &nar-error &error      ; XXX: inherit from &nix-error ?
+(define-condition-type &nar-error &error      ; XXX: inherit from &store-error ?
   nar-error?
   (file  nar-error-file)                       ; file we were restoring, or #f
   (port  nar-error-port))                      ; port from which we read
diff --git a/guix/ssh.scm b/guix/ssh.scm
index d90cb77be0..2b286a67b2 100644
--- a/guix/ssh.scm
+++ b/guix/ssh.scm
@@ -180,7 +180,7 @@ right away."
                                    (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."
+an SSH session.  Return a <store-connection> object."
   (open-connection #:port (remote-daemon-channel session socket-name)))
 
 
@@ -288,7 +288,7 @@ 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)))
+         (session (channel-get-session (store-connection-socket remote)))
          (missing (inferior-remote-eval
                    `(begin
                       (use-modules (guix)
@@ -328,24 +328,24 @@ Return the list of store items actually sent."
          missing)
         (('protocol-error message)
          (raise (condition
-                 (&nix-protocol-error (message message) (status 42)))))
+                 (&store-protocol-error (message message) (status 42)))))
         (('error key args ...)
          (raise (condition
-                 (&nix-protocol-error
+                 (&store-protocol-error
                   (message (call-with-output-string
                              (lambda (port)
                                (print-exception port #f key args))))
                   (status 43)))))
         (_
          (raise (condition
-                 (&nix-protocol-error
+                 (&store-protocol-error
                   (message "unknown error while sending files over SSH")
                   (status 44)))))))))
 
 (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)))
+  (channel-get-session (store-connection-socket remote)))
 
 (define (remote-store-host remote)
   "Return the name of the host REMOTE is connected to, where REMOTE is a
diff --git a/guix/store.scm b/guix/store.scm
index 1f88eb2b33..d079147529 100644
--- a/guix/store.scm
+++ b/guix/store.scm
@@ -20,6 +20,7 @@
 (define-module (guix store)
   #:use-module (guix utils)
   #:use-module (guix config)
+  #:use-module (guix deprecation)
   #:use-module (guix memoization)
   #:use-module (guix serialization)
   #:use-module (guix monads)
@@ -51,14 +52,31 @@
             %gc-roots-directory
             %default-substitute-urls
 
+            store-connection?
+            store-connection-version
+            store-connection-major-version
+            store-connection-minor-version
+            store-connection-socket
+
+            ;; Deprecated forms for 'store-connection'.
             nix-server?
             nix-server-version
             nix-server-major-version
             nix-server-minor-version
             nix-server-socket
+
             current-store-protocol-version        ;for internal use
             mcached
 
+            &store-error store-error?
+            &store-connection-error store-connection-error?
+            store-connection-error-file
+            store-connection-error-code
+            &store-protocol-error store-protocol-error?
+            store-protocol-error-message
+            store-protocol-error-status
+
+            ;; Deprecated forms for '&store-error' et al.
             &nix-error nix-error?
             &nix-connection-error nix-connection-error?
             nix-connection-error-file
@@ -335,59 +353,83 @@
 
 ;; remote-store.cc
 
-(define-record-type* <nix-server> nix-server %make-nix-server
-  nix-server?
-  (socket nix-server-socket)
-  (major  nix-server-major-version)
-  (minor  nix-server-minor-version)
+(define-record-type* <store-connection> store-connection %make-store-connection
+  store-connection?
+  (socket store-connection-socket)
+  (major  store-connection-major-version)
+  (minor  store-connection-minor-version)
 
-  (buffer nix-server-output-port)                 ;output port
-  (flush  nix-server-flush-output)                ;thunk
+  (buffer store-connection-output-port)                 ;output port
+  (flush  store-connection-flush-output)                ;thunk
 
   ;; Caches.  We keep them per-connection, because store paths build
   ;; during the session are temporary GC roots kept for the duration of
   ;; the session.
-  (ats-cache  nix-server-add-to-store-cache)
-  (atts-cache nix-server-add-text-to-store-cache)
-  (object-cache nix-server-object-cache
+  (ats-cache    store-connection-add-to-store-cache)
+  (atts-cache   store-connection-add-text-to-store-cache)
+  (object-cache store-connection-object-cache
                 (default vlist-null)))            ;vhash
 
-(set-record-type-printer! <nix-server>
+(set-record-type-printer! <store-connection>
                           (lambda (obj port)
-                            (format port "#<build-daemon ~a.~a ~a>"
-                                    (nix-server-major-version obj)
-                                    (nix-server-minor-version obj)
+                            (format port "#<store-connection ~a.~a ~a>"
+                                    (store-connection-major-version obj)
+                                    (store-connection-minor-version obj)
                                     (number->string (object-address obj)
                                                     16))))
 
-(define-condition-type &nix-error &error
-  nix-error?)
+(define-deprecated/alias nix-server? store-connection?)
+(define-deprecated/alias nix-server-major-version
+  store-connection-major-version)
+(define-deprecated/alias nix-server-minor-version
+  store-connection-minor-version)
+(define-deprecated/alias nix-server-socket store-connection-socket)
+
+
+(define-condition-type &store-error &error
+  store-error?)
+
+(define-condition-type &store-connection-error &store-error
+  store-connection-error?
+  (file   store-connection-error-file)
+  (errno  store-connection-error-code))
+
+(define-condition-type &store-protocol-error &store-error
+  store-protocol-error?
+  (message store-protocol-error-message)
+  (status  store-protocol-error-status))
+
+(define-deprecated/alias &nix-error &store-error)
+(define-deprecated/alias nix-error? store-error?)
+(define-deprecated/alias &nix-connection-error &store-connection-error)
+(define-deprecated/alias nix-connection-error? store-connection-error?)
+(define-deprecated/alias nix-connection-error-file
+  store-connection-error-file)
+(define-deprecated/alias nix-connection-error-code
+  store-connection-error-code)
+(define-deprecated/alias &nix-protocol-error &store-protocol-error)
+(define-deprecated/alias nix-protocol-error? store-protocol-error?)
+(define-deprecated/alias nix-protocol-error-message
+  store-protocol-error-message)
+(define-deprecated/alias nix-protocol-error-status
+  store-protocol-error-status)
 
-(define-condition-type &nix-connection-error &nix-error
-  nix-connection-error?
-  (file   nix-connection-error-file)
-  (errno  nix-connection-error-code))
-
-(define-condition-type &nix-protocol-error &nix-error
-  nix-protocol-error?
-  (message nix-protocol-error-message)
-  (status  nix-protocol-error-status))
 
 (define-syntax-rule (system-error-to-connection-error file exp ...)
   "Catch 'system-error' exceptions and translate them to
-'&nix-connection-error'."
+'&store-connection-error'."
   (catch 'system-error
     (lambda ()
       exp ...)
     (lambda args
       (let ((errno (system-error-errno args)))
-        (raise (condition (&nix-connection-error
+        (raise (condition (&store-connection-error
                            (file file)
                            (errno errno))))))))
 
 (define (open-unix-domain-socket file)
   "Connect to the Unix-domain socket at FILE and return it.  Raise a
-'&nix-connection-error' upon error."
+'&store-connection-error' upon error."
   (let ((s (with-fluids ((%default-port-encoding #f))
              ;; This trick allows use of the `scm_c_read' optimization.
              (socket PF_UNIX SOCK_STREAM 0)))
@@ -403,7 +445,7 @@
 
 (define (open-inet-socket host port)
   "Connect to the Unix-domain socket at HOST:PORT and return it.  Raise a
-'&nix-connection-error' upon error."
+'&store-connection-error' upon error."
   (let ((sock (with-fluids ((%default-port-encoding #f))
                 ;; This trick allows use of the `scm_c_read' optimization.
                 (socket PF_UNIX SOCK_STREAM 0))))
@@ -435,7 +477,7 @@
                ;; Connection failed, so try one of the other addresses.
                (close s)
                (if (null? rest)
-                   (raise (condition (&nix-connection-error
+                   (raise (condition (&store-connection-error
                                       (file host)
                                       (errno (system-error-errno args)))))
                    (loop rest))))))))))
@@ -444,7 +486,7 @@
   "Connect to the daemon at URI, a string that may be an actual URI or a file
 name."
   (define (not-supported)
-    (raise (condition (&nix-connection-error
+    (raise (condition (&store-connection-error
                        (file uri)
                        (errno ENOTSUP)))))
 
@@ -493,8 +535,8 @@ for this connection will be pinned.  Return a server object."
              ;; One of the 'write-' or 'read-' calls below failed, but this is
              ;; really a connection error.
              (raise (condition
-                     (&nix-connection-error (file (or port uri))
-                                            (errno EPROTO))
+                     (&store-connection-error (file (or port uri))
+                                              (errno EPROTO))
                      (&message (message "build daemon handshake failed"))))))
     (let*-values (((port)
                    (or port (connect-to-daemon uri)))
@@ -515,13 +557,13 @@ for this connection will be pinned.  Return a server object."
                           (write-int cpu-affinity port)))
                       (when (>= (protocol-minor v) 11)
                         (write-int (if reserve-space? 1 0) port))
-                      (let ((conn (%make-nix-server port
-                                                    (protocol-major v)
-                                                    (protocol-minor v)
-                                                    output flush
-                                                    (make-hash-table 100)
-                                                    (make-hash-table 100)
-                                                    vlist-null)))
+                      (let ((conn (%make-store-connection port
+                                                          (protocol-major v)
+                                                          (protocol-minor v)
+                                                          output flush
+                                                          (make-hash-table 100)
+                                                          (make-hash-table 100)
+                                                          vlist-null)))
                         (let loop ((done? (process-stderr conn)))
                           (or done? (process-stderr conn)))
                         conn)))))))))
@@ -536,27 +578,29 @@ already taken place on PORT and that we're just continuing on this established
 connection.  Use with care."
   (let-values (((output flush)
                 (buffering-output-port port (make-bytevector 8192))))
-    (%make-nix-server port
-                      (protocol-major version)
-                      (protocol-minor version)
-                      output flush
-                      (make-hash-table 100)
-                      (make-hash-table 100)
-                      vlist-null)))
-
-(define (nix-server-version store)
+    (%make-store-connection port
+                            (protocol-major version)
+                            (protocol-minor version)
+                            output flush
+                            (make-hash-table 100)
+                            (make-hash-table 100)
+                            vlist-null)))
+
+(define (store-connection-version store)
   "Return the protocol version of STORE as an integer."
-  (protocol-version (nix-server-major-version store)
-                    (nix-server-minor-version store)))
+  (protocol-version (store-connection-major-version store)
+                    (store-connection-minor-version store)))
+
+(define-deprecated/alias nix-server-version store-connection-version)
 
 (define (write-buffered-output server)
   "Flush SERVER's output port."
-  (force-output (nix-server-output-port server))
-  ((nix-server-flush-output server)))
+  (force-output (store-connection-output-port server))
+  ((store-connection-flush-output server)))
 
 (define (close-connection server)
   "Close the connection to SERVER."
-  (close (nix-server-socket server)))
+  (close (store-connection-socket server)))
 
 (define-syntax-rule (with-store store exp ...)
   "Bind STORE to an open connection to the store and evaluate EXPs;
@@ -566,7 +610,7 @@ automatically close the store when the dynamic extent of EXP is left."
       (const #f)
       (lambda ()
         (parameterize ((current-store-protocol-version
-                        (nix-server-version store)))
+                        (store-connection-version store)))
          exp) ...)
       (lambda ()
         (false-if-exception (close-connection store))))))
@@ -622,7 +666,7 @@ Since the build process's output cannot be assumed to be UTF-8, we
 conservatively consider it to be Latin-1, thereby avoiding possible
 encoding conversion errors."
   (define p
-    (nix-server-socket server))
+    (store-connection-socket server))
 
   ;; magic cookies from worker-protocol.hh
   (define %stderr-next  #x6f6c6d67)          ; "olmg", build log
@@ -666,18 +710,18 @@ encoding conversion errors."
            (let ((error  (read-maybe-utf8-string p))
                  ;; Currently the daemon fails to send a status code for early
                  ;; errors like DB schema version mismatches, so check for EOF.
-                 (status (if (and (>= (nix-server-minor-version server) 8)
+                 (status (if (and (>= (store-connection-minor-version server) 8)
                                   (not (eof-object? (lookahead-u8 p))))
                              (read-int p)
                              1)))
-             (raise (condition (&nix-protocol-error
+             (raise (condition (&store-protocol-error
                                 (message error)
                                 (status  status))))))
           ((= k %stderr-last)
            ;; The daemon is done (see `stopWork' in `nix-worker.cc'.)
            #t)
           (else
-           (raise (condition (&nix-protocol-error
+           (raise (condition (&store-protocol-error
                               (message "invalid error code")
                               (status   k))))))))
 
@@ -734,7 +778,7 @@ encoding conversion errors."
   ;; Must be called after `open-connection'.
 
   (define socket
-    (nix-server-socket server))
+    (store-connection-socket server))
 
   (let-syntax ((send (syntax-rules ()
                        ((_ (type option) ...)
@@ -744,22 +788,22 @@ encoding conversion errors."
     (write-int (operation-id set-options) socket)
     (send (boolean keep-failed?) (boolean keep-going?)
           (boolean fallback?) (integer verbosity))
-    (when (< (nix-server-minor-version server) #x61)
+    (when (< (store-connection-minor-version server) #x61)
       (let ((max-build-jobs (or max-build-jobs 1))
             (max-silent-time (or max-silent-time 3600)))
         (send (integer max-build-jobs) (integer max-silent-time))))
-    (when (>= (nix-server-minor-version server) 2)
+    (when (>= (store-connection-minor-version server) 2)
       (send (boolean use-build-hook?)))
-    (when (>= (nix-server-minor-version server) 4)
+    (when (>= (store-connection-minor-version server) 4)
       (send (integer build-verbosity) (integer log-type)
             (boolean print-build-trace)))
-    (when (and (>= (nix-server-minor-version server) 6)
-               (< (nix-server-minor-version server) #x61))
+    (when (and (>= (store-connection-minor-version server) 6)
+               (< (store-connection-minor-version server) #x61))
       (let ((build-cores (or build-cores (current-processor-count))))
         (send (integer build-cores))))
-    (when (>= (nix-server-minor-version server) 10)
+    (when (>= (store-connection-minor-version server) 10)
       (send (boolean use-substitutes?)))
-    (when (>= (nix-server-minor-version server) 12)
+    (when (>= (store-connection-minor-version server) 12)
       (let ((pairs `(;; This option is honored by 'guix substitute' et al.
                      ,@(if print-build-trace
                            `(("print-extended-build-trace"
@@ -884,8 +928,8 @@ bytevector) as its internal buffer, and a thunk to flush this output port."
     ((_ (name (type arg) ...) docstring return ...)
      (lambda (server arg ...)
        docstring
-       (let* ((s (nix-server-socket server))
-              (buffered (nix-server-output-port server)))
+       (let* ((s (store-connection-socket server))
+              (buffered (store-connection-output-port server)))
          (record-operation 'name)
          (write-int (operation-id name) buffered)
          (write-arg type arg buffered)
@@ -907,7 +951,7 @@ bytevector) as its internal buffer, and a thunk to flush this output port."
 invalid item may exist on disk but still be invalid, for instance because it
 is the result of an aborted or failed build.)
 
-A '&nix-protocol-error' condition is raised if PATH is not prefixed by the
+A '&store-protocol-error' condition is raised if PATH is not prefixed by the
 store directory (/gnu/store)."
   boolean)
 
@@ -944,7 +988,7 @@ string).  Raise an error if no such path exists."
 REFERENCES is the list of store paths referred to by the resulting store
 path."
       (let* ((args  `(,bytes ,name ,references))
-             (cache (nix-server-add-text-to-store-cache server)))
+             (cache (store-connection-add-text-to-store-cache server)))
         (or (hash-ref cache args)
             (let ((path (add-text-to-store server name bytes references)))
               (hash-set! cache args path)
@@ -973,7 +1017,7 @@ path."
            ;; We don't use the 'operation' macro so we can pass SELECT? to
            ;; 'write-file'.
            (record-operation 'add-to-store)
-           (let ((port (nix-server-socket server)))
+           (let ((port (store-connection-socket server)))
              (write-int (operation-id add-to-store) port)
              (write-string basename port)
              (write-int 1 port)                   ;obsolete, must be #t
@@ -999,7 +1043,7 @@ where FILE is the entry's absolute file name and STAT is the result of
       ;; Note: We don't stat FILE-NAME at each call, and thus we assume that
       ;; the file remains unchanged for the lifetime of SERVER.
       (let* ((args  `(,file-name ,basename ,recursive? ,hash-algo ,select?))
-             (cache (nix-server-add-to-store-cache server)))
+             (cache (store-connection-add-to-store-cache server)))
         (or (hash-ref cache args)
             (let ((path (add-to-store server basename recursive?
                                       hash-algo file-name
@@ -1078,14 +1122,14 @@ an arbitrary directory layout in the store without creating a derivation."
       ((_ 'directory (names . _) ...) names)))
 
   (define cache
-    (nix-server-add-to-store-cache server))
+    (store-connection-add-to-store-cache server))
 
   (or (hash-ref cache tree)
       (begin
         ;; We don't use the 'operation' macro so we can use 'write-file-tree'
         ;; instead of 'write-file'.
         (record-operation 'add-to-store/tree)
-        (let ((port (nix-server-socket server)))
+        (let ((port (store-connection-socket server)))
           (write-int (operation-id add-to-store) port)
           (write-string basename port)
           (write-int 1 port)                      ;obsolete, must be #t
@@ -1117,12 +1161,12 @@ outputs, and return when the worker is done building them.  Elements of THINGS
 that are not derivations can only be substituted and not built locally.
 Return #t on success."
       (parameterize ((current-store-protocol-version
-                      (nix-server-version store)))
-        (if (>= (nix-server-minor-version store) 15)
+                      (store-connection-version store)))
+        (if (>= (store-connection-minor-version store) 15)
             (build store things mode)
             (if (= mode (build-mode normal))
                 (build/old store things)
-                (raise (condition (&nix-protocol-error
+                (raise (condition (&store-protocol-error
                                    (message "unsupported build mode")
                                    (status  1))))))))))
 
@@ -1182,12 +1226,12 @@ error if there is no such root."
 (define (references/substitutes store items)
   "Return the list of list of references of ITEMS; the result has the same
 length as ITEMS.  Query substitute information for any item missing from the
-store at once.  Raise a '&nix-protocol-error' exception if reference
+store at once.  Raise a '&store-protocol-error' exception if reference
 information for one of ITEMS is missing."
   (let* ((requested  items)
          (local-refs (map (lambda (item)
                             (or (hash-ref %reference-cache item)
-                                (guard (c ((nix-protocol-error? c) #f))
+                                (guard (c ((store-protocol-error? c) #f))
                                   (references store item))))
                           items))
          (missing    (fold-right (lambda (item local-ref result)
@@ -1203,7 +1247,7 @@ information for one of ITEMS is missing."
                          '()
                          (substitutable-path-info store missing))))
     (when (< (length substs) (length missing))
-      (raise (condition (&nix-protocol-error
+      (raise (condition (&store-protocol-error
                          (message "cannot determine \
 the list of references")
                          (status 1)))))
@@ -1334,9 +1378,9 @@ supported by STORE."
       ;; derivation builders in general, which appeared in Guix > 0.11.0.
       ;; Return the empty list if it doesn't.  Note that this RPC does not
       ;; exist in 'nix-daemon'.
-      (if (or (> (nix-server-major-version store) #x100)
-              (and (= (nix-server-major-version store) #x100)
-                   (>= (nix-server-minor-version store) #x60)))
+      (if (or (> (store-connection-major-version store) #x100)
+              (and (= (store-connection-major-version store) #x100)
+                   (>= (store-connection-minor-version store) #x60)))
           (builders store)
           '()))))
 
@@ -1366,14 +1410,14 @@ the list of store paths to delete.  IGNORE-LIVENESS? should always be
 #f.  MIN-FREED is the minimum amount of disk space to be freed, in
 bytes, before the GC can stop.  Return the list of store paths delete,
 and the number of bytes freed."
-  (let ((s (nix-server-socket server)))
+  (let ((s (store-connection-socket server)))
     (write-int (operation-id collect-garbage) s)
     (write-int action s)
     (write-store-path-list to-delete s)
     (write-arg boolean #f s)                      ; ignore-liveness?
     (write-long-long min-freed s)
     (write-int 0 s)                               ; obsolete
-    (when (>= (nix-server-minor-version server) 5)
+    (when (>= (store-connection-minor-version server) 5)
       ;; Obsolete `use-atime' and `max-atime' parameters.
       (write-int 0 s)
       (write-int 0 s))
@@ -1389,8 +1433,8 @@ and the number of bytes freed."
         ;; To be on the safe side, completely invalidate both caches.
         ;; Otherwise we could end up returning store paths that are no longer
         ;; valid.
-        (hash-clear! (nix-server-add-to-store-cache server))
-        (hash-clear! (nix-server-add-text-to-store-cache server)))
+        (hash-clear! (store-connection-add-to-store-cache server))
+        (hash-clear! (store-connection-add-text-to-store-cache server)))
 
      (values paths freed))))
 
@@ -1425,7 +1469,7 @@ collected, and the number of bytes freed."
   "Import the set of store paths read from PORT into SERVER's store.  An error
 is raised if the set of paths read from PORT is not signed (as per
 'export-path #:sign? #t'.)  Return the list of store paths imported."
-  (let ((s (nix-server-socket server)))
+  (let ((s (store-connection-socket server)))
     (write-int (operation-id import-paths) s)
     (let loop ((done? (process-stderr server port)))
       (or done? (loop (process-stderr server port))))
@@ -1433,7 +1477,7 @@ is raised if the set of paths read from PORT is not signed (as per
 
 (define* (export-path server path port #:key (sign? #t))
   "Export PATH to PORT.  When SIGN? is true, sign it."
-  (let ((s (nix-server-socket server)))
+  (let ((s (store-connection-socket server)))
     (write-int (operation-id export-path) s)
     (write-store-path path s)
     (write-arg boolean sign? s)
@@ -1502,10 +1546,10 @@ OBJECT is typically a high-level object such as a <package> or an <origin>,
 and RESULT is typically its derivation."
   (lambda (store)
     (values result
-            (nix-server
+            (store-connection
              (inherit store)
              (object-cache (vhash-consq object (cons result keys)
-                                        (nix-server-object-cache store)))))))
+                                        (store-connection-object-cache store)))))))
 
 (define record-cache-lookup!
   (if (profiled? "object-cache")
@@ -1540,7 +1584,7 @@ and KEYS.  KEYS is a list of additional keys to match against, and which are
 compared with 'equal?'.  Return #f on failure and the cached result
 otherwise."
   (lambda (store)
-    (let* ((cache (nix-server-object-cache store))
+    (let* ((cache (store-connection-object-cache store))
 
            ;; Escape as soon as we find the result.  This avoids traversing
            ;; the whole vlist chain and significantly reduces the number of
@@ -1654,7 +1698,7 @@ where FILE is the entry's absolute file name and STAT is the result of
   "Monadic version of 'query-path-info' that returns #f when ITEM is not in
 the store."
   (lambda (store)
-    (guard (c ((nix-protocol-error? c)
+    (guard (c ((store-protocol-error? c)
                ;; ITEM is not in the store; return #f.
                (values #f store)))
       (values (query-path-info store item) store))))
diff --git a/guix/tests.scm b/guix/tests.scm
index f4948148c4..16a426c4f9 100644
--- a/guix/tests.scm
+++ b/guix/tests.scm
@@ -64,7 +64,7 @@
 
 (define* (open-connection-for-tests #:optional (uri (%daemon-socket-uri)))
   "Open a connection to the build daemon for tests purposes and return it."
-  (guard (c ((nix-error? c)
+  (guard (c ((store-error? c)
              (format (current-error-port)
                      "warning: build daemon error: ~s~%" c)
              #f))
diff --git a/guix/ui.scm b/guix/ui.scm
index 1e089753e1..9ff56ea85c 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -684,14 +684,14 @@ or remove one of them from the profile.")
                           file (or (port-filename* port) port))
                    (leave (G_ "corrupt input while restoring archive from ~s~%")
                           (or (port-filename* port) port)))))
-            ((nix-connection-error? c)
+            ((store-connection-error? c)
              (leave (G_ "failed to connect to `~a': ~a~%")
-                    (nix-connection-error-file c)
-                    (strerror (nix-connection-error-code c))))
-            ((nix-protocol-error? c)
+                    (store-connection-error-file c)
+                    (strerror (store-connection-error-code c))))
+            ((store-protocol-error? c)
              ;; FIXME: Server-provided error messages aren't i18n'd.
              (leave (G_ "build failed: ~a~%")
-                    (nix-protocol-error-message c)))
+                    (store-protocol-error-message c)))
             ((derivation-missing-output-error? c)
              (leave (G_ "reference to invalid output '~a' of derivation '~a'~%")
                     (derivation-missing-output c)
diff --git a/tests/derivations.scm b/tests/derivations.scm
index 5f294c1827..c0601c0e88 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, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -185,9 +185,9 @@
       (set-build-options %store
                          #:use-substitutes? #f
                          #:keep-going? #t)
-      (guard (c ((nix-protocol-error? c)
-                 (and (= 100 (nix-protocol-error-status c))
-                      (string-contains (nix-protocol-error-message c)
+      (guard (c ((store-protocol-error? c)
+                 (and (= 100 (store-protocol-error-status c))
+                      (string-contains (store-protocol-error-message c)
                                        (derivation-file-name d1))
                       (not (valid-path? %store (derivation->output-path d1)))
                       (valid-path? %store (derivation->output-path d2)))))
@@ -222,8 +222,8 @@
 
 (test-assert "unknown built-in builder"
   (let ((drv (derivation %store "ohoh" "builtin:does-not-exist" '())))
-    (guard (c ((nix-protocol-error? c)
-               (string-contains (nix-protocol-error-message c) "failed")))
+    (guard (c ((store-protocol-error? c)
+               (string-contains (store-protocol-error-message c) "failed")))
       (build-derivations %store (list drv))
       #f)))
 
@@ -253,8 +253,8 @@
                                           . ,(object->string (%local-url))))
                             #:hash-algo 'sha256
                             #:hash (sha256 (random-bytevector 100))))) ;wrong
-      (guard (c ((nix-protocol-error? c)
-                 (string-contains (nix-protocol-error-message c) "failed")))
+      (guard (c ((store-protocol-error? c)
+                 (string-contains (store-protocol-error-message c) "failed")))
         (build-derivations %store (list drv))
         #f))))
 
@@ -268,8 +268,8 @@
                                           . ,(object->string (%local-url))))
                             #:hash-algo 'sha256
                             #:hash (sha256 (random-bytevector 100)))))
-      (guard (c ((nix-protocol-error? c)
-                 (string-contains (nix-protocol-error-message (pk c)) "failed")))
+      (guard (c ((store-protocol-error? c)
+                 (string-contains (store-protocol-error-message (pk c)) "failed")))
         (build-derivations %store (list drv))
         #f))))
 
@@ -279,8 +279,8 @@
          (drv    (derivation %store "world"
                              "builtin:download" '()
                              #:env-vars `(("url" . ,(object->string url))))))
-    (guard (c ((nix-protocol-error? c)
-               (string-contains (nix-protocol-error-message c) "failed")))
+    (guard (c ((store-protocol-error? c)
+               (string-contains (store-protocol-error-message c) "failed")))
       (build-derivations %store (list drv))
       #f)))
 
@@ -607,7 +607,7 @@
                           `("-c" ,(string-append "echo " txt "> $out"))
                           #:inputs `((,%bash) (,txt))
                           #:allowed-references '())))
-    (guard (c ((nix-protocol-error? c)
+    (guard (c ((store-protocol-error? c)
                ;; There's no specific error message to check for.
                #t))
       (build-derivations %store (list drv))
@@ -625,7 +625,7 @@
                          `("-c" ,"echo $out > $out")
                          #:inputs `((,%bash))
                          #:allowed-references '())))
-    (guard (c ((nix-protocol-error? c)
+    (guard (c ((store-protocol-error? c)
                ;; There's no specific error message to check for.
                #t))
       (build-derivations %store (list drv))
@@ -644,7 +644,7 @@
                           `("-c" ,(string-append "echo " txt "> $out"))
                           #:inputs `((,%bash) (,txt))
                           #:disallowed-references (list txt))))
-    (guard (c ((nix-protocol-error? c)
+    (guard (c ((store-protocol-error? c)
                ;; There's no specific error message to check for.
                #t))
       (build-derivations %store (list drv))
@@ -765,8 +765,8 @@
          (builder    '(begin (sleep 100) (mkdir %output) #t))
          (drv        (build-expression->derivation store "silent" builder))
          (out-path   (derivation->output-path drv)))
-    (guard (c ((nix-protocol-error? c)
-               (and (string-contains (nix-protocol-error-message c)
+    (guard (c ((store-protocol-error? c)
+               (and (string-contains (store-protocol-error-message c)
                                      "failed")
                     (not (valid-path? store out-path)))))
       (build-derivations store (list drv))
@@ -779,8 +779,8 @@
          (builder    '(begin (sleep 100) (mkdir %output) #t))
          (drv        (build-expression->derivation store "slow" builder))
          (out-path   (derivation->output-path drv)))
-    (guard (c ((nix-protocol-error? c)
-               (and (string-contains (nix-protocol-error-message c)
+    (guard (c ((store-protocol-error? c)
+               (and (string-contains (store-protocol-error-message c)
                                      "failed")
                     (not (valid-path? store out-path)))))
       (build-derivations store (list drv))
@@ -942,11 +942,11 @@
                       #f))                        ; fail!
          (drv      (build-expression->derivation %store "fail" builder))
          (out-path (derivation->output-path drv)))
-    (guard (c ((nix-protocol-error? c)
+    (guard (c ((store-protocol-error? c)
                ;; Note that the output path may exist at this point, but it
                ;; is invalid.
                (and (string-match "build .* failed"
-                                  (nix-protocol-error-message c))
+                                  (store-protocol-error-message c))
                     (not (valid-path? %store out-path)))))
       (build-derivations %store (list drv))
       #f)))
diff --git a/tests/gexp.scm b/tests/gexp.scm
index c4b437cd49..cee2c96610 100644
--- a/tests/gexp.scm
+++ b/tests/gexp.scm
@@ -919,7 +919,7 @@
                                      (chdir #$output)
                                      (symlink #$%bootstrap-guile "guile"))
                                  #:allowed-references '()))))
-    (guard (c ((nix-protocol-error? c) #t))
+    (guard (c ((store-protocol-error? c) #t))
       (build-derivations %store (list drv))
       #f)))
 
@@ -943,7 +943,7 @@
                                      (chdir #$output)
                                      (symlink #$%bootstrap-guile "guile"))
                                  #:disallowed-references (list %bootstrap-guile)))))
-    (guard (c ((nix-protocol-error? c) #t))
+    (guard (c ((store-protocol-error? c) #t))
       (build-derivations %store (list drv))
       #f)))
 
diff --git a/tests/guix-daemon.sh b/tests/guix-daemon.sh
index 9ae6e0b77a..4c19a55722 100644
--- a/tests/guix-daemon.sh
+++ b/tests/guix-daemon.sh
@@ -1,5 +1,5 @@
 # GNU Guix --- Functional package management for GNU
-# Copyright © 2012, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
+# Copyright © 2012, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
 #
 # This file is part of GNU Guix.
 #
@@ -109,7 +109,7 @@ guile -c "
 
   (define (build-without-failing drv)
     (lambda (store)
-      (guard (c ((nix-protocol-error? c) (values #t store)))
+      (guard (c ((store-protocol-error? c) (values #t store)))
         (build-derivations store (list drv))
         (values #f store))))
 
@@ -177,9 +177,9 @@ client_code='
                                `("-e" ,build)
                                #:inputs `((,bash) (,build))
                                #:env-vars `(("x" . ,(random-text))))))
-      (exit (guard (c ((nix-protocol-error? c)
+      (exit (guard (c ((store-protocol-error? c)
                        (->bool
-                        (string-contains (pk (nix-protocol-error-message c))
+                        (string-contains (pk (store-protocol-error-message c))
                                          "failed"))))
               (build-derivations store (list drv))
               #f))))'
diff --git a/tests/guix-system.sh b/tests/guix-system.sh
index adb623d244..9903677a02 100644
--- a/tests/guix-system.sh
+++ b/tests/guix-system.sh
@@ -109,7 +109,7 @@ cat > "$tmpfile" <<EOF
   (timezone "Europe/Paris")                           ; 6
   (locale "en_US.UTF-8")                              ; 7
 
-  (bootloader (GRUB-config (device "/dev/sdX")))      ; 9
+  (bootloader (GRUB-config (target "/dev/sdX")))      ; 9
   (file-systems (cons (file-system
                         (device (file-system-label "root"))
                         (mount-point "/")
@@ -137,7 +137,7 @@ OS_BASE='
 
   (bootloader (bootloader-configuration
                (bootloader grub-bootloader)
-               (device "/dev/sdX")))
+               (target "/dev/sdX")))
   (file-systems (cons (file-system
                         (device (file-system-label "root"))
                         (mount-point "/")
@@ -209,7 +209,7 @@ make_user_config ()
 
   (bootloader (bootloader-configuration
                 (bootloader grub-bootloader)
-                (device "/dev/sdX")))
+                (target "/dev/sdX")))
   (file-systems (cons (file-system
                         (device (file-system-label "root"))
                         (mount-point "/")
diff --git a/tests/packages.scm b/tests/packages.scm
index ed635d9011..29e5e4103c 100644
--- a/tests/packages.scm
+++ b/tests/packages.scm
@@ -570,7 +570,7 @@
                    (symlink %output (string-append %output "/self"))
                    #t)))))
          (d (package-derivation %store p)))
-    (guard (c ((nix-protocol-error? c) #t))
+    (guard (c ((store-protocol-error? c) #t))
       (build-derivations %store (list d))
       #f)))
 
diff --git a/tests/records.scm b/tests/records.scm
index 09ada70c2d..d9469a78bd 100644
--- a/tests/records.scm
+++ b/tests/records.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2018 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -288,6 +288,30 @@
       (and (string-match "extra.*initializer.*baz" message)
            (eq? proc 'foo)))))
 
+(test-assert "define-record-type* & duplicate initializers"
+  (let ((exp '(begin
+                (define-record-type* <foo> foo make-foo
+                  foo?
+                  (bar foo-bar (default 42)))
+
+                (foo (bar 1)
+                     (bar 2))))
+        (loc         (current-source-location)))  ;keep this alignment!
+    (catch 'syntax-error
+      (lambda ()
+        (eval exp (test-module))
+        #f)
+      (lambda (key proc message location form . args)
+        (and (string-match "duplicate.*initializer" message)
+             (eq? proc 'foo)
+
+             ;; Make sure the location is that of the field specifier.
+             (lset= equal?
+                    (pk 'expected-loc
+                        `((line . ,(- (assq-ref loc 'line) 1))
+                          ,@(alist-delete 'line loc)))
+                    (pk 'actual-loc location)))))))
+
 (test-assert "ABI checks"
   (let ((module (test-module)))
     (eval '(begin
diff --git a/tests/store.scm b/tests/store.scm
index 5ff9308d7d..e28c0c5aaa 100644
--- a/tests/store.scm
+++ b/tests/store.scm
@@ -63,9 +63,9 @@
 (test-equal "connection handshake error"
   EPROTO
   (let ((port (%make-void-port "rw")))
-    (guard (c ((nix-connection-error? c)
-               (and (eq? port (nix-connection-error-file c))
-                    (nix-connection-error-code c))))
+    (guard (c ((store-connection-error? c)
+               (and (eq? port (store-connection-error-file c))
+                    (store-connection-error-code c))))
       (open-connection #f #:port port)
       'broken)))
 
@@ -120,7 +120,7 @@
 
 (test-assert "valid-path? error"
   (with-store s
-    (guard (c ((nix-protocol-error? c) #t))
+    (guard (c ((store-protocol-error? c) #t))
       (valid-path? s "foo")
       #f)))
 
@@ -133,7 +133,7 @@
   (with-store s
     (let-syntax ((true-if-error (syntax-rules ()
                                   ((_ exp)
-                                   (guard (c ((nix-protocol-error? c) #t))
+                                   (guard (c ((store-protocol-error? c) #t))
                                      exp #f)))))
       (and (true-if-error (valid-path? s "foo"))
            (true-if-error (valid-path? s "bar"))
@@ -274,7 +274,7 @@
 (test-assert "references/substitutes missing reference info"
   (with-store s
     (set-build-options s #:use-substitutes? #f)
-    (guard (c ((nix-protocol-error? c) #t))
+    (guard (c ((store-protocol-error? c) #t))
       (let* ((b  (add-to-store s "bash" #t "sha256"
                                (search-bootstrap-binary "bash"
                                                         (%current-system))))
@@ -422,7 +422,7 @@
                      %store "foo" `(display ,s)
                      #:guile-for-build
                      (package-derivation s %bootstrap-guile (%current-system)))))
-            (guard (c ((nix-protocol-error? c) #t))
+            (guard (c ((store-protocol-error? c) #t))
               (build-derivations %store (list d))))))))
    "Here’s a Greek letter: λ."))
 
@@ -442,7 +442,7 @@
                        (display "lambda: λ\n"))
                      #:guile-for-build
                      (package-derivation %store %bootstrap-guile))))
-            (guard (c ((nix-protocol-error? c) #t))
+            (guard (c ((store-protocol-error? c) #t))
               (build-derivations %store (list d))))))))
    "garbage: �lambda: λ"))
 
@@ -620,12 +620,12 @@
                            #:fallback? #f
                            #:substitute-urls (%test-substitute-urls))
         (and (has-substitutes? s o)
-             (guard (c ((nix-protocol-error? c)
+             (guard (c ((store-protocol-error? c)
                         ;; XXX: the daemon writes "hash mismatch in downloaded
                         ;; path", but the actual error returned to the client
                         ;; doesn't mention that.
                         (pk 'corrupt c)
-                        (not (zero? (nix-protocol-error-status c)))))
+                        (not (zero? (store-protocol-error-status c)))))
                (build-derivations s (list d))
                #f))))))
 
@@ -646,7 +646,7 @@
         (set-build-options s #:use-substitutes? #t
                            #:substitute-urls (%test-substitute-urls))
         (and (has-substitutes? s o)
-             (guard (c ((nix-protocol-error? c)
+             (guard (c ((store-protocol-error? c)
                         ;; The substituter failed as expected.  Now make
                         ;; sure that #:fallback? #t works correctly.
                         (set-build-options s
@@ -712,9 +712,9 @@
          (dump  (call-with-bytevector-output-port
                  (cute export-paths %store (list file2) <>))))
     (delete-paths %store (list file0 file1 file2))
-    (guard (c ((nix-protocol-error? c)
-               (and (not (zero? (nix-protocol-error-status c)))
-                    (string-contains (nix-protocol-error-message c)
+    (guard (c ((store-protocol-error? c)
+               (and (not (zero? (store-protocol-error-status c)))
+                    (string-contains (store-protocol-error-message c)
                                      "not valid"))))
       ;; Here we get an exception because DUMP does not include FILE0 and
       ;; FILE1, which are dependencies of FILE2.
@@ -816,10 +816,10 @@
       (bytevector-u8-set! dump index (logxor #xff byte)))
 
     (and (not (file-exists? file))
-         (guard (c ((nix-protocol-error? c)
+         (guard (c ((store-protocol-error? c)
                     (pk 'c c)
-                    (and (not (zero? (nix-protocol-error-status c)))
-                         (string-contains (nix-protocol-error-message c)
+                    (and (not (zero? (store-protocol-error-status c)))
+                         (string-contains (store-protocol-error-message c)
                                           "corrupt"))))
            (let* ((source   (open-bytevector-input-port dump))
                   (imported (import-paths %store source)))
@@ -906,10 +906,10 @@
               (begin
                 (write (random-text) entropy-port)
                 (force-output entropy-port)
-                (guard (c ((nix-protocol-error? c)
+                (guard (c ((store-protocol-error? c)
                            (pk 'determinism-exception c)
-                           (and (not (zero? (nix-protocol-error-status c)))
-                                (string-contains (nix-protocol-error-message c)
+                           (and (not (zero? (store-protocol-error-status c)))
+                                (string-contains (store-protocol-error-message c)
                                                  "deterministic"))))
                   ;; This one will produce a different result.  Since we're in
                   ;; 'check' mode, this must fail.
@@ -945,10 +945,10 @@
                      #:guile-for-build
                      (package-derivation store %bootstrap-guile (%current-system))))
               (file (derivation->output-path drv)))
-         (guard (c ((nix-protocol-error? c)
+         (guard (c ((store-protocol-error? c)
                     (pk 'multiple-build c)
-                    (and (not (zero? (nix-protocol-error-status c)))
-                         (string-contains (nix-protocol-error-message c)
+                    (and (not (zero? (store-protocol-error-status c)))
+                         (string-contains (store-protocol-error-message c)
                                           "deterministic"))))
            ;; This one will produce a different result on the second run.
            (current-build-output-port (current-error-port))