summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS1
-rw-r--r--Makefile.am8
-rw-r--r--ROADMAP118
-rw-r--r--configure.ac2
-rw-r--r--doc/emacs.texi6
-rw-r--r--doc/guix.texi50
-rw-r--r--gnu-system.am17
-rw-r--r--gnu.scm15
-rw-r--r--gnu/packages.scm22
-rw-r--r--gnu/packages/admin.scm13
-rw-r--r--gnu/packages/autotools.scm16
-rw-r--r--gnu/packages/cups.scm293
-rw-r--r--gnu/packages/emacs.scm12
-rw-r--r--gnu/packages/fonts.scm5
-rw-r--r--gnu/packages/freeipmi.scm4
-rw-r--r--gnu/packages/game-development.scm43
-rw-r--r--gnu/packages/games.scm34
-rw-r--r--gnu/packages/ghostscript.scm45
-rw-r--r--gnu/packages/glib.scm40
-rw-r--r--gnu/packages/gnome.scm42
-rw-r--r--gnu/packages/gnunet.scm4
-rw-r--r--gnu/packages/gnupg.scm4
-rw-r--r--gnu/packages/gtk.scm6
-rw-r--r--gnu/packages/guile.scm32
-rw-r--r--gnu/packages/kde.scm25
-rw-r--r--gnu/packages/linux.scm81
-rw-r--r--gnu/packages/netpbm.scm31
-rw-r--r--gnu/packages/nvi.scm4
-rw-r--r--gnu/packages/package-management.scm1
-rw-r--r--gnu/packages/parallel.scm4
-rw-r--r--gnu/packages/patches/nvi-db4.patch35
-rw-r--r--gnu/packages/patches/nvi-dbpagesize-binpower.patch35
-rw-r--r--gnu/packages/patches/pyqt-configure.patch15
-rw-r--r--gnu/packages/patches/util-linux-perl.patch15
-rw-r--r--gnu/packages/patches/util-linux-tests.patch30
-rw-r--r--gnu/packages/plotutils.scm32
-rw-r--r--gnu/packages/python.scm66
-rw-r--r--gnu/packages/qt.scm130
-rw-r--r--gnu/packages/rdf.scm36
-rw-r--r--gnu/packages/slang.scm70
-rw-r--r--gnu/packages/version-control.scm4
-rw-r--r--gnu/packages/video.scm59
-rw-r--r--gnu/packages/xnee.scm19
-rw-r--r--gnu/services/base.scm2
-rw-r--r--gnu/services/dbus.scm13
-rw-r--r--gnu/system.scm39
-rw-r--r--gnu/system/install.scm13
-rw-r--r--gnu/system/os-config.tmpl12
-rw-r--r--guix/build/glib-or-gtk-build-system.scm7
-rw-r--r--guix/derivations.scm33
-rw-r--r--guix/nar.scm6
-rw-r--r--guix/packages.scm14
-rw-r--r--guix/records.scm246
-rw-r--r--guix/scripts/lint.scm102
-rw-r--r--guix/scripts/package.scm18
-rw-r--r--guix/scripts/system.scm13
-rw-r--r--guix/serialization.scm12
-rw-r--r--guix/store.scm31
-rw-r--r--guix/ui.scm10
-rw-r--r--tests/packages.scm31
-rw-r--r--tests/records.scm47
-rw-r--r--tests/syscalls.scm14
62 files changed, 1711 insertions, 476 deletions
diff --git a/AUTHORS b/AUTHORS
index 19cf492270..845683f0cd 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -31,3 +31,4 @@ alphabetical order):
     Sree Harsha Totakura <sreeharsha@totakura.in>
           David Thompson <dthompson2@worcester.edu>
         Mark H. Weaver <mhw@netris.org>
+        Ricardo Wurmus <ricardo.wurmus@mdc-berlin.de>
diff --git a/Makefile.am b/Makefile.am
index c482848fdf..e15afd2ff4 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -268,10 +268,18 @@ AM_V_GUILEC = $(AM_V_GUILEC_$(V))
 AM_V_GUILEC_ = $(AM_V_GUILEC_$(AM_DEFAULT_VERBOSITY))
 AM_V_GUILEC_0 = @echo "  GUILEC" $@;
 
+# Unset 'GUILE_LOAD_COMPILED_PATH' altogether while compiling.  Otherwise, if
+# $GUILE_LOAD_COMPILED_PATH contains $(moduledir), we may find .go files in
+# there that are newer than the local .scm files (for instance because the
+# user ran 'make install' recently).  When that happens, we end up loading
+# those previously-installed .go files, which may be stale, thereby breaking
+# the whole thing.
+#
 # XXX: Use the C locale for when Guile lacks
 # <http://git.sv.gnu.org/cgit/guile.git/commit/?h=stable-2.0&id=e2c6bf3866d1186c60bacfbd4fe5037087ee5e3f>.
 .scm.go:
 	$(AM_V_GUILEC)$(MKDIR_P) `dirname "$@"` ;			\
+	unset GUILE_LOAD_COMPILED_PATH ;				\
 	LC_ALL=C							\
 	$(top_builddir)/pre-inst-env					\
 	$(GUILD) compile -L "$(top_builddir)" -L "$(top_srcdir)"	\
diff --git a/ROADMAP b/ROADMAP
index 1843743916..45fce45912 100644
--- a/ROADMAP
+++ b/ROADMAP
@@ -2,7 +2,7 @@
 
 #+TITLE: Tentative GNU Guix Road Map
 
-Copyright © 2012, 2013, 2014 Ludovic Courtès <ludo@gnu.org>
+Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 
   Copying and distribution of this file, with or without modification,
   are permitted in any medium without royalty provided the copyright
@@ -17,56 +17,66 @@ The goals of the GNU Guix project are two-fold:
     GNU/Linux and possibly other GNU variants, with a focus on the
     promotion and tight integration of GNU components–the GNU system.
 
-This document lists milestones toward these goals.
-
-The timeline below was written at the end of Dec. 2012.  An updated and more
-detailed list of the remaining milestones was posted at
-https://lists.gnu.org/archive/html/guix-devel/2013-12/msg00120.html .
-
-The actual timeline was of course slightly different than initially
-envisioned, and so was the feature set–things like cross-compilation support
-and the MIPS64 port were not planned back then.  See the news section at
-http://www.gnu.org/software/guix/ and ‘NEWS’ for the release history.
-
-* GNU Guix 0.1: Jan. 2013 (was: Dec. 2012)
-
-** basic package management facilities
-
-Including install, upgrade, remove, roll-back, and search.
-
-** self-contained user-land distribution
-
-  - GNU/Linux-only, i686 and x86_64; optionally mipsel64
-  - ~100 non-X11 packages
-
-** maybe integrated Nix code
-
-* GNU Guix 0.2: Feb./Mar. 2013
-
-** improved package management features
-
-  - user-environment hooks
-  - sophisticated handling of collisions when building a union (package
-    priorities, etc.)
-
-** [[file:TODO::*add%20guix-pull][guix-pull tool]] to quickly update Guix and GNU for normal users
-** support for fetching pre-built binaries
-
-  - this is known as the "binary-cache substituter" in Nix parlance
-
-** auto-update facility available for GNU packages
-
-** more packages
-
-  - Xorg
-  - Emacs
-
-* GNU Guix 0.9: June 2013
-
-** bootable GNU/Linux-Libre distro
-** high-level OS configuration descriptive EDSL, à la NixOS
-
-* GNU Guix 1.0: September 2013 (GNU anniversary release)
-
-** bootable GNU/Linux-Libre distro with non-GUI installer
-** usable for a range of hacker-style uses
+Since its inception, the project has gone a long way towards that goal.  Below
+is a list of items we want for version "1.0" of the Guix System Distribution.
+There will be a few 0.x releases by then to give the new features more
+exposure and testing.
+
+You're welcome to discuss this road map on guix-devel@gnu.org or #guix on
+Freenode!
+
+* Features scheduled for 1.0
+
+  - larger & more robust build farm
+    + we need a powerful, dedicated front-end
+    + armhf-linux build machine
+    + leave Hydra in favor of 'guix publish' + custom code?
+  - more OS features
+    + LVM support
+    + encrypted root
+    + configurable name service switch
+    + whole-system unit tests, using VMs
+  - more service definitions
+    + mcron, postfix(?), wicd(?), etc.
+  - better 'guix system'
+    + 'reconfigure' should be able to restart non-essential services
+    + support for '--list-generations' and '--delete-generations'
+  - better 'guix pull'
+    + using Git to fetch the source instead of re-downloading everything
+    + build more quickly
+    + install new .mo files and new manual
+    + authentication of the Guix source: use signed commits?
+  - simplified, purely declarative service list in 'operating-system'
+    + it should be possible to inspect the service instance declarations and
+      settings
+  - GUIs
+    + integrate guix-web?
+    + guile-ncurses installer?
+  - 'guix publish'?
+
+* Features for later
+
+  - complete GNU/Hurd port
+  - use content-based addressing when downloading substitutes to reduce
+    bandwidth requirements
+    + design nar v2 format where file contents are replaced by their hashes
+    + leverage /gnu/store/.links
+  - binary origin tracking
+    + keep signatures in sqlite.db
+    + preserve signatures upon import/export
+  - peer-to-peer distribution of updates (GNUnet?)
+  - more deterministic builds
+    + identify & fix sources of non-determinism in builds
+    + strengthen guix-daemon containers to further increase reproducibility
+    + trusting-trust: bootstrap with different tool chains
+    + fixed-point: re-bootstrap until fixed point is reached
+    + distributed validation: compare contents of store items with others
+      * resist a hydra.gnu.org compromise
+  - reproducible containers: mix of 'guix environment' and 'guix system vm'
+  - execute code with least privilege
+    + build containers like guix-daemon does
+    + provide a Plash-like interface in Bash
+  - daemon rewritten in Guile
+  - more dmd integration
+    + monitor network interfaces and start/stop events based on that
+    + include a DHCP client written in Scheme
diff --git a/configure.ac b/configure.ac
index 235990edc3..6f75fa3d7d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,7 +2,7 @@
 # Process this file with autoconf to produce a configure script.
 
 AC_PREREQ(2.68)
-AC_INIT([GNU Guix], [0.9], [bug-guix@gnu.org], [guix],
+AC_INIT([GNU Guix], [0.8.1], [bug-guix@gnu.org], [guix],
   [http://www.gnu.org/software/guix/])
 AC_CONFIG_AUX_DIR([build-aux])
 
diff --git a/doc/emacs.texi b/doc/emacs.texi
index 86e0048538..93d0c86b42 100644
--- a/doc/emacs.texi
+++ b/doc/emacs.texi
@@ -24,6 +24,12 @@ guix package}).  Specifically, ``guix.el'' makes it easy to:
 @node Emacs Initial Setup
 @subsection Initial Setup
 
+On the Guix System Distribution (@pxref{GNU Distribution}), ``guix.el''
+is ready to use, provided Guix is installed system-wide, which is the
+case by default.  So if that is what you're using, you can happily skip
+this section and read about the fun stuff.
+
+If you're not yet a happy user of GSD, a little bit of setup is needed.
 To be able to use ``guix.el'', you need to install the following
 packages:
 
diff --git a/doc/guix.texi b/doc/guix.texi
index 857653dca4..0d2a61347f 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -208,9 +208,15 @@ garbage collection of packages (@pxref{Features}).
 Guix has a command-line interface, which allows users to build, install,
 upgrade, and remove packages, as well as a Scheme programming interface.
 
+@cindex Guix System Distribution
+@cindex GSD
 Last but not least, Guix is used to build a distribution of the GNU
-system, with many GNU and non-GNU free software packages.  @xref{GNU
-Distribution}.
+system, with many GNU and non-GNU free software packages.  The Guix
+System Distribution, or GNU@tie{}GSD, takes advantage of the core
+properties of Guix at the system level.  With GNU@tie{}GSD, users
+@emph{declare} all aspects of the operating system configuration, and
+Guix takes care of instantiating that configuration in a reproducible,
+stateless fashion.  @xref{GNU Distribution}.
 
 @c *********************************************************************
 @node Installation
@@ -3312,19 +3318,17 @@ build} supports (@pxref{Invoking guix build, common build options}).
 @node GNU Distribution
 @chapter GNU Distribution
 
-@cindex Guixotic
-Guix comes with a distribution of free software@footnote{The term
-``free'' here refers to the
+@cindex Guix System Distribution
+@cindex GSD
+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}.} that forms the basis of the GNU system.  The
+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
-``Guixotic''@footnote{``How am I going to pronounce that name?'', you
-may ask.  Well, we would pronounce it like ``geeks-otic'', for
-consistency with Guix---which is quite different from the usual
-pronunciation of ``quixotic''.}.
+between the two, we refer to the standalone distribution as the Guix
+System Distribution, or GNU@tie{}GSD.
 
 The distribution provides core GNU packages such as GNU libc, GCC, and
 Binutils, as well as many GNU and non-GNU applications.  The complete
@@ -3341,7 +3345,7 @@ 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.
 
-The GNU distribution is currently available on the following platforms:
+Packages are currently available on the following platforms:
 
 @table @code
 
@@ -3361,6 +3365,8 @@ n32 application binary interface (ABI), and Linux-Libre kernel.
 
 @end table
 
+GSD itself is currently only available on @code{i686} and @code{x86_64}.
+
 @noindent
 For information on porting to other architectures or kernels,
 @xref{Porting}.
@@ -3382,9 +3388,9 @@ to join!  @xref{Contributing}, for information about how you can help.
 @node System Installation
 @section System Installation
 
-@cindex Guixotic
-This section explains how to install the standalone distribution,
-code-named ``Guixotic'', on a machine.  The Guix package manager can
+@cindex Guix System Distribution
+This section explains how to install the Guix System Distribution
+on a machine.  The Guix package manager can
 also be installed on top of a running GNU/Linux system,
 @pxref{Installation}.
 
@@ -3399,13 +3405,13 @@ link that follows: @pxref{Help,,, info, Info: An Introduction}.  Hit
 
 @subsection Limitations
 
-As of version @value{VERSION}, GNU@tie{}Guix and Guixotic are
-not production-ready.  They may contain bugs and lack important
+As of version @value{VERSION}, the Guix System Distribution (GSD) 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
 more established GNU/Linux distributions}.  We hope you can soon switch
-to Guixotic without fear, of course.  In the meantime, you can
+to the GSD 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}).
 
@@ -3441,7 +3447,7 @@ to report issues (and success stories!), and join us in improving it.
 @subsection USB Stick Installation
 
 An installation image for USB sticks can be downloaded from
-@url{ftp://alpha.gnu.org/gnu/guix/gnu-usb-install-@value{VERSION}.@var{system}.xz},
+@url{ftp://alpha.gnu.org/gnu/guix/guix-usb-install-@value{VERSION}.@var{system}.xz},
 where @var{system} is one of:
 
 @table @code
@@ -3589,7 +3595,7 @@ about the installation image.
 @section System Configuration
 
 @cindex system configuration
-Guixotic supports a consistent whole-system configuration
+The Guix System Distribution supports a consistent whole-system configuration
 mechanism.  By that we mean that all aspects of the global system
 configuration---such as the available system services, timezone and
 locale settings, user accounts---are declared in a single place.  Such
@@ -4379,7 +4385,7 @@ settings.
 
 @deffn {Monadic Procedure} guix-service [#:guix guix] @
        [#:builder-group "guixbuild"] [#:build-accounts 10] @
-       [#:authorize-hydra-key? #f] [#:use-substitutes? #t] @
+       [#:authorize-hydra-key? #t] [#:use-substitutes? #t] @
        [#:extra-options '()]
 Return a service that runs the build daemon from @var{guix}, and has
 @var{build-accounts} user accounts available under @var{builder-group}.
@@ -4800,7 +4806,7 @@ This action does not actually install anything.
 @item init
 Populate the given directory with all the files necessary to run the
 operating system specified in @var{file}.  This is useful for first-time
-installations of Guixotic.  For instance:
+installations of GSD.  For instance:
 
 @example
 guix system init my-os-config.scm /mnt
diff --git a/gnu-system.am b/gnu-system.am
index f29b45294e..c4387baec8 100644
--- a/gnu-system.am
+++ b/gnu-system.am
@@ -67,6 +67,7 @@ GNU_SYSTEM_MODULES =				\
   gnu/packages/cross-base.scm			\
   gnu/packages/crypto.scm			\
   gnu/packages/cryptsetup.scm			\
+  gnu/packages/cups.scm				\
   gnu/packages/curl.scm				\
   gnu/packages/cursynth.scm			\
   gnu/packages/cyrus-sasl.scm			\
@@ -243,6 +244,7 @@ GNU_SYSTEM_MODULES =				\
   gnu/packages/serveez.scm			\
   gnu/packages/shishi.scm			\
   gnu/packages/skribilo.scm			\
+  gnu/packages/slang.scm			\
   gnu/packages/slim.scm				\
   gnu/packages/smalltalk.scm			\
   gnu/packages/socat.scm			\
@@ -326,6 +328,11 @@ dist_patch_DATA =						\
   gnu/packages/patches/abiword-pass-no-undefined-to-linker.patch	\
   gnu/packages/patches/abiword-use-proper-png-api.patch		\
   gnu/packages/patches/abiword-wmf-version-lookup-fix.patch	\
+  gnu/packages/patches/aegis-constness-error.patch         	\
+  gnu/packages/patches/aegis-perl-tempdir1.patch           	\
+  gnu/packages/patches/aegis-perl-tempdir2.patch           	\
+  gnu/packages/patches/aegis-test-fixup-1.patch            	\
+  gnu/packages/patches/aegis-test-fixup-2.patch            	\
   gnu/packages/patches/alsa-lib-mips-atomic-fix.patch		\
   gnu/packages/patches/apr-skip-getservbyname-test.patch	\
   gnu/packages/patches/ath9k-htc-firmware-binutils.patch	\
@@ -349,6 +356,7 @@ dist_patch_DATA =						\
   gnu/packages/patches/cpio-gets-undeclared.patch		\
   gnu/packages/patches/cssc-gets-undeclared.patch               \
   gnu/packages/patches/cssc-missing-include.patch               \
+  gnu/packages/patches/clucene-contribs-lib.patch               \
   gnu/packages/patches/curl-gss-api-fix.patch			\
   gnu/packages/patches/cursynth-wave-rand.patch			\
   gnu/packages/patches/dbus-localstatedir.patch			\
@@ -412,6 +420,7 @@ dist_patch_DATA =						\
   gnu/packages/patches/libarchive-fix-lzo-test-case.patch	\
   gnu/packages/patches/libarchive-mtree-filename-length-fix.patch \
   gnu/packages/patches/libbonobo-activation-test-race.patch	\
+  gnu/packages/patches/libcanberra-sound-theme-freedesktop.patch \
   gnu/packages/patches/libevent-dns-tests.patch			\
   gnu/packages/patches/liboop-mips64-deplibs-fix.patch		\
   gnu/packages/patches/libmad-mips-newgcc.patch			\
@@ -419,6 +428,7 @@ dist_patch_DATA =						\
   gnu/packages/patches/libtool-skip-tests.patch			\
   gnu/packages/patches/libssh-CVE-2014-0017.patch		\
   gnu/packages/patches/lm-sensors-hwmon-attrs.patch		\
+  gnu/packages/patches/lua51-liblua-so.patch                    \
   gnu/packages/patches/luit-posix.patch				\
   gnu/packages/patches/m4-gets-undeclared.patch			\
   gnu/packages/patches/make-impure-dirs.patch			\
@@ -433,7 +443,9 @@ dist_patch_DATA =						\
   gnu/packages/patches/net-tools-bitrot.patch			\
   gnu/packages/patches/ninja-tests.patch			\
   gnu/packages/patches/nss-pkgconfig.patch			\
-  gnu/packages/patches/nvi-assume-preserve-path.patch           \
+  gnu/packages/patches/nvi-assume-preserve-path.patch		\
+  gnu/packages/patches/nvi-dbpagesize-binpower.patch		\
+  gnu/packages/patches/nvi-db4.patch				\
   gnu/packages/patches/orpheus-cast-errors-and-includes.patch	\
   gnu/packages/patches/ots-no-include-missing-file.patch	\
   gnu/packages/patches/patchelf-page-size.patch			\
@@ -450,6 +462,7 @@ dist_patch_DATA =						\
   gnu/packages/patches/pulseaudio-fix-mult-test.patch		\
   gnu/packages/patches/pybugz-encode-error.patch		\
   gnu/packages/patches/pybugz-stty.patch			\
+  gnu/packages/patches/pyqt-configure.patch			\
   gnu/packages/patches/python-fix-tests.patch			\
   gnu/packages/patches/python-libffi-mips-n32-fix.patch		\
   gnu/packages/patches/python-sqlite-3.8.4-test-fix.patch	\
@@ -476,7 +489,7 @@ dist_patch_DATA =						\
   gnu/packages/patches/unzip-CVE-2014-8139.patch		\
   gnu/packages/patches/unzip-CVE-2014-8140.patch		\
   gnu/packages/patches/unzip-CVE-2014-8141.patch		\
-  gnu/packages/patches/util-linux-perl.patch			\
+  gnu/packages/patches/util-linux-tests.patch			\
   gnu/packages/patches/vpnc-script.patch			\
   gnu/packages/patches/vtk-mesa-10.patch			\
   gnu/packages/patches/w3m-fix-compile.patch			\
diff --git a/gnu.scm b/gnu.scm
index eb0bf71ab1..d9b9117b8a 100644
--- a/gnu.scm
+++ b/gnu.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2015 Joshua S. Grant <jgrant@parenthetical.io>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -16,7 +17,10 @@
 ;;; You should have received a copy of the GNU General Public License
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
-(define-module (gnu))
+(define-module (gnu)
+  #:export (use-package-modules
+            use-service-modules
+            use-system-modules))
 
 ;;; Commentary:
 ;;;
@@ -44,4 +48,13 @@
                   (module-use! i (resolve-interface m))))
               %public-modules)))
 
+(define-syntax-rule (use-package-modules module ...)
+  (use-modules (gnu packages module) ...))
+
+(define-syntax-rule (use-service-modules module ...)
+  (use-modules (gnu services module) ...))
+
+(define-syntax-rule (use-system-modules module ...)
+  (use-modules (gnu system module) ...))
+
 ;;; gnu.scm ends here
diff --git a/gnu/packages.scm b/gnu/packages.scm
index 7f0b58b971..57a3e21bd6 100644
--- a/gnu/packages.scm
+++ b/gnu/packages.scm
@@ -30,6 +30,8 @@
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-11)
   #:use-module (srfi srfi-26)
+  #:use-module (srfi srfi-34)
+  #:use-module (srfi srfi-35)
   #:use-module (srfi srfi-39)
   #:export (search-patch
             search-bootstrap-binary
@@ -70,13 +72,23 @@
         %load-path)))
 
 (define (search-patch file-name)
-  "Search the patch FILE-NAME."
-  (search-path (%patch-path) file-name))
+  "Search the patch FILE-NAME.  Raise an error if not found."
+  (or (search-path (%patch-path) file-name)
+      (raise (condition
+              (&message (message (format #f (_ "~a: patch not found")
+                                         file-name)))))))
 
 (define (search-bootstrap-binary file-name system)
-  "Search the bootstrap binary FILE-NAME for SYSTEM."
-  (search-path (%bootstrap-binaries-path)
-               (string-append system "/" file-name)))
+  "Search the bootstrap binary FILE-NAME for SYSTEM.  Raise an error if not
+found."
+  (or (search-path (%bootstrap-binaries-path)
+                   (string-append system "/" file-name))
+      (raise (condition
+              (&message
+               (message
+                (format #f (_ "could not find bootstrap binary '~a' \
+for system '~a'")
+                        file-name system)))))))
 
 (define %distro-root-directory
   ;; Absolute file name of the module hierarchy.
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index d7cd0b8092..534fd070ff 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -631,7 +631,10 @@ system administrator.")
                 "002l6h27pnhb77b65frhazbhknsxvrsnkpi43j7i0qw1lrgi7nkf"))))
     (build-system gnu-build-system)
     (arguments
-     `(#:configure-flags '("--with-logpath=/var/log/sudo.log")
+     `(#:configure-flags '("--with-logpath=/var/log/sudo.log"
+                           "--with-rundir=/run/sudo"
+                           "--with-vardir=/var/db/sudo"
+                           "--with-iologdir=/var/log/sudo-io")
        #:phases (alist-cons-before
                  'configure 'pre-configure
                  (lambda _
@@ -645,7 +648,13 @@ system administrator.")
                       "")
                      (("^install: (.*)install-sudoers(.*)" _ before after)
                       ;; Don't try to create /etc/sudoers.
-                      (string-append "install: " before after "\n"))))
+                      (string-append "install: " before after "\n"))
+                     (("\\$\\(DESTDIR\\)\\$\\(rundir\\)")
+                      ;; Don't try to create /run/sudo.
+                      "$(TMPDIR)/dummy")
+                     (("\\$\\(DESTDIR\\)\\$\\(vardir\\)")
+                      ;; Don't try to create /var/db/sudo.
+                      "$(TMPDIR)/dummy")))
                  %standard-phases)
 
        ;; XXX: The 'testsudoers' test series expects user 'root' to exist, but
diff --git a/gnu/packages/autotools.scm b/gnu/packages/autotools.scm
index 8e72562444..7f20b262f8 100644
--- a/gnu/packages/autotools.scm
+++ b/gnu/packages/autotools.scm
@@ -238,14 +238,14 @@ Makefile, simplifying the entire process for the developer.")
 (define-public libtool
   (package
     (name "libtool")
-    (version "2.4.4")
+    (version "2.4.5")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://gnu/libtool/libtool-"
                                   version ".tar.xz"))
               (sha256
                (base32
-                "0v3zq08qxv7k5067mpqrkjkjl3wphhg06i696mka90mzadc5nad8"))
+                "0zhphv4n9bdd6sz66lqfrfqcsnv89mg2bykgi5w9401va4vc3al4"))
               (patches
                (list (search-patch "libtool-skip-tests.patch")))))
     (build-system gnu-build-system)
@@ -295,8 +295,16 @@ complexity of working with shared libraries across platforms.")
   ;; Libtool's extensive test suite isn't run.
   (package
     (name "libltdl")
-    (version (package-version libtool))
-    (source (package-source libtool))
+    (version "2.4.4")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://gnu/libtool/libtool-"
+                                  version ".tar.xz"))
+              (sha256
+               (base32
+                "0v3zq08qxv7k5067mpqrkjkjl3wphhg06i696mka90mzadc5nad8"))
+              (patches
+               (list (search-patch "libtool-skip-tests.patch")))))
     (build-system gnu-build-system)
     (arguments
      '(#:configure-flags '("--enable-ltdl-install") ;really install it
diff --git a/gnu/packages/cups.scm b/gnu/packages/cups.scm
new file mode 100644
index 0000000000..a74e4097eb
--- /dev/null
+++ b/gnu/packages/cups.scm
@@ -0,0 +1,293 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu packages cups)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix build-system gnu)
+  #:use-module (gnu packages)
+  #:use-module (gnu packages avahi)
+  #:use-module (gnu packages compression)
+  #:use-module (gnu packages image)
+  #:use-module (gnu packages fonts) ;font-dejavu
+  #:use-module (gnu packages fontutils)
+  #:use-module (gnu packages ghostscript)
+  #:use-module (gnu packages glib)
+  #:use-module (gnu packages gnutls)
+  #:use-module (gnu packages pdf)
+  #:use-module (gnu packages pkg-config))
+
+(define-public cups-filters
+  (package
+    (name "cups-filters")
+    (version "1.0.61")
+    (source (origin
+              (method url-fetch)
+              (uri
+               (string-append "http://openprinting.org/download/cups-filters/"
+                              "cups-filters-" version ".tar.xz"))
+              (sha256
+               (base32
+                "1bq48nnrarlbf6qc93bz1n5wlh6j420gppbck3r45sinwhz5wa7m"))
+              (modules '((guix build utils)))
+              (snippet
+               ;; install backends, banners and filters to cups-filters output
+               ;; directory, not the cups server directory
+               '(substitute* "Makefile.in"
+                  (("CUPS_DATADIR = @CUPS_DATADIR@")
+                   "CUPS_DATADIR = $(PREFIX)/share/cups")
+                  (("pkgcupsserverrootdir = \\$\\(CUPS_SERVERROOT\\)")
+                   "pkgcupsserverrootdir = $(PREFIX)")
+                  (("pkgbackenddir = \\$\\(CUPS_SERVERBIN\\)/backend")
+                   "pkgbackenddir = $(PREFIX)/backend")
+                  (("pkgfilterdir = \\$\\(CUPS_SERVERBIN\\)/filter")
+                   "pkgfilterdir = $(PREFIX)/filter")))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:make-flags (list (string-append "PREFIX=" %output))
+       #:configure-flags
+       `(,(string-append "--with-test-font-path="
+                         (assoc-ref %build-inputs "font-dejavu")
+                         "/share/fonts/truetype/DejaVuSans.ttf")
+         ,(string-append "--with-rcdir="
+                         (assoc-ref %outputs "out") "/etc/rc.d"))))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (inputs
+     `(("fontconfig"   ,fontconfig)
+       ("freetype"     ,freetype)
+       ("font-dejavu"  ,font-dejavu) ;needed by test suite
+       ("ghostscript"  ,ghostscript)
+       ("ijs"          ,ijs)
+       ("dbus"         ,dbus)
+       ("lcms"         ,lcms)
+       ("libjpeg-8"    ,libjpeg-8)
+       ("libpng"       ,libpng)
+       ("libtiff"      ,libtiff)
+       ("glib"         ,glib)
+       ("qpdf"         ,qpdf)
+       ("poppler"      ,poppler)
+       ("cups-minimal" ,cups-minimal)))
+    (home-page "http://www.linuxfoundation.org/collaborate/workgroups/openprinting/cups-filters")
+    (synopsis "OpenPrinting CUPS filters and backends")
+    (description
+     "Contains backends, filters, and other software that was once part of the
+core CUPS distribution but is no longer maintained by Apple Inc.  In addition
+it contains additional filters developed independently of Apple, especially
+filters for the PDF-centric printing workflow introduced by OpenPrinting.")
+    ;; Different filters and backends have different licenses; see COPYING for
+    ;; details
+    (license (list license:gpl2
+                   license:gpl2+
+                   license:gpl3
+                   license:gpl3+
+                   license:lgpl2.0+
+                   license:expat))))
+
+;; CUPS on non-MacOS systems requires cups-filters.  Since cups-filters also
+;; depends on CUPS libraries and binaries, cups-minimal has been added to
+;; satisfy this dependency.
+(define-public cups-minimal
+  (package
+    (name "cups-minimal")
+    (version "2.0.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://www.cups.org/software/"
+                                  version "/cups-" version "-source.tar.gz"))
+              (sha256
+               (base32
+                "1kbc85kwhm1vyzahblrg3qih9yypggs91d13gdrbnaac8q7jd9jr"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:configure-flags
+       '("--disable-launchd"
+         "--disable-systemd"
+         "--disable-avahi"
+         "--disable-dnssd")
+       ;; Seven tests fail, mostly because of files that are provided by the
+       ;; cups-filters package.
+       #:tests? #f
+       #:phases
+       (alist-cons-before
+        'configure
+        'patch-makedefs
+        (lambda _
+          (substitute* "Makedefs.in"
+            (("INITDIR.*=.*@INITDIR@") "INITDIR = @prefix@/@INITDIR@")
+            (("/bin/sh") (which "sh"))))
+        (alist-cons-before
+         'build
+         'patch-tests
+         (lambda _
+           (substitute* "test/ippserver.c"
+             (("#  else /\\* HAVE_AVAHI \\*/") "#elif defined(HAVE_AVAHI)")))
+         %standard-phases))))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (inputs
+     `(("zlib"  ,zlib)
+       ("gnutls" ,gnutls)))
+    (home-page "http://www.cups.org")
+    (synopsis "The Common Unix Printing System")
+    (description
+     "CUPS is a printing system that uses the Internet Printing
+Protocol (IPP).  It provides System V and BSD command-line interfaces, as well
+as a Web interface and a C programming interface to manage printers and print
+jobs.  It supports printing to both local (parallel, serial, USB) and
+networked printers, and printers can be shared from one computer to another.
+Internally, CUPS uses PostScript Printer Description (PPD) files to describe
+printer capabilities and features and a wide variety of generic and
+device-specific programs to convert and print many types of files.")
+    (license license:gpl2)))
+
+(define-public cups
+  (package (inherit cups-minimal)
+    (name "cups")
+    (arguments
+     `(;; Three tests fail:
+       ;; * two tests in ipp-1.1.test related to "RFC 2911 section 3.2.6:
+       ;;   Get-Jobs Operation"
+       ;; * test of number of error/warning messages, probably related to a
+       ;;   missing font.
+       #:tests? #f
+       #:configure-flags
+       '("--disable-launchd"
+         "--disable-systemd")
+       #:phases
+       (alist-cons-before
+        'configure
+        'patch-makedefs
+        (lambda _
+          (substitute* "Makedefs.in"
+            (("INITDIR.*=.*@INITDIR@") "INITDIR = @prefix@/@INITDIR@")
+            (("/bin/sh") (which "sh"))))
+        (alist-cons-before
+         'check
+         'patch-tests
+         (lambda _
+           (let ((filters (assoc-ref %build-inputs "cups-filters"))
+                 (catpath (string-append
+                           (assoc-ref %build-inputs "coreutils") "/bin/"))
+                 (testdir (string-append (getcwd) "/tmp/")))
+             (mkdir testdir)
+             (substitute* "test/run-stp-tests.sh"
+               ((" *BASE=/tmp/") (string-append "BASE=" testdir))
+
+               ;; allow installation of filters from output dir and from
+               ;; cups-filters
+               (("for dir in /usr/libexec/cups/filter /usr/lib/cups/filter")
+                (string-append
+                 "for dir in "
+                 (assoc-ref %outputs "out") "/lib/cups/filter "
+                 filters "/filter"))
+
+               ;; check for charsets in cups-filters output
+               (("/usr/share/cups/charsets")
+                (string-append filters "/share/cups/charsets"))
+
+               ;; install additional required filters
+               (("instfilter texttopdf texttopdf pdf")
+                (string-append
+                 "instfilter texttopdf texttopdf pdf;"
+                 "instfilter imagetoraster imagetoraster raster;"
+                 "instfilter gstoraster gstoraster raster;"
+                 "instfilter urftopdf urftopdf pdf;"
+                 "instfilter rastertopdf rastertopdf pdf;"
+                 "instfilter pstopdf pstopdf pdf"))
+
+               ;; specify location of lpstat binary
+               (("description=\"`lpstat -l")
+                "description=\"`../systemv/lpstat -l")
+
+               ;; patch shebangs of embedded scripts
+               (("#!/bin/sh") (string-append "#!" (which "sh")))
+
+               ;; also link mime definitions from cups-filters
+               ;; to enable the additional filters for the test suite
+               (("ln -s \\$root/conf/mime\\.types")
+                (string-append
+                 "ln -s " filters
+                 "/share/cups/mime/cupsfilters.types $BASE/share/mime; "
+                 "ln -s $root/conf/mime.types"))
+               (("ln -s \\$root/conf/mime\\.convs")
+                (string-append
+                 "ln -s " filters
+                 "/share/cups/mime/cupsfilters.convs $BASE/share/mime; "
+                 "ln -s $root/conf/mime.convs")))
+
+             ;; fix search path for "cat"
+             (substitute* "cups/testfile.c"
+               (("cupsFileFind\\(\"cat\", \"/bin\"")
+                (string-append "cupsFileFind(\"cat\", \"" catpath "\""))
+               (("cupsFileFind\\(\"cat\", \"/bin:/usr/bin\"")
+                (string-append "cupsFileFind(\"cat\", \"" catpath "\"")))))
+         (alist-cons-after
+          'install
+          'install-cups-filters-symlinks
+          (lambda* (#:key inputs outputs #:allow-other-keys)
+            (let ((out (assoc-ref outputs "out"))
+                  (cups-filters (assoc-ref inputs "cups-filters")))
+              ;; charsets
+              (symlink
+               (string-append cups-filters "/share/cups/charsets")
+               (string-append out "/share/charsets"))
+
+              ;; mime types, driver file, ppds
+              (for-each
+               (lambda (f)
+                 (symlink (string-append cups-filters f)
+                          (string-append out f)))
+               '("/share/cups/mime/cupsfilters.types"
+                 "/share/cups/mime/cupsfilters.convs"
+                 "/share/cups/drv/cupsfilters.drv"
+                 "/share/ppd"))
+
+              ;; filters
+              (for-each
+               (lambda (f)
+                 (symlink f
+                          (string-append out "/lib/cups/filter" (basename f))))
+               (find-files (string-append cups-filters "/filter") ".*"))
+
+              ;; backends
+              (for-each
+               (lambda (f)
+                 (symlink (string-append cups-filters f)
+                          (string-append out "/lib/cups" f)))
+               '("/backend/parallel"
+                 "/backend/serial"))
+
+              ;; banners
+              (let ((banners "/share/cups/banners"))
+                (delete-file-recursively (string-append out banners))
+                (symlink (string-append cups-filters banners)
+                         (string-append out banners)))
+
+              ;; assorted data
+              (let ((data "/share/cups/data"))
+                (delete-file-recursively (string-append out data))
+                (symlink (string-append cups-filters data)
+                         (string-append out data)))))
+          %standard-phases)))))
+    (inputs
+     `(("avahi" ,avahi)
+       ("gnutls" ,gnutls)
+       ("cups-filters" ,cups-filters)
+       ("zlib"  ,zlib)))))
diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scm
index 9ccf34c362..f4d7ac9748 100644
--- a/gnu/packages/emacs.scm
+++ b/gnu/packages/emacs.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014 Taylan Ulrich Bayirli/Kammer <taylanbayirli@gmail.com>
-;;; Copyright © 2013, 2014 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2014 Alex Kost <alezost@gmail.com>
 ;;;
@@ -482,13 +482,12 @@ operations.")
                  (alist-cons-before
                   'install 'pre-install
                   (lambda* (#:key outputs #:allow-other-keys)
-                    ;; The 'install' rule expects 'emms-print-metadata.1' to
-                    ;; be already installed.
+                    ;; The 'install' rule expects the target directory to
+                    ;; exist.
                     (let* ((out  (assoc-ref outputs "out"))
                            (man1 (string-append out "/share/man/man1")))
                       (mkdir-p man1)
-                      (copy-file "emms-print-metadata.1"
-                                 (string-append man1 "/emms-print-metadata.1"))))
+                      #t))
                   (alist-cons-after
                    'install 'post-install
                    (lambda* (#:key outputs #:allow-other-keys)
@@ -505,8 +504,7 @@ operations.")
        #:tests? #f))
     (native-inputs `(("emacs" ,emacs)            ;for (guix build emacs-utils)
                      ("texinfo" ,texinfo)))
-    (inputs `(;("perl" ,perl)                     ;for 'emms-print-metadata.pl'
-              ("alsa-utils" ,alsa-utils)
+    (inputs `(("alsa-utils" ,alsa-utils)
               ("vorbis-tools" ,vorbis-tools)
               ("mpg321" ,mpg321)
               ("taglib" ,taglib)
diff --git a/gnu/packages/fonts.scm b/gnu/packages/fonts.scm
index c16ab93242..94993f0d08 100644
--- a/gnu/packages/fonts.scm
+++ b/gnu/packages/fonts.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2014 Joshua Grant <tadni@riseup.net>
 ;;; Copyright © 2014 Alex Kost <alezost@gmail.com>
@@ -25,8 +25,7 @@
   #:use-module (guix download)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system trivial)
-  #:use-module ((gnu packages base)
-                #:select (tar))
+  #:use-module (gnu packages base)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages xorg)
diff --git a/gnu/packages/freeipmi.scm b/gnu/packages/freeipmi.scm
index 39e541b884..a6bba757da 100644
--- a/gnu/packages/freeipmi.scm
+++ b/gnu/packages/freeipmi.scm
@@ -27,14 +27,14 @@
 (define-public freeipmi
   (package
     (name "freeipmi")
-    (version "1.4.7")
+    (version "1.4.8")
     (source (origin
              (method url-fetch)
              (uri (string-append "mirror://gnu/freeipmi/freeipmi-"
                                  version ".tar.gz"))
              (sha256
               (base32
-               "1j33b2spj1vzjf1ymfrgka5h7imijmdwg9jdjfb92b2ccld9jj6l"))))
+               "06smdsri1v5v2smrd3jxq3n135x7cx0npcimc37lb144gzgyk9wz"))))
     (build-system gnu-build-system)
     (inputs
      `(("readline" ,readline) ("libgcrypt" ,libgcrypt)))
diff --git a/gnu/packages/game-development.scm b/gnu/packages/game-development.scm
index 056b3681a7..fefdf67f3d 100644
--- a/gnu/packages/game-development.scm
+++ b/gnu/packages/game-development.scm
@@ -17,11 +17,14 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu packages game-development)
-  #:use-module (guix licenses)
+  #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix build-system cmake)
-  #:use-module (gnu packages))
+  #:use-module (guix build-system gnu)
+  #:use-module (gnu packages)
+  #:use-module (gnu packages qt)
+  #:use-module (gnu packages compression))
 
 (define-public bullet
   (package
@@ -45,4 +48,38 @@
     (description
      "Bullet is a physics engine library usable for collision detection.  It
 is used in some video games and movies.")
-    (license zlib)))
+    (license license:zlib)))
+
+(define-public tiled
+  (package
+    (name "tiled")
+    (version "0.11.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/bjorn/tiled/archive/v"
+                                  version ".tar.gz"))
+              (sha256
+               (base32
+                "03a15vbzjfwc8dpifbjvd0gnr208mzmdkgs2nlc8zq6z0a4h4jqd"))))
+    (build-system gnu-build-system)
+    (inputs `(("qt" ,qt)
+              ("zlib" ,zlib)))
+    (arguments
+     '(#:phases
+       (alist-replace
+        'configure
+        (lambda* (#:key outputs #:allow-other-keys)
+          (let ((out (assoc-ref outputs "out")))
+            (system* "qmake"
+                     (string-append "PREFIX=" out))))
+        %standard-phases)))
+    (home-page "http://www.mapeditor.org/")
+    (synopsis "Tile map editor")
+    (description
+     "Tiled is a general purpose tile map editor.  It is meant to be used for
+editing maps of any tile-based game, be it an RPG, a platformer or a Breakout
+clone.")
+
+    ;; As noted in 'COPYING', part of it is under GPLv2+, while the rest is
+    ;; under BSD-2.
+    (license license:gpl2+)))
diff --git a/gnu/packages/games.scm b/gnu/packages/games.scm
index f206d3caca..a9c4d6bd11 100644
--- a/gnu/packages/games.scm
+++ b/gnu/packages/games.scm
@@ -520,40 +520,6 @@ alternative layouts Dvorak and Colemak, as well as for the numpad.  Tutorials
 are primarily in English, however some in other languages are provided.")
     (license license:gpl3+)))
 
-(define-public tiled
-  (package
-    (name "tiled")
-    (version "0.10.2")
-    (source (origin
-              (method url-fetch)
-              (uri (string-append "https://github.com/bjorn/tiled/archive/v"
-                                  version ".tar.gz"))
-              (sha256
-               (base32
-                "0p4p3lv4nw11fkfvvyjirb93r2x4w2rrc2w650gl2k57k92jpiij"))))
-    (build-system gnu-build-system)
-    (inputs `(("qt" ,qt)
-              ("zlib" ,zlib)))
-    (arguments
-     '(#:phases
-       (alist-replace
-        'configure
-        (lambda* (#:key outputs #:allow-other-keys)
-          (let ((out (assoc-ref outputs "out")))
-            (system* "qmake"
-                     (string-append "PREFIX=" out))))
-        %standard-phases)))
-    (home-page "http://www.mapeditor.org/")
-    (synopsis "Tile map editor")
-    (description
-     "Tiled is a general purpose tile map editor.  It is meant to be used for
-editing maps of any tile-based game, be it an RPG, a platformer or a Breakout
-clone.")
-
-    ;; As noted in 'COPYING', part of it is under GPLv2+, while the rest is
-    ;; under BSD-2.
-    (license license:gpl2+)))
-
 (define-public openal
   (package
     (name "openal")
diff --git a/gnu/packages/ghostscript.scm b/gnu/packages/ghostscript.scm
index 405b4e744e..e2d4e618fa 100644
--- a/gnu/packages/ghostscript.scm
+++ b/gnu/packages/ghostscript.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2014 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -19,6 +20,7 @@
 
 (define-module (gnu packages ghostscript)
   #:use-module (gnu packages)
+  #:use-module (gnu packages autotools)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages fontutils)
   #:use-module (gnu packages image)
@@ -164,6 +166,49 @@ output file formats and printers.")
    (license license:agpl3+)
    (home-page "http://www.gnu.org/software/ghostscript/")))
 
+(define-public ijs
+  (package
+   (name "ijs")
+   (version "9.14.0")
+   (source (origin
+            (method url-fetch)
+            (uri (string-append "mirror://gnu/ghostscript/gnu-ghostscript-"
+                                version ".tar.xz"))
+            (sha256 (base32
+                     "0q4jj41p0qbr4mgcc9q78f5zs8cm1g57wgryhsm2yq4lfslm3ib1"))))
+   (build-system gnu-build-system)
+   (native-inputs
+    `(("libtool"    ,libtool)
+      ("automake"   ,automake)
+      ("autoconf"   ,autoconf)))
+   (arguments
+    `(#:phases
+      (alist-cons-after
+       'unpack 'autogen
+       (lambda _
+         ;; need to regenerate macros
+         (system* "autoreconf" "-if")
+         ;; do not run configure
+         (substitute* "autogen.sh"
+           (("^.*\\$srcdir/configure.*") ""))
+         (system* "bash" "autogen.sh")
+
+         ;; create configure script in ./ijs/
+         (chdir "ijs")
+         ;; do not run configure
+         (substitute* "autogen.sh"
+           (("^.*\\$srcdir/configure.*") "")
+           (("^ + && echo Now type.*$")  ""))
+         (zero? (system* "bash" "autogen.sh")))
+       %standard-phases)))
+   (synopsis "IJS driver framework for inkjet and other raster devices")
+   (description
+    "IJS is a protocol for transmission of raster page images.  This package
+provides the reference implementation of the raster printer driver
+architecture.")
+   (license license:expat)
+   (home-page "http://www.gnu.org/software/ghostscript/")))
+
 (define-public gs-fonts
   (package
    (name "gs-fonts")
diff --git a/gnu/packages/glib.scm b/gnu/packages/glib.scm
index 39fc736b02..bbb57335a5 100644
--- a/gnu/packages/glib.scm
+++ b/gnu/packages/glib.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013, 2014 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
+;;; Copyright © 2013, 2015 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
 ;;; Copyright © 2014 Mark H Weaver <mhw@netris.org>
 ;;;
@@ -52,7 +52,8 @@
             intltool
             itstool
             libsigc++
-            glibmm))
+            glibmm
+            telepathy-glib))
 
 (define dbus
   (package
@@ -519,3 +520,38 @@ useful for C++.")
     (description
      "Python bindings for GLib, GObject, and GIO.")
     (license license:lgpl2.1+)))
+
+(define telepathy-glib
+  (package
+    (name "telepathy-glib")
+    (version "0.24.1")
+    (source
+     (origin
+      (method url-fetch)
+       (uri
+        (string-append
+         "http://telepathy.freedesktop.org/releases/telepathy-glib/"
+         "telepathy-glib-" version ".tar.gz"))
+       (sha256
+        (base32
+         "1symyzbjmxvksn2ifdkk50lafjm2llf2sbmky062gq2pz3cg23cy"))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("glib" ,glib "bin") ; uses glib-mkenums
+       ("pkg-config" ,pkg-config)
+       ("python" ,python-2)))
+    (inputs
+     `(("dbus" ,dbus)
+       ("dbus-glib" ,dbus-glib)
+       ("glib" ,glib)
+       ("gobject-introspection" ,gobject-introspection)
+       ("libxslt" ,libxslt)))
+    (home-page "http://telepathy.freedesktop.org/wiki/")
+    (synopsis "GLib Real-time communications framework over D-Bus")
+    (description "Telepathy is a flexible, modular communications framework
+that enables real-time communication over D-Bus via pluggable protocol
+backends.  Telepathy is a communications service that can be accessed by
+many applications simultaneously.
+
+This package provides the library for GLib applications.")
+    (license license:lgpl2.1+)))
diff --git a/gnu/packages/gnome.scm b/gnu/packages/gnome.scm
index 0f33880a21..535913bcf1 100644
--- a/gnu/packages/gnome.scm
+++ b/gnu/packages/gnome.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
-;;; Copyright © 2014 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2015 Andreas Enge <andreas@enge.fr>
+;;; Copyright © 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014 Ian Denhardt <ian@zenhack.net>
 ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2014, 2015 Federico Beffa <beffa@fbengineering.ch>
@@ -1022,6 +1022,8 @@ widgets built in the loading process.")
     (license license:gpl2+))) ; This is correct.  GPL not LGPL
 
 (define-public libgnomeprint
+  ;; This library has been deprecated since 2006; see
+  ;; <https://mail.gnome.org/archives/devel-announce-list/2006-August/msg00005.html>.
   (package
     (name "libgnomeprint")
     (version "2.8.2")
@@ -1045,11 +1047,14 @@ widgets built in the loading process.")
        ("pkg-config" ,pkg-config)))
     (home-page "https://projects.gnome.org/gnome-print/home/faq.html")
     (synopsis "Printing framework for GNOME")
-    (description "Gnome-print is a high-quality printing framework for GNOME.")
+    (description
+     "GNOME-print was a printing framework for GNOME.  It has been deprecated
+since ca. 2006, when GTK+ itself incorporated printing support.")
     (license license:lgpl2.0+)))
 
 
 (define-public libgnomeprintui
+  ;; Deprecated; see libgnomeprint.
   (package
     (name "libgnomeprintui")
     (version "2.8.2")
@@ -1074,10 +1079,9 @@ widgets built in the loading process.")
        ("pkg-config" ,pkg-config)))
     (home-page "https://projects.gnome.org/gnome-print/home/faq.html")
     (synopsis "Printing framework for GNOME")
-    (description  "Gnome-print is a high-quality printing framework for GNOME.")
+    (description (package-description libgnomeprint))
     (license license:lgpl2.0+)))
 
-
 (define-public libbonoboui
   (package
     (name "libbonoboui")
@@ -1442,3 +1446,31 @@ editors, IDEs, etc.")
 is to provide a backend to GSettings on platforms that don't already have
 configuration storage systems.")
     (license license:lgpl2.1)))
+
+(define-public json-glib
+  (package
+    (name "json-glib")
+    (version "1.0.2")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://gnome/sources/" name "/"
+                                  (version-major+minor version) "/"
+                                  name "-" version ".tar.xz"))
+              (sha256
+               (base32
+                "02k66lpc4cmgygj66n8zcy59bggy7yzm3v4hni9xqplgva9d2yw8"))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("glib" ,glib "bin") ; for glib-mkenums and glib-genmarshal
+       ("gobject-introspection" ,gobject-introspection)
+       ("pkg-config" ,pkg-config)))
+    (propagated-inputs
+     `(("glib" ,glib))) ; according to json-glib-1.0.pc
+    (home-page "https://wiki.gnome.org/Projects/JsonGlib")
+    (synopsis "Compiler for the GObject type system")
+    (description "JSON-GLib is a C library based on GLib providing
+serialization and deserialization support for the JavaScript Object Notation
+(JSON) format described by RFC 4627.  It provides parser and generator
+GObject classes and various wrappers for the complex data types employed by
+JSON, such as arrays and objects.")
+    (license license:lgpl2.1+)))
diff --git a/gnu/packages/gnunet.scm b/gnu/packages/gnunet.scm
index f7063ead11..96b517b9a9 100644
--- a/gnu/packages/gnunet.scm
+++ b/gnu/packages/gnunet.scm
@@ -103,14 +103,14 @@ tool to extract metadata from a file and print the results.")
 (define-public libmicrohttpd
   (package
    (name "libmicrohttpd")
-   (version "0.9.38")
+   (version "0.9.39")
    (source (origin
             (method url-fetch)
             (uri (string-append "mirror://gnu/libmicrohttpd/libmicrohttpd-"
                                 version ".tar.gz"))
             (sha256
              (base32
-              "08g7p4l0p2fsjj8ayl68zq1bqgrn0pck19bm8yd7k61whvfv9wld"))))
+              "0wz3sw62z3wsqivrssh0xb3yn064ix5x5cc6prvdfrn3cmh7p4sg"))))
    (build-system gnu-build-system)
    (inputs
     `(("curl" ,curl)
diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm
index 1ef8fe7e3a..9bc75b2329 100644
--- a/gnu/packages/gnupg.scm
+++ b/gnu/packages/gnupg.scm
@@ -107,7 +107,7 @@ generation.")
 (define-public libassuan
   (package
     (name "libassuan")
-    (version "2.1.3")
+    (version "2.2.0")
     (source
      (origin
       (method url-fetch)
@@ -115,7 +115,7 @@ generation.")
                           version ".tar.bz2"))
       (sha256
        (base32
-        "06hxyns8i73c6vrbrxyx6h38kwa7971h01qfc5cyna69afrp08gs"))))
+        "1ikf9whfi7rg71qa610ynyv12qrw20zkn7zxgvvr9dp41gbqxxbx"))))
     (build-system gnu-build-system)
     (propagated-inputs
      `(("libgpg-error" ,libgpg-error) ("pth" ,pth)))
diff --git a/gnu/packages/gtk.scm b/gnu/packages/gtk.scm
index f48815ae4d..6bd4e3665a 100644
--- a/gnu/packages/gtk.scm
+++ b/gnu/packages/gtk.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
-;;; Copyright © 2013, 2014 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2015 Federico Beffa <beffa@fbengineering.ch>
@@ -39,6 +39,7 @@
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages python)
   #:use-module (gnu packages guile)
+  #:use-module (gnu packages cups)
   #:use-module (gnu packages xml)
   #:use-module (gnu packages xorg)
   #:use-module (gnu packages xdisorg))
@@ -413,7 +414,8 @@ application suites.")
       ("libxdamage" ,libxdamage)
       ("pango" ,pango)))
    (inputs
-    `(("libxml2" ,libxml2)))
+    `(("libxml2" ,libxml2)
+      ("cups" ,cups)))                            ;for printing support
    (native-inputs
     `(("perl" ,perl)
       ("glib" ,glib "bin")
diff --git a/gnu/packages/guile.scm b/gnu/packages/guile.scm
index c0c5ced0f3..f71201b553 100644
--- a/gnu/packages/guile.scm
+++ b/gnu/packages/guile.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -34,7 +34,6 @@
   #:use-module (gnu packages ncurses)
   #:use-module (gnu packages ed)
   #:use-module (gnu packages which)
-  #:use-module (gnu packages gtk)
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix build-system gnu)
@@ -368,33 +367,4 @@ http:://json.org specification.  These are the main features:
 - Allows JSON pretty printing.")
     (license lgpl3+)))
 
-(define-public guile-charting
-  (package
-    (name "guile-charting")
-    (version "0.2.0")
-    (source (origin
-              (method url-fetch)
-              (uri (string-append "http://wingolog.org/pub/guile-charting/"
-                                  "guile-charting-" version ".tar.gz"))
-              (sha256
-               (base32
-                "0w5qiyv9v0ip5li22x762bm48g8xnw281w66iyw094zdw611pb2m"))
-              (modules '((guix build utils)))
-              (snippet
-               '(begin
-                  ;; Use the standard location for modules.
-                  (substitute* "Makefile.in"
-                    (("godir = .*$")
-                     "godir = $(moddir)\n"))))))
-    (build-system gnu-build-system)
-    (native-inputs `(("pkg-config" ,pkg-config)))
-    (inputs `(("guile" ,guile-2.0)))
-    (propagated-inputs `(("guile-cairo" ,guile-cairo)))
-    (home-page "http://wingolog.org/software/guile-charting/")
-    (synopsis "Create charts and graphs in Guile")
-    (description
-     "Guile-Charting is a Guile Scheme library to create bar charts and graphs
-using the Cairo drawing library.")
-    (license lgpl2.1+)))
-
 ;;; guile.scm ends here
diff --git a/gnu/packages/kde.scm b/gnu/packages/kde.scm
index 52ed93e6a7..96acf0a573 100644
--- a/gnu/packages/kde.scm
+++ b/gnu/packages/kde.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014 Andreas Enge <andreas@enge.fr>
+;;; Copyright © 2013, 2014, 2015 Andreas Enge <andreas@enge.fr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -31,6 +31,7 @@
   #:use-module (gnu packages python)
   #:use-module (gnu packages qt)
   #:use-module (gnu packages rdf)
+  #:use-module (gnu packages ruby)
   #:use-module (gnu packages video)
   #:use-module (gnu packages xml)
   #:use-module (gnu packages xorg))
@@ -60,26 +61,26 @@
 (define-public phonon
   (package
     (name "phonon")
-    (version "4.8.2")
+    (version "4.8.3")
     (source (origin
              (method url-fetch)
              (uri (string-append "http://download.kde.org/stable/" name
-                                "/" version "/"
+                                "/" version "/src/"
                                 name "-" version ".tar.xz"))
              (sha256
               (base32
-               "0xnjz7bbw393q77n4s6y9frd7l2s90635w03w9a2jr85zr89fnfg"))))
+               "05nshngk03ln90vsjz44dx8al576f4vd5fvhs1l0jmx13jb9q551"))))
     (build-system cmake-build-system)
-    ;; FIXME: Add interpreter ruby once available.
-    ;; Add optional input libqtzeitgeist.
-    (inputs
+    ;; FIXME: Add optional input libqzeitgeist once available.
+    (native-inputs
      `(("automoc4" ,automoc4)
-       ("glib" ,glib)
+       ("pkg-config" ,pkg-config)))
+    (inputs
+     `(("glib" ,glib)
        ("libx11" ,libx11)
-       ("pulseaudio" ,pulseaudio)
-       ("qt" ,qt-4)))
-    (native-inputs
-     `(("pkg-config" ,pkg-config)))
+       ("pulseaudio" ,pulseaudio)))
+    (propagated-inputs
+     `(("qt" ,qt-4))) ; according to phonon.pc
     (arguments
      `(#:tests? #f)) ; no test target
     (home-page "http://phonon.kde.org/")
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index d48a8e9633..50e90f0da3 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -28,6 +28,7 @@
   #:use-module (gnu packages gcc)
   #:use-module (gnu packages flex)
   #:use-module (gnu packages bison)
+  #:use-module (gnu packages admin)
   #:use-module (gnu packages gperf)
   #:use-module (gnu packages libusb)
   #:use-module (gnu packages ncurses)
@@ -36,6 +37,7 @@
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages python)
+  #:use-module (gnu packages slang)
   #:use-module (gnu packages algebra)
   #:use-module (gnu packages gettext)
   #:use-module (gnu packages glib)
@@ -50,6 +52,8 @@
   #:use-module (gnu packages rrdtool)
   #:use-module (gnu packages elf)
   #:use-module (gnu packages gtk)
+  #:use-module (gnu packages docbook)
+  #:use-module (gnu packages asciidoc)
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix utils)
@@ -378,41 +382,43 @@ providing the system administrator with some help in common tasks.")
 (define-public util-linux
   (package
     (name "util-linux")
-    (version "2.21")
+    (version "2.25.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://kernel.org/linux/utils/"
-                                  name "/v" version "/"
-                                  name "-" version ".2" ".tar.xz"))
+                                  name "/v" (version-major+minor version) "/"
+                                  name "-" version ".tar.xz"))
               (sha256
                (base32
-                "1rpgghf7n0zx0cdy8hibr41wvkm2qp1yvd8ab1rxr193l1jmgcir"))
-              (patches (list (search-patch "util-linux-perl.patch")))
+                "1miwwdq1zwvhf0smrxx3fjddq3mz22s8rc5cw54s7x3kbdqpyig0"))
+              (patches (list (search-patch "util-linux-tests.patch")))
               (modules '((guix build utils)))
               (snippet
-               ;; We take the 'logger' program from GNU Inetutils, so remove
-               ;; it from here.
-               '(substitute* "misc-utils/Makefile.in"
-                  (("PROGRAMS =(.*) logger(.*)" _ before after)
-                   (string-append "PROGRAMS =" before " " after))
-                  (("MANS =(.*) logger\\.1(.*)" _ before after)
-                   (string-append "MANS =" before " " after))))))
+               ;; We take the 'logger' program from GNU Inetutils and 'kill'
+               ;; from GNU Coreutils.
+               '(substitute* "configure"
+                  (("build_logger=yes") "build_logger=no")
+                  (("build_kill=yes") "build_kill=no")))))
     (build-system gnu-build-system)
     (arguments
      `(#:configure-flags '("--disable-use-tty-group"
                            "--enable-ddate")
-       #:phases (alist-cons-after
-                 'install 'patch-chkdupexe
-                 (lambda* (#:key outputs #:allow-other-keys)
-                   (let ((out (assoc-ref outputs "out")))
-                     (substitute* (string-append out "/bin/chkdupexe")
-                       ;; Allow 'patch-shebang' to do its work.
-                       (("@PERL@") "/bin/perl"))))
+       #:phases (alist-cons-before
+                 'check 'pre-check
+                 (lambda* (#:key inputs outputs #:allow-other-keys)
+                   (let ((out (assoc-ref outputs "out"))
+                         (net (assoc-ref inputs "net-base")))
+                     ;; Change the test to refer to the right file.
+                     (substitute* "tests/ts/misc/mcookie"
+                       (("/etc/services")
+                        (string-append net "/etc/services")))
+                     #t))
                  %standard-phases)))
     (inputs `(("zlib" ,guix:zlib)
               ("ncurses" ,ncurses)))
     (native-inputs
-     `(("perl" ,perl)))
+     `(("perl" ,perl)
+       ("net-base" ,net-base)))                   ;for tests
     (home-page "https://www.kernel.org/pub/linux/utils/util-linux/")
     (synopsis "Collection of utilities for the Linux kernel")
     (description
@@ -505,14 +511,14 @@ slabtop, and skill.")
 (define-public e2fsprogs
   (package
     (name "e2fsprogs")
-    (version "1.42.7")
+    (version "1.42.11")
     (source (origin
              (method url-fetch)
              (uri (string-append "mirror://sourceforge/e2fsprogs/e2fsprogs-"
                                  version ".tar.gz"))
              (sha256
               (base32
-               "0ibkkvp6kan0hn0d1anq4n2md70j5gcm7mwna515w82xwyr02rfw"))
+               "0xhbj7494g3y2w2miyrzdz6nciaffxajrs6wqm73yp4jnrqagn2b"))
              (modules '((guix build utils)))
              (snippet
               '(substitute* "MCONFIG.in"
@@ -523,10 +529,12 @@ slabtop, and skill.")
     (native-inputs `(("pkg-config" ,pkg-config)
                      ("texinfo" ,texinfo)))     ;for the libext2fs Info manual
     (arguments
-     '(;; The 'blkid' command and library are already provided by util-linux,
-       ;; which is the preferred source for them (see, e.g.,
+     '(;; util-linux is not the preferred source for some of the libraries and
+       ;; commands, so disable them (see, e.g.,
        ;; <http://git.buildroot.net/buildroot/commit/?id=e1ffc2f791b336339909c90559b7db40b455f172>.)
-       #:configure-flags '("--disable-blkid"
+       #:configure-flags '("--disable-libblkid"
+                           "--disable-libuuid" "--disable-uuidd"
+                           "--disable-fsck"
 
                            ;; Install libext2fs et al.
                            "--enable-elf-shlibs")
@@ -1718,7 +1726,11 @@ in a digital read-out.")
                  %standard-phases)
        #:make-flags (list (string-append "DESTDIR="
                                          (assoc-ref %outputs "out"))
-                          "WERROR=0")
+                          "WERROR=0"
+
+                          ;; By default, 'config/Makefile' uses lib64 on
+                          ;; x86_64.  Work around that.
+                          "lib=lib")
        #:tests? #f))                              ;no tests
     (native-inputs
      `(("pkg-config" ,pkg-config)
@@ -1729,17 +1741,18 @@ in a digital read-out.")
        ("perl" ,perl)
        ("python" ,python-2)))
     (inputs
-     `(;; ("slang" ,slang)
+     `(("slang" ,slang)                        ;for the interactive TUI
        ;; ("newt" ,newt)
+       ("python" ,python-2)                    ;'perf' links against libpython
        ("elfutils" ,elfutils)
 
-       ;; FIXME: Documentation.
-       ;; ("libxslt" ,libxslt)
-       ;; ("docbook-xml" ,docbook-xml)
-       ;; ("docbook-xsl" ,docbook-xsl)
-       ;; ("xmlto" ,xmlto)
-       ;; ("asciidoc" ,asciidoc)
-       ))
+       ;; Documentation.
+       ("libxml2" ,libxml2)                       ;for $XML_CATALOG_FILES
+       ("libxslt" ,libxslt)
+       ("docbook-xml" ,docbook-xml)
+       ("docbook-xsl" ,docbook-xsl)
+       ("xmlto" ,xmlto)
+       ("asciidoc" ,asciidoc)))
     (home-page "https://perf.wiki.kernel.org/")
     (synopsis "Linux profiling with performance counters")
     (description
diff --git a/gnu/packages/netpbm.scm b/gnu/packages/netpbm.scm
index 0fdcf4ceae..e72cf32e3f 100644
--- a/gnu/packages/netpbm.scm
+++ b/gnu/packages/netpbm.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
+;;; Copyright © 2013, 2015 Andreas Enge <andreas@enge.fr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -26,26 +26,30 @@
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages python)
   #:use-module (gnu packages xml)
+  #:use-module (guix build-system gnu)
   #:use-module ((guix licenses) #:select (gpl2))
   #:use-module (guix packages)
-  #:use-module (guix download)
-  #:use-module (guix build-system gnu))
+  #:use-module (guix svn-download))
 
 (define-public netpbm
   (package
    (name "netpbm")
    (version "10.61.01")
    (source (origin
-            (method url-fetch)
-            ;; The "super-stable" and "stable" versions do not compile
-            ;; with newer libpng; we need the "advanced" version. The tarball
-            ;; on the server is generated by sourceforge from the "advanced"
-            ;; branch of the subversion repository:
-            ;; svn checkout http://netpbm.svn.sourceforge.net/svnroot/netpbm/advanced netpbm-version
-            (uri (string-append "http://www.multiprecision.org/guix/netpbm-"
-                                version ".tar.xz"))
-            (sha256 (base32
-                     "10nwvxc85kr6vhlhhahagy7s9848bbixl54b0p4ppim4g0dl10jz"))))
+            (method svn-fetch)
+            ;; At the time of first packaging, the "super-stable" and
+            ;; "stable" versions did not compile with newer libpng;
+            ;; we needed the "advanced" version.
+            ;; The currently highest stable version is 10.47.53,
+            ;; the currently highest advanced version is 10.69.4,
+            ;; svn release 2397.
+            ;; To determine the correct release: "svn log version.mk".
+            (uri (svn-reference
+                   (url "http://svn.code.sf.net/p/netpbm/code/advanced")
+                   (revision 1832)))
+            (sha256
+              (base32
+                "1mj1pqq18yj0yb6l24zfjls7axhqmiv0pvcaabl5xvc4a0dm543j"))))
    (build-system gnu-build-system)
    (inputs `(("ghostscript" ,ghostscript)
              ("libjpeg" ,libjpeg)
@@ -64,6 +68,7 @@
        'configure
        (lambda _
         (copy-file "config.mk.in" "config.mk")
+        (chmod "config.mk" #o664)
         (let ((f (open-file "config.mk" "a")))
          (display "CC=gcc\n" f)
          (display "CFLAGS_SHLIB += -fPIC\n" f)
diff --git a/gnu/packages/nvi.scm b/gnu/packages/nvi.scm
index 8fd736d180..128715f6ac 100644
--- a/gnu/packages/nvi.scm
+++ b/gnu/packages/nvi.scm
@@ -37,7 +37,9 @@
                          ".tar.bz2"))
         (sha256
           (base32 "0nbbs1inyrqds0ywn3ln5slv54v5zraq7lszkg8nsavv4kivhh9l"))
-        (patches (list (search-patch "nvi-assume-preserve-path.patch")))
+        (patches (list (search-patch "nvi-assume-preserve-path.patch")
+                       (search-patch "nvi-dbpagesize-binpower.patch")
+                       (search-patch "nvi-db4.patch")))
         (snippet
           ;; Create a wrapper for the configure script, make it executable.
           '(let ((conf-wrap (open-output-file "configure")))
diff --git a/gnu/packages/package-management.scm b/gnu/packages/package-management.scm
index 62c6b488a6..c0df5be1a9 100644
--- a/gnu/packages/package-management.scm
+++ b/gnu/packages/package-management.scm
@@ -151,6 +151,7 @@ the Nix package manager.")
          ,@(package-native-inputs guix-0.8)))
       (propagated-inputs
        `(("guile-json" ,guile-json)
+         ("geiser" ,geiser)                       ;for guix.el
          ,@(package-propagated-inputs guix-0.8))))))
 
 (define-public guix guix-devel)
diff --git a/gnu/packages/parallel.scm b/gnu/packages/parallel.scm
index 6524110f2a..9072adae3c 100644
--- a/gnu/packages/parallel.scm
+++ b/gnu/packages/parallel.scm
@@ -27,7 +27,7 @@
 (define-public parallel
   (package
     (name "parallel")
-    (version "20141122")
+    (version "20150122")
     (source
      (origin
       (method url-fetch)
@@ -35,7 +35,7 @@
                           version ".tar.bz2"))
       (sha256
        (base32
-        "1kpd4ayd4lb867nfnpkam4b3mh86jl6cdy386x1rich938gbrg38"))))
+        "14g9pka59vln19rg6y8lyvrsc4nb3jk8y26hv3hdrf44rgwpds7d"))))
     (build-system gnu-build-system)
     (inputs `(("perl" ,perl)))
     (home-page "http://www.gnu.org/software/parallel/")
diff --git a/gnu/packages/patches/nvi-db4.patch b/gnu/packages/patches/nvi-db4.patch
new file mode 100644
index 0000000000..03b736cd08
--- /dev/null
+++ b/gnu/packages/patches/nvi-db4.patch
@@ -0,0 +1,35 @@
+This patch originates from the Debian project, see https://www.debian.org/
+
+03db4.dpatch  by  <hesso@pool.math.tu-berlin.de>
+
+
+libdb4 compatibility adjustments.
+
+In particular, this patch adds extra file permission checking and passes the
+DB_CREATE flag to the first invocation of db_open on the file's database
+structure, which rids us of the following message:
+
+  BDB0635 DB_CREATE must be specified to create databases.
+
+--- nvi-1.81.6.orig/common/msg.c	2009-02-26 14:26:58.350336128 +0100
++++ nvi-1.81.6/common/msg.c	2009-02-26 14:29:05.235335829 +0100
+@@ -724,9 +724,18 @@
+ 		p = buf;
+ 	} else
+ 		p = file;
++	if (access(p, F_OK) != 0) {
++		if (first) {
++			first = 0;
++			return (1);
++		}
++		sp->db_error = ENOENT;
++		msgq_str(sp, M_DBERR, p, "%s");
++		return (1);
++	}
+ 	if ((sp->db_error = db_create(&db, 0, 0)) != 0 ||
+ 	    (sp->db_error = db->set_re_source(db, p)) != 0 ||
+-	    (sp->db_error = db_open(db, NULL, DB_RECNO, 0, 0)) != 0) {
++	    (sp->db_error = db_open(db, NULL, DB_RECNO, DB_CREATE, 0)) != 0) {
+ 		if (first) {
+ 			first = 0;
+ 			return (1);
diff --git a/gnu/packages/patches/nvi-dbpagesize-binpower.patch b/gnu/packages/patches/nvi-dbpagesize-binpower.patch
new file mode 100644
index 0000000000..7dde693351
--- /dev/null
+++ b/gnu/packages/patches/nvi-dbpagesize-binpower.patch
@@ -0,0 +1,35 @@
+This patch originates from the Debian project, see https://www.debian.org/
+
+18dbpagesize_binpower.dpatch by  <hesso@pool.math.tu-berlin.de>
+
+
+Make sure that the pagesize passed to db__set_pagesize() is a power of two.
+
+nvi stores the content of files in BDB database structures. When initiating a
+file, it picks a page size for the database to fit the file within 15 pages,
+with a minimal page size of 1K and maximal of 10K.
+
+In vanilla nvi, this size is calculated as a multiple of 1024. Modern versions
+of BDB, however, require the page size of a database to be a power of two, which
+this patch addresses, ridding us of the following message:
+
+  BDB0511 page sizes must be a power-of-2
+
+--- nvi-1.81.6.orig/common/exf.c	2009-03-09 01:48:01.695862889 +0100
++++ nvi-1.81.6/common/exf.c	2009-03-09 10:42:41.147866272 +0100
+@@ -249,11 +249,10 @@
+ 		 * (vi should have good locality) or smaller than 1K.
+ 		 */
+ 		psize = ((sb.st_size / 15) + 1023) / 1024;
+-		if (psize > 10)
+-			psize = 10;
+-		if (psize == 0)
+-			psize = 1;
+-		psize *= 1024;
++		if (psize >= 8) psize=8<<10;
++		else if (psize >= 4) psize=4<<10;
++		else if (psize >= 2) psize=2<<10;
++		else psize=1<<10;
+ 
+ 		F_SET(ep, F_DEVSET);
+ 		ep->mdev = sb.st_dev;
diff --git a/gnu/packages/patches/pyqt-configure.patch b/gnu/packages/patches/pyqt-configure.patch
new file mode 100644
index 0000000000..b922f108d8
--- /dev/null
+++ b/gnu/packages/patches/pyqt-configure.patch
@@ -0,0 +1,15 @@
+Have configure.py modify internal variables depending on the --qml-plugindir
+configure option.
+diff -u PyQt-gpl-5.4.alt/configure.py PyQt-gpl-5.4/configure.py
+--- PyQt-gpl-5.4.alt/configure.py	2015-01-25 17:27:50.000000000 +0100
++++ PyQt-gpl-5.4/configure.py	2015-01-25 17:56:41.000000000 +0100
+@@ -904,6 +904,9 @@
+         if opts.pyuicinterpreter is not None:
+             self.pyuic_interpreter = opts.pyuicinterpreter
+ 
++        if opts.qmlplugindir is not None:
++            self.qml_plugin_dir = opts.qmlplugindir
++
+         if opts.qsciapidir is not None:
+             self.qsci_api_dir = opts.qsciapidir
+ 
diff --git a/gnu/packages/patches/util-linux-perl.patch b/gnu/packages/patches/util-linux-perl.patch
deleted file mode 100644
index c657a1b5ae..0000000000
--- a/gnu/packages/patches/util-linux-perl.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-Use this common trick that exploits similarities between sh and Perl syntax
-to avoid a hard dependency on Perl.  Instead, this script will work only
-when 'perl' is available in $PATH.
-
---- util-linux-2.21.2/misc-utils/chkdupexe.pl	2012-05-15 13:51:45.000000000 +0200
-+++ util-linux-2.21.2/misc-utils/chkdupexe.pl	2014-06-01 22:46:06.000000000 +0200
-@@ -1,5 +1,6 @@
--#!@PERL@ -w
--#
-+eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}'
-+  & eval 'exec perl -wS "$0" $argv:q'
-+    if 0;
- # chkdupexe version 2.1.1
- #
- # Simple script to look for and list duplicate executables and dangling
diff --git a/gnu/packages/patches/util-linux-tests.patch b/gnu/packages/patches/util-linux-tests.patch
new file mode 100644
index 0000000000..2ad025f66a
--- /dev/null
+++ b/gnu/packages/patches/util-linux-tests.patch
@@ -0,0 +1,30 @@
+This test checks whether 'root' is successfully translated to UID/GID 0,
+using 'getpwnam' in libmount.  This doesn't work in the chroot because
+/etc/passwd doesn't contain an entry for 'root' so skip it.
+
+
+--- util-linux-2.25.2/tests/ts/libmount/optstr	2015-01-23 13:58:41.181151194 +0100
++++ util-linux-2.25.2/tests/ts/libmount/optstr	2015-01-23 13:58:42.829161716 +0100
+@@ -84,10 +84,6 @@ ts_init_subtest "apply-user"	# add user,
+ ts_valgrind $TESTPROG --apply --user "noexec,nosuid,loop=/dev/looop0" 0x408 &> $TS_OUTPUT
+ ts_finalize_subtest
+ 
+-ts_init_subtest "fix"
+-ts_valgrind $TESTPROG --fix "uid=root,gid=root" &> $TS_OUTPUT
+-ts_finalize_subtest
+-
+ ts_init_subtest "deduplicate"
+ ts_valgrind $TESTPROG --dedup bbb,ccc,AAA,xxx,AAA=a,AAA=bbb,ddd,AAA=ccc,fff=eee AAA &> $TS_OUTPUT
+ ts_finalize_subtest
+
+
+The expected output for this test seems to lack a carriage return.
+
+--- util-linux-2.25.2/tests/expected/more/regexp	2015-01-23 14:02:21.098557632 +0100
++++ util-linux-2.25.2/tests/expected/more/regexp	2015-01-23 14:02:23.598573648 +0100
+@@ -1,4 +1,4 @@
+ 
+ ...skipping
+-foo
++
foo
+ xyzzy
diff --git a/gnu/packages/plotutils.scm b/gnu/packages/plotutils.scm
index 41df88088e..da40e28334 100644
--- a/gnu/packages/plotutils.scm
+++ b/gnu/packages/plotutils.scm
@@ -23,6 +23,9 @@
   #:use-module (guix build-system gnu)
   #:use-module (gnu packages xorg)
   #:use-module (gnu packages image)
+  #:use-module (gnu packages guile)
+  #:use-module (gnu packages gtk)
+  #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages))
 
 (define-public plotutils
@@ -62,3 +65,32 @@ graphics in many file formats.  It also has support for 2D vector graphics
 animations.  The package also contains command-line programs for plotting
 scientific data.")
     (license gpl2+)))
+
+(define-public guile-charting
+  (package
+    (name "guile-charting")
+    (version "0.2.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://wingolog.org/pub/guile-charting/"
+                                  "guile-charting-" version ".tar.gz"))
+              (sha256
+               (base32
+                "0w5qiyv9v0ip5li22x762bm48g8xnw281w66iyw094zdw611pb2m"))
+              (modules '((guix build utils)))
+              (snippet
+               '(begin
+                  ;; Use the standard location for modules.
+                  (substitute* "Makefile.in"
+                    (("godir = .*$")
+                     "godir = $(moddir)\n"))))))
+    (build-system gnu-build-system)
+    (native-inputs `(("pkg-config" ,pkg-config)))
+    (inputs `(("guile" ,guile-2.0)))
+    (propagated-inputs `(("guile-cairo" ,guile-cairo)))
+    (home-page "http://wingolog.org/software/guile-charting/")
+    (synopsis "Create charts and graphs in Guile")
+    (description
+     "Guile-Charting is a Guile Scheme library to create bar charts and graphs
+using the Cairo drawing library.")
+    (license lgpl2.1+)))
diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm
index 2f518d940d..4b306952c1 100644
--- a/gnu/packages/python.scm
+++ b/gnu/packages/python.scm
@@ -1,7 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
 ;;; Copyright © 2013, 2014 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2013, 2014 Andreas Enge <andreas@enge.fr>
+;;; Copyright © 2013, 2014, 2015 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2014 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2014, 2015 Federico Beffa <beffa@fbengineering.ch>
@@ -2064,7 +2064,7 @@ capabilities.")
 (define-public python-pyparsing
   (package
     (name "python-pyparsing")
-    (version "2.0.2")
+    (version "2.0.3")
     (source
      (origin
        (method url-fetch)
@@ -2072,7 +2072,7 @@ capabilities.")
                            "/pyparsing-" version ".tar.gz"))
        (sha256
         (base32
-         "01lasib0n2fp2k99c988qhz16lm9hcwmnmrmhybdb3jq2xmkvr0p"))))
+         "0kw4py7gn45j93q8r7bzajfrjdc3xlsn2yzln41lf9zmrghjkrq6"))))
     (build-system python-build-system)
     (outputs '("out" "doc"))
     (arguments
@@ -2788,3 +2788,63 @@ computing.")
          ,@(alist-delete "python-numpydoc"
                          (alist-delete "python-matplotlib"
                                        (package-inputs ipython))))))))
+
+(define-public python-isodate
+  (package
+    (name "python-isodate")
+    (version "0.5.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (string-append
+              "https://pypi.python.org/packages/source/i/isodate/isodate-"
+              version
+              ".tar.gz"))
+        (sha256
+          (base32
+            "1yqjn0is0p64cmk9xhq4hc6q06jk86d60kg2jws58d78q0qysami"))))
+    (build-system python-build-system)
+    (inputs
+      `(("python-setuptools" ,python-setuptools)))
+    (home-page
+      "http://cheeseshop.python.org/pypi/isodate")
+    (synopsis
+      "Python date parser and formatter")
+    (description
+      "Python-isodate is a python module for parsing and formatting
+ISO 8601 dates, time and duration.")
+    (license bsd-3)))
+
+(define-public python2-isodate
+  (package-with-python2 python-isodate))
+
+(define-public python-html5lib
+  (package
+    (name "python-html5lib")
+    (version "1.0b3")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (string-append
+              "https://pypi.python.org/packages/source/h/html5lib/html5lib-"
+              version
+              ".tar.gz"))
+        (sha256
+          (base32
+            "1l5i6xzckzx4hnh9qzv9q3kyhkgjx2hsi2k9srgci3qizjmvp6ln"))))
+    (build-system python-build-system)
+    (inputs
+      `(("python-setuptools" ,python-setuptools)))
+    (arguments
+     `(#:test-target "check"))
+    (home-page
+      "https://github.com/html5lib/html5lib-python")
+    (synopsis
+      "Python HTML parser based on the WHATWG HTML specifcation")
+    (description
+      "Html5lib is an HTML parser based on the WHATWG HTML specifcation
+and written in Python.")
+    (license expat)))
+
+(define-public python2-html5lib
+  (package-with-python2 python-html5lib))
diff --git a/gnu/packages/qt.scm b/gnu/packages/qt.scm
index 0d6bbc8fc6..cb7e367c5a 100644
--- a/gnu/packages/qt.scm
+++ b/gnu/packages/qt.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014 Andreas Enge <andreas@enge.fr>
+;;; Copyright © 2013, 2014, 2015 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -18,11 +18,13 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu packages qt)
-  #:use-module ((guix licenses) #:select (lgpl2.1 x11-style))
+  #:use-module ((guix licenses) #:select (gpl3 lgpl2.1 x11-style))
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix build utils)
   #:use-module (guix build-system gnu)
+  #:use-module (guix packages)
+  #:use-module (guix utils)
   #:use-module (gnu packages)
   #:use-module (gnu packages bison)
   #:use-module (gnu packages compression)
@@ -272,3 +274,127 @@ developers using C++ or QML, a CSS & JavaScript like language.")
                       "-no-avx"
                       "-no-neon"))))
           %standard-phases)))))
+
+(define-public python-sip
+  (package
+    (name "python-sip")
+    (version "4.16.5")
+    (source
+      (origin
+        (method url-fetch)
+        (uri
+          (string-append "mirror://sourceforge/pyqt/sip/"
+                         "sip-" version "/sip-"
+                         version ".tar.gz"))
+        (sha256
+         (base32
+          "11qy1z88py2q7rz68rm7214pbd37538hpcbfj5hhzp5y616a62x0"))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("python" ,python-wrapper)))
+    (arguments
+     `(#:tests? #f ; no check target
+       #:phases
+         (alist-replace
+          'configure
+          (lambda* (#:key inputs outputs #:allow-other-keys)
+            (let* ((out (assoc-ref outputs "out"))
+                   (bin (string-append out "/bin"))
+                   (include (string-append out "/include"))
+                   (python-version
+                     (string-take
+                       (string-take-right (assoc-ref inputs "python") 5)
+                       3))
+                   (lib (string-append out "/lib/python"
+                                       python-version
+                                       "/site-packages")))
+              (zero?
+                (system* "python" "configure.py"
+                         "--bindir" bin
+                          "--destdir" lib
+                         "--incdir" include))))
+          %standard-phases)))
+    (home-page "http://www.riverbankcomputing.com/software/sip/intro")
+    (synopsis "Python binding creator for C and C++ libraries")
+    (description
+     "SIP is a tool to create Python bindings for C and C++ libraries.  It
+was originally developed to create PyQt, the Python bindings for the Qt
+toolkit, but can be used to create bindings for any C or C++ library.
+
+SIP comprises a code generator and a Python module.  The code generator
+processes a set of specification files and generates C or C++ code, which
+is then compiled to create the bindings extension module.  The SIP Python
+module provides support functions to the automatically generated code.")
+    ;; There is a choice between a python like license, gpl2 and gpl3.
+    ;; For compatibility with pyqt, we need gpl3.
+    (license gpl3)))
+
+(define-public python2-sip
+  (package (inherit python-sip)
+    (name "python2-sip")
+    (native-inputs
+     `(("python" ,python-2)))))
+
+(define-public python-pyqt
+  (package
+    (name "python-pyqt")
+    (version "5.4")
+    (source
+      (origin
+        (method url-fetch)
+        (uri
+          (string-append "mirror://sourceforge/pyqt/PyQt5/"
+                         "PyQt-" version "/PyQt-gpl-"
+                         version ".tar.gz"))
+        (sha256
+         (base32
+          "0cbpa63whi8a5akff4pcnfwzpzx7ycac2ynj00ly52m6zbsn80kn"))
+       (patches (list (search-patch "pyqt-configure.patch")))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("python-sip" ,python-sip)
+       ("qt" ,qt))) ; for qmake
+    (inputs
+     `(("python" ,python-wrapper)))
+    (arguments
+     `(#:phases
+         (alist-replace
+         'configure
+         (lambda* (#:key inputs outputs #:allow-other-keys)
+           (let* ((out (assoc-ref outputs "out"))
+                  (bin (string-append out "/bin"))
+                  (sip (string-append out "/share/sip"))
+                  (plugins (string-append out "/plugins"))
+                  (designer (string-append plugins "/designer"))
+                  (qml (string-append plugins "/PyQt5"))
+                  (python-version
+                    (string-take
+                      (string-take-right (assoc-ref inputs "python") 5)
+                      3))
+                  (lib (string-append out "/lib/python"
+                                      python-version
+                                      "/site-packages")))
+             (zero? (system* "python" "configure.py"
+                             "--confirm-license"
+                             "--bindir" bin
+                             "--destdir" lib
+                             "--designer-plugindir" designer
+                             "--qml-plugindir" qml
+                             "--sipdir" sip))))
+         %standard-phases)))
+    (home-page "http://www.riverbankcomputing.com/software/pyqt/intro")
+    (synopsis "Python bindings for Qt")
+    (description
+     "PyQt is a set of Python v2 and v3 bindings for the Qt application
+framework.  The bindings are implemented as a set of Python modules and
+contain over 620 classes.")
+    (license gpl3)))
+
+(define-public python2-pyqt
+  (package (inherit python-pyqt)
+    (name "python2-pyqt")
+    (native-inputs
+     `(("python-sip" ,python2-sip)
+       ("qt" ,qt)))
+    (inputs
+     `(("python" ,python-2)))))
diff --git a/gnu/packages/rdf.scm b/gnu/packages/rdf.scm
index 10e67428c7..1acbd38ded 100644
--- a/gnu/packages/rdf.scm
+++ b/gnu/packages/rdf.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014 Andreas Enge <andreas@enge.fr>
+;;; Copyright © 2013, 2014, 2015 Andreas Enge <andreas@enge.fr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -17,11 +17,13 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu packages rdf)
-  #:use-module ((guix licenses) #:select (lgpl2.0+ lgpl2.1 lgpl2.1+))
+  #:use-module ((guix licenses)
+                #:select (bsd-style lgpl2.0+ lgpl2.1 lgpl2.1+))
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix build-system cmake)
   #:use-module (guix build-system gnu)
+  #:use-module (guix build-system python)
   #:use-module (gnu packages)
   #:use-module (gnu packages databases)
   #:use-module (gnu packages boost)
@@ -34,6 +36,7 @@
   #:use-module (gnu packages pcre)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages python)
   #:use-module (gnu packages qt)
   #:use-module (gnu packages xml))
 
@@ -198,3 +201,32 @@ provides a highly usable object-oriented C++/Qt4 framework for RDF data.  It
 uses different RDF storage solutions as backends through a simple plugin
 system.")
     (license lgpl2.0+)))
+
+(define-public python-rdflib
+  (package
+    (name "python-rdflib")
+    (version "4.1.2")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (string-append
+              "https://pypi.python.org/packages/source/r/rdflib/rdflib-"
+              version
+              ".tar.gz"))
+        (sha256
+          (base32
+            "0kvaf332cqbi47rqzlpdx4mbkvw12mkrzkj8n9l19wk713d4py9w"))))
+    (build-system python-build-system)
+    (inputs
+      `(("python-htm5lib" ,python-html5lib)
+        ("python-isodate" ,python-isodate)
+        ("python-pyparsing" ,python-pyparsing)
+        ("python-setuptools" ,python-setuptools)))
+    (home-page "https://github.com/RDFLib/rdflib")
+    (synopsis
+      "Python RDF library")
+    (description
+      "RDFLib is a Python library for working with RDF, a simple yet
+powerful language for representing information.")
+    (license (bsd-style "file://LICENSE"
+                        "See LICENSE in the distribution."))))
diff --git a/gnu/packages/slang.scm b/gnu/packages/slang.scm
new file mode 100644
index 0000000000..8c35c8b43e
--- /dev/null
+++ b/gnu/packages/slang.scm
@@ -0,0 +1,70 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2015 Ludovic Courtès <ludo@gnu.org>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu packages slang)
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix build-system gnu)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (gnu packages readline)
+  #:use-module (gnu packages ncurses)
+  #:use-module (gnu packages compression)
+  #:use-module (gnu packages image)
+  #:use-module (gnu packages pcre))
+
+(define-public slang
+  (package
+    (name "slang")
+    (version "2.3.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "http://www.jedsoft.org/releases/slang/slang-"
+                    version
+                    ".tar.gz"))
+              (sha256
+               (base32
+                "0aqd2cjabj6nhd4r3dc4vhqif2bf3dmqnrn2gj0xm4gqyfd177jy"))
+              (modules '((guix build utils)))
+              (snippet
+               '(begin
+                  (substitute* "src/Makefile.in"
+                    (("/bin/ln") "ln"))
+                  (substitute* "configure"
+                    (("-ltermcap") ""))))))
+    (build-system gnu-build-system)
+    (arguments
+     '(#:parallel-tests? #f))
+    (inputs
+     `(("readline" ,readline)
+       ("zlib" ,zlib)
+       ("libpng" ,libpng)
+       ("pcre" ,pcre)
+       ("ncurses" ,ncurses)))
+    (home-page "http://www.jedsoft.org/slang/")
+    (synopsis "Library for interactive applications and extensibility")
+    (description
+     "S-Lang is a multi-platform programmer's library designed to allow a
+developer to create robust multi-platform software. It provides facilities
+required by interactive applications such as display/screen management,
+keyboard input, keymaps, and so on. The most exciting feature of the library
+is the slang interpreter that may be easily embedded into a program to make it
+extensible. While the emphasis has always been on the embedded nature of the
+interpreter, it may also be used in a stand-alone fashion through the use of
+slsh, which is part of the S-Lang distribution.")
+    (license license:gpl2+)))
diff --git a/gnu/packages/version-control.scm b/gnu/packages/version-control.scm
index 59ca166416..9fc310d55d 100644
--- a/gnu/packages/version-control.scm
+++ b/gnu/packages/version-control.scm
@@ -538,14 +538,14 @@ projects, from individuals to large-scale enterprise operations.")
 (define-public rcs
   (package
     (name "rcs")
-    (version "5.9.3")
+    (version "5.9.4")
     (source (origin
              (method url-fetch)
              (uri (string-append "mirror://gnu/rcs/rcs-"
                                  version ".tar.xz"))
              (sha256
               (base32
-               "0isvzwfvqkg7zcsznra6wqh650z49ib113n7gp6ncxv5p30x3c38"))))
+               "1zsx7bb0rgvvvisiy4zlixf56ay8wbd9qqqcp1a1g0m1gl6mlg86"))))
     (build-system gnu-build-system)
     (native-inputs `(("ed" ,ed)))
     (home-page "http://www.gnu.org/software/rcs/")
diff --git a/gnu/packages/video.scm b/gnu/packages/video.scm
index 110d0995bb..9cdfbf11da 100644
--- a/gnu/packages/video.scm
+++ b/gnu/packages/video.scm
@@ -396,7 +396,7 @@ SVCD, DVD, 3ivx, DivX 3/4/5, WMV and H.264 movies.")
 (define-public youtube-dl
   (package
     (name "youtube-dl")
-    (version "2014.12.15")
+    (version "2015.01.23.4")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://youtube-dl.org/downloads/"
@@ -404,7 +404,7 @@ SVCD, DVD, 3ivx, DivX 3/4/5, WMV and H.264 movies.")
                                   version ".tar.gz"))
               (sha256
                (base32
-                "09z7v6jxs4a36kyy681mcypcqsxipplnbdy9s3rva1rpp5f74h2z"))))
+                "0pvvab9dk1righ3fa79000iz8fzdlcxakscx5sd31730c37j3kj2"))))
     (build-system python-build-system)
     (inputs `(("setuptools" ,python-setuptools)))
     (home-page "http://youtube-dl.org")
@@ -413,3 +413,58 @@ SVCD, DVD, 3ivx, DivX 3/4/5, WMV and H.264 movies.")
      "youtube-dl is a small command-line program to download videos from
 YouTube.com and a few more sites.")
     (license public-domain)))
+
+(define-public libdvdread
+  (package
+    (name "libdvdread")
+    (version "5.0.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://download.videolan.org/videolan/"
+                                  name "/" version "/"
+                                  name "-" version ".tar.bz2"))
+              (sha256
+               (base32
+                "052z62l3x8ka5jpf5bi1mzp5p323n1z9rxj74nq5c35a88x1myv6"))))
+    (build-system gnu-build-system)
+    (home-page "http://dvdnav.mplayerhq.hu/")
+    (synopsis "Library for reading video DVDs")
+    (description
+     "Libdvdread provides a simple foundation for reading DVD video
+disks.  It provides the functionality that is required to access many
+DVDs.  It parses IFO files, reads NAV-blocks, and performs CSS
+authentication and descrambling (if an external libdvdcss library is
+installed).")
+    (license gpl2+)))
+
+(define-public libdvdnav
+  (package
+    (name "libdvdnav")
+    (version "5.0.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://download.videolan.org/videolan/"
+                                  name "/" version "/"
+                                  name "-" version ".tar.bz2"))
+              (sha256
+               (base32
+                "1ad2lkkiydgwiyqfysra9lkwjv9yqnvcg4hv92hx8qzics1cpcbj"))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (inputs
+     `(("libdvdread" ,libdvdread)))
+    (home-page "http://dvdnav.mplayerhq.hu/")
+    (synopsis "Library for video DVD navigation features")
+    (description
+     "Libdvdnav is a library for developers of multimedia
+applications.  It allows easy use of sophisticated DVD navigation features
+such as DVD menus, multiangle playback and even interactive DVD games.  All
+this functionality is provided through a simple API which provides the DVD
+playback as a single logical stream of blocks, intermitted by special
+dvdnav events to report certain conditions.  The main usage of libdvdnav is
+a loop regularly calling a function to get the next block, surrounded by
+additional calls to tell the library of user interaction.  The whole
+DVD virtual machine and internal playback states are completely
+encapsulated.")
+    (license gpl2+)))
diff --git a/gnu/packages/xnee.scm b/gnu/packages/xnee.scm
index 795f355d09..4e9135dd5b 100644
--- a/gnu/packages/xnee.scm
+++ b/gnu/packages/xnee.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2015 Andreas Enge <andreas@enge.fr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -21,30 +22,32 @@
   #:use-module (guix licenses)
   #:use-module (guix download)
   #:use-module (guix build-system gnu)
-  #:use-module (gnu packages xorg)
-  #:use-module (gnu packages pkg-config))
+  #:use-module (gnu packages gtk)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages xorg))
 
 (define-public xnee
   (package
     (name "xnee")
-    (version "3.18")
+    (version "3.19")
     (source (origin
              (method url-fetch)
              (uri (string-append "mirror://gnu/xnee/xnee-"
                                  version ".tar.gz"))
              (sha256
               (base32
-               "0j6b27ry0w765040089ppwwdl313xfgn31yh3fpqy4gk0jv23m94"))))
+               "04n2lac0vgpv8zsn7nmb50hf3qb56pmj90dmwnivg09gyrf1x92j"))))
     (build-system gnu-build-system)
     (inputs
-     `(("recordproto" ,recordproto)
+     `(("gtk+", gtk+-2)
        ("inputproto" ,inputproto)
+       ("libx11" ,libx11)
+       ("libxext" ,libxext)
        ("libxi" ,libxi)
        ("libxtst" ,libxtst)
+       ("recordproto" ,recordproto)
        ("xextproto" ,xextproto)
-       ("libxext" ,libxext)
-       ("xproto" ,xproto)
-       ("libx11" ,libx11)))
+       ("xproto" ,xproto)))
     (native-inputs
       `(("pkg-config" ,pkg-config)))
     (home-page "http://www.gnu.org/software/xnee/")
diff --git a/gnu/services/base.scm b/gnu/services/base.scm
index d55eb3a5f9..17dd0fb599 100644
--- a/gnu/services/base.scm
+++ b/gnu/services/base.scm
@@ -598,7 +598,7 @@ GUIX."
 failed to register hydra.gnu.org public key: ~a~%" status))))))))
 
 (define* (guix-service #:key (guix guix) (builder-group "guixbuild")
-                       (build-accounts 10) authorize-hydra-key?
+                       (build-accounts 10) (authorize-hydra-key? #t)
                        (use-substitutes? #t)
                        (extra-options '()))
   "Return a service that runs the build daemon from @var{guix}, and has
diff --git a/gnu/services/dbus.scm b/gnu/services/dbus.scm
index d97c54cc5d..671dafa194 100644
--- a/gnu/services/dbus.scm
+++ b/gnu/services/dbus.scm
@@ -40,15 +40,18 @@
 @var{services}."
   (define build
     #~(begin
-        (use-modules (sxml simple))
+        (use-modules (sxml simple)
+                     (srfi srfi-1))
 
         (define (services->sxml services)
           ;; Return the SXML 'includedir' clauses for DIRS.
           `(busconfig
-            ,@(map (lambda (dir)
-                     `(includedir ,(string-append dir
-                                                  "/etc/dbus-1/system.d")))
-                   services)))
+            ,@(append-map (lambda (dir)
+                            `((includedir
+                               ,(string-append dir "/etc/dbus-1/system.d"))
+                              (servicedir         ;for '.service' files
+                               ,(string-append dir "/share/dbus-1/services"))))
+                          services)))
 
         (mkdir #$output)
         (copy-file (string-append #$dbus "/etc/dbus-1/system.conf")
diff --git a/gnu/system.scm b/gnu/system.scm
index 78c63bb477..52698c9e22 100644
--- a/gnu/system.scm
+++ b/gnu/system.scm
@@ -372,6 +372,36 @@ This is the GNU system.  Welcome.\n")
   "Return the default /etc/hosts file."
   (text-file "hosts" (local-host-aliases host-name)))
 
+(define (emacs-site-file)
+  "Return the Emacs 'site-start.el' file.  That file contains the necessary
+settings for 'guix.el' to work out-of-the-box."
+  (gexp->file "site-start.el"
+              #~(progn
+                 ;; Add the "normal" elisp directory to the search path;
+                 ;; guix.el may be there.
+                 (add-to-list
+                  'load-path
+                  "/run/current-system/profile/share/emacs/site-lisp")
+
+                 ;; Attempt to load guix.el.
+                 (require 'guix-init nil t)
+
+                 (when (require 'geiser-guile nil t)
+                   ;; Make sure Geiser's Scheme modules are in Guile's search
+                   ;; path.
+                   (add-to-list
+                    'geiser-guile-load-path
+                    "/run/current-system/profile/share/geiser/guile")))))
+
+(define (emacs-site-directory)
+  "Return the Emacs site directory, aka. /etc/emacs."
+  (mlet %store-monad ((file (emacs-site-file)))
+    (gexp->derivation "emacs"
+                      #~(begin
+                          (mkdir #$output)
+                          (chdir #$output)
+                          (symlink #$file "site-start.el")))))
+
 (define* (etc-directory #:key
                         (locale "C") (timezone "Europe/Paris")
                         (issue "Hello!\n")
@@ -390,6 +420,7 @@ This is the GNU system.  Welcome.\n")
 /bin/sh
 /run/current-system/profile/bin/sh
 /run/current-system/profile/bin/bash\n"))
+       (emacs      (emacs-site-directory))
        (issue      (text-file "issue" issue))
 
        ;; For now, generate a basic config so that /etc/hosts is honored.
@@ -410,12 +441,20 @@ export PATH=$HOME/.guix-profile/bin:/run/current-system/profile/bin
 export PATH=/run/setuid-programs:/run/current-system/profile/sbin:$PATH
 export MANPATH=$HOME/.guix-profile/share/man:/run/current-system/profile/share/man
 export INFOPATH=$HOME/.guix-profile/share/info:/run/current-system/profile/share/info
+
+# Append the directory of 'site-start.el' to the search path.
+export EMACSLOADPATH=:/etc/emacs
+
+# By default, applications that use D-Bus, such as Emacs, abort at startup
+# when /etc/machine-id is missing.  Make sure these warnings are non-fatal.
+export DBUS_FATAL_WARNINGS=0
 "))
        (skel      (skeleton-directory skeletons)))
     (file-union "etc"
                 `(("services" ,#~(string-append #$net-base "/etc/services"))
                   ("protocols" ,#~(string-append #$net-base "/etc/protocols"))
                   ("rpc" ,#~(string-append #$net-base "/etc/rpc"))
+                  ("emacs" ,#~#$emacs)
                   ("pam.d" ,#~#$pam.d)
                   ("login.defs" ,#~#$login.defs)
                   ("issue" ,#~#$issue)
diff --git a/gnu/system/install.scm b/gnu/system/install.scm
index 35462fff75..98b9d9de2b 100644
--- a/gnu/system/install.scm
+++ b/gnu/system/install.scm
@@ -29,6 +29,7 @@
   #:use-module (gnu packages disk)
   #:use-module (gnu packages grub)
   #:use-module (gnu packages texinfo)
+  #:use-module (gnu packages compression)
   #:export (installation-os))
 
 ;;; Commentary:
@@ -42,10 +43,14 @@
   "Return a script that spawns the Info reader on the right section of the
 manual."
   (gexp->script "log-to-info"
-                #~(execl (string-append #$texinfo-4 "/bin/info") "info"
-                         "-d" "/run/current-system/profile/share/info"
-                         "-f" (string-append #$guix "/share/info/guix.info")
-                         "-n" "System Installation")))
+                #~(begin
+                    ;; 'gunzip' is needed to decompress the doc.
+                    (setenv "PATH" (string-append #$gzip "/bin"))
+
+                    (execl (string-append #$texinfo-4 "/bin/info") "info"
+                           "-d" "/run/current-system/profile/share/info"
+                           "-f" (string-append #$guix "/share/info/guix.info")
+                           "-n" "System Installation"))))
 
 (define %backing-directory
   ;; Sub-directory used as the backing store for copy-on-write.
diff --git a/gnu/system/os-config.tmpl b/gnu/system/os-config.tmpl
index 662f085bfd..07b099531e 100644
--- a/gnu/system/os-config.tmpl
+++ b/gnu/system/os-config.tmpl
@@ -1,6 +1,8 @@
 ;; This is an operating system configuration template.
 
 (use-modules (gnu))
+(use-service-modules xorg networking dbus avahi)
+(use-package-modules avahi)
 
 (operating-system
   (host-name "antelope")
@@ -31,4 +33,12 @@
                 ;; and access the webcam.
                 (supplementary-groups '("wheel"
                                         "audio" "video"))
-                (home-directory "/home/alice")))))
+                (home-directory "/home/alice"))))
+
+  ;; Add services to the baseline: the SLiM log-in manager
+  ;; for Xorg sessions, a DHCP client, Avahi, and D-Bus.
+  (services (cons* (slim-service)
+                   (dhcp-client-service)
+                   (avahi-service)
+                   (dbus-service (list avahi))
+                   %base-services)))
diff --git a/guix/build/glib-or-gtk-build-system.scm b/guix/build/glib-or-gtk-build-system.scm
index a404a84f3f..92e91bf7a5 100644
--- a/guix/build/glib-or-gtk-build-system.scm
+++ b/guix/build/glib-or-gtk-build-system.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014 Federico Beffa <beffa@fbengineering.ch>
-;;; Copyright © 2014 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -72,7 +72,7 @@ with all found directories."
 ;; http://www.freedesktop.org/wiki/DesktopThemeSpec
 ;; http://freedesktop.org/wiki/Specifications/sound-theme-spec
 ;; http://freedesktop.org/wiki/Specifications/icon-theme-spec
-;; 
+;;
 ;; Currently desktop themes are not well supported and do not honor
 ;; XDG_DATA_DIRS.  One example is evince which only looks for desktop themes
 ;; in $HOME/.themes (for backward compatibility) and in XDG_DATA_HOME (which
@@ -92,7 +92,8 @@ in INPUTS.  Return a list with all found directories."
                    (subdirectory-exists? datadir "/themes")
                    (subdirectory-exists? datadir "/cursors")
                    (subdirectory-exists? datadir "/wallpapers")
-                   (subdirectory-exists? datadir "/icons"))                   
+                   (subdirectory-exists? datadir "/icons")
+                   (subdirectory-exists? datadir "/mime")) ;shared-mime-info
                (not (directory-included? datadir previous)))
           (cons datadir previous)
           previous)))
diff --git a/guix/derivations.scm b/guix/derivations.scm
index 4c34fcb4b8..edf6b57e86 100644
--- a/guix/derivations.scm
+++ b/guix/derivations.scm
@@ -21,6 +21,8 @@
   #:use-module (srfi srfi-9)
   #:use-module (srfi srfi-9 gnu)
   #:use-module (srfi srfi-26)
+  #:use-module (srfi srfi-34)
+  #:use-module (srfi srfi-35)
   #:use-module (rnrs io ports)
   #:use-module (rnrs bytevectors)
   #:use-module (ice-9 match)
@@ -59,6 +61,13 @@
             derivation-input-sub-derivations
             derivation-input-output-paths
 
+            &derivation-error
+            derivation-error?
+            derivation-error-derivation
+            &derivation-missing-output-error
+            derivation-missing-output-error?
+            derivation-missing-output
+
             derivation-name
             derivation-output-names
             fixed-output-derivation?
@@ -98,6 +107,18 @@
   #:replace (build-derivations))
 
 ;;;
+;;; Error conditions.
+;;;
+
+(define-condition-type &derivation-error &nix-error
+  derivation-error?
+  (derivation derivation-error-derivation))
+
+(define-condition-type &derivation-missing-output-error &derivation-error
+  derivation-missing-output-error?
+  (output derivation-missing-output))
+
+;;;
 ;;; Nix derivations, as implemented in Nix's `derivations.cc'.
 ;;;
 
@@ -509,9 +530,15 @@ that form."
         (cut write-derivation drv <>))))))
 
 (define* (derivation->output-path drv #:optional (output "out"))
-  "Return the store path of its output OUTPUT."
-  (let ((outputs (derivation-outputs drv)))
-    (and=> (assoc-ref outputs output) derivation-output-path)))
+  "Return the store path of its output OUTPUT.  Raise a
+'&derivation-missing-output-error' condition if OUTPUT is not an output of
+DRV."
+  (let ((output* (assoc-ref (derivation-outputs drv) output)))
+    (if output*
+        (derivation-output-path output*)
+        (raise (condition (&derivation-missing-output-error
+                           (derivation drv)
+                           (output output)))))))
 
 (define (derivation->output-paths drv)
   "Return the list of name/path pairs of the outputs of DRV."
diff --git a/guix/nar.scm b/guix/nar.scm
index bab727e65d..43e5210752 100644
--- a/guix/nar.scm
+++ b/guix/nar.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014 Mark H Weaver <mhw@netris.org>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -211,7 +211,9 @@ s-expression"))
                 (_ "importing file or directory '~a'...~%")
                 file)
 
-        (let ((sig (and has-sig? (read-string port))))
+        ;; The signature may contain characters that are meant to be
+        ;; interpreted as bytes in a 'char *', so read them as a ISO-8859-1.
+        (let ((sig (and has-sig? (read-latin1-string port))))
           (when verify-signature?
             (if sig
                 (begin
diff --git a/guix/packages.scm b/guix/packages.scm
index de87681fcd..96f3adfc32 100644
--- a/guix/packages.scm
+++ b/guix/packages.scm
@@ -135,7 +135,13 @@
   (method    origin-method)                       ; procedure
   (sha256    origin-sha256)                       ; bytevector
   (file-name origin-file-name (default #f))       ; optional file name
-  (patches   origin-patches (default '()))        ; list of file names
+
+  ;; Patches are delayed so that the 'search-patch' calls are made lazily,
+  ;; which reduces I/O on startup and allows patch-not-found errors to be
+  ;; gracefully handled at run time.
+  (patches   origin-patches                       ; list of file names
+             (default '()) (delayed))
+
   (snippet   origin-snippet (default #f))         ; sexp or #f
   (patch-flags  origin-patch-flags                ; list of strings
                 (default '("-p1")))
@@ -157,7 +163,7 @@
     (($ <origin> uri method sha256 file-name patches)
      (simple-format port "#<origin ~s ~a ~s ~a>"
                     uri (bytevector->base32-string sha256)
-                    patches
+                    (force patches)
                     (number->string (object-address origin) 16)))))
 
 (set-record-type-printer! <origin> print-origin)
@@ -937,10 +943,10 @@ cross-compilation target triplet."
 SOURCE is a file name, return either the interned file name (if SOURCE is
 outside of the store) or SOURCE itself (if SOURCE is already a store item.)"
   (match source
-    (($ <origin> uri method sha256 name () #f)
+    (($ <origin> uri method sha256 name (= force ()) #f)
      ;; No patches, no snippet: this is a fixed-output derivation.
      (method uri 'sha256 sha256 name #:system system))
-    (($ <origin> uri method sha256 name (patches ...) snippet
+    (($ <origin> uri method sha256 name (= force (patches ...)) snippet
         (flags ...) inputs (modules ...) (imported-modules ...)
         guile-for-build)
      ;; Patches and/or a snippet.
diff --git a/guix/records.scm b/guix/records.scm
index e7b86af9aa..fd17e135e1 100644
--- a/guix/records.scm
+++ b/guix/records.scm
@@ -42,6 +42,103 @@
                        (format #f fmt args ...)
                        form))))
 
+(define* (make-syntactic-constructor type name ctor fields
+                                     #:key (thunked '()) (defaults '())
+                                     (delayed '()))
+  "Make the syntactic constructor NAME for TYPE, that calls CTOR, and expects
+all of FIELDS to be initialized.  DEFAULTS is the list of FIELD/DEFAULT-VALUE
+tuples, THUNKED is the list of identifiers of thunked fields, and DELAYED is
+the list of identifiers of delayed fields."
+  (with-syntax ((type     type)
+                (name     name)
+                (ctor     ctor)
+                (expected fields)
+                (defaults defaults))
+    #`(define-syntax name
+        (lambda (s)
+          (define (record-inheritance orig-record field+value)
+            ;; Produce code that returns a record identical to ORIG-RECORD,
+            ;; except that values for the FIELD+VALUE alist prevail.
+            (define (field-inherited-value f)
+              (and=> (find (lambda (x)
+                             (eq? f (car (syntax->datum x))))
+                           field+value)
+                     car))
+
+            ;; Make sure there are no unknown field names.
+            (let* ((fields     (map (compose car syntax->datum) field+value))
+                   (unexpected (lset-difference eq? fields 'expected)))
+              (when (pair? unexpected)
+                (record-error 'name s "extraneous field initializers ~a"
+                              unexpected)))
+
+            #`(make-struct type 0
+                           #,@(map (lambda (field index)
+                                     (or (field-inherited-value field)
+                                         #`(struct-ref #,orig-record
+                                                       #,index)))
+                                   'expected
+                                   (iota (length 'expected)))))
+
+          (define (thunked-field? f)
+            (memq (syntax->datum f) '#,thunked))
+
+          (define (delayed-field? f)
+            (memq (syntax->datum f) '#,delayed))
+
+          (define (wrap-field-value f value)
+            (cond ((thunked-field? f)
+                   #`(lambda () #,value))
+                  ((delayed-field? f)
+                   #`(delay #,value))
+                  (else value)))
+
+          (define (field-bindings field+value)
+            ;; Return field to value bindings, for use in 'let*' below.
+            (map (lambda (field+value)
+                   (syntax-case field+value ()
+                     ((field value)
+                      #`(field
+                         #,(wrap-field-value #'field #'value)))))
+                 field+value))
+
+          (syntax-case s (inherit #,@fields)
+            ((_ (inherit orig-record) (field value) (... ...))
+             #`(let* #,(field-bindings #'((field value) (... ...)))
+                 #,(record-inheritance #'orig-record
+                                       #'((field value) (... ...)))))
+            ((_ (field value) (... ...))
+             (let ((fields (map syntax->datum #'(field (... ...))))
+                   (dflt   (map (match-lambda
+                                 ((f v)
+                                  (list (syntax->datum f) v)))
+                                #'defaults)))
+
+               (define (field-value f)
+                 (or (and=> (find (lambda (x)
+                                    (eq? f (car (syntax->datum x))))
+                                  #'((field value) (... ...)))
+                            car)
+                     (let ((value
+                            (car (assoc-ref dflt (syntax->datum f)))))
+                       (wrap-field-value f value))))
+
+               (let ((fields (append fields (map car dflt))))
+                 (cond ((lset= eq? fields 'expected)
+                        #`(let* #,(field-bindings
+                                   #'((field value) (... ...)))
+                            (ctor #,@(map field-value 'expected))))
+                       ((pair? (lset-difference eq? fields 'expected))
+                        (record-error 'name s
+                                      "extraneous field initializers ~a"
+                                      (lset-difference eq? fields
+                                                       'expected)))
+                       (else
+                        (record-error 'name s
+                                      "missing field initializers ~a"
+                                      (lset-difference eq? 'expected
+                                                       fields))))))))))))
+
 (define-syntax define-record-type*
   (lambda (s)
     "Define the given record type such that an additional \"syntactic
@@ -71,6 +168,9 @@ The 'port' field is \"thunked\", meaning that calls like '(thing-port x)' will
 actually compute the field's value in the current dynamic extent, which is
 useful when referring to fluids in a field's value.
 
+A field can also be marked as \"delayed\" instead of \"thunked\", in which
+case its value is effectively wrapped in a (delay …) form.
+
 It is possible to copy an object 'x' created with 'thing' like this:
 
   (thing (inherit x) (name \"bar\"))
@@ -78,98 +178,6 @@ It is possible to copy an object 'x' created with 'thing' like this:
 This expression returns a new object equal to 'x' except for its 'name'
 field."
 
-    (define (make-syntactic-constructor type name ctor fields thunked defaults)
-      "Make the syntactic constructor NAME for TYPE, that calls CTOR, and
-expects all of FIELDS to be initialized.  DEFAULTS is the list of
-FIELD/DEFAULT-VALUE tuples, and THUNKED is the list of identifiers of
-thunked fields."
-      (with-syntax ((type     type)
-                    (name     name)
-                    (ctor     ctor)
-                    (expected fields)
-                    (defaults defaults))
-        #`(define-syntax name
-            (lambda (s)
-              (define (record-inheritance orig-record field+value)
-                ;; Produce code that returns a record identical to
-                ;; ORIG-RECORD, except that values for the FIELD+VALUE alist
-                ;; prevail.
-                (define (field-inherited-value f)
-                  (and=> (find (lambda (x)
-                                 (eq? f (car (syntax->datum x))))
-                               field+value)
-                         car))
-
-                ;; Make sure there are no unknown field names.
-                (let* ((fields     (map (compose car syntax->datum)
-                                        field+value))
-                       (unexpected (lset-difference eq? fields 'expected)))
-                  (when (pair? unexpected)
-                    (record-error 'name s "extraneous field initializers ~a"
-                                  unexpected)))
-
-                #`(make-struct type 0
-                               #,@(map (lambda (field index)
-                                         (or (field-inherited-value field)
-                                             #`(struct-ref #,orig-record
-                                                           #,index)))
-                                       'expected
-                                       (iota (length 'expected)))))
-
-              (define (thunked-field? f)
-                (memq (syntax->datum f) '#,thunked))
-
-              (define (field-bindings field+value)
-                ;; Return field to value bindings, for use in 'let*' below.
-                (map (lambda (field+value)
-                       (syntax-case field+value ()
-                         ((field value)
-                          #`(field
-                             #,(if (thunked-field? #'field)
-                                   #'(lambda () value)
-                                   #'value)))))
-                     field+value))
-
-              (syntax-case s (inherit #,@fields)
-                ((_ (inherit orig-record) (field value) (... ...))
-                 #`(let* #,(field-bindings #'((field value) (... ...)))
-                     #,(record-inheritance #'orig-record
-                                           #'((field value) (... ...)))))
-                ((_ (field value) (... ...))
-                 (let ((fields (map syntax->datum #'(field (... ...))))
-                       (dflt   (map (match-lambda
-                                     ((f v)
-                                      (list (syntax->datum f) v)))
-                                    #'defaults)))
-
-                   (define (field-value f)
-                     (or (and=> (find (lambda (x)
-                                        (eq? f (car (syntax->datum x))))
-                                      #'((field value) (... ...)))
-                                car)
-                         (let ((value
-                                (car (assoc-ref dflt
-                                                (syntax->datum f)))))
-                           (if (thunked-field? f)
-                               #`(lambda () #,value)
-                               value))))
-
-                   (let ((fields (append fields (map car dflt))))
-                     (cond ((lset= eq? fields 'expected)
-                            #`(let* #,(field-bindings
-                                       #'((field value) (... ...)))
-                                (ctor #,@(map field-value 'expected))))
-                           ((pair? (lset-difference eq? fields 'expected))
-                            (record-error 'name s
-                                          "extraneous field initializers ~a"
-                                          (lset-difference eq? fields
-                                                           'expected)))
-                           (else
-                            (record-error 'name s
-                                          "missing field initializers ~a"
-                                          (lset-difference eq? 'expected
-                                                           fields))))))))))))
-
     (define (field-default-value s)
       (syntax-case s (default)
         ((field (default val) _ ...)
@@ -178,6 +186,15 @@ thunked fields."
          (field-default-value #'(field options ...)))
         (_ #f)))
 
+    (define (delayed-field? s)
+      ;; Return the field name if the field defined by S is delayed.
+      (syntax-case s (delayed)
+        ((field (delayed) _ ...)
+         #'field)
+        ((field _ options ...)
+         (delayed-field? #'(field options ...)))
+        (_ #f)))
+
     (define (thunked-field? s)
       ;; Return the field name if the field defined by S is thunked.
       (syntax-case s (thunked)
@@ -187,9 +204,12 @@ thunked fields."
          (thunked-field? #'(field options ...)))
         (_ #f)))
 
-    (define (thunked-field-accessor-name field)
+    (define (wrapped-field? s)
+      (or (thunked-field? s) (delayed-field? s)))
+
+    (define (wrapped-field-accessor-name field)
       ;; Return the name (an unhygienic syntax object) of the "real"
-      ;; getter for field, which is assumed to be a thunked field.
+      ;; getter for field, which is assumed to be a wrapped field.
       (syntax-case field ()
         ((field get options ...)
          (let* ((getter      (syntax->datum #'get))
@@ -202,8 +222,8 @@ thunked fields."
       (syntax-case field ()
         ((name get options ...)
          #`(name
-            #,(if (thunked-field? field)
-                  (thunked-field-accessor-name field)
+            #,(if (wrapped-field? field)
+                  (wrapped-field-accessor-name field)
                   #'get)))))
 
     (define (thunked-field-accessor-definition field)
@@ -211,15 +231,29 @@ thunked fields."
       ;; thunked field.
       (syntax-case field ()
         ((name get _ ...)
-         (with-syntax ((real-get (thunked-field-accessor-name field)))
+         (with-syntax ((real-get (wrapped-field-accessor-name field)))
            #'(define-inlinable (get x)
                ;; The real value of that field is a thunk, so call it.
                ((real-get x)))))))
 
+    (define (delayed-field-accessor-definition field)
+      ;; Return the real accessor for FIELD, which is assumed to be a
+      ;; delayed field.
+      (syntax-case field ()
+        ((name get _ ...)
+         (with-syntax ((real-get (wrapped-field-accessor-name field)))
+           #'(define-inlinable (get x)
+               ;; The real value of that field is a promise, so force it.
+               (force (real-get x)))))))
+
     (syntax-case s ()
       ((_ type syntactic-ctor ctor pred
           (field get options ...) ...)
-       (let* ((field-spec #'((field get options ...) ...)))
+       (let* ((field-spec #'((field get options ...) ...))
+              (thunked    (filter-map thunked-field? field-spec))
+              (delayed    (filter-map delayed-field? field-spec))
+              (defaults   (filter-map field-default-value
+                                      #'((field options ...) ...))))
          (with-syntax (((field-spec* ...)
                         (map field-spec->srfi-9 field-spec))
                        ((thunked-field-accessor ...)
@@ -227,19 +261,25 @@ thunked fields."
                                       (and (thunked-field? field)
                                            (thunked-field-accessor-definition
                                             field)))
+                                    field-spec))
+                       ((delayed-field-accessor ...)
+                        (filter-map (lambda (field)
+                                      (and (delayed-field? field)
+                                           (delayed-field-accessor-definition
+                                            field)))
                                     field-spec)))
            #`(begin
                (define-record-type type
                  (ctor field ...)
                  pred
                  field-spec* ...)
-               (begin thunked-field-accessor ...)
+               (begin thunked-field-accessor ...
+                      delayed-field-accessor ...)
                #,(make-syntactic-constructor #'type #'syntactic-ctor #'ctor
                                              #'(field ...)
-                                             (filter-map thunked-field? field-spec)
-                                             (filter-map field-default-value
-                                                         #'((field options ...)
-                                                            ...))))))))))
+                                             #:thunked thunked
+                                             #:delayed delayed
+                                             #:defaults defaults))))))))
 
 (define* (alist->record alist make keys
                         #:optional (multiple-value-keys '()))
diff --git a/guix/scripts/lint.scm b/guix/scripts/lint.scm
index 15ae213339..229b73702e 100644
--- a/guix/scripts/lint.scm
+++ b/guix/scripts/lint.scm
@@ -1,7 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014 Cyril Roelandt <tipecaml@gmail.com>
 ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
-;;; Copyright © 2013, 2014 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -20,6 +20,7 @@
 
 (define-module (guix scripts lint)
   #:use-module (guix base32)
+  #:use-module (guix download)
   #:use-module (guix packages)
   #:use-module (guix records)
   #:use-module (guix ui)
@@ -31,12 +32,14 @@
   #:use-module (ice-9 format)
   #:use-module (web uri)
   #:use-module ((guix build download)
-                #:select (open-connection-for-uri))
+                #:select (maybe-expand-mirrors
+                          open-connection-for-uri))
   #:use-module (web request)
   #:use-module (web response)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-9)
   #:use-module (srfi srfi-11)
+  #:use-module (srfi srfi-26)
   #:use-module (srfi srfi-37)
   #:export (guix-lint
             check-description-style
@@ -254,45 +257,54 @@ response from URI, and additional details, such as the actual HTTP response."
       (_
        (values 'not-http #f)))))
 
+(define (validate-uri uri package field)
+  "Return #t if the given URI can be reached, otherwise emit a
+warning for PACKAGE mentionning the FIELD."
+  (let-values (((status argument)
+                (probe-uri uri)))
+    (case status
+      ((http-response)
+       (or (= 200 (response-code argument))
+           (emit-warning package
+                         (format #f
+                                 (_ "URI ~a not reachable: ~a (~s)")
+                                 (uri->string uri)
+                                 (response-code argument)
+                                 (response-reason-phrase argument))
+                         field)))
+      ((getaddrinfo-error)
+       (emit-warning package
+                     (format #f
+                             (_ "URI ~a domain not found: ~a")
+                             (uri->string uri)
+                             (gai-strerror (car argument)))
+                     field)
+       #f)
+      ((system-error)
+       (emit-warning package
+                     (format #f
+                             (_ "URI ~a unreachable: ~a")
+                             (uri->string uri)
+                             (strerror
+                              (system-error-errno
+                               (cons status argument))))
+                     field)
+       #f)
+      ((invalid-http-response gnutls-error)
+       ;; Probably a misbehaving server; ignore.
+       #f)
+      ((not-http)                             ;nothing we can do
+       #f)
+      (else
+       (error "internal linter error" status)))))
+
 (define (check-home-page package)
   "Emit a warning if PACKAGE has an invalid 'home-page' field, or if that
 'home-page' is not reachable."
   (let ((uri (and=> (package-home-page package) string->uri)))
     (cond
      ((uri? uri)
-      (let-values (((status argument)
-                    (probe-uri uri)))
-        (case status
-          ((http-response)
-           (unless (= 200 (response-code argument))
-             (emit-warning package
-                           (format #f
-                                   (_ "home page ~a not reachable: ~a (~s)")
-                                   (uri->string uri)
-                                   (response-code argument)
-                                   (response-reason-phrase argument))
-                           'home-page)))
-          ((getaddrinfo-error)
-           (emit-warning package
-                         (format #f
-                                 (_ "home page domain not found: ~a")
-                                 (gai-strerror (car argument)))
-                         'package))
-          ((system-error)
-           (emit-warning package
-                         (format #f
-                                 (_ "home page unreachable: ~a")
-                                 (strerror
-                                  (system-error-errno
-                                   (cons status argument))))
-                         'home-page))
-          ((invalid-http-response gnutls-error)
-           ;; Probably a misbehaving server; ignore.
-           #f)
-          ((not-http)                             ;nothing we can do
-           #f)
-          (else
-           (error "internal home-page linter error" status)))))
+      (validate-uri uri package 'home-page))
      ((not (package-home-page package))
       (unless (or (string-contains (package-name package) "bootstrap")
                   (string=? (package-name package) "ld-wrapper"))
@@ -375,6 +387,22 @@ descriptions maintained upstream."
                  (location->string loc) (package-full-name package)
                  (fill-paragraph (escape-quotes upstream) 77 7)))))))
 
+(define (check-source package)
+  "Emit a warning if PACKAGE has an invalid 'source' field, or if that
+'source' is not reachable."
+  (let ((origin (package-source package)))
+    (when (and origin
+               (eqv? (origin-method origin) url-fetch))
+      (let* ((strings (origin-uri origin))
+             (uris (if (list? strings)
+                       (map string->uri strings)
+                       (list (string->uri strings)))))
+        ;; Just make sure that at least one of the URIs is valid.
+        (any (cut validate-uri <> package 'source)
+             (append-map (cut maybe-expand-mirrors <> %mirrors)
+                         uris))))))
+
+
 
 ;;;
 ;;; List of checkers.
@@ -403,6 +431,10 @@ descriptions maintained upstream."
      (description "Validate home-page URLs")
      (check       check-home-page))
    (lint-checker
+     (name        'source)
+     (description "Validate source URLs")
+     (check       check-source))
+   (lint-checker
      (name        'synopsis)
      (description "Validate package synopses")
      (check       check-synopsis-style))))
diff --git a/guix/scripts/package.scm b/guix/scripts/package.scm
index 30b0658198..1ff898d8dd 100644
--- a/guix/scripts/package.scm
+++ b/guix/scripts/package.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
 ;;; Copyright © 2013 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2014 Alex Kost <alezost@gmail.com>
@@ -331,6 +331,11 @@ an output path different than CURRENT-PATH."
 ;;; Search paths.
 ;;;
 
+(define-syntax-rule (with-null-error-port exp)
+  "Evaluate EXP with the error port pointing to the bit bucket."
+  (with-error-to-port (%make-void-port "w")
+    (lambda () exp)))
+
 (define* (search-path-environment-variables entries profile
                                             #:optional (getenv getenv))
   "Return environment variable definitions that may be needed for the use of
@@ -373,9 +378,14 @@ current settings and report only settings not already effective."
                (files  (if pattern
                            (map (cut string-append <> "/") files)
                            files))
-               (path   (search-path-as-list files (list profile)
-                                            #:type type
-                                            #:pattern pattern)))
+
+               ;; XXX: Silence 'find-files' when it stumbles upon non-existent
+               ;; directories (see
+               ;; <http://lists.gnu.org/archive/html/guix-devel/2015-01/msg00269.html>.)
+               (path   (with-null-error-port
+                        (search-path-as-list files (list profile)
+                                             #:type type
+                                             #:pattern pattern))))
           (if (every (cut member <> values) path)
               #f
               (format #f "export ~a=\"~a\""
diff --git a/guix/scripts/system.scm b/guix/scripts/system.scm
index b0974dcfcd..3eea872fe8 100644
--- a/guix/scripts/system.scm
+++ b/guix/scripts/system.scm
@@ -76,11 +76,14 @@
                   file (strerror err))))
         (('syntax-error proc message properties form . rest)
          (let ((loc (source-properties->location properties)))
-           (leave (_ "~a: ~a~%")
-                  (location->string loc) message)))
-        (_
-         (leave (_ "failed to load operating system file '~a': ~s~%")
-                file args))))))
+           (format (current-error-port) (_ "~a: error: ~a~%")
+                   (location->string loc) message)
+           (exit 1)))
+        ((error args ...)
+         (report-error (_ "failed to load operating system file '~a':~%")
+                       file)
+         (apply display-error #f (current-error-port) args)
+         (exit 1))))))
 
 
 ;;;
diff --git a/guix/serialization.scm b/guix/serialization.scm
index 64eacf974c..e36751ec1b 100644
--- a/guix/serialization.scm
+++ b/guix/serialization.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -102,10 +102,16 @@
 (define (read-latin1-string p)
   (let* ((len (read-int p))
          (m   (modulo len 8))
-         (str (get-string-n p len)))
+         ;; Note: do not use 'get-string-n' to work around Guile bug
+         ;; <http://bugs.gnu.org/19621>.  See <http://bugs.gnu.org/19610> for
+         ;; a discussion.
+         (str (get-bytevector-n p len)))
     (or (zero? m)
         (get-bytevector-n p (- 8 m)))
-    str))
+
+    ;; XXX: Rewrite using (ice-9 iconv) when the minimum requirement is
+    ;; upgraded to Guile >= 2.0.9.
+    (list->string (map integer->char (bytevector->u8-list str)))))
 
 (define (write-string-list l p)
   (write-int (length l) p)
diff --git a/guix/store.scm b/guix/store.scm
index c3a1c57943..a12abc8671 100644
--- a/guix/store.scm
+++ b/guix/store.scm
@@ -862,23 +862,26 @@ be used internally by the daemon's build hook."
 (define-alias store-return state-return)
 (define-alias store-bind state-bind)
 
+(define (preserve-documentation original proc)
+  "Return PROC with documentation taken from ORIGINAL."
+  (set-object-property! proc 'documentation
+                        (procedure-property original 'documentation))
+  proc)
+
 (define (store-lift proc)
   "Lift PROC, a procedure whose first argument is a connection to the store,
 in the store monad."
-  (define result
-    (lambda args
-      (lambda (store)
-        (values (apply proc store args) store))))
-
-  (set-object-property! result 'documentation
-                        (procedure-property proc 'documentation))
-  result)
+  (preserve-documentation proc
+                          (lambda args
+                            (lambda (store)
+                              (values (apply proc store args) store)))))
 
 (define (store-lower proc)
   "Lower PROC, a monadic procedure in %STORE-MONAD, to a \"normal\" procedure
 taking the store as its first argument."
-  (lambda (store . args)
-    (run-with-store store (apply proc args))))
+  (preserve-documentation proc
+                          (lambda (store . args)
+                            (run-with-store store (apply proc args)))))
 
 ;;
 ;; Store monad operators.
@@ -914,10 +917,14 @@ permission bits are kept."
                          (guile-for-build (%guile-for-build))
                          (system (%current-system)))
   "Run MVAL, a monadic value in the store monad, in STORE, an open store
-connection."
+connection, and return the result."
   (parameterize ((%guile-for-build guile-for-build)
                  (%current-system system))
-    (run-with-state mval store)))
+    (call-with-values (lambda ()
+                        (run-with-state mval store))
+      (lambda (result store)
+        ;; Discard the state.
+        result))))
 
 
 ;;;
diff --git a/guix/ui.scm b/guix/ui.scm
index 5bd4d1f8c2..04c50f4827 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -43,6 +43,7 @@
   #:export (_
             N_
             P_
+            report-error
             leave
             show-version-and-exit
             show-bug-report-information
@@ -248,6 +249,10 @@ interpreted."
              ;; FIXME: Server-provided error messages aren't i18n'd.
              (leave (_ "build failed: ~a~%")
                     (nix-protocol-error-message c)))
+            ((derivation-missing-output-error? c)
+             (leave (_ "reference to invalid output '~a' of derivation '~a'~%")
+                    (derivation-missing-output c)
+                    (derivation-file-name (derivation-error-derivation c))))
             ((message-condition? c)
              ;; Normally '&message' error conditions have an i18n'd message.
              (leave (_ "~a~%")
@@ -308,9 +313,8 @@ available for download."
         (const #f)))
 
   (define (built-or-substitutable? drv)
-    (let ((out (derivation->output-path drv)))
-      ;; If DRV has zero outputs, OUT is #f.
-      (or (not out)
+    (or (null? (derivation-outputs drv))
+        (let ((out (derivation->output-path drv))) ;XXX: assume "out" exists
           (or (valid-path? store out)
               (substitutable? out)))))
 
diff --git a/tests/packages.scm b/tests/packages.scm
index bd5ba3ee92..65e5cc3cdd 100644
--- a/tests/packages.scm
+++ b/tests/packages.scm
@@ -42,6 +42,7 @@
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-26)
   #:use-module (srfi srfi-34)
+  #:use-module (srfi srfi-35)
   #:use-module (srfi srfi-64)
   #:use-module (rnrs io ports)
   #:use-module (ice-9 regex)
@@ -248,6 +249,36 @@
          (string=? (derivation->output-path drv)
                    (package-output %store package "out")))))
 
+(test-assert "patch not found yields a run-time error"
+  (guard (c ((condition-has-type? c &message)
+             (and (string-contains (condition-message c)
+                                   "does-not-exist.patch")
+                  (string-contains (condition-message c)
+                                   "not found"))))
+    (let ((p (package
+               (inherit (dummy-package "p"))
+               (source (origin
+                         (method (const #f))
+                         (uri "http://whatever")
+                         (patches
+                          (list (search-patch "does-not-exist.patch")))
+                         (sha256
+                          (base32
+                           "0amn0bbwqvsvvsh6drfwz20ydc2czk374lzw5kksbh6bf78k4ks4")))))))
+      (package-derivation %store p)
+      #f)))
+
+(test-assert "reference to non-existent output"
+  ;; See <http://bugs.gnu.org/19630>.
+  (let* ((dep (dummy-package "dep"))
+         (p   (dummy-package "p"
+                (inputs `(("dep" ,dep "non-existent"))))))
+    (guard (c ((derivation-missing-output-error? c)
+               (and (string=? (derivation-missing-output c) "non-existent")
+                    (equal? (package-derivation %store dep)
+                            (derivation-error-derivation c)))))
+      (package-derivation %store p))))
+
 (test-assert "trivial"
   (let* ((p (package (inherit (dummy-package "trivial"))
               (build-system trivial-build-system)
diff --git a/tests/records.scm b/tests/records.scm
index e90d33d15d..a00e38db7d 100644
--- a/tests/records.scm
+++ b/tests/records.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -139,6 +139,51 @@
              (parameterize ((mark (cons 'a 'b)))
                (eq? (foo-baz y) (mark))))))))
 
+(test-assert "define-record-type* & delayed"
+  (begin
+    (define-record-type* <foo> foo make-foo
+      foo?
+      (bar foo-bar (delayed)))
+
+    (let* ((calls 0)
+           (x     (foo (bar (begin (set! calls (1+ calls)) 3)))))
+      (and (zero? calls)
+           (equal? (foo-bar x) 3) (= 1 calls)
+           (equal? (foo-bar x) 3) (= 1 calls)
+           (equal? (foo-bar x) 3) (= 1 calls)))))
+
+(test-assert "define-record-type* & delayed & default"
+  (let ((mark #f))
+    (define-record-type* <foo> foo make-foo
+      foo?
+      (bar foo-bar (delayed) (default mark)))
+
+    (let ((x (foo)))
+      (set! mark 42)
+      (and (equal? (foo-bar x) 42)
+           (begin
+             (set! mark 7)
+             (equal? (foo-bar x) 42))))))
+
+(test-assert "define-record-type* & delayed & inherited"
+  (begin
+    (define-record-type* <foo> foo make-foo
+      foo?
+      (bar foo-bar (delayed))
+      (baz foo-baz (delayed)))
+
+    (let* ((m 1)
+           (n #f)
+           (x (foo (bar m) (baz n)))
+           (y (foo (inherit x) (baz 'b))))
+      (set! n 'a)
+      (and (equal? (foo-bar x) 1)
+           (eq? (foo-baz x) 'a)
+           (begin
+             (set! m 777)
+             (equal? (foo-bar y) 1))              ;promise was already forced
+           (eq? (foo-baz y) 'b)))))
+
 (test-assert "define-record-type* & missing initializers"
   (catch 'syntax-error
     (lambda ()
diff --git a/tests/syscalls.scm b/tests/syscalls.scm
index 21d6637ff6..f26331e164 100644
--- a/tests/syscalls.scm
+++ b/tests/syscalls.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -91,15 +91,15 @@
            (system-error-errno args)))))
 
 (test-skip (if (zero? (getuid)) 1 0))
-(test-equal "set-network-interface-flags"
-  EPERM
+(test-assert "set-network-interface-flags"
   (let ((sock (socket AF_INET SOCK_STREAM 0)))
     (catch 'system-error
       (lambda ()
         (set-network-interface-flags sock "lo" IFF_UP))
       (lambda args
         (close-port sock)
-        (system-error-errno args)))))
+        ;; We get EPERM with Linux 3.18ish and EACCES with 2.6.32.
+        (memv (system-error-errno args) (list EPERM EACCES))))))
 
 (test-equal "network-interface-address lo"
   (make-socket-address AF_INET (inet-pton AF_INET "127.0.0.1") 0)
@@ -108,8 +108,7 @@
     (close-port sock)
     addr))
 
-(test-equal "set-network-interface-address"
-  EPERM
+(test-assert "set-network-interface-address"
   (let ((sock (socket AF_INET SOCK_STREAM 0)))
     (catch 'system-error
       (lambda ()
@@ -120,7 +119,8 @@
                                         0)))
       (lambda args
         (close-port sock)
-        (system-error-errno args)))))
+        ;; We get EPERM with Linux 3.18ish and EACCES with 2.6.32.
+        (memv (system-error-errno args) (list EPERM EACCES))))))
 
 (test-end)