summary refs log tree commit diff
diff options
context:
space:
mode:
authorMark H Weaver <mhw@netris.org>2016-01-19 00:18:37 -0500
committerMark H Weaver <mhw@netris.org>2016-01-19 00:18:37 -0500
commitafe9f409491a055e5d058c8f747e80d1506391e5 (patch)
tree3b3747c9d2df32019a46b283b94f0a7af05ebf1d
parentbb8afbf5a1fbc85f700c0e07ce5581637e3674dc (diff)
parent1348185ac2bb48b373495830267cff8ddc6b1fa5 (diff)
downloadguix-afe9f409491a055e5d058c8f747e80d1506391e5.tar.gz
Merge branch 'master' into core-updates
-rw-r--r--Makefile.am32
-rw-r--r--NEWS1
-rw-r--r--build-aux/compile-all.scm82
-rw-r--r--doc/emacs.texi15
-rw-r--r--doc/guix.texi64
-rw-r--r--emacs.am1
-rw-r--r--emacs/guix-base.el25
-rw-r--r--emacs/guix-main.scm77
-rw-r--r--emacs/guix-messages.el42
-rw-r--r--emacs/guix-profiles.el7
-rw-r--r--emacs/guix-ui-generation.el62
-rw-r--r--emacs/guix-ui-package.el24
-rw-r--r--emacs/guix-ui-system-generation.el105
-rw-r--r--gnu-system.am3
-rw-r--r--gnu/build/linux-modules.scm78
-rw-r--r--gnu/packages/admin.scm61
-rw-r--r--gnu/packages/bioinformatics.scm77
-rw-r--r--gnu/packages/calendar.scm77
-rw-r--r--gnu/packages/databases.scm6
-rw-r--r--gnu/packages/datamash.scm5
-rw-r--r--gnu/packages/dav.scm108
-rw-r--r--gnu/packages/docker.scm107
-rw-r--r--gnu/packages/emacs.scm6
-rw-r--r--gnu/packages/games.scm6
-rw-r--r--gnu/packages/gnome.scm27
-rw-r--r--gnu/packages/gnupg.scm6
-rw-r--r--gnu/packages/linux.scm17
-rw-r--r--gnu/packages/music.scm29
-rw-r--r--gnu/packages/ocaml.scm105
-rw-r--r--gnu/packages/openstack.scm155
-rw-r--r--gnu/packages/patches/bowtie-fix-makefile.patch31
-rw-r--r--gnu/packages/python.scm756
-rw-r--r--gnu/packages/rsync.scm5
-rw-r--r--gnu/packages/ruby.scm64
-rw-r--r--gnu/packages/ssh.scm6
-rw-r--r--gnu/packages/statistics.scm4
-rw-r--r--gnu/packages/sxiv.scm6
-rw-r--r--gnu/packages/version-control.scm31
-rw-r--r--gnu/packages/video.scm60
-rw-r--r--gnu/system.scm41
-rw-r--r--gnu/system/linux-initrd.scm4
-rw-r--r--guix/import/cran.scm11
-rw-r--r--guix/import/gem.scm3
-rw-r--r--guix/import/utils.scm14
-rw-r--r--guix/scripts/system.scm85
-rw-r--r--test-env.in11
-rw-r--r--tests/derivations.scm18
47 files changed, 2158 insertions, 402 deletions
diff --git a/Makefile.am b/Makefile.am
index 6e9deeb3d8..74bc8b5948 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -164,11 +164,6 @@ endif BUILD_DAEMON_OFFLOAD
 # Internal module with test suite support.
 dist_noinst_DATA = guix/tests.scm
 
-# Because of the autoload hack in (guix build download), we must build it
-# first to avoid errors on systems where (gnutls) is unavailable.
-guix/scripts/download.go: guix/build/download.go
-guix/download.go: guix/build/download.go
-
 # Linux-Libre configurations.
 KCONFIGS =					\
   gnu/packages/linux-libre-i686.conf		\
@@ -325,6 +320,7 @@ EXTRA_DIST =						\
   CODE-OF-CONDUCT					\
   .dir-locals.el					\
   build-aux/build-self.scm				\
+  build-aux/compile-all.scm				\
   build-aux/hydra/gnu-system.scm			\
   build-aux/hydra/demo-os.scm				\
   build-aux/hydra/guix.scm				\
@@ -364,31 +360,21 @@ CLEANFILES =					\
   $(GOBJECTS)					\
   $(SCM_TESTS:tests/%.scm=%.log)
 
-AM_V_GUILEC = $(AM_V_GUILEC_$(V))
-AM_V_GUILEC_ = $(AM_V_GUILEC_$(AM_DEFAULT_VERBOSITY))
-AM_V_GUILEC_0 = @echo "  GUILEC" $@;
-
-# Flags passed to 'guild compile'.
-GUILD_COMPILE_FLAGS =				\
-  -Wformat -Wunbound-variable -Warity-mismatch
-
 # 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 "$@"` ;			\
+%.go: make-go ; @:
+make-go: $(MODULES) guix/config.scm guix/tests.scm
+	$(AM_V_at)echo "Compiling Scheme modules..." ;			\
 	unset GUILE_LOAD_COMPILED_PATH ;				\
-	LC_ALL=C							\
+	host=$(host) srcdir="$(top_srcdir)"				\
 	$(top_builddir)/pre-inst-env					\
-	$(GUILD) compile -L "$(top_builddir)" -L "$(top_srcdir)"	\
-	  $(GUILD_COMPILE_FLAGS) --target="$(host)"			\
-	  -o "$@" "$<"
+	$(GUILE) -L "$(top_builddir)" -L "$(top_srcdir)"		\
+	  --no-auto-compile 						\
+	  -s "$(top_srcdir)"/build-aux/compile-all.scm $^
 
 SUFFIXES = .go
 
@@ -480,6 +466,6 @@ assert-final-inputs-self-contained:
 	$(top_builddir)/pre-inst-env "$(GUILE)"				\
 	  "$(top_srcdir)/build-aux/check-final-inputs-self-contained.scm"
 
-.PHONY: sync-descriptions gen-ChangeLog gen-AUTHORS clean-go
+.PHONY: sync-descriptions gen-ChangeLog gen-AUTHORS clean-go make-go
 .PHONY: assert-no-store-file-names assert-binaries-available
 .PHONY: assert-final-inputs-self-contained
diff --git a/NEWS b/NEWS
index c35c7d67b9..0084394941 100644
--- a/NEWS
+++ b/NEWS
@@ -14,6 +14,7 @@ Please send Guix bug reports to bug-guix@gnu.org.
 
 ** Package management
 
+*** Emacs interface for system generations
 *** Emacs interface for hydra.gnu.org
 *** Changes in Emacs interface variables
 In the following names, BUFFER-TYPE means "info" or "list";
diff --git a/build-aux/compile-all.scm b/build-aux/compile-all.scm
new file mode 100644
index 0000000000..e0877dbe8c
--- /dev/null
+++ b/build-aux/compile-all.scm
@@ -0,0 +1,82 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(use-modules (system base target)
+             (ice-9 match)
+             (ice-9 threads)
+             (guix build utils))
+
+(define compile-options '(format unbound-variable arity-mismatch))
+
+(define host (getenv "host"))
+
+(define srcdir (getenv "srcdir"))
+
+(define (relative-file file)
+  (if (string-prefix? (string-append srcdir "/") file)
+      (string-drop file (+ 1 (string-length srcdir)))
+      file))
+
+(define (file-mtime<? f1 f2)
+  (< (stat:mtime (stat f1))
+     (stat:mtime (stat f2))))
+
+(define (scm->go file)
+  (let* ((relative (relative-file file))
+         (without-extension (string-drop-right relative 4)))
+    (string-append without-extension ".go")))
+
+(define (file-needs-compilation? file)
+  (let ((go (scm->go file)))
+    (or (not (file-exists? go))
+        (file-mtime<? go file))))
+
+(define (file->module file)
+  (let* ((relative (relative-file file))
+         (module-path (string-drop-right relative 4)))
+    (map string->symbol
+         (string-split module-path #\/))))
+
+;;; To work around <http://bugs.gnu.org/15602> (FIXME), we want to load all
+;;; files to be compiled first.  We do this via resolve-interface so that the
+;;; top-level of each file (module) is only executed once.
+(define (load-module-file file)
+  (let ((module (file->module file)))
+    (format #t "  LOAD     ~a~%" module)
+    (resolve-interface module)))
+
+(define (compile-file* file output-mutex)
+  (let ((go (scm->go file)))
+    (with-mutex output-mutex
+      (format #t "  GUILEC   ~a~%" go)
+      (force-output))
+    (mkdir-p (dirname go))
+    (with-target host
+      (lambda ()
+        (compile-file file
+                      #:output-file go
+                      #:opts compile-options)))))
+
+(match (command-line)
+  ((_ . files)
+   (let ((files (filter file-needs-compilation? files)))
+     (for-each load-module-file files)
+     (let ((mutex (make-mutex)))
+       (par-for-each (lambda (file)
+                       (compile-file* file mutex))
+                     files)))))
diff --git a/doc/emacs.texi b/doc/emacs.texi
index ea340b19fe..eb470ab4ca 100644
--- a/doc/emacs.texi
+++ b/doc/emacs.texi
@@ -155,7 +155,7 @@ Display all installed packages.
 Display obsolete packages (the packages that are installed in a profile
 but cannot be found among available packages).
 
-@item M-x guix-search-by-name
+@item M-x guix-packages-by-name
 Display package(s) with the specified name.
 
 @item M-x guix-search-by-regexp
@@ -163,6 +163,11 @@ Search for packages by a specified regexp.  By default ``name'',
 ``synopsis'' and ``description'' of the packages will be searched.  This
 can be changed by modifying @code{guix-package-search-params} variable.
 
+@item M-x guix-search-by-name
+Search for packages with names matching a specified regexp.  This
+command is the same as @code{guix-search-by-regexp}, except only a
+package ``name'' is searched.
+
 @end table
 
 By default, these commands display each output on a separate line.  If
@@ -191,6 +196,14 @@ date/time prompt,,, org, The Org Manual}).
 
 @end table
 
+Analogously on GuixSD you can also display system generations:
+
+@table @kbd
+@item M-x guix-system-generations
+@item M-x guix-last-system-generations
+@item M-x guix-system-generations-by-time
+@end table
+
 You can also invoke the @command{guix pull} command (@pxref{Invoking
 guix pull}) from Emacs using:
 
diff --git a/doc/guix.texi b/doc/guix.texi
index e583e8c389..592ec3cb1d 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -502,6 +502,13 @@ on a recent machine; subsequent runs will be faster because the store
 that is created for test purposes will already have various things in
 cache.
 
+It is also possible to run a subset of the tests by defining the
+@code{TESTS} makefile variable as in this example:
+
+@example
+make check TESTS="tests/store.scm tests/cpio.scm"
+@end example
+
 Upon failure, please email @email{bug-guix@@gnu.org} and attach the
 @file{test-suite.log} file.  When @file{tests/@var{something}.scm}
 fails, please also attach the @file{@var{something}.log} file available
@@ -627,6 +634,11 @@ This way, the value of @code{TMPDIR} does not leak inside build
 environments, which avoids discrepancies in cases where build processes
 capture the name of their build tree.
 
+@vindex http_proxy
+The daemon also honors the @code{http_proxy} environment variable for
+HTTP downloads it performs, be it for fixed-output derivations
+(@pxref{Derivations}) or for substitutes (@pxref{Substitutes}).
+
 If you are installing Guix as an unprivileged user, it is still possible
 to run @command{guix-daemon} provided you pass @code{--disable-chroot}.
 However, build processes will not be isolated from one another, and not
@@ -1678,6 +1690,14 @@ Guix ignores substitutes that are not signed, or that are not signed by
 one of the keys listed in the ACL.  It also detects and raises an error
 when attempting to use a substitute that has been tampered with.
 
+@vindex http_proxy
+Substitutes are downloaded over HTTP.  The @code{http_proxy} environment
+variable can be set in the environment of @command{guix-daemon} and is
+honored for downloads of substitutes.  Note that the value of
+@code{http_proxy} in the environment where @command{guix build},
+@command{guix package}, and other client commands are run has
+@emph{absolutely no effect}.
+
 The substitute mechanism can be disabled globally by running
 @code{guix-daemon} with @code{--no-substitutes} (@pxref{Invoking
 guix-daemon}).  It can also be disabled temporarily by passing the
@@ -8842,6 +8862,50 @@ The @code{base-initrd} procedure also handles common use cases that
 involves using the system as a QEMU guest, or as a ``live'' system whose
 root file system is volatile.
 
+The initial RAM disk produced by @code{base-initrd} honors several
+options passed on the Linux kernel command line (that is, arguments
+passed @i{via} GRUB's @code{linux} command, or with QEMU's
+@code{-append} option), notably:
+
+@table @code
+@item --load=@var{boot}
+Tell the initial RAM disk to load @var{boot}, a file containing a Scheme
+program, once it has mounted the root file system.
+
+GuixSD uses this option to yield control to a boot program that runs the
+service activation programs and then spawns GNU@tie{}dmd, the
+initialization system.
+
+@item --root=@var{root}
+Mount @var{root} as the root file system.  @var{root} can be a device
+device name like @code{/dev/sda1}, a partition label, or a partition
+UUID.
+
+@item --system=@var{system}
+Have @file{/run/booted-system} and @file{/run/current-system} point to
+@var{system}.
+
+@item modprobe.blacklist=@var{modules}@dots{}
+@cindex module, black-listing
+@cindex black list, of kernel modules
+Instruct the initial RAM disk as well as the @command{modprobe} command
+(from the kmod package) to refuse to load @var{modules}.  @var{modules}
+must be a comma-separated list of module names---e.g.,
+@code{usbkbd,9pnet}.
+
+@item --repl
+Start a read-eval-print loop (REPL) from the initial RAM disk before it
+tries to load kernel modules and to mount the root file system.  Our
+marketing team calls it @dfn{boot-to-Guile}.  The Schemer in you will
+love it.  @xref{Using Guile Interactively,,, guile, GNU Guile Reference
+Manual}, for more information on Guile's REPL.
+
+@end table
+
+Now that you know all the features that initial RAM disks produced by
+@code{base-initrd} provide, here is how to use it and customize it
+further.
+
 @deffn {Monadic Procedure} base-initrd @var{file-systems} @
        [#:qemu-networking? #f] [#:virtio? #f] [#:volatile-root? #f] @
        [#:extra-modules '()] [#:mapped-devices '()]
diff --git a/emacs.am b/emacs.am
index 85165b9368..d0d4dfb9bd 100644
--- a/emacs.am
+++ b/emacs.am
@@ -47,6 +47,7 @@ ELFILES =					\
   emacs/guix-ui.el				\
   emacs/guix-ui-package.el			\
   emacs/guix-ui-generation.el			\
+  emacs/guix-ui-system-generation.el		\
   emacs/guix-utils.el
 
 if HAVE_EMACS
diff --git a/emacs/guix-base.el b/emacs/guix-base.el
index dae658ebfa..d720a87833 100644
--- a/emacs/guix-base.el
+++ b/emacs/guix-base.el
@@ -1,6 +1,6 @@
 ;;; guix-base.el --- Common definitions   -*- lexical-binding: t -*-
 
-;; Copyright © 2014, 2015 Alex Kost <alezost@gmail.com>
+;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
 
 ;; This file is part of GNU Guix.
 
@@ -91,14 +91,25 @@ For the meaning of location, see `guix-find-location'."
   "Return the file name of a PROFILE's GENERATION."
   (format "%s-%s-link" profile generation))
 
-(defun guix-manifest-file (profile &optional generation)
+(defun guix-packages-profile (profile &optional generation system?)
+  "Return a directory where packages are installed for the
+PROFILE's GENERATION.
+
+If SYSTEM? is non-nil, then PROFILE is considered to be a system
+profile.  Unlike usual profiles, for a system profile, packages
+are placed in 'profile' subdirectory."
+  (let ((profile (if generation
+                     (guix-generation-file profile generation)
+                   profile)))
+    (if system?
+        (expand-file-name "profile" profile)
+      profile)))
+
+(defun guix-manifest-file (profile &optional generation system?)
   "Return the file name of a PROFILE's manifest.
-If GENERATION number is specified, return manifest file name for
-this generation."
+See `guix-packages-profile'."
   (expand-file-name "manifest"
-                    (if generation
-                        (guix-generation-file profile generation)
-                      profile)))
+                    (guix-packages-profile profile generation system?)))
 
 ;;;###autoload
 (defun guix-edit (id-or-name)
diff --git a/emacs/guix-main.scm b/emacs/guix-main.scm
index 8c38e7cae3..236c882e3c 100644
--- a/emacs/guix-main.scm
+++ b/emacs/guix-main.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014, 2015 Alex Kost <alezost@gmail.com>
+;;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -61,7 +61,8 @@
  (guix scripts lint)
  (guix scripts package)
  (guix scripts pull)
- (gnu packages))
+ (gnu packages)
+ (gnu system))
 
 (define-syntax-rule (first-or-false lst)
   (and (not (null? lst))
@@ -137,28 +138,26 @@ return two values: name and version.  For example, for SPEC
 (define (manifest-entries->package-specifications entries)
   (map manifest-entry->package-specification entries))
 
-(define (generation-package-specifications profile number)
-  "Return a list of package specifications for generation NUMBER."
-  (let ((manifest (profile-manifest
-                   (generation-file-name profile number))))
+(define (profile-package-specifications profile)
+  "Return a list of package specifications for PROFILE."
+  (let ((manifest (profile-manifest profile)))
     (manifest-entries->package-specifications
      (manifest-entries manifest))))
 
-(define (generation-package-specifications+paths profile number)
-  "Return a list of package specifications and paths for generation NUMBER.
+(define (profile->specifications+paths profile)
+  "Return a list of package specifications and paths for PROFILE.
 Each element of the list is a list of the package specification and its path."
-  (let ((manifest (profile-manifest
-                   (generation-file-name profile number))))
+  (let ((manifest (profile-manifest profile)))
     (map (lambda (entry)
            (list (manifest-entry->package-specification entry)
                  (manifest-entry-item entry)))
          (manifest-entries manifest))))
 
-(define (generation-difference profile number1 number2)
-  "Return a list of package specifications for outputs installed in generation
-NUMBER1 and not installed in generation NUMBER2."
-  (let ((specs1 (generation-package-specifications profile number1))
-        (specs2 (generation-package-specifications profile number2)))
+(define (profile-difference profile1 profile2)
+  "Return a list of package specifications for outputs installed in PROFILE1
+and not installed in PROFILE2."
+  (let ((specs1 (profile-package-specifications profile1))
+        (specs2 (profile-package-specifications profile2)))
     (lset-difference string=? specs1 specs2)))
 
 (define (manifest-entries->hash-table entries)
@@ -670,7 +669,6 @@ ENTRIES is a list of installed manifest entries."
        (id               . ,(apply-to-rest ids->package-patterns))
        (name             . ,(apply-to-rest specifications->package-patterns))
        (installed        . ,manifest-package-proc)
-       (generation       . ,manifest-package-proc)
        (obsolete         . ,(apply-to-first obsolete-package-patterns))
        (regexp           . ,regexp-proc)
        (all-available    . ,all-proc)
@@ -679,7 +677,6 @@ ENTRIES is a list of installed manifest entries."
        (id               . ,(apply-to-rest ids->output-patterns))
        (name             . ,(apply-to-rest specifications->output-patterns))
        (installed        . ,manifest-output-proc)
-       (generation       . ,manifest-output-proc)
        (obsolete         . ,(apply-to-first obsolete-output-patterns))
        (regexp           . ,regexp-proc)
        (all-available    . ,all-proc)
@@ -694,16 +691,13 @@ ENTRIES is a list of installed manifest entries."
                               search-type search-vals)
   "Return information about packages or package outputs.
 See 'entry-sexps' for details."
-  (let* ((profile (if (eq? search-type 'generation)
-                      (generation-file-name profile (car search-vals))
-                      profile))
-         (manifest (profile-manifest profile))
+  (let* ((manifest (profile-manifest profile))
          (patterns (if (and (eq? entry-type 'output)
-                            (eq? search-type 'generation-diff))
+                            (eq? search-type 'profile-diff))
                        (match search-vals
-                         ((g1 g2)
+                         ((p1 p2)
                           (map specification->output-pattern
-                               (generation-difference profile g1 g2)))
+                               (profile-difference p1 p2)))
                          (_ '()))
                        (apply (patterns-maker entry-type search-type)
                               manifest search-vals)))
@@ -765,6 +759,38 @@ See 'entry-sexps' for details."
                                     params)))
     (map ->sexp generations)))
 
+(define system-generation-boot-parameters
+  (memoize
+   (lambda (profile generation)
+     "Return boot parameters for PROFILE's system GENERATION."
+     (let* ((gen-file   (generation-file-name profile generation))
+            (param-file (string-append gen-file "/parameters")))
+       (call-with-input-file param-file read-boot-parameters)))))
+
+(define (system-generation-param-alist profile)
+  "Return an alist of system generation parameters and procedures for
+PROFILE."
+  (append (generation-param-alist profile)
+          `((label       . ,(lambda (gen)
+                              (boot-parameters-label
+                               (system-generation-boot-parameters
+                                profile gen))))
+            (root-device . ,(lambda (gen)
+                              (boot-parameters-root-device
+                               (system-generation-boot-parameters
+                                profile gen))))
+            (kernel      . ,(lambda (gen)
+                              (boot-parameters-kernel
+                               (system-generation-boot-parameters
+                                profile gen)))))))
+
+(define (system-generation-sexps profile params search-type search-vals)
+  "Return an alist with information about system generations."
+  (let ((generations (find-generations profile search-type search-vals))
+        (->sexp (object-transformer (system-generation-param-alist profile)
+                                    params)))
+    (map ->sexp generations)))
+
 
 ;;; Getting package/output/generation entries (alists).
 
@@ -809,6 +835,9 @@ parameter/value pairs."
     ((generation)
      (generation-sexps profile params
                        search-type search-vals))
+    ((system-generation)
+     (system-generation-sexps profile params
+                              search-type search-vals))
     (else (entry-type-error entry-type))))
 
 
diff --git a/emacs/guix-messages.el b/emacs/guix-messages.el
index eb2a76e216..c4f15dcac2 100644
--- a/emacs/guix-messages.el
+++ b/emacs/guix-messages.el
@@ -55,14 +55,7 @@
      (obsolete
       (0 "No obsolete packages in profile '%s'." profile)
       (1 "A single obsolete package in profile '%s'." profile)
-      (many "%d obsolete packages in profile '%s'." count profile))
-     (generation
-      (0 "No packages installed in generation %d of profile '%s'."
-         val profile)
-      (1 "A single package installed in generation %d of profile '%s'."
-         val profile)
-      (many "%d packages installed in generation %d of profile '%s'."
-            count val profile)))
+      (many "%d obsolete packages in profile '%s'." count profile)))
 
     (output
      (id
@@ -91,14 +84,7 @@
       (0 "No obsolete package outputs in profile '%s'." profile)
       (1 "A single obsolete package output in profile '%s'." profile)
       (many "%d obsolete package outputs in profile '%s'." count profile))
-     (generation
-      (0 "No package outputs installed in generation %d of profile '%s'."
-         val profile)
-      (1 "A single package output installed in generation %d of profile '%s'."
-         val profile)
-      (many "%d package outputs installed in generation %d of profile '%s'."
-            count val profile))
-     (generation-diff
+     (profile-diff
       guix-message-outputs-by-diff))
 
     (generation
@@ -183,25 +169,27 @@ Try \"M-x guix-search-by-name\"."
                      "matching time period '%s' - '%s'.")
              str-beg profile time-beg time-end)))
 
-(defun guix-message-outputs-by-diff (profile entries generations)
-  "Display a message for outputs searched by GENERATIONS difference."
+(defun guix-message-outputs-by-diff (_ entries profiles)
+  "Display a message for outputs searched by PROFILES difference."
   (let* ((count (length entries))
          (str-beg (guix-message-string-entries count 'output))
-         (gen1 (car  generations))
-         (gen2 (cadr generations)))
+         (profile1 (car  profiles))
+         (profile2 (cadr profiles)))
     (cl-multiple-value-bind (new old str-action)
-        (if (> gen1 gen2)
-            (list gen1 gen2 "added to")
-          (list gen2 gen1 "removed from"))
-      (message (concat "%s %s generation %d comparing with "
-                       "generation %d of profile '%s'.")
-               str-beg str-action new old profile))))
+        (if (string-lessp profile2 profile1)
+            (list profile1 profile2 "added to")
+          (list profile2 profile1 "removed from"))
+      (message "%s %s profile '%s' comparing with profile '%s'."
+               str-beg str-action new old))))
 
 (defun guix-result-message (profile entries entry-type
                             search-type search-vals)
   "Display an appropriate message after displaying ENTRIES."
   (let* ((type-spec (guix-assq-value guix-messages
-                                     entry-type search-type))
+                                     (if (eq entry-type 'system-generation)
+                                         'generation
+                                       entry-type)
+                                     search-type))
          (fun-or-count-spec (car type-spec)))
     (if (functionp fun-or-count-spec)
         (funcall fun-or-count-spec profile entries search-vals)
diff --git a/emacs/guix-profiles.el b/emacs/guix-profiles.el
index 2c1936864f..43ad1d42eb 100644
--- a/emacs/guix-profiles.el
+++ b/emacs/guix-profiles.el
@@ -1,6 +1,7 @@
 ;;; guix-profiles.el --- Guix profiles
 
-;; Copyright © 2014 Alex Kost <alezost@gmail.com>
+;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
+;; Copyright © 2015 Mathieu Lirzin <mthl@openmailbox.org>
 
 ;; This file is part of GNU Guix.
 
@@ -25,6 +26,10 @@
   (expand-file-name "~/.guix-profile")
   "User profile.")
 
+(defvar guix-system-profile
+  (concat guix-config-state-directory "/profiles/system")
+  "System profile.")
+
 (defvar guix-default-profile
   (concat guix-config-state-directory
           "/profiles/per-user/"
diff --git a/emacs/guix-ui-generation.el b/emacs/guix-ui-generation.el
index aa71645b4e..4047850f23 100644
--- a/emacs/guix-ui-generation.el
+++ b/emacs/guix-ui-generation.el
@@ -1,6 +1,6 @@
 ;;; guix-ui-generation.el --- Interface for displaying generations  -*- lexical-binding: t -*-
 
-;; Copyright © 2014, 2015 Alex Kost <alezost@gmail.com>
+;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
 
 ;; This file is part of GNU Guix.
 
@@ -78,6 +78,18 @@ Each element from GENERATIONS is a generation number."
       'switch-to-generation* profile generation)
      operation-buffer)))
 
+(defun guix-system-generation? ()
+  "Return non-nil, if current generation is a system one."
+  (eq (guix-buffer-current-entry-type)
+      'system-generation))
+
+(defun guix-generation-current-packages-profile (&optional generation)
+  "Return a directory where packages are installed for the
+current profile's GENERATION."
+  (guix-packages-profile (guix-ui-current-profile)
+                         generation
+                         (guix-system-generation?)))
+
 
 ;;; Generation 'info'
 
@@ -115,8 +127,9 @@ Each element from GENERATIONS is a generation number."
    (lambda (btn)
      (guix-buffer-get-display-entries
       'list guix-package-list-type
-      (list (guix-ui-current-profile)
-            'generation (button-get btn 'number))
+      (list (guix-generation-current-packages-profile
+             (button-get btn 'number))
+            'installed)
       'add))
    "Show installed packages for this generation"
    'number number)
@@ -190,8 +203,8 @@ VAL is a boolean value."
   "List installed packages for the generation at point."
   (interactive)
   (guix-package-get-display
-   (guix-ui-current-profile)
-   'generation (guix-list-current-id)))
+   (guix-generation-current-packages-profile (guix-list-current-id))
+   'installed))
 
 (defun guix-generation-list-generations-to-compare ()
   "Return a sorted list of 2 marked generations for comparing."
@@ -200,6 +213,11 @@ VAL is a boolean value."
         (user-error "2 generations should be marked for comparing")
       (sort numbers #'<))))
 
+(defun guix-generation-list-profiles-to-compare ()
+  "Return a sorted list of 2 marked generation profiles for comparing."
+  (mapcar #'guix-generation-current-packages-profile
+          (guix-generation-list-generations-to-compare)))
+
 (defun guix-generation-list-show-added-packages ()
   "List package outputs added to the latest marked generation.
 If 2 generations are marked with \\[guix-list-mark], display
@@ -209,8 +227,8 @@ installed in the other one."
   (guix-buffer-get-display-entries
    'list 'output
    (cl-list* (guix-ui-current-profile)
-             'generation-diff
-             (reverse (guix-generation-list-generations-to-compare)))
+             'profile-diff
+             (reverse (guix-generation-list-profiles-to-compare)))
    'add))
 
 (defun guix-generation-list-show-removed-packages ()
@@ -222,8 +240,8 @@ installed in the other one."
   (guix-buffer-get-display-entries
    'list 'output
    (cl-list* (guix-ui-current-profile)
-             'generation-diff
-             (guix-generation-list-generations-to-compare))
+             'profile-diff
+             (guix-generation-list-profiles-to-compare))
    'add))
 
 (defun guix-generation-list-compare (diff-fun gen-fun)
@@ -324,14 +342,13 @@ performance."
   "Width of an output name \"column\".
 This variable is used in auxiliary buffers for comparing generations.")
 
-(defun guix-generation-packages (profile generation)
-  "Return a list of sorted packages installed in PROFILE's GENERATION.
+(defun guix-generation-packages (profile)
+  "Return a list of sorted packages installed in PROFILE.
 Each element of the list is a list of the package specification
 and its store path."
   (let ((names+paths (guix-eval-read
                       (guix-make-guile-expression
-                       'generation-package-specifications+paths
-                       profile generation))))
+                       'profile->specifications+paths profile))))
     (sort names+paths
           (lambda (a b)
             (string< (car a) (car b))))))
@@ -360,8 +377,8 @@ Use the full PROFILE file name."
   (indent-to guix-generation-output-name-width 2)
   (insert path "\n"))
 
-(defun guix-generation-insert-packages (buffer profile generation)
-  "Insert package outputs installed in PROFILE's GENERATION in BUFFER."
+(defun guix-generation-insert-packages (buffer profile)
+  "Insert package outputs installed in PROFILE in BUFFER."
   (with-current-buffer buffer
     (setq buffer-read-only nil
           indent-tabs-mode nil)
@@ -369,9 +386,9 @@ Use the full PROFILE file name."
     (mapc (lambda (name+path)
             (guix-generation-insert-package
              (car name+path) (cadr name+path)))
-          (guix-generation-packages profile generation))))
+          (guix-generation-packages profile))))
 
-(defun guix-generation-packages-buffer (profile generation)
+(defun guix-generation-packages-buffer (profile generation &optional system?)
   "Return buffer with package outputs installed in PROFILE's GENERATION.
 Create the buffer if needed."
   (let ((buf-name (guix-generation-packages-buffer-name
@@ -379,19 +396,24 @@ Create the buffer if needed."
     (or (and (null guix-generation-packages-update-buffer)
              (get-buffer buf-name))
         (let ((buf (get-buffer-create buf-name)))
-          (guix-generation-insert-packages buf profile generation)
+          (guix-generation-insert-packages
+           buf
+           (guix-packages-profile profile generation system?))
           buf))))
 
 (defun guix-profile-generation-manifest-file (generation)
   "Return the file name of a GENERATION's manifest.
 GENERATION is a generation number of the current profile."
-  (guix-manifest-file (guix-ui-current-profile) generation))
+  (guix-manifest-file (guix-ui-current-profile)
+                      generation
+                      (guix-system-generation?)))
 
 (defun guix-profile-generation-packages-buffer (generation)
   "Insert GENERATION's package outputs in a buffer and return it.
 GENERATION is a generation number of the current profile."
   (guix-generation-packages-buffer (guix-ui-current-profile)
-                                   generation))
+                                   generation
+                                   (guix-system-generation?)))
 
 
 ;;; Interactive commands
diff --git a/emacs/guix-ui-package.el b/emacs/guix-ui-package.el
index 12bfaeef68..29514527ce 100644
--- a/emacs/guix-ui-package.el
+++ b/emacs/guix-ui-package.el
@@ -349,6 +349,10 @@ formatted with this string, an action button is inserted.")
                    'name (button-label btn))
              'add)))
 
+(define-button-type 'guix-package-heading
+  :supertype 'guix-package-name
+  'face 'guix-package-info-heading)
+
 (define-button-type 'guix-package-source
   :supertype 'guix
   'face 'guix-package-info-source
@@ -362,8 +366,7 @@ formatted with this string, an action button is inserted.")
   "Insert package ENTRY heading (name specification) at point."
   (guix-insert-button
    (guix-package-entry->name-specification entry)
-   'guix-package-name
-   'face 'guix-package-info-heading))
+   'guix-package-heading))
 
 (defun guix-package-info-insert-systems (systems entry)
   "Insert supported package SYSTEMS at point."
@@ -909,15 +912,15 @@ See `guix-package-info-type'."
   "A history of minibuffer prompts.")
 
 ;;;###autoload
-(defun guix-search-by-name (name &optional profile)
-  "Search for Guix packages by NAME.
+(defun guix-packages-by-name (name &optional profile)
+  "Display Guix packages with NAME.
 NAME is a string with name specification.  It may optionally contain
 a version number.  Examples: \"guile\", \"guile-2.0.11\".
 
 If PROFILE is nil, use `guix-current-profile'.
 Interactively with prefix, prompt for PROFILE."
   (interactive
-   (list (read-string "Package name: " nil 'guix-package-search-history)
+   (list (guix-read-package-name)
          (guix-ui-read-profile)))
   (guix-package-get-display profile 'name name))
 
@@ -936,6 +939,17 @@ Interactively with prefix, prompt for PROFILE."
                             (or params guix-package-search-params)))
 
 ;;;###autoload
+(defun guix-search-by-name (regexp &optional profile)
+  "Search for Guix packages matching REGEXP in a package name.
+If PROFILE is nil, use `guix-current-profile'.
+Interactively with prefix, prompt for PROFILE."
+  (interactive
+   (list (read-string "Package name by regexp: "
+                      nil 'guix-package-search-history)
+         (guix-ui-read-profile)))
+  (guix-search-by-regexp regexp '(name) profile))
+
+;;;###autoload
 (defun guix-installed-packages (&optional profile)
   "Display information about installed Guix packages.
 If PROFILE is nil, use `guix-current-profile'.
diff --git a/emacs/guix-ui-system-generation.el b/emacs/guix-ui-system-generation.el
new file mode 100644
index 0000000000..d79f3bceef
--- /dev/null
+++ b/emacs/guix-ui-system-generation.el
@@ -0,0 +1,105 @@
+;;; guix-ui-system-generation.el --- Interface for displaying system generations  -*- lexical-binding: t -*-
+
+;; Copyright © 2016 Alex Kost <alezost@gmail.com>
+
+;; This file is part of GNU Guix.
+
+;; GNU Guix is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Guix is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This file provides an interface for displaying system generations
+;; in 'list' and 'info' buffers, and commands for working with them.
+
+;;; Code:
+
+(require 'cl-lib)
+(require 'guix-list)
+(require 'guix-ui)
+(require 'guix-ui-generation)
+(require 'guix-profiles)
+
+(guix-ui-define-entry-type system-generation)
+
+(defun guix-system-generation-get-display (search-type &rest search-values)
+  "Search for system generations and show results.
+See `guix-ui-get-entries' for the meaning of SEARCH-TYPE and
+SEARCH-VALUES."
+  (apply #'guix-list-get-display-entries
+         'system-generation
+         guix-system-profile
+         search-type search-values))
+
+
+;;; System generation 'info'
+
+(guix-ui-info-define-interface system-generation
+  :buffer-name "*Guix Generation Info*"
+  :format '((number format guix-generation-info-insert-number)
+            (label format (format))
+            (prev-number format (format))
+            (current format guix-generation-info-insert-current)
+            (path format (format guix-file))
+            (time format (time))
+            (root-device format (format))
+            (kernel format (format guix-file)))
+  :titles guix-generation-info-titles)
+
+
+;;; System generation 'list'
+
+;; FIXME It is better to make `guix-generation-list-shared-map' with
+;; common keys for both usual and system generations.
+(defvar guix-system-generation-list-mode-map
+  (copy-keymap guix-generation-list-mode-map)
+  "Keymap for `guix-system-generation-list-mode' buffers.")
+
+(guix-ui-list-define-interface system-generation
+  :buffer-name "*Guix Generation List*"
+  :format '((number nil 5 guix-list-sort-numerically-0 :right-align t)
+            (current guix-generation-list-get-current 10 t)
+            (label nil 40 t)
+            (time guix-list-get-time 20 t)
+            (path guix-list-get-file-path 30 t))
+  :titles guix-generation-list-titles
+  :sort-key '(number . t)
+  :marks '((delete . ?D)))
+
+
+;;; Interactive commands
+
+;;;###autoload
+(defun guix-system-generations ()
+  "Display information about system generations."
+  (interactive)
+  (guix-system-generation-get-display 'all))
+
+;;;###autoload
+(defun guix-last-system-generations (number)
+  "Display information about last NUMBER of system generations."
+  (interactive "nThe number of last generations: ")
+  (guix-system-generation-get-display 'last number))
+
+;;;###autoload
+(defun guix-system-generations-by-time (from to)
+  "Display information about system generations created between FROM and TO."
+  (interactive
+   (list (guix-read-date "Find generations (from): ")
+         (guix-read-date "Find generations (to): ")))
+  (guix-system-generation-get-display
+   'time (float-time from) (float-time to)))
+
+(provide 'guix-ui-system-generation)
+
+;;; guix-ui-system-generation.el ends here
diff --git a/gnu-system.am b/gnu-system.am
index a40576583f..9c87ac89da 100644
--- a/gnu-system.am
+++ b/gnu-system.am
@@ -80,6 +80,7 @@ GNU_SYSTEM_MODULES =				\
   gnu/packages/databases.scm			\
   gnu/packages/datamash.scm			\
   gnu/packages/datastructures.scm		\
+  gnu/packages/dav.scm				\
   gnu/packages/dc.scm				\
   gnu/packages/debug.scm			\
   gnu/packages/dejagnu.scm			\
@@ -89,6 +90,7 @@ GNU_SYSTEM_MODULES =				\
   gnu/packages/djvu.scm				\
   gnu/packages/dns.scm				\
   gnu/packages/docbook.scm			\
+  gnu/packages/docker.scm			\
   gnu/packages/doxygen.scm			\
   gnu/packages/dunst.scm			\
   gnu/packages/dvtm.scm				\
@@ -417,7 +419,6 @@ dist_patch_DATA =						\
   gnu/packages/patches/avidemux-install-to-lib.patch		\
   gnu/packages/patches/avrdude-fix-libusb.patch			\
   gnu/packages/patches/bash-completion-directories.patch	\
-  gnu/packages/patches/bowtie-fix-makefile.patch		\
   gnu/packages/patches/bigloo-gc-shebangs.patch			\
   gnu/packages/patches/binutils-ld-new-dtags.patch		\
   gnu/packages/patches/binutils-loongson-workaround.patch	\
diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index e6552fdb67..bbe1a74d85 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2014, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -96,6 +96,11 @@ contains module names, not actual file names."
       name
       (dot-ko name)))
 
+(define (file-name->module-name file)
+  "Return the module name corresponding to FILE, stripping the trailing '.ko',
+etc."
+  (basename file ".ko"))
+
 (define* (recursive-module-dependencies files
                                         #:key (lookup-module dot-ko))
   "Return the topologically-sorted list of file names of the modules depended
@@ -130,6 +135,22 @@ LOOKUP-MODULE to the module name."
       (((modules . _) ...)
        modules))))
 
+(define (module-black-list)
+  "Return the black list of modules that must not be loaded.  This black list
+is specified using 'modprobe.blacklist=MODULE1,MODULE2,...' on the kernel
+command line; it is honored by libkmod."
+  (define parameter
+    "modprobe.blacklist=")
+
+  (let ((command (call-with-input-file "/proc/cmdline"
+                   get-string-all)))
+    (append-map (lambda (arg)
+                  (if (string-prefix? parameter arg)
+                      (string-tokenize (string-drop arg (string-length parameter))
+                                       %not-comma)
+                      '()))
+                (string-tokenize command))))
+
 (define (module-loaded? module)
   "Return #t if MODULE is already loaded.  MODULE must be a Linux module name,
 not a file name."
@@ -138,29 +159,44 @@ not a file name."
 (define* (load-linux-module* file
                              #:key
                              (recursive? #t)
-                             (lookup-module dot-ko))
-  "Load Linux module from FILE, the name of a `.ko' file.  When RECURSIVE? is
-true, load its dependencies first (à la 'modprobe'.)  The actual files
-containing modules depended on are obtained by calling LOOKUP-MODULE with the
-module name."
+                             (lookup-module dot-ko)
+                             (black-list (module-black-list)))
+  "Load Linux module from FILE, the name of a '.ko' file; return true on
+success, false otherwise.  When RECURSIVE? is true, load its dependencies
+first (à la 'modprobe'.)  The actual files containing modules depended on are
+obtained by calling LOOKUP-MODULE with the module name.  Modules whose name
+appears in BLACK-LIST are not loaded."
   (define (slurp module)
     ;; TODO: Use 'finit_module' to reduce memory usage.
     (call-with-input-file file get-bytevector-all))
 
-  (when recursive?
-    (for-each (cut load-linux-module* <> #:lookup-module lookup-module)
-              (map lookup-module (module-dependencies file))))
-
-  (format (current-module-debugging-port)
-          "loading Linux module from '~a'...~%" file)
-
-  (catch 'system-error
-    (lambda ()
-      (load-linux-module (slurp file)))
-    (lambda args
-      ;; If this module was already loaded and we're in modprobe style, ignore
-      ;; the error.
-      (unless (and recursive? (= EEXIST (system-error-errno args)))
-        (apply throw args)))))
+  (define (black-listed? module)
+    (let ((result (member module black-list)))
+      (when result
+        (format (current-module-debugging-port)
+                "not loading module '~a' because it's black-listed~%"
+                module))
+      result))
+
+  (define (load-dependencies file)
+    (let ((dependencies (module-dependencies file)))
+      (every (cut load-linux-module* <> #:lookup-module lookup-module)
+             (map lookup-module dependencies))))
+
+  (and (not (black-listed? (file-name->module-name file)))
+       (or (not recursive?)
+           (load-dependencies file))
+       (begin
+         (format (current-module-debugging-port)
+                 "loading Linux module from '~a'...~%" file)
+
+         (catch 'system-error
+           (lambda ()
+             (load-linux-module (slurp file)))
+           (lambda args
+             ;; If this module was already loaded and we're in modprobe style, ignore
+             ;; the error.
+             (or (and recursive? (= EEXIST (system-error-errno args)))
+                 (apply throw args)))))))
 
 ;;; linux-modules.scm ends here
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index 6e3024dffd..1f2d0fbf95 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -2,7 +2,7 @@
 ;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2013 Cyril Roelandt <tipecaml@gmail.com>
 ;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org>
-;;; Copyright © 2014, 2015 Eric Bavier <bavier@member.fsf.org>
+;;; Copyright © 2014, 2015, 2016 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2015 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
 ;;; Copyright © 2015 Alex Sassmannshausen <alex.sassmannshausen@gmail.com>
 ;;; Copyright © 2015 Eric Dvorsak <eric@dvorsak.fr>
@@ -1318,3 +1318,62 @@ able to adapt itself dynamically to the overall system load.  Children
 processes and threads of the specified process may optionally share the same
 limits.")
     (license license:gpl2+)))
+
+(define-public autojump
+  (package
+    (name "autojump")
+    (version "22.2.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/wting/autojump/archive/"
+                           "release-v" version ".tar.gz"))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32
+         "0xglj7nb8xczaqy2dhn78drqdwqj64rqpymxhqmmwwqzfaqassw1"))))
+    (build-system gnu-build-system)
+    (native-inputs                      ;for tests
+     `(("python-mock" ,python-mock)
+       ("python-pytest" ,python-pytest)))
+    (inputs
+     `(("python" ,python-wrapper)))
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+                  (delete 'configure)
+                  (delete 'build)
+                  (replace 'check
+                    (lambda _
+                      (zero?
+                       (system* "python" "tests/autojump_utils_test.py"))))
+                  (replace 'install
+                    ;; The install.py script doesn't allow system installation
+                    ;; into an arbitrary prefix, so do our own install.
+                    (lambda* (#:key outputs #:allow-other-keys)
+                      (let* ((out (assoc-ref outputs "out"))
+                             (bin (string-append out "/bin"))
+                             (share (string-append out "/share/autojump"))
+                             (py (string-append out "/lib/python"
+                                                ,(version-major+minor
+                                                  (package-version python-wrapper))
+                                                "/site-packages"))
+                             (man (string-append out "/share/man/man1")))
+                        (install-file "bin/autojump" bin)
+                        (for-each (λ (f) (install-file f py))
+                                  (find-files "bin" "\\.py$"))
+                        (for-each (λ (f) (install-file f share))
+                                  (find-files "bin" "autojump\\..*$"))
+                        (substitute* (string-append share "/autojump.sh")
+                          (("/usr/local") out))
+                        (install-file "docs/autojump.1" man)
+                        (wrap-program (string-append bin "/autojump")
+                          `("PYTHONPATH" ":" prefix (,py)))
+                        #t))))))
+    (home-page "https://github.com/wting/autojump")
+    (synopsis "Shell extension for filesystem navigation")
+    (description
+     "Autojump provides a faster way to navigate your filesystem, with a \"cd
+command that learns\".  It works by maintaining a database of the directories
+you use the most from the command line and allows you to \"jump\" to
+frequently used directories by typing only a small pattern.")
+    (license license:gpl3+)))
diff --git a/gnu/packages/bioinformatics.scm b/gnu/packages/bioinformatics.scm
index c6531d669f..314d0ad322 100644
--- a/gnu/packages/bioinformatics.scm
+++ b/gnu/packages/bioinformatics.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014, 2015 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2014, 2015, 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2015, 2016 Ben Woodcroft <donttrustben@gmail.com>
 ;;; Copyright © 2015 Pjotr Prins <pjotr.guix@thebird.nl>
 ;;; Copyright © 2015 Andreas Enge <andreas@enge.fr>
@@ -603,7 +603,7 @@ errors at the end of reads.")
 (define-public bowtie
   (package
     (name "bowtie")
-    (version "2.2.4")
+    (version "2.2.6")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://github.com/BenLangmead/bowtie2/archive/v"
@@ -611,42 +611,36 @@ errors at the end of reads.")
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "15dnbqippwvhyh9zqjhaxkabk7lm1xbh1nvar1x4b5kwm117zijn"))
+                "1ssfvymxfrap6f9pf86s9bvsbqdgka4abr2r7j3mgr4w1l289m86"))
               (modules '((guix build utils)))
               (snippet
                '(substitute* "Makefile"
-                  (("^CC = .*$") "CC = gcc")
-                  (("^CPP = .*$") "CPP = g++")
                   ;; replace BUILD_HOST and BUILD_TIME for deterministic build
                   (("-DBUILD_HOST=.*") "-DBUILD_HOST=\"\\\"guix\\\"\"")
-                  (("-DBUILD_TIME=.*") "-DBUILD_TIME=\"\\\"0\\\"\"")))
-              (patches (list (search-patch "bowtie-fix-makefile.patch")))))
+                  (("-DBUILD_TIME=.*") "-DBUILD_TIME=\"\\\"0\\\"\"")))))
     (build-system gnu-build-system)
     (inputs `(("perl" ,perl)
               ("perl-clone" ,perl-clone)
               ("perl-test-deep" ,perl-test-deep)
               ("perl-test-simple" ,perl-test-simple)
-              ("python" ,python-2)))
+              ("python" ,python-2)
+              ("tbb" ,tbb)))
     (arguments
-     '(#:make-flags '("allall")
+     '(#:make-flags
+       (list "allall"
+             "WITH_TBB=1"
+             (string-append "prefix=" (assoc-ref %outputs "out")))
        #:phases
        (alist-delete
         'configure
         (alist-replace
-         'install
+         'check
          (lambda* (#:key outputs #:allow-other-keys)
-           (let ((bin (string-append (assoc-ref outputs "out") "/bin/")))
-             (for-each (lambda (file)
-                         (install-file file bin))
-                       (find-files "." "bowtie2.*"))))
-         (alist-replace
-          'check
-          (lambda* (#:key outputs #:allow-other-keys)
-            (system* "perl"
-                     "scripts/test/simple_tests.pl"
-                     "--bowtie2=./bowtie2"
-                     "--bowtie2-build=./bowtie2-build"))
-          %standard-phases)))))
+           (system* "perl"
+                    "scripts/test/simple_tests.pl"
+                    "--bowtie2=./bowtie2"
+                    "--bowtie2-build=./bowtie2-build"))
+         %standard-phases))))
     (home-page "http://bowtie-bio.sourceforge.net/bowtie2/index.shtml")
     (synopsis "Fast and sensitive nucleotide sequence read aligner")
     (description
@@ -2079,7 +2073,7 @@ that a read originated from a particular isoform.")
 (define-public orfm
   (package
     (name "orfm")
-    (version "0.4.1")
+    (version "0.5.3")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2087,12 +2081,16 @@ that a read originated from a particular isoform.")
                     version "/orfm-" version ".tar.gz"))
               (sha256
                (base32
-                "05fmw145snk646ly076zby0fjav0k7ysbclck5d4s9pmgcfpijc2"))))
+                "0vb6d771gl4mix8bwx919x5ayy9pkj44n7ki336nz3rz2rx4c7gk"))))
     (build-system gnu-build-system)
     (inputs `(("zlib" ,zlib)))
+    (native-inputs
+     `(("ruby-bio-commandeer" ,ruby-bio-commandeer)
+       ("ruby-rspec" ,ruby-rspec)
+       ("ruby" ,ruby)))
     (synopsis "Simple and not slow open reading frame (ORF) caller")
     (description
-     "An ORF caller finds stretches of DNA that when translated are not
+     "An ORF caller finds stretches of DNA that, when translated, are not
 interrupted by stop codons.  OrfM finds and prints these ORFs.")
     (home-page "https://github.com/wwood/OrfM")
     (license license:lgpl3+)))
@@ -2458,18 +2456,21 @@ viewer.")
        (sha256
         (base32 "1m33xsfwz0s8qi45lylagfllqg7fphf4dr0780rsvw75av9wk06h"))))
     (arguments
-     (substitute-keyword-arguments (package-arguments samtools)
-       ((#:tests? tests) #f) ;no "check" target
-       ((#:phases phases)
-        `(modify-phases ,phases
-           (replace 'install
-                    (lambda* (#:key outputs #:allow-other-keys)
-                      (let ((bin (string-append
-                                  (assoc-ref outputs "out") "/bin")))
-                        (mkdir-p bin)
-                        (copy-file "samtools"
-                                   (string-append bin "/samtools")))))
-           (delete 'patch-tests)))))))
+     `(#:tests? #f ;no "check" target
+       ,@(substitute-keyword-arguments (package-arguments samtools)
+           ((#:make-flags flags)
+            `(cons "LIBCURSES=-lncurses" ,flags))
+           ((#:phases phases)
+            `(modify-phases ,phases
+               (replace 'install
+                 (lambda* (#:key outputs #:allow-other-keys)
+                   (let ((bin (string-append
+                               (assoc-ref outputs "out") "/bin")))
+                     (mkdir-p bin)
+                     (copy-file "samtools"
+                                (string-append bin "/samtools")))))
+               (delete 'patch-tests)
+               (delete 'configure))))))))
 
 (define-public mosaik
   (let ((commit "5c25216d"))
@@ -3841,6 +3842,8 @@ extracting the desired features in a convenient format.")
     (properties
      `((upstream-name . "GO.db")))
     (build-system r-build-system)
+    (propagated-inputs
+     `(("r-annotationdbi" ,r-annotationdbi)))
     (home-page "http://bioconductor.org/packages/GO.db")
     (synopsis "Annotation maps describing the entire Gene Ontology")
     (description
diff --git a/gnu/packages/calendar.scm b/gnu/packages/calendar.scm
index 7e87fbbfe4..2e4481f94b 100644
--- a/gnu/packages/calendar.scm
+++ b/gnu/packages/calendar.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015 David Thompson <davet@gnu.org>
+;;; Copyright © 2015 Leo Famulari <leo@famulari.name>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -21,9 +22,16 @@
   #:use-module (guix licenses)
   #:use-module (guix packages)
   #:use-module (guix download)
+  #:use-module (guix build utils)
   #:use-module (guix build-system cmake)
+  #:use-module (guix build-system python)
+  #:use-module (gnu packages base)
+  #:use-module (gnu packages databases)
+  #:use-module (gnu packages dav)
+  #:use-module (gnu packages freedesktop)
   #:use-module (gnu packages icu4c)
-  #:use-module (gnu packages perl))
+  #:use-module (gnu packages perl)
+  #:use-module (gnu packages python))
 
 (define-public libical
   (package
@@ -50,3 +58,70 @@
      "Libical is an implementation of the iCalendar protocols and protocol
 data units.")
     (license lgpl2.1)))
+
+(define-public khal
+  (package
+    (name "khal")
+    (version "0.7.0")
+    (source (origin
+             (method url-fetch)
+             (uri (pypi-uri "khal" version))
+             (sha256
+              (base32
+               "00llxj7cv31mjsx0j6zxmyi9s1q20yvfkn025xcy8cv1ylfwic66"))
+             (modules '((guix build utils)))
+             ;; Patch broken path in 'doc' Makefile.
+             ;; Patch sent upstream: https://github.com/geier/khal/pull/307
+             (snippet
+               '(substitute* "doc/source/Makefile"
+                 (("../../../khal/khal/settings/khal.spec")
+                  "../../khal/settings/khal.spec" )))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+        ;; Bug reported: https://github.com/geier/khal/issues/309
+        (add-after 'unpack 'disable-test
+          (lambda _
+            (substitute* "tests/khalendar_test.py"
+                         (("test_only_update_old_event")
+                          "disabled_only_update_old_event"))))
+        ;; Building the manpage requires khal to be installed.
+        (add-after 'install 'manpage
+          (lambda* (#:key outputs #:allow-other-keys)
+            (setenv "PYTHONPATH"
+                    (string-append
+                      (getenv "PYTHONPATH") ":" (assoc-ref outputs "out")))
+            (zero? (system* "make" "--directory=doc/" "man"))
+            (install-file
+              "doc/build/man/khal.1"
+              (string-append (assoc-ref outputs "out") "/share/man/man1"))))
+        ;; The tests require us to choose a timezone.
+        (replace 'check
+          (lambda* (#:key inputs #:allow-other-keys)
+            (setenv "TZ"
+                    (string-append (assoc-ref inputs "tzdata")
+                                   "/share/zoneinfo/Zulu"))
+            (zero? (system* "py.test" "tests")))))))
+    (native-inputs
+     `(("python-pytest" ,python-pytest)
+       ("python-setuptools-scm" ,python-setuptools-scm)
+       ;; Required for tests
+       ("tzdata" ,tzdata)
+       ;; Required to build manpage
+       ("python-sphinxcontrib-newsfeed" ,python-sphinxcontrib-newsfeed)
+       ("python-sphinx" ,python-sphinx)))
+    (inputs
+     `(("sqlite" ,sqlite)))
+    (propagated-inputs
+     `(("python-configobj" ,python-configobj)
+       ("python-dateutil-2" ,python-dateutil-2)
+       ("python-icalendar" ,python-icalendar)
+       ("python-tzlocal" ,python-tzlocal)
+       ("python-urwid" ,python-urwid)
+       ("python-pyxdg" ,python-pyxdg)
+       ("vdirsyncer" ,vdirsyncer)))
+    (synopsis "Console calendar program")
+    (description "Khal is a standards based console calendar program,
+able to synchronize with CalDAV servers through vdirsyncer.")
+    (home-page "http://lostpackets.de/khal/")
+    (license expat)))
diff --git a/gnu/packages/databases.scm b/gnu/packages/databases.scm
index 4bb3b4d1e2..b36f5d8c16 100644
--- a/gnu/packages/databases.scm
+++ b/gnu/packages/databases.scm
@@ -3,7 +3,7 @@
 ;;; Copyright © 2012, 2014, 2015 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2013 Cyril Roelandt <tipecaml@gmail.com>
 ;;; Copyright © 2014 David Thompson <davet@gnu.org>
-;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com>
 ;;; Copyright © 2015 Leo Famulari <leo@famulari.name>
@@ -205,7 +205,7 @@ Language.")
 (define-public mariadb
   (package
     (name "mariadb")
-    (version "10.0.20")
+    (version "10.0.23")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://downloads.mariadb.org/f/"
@@ -213,7 +213,7 @@ Language.")
                                   name "-" version ".tar.gz"))
               (sha256
                (base32
-                "0ywb730l68mxvmpik1x2ndbdaaks6dmc17pxspspm5wlqxinjkrs"))))
+                "0x52gfxk7zr84al83x62s4gh7mbngahy1svafdkbwd18i5lysvhm"))))
     (build-system cmake-build-system)
     (arguments
      '(#:configure-flags
diff --git a/gnu/packages/datamash.scm b/gnu/packages/datamash.scm
index 4f8ded1d66..9889f16646 100644
--- a/gnu/packages/datamash.scm
+++ b/gnu/packages/datamash.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
+;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -27,7 +28,7 @@
 (define-public datamash
   (package
     (name "datamash")
-    (version "1.0.7")
+    (version "1.1.0")
     (source
      (origin
       (method url-fetch)
@@ -35,7 +36,7 @@
                           version ".tar.gz"))
       (sha256
        (base32
-        "0y49zaadzirghy4xfajvsv1f5x805cjp61z212ggipx5243302qs"))))
+        "1c2bj0jrm4fxkf0ykxkzgyk1l9s0idqm8rbzmk3n9pgldb4arrd9"))))
     (native-inputs
      `(("which" ,which)                 ;for tests
        ("perl" ,perl)))                 ;for help2man
diff --git a/gnu/packages/dav.scm b/gnu/packages/dav.scm
new file mode 100644
index 0000000000..f13d013d50
--- /dev/null
+++ b/gnu/packages/dav.scm
@@ -0,0 +1,108 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2015 Leo Famulari <leo@famulari.name>
+;;;
+;;; 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 dav)
+  #:use-module (guix build-system python)
+  #:use-module (guix download)
+  #:use-module (guix licenses)
+  #:use-module (guix packages)
+  #:use-module (gnu packages python))
+
+(define-public radicale
+  (package
+    (name "radicale")
+    (version "1.1.1")
+    (source (origin
+             (method url-fetch)
+             (uri (pypi-uri "Radicale" version))
+             (sha256
+              (base32
+               "1c5lv8qca21mndkx350wxv34qypqh6gb4rhzms4anr642clq3jg2"))))
+    (build-system python-build-system)
+    (propagated-inputs
+      ;; TODO: Add python-pam
+     `(("python-requests" ,python-requests)))
+    (synopsis "Basic CalDAV and CardDAV server")
+    (description "Radicale is a CalDAV and CardDAV server for UNIX-like
+platforms.  Calendars and address books are available for both local and remote
+access, possibly limited through authentication policies.  They can be viewed
+and edited by calendar and contact clients on mobile phones or computers.
+
+Radicale intentionally does not fully comply with the CalDAV and CardDAV RFCs.
+Instead, it supports the CalDAV and CardDAV implementations of popular
+clients.")
+    (home-page "http://radicale.org/")
+    (license gpl3+)))
+
+(define-public vdirsyncer
+  (package
+    (name "vdirsyncer")
+    (version "0.7.5")
+    (source (origin
+             (method url-fetch)
+             (uri (pypi-uri "vdirsyncer" version))
+             (sha256
+              (base32
+               "0dvar4k95n689fgw5gy19mb7ggaw32c8j2gbglr33wn7pbxc2l9z"))))
+    (build-system python-build-system)
+    (arguments
+      `(#:phases (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (setenv "DAV_SERVER" "radicale")
+             (setenv "REMOTESTORAGE_SERVER" "skip")
+             (zero? (system* "py.test"))))
+         ;; vdirsyncer requires itself to be installed in order to build
+         ;; the manpage.
+         (add-after 'install 'manpage
+           (lambda* (#:key outputs #:allow-other-keys)
+             (setenv "PYTHONPATH"
+                     (string-append
+                       (getenv "PYTHONPATH")
+                       ":" (assoc-ref outputs "out")))
+             (zero? (system* "make" "--directory=docs/" "man"))
+             (install-file
+               "docs/_build/man/vdirsyncer.1"
+               (string-append
+                 (assoc-ref outputs "out")
+                 "/share/man/man1")))))))
+    (native-inputs
+     `(("python-oauthlib" ,python-oauthlib)
+       ("python-setuptools-scm" ,python-setuptools-scm)
+       ("python-sphinx" ,python-sphinx)
+       ;; Required for testing
+       ("python-pytest" ,python-pytest)
+       ("python-pytest-localserver" ,python-pytest-localserver)
+       ("python-pytest-xprocess" ,python-pytest-xprocess)
+       ("python-wsgi-intercept" ,python-wsgi-intercept)
+       ("radicale" ,radicale)))
+    (propagated-inputs
+     `(("python-atomicwrites" ,python-atomicwrites)
+       ("python-click" ,python-click)
+       ("python-click-log" ,python-click-log)
+       ("python-click-threading" ,python-click-threading)
+       ("python-lxml" ,python-lxml) ; which one?
+       ("python-requests-toolbelt" ,python-requests-toolbelt)))
+    (synopsis "Synchronize calendars and contacts")
+    (description "Vdirsyncer synchronizes your calendars and addressbooks
+between two storage locations.  The most popular purpose is to
+synchronize a CalDAV or CardDAV server with a local folder or file.  The
+local data can then be accessed via a variety of programs, none of which
+have to know or worry about syncing to a server.")
+    (home-page "https://github.com/untitaker/vdirsyncer")
+    (license expat)))
diff --git a/gnu/packages/docker.scm b/gnu/packages/docker.scm
new file mode 100644
index 0000000000..06b72ee376
--- /dev/null
+++ b/gnu/packages/docker.scm
@@ -0,0 +1,107 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016 David Thompson <davet@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 docker)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (gnu packages)
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix git-download)
+  #:use-module (guix build-system python)
+  #:use-module (guix utils)
+  #:use-module (gnu packages python))
+
+(define-public python-docker-py
+  (package
+    (name "python-docker-py")
+    (version "1.6.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "docker-py" version))
+       (sha256
+        (base32
+         "16ba4xyd46hkj9nkfpz15r8kskl7ljx1afjzchyrhdsrklvzgzim"))))
+    (build-system python-build-system)
+    ;; TODO: Tests require a running Docker daemon.
+    (arguments '(#:tests? #f))
+    (inputs
+     `(("python-requests" ,python-requests)
+       ("python-setuptools" ,python-setuptools)
+       ("python-six" ,python-six)
+       ("python-websocket-client" ,python-websocket-client)))
+    (home-page "https://github.com/docker/docker-py/")
+    (synopsis "Python client for Docker")
+    (description "Docker-Py is a Python client for the Docker container
+management tool.")
+    (license license:asl2.0)))
+
+(define-public python-dockerpty
+  (package
+    (name "python-dockerpty")
+    (version "0.3.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "dockerpty" version))
+       (sha256
+        (base32
+         "0za6rr349641wv76ww9l3zcic2xyxrirlxpnzl4296h897648455"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-six" ,python-six)))
+    (home-page "https://github.com/d11wtq/dockerpty")
+    (synopsis "Python library to use the pseudo-TTY of a Docker container")
+    (description "Docker PTY provides the functionality needed to operate the
+pseudo-terminal (PTY) allocated to a Docker container using the Python
+client.")
+    (license license:asl2.0)))
+
+(define-public docker-compose
+  (package
+    (name "docker-compose")
+    (version "1.5.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "docker-compose" version))
+       (sha256
+        (base32
+         "0ksg7hm2yvc977968dixxisrhcmvskzpcx3pz0v1kazrdqp7xakr"))))
+    (build-system python-build-system)
+    ;; TODO: Tests require running Docker daemon.
+    (arguments '(#:tests? #f))
+    (inputs
+     `(("python-docker-py" ,python-docker-py)
+       ("python-dockerpty" ,python-dockerpty)
+       ("python-docopt" ,python-docopt)
+       ("python-enum34" ,python-enum34)
+       ("python-jsonschema" ,python-jsonschema)
+       ("python-pyyaml" ,python-pyyaml)
+       ("python-requests" ,python-requests-2.7)
+       ("python-setuptools" ,python-setuptools)
+       ("python-six" ,python-six)
+       ("python-texttable" ,python-texttable)
+       ("python-websocket-client" ,python-websocket-client)))
+    (home-page "https://www.docker.com/")
+    (synopsis "Multi-container orchestration for Docker")
+    (description "Docker Compose is a tool for defining and running
+multi-container Docker applications.  A Compose file is used to configure an
+application’s services.  Then, using a single command, the containers are
+created and all the services are started as specified in the configuration.")
+    (license license:asl2.0)))
diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scm
index ba7bd49901..2b1152a54d 100644
--- a/gnu/packages/emacs.scm
+++ b/gnu/packages/emacs.scm
@@ -2,7 +2,7 @@
 ;;; Copyright © 2014 Taylan Ulrich Bayirli/Kammer <taylanbayirli@gmail.com>
 ;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
-;;; Copyright © 2014, 2015 Alex Kost <alezost@gmail.com>
+;;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
 ;;; Copyright © 2015 Federico Beffa <beffa@fbengineering.ch>
 ;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
 ;;;
@@ -324,7 +324,7 @@ configuration files, such as .gitattributes, .gitignore, and .git/config.")
 (define-public magit
   (package
     (name "magit")
-    (version "2.3.1")
+    (version "2.4.0")
     (source (origin
              (method url-fetch)
              (uri (string-append
@@ -332,7 +332,7 @@ configuration files, such as .gitattributes, .gitignore, and .git/config.")
                    version "/" name "-" version ".tar.gz"))
              (sha256
               (base32
-               "1wnx034adkwhbsydd10il2099hpzz351kp39sri8s1yd43f795gf"))))
+               "1wbam4l36061mj79qlgzrv4xbzhk2dk6gnv45610zwfnf24ikdsp"))))
     (build-system gnu-build-system)
     (native-inputs `(("texinfo" ,texinfo)
                      ("emacs" ,emacs-no-x)))
diff --git a/gnu/packages/games.scm b/gnu/packages/games.scm
index f7a7636a86..3fcda40ba4 100644
--- a/gnu/packages/games.scm
+++ b/gnu/packages/games.scm
@@ -11,7 +11,7 @@
 ;;; Copyright © 2015 David Hashe <david.hashe@dhashe.com>
 ;;; Copyright © 2015 Christopher Allan Webber <cwebber@dustycloud.org>
 ;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
-;;; Copyright © 2015 Alex Kost <alezost@gmail.com>
+;;; Copyright © 2015, 2016 Alex Kost <alezost@gmail.com>
 ;;; Copyright © 2015 Paul van der Walt <paul@denknerd.org>
 ;;; Copyright © 2015 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
 ;;;
@@ -1180,7 +1180,7 @@ is programmed in Haskell.")
 (define-public manaplus
   (package
     (name "manaplus")
-    (version "1.5.12.5")
+    (version "1.6.1.16")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -1188,7 +1188,7 @@ is programmed in Haskell.")
                     version "/manaplus-" version ".tar.xz"))
               (sha256
                (base32
-                "0kmd743q40v82221wj8b09n30lqiwl7096v3m7ki3ynsgszkm326"))))
+                "1vrsjvdbdzbnqmr8sp110b2d93kp5yfnifsn6zjm60kdvvbphdir"))))
     (build-system gnu-build-system)
     (arguments
      '(#:configure-flags
diff --git a/gnu/packages/gnome.scm b/gnu/packages/gnome.scm
index 5d14550e8a..05efe0ba97 100644
--- a/gnu/packages/gnome.scm
+++ b/gnu/packages/gnome.scm
@@ -751,22 +751,39 @@ API add-ons to make GTK+ widgets OpenGL-capable.")
 (define-public glade3
   (package
     (name "glade")
-    (version "3.8.5")
+    (version "3.18.3")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://gnome/sources/" name "/"
                                   (version-major+minor version)  "/"
-                                  name "3-" version ".tar.xz"))
+                                  name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0d97df5pfkrh5670a98r3d3w8zlbh1jcax6cvq6j6a20vzjgd9aq"))))
+                "0lk4nvd5s8px9i0pbq7bncikgn2lpx7vjh787d3cvzpvwx3cxnzc"))))
     (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f ; needs X, GL, and software rendering
+       #:phases
+       (modify-phases %standard-phases
+         (add-before 'configure 'fix-docbook
+           (lambda* (#:key inputs #:allow-other-keys)
+             (substitute* "man/Makefile.in"
+               (("http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl")
+                (string-append (assoc-ref inputs "docbook-xsl")
+                               "/xml/xsl/docbook-xsl-"
+                               ,(package-version docbook-xsl)
+                               "/manpages/docbook.xsl")))
+             #t)))))
     (inputs
-     `(("gtk+" ,gtk+-2)
+     `(("gtk+" ,gtk+)
        ("libxml2" ,libxml2)))
     (native-inputs
      `(("intltool" ,intltool)
-       ("python" ,python)
+       ("itstool" ,itstool)
+       ("libxslt" ,libxslt) ;for xsltproc
+       ("docbook-xml" ,docbook-xml-4.2)
+       ("docbook-xsl" ,docbook-xsl)
+       ("python" ,python-2)
        ("pkg-config" ,pkg-config)))
     (home-page "https://glade.gnome.org")
     (synopsis "GTK+ rapid application development tool")
diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm
index 2042327d3d..c1a6d75569 100644
--- a/gnu/packages/gnupg.scm
+++ b/gnu/packages/gnupg.scm
@@ -31,6 +31,7 @@
   #:use-module (gnu packages python)
   #:use-module (gnu packages readline)
   #:use-module (gnu packages compression)
+  #:use-module (gnu packages databases)
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages glib)
   #:use-module (gnu packages gnome)
@@ -218,8 +219,9 @@ compatible to GNU Pth.")
        ("libksba" ,libksba)
        ("npth" ,npth)
        ("openldap" ,openldap)
-       ("zlib" ,zlib)
-       ("readline" ,readline)))
+       ("readline" ,readline)
+       ("sqlite" ,sqlite)
+       ("zlib" ,zlib)))
    (arguments
     `(#:phases
        (alist-cons-before
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 7250cd5002..3ca4ef1868 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -6,6 +6,7 @@
 ;;; Copyright © 2015 Federico Beffa <beffa@fbengineering.ch>
 ;;; Copyright © 2015 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
 ;;; Copyright © 2015 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016 Christopher Allan Webber <cwebber@dustycloud.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -317,6 +318,22 @@ It has been modified to remove all non-free binary blobs.")
     (license license:gpl2)
     (home-page "http://www.gnu.org/software/linux-libre/"))))
 
+;; This older version of linux-libre is being added because it was found
+;; that newer versions (or at least 4.3.3) of linux-libre were not reading
+;; the hardware clock on (at least Libreboot-enabled) Thinkpad x200
+;; machines.  See <http://bugs.gnu.org/22274>.
+
+(define-public linux-libre-4.2.5
+  (package
+    (inherit linux-libre)
+    (version "4.2.5")
+    (source (origin
+             (method url-fetch)
+             (uri (linux-libre-urls version))
+             (sha256
+              (base32
+               "13ar9sghm2g5w2km9x2d07q3lh81rz286d6slklv56qanm24chzx"))))))
+
 
 ;;;
 ;;; Pluggable authentication modules (PAM).
diff --git a/gnu/packages/music.scm b/gnu/packages/music.scm
index fd1751e95b..bfc90c1eeb 100644
--- a/gnu/packages/music.scm
+++ b/gnu/packages/music.scm
@@ -462,11 +462,7 @@ for path in [path for path in sys.path if 'site-packages' in path]: site.addsite
        ("pygtk" ,python2-pygtk)
        ("gettext" ,gnu-gettext)
        ("gtk" ,gtk+)
-       ;; TODO: Lilypond is optional.  Produces errors at build time:
-       ;;   Drawing systems...Error: /undefinedresult in --glyphshow--
-       ;; Fontconfig is needed to fix one of the errors, but other similar
-       ;; errors remain.
-       ;;("lilypond" ,lilypond)
+       ("lilypond" ,lilypond)
        ("librsvg" ,librsvg) ; needed at runtime for icons
        ("libpng" ,libpng) ; needed at runtime for icons
        ;; players needed at runtime
@@ -480,8 +476,6 @@ for path in [path for path in sys.path if 'site-packages' in path]: site.addsite
        ("txt2man" ,txt2man)
        ("libxml2" ,libxml2) ; for tests
        ("ghostscript" ,ghostscript)
-       ;;("fontconfig" ,fontconfig) ; only needed with lilypond
-       ;;("freetype" ,freetype) ; only needed with lilypond
        ("texinfo" ,texinfo)))
     (home-page "https://www.gnu.org/software/solfege/")
     (synopsis "Ear training")
@@ -659,6 +653,16 @@ Laurens Hammond and Don Leslie.")
                (base32
                 "1fi2m4gmvxdi260821y09lxsimq82yv4k5bbgk3kyc3x1nyhn7vx"))))
     (build-system gnu-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'remove-sse-flags
+           (lambda* (#:key system #:allow-other-keys)
+             (when (not (or (string-prefix? "x86_64" system)
+                            (string-prefix? "i686" system)))
+               (substitute* "bristol/Makefile.in"
+                 (("-msse -mfpmath=sse") "")))
+             #t)))))
     (inputs
      `(("alsa-lib" ,alsa-lib)
        ("jack" ,jack-1)
@@ -818,14 +822,14 @@ browser.")
 (define-public drumstick
   (package
     (name "drumstick")
-    (version "1.0.1")
+    (version "1.0.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://sourceforge/drumstick/"
                                   version "/drumstick-" version ".tar.bz2"))
               (sha256
                (base32
-                "0mxgix85b2qqs859z91cxik5x0s60dykqiflbj62px9akvf91qdv"))))
+                "0l47gy9yywrc860db5g3wdqg8yc8qdb2lqq6wvw1dfim5j0vbail"))))
     (build-system cmake-build-system)
     (arguments
      `(#:tests? #f  ; no test target
@@ -864,14 +868,15 @@ backends, including ALSA, OSS, Network and FluidSynth.")
 (define-public vmpk
   (package
     (name "vmpk")
-    (version "0.6.1")
+    (version "0.6.2a")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://sourceforge/vmpk/vmpk/"
-                                  version "/vmpk-" version ".tar.bz2"))
+                                  (string-drop-right version 1)
+                                  "/vmpk-" version ".tar.bz2"))
               (sha256
                (base32
-                "0ranldd033bd31m9d2vkbkn9zp1k46xbaysllai2i95rf1nhirqc"))))
+                "0259iikvxnfdiifrh02g8xgcxikrkca4nhd3an8xzx0bd6bk8ifi"))))
     (build-system cmake-build-system)
     (arguments
      `(#:tests? #f  ; no test target
diff --git a/gnu/packages/ocaml.scm b/gnu/packages/ocaml.scm
index 5531867964..1311b1bc37 100644
--- a/gnu/packages/ocaml.scm
+++ b/gnu/packages/ocaml.scm
@@ -3,6 +3,7 @@
 ;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2015 David Hashe <david.hashe@dhashe.com>
+;;; Copyright © 2016 Eric Bavier <bavier@member.fsf.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -23,6 +24,7 @@
   #:use-module ((guix licenses) #:hide (zlib))
   #:use-module (guix packages)
   #:use-module (guix download)
+  #:use-module (guix svn-download)
   #:use-module (guix utils)
   #:use-module (guix build-system gnu)
   #:use-module (gnu packages)
@@ -36,6 +38,8 @@
   #:use-module (gnu packages compression)
   #:use-module (gnu packages xorg)
   #:use-module (gnu packages texlive)
+  #:use-module (gnu packages ghostscript)
+  #:use-module (gnu packages lynx)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages python)
   #:use-module (gnu packages ncurses)
@@ -282,14 +286,14 @@ concrete syntax of the language (Quotations, Syntax Extensions).")
 (define-public hevea
   (package
     (name "hevea")
-    (version "2.23")
+    (version "2.28")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://hevea.inria.fr/old/"
                                   name "-" version ".tar.gz"))
               (sha256
                (base32
-                "1f9pj48518ixhjxbviv2zx27v4anp92zgg3x704g1s5cki2w33nv"))))
+                "14fns13wlnpiv9i05841kvi3cq4b9v2sw5x3ff6ziws28q701qnd"))))
     (build-system gnu-build-system)
     (inputs
      `(("ocaml" ,ocaml)))
@@ -297,7 +301,12 @@ concrete syntax of the language (Quotations, Syntax Extensions).")
      `(#:tests? #f  ; no test suite
        #:make-flags (list (string-append "PREFIX=" %output))
        #:phases (modify-phases %standard-phases
-                  (delete 'configure))))
+                  (delete 'configure)
+                  (add-before 'build 'patch-/bin/sh
+                    (lambda _
+                      (substitute* "_tags"
+                        (("/bin/sh") (which "sh")))
+                      #t)))))
     (home-page "http://hevea.inria.fr/")
     (synopsis "LaTeX to HTML translator")
     (description
@@ -496,16 +505,65 @@ libpanel, librsvg and quartz.")
     (version "2.48.3")
     (source
       (origin
-        (method url-fetch)
-          (uri (string-append "https://www.seas.upenn.edu/~bcpierce/unison/"
-                              "download/releases/stable/unison-" version
-                              ".tar.gz"))
-          (sha256
-            (base32
-              "10sln52rnnsj213jy3166m0q97qpwnrwl6mm529xfy10x3xkq3gl"))))
+        (method svn-fetch)
+        (uri (svn-reference
+              (url (string-append "https://webdav.seas.upenn.edu/svn/"
+                                  "unison/branches/"
+                                  (version-major+minor version)))
+              (revision 535)))
+        (file-name (string-append name "-" version "-checkout"))
+        (sha256
+         (base32
+          "0486s53wyayicj9f2raj2dvwvk4xyzar219rccc1iczdwixm4x05"))
+        (modules '((guix build utils)
+                   (ice-9 rdelim)
+                   (ice-9 regex)
+                   (srfi srfi-1)))
+        (snippet
+         `(begin
+            ;; The svn revision in the release tarball appears to be
+            ;; artificially manipulated in order to set the desired point
+            ;; version number.  Because the point version is calculated during
+            ;; the build, we can offset pointVersionOrigin by the desired
+            ;; point version and write that into "Rev: %d".  We do this rather
+            ;; than hardcoding the necessary revision number, for
+            ;; maintainability.
+            (with-atomic-file-replacement "src/mkProjectInfo.ml"
+              (lambda (in out)
+                (let ((pt-ver (string->number (third (string-split ,version #\.))))
+                      (pt-rx  (make-regexp "^let pointVersionOrigin = ([0-9]+)"))
+                      (rev-rx (make-regexp "Rev: [0-9]+")))
+                  (let loop ((pt-origin #f))
+                    (let ((line (read-line in 'concat)))
+                      (cond
+                       ((regexp-exec pt-rx line)
+                        => (lambda (m)
+                             (display line out)
+                             (loop (string->number (match:substring m 1)))))
+                       ((regexp-exec rev-rx line)
+                        => (lambda (m)
+                             (format out "~aRev: ~d~a"
+                                     (match:prefix m)
+                                     (+ pt-origin pt-ver)
+                                     (match:suffix m))
+                             (dump-port in out))) ;done
+                       (else
+                        (display line out)
+                        (loop pt-origin))))))))
+            ;; Without the '-fix' argument, the html file produced does not
+            ;; have functioning internal hyperlinks.
+            (substitute* "doc/Makefile"
+              (("hevea unison") "hevea -fix unison"))))))
     (build-system gnu-build-system)
+    (outputs '("out"
+               "doc"))                  ; 1.9 MiB of documentation
     (native-inputs
-     `(("ocaml" ,ocaml)))
+     `(("ocaml" ,ocaml)
+       ;; For documentation
+       ("ghostscript" ,ghostscript)
+       ("texlive" ,texlive)
+       ("hevea" ,hevea)
+       ("lynx" ,lynx)))
     (arguments
      `(#:parallel-build? #f
        #:parallel-tests? #f
@@ -522,7 +580,30 @@ libpanel, librsvg and quartz.")
                       (bin (string-append out "/bin")))
                  (mkdir-p bin)
                  (setenv "HOME" out) ; forces correct INSTALLDIR in Makefile
-                 #t))))))
+                 #t)))
+           (add-after 'install 'install-doc
+             (lambda* (#:key inputs outputs #:allow-other-keys)
+               (let ((doc (string-append (assoc-ref outputs "doc")
+                                         "/share/doc/unison")))
+                 (mkdir-p doc)
+                 ;; This file needs write-permissions, because it's
+                 ;; overwritten by 'docs' during documentation generation.
+                 (chmod "src/strings.ml" #o600)
+                 (and (zero? (system* "make" "docs"
+                                      "TEXDIRECTIVES=\\\\draftfalse"))
+                      (begin
+                        (for-each (lambda (f)
+                                    (install-file f doc))
+                                  (map (lambda (ext)
+                                         (string-append
+                                          "doc/unison-manual." ext))
+                                       ;; Install only html documentation,
+                                       ;; since the build is currently
+                                       ;; non-reproducible with the ps, pdf,
+                                       ;; and dvi docs.
+                                       '(;;"ps" "pdf" "dvi"
+                                         "html")))
+                        #t))))))))
     (home-page "https://www.cis.upenn.edu/~bcpierce/unison/")
     (synopsis "File synchronizer")
     (description
diff --git a/gnu/packages/openstack.scm b/gnu/packages/openstack.scm
index 48a5c6b7e6..e258b89e2f 100644
--- a/gnu/packages/openstack.scm
+++ b/gnu/packages/openstack.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015 Cyril Roelandt <tipecaml@gmail.com>
-;;; Copyright © 2015 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2015, 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -19,12 +19,14 @@
 
 (define-module (gnu packages openstack)
   #:use-module (gnu packages python)
+  #:use-module (gnu packages tls)
   #:use-module (gnu packages version-control)
   #:use-module (guix build-system python)
   #:use-module (guix download)
   #:use-module ((guix licenses)
                 #:select (asl2.0))
-  #:use-module (guix packages))
+  #:use-module (guix packages)
+  #:use-module (srfi srfi-1))
 
 (define-public python-bandit
   (package
@@ -302,7 +304,12 @@ portions of your testing code.")
     (license asl2.0)))
 
 (define-public python2-requests-mock
-  (package-with-python2 python-requests-mock))
+  (let ((requests-mock (package-with-python2 python-requests-mock)))
+    (package (inherit requests-mock)
+      (propagated-inputs
+       `(("python2-requests" ,python2-requests)
+         ,@(alist-delete "python-requests"
+                         (package-propagated-inputs requests-mock)))))))
 
 (define-public python-stevedore
   (package
@@ -385,7 +392,12 @@ common features used in Tempest.")
     (license asl2.0)))
 
 (define-public python2-tempest-lib
-  (package-with-python2 python-tempest-lib))
+  (let ((tempest-lib (package-with-python2 python-tempest-lib)))
+    (package (inherit tempest-lib)
+      (propagated-inputs
+       `(("python2-jsonschema", python2-jsonschema)
+         ,@(alist-delete "python-jsonschema"
+                         (package-propagated-inputs tempest-lib)))))))
 
 ;; Packages from the Oslo library
 (define-public python-oslo.config
@@ -594,7 +606,9 @@ from the OpenStack project.")
     (license asl2.0)))
 
 (define-public python2-oslosphinx
-  (package-with-python2 python-oslosphinx))
+  (let ((oslosphinx (package-with-python2 python-oslosphinx)))
+    (package (inherit oslosphinx)
+      (propagated-inputs `(("python2-requests" ,python2-requests))))))
 
 (define-public python-oslotest
   (package
@@ -679,3 +693,134 @@ handling.")
 
 (define-public python2-oslo.utils
   (package-with-python2 python-oslo.utils))
+
+(define-public python-keystoneclient
+  (package
+    (name "python-keystoneclient")
+    (version "1.8.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "python-keystoneclient" version))
+        (sha256
+         (base32
+          "1w4csvkah67rfpxylxnvs2s3594i0f9isy8pf4gnsqs5zirvjaa4"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-setuptools" ,python-setuptools)
+       ("python-sphinx" ,python-sphinx)
+       ;; and some packages for the tests
+       ("openssl" ,openssl)
+       ("python-coverage" ,python-coverage)
+       ("python-discover" ,python-discover)
+       ("python-fixtures" ,python-fixtures)
+       ("python-hacking" ,python-hacking)
+       ("python-keyring" ,python-keyring)
+       ("python-lxml" ,python-lxml)
+       ("python-mock" ,python-mock)
+       ("python-mox3" ,python-mox3)
+       ("python-oauthlib" ,python-oauthlib)
+       ("python-oslosphinx" ,python-oslosphinx)
+       ("python-oslotest" ,python-oslotest)
+       ("python-pycrypto" ,python-pycrypto)
+       ("python-requests-mock" ,python-requests-mock)
+       ("python-temptest-lib" ,python-tempest-lib)
+       ("python-testrepository" ,python-testrepository)
+       ("python-testresources" ,python-testresources)
+       ("python-testtools" ,python-testtools)
+       ("python-webob" ,python-webob)))
+    (propagated-inputs
+     `(("python-babel" ,python-babel)
+       ("python-debtcollector" ,python-debtcollector)
+       ("python-iso8601" ,python-iso8601)
+       ("python-netaddr" ,python-netaddr)
+       ("python-oslo.config" ,python-oslo.config)
+       ("python-oslo.i18n" ,python-oslo.i18n)
+       ("python-oslo.serialization" ,python-oslo.serialization)
+       ("python-oslo.utils" ,python-oslo.utils)
+       ("python-pbr" ,python-pbr)
+       ("python-prettytable" ,python-prettytable)
+       ("python-requests" ,python-requests)
+       ("python-six" ,python-six)
+       ("python-stevedore" ,python-stevedore)))
+    (home-page "http://www.openstack.org/")
+    (synopsis "Client Library for OpenStack Identity")
+    (description
+     "Python-keystoneclient is the identity service used by OpenStack for
+authentication (authN) and high-level authorization (authZ).  It currently
+supports token-based authN with user/service authZ, and is scalable to support
+OAuth, SAML, and OpenID in future versions.  Out of the box, Keystone uses
+SQLite for its identity store database, with the option to connect to external
+LDAP.")
+    (license asl2.0)))
+
+(define-public python2-keystoneclient
+  (let ((keystoneclient (package-with-python2 python-keystoneclient)))
+    (package (inherit keystoneclient)
+      (propagated-inputs
+       `(("python2-requests" ,python2-requests)
+         ,@(alist-delete "python-requests"
+                         (package-propagated-inputs keystoneclient))))
+      (native-inputs
+       `(("python2-oauthlib" ,python2-oauthlib)
+         ("python2-oslosphinx" ,python2-oslosphinx)
+         ("python2-requests-mock" ,python2-requests-mock)
+         ("python2-tempest-lib" ,python2-tempest-lib)
+         ,@(fold alist-delete (package-native-inputs keystoneclient)
+            '("python-oauthlib" "python-oslosphinx" "python-requests-mock" "python-tempest-lib")))))))
+
+(define-public python-swiftclient
+  (package
+    (name "python-swiftclient")
+    (version "2.6.0")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "python-swiftclient" version))
+        (sha256
+         (base32
+          "1j33l4z9vqh0scfncl4fxg01zr1hgqxhhai6gvcih1gccqm4nd7p"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-pbr", python-pbr)
+       ("python-setuptools" ,python-setuptools)
+       ("python-sphinx" ,python-sphinx)
+       ;; The folloing packages are needed for the tests.
+       ("python-coverage" ,python-coverage)
+       ("python-discover" ,python-discover)
+       ("python-hacking" ,python-hacking)
+       ("python-mock" ,python-mock)
+       ("python-oslosphinx" ,python-oslosphinx)
+       ("python-keystoneclient" ,python-keystoneclient)
+       ("python-testrepository" ,python-testrepository)
+       ("python-testtools" ,python-testtools)))
+    (propagated-inputs
+     `(("python-requests" ,python-requests)
+       ("python-six" ,python-six)))
+    (home-page "http://www.openstack.org/")
+    (synopsis "OpenStack Object Storage API Client Library")
+    (description
+     "OpenStack Object Storage (code-named Swift) creates redundant, scalable
+object storage using clusters of standardized servers to store petabytes of
+accessible data.  It is not a file system or real-time data storage system, but
+rather a long-term storage system for a more permanent type of static data that
+can be retrieved, leveraged, and then updated if necessary.  Primary examples of
+data that best fit this type of storage model are virtual machine images, photo
+storage, email storage and backup archiving.  Having no central \"brain\" or
+master point of control provides greater scalability, redundancy and
+permanence.")
+  (license asl2.0)))
+
+(define-public python2-swiftclient
+  (let ((swiftclient (package-with-python2 python-swiftclient)))
+    (package (inherit swiftclient)
+      (propagated-inputs
+       `(("python2-futures" ,python2-futures)
+         ("python2-requests" ,python2-requests)
+         ,@(alist-delete "python-requests"
+                         (package-propagated-inputs swiftclient))))
+      (native-inputs
+       `(("python2-keystoneclient" ,python2-keystoneclient)
+         ("python2-oslosphinx" ,python2-oslosphinx)
+         ,@(fold alist-delete (package-native-inputs swiftclient)
+            '("python-keystoneclient" "python-oslosphinx")))))))
diff --git a/gnu/packages/patches/bowtie-fix-makefile.patch b/gnu/packages/patches/bowtie-fix-makefile.patch
deleted file mode 100644
index 5ac65731cb..0000000000
--- a/gnu/packages/patches/bowtie-fix-makefile.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 4a99b0023bdfbbe486b9649489a32ea184c18c9a Mon Sep 17 00:00:00 2001
-From: Valentin Antonescu <valentin@jhu.edu>
-Date: Tue, 2 Dec 2014 11:19:13 -0500
-Subject: [PATCH] Make sure the Mavericks test happens only under Darwin.
-
----
- Makefile | 11 +++++------
- 1 file changed, 5 insertions(+), 6 deletions(-)
-
-diff --git a/Makefile b/Makefile
-index d74f7c8..a4cdfa7 100644
---- a/Makefile
-+++ b/Makefile
-@@ -54,12 +54,11 @@ endif
- MACOS = 0
- ifneq (,$(findstring Darwin,$(shell uname)))
- 	MACOS = 1
--endif
--
--ifneq (,$(findstring 13,$(shell uname -r)))
--	CPP = clang++
--	CC = clang
--	EXTRA_FLAGS += -stdlib=libstdc++
-+	ifneq (,$(findstring 13,$(shell uname -r)))
-+		CPP = clang++
-+		CC = clang
-+		EXTRA_FLAGS += -stdlib=libstdc++
-+	endif
- endif
- 
- POPCNT_CAPABILITY ?= 1
diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm
index a01c99e1eb..82a9cfc75e 100644
--- a/gnu/packages/python.scm
+++ b/gnu/packages/python.scm
@@ -14,7 +14,7 @@
 ;;; Copyright © 2015 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2015 Ben Woodcroft <donttrustben@gmail.com>
 ;;; Copyright © 2015, 2016 Erik Edrosa <erik.edrosa@gmail.com>
-;;; Copyright © 2015 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2015, 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2015 Kyle Meyer <kyle@kyleam.com>
 ;;; Copyright © 2015 Chris Marusich <cmmarusich@gmail.com>
 ;;;
@@ -1016,31 +1016,16 @@ doing practical, real world data analysis in Python.")
 (define-public python-tzlocal
   (package
     (name "python-tzlocal")
-    (version "1.1.1")
+    (version "1.2")
     (source
      (origin
       (method url-fetch)
-      (uri (string-append "https://pypi.python.org/packages/source/t/"
-                          "tzlocal/tzlocal-" version ".zip"))
+      (uri (pypi-uri "tzlocal" version))
       (sha256
        (base32
-        "1m3y918c3chf41fwg2bx4w42bqsjzn3dyvvcmwwy13c8gj6zssv9"))))
+        "12wsw2fl3adrqrwghasld57bhqdrzn0crblqrci1p5acd0ni53s3"))))
     (build-system python-build-system)
-    (native-inputs
-     `(("unzip" ,unzip)
-       ("python-setuptools" ,python-setuptools)))
-    (inputs `(("python-pytz" ,python-pytz)))
-    (arguments
-     `(#:phases
-       (alist-replace
-        'unpack
-        (lambda _
-          (let ((unzip (string-append (assoc-ref %build-inputs "unzip")
-                                      "/bin/unzip"))
-                (source (assoc-ref %build-inputs "source")))
-            (and (zero? (system* unzip source))
-                 (chdir (string-append "tzlocal-" ,version)))))
-        %standard-phases)))
+    (propagated-inputs `(("python-pytz" ,python-pytz)))
     (home-page "https://github.com/regebro/tzlocal")
     (synopsis
      "Local timezone information for Python")
@@ -1627,18 +1612,18 @@ and many external plugins.")
         (sha256
           (base32
            "1lf9jsmhqk5nc4w3kzwglmdzjvmi7ajvrsnwv826j3bn0wzx8c92"))))
-  (build-system python-build-system)
-  (propagated-inputs
-   `(("python-coverage" ,python-coverage)
-     ("python-pytest" ,python-pytest)))
-  (native-inputs
-   `(("python-setuptools" ,python-setuptools)))
-  (home-page "https://github.com/pytest-dev/pytest-cov")
-  (synopsis "Pytest plugin for measuring coverage")
-  (description
-   "Pytest-cov produces coverage reports.  It supports centralised testing and
-distributed testing in both load and each modes.  It also supports coverage
-of subprocesses.")
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-coverage" ,python-coverage)
+       ("python-pytest" ,python-pytest)))
+    (native-inputs
+     `(("python-setuptools" ,python-setuptools)))
+    (home-page "https://github.com/pytest-dev/pytest-cov")
+    (synopsis "Pytest plugin for measuring coverage")
+    (description
+     "Pytest-cov produces coverage reports.  It supports centralised testing and
+distributed testing in both @code{load} and @code{each} modes.  It also
+supports coverage of subprocesses.")
   (license license:expat)))
 
 (define-public python2-pytest-cov
@@ -2136,28 +2121,38 @@ with sensible defaults out of the box.")
   (package
     (name "python-wheel")
     (version "0.26.0")
-      (source
-        (origin
-          (method url-fetch)
-          (uri (pypi-uri "wheel" version))
-          (sha256
-            (base32
-             "032k1ajijbqnv0z0k88bhf75mdimi18fcmm28mss90610lw3bbga"))))
-  (build-system python-build-system)
-  (native-inputs
-   `(("python-setuptools" ,python-setuptools)
-     ("python-jsonschema" ,python-jsonschema)
-     ("python-pytest-cov" ,python-pytest-cov)))
-  (home-page "https://bitbucket.org/pypa/wheel/")
-  (synopsis "Built-package format for Python")
-  (description
-   "A wheel is a ZIP-format archive with a specially formatted filename and the
-.whl extension.  It is designed to contain all the files for a PEP 376
-compatible install in a way that is very close to the on-disk format.")
-  (license license:expat)))
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "wheel" version))
+        (sha256
+         (base32
+          "032k1ajijbqnv0z0k88bhf75mdimi18fcmm28mss90610lw3bbga"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-setuptools" ,python-setuptools)
+       ("python-jsonschema" ,python-jsonschema)
+       ("python-pytest-cov" ,python-pytest-cov)))
+    (home-page "https://bitbucket.org/pypa/wheel/")
+    (synopsis "Format for built Python packages")
+    (description
+     "A wheel is a ZIP-format archive with a specially formatted filename and
+the @code{.whl} extension.  It is designed to contain all the files for a PEP
+376 compatible install in a way that is very close to the on-disk format.  Many
+packages will be properly installed with only the @code{Unpack} step and the
+unpacked archive preserves enough information to @code{Spread} (copy data and
+scripts to their final locations) at any later time.  Wheel files can be
+installed with a newer @code{pip} or with wheel's own command line utility.")
+    (license license:expat)))
 
 (define-public python2-wheel
-  (package-with-python2 python-wheel))
+  (let ((wheel (package-with-python2 python-wheel)))
+    (package (inherit wheel)
+      (native-inputs
+       `(("python2-functools32" ,python2-functools32)
+         ("python2-jsonschema" ,python2-jsonschema)
+         ,@(alist-delete "python-jsonschema"
+                         (package-native-inputs wheel)))))))
 
 (define-public python-requests
   (package
@@ -2184,13 +2179,54 @@ compatible install in a way that is very close to the on-disk format.")
 than Python’s urllib2 library.")
     (license asl2.0)))
 
+;; Some software requires an older version of Requests, notably Docker
+;; Compose.
+(define-public python-requests-2.7
+  (package (inherit python-requests)
+    (version "2.7.0")
+    (source (origin
+             (method url-fetch)
+             (uri (pypi-uri "requests" version))
+             (sha256
+              (base32
+               "0gdr9dxm24amxpbyqpbh3lbwxc2i42hnqv50sigx568qssv3v2ir"))))))
+
 (define-public python2-requests
-  (package-with-python2 python-requests))
+  (let ((requests (package-with-python2 python-requests)))
+    (package (inherit requests)
+      (propagated-inputs
+       `(("python2-wheel" ,python2-wheel)
+         ,@(alist-delete "python-wheel"
+                         (package-propagated-inputs requests)))))))
+
+(define-public python-vcversioner
+  (package
+    (name "python-vcversioner")
+    (version "2.14.0.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "vcversioner" version))
+       (sha256
+        (base32
+         "11ivq1bm7v0yb4nsfbv9m7g7lyjn112gbvpjnjz8nv1fx633dm5c"))))
+    (build-system python-build-system)
+    (inputs
+     `(("python-setuptools" ,python-setuptools)))
+    (synopsis "Python library for version number discovery")
+    (description "Vcversioner is a Python library that inspects tagging
+information in a variety of version control systems in order to discover
+version numbers.")
+    (home-page "https://github.com/habnabit/vcversioner")
+    (license isc)))
+
+(define-public python2-vcversioner
+  (package-with-python2 python-vcversioner))
 
 (define-public python-jsonschema
   (package
     (name "python-jsonschema")
-    (version "2.4.0")
+    (version "2.5.1")
     (source (origin
              (method url-fetch)
              (uri
@@ -2199,10 +2235,11 @@ than Python’s urllib2 library.")
                version ".tar.gz"))
              (sha256
               (base32
-               "1yik3031ziygvq66rj3mzfqdgxj29sg1bkfc46wsgi7lnbqs560j"))))
+               "0hddbqjm4jq63y8jf44nswina1crjs16l9snb6m3vvgyg31klrrn"))))
     (build-system python-build-system)
     (inputs
-     `(("python-setuptools" ,python-setuptools)))
+     `(("python-setuptools" ,python-setuptools)
+       ("python-vcversioner" ,python-vcversioner)))
     (home-page "http://github.com/Julian/jsonschema")
     (synopsis "Implementation of JSON Schema for Python")
     (description
@@ -2210,7 +2247,11 @@ than Python’s urllib2 library.")
     (license license:expat)))
 
 (define-public python2-jsonschema
-  (package-with-python2 python-jsonschema))
+  (let ((jsonschema (package-with-python2 python-jsonschema)))
+    (package (inherit jsonschema)
+      (inputs
+       `(("python2-functools32" ,python2-functools32)
+         ,@(package-inputs jsonschema))))))
 
 (define-public python-unidecode
   (package
@@ -4266,11 +4307,13 @@ computing.")
          ,@(alist-delete "python-terminado"
                          (package-propagated-inputs ipython))))
       (inputs
-       `(("python2-mock" ,python2-mock)
+       `(("python2-jsonschema" ,python2-jsonschema)
+         ("python2-mock" ,python2-mock)
          ("python2-matplotlib" ,python2-matplotlib)
          ("python2-numpy" ,python2-numpy)
+         ("python2-requests" ,python2-requests)
          ,@(fold alist-delete (package-inputs ipython)
-                 '("python-matplotlib" "python-numpy")))))))
+                 '("python-jsonschema" "python-matplotlib" "python-numpy" "python-requests")))))))
 
 (define-public python-isodate
   (package
@@ -4341,13 +4384,22 @@ and written in Python.")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append
-             "https://pypi.python.org/packages/source/u/urwid/urwid-"
-             version ".tar.gz"))
+       (uri (pypi-uri "urwid" version))
        (sha256
         (base32
          "18mb0yy94sjc434rd61m2sfnw27sa0nyrszpj5a9r9zh7fnlzw19"))))
     (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         ;; Disable failing test. Bug filed upstream:
+         ;; https://github.com/wardi/urwid/issues/164
+         ;; TODO: check again for python-urwid > 1.3.0 or python > 3.4.3.
+         (add-after 'unpack 'disable-failing-test
+          (lambda _
+            (substitute* "urwid/tests/test_event_loops.py"
+              (("test_remove_watch_file")
+                "disable_remove_watch_file")))))))
     (native-inputs `(("python-setuptools" ,python-setuptools)))
     (home-page "http://urwid.org")
     (synopsis "Console user interface library for Python")
@@ -5613,6 +5665,32 @@ suitable for a wide range of protocols based on the ASN.1 specification.")
 (define-public python2-pyasn1
   (package-with-python2 python-pyasn1))
 
+(define-public python-pyasn1-modules
+  (package
+    (name "python-pyasn1-modules")
+    (version "0.0.8")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "pyasn1-modules" version))
+        (sha256
+         (base32
+          "0drqgw81xd3fxdlg89kgd79zzrabvfncvkbybi2wr6w2y4s1jmhh"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-setuptools" ,python-setuptools)))
+    (propagated-inputs
+     `(("python-pyasn1" ,python-pyasn1)))
+    (home-page "http://sourceforge.net/projects/pyasn1/")
+    (synopsis "ASN.1 codec implementations")
+    (description
+     "Pyasn1-modules is a collection of Python modules providing ASN.1 types and
+implementations of ASN.1-based codecs and protocols.")
+    (license bsd-3)))
+
+(define-public python2-pyasn1-modules
+  (package-with-python2 python-pyasn1-modules))
+
 (define-public python2-ipaddress
   (package
     (name "python2-ipaddress")
@@ -6622,3 +6700,557 @@ the standard library.")
 
 (define-public python2-contextlib2
   (package-with-python2 python-contextlib2))
+
+(define-public python-texttable
+  (package
+    (name "python-texttable")
+    (version "0.8.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "texttable" version))
+       (sha256
+        (base32
+         "0bkhs4dx9s6g7fpb969hygq56hyz4ncfamlynw72s0n6nqfbd1w5"))))
+    (build-system python-build-system)
+    (arguments '(#:tests? #f)) ; no tests
+    (home-page "https://github.com/foutaise/texttable/")
+    (synopsis "Python module for creating simple ASCII tables")
+    (description "Texttable is a Python module for creating simple ASCII
+tables.")
+    (license lgpl2.1+)))
+
+(define-public python2-texttable
+  (package-with-python2 python-texttable))
+
+(define-public python-websocket-client
+  (package
+    (name "python-websocket-client")
+    (version "0.34.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://pypi.python.org/packages/source/w"
+                           "/websocket-client/websocket_client-"
+                           version ".tar.gz"))
+       (sha256
+        (base32
+         "1prdx6d49f1cff17kzj15bnz09palfdgc1m5dkq9jd4mr90n4ak8"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-six" ,python-six))) ; for tests
+    (inputs
+     `(("python-setuptools" ,python-setuptools)))
+    (home-page "https://github.com/liris/websocket-client")
+    (synopsis "WebSocket client for Python")
+    (description "The Websocket-client module provides the low level APIs for
+WebSocket usage in Python programs.")
+    (license lgpl2.1+)))
+
+(define-public python2-websocket-client
+  (package-with-python2 python-websocket-client))
+
+(define-public python-atomicwrites
+  (package
+    (name "python-atomicwrites")
+    (version "0.1.8")
+    (source (origin
+             (method url-fetch)
+             (uri (pypi-uri "atomicwrites" version))
+             (sha256
+              (base32
+               "13nwk0gw0yb61pnf5vxs3fvhav6q3zrf08x9ggc93bnk5fsssx1j"))))
+    (build-system python-build-system)
+    (synopsis "Atomic file writes in Python")
+    (description "Library for atomic file writes using platform dependent tools
+for atomic filesystem operations.")
+    (home-page "https://github.com/untitaker/python-atomicwrites")
+    (license license:expat)))
+
+(define-public python-requests-toolbelt
+  (package
+    (name "python-requests-toolbelt")
+    (version "0.5.0")
+    (source (origin
+             (method url-fetch)
+             (uri (pypi-uri "requests-toolbelt" version))
+             (sha256
+              (base32
+               "1kbms1s52dhb98vbpaprr15b0ijdbqp500lpfsyjccpd8cjkyngk"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-requests" ,python-requests)))
+    (synopsis "Extensions to python-requests")
+    (description "This is a toolbelt of useful classes and functions to be used
+with python-requests.")
+    (home-page "https://github.com/sigmavirus24/requests-toolbelt")
+    (license asl2.0)))
+
+(define-public python-click-threading
+  (package
+    (name "python-click-threading")
+    (version "0.1.2")
+    (source (origin
+             (method url-fetch)
+             (uri (pypi-uri "click-threading" version))
+             (sha256
+              (base32
+               "0jmrv4334lfxa2ss53c06dafdwqbk1pb3ihd26izn5igw1bm8145"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-click" ,python-click)))
+    (synopsis "Utilities for multithreading in Click")
+    (description "This package provides utilities for multithreading in Click
+applications.")
+    (home-page "https://github.com/click-contrib/click-threading")
+    (license license:expat)))
+
+(define-public python-click-log
+  (package
+    (name "python-click-log")
+    (version "0.1.1")
+    (source (origin
+             (method url-fetch)
+             (uri (pypi-uri "click-log" version))
+             (sha256
+              (base32
+               "1z3jdwjmwax159zrnyx830xa968rfqrpkm04ad5xqyh0269ydiqb"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-click" ,python-click)))
+    (synopsis "Logging for click applications")
+    (description "This package provides a Python library for logging Click
+applications.")
+    (home-page "https://github.com/click-contrib/click-log")
+    (license license:expat)))
+
+(define-public python-apipkg
+  (package
+    (name "python-apipkg")
+    (version "1.4")
+    (source (origin
+             (method url-fetch)
+             (uri (pypi-uri "apipkg" version))
+             (sha256
+              (base32
+               "1iks5701qnp3dlr3q1d9qm68y2plp2m029irhpz92a44psfkjf1f"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("unzip" ,unzip)))
+    (propagated-inputs
+     `(("python-pytest" ,python-pytest)))
+    (synopsis "Namespace control and lazy-import mechanism")
+    (description "With apipkg you can control the exported namespace of a Python
+package and greatly reduce the number of imports for your users.  It is a small
+pure Python module that works on virtually all Python versions.")
+    (home-page "https://bitbucket.org/hpk42/apipkg")
+    (license license:expat)))
+
+(define-public python-execnet
+  (package
+    (name "python-execnet")
+    (version "1.4.1")
+    (source (origin
+             (method url-fetch)
+             (uri (pypi-uri "execnet" version))
+             (sha256
+              (base32
+               "1rpk1vyclhg911p3hql0m0nrpq7q7mysxnaaw6vs29cpa6kx8vgn"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-setuptools-scm" ,python-setuptools-scm)))
+    (propagated-inputs
+     `(("python-apipkg" ,python-apipkg)))
+    (synopsis "Rapid multi-Python deployment")
+    (description "Execnet provides a share-nothing model with
+channel-send/receive communication for distributing execution across many
+Python interpreters across version, platform and network barriers.  It has a
+minimal and fast API targetting the following uses:
+@enumerate
+@item distribute tasks to (many) local or remote CPUs
+@item write and deploy hybrid multi-process applications
+@item write scripts to administer multiple environments
+@end enumerate")
+    (home-page "http://codespeak.net/execnet/")
+    (license license:expat)))
+
+;;; The software provided by this package was integrated into pytest 2.8.
+(define-public python-pytest-cache
+  (package
+    (name "python-pytest-cache")
+    (version "1.0")
+    (source (origin
+             (method url-fetch)
+             (uri (pypi-uri "pytest-cache" version))
+             (sha256
+              (base32
+               "1a873fihw4rhshc722j4h6j7g3nj7xpgsna9hhg3zn6ksknnhx5y"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-execnet" ,python-execnet)))
+    (synopsis "Py.test plugin with mechanisms for caching across test runs")
+    (description "The pytest-cache plugin provides tools to rerun failures from
+the last py.test invocation.")
+    (home-page "https://bitbucket.org/hpk42/pytest-cache/")
+    (license license:expat)))
+
+(define-public python-pytest-localserver
+  (package
+    (name "python-pytest-localserver")
+    (version "0.3.4")
+    (source (origin
+             (method url-fetch)
+             (uri (pypi-uri "pytest-localserver" version ".zip"))
+             (sha256
+              (base32
+               "050q505a7gnsz7vqidw0w5dvxjb2flzi7z734agpjzmsl85c2bcx"))))
+    (build-system python-build-system)
+    (arguments
+      `(#:phases (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (zero? (system* "py.test" "--genscript=runtests.py"))
+             (zero? (system* "py.test")))))))
+    (native-inputs
+     `(("unzip" ,unzip)))
+    (propagated-inputs
+     `(("python-pytest" ,python-pytest)
+       ("python-requests" ,python-requests)
+       ("python-six" ,python-six)
+       ("python-werkzeug" ,python-werkzeug)))
+    (synopsis "Py.test plugin to test server connections locally")
+    (description "Pytest-localserver is a plugin for the pytest testing
+framework which enables you to test server connections locally.")
+    (home-page "https://pypi.python.org/pypi/pytest-localserver")
+    (license license:expat)))
+
+(define-public python-wsgi-intercept
+  (package
+    (name "python-wsgi-intercept")
+    (version "0.10.3")
+    (source (origin
+             (method url-fetch)
+             (uri (pypi-uri "wsgi_intercept" version))
+             (sha256
+              (base32
+               "0xyfchacywb1mql84270mcidsqc5ssyspd18yacjk82x2xc68h0r"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-pytest" ,python-pytest)))
+    (propagated-inputs
+     `(("python-httplib2" ,python-httplib2)
+       ("python-requests" ,python-requests)))
+    (synopsis "Puts a WSGI application in place of a real URI for testing")
+    (description "Wsgi_intercept installs a WSGI application in place of a real
+URI for testing.  Testing a WSGI application normally involves starting a
+server at a local host and port, then pointing your test code to that address.
+Instead, this library lets you intercept calls to any specific host/port
+combination and redirect them into a WSGI application importable by your test
+program.  Thus, you can avoid spawning multiple processes or threads to test
+your Web app.")
+    (home-page "https://github.com/cdent/wsgi-intercept")
+    (license license:expat)))
+
+(define-public python-pytest-xprocess
+  (package
+    (name "python-pytest-xprocess")
+    (version "0.9.1")
+    (source (origin
+             (method url-fetch)
+             (uri (pypi-uri "pytest-xprocess" version))
+             (sha256
+              (base32
+               "17zlql1xqw3ywcgwwbqmw633aly99lab12hm02asr8awvg5603pp"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-pytest" ,python-pytest)
+       ("python-pytest-cache" ,python-pytest-cache)
+       ("python-psutil" ,python-psutil)))
+    (synopsis "Pytest plugin to manage external processes across test runs")
+    (description "Pytest-xprocess is an experimental py.test plugin for managing
+processes across test runs.")
+    (home-page "https://bitbucket.org/pytest-dev/pytest-xprocess")
+    (license license:expat)))
+
+(define-public python-icalendar
+  (package
+    (name "python-icalendar")
+    (version "3.9.1")
+    (source (origin
+             (method url-fetch)
+             (uri (pypi-uri "icalendar" version))
+             (sha256
+              (base32
+               "0fhrczdj3jxy5bvswphp3vys7vwv5c9bpwg7asykqwa3z6253q6q"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-dateutil-2" ,python-dateutil-2)
+       ("python-pytz" ,python-pytz)))
+    (synopsis "Python library for parsing iCalendar files")
+    (description "The icalendar package is a parser/generator of iCalendar
+files for use with Python.")
+    (home-page "https://github.com/collective/icalendar")
+    (license bsd-2)))
+
+(define-public python-sphinxcontrib-newsfeed
+  (package
+    (name "python-sphinxcontrib-newsfeed")
+    (version "0.1.4")
+    (source (origin
+             (method url-fetch)
+             (uri (pypi-uri "sphinxcontrib-newsfeed" version))
+             (sha256
+              (base32
+               "1d7gam3mn8v4in4p16yn3v10vps7nnaz6ilw99j4klij39dqd37p"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-docutils" ,python-docutils)
+       ("python-sphinx" ,python-sphinx)))
+    (synopsis "News Feed extension for Sphinx")
+    (description "Sphinxcontrib-newsfeed is an extension for adding a simple
+Blog, News or Announcements section to a Sphinx website.")
+    (home-page "https://bitbucket.org/prometheus/sphinxcontrib-newsfeed")
+    (license bsd-2)))
+
+(define-public python-args
+  (package
+    (name "python-args")
+    (version "0.1.0")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "args" version))
+              (sha256
+               (base32
+                "057qzi46h5dmxdqknsbrssn78lmqjlnm624iqdhrnpk26zcbi1d7"))))
+    (build-system python-build-system)
+    (inputs
+     `(("python-setuptools" ,python-setuptools)))
+    (home-page "https://github.com/kennethreitz/args")
+    (synopsis "Command-line argument parser")
+    (description
+     "This library provides a Python module to parse command-line arguments.")
+    (license bsd-3)))
+
+(define-public python2-args
+  (package-with-python2 python-args))
+
+(define-public python-clint
+  (package
+    (name "python-clint")
+    (version "0.5.1")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "clint" version))
+              (sha256
+               (base32
+                "1an5lkkqk1zha47198p42ji3m94xmzx1a03dn7866m87n4r4q8h5"))))
+    (build-system python-build-system)
+    (inputs
+     `(("python-args" ,python-args)
+       ("python-setuptools" ,python-setuptools)))
+    (home-page "https://github.com/kennethreitz/clint")
+    (synopsis "Command-line interface tools")
+    (description
+     "Clint is a Python module filled with a set of tools for developing
+command-line applications, including tools for colored and indented
+output, progress bar display, and pipes.")
+    (license isc)))
+
+(define-public python2-clint
+  (package-with-python2 python-clint))
+
+(define-public python-astor
+  (package
+    (name "python-astor")
+    (version "0.5")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "astor" version))
+              (sha256
+               (base32
+                "1fdafq5hkis1fxqlmhw0sn44zp2ar46nxhbc22cvwg7hsd8z5gsa"))))
+    (build-system python-build-system)
+    (inputs
+     `(("python-setuptools" ,python-setuptools)))
+    (home-page "https://github.com/berkerpeksag/astor")
+    (synopsis "Read and write Python ASTs")
+    (description
+     "Astor is designed to allow easy manipulation of Python source via the
+Abstract Syntax Tree.")
+    (license bsd-3)))
+
+(define-public python2-astor
+  (package-with-python2 python-astor))
+
+(define-public python-rply
+  (package
+    (name "python-rply")
+    (version "0.7.4")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "rply" version))
+              (sha256
+               (base32
+                "12rp1d9ba7nvd5rhaxi6xzx1rm67r1k1ylsrkzhpwnphqpb06cvj"))))
+    (build-system python-build-system)
+    (inputs
+     `(("python-appdirs" ,python-appdirs)
+       ("python-setuptools" ,python-setuptools)))
+    (home-page "https://github.com/alex/rply")
+    (synopsis "Parser generator for Python")
+    (description
+     "This package provides a pure Python based parser generator, that also
+works with RPython.  It is a more-or-less direct port of David Bazzley's PLY,
+with a new public API, and RPython support.")
+    (license bsd-3)))
+
+(define-public python2-rply
+  (package-with-python2 python-rply))
+
+(define-public python-hy
+  (package
+    (name "python-hy")
+    (version "0.11.1")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "hy" version))
+              (sha256
+               (base32
+                "1msqv747iz12r73mz4qvsmlwkddwjvrahlrk7ysrcz07h7dsscxs"))))
+    (build-system python-build-system)
+    (inputs
+     `(("python-astor" ,python-astor)
+       ("python-clint" ,python-clint)
+       ("python-rply" ,python-rply)
+       ("python-setuptools" ,python-setuptools)))
+    (home-page "http://hylang.org/")
+    (synopsis "Lisp frontend to Python")
+    (description
+     "Hy is a dialect of Lisp that's embedded in Python.  Since Hy transforms
+its Lisp code into the Python Abstract Syntax Tree, you have the whole world of
+Python at your fingertips, in Lisp form.")
+    (license license:expat)))
+
+(define-public python2-hy
+  (package-with-python2 python-hy))
+
+(define-public python-rauth
+  (package
+    (name "python-rauth")
+    (version "0.7.2")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "rauth" version))
+        (sha256
+         (base32
+          "00pq7zw429hhza9c0qzxiqp77m653jv09z92nralnmzwdf6pzicf"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:test-target "check"))
+    (native-inputs
+     `(("python-setuptools" ,python-setuptools)))
+    (propagated-inputs
+     `(("python-requests" ,python-requests)))
+    (home-page "https://github.com/litl/rauth")
+    (synopsis "Python library for OAuth 1.0/a, 2.0, and Ofly")
+    (description
+     "Rauth is a Python library for OAuth 1.0/a, 2.0, and Ofly.  It also
+provides service wrappers for convenient connection initialization and
+authenticated session objects providing things like keep-alive.")
+    (license license:expat)))
+
+(define-public python2-rauth
+  (let ((rauth (package-with-python2 python-rauth)))
+    (package (inherit rauth)
+      (propagated-inputs `(("python2-requests" ,python2-requests)))
+      (native-inputs
+       `(("python2-unittest2", python2-unittest2)
+         ,@(package-native-inputs rauth))))))
+
+(define-public python2-functools32
+  (package
+    (name "python2-functools32")
+    (version "3.2.3-2")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "functools32" version))
+        (sha256
+         (base32
+          "0v8ya0b58x47wp216n1zamimv4iw57cxz3xxhzix52jkw3xks9gn"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:python ,python-2
+       #:tests? #f)) ; no test target
+    (native-inputs
+     `(("python2-setuptools" ,python2-setuptools)))
+    (home-page "https://github.com/MiCHiLU/python-functools32")
+    (synopsis
+     "Backport of the functools module from Python 3.2.3")
+    (description
+     "This package is a backport of the @code{functools} module from Python
+3.2.3 for use with older versions of Python and PyPy.")
+    (license license:expat)))
+
+(define-public python-futures
+  (package
+    (name "python-futures")
+    (version "3.0.3")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "futures" version))
+        (sha256
+         (base32
+          "1vcb34dqhzkhbq1957vdjszhhm5y3j9ba88dgwhqx2zynhmk9qig"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-setuptools" ,python-setuptools)))
+    (home-page "https://github.com/agronholm/pythonfutures")
+    (synopsis
+     "Backport of the concurrent.futures package from Python 3.2")
+    (description
+     "The concurrent.futures module provides a high-level interface for
+asynchronously executing callables.  This package backports the
+concurrent.futures package from Python 3.2")
+    (license bsd-3)))
+
+(define-public python2-futures
+  (package-with-python2 python-futures))
+
+(define-public python-urllib3
+  (package
+    (name "python-urllib3")
+    (version "1.13.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "urllib3" version))
+        (sha256
+         (base32
+          "10rrbr6c6k7j5dvfsyj4b2gsgxg9gggnn708qixf6ll57xqivfkf"))))
+    (build-system python-build-system)
+    (arguments `(#:tests? #f))
+    (native-inputs
+     `(("python-setuptools" ,python-setuptools)
+       ;; some packages for tests
+       ("python-nose" ,python-nose)
+       ("python-mock" ,python-mock)
+       ("python-tornado" ,python-tornado)))
+    (propagated-inputs
+     `(;; packages for https security
+       ("python-certifi" ,python-certifi)
+       ("python-ndg-httpsclient" ,python-ndg-httpsclient)
+       ("python-pyasn1" ,python-pyasn1)
+       ("python-pyopenssl" ,python-pyopenssl)))
+    (home-page "http://urllib3.readthedocs.org/")
+    (synopsis "HTTP library with thread-safe connection pooling")
+    (description
+     "Urllib3 supports features left out of urllib and urllib2 libraries.  It
+can reuse the same socket connection for multiple requests, it can POST files,
+supports url redirection and retries, and also gzip and deflate decoding.")
+    (license license:expat)))
+
+(define-public python2-urllib3
+  (package-with-python2 python-urllib3))
diff --git a/gnu/packages/rsync.scm b/gnu/packages/rsync.scm
index 5e98d84835..dba4e89a05 100644
--- a/gnu/packages/rsync.scm
+++ b/gnu/packages/rsync.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2012, 2013 Andreas Enge <andreas@enge.fr>
+;;; Copyright © 2016 Mark H Weaver <mhw@netris.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -30,14 +31,14 @@
 (define-public rsync
   (package
    (name "rsync")
-   (version "3.1.0")
+   (version "3.1.2")
    (source (origin
             (method url-fetch)
             (uri (string-append "http://rsync.samba.org/ftp/rsync/src/rsync-"
                                 version ".tar.gz"))
             (sha256
              (base32
-              "0kirw8wglqvwi1v8bwxp373g03xg857h59j5k3mmgff9gzvj7jl1"))))
+              "1hm1q04hz15509f0p9bflw4d6jzfvpm1d36dxjwihk1wzakn5ypc"))))
    (build-system gnu-build-system)
    (inputs `(("perl" ,perl)
              ("acl" ,acl)))
diff --git a/gnu/packages/ruby.scm b/gnu/packages/ruby.scm
index fd36f8d694..6e5553bd30 100644
--- a/gnu/packages/ruby.scm
+++ b/gnu/packages/ruby.scm
@@ -2978,3 +2978,67 @@ methods, a @code{Mixin} module for including color methods, a @code{Logger}, a
 device.")
     (home-page "http://rubyworks.github.io/ansi")
     (license license:bsd-2)))
+
+(define-public ruby-systemu
+  (package
+    (name "ruby-systemu")
+    (version "2.6.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "systemu" version))
+       (sha256
+        (base32
+         "0gmkbakhfci5wnmbfx5i54f25j9zsvbw858yg3jjhfs5n4ad1xq1"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-before 'check 'set-version
+           (lambda _
+             (setenv "VERSION" ,version)
+             #t)))))
+    (synopsis "Capture of stdout/stderr and handling of child processes")
+    (description
+     "Systemu can be used on any platform to return status, stdout, and stderr
+of any command.  Unlike other methods like @code{open3} and @code{popen4}
+there is no danger of full pipes or threading issues hanging your process or
+subprocess.")
+    (home-page "https://github.com/ahoward/systemu")
+    (license license:ruby)))
+
+(define-public ruby-bio-commandeer
+  (package
+    (name "ruby-bio-commandeer")
+    (version "0.1.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "bio-commandeer" version))
+       (sha256
+        (base32
+         "061jxa6km92qfwzl058r2gp8gfcsbyr7m643nw1pxvmjdswaf6ly"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           ;; Run test without calling 'rake' so that jeweler is
+           ;; not required as an input.
+           (lambda _
+             (zero? (system* "rspec" "spec/bio-commandeer_spec.rb")))))))
+    (propagated-inputs
+     `(("ruby-bio-logger" ,ruby-bio-logger)
+       ("ruby-systemu" ,ruby-systemu)))
+    (native-inputs
+     `(("bundler" ,bundler)
+       ("ruby-rspec" ,ruby-rspec)))
+    (synopsis "Simplified running of shell commands from within Ruby")
+    (description
+     "Bio-commandeer provides an opinionated method of running shell commands
+from within Ruby.  The advantage of bio-commandeer over other methods of
+running external commands is that when something goes wrong, messages printed
+to the @code{STDOUT} and @code{STDERR} streams are reported, giving extra
+detail to ease debugging.")
+    (home-page "http://github.com/wwood/bioruby-commandeer")
+    (license license:expat)))
diff --git a/gnu/packages/ssh.scm b/gnu/packages/ssh.scm
index 76032f9b62..d4bf29cc20 100644
--- a/gnu/packages/ssh.scm
+++ b/gnu/packages/ssh.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013, 2014 Andreas Enge <andreas@enge.fr>
-;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -111,7 +111,7 @@ a server that supports the SSH-2 protocol.")
 (define-public openssh
   (package
    (name "openssh")
-   (version "7.1p1")
+   (version "7.1p2")
    (source (origin
             (method url-fetch)
             (uri (let ((tail (string-append name "-" version ".tar.gz")))
@@ -122,7 +122,7 @@ a server that supports the SSH-2 protocol.")
                          (string-append "http://ftp2.fr.openbsd.org/pub/OpenBSD/OpenSSH/portable/"
                                         tail))))
             (sha256 (base32
-                     "0a44mnr8bvw41zg83xh4sb55d8nds29j95gxvxk5qg863lnns2pw"))))
+                     "1gbbvszz74lkc7b2mqr3ccgpm65zj0k5h7a2ssh0c7pjvhjg0xfx"))))
    (build-system gnu-build-system)
    (inputs `(("groff" ,groff)
              ("openssl" ,openssl)
diff --git a/gnu/packages/statistics.scm b/gnu/packages/statistics.scm
index 8bd87582ef..6466af11c0 100644
--- a/gnu/packages/statistics.scm
+++ b/gnu/packages/statistics.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2015, 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2015 Vicente Vera Parra <vicentemvp@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -1676,6 +1676,8 @@ worker processes and collect and return the results on the master.")
                 "0s9kab5khk7daqf6nfp1wm1qnhkssnnwnymisfwyk3kz4q5maqfz"))))
     (properties
      `((upstream-name . "SparseM")))
+    (inputs
+     `(("gfortran" ,gfortran)))
     (build-system r-build-system)
     (home-page "http://www.econ.uiuc.edu/~roger/research/sparse/sparse.html")
     (synopsis "Sparse linear algebra")
diff --git a/gnu/packages/sxiv.scm b/gnu/packages/sxiv.scm
index ee5e822c8d..8a81d48f3e 100644
--- a/gnu/packages/sxiv.scm
+++ b/gnu/packages/sxiv.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2015 Alex Kost <alezost@gmail.com>
+;;; Copyright © 2015, 2016 Alex Kost <alezost@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -28,7 +28,7 @@
 (define-public sxiv
   (package
     (name "sxiv")
-    (version "1.3.1")
+    (version "1.3.2")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -37,7 +37,7 @@
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "03hxy5ff7xbs15rhlbpgx8xmvmpjlffp0m4528975hg16sqa2c4s"))))
+                "0lxnd33gaw4drhdwbkk94wzrjyhh64d57jq2ps7ffmqgizg6hlwz"))))
     (build-system gnu-build-system)
     (arguments
      '(#:tests? #f                      ; no check target
diff --git a/gnu/packages/version-control.scm b/gnu/packages/version-control.scm
index c24c4683c7..1edf9f8d9c 100644
--- a/gnu/packages/version-control.scm
+++ b/gnu/packages/version-control.scm
@@ -56,6 +56,7 @@
   #:use-module (gnu packages ncurses)
   #:use-module (gnu packages ssh)
   #:use-module (gnu packages web)
+  #:use-module (gnu packages openstack)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages python)
@@ -1028,3 +1029,33 @@ fetching updates) over a collection of version control repositories.  It
 supports a large number of version control systems: Git, Subversion,
 Mercurial, Bazaar, Darcs, CVS, Fossil, and Veracity.")
     (license gpl2+)))
+
+(define-public git-annex-remote-hubic
+  (package
+    (name "git-annex-remote-hubic")
+    (version "0.3.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://github.com/Schnouki/" name "/archive/v"
+                    version ".tar.gz"))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "196g3jkaybjx11nbr51n0cjps3wjzb145ab76y717diqvvxp5v4r"))))
+    (build-system python-build-system)
+    (native-inputs
+     `(("python-setuptools" ,python-setuptools)
+       ;; for the tests
+       ("python-six" ,python-six)))
+    (propagated-inputs
+     `(("python-dateutil" ,python-dateutil-2)
+       ("python-futures" ,python-futures)
+       ("python-rauth" ,python-rauth)
+       ("python-swiftclient" ,python-swiftclient)))
+    (home-page "https://github.com/Schnouki/git-annex-remote-hubic/")
+    (synopsis "Use hubic as a git-annex remote")
+    (description
+     "This package allows you to use your hubic account as a \"special
+repository\" with git-annex.")
+    (license gpl3+)))
diff --git a/gnu/packages/video.scm b/gnu/packages/video.scm
index b3ee98092c..12f10b9915 100644
--- a/gnu/packages/video.scm
+++ b/gnu/packages/video.scm
@@ -3,7 +3,7 @@
 ;;; Copyright © 2014, 2015 David Thompson <davet@gnu.org>
 ;;; Copyright © 2014, 2015, 2016 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
-;;; Copyright © 2015 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2015, 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2015 Andy Patterson <ajpatter@uwaterloo.ca>
 ;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2015 Alex Vong <alexvong1995@gmail.com>
@@ -692,7 +692,7 @@ SVCD, DVD, 3ivx, DivX 3/4/5, WMV and H.264 movies.")
 (define-public mpv
   (package
     (name "mpv")
-    (version "0.14.0")
+    (version "0.15.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -700,14 +700,14 @@ SVCD, DVD, 3ivx, DivX 3/4/5, WMV and H.264 movies.")
                     ".tar.gz"))
               (sha256
                (base32
-                "0cqjwl0xyg0sv1jflipfkvqjg32y0kqfh4gc3lyhqgv0hgs3fa84"))
+                "1p0b83048g66icpz5n66v3k4ldr1z0rmg5d2rr7kcbspm1xj2cbx"))
               (file-name (string-append name "-" version ".tar.gz"))))
     (build-system waf-build-system)
     (native-inputs
      `(("perl" ,perl)
        ("pkg-config" ,pkg-config)
        ("python-docutils" ,python-docutils)))
-    ;; Missing features: libguess, Wayland, VDPAU, V4L2
+    ;; Missing features: libguess, Wayland, V4L2
     (inputs
      `(("alsa-lib" ,alsa-lib)
        ("enca" ,enca)
@@ -724,6 +724,7 @@ SVCD, DVD, 3ivx, DivX 3/4/5, WMV and H.264 movies.")
        ("libdvdnav" ,libdvdnav)
        ("libjpeg" ,libjpeg)
        ("libva" ,libva)
+       ("libvdpau" ,libvdpau)
        ("libx11" ,libx11)
        ("libxext" ,libxext)
        ("libxinerama" ,libxinerama)
@@ -754,6 +755,7 @@ SVCD, DVD, 3ivx, DivX 3/4/5, WMV and H.264 movies.")
           (lambda* (#:key inputs #:allow-other-keys)
             (copy-file (assoc-ref inputs "waf") "waf")
             (setenv "CC" "gcc"))))
+       #:configure-flags (list "--enable-gpl3" "--enable-zsh-comp")
        ;; No check function defined.
        #:tests? #f))
     (home-page "http://mpv.io/")
@@ -1299,3 +1301,53 @@ from many input sources such as webcams, X11 (for screencasting), PulseAudio,
 and JACK.")
     (home-page "https://obsproject.com")
     (license license:gpl2+)))
+
+(define-public libvdpau
+  (package
+    (name "libvdpau")
+    (version "1.1.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (string-append "https://secure.freedesktop.org/~aplattner/vdpau/"
+                            name "-" version ".tar.bz2"))
+        (sha256
+         (base32
+          "0dnpb0yh7v6rvckx82kxg045rd9rbsw25wjv7ad5n8h94s9h2yl5"))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (inputs
+     `(("dri2proto" ,dri2proto)
+       ("libx11" ,libx11 "out")
+       ("libxext" ,libxext)))
+    (home-page "https://wiki.freedesktop.org/www/Software/VDPAU/")
+    (synopsis "Video Decode and Presentation API")
+    (description "VDPAU is the Video Decode and Presentation API for UNIX.  It
+provides an interface to video decode acceleration and presentation hardware
+present in modern GPUs.")
+    (license (license:x11-style "file://COPYING"))))
+
+(define-public vdpauinfo
+  (package
+    (name "vdpauinfo")
+    (version "1.0")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (string-append "https://secure.freedesktop.org/~aplattner/vdpau/"
+                            name "-" version ".tar.gz"))
+        (sha256
+         (base32
+          "1i2b0k9h8r0lnxlrkgqzmrjakgaw3f1ygqqwzx8w6676g85rcm20"))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("pkg-config" ,pkg-config)
+       ("libx11" ,libx11)))
+    (propagated-inputs
+     `(("libvdpau" ,libvdpau)))
+    (home-page "https://wiki.freedesktop.org/www/Software/VDPAU/")
+    (synopsis "Tool to query the capabilities of a VDPAU implementation")
+    (description "Vdpauinfo is a tool to query the capabilities of a VDPAU
+implementation.")
+    (license (license:x11-style "file://COPYING"))))
diff --git a/gnu/system.scm b/gnu/system.scm
index 4aedb7ee36..ee0280c069 100644
--- a/gnu/system.scm
+++ b/gnu/system.scm
@@ -88,6 +88,14 @@
             operating-system-locale-directory
             operating-system-boot-script
 
+            boot-parameters
+            boot-parameters?
+            boot-parameters-label
+            boot-parameters-root-device
+            boot-parameters-kernel
+            boot-parameters-kernel-arguments
+            read-boot-parameters
+
             local-host-aliases
             %setuid-programs
             %base-packages
@@ -709,4 +717,37 @@ this file is the reconstruction of GRUB menu entries for old configurations."
                                     #$(operating-system-kernel-arguments os))
                                    (initrd #$initrd)))))
 
+
+;;;
+;;; Boot parameters
+;;;
+
+(define-record-type* <boot-parameters>
+  boot-parameters make-boot-parameters boot-parameters?
+  (label            boot-parameters-label)
+  (root-device      boot-parameters-root-device)
+  (kernel           boot-parameters-kernel)
+  (kernel-arguments boot-parameters-kernel-arguments))
+
+(define (read-boot-parameters port)
+  "Read boot parameters from PORT and return the corresponding
+<boot-parameters> object or #f if the format is unrecognized."
+  (match (read port)
+    (('boot-parameters ('version 0)
+                       ('label label) ('root-device root)
+                       ('kernel linux)
+                       rest ...)
+     (boot-parameters
+      (label label)
+      (root-device root)
+      (kernel linux)
+      (kernel-arguments
+       (match (assq 'kernel-arguments rest)
+         ((_ args) args)
+         (#f       '())))))                       ;the old format
+    (x                                            ;unsupported format
+     (warning (_ "unrecognized boot parameters for '~a'~%")
+              system)
+     #f)))
+
 ;;; system.scm ends here
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 6130e020c8..b1ea637de9 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -179,7 +179,7 @@ loaded at boot time in the order in which they appear."
     ;; Modules added to the initrd and loaded from the initrd.
     `("ahci"                                  ;for SATA controllers
       "usb-storage" "uas"                     ;for the installation image etc.
-      "usbkbd" "usbhid"                       ;USB keyboards, for debugging
+      "usbhid"                                ;USB keyboards, for debugging
       "dm-crypt" "xts"                        ;for encrypted root partitions
       ,@(if (string-match "^(x86_64|i[3-6]86)-" (%current-system))
             '("pata_acpi" "pata_atiixp"    ;for ATA controllers
diff --git a/guix/import/cran.scm b/guix/import/cran.scm
index fc2709020a..1c30da89c7 100644
--- a/guix/import/cran.scm
+++ b/guix/import/cran.scm
@@ -136,17 +136,6 @@ empty list when the FIELD cannot be found."
                         (string-any char-set:whitespace item)))
                   (map string-trim-both items))))))
 
-(define (beautify-description description)
-  "Improve the package DESCRIPTION by turning a beginning sentence fragment
-into a proper sentence and by using two spaces between sentences."
-  (let ((cleaned (if (string-prefix? "A " description)
-                     (string-append "This package provides a"
-                                    (substring description 1))
-                     description)))
-    ;; Use double spacing between sentences
-    (regexp-substitute/global #f "\\. \\b"
-                              cleaned 'pre ".  " 'post)))
-
 (define (description->package meta)
   "Return the `package' s-expression for a CRAN package from the alist META,
 which was derived from the R package's DESCRIPTION file."
diff --git a/guix/import/gem.scm b/guix/import/gem.scm
index c64c4e9374..3c42052f1a 100644
--- a/guix/import/gem.scm
+++ b/guix/import/gem.scm
@@ -117,7 +117,8 @@ VERSION, HASH, HOME-PAGE, DESCRIPTION, DEPENDENCIES, and LICENSES."
          (let ((name         (assoc-ref package "name"))
                (version      (assoc-ref package "version"))
                (hash         (assoc-ref package "sha"))
-               (description  (assoc-ref package "info"))
+               (description  (beautify-description
+                              (assoc-ref package "info")))
                (home-page    (assoc-ref package "homepage_uri"))
                (dependencies (map (lambda (dep)
                                     (let ((name (assoc-ref dep "name")))
diff --git a/guix/import/utils.scm b/guix/import/utils.scm
index 0734fa1230..44e004b084 100644
--- a/guix/import/utils.scm
+++ b/guix/import/utils.scm
@@ -37,7 +37,8 @@
             string->license
             license->symbol
 
-            snake-case))
+            snake-case
+            beautify-description))
 
 (define (factorize-uri uri version)
   "Factorize URI, a package tarball URI as a string, such that any occurrences
@@ -136,3 +137,14 @@ to in the (guix licenses) module, or #f if there is no such known license."
   "Return a downcased version of the string STR where underscores are replaced
 with dashes."
   (string-join (string-split (string-downcase str) #\_) "-"))
+
+(define (beautify-description description)
+  "Improve the package DESCRIPTION by turning a beginning sentence fragment
+into a proper sentence and by using two spaces between sentences."
+  (let ((cleaned (if (string-prefix? "A " description)
+                     (string-append "This package provides a"
+                                    (substring description 1))
+                     description)))
+    ;; Use double spacing between sentences
+    (regexp-substitute/global #f "\\. \\b"
+                              cleaned 'pre ".  " 'post)))
diff --git a/guix/scripts/system.scm b/guix/scripts/system.scm
index 1407dc73fa..564ed02d59 100644
--- a/guix/scripts/system.scm
+++ b/guix/scripts/system.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014, 2015 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2016 Alex Kost <alezost@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -191,39 +192,6 @@ the ownership of '~a' may be incorrect!~%")
 
 
 ;;;
-;;; Boot parameters
-;;;
-
-(define-record-type* <boot-parameters>
-  boot-parameters make-boot-parameters boot-parameters?
-  (label            boot-parameters-label)
-  (root-device      boot-parameters-root-device)
-  (kernel           boot-parameters-kernel)
-  (kernel-arguments boot-parameters-kernel-arguments))
-
-(define (read-boot-parameters port)
-  "Read boot parameters from PORT and return the corresponding
-<boot-parameters> object or #f if the format is unrecognized."
-  (match (read port)
-    (('boot-parameters ('version 0)
-                       ('label label) ('root-device root)
-                       ('kernel linux)
-                       rest ...)
-     (boot-parameters
-      (label label)
-      (root-device root)
-      (kernel linux)
-      (kernel-arguments
-       (match (assq 'kernel-arguments rest)
-         ((_ args) args)
-         (#f       '())))))                       ;the old format
-    (x                                            ;unsupported format
-     (warning (_ "unrecognized boot parameters for '~a'~%")
-              system)
-     #f)))
-
-
-;;;
 ;;; Reconfiguration.
 ;;;
 
@@ -285,22 +253,24 @@ it atomically, and then run OS's activation script."
   "Return a list of 'menu-entry' for the generations of PROFILE."
   (define (system->grub-entry system number time)
     (unless-file-not-found
-     (let ((file (string-append system "/parameters")))
-       (match (call-with-input-file file read-boot-parameters)
-         (($ <boot-parameters> label root kernel kernel-arguments)
-          (menu-entry
-           (label (string-append label " (#"
-                                 (number->string number) ", "
-                                 (seconds->string time) ")"))
-           (linux kernel)
-           (linux-arguments
-            (cons* (string-append "--root=" root)
-                   #~(string-append "--system=" #$system)
-                   #~(string-append "--load=" #$system "/boot")
-                   kernel-arguments))
-           (initrd #~(string-append #$system "/initrd"))))
-         (#f                                      ;invalid format
-          #f)))))
+     (let* ((file             (string-append system "/parameters"))
+            (params           (call-with-input-file file
+                                read-boot-parameters))
+            (label            (boot-parameters-label params))
+            (root             (boot-parameters-root-device params))
+            (kernel           (boot-parameters-kernel params))
+            (kernel-arguments (boot-parameters-kernel-arguments params)))
+       (menu-entry
+        (label (string-append label " (#"
+                              (number->string number) ", "
+                              (seconds->string time) ")"))
+        (linux kernel)
+        (linux-arguments
+         (cons* (string-append "--root=" root)
+                #~(string-append "--system=" #$system)
+                #~(string-append "--load=" #$system "/boot")
+                kernel-arguments))
+        (initrd #~(string-append #$system "/initrd"))))))
 
   (let* ((numbers (generation-numbers profile))
          (systems (map (cut generation-file-name profile <>)
@@ -366,18 +336,17 @@ list of services."
   (unless (zero? number)
     (let* ((generation (generation-file-name profile number))
            (param-file (string-append generation "/parameters"))
-           (params     (call-with-input-file param-file read-boot-parameters)))
+           (params     (call-with-input-file param-file read-boot-parameters))
+           (label      (boot-parameters-label params))
+           (root       (boot-parameters-root-device params))
+           (kernel     (boot-parameters-kernel params)))
       (display-generation profile number)
       (format #t (_ "  file name: ~a~%") generation)
       (format #t (_ "  canonical file name: ~a~%") (readlink* generation))
-      (match params
-        (($ <boot-parameters> label root kernel)
-         ;; TRANSLATORS: Please preserve the two-space indentation.
-         (format #t (_ "  label: ~a~%") label)
-         (format #t (_ "  root device: ~a~%") root)
-         (format #t (_ "  kernel: ~a~%") kernel))
-        (_
-         #f)))))
+      ;; TRANSLATORS: Please preserve the two-space indentation.
+      (format #t (_ "  label: ~a~%") label)
+      (format #t (_ "  root device: ~a~%") root)
+      (format #t (_ "  kernel: ~a~%") kernel))))
 
 (define* (list-generations pattern #:optional (profile %system-profile))
   "Display in a human-readable format all the system generations matching
diff --git a/test-env.in b/test-env.in
index d6389a1097..67f4f805fa 100644
--- a/test-env.in
+++ b/test-env.in
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 # GNU Guix --- Functional package management for GNU
-# Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
+# Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 #
 # This file is part of GNU Guix.
 #
@@ -31,7 +31,6 @@ unset CDPATH
 
 if [ -x "@abs_top_builddir@/guix-daemon" ]
 then
-    NIX_SETUID_HELPER="@abs_top_builddir@/nix-setuid-helper" # normally unused
     NIX_STORE_DIR="@GUIX_TEST_ROOT@/store"
 
     # Do that because store.scm calls `canonicalize-path' on it.
@@ -87,10 +86,10 @@ then
     # For the (guix import snix) tests.
     NIXPKGS="@NIXPKGS@"
 
-    export NIX_IGNORE_SYMLINK_STORE NIX_STORE_DIR			\
-	NIX_LOCALSTATE_DIR NIX_LOG_DIR NIX_STATE_DIR NIX_DB_DIR		\
-	NIX_ROOT_FINDER NIX_SETUID_HELPER GUIX_BINARY_SUBSTITUTE_URL	\
-        GUIX_ALLOW_UNAUTHENTICATED_SUBSTITUTES				\
+    export NIX_IGNORE_SYMLINK_STORE NIX_STORE_DIR		\
+	NIX_LOCALSTATE_DIR NIX_LOG_DIR NIX_STATE_DIR NIX_DB_DIR	\
+	NIX_ROOT_FINDER GUIX_BINARY_SUBSTITUTE_URL		\
+        GUIX_ALLOW_UNAUTHENTICATED_SUBSTITUTES			\
         NIX_CONF_DIR XDG_CACHE_HOME NIXPKGS
 
     # Launch the daemon without chroot support because is may be
diff --git a/tests/derivations.scm b/tests/derivations.scm
index 1bbc93fe5c..64cc8a94c9 100644
--- a/tests/derivations.scm
+++ b/tests/derivations.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -472,6 +472,22 @@
       (build-derivations %store (list drv))
       #f)))
 
+;; Here we should get the value of $NIX_STATE_DIR that the daemon sees, which
+;; is a unique value for each test process; this value is the same as the one
+;; we see in the process executing this file since it is set by 'test-env'.
+(test-equal "derivation #:leaked-env-vars"
+  (getenv "NIX_STATE_DIR")
+  (let* ((value (getenv "NIX_STATE_DIR"))
+         (drv   (derivation %store "leaked-env-vars" %bash
+                            '("-c" "echo -n $NIX_STATE_DIR > $out")
+                            #:hash (sha256 (string->utf8 value))
+                            #:hash-algo 'sha256
+                            #:inputs `((,%bash))
+                            #:leaked-env-vars '("NIX_STATE_DIR"))))
+    (and (build-derivations %store (list drv))
+         (call-with-input-file (derivation->output-path drv)
+           get-string-all))))
+
 
 (define %coreutils
   (false-if-exception